From fc84f92e236193e6bbe67a19f0061b0c00f2d5de Mon Sep 17 00:00:00 2001
From: grimsi <9295182+grimsi@users.noreply.github.com>
Date: Sun, 4 Feb 2024 12:21:07 +0100
Subject: [PATCH] Start development of v2
---
.gitignore | 25 +-
.run/Angular Application.run.xml | 5 -
.run/Angular CLI Server.run.xml | 12 -
README.md | 51 +-
assets/fix_game_mapping.png | Bin 32680 -> 0 bytes
assets/game_detail_view.png | Bin 2409394 -> 0 bytes
assets/game_mappings.png | Bin 112555 -> 0 bytes
assets/library_overview.png | Bin 2663296 -> 0 bytes
assets/scan_library.png | Bin 11654 -> 0 bytes
backend/pom.xml | 288 -
.../grimsi/gameyfin/GameyfinApplication.java | 18 -
.../config/FileSystemProviderConfig.java | 23 -
.../gameyfin/config/FilesystemConfig.java | 64 -
.../gameyfin/config/FrontendConfig.java | 29 -
.../gameyfin/config/GameyfinFolderConfig.java | 101 -
.../gameyfin/config/SecureProperties.java | 25 -
.../config/SecurityConfiguration.java | 59 -
.../gameyfin/config/WebClientConfig.java | 75 -
.../config/properties/GameyfinProperties.java | 24 -
.../dto/AutocompleteSuggestionDto.java | 20 -
.../grimsi/gameyfin/dto/GameOverviewDto.java | 12 -
.../gameyfin/dto/ImageDownloadResultDto.java | 10 -
.../gameyfin/dto/LibraryScanRequestDto.java | 13 -
.../gameyfin/dto/LibraryScanResult.java | 13 -
.../gameyfin/dto/LibraryScanResultDto.java | 21 -
.../de/grimsi/gameyfin/dto/PathToSlugDto.java | 9 -
.../de/grimsi/gameyfin/entities/Company.java | 39 -
.../gameyfin/entities/DetectedGame.java | 114 -
.../de/grimsi/gameyfin/entities/Genre.java | 35 -
.../de/grimsi/gameyfin/entities/Keyword.java | 35 -
.../de/grimsi/gameyfin/entities/Library.java | 38 -
.../de/grimsi/gameyfin/entities/Platform.java | 39 -
.../gameyfin/entities/PlayerPerspective.java | 35 -
.../de/grimsi/gameyfin/entities/Theme.java | 35 -
.../gameyfin/entities/UnmappableFile.java | 40 -
.../exceptions/DownloadAbortedException.java | 7 -
.../gameyfin/igdb/IgdbApiProperties.java | 29 -
.../gameyfin/igdb/IgdbApiQueryBuilder.java | 448 -
.../de/grimsi/gameyfin/igdb/IgdbWrapper.java | 259 -
.../igdb/dto/TwitchOAuthTokenDto.java | 17 -
.../grimsi/gameyfin/mapper/CompanyMapper.java | 21 -
.../de/grimsi/gameyfin/mapper/GameMapper.java | 127 -
.../grimsi/gameyfin/mapper/GenreMapper.java | 20 -
.../grimsi/gameyfin/mapper/KeywordMapper.java | 19 -
.../gameyfin/mapper/PlatformMapper.java | 21 -
.../mapper/PlayerPerspectiveMapper.java | 20 -
.../grimsi/gameyfin/mapper/ThemeMapper.java | 19 -
.../repositories/CompanyRepository.java | 7 -
.../repositories/DetectedGameRepository.java | 32 -
.../repositories/GenreRepository.java | 7 -
.../repositories/KeywordRepository.java | 7 -
.../repositories/LibraryRepository.java | 13 -
.../repositories/PlatformRepository.java | 13 -
.../PlayerPerspectiveRepository.java | 7 -
.../repositories/ThemeRepository.java | 7 -
.../UnmappableFileRepository.java | 30 -
.../grimsi/gameyfin/rest/GamesController.java | 80 -
.../grimsi/gameyfin/rest/ImageController.java | 32 -
.../gameyfin/rest/LibraryController.java | 81 -
.../rest/LibraryManagementController.java | 81 -
.../gameyfin/service/DownloadService.java | 125 -
.../gameyfin/service/FilesystemService.java | 107 -
.../grimsi/gameyfin/service/GameService.java | 134 -
.../grimsi/gameyfin/service/ImageService.java | 139 -
.../gameyfin/service/LibraryService.java | 257 -
.../de/grimsi/gameyfin/util/FilenameUtil.java | 75 -
.../de/grimsi/gameyfin/util/ProtobufUtil.java | 11 -
...itional-spring-configuration-metadata.json | 9 -
.../src/main/resources/application-dev.yml | 11 -
backend/src/main/resources/application.yml | 5 -
backend/src/main/resources/banner.txt | 10 -
.../src/main/resources/config/database.yml | 20 -
.../src/main/resources/config/gameyfin.yml | 301 -
backend/src/main/resources/config/secure.yml | 30 -
.../V1_0_0__Initial_Database_Setup.sql | 148 -
...d_Field_addedToLibrary_to_DetectedGame.sql | 4 -
...V1_3_0__Add_Platforms_to_Detected_Game.sql | 45 -
.../src/main/resources/proto/igdbapi.proto | 1173 --
.../grimsi/gameyfin/igdb/IgdbWrapperTest.java | 373 -
.../gameyfin/mapper/CompanyMapperTest.java | 38 -
.../gameyfin/mapper/GenreMapperTest.java | 35 -
.../gameyfin/mapper/RandomMapperTest.java | 49 -
.../DetectedGameRepositoryTest.java | 114 -
.../repositories/LibraryRepositoryTest.java | 48 -
.../UnmappableFileRepositoryTest.java | 86 -
.../gameyfin/rest/GamesControllerTest.java | 159 -
.../gameyfin/rest/ImageControllerTest.java | 42 -
.../gameyfin/rest/LibraryControllerTest.java | 180 -
.../rest/LibraryManagementControllerTest.java | 141 -
.../gameyfin/service/DownloadServiceTest.java | 86 -
.../service/FilesystemServiceTest.java | 253 -
.../gameyfin/service/GameServiceTest.java | 317 -
.../gameyfin/service/ImageServiceTest.java | 86 -
.../gameyfin/util/FilenameUtilTest.java | 179 -
.../gameyfin/util/ProtobufUtilTest.java | 20 -
.../src/test/resources/application-test.yml | 9 -
.../org.mockito.plugins.MockMaker | 1 -
build.gradle.kts | 63 +
config/gameyfin.properties | 30 -
...e.example-with-multiple-source-folders.yml | 17 -
docker/docker-compose.example.yml | 7 +-
frontend/.editorconfig | 16 -
frontend/.gitignore | 44 -
frontend/README.md | 27 -
frontend/angular.json | 111 -
frontend/karma.conf.js | 44 -
frontend/package-lock.json | 12879 ----------------
frontend/package.json | 43 -
frontend/pom.xml | 94 -
frontend/src/app/api/GamesApi.ts | 11 -
frontend/src/app/api/LibraryApi.ts | 12 -
frontend/src/app/api/LibraryManagementApi.ts | 16 -
frontend/src/app/app-routing.module.ts | 50 -
frontend/src/app/app.component.css | 0
frontend/src/app/app.component.html | 5 -
frontend/src/app/app.component.spec.ts | 31 -
frontend/src/app/app.component.ts | 24 -
frontend/src/app/app.module.ts | 140 -
.../error-dialog.component.spec.ts | 25 -
.../error-dialog/error-dialog.component.ts | 31 -
.../components/footer/footer.component.html | 1 -
.../components/footer/footer.component.scss | 9 -
.../footer/footer.component.spec.ts | 23 -
.../app/components/footer/footer.component.ts | 20 -
.../game-cover/game-cover.component.html | 5 -
.../game-cover/game-cover.component.scss | 59 -
.../game-cover/game-cover.component.spec.ts | 23 -
.../game-cover/game-cover.component.ts | 19 -
.../game-detail-view.component.html | 112 -
.../game-detail-view.component.scss | 4 -
.../game-detail-view.component.spec.ts | 23 -
.../game-detail-view.component.ts | 119 -
.../game-screenshot.component.html | 1 -
.../game-screenshot.component.scss | 0
.../game-screenshot.component.spec.ts | 23 -
.../game-screenshot.component.ts | 17 -
.../game-video/game-video.component.html | 1 -
.../game-video/game-video.component.scss | 0
.../game-video/game-video.component.spec.ts | 23 -
.../game-video/game-video.component.ts | 22 -
.../components/header/header.component.html | 26 -
.../components/header/header.component.scss | 11 -
.../header/header.component.spec.ts | 25 -
.../app/components/header/header.component.ts | 82 -
.../library-management.component.html | 36 -
.../library-management.component.scss | 1 -
.../library-management.component.spec.ts | 23 -
.../library-management.component.ts | 36 -
.../library-overview.component.html | 147 -
.../library-overview.component.scss | 59 -
.../library-overview.component.spec.ts | 25 -
.../library-overview.component.ts | 293 -
.../map-game-dialog.component.html | 30 -
.../map-game-dialog.component.scss | 0
.../map-game-dialog.component.spec.ts | 23 -
.../map-game-dialog.component.ts | 84 -
.../map-library-dialog.component.html | 31 -
.../map-library-dialog.component.scss | 0
.../map-library-dialog.component.spec.ts | 23 -
.../map-library-dialog.component.ts | 90 -
.../mapped-games-table.component.html | 50 -
.../mapped-games-table.component.scss | 8 -
.../mapped-games-table.component.spec.ts | 34 -
.../mapped-games-table.component.ts | 89 -
.../mapped-libraries-table.component.html | 43 -
.../mapped-libraries-table.component.scss | 8 -
.../mapped-libraries-table.component.spec.ts | 34 -
.../mapped-libraries-table.component.ts | 102 -
.../page-not-found.component.html | 4 -
.../page-not-found.component.scss | 0
.../page-not-found.component.spec.ts | 25 -
.../page-not-found.component.ts | 15 -
.../unmapped-files-table.component.html | 36 -
.../unmapped-files-table.component.scss | 9 -
.../unmapped-files-table.component.spec.ts | 34 -
.../unmapped-files-table.component.ts | 62 -
frontend/src/app/config/Config.ts | 4 -
...g-model-change-debounced.directive.spec.ts | 8 -
.../ng-model-change-debounced.directive.ts | 26 -
.../progress-bar-color.directive.spec.ts | 8 -
.../progress-bar-color.directive.ts | 38 -
.../app/interceptor/api-url.interceptor.ts | 18 -
.../src/app/interceptor/error.interceptor.ts | 37 -
.../navbar-layout.component.spec.ts | 0
.../navbar-layout/navbar-layout.component.ts | 32 -
.../src/app/models/dtos/ApiErrorResponse.ts | 12 -
.../models/dtos/AutocompleteSuggestionDto.ts | 6 -
frontend/src/app/models/dtos/CompanyDto.ts | 5 -
.../src/app/models/dtos/DetectedGameDto.ts | 38 -
.../src/app/models/dtos/GameOverviewDto.ts | 5 -
frontend/src/app/models/dtos/GenreDto.ts | 4 -
.../app/models/dtos/ImageDownloadResultDto.ts | 5 -
frontend/src/app/models/dtos/KeywordDto.ts | 4 -
frontend/src/app/models/dtos/LibraryDto.ts | 7 -
.../app/models/dtos/LibraryScanRequestDto.ts | 7 -
.../app/models/dtos/LibraryScanResultDto.ts | 10 -
frontend/src/app/models/dtos/PathToSlugDto.ts | 11 -
frontend/src/app/models/dtos/PlatformDto.ts | 5 -
.../app/models/dtos/PlayerPerspectiveDto.ts | 4 -
frontend/src/app/models/dtos/ThemeDto.ts | 4 -
.../src/app/models/dtos/UnmappedFileDto.ts | 4 -
frontend/src/app/models/enums/Icon.ts | 20 -
.../app/models/objects/DropDownMenuItem.ts | 15 -
.../src/app/models/objects/NavMenuItem.ts | 15 -
.../src/app/services/cookie.service.spec.ts | 16 -
frontend/src/app/services/cookie.service.ts | 34 -
.../src/app/services/dialog.service.spec.ts | 12 -
frontend/src/app/services/dialog.service.ts | 81 -
.../src/app/services/games.service.spec.ts | 16 -
frontend/src/app/services/games.service.ts | 130 -
.../library-management.service.spec.ts | 16 -
.../services/library-management.service.ts | 71 -
.../src/app/services/library.service.spec.ts | 16 -
frontend/src/app/services/library.service.ts | 31 -
.../src/app/services/theming.service.spec.ts | 16 -
frontend/src/app/services/theming.service.ts | 53 -
frontend/src/app/themes/dark-theme.scss | 14 -
frontend/src/app/themes/light-theme.scss | 14 -
frontend/src/assets/.gitkeep | 0
frontend/src/assets/Gameyfin_Logo_256px.png | Bin 4331 -> 0 bytes
.../src/assets/Gameyfin_Logo_256px_dark.png | Bin 3006 -> 0 bytes
.../src/assets/android-chrome-192x192.png | Bin 385 -> 0 bytes
.../src/assets/android-chrome-512x512.png | Bin 487 -> 0 bytes
frontend/src/assets/apple-touch-icon.png | Bin 387 -> 0 bytes
frontend/src/assets/browserconfig.xml | 9 -
frontend/src/assets/favicon-16x16.png | Bin 644 -> 0 bytes
frontend/src/assets/favicon-32x32.png | Bin 988 -> 0 bytes
frontend/src/assets/favicon.ico | Bin 15086 -> 0 bytes
frontend/src/assets/mstile-150x150.png | Bin 2429 -> 0 bytes
frontend/src/assets/safari-pinned-tab.svg | 180 -
frontend/src/assets/site.webmanifest | 19 -
frontend/src/environments/environment.prod.ts | 6 -
frontend/src/environments/environment.ts | 18 -
frontend/src/favicon.ico | Bin 948 -> 0 bytes
frontend/src/index.html | 25 -
frontend/src/main.ts | 12 -
frontend/src/polyfills.ts | 53 -
frontend/src/proxy.conf.json | 10 -
frontend/src/styles.scss | 43 -
frontend/src/test.ts | 14 -
frontend/tsconfig.app.json | 15 -
frontend/tsconfig.json | 41 -
frontend/tsconfig.spec.json | 18 -
gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43462 bytes
gradle/wrapper/gradle-wrapper.properties | 7 +
gradlew | 249 +
gradlew.bat | 92 +
pom.xml | 54 -
postman/IGDB.postman_collection.json | 248 -
settings.gradle.kts | 1 +
.../de/grimsi/gameyfin/GameyfinApplication.kt | 11 +
src/main/resources/application.properties | 1 +
.../gameyfin/GameyfinApplicationTests.kt | 13 +
253 files changed, 479 insertions(+), 24885 deletions(-)
delete mode 100644 .run/Angular Application.run.xml
delete mode 100644 .run/Angular CLI Server.run.xml
delete mode 100644 assets/fix_game_mapping.png
delete mode 100644 assets/game_detail_view.png
delete mode 100644 assets/game_mappings.png
delete mode 100644 assets/library_overview.png
delete mode 100644 assets/scan_library.png
delete mode 100644 backend/pom.xml
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/GameyfinApplication.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/FileSystemProviderConfig.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/FilesystemConfig.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/FrontendConfig.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/GameyfinFolderConfig.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/SecureProperties.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/SecurityConfiguration.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/WebClientConfig.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/config/properties/GameyfinProperties.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/dto/AutocompleteSuggestionDto.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/dto/GameOverviewDto.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/dto/ImageDownloadResultDto.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/dto/LibraryScanRequestDto.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/dto/LibraryScanResult.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/dto/LibraryScanResultDto.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/dto/PathToSlugDto.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/Company.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/DetectedGame.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/Genre.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/Keyword.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/Library.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/Platform.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/PlayerPerspective.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/Theme.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/entities/UnmappableFile.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/exceptions/DownloadAbortedException.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/igdb/IgdbApiProperties.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/igdb/IgdbApiQueryBuilder.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/igdb/IgdbWrapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/igdb/dto/TwitchOAuthTokenDto.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/mapper/CompanyMapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/mapper/GameMapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/mapper/GenreMapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/mapper/KeywordMapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/mapper/PlatformMapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/mapper/PlayerPerspectiveMapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/mapper/ThemeMapper.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/CompanyRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/DetectedGameRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/GenreRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/KeywordRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/LibraryRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/PlatformRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/PlayerPerspectiveRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/ThemeRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/repositories/UnmappableFileRepository.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/rest/GamesController.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/rest/ImageController.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/rest/LibraryController.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/rest/LibraryManagementController.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/service/DownloadService.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/service/FilesystemService.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/service/GameService.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/service/ImageService.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/service/LibraryService.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/util/FilenameUtil.java
delete mode 100644 backend/src/main/java/de/grimsi/gameyfin/util/ProtobufUtil.java
delete mode 100644 backend/src/main/resources/META-INF/additional-spring-configuration-metadata.json
delete mode 100644 backend/src/main/resources/application-dev.yml
delete mode 100644 backend/src/main/resources/application.yml
delete mode 100644 backend/src/main/resources/banner.txt
delete mode 100644 backend/src/main/resources/config/database.yml
delete mode 100644 backend/src/main/resources/config/gameyfin.yml
delete mode 100644 backend/src/main/resources/config/secure.yml
delete mode 100644 backend/src/main/resources/db/migration/V1_0_0__Initial_Database_Setup.sql
delete mode 100644 backend/src/main/resources/db/migration/V1_1_0__Add_Field_addedToLibrary_to_DetectedGame.sql
delete mode 100644 backend/src/main/resources/db/migration/V1_3_0__Add_Platforms_to_Detected_Game.sql
delete mode 100644 backend/src/main/resources/proto/igdbapi.proto
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/igdb/IgdbWrapperTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/mapper/CompanyMapperTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/mapper/GenreMapperTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/mapper/RandomMapperTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/repositories/DetectedGameRepositoryTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/repositories/LibraryRepositoryTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/repositories/UnmappableFileRepositoryTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/rest/GamesControllerTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/rest/ImageControllerTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/rest/LibraryControllerTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/rest/LibraryManagementControllerTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/service/DownloadServiceTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/service/FilesystemServiceTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/service/GameServiceTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/service/ImageServiceTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/util/FilenameUtilTest.java
delete mode 100644 backend/src/test/java/de/grimsi/gameyfin/util/ProtobufUtilTest.java
delete mode 100644 backend/src/test/resources/application-test.yml
delete mode 100644 backend/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
create mode 100644 build.gradle.kts
delete mode 100644 config/gameyfin.properties
delete mode 100644 docker/docker-compose.example-with-multiple-source-folders.yml
delete mode 100644 frontend/.editorconfig
delete mode 100644 frontend/.gitignore
delete mode 100644 frontend/README.md
delete mode 100644 frontend/angular.json
delete mode 100644 frontend/karma.conf.js
delete mode 100644 frontend/package-lock.json
delete mode 100644 frontend/package.json
delete mode 100644 frontend/pom.xml
delete mode 100644 frontend/src/app/api/GamesApi.ts
delete mode 100644 frontend/src/app/api/LibraryApi.ts
delete mode 100644 frontend/src/app/api/LibraryManagementApi.ts
delete mode 100644 frontend/src/app/app-routing.module.ts
delete mode 100644 frontend/src/app/app.component.css
delete mode 100644 frontend/src/app/app.component.html
delete mode 100644 frontend/src/app/app.component.spec.ts
delete mode 100644 frontend/src/app/app.component.ts
delete mode 100644 frontend/src/app/app.module.ts
delete mode 100644 frontend/src/app/components/error-dialog/error-dialog.component.spec.ts
delete mode 100644 frontend/src/app/components/error-dialog/error-dialog.component.ts
delete mode 100644 frontend/src/app/components/footer/footer.component.html
delete mode 100644 frontend/src/app/components/footer/footer.component.scss
delete mode 100644 frontend/src/app/components/footer/footer.component.spec.ts
delete mode 100644 frontend/src/app/components/footer/footer.component.ts
delete mode 100644 frontend/src/app/components/game-cover/game-cover.component.html
delete mode 100644 frontend/src/app/components/game-cover/game-cover.component.scss
delete mode 100644 frontend/src/app/components/game-cover/game-cover.component.spec.ts
delete mode 100644 frontend/src/app/components/game-cover/game-cover.component.ts
delete mode 100644 frontend/src/app/components/game-detail-view/game-detail-view.component.html
delete mode 100644 frontend/src/app/components/game-detail-view/game-detail-view.component.scss
delete mode 100644 frontend/src/app/components/game-detail-view/game-detail-view.component.spec.ts
delete mode 100644 frontend/src/app/components/game-detail-view/game-detail-view.component.ts
delete mode 100644 frontend/src/app/components/game-screenshot/game-screenshot.component.html
delete mode 100644 frontend/src/app/components/game-screenshot/game-screenshot.component.scss
delete mode 100644 frontend/src/app/components/game-screenshot/game-screenshot.component.spec.ts
delete mode 100644 frontend/src/app/components/game-screenshot/game-screenshot.component.ts
delete mode 100644 frontend/src/app/components/game-video/game-video.component.html
delete mode 100644 frontend/src/app/components/game-video/game-video.component.scss
delete mode 100644 frontend/src/app/components/game-video/game-video.component.spec.ts
delete mode 100644 frontend/src/app/components/game-video/game-video.component.ts
delete mode 100644 frontend/src/app/components/header/header.component.html
delete mode 100644 frontend/src/app/components/header/header.component.scss
delete mode 100644 frontend/src/app/components/header/header.component.spec.ts
delete mode 100644 frontend/src/app/components/header/header.component.ts
delete mode 100644 frontend/src/app/components/library-management/library-management.component.html
delete mode 100644 frontend/src/app/components/library-management/library-management.component.scss
delete mode 100644 frontend/src/app/components/library-management/library-management.component.spec.ts
delete mode 100644 frontend/src/app/components/library-management/library-management.component.ts
delete mode 100644 frontend/src/app/components/library-overview/library-overview.component.html
delete mode 100644 frontend/src/app/components/library-overview/library-overview.component.scss
delete mode 100644 frontend/src/app/components/library-overview/library-overview.component.spec.ts
delete mode 100644 frontend/src/app/components/library-overview/library-overview.component.ts
delete mode 100644 frontend/src/app/components/map-game-dialog/map-game-dialog.component.html
delete mode 100644 frontend/src/app/components/map-game-dialog/map-game-dialog.component.scss
delete mode 100644 frontend/src/app/components/map-game-dialog/map-game-dialog.component.spec.ts
delete mode 100644 frontend/src/app/components/map-game-dialog/map-game-dialog.component.ts
delete mode 100644 frontend/src/app/components/map-library-dialog/map-library-dialog.component.html
delete mode 100644 frontend/src/app/components/map-library-dialog/map-library-dialog.component.scss
delete mode 100644 frontend/src/app/components/map-library-dialog/map-library-dialog.component.spec.ts
delete mode 100644 frontend/src/app/components/map-library-dialog/map-library-dialog.component.ts
delete mode 100644 frontend/src/app/components/mapped-games-table/mapped-games-table.component.html
delete mode 100644 frontend/src/app/components/mapped-games-table/mapped-games-table.component.scss
delete mode 100644 frontend/src/app/components/mapped-games-table/mapped-games-table.component.spec.ts
delete mode 100644 frontend/src/app/components/mapped-games-table/mapped-games-table.component.ts
delete mode 100644 frontend/src/app/components/mapped-libraries-table/mapped-libraries-table.component.html
delete mode 100644 frontend/src/app/components/mapped-libraries-table/mapped-libraries-table.component.scss
delete mode 100644 frontend/src/app/components/mapped-libraries-table/mapped-libraries-table.component.spec.ts
delete mode 100644 frontend/src/app/components/mapped-libraries-table/mapped-libraries-table.component.ts
delete mode 100644 frontend/src/app/components/page-not-found/page-not-found.component.html
delete mode 100644 frontend/src/app/components/page-not-found/page-not-found.component.scss
delete mode 100644 frontend/src/app/components/page-not-found/page-not-found.component.spec.ts
delete mode 100644 frontend/src/app/components/page-not-found/page-not-found.component.ts
delete mode 100644 frontend/src/app/components/unmapped-files-table/unmapped-files-table.component.html
delete mode 100644 frontend/src/app/components/unmapped-files-table/unmapped-files-table.component.scss
delete mode 100644 frontend/src/app/components/unmapped-files-table/unmapped-files-table.component.spec.ts
delete mode 100644 frontend/src/app/components/unmapped-files-table/unmapped-files-table.component.ts
delete mode 100644 frontend/src/app/config/Config.ts
delete mode 100644 frontend/src/app/directives/ng-model-change-debounced.directive.spec.ts
delete mode 100644 frontend/src/app/directives/ng-model-change-debounced.directive.ts
delete mode 100644 frontend/src/app/directives/progress-bar-color.directive.spec.ts
delete mode 100644 frontend/src/app/directives/progress-bar-color.directive.ts
delete mode 100644 frontend/src/app/interceptor/api-url.interceptor.ts
delete mode 100644 frontend/src/app/interceptor/error.interceptor.ts
delete mode 100644 frontend/src/app/layouts/navbar-layout/navbar-layout.component.spec.ts
delete mode 100644 frontend/src/app/layouts/navbar-layout/navbar-layout.component.ts
delete mode 100644 frontend/src/app/models/dtos/ApiErrorResponse.ts
delete mode 100644 frontend/src/app/models/dtos/AutocompleteSuggestionDto.ts
delete mode 100644 frontend/src/app/models/dtos/CompanyDto.ts
delete mode 100644 frontend/src/app/models/dtos/DetectedGameDto.ts
delete mode 100644 frontend/src/app/models/dtos/GameOverviewDto.ts
delete mode 100644 frontend/src/app/models/dtos/GenreDto.ts
delete mode 100644 frontend/src/app/models/dtos/ImageDownloadResultDto.ts
delete mode 100644 frontend/src/app/models/dtos/KeywordDto.ts
delete mode 100644 frontend/src/app/models/dtos/LibraryDto.ts
delete mode 100644 frontend/src/app/models/dtos/LibraryScanRequestDto.ts
delete mode 100644 frontend/src/app/models/dtos/LibraryScanResultDto.ts
delete mode 100644 frontend/src/app/models/dtos/PathToSlugDto.ts
delete mode 100644 frontend/src/app/models/dtos/PlatformDto.ts
delete mode 100644 frontend/src/app/models/dtos/PlayerPerspectiveDto.ts
delete mode 100644 frontend/src/app/models/dtos/ThemeDto.ts
delete mode 100644 frontend/src/app/models/dtos/UnmappedFileDto.ts
delete mode 100644 frontend/src/app/models/enums/Icon.ts
delete mode 100644 frontend/src/app/models/objects/DropDownMenuItem.ts
delete mode 100644 frontend/src/app/models/objects/NavMenuItem.ts
delete mode 100644 frontend/src/app/services/cookie.service.spec.ts
delete mode 100644 frontend/src/app/services/cookie.service.ts
delete mode 100644 frontend/src/app/services/dialog.service.spec.ts
delete mode 100644 frontend/src/app/services/dialog.service.ts
delete mode 100644 frontend/src/app/services/games.service.spec.ts
delete mode 100644 frontend/src/app/services/games.service.ts
delete mode 100644 frontend/src/app/services/library-management.service.spec.ts
delete mode 100644 frontend/src/app/services/library-management.service.ts
delete mode 100644 frontend/src/app/services/library.service.spec.ts
delete mode 100644 frontend/src/app/services/library.service.ts
delete mode 100644 frontend/src/app/services/theming.service.spec.ts
delete mode 100644 frontend/src/app/services/theming.service.ts
delete mode 100644 frontend/src/app/themes/dark-theme.scss
delete mode 100644 frontend/src/app/themes/light-theme.scss
delete mode 100644 frontend/src/assets/.gitkeep
delete mode 100644 frontend/src/assets/Gameyfin_Logo_256px.png
delete mode 100644 frontend/src/assets/Gameyfin_Logo_256px_dark.png
delete mode 100644 frontend/src/assets/android-chrome-192x192.png
delete mode 100644 frontend/src/assets/android-chrome-512x512.png
delete mode 100644 frontend/src/assets/apple-touch-icon.png
delete mode 100644 frontend/src/assets/browserconfig.xml
delete mode 100644 frontend/src/assets/favicon-16x16.png
delete mode 100644 frontend/src/assets/favicon-32x32.png
delete mode 100644 frontend/src/assets/favicon.ico
delete mode 100644 frontend/src/assets/mstile-150x150.png
delete mode 100644 frontend/src/assets/safari-pinned-tab.svg
delete mode 100644 frontend/src/assets/site.webmanifest
delete mode 100644 frontend/src/environments/environment.prod.ts
delete mode 100644 frontend/src/environments/environment.ts
delete mode 100644 frontend/src/favicon.ico
delete mode 100644 frontend/src/index.html
delete mode 100644 frontend/src/main.ts
delete mode 100644 frontend/src/polyfills.ts
delete mode 100644 frontend/src/proxy.conf.json
delete mode 100644 frontend/src/styles.scss
delete mode 100644 frontend/src/test.ts
delete mode 100644 frontend/tsconfig.app.json
delete mode 100644 frontend/tsconfig.json
delete mode 100644 frontend/tsconfig.spec.json
create mode 100644 gradle/wrapper/gradle-wrapper.jar
create mode 100644 gradle/wrapper/gradle-wrapper.properties
create mode 100644 gradlew
create mode 100644 gradlew.bat
delete mode 100644 pom.xml
delete mode 100644 postman/IGDB.postman_collection.json
create mode 100644 settings.gradle.kts
create mode 100644 src/main/kotlin/de/grimsi/gameyfin/GameyfinApplication.kt
create mode 100644 src/main/resources/application.properties
create mode 100644 src/test/kotlin/de/grimsi/gameyfin/GameyfinApplicationTests.kt
diff --git a/.gitignore b/.gitignore
index bbaa093..13bbb79 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,10 @@
+node_modules
HELP.md
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
+.gradle
+build/
+!gradle/wrapper/gradle-wrapper.jar
+!**/src/main/**/build/
+!**/src/test/**/build/
### STS ###
.apt_generated
@@ -12,12 +14,18 @@ target/
.settings
.springBeans
.sts4-cache
+bin/
+!**/src/main/**/bin/
+!**/src/test/**/bin/
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
+out/
+!**/src/main/**/out/
+!**/src/test/**/out/
### NetBeans ###
/nbproject/private/
@@ -25,16 +33,15 @@ target/
/dist/
/nbdist/
/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
### VS Code ###
.vscode/
-/.mvn/
+
+### Kotlin ###
+.kotlin
### Custom ###
/data/
/backend/src/main/resources/static/
/docker/docker-compose.yml
-/.gameyfin/
+/.gameyfin/
\ No newline at end of file
diff --git a/.run/Angular Application.run.xml b/.run/Angular Application.run.xml
deleted file mode 100644
index 4346cac..0000000
--- a/.run/Angular Application.run.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
A simple game library manager.
+A simple game library manager. Now even better
ONQaXXI0?!o%;s zY8}4skAGZ$ge7g<;ErpucK5fisk?IM>&J_n{wp?nDdtdfw)^+D`V?ycLH;E~+%mL6 z(pIAWx-iZa#Q5WedyWYU@-^(`V?<%MzP3B3`#swG3WlF^dx#|M5nI@^`heGXh^{uL zoPwoZEPRhIet##yoOP%lEUwb9Dp8Po6hCOZGd#J{PlZ5syOe;+Vfvds0;=ojyou$ESDPcNobBcSCqalf! zAslcMutx?HKz-ozOlbRI P}9s!#kKt!uZeqU4fm#{^-I>cP}EhUcFWqjhuuS zK76Zs>k3JcS8xg51tr$Op+J(pE|JPqjS?C4z2kUkqtepHI!$3SBNhYWSoL4TbKDS< zg}&djQL)D`V{9A2y?lKQUA0$|=e79n*5tQAUS|4KLg$^=0Y?d`tvMS-Bt_EL+zoxg z_jq fC#;GUZX0{pjUr!w>uj^hwM%{JJA%2d)7YD#Q22WV8PL z7K$EEj|R>fLLFN?87zE*CmCq%9{^kf6(}T)I@+EZ;9GK}Pp-HWNV%lRj-hehPOw*9 z5YTBha@MPm9@f>LA*vkaagOZM=(I=jOWkRp8!sHPuPzk1FnQ6HE0mc#XuJFlKNu33 zsd&%bGQJ0J+RVwomdHS0m>lGp8$>pEE#;xxhUOc5FO|lM#vOX3=_IpO(--H`wsxD0 z9(c1*#n8rZyD-x9X{32*2sCG{%h7Fs?wy`gsp-fVEK#`9oXPghz3+=Twu-JR`oYdZ zlArm8Djzs^Cx5p>Ke^z)iuGQ)-4bwFr+Mwv+qV>E!D+8pgUSBuv3fuk>1Did+v*~s zNDzjFq$K^Vyfh?PT*hi{Cm~VVQ~)JKT+TzPC1`7AbITK20sFav3ptdxLVrs3gwJ&1 zu;nJ1%ZiJzY0T)v9~I_e6Bvq7a(|@>72Zpl2PyzAcO3u9mcn~W!nN}phHSiCceFi2 z7}f=3W?}9SK3 =W8T`zDk1PRLS@rn1Rg)b=387bI2=g#QVRN2~ww1 z5J_P59bK@eFcav1oL`igp?9PFx1r4YNArpUxxmj)BqFJiI@03AGud1t37V8B4wQwG z(&(u+MCXV&3wS#$Fyl}hlMhQ##234-ZhqJv@up(kFpXD+=U&1`^d7E}ieEc)n=8^( z{F MNb>q|c+HXX zFDl;>t*<*atXSr9EN26KeeAnr6DVv5O yh)ZsL94e|cL$Udsg?57X?^u1Cvhq|@vmY> zOE0gJvV)^_`Wak<4XG$tdV-(t`<5}y)T9;A&FWZK(-bUbUh2tg?zrVGqdYw;{ez4D zQ6K3W ++PQ#hpY|U|bA66>WnP9lQ-eC>NsoSYGIK zvs6&u6+N7pqV}U?l8Y2;qFcp=i6FT#m{m$i)yFj%ddDk~#Yvr2uvL9Sti86qIk?eq z8IVaC!&WE)uDBf@wRdI4VB{~j1S}HSW#UAUqeY$f?<_PPR8Bk}Fm3i#wyQ92rVkAb zQ7g&LQqJd63i}R7c){9yboSjaZS?L0K5yvdfAqyEX(De}LKnSYStnZF`T22G_G^>) zv&75HVn^&ffUjLagytV?8A4U<#nr@(=y ODY6>?kdwKX`{m`zZroHkiK z5bCT1x^8i@_;FIkep>NtMY*+hu-Rcj`5P(5nK^R=eX=kSMB DBpMAhNL}=ag*W} z9w_lqSY#U%X?JbcY!!#+(F7XQj15EEVTBMAL!~8}Lo9^keB#|jdQHM$jT~lnhc%`f% z>J5ZGp#1^fc>_x4bh<){=3Rm1Lqv0_Wyo xo_a#qUpiATIq3vAOd NxG`YZ3e&4#Pt I&{0g4&;H1RWp;#bpf^25`CWeZVF!8XnNsu27O5D)b$D6`ucWm=amj z97@-n&|AFW-G;s+M9L7Z8}MftX+|#%gXTo%k-Vriji)vhMr=o}M^28vgvS@ts$S=O ziZEQ}2c`a#jVP2?GKMZsJABc0xdi{i-wFJGGjCx3XT`beznCnS>sM7S`Ii K zv=>}zP*6}lwN)EskKUnS+H*zCt~W*nHmYkAK|w*&(_aS2#*~+rQwZuP@s{zD1gB9> zE-Z*@Xru~%b}+#r> 9CUPa&1Rc#KFSs9x>i;&NMk PURpDqVlc~VPddJklLXquGzl*#3OrbR9 z^vsOuN+Y#DC@e^} w;OG{2!S@@qn@NX{<17l;*K#-7-np#>@b92J7vart1&K8!I zBWFdfH~Uc79Pt1TvVWBv&XyonR#qM!9qF2wgb3us{Q06bjnzA(1p)46>-GelE;ob& zG)7jd&Hsw!^CW&~dwKDI!s7hI!^ii9Cls-{+7~v$K=PGM~);hRx};3vdVU0}6zR ziHQUO45&&(N*avGYPGqu zpC@bdMS*hj^2#(jtE*!`pfP~50dWru1m;T!j-HvBS?cuUbaHZPZflFn%92%7L^>GH zD65eoAtB-Vc)cnA-I1EcYW+)2&ZnTDAcEjC-eO`Nnt%|}F);~=iUvPEx>RbmbZ`Fi zH=Qq6YeDBF |#V`F32*Vhk@kAq|bL@^>UUlJvWyL+3Pr8;BNxl-h_m8JtgSDGDe z34VTlb`RFG)6?C9gJ3EuD(7o$q5!K}ESbz^LlUVqVzaWeX(rh@IT>}kf2Oip!|;iS zh{)>~uRRxLXZr*}W9G_{nXI)k%Q*}JGJIumX(^|uNVLvq%;4vLkyHdkvP!G1KZViQ zx|>!WSF1aY27BmrPK_D5pcAJ3Ldr-=9@C!=vV9{1*p$4TI}+3tW0L}B;z z^!R6TyXTgbX&lXS{I}SDP@9{dOqaAQciQ&N&fZ#+8>}>14h;_Sy{+it1d&LmP6AeQ zY;0_)%p?RbVCn#Q@h2+_mM @mVh!lLZ&@%xT0ICOMzgWZYK-@LHakt@qF2h^5i =B^4$TuN8`pKM1v(=7(TjFV&h_w zFOvX5TB6l^Vxc}%dhft(3N-Mct8#*B9o>?Ddchj8dF$t*tg-E-T;X__@x?1Q(tOQX z6!N_CF5Pmv Vj4T*ZIUk9hvG!9s~6s@!HGo3Ce|SF)7JA_76KPR0^b;N^AbO zFVw}s8;1MVWgI^y6na~XzA?vgAHVZ4$AESm3ii~`OMoryL90~Lqkvn`gUj~Nf^UAw zgy8;kJ3yksLz>2pstZ)m{ov|^SJ|el0A5-W0wTLU-}^(i8EN5zuN9p;ji}a56iL}K z!qhA|8a}%_Wy?3w0GA`U)1MTEMR??55lgL>n9kn#^peNH@`tywM &zry#>|!d?@p)&2Yw2{{-?Fl1jqXmzIlPrNco6_Z9nY zh;L-Nk@4RHGwAJmQwBAtqS@PQsQc8%fOq6Y-I~O6b>cG;ZNwWKE*Cb3evD({VF>pr z#nENza*azlCp2d7h|JlR>>a(@ue%zkiy7pd)n>aDY7EiP*O;l!;e)va%bu)so@W2C zK1>?kAT#o=1XM)s)R;#>kTU?kUk2ds6OIAYnt;HzzOLxs<$}kCF6m!-6e4f_hvvm9 zsabT+y( 4~gV5gdHaLUAQ5k->bXbn|WzeRH`u`_n)5y-p!nZd@D}iK+^7e z9-KguX3q5tIAMw^D_VBCBFHRkDSxvZWdhId2OVbn=d>_mSK^T7b%5q^G!i`pqY(gc zaigEF{9%MtQK9Kf;2lYd8fe4|?48v}zV(J)@X`WHsR^+`PUdvmG2aMzUv@Pp%*tcV zKG+YZeJWpvS5o}w+dH|?T}4|9-}s!seeRA+&nxfOPFq^=#qE90;s{Nd1tgXDhU0Hz;c&0^bB6vtBrUPhZ}durcBGHfrvYzSrmXqPK|ja(=QxVe1b9O z!@TnL1fe@Zc&k|AWmEE=L{S^$!%#k<5wpgGZI9Hr;&8H*Ty3FJ85`~lfKz6p@0;Sp zq?mKP<+Nvm{Vi=*DxU5+p?<554x-jBIqN9M`=E2g)c8j(HNn #ER-H2P{k zsYA!Sx^PAzVc!JSj8R6mwmWwnv%S44p=vxG>8bLaNyF0=t3ZEbp%UW49qo2O2Rk~> z{Ux|A!s0`lx&yUW_s) ~mX&HOG(y;AlT#+PqQ8k`7t!^cs>9mK1QKMrj z-0p)5a&@u;By-73(C@RXo4kMiC3?fR*f8OWAdg)~JQ{E-q$zF~s1TsQRTr8h+8@?l zq*(3wBq$?UE@Q^LpBzxVAFgaq-okIlI`^-baf3JH3pqQxN6@|x4*D<`1C{+%@;Kd& zfZXyZGer+6WsX<|ZvQv3PkyQ)f0tvF1^-s_N*NoN$D3cw-hWdiy)#)>pZ^6+*$Xk( zhovok{hP$0oxJp5(?G~R@r++`n^$y0eN}IiZDY59xY9A{a_kjSBrE6(ucvyY-SE6c z$?5Yh9#!wcP 2Zf-5d7LC%6NeIg_k|iK2G+Fau#)rb$p9pgx zG=ec7d8)Q;uMrp4y<$sdm_#*nF}Y&n=s6(X88kyVQE8hlfvv8C%p6Z#Wp7Ony$DhO zd!$ ^2R)x$pM+waYK$#!=C=+!Eu3d7NUkZ zzo}kN==uP-lLrrtj@B@SgksochgVX4-pWc%fu=4~=SW>EioHDD@?(_G?|LODG%Zs5 zkeoZnFx2MOzK2h74Az9AV+vM}lj@~S&zwxF9M6Qag?xz;$?wA<3Il(&pMawZLv6cS z;h|ASi}5;Nm<9@=NEft4w5>gl(6|z%Ir5I@)~ -Y?fR_Kl&G|V@Uw> z9(*{*c&VnPfUZZ8@Gl+wXS{jVMDpd-yIoxZWKhbV*RvI2eA8~bd#Iyq<*2I3v&r~~ zN5pt$QHqo$xxGCW-QduxGyzs?;xrcasWFM9=Cutad)4|@hPJ7tZXb=5We0Gmd`O_@ z)fPjc5vR)byS ;x#$Tl>t7s++lu Kq`d+->(HJ`_O`6l}FQccMZV%l4o&J?;x!Ou~SsI-efMsVYHDxsc zXU~(7 >yVe6_KWpc?RImt)8P6#>q?qeICqX>{3FFF zjCsSq$1YVfbux9Wjk#p@u4bjW)oVJqT^xc(BwaLcr9tA8E zYpNGy>Ki)X$4H&Z-;JP`AI1S|jg8=j)p?Gi)sFx9naq3oyzqBn?OR_8b3}@YCd$Oa z;fa}|>%U#qVWl6$pW>zF=5S&D6CmPydmg=#4@DB|)PHV~l5#bk65qGMc+@w;r$S@x zZ%QeHkyF$H50A{(G2GwnQ9jhxl5GdD-X5)&95#x^3}fRUU(v-U+e=}JlozuPh}@ba zcZ!bUz{oQ*pj~Xi*6K^m2Mi0&T+W?n>OF9*@!IqI`%v@CI~{|$gi&hB{3Mz*teTkT z|3PUC%&$hg$2WCRKYR9)QYLeFVGQ)3s^C~_jU83+=vij (THgBOZ(_2ju?H^BCU)lez$B7?0-|W2c_kj;t!2LT>L0l9pTfR42 zD=79z?7WyR%SaSCL-S-yoGn~KV_U;9yz=Uo#u}46^UZ=qj5CZHz?=zRP}1Y|BtAiX znXH`Wa4@{pkW{^0&b~&!u%cN?=wG2naBQW2%*ee8TEbg@I0=&3roSf{Jo5v $&DIidUpiLQ4}5kvcqOcl6xQmpb0x3QY)0&YU{@Odf!Y$)8AR4jm%nXO!D3!kAiL`3(fUylzKcremseb=(A z9S^8!ek{F|6_ip%+wG~f28mV44!=JeIn{O!kmMV{Fs}}dah&&HVvdRIk|M0)Llyqb z0B_C;CmpCZ7$BEeY5C8+s @>masjl7#k2Wu69__%{Q9Q{%d+FR!SOcn s*AFGOcU_#e3FE73h z481%)iZW2hT1KrscBbl}s;=S~U#jdK)0(!#F`Y_@QDJU$A~utzl*A8!d2!Ul#06xx zC2JPVtyy!pWm)(&IP!o?vTaw<{x^Lf58m*j69k;K@#RS4K3;7S)>m_<%r==k82=QG zag@3FrJt5!G4eD32oN%Wg0P3tuf7 c=2Y8*lX z%zi|4{+w)x0QafYyGov0N$C}M%GCPA&|DSYq$E#j&Q3~_#p888KhFv=_I2BLP4~U> zB0JU){A4Z!xWavFIs=7;Jx$TT<32IC3x+AiI|L-;iIUu_hM=Bwj_miZZwfO(lnhgk zyLCJv!or?sbsjKbh{Zm2gSnkkM7whiAuXLh`?`pUlu^$yI*s@MpD+a?$*F=BXj|qs zy5J)~eVG^VQ>1>@oBRzR4XK|Lk(3Ny`AAZt_1EiYX>9@UESxz@45mDhi6- z#X2|orv@#+Wgoz7RcVsAkqGMbg)Iz#{6|WxmW~K{8;eZ8w_)b(8iR*@RaO3>*Qcq7 zOP0!FseS^rkw;ZNO7iL9wi;|G@dt0%$~qbv8j#_GLHVOM_}xZBeZAajyKCL>uKL^; z*ZLJcxc@uXs%&jFOvw19-E={jTY$>f(#8<|j|0w}i&4e3m+NS@`C?%OW~(CdslTQT z4F7)wng2@*Z-YaH+F5<^%0h1=LJV=AQ~Cd_b@lLTnbGwLfrRozqlKi-;K|@LVOm%q zq?A0f@>q3?dCLDjau}y2#UWmQKqj`h^z!|XAp_lNNr>t>tay1t+BSvfN7E@7iYIb` zuG%RYy*F8ftheCcdVuJwk+t~8``e+Bek8v#mu->PR#6s$Ja-twa-`1t WU=NTIO$7(X~q<+@XL<=>t=4RvXx44f8S}Vt~IJg5f zxGab%uRxd%I5Ij(iH2PVh49`?se_BVpeNCy)2PhK0b9OWa=li@Bj4r_UudqX`$G#a zetZk}N6)W|jvfJFkm=z%TIpcycTEcAwD;j|lTmc(ps2y!_LoG(T)s4B9*MV{xKB7w ze(#jD#8UL4r6N5bczO5Cyfv~1|6RU$W}4GGc#s3PeFPJ_e|vjf;9SRPurUORbjW&T zDDV!weP3>HmHMN=x;EqaHb 8t2yO zEKt}Kow-EWTGL%E`}IxxRNBRZba6Qnc8lAa6YAQ2aEQ{U@w3^#!(_VkmjMzzh@7}^ z$PTx)xoX+6CE33eJZSgd-I^+G*!O5Ay7Z!7@T}8$-81^O7LFU`HB>x2Ib)OJ1b=@s zIbrE`Rs^yp!o{aDfM3x&Uc@c%gzuIGzbtkaWcOl=^We-mT=r1_RgSp~=#*UDF#q^A za8}NWW|TNs2;NsE4A4QTv`2;8ep^r&w-+p8?Qy>w7232`n8jnFUy>{dO>u z;IBiO6F)GdHg7jvETy6B&;gS|4inl(;}tDC6cIn2ImKwiV05U7veEXheloXd>+ND< zFWRz6Tx!<9|3&R}A6Io LXe4S%@@BgkwtYMlc!hqEN9ef2YGofU1!bD zwLrJWs#laM`5K~bp9qoF+8CNK>;xP}kv5NH4ua%TP7nbRcV{5fjw?=ddFpao#;B_? zD7ib9uPL#>>wOf8qdy+`>Qwuc#9P&DxoGax_!1H+U2UMu+KRBHIWozUCu6;num-|A zMkikUc6f^_j4boTHtXLiA8sKP7>Rj5LAR3QVf1vT3sr`Xvx+2=^Lfn1xbHuhYO3cU z5BKJ-g?E3Z6kbGbDRIu`%<65_oSU-uX0(r?^`?WXBXA|#nAN}6D(z@Th!UeXf1i{* zu%X1B9xO-#dy#1CGWV(;uS;*5JkWq$K yG=ZsbiWT9)}{`j zmbEwEjr8a8Iw1;xbMAKQP5gmU$Lzro4+Utxd5B6CGB(qM>!zMgDf^)@CI%;$EP%_~ zSFcR6A{lH!<;Q!#Pp1RIUsy`th%0*y<8d3qes;4K>71SOzgQ55a^{k;$KR~Zc?#{f z(7E!FMmW@pFL%XB7X$~SAFWhDN>kOd`61$*tz4$#9C9D<>F8k6oQD_Wl>Mlv%+kG! zs`dXZktF}Pbc~wN=Rxv;Wiq-nfm&M 0o&@WSWT0*^L&9AVo74Wa;4ak3%;-03 zt<0#S(qyUkus6WgBv0b9?XhDPp=$a(UVFw;K5_o97C=HR<3V_Ti@_BrBf?=&W_e;< zx{Xa<$?jZVkaJCH{Jk|}I<~|KA&Ck3WuBTYIGDvf5vwH(-8uDoOix85${Fu<=Fm>x zXy }9L*B}_kePg%S0S!8M@T0Cqpyy{S^zb?=A|^|Wu*lAW>AXI_ ztfjCPtmBy1j0)Syub1wB-r1TABXMRFW4ryaG7EFD{-F9jzH@x>7(fcQ8PF=TIneor zb1vmK{*t fnqHuU-A%eb)>4LzFNIp9Hj^3odV)CM3*H zZ^O?|&zUNTLMqIO;-&S74LzX(ec~Z)&z_jsZ8DXcFFZ0EH^9_{G}QCW4xCzCRGuFR zK6nF{&6$zzFBFu-lPeDnm&1PNL1&eF+6(uB %uQ})SM4}*~I;HBBr!y?6&^P@~UL;oE54YIhymvof>q`0H zJNx@BJoKX@yW}YhS<(cH28~vtT|u%0cUC WlNpuZbkVX;8;LjPU>JlE^jtUS-`;E!r z;4ggQ-ZC+;t-5DB5R4h5?VGCOq_upYeLGjQYoAYhd{K*FUZyJ}0Lv~x;>{JrKeDkg zMT(4DEX0H&pIPkLCuhaql=tn#-@fw}xrnHjmI=<-apm-)>}Xf_H#Lbf|70(dEp8fr z(t24c#)z Te60Y-pyP6~gJwC~i7g`mGZpevN!wjitL}*II z=0s`E*4`I6RvpTgPslK7NiEjv*s0BJ-M*^xocCzo)!OqFC~u`}o66#7azvSKj5%-M zhR@|%&X9X%i)M}7$9BuEH#>R#OI9i)#blI|n(X3v1)Hswfs&vL|5r0aZ$|lL>xdT5 z)^~PYHqSYR$9@}io{$fDRAH1EJbcS2plo?6PuzmL@KjT>AgygvEB34WUA>)=Dnbo5 zI`_k5FPjQ{K7Tgy87cp^I>L(xH-+q5vuT)mUd5xlxjHfqSSzi@?yD0_1BMemAC6{x zw%(9A`bAF_DQK7Z-aFTlnAi^XEPE7_*kmvl_lUSH8|W5PbCr9o*)yuoFWPEjt8Le} zF=o$NulGdlG92>Zk?~jb5JZ(!vfdrmdPX%`z_oyfsL#%-Jgk5C+)yoJjf~ks8gw&A z30`6!=`{q=$08gp{2qCSU+VmA-1 &6mX4g7RaY z-J#%)CXx6i>Q7?9H_Dn`*IoDOo_%`yODp}NW8oG9|KPM+w-mj-G=t7%4R|uHJ6G06 z?QuyziLVc3>S{ka4JA5@CW|Vw!Ofs= Z>~p4l9;<*F=o z&u**dkK@wG`6&TX9y3fH6Z*||^4CnZ SLH1&7{~ zxnkMOW2H! _-wA%+_?>ur%*Za1dR9x{}#4aGYaitu?~(&-hN z_~89*`;9A|%SLj|bBvtX*;lP4-`(o5{xDG9Lk(U{HHh-~jT+n1Ac=IkTVgL9xnQ>0 zksUK2zT4;BJ=uzPYSZH|^SMxAMzJJF=;3h1gmATm+4&EmgiVzdq~qpOU*20Y=hRHz zo0~mpJ$%z~qbz^E-Re)l?HOp|HXCQIX)XWtP#=riYG3DlneAO;TfUMgP41zS5t(}> zw)eY66T)Vx8`7D?9OeB}GdFbXgRv=il9zhI{6AdZLC);Up9P!7>1}dlHP+od9larU zu|Gz}?!Z|;rql5D%4z@m9EQ0=t9Rrc_dX%teSVX+>&!yG^QRd}_N|vg&~yCi#W|r> z+HA&U`_VwGVRy6WQdX^{XY-ug&pC_8KSirt7Us(mbiuPxoUi6PN~LuW`WbItca0K( zH|u1ZEhjO&Tm3xM<5O}c#*W#jd)j-m(*lYp;#Om(_8?cMjNL|djrjbsUAI)HStQT+ z*lR7JiEW)76~gjZL-n14;LW&s!gWLnr48ZAq5R6V;C<(e$wl@M2~K6hp8;5Uo{yC= zrLGZ%BX6uHeH9;nBGc$eMLB)dOZakec+z+&Q6k4=3C*D-_e7TL%tlWLqv|IYtX?nK zBl }a-gJtQ;`JH1{w z{c_@4ix;=>tC~)Bv+q66&FMzE<8o=jaz`GYbLH!Zl0}SmYM0W+W5=vwB~xM36$fnf znbn+ZjJQ`V`-m83D}6RBT$hgg(R5d0^hP*p$u!ZURitesoVY_W^X+^kMCu?w$I70WYhzV-4cc&?K_kIiTkXdB;;U{+F(8SuRB>7k3GG*sJ~ zo9+&r2lB*^l%Sf*E&I-Q3UM9n%R{YQt3{y))UPxRM2f>12DcF!$rA+k%qE mJ2 z)ove_J0dRJOLdQiLXLv|6kT28Rhc4~Csy)|lv36&7JlV4qC)IkUH4Tf?-t7ZR^R!( z5rgoVJ`ob8KziSw6oxD_d8Hzh31hRP=QAGcj6w}tofAgqFY~I9Q`!~F!4J1FMds%m z38rOd-2AB97S#R7)5;9rOs &+{ HLa1z)(vqY!ubG)#?Rr%-*~%6n*)v<85K9-y zs4pVV&A;85o6AzDH=CbC7=%y19x-noQKWctyD{?Q$^=!uC@tNZ+(K}+1kdGa8dC}C ziLjHa*;IG$Ph3rny1(Tt)VVd*FCd(`DxzGId%wCR&cS)lLPx@(_iD>foQdC4M7179 z!Eidy+G@6yN?Y>h{P-xI*U`{vH~2lR@0q25HE{?@r-iT4k&=dF7n=&-w;2aYC45w@ zVm6+vR;_26oX2IKo `- Lw>HnNc^5!tIsLH?iG(OUy?HMn%j$edp(e+ z#bdiGH|X@}yPEQsgq<(!q*%C4^dx#>zFZ@^4=uL+3pvcKIerRfWJhWgTlsf?wmlj0 z-=<}V(DjOv;hXzbtc>_>R9Es)v)!Gekmj&LB+_Hb_2$5y*$symD-G*JSEdK0r)7O2 zPmZ{W^Yc7MUS)hI;VLhmG1K`Zi8tDd`8##U{v?Ip3FmC|hF}FtPWOm$iA@)dz23|{ zpuJ@A-iG6)_bmNc3g((>qN^(LX1=66 l--P%KuR(Nob@cGM zP?)R7eg;xPB4U`*`X)7dqVmthoOXXdwvdL=UnlN-3h(oVdys<(?qnp?)H*Q}61K6A zwrjhYoXLN-H(uY}!Vo>?q?y{NI_o4-T$BtNE_M Co+oRGfoAVygJ7bYwh=M@7VmtGus)DQSQ2bCH~HVpw3Ot-FV6Ao`$8-X?hFX z%S@@r4ZSO;>2U-H<-|A1iX&Q(*81Fq9UBf~_cV0F-?eR>m)@UE%qI-ncbYcGOFJvD zb^mNzI8`y; u*Tm;=c1B(-3n?wEOZ6f1&yZf%rdYmCtD6a{UBDNM2u2 zQFRT%j?ZD$E^2)zo0sW)*Oa@uGI?I*ef9lm_x&s-84?PaY2E50{;e`{mN-79(nd$y z*V=E`Dz7TD$otiA^PrG}oTlOf1SuAJe_Yz}n0y8t&opss%K|S(jAjB#_vyD=E6IpO z?= )}2+DoYINeUb9{CiP_Pq@0um8~ts@?@7(;#iCM|N4 zdJR1GJii_+Ui 2V$7?9Y<9BHg`zB*{~J4n2crt&*bk(5@Me6(LbvlG-`Xjb=C-~ zKQ7BA-myeUD{;<))l+8Uz8j7u5;Djdc?Jtlk)*aYYQABzUkciTj_ema$4uw@{hvin z+V1SrIZP&RcXYgbx;UI8SnE>ObYx!b|Aw$3eTk3v@;;E8ZsZ0CcTUtmFjuARkEEl0 zJAT?FrmMTZ6tw!EU*frEj^elFH<~<-_sch|SyXm8F(8=H>@u3VjoE3SFlgJlUmvPw z;J-7`&u$bm_w6t$T2p(~x<*<42EycIIVeA`3AL<>5d76krQ^N-O5dYfvuwPESM!oS z{ibT1Gxg7t*hVhwA%w-9STTXXA)AJ1yJEjRg7 pI>Yf>3 zLvtZ^Sd?@t2;ZEds=7L+Kd-xcf(*%eHZe9 g8%W`!!2ZpKQh=tK<{v*Pew} z7%-&K`U+xAgi1HFjw0|P;&UId4*h5^#nL{^rt@WaqIYXLg^`uDv8(G=jC_#1x(1=i zDM?*@nud~hl9*5F4_D@s+9e+Xf(;@6tg{(286kw+YOl|!sNMysLF$as@HU;TU_O=- zUKX4D-CR@loT6vi@pM>7d=To`YV-0jdFEav7&N!E_wB_w>TqEq;LpX(o%zp;W&zh} zXu4L#zF++ Pw0W_d@q6)}T!2txN}KY~k5GYnrdw|Q`#q4xYe2Wq80 zt{5TEmc2%=J(4_L?I!Aa #q$nS%wk**68^h>LV8V3gdYLj zznTl951Utb|BLQ_WM!4p`yVZa)`s-|{OoC=-2Wef3;)$$c^W0iZ`B>x-K~le2rF#6 zVEJ2HKp2t<*yFqi2ncBM4^uQ05fq&K2raTS6dL>f&_1i(gD#jrV-VC~h#!8+yhyBJ z==fLXFa7fWSu^{8wZebVZPuOsFG&faFS!a)e-Aw!(J&m!!1q>a@a^l@SpF9$6D#`P zr>Cb$xl96W@4~tHolY~@{>=XRVAcC2YFilEu&-d@ei~TmXvV&A
ar6g$w1p<(6ajb_)ch)hgu6PWOAsPQ|ou2N#Vj*Xq+ zcd`%t&tw=J930R$Ee-m8AWK=`OkTC!%5u8f^Q6^BryzE!;dKw3otuZ}Xcg5d=rXSu zWJV_LD>yzr9usaVECxRoKUw9OtFEh)tZ-k`vHITK-7V;|&)SpyB>VH{K 6)l#?X*XBPNziV&M4_ z%n4eqZHKdB7hQ#q_t)|QrJp=`a_>Hj6ENj)(>6CXIj!`w&HqlumQ+;4$&ii6f=z_7 z=;XE? oc|Px5OK1j1cVrI@ z4f&oQEwt|RLhHS>rKM%lm65Jn78Vv?4XWjxow;jjY7|pM;~QS%xlH}IdNfZ6N*!Nn z-1b~f?|+?rmaWXhr%DzUJUFP8o}OOrcf!BYUvOp8!T*Fjk>Bo~h{#B;)$bIsL}>9J zR11f1p_Xh)bf6b{wKNHSR(m?fp;wDYhPHN?Shz$g;?4?(q+@3f7jl_b6AD}E$=0pL z#ehEQI%v|iJq{I%-FeH9GTEE+?DVM9U*obW+ $g2XHB0ik!$tp zKmSBVM@w5-F~NDF?#sT9jcr~XLdBSQ?sN#e4GmS3GI4d~Ewdk+j<-m8P&mLc1O4?Z zG)^4}e6GvAZ=u&*RZC0Dc-*1(j355E2OY$*YD>XWl2ca3G=d=m+tKnUh7`|NaNbsd zqJK>)p?hVIRj)jfh(&|br12UZEm Kq)09Rqnn< zMvXY6QR&Y=TPdtn)zfSLllIWb+1X^^tG@5{FNW3yn2=C>jZ2APIZ-2albrvvSzD}P zs(3OSjT4LtHqvKB!d7d{v(wYTB2%oCloT9l@g&$-u47g2s2*5A;e}-<>muHkA_j zyD}9>y!Th%#>J7qz(OEcKeVX-P7-Q>lR|g9(b@5y{GBkqx3FGs2^prBmgEc!sL1(k zjSe@b s z^@*13ul4uuwdT7x9;j{KZ%9g_&?&RG+s~NVoNAEQ-t`ufINiJ==Dn-ZEGH)i`-QUF zz@ao%t*Nao1Z*UMPhn-x8~j7pk}FzZCq2c<(eX >?KfeEJ| zj;+j+o@U6T^(
QcJ~uZ3cm>ozo<>2sLLB>-KI`M%r3RM5s&vJkiHXz_ zn*nAsCl?pf^V6fo#zw7@HS{0}Db7Ft{PU^HvOW0Gqeo07&BDpbLs`uOFfC!Sx7-Jl zDKpd4QegT8$E-TtX%DfKQ$($ZSHWDFcQ0&4%egcQ4b=BJN_09pB`$3Ff5U%6bqX{L zHb%eq%uA9J5j~QVyH4%9`Euw4hInAsD9oVR` fET=mi)#)WE|gLv_Vm=({C84Le%|NLw8wiZ*}hrK zuvL6_yJSPD#1g Kob=^C-(42S4u+uR^r^sug7E>`@lISy;Xv3& z1_lNg@OUCWe0VnZi Qbq9~PCa3RVBu1H`C!)G)|SV6 zm+Z $79I%So`{l!d%nC!hxBEh1bg2_hBLi#&LA?_hF!k z%VAuUo11%axP%2R%N({QEJA5(r~Y^6rhFL=1_rDcd9$+NVt9gSsyXG(bMl!phbJdI zX05luUB}QbRhX>aGd}GywuYge=-Alq&vJx9ld$Qiu$qs5Jmr^-hk3P+Fn9zOECtR4 z0=V5ssWwrh;t+u^2Ko@ AgS>7hJ_Ao?KhIS+}<` z@HDSauhP9EYl%|a_aj82E1VGKV9LsCf5-ydB~r+Dh+y7^htl8Q|NOxJB5rh4FP2q1 zy~?2z`=jDjEG!oYv&@B}WdlfTn!s-kocRtVZ*z~6jMkRAWT~%CE_P)QzXq>?M4`40 z4lI5~(x7$x&QCT5yuQP1&1=|uPoF+LJUmp>5m$h59Va)pf dATQ)-8TM59<;g6ygI$s{gqVN6q0qQ1B)S9#aw$5{kj? zvE*%RX>plpz6l7)LSv=MW`G?7<>TGYU#FBL7zOTo2QE)tX#8krVUAq;8qKnmO8%1_ zwFf-Hu6X9syNo}M-J4L)JYF4(z8j%t6hwRD+qb1*wk>Ard1s24r?)o&Dd}SwnPC0G z7X^ye*33soN8suRNJvQBH^%Lr)v4vEg;Gn@{P>1AJASI7VpKF##0@icSulQNp4Ov^ zQKFu$oD3i GvHO4Vx92w zTU|KIlhWrwA$m3wiBn_ARw|yauusk#3Tu0arWO~!^s-;Y#N;-r!vK5*rkc0y0$@n- zBj=?84VxY%l-<<&dN^QR0sB#vR}C<}ckTN1DS$ub42OUI{9$%@`5_^p_0xlZYj}9* zy{lrK-5f#v1V+Gypa)6G>;&Q$7y=gf(YcZVgDaC9{znQ0{ ZQqO=%00L4 zK~RA0sWueR*$Y!|ixagH=% !)u98NUu1V>@jZqBk(!|2_($6CAQ%c5d|eCCJx=4 zX
bH Z_-!u-z&TN#TP7F)Xn(f1 zKW} vX4c2mWNJ#_YXkWM`+Rqif1#`Mjd4p+S5F z6Nl61NnYRO%^%ntYNY-<^BwsnIP+Z?7?ir`cLeB`g~LVa6kFEAz}`n*tM|wnLPA12 z_J g2kYw9{Tps42OEW&BfPNq4mC%?-@b8*AI%ab7UB=A?759!xV1(zp}B|O6=;F^ z! $sdhipT06L)>_t_9b&o6_s<$bDg zpNlIBd@KP0!Lt4k1kAUosnmtl`@ R(+Ay~C3Q-HXe8 zdF_b;h24k(bXrS?Tb*vmNGVqL+T0oor!1u0aSO8}xpSwFJT=P6g4T2`U{~(1xZ=0M z%07moQ`cOdwVzKWwmW06EPK+p=tvOLFU6mcE*X2#! NxOTFHWRu o+?EZfDR9P){EI%jN_4Hu<0>8gjAV5Uu z!7sOMWxuxmf;+^r?Ck9GKZ3Af&|J;>_Fw(S IwJWMK}Gaqe?=)rBOVkX|5z5X znk!&F>vK0|&byw^N}==N )*_kUl!Fpa z54z~D )Q?3XD>$glLnSoYPV%s2n_5yarD=4blMT4Kl~;}-N$=(IAMzd z65< Y+qa*nVe|R>IM+qMgm{4pTlM G`H%EIAP~M=Ro)4Hu`0M`-YEZ88cNcCzg~T_U*U$GLZ+; zdGfXU%a3790bLt;sxO`^_chl}GLTF>wh)>3k%dLl>_9i)o(z4R_y@X1`F7=bJuTbX zA|Db)YqCl`uKZo?!~4Mv!}A%#z3e( J&G?)Q;m` zDc#H+Aq|0BJ_pb8*A{Ylytbc1Wd2d% zo;5~QRTU`!11l@5)v?MlnH~xra~w9EViki_3I7xjb#R6#K&IpX7y^fk_pz664@d3k zkH)uzcETz7L+ftU7qJo=O6nywkk(*-T4m{vM$xx8*oC(MeGmny#T4mUe*rlOhruk| z?CR)u)DH^=#gCsTT4KUXlMEp8Q~T{kHBDvpaEU1cd(*bN)B{k<7^ofReIfw&4Hd^p zY(4J9<|h6BJo++rm3cqc3 p@vOfxNj5QVh$1NUdbxEVv;t0&WR#Mi%55fq{XMDJj3P zIjSUKn>~2&fZy(!0+%fBwJBYQ9!=+3ew_I2u3O=3p)XKhXHmV4Wtr06qL{( z8EI*Jpd|pO9RcRS_+wqdPwg{TR+;J7)9;s2+LD{|xP*G#eC?g=5^; zhHnA!mp4 7EPHw~RSD>LFC-+w0hV^_quGSHjXL@Ev?#UA@qt(G8 z^sT}}nv+(K|9_+D_G3VK0rItYE>ld%*`EU*wk#R0)Zw>*Ofv{D%*QoyNSA17X$NoL z26+d(I=~{iNs|W~6Amt3tqvXvCs_q2GIkMt3CxDdpjJ|>V^7m%#a zRcEIn65yvhKnpXMguH$Gc6Vg}&%wa~sGxX3r+aI|C8oeP0oTMh1Ju_R;Hiv(m6)?L zNLNm`+c+Ru()f5$?lc2nJ!r_)0C8l7PFht}3B0RQARhutX@vjVe)$Xj^a083m18cy z@KWOD1WwIVdp|gmcDW-Bi$=at Iz&FPyA?bGIdCrbWy3$NJ%fMT=jFXk zO`UpUr1!7_d=9vn59sFu88Wz^j3m~LOjyz`U<)vDDYVk&U3$Mf{Rh%?IO6{5P{!&r zU|*X@M#x_*E?R=j$8TMS>L#%6wHgO=Gqd T;Ip$2+%7AQRo(UVn_>-uOs zENc;@PkCid>WTv`B!<3EjmwLYAc-~k^XWmc?a+HzO>VzqSJ>=L;J%qDYB7LGL=&96 zHvORhY2SbN(6O&=({Jhp87f*e#bd%x(+h-2+$lud+w+fv?%xlf67!y%ntA}}3_hNN zT`K?W%3!sR0QyM49e|<@@C{Dqdxic{$;nDmQm>l+zJ3b>wFF>30XWL;0$qVphly~5 zLIxfl!enIznx}70?yB@>#j2_gTt&HF`ROzD{}oY*`jDucodF&Kgn?#eX9M%{Sb&QJ zbPCUhnqKjvQK>R`Ry1D$g#h$-R#rj^3k#dftOveQ0$cGpD@%iP|LkBQ0|bFa$_kNH zXu3UFBo3_e4|pLn1n`GPqfl=kh3p=X3p&w-5C#X`+S$2M*V!2Xgyq~nX1>+deasN` zUg;EoEsLY8I_AbEur1}aM@L6LO8AR&adBzbRRZ4&RKlf8=qd}!7 HZo;MHzFJHcF^=XUauz*Mnxg2O4y$uVaqoKL<0(Q;x z^74%rK+Xbfp1)ONHM$ @{gs&BJT ziN3})Z`MM{s**>u_~6KQjx_Pj*uBM&K#JfmIjms=$4dYt4fgBE|9ny$Wp1Y1KF zl^7S7-D^oEcDmU>ii3%YJWjnh#S#z@@ZMXdv(TkM$Qp0jOJEKa@duTbX8kFSgt#Lg zHanK@#EZB@-Vl`oYzz>+ixAg`-fCp3s_PPN_da{VRHCX|YMZ88W>3`2wZC(`*?{+} zy Q|CNT?e?Q_9UTa+M2-HgKK_rq^OQWA`cfcB1px&d7(Z;%f=QqR_USZ=Jfjt zo@gE9xG{w5P_0^om{cuz7*_JSc~SrZ{OQ?QN5TyYAlrZkfaDq;(g)xxCTjd3yvUUF zqzXEvBPYlYI<^Zgp`SCQpyLZjFM;#Vj4puc(sOh3bjUk-EN}~SN~W7g4Arbl!a6e5 z?Ph@K=kzV%L z%X~}~guI$QJQ3HPdWG9#dJ2Cl@(d-16dKK5s~shqS1rySZq3NIJp#!i;E_xU4st*( zEEQY{Cx|rFoUDsbAr6h<*3f0mb{#oDUD%RPOtBgD*94L{?a#-s)(c%tB5(HsxqPMc z0zAHV>V3T4-rm!5b5|uLB{6_eR7boddlD%FXKlScK?ciwn}md=b{<&x2%Um?KzeS- zP%kg97))tX$!h1hcLexp`EmmZ_zq ;J36s zGs7}_N}y-%gZG2S$?damTWUM>14>SLr=wsj?aIe+eyC$q_I*MZ3jq(X_?L85dN=?D z*q(6XV0|n^KGOtBr~FDRXj0p}wcig_)!VCvu3+VtL9rHmz##}5#mvn8T~Jt!DJ&?V zD?&jsv&U|{N(lV1xqpP%J}Cy^w}Q=wY+_>7&6+`p{i`{B)+lq+YJ*N7=0Ub9W~j!v zjcXiAx8N2uzv|^UpMx;dk6*vu(ka9ao?#&k3Ksy-LK&zBE)cp(m>^?E^Mo^Y6E*tR zmjFB&26zfM$B$VP*yy6PsQrKt0bAyL{u3W=2QVPuu8wB;6tD6YpmFLJ)iU5Eo}r zbaZI%= &?J*B&~SkwdSaHx;ifSzwKz^4(1~xt!{>)A zQk&qyfcH+!QctXV&J4i!HI?^cuWAUDWYk!I_TVo=nbfIb`yJa*%8te$0*d#+gG*3E zE>b1z2M?UsX3!VJ(hQ2|djszJc+Kpz&7YpTPB&i9gOSDl48D`zT=hICWEl-1&CI8I zj5r6)hG2I-OcnQQx9&9bUZTrVPHsha2;A^XTyvwiMuSLALsnP`_dlYsadvajA7B+f zUd+It5c4kXHk^bo0VM#q;nx`%_cv-U5XlaM@I;_301qm_@B+P}CHX$6qX@gNzLCku zaij^}s_`x5HNJxrtb=u3;eR2?WAKe_35tU?@-nqi=H@H&AcD03R%$!=?NYL`h0EjO zIJpn>eTSb03NG!}}`kBXJP(cbdr^)JP9NMeg8K!4fPBU_Sn>TQ3U>IRFej3*Q4* z0#!;g4Qy+*nuwGVNURG2Equ;BzkBcHa_jfZWPwUvNy1mFR0#zGxOqsmv}$~XDm^y% z$z$W 5D+M9ou7e9&?J;jjg0Ps$e+jDjX|(-s2SW5a;AmoNTf{FcU3V)z6rbm z3l18>pgTaG499%;J>mv`#9b-)`84PrUl%AlK-OTY(KZYEdV349VPs8EsO%7)ArCkM zIvwbN`i*sLfb*OH`GN60T+S c(_6-2)6*uv#I}#~7;M?L4qm-0Az}FYw^Z-W zrlmqN@<3GGO+Un=Eai$_E3`u;D?=e_20ZU`AT*$KS_G6Svqaqc_fqH=Hx|T#TkZXI z?C9aq0_tq5&m9;4&_D^e1Jdpe`@0m7k3q3KytdXq^AZm@Bq-5BUrHhC4w(5OP~{y0 z56*$hNB0r|m*3Rci6 @+4|OKMa=8bE}Eu z4! ZZD)XY(9-H#V`V+Me!{*_7~_)Dkw2@X{9;kfTK^3>P2 z;**jTVbxcvLSz5ksjw4rz7?(ymtaHWCLko-f@V|DnhOm4=Nvj0n9GK9*0uP~b~ZQf zLemK#Pe_kq)~HBGvi17(iJ;y$N6Zr&o(O0NUFQN1^b*Msy}LT}0rpzoa?2E2q7R*^ zZ~-OW0QWNpHFfa8=51D0Hg!NF0Ku&Gb$q=i8*gfAYIc4e31K;JAvHM}U9E>!6@WU$ zI&4t&1OE8q*<+rs4`&KOfI}C!JznsRU%~57m+R!%@-wZ09cySk0E@x=^ySN&_I5>$ zd@W;jJH>yi3Oto}zE*=6-7Sdo0MZ|sn53%`n%XvtxUYU3I?O7oD{@W!f2b(vJ=^_1 zEGK9_ vq=;+&dUn6S<0PDs0A>jj9EOg$M8IkF923ggLVm$XF zuid0As|Odr1FaPMqTztwUY{m3NmTu)Nq|Sz5Pb6vzz>J&y;vkQJp+U0(5S6 AXJpri*530xi@kjjG6ZoFUW8i|k*eoMcrhEG|~_n)u88v7RqqWOV&+N*A(S z|GUyfQn5{gmW}Gj_L8eGT&H>5Tz(-m6j%;^qnYr(I1?Ka*w{l@R*0k7YQ*JGC|(16 z?c3kl+uTHpV3t@D3(U>UHQ5waH$w@`+PBJeV>}tiG98JvEaXfhlw`o6Btza*ri{SB zrm^*yZ@;6)9HV;OxvXMUUDw5miFR0oRsM1Qu*CTm9t9;O?5kxlw%4__5-#)Y#!ynH z5ceg8@R|N71ord&qM{ N;gmE0T3v<6ZI_98^Kub^W3=9U4N?fEkkfbR{-u@AcUuxb# z26CrrD+{V4Baj$F(qanzEy%RM!{qXj`ajE&T5%6Lcin~d)|!Vs+911RWMrHK2lUmg z=e-yZg^&%PLzu_LxL%F#5W4^e@iYPjuCY1v&a;hHH=zBYx~pkLZ9&smjTf+A^{KqH zCkOd`h^!P-re`Zm={KNvK>2g@W&g6UAz)7FsyVFV AzO9 pL#H;^q)jB{^#w)2jn 3{xaf`l3I8VP5iuq zQGdDF4X(T6A)~XNWh7b&DSx?DYbw$WVs$?)#~k&)KM1Tpj(Mww)c#AxN>|@}tD5*% z{Nm)PUxy^KHkxsUX+NqBugCe;Qz7r(Jx9On5lH9^-~Akp7%N;{+=H6$L%TvjfccSS z=r2##fIz0hR(!{SaNMOY>yOfyD=#{MQV{Y#uj*y|s}X@$0RClXq0 ?Eij&VwhmCYphCGtDMBj7c2HkB9qT3r9 zWwi co~0_Pf~2Gh^5MHC{J@ z?Tn-1b$cdM65jv4F9iE%Ei_Mm{MEOhrI3GoI#$SwzSuVs!ZG>(T?|xh<>Jb|VwlZ6E8Zx0Upt1} MBW3BYQbw=-2kw9`EdT%j diff --git a/assets/game_detail_view.png b/assets/game_detail_view.png deleted file mode 100644 index d829c4f5964f33c3e4fc4a0befa4b1db1d85219c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2409394 zcmdSAcT`i|(?5z8MFAV4R22{b0hJB{3JQkaLoXsV^cDz^h%^-e>C$@(B~n5OB@_h# z=?N|L76{S_5Fl{F^S 7^Vu`AXC|LC)D&rHm}sb| zsAvIiUTINLU2dYHx*%}rBBck2ryi!FIumRsFRuZRm%r!Y=4@@}U`0jsD9S%d`c3N# zmY-(Y$k)7dUe{bNX{A2?XeO@25N4iP$zbUDq;^N%cHnDHjW|u|1!~#bMRWo^D9IX{ z57X2ivtwei!eaN)Ieib>0_ULhb$d0w)R&0Qw7VmozQ8`_V2J!QI{x{N_v>pWmn<%6 z-w-0cg4{pXyXi^KZnmEFyz6j0JzKFO`Rc}}9~CNMk7qq+msOSV_3A9vT!8yB+-xFC zAAUp{CzwFzj6L+H6D>Gmk~rvYhW!+c$9;>t8s{A?o>joKaK#{jp~ol%>lP=n-eGp9 z6Vzo_I>_>hCG5?;%h#X5M_$~$omFX{^X*MP^mnW5^nT2IbO-W`LWGY_hMe2cG;E{J zsN%`fwTHoPU*N+WVOP%um}F>Htgc()oKmQcZKjn#BtB2`#h4vK z71cc|z^j)!-eZ3ze7tpt6UUo}DTyka*X3TtfB$$s4s~xfkeMl09s6K}S0R(3@{S>< z-Gop77N{T9msRx^iJ1+ld~p7V;e3=m?}g$E*R$S!4N83>rx*QI#kz+?eu_(ccO&{* zeAA()2|g*Y!a3%5Vr?%Tw6i?eew#AE|7fB8V@MD^gzaJ7_5bLlqUyVS{r$PWdMW|u zr~m4pQcP7%7G-r|IqULQ|NHFDXf9=8{{s(xgYumI%}Y&Z{< c4J@^NOEy&QJ9+Y=C !o{lE#Gp-UO4RM?ubuOKaP`vIsHSGva>{ zYPt?IHh#==4SMAQWgPj|)bT&3GW|cTslVy2xBD*WV}HInd-BBTM*KfbJY}fVgqet{ zsnO?7_0S5OYiClsS@3`EQ+~bYC@tGCl5f5Iuf>gV{+k=3pQu>=dNo7!!M~Pm8#Dgr z>|f6`&BP}s`}S>Toc+Il_uu^eUsG`Ts->kB8y(#eA^!Vc4>!Gh0|4~ khF-N|C>1vJg7=`tohK0cZg6i7uTl3|$h)02MN zstu&YWe3Idj9P+G(PNjPhLZ(g~hMf!8N 4C;uzUP6@+9i0W9 z^x ^Zw6d`b(`gU_&xGH0H?>IQXoby6Sv#AQ!=d}ycrCSbB!|`+0e*f} zM8mFOcJ2;^DS5-DzN&V1cJ&n9@*l18^2zZYIxZ?I^Kh+BT~}8()GCpOhX-|hutE=! z88(A8P^3DBIhOfzrbaVcVL1+H+W(0=&AZ7}{rTprhOJIMCK3Bv>sSASBo&pSihH01 zyWd7Yn%@?H {Xn4fYDaBJKEo@5BrNaix*{nNn*~X75Tn<6JVqtX=`J}XM2$~`kJw( zX4DZB_S>Q>o`0|@;N0o5C_JNO5!ayfgh`Z6tph2KIN+Rw+84iHm}c|+^Hln1qm?*@ zbfih>$_-_Q?tiZmyz !pBlL9Y?-rHgB%b88!OV zPWs?eMZsUjLoM$Q=BW+}!br*hEhi_Zu(6M-s;acJs7f7YKoPADW`(j$(EP8c&hBnUtS759q;g -YW@40rt{HVA?pIgNH$IKjT<*k8M#!LpJuP! z-rmjg7tg3@yLx+p5D1F0b^D8#6~dVqbmRD?rO96_-;Wk*bJrS|erqkQ-%=_usnY`u zm&S3PA_4#aJZ<-^H6~yRW3IM-b;LQ&j$HfO8ofVf>*PY=wM7y|#^X-lFnqs`x(q2t z0DZItVVIVSj*b?7_v`Dqo_si5Njp!)PH0AK`H|gOhQC%HaUsFPE77_qrBL>0hMxA~ zfT0l-+Iai1zDwV>!FTiK`&X7(d3F9ZvffvUX8sXR9 {m=&KE{rF~j{4W#6STrihJRT+QB|*XA$1`aWA}!dP2L>GNWDGNX`rd|Db*N0=Ms zySMgj1zh|@g8wg@n?c&z-lm9@jp310Qj2qRC56`yiJ+o?G+xT*znIeZjIysF>kWIH z05J;MG;czs#=29b_A>A@)?$BIsTW-fc>GFUvJ;JL`;7d*3 7Oo^!2gj=lWUgK(yI66=DQ)+ zktIPh|J)b%`X2@Ge(uF1s>Q1xM0Sq!`!s&>-wNS4|Bn~hR2J|*o)*ho%1m`g8he=B zeX-UjS!bPtrvDcmOZ|x^qk@XZD>XDtiFtra|2RJHEw51+B7PAQYv!$=V1vp=-x2-2 zsOoG)JQM-5SqR8);busplI%d22C`Sh@bHu5Cnx6|Y%B-I;@{~Lhr5RR^1ksOx-||l z>W8$)9_g*5F$%QrB8Te9;k1=>v+ao?yXjV4_U02Ns);3bZx%DByashJ5W^mJI6=jG z7I3l<$w`^13riRSwBoUHvXZ-qpmSs6V`FZ_l&{MAxyY{UZAp3!2;oxdP#Ho+$Zba9 zzb9T5Nm>2$$7d?9gGcCUZwqkWvIePL>ah*J7i$!7Eu~9%zWUFGWrdiOc(|Qg&rdBe zjUjk`%3O^IzRX}{eLu79XTH=ak311}mO)bwPw<~CW%h5+5`BrJwG%>Dizj3&i~DWJ z^yxEHFK|D5rzuYGLml1jQtA4cY8NX};9%qQu8~)aoJ|$O1j)~ w9xlEYKR7=Ad+y=U;ylq;L`+Ou zCVl;z Jq{o}o)`f}I?=kB0V-B}QD6+|tB|WfG5ZbYg+_2GLfd<$eLDGH=@Ky1P~G zXaq%@Q9dhs*6h`X? L*PtX*DES zfHq{LWjjL3#T}m6>0UPUa}>dYy9V(PyY|>US)sv7Bths7c7O^ubE%PpbHP5fxlq%V zBrn2x*#G&uPQ_y>`xO25j9iMvIwLmtgiw-hcW34w#81yV9Al~+u|q>_3D_yQdMLsk z1X}Q_Ydw6Gb@#s &wbM3jHsrhH~ zMP>65k!sm@OQ$PK+s=8kS(K&{^fK=1B-jbpJ^SW<1kwGYA}=uNC|Nm_B$p}Hr4chG zi7b|96a_t6vb_lV;(Bq0Kv(S`rBN6$cWT`4g=pL?XqQTQ@y}+S9+9JH9hV>2qN;^w zXHPQZEGpaN>@ts=m0YNcsqobcUd-hn$Gfgk?Hg`%8MSe BgS z*3|g$5WYr{`gP8^Yr(&nB%NsW@+us7+Jr@EC(cpEb1~%*hc}f8j{KJ?VNu? zD2kbIFnwItuh`0BHHue)x+RjtA;E9~qx zogU2P6AJfkfiERD664n}LnTIm6KZi)dRLSxO5-f PJBx=r3AB%~3DOIhI2O_*XMP8q%_W}{JKrH7btS3!3TBx6Pinp99%ds@`H{BnF z=Dnzsgi8vMEi*zmdrt4gZ=$~qEY_%Wr>|-g &$N`PaX-Ria(x~a*8r||a7nxa#)b$sU7fX#Q z2%1lmBx1A!P1L!#ISF5qtqC}$<5x&&(^dWFn(|t+aU% h~SJf|$|ZRWt; z!;Ab4#$%Zh)oFR!7gONt(lya!O~sDinM%uGlw`WBCatODsTa~@@q%(Be_zF=U(yY< z>|k^{*4Y}>^3=`98@hbCw7@mH<|@fQe*E~?%A(%;E8#bt+_25~ODrV&2Y^Ri(a%?Z zLuQ0p84@E+m {NXfzeAahzqchYJru-GkLyt=X7c zCFq5oG)#@^lq!d2JWdBn48jV+);hEjIe{(9C_h_R>f=JU6 IF)$!=ix|= ^BW~bY!g`{kX$}`XD$& zakW}p9;*wj4P2Rz=j@7i1UPALT}T+#e*<@FDsg&Uh8kpwXRVOH auBffKa4;MYkr5LE~!hxJv6+hT=EoObQqm{1(R`F1kbyvAxob0#2d1m94gx zQZ5@D^tvZJYL@V8SDA3>5$EspF&MVVk@%o44v(vcYg#fEV$^iTDn$%;&Cwf?{4r)D znRjIm(wxi;^De}sVNsgBb}zh9i4bqYh$E$ejcT{bjrh`lV|taLD@EM)O ;^thBw?01i!l=ug4ixnAqq6`u?docE|gxT9t&D8+D *fEk D2MM?BhxXmGN^6tL8>Mcm52$9FVQjd{);_xPkY*1>Kt0YP#X!HE3 xuDv6i!gv}*O^G43MofVMnU9W=3*@WH#Z`xGWDrosU< zRJNY9A}^V+z5PM94aZtJOh(@;K!GN< rH>-0e<)xbEZna#48^45~^G;fU25A!Ng9YLo zN;F9_+Fm8B4A3i%mbSje5sR8DaH$CQ=Qg_E4@|luosAGwjP^8Dxj0rbp!2H=hrO9T z1#1y&EQ5zfRgWpYjI$zZQD4~=;x^wk7oqN@X(MqzyeL5({3`-bn%3YPvc<(^auP37 zauXWEsos0ls!>LZn@MZ*1Ad1fdVIU;0@wO)y?8S%f(fMKI`j&gPIx*bL5quLox}e- zf13xH9TR4WQb@lNn1&f#=2q$)P7$j}Y7{`oz=7Lb!(Yt^QD;Ft>=CYau<26~cBdjwsfdk$ z&<<4v-8;IyAD=m2VaGIyH&%6MCfObq#i6Z3oYtpw8D-{-s|A?0cg;NfL#MSw)du<1 zOXtp?Ds`8U(-TW2Z|fJ2vJjD91|{9jq4Ey2!OL`&bi~EwZ`EDG4+6yS;t?9A6C?w@ zd+**E(VQO|Z?@JCOf>-&`K9v|Jy)CjT=SxDRj69jPpeq9Xl`e9DlC>PW`|3^5l41F z#;X<#!MRl&k1RiJHQI4gB+oFeryMOfGMc9;$cep!=5ScJ`WtDj&WIyk=>1gD%lv zR}(4YiIq0Z^miN{#b;`y-*uovVk0|HcOiVZc#IkSapO# aMDDJhLY!I!wFiW9+?z9hul5(Lj)fE+O6 zHwq0i&-(8k>6`TB$K03*nTL%AMSF4uS_byh6*>8L< zRH9e2^aa~)##%_$fud(=t8YjV`!mXfc64=xB7n_`Nm~_7Zcgcq3WrR0J#o9K0o*oe z+20Z?&XCWkM!{8bxuV#e;*Z^PIScpVS~1nfi5d43QUw9LN9(*I{8ti-5{_fJ&^O|s z>IyMM)DZm1OXqoI0xXp6&f_Q;#jR_K>Nmw7E$K}_R!UGr)O|_mQHI)5KBHU! iizoCjOl)Y{YR0^CVMMxHAr!*(vc=i8Bb!N*cQ^?3`D zZR%{fQ?k!AN~cly=e~$MMwi>C!4~m)TS|DT?;u5YoP|sf5hAdxIUHcDerXH_0`dx9 z d zp=|?fQ3oakxEQZE4Oh|2Xr=K}#L6^OUG|iEiBYh(FGH(v?ge1tBJXlta%>`hiBhcz z_~KZL$8YZlQ$H?k5Y`NxIK~et*=s;(PUQ3EKOQKmpJwJiCO%2soy;~YTjZhr%nMx9 z?b%@`Wcik#mDTc=Ea W!GJ;zWhG8zrILha| 2RVdG#d$p3k|E&c6rwNf=Y5 zSRDi7g0mg{DjMgCq+!u{*2+o^%4nv3%x QpfEJ`6B;s2Sljs7i zG}v^h)iq8}+B;1EHdFWFO($AYTTykWySCSkN@}G5pL+7elupb!Ijd|h{A;_ i9QjMhYH`ma9JU4&hUCF&S`T)lYo*o8}I zW5x>NuF5^J;q=<2 xtt7&5)~nwK8tk1=hX8p{c`M4dO=!xn);2`%iq z{WZDGQbnECAi|er)b83vCuyc9rq1 ho3uuK=-wce7x`v5R-}(czpQKPh2nQ#rWPXkBxYtwWbppPgb0T!L^%@%$tQ z0~sTQ0s}o|H=b*sX{5n`t@FvfJKv%#GD~yQsf@!tLgh-Vx&)1&Lf1BEWD_Q~ddiuh zXmNP{Pk7etNm!<1l|wD(&)Rc?KWk}!UPyjOn{E>xj8n;;+>$4^;Jv=Q&zz!3IhWak zudv#GuyV%`F(fH)A^2wiH@T<3HasG+_@s6de?aPml`@}j8)%t@H h^z1 MCNmXoc?`uF9cK%jZg4QM&RLlvv!R@=1UPZ}RQ>C3G!> zuxQ`|FXkCcD`(POBpbBGaIOQ<*n*A~xkP#VhuDgal4fv2c5jtKe>{IW0cax$GykPG zGzLxjeovjDiXT_1*}*s{%n8sM#Y2vE?K&MxZXQ<*6Nej4itNl{3m#T>S17>i?vvb2 zF@xLm8c$p53~%-}h_gTs9mwved&lN2UrnvZ%Z>{GCDd9zN^%_iD!2K$d1wUfk@-MT zK1yj|DEwgeeHTyvZ`mI0Tw|uK4Gt!AVb@e(V*#*&EB6aF=V`~OhY-Pb88uIWtps Suc6Ipz=*V12X}Vj!>rt)=sH32~D3rKks(&L-_aXkuTo zK@_|Hc1|@VjnWHmVAu{Ob7hCJudpt(R*_BiXzSkO6PGeg@lZ2apBdTc90qM?%wF$m zCYy8*c5e_?RBipGUxGXRnn7gEO-}-Sp6znlq7y8xF^QZ}s-&t_-xW(a+^Zza#%OtB z11sW8MmI!$MZiwfEPGe-&POWeQ4aemwd!w%mRn)06*S=Ktl=BdW|WA^KeYfvA?cGC zA?)(`1eMlU3zSDo2bnl>Fm~I7njZp=YAN~#34>}@k9jycVmy6^wY3=^=J-gi5cy;A;~U^ zWq-m7DAnbFb<$IDE0}}btHY5YuNs4YrElkz@5`U=-{~i(dFu8~_MO|p%A@e^7a?b@ z`4cha*?dh{2AcMtOx*ip!dFR0RrQli;+hQ8grJ2Zy?f^uCY)cl6_vlkwsjd@w{5`~ zEk#%N<&JxDKUzmuiPoECI>MANZNqTnLd5H1DZduIzk)ccEL7jl_2J<78i}mNY z<5=s8s;|l;BQz)>(sv|>RlaRx=P}7^Zm20nJo0&WO4a&Ey1n_mGx?*Mmuqg2(LX_4 z0J1ZS2^x~Xrz%*Qh`=3kU-acH==FpRWpPt?@}u2MQ{cffQSQV)*%i7E6E4am=7JUW zH05mJGIMdY=Ji^f3k}b8udI;A=e5SJn1O!oBztPEPZB2TLM0U(-`Py;PP$2hP1r9C z{m70u$Bqf@V$* j?LGWNLbCdVjFVA!z3cyPbQjm|v}pk!hT> zX&$4(9 N_ew&M`w1%NoZ~$`X7hnRru^ zTXf<+vZ=YU{3PSrIxjm#uXwMYsrLb6_0P2pM(Zj;z^d|Ru#)tN @lZmtzh _HwCY0i{>{f=f~di&ka_t zs-CXl$JW1&3Npp>Aqvfq2+Qajtb%)Sk}V;V&mCPaUX %y6Q) zo7dD0)C5Z89 +;1GP!U_wfA!s?_f|$U)V(Ptn3|^{ zBz`G)M}G)#w`uNM$o(QUpL~s*nT*EI}2;FRVnWyExXNk-H8BdTT&7$8R-rR=t+loa~W0EM;c>) ztXS@i-+?pPQ1i`79Io?i7doV?V<)pS{KvG{`UFF2xEA;Z6W{asD7wch54<3IIDA3i zea*5e1&F?T4IJ`;wDNG{%t#=$FLWDq9Pg;iRQyGX(Ay<6pMRif1Bm0>=^#L^3~-g* zzBOc;T8D{*`dm~UI%gN1DaQ{gaVA U${w07z=7= zx*HgTA%*w-7Pfj>_a4(>L}b;Rrg;Z*=LbV=m*@{yIBfu%<)aY4v8spujb`4sxTIU7 zkM3TU7THIw2-n!i&08n<8=&x6xGXu(+Fs-AvMZnE_r7)f@d#$~TegyR_fP-T?SHHa z@!6S+Ak3}^FQ5*IfE;pf)7CNgqnf&th3by8%wSUIucM2mx8}T(LEKBn&?pk)v1baj z%saGxlGV^}uQiELEvFXad~{;>#-;0~ oVbu zr1K8c*bhNwtPwxhWyX|cLw2MU8R^)Hn;Fxx8>J;hHy`HnIznM7&yEf6kQVPRTdUqN zJ7H03^#1z5b9QT|pBlHXeOf*={rxoGermcnbk6k9h2XzjjJGig-vcKq1kSzE6Rv@J zCIfWujp&(JhMv=sN!QU_1HR79?IcItt(#-z)4$GbmRQowJU$j%3zRyZ!BWhX6%2nF z2*w>7$kkjPOllZ7mJY~MkvG|OO8;EG7n&?gerpp)v(=RwV-i5)tgtiuk;}?+&0+Go z?T?%S_ma<&!*GxM` *=HG_Zu*G826U`&TAd?+ETT3gZ n+XYM#mQIG2&kf)@}Kd9Wyx{2jM4@Ey{&JyAhtU$Wg1o zsz &pcXbyWRzIsJ?~tHcI|_DA&7vjx-(T=mIS(1N;=0N-lWvVX0!%H1 zR}V?HL^7^`r{39(O`PN_E+YD`*hN^)_x2|nG~=)26MnL^dpf66@A!0hmF(lW$7+1T z@=S(4RPcEC^8g6N+S-;se_UMJv=Z_#$)7$V`#>D^1%I~h4SYw>U#xD$0EW?->gi1P z=H5G>rG!{T6)KchH_GnpFAb`qUp{)QYqRGZyuBM}M9J;VyVbr+`lQqV%@d^tS0o;t zYuHI2_H-=vWcFz6ajhTU$3l*8of-*o2TB5{>FMkn-S?o&Hq#}h`=y!II?T3jv8$r< zUX|O+qB%dj^3* !YS(23ch>|D!4{mgBreDms=wdW_(vnW6=O|>Gn zIQg*h5j|DoL`RXlUO388DYys~ob-%e^!Zptrq+tsn(oZn4F=EBILO0-`4z2Iz*^3Y z6X FElbD}mf)JIJ>iqA88_AqzT7qc#rvll~NChL<+ z3fDVOI7Ye#K)Hj|4HqOAi3?%2H8eJ6W>tu48#tyh%YeWA{`M_3Y{d_AIC;0(w+7U( zRb_rKPpL1X<(&S|odH4G_Pdd|a;?TQwGCJ1OU4Ue*4DfgrhDp+#SUb&m8&ad-?$qg zJv7xesNlC)6Cnsv+Xjt22uUFEk-zD(ub^!12L$tNPB7wT0?AM-8r-lL%Red|8|d8+A= z{lLi&G%jT L%o3=CS0eZY4#5wJx&OXu)LMjZ#mi?#8W~T<7@# ztJ>C)x2sd7O}QmwHto4oRv%`Rn_6#ZrkDMJDcy^#J+@+hpc$oF7ii<1dYsMI_ za)?#Ykd1P?MV#0mT?#&L6td1<6pXGC=2C%ZtlV{2_khLa!j;gSU4COmOS+l?zzcQu zI>tIhpWV_Q8 + zZ%9y*;kfxiY(8>akSoGZF0$`{hZ5T9hc0-%zc#*khf;Lw;J^BKWXShpDcs#gW6A>9 zd3UOlv=uhpzG;E#jH2!`LK+(#PrVHma^l{*O3!CprN0t?tj+g;k)Fw|8yo6WlqIGl zPjHSc{WAH;|GLNrU@l0AxKz+A*`S;?EA3QkERcFq*Znl1+S0}XvvtwLZ(}$CiA1X2 z0i{B>Web^zhH3U6@UHC@&;re#MNkoXfITENm)V-3pp0+(gTXMN(&)CGS%Ko=3}kLF zA5(cSVgsMDqotoP)5$2e=VP(H0!A|MPHN{}tlk;uIG~h*+W!2Udw^3$_oo8)bnmq< z0ZBk-(D*2xQ07_o@F=avg>8y<)UciXB?Zk?p{vZ7sG6Q;axqN5wd=Nb$!topP!Nl< zH;P&iKL_> !MRM21)N>EpHy~b7u*$m!w1c_UcdBS3 zQ|k(U3+q|{oc7jSJgW!bG`ji&X j@&u|t`)w9)7_W}OGSKdm`eB%VIYBrOVtf<`7QQ@YxSk#_d5dBCcVFRZ zg>G4I{y?;0T-^B&PDoR!zWS26Z_EPnP^pba02xY5#vo=;Koic%ATT(qK#AyPGCDCM z%#LOm59WAnV38pw?`m!^I9&8xerrW?tPL42Uc^r|V%tihF$U6d=oJqY8sY8=aJpZE zZxNWo1Rpds#%EeWdbTmAhG&zGoMz6fa3ZxcLZC<6kiDq&j@)PbOun@bOP!ob8qan! zxyH8%@WvEPQPP(`DIurE%sstwwN-{ohtT8(wK8Zo56@#7o!piFqGlS{N*Xz}+^@=5 z{#bqQREa-RR!2t(^1QZOcZArU)&wc;%$5XP8+W}1J$$H`oPuCRz5KzDUxOmg&NA83 zdA%PH@Df%-QKEU)JzE=Hu`{h446|E{gvfP-s}6v `4FMfBwbFKA$&kD62HQAaQJ~?%v4;RLn =9SUqW zwX+y3m6q8YNDbPUF4~EyV;@eJ8PBPg&Ff%=WFNTiP{I<1I``R5!Amz$O;7b+v={pZ z@4V3C^hZ`P)!y-b&v2$9+Db7v 5mHpYDz 4(CE)Pzr6~48LrO0sAJzTuXJh-vRE&}1vZLM_xd(6 zEiOc;JG#L38v@`inR9v|9Gn(v@#lHa)5r>jWjY1RZ9Dtz0s(*kpBHymga`FuK*6W< zj}AgxY?oFMO}oOzXL`OfL1Ar%k$sGZ@eH<;m2cD4Wz2HkX5m;b1)@|s7>;%&ZUwnh z;?~9mcQJZT&FkA}J(N2KyKY*Gj{L|2ALAhCfp}wi5BJn}$u>XuQ37AzYqtqb0fSey z#tJm;pPW=7G%if)cm2XBLXF%^3Mw^L5)$&3&nDd0ZA4V##WooHbmQQL+w=% EgtlO&tVfgeD#yD_JQmm zx+NDSwW4Ury_~l#-}P&7z$!xIj(0dT#ZP#R2XWilI2TaV`QgHvs^{?(k72Ayh7xWl z;igt3+%r{HRyj(!4vHe-10RUtIluI^&aqha!Q&sf+kL4mhQ1;TroqE!1aJ5B1u=kj zFd2&%ZXKqxHaLsEQ(QBw^Jp>lFNfxPt&JC^DzEFT2aXT~vK8&W&y5qEf9a8jfXX_k z-p%qT=B!h^XAsdolwtx|*iLsFJ2TVC3pwnB-2K!(kj+9hD$+Ah&Xcc2!YnjN$g|E8 z+(To|2ClDPa2>1a83>`js{1&CUJT3xD{tveRT{{9raiWjfc8STU8z6yb1BMtG6sa4 zDAh}}>jZgd)}oatum J_Ev`s7{|&EzmO-JBE9=
!mQ# zIfkDO+Hlu#30A%!D|Xd%Iy&vaQvO0JM&8ET2c;+{hMG2b^G}xB#j`d{Au2*oPT=K+ zlv+-ms5;acZJujE+t{%!T&O)g5i1Xaz9AcHEevd;j+%9eE$?*Aq!H|sqKXVvvBHG= zR+vN01w-;%4;uifv!gK9*p5jA9%W`qGo{t$=w8{-){ii6bgJd6{30d%Y^UypTL>F_ z!h=FBcc;V5JUj*fW$??v^{!{EF-m8j3<-mA+dFtg8%q7y<14}|AvocDEv =qdkYoO^1F&HyhX7;+7v~fFid(+&U zWBQfl>#9cq?R6TFvg!Pkswmj@$Ajq8Y_=_EO6k133pej(jqR>SYMQTW?VM-UfHP}m zlfs@(WKYCPBeb4ZYS*3hB*6s-4UB=$n2=w=gX)=EcA%ve;Z0t$?JpiCACsJ(@d(E# zpBz(>KVL6KLlm528%xoe2hSkcw?^QkB$88N_DQb@K0QX{PfCydpUIR6K!lR_ST-w; z9?E=iM^-yL{Tp*^1dZ<-)gB&_1fUIt5p*!+#d)FAIWKIxpKwuX zOI@R!ucY=ad=|DMcrm-RCkK4iYksIUv1zRnlfULIwDG*>Qf#%`>t5y37y7?epS{zA z#O|3Ht=QaByfDRSH{A0Kd*1LKHm}8=A>rU`vsf3xO-R!!@9x_8nipYO>1(QSNqG>j zrwdoXxLIy_(2Hw5TR@)XCm3Xf@`TzY4=1pc=bsVHjz%xZ{#eP%y#j5&Xk*vQgj?x3 zF=~XYc>(TUtDk{x2{+$8gkb900fcJ_8EM>U1vgcB3PBlKDXToXjwGlqiu_Entq5)+ zHM*Lc6eDRH2|^dI>hczUM=lZVDY?Pe|E?8@fO#V+$L3upA}=McNJG;Ae j)!Rrz(!aY9yWbmsp<%EicciPK0% h!VrF3Guz$;ez*QfG(1^pB1mKe=xe z2S{^g! E5n_d$u}?<2mLv!MDPq;oL5$2 zDqR*7PnhZdD%*%q?A?50MTzqLd6(+?8Z|ID7$@WLRSRNLa#td{&Q~yX;Li}$7_R?J zE&n0)Fo%D^#oV0%{;*C?F1vl@-W9|4=h7UoLRX%Ud9zYqNbdQ)eg;V?9s@GFVJXe< zeVN1<#pMaBo0wj%IQ|-w>YlN|{rxGG{ bFA0x1x?HEy4OqJ!q})e2*_?en{O$ZLrQN zTC0uFc%AK^$`RWbpqV|ab=p$)XmKJ_LbgEx-Rn92erO%4N&|~vEzX<*2UQ;_3v&?Y zlFoK}Z>L8Le?k!y Sl?-w6?=5-E*T&jpclbj#NC$1{5j zqrB+&-`_INwyR295SrA$=$Q~XXrpqR%aP4KiojlNjuk<~R@INj(ogW9d?kKw&v+%4 zL55rLVlWQKt_Eit<3x^a6ICj#bi2hVJpM7St7)w*7H^atVWOpo&!n77dYJO*JLPdW zO7dO5P}U5aYqkEVnSP1RrVd4dVOL{-)o$B4rX|o_t`ZN?*UUvIT-EB>g7+xpe~qM= z(?2>)e|N38LNzUJF&b?b6eyGVP)MG aQ+jAd2MxB_gOuwuIXdX=iOYOn0Na{Izx?0 z0Nu;>V7YJ)x$yC|U*z`G*_iqD`S_w=`8QS*;&ig#rQWM}Y^tXfeq-WO`SUn}&RoAK zI4k-F9~S`dDbE3%rM5C)`kJPazP~@UAn2`;-fJXW^85`E1_oU?f28n)p}Q9KDvtoL zF7*@Po?UN<(yC^z0ATq6&r9oW8GxzJK^kXk@mC;rtPc2D{h8GdW+f%JQ1l@k8b2Lx$+Gr2Z=<5c8lq0^|6&PTKFjl|iRwbQ7pkA%#l1?VnN=Q$%L2@f` zE~wJPeQGi(3WO=j{5m?F>?z;b1(BG_&CFJS_dg!98boe3I!w513;QRLOl*0S#Qncm zA8+?E=~gQx+I&qjj44v)j?`=mI~f3{TN9-4C~0!uqKwC<8%Yh=2G8{=HteqAdjHYy z^#|RP4^v8?B4EX`k$((rq(hb>+0l7fpf${RcOA#!uR&Gd(L-%9n2dh4pkyV!!luui za&X!s%A&jbvv8$-KZJ%?YD1Fx3rlnh?gXIW`WM2hZW`r~HSzL!$8)SD>{C)^%)_vP z-^5IYr93`1h_-tg^R4YW3H1jBrrim#-%5R-B^lD2Q>qLv3kzXRBB+JGoe(Gp6^Gv< z1h%)^gUfZQR C@q-^7%2DU^BS5h-CRKMXctnm8B=aCaUQ*`vUQmB3V>m~YJN4ITP DNNqch@X>_ zS(YSodh6>TmFP`H^}=>v_XKXUr{w|)lPld8@+A3Y^+HRfF%>|1Plu|3j})W(U$p=` zv$Y7eM2VLbf{AbzvuWcoaiUym{r+ufQZml7`NU?uXO2s1<*)~qhEIWOd)haEz(sXf zL#j`&-&|@jcX)fH9l+Aed5`;k)pu#OK+ELEY4vBzgf>S251*!e61r=1|I43|m*RKM zDSZff()QjU^*kpsi1Vu k4vBzgI5}%^23$~jWx`;YxFhfAF4Z5B~aFh}3 z@K6df*C7ZEIyoFZX;sO-SIbh{py#s{cr>qmthogU<3{hkZrs@z!i)gZnWxB>Qn-o6 z-KknIfw(^=Rxj5meCdABHMvXo)5JROSk6