From e2e08ec305da4a11fc3f95f7f5626f9636bff661 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Mon, 3 Feb 2020 17:47:10 +0200 Subject: [PATCH 01/16] Files added --- Week1/Homework/codeAlong/index.html | 0 Week1/Homework/codeAlong/script.js | 0 Week1/Homework/codeAlong/style.css | 0 Week1/Homework/js-exercises/aboutMe.js | 0 Week1/Homework/js-exercises/bookList.js | 0 Week1/Homework/js-exercises/catWalk.js | 0 Week1/Homework/js-exercises/logoHijack.js | 0 Week1/Homework/js-exercises/whatsTheTime.js | 0 .../Homework/project-RandomQuoteGenerator/index.html | 0 Week1/Homework/project-RandomQuoteGenerator/script.js | 0 Week1/Homework/project-RandomQuoteGenerator/style.css | 0 Week1/homework/app.js | 11 ----------- Week1/homework/index.html | 1 - Week1/homework/style.css | 1 - 14 files changed, 13 deletions(-) create mode 100644 Week1/Homework/codeAlong/index.html create mode 100644 Week1/Homework/codeAlong/script.js create mode 100644 Week1/Homework/codeAlong/style.css create mode 100644 Week1/Homework/js-exercises/aboutMe.js create mode 100644 Week1/Homework/js-exercises/bookList.js create mode 100644 Week1/Homework/js-exercises/catWalk.js create mode 100644 Week1/Homework/js-exercises/logoHijack.js create mode 100644 Week1/Homework/js-exercises/whatsTheTime.js create mode 100644 Week1/Homework/project-RandomQuoteGenerator/index.html create mode 100644 Week1/Homework/project-RandomQuoteGenerator/script.js create mode 100644 Week1/Homework/project-RandomQuoteGenerator/style.css delete mode 100644 Week1/homework/app.js delete mode 100644 Week1/homework/index.html delete mode 100644 Week1/homework/style.css diff --git a/Week1/Homework/codeAlong/index.html b/Week1/Homework/codeAlong/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/codeAlong/script.js b/Week1/Homework/codeAlong/script.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/codeAlong/style.css b/Week1/Homework/codeAlong/style.css new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/js-exercises/aboutMe.js b/Week1/Homework/js-exercises/aboutMe.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/js-exercises/bookList.js b/Week1/Homework/js-exercises/bookList.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/js-exercises/catWalk.js b/Week1/Homework/js-exercises/catWalk.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/js-exercises/logoHijack.js b/Week1/Homework/js-exercises/logoHijack.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/js-exercises/whatsTheTime.js b/Week1/Homework/js-exercises/whatsTheTime.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/project-RandomQuoteGenerator/index.html b/Week1/Homework/project-RandomQuoteGenerator/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/project-RandomQuoteGenerator/script.js b/Week1/Homework/project-RandomQuoteGenerator/script.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/project-RandomQuoteGenerator/style.css b/Week1/Homework/project-RandomQuoteGenerator/style.css new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/homework/app.js b/Week1/homework/app.js deleted file mode 100644 index a9b5f75d8..000000000 --- a/Week1/homework/app.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -{ - const bookTitles = [ - // Replace with your own book titles - 'harry_potter_chamber_secrets', - ]; - - // Replace with your own code - console.log(bookTitles); -} diff --git a/Week1/homework/index.html b/Week1/homework/index.html deleted file mode 100644 index b22147cd1..000000000 --- a/Week1/homework/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Week1/homework/style.css b/Week1/homework/style.css deleted file mode 100644 index bab13ec23..000000000 --- a/Week1/homework/style.css +++ /dev/null @@ -1 +0,0 @@ -/* add your styling here */ \ No newline at end of file From 24b13c2db90cf87964a9868764e7dc0b0c27b7a8 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Mon, 3 Feb 2020 18:00:21 +0200 Subject: [PATCH 02/16] More files added --- .../js-exercises/{ => aboutMe}/aboutMe.js | 0 .../js-exercises/aboutMe/about_me.html | 20 +++++++++++++++++++ .../{bookList.js => bookList/bookList.html} | 0 .../{catWalk.js => bookList/bookList.js} | 0 .../{whatsTheTime.js => catWalk/catWalk.js} | 0 .../whatsTheTime/showCurrentTime.js | 0 .../js-exercises/whatsTheTime/time.html | 0 7 files changed, 20 insertions(+) rename Week1/Homework/js-exercises/{ => aboutMe}/aboutMe.js (100%) create mode 100644 Week1/Homework/js-exercises/aboutMe/about_me.html rename Week1/Homework/js-exercises/{bookList.js => bookList/bookList.html} (100%) rename Week1/Homework/js-exercises/{catWalk.js => bookList/bookList.js} (100%) rename Week1/Homework/js-exercises/{whatsTheTime.js => catWalk/catWalk.js} (100%) create mode 100644 Week1/Homework/js-exercises/whatsTheTime/showCurrentTime.js create mode 100644 Week1/Homework/js-exercises/whatsTheTime/time.html diff --git a/Week1/Homework/js-exercises/aboutMe.js b/Week1/Homework/js-exercises/aboutMe/aboutMe.js similarity index 100% rename from Week1/Homework/js-exercises/aboutMe.js rename to Week1/Homework/js-exercises/aboutMe/aboutMe.js diff --git a/Week1/Homework/js-exercises/aboutMe/about_me.html b/Week1/Homework/js-exercises/aboutMe/about_me.html new file mode 100644 index 000000000..4dc5f9df6 --- /dev/null +++ b/Week1/Homework/js-exercises/aboutMe/about_me.html @@ -0,0 +1,20 @@ + + + + + + About Me + + + +

About Me

+ + + + + + \ No newline at end of file diff --git a/Week1/Homework/js-exercises/bookList.js b/Week1/Homework/js-exercises/bookList/bookList.html similarity index 100% rename from Week1/Homework/js-exercises/bookList.js rename to Week1/Homework/js-exercises/bookList/bookList.html diff --git a/Week1/Homework/js-exercises/catWalk.js b/Week1/Homework/js-exercises/bookList/bookList.js similarity index 100% rename from Week1/Homework/js-exercises/catWalk.js rename to Week1/Homework/js-exercises/bookList/bookList.js diff --git a/Week1/Homework/js-exercises/whatsTheTime.js b/Week1/Homework/js-exercises/catWalk/catWalk.js similarity index 100% rename from Week1/Homework/js-exercises/whatsTheTime.js rename to Week1/Homework/js-exercises/catWalk/catWalk.js diff --git a/Week1/Homework/js-exercises/whatsTheTime/showCurrentTime.js b/Week1/Homework/js-exercises/whatsTheTime/showCurrentTime.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week1/Homework/js-exercises/whatsTheTime/time.html b/Week1/Homework/js-exercises/whatsTheTime/time.html new file mode 100644 index 000000000..e69de29bb From 608a7a39fd2b6cccc5b5a16ad392200fc431c819 Mon Sep 17 00:00:00 2001 From: Stefanos Leventis Date: Tue, 4 Feb 2020 10:47:19 +0200 Subject: [PATCH 03/16] Booklist done --- .../js-exercises/bookList/bookList.html | 15 ++++++ .../js-exercises/bookList/bookList.js | 54 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/Week1/Homework/js-exercises/bookList/bookList.html b/Week1/Homework/js-exercises/bookList/bookList.html index e69de29bb..cbd160eaa 100644 --- a/Week1/Homework/js-exercises/bookList/bookList.html +++ b/Week1/Homework/js-exercises/bookList/bookList.html @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Week1/Homework/js-exercises/bookList/bookList.js b/Week1/Homework/js-exercises/bookList/bookList.js index e69de29bb..153ad2a82 100644 --- a/Week1/Homework/js-exercises/bookList/bookList.js +++ b/Week1/Homework/js-exercises/bookList/bookList.js @@ -0,0 +1,54 @@ +"use strict" +//Variable that holds the list of books +const books = [{ + title: 'How to Win Friends and Influence People', + author: 'Dale Carnegie', + alreadyRead: true, + cover: "https://images-na.ssl-images-amazon.com/images/I/51NVtjOrnqL.jpg", + }, + { + title: 'The 7 Habits of Highly Effective People', + author: 'Stephen Covey', + alreadyRead: true, + cover: "https://images-na.ssl-images-amazon.com/images/I/51hV5vGr4AL.jpg", + }, + { + title: 'How to stop worrying and start living', + author: 'Dale Carnegie', + alreadyRead: false, + cover: "https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRmQ0AywM8bzvN1c0Ag7UG8WGwgn5lO8FUrp8lO896OpgH2ZqfO" + } +]; + +//Array iteration that creates a paragraph for each book +books.forEach(function(element) { + let paragraph = document.createElement("p") + paragraph.innerHTML = `${element.title} by ${element.author}`; + document.body.appendChild(paragraph); + }) + //Creating an unordered list of the books +let list = document.createElement("ul"); +document.body.appendChild(list) +books.forEach(function(element) { + let listItem = document.createElement("li"); + listItem.innerHTML = element.title; + list.appendChild(listItem); + //Green style for the books I have read, red style for those I haven't read + if (element.alreadyRead === true) { + listItem.style.backgroundColor = "green" + } else { + listItem.style.backgroundColor = "red" + } +}) + + +books.forEach(function(element) { + //Creating an anchor tag for each book with its cover image + let anchor = document.createElement("a"); + anchor.href = element.cover + let image = document.createElement("img") + image.setAttribute("src", element.cover); + anchor.appendChild(image); + document.body.appendChild(anchor); + }) + //END \ No newline at end of file From be2a1ad6784e053bf1f219cb472e0444615a88c4 Mon Sep 17 00:00:00 2001 From: Stefanos Leventis Date: Tue, 4 Feb 2020 16:38:44 +0200 Subject: [PATCH 04/16] about me done --- Week1/Homework/js-exercises/aboutMe/aboutMe.js | 9 +++++++++ Week1/Homework/js-exercises/aboutMe/about_me.html | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Week1/Homework/js-exercises/aboutMe/aboutMe.js b/Week1/Homework/js-exercises/aboutMe/aboutMe.js index e69de29bb..aec73484d 100644 --- a/Week1/Homework/js-exercises/aboutMe/aboutMe.js +++ b/Week1/Homework/js-exercises/aboutMe/aboutMe.js @@ -0,0 +1,9 @@ +document.body.style.fontFamily = "Arial,sans-serif"; +document.querySelector("#nickname").innerHTML = "Stef"; +document.querySelector("#fav-food").innerHTML = "Pastitsio"; +document.querySelector("#hometown").innerHTML = "New Philadelphia"; + +let listItem = document.getElementsByTagName("li"); +for (let i = 0; i < listItem.length; i++) { + listItem[i].className = "list-item" +} \ No newline at end of file diff --git a/Week1/Homework/js-exercises/aboutMe/about_me.html b/Week1/Homework/js-exercises/aboutMe/about_me.html index 4dc5f9df6..2cf9ef7f8 100644 --- a/Week1/Homework/js-exercises/aboutMe/about_me.html +++ b/Week1/Homework/js-exercises/aboutMe/about_me.html @@ -4,6 +4,11 @@ About Me + @@ -14,7 +19,7 @@

About Me

  • Favorite food:
  • Hometown:
  • - + \ No newline at end of file From faad510a76bd5b67effeb76cdd26bcb36105dd43 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Wed, 5 Feb 2020 19:19:53 +0200 Subject: [PATCH 05/16] JS exercises done --- .../Homework/js-exercises/aboutMe/aboutMe.js | 10 ++++++++-- Week1/Homework/js-exercises/catWalk/cat.html | 14 ++++++++++++++ .../Homework/js-exercises/catWalk/catWalk.js | 19 +++++++++++++++++++ Week1/Homework/js-exercises/logoHijack.js | 7 +++++++ .../whatsTheTime/showCurrentTime.js | 19 +++++++++++++++++++ .../js-exercises/whatsTheTime/time.html | 11 +++++++++++ 6 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 Week1/Homework/js-exercises/catWalk/cat.html diff --git a/Week1/Homework/js-exercises/aboutMe/aboutMe.js b/Week1/Homework/js-exercises/aboutMe/aboutMe.js index aec73484d..85a4a25b6 100644 --- a/Week1/Homework/js-exercises/aboutMe/aboutMe.js +++ b/Week1/Homework/js-exercises/aboutMe/aboutMe.js @@ -1,9 +1,15 @@ +//Changing Font document.body.style.fontFamily = "Arial,sans-serif"; +//Adding personal info document.querySelector("#nickname").innerHTML = "Stef"; document.querySelector("#fav-food").innerHTML = "Pastitsio"; document.querySelector("#hometown").innerHTML = "New Philadelphia"; - +//Adding class in each li inside the ul let listItem = document.getElementsByTagName("li"); for (let i = 0; i < listItem.length; i++) { listItem[i].className = "list-item" -} \ No newline at end of file +} +//Adding Photo +let myPhoto = document.createElement("img"); +myPhoto.src = "https://media-exp1.licdn.com/dms/image/C5603AQH-4xn8lqwm_A/profile-displayphoto-shrink_200_200/0?e=1586390400&v=beta&t=cdHKfe_B5JDWPC76dV4BqGO1uUhKCzQk6ISv99lTYcY"; +document.body.appendChild(myPhoto); \ No newline at end of file diff --git a/Week1/Homework/js-exercises/catWalk/cat.html b/Week1/Homework/js-exercises/catWalk/cat.html new file mode 100644 index 000000000..da36289ae --- /dev/null +++ b/Week1/Homework/js-exercises/catWalk/cat.html @@ -0,0 +1,14 @@ + + + + + + Cat Walk + + + + + + + + \ No newline at end of file diff --git a/Week1/Homework/js-exercises/catWalk/catWalk.js b/Week1/Homework/js-exercises/catWalk/catWalk.js index e69de29bb..0eb1ce2fe 100644 --- a/Week1/Homework/js-exercises/catWalk/catWalk.js +++ b/Week1/Homework/js-exercises/catWalk/catWalk.js @@ -0,0 +1,19 @@ +'use strict' +let catImage = document.querySelector("img"); +let positionNum = 10 +let positionStyle = catImage.style.left = positionNum + "px"; +let screenWidth = window.innerWidth; + +setInterval(function () { + positionNum += 10; + catImage.style.left = positionNum + "px"; + if (positionNum === screenWidth / 2) { + catImage.src = "https://media1.tenor.com/images/2de63e950fb254920054f9bd081e8157/tenor.gif?itemid=10561424"; + } + else if (positionNum === screenWidth) { + positionNum = 10; + catImage.src = "http://www.anniemation.com/clip_art/images/cat-walk.gif" + } + +}, 60) + diff --git a/Week1/Homework/js-exercises/logoHijack.js b/Week1/Homework/js-exercises/logoHijack.js index e69de29bb..30afeea8d 100644 --- a/Week1/Homework/js-exercises/logoHijack.js +++ b/Week1/Homework/js-exercises/logoHijack.js @@ -0,0 +1,7 @@ +"use strict" +function hijackGoogleLogo() { + let oldLogo = document.getElementById("hplogo"); + oldLogo.src = "https://www.hackyourfuture.dk/static/logo-dark.svg"; + oldLogo.srcset = "https://www.hackyourfuture.dk/static/logo-dark.svg"; +} +hijackGoogleLogo(); \ No newline at end of file diff --git a/Week1/Homework/js-exercises/whatsTheTime/showCurrentTime.js b/Week1/Homework/js-exercises/whatsTheTime/showCurrentTime.js index e69de29bb..bcba9230b 100644 --- a/Week1/Homework/js-exercises/whatsTheTime/showCurrentTime.js +++ b/Week1/Homework/js-exercises/whatsTheTime/showCurrentTime.js @@ -0,0 +1,19 @@ +"use strict" +//Create an h1 that contains the time +let h1 = document.createElement("h1"); +h1.style.fontSize = ("5rem"); +h1.style.textAlign = ("center"); +document.body.appendChild(h1); + +//Function to show the current time +function currentTime() { + setInterval(function () { + let today = new Date(); + let time = `${today.getHours()}:${today.getMinutes()}:${today.getSeconds()}`; + h1.innerHTML = time; + }, 1000); +} +//Function onload +h1.onload = currentTime(); + + diff --git a/Week1/Homework/js-exercises/whatsTheTime/time.html b/Week1/Homework/js-exercises/whatsTheTime/time.html index e69de29bb..a47c87b48 100644 --- a/Week1/Homework/js-exercises/whatsTheTime/time.html +++ b/Week1/Homework/js-exercises/whatsTheTime/time.html @@ -0,0 +1,11 @@ + + + + Current time + + + + + + + \ No newline at end of file From bd26c32387ea260a8e2b030abc97d667040f5197 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Wed, 5 Feb 2020 22:03:06 +0200 Subject: [PATCH 06/16] Only codeAlong left --- .../Homework/js-exercises/catWalk/catWalk.js | 11 ++- .../project-RandomQuoteGenerator/index.html | 32 +++++++ .../project-RandomQuoteGenerator/script.js | 20 +++++ .../project-RandomQuoteGenerator/style.css | 88 +++++++++++++++++++ 4 files changed, 147 insertions(+), 4 deletions(-) diff --git a/Week1/Homework/js-exercises/catWalk/catWalk.js b/Week1/Homework/js-exercises/catWalk/catWalk.js index 0eb1ce2fe..0a4e0c333 100644 --- a/Week1/Homework/js-exercises/catWalk/catWalk.js +++ b/Week1/Homework/js-exercises/catWalk/catWalk.js @@ -1,19 +1,22 @@ 'use strict' +//Variables let catImage = document.querySelector("img"); let positionNum = 10 let positionStyle = catImage.style.left = positionNum + "px"; let screenWidth = window.innerWidth; - +//Function that moves the cat 10px to the right every 50 milliseconds setInterval(function () { positionNum += 10; catImage.style.left = positionNum + "px"; - if (positionNum === screenWidth / 2) { + let halfScreen = screenWidth / 2; + //Changing image source in the middle of the screen + if (positionNum == halfScreen) { catImage.src = "https://media1.tenor.com/images/2de63e950fb254920054f9bd081e8157/tenor.gif?itemid=10561424"; } + //Restarting the animation when it reaches the end of the screen else if (positionNum === screenWidth) { positionNum = 10; catImage.src = "http://www.anniemation.com/clip_art/images/cat-walk.gif" } - -}, 60) +}, 50) diff --git a/Week1/Homework/project-RandomQuoteGenerator/index.html b/Week1/Homework/project-RandomQuoteGenerator/index.html index e69de29bb..2ab179dcb 100644 --- a/Week1/Homework/project-RandomQuoteGenerator/index.html +++ b/Week1/Homework/project-RandomQuoteGenerator/index.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + Hello, world! + + + +
    +
    +
    +

    Welcome to + random quotes!

    + +

    Click on the following button for your personal quote

    + +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/Week1/Homework/project-RandomQuoteGenerator/script.js b/Week1/Homework/project-RandomQuoteGenerator/script.js index e69de29bb..850e5d0f7 100644 --- a/Week1/Homework/project-RandomQuoteGenerator/script.js +++ b/Week1/Homework/project-RandomQuoteGenerator/script.js @@ -0,0 +1,20 @@ +"use strict" +//Creating array with quotes +const quotes = [ + "Science is nothing but perception", + "The greatest wealth is to live content with little", + "When the mind is thinking it is talking to itself", + "Life must be lived as play", + "Learning never exhausts the mind", + "Independence is happiness" +]; +//Selecting button and quote text +let button = document.querySelector(".new-quote"); +let quoteText = document.querySelector("#quote"); + +//Function that returns a random quote from the array above +function returnQuote() { + quoteText.innerHTML = quotes[Math.floor(Math.random() * quotes.length)]; +} +//Returning a random quote when the button is clicked +button.addEventListener("click", returnQuote); \ No newline at end of file diff --git a/Week1/Homework/project-RandomQuoteGenerator/style.css b/Week1/Homework/project-RandomQuoteGenerator/style.css index e69de29bb..af548012a 100644 --- a/Week1/Homework/project-RandomQuoteGenerator/style.css +++ b/Week1/Homework/project-RandomQuoteGenerator/style.css @@ -0,0 +1,88 @@ +@import url('https://fonts.googleapis.com/css?family=Exo+2:400,700&display=swap'); + +*{ + margin: 0; + padding: 0; +} +body { + font-family: 'Exo 2', sans-serif; + background-color: rgb(0, 97, 104); +} +.full-container { + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; +} +.quote-box { + background-color: white; + margin-left: 8vw; + margin-right: 8vw; + text-align: center; + height: 320px; + display: flex; + flex-direction: column; + justify-content: center; +} +.text { + display: inline-block; + vertical-align: middle; + text-align: center; + padding: 12px; +} + +h2 { + color: rgb(255, 122, 89); + font-size: 2.6rem; + margin: 10px 0 35px 0; +} +p { + font-size: 1.1rem; + margin: 10px 0 20px 0; +} + +i { + color: rgb(0, 97, 104); +} + +span#quote { + margin-right: 15px; + margin-left: 15px; +} + +button { + height: 40px; + width: 100px; + border-radius: 15%; + color: white; + font-weight: bold; + font-size: 1rem; + padding: 5px; + box-shadow: 2px 2px rgb(197, 82, 54); +} + +a button.new-quote { + background-color: rgb(255, 122, 89); + border: 2px solid rgb(255, 122, 89); +} + +a button.new-quote:link { + background-color: rgb(255, 122, 89); + border: 2px solid rgb(255, 122, 89); +} +a button.new-quote:visited { + background-color: rgb(255, 122, 89); + border: 2px solid rgb(255, 122, 89); +} + +a button.new-quote:hover { + background-color: rgb(255, 153, 128); + border: 2px solid rgb(255, 153, 128); + cursor: pointer; +} + +a button.new-quote:active { + background-color: rgb(255, 199, 154); + border: 2px solid rgb(255, 199, 154); +} + From 4c8be55999b3091983b25d0cc1289741ade1dae3 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Fri, 7 Feb 2020 01:24:56 +0200 Subject: [PATCH 07/16] some changes on quote generator --- Week1/Homework/codeAlong/index.html | 66 +++++++++++++++++++++++++++++ Week1/Homework/codeAlong/script.js | 1 + Week1/Homework/codeAlong/style.css | 12 ++++++ 3 files changed, 79 insertions(+) diff --git a/Week1/Homework/codeAlong/index.html b/Week1/Homework/codeAlong/index.html index e69de29bb..c77666cae 100644 --- a/Week1/Homework/codeAlong/index.html +++ b/Week1/Homework/codeAlong/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + JS Issue Tracker + + + +
    +

    Javascript Issue Tracker by Stefanos Leventis

    +
    +

    Add a new issue:

    +
    +
    + + +
    +
    + + +
    +
    + + +
    + + +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/Week1/Homework/codeAlong/script.js b/Week1/Homework/codeAlong/script.js index e69de29bb..bcf80d572 100644 --- a/Week1/Homework/codeAlong/script.js +++ b/Week1/Homework/codeAlong/script.js @@ -0,0 +1 @@ +"use strict" \ No newline at end of file diff --git a/Week1/Homework/codeAlong/style.css b/Week1/Homework/codeAlong/style.css index e69de29bb..a5935d098 100644 --- a/Week1/Homework/codeAlong/style.css +++ b/Week1/Homework/codeAlong/style.css @@ -0,0 +1,12 @@ +@import url('https://fonts.googleapis.com/css?family=Exo+2&display=swap'); +*{ + margin: 0; + padding: 0; +} +body { + background-color: rgb(208, 223, 238); + font-family: 'Exo 2', sans-serif; +} +.jumbotron { + background-color: rgb(236, 168, 136)!important; +} \ No newline at end of file From ac922d60295a65b7f019aaddef8548664028e584 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Fri, 7 Feb 2020 16:45:25 +0200 Subject: [PATCH 08/16] Week1 Homework done --- Week1/Homework/codeAlong/index.html | 9 +- Week1/Homework/codeAlong/script.js | 90 ++++++++++++++++++- Week1/Homework/codeAlong/style.css | 13 ++- .../project-RandomQuoteGenerator/index.html | 6 +- .../project-RandomQuoteGenerator/script.js | 5 +- .../project-RandomQuoteGenerator/style.css | 7 +- 6 files changed, 116 insertions(+), 14 deletions(-) diff --git a/Week1/Homework/codeAlong/index.html b/Week1/Homework/codeAlong/index.html index c77666cae..b9746c733 100644 --- a/Week1/Homework/codeAlong/index.html +++ b/Week1/Homework/codeAlong/index.html @@ -2,19 +2,20 @@ - + - + + JS Issue Tracker - +

    Javascript Issue Tracker by Stefanos Leventis

    @@ -36,7 +37,7 @@

    Add a new issue:

    - +
    diff --git a/Week1/Homework/codeAlong/script.js b/Week1/Homework/codeAlong/script.js index bcf80d572..3c9d1caca 100644 --- a/Week1/Homework/codeAlong/script.js +++ b/Week1/Homework/codeAlong/script.js @@ -1 +1,89 @@ -"use strict" \ No newline at end of file +"use strict" +document.getElementById('issueInputForm').addEventListener("submit", saveIssue); + +function saveIssue(e) { + let issueDesc = document.querySelector("#issueDescInput").value; + let issueSeverity = document.querySelector("#issueSeverityInput").value; + let issueAssignedTo = document.querySelector("#issueAssignedToInput").value; + let issueId = chance.guid(); + let issueStatus = "Open"; + + let issue = { + id: issueId, + description: issueDesc, + severity: issueSeverity, + assignedTo: issueAssignedTo, + status: issueStatus + } + + if (localStorage.getItem("issues") == null) { + let issues = []; + issues.push(issue); + localStorage.setItem("issues", JSON.stringify(issues)); + } else { + let issues = JSON.parse(localStorage.getItem("issues")); + issues.push(issue); + localStorage.setItem("issues", JSON.stringify(issues)); + } + + document.querySelector("#issueInputForm").reset(); + + fetchIssues(); + + e.preventDefault(); +} + +function setStatusClosed(id) { + let issues = JSON.parse(localStorage.getItem("issues")); + + for (let i = 0; i < issues.length; i++) { + if (issues[i].id == id) { + issues[i].status = "Closed"; + } + } + + localStorage.setItem("issues", JSON.stringify(issues)); + + fetchIssues(); + +} + +function deleteIssue(id) { + let issues = JSON.parse(localStorage.getItem("issues")); + + for (let i = 0; i < issues.length; i++) { + if (issues[i].id == id) { + issues.splice(i, 1); + } + } + + localStorage.setItem("issues", JSON.stringify(issues)); + + fetchIssues(); + +} + +function fetchIssues() { + let issues = JSON.parse(localStorage.getItem("issues")); + let issuesList = document.querySelector("#issuesList"); + + issuesList.innerHTML = ""; + for (let i = 0; i < issues.length; i++) { + let id = issues[i].id; + let desc = issues[i].description; + let severity = issues[i].severity; + let assignedTo = issues[i].assignedTo; + let status = issues[i].status; + + + //Check the glyphicon icon | Stopped coding at 35:00 + issuesList.innerHTML += '
    ' + + '
    Issue ID: ' + id + '
    ' + '

    ' + status + '

    ' + '

    ' + desc + '

    ' + '

    ' + severity + '

    ' + + '

    ' + assignedTo + '

    ' + + 'Close' + + 'Delete' + '
    ' + '
    '; + + + } + +} \ No newline at end of file diff --git a/Week1/Homework/codeAlong/style.css b/Week1/Homework/codeAlong/style.css index a5935d098..8666fbaee 100644 --- a/Week1/Homework/codeAlong/style.css +++ b/Week1/Homework/codeAlong/style.css @@ -4,9 +4,20 @@ padding: 0; } body { - background-color: rgb(208, 223, 238); + background-color: rgb(255, 255, 255); font-family: 'Exo 2', sans-serif; } .jumbotron { background-color: rgb(236, 168, 136)!important; +} +div.well { + margin: 20px 0 20px 0; + background-color: rgb(243, 225, 219); + border:1px solid rgb(170, 166, 164); + border-radius: 10px; + padding: 20px; + +} +a.btn.btn-warning, a.btn.btn-danger { + margin: 5px 12px 5px 0px; } \ No newline at end of file diff --git a/Week1/Homework/project-RandomQuoteGenerator/index.html b/Week1/Homework/project-RandomQuoteGenerator/index.html index 2ab179dcb..e278c0417 100644 --- a/Week1/Homework/project-RandomQuoteGenerator/index.html +++ b/Week1/Homework/project-RandomQuoteGenerator/index.html @@ -9,7 +9,7 @@ - Hello, world! + Random Quotes @@ -17,9 +17,9 @@

    Welcome to - random quotes!

    + the quote generator -

    Click on the following button for your personal quote

    +

    Click on the following button to generate a quote

    diff --git a/Week1/Homework/project-RandomQuoteGenerator/script.js b/Week1/Homework/project-RandomQuoteGenerator/script.js index 850e5d0f7..e9c076704 100644 --- a/Week1/Homework/project-RandomQuoteGenerator/script.js +++ b/Week1/Homework/project-RandomQuoteGenerator/script.js @@ -3,9 +3,10 @@ const quotes = [ "Science is nothing but perception", "The greatest wealth is to live content with little", - "When the mind is thinking it is talking to itself", - "Life must be lived as play", + "Success is sweet but the secret is sweat", + "Every day is a good start", "Learning never exhausts the mind", + "Work to become, not to acquire", "Independence is happiness" ]; //Selecting button and quote text diff --git a/Week1/Homework/project-RandomQuoteGenerator/style.css b/Week1/Homework/project-RandomQuoteGenerator/style.css index af548012a..3ef52eec6 100644 --- a/Week1/Homework/project-RandomQuoteGenerator/style.css +++ b/Week1/Homework/project-RandomQuoteGenerator/style.css @@ -16,13 +16,14 @@ body { } .quote-box { background-color: white; - margin-left: 8vw; - margin-right: 8vw; + margin-left: 6vw; + margin-right: 6vw; text-align: center; height: 320px; display: flex; flex-direction: column; justify-content: center; + border-radius: 12px; } .text { display: inline-block; @@ -53,7 +54,7 @@ span#quote { button { height: 40px; width: 100px; - border-radius: 15%; + border-radius: 12px; color: white; font-weight: bold; font-size: 1rem; From 1a12675985fcf8db4ae1b2f87b3161f6cd452d9b Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sat, 8 Feb 2020 17:54:07 +0200 Subject: [PATCH 09/16] changed some directories --- .../codeAlong/{ => issue-tracker}/index.html | 0 .../codeAlong/{ => issue-tracker}/script.js | 0 .../codeAlong/{ => issue-tracker}/style.css | 0 Week2/LESSONPLAN.md | 203 ------------------ Week2/MAKEME.md | 168 --------------- Week2/README.md | 159 -------------- Week2/homework/maartjes-work.js | 65 ------ Week2/homework/map-filter.js | 15 -- Week2/test/maartjes-work.test.js | 9 - Week2/test/map-filter.test.js | 8 - 10 files changed, 627 deletions(-) rename Week1/Homework/codeAlong/{ => issue-tracker}/index.html (100%) rename Week1/Homework/codeAlong/{ => issue-tracker}/script.js (100%) rename Week1/Homework/codeAlong/{ => issue-tracker}/style.css (100%) delete mode 100644 Week2/LESSONPLAN.md delete mode 100644 Week2/MAKEME.md delete mode 100644 Week2/README.md delete mode 100644 Week2/homework/maartjes-work.js delete mode 100644 Week2/homework/map-filter.js delete mode 100644 Week2/test/maartjes-work.test.js delete mode 100644 Week2/test/map-filter.test.js diff --git a/Week1/Homework/codeAlong/index.html b/Week1/Homework/codeAlong/issue-tracker/index.html similarity index 100% rename from Week1/Homework/codeAlong/index.html rename to Week1/Homework/codeAlong/issue-tracker/index.html diff --git a/Week1/Homework/codeAlong/script.js b/Week1/Homework/codeAlong/issue-tracker/script.js similarity index 100% rename from Week1/Homework/codeAlong/script.js rename to Week1/Homework/codeAlong/issue-tracker/script.js diff --git a/Week1/Homework/codeAlong/style.css b/Week1/Homework/codeAlong/issue-tracker/style.css similarity index 100% rename from Week1/Homework/codeAlong/style.css rename to Week1/Homework/codeAlong/issue-tracker/style.css diff --git a/Week2/LESSONPLAN.md b/Week2/LESSONPLAN.md deleted file mode 100644 index bdafc5991..000000000 --- a/Week2/LESSONPLAN.md +++ /dev/null @@ -1,203 +0,0 @@ -# Lesson Plan JavaScript2 Week 2 - -## Agenda - -The purpose of this class is to introduce to the student: - -- What synchronous vs. asynchronous processes are -- What callbacks are and how to write your own -- How the event loop works -- Show 3 commonly used array functions (filter, reduce, map) - -## Core concepts - -FIRST HALF (12.00 - 13.30) - -## 1. Q&A about last week's concepts & homework - -- DOM -- DOM manipulation -- browser defined functions - -Note: You can ask students to explain a concept or summerise the last lecture themselves - -## 2. What synchronous vs. asynchronous processes are - -### Explanation - -### Example - -### Exercise - -### Essence - -Notes: - -- Synchronous refers to a linear execution process: one step at a time -- Asynchronous helps us do multiple things in parallel - -## 3. Callbacks - -### Explanation - -A callback in JavaScript is basically a function(callback) being passed as a parameter to another function which after some point of time would execute the function passed or invoke the callback. - -Callbacks were primarily introduced in JavaScript to achieve asynchronous behaviour -(https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced) - -### Example - -Consider a situation where person A wishes to go out for a movie with a friend person B one evening. Person A finds out the time and place and now needs to share it with B. A picks up the phone and tries to call B. Let's say that B is currently busy with some work and can't answer the phone. Person A has now got two options. One option is to stay on the line until B picks up the phone and then share the movie details. Or A could drop a voicemail and ask B to **callback** once free. - -```javascript -function doHomework(subject, callback) { - alert(`Starting my ${subject} homework.`); - callback(); -} -function alertFinished() { - alert('Finished my homework'); -} -doHomework('math', alertFinished); -``` - -more examples (made by Yash): https://github.com/HackYourFuture/JavaScript2/blob/master/assets/callbacks.js - -### Exercise - -#### 1. What will happen? - -#### 2. How to turn the output order around? - -```javascript -function first() { - // Simulate a code delay - setTimeout(function() { - console.log(1); - }, 500); -} -function second() { - console.log(2); -} - -first(); -second(); -``` - -### Essence - -you can’t just call one function after another and hope they execute in the right order. Callbacks are a way to make sure certain code doesn’t execute until other code has already finished execution. - -SECOND HALF (14.00 - 16.00) - -## 4. Event loops - -### Explanation - -https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/event_loop.md - -### Example - -```Javascript -const bar = () => console.log('bar') - -const baz = () => console.log('baz') - -const foo = () => { - console.log('foo') - bar() - baz() -} - - -foo() -``` - -Output: - -```Javascript -foo -bar -baz -``` - -Call stack -![Call Stack](../assets/call_stack_example.png) - -### Exercise - -### Essence - -## 5. filter, reduce, map - -### Explanation - -**map**, **filter** and **reduce** are three array methods that iterate (loop!) over the whole array and preform a computation or a transformation. -They have in common that they return a new array based on the transformations/calculations. - -> [MDN definition](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map): The **map()** method creates a new array with the results of calling a provided function on every element in the calling array. - -> [MDN definition](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter): The **filter()** method creates a new array with all elements that pass the test implemented by the provided function - -> [MDN definition](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce): The **reduce()** method executes a **reducer** function (that you provide) on each member of the array resulting in a single output value†. - -Writing the functions yourself: https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/map_filter.md - -### Example - -```Javascript -const numbers = [1, 2, 3, 4]; -const square = x => x * x; -const squaredNumbers = numbers.map(square); - -console.log(squaredNumbers); // -> [ 1, 4, 9, 16 ] -``` - -```Javascript -const numbers = [1, 2, 3, 2]; -const isTwo = x => x === 2; -const Twos = numbers.filter(isTwo); - -console.log(Twos); // -> [ 2, 4 ] -``` - -```Javascript -const numbers = [1, 2, 3, 4]; - -const sum = (a, b) => a + b; -const total = numbers.xxx(sum, 0); - -console.log(total); // -> 10 -``` - -### Exercise - -Fill in the xxx with map, filter or reduce: - -```Javascript -const numbers = [1, 2, 3, 4]; -const doubled = numbers.xxx(item => item * 2); -console.log(doubled); // [2, 4, 6, 8] -``` - -```Javascript -const numbers = [1, 2, 3, 4]; - -const times = (a, b) => a * b; -const total = numbers.xxx(times, 0); - -console.log(total); // -> 10 -``` - -```Javascript -const numbers = [1, 2, 3, 4]; -const evens = numbers.xxx(item => item % 2 === 0); -console.log(evens); // [2, 4] -``` - -Yash made a very nice exercise (with answers): -https://github.com/yash-kapila/HYF-JS2-Week2/tree/master/src - -### Essence - -Easy methodes to transform arrays, wich you'll have to do quite often, while keeping the original array intact. -You can see it as a shortcut. Of course you can write these methodes yourself many times, but 'they' already did it for you diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md deleted file mode 100644 index 0e30a020c..000000000 --- a/Week2/MAKEME.md +++ /dev/null @@ -1,168 +0,0 @@ -# Homework JavaScript2 Week 2 - -## **Todo list** - -1. Practice the concepts -2. JavaScript exercises -3. Code along -4. PROJECT: The Pomodoro Clock - -## **1. Practice the concepts** - -Before we head into the exercises, it might be nice to do some interactive exercises first! In the following resource you'll find some exercises that'll teach you all about callbacks and array functions! - -- [Learn JavaScript: Iterators](https://www.codecademy.com/learn/introduction-to-javascript/modules/learn-javascript-iterators) - -## **2. JavaScript exercises** - -> Inside of your `JavaScript2` fork, create a folder called `week2`. Inside of that folder, create a folder called `js-exercises`. For all the following exercises create a new `.js` file in that folder (5 files in total). Make sure the name of each file reflects its content: for example, the filename for exercise one could be `oddOnesOut.js`. - -**Exercise 1: The odd ones out** - -Look at the following code snippet: - -```js -function doubleEvenNumbers(numbers) { - const newNumbers = []; - for (let i = 0; i < numbers.length; i++) { - if (numbers[i] % 2 === 0) { - newNumbers.push(numbers[i] * 2); - } - } - return newNumbers; -} - -const myNumbers = [1, 2, 3, 4]; -console.log(doubleEvenNumbers(myNumbers)); // Logs "[4, 8]" to the console -``` - -The `doubleEvenNumbers` function returns only the even numbers in the array `myNumbers` and doubles them. Like you've learned in the [README](README.md), this block of code isn't easy to decipher. - -Let's rewrite it. - -- Using the `map` and `filter` functions, rewrite the `doubleEvenNumbers` function. - -**Exercise 2: What's your Monday worth?** - -When you're a developer at a big company your Monday could look something like this: - -```js -const mondayTasks = [ - { - name: 'Daily standup', - duration: 30, // specified in minutes - }, - { - name: 'Feature discussion', - duration: 120, - }, - { - name: 'Development time', - duration: 240, - }, - { - name: 'Talk to different members from the product team', - duration: 60, - }, -]; -``` - -Let's assume your hourly rate is €25. How much would you earn on that day? - -- Write a program that finds out what your hourly rate on a Monday would be -- Use the `map` array function to take out the duration time for each task. -- Multiply each duration by a per-hour rate for billing and sum it all up. -- Output a formatted Euro amount, rounded to Euro cents, e.g: `€11.34`. -- Make sure the program can be used on any array of objects that contain a `duration` property with a number value - -**Exercise 3: Lemon allergy** - -Your mom bought you a basket of fruit, because you're doing so well in HackYourFuture. How sweet of her! - -```js -const fruitBasket = ['Apple', 'Lemon', 'Grapefruit', 'Lemon', 'Banana', 'Watermelon', 'Lemon']; -``` - -However, she forgot that you are allergic to lemons! Let's quickly dispose of them before you get an attack. - -- Write a function -- Use the `filter` array function to take out the lemons -- Output a string that says: "My mom bought me a fruit basket, containing [array of fruits] !" - -**Exercise 4: Collective age** - -Have you ever wondered how old the HackYourFuture team members are? Or better yet: what the collective age is? Let's find out! - -```js -const hackYourFutureMembers = [ - { name: 'Wouter', age: 33 }, - { name: 'Federico', age: 32 }, - { name: 'Noer', age: 27 }, - { name: 'Tjebbe', age: 22 }, -]; -``` - -- Write a program that calculates the combined age of every member -- Make use of the `map` function to get the ages -- It should contain a function that takes a callback -- The callback adds all the ages together and returns the number -- The main function should log the string "The collective age of the HYF team is: [number]" to the console, and afterwards return the number - -**Exercise 5: My favorite hobbies** - -I've got a couple of hobbies that I want to showcase in a webpage. - -```js -const myHobbies = [ - 'Meditation', - 'Reading', - 'Programming', - 'Hanging out with friends', - 'Going to the gym', -]; -``` - -- Write a program that outputs each of these inside an HTML file -- Create an HTML and JavaScript file, link them together -- Use the `map` and/or `forEach` function to put each hobby into a list item -- Output the list items in an unordered list - -## **3. Code along** - -Programming can be used to not only make websites, but also games! In the following tutorial you're going to apply your DOM manipulation skills in order to make a classic game: Rock, Paper, Scissors! Enjoy! - -- [Build a Rock, Paper, Scissors Game](https://www.youtube.com/watch?v=WR_pWXJZiRY) - -## **4. PROJECT: The Pomodoro Clock** - -> Every week ends with a project you have to build on your own. Instead of getting clear-cut instructions, you'll get a list of criteria that your project needs to measure up to. - -> Before you start, create a new folder called `project` that includes the files for the following app you'll be building. - -In this week's project you'll be making a Pomodoro Clock! A user can specify how many minutes the timer should be set, and with a click on the play button it starts counting down! If the user wants to pause the timer, they can do so by clicking the pause button. - -It should look like this: - -![Pomodoro Clock](../assets/pomodoro.png) - -Here are the requirements: - -- If the timer is running, the user can't change the session length anymore -- Use at least 3 functions -- Display minutes and seconds -- If the timer finishes the timer should be replaced by the message: `Time's up!` - -Good luck! - -## **SUBMIT YOUR HOMEWORK!** - -After you've finished your todo list it's time to show us what you got! The homework that needs to be submitted is the following: - -1. JavaScript exercises -2. PROJECT: The Pomodoro Clock - -Upload both to your forked JavaScript2 repository in GitHub. Make a pull request to the original repository. - -> Forgotten how to upload your homework? Go through the [guide](../hand-in-homework-guide.md) to learn how to do this again. - -_Deadline Saturday 23.59 CET_ diff --git a/Week2/README.md b/Week2/README.md deleted file mode 100644 index 808de176e..000000000 --- a/Week2/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# Reading Material JavaScript2 Week 2 - -## Agenda - -These are the topics for week 2: - -1. Synchronous vs. asynchronous - - Synchronous - - Asynchronous -2. Introducing asynchronicity using callbacks - - Higher order functions - - Functions as arguments to other functions -3. Array Functions -4. Event Loop - -## 1. Synchronous vs. asynchronous - -### Synchronous - -In the previous module you've learned about **control flow**. In short: it's the order in which the computer executes statements in a script. In JavaScript this goes from left to right, top to bottom. - -Let's look at code execution from another angle. The program that executes your code can do it in two basic ways: synchronous or asynchronous. Whenever code blocks are executed line after line (from top to bottom) we call this **synchronous execution**. However, when code blocks can be executed **without having to wait until a command ends**, we call this **asynchronous execution**. This is illustrated in the following diagram: - -![Sync vs. Async](../assets/javascript-sync-vs-async.png) - -Now imagine the following scenario: - -> Noer wants to have breakfast but he doesn't have any food at home. He decides he want to eat oatmeal. The ingredients (oats and milk) can be bought at the supermarket. How to do this? First Noer takes a shower. Then he puts on some clothes. Then some shoes. Then he opens the door and goes outside. Then he jumps on the bike and goes to the closest supermarket. After looking for some time he finds the ingredients. Then Noer buys the ingredients. Then he jump back on the bike and go home. Then he mixes the ingredients and makes oatmeal. Then Noer eats and feels amazing! - -In this example, each action could only happen after the previous has been completed. Noer can't put on his shoes, while taking a shower. Or, he can't eat oatmeal while he buys the ingredients. - -As you can see, each action is executed in a synchronous manner. This is to say: in a logical order sequentially and only one action at a time. - -**This is also how JavaScript by default operates**. Only one operation can happen at a time. If something else wants to start, it has to wait until the current action has finished. - -### Asynchronous - -Sometimes we want to do multiple things at the same time, without each action to be dependent on each other. Asynchronous execution avoids this bottleneck. You are essentially saying, “I know this function call is going to take a great deal of time, but my program doesn’t want to wait around while it executes.” Consider the following scenario: - -> Wouter is feeling hungry, so he decides to go to a restaurant. He arrives there and gets into the line to order food. After ordering he takes a seat and, while he waits, reads a book. Occassionally he looks around and sees different things happening: new people enter the restaurant, some people get their food served and others are just talking. After a short while Wouter's food arrives and it's time to dig in! - -In this example Wouter reads a book, but that doesn't affect his meal from being prepared. While his meal is prepared there are other people walking around, eating or just talking with each other. In short: multiple things are happening simultaneously and every event is not dependent upon another. - -This does not happen by default in JavaScript, and needs to be invoked. A way to do that is by using `callbacks`, which you'll be learning about in the next section. - -## 2. Introducing asynchronicity using callbacks - -Before we dive into what a `callback` is we have to understand a little about `higher order functions`. - -### Higher order functions - -Let's start with a simple, practical definition: a higher order function is any function that can take another function as an argument or returns a function. - -```js -// Example 1 -function higherOrderFunction(anotherFunction) { - anotherFunction(); - return; -} - -// Example 2 -function anotherHigherOrderFunction() { - return function() { - return; - }; -} -``` - -Why do we need them? A higher order function integrates multiple functions, which each have a singular operational purpose. This will allow us to reuse code much more than if we had to write everything out. - -> Higher order functions are a core concept within a programming paradigm called "functional programming". It's not relevant at all for you to know or care about this, but it's important to be exposed to it. - -### Functions as arguments to other functions - -Imagine the following situation: - -> It's 15.00 and you're studying at home for an exam on the next day. Suddenly, your phone rings. You pick up and find it's your best friend! They ask if you'd like to hang out later. What do you do? On the one hand, you'd love to hang out have fun. On the other hand, you really should study some more. You don't know so you tell your friend that you're going to _call back_ later with your answer. You end the conversation and go back to studying. Maybe you take a break or have a snack as well. On the other line your friend hangs up the phone and continues along with their day: they go out grocery shopping, cleaning the house and cooking dinner. After finishing your studies you call your friend and makes plans to go out together. - -This example illustrates the concept of **asynchronicity**: there are multiple processes happening simultaneously, without any single thing being dependent upon another. Your friend is not waiting by the phone until you have the answer. Or in technical terms: until the callback (which is you) has the return value (the answer to your friend's request to hang out). - -This is the utility of `callbacks`: they allow us to introduce asynchronicity into the control flow of an application. - -Study the following resources to learn more about the importance of callbacks: - -- [Asynchronous JavaScript](https://www.youtube.com/watch?v=YxWMxJONp7E) -- [Understanding JavaScript Callbacks](https://www.youtube.com/watch?v=Nau-iEEgEoM) -- [Callback Functions](https://www.youtube.com/watch?v=QRq2zMHlBz4) - -## 3. Array Functions - -There are different ways of dealing with arrays. The most common way is by using a loop and then writing custom logic inside it in order to manipulate the values. This solution works, but it comes at several disadvantages. - -1. The first disadvantage is that using loops requires us to write custom logic for each use case. This can lead to repeated code, which we always want to [avoid](https://www.youtube.com/watch?v=IGH4-ZhfVDk) -2. The second disadvantage is that a loop isn't descriptive about what it intends to do. If another developer reads that code it wouldn't be obvious what it would do, without spending time on it to decipher it - -There are certain functions, `array functions`, that aim to solve these two problems simultaneously. Array functions are higher order functions, because they take a function as an argument. - -Let's take an example: the `map()` function. It takes a function as an argument, and executes that unto each index position of the array, returning at the end a new array with all the "mapped" values. - -Take a look at the following code snippet to see it in action: - -```js -const numbers = [2, 4, 6, 8, 10]; - -function addTwo(number) { - return number + 2; -} - -const numbersPlusTwo = numbers.map(addTwo); - -console.log(numbersPlusTwo); -``` - -Copy and paste this snippet in the browser console to see how it works. As you can see the function `addTwo` added 2 to each value in the `numbers` array, because that's what the `map()` function does: it "maps" a function unto each array index. - -We could've done the same thing with a regular loop, but that would've been (1) much less readable, and (2) much more code: - -```js -const numbers = [2, 4, 6, 8, 10]; -const numbersPlusTwo = []; - -for (let i = 0; i < numbers.length; i++) { - const number = numbers[i]; - const addedTwo = number + 2; - - numbersPlusTwo.push(addedTwo); -} - -console.log(numbersPlusTwo); -``` - -Can you see why the array function is the better way to go? - -Go through the following resources to learn more about the different array functions and their use: - -- [JavaScript Higher Order Functions & Arrays](https://www.youtube.com/watch?v=rRgD1yVwIvE) -- [8 Must Know JavaScript Array Methods](https://www.youtube.com/watch?v=R8rmfD9Y5-c) - -## 4. Event Loop - -If a webpage contains JavaScript, then the browser knows it has to execute the instructions contained in the script files. But how does the browser know what to do first? This is where the `Event Loop` comes in. - -Note: while this mechanism is important to be aware of, keep in mind that you won't be using it actively in development. - -In simple terms, the `Event Loop` is a mechanism that operates in the browser. It keeps track of the order of execution of JavaScript commands. consists of 4 parts: - -1. Heap. This is where the browser assigns space in memory to each process -2. Call Stack. This is the amount of JavaScript commands (read: function calls and events) that need to be executed -3. Web APIs. These are objects (like the document) and functions (like XMLHttpRequest) that can be used within the JavaScript commands found in the Call Stack -4. Callback Queue. This is the "waiting line" for asynchronous function calls - -To see it in action check out the following resources: - -- [What the heck is an event loop?](https://www.youtube.com/watch?v=8aGhZQkoFbQ) -- [JavaScript Event Loop](https://www.youtube.com/watch?v=XzXIMZMN9k4) - -## Finished? - -Are you finished with going through the materials? High five! If you feel ready to get practical, click [here](./MAKEME.md). diff --git a/Week2/homework/maartjes-work.js b/Week2/homework/maartjes-work.js deleted file mode 100644 index 49772eb44..000000000 --- a/Week2/homework/maartjes-work.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -const monday = [ - { - name: 'Write a summary HTML/CSS', - duration: 180, - }, - { - name: 'Some web development', - duration: 120, - }, - { - name: 'Fix homework for class10', - duration: 20, - }, - { - name: 'Talk to a lot of people', - duration: 200, - }, -]; - -const tuesday = [ - { - name: 'Keep writing summary', - duration: 240, - }, - { - name: 'Some more web development', - duration: 180, - }, - { - name: 'Staring out the window', - duration: 10, - }, - { - name: 'Talk to a lot of people', - duration: 200, - }, - { - name: 'Look at application assignments new students', - duration: 40, - }, -]; - -const maartjesTasks = monday.concat(tuesday); -const maartjesHourlyRate = 20; - -function computeEarnings(tasks, hourlyRate) { - // Replace this comment and the next line with your code - console.log(tasks, hourlyRate); -} - -// eslint-disable-next-line no-unused-vars -const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); - -// add code to convert `earnings` to a string rounded to two decimals (euro cents) - -console.log(`Maartje has earned €${'replace this string with the earnings rounded to euro cents'}`); - -// Do not change or remove anything below this line -module.exports = { - maartjesTasks, - maartjesHourlyRate, - computeEarnings, -}; diff --git a/Week2/homework/map-filter.js b/Week2/homework/map-filter.js deleted file mode 100644 index c8e8a88c1..000000000 --- a/Week2/homework/map-filter.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -function doubleOddNumbers(numbers) { - // Replace this comment and the next line with your code - console.log(numbers); -} - -const myNumbers = [1, 2, 3, 4]; -console.log(doubleOddNumbers(myNumbers)); - -// Do not change or remove anything below this line -module.exports = { - myNumbers, - doubleOddNumbers, -}; diff --git a/Week2/test/maartjes-work.test.js b/Week2/test/maartjes-work.test.js deleted file mode 100644 index ab6bc2a44..000000000 --- a/Week2/test/maartjes-work.test.js +++ /dev/null @@ -1,9 +0,0 @@ -const { maartjesTasks, maartjesHourlyRate, computeEarnings } = require(`../homework/maartjes-work`); - -describe('maartjes_work', () => { - test('earnings rounded to euro cents', () => { - const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); - const result = earnings.toFixed(2); - expect(result).toBe('373.33'); - }); -}); diff --git a/Week2/test/map-filter.test.js b/Week2/test/map-filter.test.js deleted file mode 100644 index e4cb83906..000000000 --- a/Week2/test/map-filter.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const { myNumbers, doubleOddNumbers } = require(`../homework/map-filter`); - -describe('map_filter', () => { - test('result -> [2, 6]', () => { - const result = doubleOddNumbers(myNumbers); - expect(result).toEqual([2, 6]); - }); -}); From 2f05a7d30c7a4bd788ac999a70092cf9fb20e45f Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sat, 8 Feb 2020 17:55:32 +0200 Subject: [PATCH 10/16] Js-exercises and codeAlong completed --- .../codeAlong/rockPaperScissors/index.html | 66 ++++++ .../codeAlong/rockPaperScissors/ropasc-bg.jpg | Bin 0 -> 112812 bytes .../codeAlong/rockPaperScissors/script.js | 113 ++++++++++ .../codeAlong/rockPaperScissors/style.css | 108 ++++++++++ Week2/Homework/js-exercises/collectiveAge.js | 12 ++ .../favoriteHobbies/favoriteHobbies.js | 20 ++ .../js-exercises/favoriteHobbies/hobbies.html | 15 ++ Week2/Homework/js-exercises/lemonAllergy.js | 4 + Week2/Homework/js-exercises/mondayWorth.js | 21 ++ Week2/Homework/js-exercises/oddOnesOut.js | 4 + Week2/Homework/maartjes-work.js | 65 ++++++ Week2/Homework/map-filter.js | 15 ++ .../Homework/project-PomodoroClock/index.html | 51 +++++ .../Homework/project-PomodoroClock/script.js | 0 .../Homework/project-PomodoroClock/style.css | 67 ++++++ Week2/LESSONPLAN.md | 203 ++++++++++++++++++ Week2/MAKEME.md | 168 +++++++++++++++ Week2/README.md | 159 ++++++++++++++ Week2/test/maartjes-work.test.js | 9 + Week2/test/map-filter.test.js | 8 + 20 files changed, 1108 insertions(+) create mode 100644 Week2/Homework/codeAlong/rockPaperScissors/index.html create mode 100644 Week2/Homework/codeAlong/rockPaperScissors/ropasc-bg.jpg create mode 100644 Week2/Homework/codeAlong/rockPaperScissors/script.js create mode 100644 Week2/Homework/codeAlong/rockPaperScissors/style.css create mode 100644 Week2/Homework/js-exercises/collectiveAge.js create mode 100644 Week2/Homework/js-exercises/favoriteHobbies/favoriteHobbies.js create mode 100644 Week2/Homework/js-exercises/favoriteHobbies/hobbies.html create mode 100644 Week2/Homework/js-exercises/lemonAllergy.js create mode 100644 Week2/Homework/js-exercises/mondayWorth.js create mode 100644 Week2/Homework/js-exercises/oddOnesOut.js create mode 100644 Week2/Homework/maartjes-work.js create mode 100644 Week2/Homework/map-filter.js create mode 100644 Week2/Homework/project-PomodoroClock/index.html create mode 100644 Week2/Homework/project-PomodoroClock/script.js create mode 100644 Week2/Homework/project-PomodoroClock/style.css create mode 100644 Week2/LESSONPLAN.md create mode 100644 Week2/MAKEME.md create mode 100644 Week2/README.md create mode 100644 Week2/test/maartjes-work.test.js create mode 100644 Week2/test/map-filter.test.js diff --git a/Week2/Homework/codeAlong/rockPaperScissors/index.html b/Week2/Homework/codeAlong/rockPaperScissors/index.html new file mode 100644 index 000000000..ee1e53644 --- /dev/null +++ b/Week2/Homework/codeAlong/rockPaperScissors/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + Rock, paper, scissors! + + + + + + +
    +

    Rock Paper Scissors

    +

    An all time classic

    + +
    +
    +
    Player: 0
    +
    Computer: 0
    +
    +
    +

    Make your selection

    +
    +
    + + + +
    +
    + + + +
    + +
    + + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/Week2/Homework/codeAlong/rockPaperScissors/ropasc-bg.jpg b/Week2/Homework/codeAlong/rockPaperScissors/ropasc-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..705da3959e1883e0db71d9e52ad99fefa646a744 GIT binary patch literal 112812 zcmeFa2UJtb+5oyk=uMCi5kVqFdXNImDFG}9 zM8vM3AfQ6PjtEw)yxBVhf_lq;&V6gWwcg2DB(rBv{n~tOJd-_>gM5Ql3B+{}9wNj! z)%Ohe?Sh00!H=Q{>(`7x!UyA=LP;^C=ulD=&cXtxqou8fQ}QH65=imU%8-thj+U{O zjjPDk5VSJzlq3xd!mQ8Vj1$-$a~OZ6mrrVJ*6KinwvR9kNLy`W@g_JUGj-wOwd zH3mwDV|r}fBIa`24FE4b`(cWj9~evp!wZs95(6s^%6j*DmtAiH_|OKPmb7eD_?^ zZRIob(`^-$<ribtG z2+1@)`Svbd=FA((ah|rQpdVWkGyG|^tuGH6*%G-99O%=pKXH4ZT>ICXHXC&EbvkMR9b3`l;n8*C91>b!L!=?@1iv1cs$t{aYw=P<`-Ky34JTwVu z@@xxvalv?>u<)m`_oFhI2S@VrFWPRC7AZ}gI1yP6y+?aoJC>`PK-=&opL##!z`1~- z_w5JYO+wY_8$V{4G|iWJd}=}E$oI|8tPyJ4sqSnsT(L1-M<`3Y#CT;Cw$MV`c=s?{gk@TeB$Lh(t?xS#0aGmEO-= z*-$98!qi$||RUs4<7p-xAkdE&MF44%LO8 zgwibSLB|z4FXueN#AVOZO&8o0(7f}@lWR8I>31fAw(m}r-B$AU8^gBHR;i(aGu!s3 z>$(*(W5ip7JS%HHOHD%0Y?Wg&c=VoF?i@ZgO;xUwU2GHE4~an8hRuAPZU$R3f5z=! zC^QM(xaUc2dt&;4XO7&Dmj{}*+O%W%)tm$w+S{AG`L^hYG@d^V3*2`R{z647Qwqheq9xA0}9w}0l`cHiLV_f#V3&izY`t7Yy} zQgxQjNwlfWy>fn2v*~7;G>f=r(V8J|=j1OhTW&PhXc7oZv)5TPJE%-K3Qk0G`e*6(w&#lKm1Nbh`m{GI-~umt=rnk`z(mGZI{nk zsGR$$2K}Mv#f~Qf>BWwpt%9=O|5$rVsYEdHvc^}E>ChzPa$h&qEeGB4b>-MX+k3VG zMwb&;H=~LbFAG)sy&DuhRy6<({Y=l;8=$#w!`AM4$GhW7wSIi-u6U{U|5&EQnA-Gv?xMvgZ8B~`48`v)W~Hc zVf(6jFZ@KUfH;N4bnF{?8=l!ZrhhG(e9$A0l5dv2({Gpa{Fo$9?ZxHSC~I#uIvz4O zs8eYDN%UI_cBpNnR+oeKoCT-eg&jlNK4#o`u-$LlG0r`=gN6%Mzm({X8hjJ=p6^Y0 z-vytx^P$gvj!i-x@`<>({e@qe}0SMlTK48kB7En1q_QVP49Yo5)q&-n8b)QPzO{fGdWH5@Ea zSQSN+4=3M7U^aByU71pERn!@m~c6!>`#($|%k0JktF#=w2x*UT}4 zDUN{=!ERPwZlH=e8MA{Eg+yBC8XOZFwHm)Z2)q=8oFEEB0{^XpaF8n$48=gPP!v2A z#2+=?8ayGxn1{ziPOV4~A4?36Ax0uYg7(t;2}8F!Pm@==d$g1byN(I z6d4WP&x2c9M8!n1HUTz?r%XS%ghV?`KUh#AEoL4fV`d)g@!`?aZyZBn;-(+0BEl`F z9{?O@hBglh3z-506H1WFN^=Xa8Z^8l7Xl7PAjRTWkOtsKs6iSQ?VS!H= ze&GVvWKN2SAw`6fB15LS2(sS5OJJ)PV%574LqgeK2(Vs&wN1B&c?JE3xdtcz`~qc= z^^5S)V&t7L@{N2g-wrY9O$d2}%_ASA<^1XAg~+Jyk!L>S8+@UVUchvMKm1cn0tgmq z`w^+Nfi%~x18>5?H!ya<2Q^ibclgM3jSf=p1HM^p^pF~u@~3K$F(<$?1asEpA3x|9 z@asRmn*2NO5LocSW3%{>V+GhI_?v>;Lb!yOXiPXt!jEWM@Wos`{0MQWGXDUi+@VMy zBZ%NH97qcSqz-9=22<>VG-iFV)lK(jy+eN48cf&E2n#4OHXN2|uqDimC&fk*qJQDl zpcr^+808R5;L}tDo`0c2$b6bw;iUlHo+d`*nL9e17!(}s5pEB&6Kd8xT*y06Js14( zAP=^dY;*C1P)M;+v#PjB6k-T*T2flM!lSQ7>cAL6fw3{9mBEq0l)#u^0;qu8Hbk)m zJwLNCTm!$cjR?VkpZ~Y_kB+5;&pIv;;Lomchz^;3q;Lm@$G8QC%xWbZ6dWGz7Mu`c z8*Ss}V9yd-ysYY3jrl@Jl#OQL#1Iyw<}f#J!>R^5=OF~I3yejCC|_JKCFT#!Jy_MV zn+xDWEJ)!b3L9`mnd6(UoPGhiK#rtH7}k6-q$qG0M+dV@DgJOE&VH*E#3SPGw|W79 z;?Q54BOIs%PXta|K+em@kTR3oV7CsFgwaSlxCO-93cg_GILZ7&4L~S0Py|jB3E%|z z$4T;!ljI*K$v;k#f1D)$I7$9-lKkT&`TwSqgsI;w0%{8c`GY?ctkBGX%z(*2g7Cm} zzya4oC@9B(zi6Zcj3eL-`1dVvkOlY;2kAgs!0=$2T8QSvv{rbS0W}mfIVe;T8WR&` ztf?6ptq}+Z#x#OR5t<2sQJUHsTAI+(ZMr0jBNCR$dg?i7 zIYe0mhZ1czQi5GKI=TgI3=1+M$Syans7m zIAdKM+|)-F%tj%sGj_4Go|+3hEt8$vRD68AM*I>D5+y`a+sMdBQ%grvM@JpBP>` zYq|tSlVT}B!B%l#Mmc!0C}Rssa3JukxB;&U3sEyJz2D-dY<+@(GbVVMEF4Hx*V0kf zGH_!BQdQx&sur`U10V$g@Y?)$jY$OJx()xa=`?(e5%a}?L;&kpB8!`;x3#bU?znZt zaPT4;xUz7zRu=l&M*8~dIvU!tI6{!|Iua!!5CDxB5f~Dzxjrg51X-_xgRyO7bWC7m zP_V7#GFbp14I+_X92`st)Y8&fr>>=^vqT+lpbNeX!KMuf>+nYSKwW)z=jbVBG7k)yDuokGb+q)%ES8w->*#A+ z8(LcG>sjgO8(3;vSuC-(HqbINSgHwg3uuUAmYAJ2|NSfgb^sbSM0nN>Q**fnlc#6J zA!KVD7zDdNm&pdfbQnyKovJ4OWh^j0H zU{y^r1igUjy4J~MwY9Ci6=Et1+Sn5#NgN;?6agZ(urBN6?StdF1;RmmATk94KY>Bf zQ4X%waEKcMdM*xDc;WKY2bi0m9x&rlo$5ADI2`N6fB7pK6h#4{Ta*)Mzk~oRC{W%7 z%Hi=bQE)x%#mC^o;4%jsg2GV10zp{sMWkN(G2>5WoYmOpB5a4nf zDDRDng#$rodr;mTM+}Y! z0wXs-5OdFPFKF&>#spH${Q9>q+1mZPB8*$+`}fWW&QRDJGj%gPXX;3&K>QNKY0;@O zb@;;&RG$Pv61_8Z@+X1UVHX6|-DcYl7N!?ALz);IqyYnT`tu(fOt<{k1-AJ#;Q6Kv zF`Okcq=kd2ItYZQVkx+2;EM>xssBpEf4L*uve?$4<`TRvm=X+ZBAf@HG7#7Y=#C^1 zVN(Q0jGSdIvW@T;yRnS`7nyVo3S#*`AK2!`5ITmwh zau{-$aoBOVarkqDaF97Ra_r(r;mF}Q#Zksl$8nkCI>&vE0gl%kA3-*@02+&4gjPoz zqAk#?(LU&PXbO5Onu^XspF&rl8`16PPV@kJ1pS4Rn^TMv$EnU~!fC_l&Kbl>=G@A; zpYsUk8O}P+HqK7YLC!JGpIky*Qe3KB#$2{sUR)tu@m#yPvbYMlYPslK_qm>Oed6Zk z#&Roi8*tljdvmYn-o(A1`xy6G?q=@0+(Xe}o98f38P6r2 zdpu8hCU^ySWq5UXt$BTTBY6{fvv^B*FY?~wea`!hPlQi_&zNsDAAxTJ-$A~7zDB;= zd{6nl@r&{+@-O3e<6qCegFlDAf}hUc&;MRPKtNW&NWfWuD6m~1N1#&Rs=%PY7s0uL zDuNb*euA-rDS}0U&4LdF-wO!|Ef!iK|4O_^5E5 z@IB$tIec>z=9tY{GiT$RtU2fA+@3Qc!Y8s=#6l!cWUI(gkp_`&k&mKcqS~UXMI%J_ zi6& zTbMENx#GIw9^wh&N5wCQ4`9*Q#aLTxIQAg68v6kIb)NJ*vw6Yu_RXu9cW>Tji3JiX zB!VTV5@#juOMIP=n{PEgY<}AO`uUF}IVDvjoh9QXk4w@eM;2ffm@EidKwVJ1pjV1R zN=3>=YLnDysT)!sr58%Cl#Y@1CqHnT_vhK2pvS(!<$??k>%B_>jlxvY2lb4Zqkl!p{ zD&MQXr(mcMs*tVFuJC!W;$qLmdluI(exWF#XsftUu~e~NNl0nA5?Se#QkOEfvY~RA z@-gK*DjX_$DxoSzRc@Vy%xP6`Ud(G{R;h;2J!|02Dt{^h8RO9!~KR=jkt`=jkXz`H~M0% zZyaM>ZT!|m-6YJU#N@?N#ihYZ^Op`SlU)|LEN|I>Db6&&^rY#)@Hg+~?Hr=+;wn4VVwqvUdR&80;W+!OpYInqrVXtCOv2S$Xa9HJ#;n44> z;27yxzZzO?yEj!ad@g=0$Ra2^=rv&lA(QYjcv*0I z@bh)c)}^m|5wa{KBjjc1^3bf%5uye02yuM9&H5ATKZmUjD+-$o_Y6N9!5a|}(GWQ| zGAy!h~mThv|c5QpQedYEu zJNS2m?YNn!m6)FRVW;QL#$D38w(lBBTA5V3TX;8RclREXJty{Z?j`QMwQtG3!~1?x z3Dj%JTFF_--}eXYzji?TK+b{5lyxb$4(cB~p30pXnff4YdD@wD(e#b!Lm3Vkb(y$K zYUYPSYY%l~>1LhC=Fg7J9>}rJp&gb#oO<~Ck`u95IjusyBJV8rY;q-38C&_PDxm5?wOw_~Im2@mH3~JkwPLl@ zI#k_;y0QAu`T?3Z?QX-WhL%Q?#@Z&0rlRwU&L6!Xe&OIn{)@XVPF~u0>0@(L^T_3p z%R?<|Tl!kPTD#hu+iubA=vS{;UukVOYrk}L+12wM#vKjU46oH+*S}tOL+?iIO}(47 zxAbq--8Q&QyJK{x@$S;Q7w;{$%MH z;uktE&cC#NdFPeytEaD{UVj_e{YLan?x@me&D#}kZ;W}3JsqcvPrlp#e*XKS54s;( zK01AT{3+tox6jmx`4eZp7=CI0>iPBgxA^Zo-*bK_|7iSa_p^U80%X(8Tp(HjbOGiC zB2F|K+;HLHwGw_O~DpgzW+m2MP^eAmZjhgD;L~6bD+A z6XF6lh|HY1#R9<%B8*O29*;Ql0?*(QEPhO$k~pqlq3fD{syZmTMbA<(yd8XbY;wZM0t%($Gv zin+-<(sc5w#xR%f4$7H}yWlC~OXPJe60zy73a5gqTX>@H=`k#K&U4EE*Q+GvFV?q` zR3yZ>8@xMxu2o67bLjo9%>0_!OSWda{KS6uY1W$m&5~!|Q9Aa#V!3jYc$~_JdrxVV zC%%I2PyGvzgtW561Iaide}}?3ip7Wh>UHw_>$@yA>x^uUa<#AeEVqM)+=)(kj7)QB z&9AeKP9Sp|vaf&=3I_al48u&sSZp~@%? z4Cgv)Yc6D@*Zb*)?c#Ais*sM2ho&p100Bmv-TSWqW@@Y%pibWTAA!85wAjDOP3VTX z4*!Q`)ehtO)XsH5UboF?SF_5hUL6h~ADdopBLhZjBMgrz1jpZ=1s9|xBMkhIXF&mN z&rTJw2+aK)m_WQZgG4_eUq&C*Vh}#9@&uoE4ifvG@(ge_nT?(-uRoPWg(WkKw1E75 zdmMnR*|SjPfy(1)Aj==80T{*hiIXvOKW!Gb#54KgH*pIv+%~Hc>GB&M{vK?5W-!g- z;JMcRw17YMA^ zx%Z)U%=G2gN|8>(wet79w9e@9$TD0;oMtxY!$#T6g>&a1>;KFyA((Q5Mw&uLnfrNw zHh>Zs6OXj5YN_xMT93R%q(0ycKdWhM#HqYGjtp8pPLC*?jqm}L+2?FAGRWwCHq^sa zvyTykc3710f9DBs0rP)=4vX95*1@&4N!8jlqIxZl2l#ZQ$sP^`JzJcOE`2WV?nwwH zG@frTOzBUnZpl#O<8m7aohujBt|zTsK1cVlrp%nD2ADc zpHU&pL?{B$SVx3&g2@QZm>_&)K=1fO!PG znngSZnPQE(h#3k)*7SEC!QuPhZ{sVkLc{R8a(6>ZpTy^rWA!HDt7{GzBxx*`nKyE9 zC{>~PX4WUZD^@Keai42a;(<;ZcT%f&WYNUdwhITMDo0muUrkAuHv>2a2jWC|zvkV%;qr_*fL%IY_}^?%81+a|mJ zCdQoV=V2yXUmE%bVHRVbSwln;E*%r28S5J0G8t$8ut@6MQz z88gE9<*d_wmfG**u%0NJ_O?%cL{3}74u5zs(k8woUEQFr(JrZPowT)CYo@YjvTv2= zT$mxs+#6jhRA9bg!URY*7%kgpG$)vq(#Zf898LIH3>760c+ZdQF|pq{0-p^yF>Blc z2GU|0;2o6fY#excf(eGG6({M~a~L2lpHI(NjGrq~x&3qqn)vFG=0Zh4E(02Q5e=p%)*p5q1m%4FwJF*Q{ z93%KC;wze&wqUGQNw-xjqos6!Y@^$DcF3keTJ9U}>5jf3`2$^|z52t2y8_o)6=CZW z$@IEy-D!(jbCtz+6ax}wfi;rsDY+luhefs?Ie@%NsTD(?8OdQ77=$DM#L;6@+E;)l ztQ`1&|9n|85Jt7X85PUO2H0cO$Eo!0ck(fbp)cwwoh8Id_hRS*+I9)0Ooa?|@u${7 z6)HZu70gvlb4^ca9g}p}`vc5^rI&jmt75VHZyn*?v5oVm$F+aU2ys)V(@in2`v)WT zJLUKuwIoWYP^;ch`3kLyh;|XS3XfMe6Zm2uE+K~-Ej~O?yr;BMm9+@|JklsVUttmo z9Xb7kSBN&)M%-7WVY|%H>rI1EX7Oo$Dc49&aNnJ=>)yQ&wqv&ECMJe$$RYgwa+SI! z;$a;1Nq~La@D+N708z~qD%}pOk;Q=x==K5Gcla4P_JJ~!0joSCwLN2DITnsu#n`vZc><%{2Jw@x3e5t^WVJZtuozJ7YP)U6u4IEdqP;iP?8qta2uCimV#g~^G zOF8*`iD4fdtObZrU9i&G2-*F+jQl_1@Nd{QB?}o_VRP~gWkO4S3 zip0YYRIw=&KCp2^W0Y>E3pn<$R1DxJL9C{*ZgGvsoRe$^9?V;(sb?jse4k()5u#zu z3wSJoik_vVkmhGmU1yO*GjtA zCW6Ra3jEh;hLrSN+@xUP5YHCGG$hbk(?Hf&L||$~=#K zF*T7F4(?tMzUzk9$D8N+md}%s>luEONl@rmi4A>i(kVT6^*PvvI~8@Ig?K&nOh3VI zRX84K7BniGm}*V~s3+4s$r7g?AflA1n!JLwNgzx8dd|S&n7Lpk<27Mb$poehgvWvP z9Y5O1hD%aFI;kHF2b43#cD2;Abm|Rn6Yr%~0u) zd^83B@U*gP&U81%RmtJhwZymUH)xC>|0%OHN27J2qdXS-!J)j<_eiX3S3qHL>pp{( z-WZ)xVXIczY{njZ#mi2nqbnf7&&fx24`9$(GL!5Y^8v#AxExhzALs&PI~I`0VA3%0 zwS5@fM`W8Y@yI>m>uHER@f9@p^>gxFrtMBEc(f5;VKU>fDRbWz?p3}FX7)xY#1-iU z`iy&AX%{EIMA-GYcr5R0#EA^dk}H59Dpz3WLa{KFSulOeOy5upo#`QlwE>uJnEYEm zO^g2-xomVb)p+e+u_$Y9hyYau=i{$d=uzBZ1i9Ss){&NT{NT14H*wo+K!>w&E)R6eaKCSS88r!c?|C&JCpF^Ln0Z|3NC=;r+{z)cy;JoI7z&*&a;|73AmHSn!nR1~jc zQH^-GB(Q=mXoL1W;s9B+sZD`n`6*So%w@#AYuOat!FU~{(qQr9|Bg)^A8~J=_px}Ruy^s(f5E*Y}A`^BxihWqakQ+pn&pK=?0UVL@#Ys%_< z^LDUQoM|~4M^`q@DXqa72 zEwHBVg#{(-X9NB)STIMuhL6csCaOFIk>gWr4d71q>zx?v(LxnTx(1Z%-Zf>Ez_NIc zpIZf;+L^5ALIZNSZwjX1xRutY3mNQ&dk9ebfNz>*4maOnl$L0l-+<8woO%dBAZ%2= z(;-DE^hmDD1H^Sy&+e!WF449Eid#2qd9gOzQ@R^ADk_0HoVgx0d=5=9_kYREm;UcY zt5dwI=fIj{WA)a{oO*nndn0z7PcN?t>zafFIctJDTIL&{al(W{eX6l5g3Ha)r6cDs7z>-1>X zAI5FIng&0|e$MCckF(G9m8&!yWdp(Vp6xV0TviC)<=k{oDph06(%LFp8{D0b9Y)tu z9Y4M4*qWBiw{o8`HTc*D<*SC)x|gu3*@a3Pk+d_uRNsD>QDA^g0E-l8$*NWOb6AH_ zvZsjk6xK#*rCufD$=IWq-BoshOlKd{K^w7=k=TS$qh|o;#zTp`NM+bm2GXKr@S;-a zD0x-Cd%To$L=0>L#3An80pdHluVT1UJ*JL}>~R(L`91(0Uxw`#Yo;nR`qZJoT+Eq?m)4y^jMBa6G5PtYrPg^1$uim-V$TMpx2z*DG7w-f;YIeU1%Z z{-~J7Tamr$6#m+Zax?nBm z8#HCju`6o93mi`!3U+#ZXIM&B*|ks&_Q{vvVM&ey!q#vK*07RROXoW8RF8EmAbYyx zAV>LYSTulxdaIg8y`PKZE3(~YKsB9!3YgB6-U)o-LtSuMWHq1lbGnP^$7eD9iNIA! z_jJS4iT#X@t_qbWfOw_}Axif(wa(@Rd;|bLbh#)z2h&&ODju${R9IzKbp4#Sh|+3ilg@ z9$y#Kw^O>L+qdNp)JuAQ<%+*p)7f4We*Q$?*MZUi?Q5Gl*88qmuXv~xbMTAx()3^n zN`Gm7m9I?cLmbiMcm(?lMNq4zBUTbJglZL|!{In6Jc5r^xQy*6}rqfB)aw&6-kbXwFg zAZ-x;%5I?DtIqKQb{Q!}sjkWncER0;u|WAi=V~uhIajCb#}#jwcS@Pca;rt@8kT(b zDpTC-Z3u{9T;f#kCxCCCw_r$;xSz06XfCk*R1+D=p;Xur1AM7~vOLiie(tf>N%8yTwuaYr->amy=P4&O03EC3!=a3kTqmnjF7Lmz-_vsSPFy7K z`E4;xa&JM;>5Pp( z&~i81mt;94?maT(uA5SI`B78u(!+P!Z&Q*N9!lIB=+p4xbn$0Hqgv9kYZDPyNghGh z)?VJ~Rh8K&Y_ne|!lZ0Ha2CZH<_iRE%qr{-={y*UxE1hp;8w^cEM|N-S#;R+-p#n=Z zmRrdOHg*B#UxI~3>C!zZXbjNn^|{CvvtneG#5$nrFu>?{@W35eIPIszSI8fOnd}wW zlPTYr+98q~1A;o9o7rU+%!Fm`7ny?Y-++oaMw9rq$*z}1uSp$yi6cWtDN2v!gzBsb z3g92|75?Gb7FfS{371e(Eug;AfV56=%aw80&qZqK<;bSHXN;UUjdsRdLXM$Xa?!(9 z_KHeRHOC#D8~09-1Tzv2C^I^GN@5GW3mUgX4kyV}&v|_{eK7cNcA-l38oyVZ1*Z-j zY?2bU=adr~E)UDMLOoZ0_9On~J~hRhW4mvzS>M4knkO~)rZ+TnBQ4O!&{?-%#Euf5;t}&EUsZTG{l1C3dI_R;?k$dhTa6A#J^MQlvuC+3B zY^P+G-nJKPb)8g-h{DQtB^C7w9)_o4~v*>6X zh@}c8^=_bIr4MLZ5In_Ul^qc_g({7wF}e<9yA__{?y=lz9%=SKjxx_zM9Wf#?IPH3 zW~~CdvtZ-u6~25o9n0d<PsMua>|+`=^0)k_0sDI9E?mNqOI z2~J=Zb^YP(Uj&nAJPHxgheDbX?}oN*QhNP4$X*VZR!1M%1ux7r{o%OK zam8T!Gv~NE5ijb2Cv6|UYWdo~n_rsKORBG)gp}UCZ*F;=e#VK5yA>lkI%Bc@ijY($C~Z@p0~`G(#q!*g?*(D zSKT}`QTYcT{R+a8j#J)ut~?S}I~CeD@5tgr^8;N{RlRLJwIxsIDD>=iu`2SYHy_+A z5j&qlO1V7=gdLfRR@D>C?%fjw7v(U%ZiVfL!VTbBGT4ckCtVK$P6XN?vvP+>D%~ zfb6yx(>;Nr))x+_j+sv}Wup6lptGRUGwE@lxax-x-#}e%78+f*?}OCPm73 z__?31Vz=S!5h*9a!~A8f30`&I#c4zGSGX}L5x8PlGzZu&bbH(~?N$6+maSzR3>xec zs$Z!PZ5O<6P?v0|KmL_5si*+}x8g)^xOm?<{V%^ROM`c9#kR|AxPnv`)Q?!)UdQVAB%4 zrQAK$a|=(^?3TW3wb}9c_?503hl2dP4EZ;Y18^|Tgf(3q={)*zWNFm)hrIKpbLjW` zvq`rs-bwGa=OOa)9>~l@{5>@Fs5GYQ*EKJb!^o&VNHp zFi?uuoDI9VCH9s6a-*zHqx>CxFMkNNtkw{*pV5ccIv;##Z_ICFiu z5f@B;7vm~Wu}aTqTa~|H3JTam=ZW@n8md#N$5a$(TUf?R0EZC3gh!QoGo!Q$UwI_g zTmLi$`<0P&L0Ih=z&?!V^OB6+`$n`q0C@s27YGP7MH$Xu1G49Gp-NLK9Rtk4(-)Q0 z8A-HiCX1w~3~XYCz1^EZ*rg|5Z#qHL&lWjd!QqW_omR_WiyxMK;gGe`Oq2j7894P; zGVb@|k>x@9jU_=0yPJ)M;P+vtt{PUJq2uoPlZ(VBPW2}c$~#gVKcKiAc%KMt@+v3; zjFwNSSvg4Ghuu#dB=n3#>E_(4KQ*= zb@=(FY|TZ*MnN_EE#vqTs;#}fmfanW+aGJlM?CI``Kgp84hV%HO*Uv)n>-JIfF-U2 zQs*fdr_id)%eMl1j*SOrn!s$OC8)F!1U(O|^*QRj>Sss)=IX$QEq-P|JJ_sKquxQr zTNP!!S7@O~Z#pQrbEi^Hi6}E$1zvCfBdI4ZP|vVBTzKMSofR4Qa=~^1n*k{mr{>p= zNjm9?sh}s@n=rr;iR6>;(-!tPJ){e)_Vd<2hdcS(!^R}tACAj{bIMw&FsEBwNa&Wb z>Nvi($_98W@|e1pkf~Sc<|^PA@|8GQ7f%<^S`sceWxj7tQFZXRK=#A~nyjHpdFxH3 zlRZ#*6bAMkL3VjYM=|w2KqKX@fO5jb{cE*>76*ch+A!IG#MT@{rhH)oAPk*9KW>}6 z^9#{{w(j%GPv>s7*e2zD#Zn<2>tc4veZ0f>(EP;RExibK-Q63~xKQ*RdsQs6^p=s4 zlMu{McF@{4VX&l9$Dnuo3qhd#CgBS+h(0xYL1W69y6yR!u5A-c6}DdL=X>0qvXbc4 zbfjv$qe)9Oz2Bu#-#x(3ebas?Z}svvPu^wf+usa=s7~9?#*69zwk+J2B;CK(d&TeL z3!Z%~4|&J2Wv4jy@wRA3j$thj#r}`-O2cXT$n>=P?tl7g4)=R`056kOKxE z6&QR0z5Oo5z>o0W&+D4L7%dVzXr#Gjs1-MmGggA~ufjLxg`)0)wiyW= zKW~#20IM5PVIdIq6j@K>hPo}Qdrz`EP70B7zdZK7E<^j3wgLV5^ z`zGVvmmL%xjb%@F=S3V_HBgvQv`o~tq}TTDi!E39*BcVVAB=Lpc>Q^xP>QEPy(^Y1 zq3wI5K5py_VLOE!c;VU#+aTA5jwbGAHDF%m$zYGVmmbj<2sPT2n$dTj`#>jfY!LXb z4u>8+A}Qr9N_>=c=G^AF-!+GNhIykxsP%j)JoBfF*iu65KD(-u64e~{as<|Unx5Vk zcZ}OEBU|&)m5lw#yGGnkHOIcC63;s^nq4l8JDB_n4ZTG8XS08~C+vFIh5f$4(Cgck zyHy?-xy2)9wX_14`A2w$FFC^gtT)fSyVHNj0Ybc{dp6nUfgU}Tvfs%U&K3a24p5E( z&OLYfIWYiPeWa(4c+segQf&f4Zy=yVqyks>y|83lFK~KtU_~!t9s57P;U!ofui&QT zwRMX77|?;3y8DvqfzO%>cfdN+MGK6pWjCgdcCvyl03061$0bV7kP+P*r^Wt}mj{CG~4mo{N0jSEy)_&IreMjTx;Qe4WtZ6}Md|D~K_ zJMKVw{2#~=ncCxg816LxeitEy&X@Tl>`<#hq&+46r1z>LT6ryx1-uGsJ)*6|4No3% zC|7G+zF>3`DwVa{XVkj{4J?Yo?mzFG`AnB1NHvC&8aFGBwMMimOWkqlxhb>$V7Pw2 z4#yr9PrOo89aB3Pao_B8{wAHvQO!1=@!+mHedDDR>wcpf9is1>AJpC@tWi@DR_0D` zD&^i?cC?70>peiy$>u^~ea4J(>P0 zUY)E|mwZz9OKxg()yiGo4(bu~8guRLVpBy~#w|bV`&D5U{%Z>ATTGSbSV<5YMHrEf z=keUnePHn!HAq!hbX8VMFAtaT+CX?{M6tzm%Ps6nVNw4V=Y<43tSIjBausSN*?9Ua z?w(@yO!YTZ|MHE7FSb>P_y%Sq9kdf`c`D_!|7aEWXP}H13*JOi);3{v4iq^#o;$1X z)!M8jljw>S$YdlwR`PLhR68nhvYv`PR!7fhWK=LuJWr1c+IU8&_NqH79Cer*tnfCA2x$y)6R}7O)n|yWtSP86Xgm0}@WH z_ta2QuTufJZy;LBJhBmRl<%zjRS^SX5_T8=30m-IGlYx>ez8AOCfq7a+-F=qF-0{Q zXJc{9RPuvi#JM(=@m8tj0j_B8G?knx7Ksa`sMOwF`vwAufqOPdET}d0il`*0s23D} z6C~GdRY|)yJYv=w{@tlTw{`7-x=&Z`P(I5s_ASDg*(aws0AB)FsK<2R+?jjqQaWqQ9F;}J&{9I&D~0T(W~ER$~DPw-|Qz4yKiwT?H5`e4Vhi;{aIy<6l_ioQ>$+=n-rpG|&DWIi=eFzLG@te*FC zyiT!IWPZ?|ag3kHUOCaTkwtA21H{a-Uf5$V%??x+jPqhcv+d|#Q}(nX2|GV-mSvUG zuRJ;!lo6+$lPzzGrF*RlU69VWV&0jf=$kZrVblJdNlN!>h1Dcs!NXGr>*+*Z=9IvjZ4Qqz!A^RB|f@0+A{2n*Z0)7=8eEweriOTs$CJWW6+)Cx3-s?e$T|)`>y&hXuZzeX@gWJjuREpahjF z>|5-TqEduik=7x9{@!E$^V{Zbm0K)uLh$5!yRioT)Ei^Vb?N(02QICrO%c%!rLhvN zx5*;i{#AC=T#sI${lV7cD_|><3762=%94I>13)bxS`6H@zoESk)#gzg=`K`-+>PJPU6&&#k7K2xT6!W8A9C{ zS-_zS`_Ag7Zc%|CLd{0}A?AQcKd;i*Ww5C1u22CP3n81mO`>7piJ;#emRcTNZ>R#6 zUBGQy0nTUu113m7&Y1(*=>fZB1E~+?%#MFzK$uKsTw}ksKzzOM(8!#gNP_+BWR*bJ z<^h3w04lJEas(A?G*q++e0;(5WP0OfyNTiQYbkbSgOTp?90b$sZvQ zu|>&;L=xGpw?A(FJYnmbCHTw#UgmSf7ShQcG6EC(^`8jl%YW8i;w!V)ee+8DLk(3q z>6tn;YSJ4AK@zuA_Soy=&BpvP<@%*LB3j)>tKbUBIRBQJQfweK|3Id+Y8 z6VYg-tdhPsiAKxoFj~m#mc zUqXE+6XfM;ob~f{+~@7zR=qq$-PQTNt#6Ryu%N}##X-e zBI85Ai{>MV#1PH$SIZ;aWEO3wof9_``z^_ZZQsnD?&WkE)n4Vfp@66Ka@9}2R1LQ! zG0Lk<`Yu>m2sbEd?Z6%L=`U}2QzdO}o;$xaX$`Hmd@-%sKN&mjexMs`248rgP2lSu zD8m685PLqgS=%mKT(xr1=_J(^70RT&bl~>`sMX1H!JX zlpm1yN4%)=kOW|W&j#mn^+kzOT^cywB$bVy=+!#;2Qp8KFSB;IwV=q@{hFG*5qkGW z)A@4;pQU`$t?13|ddV@mGG%GzLBS1$CtU;6$QVu8j{^j0qVxNf`OSBOR?#K2dUj^S z9SZHUEmb>r{5)UtUBeNMpnRDRr2JvK14m!23?M)HeRs2Y0W5mw#Y*3TVg1w?Q$sUS zdq$G%kEdmsFIpEre}g;PhlrQfGgl4M5AxTkhwY#XrE9yNj-~>f^pv!AV;#n&$E|2* zcdLS=1hfUU;tX9#%zw8^&r537*rKqQmec{&2D<(eQK~u-V+h<{Q6wp6hj$X?>e4`6 z_i6&l(vd&{{JJdxrnh*9Z;V+-73+*^1o3HUm?$``;p7(&M(H^Iu}V?0Lcg_Ay{Kaj z;!%TB7HQJsz**r1tc6^VO*1ipM=q?u>2KhwgOpRJ2%KRV&QE1S9q_=zY0_~j3}((9 zQ;@{KF4bRv#SA4)37WHiaBtO1%!nXX-?^({Ee95HYz}=taJv9LsQ|sRB2nP#ZKrtn z5#Z}7Q0dAW#F6h_T4Q6BaFc2l)AG0@T+XZfjxeL>d8)?QMb-P7yGGm(u8(`Xt3P|B zZfLP|ma>6o?i&7)KDWp?t&*b9mD7;Hv-2} z6M9~t`*u&P-5KCNPk;}EfKG8zmQrD+Uo9r|6^1Y}!1t!&&|^d?qjsd{BLUyywPpGVLB zqv!bR&MnxGW!Cd{$NnMwVe{0M(|IpbV;yH*51&3HSrj_G-NZ|k^Xxj}QnwnKQM88# zZ4MoO^h!T4Bl;?*qDQ?Qr70Xp0@s~}QKkB7=)?&|-9u+;@1t?MQpcQah+x?VX-z!ZP$wE3BaiKgZf_rwcQ*eSz-EyqZLd zfRi*Iz-kXn2}${`a9S0n-X2`TuGQ_sU^|e!D!Q=jF>O097Kg&K!oKazTfeh%U+fVT z0$A~3D+{h{44(Kq9 zEzJSeq#h`T$I`i~RjK9Rl=CCIrN5K0cHyz0b?_L^t-Rz&`+9!hM0K2DmXTcB{Do!@ zOn`jKT>mL{60$M-S^p7aw+@~#&m`oweY2%~#DBQmyZU~r#wFd*-oPDKe#13P^1oBU z8ENxozk|;DEE4F+C(1Q{^v@ymzf)7x?^dO#_Q%fW;ddUi99SQxQuDD7oY`pDLtUy3 zGp!#lkpDnm4C@qEAFx|>O9L59C7F5Zr28i7l*9Jk4BhvA7)iLcjai4g@f=2uv zQ9t)cwPR}q-7k7Ejg)4P6rj5?&?Z#S{k&5R$Xd#%@&r!7>UQzMD)+||u#w%;5e1Uj zMS&)O{5vTiL!%S+#_Z~1bO1JkuO5B?FoYQjh#EA=qb2JB8>xIpt)mhwy{5qd!my`~ zz|gktDgQ;@)A)fa^G}kJ3A*1LGRVK3LiaakS0b6WJWFv3S+){3)Bf%OL0w=BWI$Y6s(?*CHHS@AM1{lwFrpDiZ=53>M@y z*-4E^S=+n7TgmkD3raxK(rAW&+UWm7*q6scxwqjLMF}ltBumM@hlEHak?h-ywZ(8c zc1BrFX^~JvmSm~4*q5=5EF&dhLfcUkMV3*gvg@>HJLh+QpJzz#`~H5vKi>D#v5cAL zxu5%c-`9Oz*DX+$)oS(c0u{60*RHp?V7gxXaRS$f<}RXUq}SiC@!2*^?DT0H~u}*WV-@ka|VU2Oasb1 z-$xMyZ~&RZ494|3k;`29jP}EOTV|TY2?m6}L1V!!oIrG0O!d5RMTFrMZ-?e*XmACC zcNkhxs?hKis79XL@JM0P6?Ek*pbddn23!`2idPyz2+iJlIy$QXU7RoJ$72P)_`j~( zEQ2TkeG>^e<{}II_>Gv7kXwOc#@#~`uU?!=(61O&|C+b@?qZ@1a-M3j0%e_ zkMQOwa*tiUYr452HTtO3ajO8{9RCk&rvqo>tSbe98^<7t(L?IubB^*hvY#&vy5wQk z(ottJqS<;tVB*rd)o$q>9!wZm$~Hd~EXp@-`Q;7%d=qmwel9WCowaK&nO^=eb{aAZ zyS*c?=I`qI_j@n5ChTrM?o{16FJTtux;q0HX7vqrn;I8FGpitiFt$6xQ2-SIE_X9>wH8wW#VwV}s1)GfRZLN6 z9vmn%Xk~4ysfJX1GLLDD$<2W6q876rdYRf;Y6v7ml>EVlgNc{;h#@q4J;vvORrqE5 z55!_3KjS|$YJ$>$DAcucufg$wkeD{~qKN~6JmRVF1V{EybdB9Q^l?Rm?@YX8 zoo<0EAwf}ewcsto_PQ3QeCt5HJ`#Q>{NQpd}>|E$r@=kN;DuVf)Dns?IB$sf(ZKtWBBP_8UW?U2N$y<2xZ5q+EMp zD&xB7Yrq$BWNq3FcY02D`dRA_0NL7UKvR0aD%Yrn6aSVbFw z(%{yO_)AxX+_fK1Y`*Jm;7EPnmM)|fR&}4lbhk_PNjnzzwRkJfcR`EQ+X!QJFE#(} zNQpWc^IcGOvpc2pdsG>E_dCrW9Ta(cvfwYOU$Jm0GHv)ZIvmup)`Xj@J-E6;*C=$O zvE7qFw-%Ynj_*?%nc`B)cT%2UjEzE!(Hu@aQi==Y+$dvXQ;x_0>hn$O# zGv&I%An+8NJJ{{Bkx>JfwSW+!2}0em%ya-!Mu-XLxpv4zVe*FPez<%O32WB`c4lFV(G|-7r-3{j#VD|pMWE;#l>qNPmLro9JwUK!f(kO+P!as0; z1T+XRo@e7~vPR56tJ4V{0T3G6=zRL8_~5>(+w>*D8uw_ff%>j(GJBuP%h|FC?fWkT ztT4SSNFJ44D`bZAr>w%s;Sc;f*pD=G{3uQ@Rx7+TaT;HEtMiuH-`&=`|GazqblZx- z*Udav`1(}c=EVy#_ES4L9(7wehn}(A`ukUR|MTIyF3Q6IbbdhP z+uSpp&@kP7=t8``h_%TN4;i2_19%&3I%w)k!l`W`4~eKd>!a1Ey<_4IN<_FBty z)&uLeKDfUyKLi^gC+0;;QdI~`_85<<_AuX$2N+XBF_54w07L993iSFxEWuGk+311H z1lOtbB$a$)63W{0cX7mmG8IG^L-!i&HW29oDg3DfblchU%aIxon*0)W@Jjy+pMWp_ z{I$x(%5$u3`~^W80PYTIfvrSz_-11KM%-DT6htY&3IINmUMf(;X}wN#r&T>N?nY3s z)+nV8JpcOpQ^Tn%In6T5QWL@$c9l1Mca=LBn8<9*)V)BkQ)!bBaCjx*O=RrB*jIKB zUHKP57#c>ipuAen3ELP z96np{j8gogy3c*_ZNiMX1Z1+^36~H4GZL61<>r?>a$!M`?tQw2Q}z93LMKqV9rqhC z$QAT(VzzQLITGkw3*v1aYoVjg9s|wjCZ_;LHmXp%E8@%pEp-1dK^4tqrclBG*>5@l zfU|7%JTD?kbvpkez@gSgP!Q9x0_ZVlfI@lH;FvUm5u+}>5O~Zm7Sb&qVYBiL7^cB& zNT@Er4D2S{h{XWefaO)sLK_qduAC-9xXRtvg)+u$^rV{3tPr zDA&!UB@}?;^{6<)OCR)&{{eu+{P-mf@dMKT2Ia&vMQEhwMvicx{QwdZfV%LBBdh>C zL{V9b{TsU|J2XAm z)<3*vmTng0Z7}Q(x|FLw5?bhe@AmqbOD2lKoi;S1o&3jphD~+bb}I8q2pCLldhhY| z?A52a#Xn-+{m|TB&yRIXFP>N#ja|uEwZ=-^Fu7IgURFof+E~d^)7%1wv)3*J*xw#q zBl#CaThY-b!_E23>MZFM%_2joQd-?_{2F@qt2*y00{v;<39Sk0d|nRuGE*^dA#Hn& zs?hX#1La%6t$rpCVwN4e-+k#1>%N>uPl-c$9l<-#@x0--6W(L;Lao$(yg}4ov%L4Z``wG`6hunU1^KtNejq;P=>U#A35E zApiL!(3!XC<Zs0@bsJm!KUA z7#%BBjVA}XEWswIP6o-R%Yc$7L~~pSjk_QDB2O$~QXFhjS!D8-dO$!X zrKw{x`KzGi!!y;s%XhzC`9P^4|C{4N_j8REnQb*S=52-ROx{Qh2`bhSD%%W9xOBfx zb`vE9>heD8HK*l@Z8+0xwKFK8&^bUY-)y&CLGLoJc*EyQqwB=nkNLaC1+Ez#KM@n3 zF_Thfr{5O-thm`DDacSmQBpNPrYb$FFXFD{qc?U-9t!V^&NirRbUBz%I7-j0aj6+Q zyl{X!aS3&kuMq9N+IyXS?nAT#hmmB-YVNULe(bwy<_yhUfXQl?yiUB#%WO|~-@5zZ zvjTCM+~Z>Ztl6yTp~K+0s0D$xZZ@(OS76s@oEb>`EtYHjgszJ7`sRT?00Gc(qxoA1#U zLj$s4R(e*O?jmHe$Tvp%P2b&<$w!HmVC(=Mnk~-AlY{v;Rfa-87M^$bBD7wMR0H`H1=umuq*9uZVFcB()*7Y`;&vm5 z;ZLOi1khN?uFtUlBQ?SSP00VR;B%rMH$hHfKRH0NRl!`22AInMCx6d=>lp-cFbHfg z3lWfxa-8!p2ZFuKB0$Sx%kU`)pdhGh1yacwc`yWk;Z6z3OQh27Mvd#K;ct5qRC1IQ z*OSk@4c#9ca9peD#lG@A^xYi-vCKB+6Y-VL_c_)nWE1r-|9O8!cZ`9J%WoCT4B>Tr z6G3U;D~I@FqIxAqle)>aFIAT;tX~<^>z>3)wB~kg^Ej3xHzuttO!qyaS~O$n$kbJg zACyVFko{D;-8=QY{ti9I^shJ|aqoD}hSgc$E(uglQ(pA?C|Af&-l^2RR-AStZXM0+ zsP0(fBZ;<*vAlKt7Ok&qmicbx-F_y4n3(19x2|Y>slBiu%jR=hT-dsGFC+w4^e&xB z(|-GyVS=cacdCwE4Qc&s5o(~mdYz13zK0YWVddB%>rTqFQYnSjLQpQF_{C=&Cm&Nn z5$@}58stXqeMb{cadV!nWII@{jb%;r1!dSU|85SU6wx%DYH6jVR*Dz|1C#tds&Rc{ zjIu8_PuXKbHQLE8Lo_7R96^Hb1R@f_b>9{UO6V8@(_<7+neYxMQo;bD3eh+c!7yp) zNFBpaR2)#rq;eY5VXQ7iR7@c^2mN1@Y(2`bc;k!}5as{H5$X-YYY>-t3 zz+~7OKg(2RfQFIf5RJnfz#Ok2zU?7T1Ct4Od26eoccjGJi=w@Furw4#d_c_W=GZpy z+ElG7FTCw_OnOORtKM^!+VqZ8&#BGwN;_COVLIg-b>CVIs4R3BC1iNTZ`S+V=;k*B z(=tnT$$=kV`Zj;gx6rqsoMb-n3_o?+P==h*yIh3Zc+tJ7YSH56W#N)Hc8l7#H#}2X ztf|j;)LHS#1+G!eqsA*Ei?Gj(m)T|^HUEqs`&~x7Pr~8QVU_qXFRqWeX@At&=~-GX z9Oke{Ap#k^2 zZyT)|N$X97aheOey;>LOx&lImG&ksch&UZ!PYbB?d^F5K@B(MNt8Ve*x-t}l&<|BL zwIlV_=>iKXnvapY5j= z2XyDiu__SSwz-R3vqXfx>mbC#FT+{f9ulI4YjDUjA zDrkHyK|%hH)r+4(<|my0JNZ&eCZks%N}93%+1p()+i&z`cK_*5Y|Np3``mbUqXt+K zIg9CVRoi#Gx)Z8?b(MeaZDpV1iupU4f5f~UgX!SU$LHMWflA3w?Y!G~<-LX9DTF3D z@YylXA4nEYN!^}JQ_xf+*244tU$jU&f4kPmjV4=#y23pp4>CM&(e^BQ$Q|pJlA_R) z`_E=!2fAsW3oJOk$ec%Rz7E5B`B5gwPr?cs3L@C4rx*GAoSMX@)i5-5MXnHG7P#y` z6nHhITt6ox=jE~&L>(7jU%yUkYeHt(=5^1BO|Bayl3hwu+Kz@tn~t6kF0n7At(BlS zb;p%U>3_I;;r@~>sXSRBVN*L!I8vy&;nalJs#k;-#cZrwBQGb%DiGD`V{5FXGrx$R z3A(=Ph()EE(w>q+b)E^q6|eW}7kMRKFX%jV{gGb&^VLh|9=lpv?&0pw^!F&VWN(Cg zAQzJE6d5qqZ`QaFyz5wc&A$tjC+=9TEmA26^ zJSeS=TqbbX-Sf46ClO|lUPF!o)8r}TisF9VdMJ166~3 zcB25fgEgaJCE{B3(3zR!mss1ufgo!vLm_MJshb~$l(Mq_0XF|iQv&fS1`{HP8xLA| z)j&`ZB7zBf3Fnx=crX$SqYO4!)1b_aN&3rl0T~BRqanl&t+)tz9`s|>9WQKZ|hffa&e^DQs{-JOtd3=pp);E>K#}2W|M|xz0vkAyi5eR z-0mfh(qk7k5T!zJc8$4XKu`Xqy%{SUDTrG>pZ^e~#e&^iJYg3Zk6~7{hh}Sjx|jrDGXC!|H!Z`_PCUJ!ieP; zwYwB{d!=Ae$!v|`%Cb8e^zVYut$#@VH8^tS2|2BCCgnu+fv?Fu;$f8H)#Rc>nfuB; zhN3HlG(2ioY^sXU9?=ZAr^yzkRd!wJKmG3l!g2aS0s9u&c7p_m3r1PRnNcSU#k>DQ zC6g28S8ID7Ttg$9V2Ycjw=?bBGPH5fzSrnH(>ArBl9Q=OsGWy78i84FinAGWUVfp84p}_bf{_| zfA43&?^V^Y09Zy9u|M%dXMqjP(EbUk7BY7}in(X~5@zVww3_)DRkIj3lx*|WfPfrg z2P`f=Ese=nwuJx2B(DJCpojyvBN+9%S%JK!Mz|ijdN|F2EQpE81QL|M6LmK@k?X9zoylrc7y-K_w<>^6N-ehlV&a|RiTM34iVETf1fSg+{RRvql){rR_Ioq zuDmO~?UwyNHro=M#;xT@-4Uf-z?Fl)i(LqZ6c?X+IlVIC-^Eh|)a{-g%Us-g|D)8D z7W#=~U&Xuo`=vj6MnM?wxbOG4Fga|8-i*8ds#}-+LuBc}Mzz$Qp}g~p>Iy#9Ccjj5 zJTRe27=6S2AO40t#ruk19Bv=EHq%|sY!c7hn6o?d>cO|SdA_NBeQ(?jQ(M-;Hm3g| z6jiCyqtPJotBu4%t8}FsRKUbQuF}9}J|m+tq&6NSUGt4Z64h!8m||#!i4;F@-mo_V z>9XDr5T1-JfuZLBpW9*$qaqp_#RHfS49WvlS|`RI?jh|bexbm)7RX)fRE#883&6Qu zKQx|i(JTe#SU3rI3*vXdAF|Vcn=gj>X4Sy#7ikudm>n#yE#MlWmLVxrBn#?N>4sFovY_s z@j3Z$MPzBsyUzHp=ck93~ZOJZj-}g$x`^{^MLQcv3@$?9{{Rek7tKBx9b-ZMB z5zg=_S@J0EFfZ&iep(#CgFt25JvMbe`Yf6Sw8Kdc=y~ri=aP*kwC`B{zAo6FUaNfe zh7CmYDZfka*lF!BOWQLR5;pvVac|C(_TTLGuzj8s5rqsXK>l-i#Kn@Kwki|arLr}3X z$VF~YJU>&auFPJGC+JaKdPd86IGQq_GqKz}40o}__ zP!GxnEHQxNE@trzzgdg@F!~16cN~lcMk6)GJUtNg_zQ|-?8}6`plwMq(wuAI75u<2YzW&2+(u_XO zsH;nzcD@U1h&pWjN#sZCD$&ZO&(^_$+zg}BydIqdhHu7$jhY{_dR0Oh+G`|ov%QEv zYQJh$jvi3xTzfO)PyKB^9iGjM6W1!WuWfjKD}kpV8UCmM~6;}u=>z?}%V@N^P>=r%!>*GONIFKmfL zr1yUH{B%m}esHurkq^;Yl>qz~mhwO04BsS{)}RkCr_n&=Ndfpj2&~-81iF-;!yzc# zXo_$<9XD8@p{pw)cHsaqkf5rMTpMb%fgN;?3JGb3K?PAYI~6GK)fnX!+R4R%eCWsx z*^c~$i$HUL`!`_y06MKvZ3b3>C;(@J4Za60Fj#`!o`vc9K4Ra778J{w=!Ze-gRm4w zdxGm+m4;C=`ysotR0}6*%TB}hRdME(3nJeE9uK@L)FQEb0api7)1DS6UEwMKP7v!z zP?Z3@9vcNEH()3x7LbIj@@pS+3cr~%zrd8?wXt0L=8{;88(&)-Jf_Q@bB$Iu(R8>I z#z->H+=nHT4!Pg{6HZTFpOCZN1-?pGuK9l$KjW5Mx2THiZWLGutK=_fu`L#CRt~Y# z_D9&Pn<)qnF0ChPDimEKuu?zR{#egnN@1Yo4<8>u~?St@(k8v{3Ph(u4s7DN4$ zhFb2eR8+1NvsucwD@Rp4{sN_}$JHHauQGFot-J1UDgN1hyKE;YUevO*+n5RPQVs=m z34NqL+rn6t8lX~i*(Lr;-1l+B*6{4@0w>E_!FSZ3Vl=a z(=PfJ%vTL5Arf1iS3OQMux)`gNTB4IQg$Mtei*xhbXQ=*sDkRm3=U|bmna*r93i&? z>+%xVMU*K7atXixR)Ga8`Nk0WD}*emM8i{*o4Ci#rh5ZFM(qQrsC0qEwAq-=V>sMdWSl_y$CAddFRTjG>p+0=M@QVqAHk#FbGD>grZFzC&2bg&I3LYv$;;h}0W_ zLKHZ=7_DJ8C?Nx)_g?7z3-AKFEPitCP;@5Dz@aWM&B3HmYyqRN8>98tI5y9VRdChm z$!Y;E+EZX{D8>nA0ILX!2HZG%eq>Qi!L0 zc-GRwJEM);A*P$e7-n%2{M#iD83YHklb`u2L#-tY|}4l2%ms z#Q47p>H=-Ih?NNsdZ-;y(aBBFS#k9Svvb38X4V9`#RM3VJ%^f}uT{>a%e*dlVOeRs zn(lJ_*cz_Uzs(-XiHQFWPb_-T-5(1T$nG6u!G@3SsKp&B^2y)W8)5cZ!d@KlclL!8 zELEEJ>lg8Fi!u8v^=9B2Hak}4b(9y~-^|y&Wv%&Oki7$AskBK=)k~c(gZYUIjX#=S zN@*fyZ57M(&R~g5*rpvmp5I^c=KO8?Le-7!M+8m33vPs@QYc{8+Z}iDM;;=9(Hy*` zX-3Op_vXmGS$RZrN$x6)J9?A${1}fK%rQWK_?;i(5sq}Mfkx0YVs42qoTS0P;!HjP zk_OC{E6~yu7*G?Pfb)CPu|a{Vn^orejdBqIHPG@PDizV4po_5xT|%IH`0vgcQDs6&GII3=O~>c8hGi5bS|y6=)`Xq6nPjq6jYi8R*c* znh_XW$frSwBLBe_d%vHFlA|u{x;D2?rF1Kfz zybLq$!6j2x;PY*66oDk&wPwgAC`<^GnUzL?x&i1zFc|{vInI#PX@#i{6M+N(0l?Xm z4Rg!A8AW?&gul)l*m1UleNV2|v>@`D4-8ma<=)&SCq9`xwd--xcloTTwxq}D5)(ot zsE=;_C?;GRJhCnH$c*QmP~G=bKBE`4YdXHgt6qO~4{W{0NG9wNeNsv6D}69w=2qK% z{2gN-qxMf(t6hgfP!mN z_a)*fQo;|p8@E%tiSd!IGTwGhbXQk6Psn`B!dN6oFFWP_FeRyp})=Pn9FKRoYKTyBc3^%ZGJj2@!_&7R;;<)<&JH zT2&6`*YU0db8QGeC(<=RY`o#ZgLl|aL%^V}>g-gm_Ck>&NTg}peBPl77!m~EcuW+r z6OMGVs~1+2Csc_YopwR95tsarO^EbQiuFL0*KT4!6~-@QiUVY*)yij-?v6?5;N-*z zuZTN?@O3a$0ppW~42E}X1mZ!!p$lD-OCUak9w5NsPNzlDR0HO6EGXtC>fyw9<;rH# zcfreGhXU3cqYPmN|F>^e@hAe}jY}!9D5o)3X`p|&^1;9ZrUV=z_FF2s9qg#nx(UK< zz}}o=Pe;Tk5W&Pr|R(2rBqx+H~8a5k2B>XFBTx^O_?R1(X2>S@M%C zW!W0-c`-rFi0a7ezT+_%^~Kv$>b7QJ_s=$q5K#Wxk|(;cNP*Df@A z>C>)tV3TEHf~a4NsCH^p%SpZXl=JuYCz*>fCp2qG>rF0QB%RzSeMqFl_@Zf6jHMN2 z^3##4gPIYU?@T=inX+eZY*=yP`{%aanBY}0b)D?^HQBOj!am*Y^+>v$@J{RREfael z?ryJRoaI|GuHF5kZ}|0(VA?4+<-u4;jEQ z0+f6Mi5_8R-tO77#WzLp5f3|)9&FPuEj6^#9J&?dXw`+ZqQ335OIZzxe$FOtveFmj zBJXKi{>js+s`)+Yt=aLX+nS|};?mdIWMT`xuzc>UrKm?Z7AtIDX`o{IQzPHkbNTiL?n^d4Qe9$z$YXz^3hyzT%H? zcS{|>B_Sf9v?W(eVonv{N@jdh!*VlLr_!qQx&dm6Nq}AqSdcq3jEYT^z&R5ixS-*U z5qd3JiBznx6__a^`0&_F@t|*<@R@NM$OO%X;)GAL&hXZcvhH5kZbhKrA98(j5SGTDI?dmMZ7`rx|TWHXX<}5}qSeuL7;d zybi0Mlt9A_K&*mSd90hgFV*a|0mIP$ygGOTkv3eiFzMfD9nj<7mazB3M(^w8+n3)L z01xHgyVSO&i&>v0{8f8yd5wag@Q&^8Evk-OsnB^CEPMCiT6%TZ@1C`L3nF%?(_X6A zMEVbdZOQE|ac32&VkFi{XL{e1A>WUDyxkYmPJ7;a)cx}}>9SR?9=WaGVneVw)W(!; z;UO3ZDz*M*B$jHBVA&Jpp5%RfO)2Z}*#yuHGP2_upI}cu*dOwgZF^$f20dEyhn%si znS2q8HDz1d6tdMfVV7Si7Kk6`3&ulrYj!|T9`eed`d;iWSUXQV0<42j{C#kIwanZgN>!DK`k4BSa zJT@N_aZS(?uZ!;Hk*EyiRDi{gOB+!q zRj8KQ%xlm*p~b!+Ios(Ut!(l`1Ec4hL4spA-UY$U3Pgjq7=T^{S~%-vU}yNdS#44f z5wp*R=1QNF93x>|-2&Dtpcv-2VQX;gK{@Yu*8COaPWXxAzd)6oJhsLu*W~KK zQF-BS=3f~qnkKZ3QXO!U#TBbDy0AujMSHoT%gc12Ef*Ct#4}2*}PnBt|z`FMZ z_Q75O5Hf*jA1+4;6UpqIyRd!pPN)1`zDFdUJhc>Kw%M0v^4l7yZvy9BxHc)HzIJEFOiVX3`L3KB5Zcgr z=JyP_qd~f77h2e3xn@rg9a@}1=dY=$ye)c281=@LP^q|=S1{(3XXd#Ll(wluh-QsRfv8d@lrsw`X*Y-GpbU}mR+2o4O) zdBY?@yM%R38JP3||UD1PCsaQyJg_7c3fXdu^i&rjRFDb!r4p1WZQ`-l1F#72bYG$a z&=6n|Mp;kgPyPb#hlb0Ak(Ue%!+`{XxvKU8GLKZCUbP&?Ml8779tQ2$ipRuWK4iWY zYhg1C+A^9q%s=5h!u2eECIQ{tVhso>xXgPdX}Mw3Uk}zs4glDAplO@&rSYA|JZ1(} z*9<=e_|6LZEIUSaKYIS779bwcb4Ff$2ka+P)S5gz|Ec43<6s(4zn(55hOIDOZej1O zI-XVQQ{H1>P`SOX;;K;S>Qb){+xCAHNvd1lvWBl>|C%t~tTw$T`1T!GM^}umqkDOF zPw%GO=;cz4NUbzUW{OJCs$DRFi86N8U8L&WfyWO}VAVzc z0X|o;L8EZ=^usw4O^#-1*K>)=MFC4;fKcAZ!uwm8wuif$!-TgNd{&;_qT(qCeD!%0 zgWkb`DzFwj7NMU-R&*=T8Y4eIW=6rGxM)Dw98Cy;^Ik}G1zrjK5zN~GWBjo}X2tQN zTRVfj1t7Q}x;|(;Tg%W^EKWp>!0#c0>RD8!d=~PP__68;o8 zAY8>4u~@DPTX8Yzv`*X+EJn9f_aeIttV&=MhtXfba+$3z^(@(P3IY}>3?eF|E|wl1 z0vAcRG|4WMw8nfi4o5@Ga#$w-YISIZT>Jo?2RSQT!A6*mD!MEL`52EXfP;7F$d+~X zSu`!TPy~yMQ}v{{-%^_WfQ)=tvgEH1@{Z$srqaILWoaHyGkl5%no(Xmnx;2jxM?% z6xsc*P4CODQ%}lxRPFg-?hB&@QS@YRJ_ecqqu8xViPq{F0EHWVenA>u&F2q%J(+k# z0dW06rx&Vo7KajD%`)vKq=~hnpTKe>web^9>jMJSG!R^XJmAI0z68>dYUUb!zSTU_ zfX_u}xOf3Bj61}FCmp!p<>|4p&}m~M|4k+uF7rF?Hoi6-1=Qez&%^`pyw7$ z1sn<6X7M&0LO!cpgPv$C;vlV{WCV;DYOognCXy?cc% zPf(4HYM`L8)QJ>8p9sy2q?mcv^oK}2D;{g1RveBJJmEz59V=0}_0IOx#>ng>&zEts z6_=jXk|(s$Q24<~+N_Au>DG(G2XB0Po$!LEDJOgsCb)Qe{BIZ{BH_3a4{7O5FB@{n3@fBSOej7)5QdA>Htu zb=#q%|6BpOR?xksD_1oVY;ITfq&Z8w>$mCRPbVCEfm~IV>OjXt#R^u0jgg8S0Tzg* z(3k2uZ$MdulX;k=Mt*yLcJ$e28I^*th7^-u1V%%b21h-#*M_uSC=37Q6s*1%jkqzCyk`IkUg zF={PHPr8_51JG^sn>_m#xkA8g`p&ty%$dN=zY6 z2<3%P+bwsUZez;845O#my0k5~#A96G5!Bnf4h>JuA6yH6m3cvQ>5s5{!|tDGQxDw% zs7d5G%%1bnstwVt-_^@kS_V$i$ovbH@Ze~z9Idv1pVX7(Ee~ctC={TOwi`lyhA0H} zo@vY<46hg?A!EEWQL3p%Sr-QK;wqPx!O$IRVDLw^xI4lQ97RCuQ)&=Yxr|EcGex%$ z5zByqgiOoT5Cs?GdUM_w?4qf+hq?l1<3fef@lNjipRUI&LX~ip1O7hYT!F#)2+ZgsQ47ygysC;F9RWcD6<2sXk8f(ac+rXQM8uVEJdJ1MiI7lQrX86-TW zmFk0|BI*%DC~bOZ&4e(jc!M_KvpTpyd=pFnLmGt103gf28gAeN;sr4l=@@`w1q^Hw z;QV&C?6#fplwb*(ZgxsE7T9WSGGtBhqN-k49J3n@EKvn*R?Qqa{SVIt$-nj+taxGn z`1ux-RlVo^y=#n{=M4rqAG!E!%Tm2*_xD>xz^-4WTe#BoYFx;4`({Q)ijCX-0ADft z-WtL^DYwU?rMJhgZ5E|IT2Q%%@;hPs>gl@|_$6guRh_lBYn6EwY+0i6K>E^;>ofdk z)Yk6qzaxPM=Cz>N1PEb_^9Efk)pNDg*Uy!ZE(`b})rbcADK0a)%S4wf(xntjaP*yy z7}F?W23%6L^D~M9m<+G0{Pvddzya|F3b_}E{crG-Q0VL@HO>qf>p}@=DTrPK{81_G zXc6N|3m9ZzWc|yaJ*C?9tB^A>5jSWLv1beNHmwFc1zhwq?I7Vr{QN2`3EjkUX-uDo z05Lm0aH<&eqD9yp0z@B(jOJiAgQnl;xB|#NAC=4f3ee`<0W%tAB0uOO0*OKL;FsBr zD_cZ8U|T+aLmL9tZL}+j~R+ zfeYPe1Y&q?NI+1?uV)QbhAPE2BzB#M?4_R49@es34<2%FDwnC6Z0?f2xO;Ly(x|Nc zbb{%afFPh}HaE^6%eyW(9I?KBWswXy@ZEz_7=lNzPW`(;YV;-cx4Z)9VR~bve4D0I z4(_go=J`ASDh|)o?$=C;)w4)_9?`Ii;ZUKNXyPMk4LqA)Cc=5TDr<9(3SI^bb!>moA2!l;|SQTSdBjgWjyuBUlFKvXrm0!Gtw~{QW&6$kb{WeqjHF~o>2kS$+B6y zf_R&5h}?n*pj!a^&;*w(62{ajV7O#6k&#vARGANkiBO=Si~Llbej*>y_drk)SqPU5 zYkM9O2~8!(*xSrZthrM{ZMB8W^<9tLr?%OqQ%rU;Q!bp@$)a@pxZrYyCw6hQc=}^u zdW&84mqBmYn>L;0o0NfJF4;-g?-8tD^uyVs_OCWdfR|VcY+NB=;0E?Al}c35V-sda zyzt25b+ls*f1jm^D_*q?L0#V+tQ~|{t zYD)(x5a{WG8K@^#s^YhUNq%k^a8lClj8Vbnwp6tg?4;0`xde^|KLsc;8bmOkQpE8B z*bJ<;ivopJwG{>IVBCtlY5|4COHR}@yY-6{0=|+udkgW8)a_@32==IJ*#iZ}f0MZ| z>oTly^_x$;X@tQxi`LJCoqM2fM_U__dKsN6Bd`w`%3-i_jzokvaJ2$U`$k=m6~p{u z5O(Vgk_wJifYKjCuFcCN2di1a{R&=JbA%mU>t4fdKe}dorNf^ou)<9j;32VyS-=zC zC7P0VK@(FdWT6-|0HBmzDOqWy|g<10+85Vga=c3?r_Bl5K`I9oh zovOMHp;{S9(D0u{<*}|^RY)NY!9MlHa*9jd;UQRS4!%)-&e~wgKMK>NF%5GMc;hYx zpfS=QgEA5$>-lLbTOr6Ri(@o(*-9mSF*jbP8Nri`?K*sc^`SzT*5+3`S!D1cF>MZA z0qP;=-ad5`vfKE%DlmcND#ygAcO1Vr>Jc9b{c~OqDyS8D_%{Y1$S7QZ#)X? z!xlnQ1dlTKgN)MZtY(V93}bCZUY-b;W&tgs2}6^!Bs7fbR?<50@*vV>1V19H&VB;; z+H%?zcwjQ@dl2PW&^mDB27xQo^Sfb}LB3MQrcoO7DV%p-MTJG5l)@v-A5OH-BkD12 zqKYeuFMeL5v%lT1Z0q$U$6tu8y8@)sqK-PER=01WZDRusR3W2BtDJwI7S_}vG7kz)hi9PrJScwo}wG6bw4^a#WM@XL!x zNipdds~BP(@H;Hw7YhQ117_w;sTq}SN?V;6pkVR#-t>h61Y2Mt8$fZecxyNv)ZU7) zlp9uTm6ADT_b#y4?C}uC0P;0FxsXw2;HLdA*7js&TPbyDVTElI zOpS1nTrZ&)o6nMib)D^o8o(KebCs1k2=G+8U|j+t3d}}qw4MIU(KTlz#HcVH+3ZAm zGI4Zi_|?kZqq=EpJlr{tvyEO=#Q2xvie)Qaxog=Skss2#@>0|IVMfJOPl+RQkw5R6 zpo{4X0Kx2i$NpL=80nM|QIh`U%X9@_uvUWd{wJA-4l_H&24TadY5;msl7{*g^e_O# zEsO?;H^Y$-oskz*$P#=FMh`Ox%LdG0f{K}hN-?tnR4%ey7qQXiVw?$H8-p!FK;CUt zuu}xRIieq>G|CDV&ag`%S(Yh*2m!rx*-5e<>dRNr7|5_J!99 z!q%|kCk*@-l<+`i?5}4d59e8V9_kh_A|ntoxImw`448~nVE`vmQv1NqBtQd8)m+HS zVhYc4zTrc-rZHauG)O5vR6`D`4MPE!VVXabZ!B^b5YO^ZpFHo{yXf-`naALhQR0pP z*RRw5pJIk#$m(EcdDrq!PnV-Tb*H&Mb$k2>UZmHTG^B77sy2r*`>yEj9`+-iIFb0r zkyFwtp?S$sHiCxF<{hb|oL{Oo{HFd_?#}7-gNI{|ONhl^nNkHe++;XPs|2h7MixZZ z6&`mO{V$X2S__a3sF+;AKB*O2;UyrlTWAPP4u^UL4sCnDdldu)=p-jywh}fkidzkq zk=VE%HQ5ZHF>`~L=MZv}F9W6>@a3G8vhByj^)NiIad_3*3xEP(&5s^}iD^65#&B{!mq5v*x4W8S-Lu$wMy*^b|0d zgJQ`{9~30WkIt+E=60U&pW*L?Ds?PC zKk}I6!UHy$b6FbqtMKZs!7ilT%?;YsM63y z0G-Vbs9&B|Je~a4vrRWGgQ2q^e5!d*J!pD!wHBfS20g>G=oL09EmNvI-_%|K_OB@x zB;@nUfNB%Dfc!HIEd+N!UFjEC}m?_y+C3Zf|_%iIBXAI4kAN>H8U` z1V{G(U&$!!ty>A*YA+G^U^8HG76;&OxVtGB!h-S<*zs22R|YPQpxM$!6h&WHXQ#C| z6h#f>ZHN>^oPzZaK-#fFrW6&*-9$gI0fq*O^Twc4MsEZxnr9U{|7}MF^_h?xJpP#Q z5W6<$W^-oo;IZb)9YMMYhM{2C0<+31C`ABSi6(BT;o^b@sv`A#Fn)qIpb8}DPQ|FW z2CpRG`@@qornmya1eoX0(vTgBSWyoWi_x2eqPYWrP}}F z)O07;f5W-+zaFOe<2iR46x%QKTAF_1M3?q8m=u zEZZNvpvF~k@SB2#STfGMGMhxiDT>FS zkMN>_4!S})9J_;X9k3o8(?oZpNns;Ywy4D5&~HHZAjk!zZm?_oz|wkgF&@|_0*-u4 zeh3gPlOAk3^l}LpiL|jVx=zx{%Mi>p0t;=>`Vp9J1NjxJozYfRHz%}uBAA9r^DdtS zOISAknSs3O1`Rt@T7wJw*fE%L6(w;DRGGo*b7>zq?2)2N|4r#_Iemx-HljMrUM(O# zVz%oQ&_mmxx*Iz}f{UR#VtAF^K*u|d_FHiNF6RCQF6Lw=1~zc+JXQ_4Vz-In z6(I+$rUxx+z4L0a&wba7P@VDgZb{R7mC#m&F6fw2WZiAkM51`c(H`%%1WlWPyx*oo zystO$F-D3*LkjLMR@Xg}ob1L@FJAe+@d;%|4UZt_qz071(29dTrA3x0A@voi5#Xr; zf}mxjg$>$PlmZt2h}pe9rxOG7faWAIZR*7Z+!+%kHWh|7U5hJ~36@$zC-1!e3J>WAx+jJ(3 z1%U;d39SM2`m@pFUPSBM6#=ElQAH32U@~}YktQ3l9e%?$Z{3AS0Dy=U%u>h?aF^kn z0KRxO)ztqm1yD@@eM@1CkqToDXiq^kcry?k2c$CWly{N36$GoiL5=kdd^3=;w&W)) z0+b{#M=&{^9mC;)>-AsV*MH`HlEA^xw5Hfl14e#ZW4pqYk==i`gifuI*H&NH;c6b_ zEmB52f9emqdA{4uo2Lsu-SOkGadPY|qP(N)!sxr*i7h@$hGlt%Uk@y1tl_slXL-=)Q~903BjYItrPbE^ zq;>zv^Ke>@&qHN@e#fJfa+ytS%yVb>m=#8QAHLmTIua@p(_?ba`S$~#6SsTi6t%B< zZ56RzQ%^;!K&~9N9PSg(l6(ADVtAYTxth0s@m^e<%=S@NIyR;{_(Dozhf~eA6`$`| z2H)k=*kpQXoJ-w)cZ;p9+b*4+O`sXywaLv%|L0gi6%q&P6uWu}oxcWPL5#|!Jbl=U zL?tJ{`Gh0@L{6bze3z939RSc<(LKGy2JMINnJL&UfUU8t##z^RT?qvvPGB{AEpn|c zrU%fW+4zZ+cE@6AV5NnvKmTm>{ihMq#0o_C3rMTIRod-%z^8aIdtL7Q<22fb=D(z=|2;baKP4@E>dWj_Gy9 zFQ%(&XADv=(}XSgtoYg%id%`#}3XNFw0S^r>OQl!shHuD?*@;?_>tZ5Q- z)sOQa+bQXMhHuig-Oan<*i7eA%7h8)2!B1d(PVOdRD5*M(|2)u)Sv*zFS`pc z#$YU14SS^hob7!O!2t=mpjw0Y1^W>wQ@l|(f~XL1dto(B)x=STXFp0&5)4lWo))k& zg7qeXSc@YETt=9Yfn+%pw6l2K0h51xrwZaCVwQ0wP_S}tJs88j#na>QIdsHTDhd-? zp@Auchu9&Gxj78xEfgCR1>qRLvD3hG%>MynWgw_FW`-VN?MHqFdDk%*7y$hu_!bzX zuw4j3mTQe*N)i~YT}yNmW3U$KxY<1Q0c&?aj{p`bTY&K0;wBwdlK){?I*UN;d1xbF z$%1ZSbHw1Bm+-5A{x;s-J0GIM&$fMPk9Cg^I@^I9@?-bqhR3T`Ca$pfr-(TC zvDBJ(VvC?jU%*C*++n%gsA#1K>T@F3^%2cLgXg7s8_tZMt(@jn$RUWCeiAP@*8Ke| zzkqyK#K~{2);llAY{?5KXnuW`kvZw!4&GhBZ_7#u8I~+$WqR(Cx$?&J&`j2r*w~2F zy5tATwd$f2*-saRZkCsk8a}s%WNdLz;hHz>(G0rU=D)0cTxI6;OW;{obaos3{9;`Ja zb1b1?)`m@JXVVxJW-w4flDnYm1LE1watxo?!3cN`9cq9;YA)3vx1oveY)tW7)&R*N zcr?S-nI2^R$zj5A4g|ESCSL(xhu5=D+%`aYhz9$=2P|-%_DkTQAwd?9@5tvJ%M<|t zJDslrMlE-yS%QU)F_DNv0%w1=I&={gN=*tum2UO?$khA{_q=W#>|z!HD*7Kq0`31> zB@{2Si_3J2CH-)g960^hyrkgk&3kVOjNUi7U1&XR=S}sQ+V;%<*l!WRYBC3w=bOfv zznzHY`Lj>lyDaMQz9dzFb*dp;lR z`gZ~UqAJh!mdGxxC#UW&nK_ckFIgw@zMrKQ^Lu1n7VONEll3rjC+oV_ar|o22T6ov_#l=b;z7b$) z+DSQlbs??wmZ56%E$?qt&v%{q$0NGpUhJ*CB0IN#rubMV@YI=sF=?k1GiSlB2IWIh zm&|L^ud$C-^hN|HrS`o`ah=#IJH4(`HozhHy?`6tWfu2A-TNI_QCX<@MVX!sD^9=;ua<}}q}VG0 zo6^uO9o%@M6DEEK6a&w&{4pxS>~dn@_J)aM{qBe8QFD!tIEi6K0msDIaR0B3cDR)| zH!3>j@$NFomubjNp2ErjDoz!Wb?^OtzrX)3kNfl)=e*zNea>reTN|uO7$%ON zvQ8@4lr)k# zq6@85lfaF`G;)|G2SgmI-iM{qkp-FVaWcfDoVoaEnEdnbkqou*rWa9899r?YVau`CNy-Wqpn1ur3L-!IkrmosS8U@AF2yF{&^I zOI+%X&l3CEI;c^J-P((iMB!#A_>kQN?xH^|XOzw=5ce3W>p5M)b<&lfdP z*P7KcxDBs&NrHhf$NEsM`Qkv3kRHb#_EFlICbNP~skqokTibFxcncA6TGaCOz+ysH zB(5R`oWzb_fAzfdM>n*w4knyUHJbh)8l3#EMBZ+ExLN1`u-4@)LjwtSttB z!HtNv9`drF)dIp{+sNR*0fV8SSO=~IqVTfYyNmBb&hx+O%z>3{B7>j=cI-O86XD|t zp#K9p=`aRITo3kGL2w=cCnc0RG7dt6vxmOsQGklIV6awVUB1G$y-bWKO;CfgAdxkJ z!#~{0w;JpqxX!;d6AoXzk0~dKnCHM>0clKviU z|1W|0bEiPg!h{7!D=${3TQvwpE_h#0H-9!*i_fU6o8mPG&P*u>UQXc_jIBAi*Mc#N zp|JIWp_a14$bQwW2f3z~GciO~8fO%qh={Cnjg4`1bsl?7DOnumRx8LGkGbj3nnJks z1(SQ$u8ZSNA4lT`IKR6$OL-Thsp8%2JkL|G-a4*WY&6=&)h013t!xo5QQH=j>Ub{U zwb3!M56G!35e`h-REh<|65n`r$?I`?`%4v3?4ViYr1H)DVQ)lrJE`;YSmwgZ$`9~x zhS)($RKq}@oz12h5$-?lVS5>ET1j)P-*`!qi#ddS^ZA|k42u|7Q~?^4JP9gYd?9RA-0p>d4Jt#36hBXPtvr21%%h>g zNM2JHQ}zYymI`3d1coYz+`CZ|wqc1~a?O|-{y#;sVX^h~5^JFw?3uM~e1pOdy=PKL zefHq`a=WuPy6a}!IB4EtuT6tOg|;_aw2(VytgKM%l~IMOTmJZ*(5&1DfdMqIQTh}mddKqW?Gxgre5;u;yqT0;y8Ql_ z(Imrlb1HL73p7W^H)=u~X_>Bam0D62XPH_-7Rn-GH+;djhSI7s$jG zDjtXw((+kHO#G;k8~vWXP`EjLMP-jX)bH)apr2E~+2{6VGV#!~(3q=N(&bD=-&dUY z!;6vQ$+^DrsxH#_(|R(Gsi%aD_&;$eNtn`v-pmf4?;m;_n#Evqh^gYoH>C2_2?=RG!F()?2f)P z2y7jY{I@BqpdKklkWR2*D^r!|Q@LG0%4MGEu6u?Z?hxw`^xORoXGP$e?KV=8-T4)vd@k0G9)-xxgNnlnN*WSgaEkbPr;f;OM7;AnqBT^Jn7V zal@6~#0Y+&LBbs|EcZmj5+f4~udo4(7!#Pn z0szPem!#J0UjXHsysvpeu!^FUD7YJBQHHzyeU1L-k9|VA`qeag6zX>ynw&|Jd}w*S z3rHzN$tEM}MQ*=TPw-xlBK=BXq57sWbnGh2OvS15WTYFTc3Di05`r9cfdwVelAQCW zRb}h$B`jWK%<`or^!*$HIBtFHr6N~w%EGC~!b3{{;=l(fES>Zf?tHTwtAdJSZvQ?a zr7;7c*2!+6#(~*HCuQN8Nj5F%>aZ@+#(R;oLHL(&hghec;7Rx5Qr8KjUCb7eQK#_C z7|G#|WG4*K54p+GM36OZk$k4Dn(5VsdDS}FO5~HXSD?`15$|tWOj@UHg=2Z{=|<}) z-Nz}0P7EX=0a3TGAn*M0L+HeS=eW0;f`!v3eP3C|1ofONb*)Zr#SvmJ7Qru-Bq zotT+ta|@Wy^MoqRP^)aYDHd)xOaxtcUBYDYF~vEBKekI#NwJ;vs@k_2bN4VRM*!ig zjbrh7Lx70JHmdygn@o7tl0@tx#J8PfU9jykgx3g~Us(F@cKur>fh^X);lq&w-A=ri z`ay~K}%SKa#F_at1!}M+nz#zO(!%*b}_?0VIt*$5JNlNIWmCnf!77rNf4P% zL3vr1R#7Lu0-8S2GyG-7WQ2=n+ zXo4$ROQiuowf>A|09}|>Awx2N^X=ZxzlAl`NoTLLIOgv+SvuRr>mG~>wcjO+*srD9 znXKvaL0H~faA_=LDv6`LOK$2w20k3XH7k|S?`O`+fLu(AUb|mR7)v2>YMNrn;0g42 z0$JU)Tg(c#x)P&2x7AL!|8YZ}D%-{%%RL+Zm|Rp9SW>?Y+=C zDc|O{^5RwIQx}<`B@7RCw6eB`yhXdo3}8*^G!qT!Bu zNJICyJx^;I!X6!!FwB=msr!IKSTTTBj1h**2pd&VeOVb6)JBEu>Im$N6)PoU^c6Yd z!AJ=}zXC7@MO@A;A(nD~>ls&qNNhKve-CP2J8_G=XJ14l*lL$d2laIKKlq%6Px~mT z6Mz?y(F()tZQLnP>tK|Lh!i5~s>4hY1+{p<4TW|IDT01!XaZ0gb)^%4ImJHs>S?3(DO9zs_2@-Y^X(MnGK+g?n6M zKcPrfFekjm<#FRXO#_9)Q|tKntBt6R(fXF2lU8Wz+XAPUN*Z`@%dLWoZq}!eD=kTT zorHGBAcnv3PImV@*>nkuvXiRP^$*bRbX@#&bwtN5P*_HcU*Wg+s(DJiLbBuu6#^pxgOw=;zrf39~_ClHfwR5Lb4o` zWD9m<<7NiU+cU>-l=$1DXHzHUj~+aFxcvd+r<2V|-4`h9O_M(10rffU`H&vTa`#XN zn->3yKikv2V)HX0*E8b~L=Q4Hz)#=>tzod)1VrPbn%{x*5&%mU+~!&S7f* z@v;|-U+h$uLnmJz-tcID>BdZ-=-0n++@+4Kk_?T#Ta_*mmBpn$ zecPWCjlRr_-ZPbqI?%9UK((INsF1zL^`VvMqI50~ZlMy!L?#zy;k4*oWPa2feS*=$)k;7T@VcNJsr(V)K9Xung9pwr&hA>0VWWigj+O{>DhDjPeWzs_Y5$43b zE(y1i_Kh$9fsFT=zggyThTN0)!17_L4%)l5m z@Q?y4Y0MrWb->8Z4&7(Cqo0oM>!Xak1B9QS2?P@oq^f|ip1OSxVh4y&?thc9HF}i4 zje2Dv_YHviZ;r<7xv2+yZLFfxc4kf0Od>k-asJ3ia|dM(GK}cE zbBGrv(z-!(MIK?rkLwh{K=rnJ6s0&|^G*+e;4_kEd+7jU4P98m`bf&i&>_lEfI@L* z73Y?8fDgl|h=C_#9NMEYcmhd@6zZbwsr44K<5LGEd2G9M-R3UU!g^VAY>%POR>t>G z*#Lp47^XG(8{>IxA0H2I^y*(=J3Qu#-`X_BA~hT3fLl;S{dl`(!x*#QqAjNomZy%7 z(svlu?Yt<#bKT@_^2!+n=8>`mFOiw7gEtwqPYK&-_CtLJ$`SvwrZ;f6U7O*VY@kMo z=&_%TX(PF!rTKz&MCRU86ixDlANMK;o`BIH(tRm*IB6P>^B$!_U9_)K?lC^imT?*M zSfWUu3c5FuQ(ky7fgjb}`b6md3(hKjiZ?=)>n&R*qa7?UDphXw_3nbQ$~9fhE6{W^ z7m#1nK6LNmk-j~|=i*f5(Dql6z8>ivT{hc?)ZC1U8hN?FSH5ftMX^y2>bB_HgcOkZ zo@dP8crauw)Mw9ZAJ*8Av95jQt^N1()=3@$LNxEEH8-QM^JFK5aQX;Pg0&IX6K>s0 zToL0qlzufCiVp{3iRw~`%A&*Bn!L+CKdk0c_CJeskJv-fJ{Z4D$27w}tH!E|sVbxF zH{Lk1+^HWW4Q2dV%Z${oRd?rX#PhSF$L`Vw?rv;%&IpPxT!=GgJIm$* z^_2~AsEV~yUlnz~JzZGwOLt_z6Jz&4HO-s7wcI5c70qIBgu$c_D4foBx7`@Z+h9N! ziui7$$4p>jC|Bas`tTWmV2BD2azrH2E1^Q%<#u8LqPsYULB~SVkEQ}#S)l!Lb>|G% z1aI9Od=U`j;4fyUdDSpD8^9d>`^wL-Z~m`cVlg73#4s86`N$|@K!VTefI0wTro zIk#&ZNCW{`V^RxS$G>(2+G>sCbS3vkG?Y3}!|*9>6amZ;Y?>+zUm;8~AT3}!)DFB!~dCf$= zpRS}l)G*;5pWrC>zLXy@{aol64@vj8AueylW!e*dgPoP)! z7t#3QQ^KRWiR`inzQ1ZV2xatDJO)GA?2sHNjG?5O>E}v(cr=gD8WnnF>+te$SuO=FYpWf!>Gu;M(0oL>%c{0s}ci&fpFtfCFfRX-0sj4>#67PxM{cZ-jAM7X*_Y9 z!qTNw-L2j^51;PzN(@&9sH&4)?)idWrIbtCg0cGT=>GSb6}w}jBPpd4iS^RXI5D1? z{DHp-&N(bO1!`((9I(r#W_H*4#eLFOKqouJKPcHc9z27<3jEpH_y`M1TY46BCg3I7 z*7aa*HcZNUV>$Y13a;}YZq@>}l`!~%qiB2r!Wh$fgOG;CAd(}w8}4BHF^CADIer6g zuc!pHH@&)*lpCTUHUqn*W)siZTuC-yvcx3x)uLAyTd4@f8N9Vytr- z9E{;>5!3*1?FkWE5YXRl(WjI^Pe(M>LbC@X(V)GLRr{lpvaQl>KngBpR0Q8i*gQZ1 z{&X_B-f~Az33wld0{vBvGF0yar%1K9*VJ+NPbHMF&mD7-vT-@6J^Jx;=V4Px6jcz3 z7H3XgR#D>fm(Ir0cJIWP+B&$ph94I&_L;lM(xduP{khoO8ER=+-wBC=lvk-V9-oVb zV_@l4jb?h}=%E4p33R}dK0DV-6E2Y>0VyBNe75X~T)$#J^zNzE z+~dCKuE|2TlVuieL8jcQ)K?FW&RFF!j)Wb{@0%}ND3DkhW|LiIe3tR)l2?TG3s-^O zecrlgrHHm$x)E0n*V<;6_e}$?gl5V(Q72@*lI(#<%M1%84Y>}~diuY5t=Mh*k9eu{ zq2Mv1XW+q0q0ge*m2r?4efjae{JYMJEIk`r_A01jGnK99l2O#lW~nnn)JAvG#wew* z&H;U8HYZhNC2mk={CMoV8KOWsrwqoV77OR`+3P4slseewI2+9BWefJJ6f~Q-r@GDUx^E{RW}gnBQogmzF|O=le#YGr9b%cakg_P# z?3Aie)RZh^tFgjewBBg%_n0x8v<)3W@Mj9txFJ~&P6t}rM#h)eHykp zYvD~nC2WgT75G`O{jB_9!QI|r6edg+ePmgb7L@4S!k_8!RnWR=nivKtsf};gQz+QD z8KC{c2S|i%ZOKHQkLf6nYDYXIhVjK?Wp=-IYezFhQXb%C)?qAEL8zz$Y8>hqSedtM z(;;Vo?u(6Fq%K1EVrXg~j6jG5AYg)iB?SWbMlR|-Q`7b}?pjVv?rw$*hAlnQm8q7I z+%AZ$W);E(*uHv5A~1xkTk->K*eXOCR)94M8mO?jAnAg@$!ZKAIwC4MK(?bgr@^07 zfN{G6=`cyfU{6ILGZx()uuQmmJ2f-WsraOS)-4mSt-9=`z1c z8{=i^6f96S=Cee~&Kl4T+F(sp8KwS9FzLLNMtr`)8fzN9yDZ+Na!Qjx2K+pDNynXp zRPO|FjTO^-v1KJVa`nDdFkp$ANNHHfqH<)*JESG}@O^gTUEBi)FQiIjRllnLLfP3A z4kwa-zrpQj2RTNmIKA|Vc|sVb(I1&xOljn$z56nTEg&a0lL z+|cYI9DND*nWil%acHojt!-oWX4N-gms;R99fDv5Kr}$*on&h4L07eWi4F9Kk)Ydt zw17Mr5uJxN5yFeMHp=GukhGgH{0DNaSE^R$$ji^Pf4@5-6KIU z$6uJzC~6f*#n82f9L}dTui*TGxP_OZ$SNeSJbqf6IOy51qH{wDuLK(ul_>@>=OuA2 zOn2@*&(Y^1T-6);>aAf~1 zPHJ(p@6!mhe0J@&b{_bS%|$CJUl*PjC(9smmfT9#ofn%QycxV~uKG;(fYZK94md4? zXVpq|P7s@z`(O-aLwWps@u^RpW`5H<6+FYCJry}Nla=7)y6L*?p`|{3%xJcQn_D)^ zJbBQ6k@f&fdBBD>OGlp6IOprIK5!lQ8{2vNum)SUA&I}Upz*hYo@sg(S<1AikZ&{$ zIah0lLt9rZOE7g|x7Ioje)yyiaX18N_ZVFr6crrX^MGe>j}hjhNjGP2V(r8BDUWmo zn{INMC#|PKo+$Jx;Wa%TddxuBdGRPHJJP*tib!?@!Bj~O@oeqIvA=LyV4j;KXmQ-X z$oU2Cfb-2`TDmwTMuFu|Pv=ZsV(MU4h>$jH((shnPQyR)cqjJC!!s8AW1fgleX$+p zc$Gh-hgr5HWnT52kElC&q-1t-@YTfSya@V*&J)2BFD3Rh2PNl5w%!l4b}R<@<9}Ho z3`!ajrUE+oHXnnKGn1<5t8{ib%1abK08Cks#^iKKLr}pw$yrRIK)Aj?dgJWYCy|*K zhrR4?(sDlDO>PK)>DDh6gJjvvvLxYU|2v#^SPcWl!KZfSszYrO?h zFI}48y%?a7j+W7T-ps`#_i|B&;Jeb6+Xiun@7Hr@lQ(un-jNq`>iwKsYV!Ei%PXMU zDy=B689(qjFqMg|S`MH}#xXRmYug{&+U)8K$xcJR2F`n};97VIgaCo*> z>H=O`h>YoOQGK0pT(K{2sOB0`q@lTzQjWv8A5O+Up;$YSz;kMRSiy@|k-pugVR%+p zMUdI$Jh5B9{Y1D!yMSn4@fu4ZKGw+mCH1gM7}@-`Trwfs(f(oT*Gw1knil%4QFa6?R4N8Hoarm&7zmPU z;rwlWmtZME>&3KC=ooP%4^{Wgj7nvCKbZur@r`HdDV#6#F9fn*qqxYnhr}COJ&jNU5QS|n|llT#0QxH}D8h@%|hKEOq;R$J;bpX}LLWMMY0#bbuhs(zT%K)+rO z(J4SEP_Sqtt_@(D2|ao6`T8}iZAtEic|<~4lFLc9aFR{)Uw z<7|SB12&sKGU5}sfxyrfnpl3rHD)mDK$a;;@`{jKFDS({PfSPL*W%Aah35qr9qh_H>P1k24ag z@41=pl{S!Q(_?))`dvk=Ib6fPzD^XgyB|$a;`>_+sa|nm4Xc3ijXo$Yzt>5=kLW@p zhVP}*p@kZn8sYtiNlRGWm}lh}C|{y*yM!aBB{4c5$L%egPA51I(@6c}wNk0q6Uo{Q zB$mDx0@VApQ{lDuT$FDuFclsk>5DpOuiFXlP*gw3_lDkrN&Z`_)y~}20^GL|oiVFv zrh6ht@gk6ht6Ae2ur0{7wT}vYr8>8Xd0{nTMJ!O8wD)?PD)p&=r9DN#%OcQqhB+kY z2UcKO0C{Xr;-%^#QjESuIzKfI2UMGkb#4hk=v(P#2gIcYUFYbQz5O6zLC5v`|rF{UNHfE@MGEC`nIbO%VY9B$+Lm z&VE$0q&tp@pz-UHygXW2-)3H~tTjVTkx1cFMT2)Hih1hbUCI-6AedueQU|nL60j*T zsbmA>4pcET@by3!!qk{SF-16CnXI`2Vac#_9;n=obxkBxVKyNub9`_zl@Tt*mu!3H z=8L_~pPNNx$oO;=xfY@vgWU(Jz#s&x(+tx0%0Y;KNVq;yI-e3oXi6{zqZZ`MDso=K zaA0+ZwrqdOyVj_^zW5EGK4#jk+ul^RIAyI#$rI1draY__qh)^EDnj`>qKcjTmVQK9 zJdu6RscI!QtuQ`cuk;)POxPb$Yv0F@Xg5=%;Fmt+tY9N&wkSP|pS_2%&|S?@=`eGw*3Bi%lb-K2 zL(B?c5}wzqMgJvX)Q&F79DmQep>5^5t+whA|Jh8GbS1Blg4VvHy^}&QU9zB5<``)c zdN_YNk2bY0?ebJYhb@U`BTbSk8!ivMC}hLSOaf-v!sMr4vp&X3aoO`(-v1CNHg0AL5Tizv4#f4yfjSf3Dj<9waCjXV42x>CB3AzSuQKyF?aA z??Eg6FefSg6zS3B&bvo!rDnRc^S=t#H6Jx`7&RE)N@P&uq8s;8eC_z}-)SH-k?ZfG zG!mr{Ic9U5S_b95{-RZ0Ve^yw<6{)mRBlI!@nhYi8YB18Jg3enj5?#{Osd$%;KCrGrK>3}r4#v@FI*IZgKG-glxEtaT9phVgO@Q!GU*pRonm?*PG?zlE z#QkbsOZA!d>Rs(qa=KBECogwWeE9Ud`)_u0HHJKMtF0mHSv|HR zQe+tddYLDqTl#ljwZWS_iNk4;kc0q^&$((jIdvJuB=gB&u7ku|zUV$?%nPSR<~j9e z7Rpu<`g`50WFJDu&!1b;C}>3QQRyd+jpaGi{cBN7em_`26r-bSe(ME0V%uc^&`@WT%>a(Nw=<7%i%6YjwxMSz9Vxu@W~nzF1`GV@hggiC-1RQ z(jKPl%yU6>U3UW7prjF7pT|mccBCkuFHv<{A&Zd?I%eIx+{ykyQ_b9&XCt*`MqT=p zYRU)dc7y&Sgg`l7R$CnqxFIs9ohQ;houpWSN2Ra37;*!RkTw4;vdgJK_b4{H!!nn2 zrh~{w6D_yDv7wuTGs?*rwIqBXyuz-_=;f?M$J0WRtN;cREd~xN-2bqTL%)IJrRT-_ ziID(kS*7ctT)-S2!`t7GqDGe ziV3-K=rMU@U`=c%gA7qPKe>9yM~yT{o>#uS-c(L;;oa15kmh1!j@@3puSefpj0_ti zk;J7Tw0&dk(mCbO3XS<9t9m6Go{)C(BSnY4YOlX8en{|ZcCo$UEEo`%*2bz)dVeY&Z z7z-mh=sJBYc{(>PE{e;(t!|w-)G9sHhQHT7c-H*~Zi}@Y&zVQ&)Q!8vS48%-5~q~! z?8NXYjd>yYvjU}z&*D;1Wy>^fjTl^Oa+K5h^7r(88&{XjbvxBK)7ByRem|BJjdsiI zU#SAy@;Ax23KlteT?Yr0JM9^5uu?17<$NcMx0P+p-qrFLQQ;HH-^f_%uIyHtAD*pz z9=?%gb9Hen_iPlAo=*2P0qAzqBdU+}V zhrZY}vPwq333sEmSvO%28$TW{J?h&Iwh2sZL1H5emn%$ao2L_OGnYY+N9=8r7Rzyx zqLOEqG{T~I|8pg3iOw&HsGQw=#`fKpu_J+c<7u?#wNPOOm4Zx9|CSy_aago=YO+5! z9i=xTf~jHO@tZKU$Ao7)uoKFoh%3@v8aU*nNU_WohufT0EEaP1WpFs6rIhPryQIv< zpHo)4-qPa-HHIcIL2hnme)+NS4!i~bWlUBKx1_I;loHMtNnUrFyFJ|(q%ID~n)G?# zn6EYeg_Ap@`kH7+=jw%_xADTut*kQIUx(%))a!$eSF}u1RniV@8EhH2t#Ie0!*qQ!x9>nTR z!%+uhzQF2N+`<&!whHUd;6ddo#$Eh=SK5KfbTI_z}o}!pB*UH&(yqGfFUStO>*M7S1lZbT6(|)Q-MzV`)C4+ z;zGNKX33fX+#gHcN(&KqZm2BQjcO`sWf*c=AxrZ#(zBZ zlN&>K;x;KBlGpFU)ej-&JppO^uLZmx@5}4?*U`j!0ABnLaS1#|8`YsObXY74t0cQ| zw)Yst(-q~Jsn1=Z3oJ>hgv)nu+Jm?XT1N>4l#jPNM`o4b6d!zlwdjaSXI~<}WoP?U z&Iyv>YLTp@Qf@7NpmG>=?++5HRj;Zi8;Bg?5PL3Z_C%HtC66fb&}JcZNyuDKdy z8-G9I`(w-F?*96X<_* zAUqlZY7#Lcc3A@|LNPZG$!tDEAR~tn3*fuhzv8x_`CZrE#_+N+Xs?6jw9^Bg`X(@! zQP5LiJM}i7<_3{S$Bm>;%nLm)_jW=hC%;$s?hOa=J?y(&=a7yk|F^TVF}bdWURYn$ z678iYHsOu4Z=yq~LiQe&4=LBX?VMG;6L0_F%>3J@dX=u;$urpx zcP_~{Vn_7)&$S9EFKi6%eAFUaX{%Wh8cQWkuTguFE+WN{ns&v+`7E!paJio>Ed_&X z)-BJgp)>~Wq>7LJz$yI9t_dhqPtj=^mGsM-yco42Lq#+NHb@Vc`I2uI`m8X~(0G1S z9|*%S=x2(e#!4Ii^FnsFq~8|$U#W{YwGs=Q)(93h8CztT|4d^Z@G+ZdMg^@ojX;sy zYGDURw=mW8SRe8rhvu8bS&pugkcCy$j-~Yn3g4e63!>~tg~n;>9g}62f27GpE^qPb z-d{KbBSL*a)_c>aKaDpMgm4k@s3>Qjce<|3NOvjbo|OFo&vUtXs@bfMCGv4D*jwni z`Jzrmbk7>anrcepdq-Y*jAxNnc_aJtms(Qti%-7DzNPlsD@E!U)rgi~xt{!~Wsv<8 zsTa zxIa)lL2QgR>&EA?`^|-k$z9FKN!;C1Izr@>*CwvD?IDpAUU5G(Is{&_jQ?RN)eH3% z6SN>~nRL9wv+~u(gQ@0CwRk@V(cr}Mj;~tMeHM1l*z^pOl1`Kr(9jVSA z)!%cQ+$w`d-onXK^G<@m;&&m02%BQ@Xw8Yxi{umHuz0YZ`G5!`%07F<@sVz+Ff4@9yFJc+z!{l#M~r#yL>=`Wm-@Qi0y_5}-Ti_zlmK|DHn z20iXmt+L6{`>xY6Gu)H-=+*Jb9YgMcFBkLRITFA3A$oW3c-P&g7*No^bx#(b!!xNb zz^G^0UjA9}*MMB3(bXX;uQd#yo^K-5l@btol&C~BVxSX*gmS^QQ_@*v%~h=1=4pYG zL{%w*qiCb7qM>QZCd}pSSb|36xfLnJu=xxyB`S+K!$p`EkurN=l2c%bEb^gRd(0 zKO}JPtkUA<$~l@9I{n+mtKU^+$CiTc;Zf^L^}PFMvUIFDozC1xisnfreM*qusF9d9 zewVwwO25`O$@41QuA|$w5-S$xv=jZ?Lc;#w2S8=YuYPO=)xaNeBjbJVVj_B7lF!>l zmfbJ&(vNp(f8ms0irh8%u;NF>q3f`eqbg0X1g&xe0LAwa`(UF-W zrs2n?@LxE1*G3{9+AYc1D08%AA2pKcKqaG|IrbVPD5jrhDaFK40>SwAjQnrUa`#D7 z79HL!F?lT~_TvgO!?S=pX(UCtjkiwEkLL}mdgQh%u-5ez)KTdg|F9ckac?+JoE$)x zlsU9ABDnR?;YZU+_l~$O?oir#Q;ojt)AzMKlDfRS*_DJ9a{Nd0XVxxQMGDs|2c1-s zwzOY7s(w6Kr0q*^R04aIMSZpA+4}^q!ik<+?db{nBr>gZxOtdY-t|ea>R9fz%U_92 zo>=Z(Z`QJ)sCq>d!oYzaT$-a;P*NJm{VMM*JFdHQ(3v+9OD~1bigJ~8-4)`|BM4T| zUq{*T=t&d0p0Ky@|1FMoxdF&({Dv) zOm|8^r!;*TLyi28!?F_BbIseRiV?+D(AU5k@B;EdL>Yxf7>LEZkq>kF!b1icTIq!! zKT+FbCqKmgrq)FYBs#H#YMVhM)7MT8-JMMQmcXW;tR=@EhzIy+*_aLs$K4o5M~)y^g*i#3mdWI;~- z`)sv>QoD%>_1SR6>Av6S>R6Y9%W9}t> zR^&6EG0c<2Dp_Y$`?Bd02SUnq+5Uj{?B3Vz+W7aB1o1U-5Y$yIea~rzA>WX?#*jqn zCvDh#%GC7!Z0=#3@eN}3MlD;`5rcyqb+!^1oNr!@`aHDsyje9T-=9E_+@gA=-xCnD ze0ehQ$l+#=`i9_B3jD><;%6mgwR~ooxdk6Qq&PaT_=CpSBafMl>BRVFqrST8wxOm` z;U@eCd(A#MydzKa7Wf<}c8yr!?4|jzR23-7-;P)1Mdm(8v#yJ(o=ALwFNXKFdA3PG z^zr9Lsvn9!xF}HspT3q_Sz$^_iU^oWF255Bab1}?K3+4zSY-R$x#NN6$R73U(NFpp zCn*o9hL-Be_t;zb{V|6I@sHp2f43jd*)#-P{d4u2Y=Hfu1F>pIw1A-+V5YYxXznG@ zim|vaEWacDL4zgl0+7{YhrFwfWvv&Y>k1$6#|G4>iAqYU9Q3goN+ES;sjuu~S*zL~ zDEO8lw>H1CmbB)-?+YXsc;XF}jje%HZrih2@TRv#&Z)6o%y#tYE!H(bo5bqLrFMRj z(`i`bqkZj7Zp%BwrhCpNwVEwEnD>p$#bB^JcL6k11s z`Dls!#%ss4rg+4kY1z;>L8;W$6Ou1PHrN3<^gvQ&gqZ7I?WhB^ zYs~}fWX;*!KH4;GamK$6M8M0!r>&iL(*oFkww1gQBZ|VBqtxntG2dM-KCHW+xIX1h zQKLvsS#j)>)p|8hJAUhrB3Zrr|NkSckWW>81r+)@X%ZieZ_HlyUa_luV$R@pJY3#L zia0ez)BP!bCG~UW*rD~rm?vGnhpv&=DdE*I6(XnP_4gvT5mFvA{rcuEASkxSl0@1oS%{=FwbnqXlyu zb`6a9-eIYhaY2nKEaz1oq?b+|{QmH3$>wVpDGz}stV98ej|jwNRNr4bM_s1!G@D4j zACtd2^GbiiW)CnN1YU4T05Hu?@51av5~(47Ktc%>PaG;bBaC$>_4igWa1z~;t#X*!yr5ftT6^VKw#ljR3Oj!9B4#M z<8e2jryCk68%Ut535`#{VIV$kZ>;lc-U;h;IC%4A$~@N`4v|06J2gd~v}OmG3D4VV z-JJi}4*s?~7~IttNjb7s9mRK;b-Zw(pVH5;N`}&HpKf$c$WiOMt!0r{{m6;JfW7U* z@#u#(vYcOJBB?hv6)ThvA9f;Ln7q8)GU(77s8rTt8|wCRiiBM{jIM_6?a0S4n~iX& zq~>G`^6XtFzPS0dYBbEA5l;i(F7XKAAtJBycJrGGeVaip$%1(5_j^sL5xCPf#=H`D z+mCDe+o};o{qoU|8ay{D^sl7`D&&9o+=YLX(#2Qe)L6%drivrgatZuJ&9|~|&;<=$ ze)2f|opz90TrI&u5yS2IPx=K*WD1F5_6Nc@2j>M-Q+$`CkC8s`6gKoRr34G{F>0Kb zikC|0FTGN}cd3GtsJbIH*7i<^zR*iaf31$DmQ%-U@3;Ehtit6fmH8yNhZ1X4rx%r6 zWw*u45cJNoVb7u2FrPz55=KH+^fd%t53!=_iE~gX*XHQ@a1FjJZCkqj-o0(Y5eF;{ z>3=N{e#@tF<8rG&yPmjj%8N(HT$4!8@cTEbdTDuGx;_%klbKd|{?)Jy z(8W)@G<$3h5c^z2qRuII~`=GKhFXJfcOI0g%MelHBUuJ_Ms=oa{}(}MJT z{50HWy)d+Z{#boSe@Nsv*XT6vHQ#$*XvbX!Au5A!1;Sz2r6NzqLQOY~P?2N6_6`(% zuvFynDbQLLWTU(ZjLw9t^2540eX-H+$81QNW*oQ-v1sf!)P}^i+ynS0k2UJEogD%X zlHV79Y}EapEk_58r{cfS6L@*98J(W-dw!v`nE$})OFmrn8e=ekxZ-UpB;;lCW6`r5c_D=Ov zu)bny`rUr><@b=>XzM9tb_)J70>d-CDcaTHF2A| zHkL?-JYiNJNqkH0-lEyP+<^=xHv%KGZN4v@f&c;pMa|rObi~!wjL54xYcwjZdBW^J z4$L%Zp|TSPl6*hKB#LU7AeUIe&+)~G_Z8cw?K8EcH?J1{!nxb<)y8!?(QCF=#y)v+ zw2o$!cq^2{fIENK+L?3g|DOkcz9N!fKLOj)t#j5wmnRY!6ytAGi@KL^E+n4_F1wq> zwGjW}=^mFZS#sBEXgkZN--)~uimu70Pes?{JdF{Rx}1!zbS&JM3p?jT5NGFOUQlmU zX7){Ae9UGHS4a9xnb*6->b{gtFFDGRvL9C{EP}3R+<($*zWPateYo0U_UTC&bLWX6+uzomKc6=?LrO2a`))!*T8LVOZ0e@+5j`0kiC2qV5&z6! zK;k4I4OuEo5_NdOyxZdG+BN4SX_ttm);W3h=B5iJZ~nqLxeP6p=;$JKDIUQww<4mmQi*d;H)jB3fl<*y;rdjHAkB^^i3igVV%}t=_cC@i6W#lW%*F=WYWbPPm zd+N-ZiAtsCC*nd#?|2HIe(mzd`Q?AtM!yvZ+kf0Abkg(=Y10iNJMm1;_j+$jPRi7} zza*a`q%o%zOmulC|Ll9?sf0ObPjABLBxz97M|r@jCOhpj`>FLkBy+MEbC{B zUW~lMzx))(Z+NPeha{rj$I;%M4Gs<|r6+OT9TOB5`INaJpC&*E0sr!pQ`H;9%)~&k(e)v^bl} zBV&aG?ps^4~g~MqzsczFRv z>z*ge{)0!)fiyCImJt<0Pqk5_=G(lVLiW3t{Iix5_1Bf}cCFg#=dMBta0qU#%<@MT zQ*Dc^;D_%JzX6|Cc}_{SeoO0(RDH%wx!Iv(UVv#x@>>D*D*KMs_?DUfRmuM&TL0K1 z)z)J3c$v?@5Q_9H%^K7u&a96oKj_~KzH==JmKODJb3vRv@_l?h?+^R44zjU)=pj24 zfmA0%B_>%hP1nxnTuS#$nMmbWkmNMzYU{5*W>K zbx9^*bO(Dq&nTC{q|teUZsMP(kW0VX_oG>VU&XKl0%RZskj|axgm2j99N36TAn0Xd z6wUR)RVdLQt~($=AJk7$3ozCg=EKkl{HmyEib%XA8nu*f*~Hr0IdGh(Q{o>>P4&Kf zL-A_tM8g>KdryiXSjdb9op3XCHB05Hl*VbFC9C{5gyG+>5?Ll_@-y0 zamjQ^aA{>@OHS8j&7KVDAoH}8lnELCbCTjxj^VFfsF{?0cK^W`c`}pqyodD_YY^-` z_~mwN0PWqYkzk}Etr(YT`N_Rk{N?lvt@oBG#nhbCOF7ox-+tvG@CimlJ$EINVPQ2K zF1Pfzdrz@KC?1t?&?3ve%2CRtjDOPo>Z8^P?gRUtTb|)as6jU`T(Eb-&}c5DcClxY zbv4?hdY>dGM*o~)bRITOu}~xrDcjykq`GAUAF$Nr$;wGHH@2~$mD%-1yOheS-+8$Q zu*ysIeZ;(64!&_D;bas(r!14oIO(q@)qju1fB6(PBfZ5Q!s$*T+rB5~l5e=*m`fOB zjo`HV5L_$B&&)*V1jY~F z4zJ!)c4)os_-4d)^q(O zJ8LHbH#6n|v9&sYsDT9g3b3Wh5#QczzmNv7ee?iIB+z$DG5hb>RtT#HQ~KJZ5Dy_x=P2R$~9URQ9)GNeo^>%HU0+2^}Sl=!%lYph}cf&&AdaVFrC9;Uu! z!!;=IMQetm`&nEQhVuD=jA=Mt$wew+(gHMj|JH8&e?PODim&(2kK8p1d)F1^lpu0& z*j#t>G*f*i*YzdO!$(BQ`3w1c-CKSJYHw?qUyc7eh553LNsmHy+|)>FkLGy$i5!!1 z)4{mI{W~oJ9E}tOI7<)`X+^0pIM+2`sYwg4 zg8)|)qy)-)n-TAuuztZ{s@D%4e*m3R;?=yEYPXWp`X#fJ%JsvyR$J7yRF@-9a@j%S#opM+lWtFhoSnh(0>K|PYAol0cvR)xC4I=x*Cu~%C( zm;Q6z42dtvn-|C!Vk2l?%^6ab7KqA9(17TxApZNtaiuQq`HvA@n}tg|+_WY%8mts~ zoaep!FM0lj6RDn)`Th0h1La9A2LbWijurp=buIt3uGmez(pT#5T3;+`Kcwy?;y=@D zSMSGr?VZp{Op%O9AG77f>*g;}$)4K=xJY1JKRLciV;EyKp3^+4J@QW0)Y@-j277J* z-kHXAZOy&27PfBx1_Hxo;BRPZcxS6n?7`^(Oi*@{z=CAQ(8$_2$nZMibmNQKHbPOr z&YT0Yr!)G&dc>r%2*Gf}(E{YD2&y@;(BD)W5relOEulXIN!5JJX`6l1)q?9Z$8sr zSXz8=A}&zP1>Pw(^9%iPnq!jI7C&QZDW=3S<})KXH}Bo&tG{rBIGNPQq747_u}+F|EMln=0x{cDtk68^RkB%lj?I1Du;F9K(Tju16!YJ=ReW2!(emQInz*J z(EUDvjOdnjV=o-L2!Q1+n(F6fTN-QfRgSI4+U1J!ZwQCo$FzMpNI&tHl_e6R9S}3f zWm;e@Yj!SvScHB$5`0i@BKC%kXa*Q`b!?;b5vwE}z!U=qUJyehY+r=(Z1|u*)CL5S z8+{sm;#^(L`FdGY^Rb)?C8pm^B^$>)TI>(_j+|@PZG!ca5nUk4$%8LEV5&V6E3zrQNZJ37v@Z{YdVSwkvM-^TNtQOsu5@HcME2~%*k)P`m7P%}X;HR@>`GCQEhZCU zOhm$@Qs)#Eh03HoN~cBZdGF^ll+HPw-|v0jf4<)%KC?W}{oK#JT=#W37AxPgr2A#8 z<*cNdnvR_gW*+q`G%Hc~O^k6y|8u1dkkelZzu1_2&?a=$`&r8+BdTl0>&^tIK88+g zLuTOZZ#gX|-iCZD$cvKQNX@((^6K`ip53ozkIj*hTh`Vf{AJ><|HrBO$;top+X}(c zDn@Cmt^l^9Q@HTZPy~KN>0Oz{m=eFp5yDl|GWTakCl$v4qs3XSalDH1+f0}~+7Q)O z+$NPrK1wf>QYqWl@hYw}vz8I}^VHE4E8jg?v6E$_{SeyZISO|+91h;BU^x1+=+5LJ z>cQ$--LPA+rv_z~*um@5?c*j9H~|uoTUjr-&@o}@aBUyumWDb8Mucv_ogvt^amLeA|){{@zw z@@1yPXWkpdRV}U51pI0j)ouL!%1S*>hM*;XdGWxS-iU2?tZdHC5l#l`Ov?^dX;}*%ugcae6YEXVwKKi4G@BHEVPU`gYb^7yGE@)6-+bN_0mkIOg zvd~K@eg_X}M9$OcWxqD`ip)+D@%V|ve#&C}WLlFa1jR8aYtL60HJt5ItP>Cr_bQ7~ zh#lP?LUnBBR7<9!5Y=TC1~& z|C7r{H`TH=`CsOz>~l^FOK2g0rqr^Ft5x{Pja(o*PH1c*)6AN_otm%LM#wQb)3A8C zit^)WcCTg>Qu9cUDSIK`(pX>6j&`LGpj$|LiYJ^Q~5-*$isG%_n9UeObE1>|s)N_Ac3? zYs>gl`GN(7=JXYnZP;^Amme4BzvOg;`|%Qu>M`HM{4XX)iE{w@Fmm$JQ14X1{8 zC67^lDZo%Zsp2Ih07g&B@4b)oYhf~L3ce*sa-678mfyD3%f-_mg(R7t>YW&usgZ61lex*Y#t_^IFNjmF!E|q{ib(5{1J{n#Mlgmpv3w;%Rg(K?*V^>JEfJlsa|8n&g?Vd zuBv0fu1`z7GFHg#%ZMCyIf0n=eqoOPJjm`PE1i$?(QF=f^u19Yf0Q<$#Zh~8=;63u z_V6-+)|+$9jONT10r?qlQ=ouwDvZp2xA|?-9j9JE#Le*c_R5MlN-x%up_4nO1st|` z@B<(4;|xr^>G~f#SfKTNM<^$ zCOi-L^J30J)jIXIO0(8(ilroq{whVEk6XT8{OVKnp8Mk4uBmU*4%}v_qAGBsy&RPDNk@I>SL?+``mtB4$eW?)P~ zcHV6@YtMj@i0v&m(mSVV%~=*+{=A5fgySzW>xFvlkIOmxxoAje)`Oi{+hA<-iSJ66 z(v38MkKepZS2+qcvUg;wzX$rbUyN}5Yd{1Drmi!gD|!f~-Cv;j>w9JYI;)%kKu~Ee zS<&0LZHEm*pbl^;sfMI613v%L5$d&EE)hk2?5Yf zhgcE`jTg?M1F^~pQ;rt@IvC=5=#&=HI~3L~(O|tmgmU|hssF=gmknJqR_0dKi&U|M zvVi}w&9fsrCB#bpD1&oO(yG9asxvX5xq5Vf(&1|ylYUGqf2Cz;`_lHjDa|bBH*CoA#G0zT53l0*KyKq zdFb*rujLCs;pWAxyGprr0NADhJ=N3`7*W=DqCd?e`IdyFx@B?E&89UbnVIDZ+)-<5 z%?Nst5Wm@s1!1T6x~n#RFfa}2Os`n8pK04=WxSt$onmsegU`5{Y;!rH@K)w$bD1+1 z%aU-Rd2$y@6yAS3)S*ww-nucAK5A2}Q_=TL7S}o}a7Hha&`GVxO+2!xBylz6X1J90{qI55fT}YRC!RQ@rZJYzEqCpsUTr&j zvTNI=oW%T{<;Ftq3mkJFEna1-azg^NO52->cxYX1C4wE0#* zuP6xdd{>KaV+a@Z6YTbssnR$S5gc7ip%V`WL%_R#$R?cP8dO6qUwCQ{0}6r?S&V$a zbZ&a&>sMI~+J;Mxh?NoEZe*1%Z@D$xA|#;OC6yHxa?*TD^-6NDZ5 zv3dR5Nw@{v+Dv%Bn8XIA#mapgtLSMLTV8Va?;c}U6+KCxI+CF5%L zX@hH4W*2g79-serhJb$wNW?1SywBf&h~iV;J%>9@_>C-)w!6#UU+F5p6l#f&tKyvo z1@)YuGp~~^R@78{6wiowJ9Z{`_u`jp=?w33HI1PbP30)-;h!+HKOH$_Ek9Kffr2dG z1Iyhf{?08_n>fw=1@z@~>Q3x9RB)>?+Hc@ehhSmcs674a_^Hyi!=*V=OBO36glMI3QPT3&4suI#R3 z{)>k_((`(#qpD-@*6N(Bo&B}rv2T>wUd!(NTmhc=CeG=>GVVTK2Tr6Ke+h5c zA2Mn;BHK4mf9|{w>syk@;HA8W1pLcVy)*U2Uypn-ICwT~LB~Xqv-F>%Y=6H99AC&X zGK65fy2WNrq{V4jT+@!N?G6uT@4B)C*Au(#0LN(II|Hx1f;Zf4{MgQWV%)#+k0^+X z$8UQ~k~kqXBgfO@#Q0~HUT1pK5xGA}ZgY>GUzhvR#M3l5QDdN_BP(#5it-bs;NaBq zo4c!5%v6}c{-{Epale1z5X6Gezd@pz+OlwFA-1OT?gH$Zy{-7V#9+EU2w;KG+N5F? z7N;e+yP{*#S3}d~XrY6`Kby*g3y0apAa~-D1UMmLksGpOZO{0yp86>ran*DZqtVQ> zA}+M7iLSNk4~)3*x}gJ|5<4liYxOTZ%pd5Q0RKF$keX~F#P98)EKz>#MTds;XY=+& z*ScgL;ONE!qSW^_ zHhb>E4gSUFE+t~ereL&ba6!{YeB6{aj<#W#~`*_R#cAjTTb!;5Ik`g+pbOC zD_Y>WX7$RR7e>M(0x{>ed|fu9@#F9^%Lf7f;&=Kg#azyO>W*0dYIgZ~mK1sHkNDCv z1a`bbx99t?2N8~LI~O|@^XJndY5EH|s?}ZT zbr@KAKgwz#;L)gk(i(9|4LAXf^_+=<2ffZR3N(XM2zE$}nO-MXj_dxecTFk*W%qC# zC=adfz9;MI0AgVfcVVqT6kXM+z#vQwEs%P|8|c?j^%FR+q2y3uCvyepircQr*=g%O zft!UkbbnE(eZ+lT5nSI;g#3((lYO75@!dThekYvRAortea0W4gZ-uFk$^sw+*RpY6 zw$nHchOZB=$3Ry8s)~HFW&b?1svGA(>5x3m!S+L_-u5P!kvXDO>v^ruEW^- zAYgygJKh=XW(?G(CDGnKitDEy!Z`ykU6i}bTDiB5Pd;r}RJMJF>-c=TtwXYfU$+ab zSDOPK;Fnb%GfF>g_d1=mCtq-vo|Qg!bC*bjPERPm1UIb1@9bG+TDtCI!+la3y^$tL z^B?3@0`<*&X>)qvy;~1fjySAzerrIEzi`*CsM$Kq(X7ph|BFtEonojyU_psli&x=7 zI4xr-8;qX|j`~YzEA@XoL`yvUn*S2RGE)36KA*U+(Xz7A*QOE%K*!RSn@s8x_e##% zcgQo&=4Mt zfjmIXdm0k-@IT^XXWEO$=mjt-xKm0yt7{SYZS{gMP0b2K1saW|mGBS?m&oSkhY_@7 zXd4~)Tht-x=wqw~LFs#{<`l0^lVO*0Rxk~ik?XWsS%~HWEP{_NZYX-q(jX7o1`cF= zRjly=gq2gsav&}<=^Ec{pI|WSA~glLgL!uKFHV?O7exJVbnKe&Q_X%D%zpQ|_3x5i za8l3yW|q4Gt_##6OCUB!gc62~YCs_L(FQ_Dn%`iyXJv`q<<<`zp{$KaB;(iRMkZ*I z{8V$Eh$pHQs{5rKsIpS|Y|V`HN3sUxJ!< z8Tg5k*%H6IhsEYsCl{8cEFJ^&PH9?!u^yZKS#5pNML-|gAJ#8C-l`^(mhYz^vc;_x z!ByQD6xKVRS&|jKkFq7#iMW&*Wk;#q%iMNtr{MGRn;&IrOZvM%JBC&3ez|HVoq`nG za6XO?`;gjbzFnb&*iPaW$EWv%l!v=^JCB!1QDiR8iOSj85uGZzviN2MHZf4HDgC>_ zrNZ=10@WgdXtSx|j{K2meU~=|UWY}t+>t6f(Y$myVa!eUwv>IK`vIj{}&Mb3L)Eh~0wcs8?$uEyv0ElJOYx8?}nSt)# zQ-ii*&?y~-VODd?b2<)&4pE#n6OX~cx&q{%pvpnh1zoy|7j#VNh?ju}iGwNvy??7x znL4Wk-p!r_0%Qv6*YWb)oJALpDm0b1-A|McOoBaaE_L?q(R?f20>zwQTr5cwbr%p^HV-5RqGl}%`X0N?tW(WhB6bJbBezJ z&8_Us+pgCtcSd6)Obx>mLY+Oyz3sE?hh|rB_Uj%q7i}%@c=q9v!LnQ=9K*2pFZoO@ zO4l1M$gd^SE6v4zA5y~mrpTBMoOt_UL$BNJGm4&HWyRcWV|G3(U^*6*pG#deEAu%w z?!|}2vl^u6s{;0XTBf~nb;Sl@p$g7Ef7%qU$j%UO>?`G`Rkjnl#*T;P z0oAb#@$5UpCwI?zwE9(CNt-X_2Wdmwz)KQQRXOj50FCM=q)QEO+;xLrpst{3t!|&k zh#Q=i97c)s;^)QuUYY6-L-Xn(j={WsRhWXBBp(+EPp*?K%crq*cz^h%)$5nXUw?lR z#+@#unL58ykCg-_rWLszMuI0_8>m%!Ua;z{O8-FJ*{4?cVAMjpDmW&~1o$H#T&CR$ zfq9B1IqQ9k4lw%Dat(Tx%&5?7nCG`@m)yn&c$M1&UvuU;>R#O-I+HuLRiOD)3%GW_6XanPBi1xyLDjJCT~~I!bZ_6JGOrf?zpc9@ z63IH8BH@E}E-yN@IgGzYV7cRTN>BdI&^dZJ;bG_epqMb-aIqL|)+n?5*__!59SNpE z?E3`m_Z-gyUyfCEo!{TZ&%UTSLl25QC;OL=+qQad+CPPr>mSDk+1U@2uIyxXTIV3( zWKU8*cW&7i5nw;C5n3iybp-;hJ(~V2xD|t?)eR2c?!3s<7Jt+MN?(I;33_SYXt>19 zyp|4E>B1}5@7XUDJo@5ItM?NV>3}cQoHB32=qj>`F-)%Q!TZ49zCoLL)_D!>fqisvf&IX@4aX}^yFbwr-^{pvU| z7A2^xlT_F7Q?_0t+#M8_G{OPJ?o~`eo5eZ02FM(skvWE6=0bb~-v>^{j5nqZr!4ZV z#OASm$`=~g0=31uYZ1GCYuE$SfZ9u?&4+?R+-gqHj|V%`Qyh;to)`XbA;fyV@YA}d z#e*$MulC-RB)S9^S@IROc7u{`V!r6=!Qa&=(`1X7o>jV%pSeg@8Y@-7RIwG1TEVPx z({uu%?aCp3$R%bNVS;1+2dXQtvuo>HU4uRA9CYkVK~4nCwe*4GuU7At2rsQxqqBi@ z7vx0}AL8`sa*(|MOwbtAtY+g`t!3(U*&qO{19~1&>UE((P!Kb(u58mU)6D0>^uDDD zvchoV8uu}3v8J@$`y6VY@@na~rA8NTejH-mIMgiuY3sA=ZaaKfH!|>odo6(uz3om1 z0q@ht%@0h%0i%nL?Ms>^YvGp9Dx;j>B?KtC(yXQ2$RhpkcPkKDhea8sYhp5VSSG4& zat>aeS>3(C+-r{QfVw-^&6$>kAa=0Qv0yfbK8r3 z1*K94tIO}WyhWEbX}aoDLCugDZbt(hH(oK4vRve47L9ccID7my+xp#(Xn&tzo!lO3 zlcz3ARs>UBcjiiBWyekf;3`!VJhO#x)jU1+fUez)HS0PvRXUZ2>mfWW(`(Cwc;;;7 z1CYU)h}(X3cz8_WX&eg80}<&5HjlYgzW?*)xYQTpKhkW3w6UYJqsFbvvA+D(`qN=> zZnSN;0#;`fbAM#jN`36)DCE~z`@d=%+4+1aA+?QrNA!owu7?!nZ?QXOopI~3%6;YG zI6G4nAG(Y4vp?<5DpVnv)!B3peiqVO zQVB-7dJ)g0DZ_6Iqv0f+)I<3k8&PiFf)l9ly9bk!MB<$3jH`@QIJ*0R^48cyMc*F&<6q-7}Jayh*`p>rh z5G=20!rMQ@!BB{{+T*7Gp%e8pr*}{&yOO+f`<0rDQKJwjIVTYT9-&A-5j>Lm%Jsbv zMW8aG1O)q*VUq)JGt=wZ3e%4s8jp zOLs&0&N(lidpv8sF3|B&`>d~G$CAFR@@E`rg6I-($8O8tow&E!cU90ylX0`)PLo-| z4mXOasj6m0U5aeI23)!K+7Bm<=gjO_F%N86k`l>wSf;H6J{*1Me~+pvFE378!fM@V zP%FJiK)Yso@Sd8_)jiQ|PP#Mh*1ZX?a~a73S8r;1<~O;TiVtn~_)TT}b=K%f7!DU@ zi~;Sd|G_oGhucGNMymHa7jh5FRMIwFAH(R(u}PKi8Pud%_N2;JEg&OCquvwnj$K-c zCV}eD(QLxK-*NQrjTeO}(F1t0^O78IS!_;eqa?wd&8K6&zYKUjnJ-cZuVF9*4KM|X zLPKJ`f_pEJ>vAtoJY_&CYC%0d;G)>&S-aMZF1LK1CTOm$!`_nYU4S&MIqnSxDpbNi$a1fxzAOc+U0*#q>cI+o@U!NK+Zfv6N~NGn0@a2 zDhexd>V^vrQ7bdrdd>@QQcKNN(ibHFT~|i9ZSxQK$J+aN8|~Tgr&@#-zg!p$#m)@J z`(D*_$DxDgcbWBCgkOz!FVmR*7ax<&@278K7(t)&-tzX9z&-q43%hBhAq%0v7rx)`Dbp+ZZZ=7XSE19Yh z$6S42No$giTd`NqSJI~rU+z5r=v3hFRmiRJ{iwg;ZdQqOjcifIvkxbpsouXQ+4Ak< zbj2u}@Ejh0areuF

    }wO1{=>+JphQy-C8ib9ime>;^RioB1XO+E=JwTu;e%RuuG1%B z!37#QES40Y3|wvPIDDVf4G8DStuS#{CyFU2LE$HcdN8hRq6$jE3_AdCKve9YvhKX+ zxEBxsWxo0)j|hFbJc?Zyrqp~8Lar|>#<3BLy1nyD=j)(kfJh2Gtv-Wly)<2`Bbv&( ztro8PkqSuT)!jkW*eE>kO81rM3Ty*M3m*HuL1`Z&P6f}#xJqmSnY9XJ z^B}{9prpM_0gcx+UMVUP?*SpGKjA%4<(@oa8eMKN8-OjDr|z2qzG=3yF7=d93!xii zSpUn>peytAlvY6DY3A1j&&ux_J0(iV4~Y$wF28IT%JHz4x4GaEK{L}m+E1=(bdEH3 zga#m+&YB`g1XNo@$KSFawg8`8+NG6Rmmkx){>KKJq}u0G6u1Y<4(9_^0;@;-fe2* zsfwQ2?W^d_^W^&Yf&_ zfqQ?2EMqOr{pNcl=*#s71&TgK^n^=$MJJc8peD)C?97AV(uKrQC}zkG2~!2&jePt- zK!&`j7*FoSF~ilYtsl1x>aL6t7BI74#F;A8%XwZRz6 z)bDG8{4w1_5)|8=5#f*?SgYhih(1s(-pGS?|Pgp)EiV1-aIv}n-~1HjXzi^ zz>s>eyyCLq0qVh9c5;&Cc*hVe%f_2u&-5;|OE4T;82&R+xwG5}68?(>wAG}a<_;H> ztUFA5wS;v=7d!qh&B| zs{ACIjnWk)wj@cF*@}0q5Hcshl;{GhL#QDAZ(#$m%FgAXC)EhpNENPne#$AB?jS_T z&O36a@6&GiQ2=b)r5N73AkRjn=pRwz3hqG|L^%mpIggC^Bs8=<)Icft!Rp(_)g{`H zrA|tvZhg&h&!X9ZNu1}O?c<*K83QShHcrxhTX*5fbPv>7nxUl<;{#HR7!2G%TO*_g z?;Ug>y0ugWR*v`3eu#s&^#scBH=L~J;?8ySSg;xQ3mjmm2y6m$I#Q-CdqFp6b6Ma# z?_MQ>)??+UInEWzncfi}P&E?-C>W-b#;RlI$=J}tGgfMDJ7ktHyj~5W!~?+241O0x z#Co8jfF$3!9G?NCc>%nJ^%QWcr@*mB!^2FF*6zUx*4QPEW5a1g@|f)(;K$e>7u>kA z)Tdv}hmhB)enox7xF01#?Uxe*6Pq(xVW;cQIwf-H-AkR#vUhEj4`>iz(ErIaI~}{N z%)ZL7jhmmQg}wj7DR{rO!jm0JODA>CE3e<87B^5ptjP#Ib?KIQ46!A#<_1U9B$kEl zsB!ly8~D0u(DQ3i&6Tc`U2|pjgIJyUb^3-N!Gosf&yvDK6 znChjDK57Fi!t3&dPf;d@8?^7vk`V?pYmbABr6^fAOq2}Oh(y0S!s!d3Nu%W>~!*CI#LAPX)C)T<;OtnN8mhGRlgoIw^f z-#gA_JGX?B4$ViP|Bu#pj<<8w|pNVIA?lqYV&U5ld7Q$#@8B#y1V3wlI-;5X~& zaJ%C;A#hhSbk=|Z3*>SE2E@K+&8J%_U|kAK52(EGi%Qd9*PnK;xLDd>_y>8H z4~+S{=w)=;)10LR~A}JtNFs*!}QyxC5y--dQWg&N0@Lyp%0OH&+_S2YhU(d zp%sE{iG+?nEF0f$e%tqDNkb3RAEG^59@}O_GC6L($tAx(EROq->Xq%Y?ZmOuRZeLI zK_hg714QUMO~T=!n{nV;-8Nd@@I0lV_}@}f9TK&+Z(fxDde_nPG*7Ym_>RO&!CLzh zkM4fA2}DW|U#FyreJnZti&R@N;3)r*jFx(r-tGKcI{1g{5HxdD*P#I~`%_w~#vU*F zfQ_WqsSxTTU2$+_&ZlBJIb6;u(k7%G2-6x6on4sFf3pkf!9yk3p+|J}bq!2Px_Ah# zZd3w@gyy`2BQNba#wLP)>vww%h&`=}G9=hctvdpS>stl{DRnW>x%6O8s=Px~TKPJN zuHc~K9#_Fs2P9a6d!{R$%tx)le;y-~Qx;#~h*j#q3%u0vV^cZjL{Z*!o#NhK$Po*$ z_gYS8N<5^i4S)*`h~Z{IU%VBrdyI_O!j%TaC76vvG)=eFFn+Y@ga(S{J|Hq4Rbow1 z`bA$MAU&8!;N}h>i3$oh?tu{Q0r7d#S5eQp6%>60DS-@R-o3$?5zemG zFI#%e-*hP1*lYdHad}UOeWrPQbM;uOU3ykzHRRVCHKaM~bM{NUI{T4&RieuC*b{q1=^A8Q}6AcBdpSR7i zvRd3eySXOo^3(nbblsm?CK9hrxY^}!(|F$CnqBKg$jqBut0rr>_} zBlnOvrjrSYJ}BN|rPwQO+{@Vf(N<1Ks2XLaFI}Fg>VISe{kDb#UaneDojZ-={#KWx z4T?K)vPAMd)hMw!8ay&#Ox1+fIf1g4L_(QHXeo_UH$wO3pzNMY zvpd98hxTM~4-WixDZDWfa6@)g!3j7;ig}A7>N5}nOmC){CnFDe2!I<^so)jBbJiUx z08SZ{KB3qGYR2#!qFX}K2r%qN>*smI%FY9RI3E|fS;>sMo1@dOhxcbHG(VlQAo_rU ztMWZz4K${QB)8n{${m|hJ!SVM+m(biDM)M*ph#_#2ksPjxxYnZe|2Yj7;pc$y{}UH zN>A^~{+BZWl3wu4V0wNOHc7N@yi)Q;bAVrd!<~7WiyC+E&0c@)nYr05R)>;oZ7H=S zx5;KluT0nC$I#!c?4J8X=B$&Y-THerf6kk$^t7V}bQ|0!^c6vg>E?=DW8pFosud~L zF*NUA{A8ccCe3Wcxqm+YGu-#J$$dwQBzawfgxcUA10GXO=1Y=ab;%{78OeYsBA=*# zG9b)S=8WmUM%DAv%7~%ZOT>&`3_|+;9RDE5b0YE!dbH?1_GM! z&P|PE&yRDPlhO!%FxGr_V?bWhk?ia!Q}+wR+XDl}Gw&#d>lCn8N1t<9&1{855ZdNm zj$88*MZ4FAa{3R9$fa}Fm;p&YO&et z4`LE!q#z$ZD5K)Y6FhS|0OwD!tmt8?l`pYJV-eL1QxAee4^G!oXUza9JWRm_)3 z%jN6FLAQY1%8+~#j5>hMHz@A6fpnU2R>2*F)fhpyf4cG~hKZ4xbY#N~NYR%q>ga(` znam$D2GRzIMxN&=A$(mxS33pdSP-4Y>R5t9MoR+Ez?A_&FBseeh1+M?EqY^G<14yz z?Xxl4#xxZm<4uj9|EQCBk8-oUcy@qT`~KIX3ySR;rKGvd?g;QcVT(j5xYIDKn(V)>h@%<14c(9%D`}nQ|&NR;q7v{-aG8X5~Up?wCsCh#3 zy6-j*t;hvY&-$YM1`Cwh)Yj+*c&Y>9HQRPrN_f_uPmX4-IaMAo-$E9`Z(Gohl={vS zw78YgwG=@OC{jXR(byATCt)K`V7uJrs-3R#X`kc%{VH!U$Ct$cO8_UOTK!(R*y3k&1x#dtgI-^^TFPP+sRXpFldaO#o1mV9@uHjj1TE?NxCAzo zp->H#LtZbAq|%ar=n>+8CQOzS#c;R5m{Ht4s~@F&G{rH91N5-bK+In6jr*{Ma^e*lV=uGElUVYh zbEd7XMd|`t5J~jlNokLI26k{;J8*8>RKG?U$fer2xBehMJ^$Cu-2T?ynVgtyhA;l; ziZ~>?4QD4457X}tfbr72#%*aBad>=wd3QJ~BE4DcM1)jnBeg-$v#iJZO)9Nn|Cj&D0h4PEidEDMdhRI zJ7=^N?J*GwK41XDar31H^;>UqqxU+tQcvx0Zq|3Q{5BG^o02ElsbH{LOe}_0e)p5z z)vvWCFZYMnu6b|uz<s}xLW(wg5zpFx^jI`1q%c~N{>Z;&? zs}gytn5RhFpjgYygA*{}ma$BWB0xjaGvEJ_mrdO~IWgHt(%-L)3zyW4TOg!;q&)hX zNpuK%<0~_}AkDQ__msq<^VAKz>gko8zja<8Ntq>YX}$IInc(o{vW&^_;jddyGfY{} zIJ>ez!}F+`H&fG{5izi}O2<|*O1L!LRD&MpAF@*BfKnvYX)vBO{KUp)Rk!xXsH$*Q zR}XGov5IiOmy3D)?m8Qt?9%An(Jys0YmXgZzY8;cS&Wl7k@gS#VL}V*T~F56`mdhm zp@uHDwT?kGZVxTbzwLkiW?uZ)e}gB%GlD`q;7RD<_EO;;PZ`tv*rL=VX$onRS{Odk z5gcQ?FC84R{SIgi^DMAD*vkkT)dz-lG&Mbo-s4$XZ3Oz1Na4~hjTb;-8ZvN#P+EQ2b4GWV%efGjKsaXNt){S4xCC>8CS6y8qroDS93|5CZv&h$jVY&jBgofAdXl*QTI2MXSU&e%1r1_i3iybWXPUb?qboiBzC}Br#6YiJ4dV7hkL=pqv0u z(+atj58d3ev=T8Rl&NEy+8la!AkFWA2Ax@^>He0JJ&_1iB?1h_00I*f6jNM6vEUl5 zDH?(uq``{}0y~cY+}r5cX=aus>85w!#B#ldQZ54zB%%{v)V&?z8}p^CS*CcscFE}-oz<%t zV*bl<-DhXx{d7Lrbq*XqPq4WA1(xM+xtaGD2aLmJgYim#n+l@v!ca<49qd0t8a(J3ODvlPVg!c;}+UqAhoA1)oHY&C!T>xYT(Z;8c^i z+x=UPdyg;K_)V6QS?4<4Up?I5^4deMnD$Bajy7kv>m68fYo>~YY@$K7@S(lxrpuK}&cEVwSj9|vQzd9GsNOhHF@ZXr{Mz3QtCY5aY~`2nMQIG`M2oHV;m5A)nkD{7Oh(o6=`u+XJ-EIqAh_|+R@JCk-QG)ZoX%z- zWDvSO(C+ray#tv0;vUgcoGjE$v~Ya{)fKJJ+(aZ<2B`zoryIb%09^bPy}^`5YKD5A zC&Q=4o2JZVqFYzCKEXYX;1csC1%`+L_Q3)S6{RcaKB2ComP1AOVKPa>QCgDR1CuFoWAdldW*W61bNKV|cbD zm{<86X1#+_79+V^I4L-EErW(b9yE55uU;bV;y^tJs)7pEu~5Y4P3!kDe9|-=s9;$T zAk?#gh;@p+gyVHNlqiEAw-9gn&#!}2295ep`BVQrQP6i^8(IGC=K3i4hy~fr(>Ujh zdX$G(0kehpz%<|M;_n)U?*)Vwh-d32wSF^PI6T}()EoI~;Q85gq1=4UqOEl&&Ws=N z(K@^4PVcQ|(n~eEZ=LI`o~H&18;$(G8nhY%6JmrOiS|nbpL1{2iJ?G~zNfnrrN|4k zaffq?)cd8gwt!ofFAtRPduwztCjH@_#MHd;eX5XDm={$ZOVWt+bLU_~^FMzd!1D~c z*y#X&bb={sNyYm5m-!*GpOwZR?J=Twj;|JuY`b^Vt6zB5ZdS}NbWFWf_+6oCJqU*k zMrTXlP@)z_1KJ;`(gf47Eux43fy`H$heR4`{E~5rdzfl#;YQ?@=e9zL;vj4VqthOG zftriU#TJ3IumPRRpn+*^C_rWzOhsP97$Bn1?5lz2)(nW}%lnvD(!8S}Ek>agB*WO4 z0-ghtosKWCmI<{Au3Hd|WT{EI+{Yt_D6YBB6Va?Q;c|lT9zpGN)_ig$XfI@!hGGPR&(VUUMj-4=vVuFe%rW4;K??n@sJe55GiRy(ez($0S7Mm>Du{g~lmmh59Bl*-q7A)QrtH;g* zDLwF0I@4Zy-kwMkmBsuu?P(2aj<#La0q+O;Z-&*bh4}p6v@7#P8c6ymsV@^LfLHvR^O_+nF?e=5l0k&*_(d*HHX&?!%Ab|6p#XS z1sqOPysIHK)BGB9o~6u|rV!8I8W34{IkoC^BJyyzjcaTo(#An=njj4tkoax(NQM{w zH!>(?HelKOd3P940g+K_7jT%B4|X6+bD!m!vbeVsuCpQ^97I7Lt~~Or;N>yzAm7~~ z4lI*k7d_&DdDO=4pYZ+(HQ_)V;vKwf5eo02feha;T$i)97yi2sI3|m05M&2=+wYfF z$28PwMwI`k-^CmFSlbXg)y4e7_XA;JPktZ}wUruJM=90!OpAK^J7&+V zb58DSe>c1@O56SL!m(+w%e2+Z?^N+O{HfDM-sEB+cl19EWG%gjSw(o@7W_5+U7MJn zN?Z12d5Zy0=i!3uP{OzJ43zQG>o0oF77nX1zyu#PxZvZ?sp#!#k1=U#=;zR?43}!2* zNHuiGq&R@0@s>xqp9V~ZCzRtFP_?eF@<9MgHMAJ-4G>rW2yO-@doUE(S@@uWP~y^c zh=B+PiVO8D0}ypa{|+P@-dj23#q26AbO&pP=5oMCPZ|UTGr&)xRIH%(-AF*}Ir2W9 z_JZ|yKRv~D{O!a;W$VyjLsf+7SXs=|U0#V74EdA!7Y;4zp6Na=**@+QVRgg4+Mr8m zo#<>FR_dB+kdq&0s+Cm!)?eCoqw&4LnbhPpDy$t*#an^=#LrK;IAwWIP=(e!P*!HY z3}2cv<7};+)*6iqPG?l&zRj7g=r<-?9HGTKB4Ebq2cO?fy5-uP`fcp|w5(~D+tZWp z3}4*O{HVXFQ8z#q3Z{ieoI;8`rBq+spZ~zoog`9$_)`Q7s(9ZJ8A!E1&D^gCtu_)( zT@Qd{SZ3boS=&p{(ix$foA=|G(8IJrH7I~0)4)SljDUSOS05X%4VGvgGv7Lb5FZH1 z0XNKbnDU|aC=lhQmjgbOep_+O2FmSa*r6l~u~fARoa+!WyPu$qfG>`CV;v7-9(ocK zF1@*ldA()o3hWX9kKUF=QHwpP3U&`}icUN&*aaA-UaQd+Vi1q}lG*&@>d4F_#i5@qfipP0UiA5Dq; z@J;__3cTNf%J%eA>XOh#>N;wi%}v25MAU&oL@r!_%e9lys|%4lCT+&-5N? zEwbZNDbvjSv|-(*^I@#%4<8L50kj;LJ=U&+GGdMUIMPMoH9ex#?-n?dRq$SPk7?`J z40=!5k51m!<-h>JDNdOWB^D3YQHV{|u*?Kq++;y^QEdP+hiDupC7G#4Mtu}}u(a0e zm?-;=<(zCJ@+DP0l8^yGPErdhXp5|qBxnQ8>s2B^GLrkJyARnl7+{_X8krbmlTKc* zfXdYBP-h5iKYsOa~!#^nOTz5wKky2IR14DgR5ZS3)84)up0t!`anksvGcPs4M za}UlcbO*T156}sgJ#mnGh}cA}f?5{X3MC7>n8T03Pye^BmyYIgvAw1 z!mnN5M9{E>+3;-!jLig%m=KW9oI$DE17fu?b|C-h`V2mKTD-#$tG` zf|DKe5OXkCqP*}ZI_F~~G$28)<^&YAs3GNC`sx89kB1*CC}LR&1d(H_VXNs)fOf1z zU!g)4m1_FHFVqdvY=XY0ya!ORu>J*IEWd0V1RkgC2o#+X05mBJHwk0PPAQN&nV9)Z zIn)10U#4s;V9<{DsR#?Te0-7c(RxAcek1-j268!7v*Xo)e39#Q^^W_mNd%_6&J=5L z)4VNh#~vs5m&u2ut(KDMbC_p#X@^h4d_MtEGkMge@#xge3{5qA&)J{6^7brO*It4H zgSMO_;5KMO^KHd#TeZ@wRya<$xYbW_J8%bS?SYk@H1mp zY9HWUXaHy3sfKz55Zv(`EZVR_YC`!IDA=ZrBcSUKTHR4oDBK-u$JGfq^3oJkzJ;(K zX89q8!|dud8!L_UfrLl?0I$RvgkMiV^D>7d*_B^Bt3r!;^2iu~0Gv6rM_}p!QX&@m zH0UbA0)Yzb5P?xZOpH!Ad?(C)IZ)H4biP7i0T9h$5di~(B2?XUolqqF_m!SplYjj! zV78u~!>PXf4HVmKS$%HO59w#ErGyeyr@E29AL}XG_|uD5US42pa(7?Ke4F9KoqCH0 zZ7F(v%W{mKg?-kPlnISQ85|s%ZQ|8tgQ%C5 z(;MS456PAbp|i;Cs4sht%7KjJ48h@g!Q{JPT69{cVF)+{U(VD#N@wrYL5l+C*kcwt ztV2CGLVlS#fqSrZ^31t)qY%NDsm|td{3k*~$Xzf$1q6Wt#l2I{FuWGcW7gX5wmrFz z5)J>0eVL*|Kjr-YyXT*L;eY#W(P?dC;rE}ded6_2>k(ZaW^Kt%5jHmXIIr%G%+PRd z&N{(E6OV-*R4qd=88l&o>Uh}og}mBj7-zVx26UZVBlxE9=e%nV?H4F*qcbAzzO@a) zopWey-7laR$pm@q%hCP8p1OlN;PD#cxmc9J12{07A-?80SJ-DrASd{Y9z>M1hhmS2ssI zc?zmh2Lwla-VKZOw`iz2J1vvsk7j^34B|zvP?X4n<>-Ri9b&4l%9x50fqqyOX1ot{ z%q?IG5ArZifL`swxdLdVUKaUBL9lj2GZKamUcLhBY#iE#s%$~j47glRV(u7KSx`jF z(SqHFmK@D*=)65?a0RxFEV+I7vPyJ$K?NtYuVgue_#EJ3kPK14TvT9Hp=A*aC|&NM zNX}X|Y)5?@xeXc;H#i>eIP`ntP|O<{u zsaGJCX@q@-sr`pv9e^Kk&N* z_Vz^^XT$V2n%P00qPiY{#S_6i*cQMbvSF!VpGs@>P9oi&iI<1lhXN9sQR)z)kO5l( zriC3idCQlZXL6B49f$Cn(f1sNPlH7bed@3S)A|S1&vveTO zfnaxl_;AvZ^5T+KKypA6;&1B%TlDjppfaBZA;%5&^{Z{+J+S+yNxA?2+h6_mq{ipt zwmX-vl78_L1a@i7-N2cee5T>uF#mh2C)0ueZ?CeY*UejYC0$Yyg7z_ ztZ?0D^v05RsDi_VbF&~6bf70oa;{*fObl?K<2NY6p;%#|b>mjf+E?%!BtQsx=vs4L zF9mzGh?g`X`z1OYqsi0Ef3BxR^D=Il+M{Ht^!gZHpdWPu7ktrtvtPqPP|2H+{ ze_i;=NvQu=dSvF4d;k4oPQKXw!is0~l0%0Chu(iyDzh=Xo-Pdh5SE@7Uf8<6w*pj# zt+Qjq_lar%_3)vN@Q;^?1?y@oAhG0;QXaAzWLZNj_zxJz0D#&tc8L-E3okc;0xe|n z&_3k3Cn&AFI;M_Y&LXmKm7$hr0NmUVxFz8mc%K?YT=kO=tik3$`mlhH_vhZ*Q1s;t zLmpiClBmTMhKjOe6_zS^v!ArlXdG~z(AWp;rSy~?kf`xc9D^l71?#_A{r|&{Ka*); zW`s`euh;+Q-&XRwoaGuXdLA<*X=U(k%^OG8Jt{u*@`KgFzG4HTyS58WkEmr@O2U-o z)LRd}Sz#F##Y}!;w*uG}nB8Z6p_%?jC(-Q*Da}Nfi|$+AN5hPtGN=Q=U8F`2s-dI( z4eLic*^B-jKz~Q!{*lDK4_100wQ~3NP$6gsI6)JyHR4%%&iQ!{z#Oe9o-pkQ7);(V z!rp`o0lx*Rls}k^$&f_=>hTB{JJZf-?8#39RrUTdb?|&O9uPD9yekk#!=e27-~Q{z z(~}|x|2Gf)*e%EH@xqj^^HzFUc$Fmdoz;vf$Ui2a#ZetuAsP03?!NLrruko1zq9-j z`v6!UWpe%&bAQ;WrdDNO1CLXbC9wvrb|@QMIP|G_$Kn*Mw=b%T=hXskhzGvIcCr#i z-o>oj(Z%cxeK=mp2!+?s?}RGSfR_!HVWKEbg+jXke z6BaGQJzlSdB+Ms#2!?S12ZNRwhGM~$ad}A%gs439mJzDhLux+}NAbWd56obQwgPTj z7_10EyT=2|K(-qkAo-azOiY?hw&urWj(?zXayDbVx2_{v;JlEcQrc4K|HyiWk9j@g= z#3dYr5?WsGYweINl5t9(nJQZL)G&Dnnazx1lVq6}-cQN#G2((6Q#&2x&o7%Jk!FhR zPC#49sO8b*1>+ z66q!=AMS+^Oig*piKxPTjr1a?Vf#%-W0>vluTNW!MZA!dP>Y<+%lbsku3L{iyFJvF zT&6k}v1V0`&b8@pX4Dh1&h`Ywa*i1bn!158*gH^9BFy1NkPjuo%lKslKao@O=({AN>EiF%?tY+pj}2Ft4{C=Cu^Er3}#%!Kfq8+SZ)ndVqA&XoGq@$4+&ESC!>auRYLU zlW7mi9P;Ain*7leZRV@)kk}vx3kRDXf#Dye=?5m{oqD#zdjrO?wKY#Z6>r2$V zedmwQYMplUaGHEQ*1Dr>ar!MSiA6KYj5)-Z&}rWXau~}x1G}|ZlrO@ujXk7 zPs{?mIzCMoloPqARyXz>G@juxE`i|ymOWt*K3E)ewjc*fLY8KMl#Lsi!Bxrp9eAPeyApH(XfdmB_1WKd;1v9!Cb(%{@h{3M1OqXO1TJfXRj8K7Jl=`n+;%ZcF$Ie0 zl93u+&2Z1|xrTP8cF(%=XRvE>xuVI&*n{F|E@h@!yDIBunxfj#TmYwQUK}S?E4A+= zK2X5G1C+{39wV0i+3TM#koH&FKK0;a&xR>|RN6OH7pm{wm`gIA2oI__uM3TL9~`5h ziSWz?X9&bF+W@jBJxoQ!v14J!Q)SX9+TJ0eQ6u1O@H?|Gmb8rA1^p7%csTUQby-Ze zP(AY=$b|LQiz_AdBHcOU1Hnt9Z-p90)=Hi!H|gt(OH0}-<2(1-`|{E9H6TF4?8>0H z$Ux`jirtmiNf(;SP9FUaXk7}_?rE1HyujKJ=@8A4F_DF=ZNz5yKY{8v#YlwG0zBTq z(0W*&GqvGGW=GSi$ANZ8u^ao0JXtOM>HjQd{;1{!g`r} zw>VdN-Sx|Szx?jZpP#gZR4>$9AAIm#PwKbvCyRnlH80jz3xcjt+aguP@?jZeIL7#N zebs8PJIdh6$TezuEZ12#;?U;_WS~You Win! + +

    Computer Chose ${computerChoice.charAt(0).toUpperCase() + computerChoice.slice(1)}

    + `; + } else if (winner === "computer") { + scoreboard.computer++; + result.innerHTML = + `

    You Lose!

    + +

    Computer Chose ${computerChoice.charAt(0).toUpperCase() + computerChoice.slice(1)}

    + `; + } else { + result.innerHTML = + `

    It's a draw!

    + +

    Computer Chose ${computerChoice.charAt(0).toUpperCase() + computerChoice.slice(1)}

    + `; + } + score.innerHTML = `
    +
    Player: ${scoreboard.player}
    +
    Computer: ${scoreboard.computer}
    +
    `; + // `

    Player: ${scoreboard.player}

    + //

    Computer: ${scoreboard.computer}

    + // `; + modal.style.display = "block"; +} +//Restart +function restartGame() { + scoreboard.player = 0; + scoreboard.computer = 0; + score.innerHTML = ` +
    +
    Player: 0
    +
    Computer: 0
    +
    + `; + restart.style.display = "none" +} + +//Clear modal +function clearModal(e) { + if (e.target == modal) { + modal.style.display = "none" + } +} + +//Event listeners +choices.forEach(choice => choice.addEventListener("click", play)); +window.addEventListener("click", clearModal); +restart.addEventListener("click", restartGame); diff --git a/Week2/Homework/codeAlong/rockPaperScissors/style.css b/Week2/Homework/codeAlong/rockPaperScissors/style.css new file mode 100644 index 000000000..6cc064d72 --- /dev/null +++ b/Week2/Homework/codeAlong/rockPaperScissors/style.css @@ -0,0 +1,108 @@ +@import url('https://fonts.googleapis.com/css?family=Patrick+Hand&display=swap'); + +*{ + margin: 0; + padding: 0; +} + +body { + font-family: 'Patrick Hand', cursive; + background-image: url("ropasc-bg.jpg"); + background-size: 100%; + background-position-y: 20%; +} +div.container { + margin-top: 20px; + margin-bottom: 20px; +} +h2 { + margin-top: 20px; + margin-bottom: 20px; +} + +p { + font-size: 1.5rem; +} +button#restart { + font-size: 1.2rem!important; +} + + +div.player { + border: 1px solid rgb(0, 80, 100); + background-color: rgb(0, 80, 100); + border-radius: 7px; + color: white; + font-size: 1.2rem; +} + +div.computer { + border: 1px solid rgb(0, 80, 100); + background-color: rgb(0, 80, 100); + border-radius: 7px; + color: white; + font-size: 1.2rem; +} +i.choice { + color: rgb(255, 146, 96); + cursor: pointer; +} +i.choice:hover { + color: rgb(247, 197, 174); + cursor: pointer; +} + +.text-win { + color: rgb(4, 80, 4); +} +.text-lose { + color: rgb(179, 24, 24); +} +.restart-btn { + display: none; + margin-bottom: 1rem; +} +:root { + --modal-duration: 1s; +} +.my-modal { + display:none; + position: fixed; + left: 0; + top: 0; + height: 100%; + width: 100%; + overflow: auto; + background: rgba(0,0,0,0.4); + z-index: 1; +} +.modal-content { + background: lavenderblush; + text-align: center; + margin: 10% auto; + width: 400px; + border-radius: 20px; + border: 2px solid lavenderblush; + padding: 3rem; + box-shadow: 0 5px 8px 0 rgba(0,0,0,0.2),0 7px 20px 0 rgba(0,0,0,0.17) ; + animation-name: modalopen; + animation-duration: var(--modal-duration); + +} +.modal-content h1 { + margin-bottom: 1rem; +} +.modal-content p { + font-size: 1.2rem; + margin-top: 1rem; +} + +@keyframes modalopen { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + diff --git a/Week2/Homework/js-exercises/collectiveAge.js b/Week2/Homework/js-exercises/collectiveAge.js new file mode 100644 index 000000000..30c41cd4c --- /dev/null +++ b/Week2/Homework/js-exercises/collectiveAge.js @@ -0,0 +1,12 @@ +"use strict" +const hackYourFutureMembers = [ + { name: 'Wouter', age: 33 }, + { name: 'Federico', age: 32 }, + { name: 'Noer', age: 27 }, + { name: 'Tjebbe', age: 22 }, +]; + +let collectiveAge = hackYourFutureMembers.reduce(function (acc, cur) { + return acc + cur.age; +}, 0); +console.log(`The collective age of the HYF team is: ${collectiveAge}`) \ No newline at end of file diff --git a/Week2/Homework/js-exercises/favoriteHobbies/favoriteHobbies.js b/Week2/Homework/js-exercises/favoriteHobbies/favoriteHobbies.js new file mode 100644 index 000000000..14339aa9b --- /dev/null +++ b/Week2/Homework/js-exercises/favoriteHobbies/favoriteHobbies.js @@ -0,0 +1,20 @@ +"use strict" +const myHobbies = [ + 'Meditation', + 'Reading', + 'Programming', + 'Hanging out with friends', + 'Going to the gym', +]; + +let newUl = document.createElement("ul"); +document.body.appendChild(newUl) + +function hobbiesIntoList() { + myHobbies.forEach(function (item) { + let newLi = document.createElement("li"); + newLi.innerHTML = item; + newUl.appendChild(newLi); + }) +} +hobbiesIntoList(); diff --git a/Week2/Homework/js-exercises/favoriteHobbies/hobbies.html b/Week2/Homework/js-exercises/favoriteHobbies/hobbies.html new file mode 100644 index 000000000..6542da51f --- /dev/null +++ b/Week2/Homework/js-exercises/favoriteHobbies/hobbies.html @@ -0,0 +1,15 @@ + + + + + + Favorite Hobbies + + + + + + + + + \ No newline at end of file diff --git a/Week2/Homework/js-exercises/lemonAllergy.js b/Week2/Homework/js-exercises/lemonAllergy.js new file mode 100644 index 000000000..2d10e3dd0 --- /dev/null +++ b/Week2/Homework/js-exercises/lemonAllergy.js @@ -0,0 +1,4 @@ +"use strict" +const fruitBasket = ['Apple', 'Lemon', 'Grapefruit', 'Lemon', 'Banana', 'Watermelon', 'Lemon']; +let fruitsWithoutLemons = fruitBasket.filter(fruit => fruit !== 'Lemon'); +console.log(`My mom bought me a fruit basket, containing ${fruitsWithoutLemons.join(", ")}`) \ No newline at end of file diff --git a/Week2/Homework/js-exercises/mondayWorth.js b/Week2/Homework/js-exercises/mondayWorth.js new file mode 100644 index 000000000..0199a1738 --- /dev/null +++ b/Week2/Homework/js-exercises/mondayWorth.js @@ -0,0 +1,21 @@ +"use strict" +const mondayTasks = [ + { + name: 'Daily standup', + duration: 30, // specified in minutes + }, + { + name: 'Feature discussion', + duration: 120, + }, + { + name: 'Development time', + duration: 240, + }, + { + name: 'Talk to different members from the product team', + duration: 60, + }, +]; + + diff --git a/Week2/Homework/js-exercises/oddOnesOut.js b/Week2/Homework/js-exercises/oddOnesOut.js new file mode 100644 index 000000000..8833530bb --- /dev/null +++ b/Week2/Homework/js-exercises/oddOnesOut.js @@ -0,0 +1,4 @@ +"use strict" +const myNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +let doubleEvenNumbers = myNumbers.filter(item => item % 2 === 0).map(item => item * 2); +console.log(doubleEvenNumbers); \ No newline at end of file diff --git a/Week2/Homework/maartjes-work.js b/Week2/Homework/maartjes-work.js new file mode 100644 index 000000000..49772eb44 --- /dev/null +++ b/Week2/Homework/maartjes-work.js @@ -0,0 +1,65 @@ +'use strict'; + +const monday = [ + { + name: 'Write a summary HTML/CSS', + duration: 180, + }, + { + name: 'Some web development', + duration: 120, + }, + { + name: 'Fix homework for class10', + duration: 20, + }, + { + name: 'Talk to a lot of people', + duration: 200, + }, +]; + +const tuesday = [ + { + name: 'Keep writing summary', + duration: 240, + }, + { + name: 'Some more web development', + duration: 180, + }, + { + name: 'Staring out the window', + duration: 10, + }, + { + name: 'Talk to a lot of people', + duration: 200, + }, + { + name: 'Look at application assignments new students', + duration: 40, + }, +]; + +const maartjesTasks = monday.concat(tuesday); +const maartjesHourlyRate = 20; + +function computeEarnings(tasks, hourlyRate) { + // Replace this comment and the next line with your code + console.log(tasks, hourlyRate); +} + +// eslint-disable-next-line no-unused-vars +const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); + +// add code to convert `earnings` to a string rounded to two decimals (euro cents) + +console.log(`Maartje has earned €${'replace this string with the earnings rounded to euro cents'}`); + +// Do not change or remove anything below this line +module.exports = { + maartjesTasks, + maartjesHourlyRate, + computeEarnings, +}; diff --git a/Week2/Homework/map-filter.js b/Week2/Homework/map-filter.js new file mode 100644 index 000000000..c8e8a88c1 --- /dev/null +++ b/Week2/Homework/map-filter.js @@ -0,0 +1,15 @@ +'use strict'; + +function doubleOddNumbers(numbers) { + // Replace this comment and the next line with your code + console.log(numbers); +} + +const myNumbers = [1, 2, 3, 4]; +console.log(doubleOddNumbers(myNumbers)); + +// Do not change or remove anything below this line +module.exports = { + myNumbers, + doubleOddNumbers, +}; diff --git a/Week2/Homework/project-PomodoroClock/index.html b/Week2/Homework/project-PomodoroClock/index.html new file mode 100644 index 000000000..19c1fc7c4 --- /dev/null +++ b/Week2/Homework/project-PomodoroClock/index.html @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + Pomodoro Clock + + + +
    +
    +

    Pomodoro Clock

    +

    Session Length

    +
    +

    25

    + +
    +
    +

    Session

    +

    25:00

    + + +
    +
    +
    + + +
    + + + + + + + + \ No newline at end of file diff --git a/Week2/Homework/project-PomodoroClock/script.js b/Week2/Homework/project-PomodoroClock/script.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week2/Homework/project-PomodoroClock/style.css b/Week2/Homework/project-PomodoroClock/style.css new file mode 100644 index 000000000..b72381d06 --- /dev/null +++ b/Week2/Homework/project-PomodoroClock/style.css @@ -0,0 +1,67 @@ +@import url('https://fonts.googleapis.com/css?family=Fredoka+One&display=swap'); +@import url('https://fonts.googleapis.com/css?family=Orbitron&display=swap'); + +*{ + margin: 0; + padding: 0; +} + +body { + font-family: 'Fredoka One', cursive; + background-color: rgb(201, 44, 44); + color: white; +} +.in-the-box { + margin: 15px; + padding: 15px; + height: 700px; +} +.length-button { + font-size: 2.7rem; + color: white; +} +.length-button:link { + color: white; +} +.length-button:visited { + color: white; +} +.length-button:hover { + color: sandybrown; +} +.length-button:active { + color: sandybrown; +} + + +.timer { + font-family: 'Orbitron', sans-serif; + border: 15px solid rgb(121, 33, 33) ; + border-radius: 50%; + width: 400px; + height: 400px; +} +.time-buttons { + font-size: 2.2rem; + margin: 3px 10px 3px 10px; + color: white; +} +.time-buttons:link { + color: white; +} +.time-buttons:visited { + color: white; +} +.time-buttons:hover { + color: sandybrown; +} +.time-buttons:active { + color: sandybrown; +} +#pomodoro { + position: absolute; + top: 120px; + left: 5vw; + height: 500px; + transform: rotate(20deg); +} diff --git a/Week2/LESSONPLAN.md b/Week2/LESSONPLAN.md new file mode 100644 index 000000000..bdafc5991 --- /dev/null +++ b/Week2/LESSONPLAN.md @@ -0,0 +1,203 @@ +# Lesson Plan JavaScript2 Week 2 + +## Agenda + +The purpose of this class is to introduce to the student: + +- What synchronous vs. asynchronous processes are +- What callbacks are and how to write your own +- How the event loop works +- Show 3 commonly used array functions (filter, reduce, map) + +## Core concepts + +FIRST HALF (12.00 - 13.30) + +## 1. Q&A about last week's concepts & homework + +- DOM +- DOM manipulation +- browser defined functions + +Note: You can ask students to explain a concept or summerise the last lecture themselves + +## 2. What synchronous vs. asynchronous processes are + +### Explanation + +### Example + +### Exercise + +### Essence + +Notes: + +- Synchronous refers to a linear execution process: one step at a time +- Asynchronous helps us do multiple things in parallel + +## 3. Callbacks + +### Explanation + +A callback in JavaScript is basically a function(callback) being passed as a parameter to another function which after some point of time would execute the function passed or invoke the callback. + +Callbacks were primarily introduced in JavaScript to achieve asynchronous behaviour +(https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced) + +### Example + +Consider a situation where person A wishes to go out for a movie with a friend person B one evening. Person A finds out the time and place and now needs to share it with B. A picks up the phone and tries to call B. Let's say that B is currently busy with some work and can't answer the phone. Person A has now got two options. One option is to stay on the line until B picks up the phone and then share the movie details. Or A could drop a voicemail and ask B to **callback** once free. + +```javascript +function doHomework(subject, callback) { + alert(`Starting my ${subject} homework.`); + callback(); +} +function alertFinished() { + alert('Finished my homework'); +} +doHomework('math', alertFinished); +``` + +more examples (made by Yash): https://github.com/HackYourFuture/JavaScript2/blob/master/assets/callbacks.js + +### Exercise + +#### 1. What will happen? + +#### 2. How to turn the output order around? + +```javascript +function first() { + // Simulate a code delay + setTimeout(function() { + console.log(1); + }, 500); +} +function second() { + console.log(2); +} + +first(); +second(); +``` + +### Essence + +you can’t just call one function after another and hope they execute in the right order. Callbacks are a way to make sure certain code doesn’t execute until other code has already finished execution. + +SECOND HALF (14.00 - 16.00) + +## 4. Event loops + +### Explanation + +https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/event_loop.md + +### Example + +```Javascript +const bar = () => console.log('bar') + +const baz = () => console.log('baz') + +const foo = () => { + console.log('foo') + bar() + baz() +} + + +foo() +``` + +Output: + +```Javascript +foo +bar +baz +``` + +Call stack +![Call Stack](../assets/call_stack_example.png) + +### Exercise + +### Essence + +## 5. filter, reduce, map + +### Explanation + +**map**, **filter** and **reduce** are three array methods that iterate (loop!) over the whole array and preform a computation or a transformation. +They have in common that they return a new array based on the transformations/calculations. + +> [MDN definition](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map): The **map()** method creates a new array with the results of calling a provided function on every element in the calling array. + +> [MDN definition](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter): The **filter()** method creates a new array with all elements that pass the test implemented by the provided function + +> [MDN definition](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce): The **reduce()** method executes a **reducer** function (that you provide) on each member of the array resulting in a single output value†. + +Writing the functions yourself: https://github.com/HackYourFuture/fundamentals/blob/master/fundamentals/map_filter.md + +### Example + +```Javascript +const numbers = [1, 2, 3, 4]; +const square = x => x * x; +const squaredNumbers = numbers.map(square); + +console.log(squaredNumbers); // -> [ 1, 4, 9, 16 ] +``` + +```Javascript +const numbers = [1, 2, 3, 2]; +const isTwo = x => x === 2; +const Twos = numbers.filter(isTwo); + +console.log(Twos); // -> [ 2, 4 ] +``` + +```Javascript +const numbers = [1, 2, 3, 4]; + +const sum = (a, b) => a + b; +const total = numbers.xxx(sum, 0); + +console.log(total); // -> 10 +``` + +### Exercise + +Fill in the xxx with map, filter or reduce: + +```Javascript +const numbers = [1, 2, 3, 4]; +const doubled = numbers.xxx(item => item * 2); +console.log(doubled); // [2, 4, 6, 8] +``` + +```Javascript +const numbers = [1, 2, 3, 4]; + +const times = (a, b) => a * b; +const total = numbers.xxx(times, 0); + +console.log(total); // -> 10 +``` + +```Javascript +const numbers = [1, 2, 3, 4]; +const evens = numbers.xxx(item => item % 2 === 0); +console.log(evens); // [2, 4] +``` + +Yash made a very nice exercise (with answers): +https://github.com/yash-kapila/HYF-JS2-Week2/tree/master/src + +### Essence + +Easy methodes to transform arrays, wich you'll have to do quite often, while keeping the original array intact. +You can see it as a shortcut. Of course you can write these methodes yourself many times, but 'they' already did it for you diff --git a/Week2/MAKEME.md b/Week2/MAKEME.md new file mode 100644 index 000000000..0e30a020c --- /dev/null +++ b/Week2/MAKEME.md @@ -0,0 +1,168 @@ +# Homework JavaScript2 Week 2 + +## **Todo list** + +1. Practice the concepts +2. JavaScript exercises +3. Code along +4. PROJECT: The Pomodoro Clock + +## **1. Practice the concepts** + +Before we head into the exercises, it might be nice to do some interactive exercises first! In the following resource you'll find some exercises that'll teach you all about callbacks and array functions! + +- [Learn JavaScript: Iterators](https://www.codecademy.com/learn/introduction-to-javascript/modules/learn-javascript-iterators) + +## **2. JavaScript exercises** + +> Inside of your `JavaScript2` fork, create a folder called `week2`. Inside of that folder, create a folder called `js-exercises`. For all the following exercises create a new `.js` file in that folder (5 files in total). Make sure the name of each file reflects its content: for example, the filename for exercise one could be `oddOnesOut.js`. + +**Exercise 1: The odd ones out** + +Look at the following code snippet: + +```js +function doubleEvenNumbers(numbers) { + const newNumbers = []; + for (let i = 0; i < numbers.length; i++) { + if (numbers[i] % 2 === 0) { + newNumbers.push(numbers[i] * 2); + } + } + return newNumbers; +} + +const myNumbers = [1, 2, 3, 4]; +console.log(doubleEvenNumbers(myNumbers)); // Logs "[4, 8]" to the console +``` + +The `doubleEvenNumbers` function returns only the even numbers in the array `myNumbers` and doubles them. Like you've learned in the [README](README.md), this block of code isn't easy to decipher. + +Let's rewrite it. + +- Using the `map` and `filter` functions, rewrite the `doubleEvenNumbers` function. + +**Exercise 2: What's your Monday worth?** + +When you're a developer at a big company your Monday could look something like this: + +```js +const mondayTasks = [ + { + name: 'Daily standup', + duration: 30, // specified in minutes + }, + { + name: 'Feature discussion', + duration: 120, + }, + { + name: 'Development time', + duration: 240, + }, + { + name: 'Talk to different members from the product team', + duration: 60, + }, +]; +``` + +Let's assume your hourly rate is €25. How much would you earn on that day? + +- Write a program that finds out what your hourly rate on a Monday would be +- Use the `map` array function to take out the duration time for each task. +- Multiply each duration by a per-hour rate for billing and sum it all up. +- Output a formatted Euro amount, rounded to Euro cents, e.g: `€11.34`. +- Make sure the program can be used on any array of objects that contain a `duration` property with a number value + +**Exercise 3: Lemon allergy** + +Your mom bought you a basket of fruit, because you're doing so well in HackYourFuture. How sweet of her! + +```js +const fruitBasket = ['Apple', 'Lemon', 'Grapefruit', 'Lemon', 'Banana', 'Watermelon', 'Lemon']; +``` + +However, she forgot that you are allergic to lemons! Let's quickly dispose of them before you get an attack. + +- Write a function +- Use the `filter` array function to take out the lemons +- Output a string that says: "My mom bought me a fruit basket, containing [array of fruits] !" + +**Exercise 4: Collective age** + +Have you ever wondered how old the HackYourFuture team members are? Or better yet: what the collective age is? Let's find out! + +```js +const hackYourFutureMembers = [ + { name: 'Wouter', age: 33 }, + { name: 'Federico', age: 32 }, + { name: 'Noer', age: 27 }, + { name: 'Tjebbe', age: 22 }, +]; +``` + +- Write a program that calculates the combined age of every member +- Make use of the `map` function to get the ages +- It should contain a function that takes a callback +- The callback adds all the ages together and returns the number +- The main function should log the string "The collective age of the HYF team is: [number]" to the console, and afterwards return the number + +**Exercise 5: My favorite hobbies** + +I've got a couple of hobbies that I want to showcase in a webpage. + +```js +const myHobbies = [ + 'Meditation', + 'Reading', + 'Programming', + 'Hanging out with friends', + 'Going to the gym', +]; +``` + +- Write a program that outputs each of these inside an HTML file +- Create an HTML and JavaScript file, link them together +- Use the `map` and/or `forEach` function to put each hobby into a list item +- Output the list items in an unordered list + +## **3. Code along** + +Programming can be used to not only make websites, but also games! In the following tutorial you're going to apply your DOM manipulation skills in order to make a classic game: Rock, Paper, Scissors! Enjoy! + +- [Build a Rock, Paper, Scissors Game](https://www.youtube.com/watch?v=WR_pWXJZiRY) + +## **4. PROJECT: The Pomodoro Clock** + +> Every week ends with a project you have to build on your own. Instead of getting clear-cut instructions, you'll get a list of criteria that your project needs to measure up to. + +> Before you start, create a new folder called `project` that includes the files for the following app you'll be building. + +In this week's project you'll be making a Pomodoro Clock! A user can specify how many minutes the timer should be set, and with a click on the play button it starts counting down! If the user wants to pause the timer, they can do so by clicking the pause button. + +It should look like this: + +![Pomodoro Clock](../assets/pomodoro.png) + +Here are the requirements: + +- If the timer is running, the user can't change the session length anymore +- Use at least 3 functions +- Display minutes and seconds +- If the timer finishes the timer should be replaced by the message: `Time's up!` + +Good luck! + +## **SUBMIT YOUR HOMEWORK!** + +After you've finished your todo list it's time to show us what you got! The homework that needs to be submitted is the following: + +1. JavaScript exercises +2. PROJECT: The Pomodoro Clock + +Upload both to your forked JavaScript2 repository in GitHub. Make a pull request to the original repository. + +> Forgotten how to upload your homework? Go through the [guide](../hand-in-homework-guide.md) to learn how to do this again. + +_Deadline Saturday 23.59 CET_ diff --git a/Week2/README.md b/Week2/README.md new file mode 100644 index 000000000..808de176e --- /dev/null +++ b/Week2/README.md @@ -0,0 +1,159 @@ +# Reading Material JavaScript2 Week 2 + +## Agenda + +These are the topics for week 2: + +1. Synchronous vs. asynchronous + - Synchronous + - Asynchronous +2. Introducing asynchronicity using callbacks + - Higher order functions + - Functions as arguments to other functions +3. Array Functions +4. Event Loop + +## 1. Synchronous vs. asynchronous + +### Synchronous + +In the previous module you've learned about **control flow**. In short: it's the order in which the computer executes statements in a script. In JavaScript this goes from left to right, top to bottom. + +Let's look at code execution from another angle. The program that executes your code can do it in two basic ways: synchronous or asynchronous. Whenever code blocks are executed line after line (from top to bottom) we call this **synchronous execution**. However, when code blocks can be executed **without having to wait until a command ends**, we call this **asynchronous execution**. This is illustrated in the following diagram: + +![Sync vs. Async](../assets/javascript-sync-vs-async.png) + +Now imagine the following scenario: + +> Noer wants to have breakfast but he doesn't have any food at home. He decides he want to eat oatmeal. The ingredients (oats and milk) can be bought at the supermarket. How to do this? First Noer takes a shower. Then he puts on some clothes. Then some shoes. Then he opens the door and goes outside. Then he jumps on the bike and goes to the closest supermarket. After looking for some time he finds the ingredients. Then Noer buys the ingredients. Then he jump back on the bike and go home. Then he mixes the ingredients and makes oatmeal. Then Noer eats and feels amazing! + +In this example, each action could only happen after the previous has been completed. Noer can't put on his shoes, while taking a shower. Or, he can't eat oatmeal while he buys the ingredients. + +As you can see, each action is executed in a synchronous manner. This is to say: in a logical order sequentially and only one action at a time. + +**This is also how JavaScript by default operates**. Only one operation can happen at a time. If something else wants to start, it has to wait until the current action has finished. + +### Asynchronous + +Sometimes we want to do multiple things at the same time, without each action to be dependent on each other. Asynchronous execution avoids this bottleneck. You are essentially saying, “I know this function call is going to take a great deal of time, but my program doesn’t want to wait around while it executes.” Consider the following scenario: + +> Wouter is feeling hungry, so he decides to go to a restaurant. He arrives there and gets into the line to order food. After ordering he takes a seat and, while he waits, reads a book. Occassionally he looks around and sees different things happening: new people enter the restaurant, some people get their food served and others are just talking. After a short while Wouter's food arrives and it's time to dig in! + +In this example Wouter reads a book, but that doesn't affect his meal from being prepared. While his meal is prepared there are other people walking around, eating or just talking with each other. In short: multiple things are happening simultaneously and every event is not dependent upon another. + +This does not happen by default in JavaScript, and needs to be invoked. A way to do that is by using `callbacks`, which you'll be learning about in the next section. + +## 2. Introducing asynchronicity using callbacks + +Before we dive into what a `callback` is we have to understand a little about `higher order functions`. + +### Higher order functions + +Let's start with a simple, practical definition: a higher order function is any function that can take another function as an argument or returns a function. + +```js +// Example 1 +function higherOrderFunction(anotherFunction) { + anotherFunction(); + return; +} + +// Example 2 +function anotherHigherOrderFunction() { + return function() { + return; + }; +} +``` + +Why do we need them? A higher order function integrates multiple functions, which each have a singular operational purpose. This will allow us to reuse code much more than if we had to write everything out. + +> Higher order functions are a core concept within a programming paradigm called "functional programming". It's not relevant at all for you to know or care about this, but it's important to be exposed to it. + +### Functions as arguments to other functions + +Imagine the following situation: + +> It's 15.00 and you're studying at home for an exam on the next day. Suddenly, your phone rings. You pick up and find it's your best friend! They ask if you'd like to hang out later. What do you do? On the one hand, you'd love to hang out have fun. On the other hand, you really should study some more. You don't know so you tell your friend that you're going to _call back_ later with your answer. You end the conversation and go back to studying. Maybe you take a break or have a snack as well. On the other line your friend hangs up the phone and continues along with their day: they go out grocery shopping, cleaning the house and cooking dinner. After finishing your studies you call your friend and makes plans to go out together. + +This example illustrates the concept of **asynchronicity**: there are multiple processes happening simultaneously, without any single thing being dependent upon another. Your friend is not waiting by the phone until you have the answer. Or in technical terms: until the callback (which is you) has the return value (the answer to your friend's request to hang out). + +This is the utility of `callbacks`: they allow us to introduce asynchronicity into the control flow of an application. + +Study the following resources to learn more about the importance of callbacks: + +- [Asynchronous JavaScript](https://www.youtube.com/watch?v=YxWMxJONp7E) +- [Understanding JavaScript Callbacks](https://www.youtube.com/watch?v=Nau-iEEgEoM) +- [Callback Functions](https://www.youtube.com/watch?v=QRq2zMHlBz4) + +## 3. Array Functions + +There are different ways of dealing with arrays. The most common way is by using a loop and then writing custom logic inside it in order to manipulate the values. This solution works, but it comes at several disadvantages. + +1. The first disadvantage is that using loops requires us to write custom logic for each use case. This can lead to repeated code, which we always want to [avoid](https://www.youtube.com/watch?v=IGH4-ZhfVDk) +2. The second disadvantage is that a loop isn't descriptive about what it intends to do. If another developer reads that code it wouldn't be obvious what it would do, without spending time on it to decipher it + +There are certain functions, `array functions`, that aim to solve these two problems simultaneously. Array functions are higher order functions, because they take a function as an argument. + +Let's take an example: the `map()` function. It takes a function as an argument, and executes that unto each index position of the array, returning at the end a new array with all the "mapped" values. + +Take a look at the following code snippet to see it in action: + +```js +const numbers = [2, 4, 6, 8, 10]; + +function addTwo(number) { + return number + 2; +} + +const numbersPlusTwo = numbers.map(addTwo); + +console.log(numbersPlusTwo); +``` + +Copy and paste this snippet in the browser console to see how it works. As you can see the function `addTwo` added 2 to each value in the `numbers` array, because that's what the `map()` function does: it "maps" a function unto each array index. + +We could've done the same thing with a regular loop, but that would've been (1) much less readable, and (2) much more code: + +```js +const numbers = [2, 4, 6, 8, 10]; +const numbersPlusTwo = []; + +for (let i = 0; i < numbers.length; i++) { + const number = numbers[i]; + const addedTwo = number + 2; + + numbersPlusTwo.push(addedTwo); +} + +console.log(numbersPlusTwo); +``` + +Can you see why the array function is the better way to go? + +Go through the following resources to learn more about the different array functions and their use: + +- [JavaScript Higher Order Functions & Arrays](https://www.youtube.com/watch?v=rRgD1yVwIvE) +- [8 Must Know JavaScript Array Methods](https://www.youtube.com/watch?v=R8rmfD9Y5-c) + +## 4. Event Loop + +If a webpage contains JavaScript, then the browser knows it has to execute the instructions contained in the script files. But how does the browser know what to do first? This is where the `Event Loop` comes in. + +Note: while this mechanism is important to be aware of, keep in mind that you won't be using it actively in development. + +In simple terms, the `Event Loop` is a mechanism that operates in the browser. It keeps track of the order of execution of JavaScript commands. consists of 4 parts: + +1. Heap. This is where the browser assigns space in memory to each process +2. Call Stack. This is the amount of JavaScript commands (read: function calls and events) that need to be executed +3. Web APIs. These are objects (like the document) and functions (like XMLHttpRequest) that can be used within the JavaScript commands found in the Call Stack +4. Callback Queue. This is the "waiting line" for asynchronous function calls + +To see it in action check out the following resources: + +- [What the heck is an event loop?](https://www.youtube.com/watch?v=8aGhZQkoFbQ) +- [JavaScript Event Loop](https://www.youtube.com/watch?v=XzXIMZMN9k4) + +## Finished? + +Are you finished with going through the materials? High five! If you feel ready to get practical, click [here](./MAKEME.md). diff --git a/Week2/test/maartjes-work.test.js b/Week2/test/maartjes-work.test.js new file mode 100644 index 000000000..ab6bc2a44 --- /dev/null +++ b/Week2/test/maartjes-work.test.js @@ -0,0 +1,9 @@ +const { maartjesTasks, maartjesHourlyRate, computeEarnings } = require(`../homework/maartjes-work`); + +describe('maartjes_work', () => { + test('earnings rounded to euro cents', () => { + const earnings = computeEarnings(maartjesTasks, maartjesHourlyRate); + const result = earnings.toFixed(2); + expect(result).toBe('373.33'); + }); +}); diff --git a/Week2/test/map-filter.test.js b/Week2/test/map-filter.test.js new file mode 100644 index 000000000..e4cb83906 --- /dev/null +++ b/Week2/test/map-filter.test.js @@ -0,0 +1,8 @@ +const { myNumbers, doubleOddNumbers } = require(`../homework/map-filter`); + +describe('map_filter', () => { + test('result -> [2, 6]', () => { + const result = doubleOddNumbers(myNumbers); + expect(result).toEqual([2, 6]); + }); +}); From 5606a312855ac9357b42016f5d63fabd5033e6f7 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sun, 9 Feb 2020 19:25:06 +0200 Subject: [PATCH 11/16] some details left for pomodoro --- Week2/Homework/js-exercises/mondayWorth.js | 10 ++++ .../Homework/project-PomodoroClock/index.html | 12 ++--- .../Homework/project-PomodoroClock/script.js | 52 +++++++++++++++++++ .../Homework/project-PomodoroClock/style.css | 3 +- .../codeAlong/booklist-app/index.html | 0 Week3/homework/codeAlong/booklist-app/main.js | 0 .../homework/codeAlong/booklist-app/style.css | 0 Week3/homework/js-exercises/addSix.js | 4 ++ Week3/homework/js-exercises/guessMore.js | 4 ++ Week3/homework/js-exercises/guessOutput.js | 4 ++ Week3/homework/js-exercises/lotteryMachine.js | 11 ++++ .../homework/js-exercises/removeDuplicates.js | 8 +++ .../homework/project-TipCalculator/index.html | 0 Week3/homework/project-TipCalculator/main.js | 0 .../homework/project-TipCalculator/style.css | 0 15 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 Week3/homework/codeAlong/booklist-app/index.html create mode 100644 Week3/homework/codeAlong/booklist-app/main.js create mode 100644 Week3/homework/codeAlong/booklist-app/style.css create mode 100644 Week3/homework/js-exercises/addSix.js create mode 100644 Week3/homework/js-exercises/guessMore.js create mode 100644 Week3/homework/js-exercises/guessOutput.js create mode 100644 Week3/homework/js-exercises/lotteryMachine.js create mode 100644 Week3/homework/js-exercises/removeDuplicates.js create mode 100644 Week3/homework/project-TipCalculator/index.html create mode 100644 Week3/homework/project-TipCalculator/main.js create mode 100644 Week3/homework/project-TipCalculator/style.css diff --git a/Week2/Homework/js-exercises/mondayWorth.js b/Week2/Homework/js-exercises/mondayWorth.js index 0199a1738..5950ca673 100644 --- a/Week2/Homework/js-exercises/mondayWorth.js +++ b/Week2/Homework/js-exercises/mondayWorth.js @@ -18,4 +18,14 @@ const mondayTasks = [ }, ]; +function mondayWorth() { + let totalRate = mondayTasks.map(function (activity) { + //Converting each duration to hours and multiplying by hourly rate + return (activity.duration / 60) * 25 + //Adding all rates + }).reduce(function (acc, cur) { + return acc + cur; + }, 0) + return `€${+totalRate.toFixed(2)}`; +} diff --git a/Week2/Homework/project-PomodoroClock/index.html b/Week2/Homework/project-PomodoroClock/index.html index 19c1fc7c4..58b0e4e50 100644 --- a/Week2/Homework/project-PomodoroClock/index.html +++ b/Week2/Homework/project-PomodoroClock/index.html @@ -20,15 +20,15 @@

    Pomodoro Clock

    Session Length

    - -

    25

    - + +

    25

    +

    Session

    -

    25:00

    - - +

    25:00

    + +
    diff --git a/Week2/Homework/project-PomodoroClock/script.js b/Week2/Homework/project-PomodoroClock/script.js index e69de29bb..3bf37739f 100644 --- a/Week2/Homework/project-PomodoroClock/script.js +++ b/Week2/Homework/project-PomodoroClock/script.js @@ -0,0 +1,52 @@ +"use strict" +//DOM elements selection +const lengthUp = document.querySelector("#length-up"); +const lengthDown = document.querySelector("#length-down"); +const lengthDisplay = document.querySelector("#length-display"); +const play = document.querySelector("#play"); +const pause = document.querySelector("#pause"); +const duration = document.querySelector("#duration"); +const minutes = document.querySelector("#min"); +const seconds = document.querySelector("#sec"); + + +//Increasing and decreasing the session length +lengthUp.addEventListener("click", () => { + let plusOne = parseInt(lengthDisplay.innerHTML) + 1; + lengthDisplay.innerHTML = plusOne; + duration.innerHTML = `${lengthDisplay.innerHTML}:00` +}); +lengthDown.addEventListener("click", () => { + let minusOne = parseInt(lengthDisplay.innerHTML) - 1; + lengthDisplay.innerHTML = minusOne; + duration.innerHTML = `${lengthDisplay.innerHTML}:00` +}) + +//Start timer +let counter = {} + +play.addEventListener("click", function () { + counter.end = parseInt(minutes.innerHTML); + + counter.min = minutes; + counter.sec = seconds; + + if (counter.end > 0) { + counter.ticker = setInterval(function () { + counter.end--; + if (counter.end <= 0) { + clearInterval(counter.ticker); + counter.end = 0; + } + let secRemain = counter.end; + let minRemain = Math.floor(secRemain / 60); + secRemain -= minRemain * 60; + + counter.min.innerHTML = minRemain; + counter.sec.innerHTML = secRemain; + }, 1000); + } +}); + + + diff --git a/Week2/Homework/project-PomodoroClock/style.css b/Week2/Homework/project-PomodoroClock/style.css index b72381d06..5c24f7194 100644 --- a/Week2/Homework/project-PomodoroClock/style.css +++ b/Week2/Homework/project-PomodoroClock/style.css @@ -19,6 +19,7 @@ body { .length-button { font-size: 2.7rem; color: white; + cursor: pointer; } .length-button:link { color: white; @@ -33,7 +34,6 @@ body { color: sandybrown; } - .timer { font-family: 'Orbitron', sans-serif; border: 15px solid rgb(121, 33, 33) ; @@ -45,6 +45,7 @@ body { font-size: 2.2rem; margin: 3px 10px 3px 10px; color: white; + cursor: pointer; } .time-buttons:link { color: white; diff --git a/Week3/homework/codeAlong/booklist-app/index.html b/Week3/homework/codeAlong/booklist-app/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/Week3/homework/codeAlong/booklist-app/main.js b/Week3/homework/codeAlong/booklist-app/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week3/homework/codeAlong/booklist-app/style.css b/Week3/homework/codeAlong/booklist-app/style.css new file mode 100644 index 000000000..e69de29bb diff --git a/Week3/homework/js-exercises/addSix.js b/Week3/homework/js-exercises/addSix.js new file mode 100644 index 000000000..d2138c481 --- /dev/null +++ b/Week3/homework/js-exercises/addSix.js @@ -0,0 +1,4 @@ +"use strict" +function createBase() { + +} \ No newline at end of file diff --git a/Week3/homework/js-exercises/guessMore.js b/Week3/homework/js-exercises/guessMore.js new file mode 100644 index 000000000..1e4fb1783 --- /dev/null +++ b/Week3/homework/js-exercises/guessMore.js @@ -0,0 +1,4 @@ +//f1(x) --> 10 | The function adds 1 to the value of the variable x +//console.log(x); --> 9 | It just prints out the initial variable +//f2(y) --> {x:10} | The function adds 1 to the value of the key x (object) +//console.log(y); --> {x:9} | It prints out the value of the variable which is an object \ No newline at end of file diff --git a/Week3/homework/js-exercises/guessOutput.js b/Week3/homework/js-exercises/guessOutput.js new file mode 100644 index 000000000..cc099fa36 --- /dev/null +++ b/Week3/homework/js-exercises/guessOutput.js @@ -0,0 +1,4 @@ +//It will return 12. +//The variable a inside the function x scope takes the value of 12. +//So the function with the alert method will use the upper function scope and display 12. +//The first variable declaration has nothing to do with the function scope. diff --git a/Week3/homework/js-exercises/lotteryMachine.js b/Week3/homework/js-exercises/lotteryMachine.js new file mode 100644 index 000000000..7405af8bf --- /dev/null +++ b/Week3/homework/js-exercises/lotteryMachine.js @@ -0,0 +1,11 @@ +"use strict" +function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { + const numbers = []; + // make array + // start at beginning of array and check if you should call threeCallback or fiveCallback or go on to next +} + +threeFive(10, 15, sayThree, sayFive); + + // Should create an array [10,11,12,13,14,15] + // and call sayFive, sayThree, sayThree, sayFive \ No newline at end of file diff --git a/Week3/homework/js-exercises/removeDuplicates.js b/Week3/homework/js-exercises/removeDuplicates.js new file mode 100644 index 000000000..ae621fec7 --- /dev/null +++ b/Week3/homework/js-exercises/removeDuplicates.js @@ -0,0 +1,8 @@ +"use strict" +const letters = ['a', 'b', 'c', 'd', 'a', 'e', 'f', 'c', 'b']; + +function removeDuplicates(arr) { + let noDuplicates = arr.filter((item, index) => arr.indexOf(item) === index); + return noDuplicates; +} +console.log(removeDuplicates(letters)); \ No newline at end of file diff --git a/Week3/homework/project-TipCalculator/index.html b/Week3/homework/project-TipCalculator/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/Week3/homework/project-TipCalculator/main.js b/Week3/homework/project-TipCalculator/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/Week3/homework/project-TipCalculator/style.css b/Week3/homework/project-TipCalculator/style.css new file mode 100644 index 000000000..e69de29bb From 294b7af777e2cfbadc22e2d9d0af278cea6f43b1 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sat, 15 Feb 2020 20:50:04 +0200 Subject: [PATCH 12/16] Week2 completed --- .../Homework/project-PomodoroClock/index.html | 16 ++-- .../Homework/project-PomodoroClock/script.js | 86 ++++++++++++------- .../Homework/project-PomodoroClock/style.css | 39 ++++++++- Week3/homework/js-exercises/addSix.js | 10 ++- Week3/homework/js-exercises/lotteryMachine.js | 6 +- 5 files changed, 106 insertions(+), 51 deletions(-) diff --git a/Week2/Homework/project-PomodoroClock/index.html b/Week2/Homework/project-PomodoroClock/index.html index 58b0e4e50..0617ece18 100644 --- a/Week2/Homework/project-PomodoroClock/index.html +++ b/Week2/Homework/project-PomodoroClock/index.html @@ -2,11 +2,9 @@ - - @@ -16,23 +14,23 @@ -
    -
    -

    Pomodoro Clock

    -

    Session Length

    +
    +
    +

    Pomodoro Clock

    +

    Session Length

    -

    25

    +

    0

    Session

    -

    25:00

    +

    0:00

    - +
    diff --git a/Week2/Homework/project-PomodoroClock/script.js b/Week2/Homework/project-PomodoroClock/script.js index 3bf37739f..8c9507c05 100644 --- a/Week2/Homework/project-PomodoroClock/script.js +++ b/Week2/Homework/project-PomodoroClock/script.js @@ -1,52 +1,74 @@ "use strict" //DOM elements selection -const lengthUp = document.querySelector("#length-up"); -const lengthDown = document.querySelector("#length-down"); -const lengthDisplay = document.querySelector("#length-display"); -const play = document.querySelector("#play"); -const pause = document.querySelector("#pause"); -const duration = document.querySelector("#duration"); -const minutes = document.querySelector("#min"); -const seconds = document.querySelector("#sec"); +let lengthUp = document.querySelector("#length-up"); +let lengthDown = document.querySelector("#length-down"); +let lengthDisplay = document.querySelector("#length-display"); +let play = document.querySelector("#play"); +let pause = document.querySelector("#pause"); +let timeDisplay = document.querySelector("#time-display"); +let totalSeconds; +let paused = false; + //Increasing and decreasing the session length lengthUp.addEventListener("click", () => { let plusOne = parseInt(lengthDisplay.innerHTML) + 1; lengthDisplay.innerHTML = plusOne; - duration.innerHTML = `${lengthDisplay.innerHTML}:00` + timeDisplay.innerHTML = `${lengthDisplay.innerHTML}:00`; + totalSeconds = parseInt(timeDisplay.innerHTML) * 60; }); lengthDown.addEventListener("click", () => { let minusOne = parseInt(lengthDisplay.innerHTML) - 1; lengthDisplay.innerHTML = minusOne; - duration.innerHTML = `${lengthDisplay.innerHTML}:00` + timeDisplay.innerHTML = `${lengthDisplay.innerHTML}:00`; + totalSeconds = parseInt(timeDisplay.innerHTML) * 60; }) + //Start timer -let counter = {} - -play.addEventListener("click", function () { - counter.end = parseInt(minutes.innerHTML); - - counter.min = minutes; - counter.sec = seconds; - - if (counter.end > 0) { - counter.ticker = setInterval(function () { - counter.end--; - if (counter.end <= 0) { - clearInterval(counter.ticker); - counter.end = 0; - } - let secRemain = counter.end; - let minRemain = Math.floor(secRemain / 60); - secRemain -= minRemain * 60; - - counter.min.innerHTML = minRemain; - counter.sec.innerHTML = secRemain; - }, 1000); + +let countdown; + +function timer(sec) { + const now = Date.now(); + const then = now + sec * 1000; + displayTimeLeft(sec); + + countdown = setInterval(() => { + const secondsLeft = Math.round((then - Date.now()) / 1000); + if (secondsLeft < 0) { + clearInterval(countdown); + timeDisplay.innerHTML = "Time's up!" + return; + } + + displayTimeLeft(secondsLeft); + + }, 1000); +} + +function displayTimeLeft(sec) { + const min = Math.floor(sec / 60); + const remainderSec = Math.floor(sec % 60); + const display = `${min}:${remainderSec < 10 ? "0" : ""}${remainderSec}`; + timeDisplay.innerHTML = display; + +} +//Play button function (if pause was pressed before, continue with the remaining timer) +play.addEventListener("click", () => { + if (paused) { + totalSeconds = (parseInt(timeDisplay.innerHTML[0]) * 60) + (parseInt(timeDisplay.innerHTML[2] + timeDisplay.innerHTML[3])); } + timer(totalSeconds) }); +//Pause button function +pause.addEventListener("click", function () { + clearInterval(countdown); + paused = true; +}); + + diff --git a/Week2/Homework/project-PomodoroClock/style.css b/Week2/Homework/project-PomodoroClock/style.css index 5c24f7194..f3d6c9637 100644 --- a/Week2/Homework/project-PomodoroClock/style.css +++ b/Week2/Homework/project-PomodoroClock/style.css @@ -11,10 +11,26 @@ body { background-color: rgb(201, 44, 44); color: white; } + +h1 { + font-size: 3rem; +} +h2 { + font-size: 2rem; +} +div.inside-text h3 { + font-size:3.2rem; +} +#length-display { + font-size: 2.1rem; +} +.mainContainer { + height: 100vh; +} + .in-the-box { margin: 15px; padding: 15px; - height: 700px; } .length-button { font-size: 2.7rem; @@ -33,13 +49,12 @@ body { .length-button:active { color: sandybrown; } - .timer { font-family: 'Orbitron', sans-serif; border: 15px solid rgb(121, 33, 33) ; border-radius: 50%; - width: 400px; - height: 400px; + width: 350px; + height: 350px; } .time-buttons { font-size: 2.2rem; @@ -66,3 +81,19 @@ body { height: 500px; transform: rotate(20deg); } + +@media (max-width:576px){ +h1 { + font-size: 2.5rem; + } + h2 { + font-size: 1.5rem; + } + div.inside-text h3 { + font-size:3rem; +} +#length-display { + font-size: 1.8rem; +} + +} diff --git a/Week3/homework/js-exercises/addSix.js b/Week3/homework/js-exercises/addSix.js index d2138c481..c499acb7f 100644 --- a/Week3/homework/js-exercises/addSix.js +++ b/Week3/homework/js-exercises/addSix.js @@ -1,4 +1,8 @@ "use strict" -function createBase() { - -} \ No newline at end of file +function createBase(base, num) { + return num => base + num; +} +const addSix = createBase(6); +console.log(addSix(9)); +console.log(addSix(18)); +console.log(addSix(30)); \ No newline at end of file diff --git a/Week3/homework/js-exercises/lotteryMachine.js b/Week3/homework/js-exercises/lotteryMachine.js index 7405af8bf..2fe1a1d1e 100644 --- a/Week3/homework/js-exercises/lotteryMachine.js +++ b/Week3/homework/js-exercises/lotteryMachine.js @@ -1,8 +1,8 @@ "use strict" function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { - const numbers = []; - // make array - // start at beginning of array and check if you should call threeCallback or fiveCallback or go on to next + const numbers = []; + // make array + // start at beginning of array and check if you should call threeCallback or fiveCallback or go on to next } threeFive(10, 15, sayThree, sayFive); From 841bab10f16473335f49c5facf6c1203c799a0c8 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sun, 16 Feb 2020 01:51:34 +0200 Subject: [PATCH 13/16] Some bugs on booklist --- .../codeAlong/booklist-app/index.html | 66 ++++++++++ Week3/homework/codeAlong/booklist-app/main.js | 122 ++++++++++++++++++ .../homework/codeAlong/booklist-app/style.css | 31 +++++ .../homework/project-TipCalculator/index.html | 48 +++++++ .../homework/project-TipCalculator/style.css | 87 +++++++++++++ 5 files changed, 354 insertions(+) diff --git a/Week3/homework/codeAlong/booklist-app/index.html b/Week3/homework/codeAlong/booklist-app/index.html index e69de29bb..a41fe86d3 100644 --- a/Week3/homework/codeAlong/booklist-app/index.html +++ b/Week3/homework/codeAlong/booklist-app/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + Stefanos' Book List + + + + +
    +

    BookList

    + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + + + + + + + + + + + +
    TitleAuthorISBN#
    + +
    + + + + + + + + + \ No newline at end of file diff --git a/Week3/homework/codeAlong/booklist-app/main.js b/Week3/homework/codeAlong/booklist-app/main.js index e69de29bb..f0cf02d1c 100644 --- a/Week3/homework/codeAlong/booklist-app/main.js +++ b/Week3/homework/codeAlong/booklist-app/main.js @@ -0,0 +1,122 @@ +//Book Class +class Book { + constructor(title, author, isbn) { + this.title = title; + this.author = author; + this.isbn = isbn; + } +} + +//UI Class +class UI { + static displayBooks() { + + const books = Store.getBooks(); + + books.forEach(book => UI.addBookToList(book)); + } + static addBookToList(book) { + const list = document.querySelector("#book-list"); + + const row = document.createElement("tr"); + + row.innerHTML = ` + ${book.title} + ${book.author} + ${book.isbn} + X + `; + + list.appendChild(row); + } + static deleteBook(el) { + if (el.classList.contains("delete")) { + el.parentElement.remove(); + } + } + + static showAlert(message, className) { + const div = document.createElement("div"); + div.className = `alert alert-${className}`; + div.appendChild(document.createTextNode(message)); + const container = document.querySelector(".container"); + const form = document.querySelector("#book-form"); + container.insertBefore(div, form); + setTimeout(() => document.querySelector(".alert").remove(), 2000); + } + + static clearFields() { + document.querySelector("#title").value = ""; + document.querySelector("#author").value = ""; + document.querySelector("#isbn").value = ""; + + } +} + +//Store Class +class Store { + static getBooks() { + let books; + if (localStorage.getItem("books") === null) { + books = []; + } else { + books = JSON.parse(localStorage.getItem("books")); + } + return books; + } + + static addBook() { + const books = Store.getBooks(); + + books.push(book); + localStorage.setItem("books", JSON.stringify(books)); + } + + static removeBook(isbn) { + const books = Store.getBooks(); + books.forEach((book, index) => { + if (book.isbn === isbn) { + books.splice(index, 1); + } + }); + localStorage.setItem("books", JSON.stringify(books)); + } +} + + +//Display Books +document.addEventListener("DOMContentLoaded", UI.displayBooks); + +//Add a book +document.querySelector("#book-form").addEventListener("submit", e => { + e.preventDefault(); + + const title = document.querySelector("#title").value; + const author = document.querySelector("#author").value; + const isbn = document.querySelector("#isbn").value; + + if (title === "" || author === "" || isbn === "") { + UI.showAlert("Please fill in all the fields", "danger"); + } else { + + const book = new Book(title, author, isbn); + + UI.addBookToList(book); + + Store.addBook(book); + + UI.showAlert("Book Added", "success"); + + UI.clearFields; + } +}); + +//Remove a book +document.querySelector("#book-list").addEventListener("click", e => { + UI.deleteBook(e.target); + + Store.removeBook(e.target.parentElement.previousElementSibling.textContent); + + UI.showAlert("Book Removed", "success"); +}); + diff --git a/Week3/homework/codeAlong/booklist-app/style.css b/Week3/homework/codeAlong/booklist-app/style.css index e69de29bb..0dd716a9a 100644 --- a/Week3/homework/codeAlong/booklist-app/style.css +++ b/Week3/homework/codeAlong/booklist-app/style.css @@ -0,0 +1,31 @@ +*{ + padding: 0; + margin: 0; +} +body { + background-color: #ECF0D8; +} +.logo-header { + color: #4D5767; +} +th { + border-top: 1px solid rgb(38, 76, 105)!important; + border-bottom: 4px solid rgb(38, 76, 105)!important; +} +input.btn{ + background-color: #333C4A; + border: 2px solid #333C4A; +} +input.btn:hover { + background-color: rgb(77, 89, 109); + border: 2px solid rgb(77, 89, 109); +} +input.btn:active { + background-color: rgb(151, 165, 190)!important; + border: 2px solid rgb(151, 165, 190)!important; +} +input.btn:focus { + background-color: rgb(151, 165, 190)!important; + border: 2px solid rgb(151, 165, 190)!important; +} + diff --git a/Week3/homework/project-TipCalculator/index.html b/Week3/homework/project-TipCalculator/index.html index e69de29bb..ad374444d 100644 --- a/Week3/homework/project-TipCalculator/index.html +++ b/Week3/homework/project-TipCalculator/index.html @@ -0,0 +1,48 @@ + + + + + + + + Tip Calculator + + + + + + +
    +
    +
    +

    TIP CALCULATOR

    +
    +
    +
    +

    How much was your bill?

    + +

    How was your service?

    + +

    How many people are sharing the bill?

    + people +
    + +

    TIP AMOUNT

    +

    +

    € 0.00

    +

    each

    +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/Week3/homework/project-TipCalculator/style.css b/Week3/homework/project-TipCalculator/style.css index e69de29bb..4e743167a 100644 --- a/Week3/homework/project-TipCalculator/style.css +++ b/Week3/homework/project-TipCalculator/style.css @@ -0,0 +1,87 @@ +@import url('https://fonts.googleapis.com/css?family=Odibee+Sans&display=swap'); + +* { + margin: 0; + padding: 0; +} +body { + text-align: center; + font-family: 'Odibee Sans', cursive; + font-size: 1.5rem; +} +p,h2,h3,h4, input,button,label,select { + margin-bottom: 10px; +} +input, select { + border-radius: 5px; +} + +div.container { + display:flex; + justify-content: center; + align-items: center; + background-color: #303952; + height: 100vh; + width: 100vw; +} + +div.calculator { + background-color: white; + border-radius: 20px; + width: 350px; +} + +div.calc-header{ + padding: 10px; + border-top-left-radius: 20px; + border-top-right-radius: 20px; + background-color: #c25858; + color: white; +} +div.calc-body{ + padding: 10px; +} +.bill-section{ + margin-bottom: 20px; +} +.service-section{ + margin-bottom: 20px; +} + +#bill { + height: 30px; + width: 180px; + padding: 5px; +} +#services { + width: 210px; + font-size:1.2rem; + padding: 5px; +} +#people { + width: 80px; + padding: 5px; +} +#calc-button { + padding: 5px; + font-size: 1.8rem; + background-color: #c25858; + border-radius: 10px; + color: white; + font-family: 'Odibee Sans', cursive; + cursor: pointer; +} +input#bill{ + font-family: 'Segoe UI', sans-serif; + font-size: 1.3rem; + +} +input#people{ + font-family: 'Segoe UI', sans-serif; + font-size: 1.1rem; + +} +select#services{ + font-family: 'Segoe UI', sans-serif; +} + From b8b0eb4447ce40b240c7a3016915fb00bac6c1ae Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sun, 16 Feb 2020 13:36:19 +0200 Subject: [PATCH 14/16] Booklist bug fixed --- .../project-PomodoroClock/alarm-sound.mp3 | Bin 0 -> 79397 bytes Week2/Homework/project-PomodoroClock/index.html | 1 + Week2/Homework/project-PomodoroClock/script.js | 4 +++- .../homework/codeAlong/booklist-app/index.html | 4 +--- Week3/homework/codeAlong/booklist-app/main.js | 10 +++++----- 5 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 Week2/Homework/project-PomodoroClock/alarm-sound.mp3 diff --git a/Week2/Homework/project-PomodoroClock/alarm-sound.mp3 b/Week2/Homework/project-PomodoroClock/alarm-sound.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1d29715ec2156bbfcbd5ae1fca70e2c1fb107265 GIT binary patch literal 79397 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 N0wIp>R5XorqX0cV&glRE literal 0 HcmV?d00001 diff --git a/Week2/Homework/project-PomodoroClock/index.html b/Week2/Homework/project-PomodoroClock/index.html index 0617ece18..80942e84e 100644 --- a/Week2/Homework/project-PomodoroClock/index.html +++ b/Week2/Homework/project-PomodoroClock/index.html @@ -27,6 +27,7 @@

    Session

    0:00

    +
    diff --git a/Week2/Homework/project-PomodoroClock/script.js b/Week2/Homework/project-PomodoroClock/script.js index 8c9507c05..eb99ef1ba 100644 --- a/Week2/Homework/project-PomodoroClock/script.js +++ b/Week2/Homework/project-PomodoroClock/script.js @@ -6,6 +6,7 @@ let lengthDisplay = document.querySelector("#length-display"); let play = document.querySelector("#play"); let pause = document.querySelector("#pause"); let timeDisplay = document.querySelector("#time-display"); +let audio = document.querySelector("audio"); let totalSeconds; let paused = false; @@ -39,7 +40,8 @@ function timer(sec) { const secondsLeft = Math.round((then - Date.now()) / 1000); if (secondsLeft < 0) { clearInterval(countdown); - timeDisplay.innerHTML = "Time's up!" + timeDisplay.innerHTML = "Time's up!"; + audio.play(); return; } diff --git a/Week3/homework/codeAlong/booklist-app/index.html b/Week3/homework/codeAlong/booklist-app/index.html index a41fe86d3..41e9f77d2 100644 --- a/Week3/homework/codeAlong/booklist-app/index.html +++ b/Week3/homework/codeAlong/booklist-app/index.html @@ -43,9 +43,7 @@

    - - - + diff --git a/Week3/homework/codeAlong/booklist-app/main.js b/Week3/homework/codeAlong/booklist-app/main.js index f0cf02d1c..37b4bbf14 100644 --- a/Week3/homework/codeAlong/booklist-app/main.js +++ b/Week3/homework/codeAlong/booklist-app/main.js @@ -13,7 +13,7 @@ class UI { const books = Store.getBooks(); - books.forEach(book => UI.addBookToList(book)); + books.forEach((book) => UI.addBookToList(book)); } static addBookToList(book) { const list = document.querySelector("#book-list"); @@ -31,7 +31,7 @@ class UI { } static deleteBook(el) { if (el.classList.contains("delete")) { - el.parentElement.remove(); + el.parentElement.parentElement.remove(); } } @@ -65,7 +65,7 @@ class Store { return books; } - static addBook() { + static addBook(book) { const books = Store.getBooks(); books.push(book); @@ -88,7 +88,7 @@ class Store { document.addEventListener("DOMContentLoaded", UI.displayBooks); //Add a book -document.querySelector("#book-form").addEventListener("submit", e => { +document.querySelector("#book-form").addEventListener("submit", (e) => { e.preventDefault(); const title = document.querySelector("#title").value; @@ -112,7 +112,7 @@ document.querySelector("#book-form").addEventListener("submit", e => { }); //Remove a book -document.querySelector("#book-list").addEventListener("click", e => { +document.querySelector("#book-list").addEventListener("click", (e) => { UI.deleteBook(e.target); Store.removeBook(e.target.parentElement.previousElementSibling.textContent); From f68d5705cc968df4de1cc4ee258d98d43b4d1035 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sun, 16 Feb 2020 15:25:55 +0200 Subject: [PATCH 15/16] Tip calculator completed --- .../homework/project-TipCalculator/index.html | 10 ++-- Week3/homework/project-TipCalculator/main.js | 59 +++++++++++++++++++ .../homework/project-TipCalculator/style.css | 4 ++ 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/Week3/homework/project-TipCalculator/index.html b/Week3/homework/project-TipCalculator/index.html index ad374444d..a1e341106 100644 --- a/Week3/homework/project-TipCalculator/index.html +++ b/Week3/homework/project-TipCalculator/index.html @@ -23,6 +23,7 @@

    TIP CALCULATOR

    How was your service?

    people
    - +

    TIP AMOUNT

    -

    -

    € 0.00

    -

    each

    +

    € 0.00

    +

    each

    - + \ No newline at end of file diff --git a/Week3/homework/project-TipCalculator/main.js b/Week3/homework/project-TipCalculator/main.js index e69de29bb..4942257db 100644 --- a/Week3/homework/project-TipCalculator/main.js +++ b/Week3/homework/project-TipCalculator/main.js @@ -0,0 +1,59 @@ +"use strict" +//Selecting the elements + +const bill = document.querySelector("#bill"); +const services = document.querySelector("#services"); +const people = document.querySelector("#people"); +const button = document.querySelector("#calc-button"); +const amount = document.querySelector("#tip-amount"); +const each = document.querySelector("#each"); +let total; + +//Event listener for the button click +button.addEventListener("click", calculateTips); + +//Function that calculates the tips for each service selection +function calculateTips() { + //Checks if some of the fields is blank + if (bill.value === "" || services.value === "choose-option" || people.value === "") { + alert("You need to fill in all the fields!"); + //Changes the tip value for each percentage + } else { + switch (services.value) { + case "outstanding": + onePerson(); + total = (bill.value * 0.30) / people.value; + amount.innerHTML = `€ ${total}`; + break; + case "good": + onePerson(); + total = (bill.value * 0.20) / people.value; + amount.innerHTML = `€ ${total}`; + break; + case "ok": + onePerson(); + total = (bill.value * 0.15) / people.value; + amount.innerHTML = `€ ${total}`; + break; + case "bad": + onePerson(); + total = (bill.value * 0.1) / people.value; + amount.innerHTML = `€ ${total}`; + break; + case "terrible": + onePerson(); + total = (bill.value * 0.05) / people.value; + amount.innerHTML = `€ ${total}`; + break; + } + } +} + +//Function that checks if there is more than one person that pays the bill and adds or deletes the "each" +function onePerson() { + if (parseInt(people.value) === 1) { + each.innerHTML = ""; + } else { + each.innerHTML = "each"; + } +} diff --git a/Week3/homework/project-TipCalculator/style.css b/Week3/homework/project-TipCalculator/style.css index 4e743167a..943c6397a 100644 --- a/Week3/homework/project-TipCalculator/style.css +++ b/Week3/homework/project-TipCalculator/style.css @@ -71,6 +71,10 @@ div.calc-body{ font-family: 'Odibee Sans', cursive; cursor: pointer; } +#calc-button:hover { + background-color: #fd7f7f; + } + input#bill{ font-family: 'Segoe UI', sans-serif; font-size: 1.3rem; From fe3158e0a0c9eb7daa7a5e82f9b2b4a2de3a86e4 Mon Sep 17 00:00:00 2001 From: Stefanos Date: Sun, 16 Feb 2020 15:40:53 +0200 Subject: [PATCH 16/16] All Javascript2 exercises and projects completed --- Week3/homework/js-exercises/lotteryMachine.js | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Week3/homework/js-exercises/lotteryMachine.js b/Week3/homework/js-exercises/lotteryMachine.js index 2fe1a1d1e..07dc3fb99 100644 --- a/Week3/homework/js-exercises/lotteryMachine.js +++ b/Week3/homework/js-exercises/lotteryMachine.js @@ -1,11 +1,25 @@ "use strict" function threeFive(startIndex, stopIndex, threeCallback, fiveCallback) { const numbers = []; - // make array - // start at beginning of array and check if you should call threeCallback or fiveCallback or go on to next + + for (let n = startIndex; n < stopIndex; n++) { + numbers.push(n); + } + + numbers.forEach(n => { + if (n % 3 === 0) { + threeCallback(); + } + else if (n % 5 === 0) { + fiveCallback(); + } + }) +} +function sayThree() { + console.log("three"); +} +function sayFive() { + console.log("five"); } threeFive(10, 15, sayThree, sayFive); - - // Should create an array [10,11,12,13,14,15] - // and call sayFive, sayThree, sayThree, sayFive \ No newline at end of file