From a8f82efc156dac846a79828f0ed283ee7557db70 Mon Sep 17 00:00:00 2001 From: Florian <fmeuleman@takima.fr> Date: Mon, 26 Feb 2024 13:32:47 +0100 Subject: [PATCH] feat/Add solution --- .../solution}/back-end/.gitignore | 0 .../solution}/back-end/config.js | 0 .../solution}/back-end/package-lock.json | 0 .../solution}/back-end/package.json | 0 .../solution}/back-end/server.js | 0 .../src/io/takima/agencymanagement/Main.java | 166 ------------------ .../agencymanagement/dao/TravelDao.java | 59 ------- .../takima/agencymanagement/dao/UserDao.java | 54 ------ .../mapper/TravelDtoMapper.java | 20 --- .../mapper/UserDtoMapper.java | 12 -- .../agencymanagement/model/Airport.java | 22 --- .../agencymanagement/model/Discount.java | 5 - .../agencymanagement/model/HotelOffer.java | 36 ---- .../takima/agencymanagement/model/Offer.java | 27 --- .../model/PercentDiscount.java | 15 -- .../model/RestaurentOffer.java | 34 ---- .../takima/agencymanagement/model/Travel.java | 158 ----------------- .../takima/agencymanagement/model/User.java | 72 -------- .../agencymanagement/model/ValueDiscount.java | 15 -- .../responsedto/TravelResponseDto.java | 15 -- .../responsedto/UserResponseDto.java | 7 - .../service/TravelService.java | 158 ----------------- .../agencymanagement/service/UserService.java | 42 ----- .../utils/AirportManager.java | 21 --- resources/solution/day-2/.gitkeep | 0 resources/solution/day-2/day2.zip | Bin 33921 -> 0 bytes .../solution}/front-end/.babelrc | 0 .../solution}/front-end/browserslist | 0 .../solution}/front-end/package-lock.json | 0 .../solution}/front-end/package.json | 0 .../components/footer/footer.component.html | 0 .../app/components/footer/footer.component.js | 0 .../components/footer/footer.component.scss | 0 .../components/game/card/card.component.html | 0 .../components/game/card/card.component.js | 0 .../components/game/card/card.component.scss | 0 .../app/components/game/game.component.html | 0 .../src/app/components/game/game.component.js | 0 .../app/components/game/game.component.scss | 0 .../components/navbar/navbar.component.html | 0 .../app/components/navbar/navbar.component.js | 0 .../components/navbar/navbar.component.scss | 0 .../app/components/score/score.component.html | 0 .../app/components/score/score.component.js | 0 .../app/components/score/score.component.scss | 0 .../components/welcome/welcome.component.html | 0 .../components/welcome/welcome.component.js | 0 .../components/welcome/welcome.component.scss | 0 .../front-end/src/app/scripts/component.js | 0 .../front-end/src/app/scripts/router.js | 0 .../front-end/src/app/scripts/utils.js | 0 .../front-end/src/app/styles/_colors.scss | 0 .../front-end/src/app/styles/style.scss | 0 .../front-end/src/assets/cards/back.png | Bin .../front-end/src/assets/cards/card-0.png | Bin .../front-end/src/assets/cards/card-1.png | Bin .../front-end/src/assets/cards/card-2.png | Bin .../front-end/src/assets/cards/card-3.png | Bin .../front-end/src/assets/cards/card-4.png | Bin .../front-end/src/assets/cards/card-5.png | Bin .../front-end/src/assets/cards/card-6.png | Bin .../front-end/src/assets/cards/card-7.png | Bin .../front-end/src/assets/cards/card-8.png | Bin .../front-end/src/assets/cards/card-9.png | Bin .../front-end/src/assets/happy_homer.jpg | Bin .../src/assets/logo_take_my_money.png | Bin .../solution}/front-end/src/favicon.ico | Bin .../solution}/front-end/src/index.html | 0 .../solution}/front-end/src/main.js | 0 .../solution}/front-end/webpack.config.js | 0 70 files changed, 938 deletions(-) rename {old/done => resources/solution}/back-end/.gitignore (100%) rename {old/done => resources/solution}/back-end/config.js (100%) rename {old/done => resources/solution}/back-end/package-lock.json (100%) rename {old/done => resources/solution}/back-end/package.json (100%) rename {old/done => resources/solution}/back-end/server.js (100%) delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/Main.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/dao/TravelDao.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/dao/UserDao.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/mapper/TravelDtoMapper.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/mapper/UserDtoMapper.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/Airport.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/Discount.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/HotelOffer.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/Offer.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/PercentDiscount.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/RestaurentOffer.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/Travel.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/User.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/model/ValueDiscount.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/TravelResponseDto.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/UserResponseDto.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/service/TravelService.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/service/UserService.java delete mode 100644 resources/solution/day-1/src/io/takima/agencymanagement/utils/AirportManager.java delete mode 100644 resources/solution/day-2/.gitkeep delete mode 100644 resources/solution/day-2/day2.zip rename {old/done => resources/solution}/front-end/.babelrc (100%) rename {old/done => resources/solution}/front-end/browserslist (100%) rename {old/done => resources/solution}/front-end/package-lock.json (100%) rename {old/done => resources/solution}/front-end/package.json (100%) rename {old/done => resources/solution}/front-end/src/app/components/footer/footer.component.html (100%) rename {old/done => resources/solution}/front-end/src/app/components/footer/footer.component.js (100%) rename {old/done => resources/solution}/front-end/src/app/components/footer/footer.component.scss (100%) rename {old/done => resources/solution}/front-end/src/app/components/game/card/card.component.html (100%) rename {old/done => resources/solution}/front-end/src/app/components/game/card/card.component.js (100%) rename {old/done => resources/solution}/front-end/src/app/components/game/card/card.component.scss (100%) rename {old/done => resources/solution}/front-end/src/app/components/game/game.component.html (100%) rename {old/done => resources/solution}/front-end/src/app/components/game/game.component.js (100%) rename {old/done => resources/solution}/front-end/src/app/components/game/game.component.scss (100%) rename {old/done => resources/solution}/front-end/src/app/components/navbar/navbar.component.html (100%) rename {old/done => resources/solution}/front-end/src/app/components/navbar/navbar.component.js (100%) rename {old/done => resources/solution}/front-end/src/app/components/navbar/navbar.component.scss (100%) rename {old/done => resources/solution}/front-end/src/app/components/score/score.component.html (100%) rename {old/done => resources/solution}/front-end/src/app/components/score/score.component.js (100%) rename {old/done => resources/solution}/front-end/src/app/components/score/score.component.scss (100%) rename {old/done => resources/solution}/front-end/src/app/components/welcome/welcome.component.html (100%) rename {old/done => resources/solution}/front-end/src/app/components/welcome/welcome.component.js (100%) rename {old/done => resources/solution}/front-end/src/app/components/welcome/welcome.component.scss (100%) rename {old/done => resources/solution}/front-end/src/app/scripts/component.js (100%) rename {old/done => resources/solution}/front-end/src/app/scripts/router.js (100%) rename {old/done => resources/solution}/front-end/src/app/scripts/utils.js (100%) rename {old/done => resources/solution}/front-end/src/app/styles/_colors.scss (100%) rename {old/done => resources/solution}/front-end/src/app/styles/style.scss (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/back.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-0.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-1.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-2.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-3.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-4.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-5.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-6.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-7.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-8.png (100%) rename {old/done => resources/solution}/front-end/src/assets/cards/card-9.png (100%) rename {old/done => resources/solution}/front-end/src/assets/happy_homer.jpg (100%) rename {old/done => resources/solution}/front-end/src/assets/logo_take_my_money.png (100%) rename {old/done => resources/solution}/front-end/src/favicon.ico (100%) rename {old/done => resources/solution}/front-end/src/index.html (100%) rename {old/done => resources/solution}/front-end/src/main.js (100%) rename {old/done => resources/solution}/front-end/webpack.config.js (100%) diff --git a/old/done/back-end/.gitignore b/resources/solution/back-end/.gitignore similarity index 100% rename from old/done/back-end/.gitignore rename to resources/solution/back-end/.gitignore diff --git a/old/done/back-end/config.js b/resources/solution/back-end/config.js similarity index 100% rename from old/done/back-end/config.js rename to resources/solution/back-end/config.js diff --git a/old/done/back-end/package-lock.json b/resources/solution/back-end/package-lock.json similarity index 100% rename from old/done/back-end/package-lock.json rename to resources/solution/back-end/package-lock.json diff --git a/old/done/back-end/package.json b/resources/solution/back-end/package.json similarity index 100% rename from old/done/back-end/package.json rename to resources/solution/back-end/package.json diff --git a/old/done/back-end/server.js b/resources/solution/back-end/server.js similarity index 100% rename from old/done/back-end/server.js rename to resources/solution/back-end/server.js diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/Main.java b/resources/solution/day-1/src/io/takima/agencymanagement/Main.java deleted file mode 100644 index cfdacf8..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/Main.java +++ /dev/null @@ -1,166 +0,0 @@ -package io.takima.agencymanagement; - -import io.takima.agencymanagement.model.Airport; -import io.takima.agencymanagement.model.Discount; -import io.takima.agencymanagement.model.RestaurentOffer; -import io.takima.agencymanagement.model.PercentDiscount; -import io.takima.agencymanagement.model.Travel; -import io.takima.agencymanagement.model.User; -import io.takima.agencymanagement.service.TravelService; -import io.takima.agencymanagement.utils.AirportManager; - -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Queue; -import java.util.Set; - -public class Main { - - public static void main(String[] args) { - - TravelService travelService = new TravelService(); - //Update Main - System.out.printf("Agency App \n"); - - User user1 = new User(0, "John", "Doe", "john.doe@gmail.com"); - User user2 = new User(1, "John", "Doe", "john.doe@gmail.com"); - User user3 = new User(2, "John", "Doe", "john.doe@gmail.com"); - User user4 = new User(3, "John", "Doe", "john.doe@gmail.com"); - User user5 = new User(4, "John", "Doe", "john.doe@gmail.com"); - User user6 = new User(5, "Mat", "Doe", "mat.doe@gmail.com"); - - //Add 50% discount - List<Discount> discounts = new ArrayList<>(); - discounts.add(new PercentDiscount(50)); - - //Add participant set - Set<User> users = Set.of(user1, user2, user3, user4, user5); - Set<User> participants = new HashSet<>(users); - - // Bug without overriding equals and hashCode - User sameUser1 = new User(0, "Same", "User", "sameuser@gmail.com"); - User sameUser2 = new User(0, "Same", "User", "sameuser@gmail.com"); - - Set<User> sameUsers = new HashSet<>(); - try { - sameUsers = Set.of(sameUser1, sameUser2); - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); - } - Travel travelWithBug = new Travel(0L, null, Instant.now(), Instant.now().plusSeconds(1), - null, null, null, 0, 0, null, - sameUsers, null); - - System.out.println(travelWithBug.getParticipants()); - - //Add waitList - Queue<User> waitList = new ArrayDeque<>(); - waitList.add(user6); - - // Log RestaurentOffer details - RestaurentOffer offer = new RestaurentOffer( - 0L, - 4, - "description", - 2, - Instant.now().plusSeconds(10), - 2, - Instant.now() - ); - System.out.println(offer.getDetails()); - - //Create firstTravel - Travel firstTravel = new Travel(0L, "to Japan", Instant.now(), Instant.now().plusSeconds(86400), Airport.PARIS_CHARLES_DE_GAULLE, Airport.TOKYO_HANEDA, "Tokyo", 5, 2000, discounts, participants, waitList); - - //Apply discount - applyDiscounts(firstTravel); - - //Log user information - System.out.println(user1); - //Log travel information - System.out.println(firstTravel); - - //Subscribe user using TravelService and get an exception - try { - travelService.subscribe(user1, firstTravel); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - - System.out.println("Utilisateurs en file d'attente : " + firstTravel.getWaitList().element()); - - //Unsubscribe a participant then check the first one in the waitList is subscribed - travelService.unsubscribe(user1, firstTravel); - - for (User participant : firstTravel.getParticipants()) { - System.out.println(participant); - } - - //Log CDG airport timeZone - System.out.println(AirportManager.getTimeZone(Airport.PARIS_CHARLES_DE_GAULLE)); - - //Use computeTravelDuration - String dateStr = "26/04/2023, 12:10"; - String dateStr2 = "27/04/2023, 06:36"; - - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy, HH:mm"); - LocalDateTime localDateTime1 = LocalDateTime.parse(dateStr, formatter); - LocalDateTime localDateTime2 = LocalDateTime.parse(dateStr2, formatter); - - - Instant instant1 = localDateTime1.atZone(ZoneId.of(AirportManager.getTimeZone(Airport.PARIS_CHARLES_DE_GAULLE))).toInstant(); - Instant instant2 = localDateTime2.atZone(ZoneId.of(AirportManager.getTimeZone(Airport.TOKYO_HANEDA))).toInstant(); - - firstTravel.setDepartureDate(instant1); - firstTravel.setArrivalDate(instant2); - - System.out.println(travelService.computeTravelDuration(firstTravel)); - - //Use adjustDates - travelService.adjustDates(Duration.ofHours(5), firstTravel); - //Log it in the appropriate zoneTime - System.out.println(firstTravel.getDepartureDate().atZone(ZoneId.of(AirportManager.getTimeZone(firstTravel.getDepartureAirport())))); - - //Find available ones - List<Travel> availableTravels = travelService.findAvailableForDestination("Paris"); - - } - - //Before services - public static void applyDiscounts(Travel travel) { - if (travel.getDiscounts().isEmpty()) { - System.out.println("Aucune réduction n'est applicable sur ce voyage !"); - } else { - for (Discount discount : travel.getDiscounts()) { - double discountedPrice = discount.apply(travel.getPrice()); - System.out.println("Prix après réduction : " + discountedPrice); - } - } - } - - public static boolean subscribe(User user, Travel travel) { - - if (travel.getParticipants().size() < travel.getCapacity()) { - travel.getParticipants().add(user); - return true; - } - travel.getWaitList().add(user); - return false; - } - - public void unsubscribe(User user, Travel travel) { - - travel.getParticipants().remove(user); - - if (!travel.getWaitList().isEmpty()) { - travel.getParticipants().add(travel.getWaitList().poll()); - } - } -} \ No newline at end of file diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/dao/TravelDao.java b/resources/solution/day-1/src/io/takima/agencymanagement/dao/TravelDao.java deleted file mode 100644 index 5937d37..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/dao/TravelDao.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.takima.agencymanagement.dao; - -import io.takima.agencymanagement.model.Airport; -import io.takima.agencymanagement.model.Discount; -import io.takima.agencymanagement.model.Travel; -import io.takima.agencymanagement.model.User; - -import java.time.Instant; -import java.util.*; - -public class TravelDao { - - private final Map<Long, Travel> travels = Collections.synchronizedMap(new HashMap<>()); - - public TravelDao() { - addTravelsToMap(); - } - - public Travel persist(Travel travel) { - travels.put(travel.getId(), travel); - return travel; - } - - public Travel update(Travel travel) { - if (travels.containsKey(travel.getId())) { - travels.put(travel.getId(), travel); - return travel; - } - return null; - } - - public void delete(Long travelId) { - travels.remove(travelId); - } - - public Travel findById(Long travelId) { - return travels.get(travelId); - } - - public List<Travel> findAll() { - return new ArrayList<>(travels.values()); - } - - public void addTravelsToMap() { - List<Discount> emptyDiscountsList = new ArrayList<>(); - Queue<User> emptyWaitList = new LinkedList<>(); - Set<User> emptyParticipantsList = new HashSet<>(); - Set<User> participantsList = new HashSet<>(); - participantsList.add(new User(10, "Jean", "Michel", "j.m@gamil.com")); - - Travel travel1 = new Travel(1, "Trip to Paris", Instant.now(), Instant.now().plusSeconds(3600), Airport.NEW_YORK_NEWARK, Airport.PARIS_ORLY, "Paris",50, 500.0, emptyDiscountsList, emptyParticipantsList, emptyWaitList); - Travel travel2 = new Travel(2, "Holiday in Tokyo", Instant.now(), Instant.now().plusSeconds(7200), Airport.PARIS_CHARLES_DE_GAULLE, Airport.TOKYO_HANEDA,"Tokyo", 40, 800.0, emptyDiscountsList, emptyParticipantsList, emptyWaitList); - Travel travel3 = new Travel(3, "Exploring Rome", Instant.now(), Instant.now().plusSeconds(10800), Airport.TOKYO_NARITA, Airport.NEW_YORK_JFK, "New York", 30, 600.0, emptyDiscountsList, participantsList, emptyWaitList); - - travels.put(travel1.getId(), travel1); - travels.put(travel2.getId(), travel2); - travels.put(travel3.getId(), travel3); - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/dao/UserDao.java b/resources/solution/day-1/src/io/takima/agencymanagement/dao/UserDao.java deleted file mode 100644 index 689edb6..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/dao/UserDao.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.takima.agencymanagement.dao; - -import io.takima.agencymanagement.model.User; - -import java.util.*; - -public class UserDao { - - public UserDao() { - //add data - addUsersToMap(); - } - - private final Map<Long, User> users = Collections.synchronizedMap(new HashMap<>()); - - public User persist(User user) { - users.put(user.getId(), user); - return user; - } - - public User update(User user) { - if (users.containsKey(user.getId())) { - users.put(user.getId(), user); - return user; - } - return null; - } - - public void delete(Long userId) { - users.remove(userId); - } - - public User findById(Long userId) { - return users.get(userId); - } - - public List<User> findAll() { - return new ArrayList<>(users.values()); - } - - public void addUsersToMap() { - User user1 = new User(1, "John", "Doe", "john@example.com"); - User user2 = new User(2, "Jane", "Smith", "jane@example.com"); - User user3 = new User(3, "Alice", "Johnson", "alice@example.com"); - User user4 = new User(4, "Bob", "Williams", "bob@example.com"); - User user5 = new User(5, "Eva", "Brown", "eva@example.com"); - - users.put(user1.getId(), user1); - users.put(user2.getId(), user2); - users.put(user3.getId(), user3); - users.put(user4.getId(), user4); - users.put(user5.getId(), user5); - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/mapper/TravelDtoMapper.java b/resources/solution/day-1/src/io/takima/agencymanagement/mapper/TravelDtoMapper.java deleted file mode 100644 index 4ea0ed9..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/mapper/TravelDtoMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.takima.agencymanagement.mapper; - -import io.takima.agencymanagement.model.Travel; -import io.takima.agencymanagement.presentation.responsedto.TravelResponseDto; -import io.takima.agencymanagement.utils.AirportManager; - -import java.time.ZoneId; -import java.time.ZonedDateTime; - -public class TravelDtoMapper { - - public static TravelResponseDto fromTravel(Travel travel) { - ZonedDateTime zonedDepartureDate = travel.getDepartureDate() - .atZone(ZoneId.of(AirportManager.timeZone.get(travel.getDepartureAirport()))); - ZonedDateTime zonedArrivalDate = travel.getDepartureDate() - .atZone(ZoneId.of(AirportManager.timeZone.get(travel.getArrivalAirport()))); - - return new TravelResponseDto(travel.getName(), travel.getDestination(), travel.getDepartureAirport(), travel.getArrivalAirport(), zonedDepartureDate, zonedArrivalDate, travel.getPrice()); - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/mapper/UserDtoMapper.java b/resources/solution/day-1/src/io/takima/agencymanagement/mapper/UserDtoMapper.java deleted file mode 100644 index d3351a9..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/mapper/UserDtoMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.takima.agencymanagement.mapper; - -import io.takima.agencymanagement.model.User; -import io.takima.agencymanagement.presentation.responsedto.UserResponseDto; - -public class UserDtoMapper { - - public static UserResponseDto fromUser(User user) { - - return new UserResponseDto(user.getFirstName(), user.getLastName(), user.getContact()); - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/Airport.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/Airport.java deleted file mode 100644 index e2eabb8..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/Airport.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.takima.agencymanagement.model; - -public enum Airport { - - PARIS_CHARLES_DE_GAULLE("CDG"), - PARIS_ORLY("ORY"), - NEW_YORK_JFK("JFK"), - NEW_YORK_NEWARK("EWR"), - NEW_YORK_LAGUARDIA("LGA"), - TOKYO_NARITA("NRT"), - TOKYO_HANEDA("HND"); - - private final String acronym; - - Airport(String acronym){ - this.acronym = acronym; - } - - public String getAcronym() { - return acronym; - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/Discount.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/Discount.java deleted file mode 100644 index 4ab3d08..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/Discount.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.takima.agencymanagement.model; - -public interface Discount { - public double apply(double price); -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/HotelOffer.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/HotelOffer.java deleted file mode 100644 index cea6ddb..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/HotelOffer.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.takima.agencymanagement.model; - -import java.time.Instant; - -public class HotelOffer extends Offer { - private boolean isBreakfastIncluded; - private int nbOfAvailableDays; - - public HotelOffer( - long id, - double score, - String description, - int nbOfReviews, - boolean isBreakfastIncluded, - int nbOfAvailableDays - ) { - super(id, score, description, nbOfReviews); - this.isBreakfastIncluded = isBreakfastIncluded; - this.nbOfAvailableDays = nbOfAvailableDays; - } - - @Override - public boolean isValid() { - return super.isValid() && - nbOfAvailableDays > 0; - } - - public String getDetails() { - return "Le nombre de jours valaibles " + - nbOfAvailableDays + - ". Petit déjeuner est " + - (isBreakfastIncluded ? "" : "non") + - "inclu"; - } - -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/Offer.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/Offer.java deleted file mode 100644 index 3b30b57..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/Offer.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.takima.agencymanagement.model; - -import java.time.Instant; - -public abstract class Offer { - protected long id; - protected double score; - protected String description; - protected int nbOfReviews; - protected abstract String getDetails(); - - protected Offer(long id, double score, String description, int nbOfReviews) { - this.id = id; - this.score = score; - this.description = description; - this.nbOfReviews = nbOfReviews; - } - - protected boolean isValid() { - return score >= 0 && - score <= 5 && - description != null && - !description.isBlank() && - nbOfReviews >= 0; - } - -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/PercentDiscount.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/PercentDiscount.java deleted file mode 100644 index 04876ad..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/PercentDiscount.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.takima.agencymanagement.model; - -public class PercentDiscount implements Discount{ - - private double percent; - - public PercentDiscount(int percent) { - this.percent = percent; - } - - @Override - public double apply(double price) { - return price * (1 - (percent / 100)); - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/RestaurentOffer.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/RestaurentOffer.java deleted file mode 100644 index f203bae..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/RestaurentOffer.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.takima.agencymanagement.model; - -import java.time.Instant; - -public class RestaurentOffer extends Offer { - private int nbOfStars; - private int nbOfPerson; - - public RestaurentOffer( - long id, - double score, - String description, - int nbOfReviews, - Instant expiration, - int nbOfStars, - int nbOfPerson - ) { - super(id, score, description, nbOfReviews); - this.nbOfStars = nbOfStars; - this.nbOfPerson = nbOfPerson; - } - - @Override - public boolean isValid() { - return super.isValid() && - nbOfPerson > 0 && - nbOfStars >0; - } - - public String getDetails() { - return "La reservation est dans un restaurant de %d étoiles, pour %s personnes".formatted(nbOfStars, nbOfPerson); - } - -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/Travel.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/Travel.java deleted file mode 100644 index af92355..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/Travel.java +++ /dev/null @@ -1,158 +0,0 @@ -package io.takima.agencymanagement.model; - -import java.time.Instant; -import java.util.List; -import java.util.Queue; -import java.util.Set; - -public class Travel { - - private long id; - private String name; - private Instant departureDate; - private Instant arrivalDate; - private Airport departureAirport; - private Airport arrivalAirport; - private String destination; - private int capacity; - private double price; - private List<Discount> discounts; - - private Set<User> participants; - - private Queue<User> waitList; - - public Travel(long id, String name, Instant departureDate, Instant arrivalDate, Airport departureAirport, Airport arrivalAirport, String destination, int capacity, double price, List<Discount> discounts, Set<User> participants, Queue<User> waitList) { - if(departureDate.isAfter(arrivalDate)){ - throw new IllegalArgumentException("Date de départ et après la date d'arrivée"); - } - - this.id = id; - this.name = name; - this.departureDate =departureDate; - this.arrivalDate = arrivalDate; - this.departureAirport = departureAirport; - this.arrivalAirport = arrivalAirport; - this.destination = destination; - this.capacity = capacity; - this.price = price; - this.discounts = discounts; - this.participants = participants; - this.waitList = waitList; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Instant getDepartureDate() { - return departureDate; - } - - public void setDepartureDate(Instant departureDate) { - this.departureDate = departureDate; - } - - public Instant getArrivalDate() { - return arrivalDate; - } - - public void setArrivalDate(Instant arrivalDate) { - this.arrivalDate = arrivalDate; - } - - public Airport getDepartureAirport() { - return departureAirport; - } - - public void setDepartureAirport(Airport departureAirport) { - this.departureAirport = departureAirport; - } - - public Airport getArrivalAirport() { - return arrivalAirport; - } - - public void setArrivalAirport(Airport arrivalAirport) { - this.arrivalAirport = arrivalAirport; - } - - public String getDestination() { - return destination; - } - - public void setDestination(String destination) { - this.destination = destination; - } - - public int getCapacity() { - return capacity; - } - - public void setCapacity(int capacity) { - this.capacity = capacity; - } - - public double getPrice() { - return price; - } - - public void setPrice(double price) { - this.price = price; - } - - public List<Discount> getDiscounts() { - return discounts; - } - - public void setDiscounts(List<Discount> discounts) { - this.discounts = discounts; - } - - public Set<User> getParticipants() { - return participants; - } - - public void setParticipants(Set<User> participants) { - this.participants = participants; - } - - public Queue<User> getWaitList() { - return waitList; - } - - public void setWaitList(Queue<User> waitList) { - this.waitList = waitList; - } - - @Override - public String toString() { - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("Le voyage '") - .append(name) - .append("' à destination de ") - .append(destination) - .append(" a ") - .append(participants.size()) - .append(" voyageurs inscrits qui sont respectivement:\n"); - - for (User participant : participants) { - stringBuilder.append("- ").append(participant.getFirstName()).append(participant.getLastName()).append("\n"); - } - - return stringBuilder.toString(); - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/User.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/User.java deleted file mode 100644 index b8393a8..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/User.java +++ /dev/null @@ -1,72 +0,0 @@ -package io.takima.agencymanagement.model; - -import java.util.Objects; - -public class User { - - private long id; - private String firstName; - private String lastName; - private String contact; - - public User(long id, String firstName, String lastName, String contact) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; - this.contact = contact; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getContact() { - return contact; - } - - public void setContact(String contact) { - this.contact = contact; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - User user = (User) o; - return id == user.id; - } - - @Override - public int hashCode() { - return Objects.hash(id); - } - - @Override - public String toString() { - return "Utilisateur " + - firstName + " " + - lastName + " " + - ", contact '" + contact + "\n" - ; - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/model/ValueDiscount.java b/resources/solution/day-1/src/io/takima/agencymanagement/model/ValueDiscount.java deleted file mode 100644 index 61ea2fc..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/model/ValueDiscount.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.takima.agencymanagement.model; - -public class ValueDiscount implements Discount{ - - private double value; - - public ValueDiscount(double value) { - this.value = value; - } - - @Override - public double apply(double price) { - return price - value; - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/TravelResponseDto.java b/resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/TravelResponseDto.java deleted file mode 100644 index 38a2048..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/TravelResponseDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.takima.agencymanagement.presentation.responsedto; - -import io.takima.agencymanagement.model.Airport; - -import java.time.ZonedDateTime; - -public record TravelResponseDto( - String name, - String destination, - Airport departureAirport, - Airport destinationAirport, - ZonedDateTime departureDate, - ZonedDateTime endDate, - double price) { -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/UserResponseDto.java b/resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/UserResponseDto.java deleted file mode 100644 index 5a41162..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/presentation/responsedto/UserResponseDto.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.takima.agencymanagement.presentation.responsedto; - -public record UserResponseDto( - String firstName, - String lastName, - String contact) { -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/service/TravelService.java b/resources/solution/day-1/src/io/takima/agencymanagement/service/TravelService.java deleted file mode 100644 index 37969c2..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/service/TravelService.java +++ /dev/null @@ -1,158 +0,0 @@ -package io.takima.agencymanagement.service; - -import io.takima.agencymanagement.dao.TravelDao; -import io.takima.agencymanagement.mapper.TravelDtoMapper; -import io.takima.agencymanagement.model.Travel; -import io.takima.agencymanagement.model.User; -import io.takima.agencymanagement.presentation.responsedto.TravelResponseDto; -import io.takima.agencymanagement.model.Discount; - -import java.time.Duration; -import java.time.Instant; -import java.util.Comparator; -import java.util.List; -import java.util.NoSuchElementException; - -import static io.takima.agencymanagement.mapper.TravelDtoMapper.fromTravel; - -public class TravelService { - - private TravelDao travelDao; - - public TravelService() { - travelDao = new TravelDao(); - } - - public TravelResponseDto create(Travel travel) { - travelDao.persist(travel); - return fromTravel(travel); - } - - public TravelResponseDto update(Travel travel) { - travelDao.persist(travel); - return fromTravel(travel); - } - - public TravelResponseDto delete(Travel travel) { - travelDao.persist(travel); - return fromTravel(travel); - } - - public TravelResponseDto findById(Long id) { - Travel travel = travelDao.findById(id); - return fromTravel(travel); - } - - public List<TravelResponseDto> findAll() { - return travelDao.findAll().stream() - .map(TravelDtoMapper::fromTravel) - .toList(); - - } - public void applyDiscounts(Travel travel) { - if (travel.getDiscounts().isEmpty()) { - System.out.println("Aucune réduction n'est applicable sur ce voyage !"); - } else { - double discountedPrice = travel.getPrice(); - for (Discount discount : travel.getDiscounts()) { - discountedPrice = discount.apply(discountedPrice); - } - System.out.println("Prix après les réductions : " + discountedPrice); - } - } - - public boolean subscribe(User user, Travel travel) throws Exception { - - if (travel.getParticipants().contains(user) || travel.getWaitList().contains(user)) { - //User already subscribed or in waitList - throw new Exception("L'utilisateur est déjà inscrit ou en file d'attente pour ce voyage."); - } - - if (travel.getParticipants().size() < travel.getCapacity()) { - travel.getParticipants().add(user); - return true; - } - travel.getWaitList().add(user); - return false; - } - - public void unsubscribe(User user, Travel travel) { - - travel.getParticipants().remove(user); - - if (!travel.getWaitList().isEmpty()) { - travel.getParticipants().add(travel.getWaitList().poll()); - } - } - - public Duration computeTravelDuration(Travel travel) { - return Duration.between(travel.getDepartureDate(), travel.getArrivalDate()); - } - - public void adjustDates(Duration delay, Travel travel) { - travel.setDepartureDate(travel.getDepartureDate().plus(delay)); - travel.setArrivalDate(travel.getArrivalDate().plus(delay)); - } - - public Travel findClosestToCurrentDate(List<Travel> travels) { - Instant now = Instant.now(); - - return travels.stream() - .min(Comparator.comparing(travel -> Duration.between(now, travel.getDepartureDate()).abs())) - .orElseThrow(NoSuchElementException::new); - } - - public List<Travel> findAvailableForDestination(String destination) { - List<Travel> travels = travelDao.findAll(); - - return travels.stream() - .filter(travel -> travel.getCapacity() > travel.getParticipants().size() && travel.getDestination().equals(destination)) - .toList(); - } - - public List<Travel> findInPriceRange(double minPrice, double maxPrice) { - List<Travel> travels = travelDao.findAll(); - - return travels.stream() - .filter(travel -> travel.getPrice() >= minPrice && travel.getPrice() <= maxPrice) - .toList(); - } - - public List<Travel> findNSortedByPriceAsc(int n) { - List<Travel> travels = travelDao.findAll(); - - return travels.stream() - .sorted(Comparator.comparing(Travel::getPrice)) - .limit(n) - .toList(); - } - - public List<Travel> findWithPromotions() { - List<Travel> travels = travelDao.findAll(); - - return travels.stream() - .filter(travel -> !travel.getDiscounts().isEmpty()) - .toList(); - } - - public List<Travel> findByUser(String firstName, String lastName) { - List<Travel> travels = travelDao.findAll(); - - return travels.stream() - .filter(travel -> - travel.getParticipants().stream() - .anyMatch(user -> - user.getFirstName().equals(firstName) && - user.getLastName().equals(lastName))) - .toList(); - } - - public double getAveragePrice() { - List<Travel> travels = travelDao.findAll(); - - return travels.stream() - .mapToDouble(Travel::getPrice) - .average() - .orElse(0.0); - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/service/UserService.java b/resources/solution/day-1/src/io/takima/agencymanagement/service/UserService.java deleted file mode 100644 index 08903f6..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/service/UserService.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.takima.agencymanagement.service; - -import io.takima.agencymanagement.dao.UserDao; -import io.takima.agencymanagement.mapper.UserDtoMapper; -import io.takima.agencymanagement.model.User; -import io.takima.agencymanagement.presentation.responsedto.UserResponseDto; - -import java.util.List; - -import static io.takima.agencymanagement.mapper.UserDtoMapper.fromUser; - -public class UserService { - - UserDao userDao = new UserDao(); - - public UserResponseDto create(User user) { - userDao.persist(user); - return fromUser(user); - } - - public UserResponseDto update(User user) { - userDao.persist(user); - return fromUser(user); - } - - public UserResponseDto delete(User user) { - userDao.persist(user); - return fromUser(user); - } - - public UserResponseDto findById(Long id) { - User user = userDao.findById(id); - return fromUser(user); - } - - public List<UserResponseDto> findAll() { - return userDao.findAll().stream() - .map(UserDtoMapper::fromUser) - .toList(); - - } -} diff --git a/resources/solution/day-1/src/io/takima/agencymanagement/utils/AirportManager.java b/resources/solution/day-1/src/io/takima/agencymanagement/utils/AirportManager.java deleted file mode 100644 index d48a17b..0000000 --- a/resources/solution/day-1/src/io/takima/agencymanagement/utils/AirportManager.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.takima.agencymanagement.utils; - -import io.takima.agencymanagement.model.Airport; - -import java.util.HashMap; -import java.util.Map; - -public class AirportManager { - - private static final Map<Airport, String> timeZone = new HashMap<>(); - - static { - timeZone.put(Airport.PARIS_CHARLES_DE_GAULLE, "Europe/Paris"); - timeZone.put(Airport.PARIS_ORLY, "Europe/Paris"); - timeZone.put(Airport.NEW_YORK_JFK, "America/New_York"); - timeZone.put(Airport.NEW_YORK_NEWARK, "America/New_York"); - timeZone.put(Airport.NEW_YORK_LAGUARDIA, "America/New_York"); - timeZone.put(Airport.TOKYO_NARITA, "Asia/Tokyo"); - timeZone.put(Airport.TOKYO_HANEDA, "Asia/Tokyo"); - } -} diff --git a/resources/solution/day-2/.gitkeep b/resources/solution/day-2/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/resources/solution/day-2/day2.zip b/resources/solution/day-2/day2.zip deleted file mode 100644 index a7f5535d8e48728a50bdf7d56035e61f38d2449c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33921 zcmWIWW@Zs#00H3`s|XMc!>kMn3@M3~M*5*4ybSE_U7J%i`ZlM6=+X*q21b?_%nS@* z0%8OQ0|x`L5!X2x7<gbt6y)dXRpjQtO|rpm(%#V9e$s{lwdcck2nNl+re>lmYSb;D z#k5j0aG~h>bMI2FcYY7Ly))p*{_Ef3KIAcZgkClO{o~A!if1>LrQh~hVCr$S`%j6* zp>}7M%8(;A{(kND@AR6_AKqMGuwbc<m_TOAi=9@o%c7>Mx1{9oTBfOX2OVhjIq@aU z>DZ48%L>m-Ui(P5dh^W(XW5TiTiM7={C)CzwD63L4bQzc+b{_){n1(U;JQ-Mt(8^9 z#$SYzS3lz7k>Q{H(?CYSWwR37$IVt{FRp34Okh6km9kN5{o@JZ5t~)dOQdzKJm-9@ z$oPc9^(iJYr_+NzTXt`m8TKb(`uoBhkJw)qLhN?@EwkIZch}CvDQ{Pwh-AB4GsWVJ z-ac-olFC~9pG}LVJmpkaH&JhbALCWs>h%}c(z>!893Lcw1+~O^C!F3C#L(B(BeeTj zndwDUiM0!IdKkrW&K78YpD~Fqpl}u23>Q^#g^gNaMok|cTwHD!xM}`2^VT#Y#=mJ@ zv%;1JB-zDnIo0P=ZXbAwRXZtCW3ESlu8rNH;}tF^&p93S|2fH1ZmRAd!TvSHWd+d= zm)0uuE^M(edt0rS$!#0bkZ$=n?u|;h%rlL7%`(aYu10Y^eZTG%J#o8uFnKwH|GeWe z{a?2J(Jox`<bQa?<=yd*LQC!5hE~?<e-Vv3?7Hmo!kDMC(i7G^TUM`l|AyrMwA;ET z!k5Nd?vC}jFL1B?Y4p;s&(19po3(aF$L!lmVV#vLZqI#l*?8l1fw|hOH+^gttXzEM zeUJDRpX#-%;$OYeyZ*A=@1AY-*IApZ4lm%k70w|nCi-)Zy7tR`6Vvxh%e%*Yq$OjX z=M(vR){b|LMLpwQIn}lA{51Vn_rs=>35QFie*DbIterG}_MSO=^bF7Iw^$k)O*OUW zoZoyYZ3D}Z2{(BUiY=O&X3SW7)5lFS-q}BY@?!4YtyRmz?QCk|rhWUGJLB$^l=!^c zbLa7S#l7HN%a^<%Pcdr8cE#;|5l-10UKMv1-;g?2A-Da$QunkoGt?YYPlfDHyS7P; zPkYwRvsbrxdvd8=@%yVIr8PNnhJpFZ&~){lNw(~t4?I8Z_NV*GnN|I*SEgV2YjN$= z!w38U-s~JgMT?H>F*7iLavLNcg0k<XNF9`{%n8ef#YM@G?0i9BVXAP~=2V&Bg{fGx zGsu`oG-LRXjmb^S%!8PvEwC^Zl%esOl^ucVBnb?&ic*X7ON)|Iiy@|F@ewc;RNx?+ zD$dBjpn=EKocwf?EWLuF{DRb?lFZcNP*Aak$Clc@(_DuP1YE!W?aJ9?%;;#|s#B9F zuFLU?oyFKi_2iTk5wDl~Z(rYJak~2aOv(1L&(j1adTkL~WHs;G_s?CbMn4wn6eq8L zE!EVhu{<JiOYJgw{|Ukc2PRxNnD=a&Y31dMOe?b|bL^4%reEx5-W{$tiz7+n_^<WW zHeXt2#7U%i7G5^{+p$XM*oH+X_MQ)ZB_V!$)<^f<?~3A#4(@oa_?r<F{qJZ0ieA9L zzyR_)BKoHV%n1j@9}Ej)gi2OoSt2Bub*y>`M;^L?V%QDL%%{LiS)68;BxYyklHy#q zD%7;5N66^J^whlM%G|`f#PrnM)VvaiH&na`q(D&krZl12WkRxDx%nxnIS?CjBOo?{ zXso#sl;)$5Z2Tb2z+g|NjUh#eWvMxOprioK3b9bjK{T4>OC!(bJu&0icRrY-_#{ig zUk2;huA6<iSvY<*=U(*IkBXkT>h;E0&v_=gpY&|Y<}2%mot&n6YEjPlHT=7UJC!s) zDZ6^<>e^joR^D?`^zV^=lk4?YkA9wb?bq>%SGDZTR9AnS&1=7{H{c0>)uNq`+^5~Y z9&|D4ZSzdOk6QH)grxtiOqO*%W^drTH*<HtsJ=&FpytW*P4gmL|J}^#_!o81Kg2M| z^lRgXB6*&=fTq_EXURocBz{#^&0ZNWH=(>rM1A2Qo)E)>y5f5`^|i|$Sg9jD<=Co7 zqm>oDqWP~1=4G35-MZAY`guXylwLDl<9c!7uRROz-z$tXiCued;-!C+eqYGDbs)cf zqR$@XH1RzTbbC9i-bZXwKXvuNk;asQvk#`s{p!S~J6~0Is_L4_5C5Gsn4i+|b<=^Q z$b=<2nKN_}yLs;Z+sdY}QNI2TYuB@wdv;oCWe(?GXZz>dechcg&*SX86SbimoA2$m zC{bIn@9*k_wKtFEWnX()JMq)k%@6%%+^f`%`#*Wfq9t$C*H;OypMUdP)%zd&bIjs+ zrd#Tt?Cs_?&#GB`ytZJ+%mm{nY@9;wTxBaNT{jACma(my+%a1--M`;e;KBPn_czaT znY38iabf47jv^6TuP-JXn)<0nx+Xqk){5a@kbHwBP&A+~;8KX)iiZC=8D9-c6JG7R z<9LB{S#G%X_O@)l-fuhKT)#1)#XC8mWp%Dg=FI!q1qng683jB4T1{Y9dMWtB$u4<8 zw&**BUk0%P6_31H=UfmGerd_snwseFIa;1~#=XD|52Bp)JpOf?#C4nqI3W>x;apkH zwJVMSdJ)x6rdzRIGK)VYdUEd_wv|c8erSI)eAqfaLR0@t`udP7cYl6qtxlYDH;C^; z%p+r=jlXi(cvC+xKD>WJq$^W$S$K@=cDZ@iC#Id8BWtvE`JS-X?vr;J&UNrRE-Dpv zs7mn?o29%{+~i+}eiYki1?0Cq_c%1Y&v{i<=iixjtJQWChxQxFTC5A;b~_$<Xu<^k zxbUOXVy!Hl12<@0p7lSgKfvep&c~%!Zmf-8^(}1f-T40nNmh@%+gx^JwaM>Y*7w%n z+rG!4Cs`&Qj5n`cC=u|+VXwHr^DViNvG2C=`@Da9v!o#W_Ui@TOzwMJn}6=)&9|bJ zf5p|9gZs`EG;^w*opQla?!x<>PwHQL%zJG5W}|SBx@siHx{aUHk9X#jcnSJ!TNCi- z%J$Xyb*p`+zNxS^YkJc&U-8O`*(x5Fm;Lj4&mL%heZ!wV?#$CGL{2jIYHVv>wKyc; zLbOYJRfS6;$92<YF?TnES{cTcDWy`W!ZmA?QlpEm{@;G!y3pBz`YRl(ayHw0ebTwu zChzCsYd>dB{w>2(A-6X^(qdG0j$X2~o54dkp6$TRA9f7qmc3_D@)f$y6ufKZY{myS zzH>Z@n-t<{GV}a*y~8zpiVrw)suMk(G%S>soZG^E=|w^JVy5$Yz6VvOWods|c|t%k zxbmTrh>wHNniq3qSfcYdHMZ*1@|e2YggH$sYO-9<rs3kIn)IM@U81Ogk$d0^vBt+Y z^f>%eKdUk>-^_7M)%w}Rubn@0(u`TMU9K4OZWM00cOph1hwFam+Ueh~TZWs8XSkow zT`?zZ_4<~5N77#Fu_t9O)#uoE#xGmy|H{^9>mKWEI(y4cXh!NsyLU{kT}$gOo}9n; z`EG|I>)R4m8#_-Q_RgsbJO2EwUA=SV$#dslKiQ*s?M`#tg7cSe*`3Xt^ycchD+jKr z)?VB_+ly)Hx>|0-^9qN5yZ?D-So?m)p5g=FdsloljQ?=sp}f@_ZuW{x9P&nUW<D@$ zua7tT&kU-wW9~0w@?>RT0F~X4IvZ4~KQ2bpBWoBL7#zqf)g3d73i69e5XHKbJ)};- z(mG3>a4_qz0Z-feO0LI~nU(be$_#p^ml&Qb2=ekfc6!elld`7gJYFw%pO1~%watpd z^S(Z3rqJEEFG4E}3zODw@u*4L)hu?5JxXf&i;vEHt2Jgl`|eokFe{RI%^Q;__P#)t zJ$n<kt^8?qyl2v^<t^zI-kOdDbJGm!el1@qkt?_+qFQr$%JJJ>qJO?Fb-1vb{Q>hC z8)fTn2Q<!Yo3T{7N8#)TR`bw{VSB!COY?hOyVE2yUFEBSez3&)Y20e7>sls12$nQ# zxD}aNrC?<}tC??7f$^@^k01HxovmH@US-O`&s%?=@k>1W>9E0~>3sT1BF(R5wD0De zt^Ke0ixm_PA{9$d{bFEX0EIU8cqm|CU~nWe9$Yeulk-dSh>Hl_&W*ec20Sd){tty_ z={THLI%asn>rsTF2**Zi%^%O+ees*~Lg0#&m8!0Yo8<l091p?Q3$JKYGJeQDeQL$E zrEiZkt)3U7|M~|*-{1N*%}r0{y?@D{f67Sz!y$H%Pjf;u-bOPpFo67n-KQ3e3=AG* z`ZOT5C^<E+gd`8g_MPQxG7xBaU)yCXCM<aF$dTsq+SVwuT?^|oxj7a0>~3{ZdAD-z z%)e=KC(Nx-o}jz<g-5s1-yWH*1}_(0JQ8$UEcEb<*YRB{9;!|a>Qyt(ShHqU3pZ{F z&bB$Q&bP-=>UpMs;KHq$@&}(DO*1zB+<#0{aC-vd<ykRmbsAG<^IezE`uL1zk1gAm zc~Lfxwr4$@BlWYcUA@zN$MGB0lS?fa*FWT`(ckS58|u0-{OlWUa462s`?rCCfdLd& z*h5jCk%7UD%uozV%qdMJDGWo;?dCdcz{7gsZv4WHvajShTKVqoE)AEx*!81TzER-Q z`_efqNxt8{UOgyxwIQCV%;@0(w$z=GrjlEpCY(^qjPc(keCT<98mm`w&j+`;FHZ*U z%n{!3ao03unVUK+Q$9Aj`>^cQzRmJ@*R{9)v#)zhFMiKeth;V<olL6l!#a)ZeL2@2 zn+9>*xg2><_e-2Vd(6MZQWgQH4(3_jiK-H;2Zh*yI|9M;7#J8p;erS;<Q8*37XyPW znIRThoLYn^=0HtmP$v{bqqSb=h8@hiZNRhlx%QTrXA2tZ6*vsG9B5!XT%}QU+jZkq zm$f=eC(TKW`22oxPUN(lTb{3-lV<xrsaA3Q>CzoumC&;K&ZY3Ui!$?4K5kzml&7VZ z8@F;&=h>u#t0!NYw&#NJ+3eG<|8`U-wwfkbU9~>Q9mJ8vQ)%WixxSmV@%56QGo##E zCb1tn?fdD|$t=G0-(#eIcZcz8Z91Kqyl~0V*1JCvbh*XtKQmrmtnhl_<F5y9a_tbV zzo~3)sejU}fIq+4*?>=k#Ydb;VP#Ll2SY}IB^I|;1+QdS8vI^-CaGxF&8X7{bYhFc z9B!Lr*JwQ}UAnr~P2t&hKPj=Q1=8skswJi+9m!Bz9{i{7Qf5`=xx%u<zYDb8?x<y3 z9(}V=SHmr5*)`eqd0(gAoAZ8tet-HhQ~gMp#N|^GLWI7B1t)GQ6BZWT{j7SD<@c1` zrEKSKy|T)RZx7^C$W}b@yIT3?+j@aNtka(UE&i~fy<uW^TELZe>E1@)Hz;Kp=jDqZ zS@_9u{i0Vpwmk7T`;oCtY+9B5=A!nK3BfVnUuY+URySM5+8wrd!p0W7_T;2HtkvaT zdu!Rtcm!`{b8UzzS5=EYC@078KU&YdV9oZPrPt0M|FiGeqLwr7Z`J!uO{o{k+4gJ2 z<$wp#d(3yt<fztL`N7>se8u-JIg^cy_BjGaDuT|-SqWaOR+&ECQ)HG*`PajiFMl18 z@ju1Z`hx30Mv3W-jfWWCKKE?)Y2(sU*R*l>pB-`~z~4NUp`duqU*B}DS!+98YTH_O zJbZJYtKs>7W1g<n%UObM1_s(o?7e&MropL%`1E&=wST>OWxw5OTH%~;-#7gL56Y-3 zdOPMaF))BqHzeJIdWt@kh#DTmC%vawT9TOq9UTeuz*(z9Yy`C_kZm+!W?=9lIj2Ev zbV)2pgpAGjg1g8_*$$68T7ypK9WoHu^ITiU?_tssJ3SW}4VNsz0I#kpm+s^y#cjd2 z8E<vfum9X2;E<$$E-gK6?_=MF9EC+4o;eAJEfQvPemd-UgWs?9;L5~}-(=c9x@a|b zJozF1t$Njmu3QJhKeOa*HK*x(dUx<wg2IHAN?Rty92VQ~uW#d3fhiJdt>vNIc5VOW zU0AZh%5ztTq+`eunbcWU*JYkw4|{Rm(d^!_gX!gWKI__e3m@H<pb=%nXvo!*q~z56 z&pY34HeVpS>9vPVTZC8oE?JR#GjD5>r$XFK`?t@RA8!wPcy^Cbx}2WWJ=>25=J)MZ zwtsy<@rlo!r9QhHKYX=&dtJly+|rpES5zOJ;@O`0_Jnuj9Q$dtOa8o2a4g^2b^D87 z4^xY&Df8>|K1bhO+&p{1%w=8-%ky%7%)Y>xv3IgoNw)KRN9Wkx(WdL7JEmN4e(AeW z=&I1dj#*lp?Pg4!WZio%d}YkkWR0vK)tuy-gSMqs7XLwo?X0<aU$Pk)7(fw?NCL>s zN=;@426r-(0JK?&5&w8vmrEzz_d8@D(*FLt2ygg=37;4gJe7qfY@BGA^vt(-j_B)a zWiPEjReh?+#SEUT{9o_C*Q&qF<c#FYZrgE)tw@jI_S`eun3lwHsPV4j)nB#md10Vd zZk-p`*ArYmJM37_AK~8PlzdQl#k}VM-}c`#SsoW@FJj{y$r#!?C;i?J(_58tn-&`- z<UHy0)|jxAP4Akk_u`!~{1YEG-PJyML3C11bIjR;8}7cW4|+4}Y~mb_m}|@4)>Jq? zdO0c1-$Ukyx7DYYGuAX6c)w^`e0J!jdrT(lqr$2h)w-I$Y)^S{|Ds7(`j>BMX^~1Z zo=JXj+O}}zrJqmt#7_88-__6)t|I4qGG52i#9LYFR=bDPzDF0lL-vJ=PZAdTwfOzX zzZ)07yT9X@oIO*N@nnmao*fS?%I!?zjf1l**X3{grui){<^5jp@ZL41RkHSs3=E){ zgTyJQ;E+Ze-ZCONPE!)0BX!q2i6}-sXCWqrG<X;oT*$J|D<vrzGUVivn2)Hpy_alG zg<-UM`)OEq{w)KMzvtHP=rYmFnYeVX`NejLvnEztx)<Im7v)Z`I-9-CxqI2a@3D`k zurRH;{B7aoHLF<eKQ69a*ROw4WB0OPMkCd>xYIL){!H6Y=_6dz;hMy;JahHM35C<N zHgk(Fk8ybt!+o`i!OGm|(vuFURhMH73pa7BG`ehVwb-S;-$UJ3=wOe}<S^Z`RW5E* zA1FJYZQ9N!$u-wKO~tImEq(8YX`O4%<(9iw8SNC?qrUZ~#FopwI{Q0Rn8gCuKAaK1 zVdElWLD`EUbtVk%%bxIjXOk-LIN&|=0!P-S#-khJ=d0cQmvQG^xzm{~3dJ|mRz6u^ z*#CZ0V`PoV!I+g_+?+$hH}YEd%xaDg6OQ<~qhDGfIPuhq`#Fy;J&m%?I@;!Qd+KRZ zmEsQ71K$H2EM%Ow+sldU{-VmSuy7+sL-dxDQ)dLM%&BEwaO#@2mbw>@`z4_V`wAEG zhFwwPZ@AcFl=-Yt*Gky;!-Jb$4Zj~AoL=_cMy9b|;=r^0%dY3FU3K2%;-N2>QeN5f zbLnnNiS1jOmD|wQGl`=vko9}u_q-pcwf?+_tGPY(aQ>~EX2F?8{pFwctopPi_F`Rg zs!p<wZm;qG(tx-bPjz;NWWLG2p%Hb1>ksSm+3f{lv+o^^$f(^NwRx%Pwv5+{4DW|d zFX4Keb5MS1#oLzu`*uCKVwKYvAFq(ddb-!*bgR>$N$=M^{1>jjDOai5??_`V?;cs# zf604}E#4qrb}XS|?~V_J78aUWjLXUbr}2tUd3rZc$U4mHfyLWZE_WPm)_>>w^Hs+@ z+(_twwy#iO_8gxGX;#^VbD|%VWJ;Vr_2HWT?>y6Hp^O(#<}In4u>0J_uc?0%<4PAZ zhg4s)FT3*LYp?~6VaP;=z3-k2@FjZh*Wv1uy<FY&c88YS{)cz|znV9z_D%QYO`LO* z%%}RKnHXj$Jzu8BZhvV0{HD#P<u_IreYz6q&N;=j`1#rg6&Kz%i*i}={OUOLeMW77 z%JG$)cGmTpk3{^$F0Q>6^;h#)(Vv}@??|Rhee_?~IMh<SZ_^sH*u=H168=T&B@e8+ zskih}+9RFqa)-B{%T=^db(So9-u`pTuKl|r-%HtpON`)?&T|Zy85ltM6j5UQtU_&i zn30@=i&KlrGLusw!_?*8M3frHc1~j^r+W#r6H;mfLtKC;Iq<k*X^^+yVFQ7?&qd;P zNy{%_R0)V|=wcD!GbmklbZz~O$y2z#zO(T4loDCRmG*Sw^S?RO6S5<eg8c;6Ol6#C zrM;akCrV<Aic*`G=b6nulJA-3&eA>5`8!E3o+)I7`h!o#4s3glE5uE{&~oSSK5KSy zgQ|38wF`28?tGnlQ#3^3(QdKL%U`~2ckw@Ub5D8Hq)SPwlvJnaKacWMGd*%*mdIu` z``>4brk!FBWmJsT;GXsM(5BG!yHmu>|8m-$;@9c*TU%wgc)^=btI~AVZGEQfmVYo; z$$HzICpQ-|1xe<_`)qkoW53;6_ws{BXUm!<22F@+G-qD(V%xtrDHHzB_z^zcUT)Lg zsqP$0mV8RkylD2Pob~Z7)zc*z|BH(cGwoTL=ef_@g^Qz&f6fy5v(@)2ZQ@wcU#)G- zEGqr<?rGUgaZp<#f;Zrx4I={sDBcjMC=4wXnUb7}auW**Qi~vo$c51C3aAC^hh${~ zGXsMsxmH5bkV{FvFW3o)RAh?V8G8eF=N&fSx${+2D)+zzehFEol$R40X&99z=c)xH z+bUetyQTC$?p9c^eUn1)&H$DE<H9c&S{)QzTGsVo39m+9&ezNXpAIijO+8S}vsA!I z`aRR#BfF%exAI>|48GUMFR^#C;Pxj$*H6bklWUq*B7D`YU2cc;r@dFM{NR(-xWsmK z_2wTD)30-X7326WQ@A|;zEteVRgDr)H9D8RX_GyXuc#7z$b~6s`z2legEI|h_xfFW zP^32DWLojl>jDeg9dZxY>B<L9wo*E)6<MeF)0Fkf=hVmgQ>{}z_kNN2JBP8P)okJB zIcxW*7791LTkuoAG4oE$y;d6q|1Fmu9sk89JW1U^XXT8Qy-RfE&)-Z<+&Lk$bmg)g zMcb0LF4sI<d_gqZ)7q|k^AB*Tb8_|d&uWYe44^22q!&=+A*Yu}MsnJou=G-#T7)I) z@T8#DK5x+6ZQFOtqdLM9VitHGow`fF=77X;p<6Z{%S0yLySpT!h0ChD^3UhLlU+<? zx3QRI96M)qCH2#@hZm+Fo0$IAz|E^y;M&m%Kh&l2uDteM_oLn_u<u~{t-=|$&(Fui zbsyfkoz17;(m7WAr$s&MJST@v^NEr>r(9*-vHZa*wd|&aDqAJ8RURo;elS@#chja_ zs`qYB`PtI9<kkTtxew8|+0JJ~Xk9(?UEQz~oa1seQ$p4<Fff3^2@-;!mR<=`@(1y) zNKXDmsl^5PdBv$NCD0aM4es;~u@@9`$k}c_0|SE}W%d@Q76l>PK~&x=J!#0r<jB+d z&~CZMN`+#^=-0X;`~sT`Id@OynHh27(cQaF0xa=g?f1FaTvk~THz{px$hP!9Yf_>^ zHtHzu-C1h6RG#tH<82zr9MwG)Z-t((f6rjQJ7tA$#q}4K0aFjJ*ZIPJL$|ZIUwh93 zUQmf=T02=Ihk=0s<Xc2IAcubyBLhPKMd1J`gRq7Ko>-~v_vSj}z|;1<xGPfYM9hJy z7lbpy-#zk~kfAPlX^X<6yRr)-YSO0u`9D3pv7$}6YEnYMGM<HDGWwD`)Ff{<CB?T? z=lEPZ7pS-BTmSh<8@Qz}v0IeSNoYx!V)&-j&@|!3wN*^179}EklSF*?g-UF^ea>6_ zoc~5+RlBOTp4H`siTOtoRBWm*3trV(V5Z@B$o$dGe+T#6u|8j=v0vfImn`*_{)_az z1gHOdmG_Ph6qN4k4L*XBGC07%tII%1s-+as1lhpEz(9Hv#Ic|Nk#sbja5h0|1JC*~ z84B!sAKWu%noIR36{katA2)Oc_Q>_LZ=AC9!rLp`bc8nXKPmo^RCd#Ko1xY6nST4{ z*O{KUK7)J05u0_XjXFNF-g8}9sM+$ZS!H6Y;_LrA56{`K^huL#luqj`)5{MyRAw75 z7n`m<EpQ(9@8^%$cB=2T_FT8Y<=H*a*>}??^Xv6YU&4N|?D5j1nI&5TH&+HvVh(>H z)6?5n%e1g(s%jPExyAgiTd%BG5ZLl2&uXsC0Rbg;9r1mZ9?ZPf0^gbsG_DoQJn1#5 zSR>$7$+NXrexBA|a5h%{&!tP(9IsboFJI?2&2#U9E#=x%lq%F#KTF@c*e5n{&V$97 z98o!sr85uw<7jbNC+)ph>}A#&x0QVdG6g4Y7PwfmCghf>aAe)0*dNv6i&UN8y}o=< z)a6=q+BOAi$9+DtCH36q3e;_UxB6aX_Zyp~S--VbPRa+x=bnG9OMMs_7(lUx$Qo;7 z5o=6*7#JAfON{hV^UA>M362HgTv@{XfuFCCzlgW5yl|7RkN;Wkbv@^O&oFN)3jXZ1 zgDGJXW8cAp5C1vpZQI$YxpQVEN9Tov>k2az7(mWB`bnV7f`NenWGTWqMsWz|tY=_g zP=Mvsl>FrE)FR#F{M>^4;#9r-vecrY%#>8UO6Y3DgF!f5ncL&YcSu3N_4}Mh?Y7Hq z&APIa_rwhW-5HWO>+=^#i|57F#l`(QwrFKaldQja_LNlb@-QO@p56nyJ+3A*@qM%E z70=qREIjY|gU7QzU0iZi-{(c!QtiaGaas#gzJGZ6Rq)^UntAP&3)<EhUEh1+vwFuv z@HB({4CNO^3=9nG85kHK{sWc#EcJ-&1LAYT{HK?hk_ufL!x4-#Pe2R;<wO5)gh2*O z3=HtKK@fv-GmDcED>Zp>8dy5PF~7+{p!NN~uCvFqgM9gI8{}LjC;9T;T4HW|$YYw` z?%An|-|m-RWWCiQm;S8UI6rQ~uBmfOR%oladOY8(?iH}aC|QaB<?+nddoNrq64KD+ z_Brcdcll|{1cj+fCo#1uGI{a5e3ll#{lHz>^vRBCk4}AxYTmfWmgDxNw~RXq&NyY2 z^iKJ)c=opo3oLBTh0Wcfs;eEk`+Q^2<~cVfM<3f*)RJnk+9#Z65?e*C>1F3na{1Sm z7k`=MQ>%J<X754Eosa)1@c(K5_U_XA+`d_5b;6py|8wPUHVN@5t<U|<EB!>Vck$hy zlPB@44=BF;^x>v&U2jeo>uZVRZk_Re?yUUO<%T8&J!St{U)s#ov7RM=Iz!xh;e$(S zfBwyUuzU4sc~C-46>_@?n)v{QG9vtgqY&ZW&cwhVjvA4mbefryS_F@S|AIK<pmowg zKk)Qzb(h9>!3h%{Ovr0j^i#MHBBzjjca?JI>LV*}+)loAp()_#+LizR7k|24_5a}- z356qkwTk)c)-7d-PrUnc+l2h5kH5veE0?~@ZsY9Q{VD97nbQld*nT-1&U_h>PY0f# zbFx^Fzsro(d5zps9kYANz4dX-VFJqLGreM-@bOw3KflTIz?HYxbJ~$4k-txl2)LHj z#NL>rbES331cy4|nUaRBTya8QJLPswxS8U_y(H?xf$z;#)+ZN5-Ez^qBJamJ@n5Q7 zciMxBh^3ECST#L;#GqP~cEnRo&@w$)_zC-8Bg-|H=LpUGes1R4hu^Lql{_!s$7wGU z^>oT7jw`=-zPxlgFuA>`=CUwPLi(AiXw79j6_xLv9gA9fV9PA?w(VX|x8AB{0!0UV zxW+#%Mg|5@pd+FKd3-cNiGe{9H9AT&T~doP)ANub1kZ@)+gtvi0V{?N)%LC_Z>5|P z-&QGvWN%+Jt7-+?>$?{G1?g{2m`(Y1`8*$Iz=^Qk++NEHbN=Q$nm^}x{mWRrbe)KX zkdO}&bGO~nVDNKs`l;e(-)8=hb=RBuUxGB{8ejN6alc~E*(4{pIi%o$)q@H)!(GRD zwzT<$Wt~zFI&*nX&W9AKv)n#{R}Hv14tpIvVRCs<40H0Aji$@v9WHXR-`pj;WJZHa zqgYestTw4>R&Lv!E{PvBO>-1<=&W6J!bC)r*L8NAQuLZdD^D$o&N6gtY?&GHK+xFV z?3fQD*N2$y2_6Te4hcThZr;<AAeXe(aAq4%e}gEiYq?Lmki=ul%M1T%>Tay$5!Df? zZ8Q+=nUsFGyXocX`Z=@ZpQdP~^zi(dVKj}^HG9bkt;&hEQzqLsT$%EtNjHnl`aY|* zF5~MRjkb?i<F-waZCRWDeFk%}i$`uwF3a86raVr^@3Jh+O03CZhb}s<)edQ1`1H=@ zN0-+fUEZa$?pYM~yB7whn)dQ+S{G(4cT4YaqILU?y5d!uX%Cq;TdweJ)HLd}HC_48 z^87`!$OQ`B-GK`?-3<x3H%<FX`J8}<OLfgnXL-~GPS~!kSpPJ5;qR{^C(dhcEOAk< z{86v4Z{o@czt4TUbI~ezRc_VI$$9cVR_-e&RA$WDzwm&Ndsgg`aHDm9pRc!l^I7Ok z@D^pR<OxEPE?nc8m$7KM+KV&WSWApdvv(J$-*s2@f3)8r=#}S*BkksQ*A=VOb^mZX zG4rLK%D%%Dd%{0<yq%<FC(Y6ClXy70>F(|CQ*uRi-`kM>_V9tK9HkPux|Uk*Z`n>; zC&+Etu&&@pE%*1RGj4~HZRfO`tDZ0O`n=}<zVeLfhrgcPy0OcQ<^P2XyB2%x*8A(5 zk?dmKD=O<%Ah$$qi{YZPvWuVXm3Mq(oV#B8%F@>re6JSV&dh(ARv&WK+C%bdq{vF8 zeJ_`v;k~$Yj&*$EiqMkaw0ECmFIoG&m-M~EyXnC(nP;JC44Tt!tf`EZ?E3NSPWn`T z!S_4PPfAj9T&ex0YvMCgw;dCi4}Z7%^7V@vOY!s#;!F2&vD-H3rWc&p`|Ux><SPCR zIT1VSKGc3Jdg%D}{r&lVyZ>h$S*sU(_xPPxdRvc`=j#hk_5AZLZLfIh{nC{92A9|V z4!_j*YW(+G@*iA5F4YhbNn&PT0A*K1Mn<k6z4;j!;OmPa^;&s;QFd`bVsa|HV8v5g zt__dQf8-`ocR&7N)b9&kthax}IfhMfaPn3-bk6N<Rx8_Y2EKi7&p3F6|Gr;c)A)cz zEc{lxi^1pG=Vs5{ejm0E)W~Vvq|j--=+YEd#w7iZ%@sEV<?lEi7P61oo4wqmlBs{c zg6YRsa}~DiRq>iEk)(G-rK#`6-47`p?o+G}SaKy=@=f$SH8J84$Dw5cYDdb;H9HPX zYmv4o`?a|4ylmZ@?xrc-)A>I6XT4tQv8N^Qzz^BZlR_`zB0Joh__;T6R=PhaX|`h8 zuRN<bG%kY8#KClJ8{3hL8~fgwcf4y{`Fh_<LEkkT>5Ceol&{<r^j;lj{rHZbT>ACH z?=p&tKcqN1v88|5et7n6!GAk9-%GKP;H_R){6KVB+=5>9$C2j!m)Dfvmc9SQ-TC<1 zrBzo-@7&z--p7sqU4fBZL7VyGlUvHJ2+Ow_a!=F#H{*h-cPIP(+P81KMgDNRCT;M1 zvo1m4ou6f`=XV8;gRL68ob8{^24+<Rz1?#Eb^qO&xA*UsFTJ}jxariF8}*fmQ?Gq_ z>|4Tdzw>vThlDlLmZjo_xhoG`D}36Qqp0Up<e$hW@|w?&y@1m&KxiMA(V`+r^Q*VF zw~0HM@f20)cZwhURB|jeZ2t70^?P>fOC7tQ&$Zrl*LJabl~=Fci^a$FH#ruaulf1? z?eX@%r{_=nVAzn}{<wI4&l#-`3+0#Al#BnU<M@6gdh(tO{p-Tfs^=Fc_;KD%^svyf z^IZKfgKG-=fvVrqA6Naoy!>A2^|y7ux<m?jt<4K9j(T+M=Zr6oKJrp+-h<|HTe%$O zec4tS=R`W>530D;Yr1D79$(M;Q1BUFK+b`@NiF@3Z`98-Kl<46uIq!s9*w_3{h6oI zGopF^<us-mdvnI8YGh7zQ7GKRr=*m6RL3>j{$oVtl>-dN?)fEMnXDvq<dX1BAx)2O zJ&&wTb?d+GuC6uo%Cg(Ij9+Fx@1L|N8#mzyi6i-UEV-ZGZ#CvP@A=<ywpQzoc)d$M zTyF`_p86p2p^mMKf!|`=O)@>cZO5u=oEOeKx|g%A;g(U(%wx|#R!sWJ;B$sY&s_Ac z&9uZ_`xQ@A|0!ek<!ZT<QxN!Nr^dZB5gpB&k3TO^`gePG{(SrR*i-K`D<Tv3NUfi7 zp*?cKyG`@%=*)gQ|L^|3Upi-Rs($(Vx8xIhU%AZG%iq6le!ar<FGJy_Hg?6;+F!gQ zgkPS2{&j->UXMcx*Iw%TaV6e}ZrsjRCBeW{#y@9efo#Ri-9lY&mn%PdXXfD~AHL;J zasJ^7p}mbU;@KA;*0jHlnAO%eeYuBni|&Hk{5&!tqK6FEWpvAY?tZvu(Sva7r`eZd z4_#Yt)c$y)!=`!c$EzbVCu?l*6?wYql(3@m9+fH6->3X6`_6oQr;oukUa>b*lTNK# znY}9KMO&wTu-yB^sf<n4hh%JTpYLhrzm!?w)wnRuh+lDb*Yn8PSL{<y|Eu7yK6W?z zgrbm`NoPUn{l&g_H@F_WFQVEn-jyW1Nk@LQ#lfv6krzMAFFcbwv!b+fmFB9uK_#nG zWrKB{*B&&{y}d<u@gWnF-$t8LPwmRRQ8xAFB|YO%SL4#?+^u~xt9a+7ty0UnqIEFz zsZ`#qt~IN+C2n2y{?e+0IV*Rq&D7m16!r8|b=I=fSy7GEiCLx{)0S=#30-;Y_=M~| zow*XTR%unKI<3ly_fwQT8F8p>VVKgA*;ggDE?px#Wq#y7o{d$}QQwR&f6SQhDQWXj zr&GtSy*?PGdE?XecMC(V21_SKYc2nB6}+(LiZd6xEGq*8sGx-u!Jt0LVzg}sqNr`D z;{3eCqMS_F>Uw8lHXa!CBf51UE8yKaNU4r6GPAh2G_|-SzbF+ly8L$q&TbvV!Jxj7 zO^-Hwn+y*V((VyFrf24*q*mw^B!RoQr4kEpZJubIxHm7_kjHI06QfDhS>`RyRjysX zVmFuh@0L_?6?J`k=gBS8N!!=YVUX=&Vl@}EvifBge&_7vs+hRG_PeoPijz2WJ)R~V zjySSNYg)_#PgNlu-2|3k@w@Fu<@9%3e|qJa{pObGdG0ITM;C33<<}6&RP+}KTk&S! zj@$cQ`QNsCT~!n1zio~9?QQaRr(Iv&<U3<!i-54l<O~y^1O`VbQ|3jRgpRLi-TeEN zUD-$e9S4|x+tzP)uf03peBX`4|F2VS7o}O=D5|PsHqX~h(ot4zxs=P%>oP$yN@0z! z<y9T2prY@2-={yFE%Wn<re~;%>_HWSZ5ekY8GJYvK0k6z`0UxxJi9-6?f<vDu6b6z z^TA1f_BW;t-!x`S?J||fI%Qm=#}$~q&S2K>XLf%X|9`)IQ+&Sn{%wqwk62hwG?q^D z;?zx_a4Wr%NBKV+sO|oC$wqNcMg|5@BtfDNlo-$xhZ3&zhLku=h)f>X%vT}Gd}3_? zB|u~!B!kB^6d+qJ@gzVKeG`2X6C)!_qa=$&^VGD|#H6HDljLMWb2D=T%One9<0M0K zOCv)QgVbbjBE^#x9(##AT65y;MlLfG6SIjA0zYwjp79ISIO!3p;iao{R>#XX(8EXX z<eBrq8Yja&POo9`P8AcM&UA9mlrv9`2rcMZ;<cb4ZDZ4<+379oS5I;(s>{pEitC(r zY<6$|cOxe7aE)>|dv!bm0|Ur=ltrB}jib(3AG$XVPk=#u0E#-~vICS@e27RKARCO6 zElg69Q<BY+l2VOR%q<MflT9o^0>(z>NtQ-tX{m{Z76ulH;HU$YFQ9eXAdI#+f*BmT zAe)&$1j=9$a<T$R5|eO^^-YNkU-Er#s&8zXWRYxWoSbHqnq-t{Xlas~n38B<V33+* zY-o^TW}29qVrraZL{;AtQ!Ef$Yk)$NoX}0BdD;TmkeZxiWMpD$kYt%;l4_imnq-h> zU~FKTW?^PvXqcRsY@BFfmTaDAM(?zhs&7f-v<0#u)zZY!#5~Q^)X=~@B{eO{IL*}9 zz%0?g(#Y7*!ZJD0)WR$&*~rwCn!YC{Z5a{icXHE~kv_2{Be^*jWP_2hp<#-JkwJ2b zNs^&ivaxxpr9oP9YI35vnR%jlvVlo*in)bBnkBtM*Nn!YYo>2bqz&YTF31Km^Au1u zU|?oqm}s7CWMF2Ln4Fw!Xl!bjYG!7TWRa3=VUlQ&M%A3Fg{#IYPE9T?$}FkO$S)}_ z$S<L^RSjRBh~B8dY7YtR>#P_@9=F*IiKlY^GI&0`Gtuqy?Ond_mqe@ds<piNb*tRG z`|r1zTNPb7SW1Ot_PswLTK;*9-1O;>6U)W_&XI894%&IcKy2fRE>-c2piUNVZi$0e zYD?vJ|6q?vX#6{G|Lw*5-kq0@f3x9#>84!E%`!Qbw*DJ_K3nVBle(lOU>EPgi5y1G z+$~!*m(Ox__R`zM-)$RLR{rGb<ZCy!X3z6nF}=$*dAA;@Wq!UVV&SIWkMe%6vd{g! z=Jm%++nbx>a&Fg^M91~#3tpM+#bMZJ(&=`Xg-u{dps|9McHx;Qi`~`Re{+93rZC?| zb!FEQ<ryr;#Coln8#ooe%(+pusB-78nRoBAKD1{owfnq#{)3bLyf?BL-Ub?Ii)I^K znX(+*z^;`zTU$K;U&H@wyWfwBUxsH+Q1%OGkcoI6thw+hPtfm@GX|f)Q+y7}@<xQ) z*E%F67-HMO*or;)hHavf45&p6E_R4&xS?0yVI=yBjMg`(`3AxiG~q}KdrF!!q=h}G z;w3)p(HqUAg+0iwfvDt34G~JZ5u}Dlvi?9c`bbNS#5PYTF9|>$EPACzkX-}OnIkPV zQr4{_Ej5Dd8i)=aX{nKt<~V6#4{A2kD>Z`b8i*!3X<<)EW1Y0H2Q{kc74{&zXx)GZ zbuN}7jjw|?BBPD3>!oLwWTxlk7o~zd?v8tWJ+{x0?~nlx%lq2arSmf794A^Ry<op{ zBvaWZILZA(&6*D8M>{T^dH2mA=*TIq%$r3E84L|QpQotytt(z1^KR4P<q!WpSl1rx zG3#`qo8dPbUvZ0~MZOC!Y@W1Y<?2^;f7Q}Yb#zV2{>U=N)~Lhufz$uV2X{n2_WAAW zeEC)*c!OlgU9<PK3=9k)Um%9mmLd6%l@VhKH#ILgKP59Sy%;`)>w(*gQ~mdX769L? z?RxxT)$#`lleRU7U2xSbohIP#n>lIHmZQhFdtE(w@NM(^_$B4Rj>qjX(v#=-F5}3V zYMou(`!OQt7`M;li7WPMN1Dbzm6<Hq5OD6wxlOqTybc?tHGe<)?T>3X&)W4#HH%aO zOHO>>ofA6e+HIRf4@4zb>Q3D>nd6mO?Sp5rJYUkgo<E3MZ}F!?=*!L9^@|>cd;$;K z>2C<FoW;Pv0P-bv|L<nN@PAf8qHa=YN=hX${&(#=2=c$n`@dbO@1t1x<z|V9v{Zds zATKa$tIMpr0+$!n?cFG5dp7Z2^0HO(``RZyy345@qaV(3WNpOpxra{w+;AglZMT-o z&cNCKp0JfN25f!QY*5H#Hcv#Z`6ll*J8AD{UrN6n3cv1KA*QnA&H0ig{>R#4i<Xt^ zZ{k?|vOQ+0g@BV~@09&h|16oa{)IVc5P#xI<=}n>1_qGVuzPwb0|SEyYI8ihBrUgu zC=d4<g3`3>_j!jt@iBHbF7z~?)^~u>>D8h|NBX3K3u_jwYWnE?e*g8d`67u6clsO> z>;KKnR5&5=(ek6e-)^!_em=|W{HH|=>OZxtW6Wq?qT{pXfZfESamSa02d(|TNlA3l zny;G$kNgwNbcm>_xo-O_g5%&CtIwaWF1xwt9e7>BhW!Uk>KGUpK)%54KVN1B202v! zWhE8`r55BDXO`p_Wu_Jr<I}B^&t@?zinM;O<SLZU^%7rt#%BR@tjI3Tx6Bg7)`ly> z|42^SzW%c`mn@g=&5oG!JLmbYJNhlhB=aD9>$WA*W$v62o$RTzC)MrQzefJ$wkXka zk2zEJXvt@6Ra!D3Lndm&#E8TNORNnf6508hyIzR4NWER2HA&p?cUADVpK;s1O@3!| z<um6lKl8F+cCV;~!S_zpw2RLY`nP#Ybb6s}$H_U5H@)zVJHIWtN6)74-q9qtEeSIV zoa7o8=2yh;m@h3_!}#c0L4GWsk>aoY%6V?bqz}*iCc$*NIcZX8q2)946W5>TD1A-& z#s4fJ*}13h>LE*3y^F{Gw1s=l3w?JfPWxnib$iqK;`#sC<n7(Rf=}}3suOw0$H>3{ z3SUUbgPM}+b%>RAAU+2y<WrI$BRW}ukTdY4LU5dc2P$-@#3AMg>sT2WRFO;xGt@KC zGl-8b0iUE5UkW;qpd>LVCsnVw5OUUK<%#*YCJ4_?25*mc{r<BnvZ+OD*Nd*Hp6pqs z{I6zstx+;BRP|;IIv()#{p*%+p-EkNtE$qU-Z^<@uiSLSha7W!Y+Gu+Ph0uqT*k)f zGmQ%vLb$G{dp#F4^0J9AcqP28DLtlFXRly(rR#p7XLf>RJ6IIk6JA!T&OH^AvH7x* znAh{@+^CYdqEV~&o_Lj_U%hfRSMjU%V0mS~Kd$jlrG7KdJ#}bBuR+%Cor#BBo+t%A zTm6uo_s7$q<;80!Y5$fxoI3MN(?V}$DYo=h<2e?6w<q3PH(}SQb=G_DePFmZRnO-R z&ql-O-N_9;f5H^6JEg9jSEYJ&!jZ=(6b?;SWz#$Ku=JQ#FZWNzHD@{tcgRmaJ}X=I z<HabO*n@{FE{RQlc1P=NNw{}(V!Um`;*-zoW~s#|<(;d4vtX{Ld>l6?+w=HdztlGN zEHR@cpBK3DzU?qhdHNu*czfanUE9#N0@LPeMZQ1$TjbP{nObM&OC)bkT^+qUHF8e! zaixFZ^83NtRo)-&a4ctJU;xD@B)x!Q`dk7crZ+J$Fu-R`Qj+w+F>Qz%(<zB1iSUTt zdKza$*G>%dKV%?q{Qh^%UuGSbcv?ITbvvsqDxP7eYE$-xX=<M8Tee5bw;xYo43wMo z`tRrc@$1Wb*(6h?Le8bS30+80F3(}SCB-VN-*ZBv<5)`Uk*4#R>u#{IRF?lW&riBK z>-v#CmCh$w>bb@H<#`NQ5>uQE=3RSb-x#BKjN4anW4`C1GO6D6K81TsWQ(o(oMo5S z<z9_aHEYnF>ABVEd9uNQ2fl~BpDYVr*xzN%c5m$ibJaWL7ft!nCFaS^(@(S(y*ho? zj+;y@3AYYyix%A(JBfe(roRs_O8-B!+x>&iM9Ds8>%8fA=B1j}>907k^TDjA0W0jc zhe&)r*%!0;(7(k+GhhCdHgoQ+n{r6DW>bl7!@1Nf`LGMq4W-mI&rh%DO!YBUOV69L zQe7cAgFAK6k3|joJ`AC&_%21No_o`JemW1!t>0dG-|sG6>Xt0xx4P;YxGp*I$m~@B zBLf2{o)9r8+knXNMaXMw(H4PM=0b9(b_ir`Er>=No2d-~udUttU3(2zruZczH9nU| z7cO$~NzcCKD<d%L(y^$;TRlBDE#iE8-_zWR%Ohsd^zS*x>-?H;aj0tkSp4AHcb->n zPcl}pAK3hjML_hnLTi-d?u&j>_gJpCOx-%6;)-ng%xxlNn_QARHm+JXQQoxkTkOlV zmZ3}v>s|>i%4rGP<dnI8>rb6nJDo`-w*8mBRBr2duV?otL$Y_ViDmJWke+ZSxqr*n zUP`&>pZWfO%kjr`AA(JMH3}D>s@cD8M#+k|d1p5VXDvPz+iI_-I49EWaNElbB9S*N zzl61|E#TvEN>4ozy3f@&#&hrbsS~DgXzHA2^4n^4OzebL^b^)+x8I4r-t*Srz-dXw zAKx#}Skiwo<x%{%%wUF-i2?c74rQd&@Taiux3Oe+*!NnpP~yv~J#~uL7yss4v&3MJ zQLOVKr>(`O<w|?pR=0j;b(?oRzWjG>)x6TY%K4y%z;c_6I}wZw44^0q@MdHZVa9y` zF{t1M;lGX`lE~wTAx47ov~Y}71o9E7paY3P27&OFMrQ^F$aFiA#}gwvb`#p!sG$81 zAX7p3uj6TEsL8|~xC(JFNGrA@S3%++{MS*41<6<<4`4-@jeJ-t$UM*zNe~Ufe;wm6 z%qHbPR){U2AP3okd@L#GNLG*yAiSk<3m#iYJ)jjiI;J7@9Y8jLwl#og5dQ0UiWNQF zK&M_pS^;<uK!tb<WC*$ipd(O0;voFjQJM{_1w<W)irWs*k*FZ^LHMs@K2AG`J|Gog z6}BT%LDqoqU&m8~tRmyURD|8g2S9=BGht8wQDFSn(Tp8eP(r<lVK=b{s6t!-N~547 zRFRM210A6Xww{53VN2r*GF<@K--p<v20BO;bR-psMyp<6Nf+c8&=v&bv*<u4{~;Vx z$4g#tKo4v|xCYO@1$5USpBLwd6ggWO+4#wG4M_)^VK@ir;5E=8b%?<EK&ErZIkFDj zRmg{%few8`xXMhByg(xT2smUnfpQh{!Be1P)evsV5F*b_L?5ySa|*~x<a4J$eAEn{ zAWEuJAg54)N44;rHwAM6C{KZ0fP5g57fLF=M5YVKI|mEdU7);<e5eoTI3`dCf$)~b ztK#H^3^cEkayS#rQ6P(@(RP`GChS4tApF;Hr6j42BJOk{L}?5<UkLf!5*L)nl9VFH ze$r1HLJkq+vr9ms0NSh!qCxnt<84_6NV5^txC6Jsz^#eQe0^Ls6zn7ua1zFIZVAi{ zpd<`(1M)c>s3o7j9Jy|Q)Ka9JrUG*n$oI%+I)M0~GeAHz2>*3dR3Oz=uoE6YXYu1X z&jIEHP{4o=CqO=M0(2$_$a)ao(l~`&CqTjl%P|vpP6$DE7ARzLH4&#cpl0nrC2~Wi znAEc`V2%QXM+sWi1|1*)5(nYGj+2#1brfmGNg%Q~D9(_NSO6U;0dfNfZ)xOKp~xL% z94`S2BT#w*g%Qe`1t`Ujuqq{PgCr_ak9<IO9q8Ny<Q@3PMbVbVI5kpTN9-vI$Zi1b z^+(=zkKEVY(x|5abptUw|B;O~iklOTyxSeLxdW6SKzK{zUYN0HgEyq?;D^};G7))$ zAczmzK@Xxq_^;z!O_(Q$+)s~4+n^ow$a}q!yPjJbpP?E|?EZR~%Rvbgv}GK5_cCb9 zILOr?yrnTs8^z_MY#>Lr1k^HFinOy5v=JI)0SIqt{HlXu32ED+k*xv60`l%5<S~dX zjr$BxtRZRBCd?L)gBPQX27qQtLE<3%*U`}o#TLXSB5?JLcV7}D)<MRgFC#-vynh|1 z;IaZ~D+<^)yi3*~wt<oWXyFv{CK%K~l}|+2M(nyu<X}YiBWSfV$nPNh*Kwl-j$lOc zBQc8rA-)8eiEbZg1Rf*~!hanFEs3#@cpE|C3bGM-hYDyH2go)M-qKi1q>a?tjzfId z=U5RA3u2aC5gYbrh_a8Eg>MiWL17O{)1YvM?O#C+dp&Dne3-0HttD9a!X7mpo+8R+ z#O$UaHY{{(hzSeo?XJNW7N}*w2_jrZ%wkkXNPtoUC`W>57)A|y4O_w?0on;eYS{|1 z4SPE5BGN``EyKhY_NZZ@W=Bj|5VP|J68ePmWCxKpQfrYezOX<|hbs1j!-ANFe~^#> zr3U=zu!Si5h%bQ&hy61mZKT#BK;px`$$@a#6SMG-*sy;@lzqhP+JV?eIP6^<iSePi zKD8DB;tPAwt{qVN1mVAq4{*5*>)sktOGV^uA;^P*TN*u_aD)g}d#Ta(1T8cL`5A=& zItsdwVn6Y1LXhd`IUls}6eJG9e;unyw3&FjLFo`?H>@rKEx-oZ3&L9(pOb7i$t_dR zHWd)YF<%982h5EiHVC7}Os^{`F+*9~05xX5lV~$#H6v=wB)gI3YfF84)RCy+!|6_% z8!2neqlQl@$#&DDJ%yTbr9DUqAL8qFP#!_gGpI4sN}|owjG2!l+f9!i7i#!S_arT5 zDC>Knrd(z(QthVJ78rc30MwMbk|Z}$)(%FE8DVcyLI<=-h150(DEDBm4eLp^n;var z)R<BAAtih$YbB$`Oh1V>Q`TNa%`?AAwwu~5XHZ)Tv|R>yqY3gL@Rr7fz9=z6{N@>0 zwgg$REMQJJ@?H+q(d<S)6e~#Dzk+TH^5zLNTl`UMA!(Ngx-H0C7(g2_K$#DOw=|Xo zpx8q6whVL|keBL%wnBhR2jMM^VSy+%kg+iWW*5jjY>WRv;voFj@j?*PE~2&qAi9a5 z%>c-Y$3dF`Kqi9lmPWB)gsI>K<K%7)fO!Oz#6YXkkykq-j{$9IWC%sGlFT*g$Tosj pQ6n$WMV)Rs6b7>q^<Zrx)>H?0v$BCgDvBYB;f*!}Lp}KLH2{AMxiSC% diff --git a/old/done/front-end/.babelrc b/resources/solution/front-end/.babelrc similarity index 100% rename from old/done/front-end/.babelrc rename to resources/solution/front-end/.babelrc diff --git a/old/done/front-end/browserslist b/resources/solution/front-end/browserslist similarity index 100% rename from old/done/front-end/browserslist rename to resources/solution/front-end/browserslist diff --git a/old/done/front-end/package-lock.json b/resources/solution/front-end/package-lock.json similarity index 100% rename from old/done/front-end/package-lock.json rename to resources/solution/front-end/package-lock.json diff --git a/old/done/front-end/package.json b/resources/solution/front-end/package.json similarity index 100% rename from old/done/front-end/package.json rename to resources/solution/front-end/package.json diff --git a/old/done/front-end/src/app/components/footer/footer.component.html b/resources/solution/front-end/src/app/components/footer/footer.component.html similarity index 100% rename from old/done/front-end/src/app/components/footer/footer.component.html rename to resources/solution/front-end/src/app/components/footer/footer.component.html diff --git a/old/done/front-end/src/app/components/footer/footer.component.js b/resources/solution/front-end/src/app/components/footer/footer.component.js similarity index 100% rename from old/done/front-end/src/app/components/footer/footer.component.js rename to resources/solution/front-end/src/app/components/footer/footer.component.js diff --git a/old/done/front-end/src/app/components/footer/footer.component.scss b/resources/solution/front-end/src/app/components/footer/footer.component.scss similarity index 100% rename from old/done/front-end/src/app/components/footer/footer.component.scss rename to resources/solution/front-end/src/app/components/footer/footer.component.scss diff --git a/old/done/front-end/src/app/components/game/card/card.component.html b/resources/solution/front-end/src/app/components/game/card/card.component.html similarity index 100% rename from old/done/front-end/src/app/components/game/card/card.component.html rename to resources/solution/front-end/src/app/components/game/card/card.component.html diff --git a/old/done/front-end/src/app/components/game/card/card.component.js b/resources/solution/front-end/src/app/components/game/card/card.component.js similarity index 100% rename from old/done/front-end/src/app/components/game/card/card.component.js rename to resources/solution/front-end/src/app/components/game/card/card.component.js diff --git a/old/done/front-end/src/app/components/game/card/card.component.scss b/resources/solution/front-end/src/app/components/game/card/card.component.scss similarity index 100% rename from old/done/front-end/src/app/components/game/card/card.component.scss rename to resources/solution/front-end/src/app/components/game/card/card.component.scss diff --git a/old/done/front-end/src/app/components/game/game.component.html b/resources/solution/front-end/src/app/components/game/game.component.html similarity index 100% rename from old/done/front-end/src/app/components/game/game.component.html rename to resources/solution/front-end/src/app/components/game/game.component.html diff --git a/old/done/front-end/src/app/components/game/game.component.js b/resources/solution/front-end/src/app/components/game/game.component.js similarity index 100% rename from old/done/front-end/src/app/components/game/game.component.js rename to resources/solution/front-end/src/app/components/game/game.component.js diff --git a/old/done/front-end/src/app/components/game/game.component.scss b/resources/solution/front-end/src/app/components/game/game.component.scss similarity index 100% rename from old/done/front-end/src/app/components/game/game.component.scss rename to resources/solution/front-end/src/app/components/game/game.component.scss diff --git a/old/done/front-end/src/app/components/navbar/navbar.component.html b/resources/solution/front-end/src/app/components/navbar/navbar.component.html similarity index 100% rename from old/done/front-end/src/app/components/navbar/navbar.component.html rename to resources/solution/front-end/src/app/components/navbar/navbar.component.html diff --git a/old/done/front-end/src/app/components/navbar/navbar.component.js b/resources/solution/front-end/src/app/components/navbar/navbar.component.js similarity index 100% rename from old/done/front-end/src/app/components/navbar/navbar.component.js rename to resources/solution/front-end/src/app/components/navbar/navbar.component.js diff --git a/old/done/front-end/src/app/components/navbar/navbar.component.scss b/resources/solution/front-end/src/app/components/navbar/navbar.component.scss similarity index 100% rename from old/done/front-end/src/app/components/navbar/navbar.component.scss rename to resources/solution/front-end/src/app/components/navbar/navbar.component.scss diff --git a/old/done/front-end/src/app/components/score/score.component.html b/resources/solution/front-end/src/app/components/score/score.component.html similarity index 100% rename from old/done/front-end/src/app/components/score/score.component.html rename to resources/solution/front-end/src/app/components/score/score.component.html diff --git a/old/done/front-end/src/app/components/score/score.component.js b/resources/solution/front-end/src/app/components/score/score.component.js similarity index 100% rename from old/done/front-end/src/app/components/score/score.component.js rename to resources/solution/front-end/src/app/components/score/score.component.js diff --git a/old/done/front-end/src/app/components/score/score.component.scss b/resources/solution/front-end/src/app/components/score/score.component.scss similarity index 100% rename from old/done/front-end/src/app/components/score/score.component.scss rename to resources/solution/front-end/src/app/components/score/score.component.scss diff --git a/old/done/front-end/src/app/components/welcome/welcome.component.html b/resources/solution/front-end/src/app/components/welcome/welcome.component.html similarity index 100% rename from old/done/front-end/src/app/components/welcome/welcome.component.html rename to resources/solution/front-end/src/app/components/welcome/welcome.component.html diff --git a/old/done/front-end/src/app/components/welcome/welcome.component.js b/resources/solution/front-end/src/app/components/welcome/welcome.component.js similarity index 100% rename from old/done/front-end/src/app/components/welcome/welcome.component.js rename to resources/solution/front-end/src/app/components/welcome/welcome.component.js diff --git a/old/done/front-end/src/app/components/welcome/welcome.component.scss b/resources/solution/front-end/src/app/components/welcome/welcome.component.scss similarity index 100% rename from old/done/front-end/src/app/components/welcome/welcome.component.scss rename to resources/solution/front-end/src/app/components/welcome/welcome.component.scss diff --git a/old/done/front-end/src/app/scripts/component.js b/resources/solution/front-end/src/app/scripts/component.js similarity index 100% rename from old/done/front-end/src/app/scripts/component.js rename to resources/solution/front-end/src/app/scripts/component.js diff --git a/old/done/front-end/src/app/scripts/router.js b/resources/solution/front-end/src/app/scripts/router.js similarity index 100% rename from old/done/front-end/src/app/scripts/router.js rename to resources/solution/front-end/src/app/scripts/router.js diff --git a/old/done/front-end/src/app/scripts/utils.js b/resources/solution/front-end/src/app/scripts/utils.js similarity index 100% rename from old/done/front-end/src/app/scripts/utils.js rename to resources/solution/front-end/src/app/scripts/utils.js diff --git a/old/done/front-end/src/app/styles/_colors.scss b/resources/solution/front-end/src/app/styles/_colors.scss similarity index 100% rename from old/done/front-end/src/app/styles/_colors.scss rename to resources/solution/front-end/src/app/styles/_colors.scss diff --git a/old/done/front-end/src/app/styles/style.scss b/resources/solution/front-end/src/app/styles/style.scss similarity index 100% rename from old/done/front-end/src/app/styles/style.scss rename to resources/solution/front-end/src/app/styles/style.scss diff --git a/old/done/front-end/src/assets/cards/back.png b/resources/solution/front-end/src/assets/cards/back.png similarity index 100% rename from old/done/front-end/src/assets/cards/back.png rename to resources/solution/front-end/src/assets/cards/back.png diff --git a/old/done/front-end/src/assets/cards/card-0.png b/resources/solution/front-end/src/assets/cards/card-0.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-0.png rename to resources/solution/front-end/src/assets/cards/card-0.png diff --git a/old/done/front-end/src/assets/cards/card-1.png b/resources/solution/front-end/src/assets/cards/card-1.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-1.png rename to resources/solution/front-end/src/assets/cards/card-1.png diff --git a/old/done/front-end/src/assets/cards/card-2.png b/resources/solution/front-end/src/assets/cards/card-2.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-2.png rename to resources/solution/front-end/src/assets/cards/card-2.png diff --git a/old/done/front-end/src/assets/cards/card-3.png b/resources/solution/front-end/src/assets/cards/card-3.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-3.png rename to resources/solution/front-end/src/assets/cards/card-3.png diff --git a/old/done/front-end/src/assets/cards/card-4.png b/resources/solution/front-end/src/assets/cards/card-4.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-4.png rename to resources/solution/front-end/src/assets/cards/card-4.png diff --git a/old/done/front-end/src/assets/cards/card-5.png b/resources/solution/front-end/src/assets/cards/card-5.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-5.png rename to resources/solution/front-end/src/assets/cards/card-5.png diff --git a/old/done/front-end/src/assets/cards/card-6.png b/resources/solution/front-end/src/assets/cards/card-6.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-6.png rename to resources/solution/front-end/src/assets/cards/card-6.png diff --git a/old/done/front-end/src/assets/cards/card-7.png b/resources/solution/front-end/src/assets/cards/card-7.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-7.png rename to resources/solution/front-end/src/assets/cards/card-7.png diff --git a/old/done/front-end/src/assets/cards/card-8.png b/resources/solution/front-end/src/assets/cards/card-8.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-8.png rename to resources/solution/front-end/src/assets/cards/card-8.png diff --git a/old/done/front-end/src/assets/cards/card-9.png b/resources/solution/front-end/src/assets/cards/card-9.png similarity index 100% rename from old/done/front-end/src/assets/cards/card-9.png rename to resources/solution/front-end/src/assets/cards/card-9.png diff --git a/old/done/front-end/src/assets/happy_homer.jpg b/resources/solution/front-end/src/assets/happy_homer.jpg similarity index 100% rename from old/done/front-end/src/assets/happy_homer.jpg rename to resources/solution/front-end/src/assets/happy_homer.jpg diff --git a/old/done/front-end/src/assets/logo_take_my_money.png b/resources/solution/front-end/src/assets/logo_take_my_money.png similarity index 100% rename from old/done/front-end/src/assets/logo_take_my_money.png rename to resources/solution/front-end/src/assets/logo_take_my_money.png diff --git a/old/done/front-end/src/favicon.ico b/resources/solution/front-end/src/favicon.ico similarity index 100% rename from old/done/front-end/src/favicon.ico rename to resources/solution/front-end/src/favicon.ico diff --git a/old/done/front-end/src/index.html b/resources/solution/front-end/src/index.html similarity index 100% rename from old/done/front-end/src/index.html rename to resources/solution/front-end/src/index.html diff --git a/old/done/front-end/src/main.js b/resources/solution/front-end/src/main.js similarity index 100% rename from old/done/front-end/src/main.js rename to resources/solution/front-end/src/main.js diff --git a/old/done/front-end/webpack.config.js b/resources/solution/front-end/webpack.config.js similarity index 100% rename from old/done/front-end/webpack.config.js rename to resources/solution/front-end/webpack.config.js -- GitLab