From 2ee9eb1b655e1186d8a10adb2eb8a073bdc2cc79 Mon Sep 17 00:00:00 2001 From: Hymmel Date: Fri, 10 Oct 2025 15:32:29 +0200 Subject: [PATCH] init --- .gitignore | 3 + Dockerfile | 29 + LICENSE | 21 + README.md | 82 ++ TODO.md | 100 +++ build.sbt | 68 ++ docs/images/base-1.png | Bin 0 -> 90870 bytes docs/images/base-2.png | Bin 0 -> 101185 bytes docs/images/base-3.png | Bin 0 -> 90443 bytes docs/images/base-4.png | Bin 0 -> 110924 bytes docs/images/bulk-1.png | Bin 0 -> 41381 bytes docs/images/home-1.png | Bin 0 -> 25921 bytes project/build.properties | 1 + project/plugins.sbt | 5 + project/sbt-updates.sbt | 1 + scalastyle-config.xml | 107 +++ src/main/resources/application.conf | 7 + src/main/resources/examples/th5-sample-1.json | 1 + src/main/resources/examples/th8-sample-1.json | 18 + src/main/resources/examples/th9-sample-1.json | 1 + src/main/resources/tile.png | Bin 0 -> 28641 bytes src/main/resources/tile_center.jpg | Bin 0 -> 15574 bytes src/main/resources/tiles.jpg | Bin 0 -> 17390 bytes src/main/resources/web/base-analysis.mustache | 115 +++ src/main/resources/web/base.mustache | 45 ++ src/main/resources/web/clan.mustache | 38 + src/main/resources/web/error.mustache | 9 + src/main/resources/web/index.html | 16 + src/main/resources/web/war-bases.mustache | 89 ++ .../coc/baseanalyser/Facades.scala | 71 ++ .../baseanalyser/PrintAttackPlacements.scala | 17 + .../coc/baseanalyser/PrintVillage.scala | 17 + .../coc/baseanalyser/ProfileAnalysis.scala | 39 + .../coc/baseanalyser/Services.scala | 69 ++ .../analysis/AirSnipedDefenseRule.scala | 41 + .../analysis/AnalysisProfiling.scala | 13 + .../analysis/AnalysisReport.scala | 5 + .../analysis/ArcherAnchorRule.scala | 42 + .../analysis/BKSwappableRule.scala | 81 ++ .../EnoughPossibleTrapLocationsRule.scala | 45 ++ .../analysis/HighHPUnderAirDefRule.scala | 56 ++ .../baseanalyser/analysis/HogCCLureRule.scala | 32 + .../analysis/MinimumCompartmentsRule.scala | 29 + .../analysis/PlayerAnalysisReport.scala | 3 + .../analysis/QueenWalkedAirDefenseRule.scala | 33 + .../QueenWontLeaveCompartmentRule.scala | 35 + .../coc/baseanalyser/analysis/Rule.scala | 7 + .../baseanalyser/analysis/RuleDetails.scala | 3 + .../baseanalyser/analysis/RuleResult.scala | 7 + .../analysis/VillageAnalyser.scala | 57 ++ .../WizardTowersOutOfHoundPositionRule.scala | 39 + .../baseparser/ElementFactory.scala | 7 + .../baseparser/HardCodedElementFactory.scala | 158 ++++ .../baseparser/VillageJsonParser.scala | 90 +++ .../ClanSeekerGameConnection.scala | 110 +++ .../gameconnection/GameConnection.scala | 9 + .../gameconnection/StubGameConnection.scala | 80 ++ .../coc/baseanalyser/model/Angle.scala | 78 ++ .../coc/baseanalyser/model/Block.scala | 123 +++ .../coc/baseanalyser/model/Building.scala | 3 + .../coc/baseanalyser/model/Decoration.scala | 8 + .../coc/baseanalyser/model/Defense.scala | 9 + .../model/DelayedActivation.scala | 7 + .../coc/baseanalyser/model/Element.scala | 11 + .../model/FloatMapCoordinate.scala | 17 + .../coc/baseanalyser/model/Hidden.scala | 3 + .../coc/baseanalyser/model/Layout.scala | 15 + .../model/PossibleLargeTrap.scala | 7 + .../model/PreventsTroopDrop.scala | 8 + .../model/StationaryDefensiveBuilding.scala | 3 + .../coc/baseanalyser/model/Structure.scala | 19 + .../coc/baseanalyser/model/Target.scala | 10 + .../coc/baseanalyser/model/Tile.scala | 117 +++ .../baseanalyser/model/TileCoordinate.scala | 87 ++ .../coc/baseanalyser/model/Village.scala | 117 +++ .../coc/baseanalyser/model/Wall.scala | 7 + .../baseanalyser/model/WallCompartment.scala | 31 + .../model/defense/AirDefense.scala | 11 + .../model/defense/AirSweeper.scala | 11 + .../model/defense/AirSweeperAngle.scala | 29 + .../model/defense/ArcherTower.scala | 11 + .../baseanalyser/model/defense/Cannon.scala | 11 + .../model/defense/EagleArtillery.scala | 12 + .../model/defense/HiddenTesla.scala | 11 + .../model/defense/InfernoTower.scala | 11 + .../baseanalyser/model/defense/Mortar.scala | 11 + .../model/defense/WizardTower.scala | 11 + .../coc/baseanalyser/model/defense/XBow.scala | 45 ++ .../model/heroes/ArcherQueenAltar.scala | 11 + .../model/heroes/BarbarianKingAltar.scala | 11 + .../model/heroes/GrandWarden.scala | 11 + .../baseanalyser/model/heroes/HeroAltar.scala | 5 + .../range/BlindSpotCircularElementRange.scala | 13 + .../range/BlindSpotSectorElementRange.scala | 21 + .../model/range/CircularElementRange.scala | 17 + .../model/range/ElementRange.scala | 18 + .../model/special/ClanCastle.scala | 11 + .../baseanalyser/model/special/TownHall.scala | 8 + .../baseanalyser/model/traps/AirBomb.scala | 8 + .../coc/baseanalyser/model/traps/Bomb.scala | 8 + .../baseanalyser/model/traps/GiantBomb.scala | 8 + .../model/traps/HalloweenBomb.scala | 8 + .../baseanalyser/model/traps/SantaTrap.scala | 8 + .../model/traps/SeekingAirMine.scala | 8 + .../model/traps/SkeletonTrap.scala | 8 + .../baseanalyser/model/traps/SpringTrap.scala | 9 + .../coc/baseanalyser/model/traps/Trap.scala | 6 + .../baseanalyser/model/trash/ArmyCamp.scala | 9 + .../baseanalyser/model/trash/Barrack.scala | 8 + .../baseanalyser/model/trash/BuilderHut.scala | 9 + .../model/trash/DarkBarrack.scala | 8 + .../model/trash/DarkElixirCollector.scala | 8 + .../model/trash/DarkElixirStorage.scala | 8 + .../model/trash/DarkSpellFactory.scala | 8 + .../model/trash/ElixirCollector.scala | 8 + .../model/trash/ElixirStorage.scala | 8 + .../baseanalyser/model/trash/GoldMine.scala | 8 + .../model/trash/GoldStorage.scala | 8 + .../baseanalyser/model/trash/Laboratory.scala | 8 + .../model/trash/SpellFactory.scala | 8 + .../baseanalyser/model/troops/Archer.scala | 12 + .../model/troops/ArcherQueen.scala | 12 + .../model/troops/ArcherQueenAttacking.scala | 9 + .../model/troops/ArcherTargeting.scala | 7 + .../baseanalyser/model/troops/Dragon.scala | 12 + .../baseanalyser/model/troops/HogRider.scala | 14 + .../model/troops/HogTargeting.scala | 17 + .../baseanalyser/model/troops/LavaHound.scala | 10 + .../baseanalyser/model/troops/Minion.scala | 12 + .../model/troops/MinionAttackPosition.scala | 7 + .../coc/baseanalyser/model/troops/Troop.scala | 106 +++ .../troops/WizardTowerHoundTargeting.scala | 6 + .../stringdisplay/StringDisplayer.scala | 139 ++++ .../StringTroopDropDisplayer.scala | 28 + .../baseanalyser/util/ElementsBuilder.scala | 53 ++ .../GameConnectionNotAvailableException.scala | 3 + .../coc/baseanalyser/util/Memo2.scala | 10 + .../baseanalyser/util/TimedInvocation.scala | 12 + .../baseanalyser/web/ModelViewModels.scala | 81 ++ .../baseanalyser/web/MustacheRenderer.scala | 16 + .../coc/baseanalyser/web/PermittedClan.scala | 3 + .../coc/baseanalyser/web/RuleViewModels.scala | 87 ++ .../baseanalyser/web/TopLevelViewModels.scala | 31 + .../baseanalyser/web/ViewModelMapper.scala | 379 +++++++++ .../baseanalyser/web/ViewModelProtocol.scala | 97 +++ .../coc/baseanalyser/web/WebApp.scala | 19 + .../baseanalyser/web/WebAppServiceActor.scala | 224 ++++++ .../webapp/.ebextensions/01_gzip_httpd.config | 5 + .../.ebextensions/enable_mod_deflate.conf | 29 + src/main/webapp/WEB-INF/web.xml | 32 + src/main/webapp/css/base-analysis.css | 25 + src/main/webapp/css/main.css | 3 + src/main/webapp/images/buildings-sprite.png | Bin 0 -> 251541 bytes src/main/webapp/images/walls.png | Bin 0 -> 17748 bytes .../js/base-analysis/DisplaySettings.js | 35 + .../webapp/js/base-analysis/MapDisplay2d.js | 759 ++++++++++++++++++ src/main/webapp/js/base-analysis/Model.js | 124 +++ src/main/webapp/js/base-analysis/Preloader.js | 19 + .../RedMoonBuildingSpriteSheet.js | 274 +++++++ .../base-analysis/RedMoonWallSpriteSheet.js | 34 + src/main/webapp/js/base-analysis/Ui.js | 136 ++++ src/main/webapp/js/base-analysis/main.js | 22 + src/main/webapp/js/console-polyfill.js | 17 + src/main/webapp/js/war-bases/main.js | 177 ++++ .../analysis/AirSnipedDefenseRuleSpec.scala | 39 + .../analysis/ArcherAnchorRuleSpec.scala | 55 ++ .../analysis/BKSwappableRuleSpec.scala | 97 +++ .../EnoughPossibleTrapLocationsRuleSpec.scala | 95 +++ .../analysis/HighHPUnderAirDefRuleSpec.scala | 43 + .../analysis/HogCCLureRuleSpec.scala | 31 + .../MinimumCompartmentsRuleSpec.scala | 37 + .../QueenWalkedAirDefenseRuleSpec.scala | 45 ++ .../QueenWontLeaveCompartmentRuleSpec.scala | 36 + ...ardTowersOutOfHoundPositionsRuleSpec.scala | 64 ++ .../HardCodedElementFactorySpec.scala | 36 + .../baseparser/VillageJsonParserSpec.scala | 82 ++ .../ClanSeekerAkkaServiceAgentSpec.scala | 20 + .../coc/baseanalyser/model/BlockSpec.scala | 79 ++ .../baseanalyser/model/HogTargetingSpec.scala | 28 + .../model/TileCoordinateSpec.scala | 16 + .../coc/baseanalyser/model/TileSpec.scala | 55 ++ .../coc/baseanalyser/model/VillageSpec.scala | 85 ++ .../model/WallCompartmentSpec.scala | 32 + .../BlindSpotSectorElementRangeSpec.scala | 18 + .../model/troops/HogRiderSpec.scala | 54 ++ .../baseanalyser/model/troops/TroopSpec.scala | 36 + .../stringdisplay/StringDisplayerSpec.scala | 93 +++ .../util/ElementsBuilderSpec.scala | 14 + 188 files changed, 7395 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 TODO.md create mode 100644 build.sbt create mode 100644 docs/images/base-1.png create mode 100644 docs/images/base-2.png create mode 100644 docs/images/base-3.png create mode 100644 docs/images/base-4.png create mode 100644 docs/images/bulk-1.png create mode 100644 docs/images/home-1.png create mode 100644 project/build.properties create mode 100644 project/plugins.sbt create mode 100644 project/sbt-updates.sbt create mode 100644 scalastyle-config.xml create mode 100644 src/main/resources/application.conf create mode 100644 src/main/resources/examples/th5-sample-1.json create mode 100644 src/main/resources/examples/th8-sample-1.json create mode 100644 src/main/resources/examples/th9-sample-1.json create mode 100644 src/main/resources/tile.png create mode 100644 src/main/resources/tile_center.jpg create mode 100644 src/main/resources/tiles.jpg create mode 100644 src/main/resources/web/base-analysis.mustache create mode 100644 src/main/resources/web/base.mustache create mode 100644 src/main/resources/web/clan.mustache create mode 100644 src/main/resources/web/error.mustache create mode 100644 src/main/resources/web/index.html create mode 100644 src/main/resources/web/war-bases.mustache create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/Facades.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/PrintAttackPlacements.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/PrintVillage.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/ProfileAnalysis.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/Services.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisProfiling.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisReport.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/PlayerAnalysisReport.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/Rule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleDetails.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleResult.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/VillageAnalyser.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionRule.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/ElementFactory.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactory.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParser.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerGameConnection.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/GameConnection.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/StubGameConnection.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Angle.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Block.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Building.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Decoration.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Defense.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/DelayedActivation.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Element.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/FloatMapCoordinate.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Hidden.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Layout.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/PossibleLargeTrap.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/PreventsTroopDrop.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/StationaryDefensiveBuilding.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Structure.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Target.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Tile.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinate.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Village.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/Wall.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/WallCompartment.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirDefense.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeper.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeperAngle.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/ArcherTower.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Cannon.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/EagleArtillery.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/HiddenTesla.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/InfernoTower.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Mortar.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/WizardTower.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/XBow.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/ArcherQueenAltar.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/BarbarianKingAltar.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/GrandWarden.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/HeroAltar.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotCircularElementRange.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRange.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/range/CircularElementRange.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/range/ElementRange.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/special/ClanCastle.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/special/TownHall.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/AirBomb.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Bomb.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/GiantBomb.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/HalloweenBomb.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SantaTrap.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SeekingAirMine.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SkeletonTrap.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SpringTrap.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Trap.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ArmyCamp.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Barrack.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/BuilderHut.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkBarrack.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirCollector.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirStorage.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkSpellFactory.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirCollector.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirStorage.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldMine.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldStorage.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Laboratory.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/SpellFactory.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Archer.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueen.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueenAttacking.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherTargeting.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Dragon.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRider.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogTargeting.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/LavaHound.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Minion.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/MinionAttackPosition.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Troop.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/WizardTowerHoundTargeting.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayer.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringTroopDropDisplayer.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilder.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/util/GameConnectionNotAvailableException.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/util/Memo2.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/util/TimedInvocation.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/ModelViewModels.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/MustacheRenderer.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/PermittedClan.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/RuleViewModels.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/TopLevelViewModels.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelMapper.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelProtocol.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/WebApp.scala create mode 100644 src/main/scala/org/danielholmes/coc/baseanalyser/web/WebAppServiceActor.scala create mode 100644 src/main/webapp/.ebextensions/01_gzip_httpd.config create mode 100644 src/main/webapp/.ebextensions/enable_mod_deflate.conf create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/css/base-analysis.css create mode 100644 src/main/webapp/css/main.css create mode 100644 src/main/webapp/images/buildings-sprite.png create mode 100644 src/main/webapp/images/walls.png create mode 100644 src/main/webapp/js/base-analysis/DisplaySettings.js create mode 100644 src/main/webapp/js/base-analysis/MapDisplay2d.js create mode 100644 src/main/webapp/js/base-analysis/Model.js create mode 100644 src/main/webapp/js/base-analysis/Preloader.js create mode 100644 src/main/webapp/js/base-analysis/RedMoonBuildingSpriteSheet.js create mode 100644 src/main/webapp/js/base-analysis/RedMoonWallSpriteSheet.js create mode 100644 src/main/webapp/js/base-analysis/Ui.js create mode 100644 src/main/webapp/js/base-analysis/main.js create mode 100644 src/main/webapp/js/console-polyfill.js create mode 100644 src/main/webapp/js/war-bases/main.js create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionsRuleSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactorySpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParserSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerAkkaServiceAgentSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/BlockSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/HogTargetingSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinateSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/TileSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/VillageSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/WallCompartmentSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRangeSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRiderSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/TroopSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayerSpec.scala create mode 100644 src/test/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilderSpec.scala diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c14674c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +/project/target +/project/project \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b872a00 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Stage 1: Build the application using SBT +FROM sbtscala/sbt:11.0.11_1.5.5_2.13.6 as builder + +WORKDIR /app + +# Copy project definition files and resolve dependencies first for better layer caching +COPY project/ ./project/ +COPY build.sbt . + +# This step will download all the dependencies +RUN sbt update + +# Copy the rest of the source code +COPY . . + +# Package the application into a WAR file +RUN sbt package + +# Stage 2: Create the runtime image with Tomcat +FROM tomcat:9.0-jdk11-openjdk-slim + +# Remove the default webapps +RUN rm -rf /usr/local/tomcat/webapps/* + +# Copy the WAR file from the builder stage to Tomcat's webapps directory +# The WAR file will be automatically deployed by Tomcat on startup +COPY --from=builder /app/target/scala-2.11/coc-base-analyser_2.11-0.1.war /usr/local/tomcat/webapps/ROOT.war + +EXPOSE 8080 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4a875ed --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Daniel Holmes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2a67bc3 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# Clash of Clans Base Analyser + +Analyses base layouts against sets of war base rules. It runs this analysis in bulk and provides tabulated results for +the current war bases for each member in a clan. Additional to this you can click through to an individual's base to +see a more in depth analysis. + +Analysis is only allowed for pre-configured clans in the app which are assigned an alias for convenience. + + +## Dependencies + + - SBT + - JDK 8+ + - Scala 2.11 + +To find available SBT dependency updates run `sbt dependencyUpdates` + + +## Tests + + - All: `sbt test` + - Individual: `sbt "test-only org.danielholmes.coc.baseanalyser.baseparser.VillageJsonParserSpec"` + - Individual continuous: `sbt ~"test-only org.danielholmes.coc.baseanalyser.baseparser.VillageJsonParserSpec"` + + +## Command Line Utils + +`sbt 'run-main org.danielholmes.coc.baseanalyser.PrintVillage alpha "I AM SPARTA!!1!"'` +`sbt 'run-main org.danielholmes.coc.baseanalyser.PrintAttackPlacements alpha "I AM SPARTA!!1!"'` +`sbt 'run-main org.danielholmes.coc.baseanalyser.ProfileAnalysis alpha "I AM SPARTA!!1!"'` + + +## Running dev version of site (automatically reloads on changes) + +`sbt ~tomcat:start` + +Available at [http://localhost:8080](http://localhost:8080) + +Accessing a clan e.g. [http://localhost:8080/clans/alpha](http://localhost:8080/clans/alpha) + + +## Production Build + +`sbt package` + +then deploy the war as required: + +`target/scala-2.11/coc-base-analyser_2.11-0.1.war` + + +## Game Connection + +The app requires a connection to the Supercell servers to query the village json and other clan members. Note that this +isn't referring to the official [Clash of Clans API](https://developer.clashofclans.com/), but a direct connection to +the game servers how the game does. Once upon a time this project used a product called "Clan Seeker" which has since +been discontinued. It's trivial however to write an agent for the app if there's another such service out there: + + 1. Write a new game connection agent that implements the + [GameConnection Trait](src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/GameConnection.scala) + 2. Wire in the game connection in the + [Services Trait](src/main/scala/org/danielholmes/coc/baseanalyser/Services.scala) + +At the moment there's a hardcoded stub/testing GameConnection with dummy data + + +## Rules + +The project is very much in a WIP state. Town Hall 8 is pretty fleshed out but TH9 and above don't have many rules. +Also these were modelled off of attack and base building meta from around February 2016. Some newer buildings are also +not present such as the Bomb Tower. + +Rules are pretty quick to build due to the building blocks and infrastructure of a modelled base being in place. + + +## Screenshots + +![Clan Homepage](docs/images/home-1.png?raw=true "Clan Home") +![Base Analysis 1](docs/images/base-1.png?raw=true "Base Analysis 1") +![Base Analysis 2](docs/images/base-2.png?raw=true "Base Analysis 2") +![Base Analysis 3](docs/images/base-3.png?raw=true "Base Analysis 3") +![Base Analysis 4](docs/images/base-4.png?raw=true "Base Analysis 4") +![Bulk Analysis](docs/images/bulk-1.png?raw=true "Bulk Analysis") \ No newline at end of file diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..0dab6c2 --- /dev/null +++ b/TODO.md @@ -0,0 +1,100 @@ +# TODO + +## General TODO + - Obstacles anywhere but outer 3 border tiles rule + - just use generic obstacle render atm + + - Once api up again + - store skeleton trap mode once can see and verify on live data + - store xbow mode once can see and verify on live data + - double check sweeper angles being rendered same as in game once clan seeker up + + - own connection + - purchase from alex + - set up on own small EB app + + - trap access (if leadership go for it) - new, dedicated credentials of own + - Privileged vs unprivileged analysis - warnings if not using traps + - asterixes against rules which traps have an effect + + - password protection (in the wrong hands opposition would see our trap locations) + + - analysis performance, currently too slow + - MapCoordinate trait with underlying FloatMapCoordinate, TileCoordinate, Tile - encourage integer math where possible and prevent widening + - Views of tile sets (e.g. TileBlock returned from matrix + - Redo ranges - should include underlying cached set of tiles + tilecoordinates contained + + - Some TH9 rules + - Queen Charge into wall breakable compartment shouldnt get to 2 air defs + - It should require either a jump spell or 2 wall breaker groups in order to access the queen. + + - on equidistant hog lure, mark it as such or ignore it all together (maybe a pink line showing equidistant, non luring alternative path + + - TH10s without infernos should go under TH 9.5 rules? + + - separate hole in the base rule - just to highlight really bad issues (due to ignoring some others) + + - expand possible trap locations for channel bases. e.g. see spandan and vicious 2.0 an sparta home base + + - Begin on DGB: + - class PossibleDoubleGiantBomb(anchors: (Either[Defense, PossibleTrapLocation], Either[Defense, PossibleTrapLocation]), gbs: (PossibleTrapLocation, PossibleTrapLocation)) + + - BK Trigger rule further tweaks. should show red for all non-compartment tiles floodfilled from triggered + + - clarify AQ range - see iphoto screenshot of greg raid. possibly shown on ppetes war base + + - TH11 rendering - new levels and warden + eagle + + - sbt deploy task + - 3d render + - split map display 2d apart. New inner stage container - drawLine(tile1, tile2) which transforms to 2d or 3d view + - separate rule groups for farm vs arranged + - pass, warning, fail levels (e.g. for minion anchors) + - integration tests + + +## TH8 TODO Rules + - air defs should be a minimum distance apart + - SAMs not next to each other - one kills a dragon + - loon pathing + - must be >= 3 defenses to go through to path to air defs + - OR must be > certain distance + - should also consider air trap placement + - should also consider air sweeper placement + - minimum 3 DGB possible spots (including diagonal) + - minion anchors (warning only, no hard fail, once that functionality is built) + - wb t junction warning + + +## TH8 TODO Rules once traps available + - spring trap locations (resting on defenses) + - skele traps should be on ground and not triggerable during cc lure + - skele traps + air traps not within dgb positions (gives info for cleanup if first hit was with air) + - 3 viable DGB spots (more difficult) + - farm wars - teslas in diff compartment for gowipe + - trash buildings in front of all outer ring defenses + + +## TH9 Rules + - EQ cant connect >2 GB/DGB positions + AQ + - Jump doesnt connect too many AQ, GB + - queen needs to be protected from “suicide dragons” + Specifically, an air sweeper pointed to protect the queen, or (more commonly) a black mine between the queen and the likely dragon entry point + - black bombs within range of queen or air def - to get hounds or suicide drags. red bombs out of range of air defs + - The defenses around your DGB should be more than 4 tiles from an exterior wall + Ensures the defenses aren’t eliminated using a queen walk + + +## TH10 Rules + - cant get 2 infernos with one freeze + + +## Expansion ideas + - Hog pathing analysis - start paths from each tile and be able to select/see individual paths from defense to defense + to show DGB issues + - multiple goals/rulesets: + - farming (protected loot, give away easy shield - one star, but no value for more than) + - war - depending on clan and level, this might be to prevent 1 star, prevent 2 star, or just prevent 3 star + - trophy? + - provide weaknesses for attack types. e.g. drags doesnt consider DGB locations, hogs dont consider air def high hp. + - queen walk pathing from drop point diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..54a45b0 --- /dev/null +++ b/build.sbt @@ -0,0 +1,68 @@ +name := "coc-base-analyser" + +version := "0.1" + +scalaVersion := "2.11.8" + +lazy val root = (project in file(".")).enablePlugins(SbtWeb).enablePlugins(TomcatPlugin) + +libraryDependencies ++= { + val akkaV = "2.4.4" + val sprayV = "1.3.3" + Seq( + "org.apache.commons" % "commons-math3" % "3.6.1", + "io.spray" %% "spray-json" % "1.3.2", + + "io.spray" %% "spray-can" % sprayV, + "io.spray" %% "spray-servlet" % sprayV, + "io.spray" %% "spray-routing" % sprayV, + "io.spray" %% "spray-client" % sprayV, + "com.typesafe.akka" %% "akka-actor" % akkaV, + + "org.scalactic" %% "scalactic" % "3.0.0-SNAP13", + + "javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided", + + "com.softwaremill.macwire" %% "macros" % "2.2.2" % "provided", + "com.softwaremill.macwire" %% "util" % "2.2.2", + "com.softwaremill.macwire" %% "proxy" % "2.2.2", + + "com.github.spullara.mustache.java" % "scala-extensions-2.11" % "0.9.1", + "com.google.guava" % "guava" % "19.0", + + "org.scalatest" % "scalatest_2.11" % "2.2.6" % "test" + ) +} + +lazy val testScalastyle = taskKey[Unit]("testScalastyle") +testScalastyle := org.scalastyle.sbt.ScalastylePlugin.scalastyle.in(Test).toTask("").value +(test in Test) <<= (test in Test) dependsOn testScalastyle + +lazy val compileScalastyle = taskKey[Unit]("compileScalastyle") +compileScalastyle := org.scalastyle.sbt.ScalastylePlugin.scalastyle.in(Compile).toTask("").value +(compile in Compile) <<= (compile in Compile) dependsOn compileScalastyle + +// Runs with tomcat:start, only want for war task +//(packageBin in Compile) <<= (packageBin in Compile) dependsOn (test in Test) + +/* +webappPostProcess := { + webappDir: File => Unit; + + def listFiles(level: Int)(f: File): Unit = { + val indent = ((1 until level) map { _ => " " }).mkString + if (f.isDirectory) { + streams.value.log.info(indent + f.getName + "/") + f.listFiles foreach { listFiles(level + 1) } + } else streams.value.log.info(indent + f.getName) + } + listFiles(1)(webappDir) +} + +pipelineStages in Assets := Seq(concat) +// Doesnt work but need something like this so can copy the staged files in the PostProcess above +packageBin <<= packageBin.dependsOn(WebKeys.stage) + +Concat.groups := Seq( + "js/script-group.js" -> group(Seq("js/script1.js", "js/script2.js")) +)*/ diff --git a/docs/images/base-1.png b/docs/images/base-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f34795fe83f25e45d3790f1170cd2b9e60df95a9 GIT binary patch literal 90870 zcma&M1yo#3(=Lj;1ozxsO_lLbd4Zwe^AeD({6YU7b11 z|F+@qb#{Yl!@!72__~=}I$8s%EUazqUBqb4I)2bl*;|Rx=<%s=sklj7+u1Aldsu7v zt7=>NJ6Z}^(MX6>iTVmd4LDl^&8d8yom@PHeZ^@0u`3L{{wwCBq57u@&{2%$U!e3= z)TyLhJ*=ttIC$ADxwyHh`1v`w-|_MDbF)$LaB=f+azVfR?A-5!`S^u-1gQS&Lj(2Z zVPzw%DI@n^zMywvGID>|fg=4^2+nT*ZPvx}zq$$9VVu6^Zk*g4Tz^CQ zcS9AG|M#ZO&i~!o6R2tZKY0J6VNY#8H)~E!Yfo1%4@>C4+0g!V8 zb^3QNs@u5&T|Mnw-KeCs_^Fsw%q{I*{tB4?(NIwlR&?2z0#e-n)|GL!^m4X#0sdRp>VI_k{;#@! zlfl^y>RHCx!`|E4O3uU8nd+aQh3)?X7Cs(nA!%s=IiYt_a{n32zjUqs1D1d33Ud8l zbvdD6IR6gq|2EYB7D4mp@8y3dF7)QVQ{UPJn(rRa#5U@?aECrGFzWBMWeqjC{Qdlv zE^l?ZblgA$0fyX>O$_;if)DdH5Jx>BO^kgVacIg}mHzw?@Wm(nYjPK+mN#CG=erHF zi$D+K3M^C|VfOsAfaZDE58iBF{B%4+`8FlRc?GduXq_%Mn@hUpxp|FG*Jg7*aLpAM z3u(G^wl`a)zge5^Y!2k(GA^lKEWG%kd-(0JE7QQ!Qg^Lh*B22XIl_CUzoo0L2n_}K zXs)QKBy*;If4WS^_h_@Prhxf_Kh5H7Jtng>F~TcN}vPlalMzc&%Oi){Z+iPJZTe z8hk7k9NkQtFYtVPJPH2(_DgYVTCTBk0n$nX8aF0Vdpeq^7%QkC?e_482RHjcdq^&S zNu~$ZU8A(L3Tx5#j+cjxnHjJFB7(&SYd4i$1%rtq)YD>#x-jg` zPa~Y7Ip_DAZQnIhOh`k8Nq`1EB=q!#?o95Um$w%+z`I8)6^jxc} zJ1aZClLtxfU$4B&DDy@Ivj^T8B*40s5Jb1XN%(>P`ua+(-q!>JYiz721JL$eIqt&t z)f&!%1Pwe6B$2E->ZH?>Ab)g9BL;@L$<96nVcWetq2jBYyF8(*Xn=N^de&_pmsFHRO&5G(VQD*-LQQ}TL$URfQ?f3~L1^Qm=7hNNN&rKYa*VNc`z?19v zB6z9TLxiKDfNwTN-?iF}KOvOUH)LYFjozI@2((y4ln>~bcbGKC#W(w=qrBl|v{0_W z@RUe{RjI=sH7`egW1aX`8O@5`LRbDbEpKd@`>z(GsukZKj$!F4Z=_oybHknNXlwng zm}s2k%pbMrSHlHAqQveFh>3Fx?HHGwo8-QkCcq3L+=-Yhmye|joLZ5brA_cBlqFf> z?mC#ZRw)7ur!H@7xD3&cJf^~|3zPb+!swptBdj~Ep z#xSZYem@@qh%cc`X33aoM^Ta3<_;9o#cLC5mNl5Gh~ES7er=jhZeP6qLK_)GlL}#) zn`Jx@{7EY4W)<4Not1l;s(9Go#rDLrvgC=V>y=B4NEfBgWntdSnPtC+hd@~iy7k6# zk!+P;SxxyYd2j2z)p$X%R^XSKSzl0`)ZV*qtnvS{-bhNT+@DM$T1LUB^*C%5}ijKdZnE{CyJ4B=FVXX3) zIGE=YQHa#x+(l^&5Jc2?mV-{6^>Dx;w9I&D#%>c6j0hC0VMqPht0tWX)CRx)Rv>PA7Ww!KuCE&zPP2*u2>{YZjSalaib90JT7B$)8 zA#99ap#u+I6~gT3$fmEng9)P0&*v~Eealev!g%&^?d7}T{l}+pqtF!RtY5ZtrOn&P zSwiYvEBD`{m}GZxA_=JUmcH|SXQ6}NnYWHjkHNy_TuSZ#v&Bfj>O}C4u1PR+zeqAU z;iClYcPYW|WN^s|@36qKf8MnFdTeWUQ6jA~bqE(~hPsI|cfTmCN~_xL=);bx%4V8U zISHg8m~=VZx;DSS7Z(~sr15I)(&PFlf%z$cNYqzi}ly|w_N-QOCp{}Zd zKY-ileMIbxOs0w`z^50~8Ujl={Xt*d<;tu_P<*$+lq+wddPnLbYl8|P7#*X%m?DHu zz_M4E@nO4hz(aEKY$!@2IwX+klXo+fe4f2`j5TD*f{%5g)8&c4qC@$UB$4q+crM6F zCN>j!xz7eB6}GV_?Z{&5CF6`A_4HjRgvc_y-RXRC_>AZ^c&P|D)%@F+i-35Ph}Zk)%qj_4O>M9GP5jFTXp(H zEMfz88C_lhzX}!pm!^FbPiC);xYSyJz>=0gqL8z zhm!+DSS>Mde`K<#<4@Bb>(A$}me|T*fERDQlnCT<1jdzSqxG?h-d9JEGglQB0EC4( zz!cQrNH#cPH3#>R2%a}6AC5AaeIyh?X+~r`KVxD;x#|ZQ8MxhacjC1P9A-wJt7B-r z56RJDaFN7{IC%!xTxO2&okBu=!?KRnEaH`v7~(^tLn_tZ)cMC8&kx`i(3*OO`SP}z zOr2M6y{YC_zEt+WOG;N{fn!YSP$`7_F>a1&qFAOOk8pUP4s-9^RginNM5E-q5}F?i zSTvXnYj80>*j@NMA3Hj^{b#$IA@Nb7i1vdONesLyjvpsiR zHv`#W2aFdX@eg?oALM#<3}|I(qC5b@F#H8$j)e`XJ@yd;-2s(ZRAq_n?(W)B?u70t zMZ)rKgOQ$x-@9eDUQ5uAs19TsRjXR3@qI{yY2iPx52-arDm(j!sVe=vkG0DhS+61t zY<+T9nHbM2EYU}XzkIA5W zZZy#uIfgJZzHz826zmbS0M~ejV);-G;p4-y zDZ!@zz^(gTBtmmM@N;B`J!$|AWF-Y;IXzH?5~f-dPz=cYgJvAZP6Od6&txOLc6-C^ zUZr^WYtBF#K{@LTTSnL?Yl)Mw8iV_FPo4Hzz$oUK+tQ5ub&bPQmkom3Uj+LJE=EAi zir3g-4)NOA2nA9AWOfr%68<6sUSIG!m#%NkV_jwSn0Korl&t$QiN^mHVx)}#G}R=I zvVT8CA0l=HZC*FexNc zivRk&z^VapbRK3dZd@%fz7jJ;bKB;7K>QQ0+usZ!Mt^MfZd(-!RF1C^8BH5zO@M)} zf;05*a7vdK@a>P^9CR^)(l+a;aIfKJtJa&XKl48_wni#LsQIKB4tQz1n>A}bD*8o6 z3>?L!MfWHq#3jN!=u*)&>}W}R;^5c`OU-CJAIyiTo8zX2Y{RrBMw9(Ux`N}?O%R!M(y>If|Bb&fk?hu=0Rr;w*={TpJ%gUDbcRbiHdjNaDinL-o4 zB%o&`V7TkBwXi9P6183RSYUV>i@L}umO|5rXsY7tl%U;VkNrur0@yF`>es+Y%K*F0 z+El;Y(X|EHkNVyfFd(i_+ zE_qR8@3@|{$K}A9S7Y+{w^Wz`@0;*p7Byf44gPjizb7y~QM9rTf zO9h|b{OU~WVKm~OGT*Poae3ymr+~&&xZ(wgT4l4FrjYsuV&5fA32Gjs*Kx2KFo z?z??rg^_e9-d|dC@j+IF5v5^3@CUS_DjD9>8FlI#-}jm^FoSc?rzMk;DtVI<5*%r1 zcN3%#AgeJ%q{|bS5lIwox-OqvlzqHpY)Ma@-;mWfZyCj7S^zG;Y^w+SqHQZf#!s2P zRmfN=A(Qdnu_2@s`7r4uI5Of+#`vI4D;Y;G{?O+PS7)T&u6iWAHs&2gwv~!U<8`&q zq@YaKp2#79P6M}<4QrMm41J!gdfw-RGYXi6369a>NpK>TR!KUUWUW@Wl4h_f)$w9Y zPzQf!cuDxc{oSld6)CUG*^x22UphNA{rru--y0Nrrqn;^tWH|dlA9U!m|~xuujDYl z*k>AM3jNCZiC$6M;HJxqCbSz(F-3ckz}oH&;3 z$0WwnJx}$Rm6`B_xOSuMB=X!?+(3qDa|@it&P={U98~N?bJcl1q-i^D!h$=@j&x7&M$;mZ0Stu*2^Q^c zb;Y;W8*{M>(SecO7N%YDY8v43_bOm{1LTZUvG8ju#JsVe2+wFHl zCSD-O1;O`UXZ&9lh`Le0ue3@vL9|jevIX&?H;J)=d`cE+^pto7O9Bk9vSvA<1Kk%w z0PGZTBG2xer<^9E`h#?Z7UGRlm!Hl_=6iy;^p5%2x*pKa6`;}HiVS7tDnjwPK73I+s{pah&n;{(wiui+_v7;^7-QBETo zB`Lb5gQOsC#_=`sB&8B!LDysY&$mdwj5by~6fg;foFoI~&g#+Nf?QqC$7YoM-|b(g z&vglqU&A+?R_8YTk+7X=ziTq!yxtH#YFe~e7YSHE-}jmJznU>vnvf87TySieS~2Mk zxchx02=4mpy%9cdWNyj)l^ET9rvNJqD{$pa*~Qo`Q4eB!S&D#(irQw+xG&P(nm^5Q;UMQIQ;?fnZM{LF=Qs$i&Nr zw6gD|y+M}Vdm6NBkF~d7oF^XLnw_Vxf_tNXn`)nfqhlq1%&zzc@10`zR%|A6zr0kj z-p^HuU{5@9!abtDflO|kor#Ni-dX#0ya$wm)Re(yIrM3&q(`-i>eh8zd3fM>S&0C5 zl$qjE09Q*HY%CJl`1ZWrbo4#MT#9&hl4@J6!1P-t>7u-vSrS~{{W(cMENK}UR*e7N zHAf$&|M7K!zzCG%P7kLL0mcNW45{|cx>`#LUd4@P(OVN$B}4FbCjGDebS$2|ymW1D zK2yU!tDs&N^D2h?%K2yb5W8-6w}t_z*8tyYITFbkv^BYcM3Ifth2p#O3qV_9&1xq~ zg9I5|=uAGheu8Q!jv03=3Ov^K^3)Hng&dei9*jry zh^`~st~R@cssL=5S3!hOaTE}?1^5gT$*2HJ&JhIC0+*&7sS3XOeri3%Rj$P%1&9CX zEviK-;?irM{Dl#Ey4~t>@BJ8|Os|Y`F;ch9n29`1iHytIgWa=zsmONO2O7pL8?LI6 zJG;Spi=5%^k3N8Z>LSBRILiE@njB~lS%7sLbxDVV-GqREwnKI9+^fd#yg1$@d41GV zMZ{rl`y2`Q4(ZKm$QS2wyo+9Pk8Xa*5tLafDu51rsgcjw3zs20bh;B)kz~wsKVKjv zr^|DX0Qj1h^-S2{fO)r2ymv-P5}1OqIYj8PZmBNvyrLtHX7c}pX?YMD-)(N+EpNQ< z;fo+Q+R4Jh-;FbjvC-J1!FUWGKR*x@W()TJjO+?0ks+OxDeXs7r?>k~226wyQTclq zrv7wfk>^QaJJK5FvEJwma|-D!@Ghsf_iWnVlcaIP9R)@V1%w<@_val}{Indj*5F^; z!})&_HH9}?P*UTnQO;@7@Rtc6CLz$Aqn|^#D{zFO~PQfEiYEM#U#> zwNIk4%n@&m$=LdAFY9DC8_R#q_4<||N61IuY$nMC#Rm-vDgS*oh``0j6EVYF+P&5R zgUzk3vRwMG#won_y~HW=AEaZqqq3=pjX$!6qph_u*z-|Q$V4<>1@zDn|K6%c`(?yd z8ViV)83}1m-{J)6ZDa4~#xYOzGM~1oB@*sp*DCo518}=@leIV)KtGh~zvD9c2>Q}~ z3|9pdaDb3$qkE8OC5JyA@^eP$w&ehL6bfN^AKZwm*vAa9oq-LcdI*A@6PL#JJs9Vd zA3@?|lr;!6fM~+bsp_HcQcUv5;UC>?+gDL~3%^}3CwR=(CkMA`zBhoQK=$CKqd*ge z=0ra6^#?~gO=T_w;jnt*E6*0fj&slO8IbL#eiy>EONtU|OdEnjgwfN8PglR(xb$n1 zv~dvqzo$ofB93q4&7?&hp%*AUy~|9DA%Y7cvAboaTcp6%97BT+C3GHS0__ef`DQy5 zbv#23<}R=by5XWP%-%fN_jy}>h7SVHeN*pb%?Snyr9942-xR%FdlG-{{q06dYZ>_F z>+y9+9u^YwUqk+M5c!CEz6*~QG;+wMN@$TRPH=A~`!4MB3c^#xW`gj|BpJH=?8E&k zQC9M($Bahl%ggxqaENh>><{i-WXj(&1J^O^QfDfP;2!|YIhE98&UbZ3NY6|eWUzy` zDg~+uMa8|)g8jGOOF(M!&>eDc={pEMv=sldO!zBj0BQY%g1J7x7N-B(@CS+HKczW5 z*faF)a}jh&162fDezbrVVvrgo7;lV#g%(=t0niGsOc_;9M-2_+uQ~DUG((rMfEU;6 zB4&sd3Q$-jT~#aZ{hancp+Z|gi#=4W6pG>BlK-E#(Cz*I^6|f^KTg6ue%u^0gXk)R z3jIosZlVNETmYN_Vi*IH;`XiTgBYevNJLwby$Rci$L1c@bXd^vg7G4f>XqivIbKpZmwJl&$>ve4 zHyDE%6fV)xnwTstX${p!4sEKIYdn z`vyw|#aTa`Cu)(l>a!q{@(qeFP#o$~jGJt6Sk#4xX99D+zn#lJE90)Gar)q>v3D7dU^W|e_r4r15N`BwZ1h$2 zy>L;Yxb)NaE)3h#aD>P6$OmUOL#i+iTQ?QUAx#R02`6p{kcR-9;`f=A>+OPY*NF(gwyPRGdCdGSR9l!G zZJKpy5g6bm#;h_EBPRm|`lA^p7>NlhLNy!xkqcsh6kSQEed;%S*SsX+3y713KGmDY zATloM__uv!rk}(u!IXntW=P+MNpMqJ@sg%}@qg&O0Vi9!26kciBe{feeo3T&@I~{> z8(zy9Q)|b#^!>2RG!cl%6%Hk|EZxGqvA{jT1nMi9Dm_|YKwP)p5k>;cJ~pIsMsV1^ z!MY-GyycI5M(`kqKB&(&$U!*%XLGnOVisv%r%UE2tb*w616EEVuF2_K4#Z>T=J#eO!`Jd_K!=C#w(_wBv;I! z8Q_QqYIg1Kz}C$K6~fWv$uO1-J9;3+Ub#uW#iSd~iks7xi2wYvG6l+6ri)a+G9+dA z2gN?q^W24y(ASk|@xJQyX%*AUm6iuj)twTV3K86Sz9)Y;DvmmjRz;x|s8`0z#6 z4oUZuovg5dkSPUi#6&8(t*p{nUq$P|h~x6$$nj>U!r#Qz1~Ini8du3unv4IoUa`<~ z!`shJwx1C&p&OT=*H7VSL?Soka5)`=2=C9w!2Y?wA4W8h|EuT(Qg$4i)S;%xPf^MU z{*#Xq4m|FOeV_^VsCKggH=#FEw zv1ARwV)J#spV_Pm)nc@RGI27uy-2Yrm@EhY$nB0*2w9kEA z_*X<{9P6-i-~m_NZL&=_v0)_^jn(N09o{9!2O_nu2X5&9=AfEL!4an916ASUR&Ic!IrDGnTFWiGa z5N`EixxJ+>9D#MVi=CO0Ltc1sOsCcqEFJ6(nvf!7$EqgwAwQtnjQ^Ux`%+;Rn%OBV zY9v70sY_uxl(h5=&+<#0jgiM3vHpFWia<4y48kDI{m3SZFqpw+V876YTaB?Y8Zc zT#mUP1@T6)j$Rx1#kO^QVrs=8vR*V%{lx$uq%ePR+T?h)pb2&r1`jsvC{QkvJ)vE8 zo91q_Q}QZ0)_;;U4rQn>i*J3*CKp?inHtevlN%v@! z8tqX9sT~FH;3r&Bkz{7lD1}4Ag&{W$U%zH)$E7KTi6`4mSVyiJp_|-{hKV;ev#?h)4F}a{go{&15@iOi zdg5#d5GZ#y1-?gm4&M;4?amJ6sO^S=xniV&Adb^!M)o^p13jD1WJ#bp{rd>^dY1+w$a-I%)oGCnXoNshvcG@OR}V#<+_2JxPbw*5C*3I! zwTskL$3-c^^w0FS9Se5&k^pS4pUJR~HS9TPP2U)Mr1aVoI#OYSAZB%sd)YKv4N483 zG2!BoM9~Pls|0> zY82}xp+|C`31hu?&6qc}h+J^!byDMt^%9U!iTH7}nj~ zz;M#RS2-`sP`XjZ17#qvkoxq=H6T;3bSYmz5Sh}?U46nJo>*AxN!wwO4WIf5(~h)l zKWmNPx|LCX9UIGG2*@)|wRCZuB|fe~p92-#vfy(r>c}%se8OfcT5{>~^)H=`Rz3$e zA$S9KagnT5Ri>gjkI#$3FRRLBXy~4Cp7@takhAPG0Nr^$%xloQa19ClKVOsJ&JvIo_%Ica31mVzgA?^ z5R}>ptSC*~7B!A7EcDf{%&__U0K(4J+8W?AvvP#Q)eALA*8f&w6Z1W}Dbqiz3NE)I zXyk8e#<#b-VxF7phgYlkysHz@{iFL&bbo5&>ts8h+T@HIXX_f9BcZk&6x-IO_zxt` z2aqGi?Eci@Q&6{0Tw8(2JB9diDL(WggysV+Y>QYva(djZ2r!-;^RZ}oh_^4v-QnZA z<@QfvBK*`DWT@`pVJVg;SS<2!N2&X^GbUsx8|?0Wky;do#(CLZ*$le4sS~rfm4}}HPnEYvZG(>wWK?wR2U4R^YvaPu8sI+HX0tx|uBwEK~{|pMrhw|0w z$TAQddiZwjViOQ$U9u)3&3(1aXVyqSdQ=x%g?Vh_C@iedvS;D( zeA|+#lm0sisXbdl5Ln;n)(>?=hY&OXr@n2ylIkZ#k(9U?@&y2RwUDeev&91{*nvgJ zM?QQ|(Lsxpmwe8Rt4s>Fbo6rRO3?>yOtHk1&>C5)lV;#IPdPV1<7&|!(W64~ukG)D zp>-V7V{(F9OvX>42&R?XKS4GjQ!-Sp`oj!K!?|86bSum%R1C|Vs+JNg zopZ(`RnP1Y+BCJCxDNFPNE#2ov=QGrv|M`sPQ6@MNNsMyzaB+=r=jEkGag3jkb z)S%K|&FbJZxFE}7*M6*zJW;Ibx+E)C7Kr|3+SMJ&Y}-*peybccWb(Qese26yxK+*v#B;(~H9!FqSgXAYHcX-tubJB<7rxE;_AM26=*Qpz z_iPlwcH}QMP3!h$?nrNTfjkK-Q}t_71;Z!aWSEY4q4`CyH<;n7g5$vD_MQsfSD43u zj}2e0Pe1z}p8yFm9IwKzXta{p@8V&^zDm!`NCDK4u5V%{aHoB>jkPTXSw39My#H4Z zH@c9Uesu0qHIBZR2TN(x)wws`_{v5rb$&)P7<9&|p}?ZZkX8pXqFnneqhWdZ37SZ{ zd6-nK9+5+ijtrJ)?|mshb+cl~H<(PG!}Bj-eW_P1)tlcswu*dPP&&S+%Y4)14p18v zKL8jL4d| z$ZYb^#{vKf-he5uZH=6yV7$D9T0K{RZ!^SR0&OWlON;#%5VjW8d0dxbi5J2CYj=!I zUa+y1Cep{3oy@tOB2N>SmfHu)g<<$0(`H#%FF}l!WKyJS+e$eJM zsqsGA*|r_iFIi;^@22T=S^M6KvdU#}oyA5(#MzAEpE2GvC@gKbW`Exo$ScJt^*60y z{p0D^X%KFyTcURZ_orYX*b*UuXFWZkRH2GQqH?m4DCd-hPs^%N$Uf_%oHEg~vslkj ze@rjNImw97VA?fqd;`G^b8}>HVk4Lw@WL%>wpNsWzXU&tgOjIrbldd`yBM>(nil#n zhtQh8mpo_jH`PN>t9O2_JYIyFYBg09RrJ}tRl)`SSU$YO_<+;Cvg$Jl9UQFoRv@W& zcW=L`r`_+=ern2G=n{)epmU@Y*J$a|!`sDe~ho zy(8}Z6l~bllGC8SwUQ{98do1U(2M>vKzlM-;_0b>di5cAL++YYo6SI8*T&U0VEbEN z9FJvT(Rr$dhD{mE%FK$Pet{^Ysb%BwB&3Q5l6kC#1^iLDKIjgwCjRiNhY@anrO2)j zl#KSsIS=LfiM|wqo4Lvac2_Lxxys615MR_5f^DzesKw*-Cl|jqL7Yd(lHeHGVK`;e z>H1YsV;tF+OEsgsfESiXDCI?g81?@0M!p5muI$R?E;diyUs1jsZ$}sStaP!Y&s3?4 zUj~+5?t`E5ZNowx_$0QhkO;B3SZ zLKPAE&z`Cx5%W1Ylzuf=7Xc2@Qpas3WN4laafxWdQC`N1sFn(>{(D&q^^aD7*To7W z*Js0dcj-D$XH8Hk)5^N~C{Db1XftX>voYEuBze)Max~7Rf4cMIr?c~OPJ@r?L$aOk zSA7O#H%gj*MO_8uSTlyQ5&3ZQ+{$tDmy?~>g->3xxX}6b+6W;aJ`0Duye6F{IF2^! zx1Mrj4)03lVwxT==8J4R7?;jL0-wxlceZwuMW5FC3C?iAb2+|EEB2I-gRAysqSMZ+ zsn-+jgA@O+N;$PvUS{k9ugVfsn%0&nOchb) z3N@r?VJpy}B=YJty=Q}jgjgPha$0J}cgC!ioA#X+Sm+w3E!f1b4RLw2wSHOJ*|!rf zsZF8&Mhy}0%|0}<_*UM0&)v7=BY{i@7l$2kB2+q8E_}~-57J)0TBA*7%41*DRN&&X z90p;3SG`64FiUB9lP6j^pjoJW`aYIdg>SHcy_~4Whw+f|bnQsnEAS*F_@u3%VP!u* zV4#Qm^YZG!!6lGcWzhcj5Qk-hl*X3~SMZ8c9CWE{s-aQ%F6bnBSdST#AS#1SQcbZJ zbd?xz$1nb1MLT!@3nsK?6w_-oFE;y|FiwZohUlF3eopC1ah*MuKgu8npoh*MLqcTZ zpiv+v1Z&~R@mubGfh~#Gc#}lv!Ei~0>^>|oBj~7x^64=k?{NyYL#y`ZA<05{f&^vI z+oTcd>zDVTmJkJW|L(^_xRcgBA84s>>chlneCK^f$u#{J0^V zc{2@Fmmo1%$YRW+OR}0BZ^Yx?u6nZId~Ws5!+!i^g4XCeM?n7@&U@dK z<#|J`qxH-7MbKWb<7uWZ@npzP<<)6=ugJ=qw+wf=5Oh+B^S-LcY6-7`d+pL#fB7^v-A2#`U8q04 zLol&w{lj(%6I;O_wLc$@_3+a)U9a~Tt#<~lupI^%X1=V-HD0B)S>9rKRRa{Sk@(_E zpsykJ4pUS;`NNHO<7BjNZCzV`QObPFv4uBtZ_(ZAi72r@0n3T|!?`-Twk>M92f# zX;4wk*m1C9s*$P!B@2_O-Ve(l)KK6E+G3Zzs4Of)V7a2psVs0&T z+57Hq2|b@?8%p%uzs9_>gfgPWCfmTeL2q=0EEhR1VQz{g-Fv9euEo$N3D*Bc%+d3h z*Gxc=Ophe^zKJoo&M-tWfXf;qKL2Dj!{wrF{p2LtX2Y;MVBYj91Ct{YDMHo62YO-x zfuf~^&-q@_zufPXp4RgA{7DFV(U<~$xYMa4xx6>OBPdkUa{gH{4tKn z4on&!)i|lBUVJA2l&?I4>7IwjsBFA*))L8+OV4!o_7H>1=e5*kIl>EnsjXbqCDW1f zwt2bGG0S^sC^*q+NLVp22zCR4_ep|Qlk{hC_P5A6x08IT$v7milkNrG6=41%!vr9c zwP;z6PC4`ck&V!$xLdvw#gv+|aa+$K71dE4C`syWIJq%JL#Tc>ri@-Vgl`@9r=tE_(i)j9v*>E-CLONTeP*7QgB zz`cJ`2oU^?waHJ-In8j7unFVpdErnNna!4w3Wmh1)rP&DCT-?7Q;Df`+JP2#4NqO2cGx^E>+&AFK3o36$~G`hXD!CFr?*vLq^b?)$e zp_x}qKc8S0ofN0FzIb|+$wK$B&A@57{dqgCHpgr`V0n4{A<7QrRVGmKw_wxeuZp?k zwq{JkbF;dyTLC`n>9-y#*jc>Avl0d1B1;A%k9ntyiKltFQnA-RYz_HxHCH>h5p@laDC! zL2qG8h*zSF3wVo)LV7?z;2$z(m%QjPKXJsX=a?uo6jyZPsjQ?;U~S!I*?O8m>t`H6 zzkc-FpAd;0t!BDxb_IX^;9z+<>ldQWZAkrM8VJnw*1tkri-4Aw3gxNckk(5^)L9W zF5UI@y3Z4)w9!x5)h!9s*gF@u2M+l@Jb`KjE8{PJ@_aTP;Ko@_s;D=$`&n2&uVipb z7T619-gXyh*E`7lDXp)QA2JyqvZ#B9A|?5u(Rhm%)?LW@_fa3Hl;N{cYPuao@sm}E z^5svj4Fo6~#e7W6|0bNDo_y50pj%_wY(RR)Dnwyhl89Q%Pk`m`^G)en&5CDvW1Hzl z!}ryjI2HjfAgk}V=zD)Wc%-$B#eJagD@EX)S%bgW8NTgso&QN0VV>nr-pnf3`HEZ? z>p@;2=Qc%OMrN9Wg9G_D(bPm&b!yl=I%XmOa5R; z-3Z;ExE3rA*N ze3FL%-0Hk?oNj1RtR`uBeQQ15Dom)g7iOS#M>XYyQ{5r)lp7)nVq|MA$9ya=2B7)R z@(`2flY+3no_jkRjNUHbF0KfI(D(iQi4XEaZezZ?ZY~?f?l}M;2lo0bGiy``{%|~y zoBPk_PPicW1DHpci0E0LmBK06rEy-Vu27`DkU5>~LDk&)jCgiJ62dR*jh zoM&CQ$6rB=w$sSNT#z(G=&tE&<5YZ$lrWbEE8VOd(G(KYwrvthm?X-zA#8V~q$}G)m6VRQ}IwFbINTtsli z9V8ul2YN?cf+ZGd^~f=siNgJ&{=m<}GwNA}08m!9sRus4um?)>~W z5K6?<2FOR?w*t$HToT4<9?Ob#@MdzE-{P=lf>eyRaK_7oQTv~sWia=58y#33mYGv;?LPxfxCd2p(1XYr9@Lt9OJ$%j@gwR-=;?+(It(VdCDse-GS}f?HTt(9u`pGFwef z`*>=sx*NXPJ@ZaC)~sevh!te}Hp@HI;{l3@dd}l{IIWF81(SdnHQcni7sV6;*3(YB z3a<0q=Uo;vG^?8x#)Vc0@}+o~ixU(=zvR7l86P#h<6)`ImW zD(@h^Z);6*&PU@n$vv|VYdE4O3!yJ!(wCj&k{bz9rEo6Ze_5*~jkF+&<;Q2PvmBuL z1t4#2UY*CeywLI_K;!9;bh~oW63Kd^8GFI8l{*G|R z&Iq_0f7n8suFU?;4clgtX(-+Art`Av{|OvZ&S3H zz4A1-Znvt`*m1)^*VxQuDq@@=iKQIQhn!e-mm()8A|KL4li|D`g{suMD;o4M3T}#n z{sEAU%rT7zlRvS(V&xiO%-jiuapL9g#}D-@;jbGQys zhcq#UbDM1?GU&S;HdT&Ueh$aE6~^-J8wPrZ+h#1YNrQiuBDca;E}QM0T{e}uEetwj zxH~lE7IHPeI-HLr3T|qH-upq2;yVt|PfcFXYj-y9JctdG-Of8%gOg- zCni@oOZ#zRa)q-WPVE!w!ub#{nt)C+TrcJ$$%32mpi|PP2k3r=Y3?+7Io4@!z;i?K zR!E)BW`)aIR<<(+^s|8;X56435du9&WYF=%n4TsX^nN@sW`77U2pBanX5WniJ(uJo z40<3C$c>nw({n_wa6%VN#_i*oJc0yzk_9*QK@av))~5mJTN@ZJt5nw1D0vTSI>_L? zOby0<$JHp%Nj{D&jR1Y0 z4Ej<6y3`q$WWh}Xi%vP84xp2*ka$LEaQ6AsPAA*U*qto5Q1IBGb!yNKg+O0wIk&F| ztl)S%;{-hWMe16=YB`H_NPyMhQ-P4{j!zwVHZ%jSr>Ez}wb3<@*usXZp_zC+J^OMa z^AUF4<%<^Q)sRI|k!Th!6NU%clnc$(W;i*(QDVT$_wB4FfH zpsDsofiC8wTFOU&BvvQQ!Xf$4i22C=2m8T)|P$Dd>{{bi5T3 z;~i*V_#WO{R8$iX0yQtc+`Lf0TOnzc@>WOydUksHM|~gRNogZMPti1S2yt9?N*vJB z^B|T4x~xM2EIls}$df@APf37T@D#W_%MAk^66=Z0N4=bnyy$$uxBU|65b&cs5%gpW zZd!mIgZkTd{Q1v!yiK{DLZG+!vl%DZ3W;Bcv}tLp-{Rgn^zzFU_=C%^IFHvX>Ecv2(nhbgSS(~J8|jP#?k&0UlF_x6bc>}{S{Hh$ z1`^Xed*j;ZII%i;MO&PYP-6A?)K+d-}#=6g1rA~ST7FSzLk`u%_YJ0gF+pOQUQ zKp&E}LgL9*NX{D55AOWRSALLRr5_-Bo>dt1EfGUt>*}R(qOpEEg9iR#;lhPIh-(=+ zGVV-meO>s*uB)q04d3&%l16gqOnu$b@Synm$Ws#z`e)CA`ULq{T3>f2oDaC@rJ++- z>+47@^;z--H(fvvq5k&Yg@hXQsRDWn-Uk(_p0O^oo$+}*-h6{f(-LQH zMvUWr4>9NfdVtf61U*Z$)Xy*BA!A=0 z=o3GwqTJ5fs5xWyzjoxhe zAj_ftg;@G^(d(-`7?s$WWaa-xMT-Xg!Gtoi_QB*N8uX-d6%Bf_1$Rrb8vp*rZp-$$ zL6^Mu^M95h#~=PIhRzRz{-`=J=xQ1CS0&IvR(u|=Kvf9z595ZI%_9;dDqA=wqC|qd zDCYZ(27ThEss28(8F|o8Hb`;WoeUq|3aL}C=h;rBUazdsD|e=Z7M|crN;ooVG!o|O zdk)%JjtcHo9wIe{k+GH&;+v>*)y2V{m=2b~F zFKuYYI^+l4p29+}QF;b`wLvj|N%JlV^rhT}5|vSY25!L_mbZqw+Tfa>W0Qxl@8__N zGx0#L*0r~;ONkFU(XkWvVkTQ~k)Zo6-s~w1I*~hwG5_=5-SIIo?svq3ez!SubMM`U zc$8Jd+~7P7awoI|698r>uO5KQ8E? z0}|UM4nRn*;QkOX)PV7-j5}+mHt57*51zi`y~fYv}p$hU5(r62;uGQ zUInI!9F{@PfKZ#*Fz6K$=*#w!aPNIMTXd@5>os6ok86$t`y0Tco)V2|8(VNcw+A)USw64b-1EAk+XyW-JqrWP}b( zHPFco%iyh$`ki>^gwR$F%7(Y~A3;=Pl0WH`(SS}L# zI{@)Lu*n&{ce4-|Ct`dQt`V2YHJ(3)g^tbiVi0nvQu>-F3eMbN-*CSMCmS zf3HS9o6Y9nMbLkTZRjBO&`BE_&b~@Q0e>C{){JWaxib!E9VB5PTyII?+khy1KaMg0 zu){zt27dXbpA@47|B1DNiaDD$l_TBTYRvL7G2S3?5C(|@fFA&?C*N?2xchH54?0EA zq3)1!0v4UrFAGBYKU_rq!l_9)*Mlox_+P#7eq#Hk`Jj*-_;fHH=abu_WB(frQ-fBC zH%{mS*RxaK$+C7e-bNvJYn&~aLU8!Ob!GdusfA{*-Of0*X{_B@W${OWUKiSuX$0uC z_oR#hI-b-L+R>3rCW$u#j!cX>Cxc!ewKWu;kP@&&%{-Gq_Y)oQK+opdOUve#P{XrT!$avLAP`F$!Yje}QDGWO4jJqQkJT3OVzdaa)7c{kl@V+Pn`U?04 zlmzv<%|U_-4uuUZe%BMw3#=euVDXWl7-KL99`?#XF-9>uF&oH~YlJ=jiNna<<+`^U zeV{p5few>+xNmPT_$aU2JX`HsT!AvkQ2<$#6B6homn0`RU%|nA47#NMGS(51nw<0b zB+1PGlze$~SZrNnN;!{yO>)rThE)q3zFk=-uU4zU9Dy^+L~eydwq!ahZOL?1j+LIy zDhCEwFK<_?k-C|wF&GSbgC)Bq0`zCGS&akw{{7!gd!lClyNN)@iOHZp+mCg~py!@F z7n&H8`o7Jra9QWy_s%=dtXXs60x8c6r`G)HJMX-6U!m2duDGYj0G~^QJe-_DEO*k72 zgPt)M#D4D};35)FC2yp?ElD%rH3An}f$uCh1d$7o7HSJ`U=Il_Ka8|3TuqlbYv5SU=Vgof^q`@aXnZ z6|@ZWVh6+W%a?<#O+PmY7IMJuQ4Kf15$TZ*_9@Jr?W35`={w*%(b!7ji zZpmzG$PBpsq5YqFdKPlGJ@DiE-dQtzep8{f-Stnm-FDlp@4x@P2AvJ;Lv`=J58rS5 zmdn*{E&O23@UPyv@5c|UMMOu)s|Ot@UT0iNH!^Bf)p0@hlYCT1tm{5z!C}x_EMCs2 zvT+>Zi=Bd6yX2mCr!MGG17WzZv(g0nmW zj`z!G0dbDozkxfNlm(2fNnq1%XRZBOF01x~nSqbVx))&u zL98M}1pQShIsAC-=+XHsoDb{AS&B{#=Nzh*#aQ#J#aJsud|N&cj3bjCbbP}irrF3k z?Mge}$$ITa8gg@Mqt$I{(X>`H0y-Sfa{l>@b^1h)=j;^?Evp>@256lZ~916 zYHI4te}4b{rUv{?1IT}tnrdl)b3#*f>if7-*xnl~u_|)^D1wf!r6*4l2lSSXa{}97 z+ZE4sPygs6$VYnQPAy{<90onRfkWHR!+mhtWhniiB%duNZI-DCy7+)idX^rH3;JBi z!InVJmqAx21RVe?P#|CzFfCB=NZL^=r7 z#~zZ10WF9HT^=wKp`TOlDPN&kKG;|s|J42p30Ub|ROSkNg1--^l zlU9`WM3uqx-P$;y;~k&G#4zYs2i^@T^|lA@`_6^!rLK-{4Vdls0qyseci6CZbcrIiJhQ=cSy54opqZ@#f^vxa2ra zXgbJ_*b3zI^$CPmTb+L*pYDuYm`+* z`9(!VfO<_zoHlyB#gbhsj}Kq!w^%f{{rH{Xcd!*-s?lin|M7hh^wfHbMpKt6fu5SH z(d4GSFM^(02LWrzC|Wr1$NlhaDLC~H-1p9fcOF=4vH0Un&`Ejg7($=?_E=oduU6x^ zcQL!Ej$UvW^b|{vP-rc66>d-{wVTYv+TsdMlQLyN4+h0)s=-83>3)b9?!&=x$mtJG zOCL^Ojy`kr%IPSWDetYLtw+>Z6lIm*_x`f?;47V3{W>{QbvLv zH4!8gAU}2g1GoK=ARCsbG4UAmuzVIZT>ky&Q}2^X16%fyuKV}iI(F>#W58i%$p*h9}VKysA5Jpp>R_cbUZ(W$e6nmU5&72 z7SX2XIh_X9?qs4kPXs!|va>ZcrUS>TIxE4ZS14OX0sZ|4?!!>VL-u+>$MQ#9dEEEF z`>|8&kBRbFN7A5=T5uxh{*QVPQgeLY>WV&&4+Mmd{8PqtACvQuvIG0q1uKGIf~-Oz z2mMQsFL(A@6gO9+CUX5DS-AzXQQg&CA2WL`Wu8bnqi0zIxb6Ow5wq8pcH24#S`UT{ zprwPw%PPKH(`kA+t>}qwr`;1pI+?wuu{DE74mAGizT4jaqbyNXz-NDql<)qJB&8FF zuD2QM{|I%+srzrMi|jl29x>-{J@wSVSkOu7F}9A>(44p0j*k7|xo8$!b9k!SEt-y9 zvG++fhJ zU66E!6yl)zw4br`13F~yS-!)YHV^Lb#6W{)J z{*IQI#Byze^A&ge>N`Ka?fry?IyL%K(x5}&I?wh~-d(t%|MdsH6J~whTeo9*3PcqT z^ltN?me}O+ICWg>DX&J}Fj8YXUoK9ZBNttEN)>U@*=oKINcW;1#Hmpa&uT`19yR&> z_t*DJPae>3Qkfp0YizF4X5)x2c>6UqM){Lv=Ty1UMo$@^o&3cQfvPyY~ zRok7NH8s#wf7xVEE-9-{iQX2*wds}9g}23byFWkZyKL4{m2oM28X6iRtP^M4FM^Iq zH^u?Ij#K26ku90TZQ0sORn2u0=$yh_>g|vR=fg$kgf2S8pWeW8LQexW>J9xpJ@%;v zIz|0v0=>g+RF%csl8HP~PfyQ|y9(@nn_FcrtCj9~aNEJ(c z_l&oJL&`iqmX-utG9ep6_2ix>lepda>p!SmVyZDQEN^F(#Rh{Zt*EL>X|%{>-FDyb zeG1OzL7yA+uYUEb@j=%hj}3WKL!g6v>%KLG3hz_5zx5X3JhnTIfPMsDOK1ihE)OyT z4j(vzx;P|{+1(#;(fA=G1|2OFdIT=e-?MPQ&a&YAOfAqU>NgMQ!r7kd+LCFXxFyqr zEnxZ&u646cS9wuUO|eOD=bcKWvZkuaWHK0xUH^=S&J5l5&N~mhpW1|kvx4SxTl7Sr z=OSMqz(j#QWPIzVN8h|lYN9`N?AT+flo-&Tg=^U-)Q2X<2-0|YT(Ed@Tp(9=-SOl& zvOUd%qz?l?N49dFk0x3v^2Qv;lqI+MO+!KiLA5Mq}{fU z=WEi6iVVscmP~Fn7-|ficKtqIP4>0A2QK{h>sNtc#wQ390{U0ug1!^^g#H-Nb07QO z?RUNT@lPerf%Ic7(V#C4?Y%}O#=w>B3xVE1wsn%H+l4L~EINKJk;fyq8>t)A%7KOd zFksg=Ocl_t91RKOcQvh_$oaHk%RF7)W1J|=9Q#~G4PG+8w?)f~fzdw*?H>9N% z$TN8Qj62E7T_DxU{*ApEN$>9MSn&Nw`Ay(t>>AoJ1)?Z=LV8|uWO<7)|oEP4RGHH2JuTsk3(jtA$9Zj3m~FOP5V*t!~c zR?qkJ^x2v8?5W|ppE?==di0A*92uVUpjU5L`QoX|pVlP?z4{~YRC^lg#tAyv;Yje4 zJzK=FHR%$DlXi zX>JX5QK0+ZdhD^=Z$I|bQ$G#9dDpS0?gc0Q*khVV&@FiGtRQXTa+PfBbfi`UT|>5Y zvPgsT)5(-QzufDNNzdbKTm#RrMw^YxBhM$M1n9j-6A7hyq@0@cpr&${OVoE1u$MsA*bzY5UhD;sEp}JS(lg zsrvJ|?q5v|dQ*QO(4>h3-2ztpDPSA({lB5HPAvLex6g|JJsnS@%WIObge&Xm$;%c& zC#OD2mv)sCPg%mx6p1h6;TxPzqg$cq@L!uEz3!OwD<8y_D^#N8bnunQ5Bh$`Ln~*z zIAi6y>V%*##dj;-4Q-sesbaDv#U$DZ=butG0C#zczEu@;RHb zc5F@DM!#BHUH$CU@q&J}uDZHb-2W+(^ndx6Jf2A_U#|`H=jAE3Z(7?j6bX82YHe-p z($wn%{i|WJp9HJ^k+_ z+>nuRXR5c7-Qh$mp*+ORrbxl=-@iY+$y4Z}<#E5bR!ILy%{rSpFqM(uWdbdG)iz`z}2gHT@^A zAwAn4e`}~o4*D>a&o5u-q?QCsX0tV>$|_|`QlJk-O6*Y42#Eom%x8&2y`jyO*HNDDL8uXa$&_+2m;;Gt`7;(7=ehkq4EqDDtzlLTxcYC8a2o|jQv8R6e@zaml;>})5 zTEcU4=UK2s>@0mt;#f(8{!I${R0aJ8PgDJUbRS&p*Xu;KTiAhtJc}XGMum8q>eX)R zI!$VVy#iC~5^YRa?JgvHr;ur?Es>+9kj*|RkDIu~G{K89;I$`osCxCC1)HLNz8dBo6nO0W`ZSRyivLcx2e=dZt^5$tC9VN%Lo4QcbK;)dI ze+?VwkKIW^hyD@Z9D@GXWAA?TuF&y5I_)q9UTY_>>vGIUhbk>B_~UFzQ=JF><^a9( zo_F8XA<~0K2|M+JvS1>^dOYZzzE)!*Z6kx`+#l4Gt*_1odakGH3e638Arn|C%E+1Bpx*ATOc1;HQqlrGbe;qeG4uY=1aWlC6NT3Hl`nAy8 z{*#})^wOOlLD0p4uy;Q4llvap!A7#a|HB(bMXlT1>cx| zWxNKCpP8+odj<=xt3HT;uW|iRYIumUwLnjvbGoX_d!IZL^nQkyE7>d_ee4G%))H%t z)ml<=avbO`7BH(!o$gs|s9SXBXqNR91jqSi2s+E-^0us?V;JGur863vToZ%-{qH9u zb_BcFSWkiuuZ5{jc=VqB7{f^O$( z8_Y(du3>I~9*<8b9Xe0;IMU;@6Z9OFel9I_9&K!fZXW<-y?jgxoRFe&K zkAgU@Yi?a`ZkQbOWZV2-|25GqCxNaa$=<_(u|ykP^=mO=M-S0|B6Pbyg1r1kpoX`e zcwzHQK!+EdU56^@$JAB2)>fUT zWK0dUk(Yu&EbNJl1N~wYDYayPUQ$wKttqLomes7!9p6TW`5lKdlv;8koz2Y})Crx1 za}jiy)G{7)M+2syN>;3DHC8Dn1O5BS@LhbumhREX-dNO=?2Kz+mkNX8ehXMfy>a5$ zna3UxYPk8s6WcN$FZ^ag(4jO`xNp2XO}(ST&)Ldf2e&C_$D9EDvw3=FqK`gHLGLcJ zaqfZ-%*=0pOJ2V3o_p>I!~!40Dm5Hj)N<6{dqrxq}N^$DH`AvO!c}-S9DN%4Sb|R)XH3?k9% z50vtT2BIxO%yPJ$fhx#-rppQmAdPI7% z#_mSYKla#1s^s7w@FO|(AXNhVd5vECgS_=wK_7q7sDyBe@OmlRiaj-iZyxk{(El-@ z%Z5lYq!^}O!S7rei?N{KG&?jD3phVehnzU>)TDtPk;w`#7g}87Kp(3e9<&oRWqJU* zV;txfSz)wL7D;^Px1D&%F*+saDvPIY$OCnklAya>j{X2;X!Ginc=?KhhU}m}DijHH z0r^KWAFo*~?jeuGl?wW3ut1m>a<_s-=`5hAM$>=kDi?~pvUJ~pVOchgz#8waCq4HuJdp-digTRumOg=?*r0+ z--iwJ3w@+Jk`}txTP&7Hb+!RB4s4hsv^Fi}$kIkvfx}$6(szFI=Ub*6;|AO4J>aO? z+|lOFhP>0`%^xiUe2G!^vkOG}Rmqi9kF%mDL(l2hu5BmH;w z|HS{;oh-_1dF<8B(G1W>;ce>r^-{eafR0eNmDgu$qZg!IG$^jqx@MF58F{PI_^g4j z?m1{x9y``B5Bfal-#X|jbA^!%v%U03_mR=)PhNQmG|;2>-ScaI0Dm_yJUkpDeV)=Z zrIzXo7jpleb!6NHm4DDq!R)Q^Ltt|+T&PYcwcP!y&7;!+{p{K5Y9YH!0==WX$*3zc z^HqFPF-;c}w!DX*eYW*j2IwN!l0ygoK={0kztY&u#KOP*{XO^mmSy{X{p&~m5B}~4UUD!T-nFJO zl2wu^+Ys1aTJ?_XW8G6EnYL}(bnECeL6?dII`3@K?NYB$^S&xGqcbY>c`J>Xm+H{$j>^fAP ze0!5lT~jU(;oEVhS&5bBJzQLDG`GwR&@(s}L>A|{zJZ|s-y86M{KwSq^&e9tRxrj- z4u_Yw>YUL_kNp1kza5HQzVnegWB5yL>WlnEJpQUOIn{cqjj>y^lx^FxtV~1de>VSW z%eLv1bfGr^ulhRN=~SxA^VAHE`?f2$KAcy!dRKeO!}MFzIRC!zR84rS_Ne$#1U-$! zebX$rCY$oQy#|T`HySNzjVXD1pnVRR8vj)HYa40ADSoo8-V_g%0~}IES%jRj)slJ#ouGXPu_Xwr6?I5 zjKxf?70m=x3ft~3O-oaCvCXaQjAxh`>vz5(M?y}EzBevx*HGD>vB3drF6N33im&C0 zpu0jLpN}Xn%QLmf=`vbb^>B$*?F;dEx<}6jI`HW$zn|nBrKwi4#t|0HFq1pYK}VV47%?0UNAcz>2B#q$i-x1oOJNdcijP+i zvGAaOm?+JVWHOloh8a)y%(k0ouWM{9OK*D%!Szf4dOvS6dF3g9`Fw1z+p1o@`r*~h z@Im_OvWIn543hzR(x;<-xJQMFp)ax3 z0Mu*rdQ)dk+C@90iX#j?(BbSH0$puJU1A0ybCYBU(!{O*K$(YTi zVv_+rNcXn2n&@IB!MP8I{REaF$%Gr|%D_aR*XLvhy_Vyhgq8EN41zfm>qN; zm(%91BD0&~Cdap#~ zzAK=MN#SRUbk1(4YRbKGd3lZAR%yKQY;oIM0v$&0@kHQ$_rPCMf_I4P(p!*czkOOBT}$3C z!S~4*Ybo;0ZwUHsboMDqqH^C6(51;A>~;*7H&Qj-ByL>uMzPMc=Go=dL;7{Me z0qBJ}8InwwCX{5doIJU{VIoPUa2Wq;OYS((do~`iag9edW(S>&T|!DN0I*s^po@}+ zSeC=w92{uN5tLS|c2=2;I_J2NapQXA9!>M-nUYM?2R#_ESTs0oqnAIt;-Iy>BJQ;l z6a~;NUr}Szhq_!jDR(z;(V|kzb(I&>XhUqT!tVEj>e~ssw!6Dq-d418`5knF+@OAHD! zv|WS`xb_+e^v_KJlFZ*QARM{ymVwXT$~O|^vUNse2z=6kPYXeqzNV6emIl_my4|Q) z%8%NZMmXi_-C@a>s+NYBZa1qp~rW z4RnkYC7A%|^;p0FkTTfxb{3-m=L$k^<1ioZY;ULQ>$41jl{gnjPj%;#QVZD|i_Hvl z_*e7%K>lRR?#)}VqJ}Da<|`T_?37J!({tV2CAAp6Z_AKmx~@?K0t5xTKj&w`yWMW@ zwsqUxA>8S7){f30j}8k8*yHE!{&RfbFMoxx`v`okQIPkRkaxwwJMip}!*vk!wOSOG z-#)Sg{Pu%|&-EnfCducGaP{+F!2Pz8cWo$s73_m7SL6W^NzDJ)t zBskOB-DroqzCfph8_AE+qFA24MLN0EIC%acRJl)gqfeg*=exnL+2+y3sUJLcEJXMR z!&JFlfd#w@3>1Q^u?-H|tu$@77iNGCC5WnaE4NbgNE>GFrfigbm~apE7A8Hq14%MT9(@S&fU$3KAfQZWuO@>un$0AO)lF2wk>@e z+yrhJsUYuqXg8!@vGiU*;oHJ~YY}+QUqzn)lSLy-z)s+x`v;aNz}{N&ldE7M{|m7C zZSVKziCUAxCVI6SP!NW0wjJ$bUCxH%^ibW5yB7bAO8K@VyKX_RPyjIoSCNDx!Cq=H`WhLTMEV+iz4 zH$Z!sH2|Pu3J|yBfO;(!jlrjDI7KyNNmG4ve2?5XNv5#JF%!^*S?>B|eKMKCP!37A zl^m~t(K}$BE0pzFQZE{2uhj~md;JQ`KO8v94GzXIjx)$vuA7Lh?Dd5h9vodir$C3H z``t)S5cSI4Jpv2B_RSICgl``i*$S3W0ib`XB|qNVyj%eQz4qBPqZ&A3E!n$J_cyQ^ zfG+G;Mv}Y%dVN^70#7?KvfT8eQ)tCjbj1B|@B4*Agv0dUBv(GWVyq+)==Y_W^e{mH&^ZLUpR0LqaM-W4k{A*QOOa$M z1a9hZ;W$aA|00!^-7j)>3vsf-X!y-INhX~RM6s4s&^6RA!S7DIE)b29OjCOYY_OlK zO$9wE$pk=e2^_+_ev-k4{jsug8%B~ud7e7_e-P-_1HT*(`oBGzItn(6nyLqipCU=7 zX@j1ezE)OfQrhy&6*YQw+z9?=+JjV~tRS^Bt`MqMT^1#oRE^yjHt56r;X$^%hKi9x zw!Ct3WiK1zdA0t)+yWhS#@#J({x3gA-|r=fcsUbvp}buzNAGvVm!Rl6|7rsCHPBB( z$9szax&XXD_6R`qFIoVou(tp@TyG=aT>F+7Jb&nBGqZ2w>0$ZZ3AxV)uUzH zs}HjB*5$QNr9D#4{kh5G@u<>5_oKFruF(d*J#eV8&=X_%_J&c%4=E}Ybe9E6GWDR) zy(QAstq1_84nX(j<>duPmU!*8XTniP3a;JpA6Y<8I`wg!3%%~pd}sBHLwB(das@%R zF0W{=YBt;LoLwd>NJKvnbQSzl6}SY|3RO4f#{3G-zta6yUY_;0X*! zPJtd59J$E(U*jY2RYH<%FAD&=KMq(D)(NcLzPGu#dEGe>aTk60I(gUCtMOJ7fc|#i zsNY8Wtx*6@;qS-crxNmG@Y`6m4jc(SuNFZU_Le+)e8ft=xs_bn^tWOZy5AKS@Q#DU ztI`rWc{4ouRS0@K0Xn!xHJb@g)sgs(f6c~`aXCRaa~lWZ^!EyhZqRO&J56l{0Q$i~ z;L`0>X-=kq!@h`0RiCcZQo8(m&$bpT-HqLZnJlscw}b~o;5+_>>%lx*MLRb+0owxqVv9U6_sA#{R8EFM64K*3?dLs)s<*5_Wi z^mKee~Q~jRp;jn^|XE!lhrnY>$>1b+5C2o$hj>OjeLS zU}mgVrK+tKbf^ksn8J^_?ErK?m6!J%sQz1dD+pA5#-^o4=N9N`17^NNt68Dri^l<{2wk+B0xkfL{we$fTGIDIb8iEVH^2q3Bj8rp z8~)OQ#y$)Szz!dy-9LqN3ui;1OG_yyUj?g#R>R7HV{VDBc~Lz54KCMar9L_wDA&|7*aZFiNIXISh|V0=Y0*!*JPkYsQz-nyAXr*CjL9i* zm%8IVt(x$Ytk1`kQyTHuxdJ+BrAyD!g*6DzIKuUD;M|vOkU$4SE~6FDEt9=C@S?p% zFM(ptD(0r35I@QYVKyP2Sq%Wyx~0i1`2?SX|N=n7yw9dzmB zR|U|4^N+*I{T!~wNNDxD0(w$Rf#3p89H%Rlbeq9nBeN7lB9ZB6uLbqqI(oU+j#)6j zo!Dt7-0UtNUsf)S65IFTmfTFxDVtqiQ?B!QPafF$yCWNS95}M0(M?u8W227L)K3Ju zMFC=W5Pd}5JY9LuJ$KwA$7zmGd%b1lRyD0gq~E%Gn&s<)4#&Btw9{p7dKU|vxlCtF zYvqgwUFPvC;B6{A7{H0=K=uDX;FP_a2pCGNR*hO1K09YXk0+B_#1&TZ6T~d^v`co2 z48iC*z8p5m^Ebqoya?U_!5N4EP!ncCEPmD`bb@kI-C<`A2{2n)K$OF&`jCkdqd+xc91C1p@Z?jQ^T2FQ4 zj7w9^z2Rx9*KZu?@wkwtI<2q%xxZaaydQ_l=dPU-wj7ssIezZk)szE1`%+vucW%5n z2>Z3a3EQEeYsr1CPJHrltIx&bHzVj1OEL+A-aV9`gxOVrKuAsx>W}7R*IujjUAe-l z(m==TLr!CRtFetEFigSkGFB9u?A??A`nHF*K!IY`bVkX*C)Nn`o|6Q%RMAcB+<2sW zkk|`aA2o`CA#sQHd`=}kFMcImIsg|Q%k83ymK5jG>8#|`juCH|9gU>>~@0E zTdf2^Q0NA6>%`u8yrXvbuDlWG8n4Kj2KxCl&oAbvCQ0|uWp2oMaP-89agt1?Gqe}7 zyGfvt#5wN1=&OF zJ=VvPEW_`(70pc&K*Z~{BEa$WR&VXdRubhiGCcMOfF130dGbYH}L2& z2s-t_eUCf>LHFAgY6>i1#LPk0@J^E)Nixk0bP&ELNcUK69#MfJm2@-l1;_8%%6^JKy4uv4nb8>lJ0Id5sP)D_6Vy9%0j_Eu#YHJWZQi66h@uOdtM(BRgR0 zeCN(1fcB$1SvG|4qzMbMdLtfWA3VoMt69U)#$n?)U}9C&~odUQVliyTu3peqPFcZ48*GY|Uo z%hmWi=wB0bB!(uIf=F;;*y_K!>DI zLRJe!`0ZNY5f2?ATr&q<1!{E(Nixk8^wE}-@ZA!T2I_Cxk_viDte1=?=5>eN^&!kY z90fO~Zcuj)gg;vUFiOwasnuMc1E3#|&zHFmdQMJhX`~eX1aq!W2D+%!k^*|+@Q@6% zGYreGX;Z4@Tup)7u7ED;#EDS>bO%YsE|b*~=#jwDopuac#<$rHtgcWhTPuznpcl6D z2EwmDpst-rk||gKK=%`Ym=;*d1mK4F~hwe_- zUQ3l^%86K5%pJ_o@t*8sgEp}qDsKnLM_qyUyw zVfR}gMqs}41)G? zTGZY1wL#A&9Jl$a%?U{+1iC6kzyU_@EC)k(!p7OV3Cw?S2(zeE*XIi8^G^M{0=h*e zyBxkOt4)9onyP_8&R+N)^yqd%ZwH{u0O%`qXT<4V5$Kk_p&^d|dZeI^&F2B1S|SRL zIC9jh@LGSUrnp1hTq8y*P3>Kh_L{{rG}LEF*ItWsc??d1U@-;B8F;KVQtwKYWSSA^ zo}tS_p3biidbYCpR}Kku+2z6aWCdxGOrgkQmOh2IubKT zeLc`~!LTe|IqgzghLtv|2u6?OWEm8>N1&xjVeoasPxWDi$1$|(i^BI&gHwWmc zi81I|a&L@fV_}l@c(jAV{)3vnfYHBF*Gw|9ND}l!fulh|=pJJDClv%|A0h}0J`vY< zH*$Ctp?<58#23oo6RWI}OwvPaRIoY93CgC`2IO?u*-SbE z9uf4kjFDSgK(x=ZEa$suz8ovsAmn%emK%>EcK|d^g3q9K&5U; zPftlJUvE=d8rp?vsY&g7VNp8h|1;fkVPeq#?>{f81(Ke*V!ljRzWQp`q^V{RNKBMT z9;?GN)eEf7=&2UdR3Yevy}dCKfX*vH1*(xK=xNaiQznU-Kyv#n(OD$|b-tQXClw?vW6Ov3Y6{he#k_8@} z^|7I_-`^%T$eZ!7&zBe(3PJC{aau`Bpd(QukDDbM6+Uul%x@niab@6Df(}HrT@mp( zQIe@m*_9RaE*x)DN(m{|JZ@-HYQ#;Q@MO441icH{5J7hVi%MmOXi+2Bm?`KgEk{iO z`q>kk1RW|RUOx%wIj(uo=RyBxgI<8Kfgi<>$4zPTx?6m_T+SwDm?=d`Z?Vg=LXu>k zl;drz&!98OJZ?)ukpY74Vi{U4Pk=6DbYsMmiaMMpV_`RKsx%m4dZL@y*^;W%!r(Zb z9dwnCr*WSMdM?R0<+KEP2Rs=gdG!7eu+cAq?qI==xa83_$i_@PdJF76Tt5Zq=Re#s z)zi|_5W4_|NJv6ycy4x*Ifj!aI?FJP=%5zP$8;Gy*bdm46j;$8aWmMFv+wx(OSBsqFL0G0 z$1W;N4i}Iu+lMk}&X4h8lwq_{oU(+RhB9A$DG81vFrSFN{+>tx%?XXo2>DE@mYLID zD&0E_oLsw<%4E<~>{vfo?HU{0p71*JVYGG%mT=*c2$@)xPoL@xo)j$@4^vQat(Q9*LfXZ@uHD9`?qwQo}aHK)mR*fwrvxV*zJ6YfGVA=j0 zt@l!yWg{!T!O@6BmHw^rjIldFp;+lz57<&@mD~Cde4ozrb}kGYMkMVOS#qnvw;W`Q z&`B~^AlGO^n;2^wN=-ygoTiIlSfazVnn*_&mg|QanWRkS2*c>?eD2=3XL-e6xjI@b zKPi!e7fK6gd!w+?R$*k{xNwgKoqvPzG|mI|pmAdDUxjigYZ^jCxN_L^|5Y+?x1t_o zvZ*h0=?b<1k;{tkK8}ru7QiXBFI8w zFHrzkR3wp#(AJOJj7WjxH|+alB<3(wmB9oh#~sTptD^6mVi|Ro#AP=K;t~1?HA1!! z60=Z1?!1aRndooX@(-M9_qZdBsXovhrTkw|hb~LZ3-B|1?YPxlCr;AOuv#!zui9w1 z3>yVvzZK@L*V~12!cXhZ-9h;r!!_j4AqCMQnM`y*RsBblBnjrzeMqy>xrXQvUVdB%DD5c8vN?ou5LAU|4H1AF`jENoe3&uFVGz0 zxhMEBR#(Wsj%(w9{6tuaD(4+&^yBufl#(MG^zuZ8X7!@SU1sIy+^!`20YQ6J*VG)X zL=V_(xD)Gg*Psa)fpmUQJ}d_@86^Wv?#Ya-7R#-)q$t)b>%eDD#hG@s2%oD!%7St3 zt`^xc;iY2v$ddHRNqZn zM83tVgKsnZi?cp~ne^NGjgf3#9>iM?+i}vO0&YJSZpN-&2Y_gF)!XVhn-CM4qIiy3~)xgD3CIB9$40&d6!I zmQkPVescU1xQaN0CpvoNAdxzo06#^X{*uh0Qi3;SlpZpw*tJujUO|%IO#JJemUy}j zn&E^#=tyJ_0eTVQGw&<~sUZ#aWGU93BT82D6CeMc3tjJmHf*z(%__T!Q%1Yev62dE5dCT*Px1(pw)QN+DQ;gGa&B`UV@n2Ao~1V6gigV_EC8eG)5S^mq2TV}XLQQ{U^fJkCq zKvZmsY(XT7wE|_i!}UQ8nZX9HmQUL_b-qvKlvN4%*B7oII}k!*Dy!SH0EyD*`=%1p zo4WdTQ9f|7guoGe%#S;>E6s43lUuOnC(ul_ zcGpfH8AmDPwgWKV{>-&!SSQuqAlt#a8#fw>Od5cCFhL8^Gg$x8(Luahab>qIyxP@i zV?@}6K=kXo#5C7Etnu}Saj&4=U+1PiN8=0l&udHlD6PIBALJ>bMRSDq$U-*8*tYgy>7|^PPmu;lukY^{ z-;k3ec>3pcVRbj5SFv@+jjF4YojH^~cfJfz6xEUN7!zB3IUz*&O%Kplr(|+@-&Fz`Cbuu@^3{PQ8?tPCWfadr? zBi<*VbmS8=&mE3*Z0NWuKOVau@n^X z09;nVBdw8J8+#@MD&s~CFDVr9eH)+kqc^aQ4!3JZY?9TR%`oonj?J9G=pR1p> zNO(uIP`?-@T0v7 z;=*^1t}ad zxHO&RU&!a*M6#3sAa#%j(^F`e17se+vBQ8GelF)Z6*Q6h-p}YTl97p}BbVJXfz!p_ z6CpR#!3pU|yv1y6AL^q$2hJrRDO(3zZh#f&uG`lj=1oi;33Om9yq^8?IQkLz&A<&F z@dqI+mFx_v)4h=tkH1+(5l4>=Km_xeP18{Cq3ML0EK4bUO0ftvUz35{UiahCbm_)( zIEhRFL*MlzXQlIrdwwiV{H2@J;T=`^Ie48yg`x0E`*1X=pV9Cbuc@@6JWzlDlhs9z zC&MSgK^d*>ht|8XWM7a?A8(F883$~(rY9DZxi*&M^W}z+{}p2%TAf7&;&YB! znfynqv9Sx0V(Zzgj3P3duMaC}Ab>h`Z%B&C%&UmElQTe!W{Z5y2=i@K=zIGB&86ue{}l{|h$81F4`NMJG|x zsaNEoZg=SWU^$w(eT>!ia{%yl3 zNM3=uz4h+cpgX(pZ2YIzcXw{`z7^jFe-2JkN#5>~nqb4)s|U76iFcTjDG9o<#4kCQ z0D^hHGqxh1ia^nyVg7 z9vd!hP>?|T(pD)u?ln=?UR;yyAfO3`?je}%di>L(Wr(|^k96ce4xVN*Nr@ev9 zgxWawWo9wv0TO7p!?w$|;15XjPuUwgg$u%h7Cg4Vzv2;l7${_398`W6Rum9 z6IJ_kbq}P`zdM5+TyV*Uv-paGjrA`NPFg6Uc7Im6;X=uq*Jc~C#C9gTd#dv9u}0NI z2}B*TR5^Sy&`zY$c^H1eMJ_{k4tE~iWza)6zr#Yt*gKu99PE^%5Dg0Oe=h=>K$Epxy7NWSSKQDZS= z`P8Yjvx&4>tVUR`hd6-}L&Q#8==?}3IO-02KO$=$&{N=!M(yR9`s1oCtSQ(rLlMD< zDO$Ggr={tEPBela^?Coz_aR?3yYv#dztg-R;lpN(EDn~=u>u0#NwN1YXIBhbNj*&P zmbeYvczA__TV#>T_&JTyuEwT{!--SdzDhrAxWmwTV)`)-a9cQQ{uM%x>cMatZI(Sw zea$|L4loESiYsker41F@VcM0o*3pJcHT6WV*DIut6(lssHT9Vx_&W17=0h>xu-`{H z{rZxctU1s76YzTRH3~GV`&##D>E}M6RYZ;M8-xbGG9Zy*jp6=@GtZvZgs~^82948| zXd}A!;i{!D)CtwO2Akr?W_9ga;2D8g|4N>{83h%`y_q*&qEUrP{2VI845u5^+DId& z>ikP30i{#f#(Gt>_AfWN9%n8(SpdbdJ{=#r#9N0yZIx@B)vXGEZt73sZUI;bB5^HV zyYfhQb1t1l#{O}}_{`ZXE(nobm;zaxBH-pqnM`n!Q2nW%E~hpt^R&9K>p1srg??z2^Xs zLR|CP>4yw~6qCq7e=JEE7f+}C#IWW}@*gV-E^F^plZo?BGED^_eh?Yy6&femvJR*A zteIu>6GI_c<4dwX?0s9n@Vvh7$xQ;|*~p#OlNXYMG7z~QB|EDioTtlaKRHFfhptRR z-&X|i?#)|-2Mpa;CIsRSK(p&CKt5)qW)7xWS zI-2g1xM1Juq8P1WB^v#Q_1qCT0@%I!&1zPse{uI7IFljfKh0?sy2#d|9)|!TA4A&* zPw4G2f-7@7?2$`Prd6AE2I)7&oI~}+gRtvS1p=_{yJ@sVyDS9n1%!@`YtbBN($D!z z0Nrs9>z2}3Qd>tFsL6_)=A2DUj|AJhw{!FJ+VQbDk_{NU3D+1Q!|T>46)s!CRnZpeMfuwO(i2xk7R6jRQQF?}Yff3sm;F=D zX3l5r_2pz#kW0P3+$j;bZ|TH;R5uMXoE-gQa8Vb<3J`kzPL}2SNvdN6plA{^`D`F0 zw*xAJpKqOZD%G90J*zE>AWm{E4bdTI!J0`^OR=gBKmC3s84rdS6~-9eyd8aTra=Tq zpPoI8vi7{&d93aR#N#d0AVK~(zJaxO$-6PHF`h2hV!2`uwb7uU-K$9c=yUW?8P`FV zZIr4JUB>$PKGQD?*!SX?_;HHqe4ReeAIgB z+Wg^2Qm0-RK22H!K zV^M@bubxE-OiJ>@F)Mkj0%QiMDOxIs5X3_i&AAB_a#^Eo;G}W9a=cUBPWu&E#2F+0 z(up+Xc@NmbSenl*;v{8xb)3sVj$9-8%f-BkYHxROz+yF6TdnWqoKc8}WST)s34B%f1F#gsJ;DG|PHZQaYUseywY<^BIH za3G0`$67js7B*s}0Gd7}^$Bw+yDTo%OzagGh3^#8i(V8f092Lu?jQMpH8dxDT+W=; z3HGcZpgX0bDxOpQt|RZ|O^WXSmd9Qlz@4^*AEf>F_e|zRE6ThIrBCTXV z>w^SM_&)arw*L6`<9qFHMu|(2OQ>_P%g+v_N-4ieL>3yFCHpU-H!l7=Kk8IMz8ywI;(|4~*&i-F5J9FsQBuDP7*07DAx{2LG@*gqLSe0#%~+X} zsUeT}Z3HMHmDk_35U7^@MX4nh9GCzfBry*fSX4ZYA8=V%o-0hOU7nx+Mm3NYiw{uB z?v&pc8MSUtOLLD|Wc&UYRk_&9qv0h3EKbn&RB3bG)e&g34`z+wTn#Kgz z3V^G#Hlbmq9UVQ&=5APL!{@r61tG^e52NhIWv6h1IE{E!A%6PXd4(L;{c0)5TTXCY z7h*8_Vn|Ho9MV^!ok5)%3`dyYHU{Wmvm%simNG6Z;s&Qj~*ESB3C+EIgGiHX$N!b05=YSm;Ka3JzUq4pv0H~DJVQ2dr{ZV;R<1W-AX zj$sIvtM-J_JKg$F7MMUs^2jYKtbNMb6Y#|XPI#$OA!UJ;$v=bvBG-vbJ5zK3%hwj%c$8aN z7X-G$ZjA{H#bYHzKFi?_E0q$P}huv}uz! zGUgfnAIDG7V|4#yF|>l0NYv<-zCFQe1jlec6ZGzRpn(hUG?J7qByQq+;@7HfUa+Xt z?_LhUTsV?)wRRMjb9xMgiUm~4?~|kZlE!7(GTjb@txtYw)V2x1ZYjsCApcbzQ3blg zpAolDtC&8@-!c>bt7kg+&d_OqKk6Hi;gXe$0-*sCX-L?PE|=GRf8RCp((OGWPaT+bJ;7E<)`3Amtk#I0ul+sa))0nT>iweg+dJ1+T=19Hn7fX#mlW%gu~J8sZDA1Q(4FV>nU0(pnZe zeo)s0&{c-spk`^i7(rvse{>mu8*s+cgQekU!Nt{H+_EV)TkrCWq{!X~O3wanyZ;6f z)CkAksR#y%*VLcN*Q~uYQX-RY3YoVEo;bg3{)-!lTK8KR(HBEaQItSaL1r^%9_6tx zbbrZ)PkCg8ts^3xxIvINl`SuzPXdQa0Md z+Q7v7UmcBK7{nJ_o!rr&YFGyb2%Xxy*BQ$({myz#cJ>6fItJ0>sf}&S>2LK4m3V0N zN{Arl|4H_v5f~AJ0V-}?Yr%dLYjW6LlvFt=utm!jl!v{@O>o8^Gbt-}W{Z#7+HbPi z>xX*^Hr`JFabDRna0=n>y&xX^2SL;T2Nn_!fmRLRMrCv(hGx4g`Lf;Hg96UP;s>Ih z3HvTihylyk=(l&g{5?mU5kHX-tdr48+{X}_3M@i~m^hHPqIV!BdQErOx$CCLP1VB}&fgC1kMygIl z36%T{jQ#_yf53rgl~U6|=NOVa2!J)j7CF<63;GBLxgy!{nqhRzh~(5}+agI>?e)M# z!{wBf@1MB59yqSD=>7hK7ZI#geV)tPi5i9itsf=zp|Vv#e0CygK_0WG=ODwjp$k>T zpDsxbE(<=3!E3d57J}L-#x_SDndA@UC62M-(H$myjJgCwOMbFpaS8$Kz}}p zg!}47n6~8%GBOpuXZ)hoHblo@w1<6vhY&s5iHe%Yw-n_Hjus$rH|!2hTErke>==3x z%$WlRwWxJFQo|VjGf6g379~U_h{PdQh7|>0=?f3v)c?kKuyNE>LaO~7U4(DPv}OZg z4aGVa8}+!#cIK^OS_R2abXvz(F%pBK`^9(C4)ZU)BTy2V)vIhvCpEJ2 zi`njA{!Dp$7s^qsaLsEdf(h~A7a>a|XL>U4)&__grl%Iz9CQ(SyWJvQYkGma|4+ww zz56a?yW*ysW~1%Z(7zY?e7HB1W~2GFwaNwsaq%|f3;{Y5k56}W;UAPS~bOEBAID49_VAl zio%W+!n$1&9z8hzwOX74v;!jfizz9T=)`$nSZtY$1X>$==#GxATCq8cI5k7!9DXO2 z6R*59I+k}IIG{hb2R|G|)97}3zqYQBNS<%^Pxg~?yj;YSO4ed=oR~blB=tkax%E2k z2C+%bUN2sr_o*X9#a*t#UT#-a4BphzL92@~i1d(N4Equ|lx}zm7Zqu=#1m1D9Xvd) z?;A9OsTIEU%LPGra3QK1`bh3q5)sxzv|8^ioT@(PG3$so^ZAkCT; zM{(+9GD(YXO`?GA=q&=gBtI%CA4IV$*G%nJ{n)$1LWwRa2<-M0Q}06Ndfx4iMjWY) z#k&Y3|MmJZ`lxeea^5rgxQzk3B?K2tg`8Q(lx8U0EaM`G2h7mS5KKCuK;;dNzj+@m zMpB#Sp(TpG7bj3>_3$=*R!I6gPX5tzgK_LKDfci_dm4cMRidWfNOW0U?+x}a4?tB^ z86^jT6kokd>49ND`;=dk-|y3y{bzN}Ir`2*cHt8x&VwvB<~myH zbI32&Z@;Ere|D|E!d`Q{XBOtgL z-s7@;8EG&&nH&*ih+>PZ@o6Qr<&uK&i`9N)QbF596c8y?8RjvV{xXR}nO6$mS0p>` zT06Owz=O^PPq3rtTN5K>q+7;cXP-j@Pj~w#IpGm0=75QeEPR+up0I~i%0)Qfb{YYvr%RLA_J=Z$02~$Eb>OV@FR-3B?P1#`N zsFv`)D=)gZ6k1Gq2kN7vn5JAf|23ISY(woHM%7702fcP6tldiQ1S3z^1f(??w%?B! zr&nLCuCL^_H{S|C^wFp8Uv6uRkR<}o93Q9fMoA?DPR!05JS3M%omA4?F9e;WAgX*o zv%=4quxk~ge+WD`Mf<0%`?;d0zqeC=x+norLgOSG+Kf?fhFMXI5d!#z?w?T$nk47M zyxm0Ld2Se@KpSC4L5vNuh?;G4#If_3I+ZT;5aWV{ie0y5p3W#{5!YPpX#%L5u9>qG zIaXkKYH>~kxdtZ0XBCje=#z;@`I9}>R^&??C(<}xF1o1a4{(J`g!Y6TWHQFUmG`Hh ztcGN4jB>McT9wHf2%Pu&16Oz#ak!ubqT-EBPVmwzKG{i^CVJ{U{1vfKP{Sa% zIHM)Y#ANtOtw(A7KuB-UEAv=r%gz5GB%UfcV(P&~46GRQ(>gmwHS=Z~iJKfgD%i&) zZ*sV{i4IE6^C@yMpn(i_&oh2Gmtu(*+GUyizJwv9+ICX16Wb+lg9_t!PFNC$_T-DSh5Hur&r<2?8`Q7Xw4J&hX)AJ z$!@~M8Prg&B%(RGH&A%B)hMY&UcQj37Ly1nb>sCYHB?I)&MB6jd)=b@bcI@IxeMRf zWBdP@-G(pWKj>WTX8jb#c!-RaXDDF^UY~}rnAivmS;Vh~jIevjpK%X!@XUYuvV2IG zX|3?zRo&v?|AhIjVs+=i<@nw}!M+5ncb$a#@*?<#ET50my&hS808ZuL-NrUfAx=p0 zgX(@is68E}?L9YR$a*3qe`I_%->vXK4O5^w8^EV?3*=SX(T!xTRPQ6BUIt7n$&pw{ z`I`Dt6>2PZ3EA`5FNRK~x=w|-LMQy6^ovnNW)s|^!Fh6aJeZKj!f071(R}Gtb{yw! zZ}sF9i?(+vp?F@$l8@quuzcuNpE@S&!3MNmFc~Ic58QB*3j318hXl>J7t?HkY~Gtv zLcP2>PJ~7?V^u+b9!ly<4Zh>DTqKZI&g3f{sreC!rwTeKdL)v!4wB4a&CF6IrOHZ# zxEw)Uez4m(u^2JqhSo5|iFBYD>;zo0|7x8*I^(C1;1r(4XFILtGWdbuTLh<{xAgZi zf{}@#2n3OO*F{a-uU^3}J9M-4)8E0PUn3Er)k~{K)UT(owx9+#E{O$^?ZbtI*9h_) z92h>Sk63^@kkNL-rZ$>Ci!8AHc3~Tc-ze%jy|8Tj4WR*0R5ZH%-+qQq;>~qv-kzU= zImN>d1(NBJCJp*a2q66N3WZk)^ha#Oe!`D=>|)}LOpG7VM^+xC@|>_;xRU7!=3O$ z>mACawDVXuk1_J#{`7X!t6i;r6@LwzQF3tLjZSM5NxZ=uon_J(U6T0>@1Af z)x{QzW*K@Mt=s0$u{|?&`E+t1@tpeW)Xj% zVD4;M*bx#q32P))79cKP|x>Xv8l3*#-UDu47zzv>?o^StZU#i$n={z$ZH} zSN?@171v`R1k2tqO6B|);aAPp9Mc&e+l~(DB7zrc`J^(rqB525D#CxGUtHe)Z8t8` zI7zl}E9XaLD|O(v2mW6|4i#j9TUV_?{dEGVqAl<%1Wq|ijdX#F^7L$k^!NU{N(61u z7~emioguuQdhf0kdm>Nd74IlY1WT&F$wsMVfO4uW{M|O$J7Oe@C>T-X(+r{JsIB$a zQJ%9_50}DO8GTD>RRwfy&lcc~I5&eN3BaRaLqkJNN0n3bi#c&qMa8MgIkT9i`Z9~a zK?160%CM<@45;vRGb(>cT&4GZ%3OKw@5I2PTaE6;M}4|9|J>&s+}q20p-Dj@(o^_i z@N2({w0r3a{~S~GxP`CRq{+_-$ro$K>5KRi=t*`oh{1myb`96%Ig5fpXO`XN+yhrQ z3O8s%sQKvQAbypWsmpv_KC!WBrc{~C@aH_Vho!S|VFKe)AKnmtyn}q zXj)M(-eL7(Li7w;l^Nw_2&YT#ugsqtNo^}mC>+(Vd5?MWrsa6#BJP&%FxJ~bI3H6g_E-`}qEu<8f3dis$ zMcy0HUe!90PfhqR4m&@Wd3t8EXi152>Cam_J1> zq4s~H*>MMMww9X2FUfYfb7|#*umRy5wofT?wW&6J3?6^F-k5AAyHGl{c_ApDALdL6ZoLNZb)mbvP*JLee@neqsm@Oqr=Z zC=)U#{Kih1x=ENG{lgEd;ps?MYFMa)W~iJqnWtnz9(twK8&XNn64@8Eh|=AwZ%k?T zWgE)hPxJV01JSDp8{pwz<3Up%pHQ^QO$!U4Gki5KoegAQdvDqGh_kFU>HrDf?hF8p zmVr`bwo&(-=VpoT$v;wNrvhg^hM2vZ#7+go$h7Zoyhb0!9b=sL&s>&u5#?P{D9!Q4{-ps`sg(N2I0Wl_A@0s+J_u zUBd$-j;XUW!KCn)=|DT#%O76v^YCMbmHr`k#{JhLfBkMc`Lclq|pE~by;ZOTc)Nl z)c9P$^TBg;fBox0R?_?=shF2$sD%CvZ@JMD(@z~XI}*_AQCZ%)Y-;6t5mPe(A^#LD zlq6kSrF=RP-V}SdZ=-9D`^b^P?NFh7ge#3_%?PVtHfjb1(KW2mg?XDA(wF!wRlj5z}-M z;yWVAHZh9~4L@A8?%uR1vamQ`EV1=u>X_6D(>~ht@qt(*D&uImtC-JvoEn1HoGi99~H+-xTU` zv*%1&pTgDFRKeZAwm?lo(xu}p5X68vOsk#itFdM2#`_v^iisn1&X6I2(X(@YJsIv` zV!~!++tNpw8fNz=a3Nb2#BLJj`(HOlX%D30SGAKEHYQG|Bo{&*UnTvVkyrnw?)iCH zuhnsqv)G4!vuN*0bL9A!`bi0>&4-p%T$kWl7+cBkgRoTLuTaxlOMhN=rEj{Qdjygd z&^lP9(BA!uGCfvPSkohz&nVpUZOZVmKGld*L(%d(Vl?}p+&O?rR&3`s`g?K2Z{h&o zL#dt@m2 znG*2zp`V3583w*MPs#(jn=4vdCEWKO9Wh1fNzHm*82O0)cC!TIy|V_^oV=%xrrryB z7!9>F7+wh8uekR2PBHYJqNG!(_2R!*FiQB;ZzpZByQf5dgy$e|@ixQ-!s9Ef<6xAN zWC8ei5waS!m|4N!D?f9Yh4ySGtJG6b6ZYi3tkPK&tIzIZsVqos@#NnY#tLFEdKuls7fl=$QTUx9vb>C`O;X|`?J(9-YHr)q*zzY?x*<+QCWR$UL5o|}&$jIhi9j0u z!W%CY*eRzXimY`?1l$uHZPnLL9Q;6G$A`(Wx4uF6{q|<+XK%V+PTCWQ@8JFt&z% zNOdU_81g9VaGsv!?XM+1q{tIn842zdk+^hFOu|e<0LLRk25F)349Q!h$d7%<{f`{vLe-b(m&Mw_M_2#VVJ^&=JCUfS6*=@SsVRCH>F&@=tDqDk~4Cqjs%*R zFMI3dw9xrq%gF-qb5zQdAnKHRqUjgbMSaJYIXgE?0vQDGli!JG)6NP4ES8cR3bh`t zpX^~*qhPtoATi{Y9Z=E2zcSbiQD_eQ!uuP8&(XfyO*0!g!sHnX?WiWsgoq)7tG9;= zHog(bs6qXF{E|f4=XYb6H1F~l7HD)bbhHhiXo+c=YiI@tXIBW2>9pv|NDYP#BUGRM+t~)Yu~RBjz5nWXtQ5 zJRNoYz?*|uzgstO-n}+b8#dpf>7vJea2(opkEW0?{A(b26A@@q%s@*2LK4cE@ToBp zcMd3zJHkP!TJP6u&M!nad^xhr{KneTL_>%L^9Lg;WJ)4%^r}>1ik)cqr)!bZc^$O^ zPZc`2hTET^6-R-Gaq#wMM>jQW$SjJ+b=jWgSh&3_VU68q6%pLf$ZLm8jAd3g!5ZCh z&V}7J8phtH)!BgBi9gt`#fL6Z+J|tsNj&0WSfp_dzU@7H{G=hjMx@HCgO2ShULIy* z)k-?ZN_?uQKpP@**PpQ@!UH&aHroCIR{eVuo7?=EPk_iiZy3q9XT9O8*x@dP!qbp%`*Ik=&F07W!#6N5pQ$!NPChFt zBge?QYc-)f#KHOAuyy1kwR13juSmpQ(L9;%hrWWr^77`-m?G@B#G*?z;z_umS=03b z8W1&=5VWImf<@@6`5>Z? zs|M}u#Yjd0`eiVW`|RGzX|>LC3uOs(-;YflXPix1dqH7E*@Q(>h0ayW#ia&^GGOes zOAOe%%%hikD)=-rF;oFoBq|pSfJqIb0zO)wlj-I-^Enx~^UW3p7us9O2ct9{Mi%_$ z-ydDT2yJ)o^WQ<=efh@_EbIYxq5E>x0FM96I-IJr2khoY!t3^^1214FDL0^qC;c8{ zZ`#2ob6L>@oETtDXs!WfE(FJ8!T&9LK;9=tR$Q10Np?P`_aqV6 zKyHwYPP>Q)>TZRYqhhxO;9mda;JNUXNAF?zMlwOK>Y`t^GT0PYV4JXt>6NZQQaf-^9|9l2`YvA}^-CuoBxsF4kTGtM>E!TWr zMxV^hi3o2n@lWpBb+&d7fgY1umq<=6HMk#5oUy^pXCP@0U**8k=75OIKt1tsHm>e_9%+9uGDMT$@VC&($#p)vZP6x{~n>} zOCo>4&L8cua2d?OE*d$+uzySu#~WU``J~n}!R9NyH&ddd+v>g_Pg<<(=AJso+Io{e zd@1wvst4!24RH!r;M_S8dncIwE#9Yn5Mc6vg5DPN9tojgf&j#h(YPHI@|6Tsjd#kz zVn{@z=B^=+jIi|W^*wVq-}^MFP>&cqBKU8mc#<_qf9HF1VyX(%8?kd@(8aBmd^d$o zXpy53sMV|yI~%^UuE^csKMtu0*s@64MUscCuk7d**yw)>uMd`hnTsiUW~I4P8@=t{H>~! zI3`%xx%rN%UP-!+S-NGR?Z>ZZ*W{Ikcau9$v5rL5^$@lP&iMlDzEgRNDShA8SvX4O z2eN^CTkOFFKrcQsv^}R*D{ z{}$!m8A>z_lnBQe{{i$kXAbkAB=Y3{Bl4Gb`zuv>(*xjJYi$^&3@`93)a!3pN!YSF z^7bsLbtoQ1%;oI_h(wR{;}m4CoG^D>GU0Htv(D^-hDFPRYDQ)2BTCzcV?5vnYQy~@ z^FA;S{rLvz*_w+QMwy~eyplRuk!P{gFYWJy6`tbW@qL7^y;`L+8huT&ywPAx8JrdO z&q7WF>T-eIUC;9-p54{b)0QQFp!!#SF;lki*MYTMndlAgZCn<`>%7fm4kf5&yUta??Z#YME?&Tf2J6s_piyjql zMcot5E%8JNFq*B;8eBRF^kc>32foEZjGqX7X`p1tfWNRFf!(M}_R~h;*iIS5UD>Tw zW?B)BCaL2)3)7q?D)gyI_IVq51^Ja9Nnb}NuS*}Nh996`Z&;iJls~M`qpAHAeN#yM;oN<{aq}j`mX;gjy&GnoY}eCl6_ql;CmDsPJOZQE`LcEf;K<#^| zYW|MUEi18NiJ7~)IgTb4z!^JSUl9QsgUBW$*3a#RsZ(+cVM$RW>${V;d_(^|l>Qfd zMmr03$+Ju8Py0bE{&8;?md zHR61yokb|6{@D|@zDOn*vc1A`_6zVQk^}KW<23Z&K(BF{=9F(O&;#a@vH>;L=T5w9 zSyZq+PO@oB44ALA3kUQIi7IN_=*|dM8~bK+t*ul0A|#u^@)-eUT536*M6hHt7G%AU#;p|>;oqep{1zmVGu>3;l@AidPlX@C*f%vg*itv7oqw^sCT!3w zc1GM7_^|4rJQUDDqFwc;s)i5(zWx(He4YivAx-o3`o$J6%>OPBMPzsrk*Pv%H?l7LUC3W1fC+;{fmQyiwm{i_7GbLm6*cjK**b8x(oVt%4h zg^F$dyhl6$R#rJiAuA4qEIyab8j`_7p(774OTyky3t0o1k+GPXs@vZyG8Wj0{(|AN z{=m}Y$v}7ZGPt*7(}U!_sXF@1gO+q}i1qMyJycq$#o=Nd4;+v4+4Aa(^>SG|D$I+9 zRLYCS=S3_lA!!Q|!aFJJYXyxv970&LU;g2RbB#y=xBpyAkwfQa%z-0nq<`x}PX%;x z^k*C=NZR_6^U0b^;mflUgfgsVkVVqPm9%PnL{yj$%k2DI$>NCGVN}VWX-GHxm#u%u zLfs#icuvjAeT@cys;ucjAM^p~d5xJNNjW<>3Xd_&*92C2SO_VVhl^|J@0(vM!y12tYYJW?!90)(+}q> z2Z1wV^IB;}Tl+khL;zUwqWVh`YaBy{23XJ@BgTfMmVMR02^pel>5$&Sda?q)bJy^< zu7b(Gr~ALN;C;S#k%#ig0S7X~c%44#*35GTvx47V@1$$qffg3i`#u(9`!)oxuT~yb zuT!d}7ZFr)K;@;`P({$|$4Eni^d@+Vd+Mh|(^@6Okf@5&72%duEZ#+4#M{%qZfvz# zZU#mAA2DD>@jn3ZgEQg}a{Q>i;=8q^i>c^127B;caXWv?hC2B5CXgEBfx;9`q~fj)hwhOLUU`P(EnlTES#c#!!1sOq)H=8cT2O>0s_(v(jeWnbhCs=N=h%? zp@4KNsj!rEgDhQ3*WKTpxij}q*mw5(#yRIXAL$7b<l5*o6`9zyGQD_z`A4k2`Q>CZwoHbXej0=7&(+Nik6YjaR%wUOO1p z@~{vOkWzIJ(sLd3bVN$X&X8ILn2aJIV!T9j;)5~=){fctJrEttlB3o<&!=yXgX(-8 z3~uaeOwgJwt(;B#P3i~n!uy*Qj$16gHS zt1q3yl!AKqdVQ*3925KjJ7<(7tgd%u1qF=R@lVC8o+{bZV=MS0tahO9ZTY|#!T{FV z-sgw(L6(-0l@3aiSuV^+sQY)*JsxqPq9@%t9e1B^v0fogR>1+*s6ls{I%$bmY%L6? z>7Vl+?w3g5j($%cIKU@y!a^IOEcGyc`l!)fraKlS^9=j(9_#U`;03h6ONd6|6HAR9 zW^kaoz!nIAlSTpuNJ%pR8dhJ_5c&B=`48`&IFW@P6Xet20k@HhX`g?pZ(xwe@8BYw zqflI3y>Djz*#GVV?@wixN8R8c0pru7iWAu(- zgR&0=@2-*re*5Q}0&n(YT$n5MqQ_G|X3~-!D?Z8W1|B;@mzU&zelD%|g!jy29c8>% zFjp9lGVKV42Wlu@^x;5%b9sRBf zx#l8~13)IIaZJ%9oBIx#eA3aOChSNnidvE=t&e{^`3I$=|t6~_B zaY$s0rNN05%u@EV;iNbzyxQ{&ektgR;{6_UEx=}Lhjx7IO0+3~^8SQ4JY)vZSBS|R zRYn2_m-YoIPXIkpfR=J)^nYu#1RV%Hp@9y$$}hS|1KIH8y`1KD6gTXUEI7n^l`F&` zIl7-47rp0D@CHVP-h<$-8d%Skgddoq!5yhi%8;%EMz!|{-#C!Jci%yP+7tF*d z*!YrOSa-wZBmO~lsCShe=m^$#Pyw1z&80w{!a&I_4+wHy1@K2OQ1(#EMgbrwgdpTC zoZ~_qkE|)J2^TuF{;O9uJVflUi1uIL9yXV#)v5hwF_WI)8a6rsv1C_r`ePt>LprX3_I2WGk*DH81dwRi};wWUqR9#3S*@a5#?Zf#Sary zo(BwO<7)I0|B@xE@*tEcV0~Q0%8O5qz0ip|R`Ep7W0C<#GQc{}lAYcMg!S#QyaT=v z{v_uM=_rk~KX_)FRjkK2;?fO_li11I(4*M?Ayczr~vATL!_OzTzO>F}yw8k_km+_0?5)O)XQjCA%t_#1NZbXn7?oeYF!SkLU`KG8cBuYf{i7w2!X$kS5 z&4aU!TiT76$ohKIZpGHIi$q!8girv%c~yVk&1%tqFK-pV1g3c-@1ZH+S1NMM0hom% z{Pb9oDWcL$DbdO}vab^&n5GjT`6e|UJ ztQhHk6G6sp^VP&DGLNSPKoc71UDd;*@3}^`CT?aowXSIp1t>sOBhCwqAI(G|k9wjH z-mMbUX3xzd7DL5L8IKrma-l)#RK zNrv$rCDh9sDOgmxgmfG5P>lFYCBfgwx6B2I?5N1J@H2HSB^bEW)=KKlEjm((RI`n~ zy#A#P4a8JpA!%>)R1UHZx6T_cK@?y(R0KI~21!UUi3Wa+VjLDJ2C|eRPquIW{)l+T ztU8M#c@LNVY$HFTkNp$qS^AlL4n^ykveUp}gM-nu)KY+?c$VH4O^N@GRxgxxQf2xt z`p9>m+VIho$2IeGm@5F&`yKM~llL~O42{vSRp}KR-dxt3IMq9UIn%;6zO4ef#+Fec zQp@o@mZ;GQcF|^IBR%a>_QnNsrdczHHM6k&p-8%?l0SM6`a@ds{O)r};Y>|UYUWCm z6gV<7`n(tzP>$ZE;#yPb&@ko_LkRed3q%$s>dC<_KK{b;RMgR-1<;Q|d``;lP z!U7mxsfN`7%bTpp=m?(SVa%E~@1090u_R|bZwl(UOMhvTlFFCsCQU z`YVMJ7{0K+Yn;W#CG&zBKcW{)aS{dW%N0{;0j9%O*;)=99dYxWL=Deut%PAV->0Ta zzf<@%7Y#3d`NWEr4+<0ODUN6PWY_c!SAT z#(p&Tu6VjPtL!exKyE%t87sFfiwHVnlHi+aQv2SbuTg|p8~EG& zrJ#RzR-k3C4)yVyv-bNGy?n#fg-iNr+u@P&4C}j~qQLR$Kuqvt^(}BKub; z`h^z_U~rMv`8ClX0p{RWdy?_Q>*UE-kU`=il7B`~;o88JR+IpqDa~Eia6w&ML>+~~ z{Ns*@VAE!zsur$B**ax7vH|EVR%B1HwdX*@&_3N|(dL8M2tFtGx!jb~ zJ|W5{oX^K8;U)+v!mTUvvFk(j&{qm4%S1ukVM0_)b~1LDx59Ys8P-SBDzBS{<=2Se z2We<vEVGSqqxJS>_zmEGEQ;QA6Ty~jPvLNF3|~`; zz&-uw;}$73y>?E6+ivH&(7hpc-uW%D8rh=0xheg~ZJCL$w3%6Di*gX)ew(0PQ$x`q zKc!8?86H!lL~ruIfHFGq>1|AF>13PWY*04->0aU6B-TZe!YpML*{yI8iLVn|D$DvA z3T!3c<+u(ZsK-=9T}5TBshZzdL)=~;Lt7Rwp+-xpTBaX4JM$WYe$8pwKuc5ebeXfB z;viW=`d8UkIr-M09)G@Vn`zyP1M_>7fcH-a<_|L)?o>~wF$E8&tkQb(1^x<( z77h+o&zE^B{H3)fPYn3;J(1B7em^qnSjUbb6TtJ-FGdqFim2qx0Bh^X0XiJF0DEie zEX%V}qX{em%J9Bmv7o=7Kz0RT9b9u5N)vL7%~<@K3xhpxUL~5iz4-EbGse=MmVr|Q zQe`nBPjm)}ga+++9?OH5N-wDxVZ9ovVPbsA`3!v*MJv}VBM=qHd+V=7FKbQ!f-ZsZtHF=A# zI!^Ts=rc}K-~a*Yz~`%Wl=ipx7yoeBRvlz@6z%y?im(NJ#0V?vvQ=CVa=`q5-|J$%BXFuRH zQ4a|mmD=WX#SB&A;faAZA}Ev8YAtu3RHag+OA-iT2Sk^mioXM?NGa7KUv&AIH z0i(>*AOKBcmu;7ok~TAL-n2({~Azj3kl=< zdFKI=U7JJ%XJ+%hwmy#_U&py+x)SiY3w_X(!?}bDvMY$S+30trHN`J7|GcsRR$m`M zpH(twOpj_v);5TimeQQa62L2Bpr^;(gW+fRu*#3K4CKDu^W*e)rlz05ZJ@2EGcXJ1 zRnX@gX&Ku1h66su_iy@AU}orsZj;H*NR)tga>GdL#7LgVtCJzw6wf7&eee?cqnzcd3$D*vW&C;fbV=u0>U$rOUCOHDs#RSS+7uO_;`Ap%H*eYB>|+# zwPoyl&xK(SpU@zA-B=3D)pY%h zZBkd3*`}gKFVkfU%9PYI-eZ{5*0zr5w5Uq#Z*!^?MTzWu^|I3-!aj^nm*lw5frxPP zk+f21iwRmynO&6iun?g>1?>|E1XKJVa=`8O|52pw#)QLKmVUtL+*|qPjq|zG$%Hm^ zXqe4jQ8|U32zgCTLHQa(0U<+2m0^~fN-HdeytwkVt>F`3Efn8;81o=$XC%9$cN%u- z#u9x3Q~UL$XAXW5aEYQuf0t65?0mY(YXn*mbsu$Wbav0JBg_b%SKx7TtH;Fd3%LMp z=zGC@ptQh$i@aV)y3@ zb_X;bi{ZylNnDWinZ4!XOh1%a?h3u-@H)}cv@ zWxv-FAh=Y%iMgJQ9Eg`XCbZXQ*om|4?MQftv&0K?l<$4ra@$Kv$MaTOa7l9QR0;T~ zF54d(|EPo!a?_0n=kru=&l}xaz8dVr{9>xUxR^eHP6_ykM%eYUvyj14^U&g`lnO4X zGzyQ(h=*Sw0buCI?Mu;##s(&5k)ZijNRkJ%UiJG@qtr1KtU!WM)#t2Kh2JCBt-x_V z&@)QP{!izlm0{ypu7Y_}L}$TGHN!OHL$RfCgON7i6z^=Xxq5PY2HzMXD8UxSht zfeW8pT2fn!Co&VNd=KUszLr}*$#yvaEhjA^ghkzK0HPE0@JX55>%Yylo&4hl%ON=6 z>!DOwadAdd5t$53#(kZz+s7uiD5K)@$Ri1ltC?e zC7Bs7fN44bD+QIS zzAz6nd%UQicW0w}F+{p9_P!O53TIIoT_a|ASdI(srcquNKpwF=%t38Kw34}v1*~G! z&aEr^90V*gjeJfuk3O#QE-O)`hyS9Ws?1cTFFei5NEeoubIsk?|M1JH$}Yk+%2PR> zlK`P$r6v<@dND$8n)t4u3S#62crnSv{3ro0~SPVV_a=X9%kL!P0mzjQ2aUF`eu@nglfP*qE?(a(66 zx3qAU3VSdNqLgvdNI|McdVSf!=!&1P`h_Of?sZ1Y z6AcM7C#g(iC?~ZLXgy#(90#HM%g3h?1z2JBf){_C1Eo*{H#3RJ{#Dzl8QS9{>kaLX zHR+d0L?4*PB;6)DdxX1~Qi=Xn=*~X%pdu!`ZHotqbj3Hl=#m2Dn^Kq1>6q zg6^k}ZH()Tk`02G0edKE)*LAjA(Hjg-zwP3^snnc18#Yyb8d{VR7?6w=H@?pa2UsBJGuAod%?=%%ix8V}^aW2Urer%oz>bk$jPn^O&YfMQZ~vDa3PJ{315xBxdLI3icNMyLTtc zX$A7QN-V}rY@fH5+@0orBB0fMm4@={Z{dnmU^t9uLmtAXK2Hl@5THNZe>hh- zM84%>eWOaVyBwR_rF443^T=C*12f*ZW)a(30O}r8VKNP?v(0D^W1pa?aGod+>{%K3 zwJlpo@7J|LQ0u#tqr{<8D^utMrp-H6HG zv{z}Izn4F0kEvqa!|Nd7ey}oM8@3X#Pwj_qvPa`-(!q||ktCBFj%}U&H)UOgP?@^v zR|$q?z5h}u1jOj+P5%+;ljsWG1l8b+w}Kykr=v-#RqhC5Jmzmn+!oXMLkJ&v&>pwA zpe;N0Ex3q>ksvjvB#}6h*Cj#+wckuYC!Y=9wyksrxIk8}Z2x%qSWP5EjQ`nqrCPbK z@O5ndR{VMGXCB5KT~lBjBJXI8sV5Lty5RI2gx8RHobsT4{2b~fDC*1E^HpEMpOC7Z z1AhZ>_-h@bfwAzVhb-UkX^(e)I=|Ne@L!4z?nEviG3q%B$yYbi-ou`v3e zrBj%@U5|nf(XUs2QM%TGkY!%*wpwtS+m)G^{Y&1R{je(2LwXCJ4$rTC6OOd0@d;^; zce>7!@15eH>S+^^J;I1H2UEw1jeSD1f9t=KZ=FbA^L#8##u}1yT*V{YFwfchy)-3~ zfgR%Fn3>Zy_ABVpyMoso8QFNRFk6LVp>S*FmwD7?VCH`ng{VLYf&-H{V}cOlqzvW9 z<$~z^8-)E^NoP<9r=}$3Q+u%n%xvrzlR?At-T1{MHuj0w4EgdFlxQ;Tmh0Dq4$-=< z9(KL@j7mpg|0~7Gm+Dy#m<6n4-qk;*B>RPWU4$ua9GV&k+kJUJyk#r4Q8Hf@@Rt1* zSFj1FNDINQJ-b$1x!5XTdt5!@Y^W=wP&Tg$k@6_kcN-n%p&#kI%iZ@n7+_XfE%L8C z|3E?l=dlBoao03>{7M?Ozch~2U!Ab~Tf1N8U#Hdvj&wl%JP>czahIQ^B)dv6@WjO+d7>z&fV)CY)GQkQTAOyA~%r2(hqwiu@^ zlZK^aL8OlN#IfdSjpvaNo@nc(% zXQjw~{Q8cKd4$A8)5pP=CpFWT6eH&(A9zozsA@@K~&FfY)44a z1%+Bu{`3nSxj)q#k(Mw%mqL5g(}X{6KS>&pA5vmy*qywCU7RDS9UdX`R=`Xo$e=ti zb=zORDH2oi%llL4K*a7y0BXbVjwq7yi+BtK&l8r+L`c+|$)6lFP*+uc+e?U)dx5<} z6;CQe00bnwAu0o1$1-Qxng|f8Jy>%8&FaQNQZ5llk)G*0&uBu2?}?92{nJDn!AdW6@U=VWy!E?25n9dGr*WrRM~YpL{6^0s7?MFTl+9AmI*DO zA_?aSUXId#+BBGr>W%S&LduDhSItee&xZ?Nle8hDh1*DiIr+5H%~c{w@DT!Pyj4%s z6Y}{Qjvk9g{@P55f1Zg5*veqCZbN9o_ey}Yoz;Rrc74(k;PtwlT&_2niMYcVQ;d&q z-D?qbkJJ+~4HCs^GbR7I-Hn>Er|J(Li5W))`=g#m?5xJO zP=7!`e)**a`s!_&L`dD}Ox3Sobjg7`6FJF zCMNk5%3hqdzCwiWEM$1glhF=7RqUdHfAsxXCzTE-_*ySV^j><=B25R20%;*c{^sCR zzML$j1+u~fY|kW~>L?J}$Qh+YHq*i|T zf}_YiVEwVl>HcgU9>@*wZZ~kXCxGP8XUA^JQv=m*3#MZ+P#hHr!U5wRhA_4xri(H3P zfJ@_B)2GRsik{3&YpO8JT@3IH;e6N23Cn5Y?ZM1`CvT3pr5DA%U!7RYI{S&F5EZ9| zUf8D2L=tpZrYs#25?nfQGHzfuiPBa>Hfb_fb>n~b8Ex!Yk#+;=(Rue@QaM%VDaJ= ztY8GgEq#22f8#^4nfmZ0X0_8HCib-AO1*zh4r^w}@8^atGq=wSnRA>|;wgt!*8!%L zrqFe3<&=>FS%a7pTI436@2kXb+}t$tw#*O-Xw~e;Hj5Lpvl~=XmRcYP4>>~`mZ^2) z|4dWaVL2Yxu8$)b8P8|W7z_i?XS}LEb!K1BH`MO?dJ){UT=-o0h~p0$Hj@gub-xq+ z;H5t^lWR}5;zkTs9+&X<3bWC`xP6k*U@v*Et*LBN8ae4Yq*-8^GW#@h$ei^(i*H)e zH01^NwMplXIw*Ag51N(nQqhi$I0xt1j;^K3f}Gx)AHN||M0d`hH9fX(skz)AG;wH{ z@yL3YAnQbMrieMbn-x|aMe0@a4{Wn^*}xvgUDH&NFZn4#*RDpXwh1;&IqY0Ch8)=P zDKjZ!tkt28z`zGBdU0kX_~#1h^9JuXCgudC@82N4tF0aJA1?C^Z=RAU%o>~TxSy)- zyO5)Ukf*%xCqQ}SlUv8nR(yfm5Yx~<9=%=zPmfUq+}uAhGE(oaFI$FhNd$GjRs`;b z1uqzNNY3FSo+<%C9j6#wsry;M*^V3>!`F^dqvVlPUbX1?U2X}L#rYaKM_jL2b0*a$ zRmT?u^>_jLeiJJVnv6HF6DfKnjPaIZVei%(!C8r(SEAsGMiVHfvlSVy&-75Ax3|nJ zmWo`U#t*?+>EIz`J(79?(@CDzbxvdBh)&BZ_*4*B3e3xZ6PTdia;0Xiz(~(ZO>hMb zj(XWXu$MjQqfro7Vj5;)HCPW$?9O{9ZpIDIkp7e^f-#W?M>S`4 z5Up5Fu51YW^nvl{Ex+IX5A2mXfqgJ0*RC5G$^2oYju~TS#OkgVScks#>L)iEvM<}E z^s^f^V(9vK&0HlX&wqo4jEg`Kqfp45{i)l0v(4+5!&?%IN+z17hIzF`|^H8t3p zOs>iu31LoT;jYf;rXTV;vpcYxz}iu%bil#tAY_gsjWF-O9LM$%VL(mas{8lo;)g#G zxLwrqUZkX^A7S6Z6lLC~hDxQ9BAAg%om>Y&)#@9puBY0}?HrR`R~$q|OcC(sL3{ao zyZ1eQuI&_Hm_^jSt;F3_QmNAo3AR0Tx$ha&H?IQ4JhX2=0_!pG4H*g9kESMFmx{%! zQ`>{j2VUrRvtRtjR>oJapi4XTo!UAm#aC2}eBz&0yoHR~Fua-dR@A@M zhhL(Ai^mI-lw_odWU%uPswFLU%)wZ&MkN0nr@gwxjcs)OnC5=6_!7A;Y1X4Kv$(Sn z+iy8vth31wikZqX(!(sxC4b`^fiXMdmi;3Vot6XjWF%5OmILS4!AU3nMJ^w=3T` z_VjXRBj(D%=run+vBSq`^x#KQ+Icq=ME-kgK^^OFPV)Fh2D`d<@P@uGIml=xB|H4j zZr?8*u90m6;2<>-Fy1QM+{G_s$rC2NMn-KV>xFYCv4_lUHh39TrQJ6nFFS3fuJy3J z1X82Ggz+|gGbXf0ujkv14a;Zir-BLVVMa!`Zfm7>g921Audb-_@Ajm+deJ_6Q$=1YDDZup-$gmOrP&;g?%OO_TR%;~7y++T9qD~bK||E!L7p9^_v`NKg*$i6 zW1%}VJ|BOZ1b{(z5(mEMaC=IUDJ{qd{hp_PRGq9_edXi`9<_`UQhHp$6{y`T{Wda` zVM`m6BLsh%#91HACPk=U!eGhmoH=0wXOHdgnD({U1f%_yJUUE!cFvIE@GgPVcG5yisf9^tf=g$|# zg58HY6hMLuJMUOL0RrAHD`m5RM+Ds%eo=>#fvog%(35Fr)CG_8n%@+f$dK$MEQhjX)gnN5Vqw!5TCr=LfD2uL`9&GM9u9X*@VmMD;|G%v9}k0EHrAE9L81&NXRA#cJ@WVl5Tj zZzL$~DsCVHAvnp}2xd z(oL;0a~W7P;;Tj_c=-C2@MI+Ahj#x8bcX^Sp;#dNlaszQ>58g3!)ujer24i~z4sB} zl?hs0h;lgcz>+@Raxyn@to6)$s98qgLqv8g($-I zBnW_eX8^3naC9OGn&g z-p7z0VstEf-~B^V|IHvUZ==9(>c|*?EAhV(9IK<`OJ)@$ex0(@;@hsSsd@0-r&|`u z4P9OS7cbid;>*Mcz@t~;+$GBT=M(!aGT*3R1M zSlcWT#RQx;;t8p%vd>fu5>=CkboR&74Kk%zpBn%ONxg32u=1o)YQk~>!n?hJ-)A9e zp>I&~YYs1l$aopf|9v#Qwx-%kddwRZE$GgEM>g-{U~Ou=aABdssl<~;2UDiW`J5QX zdK-Mu47Zrfpmqtq7cq2lebyTke&nj|?f}JXb@6AB;(f#b0WK`Nr?j247W;`E0}|Q> zP$b=tXmvc{Xa{sb<|)UM<=B!1ecZMsf0?2MS%^MT6c!evvb@xspQb-5)lC}(u=3hF zKPGBL7ZOC<+k`bp=94{D1IVL!eJhPWNg$t`p`@!o64BU&ZDgF5bGcp(va#k;~efrCs87kL0 z$4+1Eq;#IDA_l43x&DS7*RpMoWJ)Xu*Rz;+2=0s=Yr$Ual}ce-;CpeTKNS@fk#d$m zuQ#xk`+ElnXX;*m>5j}1XtW;jakb`Agqf*X z{xE=79G7n7PG!KZoubOA4Co6@Um8+(+8VHVRPHbDH6W>+4Z%O46Xg6y0ls;Oc8&e= zoYoUm+nJ&oQp#*#CQBokdOlq+dYoY7PkB52azWye}fKSoN0V zMN;$}EndQ_yGcbu@Ak?KxL++)mAAM}kRk&3!=~eBim&sNiIu0q#P}j$qs@zno5Y^4 z_6iCP2wv7^Cl|_D>DU`x-s%6L-%tLt&|ZqHI_(*7$ZPn~G!oYsR>x9|8=WNtujpGf zgwQNC+2DOzmhR4f0i;AZdS81$(}?xlEZBO2a5$QGXL7YiwUjq_ybIlu zzDZ^$j1vWl%G_urrW9qY(UgifUZT`rQ(?qHKK_{$+VXVJ$zE|sMal$)`Z@a~TBB;` z;7XB|V&fPHuA*vXyww8B3Q6i0QDij#4a^cUVhCAvko4$3&hy(0SB1SHjylTBx342D3os#o@oy3pnVw z_HQ%`t@>@}`*4Z|k>aEIgcWAwM^k^(g{C>^sB$jmW0(@|osY01HdH!6_Llk{j?7-} z%4)a9CyNhK#0y69;R{gU;na@TnbAieJ|*FYg|w+%*6`0PE>_Kn=8iXG^>6|Zg%&2n zXV`#Ix-Yd!>I$!8*=5{Z#|eQsUBbpNqS4vNhfiXXp5#nfo7zXs63#QOZu7gzrWuA- zUc5QEmT1sr9!laP3n|9%!t2a3JA5=0{MCw?jDczXIXwaZ_oh6J0QqpEB zDR1VQYgH5D(T6vr-RD_HE``H5f$A#y$T1DPS~p}`pq>$AP1pia7LG@ECzpk_JQC<$ zQkDcT0tY@3n3#h|IXB*pTpGD^i@odiSreTP!gPH?o_i7!-DD9`Po|Q`6hgC|4$X6$ z9;?OmuLoBQBopux24waN%$lvqpseEs8lON(hN!zgziJP#~Cb)HA$-gou;d+W-1wyD5o@(ydrL4 zyDGRj(z^Wu^>er`_k=XQQO=$hNasqnZMs_DFws-agL?1uFV(%H(lL}=uDR^}Hxyv* zTUq;tx2kJ>7RrN$maGV$+En|~Qc(TLp5{v|*-GaF^JI%6RF;xSM5{^N9YRTDzpUbW z=o%(Vdj&5ZTrhB{knR8zk&Vm4_bS6dS-U|l~FTRSO|u=Us1s64mm$4v+uAu z+_v({NOeeFf6h%BY49(jk8B(IARY(KnEXJ{-iv(;j2nmZ=@PQm6Q;$~nc@%kAHJtc zM32@Y(de>279UQ;d7*8xo{Rr z!M$fS%EDLmw%`0^jwnx;VV%sv1WSYd){mpL&yf)3v>5dxr{*w_B2*1i)@MfV`Dc52 zYRAo)0Oc>J0qi&GF)Fp%N%;mOV+W%-%D)0!Wi-Ag=59UIb7?gs5$2^Y5zm_!NH=Mr&Z7 zNHc3M7_AWIAABchu=-h%!H_410zxyl7#>p!{{mEm7jgh-Q0c7bRUY+T>DSbzzGE>zi@&6sOHP+O znX}UC7ngUn?i(UyLkFIv6PYJmXyka&Z7;!ClJP%^S_RM%Bap7H#oKBTh5{n-b zXc&tv(*tM?X?mo<22%E=H#lOnYm&CgCZ`h>d-ZYR`~FtYwSY8a1->P^Q-zk}^DPUH zpZ$4i!M&U+SnbA0>CR*AlAe2)JTYxx&jmPLI0DA#bWiXa`rTd#+=hWO=MK&}1QY5$ z3iSr@OTNV#fBbR_u}Ob5B`3Z^WpyT~q7e7?q?Q1EI@j63LCm6#&>+UVl~Sopy>tI# zOH}_SyF}6S&jUaAaA^2qsy`z`yzPu24O}JeHKtN1wy?RZu0MU^E z1l|0HYU>t|xvIijoB(Sp&qu9>+2U;(UN3C=lJyiV?EAT~)J{cKl!LKUE_h`X$O1)p zra#9nuD&GE&==+7AGc@^EJKH{*unZxw|Z^5p9LXzGT=~x@z5wO@#WV2L7A8h@s>`Y z418NXM*44hhCf!SG3r68q$JPF#*Tdf{`K|d{?C@h1HH_A$ei9JTtsLWCBQ(#yN%r$ z7}9B@6#6_urqWURqw{az7F1*rt*Ml1fX_*DuO_&kURuptph>I1HwKcg`rV;Q?CEAA zzl(o1qdJt>1<)BF%!EIOJGv zW5*k+&D6BmoUmo1HLk8(ny63Q#BLQ~ zY9d(yKOL&-5`}{6D0S&sqwo^tT-odEJl_NO|$e1jWq#R!FK!GWTQn z!xB9H>p&<~dfTxu7|@?6_+HH<^L=h(1T>`6eoJj4`qrtB92OppZ34U7&1 zsV$oLkX-Plo<(4l*^e1Qn)DV#!A$d|2;!R8!2z`-=8y5a6jiz7IByz*I;c2cn`$h( zA(o-3%7@vt@<*Dlc#{!we#H8|wa^W@UzxI!gIBPiYYMsOF!FK8(+WgtyN~-bAu6JH zg#lI&LggG0yGK+cbyt-O@|E|1EF`ztQtwxo``kQa;niF~Mdsz9&)+wS!AU#=II4Rw z)k|0!#Ok{sgZ3~;48IP8QrURR-<*ESvG7#xFt@;{zxwEA_Qs9_vvgm5U!V~R*6~eu ziA6{i`tXMn4yt8&zia!P=&T24{|tN4Xh8@6CAg~Q-O3M|5ZAV91n}jz5=a1>mM}{= zNBm(uL@-G#yn*m;N4=#==y0)@?`*y;_No^~Uf)XeqVt$!qc*PmH+Bqaldj_c8id#F z>RKfe8f6@Vl zu!NoxIKKv{eOaKsHgfL;wgPBe0Av8sAtE{}47BnV+98Z_>L6+gJNB20>gu(hxo&|Q z5q=#VbE_Ap$N!QZDSp>&11cYFmOE8JbNX9jlrs4!*Wpv$vl7txa;g0UXZrhhu8 zBrbaayn6=q8_6&15EoyrjFeLqmYMWi33I~a%%|!(VU#W|+=}-Hi+?P=-hbnI z=ve)?$COou(ltg-eQHHZtd9IGlET|V0~@ZCyxXN|nww6VP&c3L1N=>eN*h`Ya_;U_i5vbj zqIYR|EwWy4K7wo6buBn)e4hS^l<)YwfSX~oTl3Y$6|v>=vk}cNMjWpk45o`#2Sp|!Ogoew*FrBzs`_02~2EShk_ zMt4ubmAG6gX=nM5@6e~!u|qC$*5nwh54paQ_8j{b*~!7$MEo=5uR zcai*7-whB!cxGl!CvSSU4N?mt|ieqP0)WGw{h8#R3EtT zu_0auFw1L@BS@chi|NBhh$|M3wTls8F!@s8AA$&f*cyU0B<1oljORXK8EJRFgN|93 zmh+BjLwEDoBv%uF`rj)(o5@HEv7wpXeQn{oI$D7#x;2f~?3)(B z^1Sz|f7lVW?21y9V@b7mc=|x!?A(K%jq2{1(Yj>fZTYT%!Erj`ZQNI=XV42!hRV8mcKecAA{o#XOXYKZIZaCrl zo;!K{4xpR%f4+TY7|#dXopbc+vTsi@&}NvqRyLkN)+#y9Z zk1w+f9JYA-J?h2R>Oa*Tq#66?i-bM#1 zs_gm6ZbXXRLM&&yA*3%+U%dRSEQdZ=-C3Km_})v9C$7#++fwQ-ClHY0gCiM$vkU5d z_|6R4Y>nnmkKqP{IK3*sf1a7C%?#oH+JzPK@MxXJv^Ajm+E=s*n3tg$iBB|0X)D6M z1Pa zs8F<4bT!`dzY)}j62Bo@shBNErH05 zydFuNW(3JGKz7SHfkv~A=6MkrG23XyONoq^k~&6#+R2v^(msq`aTorD9g(>`-iDz@ zVE=YAQF%GfO8GJQuZMqw>PP1S(t*!;vq}g3i3E82x`jJ9p5cZR)W0a9ESas=O8W8D zX?j+u@P9AG=iPI=Q(ya?$uchk=@b!ha^!|{oJ;2+F=us_Su!7e;(tJ}F#Lw$1uF43 ziYR|JT}o*Gg&h2M8&goRKQ48BJnp?DOgYFw52S?|Bj0N~76w|V?8BFN7*pV@3mlYq zsRVoVgBIa??D&im@vcwT-FdyUV1%H)%dA6L3OwbfL_)Kci0D4~>4 zDkO0C_bMfG?Eq#9wy}%&wj}L24BpFnC+51URJT?vRR4x7nk-6M_}o|0I_HI!_9xMXG);`}M1SAnr+4Y73s8pj)(hS+buqCbUq( z%-C$g{Mb}1YHcH=*`6am>>Y2i(7b&{( zpc zzqEkt$2yjvXoI;dCgbYxH`bk7eRm%^Z>GUN8MARUIc+E;Rv@fzgbx*hRV+<6hi%M; z=T&N{7EW~42y@jPa3}(;N31m&!IM2wn;lldv{;cdvqX7W8m%8+bq+OG+w|ec45w z1&ngj5tJ*~JsdeZE7~@{Wc>F2^7da?&;q?2#KhC{)!nnw`G=I^TZ{lc z@)a4(hnbG(rw-W1MuM+ZgvN0O5t4kY!f_08_0ynM&%HkbHB$nlxIkQ3J9?*Zv!nhd zY%UFjP2tz)l==6eMOUHEyXejMI53TsNT+^X#CjxyC0i;ds(Y+3Gk=igiF;8o^554G z3yGneHj$Wi@6=g~?Cu6)Q@VR_d-Q0^9sw?AMDZP4sTgw^0oEn7G! zJ%3%B6P2LO2xdImVL9L8;l%&$w)0}J%32uw!4TaigQjICm=#}Sau;0!ofYcGg7%^4 zS)k4-E-4)W=KyE+xLB^b+jmHpIK6N$)Aa7er*S@w4!%H5npoucQsF2`Qv6%CMy}W5QNu;7A@c6(*M@X9 zyY3!oLhyxHLzQ7DYWMCRtO!HEWnrboTTb$wXCDP>ou;suQ0Zp8DNaeWp37FbRc9OO z49JoH&ps(~&8U0Ld7ibzZh|PRZH(utbO&Qmajg$Y$dZ3)oT&d2G^EuQ;#$3e5V;zM4K}7b%5E;5v zN5E9uLrYt1l85AHj5TCIcNp2Ki6NYej0NRe+KFX9ju6f3y{W7pbn?NNGUhLG{G~-F zRAx_bHBHB65?^dW%mJ-T+-nYb9@%dm3#G;1f)y~J0*#|f?y)meF-e)Ut>fbd+z+h1 zy>H6vpC;sgZ+M`U*y~JJzl)&wXK!;DtyHh_sxtc@=;7;p_2Md;p=}~jWHyK)o|p;} zJ)C*zg3LC#K$LqBKfB?A##pP54VCCqiosunHlrw~w=|eE0Yk$+dDMD6U35xviROHucIG*^V$fT^4BXpr<@okUO~3f3|$RG4Z?yvp=DQ*T+I$!m7J5Rrnh zJ8-+&pAqo7e*<~BovwS$zr42|`dpNCvf5>u^4cv&ojg#T8--=Ilpc|{0|RK!k#9x| zYa_$26ZXs;_~?irNx)E1js;pBwic?F(Eh@wor2|;#Z=KaErbfgToSa=()PB_Rj9^B zdQT@ml*Mjei6C|y?!+0wJ)vGjXiDpb3eRMqn*jeHQOHz+N+!43-Ta(s%8a}U%lf-M z0%rR>Ohi1g&uyt>8abve$t_3Nuf6{Fxg{mIT2w7YN`D0Uv&rv&@rhQ|P=B8y6U$t> zsl}DuI2PXJb{-zJfPNp)>+ehgNp^55M*-iK3g_Lm>+v%#5 z+l)da{G2-pO>+t|7Ko;kvzoHNjNSaTa)`pF@lfSqTnbHq;-;#@AuV}kdDF-{ImJM^ z`8k>^K3%2t-MA`Hi4-@<9(4OtPff+Cu>W3WBJ`8Dznu$)RA%^S zooK(N&JQN%f1s*c1#*NdLa*)KAjx?_FaJeON?0`8MOj6e0aKZdBdj1h!qC>tzB%ne zZqRa=2`*N^2Ff`J*&EUTNk`U{bobCMeaKP!eS6ZRbiQG+i@(_g&{1lr+f@{YN{2P%Q)Z05`8i0Ba)B{Fusxs>q>vNUW7|h(JBp zsKiPsZA_Tzs~*M`|D)f2GKvYRO(efQs>oz>hQ-)h4<&SS`t9qG11Dmk`xHmR%_ zVpLzpt?i2QeIe;mv66jKT!$iqc8%LkKOutRHTT?AfjX2!pFuZkwMK|QYp3*5gR+nVMr#ap1*o&UJz}%KPv@tH?>G|%Rw(jx(N4Ob3p#G;o-M85@ zo>&y5l1@97Jfpc7Fu+yL9K-1jW&(HK)2YnaTbY@rOc|_SvP=YR#IP&QGiq_Kf}5CE z@&Z3EZtn=UJ-dgI=zWtpXC zZqCp9b5Z!r@uc^E0=?LTbh#A*c*vTWaJaBpKJ@x@U^}C2A$)&X`*C^1ne#`4Fi zB7siad;D_xT{iRVYse6F$aph|v3>m-V#hoS>vwFnHuBJJLpNErV|UFl@2Yy#&~-j0 z*g^@6I2}7l8=ZHIONe)&pvXtNH%Eis7?$6k#aUP1eb{63E@Y9<>WCYaXas6KQ!S(m!CmXM%b<>2hH^3n3 z&-c<2nq-dJO<_H9`M#Ca*B2VrKb(C$%q*h1tX3djIe*=_RcBM0wE7S78-}uI&&!xo zLEnF8MEH<`Vo$a`>FpAK-bL;~qj348ws*OYIi7~TP8tk0q&7qG>vM!zNYJ2{%7vY5 z1Y%=1Z%TD2KwPcH$xg!pN^$2THKq@*byc8ulHVCfcpGkfo7Qv?VSJWAPsr0*_r-Q0 z5ZG}y_^?$5+8jLRFJVnJUxw0|iY$n&MgQsh&>&sj?@E@1dkMa{Y>kd!VZ(Uu{=+kvcEeNtBh zld$b@62O_D<>0)`jr9EDN1_EPk;{f^;S*L|^2;9CfQP3eX#&5qqi zzM5Vs^mi6ED4akxyPpI=*NPWL-u-J=d3&x~HTgftKsD2QV)ItMC+>m>uD8n$N=<=2mA&aXq<9%zbj*Dnw z92tUT<)`^f+2csMNkkE9hQzC z;c@`VAx(CubNC=y#q9EiPXi8+U-^AX4j8`|(Htq_>96wVGkarq?DjNTeQoc%K?^LX z-O%*4SFkA5gN(Aeh7KDo(E;QL+Ej$t%oygOxXTD|dwb2WGCg=DzZNah6W8uoY;4q4 zL4^5rCX#2X=9FeZ!%L}ZFoR0hHM`FtcFm56oogxV@sI>kKxS-MTE}E55%jy2`b~)M zj=_E-2)*Eicgp8A@(ZAHiaEjSmMk`}b)E{cQN?(_D(ZCM`V63yPit z^-yU}GP?zXS`hAa2w~#eN^^~$5~M~S;JSKB{qz2re{=={WZITXMcOa*)Y2;eV5Mq8 zP`*vSU}!rcsEY^Y?mzS`N$QuIiOLRPR}iGIxOcI}1@}nPnGi#jF|x4y=(D-Pf~dmP zwB>gVKjeJF05kK;BqMXzdK*IMBsrokRapdpfBMxUU`5W)GXo;N)HZSM;igRVyss(5 zjIjKu#JR~A-_Nr z8cTmcR1pF)Q=C}}JdIypw!YNC40GWCn1pm&ljQTb%1*!r`N3sT&X|-EIQ%BzKmZ$k z*YvC=gjVJ+p?xJiMm`6}RCRF!ySTeJ{!(SF0DED{z8b-DsnYvWrCq=od^vH6D--?R zRrcg0&JZF8qum*Ad9VSJ9~D+(%8AzjwIp>MbE+PPi7u9(0qxMoA|KR7&kuW0=i9Sk z7_)9o3c!d&IlH8l-AvCHJ|X{AL&G!U&O$VqE+gIb)1R+`0+s)W96CT0AP~|=>BPs9 z>Wy+>VmX3RXtoUBgW`u~m_+bsJ-NizC;FpmdKFKUZYy7^CCFl{Z3?L-j5c4{wrM1c z9(8bN* zem1s`ZD{!b8R~dY+((1oi~ho%&mx-}zSXutM>#|q{=7zy1&zLBz(Zh<8fQW%~e}Q!-qx~Evt?`I-Xj(`DOIk{H|w@yI~o+rjK_&ZAXj+?f;Zn z&r}{lG~<6kJn*KW@JG5SPH4hV17?Xlmw7yA0%N_6qvM#PodexjcA>QYzLQoBQtn?r zQs3Ob)#WDn80^CmpUXFd?Be+u@2G7{Ctmef>T#U@!~QRcD4pk(>9xPVV;xGI?M4uG z)vETDY;L&i8q&g!%r<DIO)dKiCDx$|B~~;4X=3uT^GHj{kz^2-BL`a=ek(O zodmyl)h-j4wU}IP&zVnI`#VZkaP1Bcy`Xw+#Yh)MEex1>*k<^_p*jXNHed1 zXg3+cOkzvKe;}8d{Cjhrha=VPc4b0CNDf_!IzW<#NBcE6mGy4>@#0Cp?o7H1zA>6p zf3i?IB6)vmb}%xK8AKHWB*i3_f7 zghjss)pyq`hQ5wKm#@Cl)L>sY&$G8Bjw)Si+U_*~(ASp`4u5R;6cerW{dSsJxZ7vV zG^GOmyy~dKPl-J^!(6u3>XtsJu)w5D3t1Ebu9q^cqt*r=tXF(Le;Wnupl#TpvJO(3NS-is|{(Wn| z^#SNV9h2Ycq`!?t%mU-ri^&N}o8v>h5l+40WSN5u+J~9q4>z}bt!A~=m@N9@smcHS z4R-T@9umP5woSpzkSO;Y_c)UG$`m_>-~v;Vb(}D%%}dLZ&Tv}1tydn!2!591$|8Rl zwl6&P6HcUq9+%Rsh7wJsBbc?vFRtk_FzE;tqiEKV|x4vH+14Cyu_jMQF>ICC*M}?JVR-rSkpgO^?u$7AtmixpH!U@ zs0H}TA~XMzMVUx@Qu_pl7p~;cCzo=3*v*4JLO!!7md;wZ6!_`aA;d?n{LzU*f4oGdRu!h{ z^pp;DD{W%pKT7m&st2pUe-++Wr1j0s&8h4OR_lL2`>Y-XEZEt>tX*a*#1FlcY;`yj z_2e<&9|0Nr98>dLN4#6`7)ofxst&lP?LF72qq^Q7g(qo2f|9EA(emQ}!}VGUXIC9MteBY?d^Z)r zw2VK7@{{1~%J*QR%0yn8>z{eJh=DvKKPl=c5Kp@ynosY3_E86tz-bSe!ultVDao)6 zy@q%1K=`-=>KA?F_%+_}N4|_2NG^P0W(@0RH6h2Y=atL)HeOE#>+n-UT-S(sGh2SrNT)}3 zav93aD=NCo`e3pAud^Ub4cqv*DH!bmzyQ0{Qqn$fgcMBFSvUUVf?hT!-mEb~w`b;n zh%g-WO9`)_$etE&&xm)u^piiskr_(DrFqT+wy7eb6NbPo2&yj|mXmbPk!Ez#@Lsej ztKTI^MO#~&nJ|B#GMWH!(4APi|1{U!C3?|?gVgZ|DUikg;Da7wpvyZ|4aIvnF+^~| zT~&jv(n>E~%k{Uv(f(i52}0=xDjsAoev?r?%JP|Od&)i#L7ujizL2yv1wrG*G%F1i@+hecOhZeRmQA9wt!o`gX#h0!v z6zNk2HgU2k!qk^jsy^XHaJ_!rM$vajfN@kL8)_5j^E(7gWy=l)%dw8i}6}oPaq6vY~`cRBR@}Cnr>vvp@ah#ruINEtcTRD6mjy`c(&wCdijW zgw&U_fDEw^!5kDL`>e-o~S>9}_wE5Q|UwBT>A>*>#o#;SZ{9HWUcjg^$x5$_`?B46PM;ZDVNza~S{Xc|;CV+0AxX%_|eQn%I zaUcGi`)TgjH!SuGC!W^EMi(_ShArvy0T(9x6zrLtx0Y9n-*CudL*s}hN5W%+*GQ0o z)J{}-x)R_u#Ut4KAIl^QSj<*MS%9o8K_I`GhLyvHx$;XkM-2G4?(W)=1H1MwR@%{? zyp|T&RhFeLN+x(12om9ET4zx5QmFE~IKNECSX8J!hQ##(IDHnvl!O~{mGQn5v_!T% z?xmZP8NOWg*UzEepl0s{ecVv7@!QQmX(=j_Sr)M-6aE;8W3|eG_kI8JLwK`1=!i>3 zldGCY#d|Q~O?G^(yRTAxVYJ;W!rewP6GcVz_P$FV)d;2lTOm4i54)qmf5vZ?7^}Y1 zZnm@YEE(!={c)ZyV?LQ;?+hwoZu4(_CzfY%l?#a8b|cCo3P3_*-COkSQz4Mx``Fw< zITHFtOK4Vnf2!f*C4$K0Z{sl2+(elLy63kNX1=>hH0s;Nk#d97`(ZyBzORY&kz$jM zylH~pYGS<{3zv#zC)G`r55Id29mvJkX5!9e*`_aez5RN>xSq~`e^gvJK#F)$({|MF zF>UIntNK4vkpUWVs2j$nCszh{`Eog|PE>gJkF3J@YXVSw20IFo3X(Q^Bm%-va)$V> zONBlW%MC{o_CK!(T2;wE%1N)~W-n0_1>2Mr7fs{}M{)l)=00{^A+ioyy4rAUQT>Rp z>54k;CRME8K|WK8#vwGnA)#5v04Eh@W0D0hU>PGP{hXnA`%ot)%AxJy+l08;KTFRZ z`xdH0pDd55CkQGgd;7QH2rdq#)1>@ff9z#G&|B7~T8tFJQqsTOaO!m8`u4AtN_vVe zDK%a7hlrHWn2%hVKKBYy6vnyt{WKXx3ac5z{524{r&H_dP=l9-4?e}h{e#;m_)PHx zYAkdLA|Icn`1??47$oG-mC>vO{#u$?`h+33i@dML58S3Y6Lsr&Nut8+0M5j84hxcn$#F+#Yiyd0NsOqFYF zndC!Cl_Y8Mdm__&UjadNqe59n+q|RkWer36-Pe=N?iXrAWiUck@C z?3>@{(|1Go9o}Ty8#aHt1#GdU2XMBdHVld;gtSc;52Z_8)vk!oa^IQrH3I$-IX964 z$lFX#`@`hWe#weN$o&w>E0d1No!Gp+>X*jFn^T)R@kE`lm1Rj@EYbK~c#`~9Km|~^ zbme5)7B^c$M{Qz23tX4tNxYDw29brWRt2i$Ywl8!X+Aa3A80Av12^!G9>s?gx$i9( z%=5*99%B~+o_~h(I^#fdXibr6XdjY-5&AL1J~mQH&Q0bk#06tQi5b@9htiU0qql#k z=!{XVij)@;>h>cM6q~@@1}JfOk2*VpApO++KSk$LFb9E8C|P_KRxHucBm3u=ILPs@ zxE12ldXv~ysab6Rr+Mr7Dl%qF02qB1^AU%C><2aNAcCb z>8Jj`=Mye7b-PkiQ}gYE`fxT%ABKR>RKXBFH>#vudkE1qGW{>N35TVY2oW%yv@rrr z#f>VLw$pCTYdd2yXca-i8GD-lB(^RFL@`o?$XPmu&z~&^7Ay7aS6+H9=i1lvXF9;N zy|Mty{imTc^?ahM{a{J$hUR7sr3gY^QLb~k%up)ehIaY`&>O7FxtX{tLq|i5fk+?6 z5#~mo&v-xH_3Jg{Qn=3TQtN(FJxMt)l23Av9s>!PN!hS|2DtVG_lCQQx8xsR&3RH$N!9@}**ypI7kPyxk^xk4XIlPrw6-h7{gS zhV_Y2XkNzrF+^u?iIN)s^_cuiv_+gx@vAp!;dsG3cr2uVp+muZ;ngLkQ~`a`15n(R z9sQ{`VEa8+w)K9yrrx{q`5(*smln#Up9$H;UN!5oG5@QrgBGj&(_nAc$&HnuhfPVq ztX^#w3BeyIz=5jWu?`HCY1`q`qG406;xO9e@}^}QK;g>{f>Ek5K2+sRw)M=FfLygB zw)YA(C4J>mv>V6gfZEoMH4oQkxj-_qNcBr%D`fLPU`Ss|6vUEUE4zY8bEIn=2a-58N@Vhtw2_;pE$vpHstUje&uz+iGRQwrGKUBQ(9DIqMN zHo=nqSLmCx;jD>|J9F;HxrT6JN7?RbdV6gz;WoL`2VJdSHT$iB-xyc6(m;y6@*yp5 zS69ihO=>W_!f+STCIpIX3K<5b5^9}W^q|NUuPBM+D+p<0-3Oqaz0K-sNBsRu>@s`N zo(|PEi7w+)jS2M!c$h!Y$_N+f?_brLIUtG<42ZQ3+l&GVqs);GfI5hh63DDWv-u8( zQl6LxrgL*NLS_0$rg(=(@7Jd(z1nUljZ$W#-uVQ0;MjSc*cd$Dv#T%*>%!7`-6cu; zM(7#&S;za~LXh@hHIg6!Ws-epw#fSX;YbbMyvz=c8U(TTy(J3ohAHf4_Tvx=r}tNv zPk-kRTCz(DDk{SDNhQ0?KEz7veTdvGLu$A*5@Mmr7wYR_|G2!tu)6-&EMerSH9r)M z%IS4IpI)c4p|6MKMa*nJOF+5!X;KU#Y{mWj?D%6*3HfP86`nZtq)yvBoliiFn_FD= z?81g=%83 zD=FYfu1#DjiA;Uwn`-K|HG_@f(bXNN&teJzpXBRMfV+cls++$ZNjO+6TO@qP9bFO5 zby@yA^)DQ}X{OZ(iKh}rIQ5B%aE44w<7tgxwY~MB%gXIRI*6vOQFP(SF|@+1e4m@qXiM;6MRO1mrMVe0cKWCF&0l$fBNhf&spfQ!Z}kj}nsf|mca z@02ri<8DKRC=>ZC-{*1q?~OGHBiKaj%(Q*|=PaSJ&bF*Oh)l+n*}U11b%m$Jdih5C4Lz6 zsq5XLdf;}M&U?RuvuEyx1`a5*3#nW?K6$=E)U=2tEPbIzq2?5=^N-UN#HiZ+KWO_3 z>M_-ZigNEJ#UVd4YbY>lxMhfqf~1Sulq3`^Vgh7oBgShbvB%34`u5Ri=5pWBag{=t z4iBX|BTOpFX-aFdAS>4x6DS9^c}>|@a-5>Q8`rDB@&YD@^}2SnK4nTjb(_Jjdf|dH z4Rr3l3~Q@1p1H-J+ccl<=AuiFNiOaDE0{N#q2axqX&?In=BR>xz;{WM59qC~<(P)* zfqZqni#6~9ARc5Hs&T9{B+si`13aU1R&_+s!|&vOe ziYS&$AIy$|kRKZaAuq21FQ;gqmh}jmnf@@?@-W`k+IeO9lL3VsnQ$rd7ZOM5j>R1% zg3RmCIFUO)XrD~vHn+O+@QZ>?Kc}^(iBr><9U*F5?I-rfnWl_#w_w1EGR^KT77GI& zPHqYe8KDEPd{&HorAZgILSW`oRlnnP|BT$5;82jXTegEF=7*xriErXwKW4@i7xO2x zt-sv(NZ91AOPe~vvNOGXrOpbn^kutIUl=7T2XBNlTa7mWtipHN^#VeIx|wf5#QxpU zsB^cp(b8wJ6E%M|sh-sw-0Y!+#@p^bsA{!b2`W!N&9AN5(F4zgU#2!YZ-yDCdaRTW z;S^o784HbLR7|@@cjZDSmp0Ar?Hy|-GXT8x$cEgZ(eRcemwM&anlS--XH%FAsbxNw7Ghga&qrGP#wy}6@ zf*M~6yaw1%$2fQ!R#l_UsGwQ_t+}*DIQPB#!H-`RX-C4Pe%L}TNp;VN%xGt+h)6mX zUyq;axoG}Ni=kn7th+NhbQJsd6k;fVAysR+_Z3a43N_1qnII1lXCZt}kay&}v}`Tm z0sImcce7<4I;;V5fp`~P$yU6%6}LRTZ4M|y9{-q@o|i-Kmd0Ll=&89h^pfF6(YhYq zeJ}FMjfbmraoDrUdJZ6y^$_|dcLP+jGe?9q{Wr>t6u1uhm*~*K6Ec<&MdveBw?q^@ zehkT~7V|6FuUK(?<8R`IFuLaz>t4kbs`3d|oTl3#K9VB5my=d04-;foF?GF>=o0_M zr=yB0iG?mlB7<&{RJ?$4-?dP3ln7-y?81SCqj%k{x$O~(NCs26KVPyQ{K^4D5qs`v z+6?QoSclz&mxytO2IW(})3@k?^KYSD(}Xm;+5I0WQzqT{lAHa!gx*bhxFwvjnfjX3 zL1*U5R2(9(UVf&jsUV^PLinepHq6(zI4< zBV6Fv)zL=D5t<|t4@-LKDSCI{W!qMOVCMFnz$ZXm&;*DF`giDahU#b(yk{Hcx3$~} zu>Ev?1m|7hq=$s3Vw|Fr&LJ{&%6DrFjqQ2rmZoW|V-t72$!?9-M`}~j=1M<3ra$C7 zVN&UxuXJU)8L_Ptu=~jO@HGTNX ztxPbKY&WKo47lqz#=D0?BMvJ%O6cC8i+yP$n4X$cHGQu#D%Hj@HU|{@7Pf(wi$(Y} z)-$J*<9|O;ATdE6zcrf?#;pC}yR{J^tR(4gTqey%Z^_g*VxSKnDokc-dvOO|&@BnD z()m&;z!W$9@h$NTgHz_65un~X_?_gy{5L+<9yijRt-hDZi~#+2|Df!4P0whlqNu#$ zv?BvKr>pTR_=K2-4^?%|Dh-d0@KfS@yWpd&E5w_2ckPc~9wADaG+0-6Ui)as zWZOyq-C^{FSct&m>2@p?h89xr0?Gai5g2b$e72wE5q{Yl&fw-3X=we2wV$NmV7b95 z=F`d_k1u4>#buz?ypwaE!@=R;Z_o0~kgMx#pjge>_-w7B-vWjFQ{T##hGDzBed83z zsazuxUcQLq?cdY_GS}+{w}Qg-;`~@DU7qQTS*BjOo}J*CAIQ~M#Qm=` z8wEbKQBeec3AT`jbgH|0%JyrYOqOFmV}TfF8QM2y%175=O6 z0P0EC*lEc}R<9rj*IB(LTv#a2;%c0}U=s%uK|?nb!?VJD;?Dn00poxkP13*3Iia$Z z{+FAZU_Jkep1agfUUqH|`G zc3J4Z?w~XdwVvpE0No|!DwUTI{oHCN7|R33J4X2!p?1M*npEb*KVgSkThs)Z!xo5X zSP^u!z-{rh(SAHx>3*p_1;yIvRt#9$8(Y|!oM8vwZ`^qOEZ*0kD3P$;$@M;4x{zGV z*@teGOtj+BpOKKjaK;xHpr0g9JMDIa529~d3w{4?016df_sH0bMYv+lkhPop?v{1I zt_#C`z}uD`+rS~Me?;nw62y}t?7T(a+)YT3f+m45&V?Q7_@TR&BmS;*e-C}pL7(59 zJPVRZmv+qm(Yt>RJ@3Y%K&=r|_$@ANZf{xiXEU^c^yHe^=I^P}ZpedZ# zlPQVIf_wKfM3_7_)5G|;#J9TLYe5&T!*6!VOxs($^EXzW#`tIcpj zS^Koq4CMUDtDeujP-d#>`4$dsLR@ykbOfCL3~@=ti>S-YWa}i^ADYs@3XofMM&m$7 zIM=Mfc&RsuB$FC&wD$9PV>KHWEpYg8$}O)tP=K3AZ_$cKy0&z?7o#$;1>sEPx-d zoPo9KLMAg*tM4r+to?&t?zO?3T$^`reL|H`bsga1y~^gRMuYPt{>6uz8K zI@7!)`0+wnP8{X&#Lg@Q5Ui{Z=xoumFRT^Lx0Cf9NQ5u;*C{DE(1edkxLme4)2zOG zdk&Ra501dpt41;|t6F>}0&Kd$b-z43F?dtoNT)q1!h`;N*9+T^!B%(Gmi4^S-h6p3 z+JCS75@>(k*5r0JRN>YYbmHCpv^Kz{)*c6XQ1zcWmek(g!$j&o4_Z8>vAa!v4ON+a zSt&qH?8dM|Z#9Vg3w9(NcpW3&?7D7%in!ouqk|rfg+`i2)nzAK4(3bZm!Ny zb&CuFpmic{j8VO1RqL^?_PyIxbDf{}{JDYSuv_pS1Kw70O8lG-Sfnt>@T*<-OXt12 zC9Ee?pRdWy8(a{6&ylf#4%y#-`Utu+4}O?HmTVpiaoJL<(sb&HF!vORe~lqzY|eYB zzHK58ab+Bq76CCGM{9=&_-2+qhTz`mJ3?Q0B#U>>;8_iAYJ(AKw;M;2XT-H}xM)37 zLzUoCU9~*7ZhHB7qC6oX!P)f#+PCvBX!i=?r^4-7AA^0EA<4c;9z&BA5(^Gtth{{( zS3+-3ocyXgrw!N4JY7V z$KRlKw(PG=NN;xNJt(vLUtSQ%w{bCpO3H+9UkbaQyxfN#82^qwFlP9pNG64mt!n?U zK9mCqOL*+ww2x&32d2{T@Sl?Tnz5(_Ik z&V3lYisV%JljVnz*IwwRn${bI(cH<@%Ee^vNpr|NK|#cW*DL&xWfLaL&&TWEAN=jS z^6tz8-1}e4v5d+@Mbr6QOhGk*+Oj%*V^k3v$)}GtwS~qc?ygsPdSBSbPXDe7?W)~N z%E8=IkgbdA+FfuQ{jTN@_05@UXE=NJObD^822={hTQ35&Eygt-<8kry`G$ha;2Al92~Za zslSvWk6Zu9afcHC_2^qjfz_QAL%D@~=(3&C^x?k>ddquhnk$qVyoDp znaKKuE$=?E%zt)-!x))%u5#Z%My} z6aR{Z@gJ$MNp%K@z*tCv;FVNwbSzi*(dC^2^>uK_&~S7UJ-s<9P{oU~aj1m^V9uMQ z)WI?YoE^F&xwV^%`00CT;r7}ZN~_{J=aNnDTBXE}WojQ{u? z6fif7dc_MXCijmPAwlqcpqjdss7vgGNSGE%MF~Ce}-EGdsbq)(eb6vNvxEZZk;XJD&>=4{@3K)?I|(Hv7j2 z<}_#OzwMF+@yI6MqcSO5o4iLR_)3%nyFR*y(rRNIw?wzsG`ZIHUozrGJ9g}gZ2bq}AputDKLY3KCm z+%Nu@`upFQt0}kwpR7zU52v3&H13lb`aHo9Pzj&B5<tm8Y7HDxyHZYwYB3;w^sn9WF;9E-O7MDI&nyKQ7i3?)D2YVTD$fXw@a)@$4#? zGBc$r6NOE>_v|w&#N$QAH2*-LcaKd!sPN@vT8esana&K&VKb1;NA(=nMEpQyCQPl# zvmo@nwfm0@|Al_QnFP;B1iL3k>PFXo~YHYv`f-uGP~jSG7XnoAkm@Q z7baSM8btwUkmzCVKK=bn$1#yXurc*3tZyCFt$76`!qVPm8C;nw52bh43H( zz^&Ruti)F@YU9|9I+PtKl2RanTn4h~x+9;<3G4o_u3pRy@G7d3+!rW&fDgVHkoC_I zf9XGT_mdcbS39vOVNlhl>RwFCTyl?9Ckua%Q)j4Y{`lk*2OF6FHs*x5}-{9EMr zHg5=F?#f_6l1d!Epc8~|WJ}6b^*riGn4oWd%uQJGl*3W@-0Q?>K zH)A1YkAJ_XS_{2GXCV5@t=09Jj*WP5skF*T%m_s?cVY!=K{ILTLL3!R(U{5G9Qh4y zfgf5vx$Zu6`!ikjR^HmsG7|LMGV9Q!X)c9*i`eJMAY4lt`PJmx3Q}Cy1Jb|VLbUoT z({gS^@;Q5b0@3ffTsO5fQ#*;4JwcBNZ7=%XjewS6+b~x1tSUu1%i1DeoqSyU>VRf)}Eg{8ft~g&Wm0yRtu8 zDqRkg$YaFxs54ovMTh#ZSEX`5+NjnXB^$=?nNX1Yt>{(Gsx^MqCx)dGDJ&1*oZ?Px zwN!)}YQJb3K6@?Pj1q$5WcVn{}f#EMKL&OEo26 zN&(*v&*0=c>!xe<<|-g{Wg@Ire!6;m??KZqFJCX95|SA!xf!*BqLCNNUEMrkLnY#l` zQjYHjc%H1Q9J}yQfs*$zx(#yeyLMNRP0VWds?V0gGWH7z$JW&u@r;{_t_8Nu_z`;n zba&-AelK>J6Xm0WT6^U=kT=2q`*9RlTR011+36h$d6N6&yoUE7Edunx!Q}_M&dpwK z<%fE6agB|>Puc}!nm>K7?doGGfKy?ovg^;Jko64%=6GnB|vH&BYb5bgxCtFa>8!d$!sA=XDe)UFUC70%-r;dw!xk&7ACw zh=>P#aCiCM1FqS=vEJ0$sPV^|(>42tzhk=pSJ+pFMfr3M0}>*giW1V&-6@U4N{h6l zfFQ6mODi2p$*z27!TU3}i}x}NX(zV~|Xzh>s1IWuR@w1f?+z_>#d`PcE^fl@AYST7Z%K;zwea>!;kw_-4yos0hMnV7sF|ktk8WK zEdIaVcTU|ZP%2|wqe8>ZkeEibVleAd`Fj70T&C9HQ%FbjZvOMas=c zn_WAXWYM6z{Fz*Jk#HY4*89F)A7$?|8=DMC#}_p~x9Mkqs|R+c(#bNdt%133rIlVb zFNoc384~f$yMDf~PQBHo=)15k_+%8%wmKocRPH60bO2kCI3facnh`BgXM9udxfL_azGe z>9{`C%~nt8{zQl*6yiT z+itQyZsg`p%O1SE($crpZZDrZ`IZZ(Bn_kC5AsnY(584NEvpegZtk-M)X|yR7RfZt z=8>}oR)!&+l}KuxDtf;q*;n6P}C&4=>}ZPm*S=jZ;6_o04u<>sQjUgY0e z=lD5d?wF){o8o=fMs&<+_Z>+;XAh!{e)1egVW}U4+pcJgXvr#VtinCD5nqWy=3Mc4 z+-?O#55~s0vg4Y>3G8L>7Ydk;j^wE5B$STX7inZER=1E6vN`l0px0AUjIw+6_=O!) zLXKLO5V8eM=Yx?RtDfS1av|J++$9W(+q&s;>YImzPBHZzq6F~_!Cj+Hv8cuzUwQ(b zEub2rgjs!lX|nxoLp_Imy)dy${O-$mt z!MR^ZO+q|0H-lvNlMG61r@IHxjb+n*W+hD0r(V&qYv80#l{(=y*`qGT7tt{~(1hz1 z=&<(cB8l%NrJ-{H4GwnTuW{1h`YJzImOuEbu5{!}vN%K_JlWXZobFVPfMB67a#7}| zur#H&-qKOrogY2%`P_#Q?Kr@9hZ9Pdud8qOi91$_X*wVDQ^V7w1~}gHjOLoAjEO=| z1BY$D3~+p{o2{5gAHn4}a4&OKe=JqR^g!S%9Eh|gSoesW_P|Gt_l+JcsmCQ@}e<&eZM8f~lGQZGj<^9L9=M3)rmRmn0)xr;Z zH=$_Y&Izvbi4w-Hq_oDMB$Q|_0$yeR)vujK4l26ID_5cE< zI!;DLt#4+@v+OU%us#!ZwYagT)7deAUjiFT&8Ri6z z;Q3<+qiK|3(xfsSEy&wDy8+>x|OZuOUkkkD1$zJb2S1Rh7)s zP5hP0q4SP4&oaKSPSh=v5m-4_P_<@b{G9p=Ji2_YYT+}#5%->QW99a7O2KPIF=2;M z6BdpB?-m!6iJGMV(@cN6I6uF7>&FzsxVh9Ki#L&1VS`M4-4St$i}o6eqpB>Ka~aS| zSnB~KDk+9pj-yX>kiTzuI9sm~A8Iylil`4)hFeS^tpdNdyAeES%Zs`;*>Y_QTedZC=1iIG=tRDE5&{ zG8|E(d|=SUBuS78~}6EG9hYD_!5m z=XrFu<*oO`A_m=$aPDZ{>>F(ib*^nC>{@Jx*If2olWcHfZP6ah0nmEWTMkQAR;`4& zh{^W$!m8E3UPH_%PKR{CiJ#QGk5jox*uIL}3$1O&X}!dwvURPI)Ys5@`f)egajB47 zc_*+-WbiPAwf&qQ2gAdeDKCal&K>|u;I%5&C^bwUc7MN4w?UWKo7ldF^;7 z8IYxQF6k$YCr_GTUeEy%DHzV?{d+hB_W~ZM5E-nKHO2-UgYR_g>#5T|%aA ztq}NNzJwq(91b?7SgorSzR29Mo97dxuAPs#V@36~Y65#QwA-#k;o4}!5IIQx^*d&8u*8&$?%{@aO zPWULU*|g<_OH(c5J}Mlegnvq(+VO(jZ&PFmD4K)y)6#7t3t33jl9+*aU*C~ ze;voc-cn2Bo2hkHUfp4eNG0+6<1jx3*0b4(N%xl*$V?ykYioqn$394Vm!I~TBVs^X z#YKBFguHbThh?3#jOc)dgZ%3c2k=G1*E+?n5-FrAOE!HB zO2xVv5$}y;8Burv>vbn-W5K$9uuBgm`D*c!Yr_1&_^dj2?Z|?!^9XY1+O!`6@GL70 zuCt$q<_>H8y%%@BqEcW@6HG0j6jl$gCy(@q%rDGZe`XX-!YapIh?D1+cgKPTN#cgz zo=Ye4*fCA{E3UAePGZ7&pnQF4dl2_K3dI+&odto{Z+WC<+kJPY(zMjXh*jlzJ|w8M zRs0^j;^NN1<3L%=>#L3|krrzk+;)7qwC41@kC>MrGgUxLs(uMORr}`_A>?!2ylh;? z`&7a)#FDe{;v`%J5!Og82hki4R{5=gyKnexK0w^uU1w$k=-fPoUy1vkMnvpai~Z*Q znzr8wU2gMEPH`b@(W$Tex*sOznw+8Tpk3A+d&LR<=Uf`&PE>uIBwe~;zI68F8=D101G%KkA5D?3=wylGnm^~AxI z0S~tQb`cS2mS%o0BWZkUIhjPDEjL?(7Oen3i)Zw!qJAt&tCU=E1He3dS=mGJ&sUWA z9~g9y5C1AZbYi_j8Uaxi13fgfipm+BC1@I6Q)YO+4Y3|tn<|+0)dY*Y zX}b|bo`Mq{`B?9LBN57!)u*=ZY&dV6)C^YsToATE+vg`1^~HSnqO7sTTfWZVou-K2 zi5x!yWgb^nig)xkK(-VEn{T!a&U&Js9-N#Vk=x8^eqD|O6=%{*XJ4!bM4Tte2;5%X zYy@B#|GY`D?LdC#H0Th_;I{hb`w^$!1!;?Z9+!;1gEHfZa6pBZbK#SRlR@MhygXwP zlxLK*s<Aj6!7fKTEH2O*rT)3yo@z4}G%o_(RH`yNiCg zlWn(7pHIW?m-pL8oPhv8Xo~1gP)pI^uftrdHd*oQsG++9dYaWgTP0=u4bSa4czfDv zGUUv}|K_VLH9o5zgCnq+;dTWFrv>gB*al+NMU@-V)n4a;l<33ENe%gI*DYSc5 zi_r=f*mEV!9KY(pHUE*OcuY45Em17SGOf{H9 z#^=|Kg))XyPJ|T~ssFT!jFaO5L#%>bzi*?gGtO>0`uaMnrin*RtAzMJ|e@3W~ zkRO>=1&BYp{iv!MUL)16KRDH*)q@3Gp|1ebyhda;7XgV&OJVC8&~D`EpI2CM&j>6E=WWvt zevC@cvHjyz59lNB&{ruC`rZ(y!nTn5`M^9+4h5NyI^073HXX5x`o%v5yapS?61Osc z8HaT)hfRQWP41vD6#33gk2YX>Pv9Bg_!>)d6 zg!m0<+L9|~aWQ2HO<-7pFCL9+fQjCQ;ANv|V%A01G^io>B@reC(u);eo@N%3Qt)|Y zJ=gtBFB9)la~i^K+0Q^>DDy4hEUDwkyFEDBS6F-Sx*%UyJF$%Pd2f5{$%^g#>RUSU z1^XqYpWa{BxxkH1p76;e4E7~(zn3)cQce=Hm*ja0)a<=E>M6(B3G(kSA?GP-?x{6= z_}nT%R6e_?UURyVnEQe8!?5H9U!0=(Uel#AgGj&0#3#kOr^Mz=?bDKwmtc~Thp)C3 z!+cZtOy|I&jG9e_Cz!Dji9fH5Cz7U0Q>%zpGW7U)Q@+Hx#*G#wxGKKhuomfwzSLh)%amtJDd7;0T|Ss>lxsK7ApKO0zte~ zyVpZv0)f|S#U({6KtJZyoy>m8eAXkz8P;d>1V8G>uY6uuL}*`unMV;+0IIWwI6Gdi zgaWIdU!x}$UY^XGn~h&jd|{uR-VD}RtJ~R0{;Ai-f0{Zs5Ba#c-YO;rC1O`HdAx8!rNj8j?Z2^{FaiOtlwbm+t-gih$0HpdCPIVx3D?(?p+&S+u+5f&Fq1YR}vO) zB}nAi2+}l2Z>HCww%n~Za~*k(9)gDKSebL~I6-_?DnI266=#Hmn$%daX4>4l=C%>n ze|>BvAp_oi)ba;1??1P%Favtgu_8r7A?@T}XlH#k`>62bq*9?poOx#XPcL_3b`6=# zqCXEqfHeJG^iNO9{5z-$Aq3Q;7Ai5gd%uxZ2NFyla<~r(-ETNvphI zXZ&RFgk|B`ZwhN$ktBX0^Cw? zx^0^ml`J^QDP?LZzf~o-!kc`6n#%`-&1OA9PMNfe1eW-}MjLjo{BCfo{Lr}H)d3sK z%OQ}(pk`HB2~}E*8r(64+jm0X$f^-QUBhKcp z-qg;f!-*%%7MCuTf6dH zlJY#HGj-{)$aMC@!~_!pv6Q+>I%Nk}6oJfmo#z4`KaRhu;Eev+;%07S7L%E|v71Cz z6auNBOfCpDKCwYS+y{IVrK@J6{Ml4ICxb9&vp@lu4muzo+Q$0kcW;TSGIu@;vOq86 zhs>~?TciBM+A`+F03g#pk@A`TgZJ|CV!$w-Y#3wrU9wN0x{o32)eW1VIKRQ4jC^pI1#%?J7@EKN2aX8eJG6|CM#>aw;Ey&6`aNO!T)!)iV;=9UFQ{=0i3lOpV z#fWU)zwx9c0ODO6s4fK^AEyIqqDMbnS4~VYPUpDOt6U$#B;Vp-K_CmVL9%vq&SZuL4*UH0q&a#oIdpq2SfSy;2hEJwH z%ETj#BlMM(n33z6q6%TcG_VNrQ#0CY=8Hk>M7o88jpyN@&g$->&Z3@TgkYoer)i?a zL83OhJFcQRlCiXf z$9U|9e%tOuNUvQSIb5hN?Jlk&C_q;2oJI;|*YN;~3rJNz;L}z^8X+n@r8M`a$&U@z zl)>D{BFg`)>2K9|x9$I58bExD<{lYJH@TGg_$HvGxo*3f_YA!KxH?0Mw^t%qAu~1%~i~@%D3R4NJAV*i>xvZ>QkqV3(2GJaI^T0_b+0e`U;BKy&|tL%q?zmn48;#=(Bt>iTL` IDz=gT1;rL0nE(I) literal 0 HcmV?d00001 diff --git a/docs/images/base-2.png b/docs/images/base-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5be0f3fd2a491335ea3fcd854b88e399896d38a2 GIT binary patch literal 101185 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

-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 literal 0 HcmV?d00001 diff --git a/docs/images/base-3.png b/docs/images/base-3.png new file mode 100644 index 0000000000000000000000000000000000000000..442afcbcb98ca07b0fe7cb00d4a60ff060ae5373 GIT binary patch literal 90443 zcma&M1yEbx_9%?I6(|&UFYXS-i+gc*hhV{_xKrGM6fICFQoMM90s%^KhZ5XUBouhz zcklhbZ{EE7&C6saXYaF@ue0nVUQ0s>7mFMV0RaJ5MOj`40Rb6;fPgfCfeha<<9i2# z|BwL`-T`zy>;e8(-gXGGwjS1Yv?^{^4t6?rRn$4b^uyyI|nCsN&2&{K6+XwTSKT1P)LaPH7y?xFCRA#{42!CDpeyAQ*E zFv#2a*myg60-QYDX`eA#S$p^bB?$lyZ_Da{}r*1UZAHPw~n2Uhp)E{+;H{`&!jxXy03P0Y9v-g$ z(V~{42f)L}(ZiEgPFIMQRo%+Q$^ChQ?H>qrbukrpAAps+jh%|TBt0Almy?sN7@sJw z!W%hW5m5m-xZV|n-tfr^iwGzx2=EK>2nxU9{SU0XhmEhBojc$^u(tmjR`kEZK0AY( zC!Dgpowt*povos`ha2rbLW?>5cV2}4E53ij+WvQ5g#RlnH=G&nXVdcJ6S0_l7ℜ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⋘q~|D^}-Eo`FoT0PrZn4Q~Jan)1}+UiTg=^aPhm+ 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

3DE7v} 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 CItkMN literal 0 HcmV?d00001 diff --git a/docs/images/base-4.png b/docs/images/base-4.png new file mode 100644 index 0000000000000000000000000000000000000000..d809a0b0d3ecf2dd0aefa26c23fb2521b4072deb GIT binary patch literal 110924 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 W;Ayg6{eF!G{8W{+UR5Z34E#T67TI3_ literal 0 HcmV?d00001 diff --git a/docs/images/bulk-1.png b/docs/images/bulk-1.png new file mode 100644 index 0000000000000000000000000000000000000000..97c9d64cb00708fe0b8a9d71d3073fd662fd75ea GIT binary patch literal 41381 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 V+5A2F&p$P}uW6uBu4eb-KL9)VwZQ-Y literal 0 HcmV?d00001 diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..43b8278 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.11 diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000..1cd9e59 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1,5 @@ +resolvers += Resolver.sonatypeRepo("releases") + +addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "2.1.0") +addSbtPlugin("net.ground5hark.sbt" % "sbt-concat" % "0.1.8") +addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.8.0") \ No newline at end of file diff --git a/project/sbt-updates.sbt b/project/sbt-updates.sbt new file mode 100644 index 0000000..b26bdc4 --- /dev/null +++ b/project/sbt-updates.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.10") \ No newline at end of file diff --git a/scalastyle-config.xml b/scalastyle-config.xml new file mode 100644 index 0000000..9a8a9f2 --- /dev/null +++ b/scalastyle-config.xml @@ -0,0 +1,107 @@ + + Scalastyle standard configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/application.conf b/src/main/resources/application.conf new file mode 100644 index 0000000..c4373ab --- /dev/null +++ b/src/main/resources/application.conf @@ -0,0 +1,7 @@ +akka { + log-dead-letters-during-shutdown = off +} + +spray.servlet { + boot-class = "org.danielholmes.coc.baseanalyser.web.WebAppServlet" +} \ No newline at end of file diff --git a/src/main/resources/examples/th5-sample-1.json b/src/main/resources/examples/th5-sample-1.json new file mode 100644 index 0000000..399699f --- /dev/null +++ b/src/main/resources/examples/th5-sample-1.json @@ -0,0 +1 @@ +{"wave_num":6,"exp_ver":1,"active_layout":0,"layout_state":[0,0,0,0,0,0],"buildings":[{"data":1000001,"id":500000000,"lvl":5,"x":30,"y":30,"l1x":25,"l1y":19,"l2x":13,"l2y":26,"l3x":29,"l3y":20,"l4x":29,"l4y":20,"l5x":13,"l5y":26},{"data":1000004,"id":500000001,"lvl":11,"x":22,"y":33,"res_time":87169,"l1x":11,"l1y":31,"l2x":24,"l2y":40,"l3x":41,"l3y":33,"l4x":41,"l4y":33,"l5x":24,"l5y":40},{"data":1000000,"id":500000002,"lvl":5,"x":35,"y":15,"units":[[4000008,2]],"l1x":29,"l1y":39,"l2x":38,"l2y":14,"l3x":40,"l3y":19,"l4x":40,"l4y":19,"l5x":38,"l5y":14},{"data":1000015,"id":500000003,"lvl":0,"x":41,"y":41,"l1x":14,"l1y":39,"l2x":9,"l2y":33,"l3x":36,"l3y":12,"l4x":36,"l4y":12,"l5x":41,"l5y":34},{"data":1000014,"id":500000004,"lvl":3,"x":27,"y":27,"l1x":25,"l1y":24,"l2x":23,"l2y":23,"l3x":25,"l3y":25,"l4x":25,"l4y":25,"l5x":23,"l5y":23},{"data":1000008,"id":500000005,"lvl":9,"x":37,"y":37,"l1x":36,"l1y":25,"l2x":33,"l2y":37,"l3x":34,"l3y":39,"l4x":34,"l4y":39,"l5x":33,"l5y":37},{"data":1000015,"id":500000006,"lvl":0,"x":38,"y":41,"l1x":16,"l1y":39,"l2x":37,"l2y":12,"l3x":32,"l3y":9,"l4x":32,"l4y":9,"l5x":37,"l5y":12},{"data":1000002,"id":500000007,"lvl":11,"x":37,"y":22,"res_time":87173,"l1x":21,"l1y":9,"l2x":41,"l2y":24,"l3x":8,"l3y":20,"l4x":8,"l4y":20,"l5x":41,"l5y":24},{"data":1000003,"id":500000008,"lvl":10,"x":39,"y":30,"l1x":16,"l1y":20,"l2x":26,"l2y":15,"l3x":29,"l3y":34,"l4x":29,"l4y":33,"l5x":26,"l5y":15},{"data":1000005,"id":500000009,"lvl":10,"x":30,"y":39,"l1x":24,"l1y":33,"l2x":27,"l2y":33,"l3x":16,"l3y":32,"l4x":16,"l4y":32,"l5x":27,"l5y":33},{"data":1000006,"id":500000010,"lvl":9,"x":8,"y":27,"unit_prod":{"unit_type":0},"l1x":40,"l1y":27,"l2x":21,"l2y":39,"l3x":30,"l3y":39,"l4x":30,"l4y":39,"l5x":21,"l5y":39},{"data":1000004,"id":500000011,"lvl":11,"x":33,"y":22,"res_time":65399,"l1x":18,"l1y":8,"l2x":36,"l2y":24,"l3x":42,"l3y":25,"l4x":42,"l4y":25,"l5x":36,"l5y":24},{"data":1000006,"id":500000012,"lvl":9,"x":21,"y":10,"unit_prod":{"unit_type":0},"l1x":39,"l1y":36,"l2x":18,"l2y":39,"l3x":7,"l3y":28,"l4x":7,"l4y":28,"l5x":18,"l5y":39},{"data":1000002,"id":500000013,"lvl":11,"x":31,"y":14,"res_time":61037,"l1x":34,"l1y":11,"l2x":41,"l2y":19,"l3x":8,"l3y":17,"l4x":8,"l4y":17,"l5x":41,"l5y":19},{"data":1000009,"id":500000014,"lvl":9,"x":24,"y":30,"l1x":15,"l1y":16,"l2x":12,"l2y":15,"l3x":24,"l3y":35,"l4x":24,"l4y":35,"l5x":12,"l5y":15},{"data":1000008,"id":500000015,"lvl":9,"x":10,"y":32,"l1x":30,"l1y":26,"l2x":9,"l2y":22,"l3x":38,"l3y":25,"l4x":38,"l4y":25,"l5x":9,"l5y":22},{"data":1000000,"id":500000016,"lvl":5,"x":15,"y":35,"units":[[4000008,2]],"l1x":24,"l1y":8,"l2x":32,"l2y":9,"l3x":20,"l3y":5,"l4x":20,"l4y":5,"l5x":32,"l5y":9},{"data":1000002,"id":500000017,"lvl":11,"x":10,"y":17,"res_time":87181,"l1x":37,"l1y":15,"l2x":40,"l2y":35,"l3x":14,"l3y":22,"l4x":14,"l4y":22,"l5x":9,"l5y":34},{"data":1000004,"id":500000018,"lvl":11,"x":14,"y":31,"res_time":61057,"l1x":40,"l1y":24,"l2x":15,"l2y":11,"l3x":40,"l3y":29,"l4x":40,"l4y":29,"l5x":15,"l5y":11},{"data":1000003,"id":500000019,"lvl":10,"x":39,"y":33,"l1x":35,"l1y":22,"l2x":19,"l2y":14,"l3x":22,"l3y":14,"l4x":22,"l4y":14,"l5x":20,"l5y":14},{"data":1000005,"id":500000020,"lvl":10,"x":33,"y":39,"l1x":19,"l1y":16,"l2x":30,"l2y":19,"l3x":18,"l3y":23,"l4x":18,"l4y":23,"l5x":30,"l5y":18},{"data":1000010,"id":500000021,"lvl":7,"x":40,"y":37,"l1x":24,"l1y":39,"l2x":23,"l2y":35,"l3x":36,"l3y":35,"l4x":36,"l4y":35,"l5x":24,"l5y":34},{"data":1000010,"id":500000022,"lvl":7,"x":42,"y":35,"l1x":25,"l1y":39,"l2x":23,"l2y":33,"l3x":15,"l3y":16,"l4x":15,"l4y":16,"l5x":24,"l5y":33},{"data":1000010,"id":500000023,"lvl":7,"x":42,"y":36,"l1x":26,"l1y":39,"l2x":24,"l2y":32,"l3x":15,"l3y":15,"l4x":15,"l4y":15,"l5x":24,"l5y":32},{"data":1000010,"id":500000024,"lvl":7,"x":41,"y":36,"l1x":27,"l1y":39,"l2x":15,"l2y":19,"l3x":15,"l3y":14,"l4x":15,"l4y":14,"l5x":13,"l5y":20}],"decos":[],"respawnVars":{"secondsFromLastRespawn":231386,"respawnSeed":1914935487,"obstacleClearCounter":5,"time_to_gembox_drop":196966,"time_in_gembox_period":228665},"cooldowns":[],"newShopBuildings":[4,0,6,3,6,3,4,1,5,5,225,3,3,4,1,5,0,0,0,3,1,0,1,2,1,0,2,0,1,1,0,0],"newShopTraps":[6,6,3,0,0,4,2,0,2],"newShopDecos":[1,4,0,1,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"last_league_rank":9,"last_alliance_level":7,"last_league_shuffle":1,"last_season_seen":0,"last_news_seen":221,"troop_req_msg":"max hogs and max poison","war_req_msg":"2 witches, 1 barb","war_tutorials_seen":0,"war_base":false,"account_flags":14,"bool_layout_edit_shown_erase":true} \ No newline at end of file diff --git a/src/main/resources/examples/th8-sample-1.json b/src/main/resources/examples/th8-sample-1.json new file mode 100644 index 0000000..273bd4f --- /dev/null +++ b/src/main/resources/examples/th8-sample-1.json @@ -0,0 +1,18 @@ +{"wave_num":6,"exp_ver":1,"active_layout":0,"war_layout":1,"layout_state":[0,0,0,0,0,0],"buildings":[{"data":1000001,"id":500000000,"lvl":7,"x":30,"y":30,"l1x":25,"l1y":19,"l2x":13,"l2y":26,"l3x":29,"l3y":20,"l4x":29,"l4y":20,"l5x":13,"l5y":26},{"data":1000004,"id":500000001,"lvl":11,"x":22,"y":33,"res_time":87169,"l1x":11,"l1y":31,"l2x":24,"l2y":40,"l3x":41,"l3y":33,"l4x":41,"l4y":33,"l5x":24,"l5y":40},{"data":1000000,"id":500000002,"lvl":5,"x":35,"y":15,"units":[[4000008,2]],"l1x":29,"l1y":39,"l2x":38,"l2y":14,"l3x":40,"l3y":19,"l4x":40,"l4y":19,"l5x":38,"l5y":14},{"data":1000015,"id":500000003,"lvl":0,"x":41,"y":41,"l1x":14,"l1y":39,"l2x":9,"l2y":33,"l3x":36,"l3y":12,"l4x":36,"l4y":12,"l5x":41,"l5y":34},{"data":1000014,"id":500000004,"lvl":3,"x":27,"y":27,"l1x":25,"l1y":24,"l2x":23,"l2y":23,"l3x":25,"l3y":25,"l4x":25,"l4y":25,"l5x":23,"l5y":23},{"data":1000008,"id":500000005,"lvl":9,"x":37,"y":37,"l1x":36,"l1y":25,"l2x":33,"l2y":37,"l3x":34,"l3y":39,"l4x":34,"l4y":39,"l5x":33,"l5y":37},{"data":1000015,"id":500000006,"lvl":0,"x":38,"y":41,"l1x":16,"l1y":39,"l2x":37,"l2y":12,"l3x":32,"l3y":9,"l4x":32,"l4y":9,"l5x":37,"l5y":12},{"data":1000002,"id":500000007,"lvl":11,"x":37,"y":22,"res_time":87173,"l1x":21,"l1y":9,"l2x":41,"l2y":24,"l3x":8,"l3y":20,"l4x":8,"l4y":20,"l5x":41,"l5y":24},{"data":1000003,"id":500000008,"lvl":10,"x":39,"y":30,"l1x":16,"l1y":20,"l2x":26,"l2y":15,"l3x":29,"l3y":34,"l4x":29,"l4y":33,"l5x":26,"l5y":15},{"data":1000005,"id":500000009,"lvl":10,"x":30,"y":39,"l1x":24,"l1y":33,"l2x":27,"l2y":33,"l3x":16,"l3y":32,"l4x":16,"l4y":32,"l5x":27,"l5y":33},{"data":1000006,"id":500000010,"lvl":9,"x":8,"y":27,"unit_prod":{"unit_type":0},"l1x":40,"l1y":27,"l2x":21,"l2y":39,"l3x":30,"l3y":39,"l4x":30,"l4y":39,"l5x":21,"l5y":39},{"data":1000004,"id":500000011,"lvl":11,"x":33,"y":22,"res_time":65399,"l1x":18,"l1y":8,"l2x":36,"l2y":24,"l3x":42,"l3y":25,"l4x":42,"l4y":25,"l5x":36,"l5y":24},{"data":1000006,"id":500000012,"lvl":9,"x":21,"y":10,"unit_prod":{"unit_type":0},"l1x":39,"l1y":36,"l2x":18,"l2y":39,"l3x":7,"l3y":28,"l4x":7,"l4y":28,"l5x":18,"l5y":39},{"data":1000002,"id":500000013,"lvl":11,"x":31,"y":14,"res_time":61037,"l1x":34,"l1y":11,"l2x":41,"l2y":19,"l3x":8,"l3y":17,"l4x":8,"l4y":17,"l5x":41,"l5y":19},{"data":1000009,"id":500000014,"lvl":9,"x":24,"y":30,"l1x":15,"l1y":16,"l2x":12,"l2y":15,"l3x":24,"l3y":35,"l4x":24,"l4y":35,"l5x":12,"l5y":15},{"data":1000008,"id":500000015,"lvl":9,"x":10,"y":32,"l1x":30,"l1y":26,"l2x":9,"l2y":22,"l3x":38,"l3y":25,"l4x":38,"l4y":25,"l5x":9,"l5y":22},{"data":1000000,"id":500000016,"lvl":5,"x":15,"y":35,"units":[[4000008,2]],"l1x":24,"l1y":8,"l2x":32,"l2y":9,"l3x":20,"l3y":5,"l4x":20,"l4y":5,"l5x":32,"l5y":9},{"data":1000002,"id":500000017,"lvl":11,"x":10,"y":17,"res_time":87181,"l1x":37,"l1y":15,"l2x":40,"l2y":35,"l3x":14,"l3y":22,"l4x":14,"l4y":22,"l5x":9,"l5y":34},{"data":1000004,"id":500000018,"lvl":11,"x":14,"y":31,"res_time":61057,"l1x":40,"l1y":24,"l2x":15,"l2y":11,"l3x":40,"l3y":29,"l4x":40,"l4y":29,"l5x":15,"l5y":11},{"data":1000003,"id":500000019,"lvl":10,"x":39,"y":33,"l1x":35,"l1y":22,"l2x":19,"l2y":14,"l3x":22,"l3y":14,"l4x":22,"l4y":14,"l5x":20,"l5y":14},{"data":1000005,"id":500000020,"lvl":10,"x":33,"y":39,"l1x":19,"l1y":16,"l2x":30,"l2y":19,"l3x":18,"l3y":23,"l4x":18,"l4y":23,"l5x":30,"l5y":18},{"data":1000010,"id":500000021,"lvl":7,"x":40,"y":37,"l1x":24,"l1y":39,"l2x":23,"l2y":35,"l3x":36,"l3y":35,"l4x":36,"l4y":35,"l5x":24,"l5y":34},{"data":1000010,"id":500000022,"lvl":7,"x":42,"y":35,"l1x":25,"l1y":39,"l2x":23,"l2y":33,"l3x":15,"l3y":16,"l4x":15,"l4y":16,"l5x":24,"l5y":33},{"data":1000010,"id":500000023,"lvl":7,"x":42,"y":36,"l1x":26,"l1y":39,"l2x":24,"l2y":32,"l3x":15,"l3y":15,"l4x":15,"l4y":15,"l5x":24,"l5y":32},{"data":1000010,"id":500000024,"lvl":7,"x":41,"y":36,"l1x":27,"l1y":39,"l2x":15,"l2y":19,"l3x":15,"l3y":14,"l4x":15,"l4y":14,"l5x":13,"l5y":20},{"data":1000010,"id":500000025,"lvl":7,"x":34,"y":42,"l1x":28,"l1y":39,"l2x":14,"l2y":19,"l3x":22,"l3y":18,"l4x":19,"l4y":18,"l5x":15,"l5y":20},{"data":1000010,"id":500000026,"lvl":7,"x":35,"y":42,"l1x":26,"l1y":23,"l2x":13,"l2y":19,"l3x":41,"l3y":28,"l4x":41,"l4y":28,"l5x":34,"l5y":20},{"data":1000010,"id":500000027,"lvl":7,"x":36,"y":42,"l1x":29,"l1y":38,"l2x":17,"l2y":31,"l3x":15,"l3y":13,"l4x":15,"l4y":13,"l5x":17,"l5y":31},{"data":1000010,"id":500000028,"lvl":7,"x":37,"y":42,"l1x":30,"l1y":35,"l2x":17,"l2y":32,"l3x":16,"l3y":13,"l4x":16,"l4y":13,"l5x":17,"l5y":32},{"data":1000010,"id":500000029,"lvl":7,"x":37,"y":41,"l1x":31,"l1y":38,"l2x":17,"l2y":33,"l3x":17,"l3y":13,"l4x":17,"l4y":13,"l5x":17,"l5y":33},{"data":1000010,"id":500000030,"lvl":7,"x":40,"y":26,"l1x":32,"l1y":38,"l2x":16,"l2y":33,"l3x":18,"l3y":13,"l4x":18,"l4y":13,"l5x":16,"l5y":33},{"data":1000010,"id":500000031,"lvl":7,"x":37,"y":40,"l1x":34,"l1y":38,"l2x":15,"l2y":33,"l3x":19,"l3y":13,"l4x":19,"l4y":13,"l5x":15,"l5y":33},{"data":1000010,"id":500000032,"lvl":7,"x":38,"y":40,"l1x":35,"l1y":38,"l2x":14,"l2y":33,"l3x":36,"l3y":38,"l4x":36,"l4y":38,"l5x":14,"l5y":33},{"data":1000010,"id":500000033,"lvl":7,"x":39,"y":40,"l1x":36,"l1y":38,"l2x":13,"l2y":33,"l3x":41,"l3y":27,"l4x":41,"l4y":27,"l5x":13,"l5y":33}, + + {"data":1000019, "lvl":5, "x":31, "y": 33,"l1x":31, "l1y":33}, + {"data":12000002, "lvl":2, "x":24, "y":28,"l1x":24,"l1y":28}, + + {"data":12000000, "lvl":5, "x":3, "y":3,"l1x":24,"l1y":30}, + {"data":12000000, "lvl":5, "x":3, "y":4,"l1x":25,"l1y":30}, + {"data":12000000, "lvl":5, "x":3, "y":5,"l1x":24,"l1y":31}, + {"data":12000000, "lvl":5, "x":3, "y":6,"l1x":25,"l1y":31}, + + {"data":12000001, "lvl":5, "x":3, "y":7,"l1x":16,"l1y":15}, + {"data":12000008, "lvl":2, "x":3, "y":8,"l1x":24,"l1y":24}, + {"data":12000005, "lvl":1, "x":3, "y":9,"l1x":24,"l1y":25}, + {"data":12000006, "lvl":3, "x":3, "y":10,"l1x":24,"l1y":26}, + + {"data":8000021, "lvl":0, "x":3, "y":11,"l1x":38,"l1y":9}, + + {"data":1000010,"id":500000034,"lvl":7,"x":40,"y":36,"l1x":37,"l1y":38,"l2x":12,"l2y":33,"l3x":35,"l3y":38,"l4x":35,"l4y":38,"l5x":12,"l5y":33},{"data":1000010,"id":500000035,"lvl":7,"x":42,"y":34,"l1x":38,"l1y":38,"l2x":11,"l2y":33,"l3x":34,"l3y":38,"l4x":34,"l4y":38,"l5x":11,"l5y":33},{"data":1000010,"id":500000036,"lvl":7,"x":40,"y":38,"l1x":38,"l1y":37,"l2x":11,"l2y":32,"l3x":33,"l3y":38,"l4x":33,"l4y":38,"l5x":11,"l5y":32},{"data":1000010,"id":500000037,"lvl":7,"x":40,"y":39,"l1x":38,"l1y":36,"l2x":11,"l2y":31,"l3x":32,"l3y":38,"l4x":32,"l4y":38,"l5x":11,"l5y":31},{"data":1000010,"id":500000038,"lvl":7,"x":39,"y":26,"l1x":32,"l1y":21,"l2x":11,"l2y":30,"l3x":31,"l3y":38,"l4x":31,"l4y":38,"l5x":11,"l5y":30},{"data":1000010,"id":500000039,"lvl":7,"x":38,"y":26,"l1x":29,"l1y":19,"l2x":11,"l2y":29,"l3x":31,"l3y":37,"l4x":31,"l4y":37,"l5x":11,"l5y":29},{"data":1000010,"id":500000040,"lvl":7,"x":38,"y":25,"l1x":38,"l1y":35,"l2x":12,"l2y":29,"l3x":36,"l3y":34,"l4x":36,"l4y":34,"l5x":12,"l5y":29},{"data":1000010,"id":500000041,"lvl":7,"x":37,"y":25,"l1x":38,"l1y":34,"l2x":12,"l2y":28,"l3x":36,"l3y":33,"l4x":36,"l4y":33,"l5x":12,"l5y":28},{"data":1000010,"id":500000042,"lvl":7,"x":36,"y":25,"l1x":27,"l1y":13,"l2x":12,"l2y":27,"l3x":36,"l3y":36,"l4x":36,"l4y":36,"l5x":12,"l5y":27},{"data":1000010,"id":500000043,"lvl":7,"x":36,"y":24,"l1x":23,"l1y":13,"l2x":12,"l2y":26,"l3x":23,"l3y":37,"l4x":22,"l4y":38,"l5x":12,"l5y":26},{"data":1000010,"id":500000044,"lvl":7,"x":36,"y":23,"l1x":24,"l1y":13,"l2x":12,"l2y":19,"l3x":30,"l3y":37,"l4x":30,"l4y":37,"l5x":34,"l5y":22},{"data":1000010,"id":500000045,"lvl":7,"x":36,"y":22,"l1x":25,"l1y":13,"l2x":12,"l2y":20,"l3x":27,"l3y":38,"l4x":27,"l4y":38,"l5x":12,"l5y":20},{"data":1000010,"id":500000046,"lvl":7,"x":36,"y":21,"l1x":26,"l1y":13,"l2x":12,"l2y":21,"l3x":33,"l3y":32,"l4x":33,"l4y":32,"l5x":12,"l5y":21},{"data":1000010,"id":500000047,"lvl":7,"x":35,"y":21,"l1x":28,"l1y":13,"l2x":12,"l2y":22,"l3x":34,"l3y":32,"l4x":34,"l4y":32,"l5x":12,"l5y":22},{"data":1000010,"id":500000048,"lvl":7,"x":40,"y":40,"l1x":32,"l1y":12,"l2x":12,"l2y":23,"l3x":35,"l3y":32,"l4x":35,"l4y":32,"l5x":12,"l5y":23},{"data":1000010,"id":500000049,"lvl":7,"x":12,"y":8,"l1x":29,"l1y":14,"l2x":12,"l2y":24,"l3x":36,"l3y":32,"l4x":36,"l4y":32,"l5x":12,"l5y":24},{"data":1000010,"id":500000050,"lvl":7,"x":26,"y":39,"l1x":29,"l1y":16,"l2x":12,"l2y":25,"l3x":37,"l3y":32,"l4x":37,"l4y":32,"l5x":12,"l5y":25},{"data":1000010,"id":500000051,"lvl":7,"x":26,"y":38,"l1x":29,"l1y":15,"l2x":18,"l2y":16,"l3x":37,"l3y":31,"l4x":37,"l4y":31,"l5x":18,"l5y":16},{"data":1000010,"id":500000052,"lvl":7,"x":25,"y":38,"l1x":29,"l1y":17,"l2x":18,"l2y":15,"l3x":37,"l3y":30,"l4x":37,"l4y":30,"l5x":18,"l5y":15},{"data":1000010,"id":500000053,"lvl":7,"x":25,"y":37,"l1x":31,"l1y":12,"l2x":18,"l2y":14,"l3x":37,"l3y":29,"l4x":37,"l4y":29,"l5x":18,"l5y":14},{"data":1000010,"id":500000054,"lvl":7,"x":25,"y":36,"l1x":36,"l1y":16,"l2x":18,"l2y":13,"l3x":37,"l3y":28,"l4x":37,"l4y":28,"l5x":18,"l5y":13},{"data":1000010,"id":500000055,"lvl":7,"x":24,"y":36,"l1x":29,"l1y":12,"l2x":18,"l2y":12,"l3x":38,"l3y":28,"l4x":38,"l4y":28,"l5x":18,"l5y":12},{"data":1000010,"id":500000056,"lvl":7,"x":23,"y":36,"l1x":35,"l1y":14,"l2x":18,"l2y":11,"l3x":40,"l3y":28,"l4x":40,"l4y":28,"l5x":18,"l5y":11},{"data":1000010,"id":500000057,"lvl":7,"x":22,"y":36,"l1x":36,"l1y":14,"l2x":18,"l2y":10,"l3x":41,"l3y":25,"l4x":41,"l4y":25,"l5x":18,"l5y":10},{"data":1000010,"id":500000058,"lvl":7,"x":21,"y":36,"l1x":29,"l1y":20,"l2x":18,"l2y":9,"l3x":41,"l3y":24,"l4x":41,"l4y":24,"l5x":18,"l5y":9},{"data":1000010,"id":500000059,"lvl":7,"x":8,"y":35,"l1x":30,"l1y":20,"l2x":18,"l2y":8,"l3x":34,"l3y":23,"l4x":34,"l4y":23,"l5x":18,"l5y":8},{"data":1000010,"id":500000060,"lvl":7,"x":21,"y":35,"l1x":31,"l1y":20,"l2x":30,"l2y":13,"l3x":35,"l3y":23,"l4x":35,"l4y":23,"l5x":30,"l5y":13},{"data":1000010,"id":500000061,"lvl":7,"x":7,"y":35,"l1x":31,"l1y":21,"l2x":19,"l2y":8,"l3x":36,"l3y":23,"l4x":36,"l4y":23,"l5x":19,"l5y":8},{"data":1000010,"id":500000062,"lvl":7,"x":7,"y":34,"l1x":34,"l1y":24,"l2x":20,"l2y":8,"l3x":37,"l3y":23,"l4x":37,"l4y":23,"l5x":20,"l5y":8},{"data":1000010,"id":500000063,"lvl":7,"x":7,"y":33,"l1x":34,"l1y":23,"l2x":21,"l2y":8,"l3x":38,"l3y":23,"l4x":38,"l4y":23,"l5x":21,"l5y":8},{"data":1000010,"id":500000064,"lvl":7,"x":7,"y":32,"l1x":34,"l1y":22,"l2x":22,"l2y":8,"l3x":39,"l3y":24,"l4x":39,"l4y":24,"l5x":22,"l5y":8},{"data":1000010,"id":500000065,"lvl":7,"x":7,"y":31,"l1x":33,"l1y":21,"l2x":23,"l2y":8,"l3x":39,"l3y":23,"l4x":39,"l4y":23,"l5x":23,"l5y":8},{"data":1000010,"id":500000066,"lvl":7,"x":7,"y":30,"l1x":34,"l1y":21,"l2x":24,"l2y":8,"l3x":39,"l3y":22,"l4x":39,"l4y":22,"l5x":24,"l5y":8},{"data":1000010,"id":500000067,"lvl":7,"x":7,"y":29,"l1x":30,"l1y":25,"l2x":25,"l2y":8,"l3x":39,"l3y":21,"l4x":39,"l4y":21,"l5x":25,"l5y":8},{"data":1000010,"id":500000068,"lvl":7,"x":7,"y":28,"l1x":31,"l1y":25,"l2x":26,"l2y":8,"l3x":39,"l3y":20,"l4x":39,"l4y":20,"l5x":26,"l5y":8},{"data":1000010,"id":500000069,"lvl":7,"x":7,"y":27,"l1x":32,"l1y":25,"l2x":27,"l2y":8,"l3x":39,"l3y":19,"l4x":39,"l4y":19,"l5x":27,"l5y":8},{"data":1000010,"id":500000070,"lvl":7,"x":7,"y":26,"l1x":19,"l1y":22,"l2x":28,"l2y":8,"l3x":39,"l3y":18,"l4x":39,"l4y":18,"l5x":28,"l5y":8},{"data":1000013,"id":500000071,"lvl":5,"x":18,"y":25,"l1x":35,"l1y":34,"l2x":15,"l2y":14,"l3x":36,"l3y":15,"l4x":36,"l4y":15,"l5x":15,"l5y":14},{"data":1000007,"id":500000072,"lvl":5,"x":21,"y":37,"l1x":10,"l1y":14,"l2x":8,"l2y":14,"l3x":26,"l3y":10,"l4x":26,"l4y":10,"l5x":8,"l5y":14},{"data":1000010,"id":500000073,"lvl":7,"x":9,"y":35,"l1x":19,"l1y":21,"l2x":29,"l2y":8,"l3x":39,"l3y":17,"l4x":39,"l4y":17,"l5x":29,"l5y":8},{"data":1000010,"id":500000074,"lvl":7,"x":35,"y":8,"l1x":19,"l1y":23,"l2x":30,"l2y":8,"l3x":39,"l3y":16,"l4x":39,"l4y":16,"l5x":30,"l5y":8},{"data":1000010,"id":500000075,"lvl":7,"x":35,"y":7,"l1x":20,"l1y":23,"l2x":31,"l2y":8,"l3x":39,"l3y":15,"l4x":39,"l4y":15,"l5x":31,"l5y":8},{"data":1000010,"id":500000076,"lvl":7,"x":34,"y":7,"l1x":33,"l1y":25,"l2x":31,"l2y":9,"l3x":39,"l3y":14,"l4x":39,"l4y":14,"l5x":31,"l5y":9},{"data":1000010,"id":500000077,"lvl":7,"x":33,"y":7,"l1x":28,"l1y":25,"l2x":31,"l2y":10,"l3x":38,"l3y":14,"l4x":38,"l4y":14,"l5x":31,"l5y":10},{"data":1000010,"id":500000078,"lvl":7,"x":32,"y":7,"l1x":29,"l1y":25,"l2x":23,"l2y":13,"l3x":37,"l3y":14,"l4x":37,"l4y":14,"l5x":35,"l5y":26},{"data":1000010,"id":500000079,"lvl":7,"x":31,"y":7,"l1x":28,"l1y":24,"l2x":23,"l2y":15,"l3x":36,"l3y":14,"l4x":36,"l4y":14,"l5x":25,"l5y":15},{"data":1000010,"id":500000080,"lvl":7,"x":30,"y":7,"l1x":19,"l1y":20,"l2x":24,"l2y":13,"l3x":35,"l3y":14,"l4x":35,"l4y":14,"l5x":34,"l5y":26},{"data":1000010,"id":500000081,"lvl":7,"x":29,"y":7,"l1x":34,"l1y":25,"l2x":23,"l2y":14,"l3x":34,"l3y":14,"l4x":34,"l4y":14,"l5x":25,"l5y":16},{"data":1000010,"id":500000082,"lvl":7,"x":28,"y":7,"l1x":19,"l1y":19,"l2x":25,"l2y":13,"l3x":33,"l3y":14,"l4x":33,"l4y":14,"l5x":25,"l5y":13},{"data":1000010,"id":500000083,"lvl":7,"x":27,"y":7,"l1x":22,"l1y":19,"l2x":26,"l2y":13,"l3x":32,"l3y":14,"l4x":32,"l4y":14,"l5x":26,"l5y":13},{"data":1000010,"id":500000084,"lvl":7,"x":26,"y":7,"l1x":21,"l1y":19,"l2x":27,"l2y":13,"l3x":31,"l3y":14,"l4x":31,"l4y":14,"l5x":27,"l5y":13},{"data":1000010,"id":500000085,"lvl":7,"x":25,"y":7,"l1x":20,"l1y":19,"l2x":29,"l2y":13,"l3x":30,"l3y":14,"l4x":30,"l4y":14,"l5x":29,"l5y":13},{"data":1000010,"id":500000086,"lvl":7,"x":35,"y":9,"l1x":25,"l1y":18,"l2x":28,"l2y":13,"l3x":27,"l3y":14,"l4x":27,"l4y":14,"l5x":28,"l5y":13},{"data":1000010,"id":500000087,"lvl":7,"x":35,"y":10,"l1x":24,"l1y":18,"l2x":31,"l2y":12,"l3x":25,"l3y":13,"l4x":25,"l4y":13,"l5x":31,"l5y":12},{"data":1000010,"id":500000088,"lvl":7,"x":35,"y":11,"l1x":24,"l1y":19,"l2x":31,"l2y":13,"l3x":25,"l3y":12,"l4x":25,"l4y":12,"l5x":31,"l5y":13},{"data":1000010,"id":500000089,"lvl":7,"x":35,"y":12,"l1x":23,"l1y":19,"l2x":31,"l2y":14,"l3x":25,"l3y":10,"l4x":25,"l4y":10,"l5x":31,"l5y":14},{"data":1000010,"id":500000090,"lvl":7,"x":35,"y":13,"l1x":29,"l1y":18,"l2x":32,"l2y":14,"l3x":24,"l3y":10,"l4x":24,"l4y":10,"l5x":32,"l5y":14},{"data":1000010,"id":500000091,"lvl":7,"x":7,"y":25,"l1x":28,"l1y":18,"l2x":33,"l2y":14,"l3x":23,"l3y":10,"l4x":23,"l4y":10,"l5x":33,"l5y":14},{"data":1000010,"id":500000092,"lvl":7,"x":10,"y":35,"l1x":27,"l1y":18,"l2x":34,"l2y":14,"l3x":22,"l3y":10,"l4x":22,"l4y":10,"l5x":34,"l5y":14},{"data":1000010,"id":500000093,"lvl":7,"x":11,"y":35,"l1x":26,"l1y":18,"l2x":35,"l2y":14,"l3x":21,"l3y":10,"l4x":21,"l4y":10,"l5x":35,"l5y":14},{"data":1000010,"id":500000094,"lvl":7,"x":12,"y":35,"l1x":27,"l1y":23,"l2x":36,"l2y":14,"l3x":20,"l3y":10,"l4x":20,"l4y":10,"l5x":36,"l5y":14},{"data":1000010,"id":500000095,"lvl":7,"x":13,"y":35,"l1x":28,"l1y":23,"l2x":37,"l2y":14,"l3x":20,"l3y":11,"l4x":20,"l4y":11,"l5x":37,"l5y":14},{"data":1000010,"id":500000096,"lvl":7,"x":26,"y":11,"l1x":25,"l1y":23,"l2x":37,"l2y":15,"l3x":20,"l3y":12,"l4x":20,"l4y":12,"l5x":37,"l5y":15},{"data":1000010,"id":500000097,"lvl":7,"x":27,"y":11,"l1x":24,"l1y":23,"l2x":37,"l2y":16,"l3x":20,"l3y":13,"l4x":20,"l4y":13,"l5x":37,"l5y":16},{"data":1000002,"id":500000098,"lvl":11,"x":17,"y":10,"res_time":87175,"l1x":23,"l1y":15,"l2x":35,"l2y":41,"l3x":16,"l3y":19,"l4x":16,"l4y":19,"l5x":35,"l5y":41},{"data":1000006,"id":500000099,"lvl":9,"x":27,"y":8,"unit_prod":{"unit_type":0,"t":0,"slots":[{"id":4000008,"cnt":1}]},"l1x":37,"l1y":18,"l2x":14,"l2y":38,"l3x":7,"l3y":23,"l4x":7,"l4y":23,"l5x":14,"l5y":38},{"data":1000004,"id":500000100,"lvl":11,"x":28,"y":18,"res_time":61043,"l1x":39,"l1y":33,"l2x":11,"l2y":11,"l3x":34,"l3y":42,"l4x":34,"l4y":42,"l5x":11,"l5y":11},{"data":1000009,"id":500000101,"lvl":9,"x":30,"y":24,"l1x":25,"l1y":36,"l2x":12,"l2y":30,"l3x":36,"l3y":20,"l4x":36,"l4y":20,"l5x":12,"l5y":30},{"data":1000015,"id":500000102,"lvl":0,"x":28,"y":40,"l1x":12,"l1y":18,"l2x":22,"l2y":37,"l3x":30,"l3y":9,"l4x":30,"l4y":9,"l5x":41,"l5y":36},{"data":1000012,"id":500000103,"lvl":5,"x":27,"y":30,"l1x":21,"l1y":20,"l2x":30,"l2y":29,"l3x":25,"l3y":20,"l4x":25,"l4y":20,"l5x":30,"l5y":29},{"data":1000015,"id":500000104,"lvl":0,"x":26,"y":40,"l1x":37,"l1y":13,"l2x":18,"l2y":23,"l3x":8,"l3y":26,"l4x":8,"l4y":26,"l5x":18,"l5y":23},{"data":1000000,"id":500000105,"lvl":5,"x":12,"y":26,"units":[[4000008,3]],"l1x":10,"l1y":20,"l2x":6,"l2y":28,"l3x":23,"l3y":39,"l4x":23,"l4y":39,"l5x":6,"l5y":28},{"data":1000020,"id":500000106,"lvl":2,"x":41,"y":37,"units":[[26000001,1],[26000000,2]],"unit_prod":{"unit_type":1,"t":0,"slots":[{"id":26000001,"cnt":1}]},"l1x":11,"l1y":27,"l2x":9,"l2y":25,"l3x":17,"l3y":10,"l4x":17,"l4y":10,"l5x":9,"l5y":25},{"data":1000011,"id":500000107,"lvl":5,"x":21,"y":21,"l1x":16,"l1y":24,"l2x":25,"l2y":29,"l3x":30,"l3y":11,"l4x":30,"l4y":11,"l5x":25,"l5y":28},{"data":1000008,"id":500000108,"lvl":9,"x":32,"y":10,"l1x":14,"l1y":36,"l2x":26,"l2y":10,"l3x":18,"l3y":37,"l4x":18,"l4y":37,"l5x":26,"l5y":10},{"data":1000010,"id":500000109,"lvl":7,"x":28,"y":11,"l1x":36,"l1y":15,"l2x":37,"l2y":18,"l3x":20,"l3y":14,"l4x":20,"l4y":14,"l5x":37,"l5y":18},{"data":1000010,"id":500000110,"lvl":7,"x":29,"y":11,"l1x":30,"l1y":12,"l2x":37,"l2y":17,"l3x":20,"l3y":15,"l4x":20,"l4y":15,"l5x":37,"l5y":17},{"data":1000010,"id":500000111,"lvl":7,"x":30,"y":11,"l1x":36,"l1y":17,"l2x":39,"l2y":34,"l3x":20,"l3y":16,"l4x":20,"l4y":16,"l5x":39,"l5y":34},{"data":1000010,"id":500000112,"lvl":7,"x":31,"y":11,"l1x":34,"l1y":14,"l2x":38,"l2y":34,"l3x":28,"l3y":14,"l4x":28,"l4y":14,"l5x":38,"l5y":34},{"data":1000010,"id":500000113,"lvl":7,"x":31,"y":12,"l1x":36,"l1y":18,"l2x":37,"l2y":34,"l3x":25,"l3y":14,"l4x":25,"l4y":14,"l5x":37,"l5y":34},{"data":1000010,"id":500000114,"lvl":7,"x":31,"y":13,"l1x":36,"l1y":19,"l2x":35,"l2y":34,"l3x":26,"l3y":14,"l4x":26,"l4y":14,"l5x":35,"l5y":34},{"data":1000010,"id":500000115,"lvl":7,"x":32,"y":13,"l1x":33,"l1y":13,"l2x":35,"l2y":33,"l3x":29,"l3y":14,"l4x":29,"l4y":14,"l5x":35,"l5y":33},{"data":1000010,"id":500000116,"lvl":7,"x":33,"y":13,"l1x":35,"l1y":21,"l2x":36,"l2y":34,"l3x":29,"l3y":15,"l4x":29,"l4y":15,"l5x":36,"l5y":34},{"data":1000010,"id":500000117,"lvl":7,"x":34,"y":13,"l1x":33,"l1y":38,"l2x":36,"l2y":35,"l3x":29,"l3y":16,"l4x":29,"l4y":16,"l5x":36,"l5y":35},{"data":1000010,"id":500000118,"lvl":7,"x":34,"y":14,"l1x":36,"l1y":20,"l2x":36,"l2y":36,"l3x":29,"l3y":17,"l4x":29,"l4y":17,"l5x":36,"l5y":36},{"data":1000010,"id":500000119,"lvl":7,"x":34,"y":15,"l1x":37,"l1y":21,"l2x":36,"l2y":37,"l3x":28,"l3y":37,"l4x":28,"l4y":37,"l5x":36,"l5y":37},{"data":1000010,"id":500000120,"lvl":7,"x":34,"y":16,"l1x":38,"l1y":21,"l2x":36,"l2y":38,"l3x":41,"l3y":26,"l4x":41,"l4y":26,"l5x":36,"l5y":38},{"data":1000010,"id":500000121,"lvl":7,"x":11,"y":26,"l1x":39,"l1y":21,"l2x":36,"l2y":39,"l3x":25,"l3y":17,"l4x":25,"l4y":17,"l5x":36,"l5y":39},{"data":1000010,"id":500000122,"lvl":7,"x":11,"y":27,"l1x":39,"l1y":22,"l2x":23,"l2y":16,"l3x":23,"l3y":17,"l4x":23,"l4y":17,"l5x":25,"l5y":14},{"data":1000010,"id":500000123,"lvl":7,"x":11,"y":28,"l1x":39,"l1y":23,"l2x":36,"l2y":40,"l3x":21,"l3y":17,"l4x":21,"l4y":17,"l5x":36,"l5y":40},{"data":1000010,"id":500000124,"lvl":7,"x":11,"y":29,"l1x":39,"l1y":24,"l2x":35,"l2y":40,"l3x":20,"l3y":17,"l4x":20,"l4y":17,"l5x":35,"l5y":40},{"data":1000010,"id":500000125,"lvl":7,"x":11,"y":30,"l1x":39,"l1y":25,"l2x":34,"l2y":40,"l3x":19,"l3y":17,"l4x":19,"l4y":17,"l5x":34,"l5y":40},{"data":1000010,"id":500000126,"lvl":7,"x":11,"y":31,"l1x":39,"l1y":26,"l2x":33,"l2y":40,"l3x":18,"l3y":17,"l4x":18,"l4y":17,"l5x":33,"l5y":40},{"data":1000010,"id":500000127,"lvl":7,"x":12,"y":31,"l1x":39,"l1y":27,"l2x":32,"l2y":40,"l3x":16,"l3y":17,"l4x":16,"l4y":17,"l5x":32,"l5y":40},{"data":1000010,"id":500000128,"lvl":7,"x":13,"y":31,"l1x":39,"l1y":28,"l2x":24,"l2y":35,"l3x":15,"l3y":17,"l4x":15,"l4y":17,"l5x":24,"l5y":35},{"data":1000010,"id":500000129,"lvl":7,"x":13,"y":32,"l1x":39,"l1y":29,"l2x":24,"l2y":36,"l3x":14,"l3y":17,"l4x":14,"l4y":17,"l5x":24,"l5y":36},{"data":1000010,"id":500000130,"lvl":7,"x":13,"y":33,"l1x":22,"l1y":23,"l2x":24,"l2y":37,"l3x":13,"l3y":17,"l4x":13,"l4y":17,"l5x":24,"l5y":37},{"data":1000010,"id":500000131,"lvl":7,"x":13,"y":34,"l1x":39,"l1y":30,"l2x":33,"l2y":21,"l3x":12,"l3y":17,"l4x":12,"l4y":17,"l5x":33,"l5y":21},{"data":1000010,"id":500000132,"lvl":7,"x":14,"y":34,"l1x":39,"l1y":31,"l2x":33,"l2y":20,"l3x":11,"l3y":17,"l4x":11,"l4y":17,"l5x":30,"l5y":21},{"data":1000010,"id":500000133,"lvl":7,"x":15,"y":34,"l1x":39,"l1y":32,"l2x":33,"l2y":19,"l3x":11,"l3y":18,"l4x":11,"l4y":18,"l5x":34,"l5y":19},{"data":1000002,"id":500000134,"lvl":11,"x":17,"y":14,"res_time":87179,"l1x":11,"l1y":11,"l2x":29,"l2y":36,"l3x":34,"l3y":25,"l4x":34,"l4y":25,"l5x":29,"l5y":36},{"data":1000004,"id":500000135,"lvl":11,"x":18,"y":28,"res_time":61053,"l1x":25,"l1y":40,"l2x":11,"l2y":34,"l3x":37,"l3y":39,"l4x":37,"l4y":39,"l5x":12,"l5y":34},{"data":1000009,"id":500000136,"lvl":9,"x":14,"y":14,"l1x":15,"l1y":28,"l2x":34,"l2y":15,"l3x":22,"l3y":11,"l4x":22,"l4y":11,"l5x":34,"l5y":15},{"data":1000002,"id":500000137,"lvl":11,"x":14,"y":17,"res_time":87173,"l1x":14,"l1y":8,"l2x":6,"l2y":20,"l3x":26,"l3y":15,"l4x":26,"l4y":15,"l5x":6,"l5y":20},{"data":1000004,"id":500000138,"lvl":11,"x":18,"y":22,"res_time":61055,"l1x":11,"l1y":8,"l2x":13,"l2y":21,"l3x":33,"l3y":11,"l4x":33,"l4y":11,"l5x":13,"l5y":21},{"data":1000013,"id":500000139,"lvl":5,"x":25,"y":18,"l1x":15,"l1y":12,"l2x":37,"l2y":35,"l3x":16,"l3y":14,"l4x":16,"l4y":14,"l5x":38,"l5y":35},{"data":1000010,"id":500000140,"lvl":7,"x":9,"y":25,"l1x":21,"l1y":23,"l2x":34,"l2y":19,"l3x":11,"l3y":19,"l4x":11,"l4y":19,"l5x":36,"l5y":18},{"data":1000010,"id":500000141,"lvl":7,"x":10,"y":25,"l1x":23,"l1y":23,"l2x":35,"l2y":19,"l3x":11,"l3y":20,"l4x":11,"l4y":20,"l5x":35,"l5y":18},{"data":1000010,"id":500000142,"lvl":7,"x":11,"y":25,"l1x":20,"l1y":26,"l2x":36,"l2y":19,"l3x":11,"l3y":21,"l4x":11,"l4y":21,"l5x":34,"l5y":18},{"data":1000010,"id":500000143,"lvl":7,"x":12,"y":25,"l1x":20,"l1y":36,"l2x":37,"l2y":19,"l3x":11,"l3y":22,"l4x":11,"l4y":22,"l5x":37,"l5y":19},{"data":1000010,"id":500000144,"lvl":7,"x":25,"y":9,"l1x":37,"l1y":33,"l2x":38,"l2y":19,"l3x":12,"l3y":22,"l4x":12,"l4y":22,"l5x":38,"l5y":19},{"data":1000010,"id":500000145,"lvl":7,"x":25,"y":10,"l1x":36,"l1y":33,"l2x":39,"l2y":19,"l3x":27,"l3y":33,"l4x":27,"l4y":33,"l5x":39,"l5y":19},{"data":1000010,"id":500000146,"lvl":7,"x":25,"y":11,"l1x":35,"l1y":33,"l2x":40,"l2y":19,"l3x":27,"l3y":34,"l4x":27,"l4y":34,"l5x":40,"l5y":19},{"data":1000010,"id":500000147,"lvl":7,"x":25,"y":12,"l1x":34,"l1y":33,"l2x":40,"l2y":20,"l3x":27,"l3y":35,"l4x":27,"l4y":35,"l5x":40,"l5y":20},{"data":1000010,"id":500000148,"lvl":7,"x":25,"y":8,"l1x":15,"l1y":26,"l2x":40,"l2y":21,"l3x":27,"l3y":36,"l4x":27,"l4y":36,"l5x":40,"l5y":21},{"data":1000010,"id":500000149,"lvl":7,"x":24,"y":8,"l1x":15,"l1y":25,"l2x":40,"l2y":22,"l3x":27,"l3y":37,"l4x":27,"l4y":37,"l5x":40,"l5y":22},{"data":1000010,"id":500000150,"lvl":7,"x":23,"y":8,"l1x":15,"l1y":24,"l2x":32,"l2y":39,"l3x":23,"l3y":38,"l4x":23,"l4y":38,"l5x":32,"l5y":39},{"data":1000010,"id":500000151,"lvl":7,"x":22,"y":8,"l1x":15,"l1y":23,"l2x":31,"l2y":39,"l3x":24,"l3y":38,"l4x":24,"l4y":38,"l5x":31,"l5y":39},{"data":1000010,"id":500000152,"lvl":7,"x":21,"y":8,"l1x":15,"l1y":21,"l2x":30,"l2y":39,"l3x":25,"l3y":38,"l4x":25,"l4y":38,"l5x":30,"l5y":39},{"data":1000010,"id":500000153,"lvl":7,"x":20,"y":8,"l1x":15,"l1y":22,"l2x":29,"l2y":39,"l3x":22,"l3y":37,"l4x":21,"l4y":38,"l5x":29,"l5y":39},{"data":1000010,"id":500000154,"lvl":7,"x":19,"y":8,"l1x":14,"l1y":19,"l2x":28,"l2y":39,"l3x":26,"l3y":38,"l4x":26,"l4y":38,"l5x":28,"l5y":39},{"data":1000010,"id":500000155,"lvl":7,"x":18,"y":8,"l1x":14,"l1y":18,"l2x":27,"l2y":39,"l3x":33,"l3y":18,"l4x":29,"l4y":19,"l5x":27,"l5y":39},{"data":1000010,"id":500000156,"lvl":7,"x":17,"y":8,"l1x":14,"l1y":17,"l2x":26,"l2y":39,"l3x":32,"l3y":18,"l4x":32,"l4y":19,"l5x":26,"l5y":39},{"data":1000010,"id":500000157,"lvl":7,"x":16,"y":8,"l1x":14,"l1y":16,"l2x":25,"l2y":39,"l3x":31,"l3y":18,"l4x":31,"l4y":19,"l5x":25,"l5y":39},{"data":1000010,"id":500000158,"lvl":7,"x":16,"y":34,"l1x":14,"l1y":15,"l2x":39,"l2y":33,"l3x":33,"l3y":19,"l4x":33,"l4y":19,"l5x":39,"l5y":33},{"data":1000010,"id":500000159,"lvl":7,"x":8,"y":25,"l1x":14,"l1y":14,"l2x":39,"l2y":27,"l3x":33,"l3y":20,"l4x":33,"l4y":20,"l5x":39,"l5y":27},{"data":1000010,"id":500000160,"lvl":7,"x":8,"y":24,"l1x":14,"l1y":13,"l2x":39,"l2y":28,"l3x":33,"l3y":21,"l4x":33,"l4y":21,"l5x":39,"l5y":28},{"data":1000010,"id":500000161,"lvl":7,"x":8,"y":23,"l1x":14,"l1y":12,"l2x":39,"l2y":29,"l3x":33,"l3y":22,"l4x":33,"l4y":22,"l5x":39,"l5y":29},{"data":1000010,"id":500000162,"lvl":7,"x":8,"y":22,"l1x":14,"l1y":11,"l2x":22,"l2y":32,"l3x":33,"l3y":23,"l4x":33,"l4y":23,"l5x":22,"l5y":32},{"data":1000010,"id":500000163,"lvl":7,"x":8,"y":21,"l1x":15,"l1y":11,"l2x":22,"l2y":31,"l3x":33,"l3y":24,"l4x":33,"l4y":24,"l5x":22,"l5y":31},{"data":1000010,"id":500000164,"lvl":7,"x":8,"y":20,"l1x":16,"l1y":11,"l2x":23,"l2y":32,"l3x":33,"l3y":25,"l4x":33,"l4y":25,"l5x":23,"l5y":32},{"data":1000011,"id":500000165,"lvl":5,"x":36,"y":30,"l1x":31,"l1y":35,"l2x":17,"l2y":19,"l3x":19,"l3y":19,"l4x":38,"l4y":33,"l5x":17,"l5y":19},{"data":1000015,"id":500000166,"lvl":0,"x":39,"y":27,"l1x":23,"l1y":40,"l2x":26,"l2y":25,"l3x":25,"l3y":8,"l4x":25,"l4y":8,"l5x":27,"l5y":25},{"data":1000024,"id":500000167,"lvl":3,"x":22,"y":18,"l1x":21,"l1y":24,"l2x":32,"l2y":34,"l3x":24,"l3y":29,"l4x":14,"l4y":26,"l5x":32,"l5y":33},{"data":1000006,"id":500000168,"lvl":9,"x":10,"y":21,"unit_prod":{"unit_type":0,"t":0,"slots":[{"id":4000008,"cnt":1}]},"l1x":37,"l1y":39,"l2x":9,"l2y":18,"l3x":10,"l3y":27,"l4x":10,"l4y":27,"l5x":9,"l5y":18},{"data":1000000,"id":500000169,"lvl":5,"x":26,"y":12,"units":[[4000008,3]],"l1x":18,"l1y":37,"l2x":40,"l2y":29,"l3x":7,"l3y":31,"l4x":7,"l4y":31,"l5x":40,"l5y":29},{"data":1000010,"id":500000170,"lvl":7,"x":8,"y":19,"l1x":17,"l1y":11,"l2x":23,"l2y":34,"l3x":33,"l3y":26,"l4x":33,"l4y":26,"l5x":24,"l5y":17},{"data":1000010,"id":500000171,"lvl":7,"x":8,"y":18,"l1x":18,"l1y":11,"l2x":25,"l2y":32,"l3x":30,"l3y":18,"l4x":30,"l4y":19,"l5x":25,"l5y":32},{"data":1000010,"id":500000172,"lvl":7,"x":8,"y":17,"l1x":33,"l1y":14,"l2x":26,"l2y":32,"l3x":29,"l3y":18,"l4x":29,"l4y":18,"l5x":26,"l5y":32},{"data":1000010,"id":500000173,"lvl":7,"x":8,"y":16,"l1x":19,"l1y":12,"l2x":27,"l2y":32,"l3x":28,"l3y":18,"l4x":28,"l4y":18,"l5x":27,"l5y":32},{"data":1000010,"id":500000174,"lvl":7,"x":9,"y":16,"l1x":20,"l1y":12,"l2x":28,"l2y":32,"l3x":27,"l3y":18,"l4x":27,"l4y":18,"l5x":28,"l5y":32},{"data":1000010,"id":500000175,"lvl":7,"x":10,"y":16,"l1x":21,"l1y":12,"l2x":29,"l2y":32,"l3x":26,"l3y":18,"l4x":26,"l4y":18,"l5x":29,"l5y":32},{"data":1000010,"id":500000176,"lvl":7,"x":11,"y":16,"l1x":22,"l1y":12,"l2x":30,"l2y":32,"l3x":25,"l3y":18,"l4x":25,"l4y":18,"l5x":30,"l5y":32},{"data":1000010,"id":500000177,"lvl":7,"x":12,"y":16,"l1x":22,"l1y":13,"l2x":31,"l2y":32,"l3x":22,"l3y":17,"l4x":22,"l4y":17,"l5x":31,"l5y":32},{"data":1000010,"id":500000178,"lvl":7,"x":16,"y":9,"l1x":22,"l1y":14,"l2x":32,"l2y":32,"l3x":24,"l3y":17,"l4x":24,"l4y":17,"l5x":32,"l5y":32},{"data":1000010,"id":500000179,"lvl":7,"x":16,"y":10,"l1x":22,"l1y":15,"l2x":33,"l2y":32,"l3x":22,"l3y":20,"l4x":19,"l4y":21,"l5x":33,"l5y":32},{"data":1000010,"id":500000180,"lvl":7,"x":16,"y":11,"l1x":22,"l1y":18,"l2x":34,"l2y":32,"l3x":22,"l3y":19,"l4x":19,"l4y":20,"l5x":34,"l5y":32},{"data":1000010,"id":500000181,"lvl":7,"x":14,"y":9,"l1x":22,"l1y":17,"l2x":35,"l2y":32,"l3x":22,"l3y":21,"l4x":19,"l4y":19,"l5x":35,"l5y":32},{"data":1000010,"id":500000182,"lvl":7,"x":9,"y":14,"l1x":15,"l1y":19,"l2x":35,"l2y":31,"l3x":21,"l3y":37,"l4x":21,"l4y":37,"l5x":35,"l5y":31},{"data":1000010,"id":500000183,"lvl":7,"x":16,"y":12,"l1x":20,"l1y":25,"l2x":35,"l2y":30,"l3x":21,"l3y":36,"l4x":21,"l4y":36,"l5x":35,"l5y":30},{"data":1000010,"id":500000184,"lvl":7,"x":8,"y":12,"l1x":29,"l1y":30,"l2x":35,"l2y":29,"l3x":20,"l3y":36,"l4x":20,"l4y":36,"l5x":35,"l5y":29},{"data":1000010,"id":500000185,"lvl":7,"x":9,"y":9,"l1x":18,"l1y":19,"l2x":35,"l2y":28,"l3x":19,"l3y":36,"l4x":19,"l4y":36,"l5x":35,"l5y":28},{"data":1000010,"id":500000186,"lvl":7,"x":13,"y":14,"l1x":30,"l1y":32,"l2x":39,"l2y":31,"l3x":18,"l3y":36,"l4x":18,"l4y":36,"l5x":39,"l5y":31},{"data":1000010,"id":500000187,"lvl":7,"x":13,"y":13,"l1x":29,"l1y":27,"l2x":35,"l2y":27,"l3x":17,"l3y":36,"l4x":17,"l4y":36,"l5x":35,"l5y":27},{"data":1000010,"id":500000188,"lvl":7,"x":14,"y":13,"l1x":29,"l1y":31,"l2x":17,"l2y":23,"l3x":16,"l3y":36,"l4x":16,"l4y":36,"l5x":17,"l5y":23},{"data":1000010,"id":500000189,"lvl":7,"x":15,"y":13,"l1x":29,"l1y":26,"l2x":17,"l2y":24,"l3x":15,"l3y":36,"l4x":15,"l4y":36,"l5x":17,"l5y":24},{"data":1000010,"id":500000190,"lvl":7,"x":16,"y":13,"l1x":18,"l1y":12,"l2x":17,"l2y":25,"l3x":15,"l3y":35,"l4x":15,"l4y":35,"l5x":17,"l5y":25},{"data":1000010,"id":500000191,"lvl":7,"x":17,"y":13,"l1x":29,"l1y":28,"l2x":17,"l2y":26,"l3x":15,"l3y":34,"l4x":15,"l4y":34,"l5x":17,"l5y":26},{"data":1000010,"id":500000192,"lvl":7,"x":18,"y":13,"l1x":29,"l1y":29,"l2x":17,"l2y":27,"l3x":15,"l3y":33,"l4x":15,"l4y":33,"l5x":17,"l5y":27},{"data":1000010,"id":500000193,"lvl":7,"x":19,"y":13,"l1x":20,"l1y":24,"l2x":17,"l2y":28,"l3x":15,"l3y":32,"l4x":15,"l4y":32,"l5x":17,"l5y":28},{"data":1000010,"id":500000194,"lvl":7,"x":13,"y":15,"l1x":22,"l1y":33,"l2x":17,"l2y":29,"l3x":13,"l3y":23,"l4x":13,"l4y":23,"l5x":17,"l5y":29},{"data":1000010,"id":500000195,"lvl":7,"x":13,"y":16,"l1x":20,"l1y":31,"l2x":39,"l2y":30,"l3x":13,"l3y":24,"l4x":13,"l4y":24,"l5x":39,"l5y":30},{"data":1000010,"id":500000196,"lvl":7,"x":13,"y":17,"l1x":14,"l1y":30,"l2x":17,"l2y":30,"l3x":13,"l3y":25,"l4x":13,"l4y":25,"l5x":17,"l5y":30},{"data":1000010,"id":500000197,"lvl":7,"x":13,"y":18,"l1x":14,"l1y":29,"l2x":18,"l2y":30,"l3x":13,"l3y":26,"l4x":13,"l4y":26,"l5x":18,"l5y":30},{"data":1000010,"id":500000198,"lvl":7,"x":13,"y":19,"l1x":14,"l1y":28,"l2x":19,"l2y":30,"l3x":13,"l3y":27,"l4x":13,"l4y":27,"l5x":19,"l5y":30},{"data":1000010,"id":500000199,"lvl":7,"x":20,"y":13,"l1x":14,"l1y":27,"l2x":20,"l2y":30,"l3x":13,"l3y":28,"l4x":13,"l4y":28,"l5x":20,"l5y":30},{"data":1000010,"id":500000200,"lvl":7,"x":21,"y":13,"l1x":14,"l1y":33,"l2x":21,"l2y":30,"l3x":13,"l3y":29,"l4x":13,"l4y":29,"l5x":21,"l5y":30},{"data":1000010,"id":500000201,"lvl":7,"x":22,"y":13,"l1x":23,"l1y":33,"l2x":22,"l2y":30,"l3x":13,"l3y":30,"l4x":13,"l4y":30,"l5x":22,"l5y":30},{"data":1000010,"id":500000202,"lvl":7,"x":23,"y":13,"l1x":14,"l1y":31,"l2x":22,"l2y":29,"l3x":13,"l3y":31,"l4x":13,"l4y":31,"l5x":22,"l5y":29},{"data":1000010,"id":500000203,"lvl":7,"x":24,"y":13,"l1x":16,"l1y":35,"l2x":22,"l2y":28,"l3x":24,"l3y":23,"l4x":24,"l4y":23,"l5x":22,"l5y":28},{"data":1000010,"id":500000204,"lvl":7,"x":13,"y":20,"l1x":15,"l1y":35,"l2x":16,"l2y":17,"l3x":24,"l3y":22,"l4x":24,"l4y":22,"l5x":16,"l5y":17},{"data":1000010,"id":500000205,"lvl":7,"x":13,"y":21,"l1x":14,"l1y":32,"l2x":17,"l2y":17,"l3x":23,"l3y":22,"l4x":23,"l4y":22,"l5x":17,"l5y":17},{"data":1000010,"id":500000206,"lvl":7,"x":13,"y":22,"l1x":20,"l1y":27,"l2x":18,"l2y":17,"l3x":22,"l3y":22,"l4x":22,"l4y":22,"l5x":18,"l5y":17},{"data":1000010,"id":500000207,"lvl":7,"x":13,"y":23,"l1x":17,"l1y":27,"l2x":19,"l2y":17,"l3x":21,"l3y":22,"l4x":21,"l4y":22,"l5x":19,"l5y":17},{"data":1000010,"id":500000208,"lvl":7,"x":13,"y":24,"l1x":18,"l1y":27,"l2x":20,"l2y":17,"l3x":20,"l3y":22,"l4x":20,"l4y":22,"l5x":20,"l5y":17},{"data":1000010,"id":500000209,"lvl":7,"x":13,"y":25,"l1x":30,"l1y":34,"l2x":21,"l2y":17,"l3x":19,"l3y":22,"l4x":19,"l4y":22,"l5x":21,"l5y":17},{"data":1000010,"id":500000210,"lvl":7,"x":14,"y":25,"l1x":33,"l1y":12,"l2x":22,"l2y":17,"l3x":18,"l3y":22,"l4x":18,"l4y":22,"l5x":22,"l5y":17},{"data":1000010,"id":500000211,"lvl":7,"x":25,"y":13,"l1x":36,"l1y":21,"l2x":23,"l2y":17,"l3x":17,"l3y":22,"l4x":17,"l4y":22,"l5x":14,"l5y":20},{"data":1000010,"id":500000212,"lvl":7,"x":25,"y":14,"l1x":30,"l1y":36,"l2x":25,"l2y":17,"l3x":17,"l3y":23,"l4x":17,"l4y":23,"l5x":25,"l5y":17},{"data":1000010,"id":500000213,"lvl":7,"x":25,"y":15,"l1x":29,"l1y":13,"l2x":24,"l2y":17,"l3x":17,"l3y":24,"l4x":17,"l4y":24,"l5x":23,"l5y":17},{"data":1000010,"id":500000214,"lvl":7,"x":25,"y":16,"l1x":15,"l1y":20,"l2x":25,"l2y":18,"l3x":14,"l3y":31,"l4x":14,"l4y":31,"l5x":25,"l5y":18},{"data":1000010,"id":500000215,"lvl":7,"x":25,"y":17,"l1x":22,"l1y":16,"l2x":25,"l2y":19,"l3x":17,"l3y":25,"l4x":17,"l4y":25,"l5x":25,"l5y":19},{"data":1000010,"id":500000216,"lvl":7,"x":26,"y":17,"l1x":14,"l1y":35,"l2x":25,"l2y":21,"l3x":17,"l3y":26,"l4x":17,"l4y":26,"l5x":25,"l5y":21},{"data":1000010,"id":500000217,"lvl":7,"x":27,"y":17,"l1x":33,"l1y":33,"l2x":25,"l2y":20,"l3x":17,"l3y":27,"l4x":17,"l4y":27,"l5x":25,"l5y":20},{"data":1000010,"id":500000218,"lvl":7,"x":28,"y":17,"l1x":18,"l1y":18,"l2x":16,"l2y":18,"l3x":17,"l3y":28,"l4x":17,"l4y":28,"l5x":16,"l5y":18},{"data":1000010,"id":500000219,"lvl":7,"x":29,"y":17,"l1x":28,"l1y":38,"l2x":16,"l2y":19,"l3x":17,"l3y":29,"l4x":17,"l4y":29,"l5x":16,"l5y":19},{"data":1000008,"id":500000220,"lvl":9,"x":18,"y":31,"l1x":19,"l1y":13,"l2x":36,"l2y":21,"l3x":31,"l3y":15,"l4x":31,"l4y":16,"l5x":36,"l5y":21},{"data":1000008,"id":500000221,"lvl":9,"x":31,"y":18,"l1x":33,"l1y":15,"l2x":19,"l2y":36,"l3x":10,"l3y":24,"l4x":10,"l4y":24,"l5x":19,"l5y":36},{"data":1000009,"id":500000222,"lvl":9,"x":24,"y":21,"l1x":26,"l1y":14,"l2x":25,"l2y":36,"l3x":12,"l3y":19,"l4x":12,"l4y":19,"l5x":25,"l5y":36},{"data":1000013,"id":500000225,"lvl":5,"x":33,"y":27,"l1x":15,"l1y":32,"l2x":15,"l2y":35,"l3x":19,"l3y":32,"l4x":19,"l4y":32,"l5x":15,"l5y":35},{"data":1000012,"id":500000226,"lvl":5,"x":30,"y":27,"l1x":26,"l1y":28,"l2x":19,"l2y":27,"l3x":18,"l3y":28,"l4x":18,"l4y":28,"l5x":19,"l5y":27},{"data":1000022,"id":500000227,"lvl":0,"x":34,"y":34,"l1x":30,"l1y":29,"l2x":26,"l2y":19,"l3x":21,"l3y":23,"l4x":21,"l4y":23,"l5x":26,"l5y":18},{"data":1000026,"id":500000228,"lvl":3,"x":13,"y":10,"unit_prod":{"unit_type":0},"l1x":34,"l1y":39,"l2x":28,"l2y":40,"l3x":11,"l3y":14,"l4x":11,"l4y":14,"l5x":28,"l5y":40},{"data":1000023,"id":500000229,"lvl":2,"x":22,"y":15,"res_time":0,"l1x":11,"l1y":34,"l2x":31,"l2y":41,"l3x":15,"l3y":37,"l4x":15,"l4y":37,"l5x":31,"l5y":41},{"data":1000028,"id":500000230,"lvl":3,"x":24,"y":24,"aim_angle":45,"aim_angle_draft":45,"aim_angle_war":45,"aim_angle_draft_war":45,"aim_angle2":135,"aim_angle_d2":135,"aim_angle3":45,"aim_angle_d3":45,"aim_angle4":225,"aim_angle_d4":225,"aim_angle5":45,"aim_angle_d5":45,"l1x":29,"l1y":23,"l2x":30,"l2y":17,"l3x":30,"l3y":24,"l4x":31,"l4y":24,"l5x":31,"l5y":16},{"data":1000003,"id":500000231,"lvl":10,"x":36,"y":27,"l1x":27,"l1y":33,"l2x":18,"l2y":32,"l3x":34,"l3y":29,"l4x":34,"l4y":29,"l5x":19,"l5y":32},{"data":1000005,"id":500000232,"lvl":10,"x":27,"y":36,"l1x":32,"l1y":18,"l2x":36,"l2y":27,"l3x":14,"l3y":26,"l4x":24,"l4y":29,"l5x":36,"l5y":27},{"data":1000009,"id":500000233,"lvl":9,"x":21,"y":24,"l1x":36,"l1y":29,"l2x":36,"l2y":31,"l3x":12,"l3y":32,"l4x":12,"l4y":32,"l5x":36,"l5y":31},{"data":1000011,"id":500000234,"lvl":5,"x":31,"y":36,"l1x":30,"l1y":13,"l2x":30,"l2y":23,"l3x":38,"l3y":33,"l4x":20,"l4y":19,"l5x":31,"l5y":22},{"data":1000013,"id":500000235,"lvl":5,"x":27,"y":33,"l1x":21,"l1y":28,"l2x":19,"l2y":9,"l3x":33,"l3y":35,"l4x":33,"l4y":35,"l5x":19,"l5y":9},{"data":1000012,"id":500000236,"lvl":5,"x":18,"y":18,"l1x":31,"l1y":22,"l2x":22,"l2y":18,"l3x":29,"l3y":27,"l4x":29,"l4y":27,"l5x":22,"l5y":18},{"data":1000010,"id":500000237,"lvl":7,"x":30,"y":17,"l1x":30,"l1y":37,"l2x":16,"l2y":20,"l3x":17,"l3y":30,"l4x":17,"l4y":30,"l5x":16,"l5y":20},{"data":1000010,"id":500000238,"lvl":7,"x":31,"y":17,"l1x":30,"l1y":33,"l2x":16,"l2y":22,"l3x":16,"l3y":31,"l4x":16,"l4y":31,"l5x":16,"l5y":22},{"data":1000010,"id":500000239,"lvl":7,"x":32,"y":17,"l1x":38,"l1y":33,"l2x":16,"l2y":21,"l3x":17,"l3y":31,"l4x":17,"l4y":31,"l5x":16,"l5y":21},{"data":1000010,"id":500000240,"lvl":7,"x":33,"y":17,"l1x":31,"l1y":32,"l2x":17,"l2y":22,"l3x":18,"l3y":31,"l4x":18,"l4y":31,"l5x":17,"l5y":22},{"data":1000010,"id":500000241,"lvl":7,"x":15,"y":25,"l1x":33,"l1y":26,"l2x":18,"l2y":22,"l3x":19,"l3y":31,"l4x":19,"l4y":31,"l5x":18,"l5y":22},{"data":1000010,"id":500000242,"lvl":7,"x":16,"y":25,"l1x":33,"l1y":27,"l2x":19,"l2y":22,"l3x":20,"l3y":31,"l4x":20,"l4y":31,"l5x":19,"l5y":22},{"data":1000010,"id":500000243,"lvl":7,"x":17,"y":25,"l1x":33,"l1y":28,"l2x":20,"l2y":22,"l3x":22,"l3y":31,"l4x":22,"l4y":31,"l5x":20,"l5y":22},{"data":1000010,"id":500000244,"lvl":7,"x":17,"y":26,"l1x":33,"l1y":29,"l2x":21,"l2y":22,"l3x":23,"l3y":28,"l4x":23,"l4y":28,"l5x":21,"l5y":22},{"data":1000010,"id":500000245,"lvl":7,"x":17,"y":27,"l1x":33,"l1y":30,"l2x":31,"l2y":22,"l3x":23,"l3y":29,"l4x":23,"l4y":29,"l5x":32,"l5y":21},{"data":1000010,"id":500000246,"lvl":7,"x":17,"y":28,"l1x":33,"l1y":31,"l2x":32,"l2y":22,"l3x":24,"l3y":28,"l4x":24,"l4y":28,"l5x":29,"l5y":21},{"data":1000010,"id":500000247,"lvl":7,"x":17,"y":29,"l1x":33,"l1y":32,"l2x":33,"l2y":22,"l3x":31,"l3y":26,"l4x":31,"l4y":26,"l5x":34,"l5y":21},{"data":1000010,"id":500000248,"lvl":7,"x":17,"y":30,"l1x":32,"l1y":32,"l2x":33,"l2y":23,"l3x":23,"l3y":31,"l4x":23,"l4y":31,"l5x":35,"l5y":22},{"data":1000010,"id":500000249,"lvl":7,"x":17,"y":31,"l1x":22,"l1y":36,"l2x":33,"l2y":24,"l3x":30,"l3y":26,"l4x":30,"l4y":26,"l5x":35,"l5y":23},{"data":1000010,"id":500000250,"lvl":7,"x":17,"y":32,"l1x":16,"l1y":27,"l2x":33,"l2y":25,"l3x":26,"l3y":32,"l4x":26,"l4y":32,"l5x":35,"l5y":24},{"data":1000010,"id":500000251,"lvl":7,"x":17,"y":33,"l1x":15,"l1y":27,"l2x":33,"l2y":26,"l3x":27,"l3y":32,"l4x":27,"l4y":32,"l5x":32,"l5y":26},{"data":1000010,"id":500000252,"lvl":7,"x":17,"y":34,"l1x":16,"l1y":19,"l2x":34,"l2y":27,"l3x":28,"l3y":32,"l4x":28,"l4y":32,"l5x":35,"l5y":25},{"data":1000010,"id":500000253,"lvl":7,"x":34,"y":17,"l1x":38,"l1y":32,"l2x":33,"l2y":27,"l3x":29,"l3y":32,"l4x":29,"l4y":32,"l5x":31,"l5y":26},{"data":1000010,"id":500000254,"lvl":7,"x":34,"y":18,"l1x":20,"l1y":28,"l2x":32,"l2y":27,"l3x":30,"l3y":32,"l4x":30,"l4y":32,"l5x":33,"l5y":26},{"data":1000010,"id":500000255,"lvl":7,"x":34,"y":20,"l1x":20,"l1y":29,"l2x":31,"l2y":27,"l3x":32,"l3y":32,"l4x":32,"l4y":32,"l5x":30,"l5y":26},{"data":1000010,"id":500000256,"lvl":7,"x":34,"y":19,"l1x":20,"l1y":30,"l2x":30,"l2y":27,"l3x":32,"l3y":31,"l4x":32,"l4y":31,"l5x":29,"l5y":26},{"data":1000010,"id":500000257,"lvl":7,"x":34,"y":21,"l1x":14,"l1y":34,"l2x":29,"l2y":27,"l3x":32,"l3y":30,"l4x":32,"l4y":30,"l5x":29,"l5y":27},{"data":1000010,"id":500000258,"lvl":7,"x":33,"y":21,"l1x":19,"l1y":27,"l2x":30,"l2y":22,"l3x":32,"l3y":29,"l4x":32,"l4y":29,"l5x":31,"l5y":21},{"data":1000010,"id":500000259,"lvl":7,"x":18,"y":34,"l1x":21,"l1y":36,"l2x":29,"l2y":22,"l3x":32,"l3y":28,"l4x":32,"l4y":28,"l5x":28,"l5y":21},{"data":1000010,"id":500000260,"lvl":7,"x":19,"y":34,"l1x":23,"l1y":39,"l2x":28,"l2y":22,"l3x":32,"l3y":27,"l4x":32,"l4y":27,"l5x":28,"l5y":22},{"data":1000010,"id":500000261,"lvl":7,"x":20,"y":34,"l1x":23,"l1y":38,"l2x":27,"l2y":22,"l3x":32,"l3y":26,"l4x":32,"l4y":26,"l5x":27,"l5y":22},{"data":1000010,"id":500000262,"lvl":7,"x":21,"y":34,"l1x":23,"l1y":37,"l2x":26,"l2y":22,"l3x":28,"l3y":25,"l4x":28,"l4y":25,"l5x":26,"l5y":22},{"data":1000010,"id":500000263,"lvl":7,"x":21,"y":33,"l1x":23,"l1y":36,"l2x":25,"l2y":22,"l3x":31,"l3y":32,"l4x":31,"l4y":32,"l5x":25,"l5y":22},{"data":1000010,"id":500000264,"lvl":7,"x":21,"y":32,"l1x":23,"l1y":34,"l2x":24,"l2y":22,"l3x":29,"l3y":26,"l4x":29,"l4y":26,"l5x":24,"l5y":22},{"data":1000010,"id":500000265,"lvl":7,"x":32,"y":21,"l1x":23,"l1y":35,"l2x":23,"l2y":22,"l3x":28,"l3y":26,"l4x":28,"l4y":26,"l5x":23,"l5y":22},{"data":1000010,"id":500000266,"lvl":7,"x":31,"y":21,"l1x":17,"l1y":35,"l2x":22,"l2y":22,"l3x":23,"l3y":30,"l4x":23,"l4y":30,"l5x":22,"l5y":22},{"data":1000010,"id":500000267,"lvl":7,"x":30,"y":21,"l1x":17,"l1y":36,"l2x":22,"l2y":23,"l3x":27,"l3y":24,"l4x":27,"l4y":24,"l5x":22,"l5y":23},{"data":1000010,"id":500000268,"lvl":7,"x":29,"y":21,"l1x":18,"l1y":36,"l2x":22,"l2y":24,"l3x":26,"l3y":24,"l4x":26,"l4y":24,"l5x":22,"l5y":24},{"data":1000010,"id":500000269,"lvl":7,"x":28,"y":21,"l1x":18,"l1y":13,"l2x":22,"l2y":25,"l3x":25,"l3y":24,"l4x":25,"l4y":24,"l5x":22,"l5y":25},{"data":1000010,"id":500000270,"lvl":7,"x":21,"y":31,"l1x":18,"l1y":14,"l2x":22,"l2y":26,"l3x":24,"l3y":24,"l4x":24,"l4y":24,"l5x":22,"l5y":26},{"data":1000010,"id":500000271,"lvl":7,"x":21,"y":30,"l1x":18,"l1y":15,"l2x":28,"l2y":27,"l3x":24,"l3y":25,"l4x":24,"l4y":25,"l5x":28,"l5y":27},{"data":1000010,"id":500000272,"lvl":7,"x":21,"y":28,"l1x":18,"l1y":16,"l2x":27,"l2y":27,"l3x":24,"l3y":26,"l4x":24,"l4y":26,"l5x":27,"l5y":27},{"data":1000010,"id":500000273,"lvl":7,"x":27,"y":21,"l1x":17,"l1y":19,"l2x":26,"l2y":27,"l3x":24,"l3y":27,"l4x":24,"l4y":27,"l5x":26,"l5y":27},{"data":1000010,"id":500000274,"lvl":7,"x":27,"y":22,"l1x":18,"l1y":17,"l2x":25,"l2y":27,"l3x":23,"l3y":32,"l4x":23,"l4y":32,"l5x":25,"l5y":27},{"data":1000010,"id":500000275,"lvl":7,"x":27,"y":23,"l1x":19,"l1y":36,"l2x":24,"l2y":27,"l3x":24,"l3y":32,"l4x":24,"l4y":32,"l5x":24,"l5y":27},{"data":1000010,"id":500000276,"lvl":7,"x":27,"y":24,"l1x":30,"l1y":38,"l2x":23,"l2y":27,"l3x":39,"l3y":28,"l4x":39,"l4y":28,"l5x":23,"l5y":27},{"data":1000010,"id":500000277,"lvl":7,"x":21,"y":29,"l1x":29,"l1y":32,"l2x":39,"l2y":26,"l3x":21,"l3y":31,"l4x":21,"l4y":31,"l5x":39,"l5y":26},{"data":1000010,"id":500000278,"lvl":7,"x":22,"y":27,"l1x":28,"l1y":32,"l2x":40,"l2y":23,"l3x":29,"l3y":37,"l4x":29,"l4y":37,"l5x":40,"l5y":23},{"data":1000010,"id":500000279,"lvl":7,"x":26,"y":24,"l1x":27,"l1y":32,"l2x":39,"l2y":32,"l3x":36,"l3y":37,"l4x":36,"l4y":37,"l5x":39,"l5y":32},{"data":1000010,"id":500000280,"lvl":7,"x":26,"y":25,"l1x":26,"l1y":32,"l2x":22,"l2y":27,"l3x":40,"l3y":24,"l4x":40,"l4y":24,"l5x":22,"l5y":27},{"data":1000010,"id":500000281,"lvl":7,"x":24,"y":27,"l1x":25,"l1y":32,"l2x":24,"l2y":39,"l3x":28,"l3y":24,"l4x":28,"l4y":24,"l5x":24,"l5y":39},{"data":1000010,"id":500000282,"lvl":7,"x":23,"y":27,"l1x":24,"l1y":32,"l2x":31,"l2y":11,"l3x":25,"l3y":11,"l4x":25,"l4y":11,"l5x":31,"l5y":11},{"data":1000010,"id":500000283,"lvl":7,"x":26,"y":26,"l1x":23,"l1y":32,"l2x":40,"l2y":26,"l3x":17,"l3y":17,"l4x":17,"l4y":17,"l5x":40,"l5y":26},{"data":1000010,"id":500000284,"lvl":7,"x":25,"y":26,"l1x":21,"l1y":33,"l2x":40,"l2y":24,"l3x":13,"l3y":22,"l4x":13,"l4y":22,"l5x":40,"l5y":24},{"data":1000010,"id":500000285,"lvl":7,"x":24,"y":26,"l1x":20,"l1y":33,"l2x":40,"l2y":25,"l3x":15,"l3y":31,"l4x":15,"l4y":31,"l5x":40,"l5y":25},{"data":1000010,"id":500000286,"lvl":7,"x":21,"y":27,"l1x":20,"l1y":32,"l2x":24,"l2y":38,"l3x":25,"l3y":32,"l4x":25,"l4y":32,"l5x":24,"l5y":38},{"data":1000026,"id":500000288,"lvl":3,"x":10,"y":13,"unit_prod":{"unit_type":0},"l1x":40,"l1y":30,"l2x":38,"l2y":39,"l3x":38,"l3y":36,"l4x":38,"l4y":36,"l5x":38,"l5y":39},{"data":1000023,"id":500000289,"lvl":2,"x":15,"y":22,"res_time":0,"l1x":11,"l1y":37,"l2x":23,"l2y":10,"l3x":12,"l3y":35,"l4x":12,"l4y":35,"l5x":22,"l5y":11},{"data":1000029,"id":500000290,"lvl":1,"x":10,"y":10,"units":[[26000010,1]],"unit_prod":{"unit_type":1},"l1x":29,"l1y":9,"l2x":6,"l2y":23,"l3x":19,"l3y":40,"l4x":19,"l4y":40,"l5x":6,"l5y":23}],"obstacles":[{"data":8000004,"id":503000000,"x":47,"y":10,"loot_multiply_ver":2},{"data":8000007,"id":503000001,"x":1,"y":13,"loot_multiply_ver":2},{"data":8000000,"id":503000002,"x":14,"y":0,"loot_multiply_ver":2},{"data":8000008,"id":503000003,"x":0,"y":34,"loot_multiply_ver":2},{"data":8000006,"id":503000004,"x":29,"y":0,"loot_multiply_ver":2},{"data":8000007,"id":503000005,"x":19,"y":0,"loot_multiply_ver":2},{"data":8000013,"id":503000006,"x":29,"y":47,"loot_multiply_ver":2},{"data":8000007,"id":503000007,"x":7,"y":8,"loot_multiply_ver":2},{"data":8000010,"id":503000008,"x":0,"y":30,"loot_multiply_ver":2},{"data":8000000,"id":503000009,"x":25,"y":0,"loot_multiply_ver":2},{"data":8000004,"id":503000010,"x":24,"y":48,"loot_multiply_ver":2},{"data":8000000,"id":503000011,"x":8,"y":48,"loot_multiply_ver":2},{"data":8000010,"id":503000012,"x":8,"y":42,"loot_multiply_ver":2},{"data":8000000,"id":503000013,"x":1,"y":9,"loot_multiply_ver":2},{"data":8000000,"id":503000014,"x":2,"y":40,"loot_multiply_ver":2},{"data":8000004,"id":503000015,"x":35,"y":0,"loot_multiply_ver":2},{"data":8000007,"id":503000016,"x":1,"y":37,"loot_multiply_ver":2},{"data":8000007,"id":503000017,"x":15,"y":47,"loot_multiply_ver":2},{"data":8000007,"id":503000018,"x":1,"y":19,"loot_multiply_ver":2},{"data":8000000,"id":503000019,"x":0,"y":26,"loot_multiply_ver":2},{"data":8000013,"id":503000020,"x":18,"y":47,"loot_multiply_ver":2},{"data":8000007,"id":503000021,"x":48,"y":17,"loot_multiply_ver":2},{"data":8000010,"id":503000022,"x":48,"y":31,"loot_multiply_ver":2},{"data":8000004,"id":503000023,"x":11,"y":48,"loot_multiply_ver":2},{"data":8000000,"id":503000024,"x":48,"y":25,"loot_multiply_ver":2},{"data":8000008,"id":503000025,"x":48,"y":7,"loot_multiply_ver":2},{"data":8000004,"id":503000026,"x":46,"y":0,"loot_multiply_ver":2},{"data":8000007,"id":503000027,"x":48,"y":34,"loot_multiply_ver":2},{"data":8000010,"id":503000028,"x":1,"y":2,"loot_multiply_ver":2},{"data":8000004,"id":503000029,"x":0,"y":47,"loot_multiply_ver":2},{"data":8000000,"id":503000030,"x":48,"y":38,"loot_multiply_ver":2},{"data":8000010,"id":503000031,"x":1,"y":16,"loot_multiply_ver":2},{"data":8000000,"id":503000032,"x":1,"y":23,"loot_multiply_ver":2},{"data":8000006,"id":503000033,"x":39,"y":48,"loot_multiply_ver":2},{"data":8000036,"id":503000034,"x":48,"y":20,"loot_multiply_ver":2},{"data":8000006,"id":503000035,"x":47,"y":41,"loot_multiply_ver":2},{"data":8000000,"id":503000036,"x":47,"y":28,"loot_multiply_ver":2},{"data":8000007,"id":503000037,"x":33,"y":48,"loot_multiply_ver":2},{"data":8000005,"id":503000038,"x":7,"y":1,"loot_multiply_ver":2},{"data":8000036,"id":503000039,"x":41,"y":10,"loot_multiply_ver":2},{"data":8000036,"id":503000040,"x":7,"y":39,"loot_multiply_ver":1},{"data":8000036,"id":503000041,"x":48,"y":13,"loot_multiply_ver":2},{"data":8000036,"id":503000042,"x":22,"y":2,"loot_multiply_ver":2},{"data":8000036,"id":503000043,"x":42,"y":6,"loot_multiply_ver":2},{"data":8000036,"id":503000044,"x":8,"y":33,"loot_multiply_ver":1},{"data":8000037,"id":503000078,"x":36,"y":48,"loot_multiply_ver":2},{"data":8000037,"id":503000119,"x":44,"y":14,"loot_multiply_ver":2},{"data":8000037,"id":503000160,"x":36,"y":3,"loot_multiply_ver":2},{"data":8000037,"id":503000201,"x":3,"y":5,"loot_multiply_ver":2},{"data":8000037,"id":503000242,"x":17,"y":41,"loot_multiply_ver":2},{"data":8000037,"id":503000243,"x":42,"y":21,"loot_multiply_ver":2},{"data":8000037,"id":503000284,"x":40,"y":1,"loot_multiply_ver":2},{"data":8000037,"id":503000305,"x":32,"y":4,"loot_multiply_ver":2},{"data":8000009,"id":503000306,"x":40,"y":22,"loot_multiply_ver":1},{"data":8000009,"id":503000307,"x":44,"y":41,"loot_multiply_ver":1},{"data":8000009,"id":503000308,"x":43,"y":28,"loot_multiply_ver":1},{"data":8000009,"id":503000309,"x":43,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000310,"x":44,"y":24,"loot_multiply_ver":1},{"data":8000023,"id":503000311,"x":43,"y":25,"loot_multiply_ver":1},{"data":8000023,"id":503000312,"x":44,"y":25,"loot_multiply_ver":1},{"data":8000023,"id":503000313,"x":43,"y":24,"loot_multiply_ver":1},{"data":8000023,"id":503000314,"x":42,"y":25,"loot_multiply_ver":1},{"data":8000023,"id":503000315,"x":44,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000316,"x":33,"y":45,"loot_multiply_ver":1},{"data":8000009,"id":503000317,"x":34,"y":44,"loot_multiply_ver":1},{"data":8000009,"id":503000318,"x":38,"y":33,"loot_multiply_ver":1},{"data":8000009,"id":503000319,"x":41,"y":25,"loot_multiply_ver":1},{"data":8000009,"id":503000320,"x":42,"y":24,"loot_multiply_ver":1},{"data":8000009,"id":503000321,"x":42,"y":29,"loot_multiply_ver":1},{"data":8000009,"id":503000322,"x":41,"y":29,"loot_multiply_ver":1},{"data":8000009,"id":503000323,"x":42,"y":28,"loot_multiply_ver":1},{"data":8000009,"id":503000324,"x":43,"y":29,"loot_multiply_ver":1},{"data":8000009,"id":503000325,"x":32,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000326,"x":31,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000327,"x":30,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000328,"x":33,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000329,"x":29,"y":42,"loot_multiply_ver":1},{"data":8000009,"id":503000330,"x":28,"y":42,"loot_multiply_ver":1},{"data":8000009,"id":503000331,"x":29,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000332,"x":26,"y":37,"loot_multiply_ver":1},{"data":8000009,"id":503000333,"x":20,"y":39,"loot_multiply_ver":1},{"data":8000009,"id":503000334,"x":20,"y":38,"loot_multiply_ver":1},{"data":8000009,"id":503000335,"x":27,"y":25,"loot_multiply_ver":1},{"data":8000009,"id":503000336,"x":26,"y":34,"loot_multiply_ver":1},{"data":8000009,"id":503000337,"x":32,"y":22,"loot_multiply_ver":1},{"data":8000009,"id":503000338,"x":35,"y":20,"loot_multiply_ver":1},{"data":8000009,"id":503000339,"x":26,"y":35,"loot_multiply_ver":1},{"data":8000009,"id":503000340,"x":36,"y":20,"loot_multiply_ver":1},{"data":8000009,"id":503000341,"x":28,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000342,"x":26,"y":36,"loot_multiply_ver":1},{"data":8000009,"id":503000343,"x":28,"y":25,"loot_multiply_ver":1},{"data":8000009,"id":503000344,"x":29,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000345,"x":20,"y":35,"loot_multiply_ver":1},{"data":8000038,"id":503000346,"x":45,"y":3,"defg":117171,"defe":104847,"defde":307,"loot_multiply_ver":1}],"decos":[],"respawnVars":{"secondsFromLastRespawn":231386,"respawnSeed":1914935487,"obstacleClearCounter":5,"time_to_gembox_drop":196966,"time_in_gembox_period":228665},"cooldowns":[],"newShopBuildings":[4,0,6,3,6,3,4,1,5,5,225,3,3,4,1,5,0,0,0,3,1,0,1,2,1,0,2,0,1,1,0,0],"newShopTraps":[6,6,3,0,0,4,2,0,2],"newShopDecos":[1,4,0,1,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"last_league_rank":9,"last_alliance_level":7,"last_league_shuffle":1,"last_season_seen":0,"last_news_seen":221,"troop_req_msg":"max hogs and max poison","war_req_msg":"2 witches, 1 barb","war_tutorials_seen":0,"war_base":true,"account_flags":14,"bool_layout_edit_shown_erase":true} \ No newline at end of file diff --git a/src/main/resources/examples/th9-sample-1.json b/src/main/resources/examples/th9-sample-1.json new file mode 100644 index 0000000..785f9b1 --- /dev/null +++ b/src/main/resources/examples/th9-sample-1.json @@ -0,0 +1 @@ +{"wave_num":6,"exp_ver":1,"active_layout":0,"war_layout":1,"layout_state":[0,0,0,0,0,0],"buildings":[{"data":1000001,"id":500000000,"lvl":8,"x":30,"y":30,"l1x":25,"l1y":19,"l2x":13,"l2y":26,"l3x":29,"l3y":20,"l4x":29,"l4y":20,"l5x":13,"l5y":26},{"data":1000004,"id":500000001,"lvl":11,"x":22,"y":33,"res_time":87169,"l1x":11,"l1y":31,"l2x":24,"l2y":40,"l3x":41,"l3y":33,"l4x":41,"l4y":33,"l5x":24,"l5y":40},{"data":1000000,"id":500000002,"lvl":5,"x":35,"y":15,"units":[[4000008,2]],"l1x":29,"l1y":39,"l2x":38,"l2y":14,"l3x":40,"l3y":19,"l4x":40,"l4y":19,"l5x":38,"l5y":14},{"data":1000015,"id":500000003,"lvl":0,"x":41,"y":41,"l1x":14,"l1y":39,"l2x":9,"l2y":33,"l3x":36,"l3y":12,"l4x":36,"l4y":12,"l5x":41,"l5y":34},{"data":1000014,"id":500000004,"lvl":3,"x":27,"y":27,"l1x":25,"l1y":24,"l2x":23,"l2y":23,"l3x":25,"l3y":25,"l4x":25,"l4y":25,"l5x":23,"l5y":23},{"data":1000008,"id":500000005,"lvl":9,"x":37,"y":37,"l1x":36,"l1y":25,"l2x":33,"l2y":37,"l3x":34,"l3y":39,"l4x":34,"l4y":39,"l5x":33,"l5y":37},{"data":1000015,"id":500000006,"lvl":0,"x":38,"y":41,"l1x":16,"l1y":39,"l2x":37,"l2y":12,"l3x":32,"l3y":9,"l4x":32,"l4y":9,"l5x":37,"l5y":12},{"data":1000002,"id":500000007,"lvl":11,"x":37,"y":22,"res_time":87173,"l1x":21,"l1y":9,"l2x":41,"l2y":24,"l3x":8,"l3y":20,"l4x":8,"l4y":20,"l5x":41,"l5y":24},{"data":1000003,"id":500000008,"lvl":10,"x":39,"y":30,"l1x":16,"l1y":20,"l2x":26,"l2y":15,"l3x":29,"l3y":34,"l4x":29,"l4y":33,"l5x":26,"l5y":15},{"data":1000005,"id":500000009,"lvl":10,"x":30,"y":39,"l1x":24,"l1y":33,"l2x":27,"l2y":33,"l3x":16,"l3y":32,"l4x":16,"l4y":32,"l5x":27,"l5y":33},{"data":1000006,"id":500000010,"lvl":9,"x":8,"y":27,"unit_prod":{"unit_type":0},"l1x":40,"l1y":27,"l2x":21,"l2y":39,"l3x":30,"l3y":39,"l4x":30,"l4y":39,"l5x":21,"l5y":39},{"data":1000004,"id":500000011,"lvl":11,"x":33,"y":22,"res_time":65399,"l1x":18,"l1y":8,"l2x":36,"l2y":24,"l3x":42,"l3y":25,"l4x":42,"l4y":25,"l5x":36,"l5y":24},{"data":1000006,"id":500000012,"lvl":9,"x":21,"y":10,"unit_prod":{"unit_type":0},"l1x":39,"l1y":36,"l2x":18,"l2y":39,"l3x":7,"l3y":28,"l4x":7,"l4y":28,"l5x":18,"l5y":39},{"data":1000002,"id":500000013,"lvl":11,"x":31,"y":14,"res_time":61037,"l1x":34,"l1y":11,"l2x":41,"l2y":19,"l3x":8,"l3y":17,"l4x":8,"l4y":17,"l5x":41,"l5y":19},{"data":1000009,"id":500000014,"lvl":9,"x":24,"y":30,"l1x":15,"l1y":16,"l2x":12,"l2y":15,"l3x":24,"l3y":35,"l4x":24,"l4y":35,"l5x":12,"l5y":15},{"data":1000008,"id":500000015,"lvl":9,"x":10,"y":32,"l1x":30,"l1y":26,"l2x":9,"l2y":22,"l3x":38,"l3y":25,"l4x":38,"l4y":25,"l5x":9,"l5y":22},{"data":1000000,"id":500000016,"lvl":5,"x":15,"y":35,"units":[[4000008,2]],"l1x":24,"l1y":8,"l2x":32,"l2y":9,"l3x":20,"l3y":5,"l4x":20,"l4y":5,"l5x":32,"l5y":9},{"data":1000002,"id":500000017,"lvl":11,"x":10,"y":17,"res_time":87181,"l1x":37,"l1y":15,"l2x":40,"l2y":35,"l3x":14,"l3y":22,"l4x":14,"l4y":22,"l5x":9,"l5y":34},{"data":1000004,"id":500000018,"lvl":11,"x":14,"y":31,"res_time":61057,"l1x":40,"l1y":24,"l2x":15,"l2y":11,"l3x":40,"l3y":29,"l4x":40,"l4y":29,"l5x":15,"l5y":11},{"data":1000003,"id":500000019,"lvl":10,"x":39,"y":33,"l1x":35,"l1y":22,"l2x":19,"l2y":14,"l3x":22,"l3y":14,"l4x":22,"l4y":14,"l5x":20,"l5y":14},{"data":1000005,"id":500000020,"lvl":10,"x":33,"y":39,"l1x":19,"l1y":16,"l2x":30,"l2y":19,"l3x":18,"l3y":23,"l4x":18,"l4y":23,"l5x":30,"l5y":18},{"data":1000010,"id":500000021,"lvl":7,"x":40,"y":37,"l1x":24,"l1y":39,"l2x":23,"l2y":35,"l3x":36,"l3y":35,"l4x":36,"l4y":35,"l5x":24,"l5y":34},{"data":1000010,"id":500000022,"lvl":7,"x":42,"y":35,"l1x":25,"l1y":39,"l2x":23,"l2y":33,"l3x":15,"l3y":16,"l4x":15,"l4y":16,"l5x":24,"l5y":33},{"data":1000010,"id":500000023,"lvl":7,"x":42,"y":36,"l1x":26,"l1y":39,"l2x":24,"l2y":32,"l3x":15,"l3y":15,"l4x":15,"l4y":15,"l5x":24,"l5y":32},{"data":1000010,"id":500000024,"lvl":7,"x":41,"y":36,"l1x":27,"l1y":39,"l2x":15,"l2y":19,"l3x":15,"l3y":14,"l4x":15,"l4y":14,"l5x":13,"l5y":20},{"data":1000010,"id":500000025,"lvl":7,"x":34,"y":42,"l1x":28,"l1y":39,"l2x":14,"l2y":19,"l3x":22,"l3y":18,"l4x":19,"l4y":18,"l5x":15,"l5y":20},{"data":1000010,"id":500000026,"lvl":7,"x":35,"y":42,"l1x":26,"l1y":23,"l2x":13,"l2y":19,"l3x":41,"l3y":28,"l4x":41,"l4y":28,"l5x":34,"l5y":20},{"data":1000010,"id":500000027,"lvl":7,"x":36,"y":42,"l1x":29,"l1y":38,"l2x":17,"l2y":31,"l3x":15,"l3y":13,"l4x":15,"l4y":13,"l5x":17,"l5y":31},{"data":1000010,"id":500000028,"lvl":7,"x":37,"y":42,"l1x":30,"l1y":35,"l2x":17,"l2y":32,"l3x":16,"l3y":13,"l4x":16,"l4y":13,"l5x":17,"l5y":32},{"data":1000010,"id":500000029,"lvl":7,"x":37,"y":41,"l1x":31,"l1y":38,"l2x":17,"l2y":33,"l3x":17,"l3y":13,"l4x":17,"l4y":13,"l5x":17,"l5y":33},{"data":1000010,"id":500000030,"lvl":7,"x":40,"y":26,"l1x":32,"l1y":38,"l2x":16,"l2y":33,"l3x":18,"l3y":13,"l4x":18,"l4y":13,"l5x":16,"l5y":33},{"data":1000010,"id":500000031,"lvl":7,"x":37,"y":40,"l1x":34,"l1y":38,"l2x":15,"l2y":33,"l3x":19,"l3y":13,"l4x":19,"l4y":13,"l5x":15,"l5y":33},{"data":1000010,"id":500000032,"lvl":7,"x":38,"y":40,"l1x":35,"l1y":38,"l2x":14,"l2y":33,"l3x":36,"l3y":38,"l4x":36,"l4y":38,"l5x":14,"l5y":33},{"data":1000010,"id":500000033,"lvl":7,"x":39,"y":40,"l1x":36,"l1y":38,"l2x":13,"l2y":33,"l3x":41,"l3y":27,"l4x":41,"l4y":27,"l5x":13,"l5y":33},{"data":1000010,"id":500000034,"lvl":7,"x":40,"y":36,"l1x":37,"l1y":38,"l2x":12,"l2y":33,"l3x":35,"l3y":38,"l4x":35,"l4y":38,"l5x":12,"l5y":33},{"data":1000010,"id":500000035,"lvl":7,"x":42,"y":34,"l1x":38,"l1y":38,"l2x":11,"l2y":33,"l3x":34,"l3y":38,"l4x":34,"l4y":38,"l5x":11,"l5y":33},{"data":1000010,"id":500000036,"lvl":7,"x":40,"y":38,"l1x":38,"l1y":37,"l2x":11,"l2y":32,"l3x":33,"l3y":38,"l4x":33,"l4y":38,"l5x":11,"l5y":32},{"data":1000010,"id":500000037,"lvl":7,"x":40,"y":39,"l1x":38,"l1y":36,"l2x":11,"l2y":31,"l3x":32,"l3y":38,"l4x":32,"l4y":38,"l5x":11,"l5y":31},{"data":1000010,"id":500000038,"lvl":7,"x":39,"y":26,"l1x":32,"l1y":21,"l2x":11,"l2y":30,"l3x":31,"l3y":38,"l4x":31,"l4y":38,"l5x":11,"l5y":30},{"data":1000010,"id":500000039,"lvl":7,"x":38,"y":26,"l1x":29,"l1y":19,"l2x":11,"l2y":29,"l3x":31,"l3y":37,"l4x":31,"l4y":37,"l5x":11,"l5y":29},{"data":1000010,"id":500000040,"lvl":7,"x":38,"y":25,"l1x":38,"l1y":35,"l2x":12,"l2y":29,"l3x":36,"l3y":34,"l4x":36,"l4y":34,"l5x":12,"l5y":29},{"data":1000010,"id":500000041,"lvl":7,"x":37,"y":25,"l1x":38,"l1y":34,"l2x":12,"l2y":28,"l3x":36,"l3y":33,"l4x":36,"l4y":33,"l5x":12,"l5y":28},{"data":1000010,"id":500000042,"lvl":7,"x":36,"y":25,"l1x":27,"l1y":13,"l2x":12,"l2y":27,"l3x":36,"l3y":36,"l4x":36,"l4y":36,"l5x":12,"l5y":27},{"data":1000010,"id":500000043,"lvl":7,"x":36,"y":24,"l1x":23,"l1y":13,"l2x":12,"l2y":26,"l3x":23,"l3y":37,"l4x":22,"l4y":38,"l5x":12,"l5y":26},{"data":1000010,"id":500000044,"lvl":7,"x":36,"y":23,"l1x":24,"l1y":13,"l2x":12,"l2y":19,"l3x":30,"l3y":37,"l4x":30,"l4y":37,"l5x":34,"l5y":22},{"data":1000010,"id":500000045,"lvl":7,"x":36,"y":22,"l1x":25,"l1y":13,"l2x":12,"l2y":20,"l3x":27,"l3y":38,"l4x":27,"l4y":38,"l5x":12,"l5y":20},{"data":1000010,"id":500000046,"lvl":7,"x":36,"y":21,"l1x":26,"l1y":13,"l2x":12,"l2y":21,"l3x":33,"l3y":32,"l4x":33,"l4y":32,"l5x":12,"l5y":21},{"data":1000010,"id":500000047,"lvl":7,"x":35,"y":21,"l1x":28,"l1y":13,"l2x":12,"l2y":22,"l3x":34,"l3y":32,"l4x":34,"l4y":32,"l5x":12,"l5y":22},{"data":1000010,"id":500000048,"lvl":7,"x":40,"y":40,"l1x":32,"l1y":12,"l2x":12,"l2y":23,"l3x":35,"l3y":32,"l4x":35,"l4y":32,"l5x":12,"l5y":23},{"data":1000010,"id":500000049,"lvl":7,"x":12,"y":8,"l1x":29,"l1y":14,"l2x":12,"l2y":24,"l3x":36,"l3y":32,"l4x":36,"l4y":32,"l5x":12,"l5y":24},{"data":1000010,"id":500000050,"lvl":7,"x":26,"y":39,"l1x":29,"l1y":16,"l2x":12,"l2y":25,"l3x":37,"l3y":32,"l4x":37,"l4y":32,"l5x":12,"l5y":25},{"data":1000010,"id":500000051,"lvl":7,"x":26,"y":38,"l1x":29,"l1y":15,"l2x":18,"l2y":16,"l3x":37,"l3y":31,"l4x":37,"l4y":31,"l5x":18,"l5y":16},{"data":1000010,"id":500000052,"lvl":7,"x":25,"y":38,"l1x":29,"l1y":17,"l2x":18,"l2y":15,"l3x":37,"l3y":30,"l4x":37,"l4y":30,"l5x":18,"l5y":15},{"data":1000010,"id":500000053,"lvl":7,"x":25,"y":37,"l1x":31,"l1y":12,"l2x":18,"l2y":14,"l3x":37,"l3y":29,"l4x":37,"l4y":29,"l5x":18,"l5y":14},{"data":1000010,"id":500000054,"lvl":7,"x":25,"y":36,"l1x":36,"l1y":16,"l2x":18,"l2y":13,"l3x":37,"l3y":28,"l4x":37,"l4y":28,"l5x":18,"l5y":13},{"data":1000010,"id":500000055,"lvl":7,"x":24,"y":36,"l1x":29,"l1y":12,"l2x":18,"l2y":12,"l3x":38,"l3y":28,"l4x":38,"l4y":28,"l5x":18,"l5y":12},{"data":1000010,"id":500000056,"lvl":7,"x":23,"y":36,"l1x":35,"l1y":14,"l2x":18,"l2y":11,"l3x":40,"l3y":28,"l4x":40,"l4y":28,"l5x":18,"l5y":11},{"data":1000010,"id":500000057,"lvl":7,"x":22,"y":36,"l1x":36,"l1y":14,"l2x":18,"l2y":10,"l3x":41,"l3y":25,"l4x":41,"l4y":25,"l5x":18,"l5y":10},{"data":1000010,"id":500000058,"lvl":7,"x":21,"y":36,"l1x":29,"l1y":20,"l2x":18,"l2y":9,"l3x":41,"l3y":24,"l4x":41,"l4y":24,"l5x":18,"l5y":9},{"data":1000010,"id":500000059,"lvl":7,"x":8,"y":35,"l1x":30,"l1y":20,"l2x":18,"l2y":8,"l3x":34,"l3y":23,"l4x":34,"l4y":23,"l5x":18,"l5y":8},{"data":1000010,"id":500000060,"lvl":7,"x":21,"y":35,"l1x":31,"l1y":20,"l2x":30,"l2y":13,"l3x":35,"l3y":23,"l4x":35,"l4y":23,"l5x":30,"l5y":13},{"data":1000010,"id":500000061,"lvl":7,"x":7,"y":35,"l1x":31,"l1y":21,"l2x":19,"l2y":8,"l3x":36,"l3y":23,"l4x":36,"l4y":23,"l5x":19,"l5y":8},{"data":1000010,"id":500000062,"lvl":7,"x":7,"y":34,"l1x":34,"l1y":24,"l2x":20,"l2y":8,"l3x":37,"l3y":23,"l4x":37,"l4y":23,"l5x":20,"l5y":8},{"data":1000010,"id":500000063,"lvl":7,"x":7,"y":33,"l1x":34,"l1y":23,"l2x":21,"l2y":8,"l3x":38,"l3y":23,"l4x":38,"l4y":23,"l5x":21,"l5y":8},{"data":1000010,"id":500000064,"lvl":7,"x":7,"y":32,"l1x":34,"l1y":22,"l2x":22,"l2y":8,"l3x":39,"l3y":24,"l4x":39,"l4y":24,"l5x":22,"l5y":8},{"data":1000010,"id":500000065,"lvl":7,"x":7,"y":31,"l1x":33,"l1y":21,"l2x":23,"l2y":8,"l3x":39,"l3y":23,"l4x":39,"l4y":23,"l5x":23,"l5y":8},{"data":1000010,"id":500000066,"lvl":7,"x":7,"y":30,"l1x":34,"l1y":21,"l2x":24,"l2y":8,"l3x":39,"l3y":22,"l4x":39,"l4y":22,"l5x":24,"l5y":8},{"data":1000010,"id":500000067,"lvl":7,"x":7,"y":29,"l1x":30,"l1y":25,"l2x":25,"l2y":8,"l3x":39,"l3y":21,"l4x":39,"l4y":21,"l5x":25,"l5y":8},{"data":1000010,"id":500000068,"lvl":7,"x":7,"y":28,"l1x":31,"l1y":25,"l2x":26,"l2y":8,"l3x":39,"l3y":20,"l4x":39,"l4y":20,"l5x":26,"l5y":8},{"data":1000010,"id":500000069,"lvl":7,"x":7,"y":27,"l1x":32,"l1y":25,"l2x":27,"l2y":8,"l3x":39,"l3y":19,"l4x":39,"l4y":19,"l5x":27,"l5y":8},{"data":1000010,"id":500000070,"lvl":7,"x":7,"y":26,"l1x":19,"l1y":22,"l2x":28,"l2y":8,"l3x":39,"l3y":18,"l4x":39,"l4y":18,"l5x":28,"l5y":8},{"data":1000013,"id":500000071,"lvl":5,"x":18,"y":25,"l1x":35,"l1y":34,"l2x":15,"l2y":14,"l3x":36,"l3y":15,"l4x":36,"l4y":15,"l5x":15,"l5y":14},{"data":1000007,"id":500000072,"lvl":5,"x":21,"y":37,"l1x":10,"l1y":14,"l2x":8,"l2y":14,"l3x":26,"l3y":10,"l4x":26,"l4y":10,"l5x":8,"l5y":14},{"data":1000010,"id":500000073,"lvl":7,"x":9,"y":35,"l1x":19,"l1y":21,"l2x":29,"l2y":8,"l3x":39,"l3y":17,"l4x":39,"l4y":17,"l5x":29,"l5y":8},{"data":1000010,"id":500000074,"lvl":7,"x":35,"y":8,"l1x":19,"l1y":23,"l2x":30,"l2y":8,"l3x":39,"l3y":16,"l4x":39,"l4y":16,"l5x":30,"l5y":8},{"data":1000010,"id":500000075,"lvl":7,"x":35,"y":7,"l1x":20,"l1y":23,"l2x":31,"l2y":8,"l3x":39,"l3y":15,"l4x":39,"l4y":15,"l5x":31,"l5y":8},{"data":1000010,"id":500000076,"lvl":7,"x":34,"y":7,"l1x":33,"l1y":25,"l2x":31,"l2y":9,"l3x":39,"l3y":14,"l4x":39,"l4y":14,"l5x":31,"l5y":9},{"data":1000010,"id":500000077,"lvl":7,"x":33,"y":7,"l1x":28,"l1y":25,"l2x":31,"l2y":10,"l3x":38,"l3y":14,"l4x":38,"l4y":14,"l5x":31,"l5y":10},{"data":1000010,"id":500000078,"lvl":7,"x":32,"y":7,"l1x":29,"l1y":25,"l2x":23,"l2y":13,"l3x":37,"l3y":14,"l4x":37,"l4y":14,"l5x":35,"l5y":26},{"data":1000010,"id":500000079,"lvl":7,"x":31,"y":7,"l1x":28,"l1y":24,"l2x":23,"l2y":15,"l3x":36,"l3y":14,"l4x":36,"l4y":14,"l5x":25,"l5y":15},{"data":1000010,"id":500000080,"lvl":7,"x":30,"y":7,"l1x":19,"l1y":20,"l2x":24,"l2y":13,"l3x":35,"l3y":14,"l4x":35,"l4y":14,"l5x":34,"l5y":26},{"data":1000010,"id":500000081,"lvl":7,"x":29,"y":7,"l1x":34,"l1y":25,"l2x":23,"l2y":14,"l3x":34,"l3y":14,"l4x":34,"l4y":14,"l5x":25,"l5y":16},{"data":1000010,"id":500000082,"lvl":7,"x":28,"y":7,"l1x":19,"l1y":19,"l2x":25,"l2y":13,"l3x":33,"l3y":14,"l4x":33,"l4y":14,"l5x":25,"l5y":13},{"data":1000010,"id":500000083,"lvl":7,"x":27,"y":7,"l1x":22,"l1y":19,"l2x":26,"l2y":13,"l3x":32,"l3y":14,"l4x":32,"l4y":14,"l5x":26,"l5y":13},{"data":1000010,"id":500000084,"lvl":7,"x":26,"y":7,"l1x":21,"l1y":19,"l2x":27,"l2y":13,"l3x":31,"l3y":14,"l4x":31,"l4y":14,"l5x":27,"l5y":13},{"data":1000010,"id":500000085,"lvl":7,"x":25,"y":7,"l1x":20,"l1y":19,"l2x":29,"l2y":13,"l3x":30,"l3y":14,"l4x":30,"l4y":14,"l5x":29,"l5y":13},{"data":1000010,"id":500000086,"lvl":7,"x":35,"y":9,"l1x":25,"l1y":18,"l2x":28,"l2y":13,"l3x":27,"l3y":14,"l4x":27,"l4y":14,"l5x":28,"l5y":13},{"data":1000010,"id":500000087,"lvl":7,"x":35,"y":10,"l1x":24,"l1y":18,"l2x":31,"l2y":12,"l3x":25,"l3y":13,"l4x":25,"l4y":13,"l5x":31,"l5y":12},{"data":1000010,"id":500000088,"lvl":7,"x":35,"y":11,"l1x":24,"l1y":19,"l2x":31,"l2y":13,"l3x":25,"l3y":12,"l4x":25,"l4y":12,"l5x":31,"l5y":13},{"data":1000010,"id":500000089,"lvl":7,"x":35,"y":12,"l1x":23,"l1y":19,"l2x":31,"l2y":14,"l3x":25,"l3y":10,"l4x":25,"l4y":10,"l5x":31,"l5y":14},{"data":1000010,"id":500000090,"lvl":7,"x":35,"y":13,"l1x":29,"l1y":18,"l2x":32,"l2y":14,"l3x":24,"l3y":10,"l4x":24,"l4y":10,"l5x":32,"l5y":14},{"data":1000010,"id":500000091,"lvl":7,"x":7,"y":25,"l1x":28,"l1y":18,"l2x":33,"l2y":14,"l3x":23,"l3y":10,"l4x":23,"l4y":10,"l5x":33,"l5y":14},{"data":1000010,"id":500000092,"lvl":7,"x":10,"y":35,"l1x":27,"l1y":18,"l2x":34,"l2y":14,"l3x":22,"l3y":10,"l4x":22,"l4y":10,"l5x":34,"l5y":14},{"data":1000010,"id":500000093,"lvl":7,"x":11,"y":35,"l1x":26,"l1y":18,"l2x":35,"l2y":14,"l3x":21,"l3y":10,"l4x":21,"l4y":10,"l5x":35,"l5y":14},{"data":1000010,"id":500000094,"lvl":7,"x":12,"y":35,"l1x":27,"l1y":23,"l2x":36,"l2y":14,"l3x":20,"l3y":10,"l4x":20,"l4y":10,"l5x":36,"l5y":14},{"data":1000010,"id":500000095,"lvl":7,"x":13,"y":35,"l1x":28,"l1y":23,"l2x":37,"l2y":14,"l3x":20,"l3y":11,"l4x":20,"l4y":11,"l5x":37,"l5y":14},{"data":1000010,"id":500000096,"lvl":7,"x":26,"y":11,"l1x":25,"l1y":23,"l2x":37,"l2y":15,"l3x":20,"l3y":12,"l4x":20,"l4y":12,"l5x":37,"l5y":15},{"data":1000010,"id":500000097,"lvl":7,"x":27,"y":11,"l1x":24,"l1y":23,"l2x":37,"l2y":16,"l3x":20,"l3y":13,"l4x":20,"l4y":13,"l5x":37,"l5y":16},{"data":1000002,"id":500000098,"lvl":11,"x":17,"y":10,"res_time":87175,"l1x":23,"l1y":15,"l2x":35,"l2y":41,"l3x":16,"l3y":19,"l4x":16,"l4y":19,"l5x":35,"l5y":41},{"data":1000006,"id":500000099,"lvl":9,"x":27,"y":8,"unit_prod":{"unit_type":0,"t":0,"slots":[{"id":4000008,"cnt":1}]},"l1x":37,"l1y":18,"l2x":14,"l2y":38,"l3x":7,"l3y":23,"l4x":7,"l4y":23,"l5x":14,"l5y":38},{"data":1000004,"id":500000100,"lvl":11,"x":28,"y":18,"res_time":61043,"l1x":39,"l1y":33,"l2x":11,"l2y":11,"l3x":34,"l3y":42,"l4x":34,"l4y":42,"l5x":11,"l5y":11},{"data":1000009,"id":500000101,"lvl":9,"x":30,"y":24,"l1x":25,"l1y":36,"l2x":12,"l2y":30,"l3x":36,"l3y":20,"l4x":36,"l4y":20,"l5x":12,"l5y":30},{"data":1000015,"id":500000102,"lvl":0,"x":28,"y":40,"l1x":12,"l1y":18,"l2x":22,"l2y":37,"l3x":30,"l3y":9,"l4x":30,"l4y":9,"l5x":41,"l5y":36},{"data":1000012,"id":500000103,"lvl":5,"x":27,"y":30,"l1x":21,"l1y":20,"l2x":30,"l2y":29,"l3x":25,"l3y":20,"l4x":25,"l4y":20,"l5x":30,"l5y":29},{"data":1000015,"id":500000104,"lvl":0,"x":26,"y":40,"l1x":37,"l1y":13,"l2x":18,"l2y":23,"l3x":8,"l3y":26,"l4x":8,"l4y":26,"l5x":18,"l5y":23},{"data":1000000,"id":500000105,"lvl":5,"x":12,"y":26,"units":[[4000008,3]],"l1x":10,"l1y":20,"l2x":6,"l2y":28,"l3x":23,"l3y":39,"l4x":23,"l4y":39,"l5x":6,"l5y":28},{"data":1000020,"id":500000106,"lvl":2,"x":41,"y":37,"units":[[26000001,1],[26000000,2]],"unit_prod":{"unit_type":1,"t":0,"slots":[{"id":26000001,"cnt":1}]},"l1x":11,"l1y":27,"l2x":9,"l2y":25,"l3x":17,"l3y":10,"l4x":17,"l4y":10,"l5x":9,"l5y":25},{"data":1000011,"id":500000107,"lvl":5,"x":21,"y":21,"l1x":16,"l1y":24,"l2x":25,"l2y":29,"l3x":30,"l3y":11,"l4x":30,"l4y":11,"l5x":25,"l5y":28},{"data":1000008,"id":500000108,"lvl":9,"x":32,"y":10,"l1x":14,"l1y":36,"l2x":26,"l2y":10,"l3x":18,"l3y":37,"l4x":18,"l4y":37,"l5x":26,"l5y":10},{"data":1000010,"id":500000109,"lvl":7,"x":28,"y":11,"l1x":36,"l1y":15,"l2x":37,"l2y":18,"l3x":20,"l3y":14,"l4x":20,"l4y":14,"l5x":37,"l5y":18},{"data":1000010,"id":500000110,"lvl":7,"x":29,"y":11,"l1x":30,"l1y":12,"l2x":37,"l2y":17,"l3x":20,"l3y":15,"l4x":20,"l4y":15,"l5x":37,"l5y":17},{"data":1000010,"id":500000111,"lvl":7,"x":30,"y":11,"l1x":36,"l1y":17,"l2x":39,"l2y":34,"l3x":20,"l3y":16,"l4x":20,"l4y":16,"l5x":39,"l5y":34},{"data":1000010,"id":500000112,"lvl":7,"x":31,"y":11,"l1x":34,"l1y":14,"l2x":38,"l2y":34,"l3x":28,"l3y":14,"l4x":28,"l4y":14,"l5x":38,"l5y":34},{"data":1000010,"id":500000113,"lvl":7,"x":31,"y":12,"l1x":36,"l1y":18,"l2x":37,"l2y":34,"l3x":25,"l3y":14,"l4x":25,"l4y":14,"l5x":37,"l5y":34},{"data":1000010,"id":500000114,"lvl":7,"x":31,"y":13,"l1x":36,"l1y":19,"l2x":35,"l2y":34,"l3x":26,"l3y":14,"l4x":26,"l4y":14,"l5x":35,"l5y":34},{"data":1000010,"id":500000115,"lvl":7,"x":32,"y":13,"l1x":33,"l1y":13,"l2x":35,"l2y":33,"l3x":29,"l3y":14,"l4x":29,"l4y":14,"l5x":35,"l5y":33},{"data":1000010,"id":500000116,"lvl":7,"x":33,"y":13,"l1x":35,"l1y":21,"l2x":36,"l2y":34,"l3x":29,"l3y":15,"l4x":29,"l4y":15,"l5x":36,"l5y":34},{"data":1000010,"id":500000117,"lvl":7,"x":34,"y":13,"l1x":33,"l1y":38,"l2x":36,"l2y":35,"l3x":29,"l3y":16,"l4x":29,"l4y":16,"l5x":36,"l5y":35},{"data":1000010,"id":500000118,"lvl":7,"x":34,"y":14,"l1x":36,"l1y":20,"l2x":36,"l2y":36,"l3x":29,"l3y":17,"l4x":29,"l4y":17,"l5x":36,"l5y":36},{"data":1000010,"id":500000119,"lvl":7,"x":34,"y":15,"l1x":37,"l1y":21,"l2x":36,"l2y":37,"l3x":28,"l3y":37,"l4x":28,"l4y":37,"l5x":36,"l5y":37},{"data":1000010,"id":500000120,"lvl":7,"x":34,"y":16,"l1x":38,"l1y":21,"l2x":36,"l2y":38,"l3x":41,"l3y":26,"l4x":41,"l4y":26,"l5x":36,"l5y":38},{"data":1000010,"id":500000121,"lvl":7,"x":11,"y":26,"l1x":39,"l1y":21,"l2x":36,"l2y":39,"l3x":25,"l3y":17,"l4x":25,"l4y":17,"l5x":36,"l5y":39},{"data":1000010,"id":500000122,"lvl":7,"x":11,"y":27,"l1x":39,"l1y":22,"l2x":23,"l2y":16,"l3x":23,"l3y":17,"l4x":23,"l4y":17,"l5x":25,"l5y":14},{"data":1000010,"id":500000123,"lvl":7,"x":11,"y":28,"l1x":39,"l1y":23,"l2x":36,"l2y":40,"l3x":21,"l3y":17,"l4x":21,"l4y":17,"l5x":36,"l5y":40},{"data":1000010,"id":500000124,"lvl":7,"x":11,"y":29,"l1x":39,"l1y":24,"l2x":35,"l2y":40,"l3x":20,"l3y":17,"l4x":20,"l4y":17,"l5x":35,"l5y":40},{"data":1000010,"id":500000125,"lvl":7,"x":11,"y":30,"l1x":39,"l1y":25,"l2x":34,"l2y":40,"l3x":19,"l3y":17,"l4x":19,"l4y":17,"l5x":34,"l5y":40},{"data":1000010,"id":500000126,"lvl":7,"x":11,"y":31,"l1x":39,"l1y":26,"l2x":33,"l2y":40,"l3x":18,"l3y":17,"l4x":18,"l4y":17,"l5x":33,"l5y":40},{"data":1000010,"id":500000127,"lvl":7,"x":12,"y":31,"l1x":39,"l1y":27,"l2x":32,"l2y":40,"l3x":16,"l3y":17,"l4x":16,"l4y":17,"l5x":32,"l5y":40},{"data":1000010,"id":500000128,"lvl":7,"x":13,"y":31,"l1x":39,"l1y":28,"l2x":24,"l2y":35,"l3x":15,"l3y":17,"l4x":15,"l4y":17,"l5x":24,"l5y":35},{"data":1000010,"id":500000129,"lvl":7,"x":13,"y":32,"l1x":39,"l1y":29,"l2x":24,"l2y":36,"l3x":14,"l3y":17,"l4x":14,"l4y":17,"l5x":24,"l5y":36},{"data":1000010,"id":500000130,"lvl":7,"x":13,"y":33,"l1x":22,"l1y":23,"l2x":24,"l2y":37,"l3x":13,"l3y":17,"l4x":13,"l4y":17,"l5x":24,"l5y":37},{"data":1000010,"id":500000131,"lvl":7,"x":13,"y":34,"l1x":39,"l1y":30,"l2x":33,"l2y":21,"l3x":12,"l3y":17,"l4x":12,"l4y":17,"l5x":33,"l5y":21},{"data":1000010,"id":500000132,"lvl":7,"x":14,"y":34,"l1x":39,"l1y":31,"l2x":33,"l2y":20,"l3x":11,"l3y":17,"l4x":11,"l4y":17,"l5x":30,"l5y":21},{"data":1000010,"id":500000133,"lvl":7,"x":15,"y":34,"l1x":39,"l1y":32,"l2x":33,"l2y":19,"l3x":11,"l3y":18,"l4x":11,"l4y":18,"l5x":34,"l5y":19},{"data":1000002,"id":500000134,"lvl":11,"x":17,"y":14,"res_time":87179,"l1x":11,"l1y":11,"l2x":29,"l2y":36,"l3x":34,"l3y":25,"l4x":34,"l4y":25,"l5x":29,"l5y":36},{"data":1000004,"id":500000135,"lvl":11,"x":18,"y":28,"res_time":61053,"l1x":25,"l1y":40,"l2x":11,"l2y":34,"l3x":37,"l3y":39,"l4x":37,"l4y":39,"l5x":12,"l5y":34},{"data":1000009,"id":500000136,"lvl":9,"x":14,"y":14,"l1x":15,"l1y":28,"l2x":34,"l2y":15,"l3x":22,"l3y":11,"l4x":22,"l4y":11,"l5x":34,"l5y":15},{"data":1000002,"id":500000137,"lvl":11,"x":14,"y":17,"res_time":87173,"l1x":14,"l1y":8,"l2x":6,"l2y":20,"l3x":26,"l3y":15,"l4x":26,"l4y":15,"l5x":6,"l5y":20},{"data":1000004,"id":500000138,"lvl":11,"x":18,"y":22,"res_time":61055,"l1x":11,"l1y":8,"l2x":13,"l2y":21,"l3x":33,"l3y":11,"l4x":33,"l4y":11,"l5x":13,"l5y":21},{"data":1000013,"id":500000139,"lvl":5,"x":25,"y":18,"l1x":15,"l1y":12,"l2x":37,"l2y":35,"l3x":16,"l3y":14,"l4x":16,"l4y":14,"l5x":38,"l5y":35},{"data":1000010,"id":500000140,"lvl":7,"x":9,"y":25,"l1x":21,"l1y":23,"l2x":34,"l2y":19,"l3x":11,"l3y":19,"l4x":11,"l4y":19,"l5x":36,"l5y":18},{"data":1000010,"id":500000141,"lvl":7,"x":10,"y":25,"l1x":23,"l1y":23,"l2x":35,"l2y":19,"l3x":11,"l3y":20,"l4x":11,"l4y":20,"l5x":35,"l5y":18},{"data":1000010,"id":500000142,"lvl":7,"x":11,"y":25,"l1x":20,"l1y":26,"l2x":36,"l2y":19,"l3x":11,"l3y":21,"l4x":11,"l4y":21,"l5x":34,"l5y":18},{"data":1000010,"id":500000143,"lvl":7,"x":12,"y":25,"l1x":20,"l1y":36,"l2x":37,"l2y":19,"l3x":11,"l3y":22,"l4x":11,"l4y":22,"l5x":37,"l5y":19},{"data":1000010,"id":500000144,"lvl":7,"x":25,"y":9,"l1x":37,"l1y":33,"l2x":38,"l2y":19,"l3x":12,"l3y":22,"l4x":12,"l4y":22,"l5x":38,"l5y":19},{"data":1000010,"id":500000145,"lvl":7,"x":25,"y":10,"l1x":36,"l1y":33,"l2x":39,"l2y":19,"l3x":27,"l3y":33,"l4x":27,"l4y":33,"l5x":39,"l5y":19},{"data":1000010,"id":500000146,"lvl":7,"x":25,"y":11,"l1x":35,"l1y":33,"l2x":40,"l2y":19,"l3x":27,"l3y":34,"l4x":27,"l4y":34,"l5x":40,"l5y":19},{"data":1000010,"id":500000147,"lvl":7,"x":25,"y":12,"l1x":34,"l1y":33,"l2x":40,"l2y":20,"l3x":27,"l3y":35,"l4x":27,"l4y":35,"l5x":40,"l5y":20},{"data":1000010,"id":500000148,"lvl":7,"x":25,"y":8,"l1x":15,"l1y":26,"l2x":40,"l2y":21,"l3x":27,"l3y":36,"l4x":27,"l4y":36,"l5x":40,"l5y":21},{"data":1000010,"id":500000149,"lvl":7,"x":24,"y":8,"l1x":15,"l1y":25,"l2x":40,"l2y":22,"l3x":27,"l3y":37,"l4x":27,"l4y":37,"l5x":40,"l5y":22},{"data":1000010,"id":500000150,"lvl":7,"x":23,"y":8,"l1x":15,"l1y":24,"l2x":32,"l2y":39,"l3x":23,"l3y":38,"l4x":23,"l4y":38,"l5x":32,"l5y":39},{"data":1000010,"id":500000151,"lvl":7,"x":22,"y":8,"l1x":15,"l1y":23,"l2x":31,"l2y":39,"l3x":24,"l3y":38,"l4x":24,"l4y":38,"l5x":31,"l5y":39},{"data":1000010,"id":500000152,"lvl":7,"x":21,"y":8,"l1x":15,"l1y":21,"l2x":30,"l2y":39,"l3x":25,"l3y":38,"l4x":25,"l4y":38,"l5x":30,"l5y":39},{"data":1000010,"id":500000153,"lvl":7,"x":20,"y":8,"l1x":15,"l1y":22,"l2x":29,"l2y":39,"l3x":22,"l3y":37,"l4x":21,"l4y":38,"l5x":29,"l5y":39},{"data":1000010,"id":500000154,"lvl":7,"x":19,"y":8,"l1x":14,"l1y":19,"l2x":28,"l2y":39,"l3x":26,"l3y":38,"l4x":26,"l4y":38,"l5x":28,"l5y":39},{"data":1000010,"id":500000155,"lvl":7,"x":18,"y":8,"l1x":14,"l1y":18,"l2x":27,"l2y":39,"l3x":33,"l3y":18,"l4x":29,"l4y":19,"l5x":27,"l5y":39},{"data":1000010,"id":500000156,"lvl":7,"x":17,"y":8,"l1x":14,"l1y":17,"l2x":26,"l2y":39,"l3x":32,"l3y":18,"l4x":32,"l4y":19,"l5x":26,"l5y":39},{"data":1000010,"id":500000157,"lvl":7,"x":16,"y":8,"l1x":14,"l1y":16,"l2x":25,"l2y":39,"l3x":31,"l3y":18,"l4x":31,"l4y":19,"l5x":25,"l5y":39},{"data":1000010,"id":500000158,"lvl":7,"x":16,"y":34,"l1x":14,"l1y":15,"l2x":39,"l2y":33,"l3x":33,"l3y":19,"l4x":33,"l4y":19,"l5x":39,"l5y":33},{"data":1000010,"id":500000159,"lvl":7,"x":8,"y":25,"l1x":14,"l1y":14,"l2x":39,"l2y":27,"l3x":33,"l3y":20,"l4x":33,"l4y":20,"l5x":39,"l5y":27},{"data":1000010,"id":500000160,"lvl":7,"x":8,"y":24,"l1x":14,"l1y":13,"l2x":39,"l2y":28,"l3x":33,"l3y":21,"l4x":33,"l4y":21,"l5x":39,"l5y":28},{"data":1000010,"id":500000161,"lvl":7,"x":8,"y":23,"l1x":14,"l1y":12,"l2x":39,"l2y":29,"l3x":33,"l3y":22,"l4x":33,"l4y":22,"l5x":39,"l5y":29},{"data":1000010,"id":500000162,"lvl":7,"x":8,"y":22,"l1x":14,"l1y":11,"l2x":22,"l2y":32,"l3x":33,"l3y":23,"l4x":33,"l4y":23,"l5x":22,"l5y":32},{"data":1000010,"id":500000163,"lvl":7,"x":8,"y":21,"l1x":15,"l1y":11,"l2x":22,"l2y":31,"l3x":33,"l3y":24,"l4x":33,"l4y":24,"l5x":22,"l5y":31},{"data":1000010,"id":500000164,"lvl":7,"x":8,"y":20,"l1x":16,"l1y":11,"l2x":23,"l2y":32,"l3x":33,"l3y":25,"l4x":33,"l4y":25,"l5x":23,"l5y":32},{"data":1000011,"id":500000165,"lvl":5,"x":36,"y":30,"l1x":31,"l1y":35,"l2x":17,"l2y":19,"l3x":19,"l3y":19,"l4x":38,"l4y":33,"l5x":17,"l5y":19},{"data":1000015,"id":500000166,"lvl":0,"x":39,"y":27,"l1x":23,"l1y":40,"l2x":26,"l2y":25,"l3x":25,"l3y":8,"l4x":25,"l4y":8,"l5x":27,"l5y":25},{"data":1000024,"id":500000167,"lvl":3,"x":22,"y":18,"l1x":21,"l1y":24,"l2x":32,"l2y":34,"l3x":24,"l3y":29,"l4x":14,"l4y":26,"l5x":32,"l5y":33},{"data":1000006,"id":500000168,"lvl":9,"x":10,"y":21,"unit_prod":{"unit_type":0,"t":0,"slots":[{"id":4000008,"cnt":1}]},"l1x":37,"l1y":39,"l2x":9,"l2y":18,"l3x":10,"l3y":27,"l4x":10,"l4y":27,"l5x":9,"l5y":18},{"data":1000000,"id":500000169,"lvl":5,"x":26,"y":12,"units":[[4000008,3]],"l1x":18,"l1y":37,"l2x":40,"l2y":29,"l3x":7,"l3y":31,"l4x":7,"l4y":31,"l5x":40,"l5y":29},{"data":1000010,"id":500000170,"lvl":7,"x":8,"y":19,"l1x":17,"l1y":11,"l2x":23,"l2y":34,"l3x":33,"l3y":26,"l4x":33,"l4y":26,"l5x":24,"l5y":17},{"data":1000010,"id":500000171,"lvl":7,"x":8,"y":18,"l1x":18,"l1y":11,"l2x":25,"l2y":32,"l3x":30,"l3y":18,"l4x":30,"l4y":19,"l5x":25,"l5y":32},{"data":1000010,"id":500000172,"lvl":7,"x":8,"y":17,"l1x":33,"l1y":14,"l2x":26,"l2y":32,"l3x":29,"l3y":18,"l4x":29,"l4y":18,"l5x":26,"l5y":32},{"data":1000010,"id":500000173,"lvl":7,"x":8,"y":16,"l1x":19,"l1y":12,"l2x":27,"l2y":32,"l3x":28,"l3y":18,"l4x":28,"l4y":18,"l5x":27,"l5y":32},{"data":1000010,"id":500000174,"lvl":7,"x":9,"y":16,"l1x":20,"l1y":12,"l2x":28,"l2y":32,"l3x":27,"l3y":18,"l4x":27,"l4y":18,"l5x":28,"l5y":32},{"data":1000010,"id":500000175,"lvl":7,"x":10,"y":16,"l1x":21,"l1y":12,"l2x":29,"l2y":32,"l3x":26,"l3y":18,"l4x":26,"l4y":18,"l5x":29,"l5y":32},{"data":1000010,"id":500000176,"lvl":7,"x":11,"y":16,"l1x":22,"l1y":12,"l2x":30,"l2y":32,"l3x":25,"l3y":18,"l4x":25,"l4y":18,"l5x":30,"l5y":32},{"data":1000010,"id":500000177,"lvl":7,"x":12,"y":16,"l1x":22,"l1y":13,"l2x":31,"l2y":32,"l3x":22,"l3y":17,"l4x":22,"l4y":17,"l5x":31,"l5y":32},{"data":1000010,"id":500000178,"lvl":7,"x":16,"y":9,"l1x":22,"l1y":14,"l2x":32,"l2y":32,"l3x":24,"l3y":17,"l4x":24,"l4y":17,"l5x":32,"l5y":32},{"data":1000010,"id":500000179,"lvl":7,"x":16,"y":10,"l1x":22,"l1y":15,"l2x":33,"l2y":32,"l3x":22,"l3y":20,"l4x":19,"l4y":21,"l5x":33,"l5y":32},{"data":1000010,"id":500000180,"lvl":7,"x":16,"y":11,"l1x":22,"l1y":18,"l2x":34,"l2y":32,"l3x":22,"l3y":19,"l4x":19,"l4y":20,"l5x":34,"l5y":32},{"data":1000010,"id":500000181,"lvl":7,"x":14,"y":9,"l1x":22,"l1y":17,"l2x":35,"l2y":32,"l3x":22,"l3y":21,"l4x":19,"l4y":19,"l5x":35,"l5y":32},{"data":1000010,"id":500000182,"lvl":7,"x":9,"y":14,"l1x":15,"l1y":19,"l2x":35,"l2y":31,"l3x":21,"l3y":37,"l4x":21,"l4y":37,"l5x":35,"l5y":31},{"data":1000010,"id":500000183,"lvl":7,"x":16,"y":12,"l1x":20,"l1y":25,"l2x":35,"l2y":30,"l3x":21,"l3y":36,"l4x":21,"l4y":36,"l5x":35,"l5y":30},{"data":1000010,"id":500000184,"lvl":7,"x":8,"y":12,"l1x":29,"l1y":30,"l2x":35,"l2y":29,"l3x":20,"l3y":36,"l4x":20,"l4y":36,"l5x":35,"l5y":29},{"data":1000010,"id":500000185,"lvl":7,"x":9,"y":9,"l1x":18,"l1y":19,"l2x":35,"l2y":28,"l3x":19,"l3y":36,"l4x":19,"l4y":36,"l5x":35,"l5y":28},{"data":1000010,"id":500000186,"lvl":7,"x":13,"y":14,"l1x":30,"l1y":32,"l2x":39,"l2y":31,"l3x":18,"l3y":36,"l4x":18,"l4y":36,"l5x":39,"l5y":31},{"data":1000010,"id":500000187,"lvl":7,"x":13,"y":13,"l1x":29,"l1y":27,"l2x":35,"l2y":27,"l3x":17,"l3y":36,"l4x":17,"l4y":36,"l5x":35,"l5y":27},{"data":1000010,"id":500000188,"lvl":7,"x":14,"y":13,"l1x":29,"l1y":31,"l2x":17,"l2y":23,"l3x":16,"l3y":36,"l4x":16,"l4y":36,"l5x":17,"l5y":23},{"data":1000010,"id":500000189,"lvl":7,"x":15,"y":13,"l1x":29,"l1y":26,"l2x":17,"l2y":24,"l3x":15,"l3y":36,"l4x":15,"l4y":36,"l5x":17,"l5y":24},{"data":1000010,"id":500000190,"lvl":7,"x":16,"y":13,"l1x":18,"l1y":12,"l2x":17,"l2y":25,"l3x":15,"l3y":35,"l4x":15,"l4y":35,"l5x":17,"l5y":25},{"data":1000010,"id":500000191,"lvl":7,"x":17,"y":13,"l1x":29,"l1y":28,"l2x":17,"l2y":26,"l3x":15,"l3y":34,"l4x":15,"l4y":34,"l5x":17,"l5y":26},{"data":1000010,"id":500000192,"lvl":7,"x":18,"y":13,"l1x":29,"l1y":29,"l2x":17,"l2y":27,"l3x":15,"l3y":33,"l4x":15,"l4y":33,"l5x":17,"l5y":27},{"data":1000010,"id":500000193,"lvl":7,"x":19,"y":13,"l1x":20,"l1y":24,"l2x":17,"l2y":28,"l3x":15,"l3y":32,"l4x":15,"l4y":32,"l5x":17,"l5y":28},{"data":1000010,"id":500000194,"lvl":7,"x":13,"y":15,"l1x":22,"l1y":33,"l2x":17,"l2y":29,"l3x":13,"l3y":23,"l4x":13,"l4y":23,"l5x":17,"l5y":29},{"data":1000010,"id":500000195,"lvl":7,"x":13,"y":16,"l1x":20,"l1y":31,"l2x":39,"l2y":30,"l3x":13,"l3y":24,"l4x":13,"l4y":24,"l5x":39,"l5y":30},{"data":1000010,"id":500000196,"lvl":7,"x":13,"y":17,"l1x":14,"l1y":30,"l2x":17,"l2y":30,"l3x":13,"l3y":25,"l4x":13,"l4y":25,"l5x":17,"l5y":30},{"data":1000010,"id":500000197,"lvl":7,"x":13,"y":18,"l1x":14,"l1y":29,"l2x":18,"l2y":30,"l3x":13,"l3y":26,"l4x":13,"l4y":26,"l5x":18,"l5y":30},{"data":1000010,"id":500000198,"lvl":7,"x":13,"y":19,"l1x":14,"l1y":28,"l2x":19,"l2y":30,"l3x":13,"l3y":27,"l4x":13,"l4y":27,"l5x":19,"l5y":30},{"data":1000010,"id":500000199,"lvl":7,"x":20,"y":13,"l1x":14,"l1y":27,"l2x":20,"l2y":30,"l3x":13,"l3y":28,"l4x":13,"l4y":28,"l5x":20,"l5y":30},{"data":1000010,"id":500000200,"lvl":7,"x":21,"y":13,"l1x":14,"l1y":33,"l2x":21,"l2y":30,"l3x":13,"l3y":29,"l4x":13,"l4y":29,"l5x":21,"l5y":30},{"data":1000010,"id":500000201,"lvl":7,"x":22,"y":13,"l1x":23,"l1y":33,"l2x":22,"l2y":30,"l3x":13,"l3y":30,"l4x":13,"l4y":30,"l5x":22,"l5y":30},{"data":1000010,"id":500000202,"lvl":7,"x":23,"y":13,"l1x":14,"l1y":31,"l2x":22,"l2y":29,"l3x":13,"l3y":31,"l4x":13,"l4y":31,"l5x":22,"l5y":29},{"data":1000010,"id":500000203,"lvl":7,"x":24,"y":13,"l1x":16,"l1y":35,"l2x":22,"l2y":28,"l3x":24,"l3y":23,"l4x":24,"l4y":23,"l5x":22,"l5y":28},{"data":1000010,"id":500000204,"lvl":7,"x":13,"y":20,"l1x":15,"l1y":35,"l2x":16,"l2y":17,"l3x":24,"l3y":22,"l4x":24,"l4y":22,"l5x":16,"l5y":17},{"data":1000010,"id":500000205,"lvl":7,"x":13,"y":21,"l1x":14,"l1y":32,"l2x":17,"l2y":17,"l3x":23,"l3y":22,"l4x":23,"l4y":22,"l5x":17,"l5y":17},{"data":1000010,"id":500000206,"lvl":7,"x":13,"y":22,"l1x":20,"l1y":27,"l2x":18,"l2y":17,"l3x":22,"l3y":22,"l4x":22,"l4y":22,"l5x":18,"l5y":17},{"data":1000010,"id":500000207,"lvl":7,"x":13,"y":23,"l1x":17,"l1y":27,"l2x":19,"l2y":17,"l3x":21,"l3y":22,"l4x":21,"l4y":22,"l5x":19,"l5y":17},{"data":1000010,"id":500000208,"lvl":7,"x":13,"y":24,"l1x":18,"l1y":27,"l2x":20,"l2y":17,"l3x":20,"l3y":22,"l4x":20,"l4y":22,"l5x":20,"l5y":17},{"data":1000010,"id":500000209,"lvl":7,"x":13,"y":25,"l1x":30,"l1y":34,"l2x":21,"l2y":17,"l3x":19,"l3y":22,"l4x":19,"l4y":22,"l5x":21,"l5y":17},{"data":1000010,"id":500000210,"lvl":7,"x":14,"y":25,"l1x":33,"l1y":12,"l2x":22,"l2y":17,"l3x":18,"l3y":22,"l4x":18,"l4y":22,"l5x":22,"l5y":17},{"data":1000010,"id":500000211,"lvl":7,"x":25,"y":13,"l1x":36,"l1y":21,"l2x":23,"l2y":17,"l3x":17,"l3y":22,"l4x":17,"l4y":22,"l5x":14,"l5y":20},{"data":1000010,"id":500000212,"lvl":7,"x":25,"y":14,"l1x":30,"l1y":36,"l2x":25,"l2y":17,"l3x":17,"l3y":23,"l4x":17,"l4y":23,"l5x":25,"l5y":17},{"data":1000010,"id":500000213,"lvl":7,"x":25,"y":15,"l1x":29,"l1y":13,"l2x":24,"l2y":17,"l3x":17,"l3y":24,"l4x":17,"l4y":24,"l5x":23,"l5y":17},{"data":1000010,"id":500000214,"lvl":7,"x":25,"y":16,"l1x":15,"l1y":20,"l2x":25,"l2y":18,"l3x":14,"l3y":31,"l4x":14,"l4y":31,"l5x":25,"l5y":18},{"data":1000010,"id":500000215,"lvl":7,"x":25,"y":17,"l1x":22,"l1y":16,"l2x":25,"l2y":19,"l3x":17,"l3y":25,"l4x":17,"l4y":25,"l5x":25,"l5y":19},{"data":1000010,"id":500000216,"lvl":7,"x":26,"y":17,"l1x":14,"l1y":35,"l2x":25,"l2y":21,"l3x":17,"l3y":26,"l4x":17,"l4y":26,"l5x":25,"l5y":21},{"data":1000010,"id":500000217,"lvl":7,"x":27,"y":17,"l1x":33,"l1y":33,"l2x":25,"l2y":20,"l3x":17,"l3y":27,"l4x":17,"l4y":27,"l5x":25,"l5y":20},{"data":1000010,"id":500000218,"lvl":7,"x":28,"y":17,"l1x":18,"l1y":18,"l2x":16,"l2y":18,"l3x":17,"l3y":28,"l4x":17,"l4y":28,"l5x":16,"l5y":18},{"data":1000010,"id":500000219,"lvl":7,"x":29,"y":17,"l1x":28,"l1y":38,"l2x":16,"l2y":19,"l3x":17,"l3y":29,"l4x":17,"l4y":29,"l5x":16,"l5y":19},{"data":1000008,"id":500000220,"lvl":9,"x":18,"y":31,"l1x":19,"l1y":13,"l2x":36,"l2y":21,"l3x":31,"l3y":15,"l4x":31,"l4y":16,"l5x":36,"l5y":21},{"data":1000008,"id":500000221,"lvl":9,"x":31,"y":18,"l1x":33,"l1y":15,"l2x":19,"l2y":36,"l3x":10,"l3y":24,"l4x":10,"l4y":24,"l5x":19,"l5y":36},{"data":1000009,"id":500000222,"lvl":9,"x":24,"y":21,"l1x":26,"l1y":14,"l2x":25,"l2y":36,"l3x":12,"l3y":19,"l4x":12,"l4y":19,"l5x":25,"l5y":36},{"data":1000013,"id":500000225,"lvl":5,"x":33,"y":27,"l1x":15,"l1y":32,"l2x":15,"l2y":35,"l3x":19,"l3y":32,"l4x":19,"l4y":32,"l5x":15,"l5y":35},{"data":1000012,"id":500000226,"lvl":5,"x":30,"y":27,"l1x":26,"l1y":28,"l2x":19,"l2y":27,"l3x":18,"l3y":28,"l4x":18,"l4y":28,"l5x":19,"l5y":27},{"data":1000022,"id":500000227,"lvl":0,"x":34,"y":34,"l1x":30,"l1y":29,"l2x":26,"l2y":19,"l3x":21,"l3y":23,"l4x":21,"l4y":23,"l5x":26,"l5y":18},{"data":1000026,"id":500000228,"lvl":3,"x":13,"y":10,"unit_prod":{"unit_type":0},"l1x":34,"l1y":39,"l2x":28,"l2y":40,"l3x":11,"l3y":14,"l4x":11,"l4y":14,"l5x":28,"l5y":40},{"data":1000023,"id":500000229,"lvl":2,"x":22,"y":15,"res_time":0,"l1x":11,"l1y":34,"l2x":31,"l2y":41,"l3x":15,"l3y":37,"l4x":15,"l4y":37,"l5x":31,"l5y":41},{"data":1000028,"id":500000230,"lvl":3,"x":24,"y":24,"aim_angle":45,"aim_angle_draft":45,"aim_angle_war":45,"aim_angle_draft_war":45,"aim_angle2":135,"aim_angle_d2":135,"aim_angle3":45,"aim_angle_d3":45,"aim_angle4":225,"aim_angle_d4":225,"aim_angle5":45,"aim_angle_d5":45,"l1x":29,"l1y":23,"l2x":30,"l2y":17,"l3x":30,"l3y":24,"l4x":31,"l4y":24,"l5x":31,"l5y":16},{"data":1000003,"id":500000231,"lvl":10,"x":36,"y":27,"l1x":27,"l1y":33,"l2x":18,"l2y":32,"l3x":34,"l3y":29,"l4x":34,"l4y":29,"l5x":19,"l5y":32},{"data":1000005,"id":500000232,"lvl":10,"x":27,"y":36,"l1x":32,"l1y":18,"l2x":36,"l2y":27,"l3x":14,"l3y":26,"l4x":24,"l4y":29,"l5x":36,"l5y":27},{"data":1000009,"id":500000233,"lvl":9,"x":21,"y":24,"l1x":36,"l1y":29,"l2x":36,"l2y":31,"l3x":12,"l3y":32,"l4x":12,"l4y":32,"l5x":36,"l5y":31},{"data":1000011,"id":500000234,"lvl":5,"x":31,"y":36,"l1x":30,"l1y":13,"l2x":30,"l2y":23,"l3x":38,"l3y":33,"l4x":20,"l4y":19,"l5x":31,"l5y":22},{"data":1000013,"id":500000235,"lvl":5,"x":27,"y":33,"l1x":21,"l1y":28,"l2x":19,"l2y":9,"l3x":33,"l3y":35,"l4x":33,"l4y":35,"l5x":19,"l5y":9},{"data":1000012,"id":500000236,"lvl":5,"x":18,"y":18,"l1x":31,"l1y":22,"l2x":22,"l2y":18,"l3x":29,"l3y":27,"l4x":29,"l4y":27,"l5x":22,"l5y":18},{"data":1000010,"id":500000237,"lvl":7,"x":30,"y":17,"l1x":30,"l1y":37,"l2x":16,"l2y":20,"l3x":17,"l3y":30,"l4x":17,"l4y":30,"l5x":16,"l5y":20},{"data":1000010,"id":500000238,"lvl":7,"x":31,"y":17,"l1x":30,"l1y":33,"l2x":16,"l2y":22,"l3x":16,"l3y":31,"l4x":16,"l4y":31,"l5x":16,"l5y":22},{"data":1000010,"id":500000239,"lvl":7,"x":32,"y":17,"l1x":38,"l1y":33,"l2x":16,"l2y":21,"l3x":17,"l3y":31,"l4x":17,"l4y":31,"l5x":16,"l5y":21},{"data":1000010,"id":500000240,"lvl":7,"x":33,"y":17,"l1x":31,"l1y":32,"l2x":17,"l2y":22,"l3x":18,"l3y":31,"l4x":18,"l4y":31,"l5x":17,"l5y":22},{"data":1000010,"id":500000241,"lvl":7,"x":15,"y":25,"l1x":33,"l1y":26,"l2x":18,"l2y":22,"l3x":19,"l3y":31,"l4x":19,"l4y":31,"l5x":18,"l5y":22},{"data":1000010,"id":500000242,"lvl":7,"x":16,"y":25,"l1x":33,"l1y":27,"l2x":19,"l2y":22,"l3x":20,"l3y":31,"l4x":20,"l4y":31,"l5x":19,"l5y":22},{"data":1000010,"id":500000243,"lvl":7,"x":17,"y":25,"l1x":33,"l1y":28,"l2x":20,"l2y":22,"l3x":22,"l3y":31,"l4x":22,"l4y":31,"l5x":20,"l5y":22},{"data":1000010,"id":500000244,"lvl":7,"x":17,"y":26,"l1x":33,"l1y":29,"l2x":21,"l2y":22,"l3x":23,"l3y":28,"l4x":23,"l4y":28,"l5x":21,"l5y":22},{"data":1000010,"id":500000245,"lvl":7,"x":17,"y":27,"l1x":33,"l1y":30,"l2x":31,"l2y":22,"l3x":23,"l3y":29,"l4x":23,"l4y":29,"l5x":32,"l5y":21},{"data":1000010,"id":500000246,"lvl":7,"x":17,"y":28,"l1x":33,"l1y":31,"l2x":32,"l2y":22,"l3x":24,"l3y":28,"l4x":24,"l4y":28,"l5x":29,"l5y":21},{"data":1000010,"id":500000247,"lvl":7,"x":17,"y":29,"l1x":33,"l1y":32,"l2x":33,"l2y":22,"l3x":31,"l3y":26,"l4x":31,"l4y":26,"l5x":34,"l5y":21},{"data":1000010,"id":500000248,"lvl":7,"x":17,"y":30,"l1x":32,"l1y":32,"l2x":33,"l2y":23,"l3x":23,"l3y":31,"l4x":23,"l4y":31,"l5x":35,"l5y":22},{"data":1000010,"id":500000249,"lvl":7,"x":17,"y":31,"l1x":22,"l1y":36,"l2x":33,"l2y":24,"l3x":30,"l3y":26,"l4x":30,"l4y":26,"l5x":35,"l5y":23},{"data":1000010,"id":500000250,"lvl":7,"x":17,"y":32,"l1x":16,"l1y":27,"l2x":33,"l2y":25,"l3x":26,"l3y":32,"l4x":26,"l4y":32,"l5x":35,"l5y":24},{"data":1000010,"id":500000251,"lvl":7,"x":17,"y":33,"l1x":15,"l1y":27,"l2x":33,"l2y":26,"l3x":27,"l3y":32,"l4x":27,"l4y":32,"l5x":32,"l5y":26},{"data":1000010,"id":500000252,"lvl":7,"x":17,"y":34,"l1x":16,"l1y":19,"l2x":34,"l2y":27,"l3x":28,"l3y":32,"l4x":28,"l4y":32,"l5x":35,"l5y":25},{"data":1000010,"id":500000253,"lvl":7,"x":34,"y":17,"l1x":38,"l1y":32,"l2x":33,"l2y":27,"l3x":29,"l3y":32,"l4x":29,"l4y":32,"l5x":31,"l5y":26},{"data":1000010,"id":500000254,"lvl":7,"x":34,"y":18,"l1x":20,"l1y":28,"l2x":32,"l2y":27,"l3x":30,"l3y":32,"l4x":30,"l4y":32,"l5x":33,"l5y":26},{"data":1000010,"id":500000255,"lvl":7,"x":34,"y":20,"l1x":20,"l1y":29,"l2x":31,"l2y":27,"l3x":32,"l3y":32,"l4x":32,"l4y":32,"l5x":30,"l5y":26},{"data":1000010,"id":500000256,"lvl":7,"x":34,"y":19,"l1x":20,"l1y":30,"l2x":30,"l2y":27,"l3x":32,"l3y":31,"l4x":32,"l4y":31,"l5x":29,"l5y":26},{"data":1000010,"id":500000257,"lvl":7,"x":34,"y":21,"l1x":14,"l1y":34,"l2x":29,"l2y":27,"l3x":32,"l3y":30,"l4x":32,"l4y":30,"l5x":29,"l5y":27},{"data":1000010,"id":500000258,"lvl":7,"x":33,"y":21,"l1x":19,"l1y":27,"l2x":30,"l2y":22,"l3x":32,"l3y":29,"l4x":32,"l4y":29,"l5x":31,"l5y":21},{"data":1000010,"id":500000259,"lvl":7,"x":18,"y":34,"l1x":21,"l1y":36,"l2x":29,"l2y":22,"l3x":32,"l3y":28,"l4x":32,"l4y":28,"l5x":28,"l5y":21},{"data":1000010,"id":500000260,"lvl":7,"x":19,"y":34,"l1x":23,"l1y":39,"l2x":28,"l2y":22,"l3x":32,"l3y":27,"l4x":32,"l4y":27,"l5x":28,"l5y":22},{"data":1000010,"id":500000261,"lvl":7,"x":20,"y":34,"l1x":23,"l1y":38,"l2x":27,"l2y":22,"l3x":32,"l3y":26,"l4x":32,"l4y":26,"l5x":27,"l5y":22},{"data":1000010,"id":500000262,"lvl":7,"x":21,"y":34,"l1x":23,"l1y":37,"l2x":26,"l2y":22,"l3x":28,"l3y":25,"l4x":28,"l4y":25,"l5x":26,"l5y":22},{"data":1000010,"id":500000263,"lvl":7,"x":21,"y":33,"l1x":23,"l1y":36,"l2x":25,"l2y":22,"l3x":31,"l3y":32,"l4x":31,"l4y":32,"l5x":25,"l5y":22},{"data":1000010,"id":500000264,"lvl":7,"x":21,"y":32,"l1x":23,"l1y":34,"l2x":24,"l2y":22,"l3x":29,"l3y":26,"l4x":29,"l4y":26,"l5x":24,"l5y":22},{"data":1000010,"id":500000265,"lvl":7,"x":32,"y":21,"l1x":23,"l1y":35,"l2x":23,"l2y":22,"l3x":28,"l3y":26,"l4x":28,"l4y":26,"l5x":23,"l5y":22},{"data":1000010,"id":500000266,"lvl":7,"x":31,"y":21,"l1x":17,"l1y":35,"l2x":22,"l2y":22,"l3x":23,"l3y":30,"l4x":23,"l4y":30,"l5x":22,"l5y":22},{"data":1000010,"id":500000267,"lvl":7,"x":30,"y":21,"l1x":17,"l1y":36,"l2x":22,"l2y":23,"l3x":27,"l3y":24,"l4x":27,"l4y":24,"l5x":22,"l5y":23},{"data":1000010,"id":500000268,"lvl":7,"x":29,"y":21,"l1x":18,"l1y":36,"l2x":22,"l2y":24,"l3x":26,"l3y":24,"l4x":26,"l4y":24,"l5x":22,"l5y":24},{"data":1000010,"id":500000269,"lvl":7,"x":28,"y":21,"l1x":18,"l1y":13,"l2x":22,"l2y":25,"l3x":25,"l3y":24,"l4x":25,"l4y":24,"l5x":22,"l5y":25},{"data":1000010,"id":500000270,"lvl":7,"x":21,"y":31,"l1x":18,"l1y":14,"l2x":22,"l2y":26,"l3x":24,"l3y":24,"l4x":24,"l4y":24,"l5x":22,"l5y":26},{"data":1000010,"id":500000271,"lvl":7,"x":21,"y":30,"l1x":18,"l1y":15,"l2x":28,"l2y":27,"l3x":24,"l3y":25,"l4x":24,"l4y":25,"l5x":28,"l5y":27},{"data":1000010,"id":500000272,"lvl":7,"x":21,"y":28,"l1x":18,"l1y":16,"l2x":27,"l2y":27,"l3x":24,"l3y":26,"l4x":24,"l4y":26,"l5x":27,"l5y":27},{"data":1000010,"id":500000273,"lvl":7,"x":27,"y":21,"l1x":17,"l1y":19,"l2x":26,"l2y":27,"l3x":24,"l3y":27,"l4x":24,"l4y":27,"l5x":26,"l5y":27},{"data":1000010,"id":500000274,"lvl":7,"x":27,"y":22,"l1x":18,"l1y":17,"l2x":25,"l2y":27,"l3x":23,"l3y":32,"l4x":23,"l4y":32,"l5x":25,"l5y":27},{"data":1000010,"id":500000275,"lvl":7,"x":27,"y":23,"l1x":19,"l1y":36,"l2x":24,"l2y":27,"l3x":24,"l3y":32,"l4x":24,"l4y":32,"l5x":24,"l5y":27},{"data":1000010,"id":500000276,"lvl":7,"x":27,"y":24,"l1x":30,"l1y":38,"l2x":23,"l2y":27,"l3x":39,"l3y":28,"l4x":39,"l4y":28,"l5x":23,"l5y":27},{"data":1000010,"id":500000277,"lvl":7,"x":21,"y":29,"l1x":29,"l1y":32,"l2x":39,"l2y":26,"l3x":21,"l3y":31,"l4x":21,"l4y":31,"l5x":39,"l5y":26},{"data":1000010,"id":500000278,"lvl":7,"x":22,"y":27,"l1x":28,"l1y":32,"l2x":40,"l2y":23,"l3x":29,"l3y":37,"l4x":29,"l4y":37,"l5x":40,"l5y":23},{"data":1000010,"id":500000279,"lvl":7,"x":26,"y":24,"l1x":27,"l1y":32,"l2x":39,"l2y":32,"l3x":36,"l3y":37,"l4x":36,"l4y":37,"l5x":39,"l5y":32},{"data":1000010,"id":500000280,"lvl":7,"x":26,"y":25,"l1x":26,"l1y":32,"l2x":22,"l2y":27,"l3x":40,"l3y":24,"l4x":40,"l4y":24,"l5x":22,"l5y":27},{"data":1000010,"id":500000281,"lvl":7,"x":24,"y":27,"l1x":25,"l1y":32,"l2x":24,"l2y":39,"l3x":28,"l3y":24,"l4x":28,"l4y":24,"l5x":24,"l5y":39},{"data":1000010,"id":500000282,"lvl":7,"x":23,"y":27,"l1x":24,"l1y":32,"l2x":31,"l2y":11,"l3x":25,"l3y":11,"l4x":25,"l4y":11,"l5x":31,"l5y":11},{"data":1000010,"id":500000283,"lvl":7,"x":26,"y":26,"l1x":23,"l1y":32,"l2x":40,"l2y":26,"l3x":17,"l3y":17,"l4x":17,"l4y":17,"l5x":40,"l5y":26},{"data":1000010,"id":500000284,"lvl":7,"x":25,"y":26,"l1x":21,"l1y":33,"l2x":40,"l2y":24,"l3x":13,"l3y":22,"l4x":13,"l4y":22,"l5x":40,"l5y":24},{"data":1000010,"id":500000285,"lvl":7,"x":24,"y":26,"l1x":20,"l1y":33,"l2x":40,"l2y":25,"l3x":15,"l3y":31,"l4x":15,"l4y":31,"l5x":40,"l5y":25},{"data":1000010,"id":500000286,"lvl":7,"x":21,"y":27,"l1x":20,"l1y":32,"l2x":24,"l2y":38,"l3x":25,"l3y":32,"l4x":25,"l4y":32,"l5x":24,"l5y":38},{"data":1000026,"id":500000288,"lvl":3,"x":10,"y":13,"unit_prod":{"unit_type":0},"l1x":40,"l1y":30,"l2x":38,"l2y":39,"l3x":38,"l3y":36,"l4x":38,"l4y":36,"l5x":38,"l5y":39},{"data":1000023,"id":500000289,"lvl":2,"x":15,"y":22,"res_time":0,"l1x":11,"l1y":37,"l2x":23,"l2y":10,"l3x":12,"l3y":35,"l4x":12,"l4y":35,"l5x":22,"l5y":11},{"data":1000029,"id":500000290,"lvl":1,"x":10,"y":10,"units":[[26000010,1]],"unit_prod":{"unit_type":1},"l1x":29,"l1y":9,"l2x":6,"l2y":23,"l3x":19,"l3y":40,"l4x":19,"l4y":40,"l5x":6,"l5y":23}],"obstacles":[{"data":8000004,"id":503000000,"x":47,"y":10,"loot_multiply_ver":2},{"data":8000007,"id":503000001,"x":1,"y":13,"loot_multiply_ver":2},{"data":8000000,"id":503000002,"x":14,"y":0,"loot_multiply_ver":2},{"data":8000008,"id":503000003,"x":0,"y":34,"loot_multiply_ver":2},{"data":8000006,"id":503000004,"x":29,"y":0,"loot_multiply_ver":2},{"data":8000007,"id":503000005,"x":19,"y":0,"loot_multiply_ver":2},{"data":8000013,"id":503000006,"x":29,"y":47,"loot_multiply_ver":2},{"data":8000007,"id":503000007,"x":7,"y":8,"loot_multiply_ver":2},{"data":8000010,"id":503000008,"x":0,"y":30,"loot_multiply_ver":2},{"data":8000000,"id":503000009,"x":25,"y":0,"loot_multiply_ver":2},{"data":8000004,"id":503000010,"x":24,"y":48,"loot_multiply_ver":2},{"data":8000000,"id":503000011,"x":8,"y":48,"loot_multiply_ver":2},{"data":8000010,"id":503000012,"x":8,"y":42,"loot_multiply_ver":2},{"data":8000000,"id":503000013,"x":1,"y":9,"loot_multiply_ver":2},{"data":8000000,"id":503000014,"x":2,"y":40,"loot_multiply_ver":2},{"data":8000004,"id":503000015,"x":35,"y":0,"loot_multiply_ver":2},{"data":8000007,"id":503000016,"x":1,"y":37,"loot_multiply_ver":2},{"data":8000007,"id":503000017,"x":15,"y":47,"loot_multiply_ver":2},{"data":8000007,"id":503000018,"x":1,"y":19,"loot_multiply_ver":2},{"data":8000000,"id":503000019,"x":0,"y":26,"loot_multiply_ver":2},{"data":8000013,"id":503000020,"x":18,"y":47,"loot_multiply_ver":2},{"data":8000007,"id":503000021,"x":48,"y":17,"loot_multiply_ver":2},{"data":8000010,"id":503000022,"x":48,"y":31,"loot_multiply_ver":2},{"data":8000004,"id":503000023,"x":11,"y":48,"loot_multiply_ver":2},{"data":8000000,"id":503000024,"x":48,"y":25,"loot_multiply_ver":2},{"data":8000008,"id":503000025,"x":48,"y":7,"loot_multiply_ver":2},{"data":8000004,"id":503000026,"x":46,"y":0,"loot_multiply_ver":2},{"data":8000007,"id":503000027,"x":48,"y":34,"loot_multiply_ver":2},{"data":8000010,"id":503000028,"x":1,"y":2,"loot_multiply_ver":2},{"data":8000004,"id":503000029,"x":0,"y":47,"loot_multiply_ver":2},{"data":8000000,"id":503000030,"x":48,"y":38,"loot_multiply_ver":2},{"data":8000010,"id":503000031,"x":1,"y":16,"loot_multiply_ver":2},{"data":8000000,"id":503000032,"x":1,"y":23,"loot_multiply_ver":2},{"data":8000006,"id":503000033,"x":39,"y":48,"loot_multiply_ver":2},{"data":8000036,"id":503000034,"x":48,"y":20,"loot_multiply_ver":2},{"data":8000006,"id":503000035,"x":47,"y":41,"loot_multiply_ver":2},{"data":8000000,"id":503000036,"x":47,"y":28,"loot_multiply_ver":2},{"data":8000007,"id":503000037,"x":33,"y":48,"loot_multiply_ver":2},{"data":8000005,"id":503000038,"x":7,"y":1,"loot_multiply_ver":2},{"data":8000036,"id":503000039,"x":41,"y":10,"loot_multiply_ver":2},{"data":8000036,"id":503000040,"x":7,"y":39,"loot_multiply_ver":1},{"data":8000036,"id":503000041,"x":48,"y":13,"loot_multiply_ver":2},{"data":8000036,"id":503000042,"x":22,"y":2,"loot_multiply_ver":2},{"data":8000036,"id":503000043,"x":42,"y":6,"loot_multiply_ver":2},{"data":8000036,"id":503000044,"x":8,"y":33,"loot_multiply_ver":1},{"data":8000037,"id":503000078,"x":36,"y":48,"loot_multiply_ver":2},{"data":8000037,"id":503000119,"x":44,"y":14,"loot_multiply_ver":2},{"data":8000037,"id":503000160,"x":36,"y":3,"loot_multiply_ver":2},{"data":8000037,"id":503000201,"x":3,"y":5,"loot_multiply_ver":2},{"data":8000037,"id":503000242,"x":17,"y":41,"loot_multiply_ver":2},{"data":8000037,"id":503000243,"x":42,"y":21,"loot_multiply_ver":2},{"data":8000037,"id":503000284,"x":40,"y":1,"loot_multiply_ver":2},{"data":8000037,"id":503000305,"x":32,"y":4,"loot_multiply_ver":2},{"data":8000009,"id":503000306,"x":40,"y":22,"loot_multiply_ver":1},{"data":8000009,"id":503000307,"x":44,"y":41,"loot_multiply_ver":1},{"data":8000009,"id":503000308,"x":43,"y":28,"loot_multiply_ver":1},{"data":8000009,"id":503000309,"x":43,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000310,"x":44,"y":24,"loot_multiply_ver":1},{"data":8000023,"id":503000311,"x":43,"y":25,"loot_multiply_ver":1},{"data":8000023,"id":503000312,"x":44,"y":25,"loot_multiply_ver":1},{"data":8000023,"id":503000313,"x":43,"y":24,"loot_multiply_ver":1},{"data":8000023,"id":503000314,"x":42,"y":25,"loot_multiply_ver":1},{"data":8000023,"id":503000315,"x":44,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000316,"x":33,"y":45,"loot_multiply_ver":1},{"data":8000009,"id":503000317,"x":34,"y":44,"loot_multiply_ver":1},{"data":8000009,"id":503000318,"x":38,"y":33,"loot_multiply_ver":1},{"data":8000009,"id":503000319,"x":41,"y":25,"loot_multiply_ver":1},{"data":8000009,"id":503000320,"x":42,"y":24,"loot_multiply_ver":1},{"data":8000009,"id":503000321,"x":42,"y":29,"loot_multiply_ver":1},{"data":8000009,"id":503000322,"x":41,"y":29,"loot_multiply_ver":1},{"data":8000009,"id":503000323,"x":42,"y":28,"loot_multiply_ver":1},{"data":8000009,"id":503000324,"x":43,"y":29,"loot_multiply_ver":1},{"data":8000009,"id":503000325,"x":32,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000326,"x":31,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000327,"x":30,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000328,"x":33,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000329,"x":29,"y":42,"loot_multiply_ver":1},{"data":8000009,"id":503000330,"x":28,"y":42,"loot_multiply_ver":1},{"data":8000009,"id":503000331,"x":29,"y":43,"loot_multiply_ver":1},{"data":8000009,"id":503000332,"x":26,"y":37,"loot_multiply_ver":1},{"data":8000009,"id":503000333,"x":20,"y":39,"loot_multiply_ver":1},{"data":8000009,"id":503000334,"x":20,"y":38,"loot_multiply_ver":1},{"data":8000009,"id":503000335,"x":27,"y":25,"loot_multiply_ver":1},{"data":8000009,"id":503000336,"x":26,"y":34,"loot_multiply_ver":1},{"data":8000009,"id":503000337,"x":32,"y":22,"loot_multiply_ver":1},{"data":8000009,"id":503000338,"x":35,"y":20,"loot_multiply_ver":1},{"data":8000009,"id":503000339,"x":26,"y":35,"loot_multiply_ver":1},{"data":8000009,"id":503000340,"x":36,"y":20,"loot_multiply_ver":1},{"data":8000009,"id":503000341,"x":28,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000342,"x":26,"y":36,"loot_multiply_ver":1},{"data":8000009,"id":503000343,"x":28,"y":25,"loot_multiply_ver":1},{"data":8000009,"id":503000344,"x":29,"y":26,"loot_multiply_ver":1},{"data":8000009,"id":503000345,"x":20,"y":35,"loot_multiply_ver":1},{"data":8000038,"id":503000346,"x":45,"y":3,"defg":117171,"defe":104847,"defde":307,"loot_multiply_ver":1}],"decos":[],"respawnVars":{"secondsFromLastRespawn":231386,"respawnSeed":1914935487,"obstacleClearCounter":5,"time_to_gembox_drop":196966,"time_in_gembox_period":228665},"cooldowns":[],"newShopBuildings":[4,0,6,3,6,3,4,1,5,5,225,3,3,4,1,5,0,0,0,3,1,0,1,2,1,0,2,0,1,1,0,0],"newShopTraps":[6,6,3,0,0,4,2,0,2],"newShopDecos":[1,4,0,1,1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"last_league_rank":9,"last_alliance_level":7,"last_league_shuffle":1,"last_season_seen":0,"last_news_seen":221,"troop_req_msg":"max hogs and max poison","war_req_msg":"2 witches, 1 barb","war_tutorials_seen":0,"war_base":true,"account_flags":14,"bool_layout_edit_shown_erase":true} \ No newline at end of file diff --git a/src/main/resources/tile.png b/src/main/resources/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..4f667c84d8ed893b92c23eae3119bb1a8fdad90f GIT binary patch literal 28641 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 WIw_l6w{ioG|i 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/tiles.jpg b/src/main/resources/tiles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37dab96075fe05e5b6f8e44b905fddce1a77702d GIT binary patch literal 17390 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 kHYm#vno3I?TsG + {{/styles}} + + {{$navbar}} + {{#times}} + + {{/times}} + + + {{/navbar}} + + {{$content}} + {{#warning}} +
+
+
{{warning}}
+
+
+ {{/warning}} + +
+
+
+
+
+ +
+
+ {{/content}} + + {{$scripts}} + + + + + + + + + + + + + + + + + + + + {{/scripts}} +{{/base}} \ No newline at end of file diff --git a/src/main/resources/web/base.mustache b/src/main/resources/web/base.mustache new file mode 100644 index 0000000..41be6ed --- /dev/null +++ b/src/main/resources/web/base.mustache @@ -0,0 +1,45 @@ + + + + Clash War Base Analyser - {{$title}}{{/title}} + + + + {{$styles}}{{/styles}} + + + + +
+ {{$content}}{{/content}} +
+ + + {{$scripts}}{{/scripts}} + + \ No newline at end of file diff --git a/src/main/resources/web/clan.mustache b/src/main/resources/web/clan.mustache new file mode 100644 index 0000000..6423950 --- /dev/null +++ b/src/main/resources/web/clan.mustache @@ -0,0 +1,38 @@ +{{ +
+

Bulk Analysis

+ {{bulkAnalysisUrl}} +
+ + +
+
+

Current Players

+ + + + + + + + + + {{#players}} + + + + + + {{/players}} + +
IGNBase Analysis - Active WarBase Analysis - Home
{{ign}}{{warAnalysisUrl}}{{homeAnalysisUrl}}
+
+
+ {{/content}} +{{/base}} \ No newline at end of file diff --git a/src/main/resources/web/error.mustache b/src/main/resources/web/error.mustache new file mode 100644 index 0000000..6b9bb0a --- /dev/null +++ b/src/main/resources/web/error.mustache @@ -0,0 +1,9 @@ +{{{{message}}

+ {{/content}} +{{/base}} \ No newline at end of file diff --git a/src/main/resources/web/index.html b/src/main/resources/web/index.html new file mode 100644 index 0000000..5d8289b --- /dev/null +++ b/src/main/resources/web/index.html @@ -0,0 +1,16 @@ + + + + CoC War Base Analyser + + +
+
+
+

CoC War Base Analyser

+

Nothing to see here... Ask for the link to your clan page from the developer

+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/web/war-bases.mustache b/src/main/resources/web/war-bases.mustache new file mode 100644 index 0000000..b43b78f --- /dev/null +++ b/src/main/resources/web/war-bases.mustache @@ -0,0 +1,89 @@ +{{ + .glyphicon-remove-sign { + color: #ff5555; + } + button.collapsed .hide-instruction { + display:none; + } + + {{/styles}} + + {{$heading}}{{name}} Bulk War Bases Analysis{{/heading}} + + {{$content}} +
+
+ Analysing: + +
+
+
+ +
+ +
+ +
+
+
+
+ {{/content}} + + {{$scripts}} + + + + + + + + + {{/scripts}} +{{/base}} \ No newline at end of file diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/Facades.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/Facades.scala new file mode 100644 index 0000000..9cbea0d --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/Facades.scala @@ -0,0 +1,71 @@ +package org.danielholmes.coc.baseanalyser + +import java.time.Duration + +import org.danielholmes.coc.baseanalyser.analysis.{AnalysisReport, VillageAnalyser} +import org.danielholmes.coc.baseanalyser.gameconnection.ClanSeekerProtocol.PlayerVillage +import org.danielholmes.coc.baseanalyser.gameconnection.GameConnection +import org.danielholmes.coc.baseanalyser.baseparser.VillageJsonParser +import org.danielholmes.coc.baseanalyser.model.Layout._ +import org.danielholmes.coc.baseanalyser.model.{Layout, Village} +import org.danielholmes.coc.baseanalyser.util.TimedInvocation +import org.danielholmes.coc.baseanalyser.web.PermittedClan +import org.scalactic.{Bad, Good, Or} + +class Facades( + permittedClans: Set[PermittedClan], + gameConnection: GameConnection, + villageJsonParser: VillageJsonParser, + villageAnalyser: VillageAnalyser +) { + def getVillageAnalysis(clanCode: String, playerId: Long, layoutName: String): + ((PermittedClan, Option[AnalysisReport], Village, PlayerVillage, Layout, Duration) Or String) = { + permittedClans.find(_.code == clanCode) + .map(clan => + Layout.values.find(_.toString == layoutName) + .map(layout => + TimedInvocation.run(() => gameConnection.getPlayerVillage(playerId)) match { + case (p: Option[PlayerVillage], connectionDuration: Duration) => + p.filter(_.avatar.clanId == clan.id) + .map(player => + villageJsonParser.parse(player.village.raw) + .getByLayout(layout) + .map(village => { + val analysis = villageAnalyser.analyse(village) + Good((clan, analysis, village, player, layout, connectionDuration)) + }) + .getOrElse(Bad(s"Player ${player.avatar.userName} doesn't have $layout village")) + ) + .getOrElse(Bad(s"id $playerId not found in clan ${clan.name}")) + } + ) + .getOrElse(Bad(s"Layout type $layoutName unknown")) + ) + .getOrElse(Bad(s"Clan with code $clanCode not found")) + } + + def getWarVillageByUserName(clanCode: String, userName: String): Village Or String = { + permittedClans.find(_.code == clanCode) + .map(clan => + gameConnection.getClanDetails(clan.id) + .map(clanDetails => + clanDetails.players.find(_.avatar.userName.equalsIgnoreCase(userName)) + .map(_.avatar.currentHomeId) + .map(userId => + gameConnection.getPlayerVillage(userId) + .map(_.village.raw) + .map(villageJsonParser.parse) + .map( + _.war + .map(Good(_)) + .getOrElse(Bad(s"User $userName has no war village")) + ) + .getOrElse(Bad("Error communicating with servers")) + ) + .getOrElse(Bad(s"Player $userName doesn't exist")) + ) + .getOrElse(Bad("Error communicating with servers")) + ) + .getOrElse(Bad(s"Clan code $clanCode not found")) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/PrintAttackPlacements.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/PrintAttackPlacements.scala new file mode 100644 index 0000000..0a98f4f --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/PrintAttackPlacements.scala @@ -0,0 +1,17 @@ +package org.danielholmes.coc.baseanalyser + +object PrintAttackPlacements extends App with Services { + if (args.length != 2) { + throw new RuntimeException("Must provide clan code and userName arg") + } + + val clanCode = args(0) + val userName = args(1) + + println( + facades.getWarVillageByUserName(clanCode, userName) + .map(stringTroopDropDisplayer.build) + .recover(s => s) + .get + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/PrintVillage.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/PrintVillage.scala new file mode 100644 index 0000000..af88ef3 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/PrintVillage.scala @@ -0,0 +1,17 @@ +package org.danielholmes.coc.baseanalyser + +object PrintVillage extends App with Services { + if (args.length != 2) { + throw new RuntimeException("Must provide clan code and userName arg") + } + + val clanCode = args(0) + val userName = args(1) + + println( + facades.getWarVillageByUserName(clanCode, userName) + .map(stringDisplayer.buildColoured) + .recover(s => s) + .get + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/ProfileAnalysis.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/ProfileAnalysis.scala new file mode 100644 index 0000000..5c0ed57 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/ProfileAnalysis.scala @@ -0,0 +1,39 @@ +package org.danielholmes.coc.baseanalyser + +import java.time.Duration + +import org.danielholmes.coc.baseanalyser.model.{Tile, TileCoordinate, WallCompartment} +import org.danielholmes.coc.baseanalyser.util.TimedInvocation + +object ProfileAnalysis extends App with Services { + if (args.length != 2) { + throw new RuntimeException("Must provide clan code and userName arg") + } + + val clanCode = args(0) + val userName = args(1) + + private def formatSecs(duration: Duration): String = "%.3f".format(duration.toMillis / 1000.0) + "s" + + println( + facades.getWarVillageByUserName(clanCode, userName) + .map(village => { + villageAnalyser.analyse(village) + .map(report => { + val all = Map( + "Building blocks" -> report.profiling.buildingBlocksSorted.map(t => (t._1, formatSecs(t._2))), + "Rules" -> report.profiling.rulesSorted.map(t => (t._1.shortName, formatSecs(t._2))), + "Total" -> Seq(("", formatSecs(report.profiling.total))) + ) + val lineLength = all.values.flatMap(t => t.map(t => t._1.length + t._2.length + 1)).max + all.mapValues(_.map(t => t._1 + (" " * (lineLength - t._1.length - t._2.length)) + t._2)) + .toSeq + .flatMap(t => Seq("-" * lineLength + s"\n# ${t._1}") ++ t._2) + .mkString("\n") + }) + .getOrElse("Couldn't analyse") + }) + .recover(e => Console.RED + e + Console.RED) + .get + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/Services.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/Services.scala new file mode 100644 index 0000000..dac380a --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/Services.scala @@ -0,0 +1,69 @@ +package org.danielholmes.coc.baseanalyser + +import com.github.mustachejava.DefaultMustacheFactory +import com.twitter.mustache.ScalaObjectHandler +import org.danielholmes.coc.baseanalyser.analysis._ +import org.danielholmes.coc.baseanalyser.gameconnection.{ClanSeekerGameConnection, StubGameConnection} +import org.danielholmes.coc.baseanalyser.baseparser.{HardCodedElementFactory, VillageJsonParser} +import org.danielholmes.coc.baseanalyser.stringdisplay.{StringDisplayer, StringTroopDropDisplayer} +import org.danielholmes.coc.baseanalyser.web.{MustacheRenderer, PermittedClan, ViewModelMapper} +import org.scalactic.anyvals.PosInt + +trait Services { + import com.softwaremill.macwire._ + + //lazy val gameConnection = wire[ClanSeekerGameConnection] + lazy val gameConnection = wire[StubGameConnection]; println("WARNING: Test stubbed game connection enabled") + private lazy val elementFactory = wire[HardCodedElementFactory] + lazy val villageJsonParser = wire[VillageJsonParser] + private lazy val th8Rules: Set[Rule] = Set( + wire[HogCCLureRule], + wire[HighHPUnderAirDefRule], + wire[ArcherAnchorRule], + wire[AirSnipedDefenseRule], + wire[MinimumCompartmentsRule], + wire[BKSwappableRule], + wire[EnoughPossibleTrapLocationsRule] + ) + private lazy val th9Rules: Set[Rule] = Set( + wire[HogCCLureRule], + wire[AirSnipedDefenseRule], + wire[WizardTowersOutOfHoundPositionsRule], + wire[QueenWalkedAirDefenseRule], + wire[QueenWontLeaveCompartmentRule], + wire[EnoughPossibleTrapLocationsRule] + ) + private lazy val th10Rules: Set[Rule] = Set( + wire[HogCCLureRule], + wire[AirSnipedDefenseRule], + wire[WizardTowersOutOfHoundPositionsRule], + wire[QueenWalkedAirDefenseRule] + ) + private lazy val th11Rules: Set[Rule] = th10Rules + private lazy val rulesByThLevel = Map( + PosInt(8) -> th8Rules, + PosInt(9) -> th9Rules, + PosInt(10) -> th10Rules, + PosInt(11) -> th11Rules + ) + + private def mustacheFactory = { + val mf = new DefaultMustacheFactory() + mf.setObjectHandler(new ScalaObjectHandler()) + mf + } + + lazy val mustacheRenderer = wire[MustacheRenderer] + + lazy val permittedClans = Set[PermittedClan]( + PermittedClan("alpha", "OneHive Alpha", 154621406673L), + PermittedClan("genesis", "OneHive Genesis", 128850679685L), + PermittedClan("uncool", "Uncool", 103079424453L), + PermittedClan("aerial", "Aerial Assault", 227634713283L) + ) + lazy val villageAnalyser = wire[VillageAnalyser] + lazy val stringDisplayer = wire[StringDisplayer] + lazy val stringTroopDropDisplayer = wire[StringTroopDropDisplayer] + lazy val viewModelMapper = wire[ViewModelMapper] + lazy val facades = wire[Facades] +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRule.scala new file mode 100644 index 0000000..9ada0c5 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRule.scala @@ -0,0 +1,41 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.troops.{Minion, MinionAttackPosition} +import org.danielholmes.coc.baseanalyser.model.{Defense, Target, Village} + +class AirSnipedDefenseRule extends Rule { + def analyse(village: Village): RuleResult = { + val defensesByAir = village.defenses + .partition(_.targets.contains(Target.Air)) + + AirSnipedDefenseRuleResult( + noDefenseRangesCoverMinion(defensesByAir._2, defensesByAir._1), + defensesByAir._1 + ) + } + + private def noDefenseRangesCoverMinion(ground: Set[Defense], air: Set[Defense]): Set[MinionAttackPosition] = { + ground.flatMap(bestNonAirCoveredAttackPosition(_, air)) + } + + private def bestNonAirCoveredAttackPosition(ground: Defense, air: Set[Defense]): Option[MinionAttackPosition] = { + Minion.getAttackFloatCoordinates(ground) + .filter(coordinate => !air.exists(_.range.contains(coordinate))) + .map(MinionAttackPosition(_, ground)) + .headOption + } +} + +case class AirSnipedDefenseRuleResult(snipedDefenses: Set[MinionAttackPosition], airDefenses: Set[Defense]) extends RuleResult { + val success = snipedDefenses.isEmpty + val ruleDetails = AirSnipedDefenseRule.Details +} + +object AirSnipedDefenseRule { + val Details = RuleDetails( + "AirSnipedDefense", + "Air covers Ground Defs", + "Ground Defenses covered by Air", + "No ground only defenses should be reachable by minions or loons" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisProfiling.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisProfiling.scala new file mode 100644 index 0000000..1f7029d --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisProfiling.scala @@ -0,0 +1,13 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import java.time.Duration + +case class AnalysisProfiling(buildingBlocks: Map[String, Duration], rules: Map[RuleDetails, Duration]) { + lazy val rulesDuration = rules.values.fold(Duration.ZERO)(_.plus(_)) + lazy val buildingBlocksDuration = buildingBlocks.values.fold(Duration.ZERO)(_.plus(_)) + + lazy val rulesSorted: List[(RuleDetails, Duration)] = rules.toList.sortBy(_._2).reverse + lazy val buildingBlocksSorted: List[(String, Duration)] = buildingBlocks.toList.sortBy(_._2).reverse + + lazy val total: Duration = rulesDuration.plus(buildingBlocksDuration) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisReport.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisReport.scala new file mode 100644 index 0000000..46add12 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/AnalysisReport.scala @@ -0,0 +1,5 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.Village + +case class AnalysisReport(village: Village, results: Set[RuleResult], profiling: AnalysisProfiling) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRule.scala new file mode 100644 index 0000000..0cc41dc --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRule.scala @@ -0,0 +1,42 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.troops.{ArcherTargeting, Archer} + +// TODO: Shouldn't take into account EagleArtillery since wont be activated. Test this +class ArcherAnchorRule extends Rule { + def analyse(village: Village): RuleResult = { + val targetImmediateArcherGroundDefenses = village.groundTargetingDefenses + .filter({ + case d: DelayedActivation => false + case g: Defense => true + }) + + val safeCoords = village.coordinatesAllowedToDropTroop + .filter(coord => !targetImmediateArcherGroundDefenses.exists(_.range.contains(coord))) + val possibleTargets = Archer.getAllPossibleTargets(village) + + ArcherAnchorRuleResult( + possibleTargets.flatMap(possibleTarget => { + safeCoords.intersect(Archer.getAttackTileCoordinates(possibleTarget)) + .find(_ => true) + .map(coord => ArcherTargeting(coord, possibleTarget)) + }), + targetImmediateArcherGroundDefenses + ) + } +} + +case class ArcherAnchorRuleResult(targeting: Set[ArcherTargeting], aimingDefenses: Set[Defense]) extends RuleResult { + val success = targeting.isEmpty + val ruleDetails = ArcherAnchorRule.Details +} + +object ArcherAnchorRule { + val Details = RuleDetails( + "ArcherAnchor", + "No Arch Anchors", + "No Archer Anchors", + "There should be no unprotected archer anchors" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRule.scala new file mode 100644 index 0000000..4344ec2 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRule.scala @@ -0,0 +1,81 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.heroes.BarbarianKingAltar +import org.scalactic.anyvals.{PosDouble, PosZDouble} + +import scala.annotation.tailrec + +class BKSwappableRule extends Rule { + private val CloseEnoughFromDropToSwap = PosDouble(5.5) + private val MinExposedDistance = PosDouble(1.75) + + def analyse(village: Village): RuleResult = { + val exposedTiles = findExposedTiles(village) + BKSwappableRuleResult( + findTouchingTiles( + findTriggerTiles(village, exposedTiles), + exposedTiles, + Set.empty + ) + ) + } + + @tailrec + private def findTouchingTiles(touchingTrigger: Set[Tile], exposedToCheck: Set[Tile], current: Set[Tile]): Set[Tile] = { + touchingTrigger.toList match { + case Nil => current + case head :: tail => + val exposedTouchingTrigger = touchingTrigger.head.neighbours.intersect(exposedToCheck) + findTouchingTiles( + touchingTrigger ++ exposedTouchingTrigger -- current, + exposedToCheck -- exposedTouchingTrigger, + current + head + ) + } + } + + private def findTriggerTiles(village: Village, exposedTiles: Set[Tile]) = { + village.findElementByType[BarbarianKingAltar] + .map(_.range) + .map(_.inset(MinExposedDistance)) + .map(_.allTouchingTiles) + .getOrElse(Set.empty) + .intersect(exposedTiles) + } + + private def findExposedTiles(village: Village) = { + village.elements + .find(_.isInstanceOf[BarbarianKingAltar]) + .map(_.asInstanceOf[BarbarianKingAltar]) + .map(_.range) + .map(_.allTouchingTiles) + .getOrElse(Set.empty) + .filter(inHoleOrOutsideCompartmentAndCloseEnoughToDrop(village, _)) + } + + private def inHoleOrOutsideCompartmentAndCloseEnoughToDrop(village: Village, tile: Tile) = { + village.tilesAllowedToDropTroop.contains(tile) || + (village.wallCompartments.forall(!_.contains(tile)) && closestDropDistance(village, tile) <= CloseEnoughFromDropToSwap) + } + + private def closestDropDistance(village: Village, tile: Tile): PosZDouble = { + village.tilesAllowedToDropTroop + .map(_.distanceTo(tile)) + .min + } +} + +case class BKSwappableRuleResult(exposedTiles: Set[Tile]) extends RuleResult { + val success = exposedTiles.isEmpty + val ruleDetails = BKSwappableRule.Details +} + +object BKSwappableRule { + val Details = RuleDetails( + "BKSwappable", + "BK protected", + "BK should be protected", + "The BK's range should be inside walls so he can't be lureed out and killed early as part of a tanking BK or KS" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRule.scala new file mode 100644 index 0000000..d5d2508 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRule.scala @@ -0,0 +1,45 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.Village +import org.scalactic.anyvals.PosZDouble + +class EnoughPossibleTrapLocationsRule extends Rule { + def analyse(village: Village): RuleResult = { + EnoughPossibleTrapLocationsRuleResult(calculateScore(village)) + } + + def calculateScore(village: Village): PosZDouble = { + PosZDouble.from( + village.possibleInternalLargeTraps + .flatMap(_.tiles) + .groupBy(tile => village.possibleInternalLargeTraps.count(trap => trap.tiles.contains(tile))) + .mapValues(_.size) + .map({ + case (1, c) => EnoughPossibleTrapLocationsRule.TileScore * c + case (_, c) => EnoughPossibleTrapLocationsRule.MultiUseTileScore * c + }) + .sum + ).get + } +} + +case class EnoughPossibleTrapLocationsRuleResult(score: PosZDouble) extends RuleResult { + val success = score >= EnoughPossibleTrapLocationsRule.MinScore + val minScore = EnoughPossibleTrapLocationsRule.MinScore + val ruleDetails = EnoughPossibleTrapLocationsRule.Details +} + +object EnoughPossibleTrapLocationsRule { + val TileScore = 0.25 + + val MultiUseTileScore = TileScore * 0.8 + + val MinScore = 22 + + val Details = RuleDetails( + "EnoughPossibleTrapLocations", + "Enough Possible Traps", + "Enough Possible Trap Locations", + "As well as real trap locations, your base should provide enough decoy locations to keep the attacker unsure and guessing about where the real traps are" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRule.scala new file mode 100644 index 0000000..8ba4ed0 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRule.scala @@ -0,0 +1,56 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.AirDefense +import org.danielholmes.coc.baseanalyser.model.special.{ClanCastle, TownHall} +import org.danielholmes.coc.baseanalyser.model.trash.{DarkElixirStorage, ElixirStorage, GoldStorage} +import org.danielholmes.coc.baseanalyser.model.troops.Dragon + +import scala.annotation.tailrec + +class HighHPUnderAirDefRule extends Rule { + def analyse(village: Village): RuleResult = { + val highHPBuildings = village.structures.filter(isHighHPBuilding) + val covered = highHPBuildings.partition(willSomeAirDefCoverDragonShooting(_, village.airDefenses)) + HighHPUnderAirDefRuleResult(covered._2, covered._1) + } + + private def willSomeAirDefCoverDragonShooting(highHP: Structure, airDefs: Set[AirDefense]): Boolean = { + willSomeAirDefCoverDragonShooting(Dragon.getAttackFloatCoordinates(highHP), airDefs) + } + + @tailrec + private def willSomeAirDefCoverDragonShooting(highHPCoords: Set[FloatMapCoordinate], airDefs: Set[AirDefense]): Boolean = { + highHPCoords.toList match { + case Nil => true + case head :: tail => airDefs.exists(_.range.contains(head)) && willSomeAirDefCoverDragonShooting(tail.toSet, airDefs) + } + } + + private def isHighHPBuilding(structure: Structure): Boolean = { + structure match { + case _: GoldStorage => true + case _: DarkElixirStorage => true + case _: ElixirStorage => true + case _: TownHall => true + case _: ClanCastle => true + case _ => false + } + } +} + +case class HighHPUnderAirDefRuleResult(outOfAirDefRange: Set[Structure], inAirDefRange: Set[Structure]) extends RuleResult { + require(outOfAirDefRange.intersect(inAirDefRange).isEmpty) + + val success = outOfAirDefRange.isEmpty + val ruleDetails = HighHPUnderAirDefRule.Details +} + +object HighHPUnderAirDefRule { + val Details = RuleDetails( + "HighHPUnderAirDef", + "Air Covers High HP", + "High HP covered by Air Defenses", + "All high HP buildings should be within range of your air defenses" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRule.scala new file mode 100644 index 0000000..90bedb3 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRule.scala @@ -0,0 +1,32 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.troops.{HogTargeting, HogRider} + +class HogCCLureRule extends Rule { + def analyse(village: Village): RuleResult = { + village.clanCastle + .map(_.range) + .map(range => + village.edgeOfHitCoordinatesAllowedToDropTroop + .flatMap(coord => HogRider.findTargets(coord, village).map(HogTargeting(coord, _))) + .filter(_.cutsRadius(range)) + ) + .map(HogCCLureRuleResult) + .getOrElse(HogCCLureRuleResult(Set.empty)) + } +} + +case class HogCCLureRuleResult(targeting: Set[HogTargeting]) extends RuleResult { + val success = targeting.isEmpty + val ruleDetails = HogCCLureRule.Details +} + +object HogCCLureRule { + val Details = RuleDetails( + "HogCCLure", + "No Easy Lure", + "No Easy CC Troops Lure", + "There should be no spaces that allow a hog or giant to lure without first having to destroy a defense" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRule.scala new file mode 100644 index 0000000..9afd3aa --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRule.scala @@ -0,0 +1,29 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.troops.{Minion, MinionAttackPosition} +import org.danielholmes.coc.baseanalyser.model.{Defense, Target, Village, WallCompartment} +import org.scalactic.anyvals.PosInt + +class MinimumCompartmentsRule extends Rule { + def analyse(village: Village): RuleResult = { + MinimumCompartmentsRuleResult(MinimumCompartmentsRule.Min, village.wallCompartments.filter(_.elements.nonEmpty)) + } +} + +case class MinimumCompartmentsRuleResult(minimumCompartments: PosInt, buildingCompartments: Set[WallCompartment]) extends RuleResult { + require(buildingCompartments.forall(_.elements.nonEmpty)) + + val success = buildingCompartments.size >= minimumCompartments + val ruleDetails = MinimumCompartmentsRule.Details +} + +object MinimumCompartmentsRule { + val Min = PosInt(8) + + val Details = RuleDetails( + "MinimumCompartments", + s">= ${Min.toInt} compartments", + s"At least ${Min.toInt} compartments", + "GoWiPe can be slowed down by having enough compartments (with buildings inside them) to hold it up" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/PlayerAnalysisReport.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/PlayerAnalysisReport.scala new file mode 100644 index 0000000..fa60fbe --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/PlayerAnalysisReport.scala @@ -0,0 +1,3 @@ +package org.danielholmes.coc.baseanalyser.analysis + +case class PlayerAnalysisReport(userName: String, townHallLevel: Int, villageReport: Option[AnalysisReport]) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRule.scala new file mode 100644 index 0000000..f809df8 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRule.scala @@ -0,0 +1,33 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.troops.{ArcherQueen, ArcherQueenAttacking} +import org.danielholmes.coc.baseanalyser.model.Village +import org.danielholmes.coc.baseanalyser.model.defense.AirDefense + + +class QueenWalkedAirDefenseRule extends Rule { + def analyse(village: Village): RuleResult = { + val attackings: Set[ArcherQueenAttacking] = village.airDefenses + .flatMap(el => + ArcherQueen.firstPossibleAttackingCoordinate(el, village.outerTileCoordinates) + .map(ArcherQueenAttacking(_, el)) + ) + val targetings = attackings.map(_.targeting).map(_.asInstanceOf[AirDefense]) + val nonReachableAirDefs = village.airDefenses.diff(targetings) + QueenWalkedAirDefenseRuleResult(attackings, nonReachableAirDefs) + } +} + +case class QueenWalkedAirDefenseRuleResult(attackings: Set[ArcherQueenAttacking], nonReachableAirDefs: Set[AirDefense]) extends RuleResult { + val success = attackings.isEmpty + val ruleDetails = QueenWalkedAirDefenseRule.Details +} + +object QueenWalkedAirDefenseRule { + val Details = RuleDetails( + "QueenWalkedAirDefense", + "AirDef not AQ Walkable", + "Air Defenses not Queen Walkable", + "Air Defenses shouldn't be reachable over a wall by a queen walking outside" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRule.scala new file mode 100644 index 0000000..c35da6c --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRule.scala @@ -0,0 +1,35 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.Village +import org.danielholmes.coc.baseanalyser.model.heroes.ArcherQueenAltar +import org.scalactic.anyvals.PosInt + +class QueenWontLeaveCompartmentRule extends Rule { + def analyse(village: Village): RuleResult = { + village.elements + .find(_.isInstanceOf[ArcherQueenAltar]) + .map(queen => + village.wallCompartments + .find(_.elements.contains(queen)) + .filter(c => queen.block.expandBy(QueenWontLeaveCompartmentRule.MinClearance).tiles.subsetOf(c.innerTiles)) + .map(q => QueenWontLeaveCompartmentRuleResult(true)) + .getOrElse(QueenWontLeaveCompartmentRuleResult(false)) + ) + .getOrElse(QueenWontLeaveCompartmentRuleResult(true)) + } +} + +case class QueenWontLeaveCompartmentRuleResult(success: Boolean) extends RuleResult { + val ruleDetails = QueenWontLeaveCompartmentRule.Details +} + +object QueenWontLeaveCompartmentRule { + val MinClearance = PosInt(3) + + val Details = RuleDetails( + "QueenWontLeaveCompartment", + "AQ in >= 9x9", + "Archer Queen wont leave compartment", + "Your Archer Queen should be within a compartment large enough so that she won't jump out (centre of 9x9)" + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/Rule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/Rule.scala new file mode 100644 index 0000000..7fa899d --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/Rule.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.Village + +trait Rule { + def analyse(village: Village): RuleResult +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleDetails.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleDetails.scala new file mode 100644 index 0000000..d38bc5b --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleDetails.scala @@ -0,0 +1,3 @@ +package org.danielholmes.coc.baseanalyser.analysis + +case class RuleDetails(code: String, shortName: String, name: String, description: String) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleResult.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleResult.scala new file mode 100644 index 0000000..47cb7d4 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/RuleResult.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.analysis + +trait RuleResult { + val success: Boolean + + val ruleDetails: RuleDetails +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/VillageAnalyser.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/VillageAnalyser.scala new file mode 100644 index 0000000..bf96135 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/VillageAnalyser.scala @@ -0,0 +1,57 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import java.time.Duration + +import org.danielholmes.coc.baseanalyser.model.{Tile, Village} +import org.danielholmes.coc.baseanalyser.util.TimedInvocation +import org.scalactic.anyvals.PosInt + +class VillageAnalyser(private val rulesByThLevel: Map[PosInt, Set[Rule]]) { + require(rulesByThLevel.nonEmpty) + + lazy val minTownHallLevel = rulesByThLevel.keys.min + + lazy val maxTownHallLevel = rulesByThLevel.keys.max + + def analyse(village: Village): Option[AnalysisReport] = { + // NOTE: Times taken are thrown out if done in parallel + village.townHallLevel + .flatMap(rulesByThLevel.get) + .map(analyse(_, village)) + } + + private def analyse(rules: Set[Rule], village: Village): AnalysisReport = { + val buildingBlockTimes = runBuildingBlocks(village) + buildReport(village, rules.map(rule => invokeRule(rule, village)), buildingBlockTimes) + } + + private def runBuildingBlocks(village: Village): Map[String, Duration] = { + // Walls? + Seq( + ("Outer Tiles", () => village.outerTiles), + ("Wall Compartments", () => village.wallCompartments), + ("Allowed To Drop", () => village.coordinatesAllowedToDropTroop), + ("Edge Prevent Drop", () => village.edgeOfHitCoordinatesAllowedToDropTroop) + ).map(titleOp => (titleOp._1, TimedInvocation.run(titleOp._2)._2)) + .toMap + } + + private def buildReport( + village: Village, + invocations: Set[(RuleResult, Duration)], + buildingBlockTimes: Map[String, Duration] + ): AnalysisReport = { + AnalysisReport( + village, + invocations.map(_._1), + AnalysisProfiling( + buildingBlockTimes, + invocations.map(i => (i._1.ruleDetails, i._2)).toMap + ) + ) + } + + private def invokeRule(rule: Rule, village: Village): (RuleResult, Duration) = { + TimedInvocation.run(() => rule.analyse(village)) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionRule.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionRule.scala new file mode 100644 index 0000000..05eecd9 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionRule.scala @@ -0,0 +1,39 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model.troops.{LavaHound, Minion, MinionAttackPosition, WizardTowerHoundTargeting} +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.{AirDefense, WizardTower} + +class WizardTowersOutOfHoundPositionsRule extends Rule { + def analyse(village: Village): RuleResult = { + val wts = village.elements + .filter(_.isInstanceOf[WizardTower]) + .map(_.asInstanceOf[WizardTower]) + + val wtInRange = wts.map(wt => (wt, village.airDefenses.filter(ad => wt.range.touches(LavaHound.getRestingArea(ad))))) + .filter(_._2.nonEmpty) + .flatMap(pair => pair._2.map(ad => WizardTowerHoundTargeting(pair._1, ad, LavaHound.getRestingArea(ad)))) + + val outOfRange = wts.filterNot(wt => wtInRange.exists(_.tower == wt)) + + WizardTowersOutOfHoundPositionsRuleResult(outOfRange, wtInRange) + } +} + +case class WizardTowersOutOfHoundPositionsRuleResult( + outOfRange: Set[WizardTower], + inRange: Set[WizardTowerHoundTargeting] +) extends RuleResult { + val success = inRange.map(_.tower).size <= outOfRange.size + val ruleDetails = WizardTowersOutOfHoundPositionsRule.Details +} + +object WizardTowersOutOfHoundPositionsRule { + val Details = RuleDetails( + "WizardTowersOutOfHoundPositions", + "WTs avoid hounds", + "Enough Wizard Towers out of hound range", + """Wizard Towers are strong against loons, they shouldn't be too close to air defenses where hounds can tank for them. + |You should have at least 2 that wont target resting hounds""".stripMargin + ) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/ElementFactory.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/ElementFactory.scala new file mode 100644 index 0000000..2aa9e22 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/ElementFactory.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.baseparser + +import org.danielholmes.coc.baseanalyser.model.Element + +abstract class ElementFactory { + def build(raw: RawElement): Option[Element] +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactory.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactory.scala new file mode 100644 index 0000000..3786ed1 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactory.scala @@ -0,0 +1,158 @@ +package org.danielholmes.coc.baseanalyser.baseparser + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense._ +import org.danielholmes.coc.baseanalyser.model.heroes.{ArcherQueenAltar, BarbarianKingAltar, GrandWarden} +import org.danielholmes.coc.baseanalyser.model.special.{ClanCastle, TownHall} +import org.danielholmes.coc.baseanalyser.model.traps._ +import org.danielholmes.coc.baseanalyser.model.trash._ +import org.scalactic.anyvals.{PosInt, PosZInt} + +class HardCodedElementFactory extends ElementFactory { + private def levelAndCoordinateConstructor(constructor: (PosInt, Tile) => Element): (RawElement => Element) = { + raw => constructor(elementLevel(raw.lvl), elementTile(raw)) + } + + private def noLevelConstructor(constructor: (Tile) => Element): (RawElement => Element) = { + raw => constructor(elementTile(raw)) + } + + private def elementLevel(rawLevel: Int): PosInt = PosInt.from(Math.max(1, rawLevel + 1)).get + + private def elementTile(raw: RawElement) = Tile(PosZInt.from(raw.x).get, PosZInt.from(raw.y).get) + + private val decorationConstructor = (element: RawElement) => Decoration(elementTile(element)) + + private val elementConstructorByCode: Map[Int, RawElement => Element] = Map( + // Buildings + 1000001 -> levelAndCoordinateConstructor(TownHall), + 1000000 -> levelAndCoordinateConstructor(ArmyCamp), + 1000002 -> levelAndCoordinateConstructor(ElixirCollector), + 1000003 -> levelAndCoordinateConstructor(ElixirStorage), + 1000004 -> levelAndCoordinateConstructor(GoldMine), + 1000005 -> levelAndCoordinateConstructor(GoldStorage), + 1000006 -> levelAndCoordinateConstructor(Barrack), + 1000007 -> levelAndCoordinateConstructor(Laboratory), + 1000008 -> levelAndCoordinateConstructor(Cannon), + 1000009 -> levelAndCoordinateConstructor(ArcherTower), + 1000010 -> levelAndCoordinateConstructor(Wall), + 1000011 -> levelAndCoordinateConstructor(WizardTower), + 1000012 -> levelAndCoordinateConstructor(AirDefense), + 1000013 -> levelAndCoordinateConstructor(Mortar), + 1000014 -> levelAndCoordinateConstructor(ClanCastle), + 1000015 -> noLevelConstructor(BuilderHut), + //1000016 CommunicationsMast, + //1000017 -> GoblinTownHull, + //1000018 -> GoblinHut, + 1000019 -> levelAndCoordinateConstructor(HiddenTesla), + 1000020 -> levelAndCoordinateConstructor(SpellFactory), + 1000021 -> ((raw: RawElement) => XBow.both(elementLevel(raw.lvl), elementTile(raw))), + 1000022 -> levelAndCoordinateConstructor(BarbarianKingAltar), + 1000023 -> levelAndCoordinateConstructor(DarkElixirCollector), + 1000024 -> levelAndCoordinateConstructor(DarkElixirStorage), + 1000025 -> levelAndCoordinateConstructor(ArcherQueenAltar), + 1000026 -> levelAndCoordinateConstructor(DarkBarrack), + 1000027 -> levelAndCoordinateConstructor(InfernoTower), + 1000028 -> ((raw: RawElement) => AirSweeper(elementLevel(raw.lvl), elementTile(raw), Angle.degrees(raw.aimAngle.get))), + 1000029 -> levelAndCoordinateConstructor(DarkSpellFactory), + 1000030 -> levelAndCoordinateConstructor(GrandWarden), + 1000031 -> levelAndCoordinateConstructor(EagleArtillery), + + // Traps + 12000000 -> levelAndCoordinateConstructor(Bomb), + 12000001 -> noLevelConstructor(SpringTrap), + 12000002 -> levelAndCoordinateConstructor(GiantBomb), + 12000003 -> levelAndCoordinateConstructor(HalloweenBomb), + //12000004 -> levelAndCoordinateConstructor(????), + 12000005 -> levelAndCoordinateConstructor(AirBomb), + 12000006 -> levelAndCoordinateConstructor(SeekingAirMine), + 12000007 -> levelAndCoordinateConstructor(SantaTrap), + 12000008 -> levelAndCoordinateConstructor(SkeletonTrap), + + // Decorations/Obstacles + 18000000 -> decorationConstructor, // Barbarian Statue + 18000001 -> decorationConstructor, // Torch + 18000002 -> decorationConstructor, // Goblin Pole + 18000003 -> decorationConstructor, // White Flag + 18000004 -> decorationConstructor, // Skull Flag + 18000005 -> decorationConstructor, // Flower box 1 + 18000006 -> decorationConstructor, // Flower box 2 + 18000007 -> decorationConstructor, // Windmeter + 18000008 -> decorationConstructor, // Down Arrow Flag + 18000009 -> decorationConstructor, // Up Arrow Flag + 18000010 -> decorationConstructor, // Skull Altar + 18000011 -> decorationConstructor, // USA Flag + 18000012 -> decorationConstructor, // Canada Flag + 18000013 -> decorationConstructor, // Italia Flag + 18000014 -> decorationConstructor, // Germany Flag + 18000015 -> decorationConstructor, // Finland Flag + 18000016 -> decorationConstructor, // Spain Flag + 18000017 -> decorationConstructor, // France Flag + 18000018 -> decorationConstructor, // GBR Flag + 18000019 -> decorationConstructor, // Brazil Flag + 18000020 -> decorationConstructor, // China Flag + 18000021 -> decorationConstructor, // Norway Flag + 18000022 -> decorationConstructor, // Thailand Flag + 18000023 -> decorationConstructor, // Thailand Flag + 18000024 -> decorationConstructor, // India Flag + 18000025 -> decorationConstructor, // Australia Flag + 18000026 -> decorationConstructor, // South Korea Flag + 18000027 -> decorationConstructor, // Japan Flag + 18000028 -> decorationConstructor, // Turkey Flag + 18000029 -> decorationConstructor, // Indonesia Flag + 18000030 -> decorationConstructor, // Netherlands Flag + 18000031 -> decorationConstructor, // Philippines Flag + 18000032 -> decorationConstructor, // Singapore Flag + 18000033 -> decorationConstructor, // PEKKA Statue + 18000034 -> decorationConstructor, // Russia Flag + 18000035 -> decorationConstructor, // Russia Flag + 18000036 -> decorationConstructor, // Greece Flag + + 8000000 -> decorationConstructor, // Pine Tree + 8000001 -> decorationConstructor, // Large Stone + 8000002 -> decorationConstructor, // Small Stone 1 + 8000003 -> decorationConstructor, // Small Stone 2 + 8000004 -> decorationConstructor, // Square Bush + 8000005 -> decorationConstructor, // Square Tree + 8000006 -> decorationConstructor, // Tree Trunk 1 + 8000007 -> decorationConstructor, // Tree Trunk 2 + 8000008 -> decorationConstructor, // Mushrooms + 8000009 -> decorationConstructor, // TombStone + 8000010 -> decorationConstructor, // Fallen Tree + 8000011 -> decorationConstructor, // Small Stone 3 + 8000012 -> decorationConstructor, // Small Stone 4 + 8000013 -> decorationConstructor, // Square Tree 2 + 8000014 -> decorationConstructor, // Stone Pillar 1 + 8000015 -> decorationConstructor, // Large Stone + 8000016 -> decorationConstructor, // Sharp Stone 1 + 8000017 -> decorationConstructor, // Sharp Stone 2 + 8000018 -> decorationConstructor, // Sharp Stone 3 + 8000019 -> decorationConstructor, // Sharp Stone 4 + 8000020 -> decorationConstructor, // Sharp Stone 5 + 8000021 -> decorationConstructor, // Xmas tree + 8000022 -> decorationConstructor, // Hero TombStone + 8000023 -> decorationConstructor, // DarkTombStone + 8000024 -> decorationConstructor, // Passable Stone 1 + 8000025 -> decorationConstructor, // Passable Stone 2 + 8000026 -> decorationConstructor, // Campfire + 8000027 -> decorationConstructor, // Campfire + 8000028 -> decorationConstructor, // Xmas tree2013 + 8000029 -> decorationConstructor, // Xmas TombStone + 8000030 -> decorationConstructor, // Bonus Gembox + 8000031 -> decorationConstructor, // Halloween2014 + 8000032 -> decorationConstructor, // Xmas tree2014 + 8000033 -> decorationConstructor, // Xmas TombStone2014 + 8000034 -> decorationConstructor, // Npc Plant 1 + 8000035 -> decorationConstructor, // Npc Plant 2 + 8000036 -> decorationConstructor // Halloween2015 + ) + + def build(raw: RawElement): Option[Element] = { + Some(raw) + .map( + value => elementConstructorByCode.get(value.data) + .orElse(throw new RuntimeException("No building with code " + raw.data)) + .get(raw) + ) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParser.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParser.scala new file mode 100644 index 0000000..9388e1c --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParser.scala @@ -0,0 +1,90 @@ +package org.danielholmes.coc.baseanalyser.baseparser + +import org.danielholmes.coc.baseanalyser.model.Layout +import org.danielholmes.coc.baseanalyser.model.Village +import spray.json._ + +object VillageJsonProtocol extends DefaultJsonProtocol { + implicit val buildingFormat = jsonFormat16(RawBuilding) + implicit val rawVillageFormat = jsonFormat2(RawVillage) +} + +import VillageJsonProtocol._ + +class VillageJsonParser(elementFactory: ElementFactory) { + def parse(input: String): Villages = { + try { + val rawVillage = input.parseJson.convertTo[RawVillage] + Villages( + parseVillage(rawVillage, b => Some(RawElement(b.data, b.lvl, b.x, b.y, b.aim_angle))), + rawVillage.war_layout + .map(layoutIndex => parseVillage(rawVillage, b => parseWarElement(b, layoutIndex))) + ) + } catch { + case e: JsonParser.ParsingException => throw new InvalidJsonException(e) + case e: DeserializationException => throw new InvalidJsonException(e) + } + } + + private def parseVillage(raw: RawVillage, factory: (RawBuilding) => Option[RawElement]): Village = { + Village( + raw.buildings + .map(factory) + .filter(_.isDefined) + .map(_.get) + .map(elementFactory.build) + .filter(_.nonEmpty) + .map(_.get) + ) + } + + private def parseWarElement(raw: RawBuilding, index: Int): Option[RawElement] = { + parseWarCoordinates(raw, index) + .map(coords => RawElement(raw.data, raw.lvl, coords._1, coords._2, raw.aim_angle_war)) + } + + private def parseWarCoordinates(raw: RawBuilding, index: Int): Option[(Int, Int)] = { + index match { + case 1 => raw.l1x.map(x => (x, raw.l1y.get)) + case 2 => raw.l2x.map(x => (x, raw.l2y.get)) + case 3 => raw.l3x.map(x => (x, raw.l3y.get)) + case 4 => raw.l4x.map(x => (x, raw.l4y.get)) + case 5 => raw.l5x.map(x => (x, raw.l5y.get)) + case _ => throw new RuntimeException(s"Unknown war layout $index") + } + } +} + +case class RawVillage(buildings: Set[RawBuilding], war_layout: Option[Int]) +case class RawBuilding( + data: Int, + lvl: Int, + x: Int, y: Int, + l1x: Option[Int], l1y: Option[Int], + l2x: Option[Int], l2y: Option[Int], + l3x: Option[Int], l3y: Option[Int], + l4x: Option[Int], l4y: Option[Int], + l5x: Option[Int], l5y: Option[Int], + aim_angle: Option[Int], + aim_angle_war: Option[Int] +) +case class RawElement(data: Int, lvl: Int, x: Int, y: Int, aimAngle: Option[Int]) + +object RawElement { + def apply(data: Int, lvl: Int, x: Int, y: Int): RawElement = { + RawElement(data, lvl, x, y, None) + } +} + +case class Villages(home: Village, war: Option[Village]) { + import Layout._ + + def getByLayout(layout: Layout): Option[Village] = { + layout match { + case War => war + case Home => Some(home) + } + } +} + +class InvalidJsonException(cause : Throwable) extends Exception(cause) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerGameConnection.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerGameConnection.scala new file mode 100644 index 0000000..b5cfe79 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerGameConnection.scala @@ -0,0 +1,110 @@ +package org.danielholmes.coc.baseanalyser.gameconnection + +import akka.actor.ActorSystem +import org.danielholmes.coc.baseanalyser.util.GameConnectionNotAvailableException +import org.scalactic.anyvals.PosZInt +import spray.can.Http.ConnectionAttemptFailedException +import spray.httpx.SprayJsonSupport._ +import spray.json.DefaultJsonProtocol +import spray.http._ +import spray.client.pipelining._ +import spray.httpx.unmarshalling.FromResponseUnmarshaller + +import scala.annotation.tailrec +import scala.concurrent.duration._ +import scala.concurrent.{Await, Future} +import scala.reflect.{ClassTag, classTag} + +object ClanSeekerProtocol extends DefaultJsonProtocol { + case class AvatarSummary(userName: String, currentHomeId: Long, clanId: Long) + case class PlayerSummary(avatar: AvatarSummary) + case class ClanDetails(name: String, players: Set[PlayerSummary]) + case class ClanDetailsResponse(clan: Option[ClanDetails]) + + implicit val AvatarSummaryFormat = jsonFormat3(AvatarSummary) + implicit val PlayerSummaryFormat = jsonFormat1(PlayerSummary) + implicit val ClanDetailsFormat = jsonFormat2(ClanDetails) + implicit val ClanDetailsResponseFormat = jsonFormat1(ClanDetailsResponse) + + case class RawVillage(raw: String) + case class PlayerVillage(avatar: AvatarSummary, village: RawVillage) + case class PlayerVillageResponse(player: Option[PlayerVillage]) + + implicit val VillageFormat = jsonFormat1(RawVillage) + implicit val PlayerVillageFormat = jsonFormat2(PlayerVillage) + implicit val PlayerVillageResponseFormat = jsonFormat1(PlayerVillageResponse) +} +import ClanSeekerProtocol._ + +// TODO: Having problems with types when refactor into common functionality, but should refactor this +class ClanSeekerGameConnection extends GameConnection { + private val maxAttempts = 3 + private val rootUrl = "http://api.clanseeker.co" + private val timeout = 20.seconds + + def getClanDetails(id: Long): Option[ClanDetails] = { + implicit val system = ActorSystem() + import system.dispatcher // execution context for futures + + def tryAgain(attemptNumber: Int): Option[ClanDetails] = { + Thread.sleep(400 * attemptNumber) + attempt(attemptNumber + 1) + } + + //@tailrec + def attempt(attemptNumber: Int): Option[ClanDetails] = { + val pipeline = sendReceive ~> unmarshal[ClanDetailsResponse] + try { + val response = pipeline(Get(s"$rootUrl/clan_details?id=$id")) + val result = Await.result(response, timeout) + if (result.clan.isDefined || attemptNumber == maxAttempts) { + result.clan + } else { + tryAgain(attemptNumber) + } + } catch { + case e: ConnectionAttemptFailedException => + throw new GameConnectionNotAvailableException() + } + } + + try { + attempt(0) + } finally { + system.terminate() + } + } + + def getPlayerVillage(id: Long): Option[PlayerVillage] = { + implicit val system = ActorSystem() + import system.dispatcher // execution context for futures + + def tryAgain(attemptNumber: Int): Option[PlayerVillage] = { + Thread.sleep(400 * attemptNumber) + attempt(attemptNumber + 1) + } + + //@tailrec + def attempt(attemptNumber: Int): Option[PlayerVillage] = { + val pipeline = sendReceive ~> unmarshal[PlayerVillageResponse] + try { + val response = pipeline(Get(s"$rootUrl/player_village?id=$id")) + val result = Await.result(response, timeout) + if (result.player.isDefined || attemptNumber == maxAttempts) { + result.player + } else { + tryAgain(attemptNumber) + } + } catch { + case e: ConnectionAttemptFailedException => + throw new GameConnectionNotAvailableException() + } + } + + try { + attempt(0) + } finally { + system.terminate() + } + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/GameConnection.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/GameConnection.scala new file mode 100644 index 0000000..c4ca530 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/GameConnection.scala @@ -0,0 +1,9 @@ +package org.danielholmes.coc.baseanalyser.gameconnection + +import org.danielholmes.coc.baseanalyser.gameconnection.ClanSeekerProtocol.{ClanDetails, ClanDetailsResponse, PlayerVillage, PlayerVillageResponse} + +trait GameConnection { + def getClanDetails(id: Long): Option[ClanDetails] + + def getPlayerVillage(id: Long): Option[PlayerVillage] +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/StubGameConnection.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/StubGameConnection.scala new file mode 100644 index 0000000..3fbef47 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/gameconnection/StubGameConnection.scala @@ -0,0 +1,80 @@ +package org.danielholmes.coc.baseanalyser.gameconnection + +import org.danielholmes.coc.baseanalyser.gameconnection.ClanSeekerProtocol._ +import org.danielholmes.coc.baseanalyser.web.PermittedClan + +class StubGameConnection(private val permittedClans: Set[PermittedClan]) extends GameConnection { + def getClanDetails(id: Long): Option[ClanDetails] = { + permittedClans.find(_.id == id) + .filter(_.code != "uncool") + .map(clan => + ClanDetails( + clan.name, + Set( + PlayerSummary(AvatarSummary("Dakota", id + 1L, id)), + PlayerSummary(AvatarSummary("kottonmouth", id + 2L, id)), + PlayerSummary(AvatarSummary("Valaar", id + 3L, id)), + PlayerSummary(AvatarSummary("Mesoscalevortex", id + 4L, id)), + PlayerSummary(AvatarSummary("Kajla", id + 5L, id)), + PlayerSummary(AvatarSummary("a Noob", id + 6L, id)), + PlayerSummary(AvatarSummary("Ricochet", id + 7L, id)), + PlayerSummary(AvatarSummary("Lazy Ninja", id + 8L, id)), + PlayerSummary(AvatarSummary("san", id + 9L, id)), + PlayerSummary(AvatarSummary("Robbie", id + 10L, id)), + PlayerSummary(AvatarSummary("Kendrall", id + 11L, id)), + PlayerSummary(AvatarSummary("SpikeDragon", id + 12L, id)), + PlayerSummary(AvatarSummary("Jamie", id + 13L, id)), + PlayerSummary(AvatarSummary("joshua", id + 14L, id)), + PlayerSummary(AvatarSummary("Kiara Kong", id + 15L, id)), + PlayerSummary(AvatarSummary("ice ice baby", id + 16L, id)), + PlayerSummary(AvatarSummary("sp@nd@n14", id + 17L, id)), + PlayerSummary(AvatarSummary("Diaz", id + 18L, id)), + + PlayerSummary(AvatarSummary("I AM SPARTA!!1!", id + 100L, id)), + PlayerSummary(AvatarSummary("rektscrub", id + 102L, id)), + PlayerSummary(AvatarSummary("Darth Noobus", id + 103L, id)), + PlayerSummary(AvatarSummary("greg", id + 104L, id)), + PlayerSummary(AvatarSummary("Max", id + 105L, id)), + PlayerSummary(AvatarSummary("ppete", id + 106L, id)), + PlayerSummary(AvatarSummary("Vicious", id + 107L, id)), + PlayerSummary(AvatarSummary("Riggs", id + 108L, id)), + + PlayerSummary(AvatarSummary("Some Mini", id + 1000L, id)) + ) + ) + ) + } + + private def villageJson(name: String): String = { + io.Source.fromInputStream(getClass.getResourceAsStream("/examples/" + name)).mkString + } + + def getPlayerVillage(id: Long): Option[PlayerVillage] = { + permittedClans.map(_.id) + .map(getClanDetails(_)) + .filter(_.isDefined) + .map(_.get) + .flatMap(_.players) + .find(_.avatar.currentHomeId == id) + .map(_.avatar) + .map( + avatarSummary => + if (id < avatarSummary.clanId + 100L) { + PlayerVillage( + avatarSummary, + RawVillage(villageJson("th8-sample-1.json")) + ) + } else if (id < avatarSummary.clanId + 1000L) { + PlayerVillage( + avatarSummary, + RawVillage(villageJson("th9-sample-1.json")) + ) + } else { + PlayerVillage( + avatarSummary, + RawVillage(villageJson("th5-sample-1.json")) + ) + } + ) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Angle.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Angle.scala new file mode 100644 index 0000000..4f60c12 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Angle.scala @@ -0,0 +1,78 @@ +package org.danielholmes.coc.baseanalyser.model + +import scala.annotation.tailrec +import scala.math.floor + +object Angle { + + val Pi = math.Pi + val TwoPi = 2 * Pi + val PiOver2 = Pi / 2 + + val Zero = Angle(0) + val Quarter = Angle(Pi/2) + val Half = Angle(Pi) + val ThreeQuarters = Angle(3*Pi/2) + val Full = Angle(TwoPi) + + implicit class DoubleOps(d: Double) { + def degrees: Angle = Angle.degrees(d) + def radians: Angle = Angle(d) + } + + def degrees(degs: Double): Angle = Angle(degs * Pi / 180.0) + + def normalize(radians: Double): Double = { + val fullCycles = (radians / TwoPi).asInstanceOf[Int] + val possiblyNegative = radians - TwoPi * fullCycles + + if (possiblyNegative < 0) { possiblyNegative + TwoPi } + else { possiblyNegative } + } + + def atan2(y: Double, x: Double): Angle = { + Angle(Math.atan2(y, x)) + } + + def apply(radians: Double): Angle = new Angle(normalize(radians)) +} + +class Angle private (val radians: Double) extends AnyVal with Ordered[Angle] { + import Angle.{Pi, Zero, Half} + + def sin: Double = math.sin(radians) + def cos: Double = math.cos(radians) + def tan: Double = math.tan(radians) + def opposite: Angle = Angle(radians + Pi) + def degrees: Double = radians * 180.0 / Pi + def unary_-(): Angle = Angle(-radians) + def +(other: Angle): Angle = Angle(radians + other.radians) + def -(other: Angle): Angle = Angle(radians - other.radians) + def *(factor: Double): Angle = Angle(radians * factor) + def /(factor: Double): Angle = Angle(radians / factor) + def compare(a: Angle): Int = { + if (this == a) { 0 } + else if (this.radians < a.radians) { -1 } + else { +1 } + } + + private def shiftSin(x: Double) = math.sin(x - radians - Pi) + + def isLeftOf(a: Angle): Boolean = + (a == opposite) || (a != this && shiftSin(a.radians) < 0) + + def isRightOf(a: Angle): Boolean = + (a == opposite) || (a != this && shiftSin(a.radians) > 0) + + def distanceTo(a: Angle): Angle = { + val diff = a - this + if (diff < Angle.Half) diff else -diff + } + + def addUpTo(add: Angle, upTo: Angle): Angle = { + val added = this + add + if (isLeftOf(upTo) != added.isLeftOf(upTo)) upTo else added + } + + override def toString: String = s"Angle($radians)" +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Block.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Block.scala new file mode 100644 index 0000000..7a01469 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Block.scala @@ -0,0 +1,123 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.{PosInt, PosZDouble, PosZInt} + +import scala.annotation.tailrec + +case class Block(tile: Tile, size: PosInt) { + require(tile.x + size <= TileCoordinate.MaxCoordinate, s"x coord ${tile.x} + $size must be within coordinate system") + require(tile.y + size <= TileCoordinate.MaxCoordinate, s"y coord ${tile.y} + $size must be within coordinate system") + + val x = tile.x + val y = tile.y + private lazy val oppositeTile = tile.offset(size, size) + lazy val oppositeX = oppositeTile.x + lazy val oppositeY = oppositeTile.y + + lazy val isWithinMap = tiles.forall(_.isWithinMap) + + lazy val centre = FloatMapCoordinate(PosZDouble.from(x + size.toDouble / 2.0).get, PosZDouble.from(y + size.toDouble / 2.0).get) + + lazy val internalCoordinates = { + if (size < 2) { + Set.empty + } else { + tile.offset(1, 1) + .matrixOfCoordinatesTo(oppositeTile.offset(-1, -1)) + } + } + + lazy val topLeft: TileCoordinate = tile + + lazy val topRight = topLeft.offset(size, 0) + + lazy val bottomLeft = topLeft.offset(0, size) + + lazy val bottomRight = bottomLeft.offset(size, 0) + + + lazy val leftSide = topLeft.matrixOfCoordinatesTo(bottomLeft) + + lazy val rightSide = topRight.matrixOfCoordinatesTo(bottomRight) + + lazy val topSide = topLeft.matrixOfCoordinatesTo(topRight) + + lazy val bottomSide = bottomLeft.matrixOfCoordinatesTo(bottomRight) + + + lazy val allCoordinates: Set[TileCoordinate] = tile.matrixOfCoordinatesTo(oppositeTile) + + lazy val tiles = tile.matrixOfTilesInDirection(size, size) + + lazy val border = leftSide ++ rightSide ++ bottomSide ++ topSide + + def touchesEdge(coord: TileCoordinate): Boolean = border.contains(coord) + + def findClosestCoordinate(from: FloatMapCoordinate): TileCoordinate = { + possibleIntersectionPoints.min(Ordering.by((_: TileCoordinate) + .distanceTo(from))) + } + + def distanceTo(from: TileCoordinate): PosZDouble = { + findClosestCoordinate(from).distanceTo(from) + } + + def intersects(other: Block): Boolean = { + x < other.oppositeX && oppositeX > other.x && + y < other.oppositeY && oppositeY > other.y + } + + def expandBy(offset: PosInt): Block = expandToSize(PosInt.from(size + (offset * 2)).get) + + def contractBy(offset: PosInt): Block = contractToSize(PosInt.from(size - (offset * 2)).get) + + def expandToSize(newSize: PosInt): Block = { + if (newSize < size) throw new IllegalArgumentException("newSize must be greater than size") + setSize(newSize) + } + + private def contractToSize(newSize: PosInt): Block = { + if (newSize > size) throw new IllegalArgumentException("newSize must be greater than size") + setSize(newSize) + } + + private def setSize(newSize: PosInt): Block = { + if ((size - newSize) % 2 != 0) throw new IllegalArgumentException("Must increase by factors of 2") + if (newSize == size) { + this + } else { + val sizeDiff = newSize - size + Block( + Tile(PosZInt.from(tile.x - sizeDiff / 2).get, PosZInt.from(tile.y - sizeDiff / 2).get), + newSize + ) + } + } + + private lazy val possibleIntersectionPoints: Set[TileCoordinate] = { + tile.matrixOfCoordinatesTo(tile.offset(size, size)) + } +} + +object Block { + val Map = Block(Tile.Origin, TileCoordinate.MaxCoordinate) + + def firstIntersecting(blocks: Set[Block]): Option[(Block, Block)] = { + blocks.map(b => firstIntersecting(b, blocks).map((_, b))) + .headOption + .getOrElse(None) + } + + @tailrec + private def firstIntersecting(block: Block, blocks: Set[Block]): Option[Block] = { + blocks.toList match { + case Nil => None + case head :: tail => + if (block != head && block.intersects(head)) { + Some(head) + } else { + firstIntersecting(block, blocks.tail) + } + } + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Building.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Building.scala new file mode 100644 index 0000000..275dcad --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Building.scala @@ -0,0 +1,3 @@ +package org.danielholmes.coc.baseanalyser.model + +trait Building extends Structure diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Decoration.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Decoration.scala new file mode 100644 index 0000000..6e51f3e --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Decoration.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.PosInt + +case class Decoration(tile: Tile) extends Element { + lazy val level = PosInt(1) + lazy val size = PosInt(2) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Defense.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Defense.scala new file mode 100644 index 0000000..da9e5fc --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Defense.scala @@ -0,0 +1,9 @@ +package org.danielholmes.coc.baseanalyser.model + +import Target._ +import org.danielholmes.coc.baseanalyser.model.range.ElementRange + +trait Defense extends Building { + val range: ElementRange + val targets: Set[Target] +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/DelayedActivation.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/DelayedActivation.scala new file mode 100644 index 0000000..2fb7482 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/DelayedActivation.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.PosInt + +trait DelayedActivation extends Defense { + val deploymentSpaceRequired: PosInt +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Element.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Element.scala new file mode 100644 index 0000000..cb5badb --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Element.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.PosInt + +trait Element { + val level: PosInt + + protected val tile: Tile + val size: PosInt + lazy val block = Block(tile, size) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/FloatMapCoordinate.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/FloatMapCoordinate.scala new file mode 100644 index 0000000..2637c11 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/FloatMapCoordinate.scala @@ -0,0 +1,17 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.PosZDouble +import org.apache.commons.math3.geometry.euclidean.twod.Vector2D + +case class FloatMapCoordinate(x: PosZDouble, y: PosZDouble) { + require(x >= 0.0 && x <= TileCoordinate.MaxCoordinate, s"MapCoordinates.x must be >= 0 <= ${TileCoordinate.MaxCoordinate}, given: $x") + require(y >= 0.0 && y <= TileCoordinate.MaxCoordinate, s"MapCoordinates.y must be >= 0 <= ${TileCoordinate.MaxCoordinate}, given: $y") + + def distanceTo(other: FloatMapCoordinate): PosZDouble = { + PosZDouble.from(Math.hypot(x - other.x, y - other.y)).get + } +} + +object FloatMapCoordinate { + implicit def widenToVector2D(coord: FloatMapCoordinate): Vector2D = new Vector2D(coord.x, coord.y) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Hidden.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Hidden.scala new file mode 100644 index 0000000..0562c19 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Hidden.scala @@ -0,0 +1,3 @@ +package org.danielholmes.coc.baseanalyser.model + +trait Hidden extends Element diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Layout.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Layout.scala new file mode 100644 index 0000000..86c5f70 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Layout.scala @@ -0,0 +1,15 @@ +package org.danielholmes.coc.baseanalyser.model + +object Layout extends Enumeration { + type Layout = Value + + val Home = Value(1, "home") + val War = Value(2, "war") + + def getDescription(layout: Layout): String = { + layout match { + case War => "Active War Base" + case Home => "Home Base" + } + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/PossibleLargeTrap.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/PossibleLargeTrap.scala new file mode 100644 index 0000000..32dc12d --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/PossibleLargeTrap.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.model + +case class PossibleLargeTrap(tile: Tile) + +object PossibleLargeTrap { + implicit def widenToBlock(trap: PossibleLargeTrap): Block = Block(trap.tile, 2) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/PreventsTroopDrop.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/PreventsTroopDrop.scala new file mode 100644 index 0000000..eeb2e44 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/PreventsTroopDrop.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.PosInt + +trait PreventsTroopDrop extends Structure { + lazy val preventTroopDropSize = PosInt.from(size + 2).get + lazy val preventTroopDropBlock = block.expandToSize(preventTroopDropSize) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/StationaryDefensiveBuilding.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/StationaryDefensiveBuilding.scala new file mode 100644 index 0000000..9ce22a4 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/StationaryDefensiveBuilding.scala @@ -0,0 +1,3 @@ +package org.danielholmes.coc.baseanalyser.model + +trait StationaryDefensiveBuilding extends Defense diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Structure.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Structure.scala new file mode 100644 index 0000000..80d8293 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Structure.scala @@ -0,0 +1,19 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.PosInt + +trait Structure extends Element { + lazy val hitSize = size + lazy val hitBlock = { + if (hitSize == size) { + block + } else { + val posOffset = PosInt.from((size - hitSize) / 2).get + Block(tile.offset(posOffset, posOffset), hitSize) + } + } + + def findClosestHitCoordinate(from: FloatMapCoordinate): TileCoordinate = { + hitBlock.findClosestCoordinate(from) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Target.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Target.scala new file mode 100644 index 0000000..479e22a --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Target.scala @@ -0,0 +1,10 @@ +package org.danielholmes.coc.baseanalyser.model + +object Target extends Enumeration { + type Target = Value + val Ground, Air = Value + + val Both = Target.values + val GroundOnly = Set(Ground) + val AirOnly = Set(Air) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Tile.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Tile.scala new file mode 100644 index 0000000..3f47870 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Tile.scala @@ -0,0 +1,117 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.danielholmes.coc.baseanalyser.util.Memo2 + +import org.scalactic.anyvals.{PosInt, PosZInt, PosZDouble} + +// The various ceremony is for instance pooling. See +// http://stackoverflow.com/questions/20030826/scala-case-class-private-constructor-but-public-apply-method +trait Tile { + val x: PosZInt + val y: PosZInt + val isWithinMap: Boolean + val neighbours: Set[Tile] + val centre: FloatMapCoordinate + def distanceTo(other: Tile): PosZDouble + def centreDistanceTo(other: Tile): PosZDouble + def manhattanDistanceTo(other: Tile): PosZInt + def matrixOfTilesTo(other: Tile): Set[Tile] + def matrixOfTilesTo(other: Tile, step: PosInt): Set[Tile] + def rectangleTo(other: Tile): Set[Tile] + // Should prob allow 0 too, but not negative obviously + def matrixOfTilesInDirection(width: PosInt, height: PosInt): Set[Tile] + val allCoordinates: Set[TileCoordinate] + def offset(xDiff: Int, yDiff: Int): Tile +} + +object Tile { + private val applyMemo = Memo2[PosZInt, PosZInt, Tile](TileImpl) + + def apply(x: PosZInt, y: PosZInt): Tile = applyMemo.apply(x, y) + + val MapSize = PosInt(44) + val OutsideBorder = PosInt(3) + + val MaxCoordinate = PosInt.from(MapSize + (OutsideBorder * 2) - 1).get + + val Origin = Tile(0, 0) + val End = Tile(MaxCoordinate, MaxCoordinate) + val All = Origin.matrixOfTilesTo(End) + + val MapOrigin = Origin.offset(OutsideBorder, OutsideBorder) + val MapEnd = MapOrigin.offset(MapSize - 1, MapSize - 1) + val AllInMap = MapOrigin.matrixOfTilesTo(End) + val AllOutsideMap = All -- AllInMap + val InnerBorder = MapOrigin.offset(-1, -1).rectangleTo(MapEnd.offset(1, 1)) + val AllNotTouchingMap = AllOutsideMap -- InnerBorder + + implicit def widenToTileCoordinate(tile: Tile): TileCoordinate = TileCoordinate(tile.x, tile.y) + + def fromCoordinate(tileCoordinate: TileCoordinate): Tile = { + Tile(tileCoordinate.x, tileCoordinate.y) + } + + private case class TileImpl(x: PosZInt, y: PosZInt) extends Tile { + require((0 to MaxCoordinate).contains(x.toInt), s"Tile.x ($x) must be in [0:$MaxCoordinate]") + require((0 to MaxCoordinate).contains(y.toInt), s"Tile.y ($y) must be in [0:$MaxCoordinate]") + + lazy val isWithinMap = AllInMap.contains(this) + + lazy val neighbours: Set[Tile] = { + Set(up, down, left, right, upLeft, upRight, downLeft, downRight).flatMap(_.iterator) + } + + private lazy val right = tryOffset(1, 0) + private lazy val left = tryOffset(-1, 0) + private lazy val down = tryOffset(0, 1) + private lazy val up = tryOffset(0, -1) + private lazy val upLeft = tryOffset(-1, -1) + private lazy val upRight = tryOffset(1, -1) + private lazy val downRight = tryOffset(1, 1) + private lazy val downLeft = tryOffset(-1, 1) + + private def tryOffset(xOffset: Int, yOffset: Int): Option[Tile] = { + val proposedX = x + xOffset + val proposedY = y + yOffset + if (proposedX >= 0 && proposedX <= Tile.MaxCoordinate && proposedY >= 0 && proposedY <= Tile.MaxCoordinate) { + Some(Tile(PosZInt.from(proposedX).get, PosZInt.from(proposedY).get)) + } else { + None + } + } + + lazy val centre = FloatMapCoordinate(PosZDouble.from(x + 0.5).get, PosZDouble.from(y + 0.5).get) + + def distanceTo(other: Tile): PosZDouble = { + allCoordinates.flatMap(otherCoord => other.allCoordinates.map(_.distanceTo(otherCoord))).min + } + + def centreDistanceTo(other: Tile): PosZDouble = centre.distanceTo(other.centre) + + def manhattanDistanceTo(other: Tile): PosZInt = PosZInt.from(Math.abs(other.x - x) + Math.abs(other.y - y)).get + + // Top + bottom + left + right + def rectangleTo(other: Tile): Set[Tile] = this.matrixOfTilesTo(Tile(other.x, y), 1) ++ + Tile(x, other.y).matrixOfTilesTo(Tile(other.x, other.y), 1) ++ + this.matrixOfTilesTo(Tile(x, other.y)) ++ + Tile(other.x, y).matrixOfTilesTo(Tile(other.x, other.y)) + + def matrixOfTilesTo(other: Tile): Set[Tile] = matrixOfTilesTo(other, 1) + + def matrixOfTilesTo(other: Tile, step: PosInt): Set[Tile] = { + (x to other.x by step).flatMap(newX => (y to other.y by step).map(newY => Tile(PosZInt.from(newX).get, PosZInt.from(newY).get))).toSet + } + + def matrixOfTilesInDirection(width: PosInt, height: PosInt): Set[Tile] = { + matrixOfTilesTo(Tile(PosZInt.from(x + width - 1).get, PosZInt.from(y + height - 1).get)) + } + + lazy val allCoordinates = toTileCoordinate.matrixOfCoordinatesTo(toTileCoordinate.offset(1, 1)) + + private lazy val toTileCoordinate = widenToTileCoordinate(this) + + def offset(xDiff: Int, yDiff: Int): Tile = Tile(PosZInt.from(x + xDiff).get, PosZInt.from(y + yDiff).get) + + override lazy val toString = s"Tile(${x.toInt}, ${y.toInt})" + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinate.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinate.scala new file mode 100644 index 0000000..aef9a32 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinate.scala @@ -0,0 +1,87 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.apache.commons.math3.geometry.euclidean.twod.Vector2D +import org.danielholmes.coc.baseanalyser.util.Memo2 +import org.scalactic.anyvals.{PosInt, PosZDouble, PosZInt} + +// The various ceremony is for instance pooling. See +// http://stackoverflow.com/questions/20030826/scala-case-class-private-constructor-but-public-apply-method +trait TileCoordinate { + val x: PosZInt + val y: PosZInt + def distanceTo(other: FloatMapCoordinate): PosZDouble + def offset(xAmount: Int, yAmount: Int): TileCoordinate + def offset(xAmount: Double, yAmount: Double): FloatMapCoordinate + def matrixOfCoordinatesTo(other: TileCoordinate, step: PosInt): Set[TileCoordinate] + def matrixOfCoordinatesTo(other: TileCoordinate): Set[TileCoordinate] + def xAxisCoordsTo(other: TileCoordinate, step: PosInt): Set[TileCoordinate] + def yAxisCoordsTo(other: TileCoordinate, step: PosInt): Set[TileCoordinate] + def neighbours: Set[TileCoordinate] +} + +object TileCoordinate { + private val applyMemo = Memo2[PosZInt, PosZInt, TileCoordinate](TileCoordinateImpl) + def apply(x: PosZInt, y: PosZInt): TileCoordinate = applyMemo.apply(x, y) + + // TODO: Remove this to try and reduce new mapcoordinate creation + implicit def widenToMapCoordinate(coord: TileCoordinate): FloatMapCoordinate = FloatMapCoordinate(coord.x, coord.y) + + implicit def widenToVector2D(coord: TileCoordinate): Vector2D = new Vector2D(coord.x, coord.y) + + val MaxCoordinate = PosInt.from(Tile.MaxCoordinate + 1).get + val Origin = TileCoordinate(0, 0) + val End = TileCoordinate(MaxCoordinate, MaxCoordinate) + val All = Origin.matrixOfCoordinatesTo(End) + val AllEdge = + // Top + Origin.matrixOfCoordinatesTo(TileCoordinate(MaxCoordinate, 0)) ++ + // Bottom + TileCoordinate(0, MaxCoordinate).matrixOfCoordinatesTo(TileCoordinate(MaxCoordinate, MaxCoordinate)) ++ + // Left + Origin.matrixOfCoordinatesTo(TileCoordinate(0, MaxCoordinate)) ++ + // Right + TileCoordinate(MaxCoordinate, 0).matrixOfCoordinatesTo(TileCoordinate(MaxCoordinate, MaxCoordinate)) + + val MapOrigin: TileCoordinate = Tile.MapOrigin + + private case class TileCoordinateImpl(x: PosZInt, y: PosZInt) extends TileCoordinate { + require((0 to MaxCoordinate).contains(x.toInt), s"TileCoordinates.x must be >= 0 <= $MaxCoordinate, given: $x") + require((0 to MaxCoordinate).contains(y.toInt), s"TileCoordinates.y must be >= 0 <= $MaxCoordinate, given: $y") + + def distanceTo(other: FloatMapCoordinate): PosZDouble = PosZDouble.from(Math.hypot(x - other.x, y - other.y)).get + + def offset(xAmount: Int, yAmount: Int): TileCoordinate = { + TileCoordinate(PosZInt.from(x + xAmount).get, PosZInt.from(y + yAmount).get) + } + + def offset(xAmount: Double, yAmount: Double): FloatMapCoordinate = { + FloatMapCoordinate(PosZDouble.from(x + xAmount).get, PosZDouble.from(y + yAmount).get) + } + + def xAxisCoordsTo(other: TileCoordinate, step: PosInt): Set[TileCoordinate] = { + (x to other.x by step).map((newX: Int) => TileCoordinate(PosZInt.from(newX).get, PosZInt.from(y).get)).toSet + } + + def yAxisCoordsTo(other: TileCoordinate, step: PosInt): Set[TileCoordinate] = { + (y to other.y by step).map((newY: Int) => TileCoordinate(PosZInt.from(x).get, PosZInt.from(newY).get)).toSet + } + + def matrixOfCoordinatesTo(other: TileCoordinate, step: PosInt): Set[TileCoordinate] = { + yAxisCoordsTo(other, step) + .flatMap(_.xAxisCoordsTo(other, step)) + } + + def matrixOfCoordinatesTo(other: TileCoordinate): Set[TileCoordinate] = matrixOfCoordinatesTo(other, 1) + + lazy val neighbours: Set[TileCoordinate] = { + Set(up, down, left, right).flatMap(_.iterator) + } + + private lazy val right: Option[TileCoordinate] = Some(x).filter(_ < TileCoordinate.MaxCoordinate).map(x => offset(1, 0)) + private lazy val left: Option[TileCoordinate] = Some(x).filter(_ > 0).map(x => offset(-1, 0)) + private lazy val down: Option[TileCoordinate] = Some(y).filter(_ < TileCoordinate.MaxCoordinate).map(y => offset(0, 1)) + private lazy val up: Option[TileCoordinate] = Some(y).filter(_ > 0).map(y => offset(0, -1)) + + override val toString = s"TileCoordinate($x, $y)" + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Village.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Village.scala new file mode 100644 index 0000000..bf83b25 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Village.scala @@ -0,0 +1,117 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.danielholmes.coc.baseanalyser.model.defense.AirDefense +import org.danielholmes.coc.baseanalyser.model.special.{ClanCastle, TownHall} +import org.scalactic.anyvals.PosInt + +import scala.annotation.tailrec +import scala.reflect.{ClassTag, classTag} + +case class Village(elements: Set[Element]) { + private val firstIntersect = Block.firstIntersecting(elements.map(_.block)) + require( + firstIntersect.isEmpty, + s"Elements musn't overlap (currently $firstIntersect overlaps" + ) + + // It's a real world base, it has a town hall level. Maybe this should be a requirement? Only reason doesnt exist is + // for testing which is a poor excuse to harm data model + val townHallLevel = findElementByType[TownHall].map(_.level) + + val clanCastle = findElementByType[ClanCastle] + + lazy val isEmpty = elements.isEmpty + + lazy val structures = getElementsByType[Structure] + + lazy val preventsTroopDropStructures = getElementsByType[PreventsTroopDrop] + + lazy val stationaryDefensiveBuildings = getElementsByType[StationaryDefensiveBuilding] + + lazy val defenses = getElementsByType[Defense] + + lazy val groundTargetingDefenses = defenses.filter(_.targets.contains(Target.Ground)) + + lazy val airDefenses = getElementsByType[AirDefense] + + lazy val buildings = getElementsByType[Building] + + + private lazy val tilesNotAllowedToDropTroop = preventsTroopDropStructures.flatMap(_.preventTroopDropBlock.tiles) + + lazy val tilesAllowedToDropTroop = Tile.All -- tilesNotAllowedToDropTroop + + lazy val coordinatesAllowedToDropTroop: Set[TileCoordinate] = tilesAllowedToDropTroop.flatMap(_.allCoordinates) + + // TODO: Consider when empty village, prob want all + lazy val edgeOfHitCoordinatesAllowedToDropTroop: Set[TileCoordinate] = { + coordinatesAllowedToDropTroop.intersect(preventsTroopDropStructures.map(_.preventTroopDropBlock).flatMap(_.border)) + } + + lazy val wallCompartments: Set[WallCompartment] = { + val innerTiles = Tile.All -- outerTiles -- wallsByTile.keySet + detectAllCompartments(innerTiles, Set.empty) + } + + // TODO: Need to consider channel bases + lazy val possibleInternalLargeTraps = wallCompartments.flatMap(_.possibleLargeTraps) + + lazy val wallTiles = walls.map(_.block.tile) + + private lazy val walls = getElementsByType[Wall] + + lazy val outerTiles: Set[Tile] = detectCompartment(Tile.AllOutsideMap).innerTiles + + lazy val outerTileCoordinates: Set[TileCoordinate] = outerTiles.flatMap(_.allCoordinates) + + private def getElementsByType[T: ClassTag] = + elements.filter(classTag[T].runtimeClass.isInstance(_)).map(_.asInstanceOf[T]) + + def findElementByType[T: ClassTag](): Option[T] = + elements.find(classTag[T].runtimeClass.isInstance(_)).map(_.asInstanceOf[T]) + + @tailrec + private def detectAllCompartments(innerTiles: Set[Tile], current: Set[WallCompartment]): Set[WallCompartment] = { + innerTiles.toList match { + case Nil => current + case head :: tail => + val compartment = detectCompartment(head) + detectAllCompartments(innerTiles -- compartment.innerTiles, current + compartment) + } + } + + private def detectCompartment(toProcess: Tile): WallCompartment = { + detectCompartment(List(toProcess), Set(toProcess), Set.empty, Set.empty) + } + + private def detectCompartment(toProcess: Set[Tile]): WallCompartment = { + detectCompartment(toProcess.toList, toProcess, Set.empty, Set.empty) + } + + @tailrec + private def detectCompartment(toProcess: List[Tile], seenTiles: Set[Tile], currentInnerTiles: Set[Tile], currentWalls: Set[Wall]): WallCompartment = { + toProcess match { + case Nil => WallCompartment( + currentWalls, + currentInnerTiles, + elements.filter(e => currentInnerTiles.contains(e.block.tile)) + ) + case head :: tail => + val notSeenNeighbours = head.neighbours.diff(seenTiles) + val wallNeighbours = notSeenNeighbours.flatMap(wallsByTile.get) + val nonWallNeighbours = notSeenNeighbours.diff(wallNeighbours.map(_.block.tile)) + detectCompartment( + tail ::: nonWallNeighbours.toList, + seenTiles ++ notSeenNeighbours, + currentInnerTiles + head, + currentWalls ++ wallNeighbours + ) + } + } + + private lazy val wallsByTile = walls.map(w => (w.block.tile, w)).toMap +} + +object Village { + val empty = Village(Set.empty) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/Wall.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Wall.scala new file mode 100644 index 0000000..d8a2389 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/Wall.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalactic.anyvals.PosInt + +case class Wall(level: PosInt, tile: Tile) extends PreventsTroopDrop { + val size = PosInt(1) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/WallCompartment.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/WallCompartment.scala new file mode 100644 index 0000000..4362302 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/WallCompartment.scala @@ -0,0 +1,31 @@ +package org.danielholmes.coc.baseanalyser.model + +import scala.annotation.tailrec + +// TODO: Inner tiles should really be derivable from the walls (maybe not a good idea though if already calculated +// during construction +case class WallCompartment(walls: Set[Wall], innerTiles: Set[Tile], elements: Set[Element]) { + //require(walls.nonEmpty) Currently use wall compartment to represent outer area in algorithms. Should change this + require(innerTiles.nonEmpty) + + private lazy val visibleElements = elements.filterNot(_.isInstanceOf[Hidden]) + + lazy val emptyTiles = innerTiles -- visibleElements.map(_.block).flatMap(_.tiles) + + lazy val possibleLargeTraps = findPossibleLargeTraps(emptyTiles.toList, Set.empty) + + private lazy val allTiles = innerTiles ++ walls.map(_.block.tile) + + def contains(tile: Tile): Boolean = allTiles.contains(tile) + + @tailrec + private def findPossibleLargeTraps(tiles: List[Tile], current: Set[PossibleLargeTrap]): Set[PossibleLargeTrap] = { + tiles match { + case Nil => current + case head :: tail => findPossibleLargeTraps( + tail, + current ++ Some(PossibleLargeTrap(head)).filter(b => b.tiles.subsetOf(emptyTiles)) + ) + } + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirDefense.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirDefense.scala new file mode 100644 index 0000000..60340f4 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirDefense.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{StationaryDefensiveBuilding, PreventsTroopDrop, Target, Tile} +import org.scalactic.anyvals.PosInt + +case class AirDefense(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with PreventsTroopDrop { + lazy val range = CircularElementRange(block.centre, 10) + val targets = Target.AirOnly + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeper.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeper.scala new file mode 100644 index 0000000..d6429b0 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeper.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.BlindSpotSectorElementRange +import org.danielholmes.coc.baseanalyser.model._ +import org.scalactic.anyvals.PosInt + +case class AirSweeper(level: PosInt, tile: Tile, angle: AirSweeperAngle) extends StationaryDefensiveBuilding with PreventsTroopDrop { + val size = PosInt(2) + val range = BlindSpotSectorElementRange(block.centre, 1.0, 15.0, angle.toAngle, Angle.degrees(120)) + val targets: Set[Target.Target] = Target.AirOnly +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeperAngle.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeperAngle.scala new file mode 100644 index 0000000..ad2234a --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/AirSweeperAngle.scala @@ -0,0 +1,29 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.Angle +import org.scalactic.anyvals.PosZInt + +trait AirSweeperAngle { + override def toString: String = s"AirSweeperAngle($toInt)" + + def toInt: Int + + def toAngle: Angle +} + +object AirSweeperAngle { + implicit def widenToPosZInt(angle: AirSweeperAngle): PosZInt = PosZInt.from(angle.toInt).get + + implicit def apply(angle: Angle): AirSweeperAngle = { + if (angle.degrees % 45 != 0) { + throw new IllegalArgumentException(s"$angle should be increments of 45") + } + + AirSweeperAngleImpl(angle) + } + + private case class AirSweeperAngleImpl(private val value: Angle) extends AirSweeperAngle { + val toInt = Math.round(value.degrees).toInt + val toAngle = value + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/ArcherTower.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/ArcherTower.scala new file mode 100644 index 0000000..0130f91 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/ArcherTower.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{StationaryDefensiveBuilding, PreventsTroopDrop, Target, Tile} +import org.scalactic.anyvals.PosInt + +case class ArcherTower(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with PreventsTroopDrop { + lazy val range = CircularElementRange(block.centre, 10) + val targets = Target.Both + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Cannon.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Cannon.scala new file mode 100644 index 0000000..2fad37e --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Cannon.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{StationaryDefensiveBuilding, PreventsTroopDrop, Target, Tile} +import org.scalactic.anyvals.PosInt + +case class Cannon(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with PreventsTroopDrop { + lazy val range = CircularElementRange(block.centre, 9) + val size = PosInt(3) + val targets = Target.GroundOnly +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/EagleArtillery.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/EagleArtillery.scala new file mode 100644 index 0000000..8292af6 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/EagleArtillery.scala @@ -0,0 +1,12 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.BlindSpotCircularElementRange +import org.danielholmes.coc.baseanalyser.model._ +import org.scalactic.anyvals.PosInt + +case class EagleArtillery(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with PreventsTroopDrop with DelayedActivation { + lazy val range = BlindSpotCircularElementRange(block.centre, 7, 50) + val deploymentSpaceRequired = PosInt(150) + val size = PosInt(4) + val targets = Target.Both +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/HiddenTesla.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/HiddenTesla.scala new file mode 100644 index 0000000..31f2e3c --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/HiddenTesla.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.scalactic.anyvals.PosInt + +case class HiddenTesla(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with Hidden { + lazy val range = CircularElementRange(block.centre, 7) // Note: Simplified, shows at 6, then 7 + val targets = Target.Both + val size = PosInt(2) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/InfernoTower.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/InfernoTower.scala new file mode 100644 index 0000000..419eafd --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/InfernoTower.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{StationaryDefensiveBuilding, PreventsTroopDrop, Target, Tile} +import org.scalactic.anyvals.PosInt + +case class InfernoTower(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with PreventsTroopDrop { + lazy val range = CircularElementRange(block.centre, 9) + val targets = Target.Both + val size = PosInt(2) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Mortar.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Mortar.scala new file mode 100644 index 0000000..153de33 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/Mortar.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.BlindSpotCircularElementRange +import org.danielholmes.coc.baseanalyser.model.{StationaryDefensiveBuilding, PreventsTroopDrop, Target, Tile} +import org.scalactic.anyvals.PosInt + +case class Mortar(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with PreventsTroopDrop { + lazy val range = BlindSpotCircularElementRange(block.centre, 4, 11) + val size = PosInt(3) + val targets = Target.GroundOnly +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/WizardTower.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/WizardTower.scala new file mode 100644 index 0000000..2e538a6 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/WizardTower.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{StationaryDefensiveBuilding, PreventsTroopDrop, Target, Tile} +import org.scalactic.anyvals.PosInt + +case class WizardTower(level: PosInt, tile: Tile) extends StationaryDefensiveBuilding with PreventsTroopDrop { + lazy val range = CircularElementRange(block.centre, 7) + val targets = Target.Both + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/XBow.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/XBow.scala new file mode 100644 index 0000000..12bd9f5 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/defense/XBow.scala @@ -0,0 +1,45 @@ +package org.danielholmes.coc.baseanalyser.model.defense + +import org.danielholmes.coc.baseanalyser.model.defense.XBowMode.XBowMode +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.Target.Target +import org.danielholmes.coc.baseanalyser.model.{StationaryDefensiveBuilding, PreventsTroopDrop, Target, Tile} +import org.scalactic.anyvals.PosInt + +case class XBow(level: PosInt, tile: Tile, private val mode: XBowMode) extends StationaryDefensiveBuilding with PreventsTroopDrop { + val targets = XBowMode.targets(mode) + val size = PosInt(3) + lazy val range = CircularElementRange(block.centre, XBowMode.radiusSize(mode)) +} + +object XBow { + def ground(level: PosInt, tile: Tile): XBow = { + XBow(level, tile, XBowMode.Ground) + } + + def both(level: PosInt, tile: Tile): XBow = { + XBow(level, tile, XBowMode.Both) + } +} + +object XBowMode extends Enumeration { + type XBowMode = Value + + val Ground, Both = Value + + def targets(mode: XBowMode): Set[Target] = { + if (mode == Ground) { + Target.GroundOnly + } else { + Target.Both + } + } + + def radiusSize(mode: XBowMode): PosInt = { + if (mode == Ground) { + 14 + } else { + 11 + } + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/ArcherQueenAltar.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/ArcherQueenAltar.scala new file mode 100644 index 0000000..4c854f9 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/ArcherQueenAltar.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.heroes + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{Target, Tile} +import org.scalactic.anyvals.PosInt + +case class ArcherQueenAltar(level: PosInt, tile: Tile) extends HeroAltar { + lazy val range = CircularElementRange(block.centre, 10) + val targets = Target.Both + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/BarbarianKingAltar.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/BarbarianKingAltar.scala new file mode 100644 index 0000000..e7913dd --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/BarbarianKingAltar.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.heroes + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{Target, Tile} +import org.scalactic.anyvals.PosInt + +case class BarbarianKingAltar(level: PosInt, tile: Tile) extends HeroAltar { + lazy val range = CircularElementRange(block.centre, 9) + val targets = Target.GroundOnly + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/GrandWarden.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/GrandWarden.scala new file mode 100644 index 0000000..ee16686 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/GrandWarden.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.heroes + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{Target, Tile} +import org.scalactic.anyvals.PosInt + +case class GrandWarden(level: PosInt, tile: Tile) extends HeroAltar { + lazy val range = CircularElementRange(block.centre, 7) + val targets = Target.Both + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/HeroAltar.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/HeroAltar.scala new file mode 100644 index 0000000..87dcb0c --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/heroes/HeroAltar.scala @@ -0,0 +1,5 @@ +package org.danielholmes.coc.baseanalyser.model.heroes + +import org.danielholmes.coc.baseanalyser.model.{Defense, PreventsTroopDrop} + +trait HeroAltar extends Defense with PreventsTroopDrop diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotCircularElementRange.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotCircularElementRange.scala new file mode 100644 index 0000000..2d2ad99 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotCircularElementRange.scala @@ -0,0 +1,13 @@ +package org.danielholmes.coc.baseanalyser.model.range + +import org.danielholmes.coc.baseanalyser.model.{FloatMapCoordinate, Tile, TileCoordinate} +import org.scalactic.anyvals.{PosDouble, PosZInt} + +case class BlindSpotCircularElementRange(centre: FloatMapCoordinate, innerSize: PosDouble, outerSize: PosDouble) extends ElementRange { + require(innerSize < outerSize, "inner should be less than outer") + + def contains(testCoordinate: FloatMapCoordinate): Boolean = { + val distance = testCoordinate.distanceTo(centre) + distance >= innerSize && distance < outerSize + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRange.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRange.scala new file mode 100644 index 0000000..e1f67a2 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRange.scala @@ -0,0 +1,21 @@ +package org.danielholmes.coc.baseanalyser.model.range + +import org.danielholmes.coc.baseanalyser.model.{Angle, FloatMapCoordinate, Tile, TileCoordinate} +import org.scalactic.anyvals.PosDouble + +case class BlindSpotSectorElementRange( + centre: FloatMapCoordinate, + innerSize: PosDouble, + outerSize: PosDouble, + angle: Angle, + angleSize: Angle +) extends ElementRange { + private val minAngle: Angle = angle - angleSize / 2 + private val maxAngle: Angle = angle + angleSize / 2 + + def contains(testCoordinate: FloatMapCoordinate): Boolean = { + val distance = testCoordinate.distanceTo(centre) + val testAngle = Angle.atan2(centre.y - testCoordinate.y, centre.x - testCoordinate.x) - Angle.Quarter + distance >= innerSize && distance < outerSize && minAngle.isLeftOf(testAngle) && maxAngle.isRightOf(testAngle) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/CircularElementRange.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/CircularElementRange.scala new file mode 100644 index 0000000..4971661 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/CircularElementRange.scala @@ -0,0 +1,17 @@ +package org.danielholmes.coc.baseanalyser.model.range + +import org.apache.commons.math3.geometry.euclidean.twod.Segment +import org.danielholmes.coc.baseanalyser.model.{FloatMapCoordinate, Tile} +import org.scalactic.anyvals.PosDouble + +case class CircularElementRange(centre: FloatMapCoordinate, size: PosDouble) extends ElementRange { + def contains(testCoordinate: FloatMapCoordinate): Boolean = { + testCoordinate.distanceTo(centre) < size + } + + def inset(amount: PosDouble): CircularElementRange = { + CircularElementRange(centre, PosDouble.from(size - amount).get) + } + + def cutBy(segment: Segment): Boolean = segment.distance(centre) < size +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/ElementRange.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/ElementRange.scala new file mode 100644 index 0000000..cd8b730 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/range/ElementRange.scala @@ -0,0 +1,18 @@ +package org.danielholmes.coc.baseanalyser.model.range + +import org.danielholmes.coc.baseanalyser.model.{Block, FloatMapCoordinate, Tile} + +trait ElementRange { + def contains(testCoordinate: FloatMapCoordinate): Boolean + + def touchesEdge(tile: Tile): Boolean = { + val touchResults = tile.allCoordinates.partition(contains(_)) + touchResults._1.nonEmpty && touchResults._2.nonEmpty + } + + def touches(tile: Tile): Boolean = tile.allCoordinates.exists(contains(_)) + + def touches(block: Block): Boolean = block.allCoordinates.exists(contains(_)) + + lazy val allTouchingTiles = Tile.All.filter(touches) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/special/ClanCastle.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/special/ClanCastle.scala new file mode 100644 index 0000000..515fd7d --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/special/ClanCastle.scala @@ -0,0 +1,11 @@ +package org.danielholmes.coc.baseanalyser.model.special + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.{Building, PreventsTroopDrop, Tile} +import org.scalactic.anyvals.PosInt + +case class ClanCastle(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) + + lazy val range = CircularElementRange(block.centre, 12.0) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/special/TownHall.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/special/TownHall.scala new file mode 100644 index 0000000..4343690 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/special/TownHall.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.special + +import org.danielholmes.coc.baseanalyser.model.{Building, PreventsTroopDrop, Tile} +import org.scalactic.anyvals.PosInt + +case class TownHall(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(4) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/AirBomb.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/AirBomb.scala new file mode 100644 index 0000000..1dd9877 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/AirBomb.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class AirBomb(level: PosInt, tile: Tile) extends Trap { + val size = PosInt(1) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Bomb.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Bomb.scala new file mode 100644 index 0000000..4b3a248 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Bomb.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class Bomb(level: PosInt, tile: Tile) extends Trap { + val size = PosInt(1) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/GiantBomb.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/GiantBomb.scala new file mode 100644 index 0000000..b404e9d --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/GiantBomb.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class GiantBomb(level: PosInt, tile: Tile) extends Trap { + val size = PosInt(2) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/HalloweenBomb.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/HalloweenBomb.scala new file mode 100644 index 0000000..69aaff9 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/HalloweenBomb.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class HalloweenBomb(level: PosInt, tile: Tile) extends Trap { + val size = PosInt(1) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SantaTrap.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SantaTrap.scala new file mode 100644 index 0000000..c4ac981 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SantaTrap.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class SantaTrap(level: PosInt, tile: Tile) extends Trap { + val size = PosInt(1) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SeekingAirMine.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SeekingAirMine.scala new file mode 100644 index 0000000..d9c24e9 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SeekingAirMine.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class SeekingAirMine(level: PosInt, tile: Tile) extends Trap { + val size = PosInt(1) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SkeletonTrap.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SkeletonTrap.scala new file mode 100644 index 0000000..ca337a9 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SkeletonTrap.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class SkeletonTrap(level: PosInt, tile: Tile) extends Trap { + val size = PosInt(1) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SpringTrap.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SpringTrap.scala new file mode 100644 index 0000000..aebe6d5 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/SpringTrap.scala @@ -0,0 +1,9 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.Tile +import org.scalactic.anyvals.PosInt + +case class SpringTrap(tile: Tile) extends Trap { + val size = PosInt(1) + val level = PosInt(1) // level not even relevant +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Trap.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Trap.scala new file mode 100644 index 0000000..559612e --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/traps/Trap.scala @@ -0,0 +1,6 @@ +package org.danielholmes.coc.baseanalyser.model.traps + +import org.danielholmes.coc.baseanalyser.model.{Element, Hidden} + +trait Trap extends Hidden +// TODO: Some sort of activation. For springs its a single tile, for bombs its a circular range. Just reuse range diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ArmyCamp.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ArmyCamp.scala new file mode 100644 index 0000000..ebfc7d9 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ArmyCamp.scala @@ -0,0 +1,9 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Building, Tile} +import org.scalactic.anyvals.PosInt + +case class ArmyCamp(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size: PosInt = 5 + override lazy val hitSize: PosInt = 3 +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Barrack.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Barrack.scala new file mode 100644 index 0000000..5fa8595 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Barrack.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class Barrack(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/BuilderHut.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/BuilderHut.scala new file mode 100644 index 0000000..4dda6bf --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/BuilderHut.scala @@ -0,0 +1,9 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class BuilderHut(tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(2) + val level = PosInt(1) // level not even relevant for builderhut +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkBarrack.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkBarrack.scala new file mode 100644 index 0000000..2806cdd --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkBarrack.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class DarkBarrack(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirCollector.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirCollector.scala new file mode 100644 index 0000000..76d5b4b --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirCollector.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class DarkElixirCollector(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirStorage.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirStorage.scala new file mode 100644 index 0000000..079a65a --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkElixirStorage.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class DarkElixirStorage(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkSpellFactory.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkSpellFactory.scala new file mode 100644 index 0000000..e8bf143 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/DarkSpellFactory.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class DarkSpellFactory(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirCollector.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirCollector.scala new file mode 100644 index 0000000..5e776cb --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirCollector.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class ElixirCollector(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirStorage.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirStorage.scala new file mode 100644 index 0000000..717fd22 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/ElixirStorage.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class ElixirStorage(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldMine.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldMine.scala new file mode 100644 index 0000000..44febd7 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldMine.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class GoldMine(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldStorage.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldStorage.scala new file mode 100644 index 0000000..c0e6637 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/GoldStorage.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class GoldStorage(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Laboratory.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Laboratory.scala new file mode 100644 index 0000000..cf75536 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/Laboratory.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class Laboratory(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(4) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/SpellFactory.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/SpellFactory.scala new file mode 100644 index 0000000..ae8e72c --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/trash/SpellFactory.scala @@ -0,0 +1,8 @@ +package org.danielholmes.coc.baseanalyser.model.trash + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, Tile, Building} +import org.scalactic.anyvals.PosInt + +case class SpellFactory(level: PosInt, tile: Tile) extends Building with PreventsTroopDrop { + val size = PosInt(3) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Archer.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Archer.scala new file mode 100644 index 0000000..3df27e3 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Archer.scala @@ -0,0 +1,12 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.{Structure, Village} +import org.scalactic.anyvals.{PosInt, PosZDouble} + +object Archer extends Troop { + val Range = PosZDouble(3.5) + + override protected def getPrioritisedTargets(village: Village): List[Set[Structure]] = { + getAnyBuildingsTargets(village) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueen.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueen.scala new file mode 100644 index 0000000..2b3a19d --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueen.scala @@ -0,0 +1,12 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model._ +import org.scalactic.anyvals.PosZDouble + +object ArcherQueen extends Troop { + val Range = PosZDouble(5) + + override protected def getPrioritisedTargets(village: Village): List[Set[Structure]] = { + getAnyBuildingsTargets(village) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueenAttacking.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueenAttacking.scala new file mode 100644 index 0000000..9087483 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherQueenAttacking.scala @@ -0,0 +1,9 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.{PreventsTroopDrop, TileCoordinate} + +case class ArcherQueenAttacking(startPosition: TileCoordinate, targeting: PreventsTroopDrop) { + lazy val hitPoint = targeting.findClosestHitCoordinate(startPosition) + + lazy val distance = startPosition.distanceTo(hitPoint) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherTargeting.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherTargeting.scala new file mode 100644 index 0000000..469fe87 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/ArcherTargeting.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.{Structure, TileCoordinate} + +case class ArcherTargeting(standingPosition: TileCoordinate, targeting: Structure) { + lazy val hitPoint = targeting.findClosestHitCoordinate(standingPosition) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Dragon.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Dragon.scala new file mode 100644 index 0000000..d26e189 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Dragon.scala @@ -0,0 +1,12 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.{Structure, Village} +import org.scalactic.anyvals.{PosZDouble, PosZInt} + +object Dragon extends Troop { + val Range = PosZDouble(1) + + override protected def getPrioritisedTargets(village: Village): List[Set[Structure]] = { + getAnyBuildingsTargets(village) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRider.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRider.scala new file mode 100644 index 0000000..1954089 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRider.scala @@ -0,0 +1,14 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model._ +import org.scalactic.anyvals.{PosInt, PosZDouble} + +object HogRider extends Troop { + val Range = PosZDouble(0) + + val HousingSpace = PosInt(5) + + override protected def getPrioritisedTargets(village: Village): List[Set[Structure]] = { + getDefenseTargetingTargets(village) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogTargeting.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogTargeting.scala new file mode 100644 index 0000000..c959946 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/HogTargeting.scala @@ -0,0 +1,17 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.apache.commons.math3.geometry.euclidean.twod.{Line, Segment} +import org.danielholmes.coc.baseanalyser.model.range.{CircularElementRange, ElementRange} +import org.danielholmes.coc.baseanalyser.model.{Element, PreventsTroopDrop, Structure, TileCoordinate} + +case class HogTargeting(startPosition: TileCoordinate, targeting: Structure) { + lazy val hitPoint = targeting.findClosestHitCoordinate(startPosition) + + lazy val distance = startPosition.distanceTo(hitPoint) + + def cutsRadius(range: CircularElementRange): Boolean = range.cutBy(asSegment) + + private val asLine = new Line(startPosition, hitPoint, 0.01) + + private val asSegment = new Segment(startPosition, hitPoint, asLine) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/LavaHound.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/LavaHound.scala new file mode 100644 index 0000000..567b7df --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/LavaHound.scala @@ -0,0 +1,10 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.defense.AirDefense +import org.danielholmes.coc.baseanalyser.model.Block + +object LavaHound { + def getRestingArea(airDefense: AirDefense): Block = { + airDefense.block.contractBy(1) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Minion.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Minion.scala new file mode 100644 index 0000000..2fbeefb --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Minion.scala @@ -0,0 +1,12 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.{Structure, Village} +import org.scalactic.anyvals.PosZDouble + +object Minion extends Troop { + val Range = PosZDouble(0.75) + + override protected def getPrioritisedTargets(village: Village): List[Set[Structure]] = { + getAnyBuildingsTargets(village) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/MinionAttackPosition.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/MinionAttackPosition.scala new file mode 100644 index 0000000..4c66bb0 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/MinionAttackPosition.scala @@ -0,0 +1,7 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.{FloatMapCoordinate, Structure} + +case class MinionAttackPosition(startPosition: FloatMapCoordinate, targeting: Structure) { + lazy val hitPoint = targeting.findClosestHitCoordinate(startPosition) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Troop.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Troop.scala new file mode 100644 index 0000000..1ef2dfd --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/Troop.scala @@ -0,0 +1,106 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.{Block, _} +import org.scalactic.anyvals.{PosInt, PosZDouble, PosZInt} + +import scala.annotation.tailrec + +trait Troop { + val Range: PosZDouble + + protected def getPrioritisedTargets(village: Village): List[Set[Structure]] + + protected def getDefenseTargetingTargets(village: Village): List[Set[Structure]] = { + List( + village.stationaryDefensiveBuildings.toSet[Structure], + (village.buildings -- village.stationaryDefensiveBuildings).toSet[Structure] + ) + } + + protected def getAnyBuildingsTargets(village: Village): List[Set[Structure]] = { + List(village.buildings.map(_.asInstanceOf[Structure])) + } + + def firstPossibleAttackingCoordinate(element: Element, coordinates: Set[TileCoordinate]): Option[TileCoordinate] = { + firstPossibleAttackingCoordinate(element.block, element.block.border.toList, Set.empty, coordinates) + } + + @tailrec + private def firstPossibleAttackingCoordinate( + block: Block, + toProcess: List[TileCoordinate], + processed: Set[TileCoordinate], + allowed: Set[TileCoordinate] + ): Option[TileCoordinate] = { + toProcess match { + case Nil => None + case head :: tail => + if (allowed.contains(head)) { + Some(head) + } else { + val unProcessedNeighboursWithinRange = head.neighbours.diff(processed) + .filter(coord => block.distanceTo(coord) < Range) + firstPossibleAttackingCoordinate( + block, + tail ::: unProcessedNeighboursWithinRange.toList, + processed ++ unProcessedNeighboursWithinRange, + allowed + ) + } + } + } + + def getAttackFloatCoordinates(structure: Structure): Set[FloatMapCoordinate] = { + val diagonalRange = Math.sqrt(Range / 2) + structure.hitBlock.allCoordinates.map(TileCoordinate.widenToMapCoordinate) ++ + structure.hitBlock.leftSide.map(_.offset(-Range, 0)) ++ + structure.hitBlock.rightSide.map(_.offset(Range, 0)) ++ + structure.hitBlock.topSide.map(_.offset(0, -Range)) ++ + structure.hitBlock.bottomSide.map(_.offset(0, Range)) + + structure.hitBlock.topLeft.offset(-diagonalRange, -diagonalRange) + + structure.hitBlock.topRight.offset(diagonalRange, -diagonalRange) + + structure.hitBlock.bottomLeft.offset(-diagonalRange, diagonalRange) + + structure.hitBlock.bottomRight.offset(diagonalRange, diagonalRange) + } + + def getAttackTileCoordinates(structure: Structure): Set[TileCoordinate] = { + structure.hitBlock.topLeft.offset(-Range.toInt, -Range.toInt) + .matrixOfCoordinatesTo(structure.hitBlock.bottomRight.offset(Range.toInt, Range.toInt)) + .filter(coord => structure.hitBlock.distanceTo(coord) <= Range) + } + + def findReachableTargets(coordinate: TileCoordinate, village: Village): Set[Structure] = { + findClosestTargets(getPrioritisedTargets(village), coordinate, (d: PosZDouble) => d < Range) + } + + def getAllPossibleTargets(village: Village): Set[Structure] = { + getPrioritisedTargets(village).flatMap(structures => structures).toSet + } + + def findTargets(coordinate: TileCoordinate, village: Village): Set[Structure] = { + findClosestTargets(getPrioritisedTargets(village), coordinate, (d: PosZDouble) => true) + } + + @tailrec + private def findClosestTargets(targets: List[Set[Structure]], coordinate: TileCoordinate, distanceFilter: PosZDouble => Boolean): Set[Structure] = { + targets match { + case Nil => Set.empty + case head :: tail => + val setTargets = findClosestTargets(head, coordinate, distanceFilter) + setTargets.toList match { + case Nil => findClosestTargets(tail, coordinate, distanceFilter) + case result: List[Structure] => result.toSet + } + } + } + + private def findClosestTargets(targets: Set[Structure], coordinate: TileCoordinate, distanceFilter: PosZDouble => Boolean): Set[Structure] = { + targets.groupBy(_.hitBlock.distanceTo(coordinate)) + .toSeq + .filter(t => distanceFilter(t._1)) + .sortBy(_._1) + .headOption + .map(_._2) + .getOrElse(Set.empty) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/WizardTowerHoundTargeting.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/WizardTowerHoundTargeting.scala new file mode 100644 index 0000000..de6924e --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/model/troops/WizardTowerHoundTargeting.scala @@ -0,0 +1,6 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.Block +import org.danielholmes.coc.baseanalyser.model.defense.{AirDefense, WizardTower} + +case class WizardTowerHoundTargeting(tower: WizardTower, airDefense: AirDefense, houndTarget: Block) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayer.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayer.scala new file mode 100644 index 0000000..cec53cd --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayer.scala @@ -0,0 +1,139 @@ +package org.danielholmes.coc.baseanalyser.stringdisplay + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense._ +import org.danielholmes.coc.baseanalyser.model.heroes.{ArcherQueenAltar, BarbarianKingAltar} +import org.danielholmes.coc.baseanalyser.model.range.ElementRange +import org.danielholmes.coc.baseanalyser.model.special.{ClanCastle, TownHall} + +import scala.annotation.tailrec + +class StringDisplayer { + import StringDisplayer._ + + def build(base: Village): String = buildString(buildCollection(base)) + + def buildColoured(base: Village): String = { + build(base).toIterable + .map(c => colorChar(c) + c.toString) + .mkString("") + Console.RESET + } + + private def colorChar(char: Char): String = { + if (WallChars.contains(char)) { + Console.WHITE + } else { + Colors.toVector(Math.abs(char.hashCode) % Colors.size) + } + } + + private def buildString(collection: Seq[Seq[Char]]): String = { + collection.map(_ :+ "\n") + .map(_.mkString("")) + .mkString("") + } + + private def buildCollection(base: Village): Seq[Seq[Char]] = { + drawBoundary( + drawCCRadius( + base, + drawElements(base.elements.toList, List.fill[Char](Tile.MaxCoordinate + 1, Tile.MaxCoordinate + 1) { ' ' }) + ) + ) + } + + private def drawCCRadius(village: Village, current: List[List[Char]]): List[List[Char]] = { + village.clanCastle + .map(_.range) + .map(drawCCRadius(_, current, Tile.All.toList)) + .getOrElse(current) + } + + @tailrec + private def drawCCRadius(range: ElementRange, current: List[List[Char]], tiles: List[Tile]): List[List[Char]] = { + tiles match { + case Nil => current + case head :: tail => { + val newCurrent = if (range.touchesEdge(tiles.head)) { draw(current, head, '^') } else { current } + drawCCRadius(range, newCurrent, tail) + } + } + } + + @tailrec + private def drawElements(elements: List[Element], current: List[List[Char]]): List[List[Char]] = { + elements match { + case Nil => current + case head :: tail => drawElements(tail, drawElement(head, current)) + } + } + + private def drawElement(element: Element, current: List[List[Char]]): List[List[Char]] = { + drawElement(characterForElement(element), element.block.tiles.toList, current) + } + + @tailrec + private def drawElement(char: Char, tiles: List[Tile], current: List[List[Char]]): List[List[Char]] = { + tiles match { + case Nil => current + case head :: tail => drawElement(char, tail, draw(current, head, char)) + } + } + + private def draw(map: List[List[Char]], tile: Tile, char: Char): List[List[Char]] = { + map.patch(tile.y, Seq(map(tile.y).patch(tile.x, Seq(char), 1)), 1) + } + + private def characterForElement(element: Element): Char = { + element match { + case _: ArcherTower => 'A' + case _: BarbarianKingAltar => 'B' + case _: AirDefense => 'D' + case _: Cannon => 'C' + case _: InfernoTower => 'I' + case _: Mortar => 'M' + case _: ArcherQueenAltar => 'Q' + case _: AirSweeper => 'S' + case _: HiddenTesla => 'T' + case _: WizardTower => 'W' + case _: XBow => 'X' + case _: ClanCastle => '@' + case _: TownHall => '#' + case _: Wall => '+' + case _ => + val possibles = Vector('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '*', '/', '\\', '<', '>') + val charSeed = element.getClass.getName + possibles.toVector(Math.abs(charSeed.hashCode) % possibles.size) + } + } + + private def drawBoundary(current: List[List[Char]]): List[List[Char]] = { + (HorizontalWall :: verticalWall(current, List.empty)) :+ HorizontalWall + } + + @tailrec + private def verticalWall(inner: List[List[Char]], current: List[List[Char]]): List[List[Char]] = { + inner match { + case Nil => current + case head :: tail => verticalWall(tail, current :+ ((WallVert :: head) :+ WallVert)) + } + } +} + +object StringDisplayer { + private val WallCorner = '+' + private val WallHor = '-' + private val WallVert = '|' + private val WallChars = Set(WallCorner, WallHor, WallVert) + + private val Colors = Set( + Console.MAGENTA, + Console.BLUE, + Console.CYAN, + Console.GREEN, + Console.RED, + Console.YELLOW + ) + + private val HorizontalWall: List[Char] = (WallCorner :: List.fill[Char](TileCoordinate.MaxCoordinate) { WallHor }) :+ WallCorner +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringTroopDropDisplayer.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringTroopDropDisplayer.scala new file mode 100644 index 0000000..c064532 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringTroopDropDisplayer.scala @@ -0,0 +1,28 @@ +package org.danielholmes.coc.baseanalyser.stringdisplay + +import org.danielholmes.coc.baseanalyser.model._ + +import scala.annotation.tailrec + +class StringTroopDropDisplayer { + def build(village: Village): String = { + build( + village.coordinatesAllowedToDropTroop.toSeq, + List.fill[Char](TileCoordinate.MaxCoordinate + 1, TileCoordinate.MaxCoordinate + 1) { ' ' } + ).map(_ :+ "\n") + .map(_.mkString("")) + .mkString("") + } + + @tailrec + private def build(coords: Seq[TileCoordinate], current: List[List[Char]]): List[List[Char]] = { + coords match { + case Nil => current + case head :: tail => build(tail, drawCoord(head, current)) + } + } + + private def drawCoord(coord: TileCoordinate, current: List[List[Char]]): List[List[Char]] = { + current.patch(coord.y, Seq(current(coord.y).patch(coord.x, Seq('+'), 1)), 1) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilder.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilder.scala new file mode 100644 index 0000000..f74765e --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilder.scala @@ -0,0 +1,53 @@ +package org.danielholmes.coc.baseanalyser.util + +import org.danielholmes.coc.baseanalyser.model.{Element, Tile, Village, Wall} +import org.scalactic.anyvals.{PosInt, PosZInt} + +object ElementsBuilder { + def elementFence(origin: Tile, width: PosInt, height: PosInt): Set[Element] = { + wallFence(origin, width, height).map(_.asInstanceOf[Element]) + } + + def wallFence(origin: Tile, width: PosInt, height: PosInt): Set[Wall] = { + rectangle(origin, width, height, 1, Wall(1, _)) + } + + def rectangle[T <: Element](origin: Tile, xTimes: PosInt, yTimes: PosInt, step: PosInt, builder: (Tile) => T): Set[T] = { + ElementsBuilder.repeatX(origin, xTimes, step, builder) ++ + ElementsBuilder.repeatX(origin.offset(0, (yTimes - 1) * step), xTimes, step, builder) ++ + ElementsBuilder.repeatY(origin.offset(0, step), PosInt.from(yTimes - 2).get, step, builder) ++ + ElementsBuilder.repeatY(origin.offset((xTimes - 1) * step, step), PosInt.from(yTimes - 2).get, step, builder) + } + + def repeatX[T <: Element](origin: Tile, times: PosInt, step: PosInt, builder: (Tile) => T): Set[T] = { + Range(0, times) + .map(origin.x + _ * step) + .map((x: Int) => Tile(PosZInt.from(x).get, origin.y)) + .map(builder.apply) + .toSet + } + + private def repeatY[T <: Element](origin: Tile, times: PosInt, step: PosInt, builder: (Tile) => T): Set[T] = { + Range(0, times) + .map(origin.y + _ * step) + .map((y: Int) => Tile(origin.x, PosZInt.from(y).get)) + .map(builder.apply) + .toSet + } + + def fromString[T <: Element](input: String, origin: Tile, builder: (Tile) => T): Set[T] = { + input.split("\n") + .zipWithIndex + .flatMap(row => { + row._1 + .zipWithIndex + .filter(_._1 != ' ') + .map(col => builder.apply(Tile(PosZInt.from(origin.x + col._2).get, PosZInt.from(origin.y + row._2).get))) + }) + .toSet + } + + def villageFromString(input: String, origin: Tile, builder: (Tile) => Element): Village = { + Village(fromString(input, origin, builder)) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/util/GameConnectionNotAvailableException.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/util/GameConnectionNotAvailableException.scala new file mode 100644 index 0000000..0008ce7 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/util/GameConnectionNotAvailableException.scala @@ -0,0 +1,3 @@ +package org.danielholmes.coc.baseanalyser.util + +class GameConnectionNotAvailableException extends Exception diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/util/Memo2.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/util/Memo2.scala new file mode 100644 index 0000000..468d04a --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/util/Memo2.scala @@ -0,0 +1,10 @@ +package org.danielholmes.coc.baseanalyser.util + +import scala.collection.mutable + +case class Memo2[A,B,C](f: (A, B) => C) extends ((A, B) => C) { + private val cache = mutable.Map.empty[(A, B), C] + def apply(a: A, b: B): C = { + cache.getOrElseUpdate((a, b), f(a, b)) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/util/TimedInvocation.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/util/TimedInvocation.scala new file mode 100644 index 0000000..7b08842 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/util/TimedInvocation.scala @@ -0,0 +1,12 @@ +package org.danielholmes.coc.baseanalyser.util + +import java.time.Duration + +object TimedInvocation { + def run[T](op: () => T): (T, Duration) = { + val start = System.currentTimeMillis + val result = op.apply() + val duration = Duration.ofMillis(System.currentTimeMillis - start) + (result, duration) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/ModelViewModels.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/ModelViewModels.scala new file mode 100644 index 0000000..d732077 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/ModelViewModels.scala @@ -0,0 +1,81 @@ +package org.danielholmes.coc.baseanalyser.web + +case class TileCoordinateViewModel(x: Int, y: Int) +case class MapCoordinateViewModel(x: Double, y: Double) + +sealed trait ElementRangeViewModel { + val typeName: String +} +case class CircularElementRangeViewModel(inner: Double, outer: Double, override val typeName: String = "Circular") extends ElementRangeViewModel +case class BlindSpotSectorElementRangeViewModel( + angle: Double, + angleSize: Double, + innerSize: Double, + outerSize: Double, + override val typeName: String = "Sector" +) extends ElementRangeViewModel + +case class BlockViewModel(x: Int, y: Int, size: Int) +case class TileViewModel(x: Int, y: Int) + +sealed trait ElementViewModel { + def id: String + def typeName: String + def block: BlockViewModel +} +case class DecorationElementViewModel( + override val id: String, + override val typeName: String, + override val block: BlockViewModel +) extends ElementViewModel +case class TrapElementViewModel( + override val id: String, + override val typeName: String, + level: Int, + override val block: BlockViewModel +) extends ElementViewModel +case class BaseStructureElementViewModel( + override val id: String, + override val typeName: String, + level: Int, + override val block: BlockViewModel, + noTroopDropBlock: BlockViewModel +) extends ElementViewModel +case class DefenseElementViewModel( + override val id: String, + override val typeName: String, + level: Int, + override val block: BlockViewModel, + noTroopDropBlock: BlockViewModel, + range: ElementRangeViewModel +) extends ElementViewModel +case class HiddenTeslaViewModel( + override val id: String, + override val typeName: String, + level: Int, + override val block: BlockViewModel, + range: ElementRangeViewModel +) extends ElementViewModel +case class ClanCastleElementViewModel( + override val id: String, + override val typeName: String, + level: Int, + override val block: BlockViewModel, + noTroopDropBlock: BlockViewModel, + range: ElementRangeViewModel +) extends ElementViewModel +case class VillageViewModel( + elements: Set[ElementViewModel], + wallCompartments: Set[WallCompartmentViewModel], + possibleInternalLargeTraps: Set[PossibleLargeTrapViewModel] +) { + require(elements.toList.map(_.id).distinct.size == elements.size, "All ids must be unique") +} + +case class HogTargetingViewModel(startPosition: TileCoordinateViewModel, targetingId: String, hitPoint: TileCoordinateViewModel) +case class ArcherTargetingViewModel(standingPosition: TileCoordinateViewModel, targetingId: String, hitPoint: TileCoordinateViewModel) +case class ArcherQueenAttackingViewModel(standingPosition: TileCoordinateViewModel, targetingId: String, hitPoint: TileCoordinateViewModel) +case class WallCompartmentViewModel(id: String, walls: Set[String], innerTiles: Set[TileViewModel], elementIds: Set[String]) +case class PossibleLargeTrapViewModel(x: Int, y: Int) +case class WizardTowerHoundTargetingViewModel(tower: String, airDefense: String, houndTarget: BlockViewModel) +case class MinionAttackPositionViewModel(startPosition: MapCoordinateViewModel, targetingId: String, hitPoint: TileCoordinateViewModel) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/MustacheRenderer.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/MustacheRenderer.scala new file mode 100644 index 0000000..335a9ab --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/MustacheRenderer.scala @@ -0,0 +1,16 @@ +package org.danielholmes.coc.baseanalyser.web + +import java.io.StringWriter + +import com.github.mustachejava.MustacheFactory + +class MustacheRenderer(val mustacheFactory: MustacheFactory) { + def render(name: String, vars: Object): String = { + val mustache = mustacheFactory.compile(name) + + val writer = new StringWriter() + mustache.execute(writer, vars).flush() + + writer.toString + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/PermittedClan.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/PermittedClan.scala new file mode 100644 index 0000000..dfab027 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/PermittedClan.scala @@ -0,0 +1,3 @@ +package org.danielholmes.coc.baseanalyser.web + +case class PermittedClan(code: String, name: String, id: Long) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/RuleViewModels.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/RuleViewModels.scala new file mode 100644 index 0000000..3e36097 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/RuleViewModels.scala @@ -0,0 +1,87 @@ +package org.danielholmes.coc.baseanalyser.web + +sealed trait RuleResultViewModel { + val code: String + val title: String + val description: String + val success: Boolean +} + +case class RuleResultSummaryViewModel(shortName: String, success: Boolean) + +case class HogCCLureResultViewModel( + success: Boolean, + targetings: Set[HogTargetingViewModel], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class ArcherAnchorResultViewModel( + success: Boolean, + targetings: Set[ArcherTargetingViewModel], + aimingDefenses: Set[String], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class HighHPUnderAirDefResultViewModel( + success: Boolean, + outOfAirDefRange: Set[String], + inAirDefRange: Set[String], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class AirSnipedDefenseResultViewModel( + success: Boolean, + attackPositions: Set[MinionAttackPositionViewModel], + airDefenses: Set[String], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class MinimumCompartmentsResultViewModel( + success: Boolean, + minimumCompartments: Int, + compartments: Set[String], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class BKSwappableResultViewModel( + success: Boolean, + exposedTiles: Set[TileViewModel], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class WizardTowersOutOfHoundPositionsResultViewModel( + success: Boolean, + outOfRange: Set[String], + inRange: Set[WizardTowerHoundTargetingViewModel], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class QueenWalkedAirDefenseResultViewModel( + success: Boolean, + attackings: Set[ArcherQueenAttackingViewModel], + nonReachableAirDefs: Set[String], + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class QueenWontLeaveCompartmentRuleResultViewModel( + success: Boolean, + code: String, + title: String, + description: String +) extends RuleResultViewModel +case class EnoughPossibleTrapLocationsRuleResultViewModel( + success: Boolean, + score: Double, + minScore: Double, + code: String, + title: String, + description: String +) extends RuleResultViewModel diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/TopLevelViewModels.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/TopLevelViewModels.scala new file mode 100644 index 0000000..2d94bd4 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/TopLevelViewModels.scala @@ -0,0 +1,31 @@ +package org.danielholmes.coc.baseanalyser.web + +case class AnalysisReportSummaryViewModel( + townHallLevel: Int, + resultSummaries: Set[RuleResultSummaryViewModel], + connectionTime: String, + analysisTime: String +) + +case class AnalysisReportViewModel(village: VillageViewModel, results: Set[RuleResultViewModel]) + +case class CantAnalyseVillageViewModel(village: VillageViewModel, message: String) + +case class ExceptionViewModel(uri: String, exceptionType: String, message: String, trace: List[String]) + +case class BaseAnalysisViewModel( + mapTiles: Int, + borderTiles: Int, + clanName: String, + playerIgn: String, + layoutDescription: String, + report: String, + warning: Option[String], + times: BaseAnalysisProfilingViewModel +) + +case class BaseAnalysisProfilingViewModel( + connection: String, + analysis: String, + times: Seq[(String, Seq[(String, String)])] +) diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelMapper.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelMapper.scala new file mode 100644 index 0000000..8f9ce47 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelMapper.scala @@ -0,0 +1,379 @@ +package org.danielholmes.coc.baseanalyser.web + +import java.time.Duration +import java.util.{Base64, UUID} + +import org.danielholmes.coc.baseanalyser.analysis._ +import org.danielholmes.coc.baseanalyser.gameconnection.ClanSeekerProtocol.PlayerVillage +import org.danielholmes.coc.baseanalyser.model.Layout.Layout +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.HiddenTesla +import org.danielholmes.coc.baseanalyser.model.heroes.HeroAltar +import org.danielholmes.coc.baseanalyser.model.range.{BlindSpotCircularElementRange, BlindSpotSectorElementRange, CircularElementRange, ElementRange} +import org.danielholmes.coc.baseanalyser.model.special.ClanCastle +import org.danielholmes.coc.baseanalyser.model.troops._ +import spray.http.Uri +import spray.httpx.SprayJsonSupport._ +import spray.json._ +import ViewModelProtocol._ +import org.danielholmes.coc.baseanalyser.model.traps.Trap + +class ViewModelMapper { + def exception(uri: Uri, e: Exception): ExceptionViewModel = { + ExceptionViewModel( + uri.toString, + e.getClass.getName, + e.getMessage, + e.getStackTrace + .map((el: StackTraceElement) => s"${el.getClassName}.${el.getMethodName} - ${el.getFileName}:${el.getLineNumber}") + .toList + ) + } + + def analysisSummary(userName: String, report: AnalysisReport, connectionDuration: Duration): AnalysisReportSummaryViewModel = { + AnalysisReportSummaryViewModel( + report.village.townHallLevel.get, + report.results.map(ruleResultSummary), + formatSecs(connectionDuration), + formatSecs(report.profiling.total) + ) + } + + private def ruleResultSummary(ruleResult: RuleResult): RuleResultSummaryViewModel = { + RuleResultSummaryViewModel(ruleResult.ruleDetails.shortName, ruleResult.success) + } + + def baseAnalysis( + clan: PermittedClan, + player: PlayerVillage, + layout: Layout, + analysis: AnalysisReport, + connectionDuration: Duration + ): BaseAnalysisViewModel = { + baseAnalysis( + clan, + player, + layout, + analysis, + connectionDuration, + None + ) + } + + private def baseAnalysis( + clan: PermittedClan, + player: PlayerVillage, + layout: Layout, + analysis: AnalysisReport, + connectionDuration: Duration, + warning: Option[String] + ): BaseAnalysisViewModel = { + BaseAnalysisViewModel( + Tile.MapSize.toInt, + Tile.OutsideBorder.toInt, + clan.name, + player.avatar.userName, + Layout.getDescription(layout), + analysisReport(analysis).toJson.compactPrint, + warning, + baseAnalysisProfiling(connectionDuration, analysis.profiling) + ) + } + + def baseAnalysisError( + clan: PermittedClan, + player: PlayerVillage, + layout: Layout, + village: Village, + connectionDuration: Duration, + warning: String + ): BaseAnalysisViewModel = { + baseAnalysis( + clan, + player, + layout, + AnalysisReport(village, Set.empty, AnalysisProfiling(Map.empty, Map.empty)), + connectionDuration, + Some(warning) + ) + } + + private def baseAnalysisProfiling( + connectionDuration: Duration, + profiling: AnalysisProfiling + ): BaseAnalysisProfilingViewModel = { + BaseAnalysisProfilingViewModel( + formatSecs(connectionDuration), + formatSecs(profiling.rulesDuration.plus(profiling.buildingBlocksDuration)), + Seq( + ("Game Connection", Seq(("Total", formatSecs(connectionDuration)))), + ( + s"Building blocks (${formatSecs(profiling.buildingBlocksDuration)})", + profiling.buildingBlocksSorted.map(t => (t._1, formatSecs(t._2))) + ), + ( + s"Analysis (${formatSecs(profiling.rulesDuration)})", + profiling.rulesSorted.map(t => (t._1.shortName, formatSecs(t._2))) + ) + ) + ) + } + + private def formatSecs(duration: Duration): String = { + "%.3f".format(duration.toMillis / 1000.0) + "s" + } + + def analysisReport(report: AnalysisReport): AnalysisReportViewModel = { + AnalysisReportViewModel(village(report.village), report.results.map(ruleResult)) + } + + def cantAnalyseVillage(invalidVillage: Village, message: String): CantAnalyseVillageViewModel = { + CantAnalyseVillageViewModel(village(invalidVillage), message) + } + + private def minionAttackPosition(position: MinionAttackPosition): MinionAttackPositionViewModel = { + MinionAttackPositionViewModel( + mapCoordinate(position.startPosition), + objectId(position.targeting), + tileCoordinate(position.hitPoint) + ) + } + + private def ruleResult(result: RuleResult): RuleResultViewModel = { + result match { + case h: HogCCLureRuleResult => HogCCLureResultViewModel( + h.success, + h.targeting + .groupBy(_.targeting) + .values + .map(_.minBy(_.distance)) + .map(hogTargeting) + .toSet, + h.ruleDetails.code, + h.ruleDetails.name, + h.ruleDetails.description + ) + case h: ArcherAnchorRuleResult => ArcherAnchorResultViewModel( + h.success, + h.targeting + .groupBy(_.targeting) + .values + .map(_.head) + .map(archerTargeting) + .toSet, + h.aimingDefenses.map(objectId), + h.ruleDetails.code, + h.ruleDetails.name, + h.ruleDetails.description + ) + case a: HighHPUnderAirDefRuleResult => HighHPUnderAirDefResultViewModel( + a.success, + a.outOfAirDefRange.map(objectId), + a.inAirDefRange.map(objectId), + a.ruleDetails.code, + a.ruleDetails.name, + a.ruleDetails.description + ) + case a: AirSnipedDefenseRuleResult => AirSnipedDefenseResultViewModel( + a.success, + a.snipedDefenses.map(minionAttackPosition), + a.airDefenses.map(objectId), + a.ruleDetails.code, + a.ruleDetails.name, + a.ruleDetails.description + ) + case m: MinimumCompartmentsRuleResult => MinimumCompartmentsResultViewModel( + m.success, + m.minimumCompartments, + m.buildingCompartments.map(objectId), + m.ruleDetails.code, + m.ruleDetails.name, + m.ruleDetails.description + ) + case b: BKSwappableRuleResult => BKSwappableResultViewModel( + b.success, + b.exposedTiles.map(tile), + b.ruleDetails.code, + b.ruleDetails.name, + b.ruleDetails.description + ) + case w: WizardTowersOutOfHoundPositionsRuleResult => WizardTowersOutOfHoundPositionsResultViewModel( + w.success, + w.outOfRange.map(objectId), + w.inRange.map(wizardTowerHoundTargeting), + w.ruleDetails.code, + w.ruleDetails.name, + w.ruleDetails.description + ) + case q: QueenWalkedAirDefenseRuleResult => QueenWalkedAirDefenseResultViewModel( + q.success, + q.attackings.map(archerQueenAttacking), + q.nonReachableAirDefs.map(objectId), + q.ruleDetails.code, + q.ruleDetails.name, + q.ruleDetails.description + ) + case q: QueenWontLeaveCompartmentRuleResult => QueenWontLeaveCompartmentRuleResultViewModel( + q.success, + q.ruleDetails.code, + q.ruleDetails.name, + q.ruleDetails.description + ) + case t: EnoughPossibleTrapLocationsRuleResult => EnoughPossibleTrapLocationsRuleResultViewModel( + t.success, + t.score, + t.minScore, + t.ruleDetails.code, + t.ruleDetails.name, + t.ruleDetails.description + ) + case _ => throw new RuntimeException(s"Don't know how to create view model for ${result.getClass.getSimpleName}") + } + } + + private def archerQueenAttacking(attacking: ArcherQueenAttacking): ArcherQueenAttackingViewModel = { + ArcherQueenAttackingViewModel( + tileCoordinate(attacking.startPosition), + objectId(attacking.targeting), + tileCoordinate(attacking.hitPoint) + ) + } + + private def hogTargeting(targeting: HogTargeting): HogTargetingViewModel = { + HogTargetingViewModel( + tileCoordinate(targeting.startPosition), + objectId(targeting.targeting), + tileCoordinate(targeting.hitPoint) + ) + } + + private def archerTargeting(targeting: ArcherTargeting): ArcherTargetingViewModel = { + ArcherTargetingViewModel( + tileCoordinate(targeting.standingPosition), + objectId(targeting.targeting), + tileCoordinate(targeting.hitPoint) + ) + } + + private def wallCompartment(compartment: WallCompartment): WallCompartmentViewModel = { + WallCompartmentViewModel( + objectId(compartment), + compartment.walls.map(objectId), + compartment.innerTiles.map(tile), + compartment.elements.map(objectId) + ) + } + + private def tile(tile: Tile): TileViewModel = TileViewModel(tile.x, tile.y) + + private def village(village: Village): VillageViewModel = { + VillageViewModel( + village.elements.map(element), + village.wallCompartments.map(wallCompartment), + village.possibleInternalLargeTraps.map(possibleInternalLargeTrap) + ) + } + + private def possibleInternalLargeTrap(trap: PossibleLargeTrap): PossibleLargeTrapViewModel = { + PossibleLargeTrapViewModel(trap.tile.x, trap.tile.y) + } + + private def element(element: Element): ElementViewModel = { + val typeName = element.getClass.getSimpleName + element match { + case d: StationaryDefensiveBuilding => + d match { + case p: PreventsTroopDrop => DefenseElementViewModel ( + objectId (d), + typeName, + element.level, + block(d.block), + block(p.preventTroopDropBlock), + elementRange(d.range) + ) + case h: HiddenTesla => HiddenTeslaViewModel( + objectId (d), + typeName, + element.level, + block(d.block), + elementRange (d.range) + ) + case _ => throw new RuntimeException(s"Can't map ${element.getClass.getSimpleName}") + } + case h: HeroAltar => DefenseElementViewModel ( + objectId(h), + typeName, + element.level, + block(h.block), + block(h.preventTroopDropBlock), + elementRange(h.range) + ) + case c: ClanCastle => ClanCastleElementViewModel( + objectId(c), + typeName, + c.level, + block(c.block), + block(c.preventTroopDropBlock), + elementRange(c.range) + ) + case p: PreventsTroopDrop => BaseStructureElementViewModel( + objectId(p), + typeName, + p.level, + block(p.block), + block(p.preventTroopDropBlock) + ) + case t: Trap => TrapElementViewModel( + objectId(t), + typeName, + t.level, + block(t.block) + ) + case d: Decoration => DecorationElementViewModel( + objectId(d), + typeName, + block(d.block) + ) + case e: Element => throw new RuntimeException(s"Can't map ${element.getClass.getSimpleName}") + } + } + + private def wizardTowerHoundTargeting(targeting: WizardTowerHoundTargeting): WizardTowerHoundTargetingViewModel = { + WizardTowerHoundTargetingViewModel( + objectId(targeting.tower), + objectId(targeting.airDefense), + block(targeting.houndTarget) + ) + } + + private def elementRange(range: ElementRange): ElementRangeViewModel = { + range match { + case c: CircularElementRange => CircularElementRangeViewModel(0, c.size) + case b: BlindSpotCircularElementRange => CircularElementRangeViewModel(b.innerSize, b.outerSize) + case w: BlindSpotSectorElementRange => BlindSpotSectorElementRangeViewModel( + w.angle.degrees, + w.angleSize.degrees, + w.innerSize, + w.outerSize + ) + case _ => throw new RuntimeException("Can't render element range") + } + + } + + private def block(block: Block): BlockViewModel = { + BlockViewModel(block.x, block.y, block.size) + } + + private def tileCoordinate(coord: TileCoordinate): TileCoordinateViewModel = { + TileCoordinateViewModel(coord.x, coord.y) + } + + private def mapCoordinate(coord: FloatMapCoordinate): MapCoordinateViewModel = { + MapCoordinateViewModel(coord.x, coord.y) + } + + private def objectId(obj: Object): String = { + new String(Base64.getEncoder.encode(UUID.nameUUIDFromBytes(obj.toString.getBytes).toString.getBytes)).substring(0, 9) + } +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelProtocol.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelProtocol.scala new file mode 100644 index 0000000..4d2c641 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/ViewModelProtocol.scala @@ -0,0 +1,97 @@ +package org.danielholmes.coc.baseanalyser.web + +import spray.json.{DefaultJsonProtocol, JsValue, RootJsonFormat} + +object ViewModelProtocol extends DefaultJsonProtocol { + implicit object ElementJsonFormat extends RootJsonFormat[ElementViewModel] { + def write(e: ElementViewModel): JsValue = e match { + case d: DefenseElementViewModel => defenseElementFormat.write(d) + case d: HiddenTeslaViewModel => hiddenTeslaFormat.write(d) + case c: ClanCastleElementViewModel => clanCastleElementFormat.write(c) + case s: BaseStructureElementViewModel => baseStructureElementFormat.write(s) + case t: TrapElementViewModel => trapElementFormat.write(t) + case d: DecorationElementViewModel => decorationElementFormat.write(d) + } + + def read(value: JsValue): ElementViewModel = { + throw new NotImplementedError() + } + } + + implicit object RuleResultJsonFormat extends RootJsonFormat[RuleResultViewModel] { + def write(r: RuleResultViewModel): JsValue = r match { + case h: HogCCLureResultViewModel => hogCCLureResultFormat.write(h) + case a: ArcherAnchorResultViewModel => archerAnchorResultFormat.write(a) + case a: HighHPUnderAirDefResultViewModel => highHPUnderAirDefResultFormat.write(a) + case a: AirSnipedDefenseResultViewModel => airSnipedDefenseResultFormat.write(a) + case m: MinimumCompartmentsResultViewModel => minimumCompartmentsResultFormat.write(m) + case b: BKSwappableResultViewModel => bkSwappableResultFormat.write(b) + case w: WizardTowersOutOfHoundPositionsResultViewModel => wizardTowersOutOfHoundPositionsResultFormat.write(w) + case q: QueenWalkedAirDefenseResultViewModel => queenWalkedAirDefenseResultFormat.write(q) + case q: QueenWontLeaveCompartmentRuleResultViewModel => queenWontLeaveCompartmentResultFormat.write(q) + case t: EnoughPossibleTrapLocationsRuleResultViewModel => enoughPossibleTrapLocationsResultFormat.write(t) + case _ => throw new RuntimeException(s"Don't know how to serialise ${r.getClass.getSimpleName}") + } + + def read(value: JsValue): RuleResultViewModel = { + throw new NotImplementedError() + } + } + + implicit object ElementRangeJsonFormat extends RootJsonFormat[ElementRangeViewModel] { + def write(e: ElementRangeViewModel): JsValue = e match { + case c: CircularElementRangeViewModel => circularElementRangeFormat.write(c) + case w: BlindSpotSectorElementRangeViewModel => blindSpotSectorElementRangeFormat.write(w) + case _ => throw new RuntimeException(s"Can't render ${e.getClass.getSimpleName}") + } + + def read(value: JsValue): ElementRangeViewModel = { + throw new NotImplementedError() + } + } + + implicit val circularElementRangeFormat = jsonFormat3(CircularElementRangeViewModel) + implicit val blindSpotSectorElementRangeFormat = jsonFormat5(BlindSpotSectorElementRangeViewModel) + + implicit val tileCoordinateFormat = jsonFormat2(TileCoordinateViewModel) + implicit val mapCoordinateFormat = jsonFormat2(MapCoordinateViewModel) + implicit val blockFormat = jsonFormat3(BlockViewModel) + implicit val tileFormat = jsonFormat2(TileViewModel) + implicit val wallCompartmentFormat = jsonFormat4(WallCompartmentViewModel) + implicit val possibleLargeTrapFormat = jsonFormat2(PossibleLargeTrapViewModel) + + implicit val decorationElementFormat = jsonFormat3(DecorationElementViewModel) + implicit val trapElementFormat = jsonFormat4(TrapElementViewModel) + implicit val baseStructureElementFormat = jsonFormat5(BaseStructureElementViewModel) + implicit val hiddenTeslaFormat = jsonFormat5(HiddenTeslaViewModel) + implicit val defenseElementFormat = jsonFormat6(DefenseElementViewModel) + implicit val clanCastleElementFormat = jsonFormat6(ClanCastleElementViewModel) + + implicit val archerTargetingFormat = jsonFormat3(ArcherTargetingViewModel) + implicit val minionAttackPositionFormat = jsonFormat3(MinionAttackPositionViewModel) + implicit val hogTargetingFormat = jsonFormat3(HogTargetingViewModel) + implicit val archerQueenAttackingFormat = jsonFormat3(ArcherQueenAttackingViewModel) + implicit val wizardTowerHoundTargetingFormat = jsonFormat3(WizardTowerHoundTargetingViewModel) + + implicit val hogCCLureResultFormat = jsonFormat5(HogCCLureResultViewModel) + implicit val archerAnchorResultFormat = jsonFormat6(ArcherAnchorResultViewModel) + implicit val highHPUnderAirDefResultFormat = jsonFormat6(HighHPUnderAirDefResultViewModel) + implicit val airSnipedDefenseResultFormat = jsonFormat6(AirSnipedDefenseResultViewModel) + implicit val minimumCompartmentsResultFormat = jsonFormat6(MinimumCompartmentsResultViewModel) + implicit val bkSwappableResultFormat = jsonFormat5(BKSwappableResultViewModel) + implicit val wizardTowersOutOfHoundPositionsResultFormat = jsonFormat6(WizardTowersOutOfHoundPositionsResultViewModel) + implicit val queenWalkedAirDefenseResultFormat = jsonFormat6(QueenWalkedAirDefenseResultViewModel) + implicit val queenWontLeaveCompartmentResultFormat = jsonFormat4(QueenWontLeaveCompartmentRuleResultViewModel) + implicit val enoughPossibleTrapLocationsResultFormat = jsonFormat6(EnoughPossibleTrapLocationsRuleResultViewModel) + + implicit val villageFormat = jsonFormat3(VillageViewModel) + implicit val analysisReportFormat = jsonFormat2(AnalysisReportViewModel) + implicit val cantAnalyseVillageFormat = jsonFormat2(CantAnalyseVillageViewModel) + implicit val baseAnalysisProfilingFormat = jsonFormat3(BaseAnalysisProfilingViewModel) + implicit val baseAnalysisFormat = jsonFormat8(BaseAnalysisViewModel) + + implicit val resultSummaryFormat = jsonFormat2(RuleResultSummaryViewModel) + implicit val analysisReportSummaryFormat = jsonFormat4(AnalysisReportSummaryViewModel) + + implicit val exceptionFormat = jsonFormat4(ExceptionViewModel) +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/WebApp.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/WebApp.scala new file mode 100644 index 0000000..9bd4691 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/WebApp.scala @@ -0,0 +1,19 @@ +package org.danielholmes.coc.baseanalyser.web + +import akka.actor.{ActorSystem, Props} +import akka.io.IO +import akka.pattern.ask +import akka.util.Timeout +import spray.can.Http +import spray.servlet.WebBoot + +import scala.concurrent.duration._ + +trait WebApp { + implicit val system = ActorSystem("WebApp") + val apiActor = system.actorOf(Props[WebAppServiceActor], "webAppActor") +} + +class WebAppServlet extends WebBoot with WebApp { + override val serviceActor = apiActor +} diff --git a/src/main/scala/org/danielholmes/coc/baseanalyser/web/WebAppServiceActor.scala b/src/main/scala/org/danielholmes/coc/baseanalyser/web/WebAppServiceActor.scala new file mode 100644 index 0000000..03fe305 --- /dev/null +++ b/src/main/scala/org/danielholmes/coc/baseanalyser/web/WebAppServiceActor.scala @@ -0,0 +1,224 @@ +package org.danielholmes.coc.baseanalyser.web + +import java.time.Duration + +import akka.actor.{Actor, ActorContext} +import org.danielholmes.coc.baseanalyser.Services +import spray.routing._ +import spray.http._ +import MediaTypes._ +import akka.util.Timeout + +import scala.concurrent.duration._ +import spray.httpx.SprayJsonSupport._ +import spray.json._ +import ViewModelProtocol._ +import com.google.common.net.UrlEscapers +import org.danielholmes.coc.baseanalyser.analysis.AnalysisReport +import org.danielholmes.coc.baseanalyser.gameconnection.ClanSeekerProtocol.{ClanDetails, PlayerSummary} +import org.danielholmes.coc.baseanalyser.model.Layout.Layout +import org.danielholmes.coc.baseanalyser.model.{Layout, Tile} +import org.danielholmes.coc.baseanalyser.util.GameConnectionNotAvailableException +import spray.util.LoggingContext + +class WebAppServiceActor extends Actor with HttpService with Services { + def actorRefFactory: ActorContext = context + + def receive: Actor.Receive = runRoute(route) + + implicit val timeout = Timeout(120.seconds) + + override def timeoutRoute: Route = complete(StatusCodes.InternalServerError, "Took too long") + + implicit def exceptionHandler(implicit log: LoggingContext): ExceptionHandler = + ExceptionHandler { + case g: GameConnectionNotAvailableException => + errorPage( + StatusCodes.ServiceUnavailable, + "Connection to Game Servers not available", + """We're currently using a third party service for this which can be unreliable. + | It's usually only temporary though and worth trying again shortly""".stripMargin + ) + case e: Exception => + respondWithMediaType(`application/json`) { + requestUri { uri => + log.error(e, uri.toString + " - " + e.getMessage) + complete(StatusCodes.InternalServerError, viewModelMapper.exception(uri, e)) + } + } + } + + implicit def rejectionHandler(implicit log: LoggingContext): RejectionHandler = + RejectionHandler { + case Nil => notFoundPage("Page doesn't exist") + } + + private def generatePlayerAnalysisUrl(clanCode: String, player: PlayerSummary, layout: Layout) = { + val escape = (part: String) => UrlEscapers.urlPathSegmentEscaper().escape(part) + s"/clans/${escape(clanCode)}/players/${escape(player.avatar.currentHomeId.toString)}/${layout.toString}" + } + + private def generatePlayerAnalysisSummaryUrl(clanCode: String, player: PlayerSummary, layout: Layout) = { + val escape = (part: String) => UrlEscapers.urlPathSegmentEscaper().escape(part) + s"/clans/${escape(clanCode)}/players/${escape(player.avatar.currentHomeId.toString)}/${layout.toString}/summary" + } + + private def notFoundPage(message: String) = { + errorPage(StatusCodes.NotFound, "Not Found", message) + } + + private def errorPage(status: StatusCode, title: String, message: String) = { + respondWithMediaType(`text/html`) { + complete( + status, + mustacheRenderer.render("web/error.mustache", Map("title" -> title, "message" -> message)) + ) + } + } + + private def getClanByCode(code: String)(handler: (ClanDetails) => Route): Route = { + get { + permittedClans.find(_.code == code) + .map(clan => + gameConnection.getClanDetails(clan.id) + .getOrElse(throw new GameConnectionNotAvailableException) + ) + .map(handler) + .getOrElse(notFoundPage(s"Clan with code $code not found")) + } + } + + val route: Route = + handleExceptions(exceptionHandler) { + handleRejections(rejectionHandler) { + compressResponse() { + respondWithMediaType(`text/html`) { + pathSingleSlash { + getFromResource("web/index.html") + } ~ + path("clans" / Segment) { (clanCode) => + getClanByCode(clanCode) { + (clanDetails) => + complete( + mustacheRenderer.render( + "web/clan.mustache", + Map( + "name" -> clanDetails.name, + "bulkAnalysisUrl" -> s"/clans/$clanCode/war-bases", + "players" -> clanDetails.players + .toSeq + .sortBy(_.avatar.userName.toLowerCase) + .map(p => Map( + "ign" -> p.avatar.userName, + "warAnalysisUrl" -> generatePlayerAnalysisUrl(clanCode, p, Layout.War), + "homeAnalysisUrl" -> generatePlayerAnalysisUrl(clanCode, p, Layout.Home) + )) + ) + ) + ) + } + } ~ + path("clans" / Segment / "war-bases") { clanCode => + getClanByCode(clanCode) { + (clanDetails) => + complete( + mustacheRenderer.render( + "web/war-bases.mustache", + Map( + "name" -> clanDetails.name, + "players" -> clanDetails.players + .map(p => Map( + "id" -> p.avatar.currentHomeId, + "ign" -> p.avatar.userName, + "analysisUrl" -> generatePlayerAnalysisUrl(clanCode, p, Layout.War), + "analysisSummaryUrl" -> generatePlayerAnalysisSummaryUrl(clanCode, p, Layout.War) + )) + ) + ) + ) + } + } ~ + path("clans" / Segment / "players" / LongNumber / Segment) { (clanCode, playerId, layoutName) => + get { + facades.getVillageAnalysis(clanCode, playerId, layoutName) + .map({ + case (clan, report, village, player, layout, connectionDuration) => + report.map(analysis => + complete( + mustacheRenderer.render( + "web/base-analysis.mustache", + viewModelMapper.baseAnalysis( + clan, + player, + layout, + analysis, + connectionDuration + ) + ) + ) + ) + .getOrElse( + complete( + mustacheRenderer.render( + "web/base-analysis.mustache", + viewModelMapper.baseAnalysisError( + clan, + player, + layout, + village, + connectionDuration, + s"""${player.avatar.userName} village can't be analysed - currently only supporting + |TH${villageAnalyser.minTownHallLevel.toInt}-${villageAnalyser.maxTownHallLevel.toInt}""".stripMargin + ) + ) + ) + ) + }) + .recover(notFoundPage) + .get + } + } + } ~ + path("sys" / "exception") { + get { + complete { + println("Exception on purpose") + throw new RuntimeException("Some exception happened") + } + } + } ~ + path("sys" / "timeout") { ctx => + println("Provoking Timeout") + // we simply let the request drop to provoke a timeout + } ~ + respondWithMediaType(`application/json`) { + path("clans" / Segment / "players" / LongNumber / Segment / "summary") { (clanCode, playerId, layoutName) => + get { + facades.getVillageAnalysis(clanCode, playerId, layoutName) + .map({ + case (clan, report, village, player, layout, connectionDuration) => + report + .map(analysis => + complete(viewModelMapper.analysisSummary( + player.avatar.userName, + analysis, + connectionDuration + )) + ) + .getOrElse( + complete( + StatusCodes.BadRequest, + s""""${player.avatar.userName} village can't be analysed - currently only supporting + |TH${villageAnalyser.minTownHallLevel.toInt}-${villageAnalyser.maxTownHallLevel.toInt}"""".stripMargin + ) + ) + }) + .recover(message => complete(StatusCodes.NotFound, message.toJson.compactPrint)) + .get + } + } + } + } + } + } +} diff --git a/src/main/webapp/.ebextensions/01_gzip_httpd.config b/src/main/webapp/.ebextensions/01_gzip_httpd.config new file mode 100644 index 0000000..6a10870 --- /dev/null +++ b/src/main/webapp/.ebextensions/01_gzip_httpd.config @@ -0,0 +1,5 @@ +container_commands: + 01_gzip_httpd: + command: "cp .ebextensions/enable_mod_deflate.conf /etc/httpd/conf.d" + 02_gzip_httpd: + command: "/etc/init.d/httpd reload" \ No newline at end of file diff --git a/src/main/webapp/.ebextensions/enable_mod_deflate.conf b/src/main/webapp/.ebextensions/enable_mod_deflate.conf new file mode 100644 index 0000000..a5eb923 --- /dev/null +++ b/src/main/webapp/.ebextensions/enable_mod_deflate.conf @@ -0,0 +1,29 @@ +# Restrict compression to these MIME types +AddOutputFilterByType DEFLATE text/plain +AddOutputFilterByType DEFLATE text/html +AddOutputFilterByType DEFLATE text/xml +AddOutputFilterByType DEFLATE text/css +AddOutputFilterByType DEFLATE application/json +AddOutputFilterByType DEFLATE application/xml +AddOutputFilterByType DEFLATE application/xhtml+xml +AddOutputFilterByType DEFLATE application/rss+xml +AddOutputFilterByType DEFLATE application/javascript +AddOutputFilterByType DEFLATE application/x-javascript +AddOutputFilterByType DEFLATE image/png +AddOutputFilterByType DEFLATE image/gif +AddOutputFilterByType DEFLATE image/jpeg + +# Level of compression (Highest 9 - Lowest 1) +DeflateCompressionLevel 9 + +# Netscape 4.x has some problems. +BrowserMatch ^Mozilla/4 gzip-only-text/html + +# Netscape 4.06-4.08 have some more problems +BrowserMatch ^Mozilla/4\.0[678] no-gzip + +# MSIE masquerades as Netscape, but it is fine +BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html + +# Make sure proxies don't deliver the wrong content +Header append Vary User-Agent env=!dont-vary \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..3e98f30 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,32 @@ + + + + spray.servlet.Initializer + + + + SprayConnectorServlet + spray.servlet.Servlet30ConnectorServlet + true + + + + default + /js/* + + + + default + /css/* + + + + default + /images/* + + + + SprayConnectorServlet + /* + + \ No newline at end of file diff --git a/src/main/webapp/css/base-analysis.css b/src/main/webapp/css/base-analysis.css new file mode 100644 index 0000000..7fbdaba --- /dev/null +++ b/src/main/webapp/css/base-analysis.css @@ -0,0 +1,25 @@ +.panel .glyphicon-ok-sign { + color: #55bb55; +} +.panel .glyphicon-remove-sign { + color: #dd4444; +} +.panel .do-show { + display: none; + float: right; + color: #dd4444; + font-size: 12px; +} +.panel.failed .do-show { + display: block; +} +.panel.failed.active .do-show { + display: none; +} + +.panel .panel-heading { + cursor: pointer; +} +.panel .panel-heading:hover a { + text-decoration: underline; +} \ No newline at end of file diff --git a/src/main/webapp/css/main.css b/src/main/webapp/css/main.css new file mode 100644 index 0000000..e63f12a --- /dev/null +++ b/src/main/webapp/css/main.css @@ -0,0 +1,3 @@ +h1 { + font-size: 24px; +} \ No newline at end of file diff --git a/src/main/webapp/images/buildings-sprite.png b/src/main/webapp/images/buildings-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..36308e09f86646e66cddeea906e50f1b205c3061 GIT binary patch literal 251541 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%0DCXa)X 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 z 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%0Adi$3w*rpo!cHc#!ttKn7!G| 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

e70S{7neW;n^Nqz-ftU>GG(2!@8 zq$!f}dD8Hv3$i>hqF`<6@9{YY&o=pewRM%RE1MBOgOSMaIS%|Hh)SJ#8ZZNt(MRu$ zEkT^>!tkZ7i~U(RfqVMaB5f70TxU|rU?(K{%8Bg4s((4%2ZCT z*9kGZJ^JCK{vj|H`^bB&T9>04L9NqGPj7jOcUKU&dQyL#``y+bHeUUM!2jWO$>j}- zA_zf}wrs%TvD$r;VyS99!)l-(OH5{ZNVZolsgdl9SSSkgBedYf)Q?ypBkgq3?$WLB z{s(Zch71@^Xv2d)_CYH`|B2?k`gr7ziy2!K(`vNnSR)1$t&!B6msjsK0z4FAmTNH9RZotjG zfSL3}p}-3QXJ^JQE48LmQ=0f#$Ofw%X^M;wy9!YFUW=$IX*vco!wdvLaI3tRD-7$@ zJQU76m&IB?%L`{(TSHBuQG-$P&g36q)Ny~+2<0=c@n0u8P4`BH1? z)KoMciZ92th)jz4*Lr%^0uU1Jy|*wDH6^{2`~7#U1v@*NbTMSpWb`2+s9EleztwmY zm8%GU-!&(0xufw8S+#SOpiI2i>t;`%antU(IV&WwmPX-?4>^rS%tV5l+_R7!=;`cg z9_YW=-+P#W^}uzpqFx`P?Ckbyc86L&1fIdu6W+W|uhZ%D=MvdSF!9_T0&4n(9~QEI z68JxivKc~DND%Fz(fX{z=P8o`ULXfvk#%@@5XW!@w8`vG7tjwyK-+M3Ip7&p3caWDMwXo=K0m%8W5Y`umLX zX9wzJ11H+5dw$}yu#v#{XaK&4X&SB%ZRkJbThp#GusQ|;3$+9NU46~Ze*T)GvL>Wg zm&@^))fJ<5GY8Fn!{GJVmSe4@jPOPDnNuFnW{otBM;zkcpUO6MRD5g=kJrJICukc% zT$>Lb;I%#AaGIiuuxo8%7G?V-=QsLspE4MBej{$SY{d9fO%+G^r&rn@MN1 zxP6W%LDSHNpial~V;3%@nqC`6;1iS;tgC$CXjfg8H<6iG4#QVgy=OS#gCkR6NHv9G z>Q6U5OlvN*Hf7@@2pl;0k|$*y$v!LHdp{to$&4FU=4Ph~w#_56UdHafR?}Ll71GgY zDEro!K`xWxzOAjM;cR2`-s}U<&wxJeWhwUbT%q7j&U#&rf*)?{m-5k)lW`3?>{}6L ztG^i*IMDy{9hSqK!je6^Sk!OFa@*%G^?`4_eKlb`_uj6^Rwdj{6)8 zIYGK9mh+6pL!m%@J%Ye_Ff*+#J{C()>#7+JkhG%%MQ~_$iuh)E1_9RjfD|j+g z*!S`pB5fYHSN8J2v8qf)#AzKRKo!7m9Drq8%flP)u1l2C4)Jh4+evDXz6YBxDwSJW)i{t^tow{;@pg5XruUHz7&d|j6!LT(3WwkL<>uU1^TZo@NTsL4Y*PZ z?{?Ysehg`k%c^+Gk`}Mi$Qi?MY43y6 z@3O4eJGY_!FjtDtx8}#MZA3tqq@~dNm}BI4UA0@PEN8^ME6I1K?t?#l%DP?5a7oaY z@1k|3DS}TOGk>!SJ=c)^o3Td)#`Ev z!=AOajy7daHZl))^$+oobzOG#hl`63Wuf3)n9vuO42a?Dh;KAiTbmj`dv-KErGH>g z0cbbc6{wBu3j9CD&n^gjX~*O7(IFauMbj)h83~*U!EW!8{7qeDVvUTaPKA6lIBUVF zTnNTk=-T57c{HDo3B_V@CZW?QtLkdG{V3=nh9l#mE{F;{FXp1cePc_m=u9+U)IFAe z>$qiXv8de73OfQK{IY>jSRzHH)7Qn)>XhbWXvpEBW6^wXccAOoQF&Y6;=|Ithy{gC zUdP97)197z0vrvoG^tTvy|HoMD@SaQ#L_zKFc5{IU@bWKN=A50ty@vnC|5YjN#I

;-Ah2&FrqsGsfYBFI|7F}2L5-6^|K2C z#Db2`a?RgOMyFChnLwbizTxlcl9zQEOZoZN0<;^@kc)$&v^bM4sw=M;%nSEu?c9CNye`3l|Kp}1R=wfQu$$eyezyKB zf$DU5p3h7;X|Wx3`r%53{Mc>0tfo5$DL#XNBKe@3p=~_RFl2B&{Dqm=2sIv;OS@rC zYMmekp}APGLQj|czMQf~&QCZ&6HSw8SenBbqwS=Vakpx)lBTOmw);F~GHH!eQq7bg z?4p1SNw{Qer@1-CMLSC{D<}{wHy&5+s8T4DvKr;FYPwWm)@#JHQ#S+q?6$eE%WdT@ ze9CfWPj>CK#x`l$@jI$gN|o`3Y8;heq|?jd2Jg)uUms?uDJKAHNpqnz#Bu)4v|n!<_&@{1}UZ`td^zEY#){(qaa|WraH*^QwCuI?M## zkAc9Vj-$T6I>yl%JT#n_a+~Wqj z9SVlzIJGVFtyk;ykXXp^IiaYlXf%pm1b(z|oC7Cl0~cdS1CdGC?Et#q z4JPbP6QYnx+BlBmb7mvpDj^gFUF#)YPq% z{x&sOeOI?xTEbe??A1;s83w@Rw$o0BEBJ#6`?N(R`}K(e{Hi%vQgeoKYmHtuIqSAF z^c)Mtdv1YAx8lZhpsPW;s|nyIl~#WlAj^8S7`<{tR2H7)A!t53u}%l0Mq}->&&nVG zRY{Z>3{y)>Z$5wQFdMM+=qM*_>$uunW?p}8CUAUPSJc4)>~xcG+cq5BRx4^G6$GH` z>K6eWe}4YdH`6-;hk3yj#(~2^tbG`2dlOt5n%h0`<;MG^|4bKJDy7EW<|akv@x zJ6-^m&+77BqQQHAof)W-0RUw!@AC3+u(&=hwO1Vk(@DdBJ&u?O8UM9q1{*^Vl!@c9u9u!f?>B zTXEF1!%@&w-s+%Og-WZa17ach+www=TRrWiKiH&#D^u)hbn}}QCD2S{Oxy7e3`UDZ zS#1+Z2Fp2jM765tnQ5MtiP6G2JST4m< z!L$jq!e&2+F5@M_STqfnq0Jcjv*Ac8?Di^5-hnby9KErG5f$y`&s)9vloUh`e0iO) zdSr9@hMF8tMNGSa5>v z63a=7p;wg+TD>R1Xk6czgt9hL-k%4USBn`lm7=8y4(tXw82fhXp-yKsN}zHe!(Z(5 z>bW(j7E%UnZk~(XeA`z?g8b$T!vs<3l_F!FuY2U}H}0*GRA=M|^| z59{=kH-GZZ+!T&!Nh5ZE&#=MB!u>`RdGdoJvk*j&c!nW*{tuSNpbv$jeSW{sf7U-4 zJ>&4#F6N8pX7T~Y;Q8|zgQ^Dn=?VfPGu!W9_-y270nY;c(2l_WjaR$LCj`N59A`pc z9~?**V!}`yBeW=TAj1)LSu|kCcM=4J9hiMTC$dn2P4ssOSxT%L>FcKvKD z7hEtdwn?NCx9gr3dT|Uj>P^TmD{Q#`frba_F2AL2-|m9= zYl>XXf~Zuukb|F!13h-x=KC!wmC87W$l;%ZJ@)R8kGx|-i76w3;^=`sL#0`3zW&LZ zk4(*-!Qf-Wk^dyGBsFdG`3yx5krae8Q(?w`b~KerjYY`tLk}HO!bt}y%t`{(XY0^c zyemMduiFv$U!|~qV()xfn+U=%J`e1?JMZjaZ(9g>h=<%HQfxuHAUzq_qB#iZB}l=q zA*8ib1BwlJvJ`BK^-y{Ub)g1I5ost$PoBIBegQv#Gp$Kmp@ei6Nl1RlA(!VN`|sKL z^X|@txio_}6Kcf}F3_E-4F}(%$juA!9nTN#iQe&Ytdg~<96DV$kfi@CD<2_eawh2tEn90>E z{#Ihv<{swzTDu)X@WRRM?I^hQrDTqyuZA(N1mM5iYneIew9!~!J~XfLs(rPK;nY8z zJY@lp#1(>_)yDea(a+y+I)Yz`2Vex-SEqo8n3)W4bYknI*x<+d ztj-Wl_|2-2OvD+4AF9W5TI-+`XkV+LT&o?BJX>2@O-(6bduwm)Ma{li46rAPJaBj@A_61<+xTykNdEtN$g*;CkIyKuU-Eg-3{=fYAzt7^T7t`B=IRUtPKlD(zCB>D=YQgmaW?> z7Hp01RJ)ZBI_Yz@pis2@6)^GW##N?ZQ0}wzv(e0CS1`1pJ?6gy zfOE?wHF6Wm*8$o2C;|q)aG__XP;eMb=c4J5b>wq&u(){eTnUmuPl1>7&IO}5+CJu* zKu9eIzv^eqzyU~-(2`ilq?l^KUf`ME5CAMP9g0002k*@FWC00000Aph4!P*qh`RaI40RaI40RaI40RaI40RaI40RaI40 zRaMxvm(Zr+0FLANi>;4a#TX+#+9KiuA60Oos{<+Mrb|m|v=k-PSjt*vy5v%D2tGi) zh!yeR0~MX_p|zm)v5MBB$f$a-f>e)Q1P?h0ITim&tIpTK{QqE)|M#-nXX#jf{F{bE zA|b~HIjSA&?>gY3NF)+zQZ5JWSPHPM-$51=6d4(L?}-44L?V&C=DJPO4qC*d389Rm z7YEeqdFiQEJummM6p2J4HDjMXeR_6oDUW5b0N0VHi^U*7hWb4tYpQaiam&-yOOZ&V ze-L{Rw422^=!GXWK3T-^sgMoj^K;{|q&vzYN}ZmUYpMlBRl}ZDrrX4Yp z`rl(k7MIk$H-gXFzna5kMaGwf*!Hqq9T~^jxG@ZiGa(!5_|fjntmhC@+_VcIQB!jh z)is4Mv{paaKnCmg4IYNs+7H8dT|jXwlkA@XRyBx zzXTEuI1B@AhvB>~5LQ*ElfkuD5L5767nf8a7QDIUo6Chl#~buLlTM)wO4p8LU4J!(iKCIIn9# zSV?;4yC^I%Va4mkbHuXEN`_UhHwKU;z(~>|WP2mZryjI{X=XL7r{+IY5CxB9T}%We^*-90N8m*vDX^ zU;r?>abRDH#R8oMrr0SA*^g<4#j_Y5f;=us4<=c-is6KM!$R2sNtbtHZHK;$Ma!jErkK=-f>EYSOcI+phpPqOkaUmV^IoS<5o+x z#Ovh~e$)qe7#4_4YusPwC{_U0siR30@Z}Wo8oto1Xh-H*W2-V;C$Ua8&cnmSwI7aTj8$ z)2ZA!rPbhz+!bX+gs;Sfs32tCjzK90-_#Q>QM60}v78D*D`8l$U@9vvuzFefH)pqBn-)yt)<#g*a8#nwHiuU0;vbz8MEKUu|McB3VW`NGbb#EpkAaM(XG-+QF$2si8jh(h?WhYSA3C@x@ zNpW4rNtYT(4N*tAm2wFLLV!RZA(c&hKs-*%Em5cY2(Q#H>-y{K*3U2h_j#N?{z%s! zVraCUx)pURd2PoNw^`15L0^ac@EdG8e2&HP#6vAjU@Y5Cn(s+1qFm;?;5nCssX>mJ*C z|71CuV_Di7_xlCA99@4CgH0)y_cYwmlow9F7tJKC7C%6$JN&sV%|t3o*LZW`^H26Klk2PmVSZD#HrL5Ye)H#?i@I= z?4jpnfW2c_=JNe5C)fzfWU%-D{XX=P2RP}DpZZ#3RZkYtoCu`D-C zItm4q-C#k3ThigusWr)^b;$Q@>BsK<3k$?0YucQ3e^b|X zH)6!7E2`O@9Uz9xZ(`t{dbFJDzRF;=A+2U_k3DyvzwPAZ529|b^-nM`*Q2&zIQGHn zx$s~1SWLZl@XOxi4|?BU@{i}_BgboN(!2AA4*8D%kjcE3PA`mwQa!!zzu)uG)dSo9 zUodzPlJiVzb?u8YGhE53JD=EkJ+}-d^EH~8pKna}o^lRaPNb_=O#Y6#SU8bfWZB=x z(fZQT{AXVrs$p2sdB=$;S>WSR@!h2#j2`~YrH9(Kn)&9a_z!nI_RCWxW{F;h*_8Jx zTY4|r9(T~DscDvB=vil@s4L}irLuQR2i1fpfFLZ+F!LKMG@F~7Yx_ng0Ndm^W1_qLgmU#@(h^G0v@h*mJmd z`Ss=Rf4bV~P^7Ql8ktYgBj+7Ea{SPmG(MM}tStBRT>bsky*<5$|34OPyF(X}oJ1cw z`?)hHRxU!s(ucMxht6R^NJ`?n)OtSROI<@-Jz?(VQ}fHKthj+da1<1S zmHHD)_KcUyYJ+7lb9c686NzZdzN76R5)D#+6T>T&IlFS8V0jSfF3&Bn`D-IUjJSze6JQ{I=-@YIz|5&|N3iS zqB9FqTyM|v)tdIeQ83nj{ZGz7UJ&>s&!P;5WpG@Sb-h&T>f76N9k&6iKVKJ;JjWIp z(#S{4$x=!08-#kYG_O$^8eyyR>nOUo%#mn*tAEj~zg}O8(>RN!;IM>J7)JPU=l-^> zDOsp96wR_YOR+z&-0QQLpY3W^rBHweA3Ug)kz#G6*0UzzY+U>SrnI%df~u(60r>Qe zW{P>wK~2q0fn&S`J#vhq87S&#U_ntEVtCNfOy~Zfs+CpSf^~+#eq-^`(FFzer6P)U zz$|Q!t57IwWkt&!JGT1SDpy-))q2%e@<{vh6Rd*%fw|w$3s$V7S+2 zLt>t^t6*GW4q?{CKy8R&W)8_InsT6AumysMEw@=P>O>s2h0z3(m>#XRR}I+eAFvLX zQfSej4ZOI3IFLR6eybnu?fn45UVs1lg8E|4m15=(U3wmY`Kk2{`lqAl{PO$XYgh5_ z_rCweb^mQ)wG9dRd_I|BMV2Hn9G8m4BAg0$w>23+wm;O@*)mYC=lNtZlgZ#1O!t<* zc&b>0yw-n5y}6f#9W9oDy3xIwUmaoJjjy9{lHlqC+gjS1+*to917GHs;;ba$I7>uO zxYJP-C9zW19sT`HO1Zyfpif{ZR+1%LWJ|`rGAJ5B^@rLzJ1tFg=-_tNzzd2KJvP6( zT4O~vd2DrgEfcUSV3{%`5ZAqC9Rn;VS@@!bX)l3_1hHP!Vid%nz$%-b7FrI#wh9_( zPHQCy><e+lFzf%Ln6qKB%bx=m@kip5{SW`R8YF2@7Q#fcb$0|2iwgzkd zPb>xlma@~Ksbv$aOWJMrY!)sMW(sOS<2J+)im%IN3@Mj$Y5`h*wyCTQd4Bu97f#NB zWOum=+W2I9BGH=qGYl+~C}=LtRdB^(Q!%?k{a0gk9{uR>;a=P~`%`XZrR2uqBj=ql z;wMA%>r8*hjbhZ%Z@WM5>FN3K>b?JIVRh=@DSR>fX!MHvQKhx4g* zmL&Q8quKVcgbInNyVKls@B)Kn&6cx&V~L?76WR9Bgri(`A^n>+89bAUVnY;gU#kl9 ziNA?~7;E2^NWiGDymPX>`VD)>W{+58TXz)-uJLL$JQ~C>0~Y!nM#dcD*B1)A60v9^ zYb)RPuh(~0?Jy`yLTjI|$XEzc@{fc_5JbGO!2l8Rd5H-5V$b28-fyp4+P>|-yNu&t z9u}Xh^OUU1P>6C-@6*LnUFd2~45xVUOg+zm{DgXv5=+LQaOJbLqeY1qcmloE(#&IA zPA5l^Sp3l0m!3z{xRi;k}eE3wXfSbj#;EKB^^$uGC}iPhSTBLij$;| zkTU&Eu~^<=R?KqI#4 z_pZWGhS&dK)oNJ89iEs7S6y0nv15lBk0!>VyVUetZYDy}^KgwA#jfw`#U;!W8jZRq z9je@6Gs7Avja}%-iD}ik!9wGIu>7IXsj*njHtxK7GuB|ub3qx2Wi@rCV#mPx%?iuM%Y$4TSZq-ouCANRsi%$x$x>In7V_30Pn*tK01j2FG3?e6=^;_`dY^CoS9l zvunp-m!33yC44z_>rfYT+l>=kUy3G40zlvob0sAzKvTUQMS(=F)@qrj(j;qA(1Eyx{7rYss znq#}QR%|87^SUmJ(uN>7+82stCp@uNtXG+OR^p;+bz;ogp(M<)C1h&$M5`i6IQ=2 zlz8w}sjqMMCC)ymL+D<0Id|X6LjutSUjK5x`4ZgcMj77lRes+-XIDuUsm9ci;y4^f ziFjtHi8J9|FPh;bmVFl^NfgKN21=A9iq*f;No;UO6HdN_Akk9Y33CMJKAMLXn{GID z_?k=+k|0LzYi5SoPexFouIq4S=4md^#bJnjNMb2U(!b2dn_zWLPK-g(l592jbjt-W(PN>h0~YZ+Yo-;cG+33ZKU`kf zjAc1joJA)c3w{K8RrX*oh=#xnus{qxVkQQYg|e;c4%ja6E-$-J-7NR5xNmZ)3nA2Y z!D!Iy4-tNVd4Pr)P){HlOFSP6RUM9O7`tTKCc;{bU^T`^ezro)%mf2oH$k|)ZjT=W z1rlyNfn3*fbtUAV|KyX8-}&z*tldJ=@RjhTaM~r{82wHtM7_BCq#+@h6pW8AhfQaX zeMy?;^U1uB+&An5J;*HH$VU{6n0OIo@_Ez3+P;_d`Uza-8HplMk%d}juwyb#Qk=6( z#v<{&-eS60RIHG`2$2y4eR$t61goT==j-)-w+_R2fPoWcvfgk02{S9{^AS9-N?e8) zc$yLk5bBk!7-&n%#(2O>{3;H~ArX=I2 z2(qEZciLbUXV7xFndwe5k{Jt6wIVPH$T@7;xrJ$pqEJ*cwv}i_9167XG`oFHOq&r_ ze?0!;vd#4;7WxNERg8Uo&@=n_@Q%%db>la94W9^k6%Z+6&$hM(eIB<5Bt!W8Gjk1= z=9ut>1ItH`cs3K(;QODG7qt5b^{4N5P6Y!%fq2z`8N%|8#$prJn8z2Zy2<&yo4iuI z{q`c7qI~g>4lhP#V(FRb>1nSU54gQvI1s*;P`^*bR~SE$`uLNNKl$%Ihh^C<#A0Ne7Y18Q%Wro{#E6KW$_x93jcKS3@k+S;)}cND z4xJRr2}9;ZD&L7l2tP^ZjdNulW}%EoQ^aL#N#H4rLNmhPcGC%KYVvxQqBtB51VI+y z8YNj|p#a-=BF4B68sF)PIbmH94#(`fj42^>#R{%hN+lx~L1tS(5J$No1_VjZ++#{u z!Ej(^5*qI|SD~yFG@X}aP!>kDBX+y0D8O16w~7^0!h*hwH;`3wS%=GEb08U5EXvaO zn>+1@s=`d6I}l9IRZJZTX(~$h%NV?*W>kiJrIln3t77(_a1oP<2i!Px;@^LH`~?A?|(;ze6g?sy6N_B|{P@xJ!)C!c)sAASz&lxsvNUyd#HHDm=#W;p>eh@Q{a`}ixG>J?qX z3tjn)4Dm{L!Vpac%TP4K$UK*a?{R7~?-P=EiNr9!BtTOQ_9TlE8o_9(C{q~C3-!It zNcq;{ohUTx39b&A5i}#zxwr_SGDA^J1~g_d&uY89Sn(1ViSmGg#q)dyrFbC^EH;zR z?*^7xVNFgwUv>P--nqoKv6f*NOHR_n3oDUhf+b?LN(&*1XsJj;b3|#7ASi_%iG#ud z1hfb?Aht+s=6=8VhKs zk?y;_^LMSz;{r%+RRU_hcxAcw%H1Xyw6v%8R-2u$B#A*#X`nl5_5Sa5=k=`>GXUcy z@9JGXcV`rSxQrjibG4eS8Ww2bA!%kKlsE@wDxF`<}2LArJP-;uWk4Ob_U( zl&%9|3RA6VIgJ8jfFflS3R^cTmKLOgD=Vgwj2HF_lPx9jZR3^q8Wh2SVatNo+sg)& z%-;Jmfn*?`$`&SC(rTYrS}$1sbSWBSX3htLy#SP4 zMSt%KbS&aTs0TJ+4K{P7xZ3kcTYB%4q!2Cy`!_-xR{;#U6hPkE%y<;e@-BD=@9gI2 zbgf|vrj8*-3NevLG$^dzy^~A(^_Bc)Dy7gU%zBP`8iS2STC3GQYA>+M63xUS!Ke_s zvdi|3>T~h6Ou$$Q2?Gn2++eNY2VlMRcAH;eWkq_|57OK8ySn{a_vrI@e60{qM+KpK zA-(;9MvuQdd;e6g?ASIDJfH|DDurSj(a>tIe|Hqn=|=BhgQ3uMY|&&( zmre%5r@r`nag7CY#^A*}nsE2rOd>2X3_~-F6rNdnSD2POvuITYU@2wwM8@AR14$*I zP_oR+A};RyeD2%Drx)*E`}-ds-CP~L^sPT{kg`aUJT)!SBEo|lEsZ_u-AEh^XYo11<=3iZX>zy`3iZCH57>dP&ncjw{ zdsL4HW7 z`QBwScjxN)kPv?QlZ%acEV+2PS9VNo&zWTmMJT`%)UVLh-NxNzh6*!$&$)!qQv{0jL`e%KQHtr!Z;$O87Z*=r=nsK9jaDQkrJ?E zG97)#Nr9bxb86~+E))zFKua$Fe21hSe)Imtzkm1ch0&YkU#t-TEK#IJy3T&~muWdl821WY&kB#GH9_77;Aa8 zIB4YqM_L^%zA;P-Mq|NXEW#8QU>dWswOsPRrk)8xSqHe#Q(UoqYWxi*6o~?4W+GAz zv<5eKM*}se_e7+ezq?V}ZAj@i9k%15VKXxloVeSy3SfPMcl-M8-CI7NDDL(Z8@qm* znQF898BQ`73ze*;jUtSXL!BF%kJhm0xxSvhqNkzP`I7DAz8xb(F(g5^&~Ht(--Vg` zb4{)Or_dd&v7}gb*+?kHCsq8qRc1nB=erjMdi>T1+dQPx&|(PA+*$4(9nJAPj$X$D z=A`o!2YEehY6wLkRTL+M(MuPvLE|wzFc1xfSC_OuJc$StRjpPj4iRuXG=9ombF{tf zeN|cEz+_Q`B9j43y?^Q6)zadh{X{tlnWDUSQRM&suH<*#P+6*^HxCeky@LD=81w!; z1-sR9FXDaNBxYiiu?5*>J`a|oskN8I#KPxW4{Qj-N);A}rDikv?1e28N=_LlZcn!E zhaI4$ZKGC<^`(BZxDC$gSS7+O)5Is9I)aB#RIE~6Y`(ktZ&%NiYvp4{I zga-3fC8;XMQ@*aD@%MGwxX_{M+^@>KD9SQPJbm<(6R$1A*DihYnktjPEAhwQER!8? zd)?PNivR_~>cy=TtRaUBO~y=)n0p^@8CV9(VVuZmD=VqJ5~T#T_6p!Y2r}@SFSJaV zHw=^DjEaE~9A;*8_)P$E%oJf3T8GS8*f#t5Oi6`QjtHdU$z&h}GYR`j_G7JUnHWix zG9?z`;#57ZG_`)jDSNGHwNI*s%0ywhAvSOo<{MxG9&P4@BKVk9&)S2m?VEO1RSi~} zrs;H|x4D_Gf(5a(b{UVSSgR<|zO)~gW~c{DBt+xZxt;;ggGv~@SIcj;^gOrYslAnV z*o{lm3sp+=&l_1&BruUW()wEc@G$=uFbgdK%kY@{`%5#?SY+nhm6-+Wjl{cmVKW1- zYKMn=kWshWhP&ZW_e0YFhTy<*51jV{qt$)y&Tbm_)QX2+DrCXQ*pEvy_V=f!X(kdp z-yiA$b2V7Jvt03LY0x@^j*R|x+g}twER2fuVM-k4N0q}v3s`NfYq8}1K8NK?CI(u8xZc!i8GfA}L-ic& z@5g3lqLHN;AqELp&a=F0mzl4EjT&K-VZ zFI%t=tSODw4)&QC!$hN@rKQl!xk1A}=&3Z);aU#hS17aqESC1L)Im%_q#0@E`=RK3 zuGU?v_%*s%JS6gnDK;q`3o3$Qx^Ve&KhiY98Jou_j zFj#XSsAw$3m=GnLpI=>_?@9EWpC&zNZNBm1v30v@a#YQ&Ub!#>C&TXflZP4Rlv##MIOEU`VNi$ zGm%pj%TuNE5zJf1#m6<9Y3l7qMo%EW#!7I^qnia>X8rE$nVo`w6x%E^lt z?LB0U%MqNWQDQR?jgaWJTAhIb(s`77Xx6D%?fFL@R}r4KJyCa-=dDrsO#-DkK5_M2 zcMlwOJ~trnD9UkS`PWP~P7=}pqQX`}?rhlw$IGb(teON3@5UfbLoi3*rHDQ-bjga6# zzTo2ud!KE&v8S3EHqzl9_8Apb3}iBSpw^q6!{*)>TXscfz=4ST0mhS@XC)8pi}Ub| z-xi5N_H64~9HwF1{yxc-wp1{YdFl|Du+M>3iw=tgFjy-F#EL~DOwQk^!9c_9!((9S zwt;0G1puJ~hK?;svGe^AZE#@~7?Z;_D>%?FEacKP4lF82VJR50vm002#P&^-0;%Rgh~)Nz5By|pCw_29 zffk7A7uObT0_&qu8n=M;SW)Vz`OrkC2WG15rHfj<9{AZuKC+3T=&IlDz5isIr*Isv zD^J!Cl%%g*?d@H-@_mX#s>wyA&Q(#A!h`m1n3JXjAXYu8Bmr3Ux~yhyZa;hWxU9(K z*~cVFr5nZTukXR2S|PIvyN8dGBA$ST;5^#b6jbBssMK!HVQF}XK{%Epc?(!@x=^gcS?A3; zf+R^#B@G{F&sSdOnbD&+qnVg>x)t0JCK6a+%&p{I9WE>dJG({q@dm-N7=dA6YDw9G zm#K*Hz!;~Sq}g(@2=*XGaYovjYXJD=OJOoTN33KyHrsM*?~RgSkaB>)IfM}@Gftr7 z{^7)s%wd_rjTU(|RI=E|66C&C402`)<3Q`+wkU$un~s*o8h|p#V1SAdtkp)Nr{Ot# z1uRIHY=5+j6G`*KMCNYeZ_7sb^kK?)xkg*k) zqpfo&r)jSo7KJboXgzvz#T5%!#||sC(sS0HR#_pGZJ_3nn4%<=&Dq7Z&HdxJW}nY4 z-oJU)j#q2Hj=+#D0>A=f;VMxzGjk6v;$*q>!;idp@sW=NqJuSL1VCy_%u6?{Nz*`_ z1#WRqew_?O1WqY)2*p8#ljG4~EHrHEhB+~sB?N@yC@U>wlXW;=`0Qstd$uzR`-#Vk zjT$q5$KUm~*L=NME1AG_*uC5c#_G350uxSWhcAw)tyZ^(IM!e>OeC%QEgFWp7Z>A` zPA^ALM$5M7trClIgv@CW8paYzimT5mBZQ6-g_f)CXIB8ECIJv-aNwVkB1r6ZM|;-@ zSGqsd8n4dWu(Xn3BAMK3QDw0_K@zt$hJpmKg_DG^+5lMQD==uWcf}I^o<`;s7%X7f zuA`{0fCY<*FikL&K;|W|GA+zuy>eKv=um{AbHzmEHdvxpz;f7QOqgP=lu(wBfd#}$ z7cF2}l-ZZr3Z$0-Wd7}Tw9-lF6e};|;+3+Zz}dmY$4y{?%L+VSTie9!Y0(HG1S8m{ zwJ@W+US%_If(GA?|Ln!{7tcS^IG+Yvll#X zGm5cvEXFa+SsPLvf+DUb2^8f;jweYa0Kj_u49+?)DkLcb4N)}Nh=`uoe00>|@)$m! z!MS~y*FCId3xwi!I-RZ&ifysF?U*1qR%J(g!y~XL&B*V?>v1~wUVlOUd4sM482s$RSHLO9Y9KGr-1JOv^!@Kq-c1+VeuBR5QNoW zP$J>UWSWU8K|!X!my)%GuQ*QC>WGF(v0MgV$wv;0Qvz^ya4}HdZ-%vhSO#8^>E*W^ zry|Cw0j~rEYFKs4VyWBsI=}|4W>z@MVD0=hu+Gsq=>aJlyc$n;UqSJjho(3jK|*tD zYio1mfRYqYAPmKGjDTno&2*m5tFhnXNm0Qdhr}NLa7PwRuviwbo^O+nfBnNcNAc)f zUC#98UhA@Z+nEWKa(gvx+>5!LJ_F_u#+=r2lU$+2KK+=%0-6AKz&n@M(DHkE5VPP% za+%ihI7hqNQ!!YL@C~!WBb*9x$zax;UQ#4Vt+ol@(AbiP7;%jaLuUcQ*g`fC0Ii8B z-DES*YoD_llf^67gvwGJSiW?z*i%#0Og6r$L?UclH?hoO3l_`K33FJbgZ<+&vZ|_5 zw6d7Z9)V#WQbOCnf`^^;0I*(ZX`xU!k;~|Z$6A)d`j~AfPc(sr9s|qNLXZ;bU;7te zW#Imw77_63dSoU+$wr0cViDjB9nvfMP;-+ekryM}hl^8T7qon&tnL-sTVnECGZ;Y-BE_))-YMVECY2U_oFm za9Adom}6j-EHI?jQb#%5f#tCDkJ*K?bJD6iy-EoULt{$1t{)tUL8=Pl#qYL(_VF09 zKC^+#hAIco$9NzXq?)W+fQuC6{oLT7Mr2ah{6YeeF1MYkwJyxeP^3~8kFJroIy;z{ zj2{=>aWPOw`bNWO@S`Vc!Dl!giUe^A2_aR%*xXF+@aR*cN>`DeJ|yeE-g)uY%__>E zWbQNmPy&*IQ^amOo&Vh|`P=}9w)vjNGR4K_UM!Z?O=23S(E8&%Q?0T)a#D>jQ|+fn zxiAE&RuKej8Lq0BT&LK%IuPq(nXHSmPwrzpN^!frAyR#P-z@{Xro(Nh1crH?ZVhu; zz`8%t^j8y8CZT4((B6X7I45GPhRHtH5wJ>nHsy1=yc1?Bg_)Vm*%mO`Ms=ktn8%E>1_x$a4?G^n0 z$IpiePLyG@Xsh!zmCYAYrYDfv$|nO@{?5HO+Z;Bz09UA*C3RnZ2`oc33n~4j!`j~l z$lPjo*bB_fssO)Nz%or1ENKRS)r8-H^;+nUIc!4tx{6sXN91K(ng%yt*Kaq$aKOQ| z%IwysPqRdDuUx~S_4U|>gt43u>t8}4X9lfOR^QS|GTqZi(`=mWU62q-a<)58*Ak)| zAxh+?o7pO1m0XGBCL8$1A%1wMfjYA=${=A&>*UYydT2cqlTZqw){PwimdKk=1-^Ri zJHH2DJ-2{`Ah>@thcMEaQy+*MYjppg@9$6oMGgLaMV4h@>G_LNAQ_9)x%#ux#xzw$ zHaFRbz}|YtY0nl4St`1YLSIn{sGOWccs28*XBW3gMk5v%*A_u)bsm$~*E?U=mo+r+ z)40llF&g&5Z(Oc172e(AbWKc}x~^l~;x*WScBP!x;SmC4iJ}Nr$O0CmOWp}JuUqGI zz;1ofVVhU*h#DRYBSze=F^i*~QXxC$0*nF$jexG-db`6u{9Lg_|B}EdD#vNsn2K?! zY(5DP%};U+yh*OnIBQ4dh*z%b-w$F2Yn{rGvEr)9n%R^RNa;zj(Vgf$*SLJ9-CIeZfc#tKBrp{pyWOyQ9Pnqz^YfP+Yhz({uHbJ;PGFd|N5_36-E5Zt05*meiHjY ztQnZL{@c+Kk5H(;r}$pzz(iJmyeUS1%hw42ksQHrHTgBfvw6?B^zj0WSvH?} z|I}DMrI#kveCh*#ya8LrE@G?_mQ1jO$Pr_1=a9kbi}4FOkfBt{t7i7m7dsvHt;{&M zVvNN^-`J$(uu9p&n0qpw%IGOmP3hM@+1ci>dy(Fys3ZyG$QUMb7z<`QlT|V+d2_-w zf9C4@YW%`(f*yCArec91gdp#lw%YUpBT3Qk2U!*1SI|@X!h#3) zFElU?1)xc|6m`O5cCwa$AhGEXBFiC03LfmM8B?YRIdJL8Hx5z4zw8%D%7P=3Zfc#x zJ~sk!2{Q?vM>7NjYjo1Rwib-@i{C&lHSLzHs4jG{b;VLuEg#Cn9O zlG_ z-+KR}Eq6y(r^B9<8^bhBB-mk*2tZ42Vxt6Hz&QmQua5Gra;OrMlUClRtjgZ zG7G?(V9m_t%I{2w%rwn_{+mZP-*=|XX1e6M48Woh((6_UQpQXG*6hPa`AIkIO_WX- zYw*rXhaHAm%N>idGKp${Qjw4ikDSS5u5H#mSHHVlxtQbIYl1WxAP zfCWk6-~tx69G25kvmxc01T74m#*ZDArmht9!jUWL^Y+pX<6H zpplq>@;n+$YmrDKDpipZ%hU6XqEL+jxB>*Gew`~gTJe+&pmbF(W5*zIpK1`@)~-< z>+CqwW>0DY8v$am!)`D57*@n<7qTDtV@jEtaD&>|&8_T|6Qt~6bo@gbX+^|D!q8Yy zoT{YanLlo+DRXiRQ!{&)_U`mKJ014mcey_p3rZ+CGVEDVNCK#rx$wuz7zE|UDLlLi z2acCP>+}nR<$@7uR^(BEWpPRtb1QHn`_UZRyWBg!I~b;mMgQ`U#RXex04!4#L($tb zWw|1QH48wjFC8+T+QK}RZvx8+YBr=?li;veijnpi27sli#xbyvgKrFa2uLsW8%~?- z8x~L`GL7)yWTG%1rfEhKSYJ9sa=DsE2r@VwzJA7WiVT1ugud%tC;|?P!a*u3F~?fE zUdc6TT8)-DR7%s)fi&%g&3v*J5_=c;B2*?p3y7s8ljg$*7w^w5>P*c~*BA>}lBI?J zXRVj)bB;$4Arb;;0b``tbTEh@;UHSArgsy3I!({?)_95%B#s$KFfpgaz7xcpQ~G_) zP(ldL6N~rPR#vH^pF@Kb9}WuB##{hHt2`y(G#$W&2>|JTmzvl{tt&ra3ef_uJSy9t=$KQg(JU*{|JBd#WSzlygSs$k1c~?$ite?GDrqCGF;h90bi^I z6(c^C^;+Kx_N2z}5zAu@gVZp_DulLj;n6MMvDye{-oMoWQueeif9S&>mN<+W@zI(} zh}zBU-XE{kRUoMwMb+60cfY&r>U7vMegpl{7$ZK|FM)M=V2Qz07F}o6NC+3P+Jy^`o))j(8?AZ#qcxPS4c_xx*3XvOm}!_$ zE0W+OAvhVZxF$em?_eKiivAh_z$#2SJ3!5blxxys0I*@b49!@x>cE)HO`P5>=5QXNH6~&MSWa(9fFc%Uz-+S||XE zNlU1ZxZVNz(n%g!KthnGT8u%NAQOzz6e0zgus=*ybG2OGV2%P{1=Dc(jJN4zP7s^A zSc+qzkc5+bd~IzuRZP(7U4}%X5mX4N@pypa0a(I1SElJ%XZs0p4VMh0iefl|l2o~@ z5}cAm(ikd*5$!|5&LUQZSGkKkf-J68tNKqab-Zp43&wzsiRB&k`qJ72?4QYDkz+Gc zFU-*BVF7bTz<>CN;_(^*3j~o_wQ!7dx zT8^Ha^_qD~mZ?aZVVK}J#CC#~>!=x2Z1v$!9>lv|J768>OGi5gr%N~7^bMDfGcvcFuZZPzg1@pW-t9j z#zq+BIn@ionksUsoy*71E+sA8T^MW(wV%eA<9p?u>1V}tL{(Xq4h18KqLpTQdn^83 zKb%`Gj)GRsYK7ZU1IWNH5n-$ixTHZ!r&?XY3q3hFxtA7G02#fj&0b($Q&l}I04oMs zP~0{FSdd>fY5)emCT6mF_C}k-7DnN5VAj#~DoF<|F^#nx7K}(#8va_XhMiWlV`4WhrPhu;MNR<3I(ND z6IdRj0t4xKtpQpMnn)F3LgKW{{+NB1vDWZv)v`sw=rjw!vSwUTr6NEk2g#zRFach{ zaoQM`MHz6z5l9IsAp}}dEJTV%C6y##z%y4XG5{6bRuXr*RtU5JSe6zbOCZI$ z?Zr)MelQJMEC36%`Wau>X#*1QHHC%*9Ds!cX(SX~icqLUEF9r;qcyF#FpBd$A|(>c zaF=zJCyTj};KM};fQ7Bi#^dp=MUra{taFs2VhWhRro+N80d=>XBIWW8?yP_cle zh}`dgp9~-rN+v(^p&#%`;1yV`YSr_BOYyPJx4oY0_*>P>0%W|J>a~6gz5_6q$jG{&Sipk!ga+Pwrx(oCZX>tb@Or&Y;Hd4u zTt2mAa6-faLrgPGa9DXgyOOhrrE#gk6nIjbQb4R`4NJ1Lf+`ECR|+6g0jXRKfR(v% z#$l6vV1_|V;{*vDOKcreHG@@4dfo$twOkRGOZrf|1H?|9j{qU>$n>;ebqOu45S*^T zMNy`E7ZSmu1(^|&D4iJ6YPq zW=%rZ(zNR#TRV1GSx;p!*kSj5A4U1m{h*cJkR?)uXO8{{%van zHYv=#-8W?6=spo^=Vw%^dm=u~zX}UgjS#5gj4`S;?hDJDnEfCUDrgWxDF8rI z#HV>sSX2iHr(}O>ri|i$+B7#``DP*Y(f(Be);Wr$&B~H2X`YJI#Bfe8yz@$GrQNsQ zUTE%ifP|p&Z2fbkXhRGT)>5*vG)cm0Ls?q?<$>eyLgy2ck{%)~vLA$%Od=+Quu|*E zW?LSfAjfnnWriVT`(@j9ip8?6dd=h#GQ!^NRIOQ)r2%LZu+B(gzvbp6F6p+RkK$p= z^VPxiult6szL#8S%3KsBLuNggTPG~;vqTBTGRDf*RIf8sy0)!+_g>`V^tg$i2a?1`XhUb;DXG`VYYwL9qmWDcjujOaM7$3GvtuIJeGv3D7Z)eV* zZ{cNK?tOGASZ-}-+S$mkgz^5>x-Wr^i_nN zIu0STOvTgO&9#;GN8w?F>gGvVMCL0ubVWxQeeC7l6}Xv43H?^9OmVd>(khFnnd8&Zf2N}fMde=eMee`iy*S> zYAa|vUGFV6Yt0fz)ZK|j{ljrPfl*Fkv}tZD##k;lc6#AjGl%WJT1{epbw)sX*#S!k zSoj+(%XM?Paj@1Du$o{|koim&xi84%u=6fSIRzC*_)5nXd+n3HTSe1w~c!jmB{QkZVaj9nOnMYJOl!d2l+qP}n{M)we?rGbYwr#t6+O}=m_Rem^ZtTl$y;S8x zR_4vfs))?I=X`kheB=EE-ek)kLzj`H9IHZxt|a%6bUmO7ULXDaYi$7*lv-Q`<)+q_ zxVL>xdbJ)4xgoOjKiehgX0MN|#!buHzATBKj5N);*f)GC)0Q;>TczY~%^T&7_6>FF zQh1y^eYrLus&{{rA)-*!&06O$L%}4ynGDI%Z3NC*>@fJ6ogRRK+2HiaxQ5~lHzk}1 zQ+i$hIdLU6H+lT-QdhUSK!c}pKkeRyC1fRGHX4Ih+Zhhkc0t|1U#{Hz(MRTMn~c@m z=a(T;8=Hj{Vd6GV_;8!rZQW6Hi-4mwZ)&xdV{!qbbI_bUW$rtN1;-n3KpfY}?|!uy zT))=FVX)QlDXR+R z3Tx;^oHoHa3R%dl4^PY|pslX~PsfSh4iUpg3Q2aZp>GT*((7wVGx1{im%^<;k8mB4 z9}cCut`c3|Y-UAR@tHO{s-c;1!n#ElTU*OvT`F(twuGTooX520=<@GS8kEz_tyuHm zn-3<27<~nH`xfT&dH~fX{bX~_%pS$sGi(VhpvgIbe%y!E1{GWe zE7b4#2_r=;Fdok~6+oBFEId+`3jgSXEVpcH#idvV9)YhmRbyzxQx$6%9WZE4Smo24 zwE$PisRypwx+sLukBkh}+dmnll*PtbRW?!GM?g~D&Q3*2C!YkDrqM#5N*=D42jFryfVZW=jCOhh|lF&3Uk-3)4(@Sb0 zL8M8gRw587QcadmrYHAI?xF1TiOtg?S;?XoD)FG8!Q9LDMwKp4Oz16YP4Gr_Nu+bZ zrE^@Q0KO%4flT=ewpl`iLwYU#dZX44Y(-KHlZUSctJK?d2WDh1z^+B|r+&2Tg69IXZd8cEyp#{klwneRj;BgxytvScCFUZvA-s zk*TX^TXR)Kk3AiSRt(2H>;re81mut5U(xY>8B`a^7>L|@LFRh-&r6#>0+`{k{m4a7 z)v%C0pG&DK9z$ zY5@$X(q#3S@NN>uOj7kV1*tx$L6%nmgp>>j(7b&USUX7|%y z=P{v;t`Z`J7~HksIAG;Cb+_{94>DHx)##((OX=+rA)B2&`$hdQ`gp5{)4j03#%EQh z=F*N@WY5_3c4nHis9@qNL{;TUwLT9^>Xo)B;g@sx0nX5^V^^v>9KUG`K06RQ zZ(K6(=F}Bvv!v;&a%3*`O$VFe3wgSfOAEOIYKaSc#ufp%kLjWHgP=ZWN`h9DEsn(&AIbQB_UB_*OxvLgmJ9RWi9#)E()dp}~z9TO6~ltfYeKjyzCGAPQuS()W9MdMb{PpmUDXMj0O8@&dJYEd~Yiseg>83eZE z&`BDn$6K6p!Lh{+6>Te{CC^6@a(vb(nh(DoXc~w1R27+0r-^mmQAaYIe|*6||5ekR zV6Ra@&jM5@NqHFD%An%$^a>YV>H8w9CHwbwX~9;tVD<_jGTfNM9S{3lN2>@faBlkz zJFM1d3Oa8xk#r_kN7D45*B|;1t!)nH952QzHGB+{Qq2mE2L%WO-S(g)vmSC)oMw|K z+JS$4n-yoWMK^ca=`L_S<^-McPAR>T4^GgM!iVAYDnCtwgcuenOwcrul@KNtpa_Je z;s6`oLLrnO19^-AJCb|#*ldx4B#z)9Cc^!u_eSD6fO!Vq-0L$yc+feRJ4G`7O>`Qo z+tiV7oEmPLlxrZw<9=hpTWn09z8=L%z~+{G50jIh9eNEa=lPv!5kqA>8a(wPCg3`J zXCm(#tx1VX?agJ3(hB*CVAz<-Zh8pBz$P7qrr;wmi5qd!LaJ59D_&S4>`tfLiV$b; z?p#RVHj0U%Js|ZoE;`NJw}Z^R=XPmlM5goLO&Aa6661#`YH@RjD)x~Eh)HP#rH@ec zGs4g%O4HByiIF^%16T>(5mVU=_&`$S0JNyn_69dVsorALmx_>H#x09kL&@(26vD{D z0n^%Qp=SKw6du6T(3;y`XXdE#m4Bg~{wqqw=k9$m!qD?KFm@HA`+X<+M8&sE3(S}R zEjQGW66GSlwx(tv!HJ^?mqcwt!G-c>XyTnzy!(AdGvLE#0#*r66@66wu1J>ZxYe9K zUEv+;je7ZSS}#N@{Z^N20EOP`d3fwV5`jh@5a?olA0vFi6Rzc>!t)g-m?2?!KO+Jx zX;GRT%#A_jFpLLVS4ej1t(_e^i4_$}KjJq6`;l?Q2)XQfv!Pp^Q8fm#$?q=THCDVR zbFqQpg}3*|?#O9?UEIgeDUHDf_L5KY6~@3Ul~{__%hGdYsh$4Qwt7Nc2-;41KOj1_;^WHj^TZKH&W39f)9)MuJCc z#S(JeLKTgdaWw=(XT?P2T=p(QXGqlUAaiJ=4WzY9D6=RdDWJ@R6>3$>SF)JU8{i8V zdwIAN$T^!J`0pP4-}l)*6L*bYy*qU+^HBNWB?|Bx@;WN$J!}AdZ7K3X;9fs7&1JQA zU$ZK0wOb9T`nvSiFX3S(Hq*NYVc`&8?;;OIda&8Kf4F07;RK6C3(V4T zvnykHP!#smq_~95mXnX^J{L*N&-;u-5Nnh1DIRhObnetk7&><+$s&j&J&Z}nm-el_8-YQZd%mgJJ)aapZmWo0?r6m=|($tKPw|d;tqwX4=c*nBtC< z=cBH|EHqNAV6>d|4|5mj7@G01HB6mm^|OPRbz?fFU1j@izxQL%0lW;ldY{IV-!v}n zU{^gmrPL{l%?EOwg|*Vs$z-DLW?+63McL~}dYq`lL{4H{>B{-^G3>#S=6-sNKeXT6 zw1@q)S;6C3m91AIyDq(V;DAiM3%N4IZ^zLHw^7N;l)`aqGB&m!p=V|o8Lf~2(2UQl zEBD078{;*L%a$q&FWgJZFpg7ti9}2d;3Y)B3T0P_27aQBPPy%5xPXGq zT?aBm3jPY_hltrPvxfIqx`k6~jhgL+^(`&+UFaJ&b%PfXYxk7z}jrC@@ z1@KVesmeG3)k-*srW{6Fr#bA1K}*ozsY`3rnI%a-0I}!ub!f>J9yUr_YlYYQ7xtDZ zUwH;paVPRPbCx0$3z6X#8e+_yB1b^La%2`UPE~axP9JQtadxwo>pZ;Sp2K{(Bywo> z;)ixlxU?D5JZ0w6+TRJWcKzic;@WBUuQ8`=X4PmhJ>FuzO4CLf&%}cJQH{mnrKipd z3^ooki(`#gQ%4>UCfR<@IEl+1(x%5}%5wV3)`w>tXMx^hd530EPKiP?ng$(E!= zGxi|(9bFacBx`HDj6%8~m!bJYZGQ+-sCVA&Z-nyc$gvxTxaHyX0^+c>D-JHg67A_h zwCNMe%6|h`i5jFRoM^b=0ulcXxeK(6c|xdOs{Y#$kQnI**DxiXUDYC~(PA84?1UE^ zS?^zQDorpY!^9)#H9`hU#=cr{!J;ZiSkeue3Zs2;0_wKTCBwZ;bZ`qqa z0=d0^V`tOCP|<2PG-x8dY?Y2bkGwY4pcn!OBUhHYIFhGTQcQs+Jgz}titN3yd5wL2MhM7E$KXJtQ`U9zh z6`P01q?*r?q7C(74-!5}rCLD3Lu<$DZPK1o0o8`1B4{d}qAW7d-~l4mD$PoMgvi#| z1YKTW_$)Hv?ZIpegSFmNWMcfhZ7?mB|(pTMZ)T%#EL3~ZxvrRd7%7m z`y6`I?Xn7LZLLxb|7f&U{W#_-qln=HM;MXTD_zf>X2%o_#A91Ctn9xR>l39~__^@n z8fpL~;Dp}IDZQ{*Qj}vNQ2zmwbVb9=nqe)Va3U5#;N*&ac)a?u&~J(hHTl9HShgwJ z31Y(`53mf!#>`&AoeJCA3O=sgJJ4=yLKu|<5Hnl~Ml^$C(ep%rh<0r)EClh7!JQTN z)8NFBf@6vE;_s@}%~NXZ?s1TReokC7GtsrOH9D3%fX!edj=~{~9)UEE0mU4BdUoE|KKZwHG_mzKv9q%&;p3=|X?=xc96QU5 zy)7DEUs+;R&6Tna}Uvxp}vNLAf`H|e}^A?SljM6*aA%gk{ zA&3xwnxveNDM+I)W((51jJEGw+mxlCqEbaXqZOET~SgcE`vNG0w~d}Y1pgdy9bwWViQ*34Ngiy(Vd6FqE5~KE_;KEwjCP9nI& zipP%ZJxH{)@=RzqHlFq!m}}7U4KuQW4Dt&_N9DrL>UtAh)QaWi*rh*%2QuOO%c+# z(RO<^xoEH@oYyMUb!r;cuaps?rdQ-5cmNBr_YdqlA+<#tP^)%~2V-4m-My*WjW!-m zB(7xG40%KyOoPlsMsc}Q1GY6RE~QJ5pFcDMhtkt}OlUz=RkZ1*W(1hL1+14ND3r8| zgU(-EcYCT7q}tQ-yYu%Z4%VK1*hQ2>`l-{?Gn{T1PJ}BWpjhNt=%}~9eQRe9^0{L7 z7LCnd;f`ppj+|F7*y{%eL@yGqykBy1TAzN%1XA_@*X;L;3oC(jccWcbS7BAAWMk(O z+rBq>GYrw17Ke0Ef)ec>UMXJC^39nB5r`k>D| z5cZGWfk?e!whbtdc;eOhWf`V?eTV~PiNTYClEG`RZ18F36rd)dis29yazm4nuxX^O zJWWLfu@N-8zA5uMzLd-W4*eSu1n44n_;q*#$q6$k5)&Ry&EwrA>KTe8sLl}l(O3vy zW!s@DT7m-s(pw$g>@>e-Tn%;N1X*$nx;{U{wG(}&Kih!cY$?*DDpY2Kw+QH%g_JAd zEUsgU)T2!|vggw?s%Ew|@mC^9)@Jw8?3rWnm6@t;M2+3Mf4pU;nVxt}z}z4CWV?^< zJb&}o<{AK4 zorGOT`-SqEo@;1#`n=sM?)VeV(vHkl9o^az<>>JaKnaiJ)GPAM-%(op({8ZdLfssJX|{Qf#WEV%OlH5HPDJkP^F>cWLI+)V*FOrgMnYBXh%jf!wZIIhDt zMDty6Sm-lN5~c)~$0Q1qI{P=Kz*VsE2{4i01$k)>UFqn4-9A}P$Nd?a^{cZ%l!T(7 zU<_r3sQrS{lyA%TH1IJyqv^(6DFV?^{ibang;J(|lRRS#%aR_K;*ya38Ftz)mAR>S z2h9NxH1Shs;=&LG9ya&$Uk(v-CPR(%P(AVQq~_fkd!nqFsktedp3TeyLdiK z>1o#9S~92-b-+6#J|#uJ=y3wG`|t|hg|7x6gqVyeFjX?NBpgVcx2$On-k#p3Sw`~l zyXR%Q?fmrdfz`C~W(WP_l4ZPFn=2xGLFqY_(yH%$SD4=|^yeSVWJdyKXeG`VL8q`C zeLTkuSQp?Ofkd3h&R1+$NXD@qHczW>8ZYza1+kYxYf= zSLqJOf(U*b1*YgmIznZe=m%&e`b)am&89^I?3-c+RKAXhO2Su`k;|ACJ*4LGPz2M4 z(siMbZq+_#_<3K1f@*n>0ODgF777(is4?e#vfr5E^sedpzfBa)XtBRmxme%4h(rjg^-u??gG;+3VeZj`kPqXN=gk&vbE-w z=Pl0yQiP?sa#1zo*9+)r`_MU<#Jgq(X^a}&`EL}5L>l-`L&n~1S~Mv?CN>u0ejfhX z%RDsd)Eynfow#B^#9D@nxxw6oOl@CT(l>Q>X6<@dempIMa=_j|(;ReP*C44fxHQ3i zvhFqpebO%eOY?uxTS?VHynK0}Ag5KW0h!T^}_0J5@p82fIHTWLXm zeT%kOb8j>MD}!$>(et!W>WR>`vHYT^Qp{+xPZvMgFWy7WlKaj>GuOSXcvi6}>elU7 zC*tS0_mh8>0VV;_5RP{41Cs)Pf=tS}OvkZb^J=ue-lr7ELpcB{ZOe#3yG3y(e+snY8K}C z-F;z=eJtPo?PYTKI2L16@8I=95}zC5w29yDZoETxcbTn!t%$D0-G28J@o1wf z&ZxF(p#xzoo2Z#TgYhCYNSU+74^?s z{4q_ohuERpPTz+I&ZpS!NL#odIRF813@{w@K#%1-bm<^D@V~aOXSldSpXh2X86&EP zhb9kg`duQC%7X7_n(Ns27!kB>nGqOt?1l%n)|tnp?j6xNTkzH~Ab*RcaYNZ6z4+@s zzrGv&%24EcD(6YA@BXpsPok-Sv2&YFmJ5Y5epDG?X^VF!_FBrzw* zYP)`iInh)}O*f)KzHY)Xmx6}`*9(3hJ!Mue2%o5d+3iglVLW%cY0~PDHANJHeRH7P z-#0I#>)x}e-$l8}f5r`DtV!!;b=Y9NL(*OpPlpNmrgYp%L6u|WBMG3Fa_e!AINuA? zpC!OhV>Z)(^a^y;EmgJBG2$9GDv-DT`)q)7A+3I{)Hlf>$3U@*Axn+r*_kf|pgBMG zr;H?6qoQNFWDGOj>&|(%;u`fPtXh06*|=^Rvsw=sa{^@x^~Hfcu3;e{snXMXGFtoiTDp~T&rvxZFx#NqB1K^w zdGYintb`F$YhnS>db4umVIZYKHN0z*m~hN|MTok$kDE1s%sAreaDVP`O_>=3EiaA= zc8mH-O(!oueDL95l|o4Z213BB#QGY+hG{`myMhMp@>Z)>?GP&%I7SzT5Ap$lo)OfJ zKBQ!K)9Cu*NM*<5N!qv}GW1Ydx?7pFQA(rMcyxU<#(#0|bw-#-Am&U#@kdPiCB8y7 z@p5`V^wQ~Ycpw)K113XJ(S#P&3dHd57&m85i7l&)yX%>=oGU_AL%gw~tNCHkjOBjL zk!}B;(P5qT)~u>J3N()QIU}w&^<+F}UlII_G1FJ)RC69A@Jg(ynsRq9gd6lY>h0X4 z*I*UfPF3afZ>#8D$E>=wG+7g-tjX7EskO^pPCc1KxC&|>;XELimTVFULpjRidl>%8 z{(kHW8d#0-DHUkCs3Kk&g(?^!DW`T)maF5ocp09}t)hxk%r`XfAc3OgsU0gzZGYSL zmXzrf3D&9@W0g*NH3P@jh){8W7$fktdo*hVh5%Y0EZ+kW6%pOfH1JDb29xV=O+?h# z$VDyqdqh+Eyyyv)z9kR-Gq)<2mQGOQfu*S!(;*1LoaIC00143Fb_ z8^Lh%hxWoHDW;xMGDxdqGC(>I9+#|@kT|O?A*?K6#R8gOX(#eUqRp&-J+H)XgA>lA zAYv$(FJ%$uh2Ij^;5;Tw95)7P0v*4-oSf9zv0*BY$2vAU+jXboq}kn(dW7mJFL6>{H5|w z8p#Dd99XtkRsj}by_~BxgFD>6=RlhxZ99x^EG{gxR2LR%sd7P+;9$0d0V(RmPQtV% z$j-XdL|>PZQlCDMFzQK5`vDqSA}MPKNL`kuoueSdAUP`>GEsfjrZiw%22^$<%X}RE zp~^~1a#DT_J0MRn9Rmlg)X{(j7tAuZ!jH|Nw-KzS6S)}ZyG~^UjjO=6(PDxfSY%Mj zy@(Y1%Komdu5PZb-qB=*U*Y&wMI5i()@L_%{^0pFqz&^=X_r0MV-%|;h52t4~0 zyYxLx=1XYV0Ax63USb=lhEZF}P2#zdtQb z?O|AF4{0Vgs<@N(CJg zbiqZ+7ah8L|GIQuIT1Ii$W?;FrJaxO6zIy(FjSF9-)oP!+&m5sgIHL;QZYq@R=)xT9V3Kts1@bBzGS z0l?H#MWmrWFdrjCd;1Ca3OeelQ-qk216`uN7-0z5kMXPJidDCwM-50lH>(m>J+l^@ z^j)&yAK?k&4ekQ-p{Qx!tvHFf(`<~DAsZjI4h{~EfFOxIOSNsk6?Y79EE!1*EpGgD z$A!KWc$)D$)qQvggHs6uS5pl^rZh!OT6x7~%ezvNohX>Ddh}gEV&y|~;QTd<3>)g7 zk0`{3j>0TohKwVRKXoZFvnd1lF^;k08bD(Ws?Sw4S2)(biYUwWIem$HCaWB*UTo_1 z;U^~v1MlmKZMf{UK7ROSd0WJA;I`y$-I(63HNydzp?iaf!BuzN{9Mky{Gz*~FwK@& z8V0nD7MWRDCO)LG>NA1DBS?%x8bvcBjAr7akn+k*ffZg)$!eyInuFo`lSQC&BfwSp z<;trBTmB-6f#JKhKx2Y*pkRHZ8hw16k)lhzsKybw1hgV*AefUwRpF-OiZ2lcfGX(q z?ztQaci=Ogx~Pc5mE6d8xn-W;CRF;#_E0jUE-+AA&I%u~(6-t^_INQ2Ok`*jd}^>!uVLxArxF!!A(uJpU=K*6v-(`1tLR-5$|=9Dn92KtJCC9oDu*DM(y#ezB-E%KK!p1(8hrwp|hfEgN=<{ zjWZPZI{II}O_U_HafauWUdveg`aXqfi)C4hv9XDuvC#C*d)*K7-cZ&N;+ScMVtSfu zxPH{&iIz3B?GIuZeGb)x{$}yDiqYksfJk#taI`B-U@9r z@S@9ZK0>~=mXh9M^`2(02c^HH!I3N}#4q`esII*>_OS5qc3p3S$VW|uSHh!3(&uHH zeq_c-p}i81)v*#DXYDZxHV{Ckw@txLaJQ;xb&RZ5d9tKJ*!;+i5T6$u^f$V(yv#Cl z;}$!E%9o6^HF|&qS*bY;xe+k%7KpW{g97>PJK>uM-rEK33*7aDyQ{0>1&O&<0u%k@ z^`uN1j-Ojad7JLS3M{tZ$*^SUt<^<5@9G-2RAM$k*#~VkBaz(@YvpR&y+K2dhjJ*L zF;TYKia~7YVB`%@lkgABe4n^LNlweU3`2GQDlK0~=W1FHs0R4!vA({L*brS7IRmmG zRX7o0eCXMH9vnOz0tEgur#jL$1QA^wS3=YI1J>S9!WDkb)w%k)e?WS-v|m6kex{|H zKPI%o){Kxq6UTS`Q8@Nep zCM{TcI07hwtD8+QLtQ6)lnIgk226**Did3WVZ1#Dq398HkZ6<^Fz68p-L4n@&X?Pm zQ$Z$UmNg3&(Xlc_zwf>*{jZ~^&6sjO8V_>5cLc@r9jW3{r7Ol_I?)(^+=SoYharB; z?*;0tKnER=u}hcT$_4|7mEIuyF16a#b``oeDzVc?(f9azD)# zElfZe<6&WopghXHL*SI0m~hdP7nQuJ;1IAWTBT)dx29G&8kbuTHMVSTHI+;c)h)G0 zhYK}-qib=#LaV9c$j(s;oy4q3F8^MFC)Rk%t5hOAM3i97#-mgO4^KG1@Bsj5m3bo# zi}dX$kDSy%Hboaj^cSowVcwqC$X*#iV<~@&VCe%!l#k)8=DX~{4WIPfJYNa1BMqP{ zYbtQ0)4~*W8p9!WuAlS*>!!PTBs1as`_(A0@fW}PdN4M>%CIlKRVY!v8EsHw6=DLv zzw18~&*jO(Zmrd>=t|}lKgXxnnwpS;fzm>B1-QckgfZ5f^W*Ef`B~UN*gM zQ*Cq|O7)2n-xCC*@*<=uiIlx4JtU*z168FUixm+PJQ`cS{ijXzIoicebWgEQglZA! z%?Qlhb{q|#$7ZJjrQovH%o-IzW$VK!)pBMcG=m05F`{PQw&v~lSK%YaCBs35i?wBn zlV|!=nk^5o&B=sV!U>MtpSIGmX6D}p z=aD*1a17FylmCXs1E$CJfta}kGRT{DieX8!Soc1PJ_Y-Gj+u zoj!t*CXs-H*Stf^7UgT{5`m`RCo-22Or=%`eF%~hLHkw3(cH+{g+xjR+cWMs{A?FC z#p}J$!+&s4{#_9OOwwxTLFEQVogUw}3U?-tl4@mg?KBQNkLi{<4+fFphr7N!y9McN zwGWY8b3ja`A!5!oDfnxkz~vUFAyF z5<MY_h$(j-0-M|2F*TbHnyBwMd*$I*lIr47_1c!nBCans7q+yKLFHWyNy*#t)Wy z7{dKjxUDbbUfWjY6kAsKI8 zEOVES*jsjA>F3EtuxD{nvf#ZCxC}wABYvOdz07~<5G?Ur%D$1dCi(ccCpAH_ zgB+*soI`4CJNFITPZKxmGh)mN7wFu)Ff^aM6q!=O)q#4OkZ{%@6BdJLiKlA@!ckiM zj=vuc;us{j7jAo1sUmx(SyYHF!Uh#tQXFCh@3ZSO#c!86p*>u44aowNFq+!TvXnB6>~7 z<8o{aKr{#TPh>7EU10H~fjd|JP??`nhrtv&bG28o;-)O?0WzK5SJW)nMn57OeTCwt zD(fBI#JAWn@D>@hdZgdwA`{%NU$6s=F#>0Jg>{9=Hov$;>a~|Yhmf^@rGWkKBoSI3 zH;W)fR4~Oy0P8IiDWr`$p#~}^GAIZmN+9De7DV;r*G59!P&hGWu0l{-W%Cb+Ua1il3qs6F5I9z38U;#VmCrht`$0O|WHO&%7NV zTcPW``iv56>-~31{)*XOz}p;qK@w~D&K;JH&WDf;@=rK;5C*8Vpt^d+XvHWMrdTvO zSR7`|?$eN{tQogDkA3Mv3bGVJ>z{#S5^>EswULTq4-zm0bjwwLrOLXFyI3a24%54L z0}pMm<{pI0(BLrl(EE!Y&y#ebp`Adtr>L9laS>bK`kl0!Ur4av1UDS%%5sL0s8rwR zCSdOpJB?@t7H5}&Vxgahsb+{C_WHFKVj}ibk_p6Ok)%OVHBu;IbI)yQ;EM4Oat~yD zV$6sln&??KJg13X{ax%)AzNyY%0-fQ45g31LQNx-aX3&WfhkQy3kwPGIHq%PIMkZQ zOqf?!le*VgP&Cm>1%MO9t@-}FeMkU7%~1-1oTk??s0&GszS$a(IWb{V$I(4g!#5s@ zxNHYdPq|4hdYX@#p_pP86EP1&rBeQUpk#OzR`;hG*qhZtQN~XM;Opyc+uxYV-Mu}R zEM-w5*@7b9rwpHd0@Zz>242g6dz@eqO6drAnQ=&BuWTnbnKkn-J(s-J2BIBF5iDrV z%%Ze6w2Vs2;m4a(x!Li~c@4%%Oo6lWkCEwTM~W9-&HIfb`~yRC%{6T0j#BeoDCcen zFQ{}Bjn>v#v+w$#k-{{;P09#4je7GYe=2{fCje%wO$lY9pL?_;UF{Zq3RPJ}o%`ge zFvO%3$(J`%;f+SKr?|qFd5Z3Zj)NFdcJwx$-oT^ld-9;}^!J-o)YIxv%<#DejEXHs zJjbN{bXCG;WRw{@=uQ?#1S3&@q)fmnZnzhq!}HE!$Q?e;kG`J!G-M@s)cmQHl-e+WL-@8Iu zep0`gJNoQ?2*tE-q{Z(+bg^59Ae29O5;y{WK%luA>bAf4J82}n^a+(!Agt6mo|@EK z|E@P2fFXj~^+!;)Z=q~;YiZ-RC%^#k3JJYp`64btywKe{tQOf;| zAP6x*DP6$*Gh8CcuNC`QYz%niN_{k6u33EapUgm`oX)(Sz44i#3L-3G9ICe0^B_jC#t;zrhoeQC%H4wN=oF0f`)BV% zuh|&ika$9$Na0l9Q=$899yRt0I=yz;a5s)}POX&kYYV$>qo*t}9~wryQ21NZ>1gZtzrXzR4iF8CR z+x;a55Va%6*YD@piC;s`QHBeaUcib6iD4q(B9rA;u zcx}4ZRTBiJ&_Y0EANzR+w~hG(u~g8`4BulNfw84{1fj=LRNiuPJcm$ zv3@Hlq7HWtCSANKDy1LFv*{H+SmNh;4`;0)_#x&ioNEqi(-r1cHWr0~Iybmeg!*sG zvJpv$nTSXjxz&6Ge#OeT<*Kw}DB;N=Md@U^Y63D@cj`)vC-Q@RbEPscEW{f)WX_1v zfUT0*>w9I~5!r6{P_x z*kH3{W6qtm#IL}no4=Vx)^xO0ezNLE1elwKkChad!z(rdSCumsCt>>bm5tq<#*E3W zEq#ep2pOL#fG(_t=+%Zu7u`HsZUF}392VNjDhvca6d83It=aOWP|utM((pjH z2$Z4IG^jYqpGDf?;HA;o=$ygI1@|73K^wi)>_e_ShwcGGvRbb4HL7xgO{SH$ORw0& ztPGaz2Odgo32SRvU%6``Ji%RTdFHdC<7*uI$7npap$^q8F#sUr3jo*5!)FgV!-SI2 z$?)+8@m_paqp|Q2emzaCyCm6$R}@ZiA*r@$|K0>Y@ucV5%`0>@6xdX7cptc)mp1w< z{x9vgTK0riJkC{il~^Q!QPaw#t1rnp_)#E!vCY~iQtu=17H53?d`mclzOC=Xy95}x!47wd!P#FLB zGBEjC2Ghq!Eux6HNPGpT{#fiZwT9X2?UZ!*o~Gf^C=z|3pWfYe$`tO9=ou|QtS zhGy(RbOy`x0_^EnYDY%~=?|M`m@5yz{S$b~Jd60$7eW>nk65&tRC#UTK}+mj#q?iQ z1&_oI<10)_aE*->zJ~ccjSPeIXAbYfMBDJdmIn+LA>dJKl0eME-R{*pQ?E>^_5u#- zYZ0fs0&dz_lFWwPA_D zX!m&A=qYXvf?dud@h!fMVTF>*7Y+`g@Q9^IV!nB!*6yC1u}nEHiA#nim95<&#(BOc z3om-*iJ}jl-%OR3dwp%iS_9csy0#>pU-#IqPQkAJym^;gxvHcZ$Il!)mp~c=MnX?- z80=(jHqJ7`l$)iTh7ks=6{?e4N+p6#JAvA$T#yS2s5}ilI#|mn?aW1{#bTfteD~F9 zA!yGSF#bW-e?8=9-X}VYiQPQIE2yq&yy*XTPQNg0L+6frD(0YUO8lMBuBKe z`A-$*gW#1BCuWs=U5cAA3F0dDc8$xQpkYbT2)7her>jK0U`Co2Vp9kHj#@h8v3|wI zQ(O{Zt;Aej<-$L;cFRNv6rKbek60pXM5A4Ie5mCP9!JTUzmU&4wljidGAoU6=LbdZ zW{Hrl-{U{n>3sS2u#LD<$K_2MPmmJ@xw_gP!!_I+SfhGTJw;JB3@E5?>>r| zb;8bA#t4)cASVi>ytNu!txa>?PfoQ;{!dThgI!mxb~9CQny=ur-%b=S#arDSEK*~)_!d;CpkJrL*e9EZ&NhYcYo zMa+hE2G+48haRah4e}|;==h{nzDr>JdH)#DRVIOHVk87DOJS5e>Pa~oZ{g0K;lQ!e7zI%#gcNO zprZ1@c&&7F)q}c(_v(2(W07pvDjad(?=S!dE3I);@Ce+B+rjvi1%!rfo)Wqcj>7<- z_vT+T_ald4s2R=~TpRH*CL>V@@Y&pdFj{wZAp^heqkRYBv&o#dc_sj#=V}TX9Ej)O zR4udJDMh*fO;0FO?qUeiSf^aWfRnUsaLqs(>cVzOjj}&O+&i~-#e#7A*DYBG2Bts< zv7$!JztlRvzcOJhYUxiN+n` zIRPdu)PAF&`MLm~fx}+~pQJAG8BDOAd=!_Z*!D5H+`^6edkIh$9&_>@3O|VsXy&<) z6V(GC`P}hFQB5%RsbnYoo4-+ba|(Y+5f&Z_1368L=2{i(T85&O35Nb5@$@D8{3-x$ zR<<)B5mo^TkcoP#@|hZbsbwWMGU-ExRCKC})`wxq0cA&;SfhB4F$UqqO^5OOgcVs> zPN=`jWF$3|i0E95S|9mTAX%&Jj0___!{)y9 zit%sRzuY*#xBw4>Q0ZSMt}RA~r#&7Q+HV52KnlH<9v3aIO-kP3KV(y>G)UFd!A8n-H!3l#g! z)r7bY0(8*~HI04l*_w$ksS|{zWJgj&7Rvui7^)xa zBgph9*{)JAPxy3VUMuA7BKjJt6cJJkJsL!zR<7J^wyBDg&=5XsAPOjS?{P0AQS$I9 zOSVp;EEPCK)RKT6vM2#Jk<}PkGlezp^_)p}FXEzrmlSg#TKb4sl-N6qRUjWU+!2nZ zm=hR#*!a0nPPvqeCj$Aa<3$F~;K+?Ee5S17OF>@wC$2Q*lZ;N`<1ujK+>OHkYKACR z2pSy*&7rj%<(iJB{EdRLbtBvPs2wV!HusR~V3rQtQz_SAPKDQxuOq(FavKj4w_82} z@Boi6rL^qzxX}P&7m5`0ASAv^r`G4BLUi74)p*}mnaid{{`B6vf19@CsKNHlnIW~{ zkZ=Zbzvn=RtEr=*5iVMhvZLnD7kI64Ihg#CE?d|eVsOy&9Hgu5v zg(}DW^t}IRgEJ`gS1YEaX~bVPCrX7EXpJcOTnrg`Z3w&tfyzLt7#mblQ2G8e8Vb2a z1%P74B1x3*$ z7CJYl-*lr{q!TxMOfWD*4!3bx%0FvOT;cv%32;)w5Hj0pI))zpR`uW~7;kg*bxFJt zN0PJjuzaRiSHYSlejeWU&TDK)5|We}6;@ zWpmtopMO&_evkgPt@dgTe`pLdGp_&0@#*L~I=q)uecXAzw!Mip*TMs~63CJyEttUP z{@#AMk=~r|yrSFvI^X!^Tc7y)y3|^qqs;s4^3d{_u@RVf_Zq3?{o08wzb6jCU#Ip<{Y;oB3BRo#F{zD4!+b|QNP$(T zsy4^6r~M-~KJLK7Ty-o)*YPb;yaz;1QuD^j?{Pq@SWVj%S=0W0J_nybsIKP2^(VO$ zZrZMC%T{@8=DPEyTPE&QD?3I}?6c*AFeSE0ulI)0R4l_qjJWh>xj9QW(lPDD#mnNn zu~Go0nRTJo{42}4{gCP|cZ&ljtLx?%eb@cVHrLihDc9%lF=eNd4%hOU)AeeLL@AC@ zyzzVR@^z`P>zAj%1Ose#hx!WV2P`mA3U6hlsOEm#Unyxt{T%X20{(aXRT>O)WdMYf zgffk#m?oA6)nU@*D&`Ovq#<_AO>F=w-&e-{DWh3QFffQ88Nf} z&RD%KZS^OgZ^0}BHGdREQ_rs1dyB2%6s(xZ^X-w3j$uM@p7ku51gUm@ztf0EP%2h9 zM4R-WV1cS-f7N9G`_p9m0M(KR6SgD6?h434alGpjxzC2vk^%Kzf#d1bQ(L{22>a>J z$UgD4Lhz0ZrpS#h9;wcPJ?^P@UiBQAtC4WRb4ng;OyiMGwe%m|(t~Gv>)J1ja5Oop zN@L*Zg{G_t%JGH~DhJw$52Gs4SFrs2pe3}}8hBKTI2k!AD*s$!8DtJ|sZ{2Yx%}+) zAh_=MGrh1SBJ+8wW_$0IcQ{l^+*1kBm1U!kvBT?*-Ex8>{HBd$N$TVp)jv~Ma+QKe z#z28(@Pp{|JU3YgtLy^}Bf`U}BolW5bKdmJ&BP(5Qry=uSt+ItOVxCh1LEAC>a5ri zskqG)_}!W-yzil8{?Y2F`HUcok+}9^l|iJQr)Lqw3Q1&wdDT*MzvRNU$+_cd(Bo3G z3eF?FQ!^dfxOV{%8ByHz7rLxdFup(|U;+|#ze~M#()4&2DL)?D6kRg&UC91<*mQek z^}czaH6&#t{D3HI!+W=u?w%Bjzj z%8fgy(0YnOms09spD;tv{09K1Kv=((ll$?_hpz4V5nOjFsjAA*UL~#JZzYxEIG`W5 zK#__X3hRFP7qa~^b1u2yyX)?OFY9y{MI3gOaphAWH821+a!vy&l`PsTe78 z#j7VK+Y@yjrWw+w`R z%lJ7Oyq~-riF-VF8P^uZu|k+&;16}(deQD{fNu5c|5)tK@7_88UU(Jm&0P=Y^1;G! z#swxamCD53?@8byW8=(Vtq&i+w*5Tay}LARzw`X_&%Lp%wobhsRb|Xzlb7T1R5~*H zRi>jADG{=pXf$3*t=LCrj~?&D%}F7V#8eC+M@s2iLgA6w$W0yo~-p}h`Y*L^F?9{!W!?mgd} z|IYb$cRt>aT)$AT*J@QSPr^@t_Np$10P{zrp_^$xWi&o;r2jJb<1gHB{&&xvcaFv0 zwgEDr`uAq%#!Tsm>=&EBH_((ypw z;^Ov#P!3->-6Jss!6b*aeN*E_;l%6D-+cX{zd6pwzTK%jc2WDGo}N=HgI`ruHJi)& z#(Q3W^UZn5O-O-UHh<$+gXyWBr`y`@U9;|3|J>Re2oBuOwOts?#X>%xnq0b~2j<_B z2WzjrR*4n~ZZ0+zR85IkjDy$VcOPb1oIw7}ao_&UbvN8FV%yyA9bd22YCG?r*`hg| ztiJX#U1V`CIjFS_3%idwKM zS3T3D6q3zZkk4YKsB1A3Q9;W7Oq1!LL2t-KEqe5`@9+Dp=yKSr_VrSA=dNa~+TA13 zDD($KQ8XJ27RIEeSAl++C)yg<>d+f(QOM%J?TZ%7f-k0)bNNCQ=-0Rsgu&&4>8a1& z6S#L_N3PKK({e3j2kjH>ae1eKyqQWub)It(x z2!>a=Y|oRm4_7X|^2l1H^3_*w|9Ls9(?Urc$6*$qaXc0>9ZLsdOP5~i3#DIr?WLEp zMTQH+Ldj!mlfKvjhl0CeDT3+#(-&5Lb3?ZOx~ybOB=Qua@jP7d5k& zwT#e(=?{N@-)-+vxoUOQo|dh5HnXf-qc+5r%3%gGP2z43nRD3FrA)1MPvch2@W6l? zk)2MD2SfA_h}l%N+twgxIrdYj9Ya|{$*yoZ4!#E4+9e05K_ScHn5G3n;Lk&NiE zSIzDFU>_oUPJmR7_jue+i%l#G1f{xQh_r|g9@M&q6yYum6k)@ig=jnETMCa&_k@M3 z{bm33{PfWD&|Em-7yLMbvkYex%E1IX^v0$BxxT=mzdGD@xmx+Owo^Mb8&hiE4%sIP zFwvm0?}qU*WS2OOQxvx{{pPpnt3wAXqc>U)e*71gFiNlhEQ$y$1SDVn{k3Eu0B*`R zo=<1SaIk*(LM(Z5ZP71{`v{7~1&YUXf9fD_|7KI_-&`;TaQf)M>d~$K{!(yhE}bsS z36K=h%j@>F(`syCVZpSuxwW-<`|an}gF3t0W;p%$a5kl2sFyZl7MF`WvMP(!9s40& z<9peL7)DYgg3xSGD0*BDt2G@@?F@A38ef*VU@t@!*}}&~vxf$&h0&tNQJEQOZ@3SK z<_D@(g`_PSt_*O*B;c<=d##m1cUyy6hR5xNOvVGiLJhlOn0AzocxGp(qpcw&2*U#^ zI6u(hOQI*fEV@~Ty-=-gR7czPX|K9L#~dv<)T}F-jncdY7;15Qc*^OFsPH*v(Q5i7 zN2PXco9^$~hvAcsylN5ziWV6}kCqrWeKhW5{6dj`6}k+J+wHRM+}-kgU3262K72Mj zc49gPZO~vjaAI`&#Qgk;K7t4)7(hX=?Dq?0-}IaFv#~`se8*p$!Y+BW^6ASJ>*7)@ zYOhtSb{J_`St%?A1i|kofHIU{s_uMcRmU$a9JJqPJ$dYpfz^KVWu2WULvWlVu>d4i zisiGhsVSpzft!8TUoI0MMQ{sTav=m?;|L1Zidr4#>3-LT*WGi^WjA-;O5T1$a7+m# zli=U2JA<43{hJI711H|YHINcYZD(yc8#5Y>lUpPOzSWjP>Jw0q61X;@iuo=X#dLs@AU#e*E?y zR{%S4R$vK+VSN(7YQaYlxZv|GO&Nh$u@H;eZI$7_{?)`|Yj5>5d}arowO zwA$;3NNTmT^vJI6a4O~1 z-fed@Lwbih+I0Gm5Ny|K#VPCjMDs`HREc*uEmSc0q zsj0=RYsD zvPV?XvK+yX?si?{S~(zTT0wWsO=<;}=8Z%maS;sG{^t<(0<2#lpHp3k-f%ck7IGP= zXO+P1W-=Z7)7f)a-l!=XCHbh5g4yUJ=&pB5sW}-lVBUz5j=OV?Na}9gKGCOZjv!_n2g8^2;RM4aS&DH>xswG*5jj@CciBhy zeZ1T4hT#T*UBX@Z{!Z|Ab0VyDsuQ z$H~CL+$rPY*4CLboA7VG{|s`jWQ0F$L4!G$uU2LC$jFQ$I^~li2>fP8cU!|HEUlc9 zcU0}GHe@&rHim|64U9q1_Qsb5YG^d)P)K_^lZrbgZ~s83&j`%{G*rNR5n) zq<~l6RK_chp!)7MUBg=7LgbuTo=Bl^VCflI6y;1rma&eu1`|~X?GSTWuh*>IHu%gj zfL|mdXO=O@#`jMwo8qO_Ea_tSXhwy8;K<_-+agK^cx;Pg(n=gY(&BKZZXfK!f@M6f zk|gZ1px-a~vEjRi!9)nqTcxFkdWBE z+Uocf62VE36Pr=EPIP~K+PXRsGiJsaAQFXx(Soc{T77>e2!;2+7?0yYKhCof#c)$b zqAa)}a7iL8`rirax;i@zw&CHA&YU?@+STuw3dE>of?U*dZV?OOr+$I6`P?BhQ_5}GpqTk9I56MKp&Zo zpiN0>TH3l$8!4Jb?FubNBEyKrFwkmd*aEZ+kXc%y)@mjb_sA(lj=*7pziL8Ds}Uhs zE~SDuO3R{G0bJRTPPhj*hQ8gv%r3Jz>oTJ#s%T;nh!K5TLo@E?C@tn(v-jW7hXEqOBFlP+Cghy=x0+_?X+p}QTv^^c|Ws2Q`BHa00d5POS0e)QFFmPXq{)=sBDX&JsQ>Z1ySsGf60d&Rf*8h6+O4V5>IB#;2-wQaNWmpw zbIGCuc1)c1W`0Cpv&+(|Vp+#%HD$G4t9{bUvg+nf6VoFw%(dc`R~02AqX?)qr?ppX zrybUG&I`QCM0RZD z1T(;;@>fz2=*FfC$CKkp@9B74UR__eR@TUJ(9es@ALos8*<>=ixrG{r4P9;L6s&dw z$X-uQU^25>u^aYy)g=5hCxeo}zRYUnF=UT1O@nlAuCkyyYBfhIT0i?4n+o#{)=Fww zMzx%`NiDjv02YTA*=n-PmB;J_0qoU}T4y8bZOpw+2O`0U zrXr4AfVj&xB5XVE~ z$%xDAjnne_`q4PeYY!=^bEdJeF;o8*x+`^VxvP5AO@mE!<#%c+L<2)x^HLC44m$rk zwPAfLQlM3LGGY#zm`4nH&}y~4faY>J>yABx!4!R`u2n6EqgvZ>#BJzrF2V+98#Jvf z5G!M^Mk2Dly$!?~)2ZjY(8m*LlJw-QDJZ{3R?`_9T-NpEXul;f(1Dy6pamX_ce<>T zWiB{Yb!cU*y4G2V`i`zMUP}wZL6~5e^5MmzJ1}(Ojd`fH4;{GPQ0LYDwGcBW;5a)z zE*0tY$&)8tFyXmGF=dX$41cQyLiP5lri5bJlobQ8cRQVg4+?8;W;b}A!Z8f=>L~qF zsXCH@etwQ+Db8q2j*&baFU7rHG8veh1Ak>Q5w>CQx*g}Dzxv5EXfxZEs6$E5Ao|X> zmZX4vBnh4Q45DvE3bg7Q(UzrC6DVl4?jtb|>8KvF>9t~5i(1+PI)$43=&*JVZq4{X zu9{zUXwSOZ^o^EK>wdvd&v2ZSBP*(^D;0rRi^dpJXJ0*iHel|eBkFeK%Vojo<|yp! z@~WQ7{X{G@25I5a{CsaLIT`3ZF@FLEvW9wZ)z?$FMzr)8%L;;IG=|txsT7aBJJl1z zDTzh*#Xbi>c#t3o2wSlv)t_}CV-&h_Tnb${KRrEt;*B@ww-*l#J+Rl8fmQBXs}2Xi z6M@H!3n8B`FxS(|xmgKDI`)+TgHZkK*Uvu>c_HQVu>=4Mmweg_;wcUHb(HQ;3bIw? zFh#I99$4%>(A#@qFN~s|>RU7=Ni$NHI#>sq_skHPd%(QXZWyMbE9a`H%blQ+#@5X(kR4n*B_x>B*}cgq}2 zvrmr|C#z8peY9H1?eXfY-_rMXbUkZ2ytEV!U-8Cttmn=7Q@|@o2Mu*zHL3+^Ax97a z>_lSxz5tR3aqzjvJVsHZ2I^=MgYZ;DD|%ztTF_2N^#r_j3AZf1hCsHM{muwDSM zpj|(vgUuJjhO<#u)RlKwtIA%5w|VvA-o)$`YQJAdeg9)CJs7AaR2-V$MeOYE4>=hRRyB1qw-8iI!Kk=#& zsolIBcaaRY05P=T>Fc#+c^WXTXA*?I>97lK(L5k^cg(el9-MyM-}{4aWLT&22xhmndmF zxk)XmOdLP?^2@Il%Thh-0<8vHnDqjiMH|V&S&ro>r<>>Z=+_N$4N8F)w$)D-sc0t4 zaqO8hTO)f?|MN-<9ZawNQ&JHB!DWHcZv0bPZLMn6N1VI0=mcK1?maL$J&~qKN5nf5 z(F0?eW*EMs!49#mDd;3`R<(Jo3tZ}V+ zez_-wG7JI1P`DfZ&ud9seKM?JDZ|FbnGN#HnT@TDt<2V$4P;O1e_s6`XD{lJbb`Fy1ul=r3|(+XFj_9qYbxs1|BiAA^LN?J@^BAXROmW z5QJf^v}SFl*lvq`1WU^cxVkGMzrnqZPn_;f6e*y9CqQWtf}Re_fat=zFcYsyLzQu{ ziT*FzNNIj0h5vZ=pIL)rA`i*^iPop!ePfi~M{yWJNL@^}sK4}G^OL2-52)rWElhr; z(CS|v9#?mF&%Y*D*t-{>;$O}P#jq}RnV#88%7$*S_*nBv)r+>b@GEdk$o;~pBgb#D z&7t+aoW`+UQGT`idQ7~!zFaP2ZcNhrR2x<=_bV<7eb!P%nCUljF`S2eZvCHjJ*cQviMB(T z((#_gv{6y2lBL(pnh%m`{ZJEGE*y*6%`_LW6hs+_$<0MvQvta4k5J-tLWdIU?n#IMx763$WQ zozqmndAf$=^adUu|CeVu6;fiPanrVKM-J^*030k_%GDDb^sBX`_+@ehtgTgTsVwrLBOcLl+#S<=}Jpp_H=SSsTzU3c!J5rdLT?G6ZqT zQ1Z3(cq*kt%e{4VjdoE0!2Fm>lG>)JPa1t#JEp#MQ)c!7062WiNHxdgRt9zj0QiOy z=V?ogY5@QM006)zdvG8C00000eAw<{Iwtrw1?RNEc3J-+j}StjkMGm2M} z5yDJNT(oA!_z(1fejEJ*xE6Kly;Ay&cRt@Qz4yI8pZih;1qB5K1qFqNi+3(xe)pYs zS`-u%6dros+q-vf?_RIgFsGQ7f`Y=s%{ybcb7$}EeR~+q>*rb&6ciL5V&06{12@hM ze7pD6vZQ~nML|J9;n=~3u1u(oLFethvD3vB=U01s17k~hgStgQK|$eoY3rFNo;!Pa z^wASd_Je2l?j0VUKHcg3s(){f_heVE%{|?sprD|DVv$peyqmA4|*qMl&+Z*UR>~r7vl3fWd7VmB^wkRklD4a2wEzG{bVzR82iTTln z$3;ESl3$~hq&zX!Uo>9*<@63S2w%wrWb-2TND%& z{_mVI8jUrJ#X_1a%+Ch1dA?D{dce=q8uHZ|5hesNTF3|eaJnFoc%UuRld z8lrXHa_#4`gK-JjBpM698&*_h90jsj4k^QVws4R&>WD&}dG+?Zyo zV?{qPZP1eyw^6)WaPX^R#lDr860!cLU@Z#&5GppAEWhdXrB9lBn)a*C~x@)rK{% zhYgJny)oR=*4CTdd_q^90IQBgOy(!(Q2=v zX?v|6tt|8}`zF(qJ5B(APuP+@#loIhTFPs*`QSB!L1Ok_yo9D#*L+}15C$cc%n{Z+ zs;cU@S}XpN)w? zvr@AnYMvrPL1F&>Gtv*UsQg<*A5UCC^kLVgwJ1d*qv zn<}j50;C}CfzX2&VZb}yjKQ?FwOIs38#dJwu00nm+A$yJ3d9p_4 zoe6jS86j!bYV#H1k_3DOzFU&CqcXLOHRB&r(fp;8UDp?Btv(8Hf&a8KFG~y4Aq%DH z7|L0M-|4k__6H8n4d4YF;(RBb4=P>ZUqT2gA+Ss3=f8`qc^HWgWx zEx)O5V(U-T?Fvncasp{GbZ6gGwKONjMdH^i$gfBbbI?RCQX$VXqM=g(_=rooka(rF z@z(Mc4=7c9XE@2SvslBI--y6_a2Tcp zXs41%hGB;qu4+V}IEca;<=KYeOcF8K+GxBw@yx8qGMk;GMdH_!sRN$5f;FCqW(A%X zk}PxEV(HA@$-suSP-Ty%MQWEPEEcngPUH^mH0-3<1VNfiB~UP;9;{-b!R~&;=J)7| z9aM=DaFHg$Y>L{wx8&b>o~;dBd@3W;359C(WUa9I{eW6sX63YMp z+ilJAl2&7|fi=?o%ZvI?y5x*E&s3_xw_DB7dicS}D9u9nXqkmv;pgZV|NqLT4EN*=IT8qLlqne&R$ky$O$tDxPE(l`S zMa9_{=hO`a84(XTGnovmn@lQ2c_0_h_0Gv3mt(`TIM4Ao$KjCAln)puq?}Zyyfue4 z&<;Y5<2efFJh;F!sSMKc#Mi~H(FQ_H`=gVhm}JwWNkS5RWhw(Xd!%n`25Ug zf{qFNrkF*V%5H4+G|~>%NOL|ES~8I) zbKV(GraEf=-062^uTk~p)Ra9GkdU=3=t_kOVO-tczfL-Gr{_jxX|>Uns=rV{bNhVB z1q!rAo0rfeOQ)6STWk7_ttmBj^!5_@%L{d_yslyc1)WyAgbYhEEYq=2zN5EmN~J!U z8NWAoE#av8{eCx3OEH(Tzdw9mEVi!*);D&Iz0|lZ=E}!R4YNaO+*Q{G^8SJkG~C2ze&E9%0IM z;G;Z=yC2WUjti5J=MX$a36MhRj}h#^%TeL(n-^t=m=n*6WpO7*Sjf#BTX!yj11{dP ze);B11MQ%IQ;aC)7!+j0og~V(J{K3hfBEA%OupE&IOO8-H4E~q#ogq=LGghv=8vat zZmDGd8A+6{mcIE~W2$Q0Kad z&<9ads9yxWsx7p3{d(8ddq+}w&#>r5K`m;vdUiOYB)M|met2VG;LF>DX4z$ndA*L! zMYnR|{g@eI5Scie%7%f@Bb1-#0q}V_d!qNVDY;k8V*>P0VmS$M2q9aJI0YC2F3J-q zevI5t?ueX&I2VUF56h>S1Z2IaE<0zBZ+$W<^YTMU4d*EI;shS1*f0m}0F}kvihr`D zmgx$Qjj$aiwiWnv z{@tAoxvt!91Gbt;yBbM-FIY_1;@R)HDvgXGx|`jSakpsGT=gNB@g`PK#9Fy+b^#so z7s(*mLm*0ryi&)h!6Ogg6JeO)Aw<4aK43YK2X&X>!|@llMrD;X4e>aH@pxLuWW*HX5!g_@ zE-%N$%P&sI8`lb%Kb{VH1c71>*f4|vqy_9emAShit6yquNAU{fE4KEV=6+5T%Bc*) z0T2KV-p-84tgCgnEZ}Sw$q5$AcJ5A=XDOr=LZ*CQJUM~MeL4tvnBi)cnn~i=?46>q zfcC3EM|YDQ9V(fAMUn({UnDISQ=UhC{WguXKuqUdFUvea)iz;7eIOcd$8P1cHT=WW zL0PJVkjdzrU-xZI9rY%rn$iNWf>%pUJF=}$69x&;OFr7L=0j_=(T;%Q)L_S{o+EA4 zd3_AHm~_>3%Mptiq1_Y&w9QXw8~|ZOT2cK*m!|y)4dIMt#Rp36XvJ?uLo8ZaAk#T# zByP=1?ocS?@<+XP>($kT1!atNd^`)Y$gb+`;Omb+u_B5h3;>@iRCfl-Q|xY)cY-*L z{EE+HxHQZ#ygic~j4xJTgXO6X}}b$7N01M|hk^ z`ASS8zY_P8PEN4@xm{Fd=k7QrFJ8S4DK10RYBiIF$)?KE@9dpVY$A0O$8EB8ZF^`S zw60C0aRb(kF&Z1~Mm=oXG}ZVg8f&8QzwxM^y$SP=nStL7Fib#(Arz*&rgXLz%F4P} zTwxlGX27`C-XQG;qv;;@;K_^cH^sk)4yebz?4P8EPu@Jpc3X4-awbT9}OYl_?0 zp1i%!w?&_Ojxe`jgnO<25!}hNsn0MgI3*|7CztwaiMKvXbUL+K4PN(r`Q_rqh4rn4 z8XXjAurkS&YrVeQF!hKu(WV<1>$UTMNi2tKQkl{HbM zMFY$K}0^Oln6}1w^N2wxXRg~KGK@bgt-jC z=~Sjn5i3arR1{$N4_{QoE$GbN_3BX=Q;Xqn`h&U=$!xEOl_E}zL5QYG#Paq`2P>Rjd{UD^M3Pw8QWw&`=bqD%NKwpZLAqJ1it*Ez z9q-&aV2c{Q*L#iu{cVEy1&C%N&pnqYyc|PNdBphP>%OX3KRxE@!QtK`xERJq@HLnT zYZ-k?BNsxUMk5v$gF&D{zJ3A}OJJkNiuM1*z^i4R;vf{I_|}CBMV+Fd1uT_;J@S`% z$K|1c-e(dQNq}W35`mJ6bTBds{kt+S+;V>N^3y%D?kW*H0YL>|gI`Q?I>ISge}iQ1 zYUv6bz}^j(k0MCGF@%eVfIxIv)~vd|toOQ+#=U-Wf`W2|iO#P{10Dn@dWpe08f1cE zP~jrmm!ZphhE4DRB@CrkrC%$1E8zAlO@k`-LEV!4$#8yE0^Q!l`unL|CG=>+*P>n*2cgC@HkFEH<9utIg zL9T&d`F;7TLPIGx8U^K&io~FGbCp6oiPuDz=(dw57Tr@(LH2VU z2~qgX25xUFt(sL(8HyMAxFGo~m6OiiV0jGqj{=eV3oT{2AoAqGZhuvk1H`Pi%=Jb%k^ z{P&-yu;}DOf}?l}2hZno6os(GqQElaQ&Y`f8GG#3!QQ5&#Z81rkQstvGCEaUPaYmX z%g)fe9x-3}7*1eMqvhHrr~-%#$pZ=zxg_KzS^;^9I#=EPcyYL=yapd!bBQD-ArkW9 zBI`*NAq$3ufpKxh{a1RiSXQr}m`-tFOR>_D$`i}WDpFMu2g5*Kdh){OOGASLJ;6q% zQv@ioWUhX+tC}ipHCTX^LX=8N=dN6Yc0E%3o^^+Oj89HXfo92m z@L5yoyz8Tb{R0!>fe?orqS%^`O0vP^ZK|!Td5*!FcEidnys&xWsCd$&365c*Lck;GD%(8_|yXyq9>P1k^4wYZt+r^3n z!N@|8Qq;+d<0k+HEL+&feVS)1M$;rkf%`}sx#BJ;mKd}q`)oj#s%Mr)0CuZQy)bJu z>hY|KwGKhm_P+0g&aZxC!iaNt+X=*Ay=|UZ#M%dW*^1wZsMqVlEVY*Z9?aS1C6iLC zhi;k7N@>bG`y!MJ>UD(Zojd_Co}Oa-S_(uVz8MsaW>eKyZkooPio2DjvjPlX%)_%| z7ng=_A2<>>n?DZNu|{Sq845%OND4u6JXOr2LzO|G6)dnwv_0J$Yfg(I zJjY?{M?!9&u2a>j<<}t7j1T9PyEbmm!oF`dy15Ak4>H3(OCfS4WK{8O8Nq@~@B^!O z{}NvPz5y(oV>24_x}(UFr8b07;A%LX=@aJysB(_O(L zl10_DSR#Rf=>le*o*n@hX4%3dHs$tYMV>+u%wCaP#xM~AUxfG|Eu5Onq)tzccI#y) zq~mhb?M^hCB<15w_;#E!XI?^8s28@~skO<>rsHueq>z`r_(^ehy;%bmAK6RD=ga!8 zfjyQb3@PViCN}ms7C&GeVfnDgjK-&!V6?8uKTXZMW7(9~Qz;&RVjUPXL-2F}u91}< zo|tx=c=N}>qfo$_E=aOgkt8XU@OtZY@65T)OV_U(=79lykF0t{h5IJri$hSaqsso^ zEG+3mav>_G<&Xrw(xNuy0>Nq>01Y7u@oc~^hhT|S_hssn7mgLnF6+6c zHLJ9pM@Y1WiEu)M%T2M1mN)=|QTdwo3N_G*;MahAk{iF_^$lZ0VbMIwSoi*@ReXKy`Z z*}%r5bzmV7c)&@WKt2~y4b|9HMJl5H&Vu>o3CyyGrDdVvaR*Q}0Pj4p=S!5KA_Fdx z3m>wak34eku*I@d<=MC_Xlq*258mS^5Wf{xH4$YXkx(eV#R4Tgc^hWgh##<`60qXU z8b#DFE0=-2Q`LZaaj450TRfTt9IRN=GjfoT5?Vb`OS|XcM;d?baP3{+GjD>Kff62G zqbD$N0{6sGC{TB|TS~|^Sq58_Xw1)hE`Czaw-3yNn{9)F<8YYQxxk4boYzs}xA+dr z1Vd?Al4aQ!U|As=tGG(-*8cU@%{>+0zN4|I7E48A@tAW5 ztZO~6tO>yBbjC!UvjmF)E3<1Lgv~!H{mz=a_t`G%NW(CC#u3{*%}mQyg{Zi6~;ZoNpT-Sa1T>@*k|*ZCDlzScQ6ABSnA_s;?s? zbLaPss$m%FUs)&ZSX~&Khze}|oW>vmW!Be(5|^%JHRpzt{Z>W zD|=K=bQ|KGS%0twAQ_~OWaBZxd2!SA%YN(Uot>N4O*NvBm1~ogt+7<=T;+05Z%LTqKWBgQ2aD^~XIog2^#yC1ont7XM(@9IlW-)YZ^1sDJ+BuVf} zIS-xr57uUHta~q>UUSw1c$y>trQe-1K(YGDt9xcfmOdY=IGt;oyvUP4Q;OSpSQZ_@ zI;z)4SvKyiXR4GM>aZ#mDJlE=DyWt5SJsjZs|y>Q4FHRwDFR$jCmk*-t(F0bY*Kx& z{)8psEbI0{$zZ!34ZD_q-mM~0rTV$Xt}5Rr334Fia0jY9h@X;-ecc9sTUGn1mnD89 zz>2yHtai>#BGO{5e!Y*MEg1c=h9Iqp`yLKxLWr%8)#ZZMtEEm&ZQN*?-&S`wNBrmzj0?ZCbD0OGoftn!6qRW&b(wC{`3 z{tguVmm9xaJHza@_IE{p`R%9eSaZ$_BVrN{3!b}ks-;+D|E$?DM=YV z3|l^i?w!>&3=@-AE~ZkIN+l-JBE$0_SUF=4HYxq))m5wsSp&r)5ZMvJJeSLwH}_5O zG2FkX*U0#+=G90N6pLtfA|+tmv|$|qn~f%fsMd&QYRzU^aR~?4ckw=~|7(PrrQ$N1 zs=HIXFVkU@>Eh3As2A#s)xC$!Y3IBlsa|hH`5FtXX#OTDqR<^Efa<3A}DoSV_n`w*cJ z6on|gSVd|W>_;HAT59jy*xC8TrB6I{;}@e%xjuc$jy1iu7PB_?FvwA*QdqSnOtOF0 z;}wETfiX%kBA`T~s8sPjy4p`()|r{8oc$sjU3FHRF`5jBSp8sB#X?#Y`(Sl@9h=De zgod|4qCgr{ex)2SueS}6?vK?SSHXa=^?5goK(abq?o-S%k6_vC5T$4$0Y@30q;-n9 zgt3PouJ_04evH!|w=75Fb#H?(h33X8YaW2V?JuvcjB1(|CoNVX0IcOzcJJr5iTdp? zt6GcmO}U;B60%%ydp(Y^`SjlPotD|>HRAgiEJCF8R9a3aq;#XYHD+zABf9?9!VzTCJV39(l@!H8S^P$|2Aqr4S@95~T>j zkDOJpf7aX=U#z8Er>@K}G(nOmysX3Fqd~CxVZoV!l(t+IPj=Pmn29;pc#ywHDOs(; z@l%gr9qAgz1PM8W?N{^s&_4Dzb>S^KVHX`War&PL;jF6%n{a4crKpX^58&aR7E;&?6g75Rj3cf;8jY@|M$7iaSV&9zR<`Xz zOX*wRduB2`v3-t|9pALGJ@a*r2 zV%Xuu+RgBHa^R*K9JCsAq{jD9cO5wO`)Oe}xmEJIrp7ZBdta2tryG65xu)sk$;?oo^ zi0VObFH|K(vxbjRbr1Fnv8;MN);|m<_Ta(`7yTUBL$pK1vf^>C>kyqEP?czJzejI- zcEz%W#{rc)lGL5RuE;c>?DxK?W@xV%7LVebx|@XRQMKBvUNBu`dSAkvU{c~(yjQkT zEE(92s`EY&EK&=4^$S~w>hVRpKmPpFPd~qIX%WzdjUlvaZ%$2Y42re2zRuPJ`8_mK zu4=XE>fzwI*T1`;K`Vqy|ByMQf=VeOh~>ydF;G7ohdL*QDQ9X`awL|_Xx~`!c`Nxa z6p#iP=D3_Xrdl`rI#&r`v8#M52lZsNPAgMslJsdcK{LnIRJs6kK#RX@5zD&XN9w)t zaOp0LGJQ-3Lt1EZ;T6x~Vfp~+yEt?Yy!~S>9Zc1#<&jtbld-pjk#Hc8H#3h8eF<87 zI*MOIRVKXwS5sG_(j`1t&WRu65CuXSb43E(lTt5z*AuMfYTA+gg5ckS>%BKt)C=mk zwohwE^$Sw(u{fK4GOR!nD}PW65$R*`vF8;l8;NX(b?PulX2|eYj~=Hp)iTY*0#Jr_ zdWv>(8LuZz1)Y;ZtT7!6p_Dk6f=e_!eVl0f6YaKk8@`NxzSq$_bcbvzPiSdcB9Nt2 zsiv1`wt$qX5+NL?5>?lbMco(9vO1tBp_3|TASo6~hu~BK*GtT`UxY#_fQ86Ao3qBk zC2l#h*v(Me#iY|TTrVWr)yg$%Ng{-Gefg-;>*Mn!_ru;}H4590&@pk%+7Qa(VJelL zG#vP#&)$O0vmeAmH&{zkLRkR2I+ME(V2>5`J?0L-P zJJeWOP})#(9SmDTw70R z?72&I6u#gMJxT)zJZtyxAq%;|61LFK9&`?RFE|RIB5=z=D(0 z;5Ze_soA1l+mCi$c@-4P&uCNI3IE`2+@D*OBU4hTP}ZAHw(e7BA$B1ZKz&Yw$~@Wj z>?QUFZ@WD;AHamO-gC|MXo7JG?a4p?ry=2}$%OU!WqJIN0&3|(_wZCos( zY{!jO$T=k-L9^l*A#8M7qkhsjY9AdrHCP})pL?+x$rQpK;sv)r z;wFOfqxD(sNumB{ddKtGX(ze;Epbj~94|{mu#mYq_61zE7wnxvqki^hk9xXgbgsJl zusGWkh;Y9U>9o^gX*CK}qXmVH%qg@A{o--$GJNgPD?7E1* zpE{>~RyiVq#n(49~6pNbu zvXOj99R(<(LIWs;hvj#mQtzG*6a1N#?!|i-GApk=IcGv4(^P?Qe`abj$Fr5Kl$}B z^mJ0lv5ip5Di!4yBDYzUn7tK6?Uu{>*-7L5r;pZU%W_*L)ECRTd6El2*MP!Fq4VYP zr*AqU)K?6~>!^5`{@wx0(sj0$-+j{>>Hk6x#IuGew%L-|bXGvqn{yx9R*7eilUA`T z{wxP5(yVTrnJ)XA58iVGsHf?qjb({l4;@a_31c*y7mJH%Z|lK>)otqOQQRsO$KqQb zmY`Rk8a75}c4Jj`=gqlQqW_2#>ldKdTiUyCEUXv~yM;m}cV8lTL5?vL;oxE~&MURr z=MG1GO%tkV6dO$NSQB=6aOmIwSBD==vR7j^{uQ*^jaKXCIy6D!`em(h@A8N&z43jc z^S#eErLY`JZJS<9F&azhP)<89*R9rdrToe-Og1&bJEPJoXDgP9(QdRf8k^HFMnEmc zY$91a4+?N*WU|?VJc_pNOMoGPA#U*Vd?c77u0by=RtZ;!W{s@#u@@gOfPrJEJ-04H z*j&5~OUZba=*P%PR&2gt*KRDsW0Y7oa9TFv8m3agDwdoFVbEHkm6_B*P-R}PL@Sow zfvsVy5sgKw;)7^rmx~ z^-IFB5M<;%q+YML*!3#F$)#5;?w?V3QmH~Jm9Ivln2q-onNv)S3 z3g%d|${<`^?C;DWqlR84o0(CO7&a}vVj(ZfMqdxX^kgNck|_|*Pn#7Pu`|*Pn0!X> zxE`ZKG3vJ-EDFw<+zNKZ8f}8zd6136nUEyi6-&pdd4cUqxaK7ANpobOCVryxCK(S) zp%@zrPy$%OYJyXnh3x43wcu-?w zA^guouKs4Xjs*Y!000L0TTf$0QN-?$00000000000000000000000000000000000 z0K{$`(*OX%000{Y8Za{-T-e)>!|7Pkswe;e000000000005Dg+6#x_L`%eH&kX4FB zvtz%ZNrZ76z@K~JsF$mS+=~m8R z&S-|9ty%2)qZJm>KMP?HXXz@V4EuKkLczc{z3b6I_43$r)mhI6^^N%BIZnU+em@MW z35K09e}V%ThGF_=OI#XF^w&&_MUWgvQUJrS{}GvtCH={16Q~6QX=Hlrc00q>Ou%9o zrX8|B=}KM-C!erD|0u4&acTP#esNP#6;N|U%^cpg5CKm&DsGSBQ4Sb)kf z5H~L|*PG)HEShdk^|9(cBP^!rp~C|> zurQr6Fw5nO{p)!SAnVR6vhu>BT?(vanTGXb9x<_Ofxyy5C*Ajg?ez^~b%^P{$+3Ca)TyI^M)S>c zHlSy=8MwS^nhUG~L#at>vd8+V1bq?!R--7E02I&$AqW&n0u8W29(F}C-;I1UgT0ar z7ZWfUzM>|>Dyc3aboIb*DvPNbShl*tD^m@?A| z4l!h${>enzCrTGnnH~c1SWbUbdf*dpT>Fq=5ChBWJ$?R|#~TQYH7r^=pE>YnGA;1B zhsTCJM+3pr4O73&mo^jl-H6V}6)Ad%XMrlVY&P3e?UyQnrD`DTj^wPR+1b)YD-C8gu@lCXd@Wj?mk@(_!Aa++lopSR z=Mu4)4WKY=@Vmm9uul}jvDi+ub1ig^y3!#L)=I~u9)QBM;@RVo^KOsZ8ys8I-q<~l z@wAhoK$T(3vwOo+$Bw%l!P9p;I(mOxWM3!v-PRn7NYRPt#B)w%%(TzE z@B4kztv&RrX8Xq0(Yo&)L)9auG0AS1CuTmaS9S_lf@^D=;b_JbDiNugCxgNAM^WhY z3;c9kwuJx5s-6JI$dev~Ex1Yr-sT}l;e3Rna4>*hvbq8?jnBvs%GCWks)(F%B*fAJ z{SpJDVsHY(=)^>;rVt7F6hmMD8CX8n<(kkJaI)%W8G-__MiL|=$if$UILOzU5t%g2 zI-TzGerse7!|_g|aT)&DtU>mt?4=T=63r=WWM;1FM;mpuL)*1_4GW`(jx=Tjn?Abw z6}#^V{5?I$uC3aG!(O#A3mHspu0_L}YwMwvw@MTQqrj^*kXOH;f9KJrD=x2`DRPHK zul_eKD|JqG(In9F9h|wy@rX+ksez)T+1Nd+$A^)7($7?51>s zrl?uByu94c{8_8_>02%O0J_vZ+ZK{IK*1h20+&-j=U|){4MGnM$o3$I(1R;y5};f#Y_> zpT0?Xsk#*0-!Fwxt4;!tH}?PI$4<_|9_B9=-s%f?b? zp1t|r#+P*?Cd+xX7WzQ2H9mIBkCk6VmV|x(PCxb78Y0%F+tRJhyJ?NSCJ^w)rv_n2 zVa2!7l<$lkJ$B4CQ~vten*FycZ+g@nGF=8%_NA{1Y>xs3Y6{MyAH;wQ7>N;>Q*;;h z9;!c$f*lOs2G$oZ7G&zLV}MjV)Ur^{F-IXAQ@2er*p4cqTrTd5`n|Ln?hz{^LbJpLANU{NknMCQVCfUEp|<-_bHL0%zlr)Y|j}YBju}m{;GWrKWmE zisPI;lfq=4osTYqvR(8X|8$P}9W!-WY)@>1!F)9(YNkAQN4hWY<5bJ>VT}JT%nRwYyf|*~TNc_nm4y@)hgf?+0}>O>NNh z17L+LkErteYQr`;IG_uSL=lr1^VAifWJ;PppebaRNLY+4vtKk9fSJ-~tPDkG{1V2> z+@3~@G@4Aj<62L!G|yyI5jM$j>%vh@h8)WEssU~& zri>mnEUQ4N39OIwF@Na~+$z~qjy4xu)PP=Lza)^he^-Nao=6bB^GcDE@p#HJi)v{# z`KqYYZyq)bRUSNeGjZzWA&a@&42X#&H_%~5H#Q=@3#V$&;wLM0hdzJz%{)VPDo~Ej zNml$sH*Hy7?lyP*triSq9a&y59{Fj~$yMy5#8Ro%rN=(?WTq4nKFgh|JQt-LR&XT* z7g&m?608&m2bNz$MYTB zW3`Jme0jdCvh0TCeyqzJiN&I^t?&jEiiN`)(THW?v%aDE#mchEo9AD8wJGO_%#xpF zoI))5K;?}?UFHjGVaC4E?%J1^B9m-5++Md|owd?q_x67|%yGg)zm>1h#Upt{wK^2~ z!0j#%jcF?+SlmQSU^Um})DL*Q)6>P}cLjk}W5G~RnEJ?8f6288Rghlj3m=1oW}L}H zi;!*iKpx$&H#vm1fr1oHV0qq0X42Y8f!j%u)gAu?3{|a9Tv2~8wVptB=?{xT3Q{U{ zf3vD&8w|>auj)`#B(PlKyjt)9mrzGeFDvh4s$_DENjN1b{>2@2z#y%{ zjWqxmWSX~2qR;0e&j$m6W1J+ABkVjRoA%J>jh%D6R?5_ z!Si(S^z^Yyj94(Z9gv_&55B9=rWeK_8@Ju`QtfRh6Fw6~tr7?shM{(XUz`Fi2z5xC zpowthQ{-~srO($hnGA8BFLBx-NNH|IahqBxN8z^v9qKmFGH`sm?UJ2SqwKCqA+fHy zA40w=Aq7Nc&MyU0axN~d3&ReiiZlx6PPJOC$a8aqk05t@9K`ual9GW8iZ*t=2b~WO z4TxdL3-kwpnLg6S<7t;hk@uN!{Y%Gvn08 z#zrg}j)_2;Xfzy-MZ`!X7GVr$558M=!zbMz&o`@b-X)wBkzP}zVs+!&v(_xNj6Z!E zUR{+$DqOK|U-YgX7#Z<;XI$F!pj~i}+eVJ&Ih7WJ*gz8q9v}Bkj|s?1+*Mv|oAwshUvUX7RZAu)mkWJpR;4O>oFOPTgA)Y7Cnh{~d(c-X z*?qnmxUg+Z{!D8zR9do%1Ku0QKYqV5C$Yd1#w?#vd@?C!uk|$+ zTaAh1!{OET{fef8L&0v_1m* zE$ES#Z^6rC!jIi)EoiJs%9Yjz+LhHh4i-n|d3y!qzJK>6gdnZsor1?xql~K8xMYv) z^htw|NB0!(mNGaiNmktLacGrotPNC=EYd6wn3?{YD#8h;o3w%|Qr4-e#)f4egNNiV z4hH-SL}&Q*ger$s)=DFLQZP&Z1WvzxGzX zV;o&Rd%9SRgkkYpKo~erb6c?_9A`3`jF?W0zT>^|%=Cc|KY#9M4qhea<^=Y$uT8u- zmbDgkqK6m78<%5Y&hNkKihWr{j~I|(veNEEPqEEr8_5H#29wd^)J{#=C5g3K%qO}- z!5sIDriYEjPGeV>*)YSg?wOJP0WVtJmlUwB!-ich5ytvpKyz>NPI@%HQ&i1Clqm8P zx!v`03fxXo{zivNDLXwVtYujHcKAW;k{@6TY24~({Vrv8DFcQdXn_V}a-sZix^YSZ zgQpBw_sHoA2xV9&L7v{az~jt02*M)?aYZJ$x+kNGIN&WLGW{7P1gPFNaV1>K$*D4*LDANa?gy_pwilSy+94maI z$+@K?qsCLZ14AcI4UNy>SQMS5NOCIzH?S=+i4Y$JE}QyJz4P&z=`-^Wc%RE|d{oC- z0%QH+$)AR2#W{9-0jg(pwb;B)YjJlfm3?gIwHg#mwFPw$s&l-Y%vEqjhO2 z5C}{S3N*;Al~8t+mbA@TjGgcpfN^1VYE|3SW$QmZJ#Dj{`+xjD8w%H*lnFz#$OM&e z?rGks38h~}4N{8bAlqiJo!ki`WXa!@`Tn*Jg_W*$f%B5ZN!oXj;1?$*G0c^gWS3qM zhbd%os~jYGabH4wRF#e^0|Su3fhZy~_{F6RN!Os)m5{V_7Nat%2xqdWqPu^FQWZ)@ z=jVFdiP%_?aFdEF}Jit<$jh&{s zr5ddkwS$3PE6-@M14~aKS{V$+nQsAc=3aBZ83s7ceRnB+E0*eU21D}$5Il)uqHb^B zkn(f;Q$kAM7}7`ml{?Kr9xYV2fGY`fC}by{MmY*iB3?x1AXTJb>|Omkcjp_M zMjgg+N!D)a3)5z`%w#lcKx~Y0)@bLSL>yk`-zn)9H7IjNlO|SQ`%buCq0mz9pa=p- zN(##a99i{S&AU= zXoRiA>Td$Kad9-z$LyE&_luG9f1KvlbH&tC9FQ^5hVT6Dj&i`U=jWw&d zHFJ$nKXm;CQqnGkpvlTJjg_}-aEcUFk#s35iOokq6=^yfo?_JsWbhTG!Eg{1Rs<*$ z(;jMYf>m$Y@5iG;bVO2rkk&{xQc5%cmaOGKSxpjFD^;{hmqLj|q>|MR%IaS$WN6Ym z;!-O#+83__Uanu?#5aF}ay7me;Lo+Is@&>C&-mr#6~AKObe(d~FrW}QEEra5q-tH! z>B_FIu#Kij>YF|LkdCa^By!3Ec5ujS8nSdYeDyy5T#CS95fp`)ZCiDL)p~MN1eSv& zM8;W7CXrdA=KoQb@bL)k!wFnW%7^irc_#8t?QZV|G`%?T#*JEAkNk7)#N>JV@H8I* zhto`0OW@dr?;w(q41US!?=~PBlQmW!)d>&@vF-P?^RU}B4n)2f)4Sq@UwyYtrCP}~5Ct%WkDUJEFEL)1{8vyG-xoYLCejzgB zm((8)Y&uaXDfRc%?-bv9?<#`eBr!cBNR}e)C{y9vbm7kWymFb`;YmxftX67NS%A#7 zZGqbsVRIDd48^Wp)o5SUt79W(&-#TSwMx3&3o!YC(J4%=E~^yD?LXGq-l+w=QfUW} z_JEmWm^7E)yZt$>$Bia&S&RUzr(2u(^$Y?u76HJrjoQBKY^2BlS^duwuu_Bx79cD2 zKll(u%QG+3lrk?)DRJcH%j7Vmz%2BqYHf={Z!|lJ^88H*w;8eNWrySm`%CVWqV2wo ze7-5?b;v{Dgx@DbNl8^iU_Ri&%$a7v5Ut}&QhsqeOhltO+>n0H;i6wE`s#QblwepG zt89E+JE};KEM>)Uf{E~~a^O&-oV<)ol6W-1NP>X?GEB3jb$#-50~@!BRIO<|vQgwV zCGMG2%ZqfH7i&FOj>RvFD1R8!d8*!OBJ zh%AuV*FKK-z>VNql>o#{A>omvcz&f>`T% zd>v}t|LL(>tp%N0IiPc|EZRxtC{4nD<=(BwjgT`LEkow}op2q>b4%Ta?p(^UF2Ei{8Lb{$RnomSZyrI5df(d^0m>NMzj^`!8P-H`RvDBpv zD9+U(LrZ6C|2T?(CMAn(rNk6=(;tNpF9;jT>KyFQmK~OoSFHz>$uhJ8%GCfVl-SCj zq|EhSOKpdW6{<^H^;cE~mQF)4sgC}nORMu(hDpl${i>=@v%bCk^P}C}ae3RLpL`OB zv&?9<8l6jEDbhTVt7`8*a=KIUk@sLfU*9Ahpt3HnCbgO_IIs98@eaANZ>N?=qg81U zE5m>iqpn?J`#U@L$`p#jSSDCT^OHxK1IbGmv>y`TrgDnj~>IdruHjb`S3kUY`)A2Kn zR8g?%B}rd`s;7!@roy(VGNb{uTBq;y) zmvb6T+m)%LvhUMwZTGph*o7B0z!+qNVX19lbY$GAYwOk?k$8O#4ti-Arm&Mgr&6@> zG6EpHaxkd^@@X`W#^o0-xOG~sE=aRXp+zcK8MU1{bLMn2Z7n}( zvH`G$ZL{sMuBIAT&)7^v3LiC#yc!+7eCU?{_& zEl;#GkswY&9)0%)U{5l4O3gsF-8d+R?h=BDz`}hFX(fXJuu7j9`WwNo><%C#NhD?{ zK|+3Pl4iVESvTka3=IU90w?__!EP{=R4vYqMcG8D*wNsJnT{YS0V(4g%Sx*vhT|@)yB_)=uRT(~> zndN3wCmo zz6`cdoAY|q>W=Q5VmZ*&qXC=fo#$DC+b%f94xZ2H<5Hru6Uofd0zrVvBF!nvdU-X6 zs6C#fSFxnZ#TMFoKv*83-r<}ue@=%v08e4K5a6B zAvDh|zjEf4W`K40Wt$Oz<-jIhI`a5SClCGmKgHib7oCMEa6V1l5C=5xyYnyO)=ZWf zw(}u2+bDmBg!P0t3N#;LeD*q1f+4VR>!%ylI#EWvq)3KDowU~GgS1wo&viC{U)fJq z5kCP@3NQT0;uLr8q` zS5-G@7kFlORg?`uw!dyb(pQ$w)awR4sL43JxBzD?PEu3zf9_o@`mq}NK4BV|OdGo~q^482Luz+71#b`h}=h6guzP-V~| zvrLI!?+ye${rjPbcJQ|S_bS3pHxP^C?5kA+f))8ZyNUY}K&%ZYRb;aH5|=a>axMY# zun&^UL-O~e4lAeh4x>pmhLd(1N{f_1%HD8T9d37eC)(S3Vl`edsT9d=+KtPXh5~U3 z@c-abst3e5$c>^n zpo!h}_uPpCO;lwfS=h1-mJ-wY@RAsE)5t`#ryRq8^F(F z%qh|&ZWr==DNomGef<^Gy81vp{ILFzT?5n;rH^#Ar{^{>!Uww>Oy!2i)G}So=au6`W@&=-!hAjhO@I z?U&*z{mEU6?XPOvjl&qEKxT~M%s8DITMfE{o^WQt8H9~JnRYGkiXjM^KvOuVOuPG7 zn{IHgi1iXg?m#Row0QQ7rWBSRgV}YMPar7j%GqXs^#Y91+hEbtXWxDIfA9l-_o5qL z+_?Eg$YGb50)OP|j~agZK?bkX<2%_lRpjoI&Yg&9mIXM}YpufTc^@!l1XL03AVVQv zVYjrlFwJZU4;iW)J8-fdM_X@Gmyt4w!kd0Z{Jmf5<(e<~g7rNB+1yppm*jsa&1=6k z7`N^==v19`p}gPYG3gXIM13h9h$Y%3sPcp_`!#HbhFXv1^B=JsCzN{n7V7@;B^0~O z16$t+BVy2-(%_ds6@4at%7TUC5>*jR3&p5*KtEobk;mfw(!IC?_hvj6wwdh7cq}7skHR~Nr_-R0 z3^|7#x57{s>LaWoV?xuFt*}9t^l)oMW<}G{9}zgv4aQp@85UtaZj7mXaPTn zxYB9S7OvVsn-VDgYpv;GF+8C6`nI@PZIz=smc2{I3@2N5Il+FU>}hunJ4lSg^+|^q zETzU=PNT`~93LB>otlcZI~N%mBB>NnU@*JYHWKfd)V?Cy<*J|5m4nL*7l$!eY~C@9 zK?lt`<{rCv**oEKc|7BbUFtcONr`ITODR6Oc8wMQeVgYW^ zJ3k1f#j&D9^kM1T35En&nBO^6j|#W#zoU$dfL%gxmieMxcz> zu|oy|v{5t!lwkzIU_eH=P?u8CzTDHb5I@x_+s($^=?q&&!oi#>>4Hb zPC_kz2)Bkp(`-e^8FW+JmQSJAjT1ew(YABz+7nRfZ@1Qi>M?gNGcsx;Q>0h#bbys3 zu!(aW6P6Lns3{POeYU36~eUiCT^yUK$``NAa z8ME(pcq2Q-rq>4Zm}Kr`N24$bWJvbP>ehO&T!v8~mzyAavxjv`qZIRM_Q0#UD68B))N}5;ad>AA=41w+hDKiNMa+MpENyC6vHzdUM zIP?i`t0QHgn9G~-1amoO8UhfS&+<{UHY7hYlVHVKd76WDL8+Kr?vtMqo8i(&c85Ee zbgPr&w#(Ils$-3+siF|5A_7zqo3Css1`IB2F_v-0+SdD}uhzZcjAz8-4SI4xZxXYu zB6le6dLO55@|tv0+L;3xarVUe17tWmeQCnfzSLEHb?^Yx`WusPFI&{r zWGrye87yuS&5H;>!UuYP>dZZdri#A*g{&#a+Wzy1nG(W!$|2mkXe!UJkQ1W)rt z=IJ_9-~>ECGs@OF51)94R;^SHdO~6n&Puht7zn;&O19l_L?(%a{rm1fyhCDt37U>k z(jo4Eqc(9OadRd+GYy$G%V&#gvjYPNr1(eJ)H)$oEx%R$`neR%{Y zNMF?N$IwuOUi67z$X1vELsF%%s`Qh>i~;1DOvJE+sN6k7tvWf{)K}03*SUPvEO{G{q z$Q24HlGxulV<(Pddu(Rv zFC52pgX5%R;$+j}CfJTks}@hvI=kVcGe6`-bOry0C@VYnoj|fmi8jwc4D% zlg#|)oacScag|p9mMib8h*kUfjm-Xr!}(JFV#}bdP&A&XaRWRB7Hu8%(3E>(B!FI_ ze8}%c_TieGSqS(iGXO&=A2asqy&F?)jJI^v*nJcg&c30ruRhA=^$ZQ!-L8pi>-hkL zlmG$4jLS{RrBZ3xfa*btS;7mu#|>2SM~C-C!_#2Ou+Il#aRMVnLLn>E6e7yZAe%uf zs6~*ku3tH?O{)|M0PFKeJ!;i)*cg#|C8tk{u_Lf5`NmxVyK5#s6quZ!hi6K6o*FuN zr9+!kr4wm|;wZMYfBEbYW4sV!&0*2OiOATjL^iVL-MB#a!c=^>lr=D%|G0`VN-XA! zu!>?rGpA`fir>Jq*VkR4)`BcAIvs*2jCdHyj@>dew_tlO39`ENH0yNQd|}BmmJ6dSv=aW&ygiTE^}ACFeZ`Z%x1cwO zF)bfVwE07Zk5pql!&0TbJmhhj1?PG>vo$kQs z^Wi!qZTE3V*L*BR@ivr&gW(X#WM+nD=O>{@_ZqqAT#woydKIk+#F8P@zGoeBh*us# zEtt44OVcbz2}39gD;`%UU&v3-m!^_>+CKROwFIf$<4vVK8cj+y*CQu;dlsTi?L6dr zWPKwJ(PyG4N{qrqfFuiDKZSh0G!Mv75S^w}2E8a)qA8oVvuJU4s`TBYl6!x;jnz+w zZ61#;#!JGm8Kfa);W!r+E2-sRLer6?6Qz3z1LNU!TF#kJU13edqKE5mYJNXS3EBz! z)=jpc&8C%{ru7Ps>8V4mkd4<$Ue;ht*vsn9VkiW~J>P0H3eMtN3Ui{T!{XJQsK$C0 zSaKR7mf*F-)B?xd#F)gfaaSlbee2fJ_{}F%{eBGmvjSMZ`T1|Mb?0J!;*GC=?2U70 z@6JreGXz)|m;AjKImNIP=nUFJE*fh&@t)pQO1i>@#&d}hXI?Fo zZrq6P84l+&m}>P-995yaR7k)I)LPor=&7b!z^dL?%Jm9mwW4&pHay}Ag~P~-i153o zqaaPw8ns%957Ux=_j<3Y@93eL1rxYHDngoqes5oZjc0w3cIDmGatT68>AF#`)rz9T zcw1XE3#CiFVY0KDSXPFyC|_7Fn4mx*1F2?MakqVvq(z0*i*KFQOJb1qdI_-b!0b!X zr@%snC5T*@W_^OkVnQb4LUle#x?OyY;p0yYX zIiCon+w2n~qq#D4Hh;l2ozdv^lxu1ZmnlNzN)%g?Sq-$OqP+S5K1-~Am>MknS`1RT zEnEp(e3TFZWXd!ntptM#IMVs6g?lG)*5QxszzUK74dhy_KnNzOWL z0>m}7#9do= zu?;d#UrcQ?fmqVedU<>z%y=SE8=p)JEw32VOIvtbD2%j?7u$|+S)=N~({IX}tH64; zs_(D(thAo&i#O#g^V=b7-a6unFQIF5`sTE2DSm5nX?iQ4Uohw`aB z^*8TsKm!J_tfARN)O-E=FYd4gq#!uVsW!S!zH_-ST}yWgjRxj-FZXIsyi~`CK**4Y zt*_4b^YkD$5x+$Yhi-f*VFuFnd?|w?wR%tHug5qQ&9kkvq_0B;>E|E32#6if<()y(sc5vZ7QnDQm7( z_bSyfhm#iso+p@L*wL_P8@Dc1AbB%tz4of7@Xj1#(DH)F2#OX(LeuG0yoHl|#p~p(!^i1xSTF&bv5MGLDT2yIGPr}jp?KjDFzR%TA zRo!J>HXH1$!kTBeTrrL1K<3IitaU5|ExK%p6FrRbXnQ3=5=`l0F=0*>i*F*q!p8pb ztA;Uoft<73e{kCQIxWtL2Y4s+p9A&P97U8Y%lpdVPki5bMrrm zSkN@h0*n?GA!fT4C_HlF7#tpzhg+fP_)gw3Sl{HmQAlzF!m^e&zXwvuRG1)16|M_ z@|EqXic+sCJj2r8{so$Oq(RMvs_x{1e(VpppIU(y^?HMLW8<=pS^7pDUhRQK)?cRF z`1I7k=+Np!c~EfU>>0xEO{lf=y#_TNnHVF5{A~tNi3hpvk)!+!Mca`HnTN+*q4o6% z6RnU~BBYdX_$^FuqDX+nr4fX@C0neW; z1@@^1WHlZb{1UrkHV^M~gmF^AjnaB*U64F(RMaGusc`wyrMFIt6fbHeQA($yQB`NU zGuw1zA7jJezL<^U0X{)=az0|9;wX^~xm_HA3}r_~T0%J}@i7TpNG82$RnLm4vnWHb zXMLk2$LgcQPN#<#EyIpV#W7;ak%+F1yxnez;EZryKNt=gb$DIi&EwQ`7ERG?uc4Z& zz4T8y9daygXsJ~&n|*ZIoEsev<&zRC3`&V;#hAA8nx)XNiQnQ@F6S`A)^&3!bo&+(()+huuK9Q<-+TV#JUX`*rtM1?S=+*z z;gyeqS7{p?i3|Z)DA#7Drlu}m4F-efYRU7#SZsD95}BMY0a&F>W@-wb0=>)!gP*Kz zvAjCFVV|jf1C-_O{dDT`rR897;DtRZ#LeEM9HIx)6T_v=%x31zJ>BVMRd>3%=K{ZV zxpc44X{7V=BgkXw5=*8$`+Jy7fAQJia(ozG;sDWoG0UCejemQR1a|r=eoPb3`7Qbg#a94+?dOg=&?yhy4B#01N8a zL}*Jts8&eH)5g~de_W;|EKzG1-Mykc`&9C+M=UrIP%2IM^bGCuNm}eHFzH`{>QtKh zwKpdO1-&umjiwTsjDeYz!$G)8|uCdE=IR@1X$ zYeEsdU!*>hg%^2;Pqc8f1!+y#Cy6$^EFw;)GcuFejdz}w!XkcNpo}*aO?URJn7#ja zfbx`B-TJW2iM)?Bp~IN*nRB_EElB%9`Hj{5&d!SdwdpXUMm`59n{1lS9w(cXm=oC8 zKj)(|3YjPjHes`g<7nEPTX%&l9`rZ|6E;p83}mzUQHJ4pSl>k{g|~${rE&ECGnDaj zM+uFReqk$bbBu69h51O%8bT=!PNA{Kx|MNFW1u3fzZj=*V^9mNYn@Qtqy0@EdO`R} zZ_vvkvkJ5>E(WaRs0B@J(O}TKKTZyLJiPbrM&xb@vwJ_A0kS5sN&!!;?*I`;hn5#` z?tJ6Ig$HOQo4j5J}NR+2ECq`!J}Ru}MuSd!1jP)O7`r{th?32Ug750y&S=T0kHVqvXs-Pr4m zq|>P{V{3H)l|X90L!pYML=J!%4O0%Fi*gQeWrn7Oad&5%Dk%tSVcMwmcvlny&4=;8 z)G^>I`B+ywHv)l(8a4aimw*tDxm*@^=2BAIqS6FKwYYBRmC{+((vy-OMdq>pi=tWH z7mHaOl*vq^Zt_7EgNp;lZ}|`ki_&EBOILsdiD97nrB~QQPgW@-uZ;bUL6u!TFooxB z=5lyA%+Tvx*cyVTAUYeJy{a9g^O+9ODT-QMOyVp6mY3C>AvN57*C+1^djc->=H$wb z5hPjbIa7o$hhf3sT2~k*yBuH`oR&)TQf5uc7By^Y1tQ(PqTf+jJ10clLr&AR>7_@G z`7O62Hw48V-gb9BKmTyPute)FmJ+n&onHxDRrN&K&R0pS5BbsS7Q8mrjxuC+WqBcB zpG_o|FYmZLLGS)0-U*u^L^kY!yLWaU{Pq_QGV?QunLBrGlvuvjcl>zXjnoZCRizuh z_``!6yOYaTKQn_Y6Y6>6PH0k%#gT9bIfXPtAB#87QX*BA1Uaiv!^1}`M@&THrz=D7L(IaaJ za&&Gr-#Vz*>UF1$*}}aYO&D)@Ez21D_wfzvBTJ)N4PARQ=AH?Snukraz@qPj5`^*9 z%$#A}EUDp>G&6rfaalj}t6~PJU$@Nydy-|s5mv{{VVyQ{F`NCumEKsQskv+r2&2w-P`c!qQ;L-QnG){V+DqQ$L|P!4hSw|WV_ezci-k?# zGsz;EiWHe`Yay}1MqMmyDHb)F=o#chHBL`t%Dz4!<{UGJ>2-6C<8nShppjG2jHZ>= zFJJYQCE!Xejcjek;126mj6z? zwDaJ>E-og#7BhhLB6k#mSdbga z2F6TU^W!e!+L2HIhOnT9fyqd`F^ws8 z@J8ewU2_3`@L{>pT8-YCP^o9`wb^?kv|25U>Hfsa>Xd`e9*wut97{8Fnd2n%3QM{c zwf1y}*Q;vN1WCCx!ZF?Q!!MD&eQ-|dqgjYp6u=+~VG2r?MWYIOQ>qpXAj5O(TAn<6 zN9x9^@xH!gHLC%pX66Ho1$PiQ^V1<&Xvm!Zav4LhK@ucv^Fs`5iJ%? zIV9adMly}h-%gU_S>(!fV!>@28@a}!{>286md(z%Ttj2SX58>Y8!ji_NE?Ndy~)S~rStI57~JcV;Z;l`UNx@|g(l#aSPdZ! z5j<4#Q$}BY=Qu+__%)vIYb5i-s=B4iQiP>wr_V@lc)QqARWui_^s9bkvgjgh0zn*8Eg44sH%a~X9o(8RO!kAE{eE=4fle99h zuWC!L%}`{JX!IE~(>Ze)cy~BBL2%m056G)&Ny1qR`3kW_wRu?4ldYG<6F+KG`zw9z z-So%^92YsC(}5ueqt?)nb$pauB9iXe?IgXlIvT&-eU$vj>YYL(P3}I`KA(FO*xnjK zzoTP4hgf8I&Cg?stS~g?jbDecb!;hF+9f(Auzk8BF zh4<2a|2rFwPP^?hcS?^hJa};7!iCL}-+uSrowwhftnnRRha1&y_s{rCj~_pNaN%bc zGBb9QY19pD1z%hd>pkfmSu!TJO;lar#GvUXJ!n;fCezo{7#A?c_H%!}G&yTkw#Qem znI}dfzthr-ld}sKRc&g%FiiETwMN~E8o5G^cDpms+{^0|tC+JJcCC)D7B06Kgi^_j zA{L=uez`&W##vX_8PtP;(8MrTL0jQaxmuS*HVQpP$|4!g>*V{&S2c7V2+EZ(%Z9^v znlY9{t!iuOXlucc6Ae!Lh8;Ne*M0nBFEtd35Q}E5Eah=HAi=LCTiQBW=2Xavq7JoA z@QFU1wvmlh`2dE{G>=Jl0unZ7Y;LZlMU`wxB@_yeq_cGyw7%XGA4FyBiVzFZCP>OY zWgq7-n{7^(fPr-YSd3#>`qBFx2sIj`aCP0mQ?gge<`JJS$HhDxXF`?fOskTfh+@AKg>^RUEf5Q3A%&4etL|AlGAwk6#4lz_ew}fz9BdFV z&6ofDxv2%~sc|GS91i1xM0dilx7%B#U7ps$CnF;-tH!r=SZ4Qk_0jbBDhst11w==$ zo(h#t8ic+R;Ao>8JM?OMv+T?QhM2AA#)oJcJ`THwjT8#kPwTy_4lNT_HaDL3lLs1) zvqY6SCwZI&F{bWNrBW#jX0q8VW9^JiY;1fIk&{W+9V61~HVzu*fw|as&9e6=H8rk!IXIaJ0DTkbH4?^y6c}=o}8I1 z?Ex#Acyb>V-s}5qxzFN`+wc1C+<0)|0b$nT-8-Zvy#3^%7gmVbK&-7}3jzN>(FPDK>YzVRRSX2Z8ey_U5d0rjHKu`&| zPW6?`A*-*I3cEs9|H+;nX?8b73+?;a$mD~pA^&i~tuCN3Hx?woN@~(w^1~;z zuN*>x)iAMe&<D zM6_KdlPRTFz^jIKwU@5-_pu(4=bXW{wzn`Dp{FyOo}2T~+J2>EebaK2WyrkhmO8VJ`?^;#9FVEEvuo3&*!nP78Z57?k1)3y}Pn;WF7XOkzrpj1R*JM zI(^Z6>0*nHdd3pim{3QQcbBrMkESf4JY;T((HRwSjKb3O$^TUs^UEY91p$2oSX`JF zkd>ns2N{i`|0pC{vbo07H4;k635Z36WFZ(stTZY)wjD*6O#0Dbz^~C7dXHFWtLAwC zYfYn46^lJEc=qAH%A1;NynSjFnB)>cP#zb!2J{j3wI$d-IsS%TM%)`i)<7mxB|~@4 zEbz!8nbUJue)ZOs79AQ2vtF@VE(`ad9gRq^BIMUcpJ})ycLiSCWi=Es&q* zCFJ&9Z?=ct-7b9N1B3l7)~oH0JgtH!%xD!Yb5~l_dUYbdm53}Xjh$Ljjz4@@*s3w5 zH|rd-;%aoL^A8KUd#KNC0v{gGX6U*jFt5(W`x@@uNZ6{aG z7{g7~YiyJOX|I zK}qsQ3qnlMYh=1eC&+UIk_D7ilG;RiXcebRu8_ZHZVg?n4Pd#}@CGgnN!p3jD40&C z6`ccz4}pDT{VVW8D6B4`Zu>kQ&X+>0q^h4B%^x~c3x4%09gl<*3&4Ve1&31~>cJW! zT|HuvP`E^JCKjU%I*kg}gM>}qgkW$69BOb!h_gp5WlRcsBs~u^X{yyBb`&+830X64 zmG=Il4Q_2u$VaTROID{K#k@Akn6}%}NhFf7^&w1~y#KAE?XMnbG$GylVNHivftUCQ zXXt3P@TlvHYrfFd_VmN=A61@d{-{QczU)n>uU~lbWV2Mda|aR@MkLxIHg7F`>5voB z)1|lZ|L=f4AW&&zV~Cx+k*R?=tT*h5<;}OBfN@xlcS?o4%j~ev-&%CO=n~f74+~|k zEgB|pyys$O@E462ykU@$Pgc5({v zT-VoJy+LL2GjKJyR;|;=Kh+y=Z?4hv(vZfDQjUj$74?Y01fH61a-#H{p-7G;AeK`Q zgGjIx;1xhxlYRAxCFkK`2*%cuojt{DwiAqLu4A#S|2+4pV-WBKX-(4!#B>ukL(S8{ zno|@>p#GRB!q(stiGaX0f2 zbDjJaHX2Kxt5rfek&;~k;ob$Vuy(iOR?~D9SjTEimx(4)E0>VP-M|0tyYD{6ESAE! znRVNpFK+wuKTVs#nGQy~FpS=J>P#J3p}ti9^3ywkh);|p@en;4(zNSMuR%*pA0<$p zc3Fe@P|YC;@=wikKQZt4}N#5@G_eVNnd9NYk-w zB9$%n^w)B7)u#-6pB}Z*$wY_uFp*Zh`auMebF-uc6m_tqb71u%>Gl^1`o`}ckN=r?#2+i;L;nys~sI8bJrigy8LEm&e=V|>Mt1l)B9uLbH zVy#YtVL62iD^;iGrGDnu51XxxWtc>i(`&5}O;(OF^~{#LMmboYSbe`Sb6e67F}e zt$4kO;OocgT;MkoD+GyTeew8fD=V0Yb?(0gS9{afp03)xI1Nh|@2z^zUgOf((^XY; z4n!-tyyt9< zl&C?;T;2zpl3J}$WC6c!S>2u0uj7;gRCkt=c&{bgkxFSauackHbI~1{A8hy>j%S^w z#F{g!k>fVQJ$K}#=h7Sc1cCFxF>YZMe4?{zl!plrrR7Jv0HN=sR#vhrSOc$r^P9)& zyZ4TLs}(ig$>U$ZI({8uI}iElPhJNR2hN@Q?i>FV^40rquJ_h~ z(MQ%1@`ao7KW1O#*}-bAe$~zu8h>^ULxRB)6-6^R;gtd*j$AKGDbz^2=|wCRWHwr4j?*`r5fh zs=GH{ANc0EH^8c||2O4U)%Bmrz7Ka-NFv``2k*InVE1$#_%f^eI$T}Y*+Dr9Aj|vu z&i0Ws644F5@Jj#s{OV$>X2Igl9m&ey&M$Q^6=f zW&0_!LqsTLEnYQlE0HU^%w|gHIz>)({pj5yN8Xh$edts^IQ?K$flnT@ z8SrlhR5hXa$(2}g_$&^j`5i*IJqL$uuL=A4V^x_j6VJ1>+YZriR2!O}z6xaN)eN?Ljy7{E{YIz@N7*{Q7^ML*e1!;o;%o;o;%o;o;%o z;o;%o;o;%o;du~{8}{#577C+w41rOO@bK{P+(X(Cu*n?h?1ZrtwF<>9puse}v3Pjy6Da4eM^RKRm&@cRxmYU8!UUGoKs*#Y@II?Lp}y&U>@CDxaQ@bK{bd)Y6Cw_Q*$+<7{a zp)yp$1rtM=ALf|#l9s9V3Nu=%c)=mgX5OQYX%`k2T5iS)XaT~*!}E_KXDwqqvLE4& zF+cXM;VuCA+?Pdy>?MZsDutpIhU$2P;|w=UF}W(GYKmeqBV1e2V|TPMbw){Hya?XR-w27G)>U2^qLoJkW%i7&eF*!=1 zGIO3;%H}Mr={zW`g^Y>(*iyCv;o;%=CwWXAr`{?o#Pj2|TnC(IGw0`}I%U~JjL9`} zoxGkJ$?y5-O1OP4rp+iW;dU3tS1ty!!|sWTvCM;29Pi~LO*it+PkYXM@a4s+7u~$E zczFIv1aQBjRq0dgD%+vuikxCnO#wlPF3`6fZP6uQx^V`W?4!9nTiI zix3_jp1($BFz!Um)7ccGRSJb7EmJ^n>U`y5jN_1Sl&hKMJ$F-V64&XxGJlM_XG5jH;5{GY{7$ItZtgSF}Q|ggv&l z=;^#(XC!jc-RgEfjqu!O-r0}vJjkFmHEEJv0OP*eW>+#4qgJVunG{n{_7aC$gd&O` zT(?d;Zmf(qe|fD%Rs1xXQqXRpSG0w)mBs@@81DQ~r&H;4RdNJPGVxKbcq=RH%{ae0 z5F&}FbEa6ODppo*e=9?sLOW+jR9JgN;VTeNc&2l8F+`G4*V&oYR(C5jmHwho3iBZzk~4neUwshvw71@#;G*USr3o*-fXB3ojrB)lTewi3igeZnoO1GXqDI9 z2x~`P%;~ruIipghQi>pg-C`j`Ds`X2@qh*pj`87Q9gM4zSu9B=J}eSSVU$YYgO`s*d-!}ZQKS99#LqxqI? zL79@V&~jL0yk4&;)9az>Kp#OzY#FKyRq;_l@>$R_ZXryQO53MN{Dub54oA~4>{tiA zy8t+XCb?A;N@0{(^g{;;g@rjCj*oQ32UQvjSdTpNs(Lf;+c(fe4~9PFh7~I;3Qr%` z56og%#NilkUl{ga7%?Gz>A~t)GW36wm1eiuUA8wk1se*sg@wN4rYI_0{$M?s|9W=A z-S(1Fs4_A0Qz`F!B~@NHD?u}aFEpwRNggD&0{@@>!2w5kkRup|x6IDe8k_ zXqqWzjg|BjIitm3JUpe8viduFL63(t80~<@YFDYu0FW54Bra5eL81tV*qPAlnWpvr zSwOmA)(;D1=HCDS*2VDNy@dfqf)AI)Qfdmb<7IfFlh&Vu!iu_1G&P;^449|F;Y?A@ zgY;f#iMm$)U(c%Btlr9c)@HMxu#a$B=pIt9?`MyxL7;)uX9AWt}0W2saJ zr*;{V$uVfG7_P0(8XFzW@=?oXzo}27F`Ef|j-r0U2JU>0fnBmhePsb;4LysBQWLr_Kgr`cz&UOoMR zTjVZzkY0cO<)l4hzu7bGnY!H_%b(F5m8BZv_DO{hX?s19qVAZA<4l@ z^0G(D78%i}9Rv=Ag*)m`II>k`Wo7_?A@Ljo(4?D*sCRO7baX7()9oLb9SVeIb90BN zIP*P*-yXz(HNo<4B&}xh+kWW2v9ZbOxsX3F8#1Yv3zolR;#z`izuo&u^}fkbpHP;_ z!7wr%r`x23IfcGpZhzN^f3^z-c7OfTmr9|h)05tLys7>HdRZx7q7YxxMa+I)sNKsH~)_s=WMYyDQ>! zh6-{@L115k)$HyJ*x`Sn9OG&PZj21IhDD;WNVrlLW z$xdD$A4{I$toFgQAj>xpwF4MF2Le!h3^7Xrhet~B`W z#13Tz4R_M@6Z?X`U~qD2jo8|)og3&HxjMIU8OMlgzsB=3v&M2V6WBgI3xIw4Q~le* zoE&H@>8hR{86xnt#g@xoWbT&3N+S1)P2}OT@k=5--SW4BKMq|;vr$JFJSqKMq zI!m&hh58FNj7a5Dx}6o4^SpnlFnMDs28ZBWDL*vOw{E-*ef7cdQ>?I#L1WFh`Q1B5 z&~hOh;MgJ)?u;(ZZNsn;sT8S{bHl7wBxH9*Qyv@&3&Yl2XFD7n-Wf9hnAIXk zq80(7KWA(VmZDK=CFBpyhH{semo<6u_-7b>`(qe}CKmPhA^-!#&pBW18yyXfj;UA4 zfe^p|grwJKDo_34rRKGtt>KjUtc( z>iIVc3X1Oi*B7-4H03NqjREqB; zMkuTXe`WHIS7>luec(CUxxNj<*@?5K>gyYwE@$JhW5-&&GbIQQHy#s7Mc%Di)I!7E zHio;7tJoP%nY6LcBUbDh`LY?0C$O-4BQo+xr19RX$dA-0O=Ww2q%4P zDe9u}bEY9;V5GZyA1K&lw|(-O8p)POHx4Jag+)U>>ulDc zf#r20@`~NoXlsDNYVbESCoinh?(;+Qea(&bTkGYyv;Oh%6V9tQPP>}Mn;Js7ys$X) zFx+jkTPOGQ)^3|{I68F2TU)2(eu4xRDY0x--(Vl! zrm>A9g2W_BSn=D(=}VKNLD*!}dXhH5kq~wng1&W?U_E0c7avRT?nNVu7^(Z}5=?^! zyEI08!Q9274u^{X5Y}BJMp}@B8dfA?2IhTi6g27NB`dy?4{(P|t0gcPv^dw>!!%ES z_@P&rllfPV9r|+AMFV;`$HxN03Rm-DYfh!l-6|GezBVfMdR>htKO9(Hd<40_q#f^x z7YQV9bgkDuX={dh5gb)|C9JS6_+OQ!n6(@lOdolpw6xT;sV+5?9)L^50%OYOdb}Zh zq_(!^a6YqAQ(JpzFgKKBR?%SJra@3N(6y{akv&u537ZWH%eIu0`FaYESNCAw{H)#C zQ~P|urr+Py+dsE5*W24W;@=4IZ@S`&;EA)!t#_KVpW51OuQ`r6rpvZ>+eeZa;4N0o z$rqznE{*!2WW=lb?e>8a`04)3?5>CeRU?~d1ZBZeurvn-o0Hr_@ zghrzQV6|Z(!9P-hV)&iCvyEwTJ>&R+0KV{nl(foBgh)!yD3P{Wm8uccjOp}@vur2Z zlJ3RLec78|mu&Mq?@#+YeSyAMw1rbki%?p$lwv8g6$(ggQCnbJ5wgvloyB2D_GYr2 zFT3vIUPY)|GPlGlifre2od?SE>;M11uls)D8SLTERLjw^+oPgNr*vtxztKp~LziLz zUseiDmC~|;K$_8KvbwkHjvO5ugJ$CI%q}hcd4;A_t8>3B2J($0b62ETg?XV`>JbCfA$lf_{6(BZU5fC+v^*VuCAVlM7_4Q_UzeOxV=5(Is0#4*V%Tu zORid4T`zf@@4EPzSCd%hg1@;zQSAdaE`IM~#5Xvp<&0qCg!N4eubv^6P?F${8OnI$ z>x@=-EhU$y0HkucA^;%0@MfX#KPs36YHk*wDR5ugrACx(H^%)!J-bkI;vRqjmir5> zvSTOixyL|Rb>>cshNk25x!mG1ExmjXRb#fXxUms{RZ`f= z5%U>+^nfhb^I|e9?;vd|_ zbnIOmE^Imwt`j&htHWWb62ulnqRXu-E6Z8-)ay>&i*{XKRd*OU>Rq9>%X8t}v8k5o zaM*j!uGiE(&q(K~X{A(oSxUDz zug<}F?DpShTUU%mTEG8}{B4xjC=#hv(lHbdL0!cL9VYG8Q7;GNpg^0E{J z7KXj<5DUifJ*yJJc>H)Id3|!YQXpz+5r{-SuQ25K#*R;lKVS4}z1C!YDxy|DyYoyf zi-i1ke<)nP_H0cp3(MBdzUp-~hej^+&#m6Mv(}sr+@Bul>upo5K3i3#7MEUWkJ(PU zWUWVUJYRMgR8cxLI{{m)CQ_+hP(^27`TKRu?)TfTr4<{2)N}EBZ&cR5S+Ev&DI53Q z8C}n|2mCWPVG=0P6M_Rde_JfHLbiRWwBRfZvZ8ynz!(VK^O1~d?w&Gk1nHo>hon|( zre&fc7oud{M$#w(5l)g1zJI?U;d%dm`Q`kx;!6WmS&eT z%>J^%7>_YHgW22;$5f>>tECyvTdC=ss;U~V6p2DBEAjd4vNl0(d+Rk9Fh5cy)}6l) z5ekk#34A_yWm@19hqh8I7JR<+t)jh!_qyJumK_3I$*#qX`h0PeHoTx#A5yEoQTA%r zcvn{(eH`(qmgasv*Zl4)#aQ+m5xw!kzTgY0=+#BhZoAW-%cWih z(yzSrrv9DUp@eLkoxgJn0qf|c*8Jp@5=wgiey?&p;+Zd850}IJ^}z!%nkXM_nwk$l z)Gh^HW$)#yxOL!2(?V0#-U9Kb=ew)l{-C>i=q_!{e)F48i;enx>U8e}Af|P`+vKtw zDAW@=2|dH`AdIFSI8f9M0L|M$B>+ci)X!%dow`$ny$@^c6od1+I`IR?<;%s$ptj0a z9~J-MMAoykbbVRM^OYcinHp-a)^C7#d=*;z8`UI??DgQ>9tVsZyP~It2qH}zA%V{{~{PY8&F`H2q zOA)V7><+COIjhBGIapR8u(Vpe5eH(`JqQ=ygEhfCuwZo%(sno=f#(^Wj@9fa3|Lyq z$S}0-^vB5Pwl-dxj4VArdUMIt{ zG^y3Pob7?9=*n;%01NEuYpvs7KTgor>MFsJqXMw2JcE-Y1_gMnJ|Yr3x`d_sWQQ&k zLI!}*@sKRi^z2#4*nT|}3I~yS^25ZLP)iY$YPIazSI){VlodESdOW$LO07OqO=o%o zy%Ue`j{vRul5LT`u6Un(PBEK0`}sqKhUVwtN<5yIs-n_Y`i=!7n}SsSnZ575_lbR< z{NLHe@PAR;;}AQop=?`(vTZ@@034RG63=AfQeYN5yHDDcl)TEM&CdNu#<;)zpl&KU zFYTHxmS)yf5z2{*m+`8>dhmn=%0Dedo6&ql-RENY^}%A)=(&Y!^pw%D+XBfT8$S2nI>x&n`l2&I4ql6<{`4P}zG z3&;F=9ORXk=P`{z!)m~g8%$O+9yJMStBIa>b~-}^od&yaX6B-dimj;!+F@7Ibr=W^ zhlO@O@JcB36WrvQnjm1`RAE~vkIODDMF`bu^Zom?vriufQmF|~Z(lN!gc|7@QOtRc zjf7=0WrYr?+c#51=Lx~+vjm238H(5*|u?hqh!O=#8f!8Z9pRjf-!3{zaxHHbGif8yPSff1h2Rp7>CoXAG*Hg)kY*1Iwi2SCrBW=k;QY#cQO8 zFSoWXQxmiKW*7jAeZ7MXJA~nL7k;hptQ~Y2wXtE#uveq8nl+}*&Q6n=$HYgg_Xoeo z(-noh6c;42=JT9-Ep%r3X6eaZGdm1@U!&i=(MUf0ijZEqekWep=+*vq~7e{u8O zI=dSV9u&%COA%@_kP<>d7-IPFp+o;u=W+bcS5ZSeLpP$PEZYnDl8s1bds5Pfb26w=Q!uhVi zB1JPigPQ4H?_k3YhK~P+z-mQKSQ8lbx-2!7!w!?Rv(tcnM|FbQPnHCEV_N|uS!EGf zTMh)4Y#M?T?YyvsD*B!bT~=9a5cVCu^w7!5aSP_3iG;+- zO+Y%A6O$tYJnvb0M07lq%w z>#h~=EL35EkLxsL;sA!r_oVZPe~nZeuob5nU9VcM@pxup!pJlHI`UG4nNx)r#@-ui+Z3dV z8Eq=XL~GRQ$eX9;z8bL(aC~RW>8Yu@(?f)Gej1D$(nJU|5OW)enVX)QXI}+a1fk*i zA^7{&Pc`Nj{Tro-4)eT`*LN|U^$Vi09~25Kin0xHfS5}IN>D|Oh*!(f;&~cl^l0;Y z-O)OxFktCv8Yp8haB(2k36$VNt4j}g_7H+miM-;urE{)kTzA$dC z?pcN}P(RXTG$Q=vfwiN63p<$ymdS+0vwB(z;}$SRl38iZ!iDLf7rHV8EMzcWV|}Gf z*4%Kgw#w;^4Uboe1_f0jF=+Cs&LNw%ySv+rP1SzBA}F~~fL7RhUOV8gKP2nvX;ZHg zW^ENl-PKJnHyWD+U^#^{^-O4{uoL+z((-^@G5d4^sPMcHua=gYVMADQWMm|*x)M-q z3aq^sf0bN#x2WuROfnPX`Zlwd2llsL`@+{g^9~zMz4Y?-rRV0tQ97vz{1v278-X;{ zn@(w1F+5b@tvB^bwGZ5qwWXyRvTZL|qu)-W`XLC-`PjQ!vPR@3mZl;iJb66_-gWC>XvPE5?k zX%?qx%Ys*MX_>^0Pb#@!fHnG?;T=j*bf)rNRFFPc;E`vEy z&{t6K3CxeG>ti*OLYK?wlu0CN_1U)y16I0M-aiXiSba_`^oeS2F4xwahWx1`ppdIp zbDL_I_kI?1o%?KkjX!wp%ojJem%BOw;ikbbC!D$X{g=3eeV{%oaXy**XOKeuD@apv zh1Vn&i{ZQWrd~;55h&X}ozJ%atUPh~gz~u^RAzXFqJlSX-t@dvV6W00$AB{IP$%dZ z)adf%<>kB`T$XYS#~3-AqxM$4_uT?l3AGf}Ib>$yaX17f8~sQMIF%+6QRu|zIUI^+ z*d0X;JGKT^?X4pW&664?if4=&aI1)Y9L}yohT@_)`vHq39==4#$YftB`@1CscL~di zIN$L&W7PN@7C4y4E1ge(eM5+O&KL|kRk*_H1nwEp2tAj9Z&hm+;fnsJX8T|3kM*g^ z5LPD`7S_N4u!E!Pz!LkWs;h^FhB~bVt98mJXo1Ir6p{hP*4iSVup~%Xq5F7EeMq8~ zNz}1eEbR4qwSLJViA+`)uo~q3>C}}EXMrs1#9EqD%`L$L=F-3gsE+iNE4iHfolOMR zd+&V1@ANO!Pf~rk@vjTh**DR42D0^Z7(pxGO{oufYW*sk4AZhT4~kN>-9HJh-3KK*SMIp z`@0~gsszK{DtPLUXmn5@76_&)eU2%&4S;3pw3?@UmDTQQ-|hl>#UzoK1XL94dIn}S z%VceB@JrGbY4Zxb;V>IIq?T!e#|!hSxm;TQOSwuhhh{vNR4SFCS=Fpk<(hNBq{q`Y zl6o{32=s1pS)Yjg;%6>laG}kwkI1)DMT!Y|m(i&u!s%b6_io6mvIY}qPj4`%_-Bx= zZUEB2M6eom@ESgT>rFuwDv7o?fQi#~@;qePx`)C)qk&N*ud*x-){CR4>j10^yNe3w zRknTSwsl~ca3eBuja1#8rq<$Odm@45DZ^Z3TOOJwto zc%z^0gLd=7Pd>-!^_x8$_&(fhz<8ErbOw!EG$N2AB`A;;r5=1D_e!oMcXkf z3hdRhCKkgm5=R#oWk?-EKi63KW@OZ#O7&lSZ5pfe(=fd&uJVnK`>LQsO_gr9!{%@} z+!mY7)M>L>t#x9S4GAmv6#%Srer*kCD$rGuHB}_i76D{IMI>#07mSZOC)EvO5&<#tg_+qc^5{?A8f)0& zyK}S}FaQj^;g4-+R5$zWDTH(Eq!Ung%mw Z`@*XnM`O3&g5_#tlgcEyo&{z@NZ_ETdy+|?Ia_F zvqmie;|HoL0;I|l3&0f)`GsMjSE9a7wMoAIi9+6O_oU_RK}Ek@1trflD*#n06?_0C zlNn@T$hI?}t-!_2FGEs90I!hsf_R5Op70yn%QivQ zfs;G(?AuoU1wXY8EC$!d@dvk?nnt}wN~_gkdG*1OW>aj~Tl1yoF79P5i$3YAbT|Q6 zl+{!{#4rXcud^8LT1WPe~jQHw})PL`SM|8c2tjfD9W7p_n`u zTwW(@(C~D09#%z{;q}v^3l~rxg0nJ)z;RGz>rQix4{%uQqiC4A|_wH zXQ=2sx5F!R2}41@y)RXOy_~qlF&q(UtB(wSY3~bWW#_vef0U>Ozlbc43LAk)rez3^$k! zC|x2^KNh*Tk-$h7(pYePsl~O$ZtkE<_G3}LeWV@3sn!fnVCxEt%s0C~5$Kz4 zZ|~Cc95f3~FQ#70gduQs`!2HW&_JSPaJaH^*n+f`2IQ{AWUy#7CbM;@69g7X^Gxua zt$S@d7M4f|T&VudOaz=&G87E@gNR$9Hu$YYQ&={f`qMWBzBJ_!i>qxA`IDU*!_W}iBP4$p zZV(%b>>JI)d%VfO&CohD9)(Ywi}Hk@jOYx(166X zz{HisiHTG?(3h5{7C!2_diD5b=^-F~KMv-(9b8~08|5i1-wl8TVi4ZUQ&(rvVU-hU z;MK#9Mfs0j!-yeVCtT((Ei5#cYDL4t4#X(~$UuY1V$rY`3u`u;-69{(5%l%u(k&Cy zZ7|j#Y3A5^^`S@zwmyf0en3??89}ZvNKB%QI$Aquu6;#Ywkj##Bb4>fbox>MV%pFocikfpM68Dt&a;qc5oLMBWyp)w!3X4 zgHdrKA^Yjgn_8TM0)eGx&_P8+k0%MIC4XgSIS^*!^*jvMVY~?)JVJpi(ts?QGU!aO zd7~aARt;_B7yxfTkiQfcVOEUBOfexh45tOU4qL5Q*^BG^a7AVVtFcv!>pC@*9>8QU zz@9ahhkl(VveO~tNbk4+9$4sRS=b>0=dcK?#%_PMbmvL)$-7j&OkNaWT;R%VruXXNVt;?X0uFwA@=*2Lrwd=(Bs~NW0G@zYWFq>s;|Vx$#8MrI ztb{#vRi4dET)8S&Tv_a$Sfn(n#eh=zU)Nacyec`z>)W~L)R@4fF&La0lEgWU!DY}` zpfKFsBB;T%po%W;DBZHx`A8_&Opuc@wOW=8qCxUD*$jMuii9TBU==0j_7KT0LI$zr zWtEiUl)Ty4ky8O0fC&gy3WNnHPXMs6c>n&|YM`T`^rf%CL3g#KroN^o8P^%yq?X;*IUdcthh5Z3qKKUnsLSX9w>njCg%YR48rWWv0`?v{(L^-5r-ERj zAhYy&Vo?;1943abxMmT4)Mqo(^8Q7IBG46>z2DsbICkguXI}bt0RjO-1$kfe{%=2w z0IvCy!li|4_otUbvvS?YCMMJU{ z$gy1BVVIl3-A4qKJ_{F;$nv?t=Dh$|ZFc93p9t3joFd=|gP}-UGJ^7V*&&cuGcz*{ zY@H+pDb{8n?N!YMh=fjO z)^G{iu^pvvh_xlK;1#dHAPY~J4d7=mlx>p)7rX%(yUR?Xp(5ns=Cj!>oI?fajxJ$l zPi`+Q+Th&|gaU9Tird63QwBnhbz5}|)@d_oH15Hs`ub4=jUKV*8?5q)ZLZ4tN*^2q zj9Xc@p>zXap#z|RP#S}~r4G{>NJzvr8iSLHCOA#YQ3ofiSr84nSkZ0KVC`s=m-U9L z;4rVTahxRgz3>)_c-8P}N9~xX$_2?10GI$QST)EJV(bDCYe6tN=yi{cf>Sk0m8~n2 zx5g$9Z1iqi&cT>eG;xg3!$&L*i8$46Cm0+vqpdSh?IJAX$rrQJs<~94x2tbr@pq3G zZrzR{m--Tp?k55CP)zjxhvbJJMsX4eEE1Yws98!e0mPc^ecW|zVp0CM6()J1*?+Zw z40$2*MHrOofji50L^P~nod%7;;V?M8P!`jaNKjc>kl-Z(JgD_&p{1I71 zxX>gy1k4HslVA>eWN6(GXcd{6`QjPc7`lLZZQ2Uzl$JZZt4$^EP0pzl{R&`KZz|=P zNGV`bjbicXbla-@*kL|+W*fBH5LllcGH9KCyLPgv-tUiG-$E5p&1wH6jBIJcuv7aB z@BQPgkbg;c=|27l!*rNVM{-1)qPOE^AibZSQw3>?wc6N$j*-;)H^3@P>X+|ln9iZM zhd%WwGp%tOFpUl*Fjcz^ zKG-o~L6ZU$k&m4;AQE)ga8o_x?Z7{QI2NwK=#|z?)vZyX7ai>MVyitA6HO%84lWuc z6L?$?MG<%uWlm_ca~2pgo4VTA(;Rr*t8bru+I!@dDD2(75&ZJJs-VdA1dL~%UVDQ5 z_9<`>Ni1-f(TT;`)GQ1$NCT)DmHx$jI2$&z@?YOkxc=ez_-dessw*%pb_H^Fp+tZhansh36a zbx0QKiD)~TFXVe|)(Q&p*Zt+Yn&(pbK8TuB{V+cctF!3C?Ciw-k>;h|_(U(=aR#;8 z@O|UcXj;Z=??_HAgeW4N({HAV0&|L9dn^(bYD4hk;eDk={~A6VIOyj%o!Mm2Y4vzZ zeNM3lM;j=pV%MrJJ+)wQ(n zG*j6mK#9}nu;b|MNpDQZR*C?D3wTsxI$8SSR~V}mn+%FeQ+N|;A(JzaA7j#9sS9ED~$G}A=~4;rrgSrmk;VdnV}!hGE$dq!-{T9BOMoy*6)! zfW;+)dy<}eRMoet)%E*hybFKGpkIpwOJ@^<{<=Si<0 z>_v0)$jenxZYdYn+kJFx>D9Z8x$6{Sg2r-9=9aGcD|8VliFsH%rY zd{((hI*vB7Wcld+ijAkSO3O+rDh?m6*o7H1R-38LK_x>RO$X)n?g!$*1))$FtEmx< z-WhZ{ZjX%$yh5QxxM$a%ik&awuL$V32izi4U0bbTdEV`d#Y_oEqX`b~X2|Us2W(|) zs;U9VRK}ol75vZ2s+t(fW2d&iRrIfvX_%~?f-evz9AV<|j)(?gX`z$uE&`U$FbRJh zG+&L&67$9&7OTDE)q5vhC8b3h0jq+dm;_|+4w!IwlAz)g43=^Dx+r3C`(kQV{zws+ zzW=nhMpRXEdr<3~jGfzFv~ga1=EL88$VW*G9(P-2ZbTf8VVEU# zRJv&U7eRn;)vFvld3pIUC$E*ky&tlZLNqxV3ES;668OU(Qo};wOz<2MMO(h%?$L7l zznE;-Q_ZUD;ht+99qBYs#?w0;mh_~Ta$U*QCB>BhaSFBCI7{4Vvss)Szxq|L5P)^K zp-nD-nJQALX2V9kUl{rMue92bxAJR6FF>^1>gekL*%b1!T*pWdVlY*27XqmV793UT z)uq7wKmhEZ{92@0zSu{#YsW*6BM(fk{V{I;ACtLPwuGNZncjwP#B4ADMhQ~7l zM}5T5#{5rPU~Csjtm4Ls@|`<2YyhxHd@8c6mnvfa4c>YwDqw z2p)(k6puA|K^E-?^RR6@wA(^x` z9}sKO>vG0wU{~*$C`>qG=U&v2&liDq5fp%q)6iv@NM!gz!Knty!UYZ*ra z@O;;ecZ#;|r6stEl8R$mS|5Q8g}HDz6jDnDf*9vO^)_d|A=f7GaN; zI$UukM8J%IOd|8-+H#(>3g$pUu}DObnjTTCt}6b*-nIU;RfchE%C#R(+8io25yFC( zK{^n$>M$Z05mOY5Giah8B!1NR5181SZBHqc(qfSU9?Hdfq`0mZN}&}>Aw#MT#0v`9 zoH_%UCPe(S5Bhr#cu8cm1rt&G8|$)VdGel~_x#Rt`9073#+$v$lIvP|vd73WjK_%? z64?8qrnNhl`uXq@JXQPo(o*eicnOwS`{<+D&JHKNc=4i-3AOFhtR^U_8|bojT84*c zZHIPs(aLnV?@TN#_&gRzbLCph9|#627S=vonh!%lU-@aT!7v>SO$XXCBm7cUx>L8t zyDUbt+I;SbZbTyk2A$UTHd=8!e(}Al#p7ovsl2e7QZ$^Z5#|$uIjHDJC`)Rz=vDD% zx08lo#i@ou0j+}^?+1ws5r9diNyH@;0-!(K^L-gBpX%x{J02!-;I#h_FPl-4fgJ}ZN%-JG9ED${8laq}D)>w>i(5>di2BqH22oH~CeGUQkL z=>qVn*biI&`h88|yJ{qSwS6@bS-EUl{z$zH>YDpxU5$&>0-8+&?U++DX97)i#`xCnXEqOPHd(3hz)9kNf(GYES6HpOp2zzPvPi@ta6Y( zMN(O;u9>E5k+}+mp1m8N(STfssmNoz~ug zK)spKI6H&A2}EMGiSx7JN3Y)kcE8faFfNOW5EewN;l;JuAn}Su5*3&=dGgu&c&}*f z!-Tte=~FKV%jZsnn7~c@>wDDQuFft=h}CxJO2-#FP5RDIENUMZxc#;dKP>)u7~W{; z?b(mqI7IBuJKr2db;<6qFI8rSB&W<+)a?(&9bMgy2OYKnv({()72)9LZ4+8Ki}8uQ0EJDEuWuc+AK^84#RY&pbR zyPhe+Sak+l4>$O((-#zcjBNuSYKG|8lNmE=Ata?7o$8_Ow+7P2)-h8^;en^ z*4-+W7`sX()8NZuEn-4G>kcQT43*EalZAFJ6a@)FI$G#Qo!%hLA-1j;K~q90+KY@m zw|2LKv5a~rgYIOLHlj%k`YJE?dNEjc^#r(Ym2*WoxoBTgg#21TSKHfLdehct7e9(b zbSp?_=~hsig})ZDR-PY3H0Z^g0W1=N62ez95l?>q1hN@gV=~EvQmrCFYhUZFMF?js zDvi6?kmmJ~W*fAZV#)NFxFUs`KnaaAhZG`wl{IwpTDaEwy8d;hVnKrp0#r{SP2jfX zPzB92f8UbIm^0ecu3KD`idrjM6(;6&(tH`5?M0Uqy1{gA_gW=Xyzbzg6$cQhpoG;h zE*BkgYC1G+J`dBscIQxds5cly>NOf|c3T%JFw%V#8T=3L{M60R9D0aaZn{oqqMIGC z_YM19T9ef+xo0)#a~TH)FqHLN^PQEkxFjAQ?qlYA!K{^)iP>2_?)n^?$Q)jux_mU> z{O}VvG2)>o6!JQm+(NSMBqsD$Oq`C(p&SrToDq#pP0ma`xl32c8B0`WG+ldD)xkOg zj2;C?zuzCdw-`z%jxZ&R+J$Vwk@Y z^UzV(9`)@X7&Tq`Y-?wyVdvt-&n_W#wShiD)4GoIO>df(zCw*~9)xwdjGUuSqQM$b z&OgOhKn~3z>yEoiNkh%f+67O@$qo-syEOD|;o95Gw&}5Hzr@~`pNc6Dr_m5wa96dy z=4RwNNdr1QbxzNsM;mAk(QI?r*OJOGzzoydoMl{UOAQy`vBJ|rQk$vZ)2GEtLyz1$h%9iJz%Q|q1gjB9|4y{%8Zw|!c z#?m7FYY_+lR1!pPc6cvQNg+~BV+iK1#|wLeRc*#e%ER5mVo9-`MHigP^vS6eRm6Pi zt_SYg*x2xBT~P^9p+;R?jHYr(A>crDb&ZY^!IkfcMC^vm=+a0uf`k?X?&oK{^YfS8 z;?pm$j{6y|xSID#uWzdSo6kU4y;jZW_B^HvZoqwP=p?oxvu~WgiYTOiw2XHGdA<_n z=l_#h9jZnu$`Mic)rj*NBEwkcdq>xH!^aC^@{cXzjQ)XjEVx*Wqree>3l1X_L8yuJ6ARF&MEp{sN}EJ3bR z1+_b~q~TwBGA&wiAjJwVmfd*w(^6TFc=C+wp0hJgr|@zY?CES^=Gw!rqY2R&7;<(x z5fJ(zMCh9?rojkO(IXF@K70C^g6DIS`)hLN$XY^02up8(dLF`0qaO+PRoXzu#A1jU z{4Qk34~$jeLn1|I?&&deE|r}&oGa?V`1Di!nE40RHzCTeYlSTE{n#KWQ}c>oC`Je25@l1Ee~ z6GTF}vsZ!X?{ zFjc>npk(mJTN@jdt!=H!)>f!N`}=i4j9Bn4A%T@NfBy*WL7qpgE6w zG1Tnq(0DpKdk0B)xj5>5J8TFFt4-L&6j z?H^qXdhzpUM$M4^M$F2UnpFy!jKXdN)hIepjteXdlH+b>PEhDBl~R&>o=oj&*%NR} zmDjFx=+qiU8+iL&lifpuuO`J>6yjJ)Sbh4Q7h6h@Sx@e-Nl`ss8@TF6p~iG<%wM0A%#FdKgf)7SfRP)FP&Q~GZ_xJ#y-S~7db?|Wb_CVIiHT{wC&t0; zJJ6JXn7U*@#$Lm0IpH|&HN@}x$Ggo0aG(ig zAy*_5Nu^Sm49XNWdgGziJrY+9?zM2C3HPQz$w+I%{g4dn~yv+>MqR7jz9Zt-hM_rbSOQ=3!{s=ba_O zi|A_9I`2-5p#M4He(t85lNv**2hS29YIEC|M1n;@T95Q37|WG7Pct3;!A`e#@g-zk zGe{4lCYRq+hYdrvjZj)=W7k)#&Qm!3^i;#WXU_;9K^p53^y8#4V2cU_E?i*L>O^Nd zJ80E&#Zk%RWFg0Lv1$?Vzfy~BNQYvL#xvqG1bUr4Ha&vDnHdNV{4_`V#RY{EXU9Cz zI#KdRIj=m2GJ~+VRf)lN&Y~K=)di8Sb@d*o?>U_*T1^qRFDWC7;8jJ`ChcbL&ble0>5MER zsr7AQ>1yP{(xoz2TN%XDc?NgQ)!%SZE&xYaIlm*rw{cJ3a^cnY~jY{D_NqqXbLzR z%emMpnlo76#fzAIx_a-)ir#*!H#j;J99_r~q}r&MjlrbScBsvs#G2ix z>F8{2YmifHCno&P zs1n7-WMnEJmPAHd_q1eM(&uoP)x)Ir#T$h!NjZYxYnxr++s7#oW8(Oum^TI-|P+5Rt< zF5@one8uZYj>X>QS%%UwOovoN5y0JIoSmk2y+S6Jm*;1t&Z>KEh}J+d5j=#1u;jQ2 zV0u81-m*l1d?igRPbF5jrDz}Pdu3`NN>s()ORKXK1J6fOOR78lDmvJCLetyJ@$f!&Z*u< zYG`GBVVs3~7H6$goVa&&46P>YUKJoI z;I2u*!zPWX{~{9ajPcUePJ^c5>Ztdd^JNf=g06NNWWr+*4*sbY0&TfT2hQe6My6qy zFuIg6ypb=|3epqM%e0z)1tr{t%%th;6lLdSXA`~>q)VhC@SRR30zjlvy@u&j<{^B@ zPT5x0ZzNOR7I1;F{Kb&Y6tAwX#zNlDewOQWjg3u@rmFD#gR!caPJCk*uKhxA1$`FQ z&>8Y&Wx~Nj1BCUPCV^5JZED0zs7{fyPbbcn=fHzWdsB<#W&@;7cDvKsJ}@~o9yQT1 zC549^PjVXON}7}=eT{Q)XlT$^cw!h0h22o0j!jNXoh@KI{**J(V7{#E`mO;-Ur{O4 zR+iz?2R}By{{F_sa_scv$(RNyCu$$=OXly3G)T8QBo4C)gmu|_^2B(B2XXHKRe*h( zZz%=zWx8*m%KC`$Zg1_ZMCQL;^j^lde`?F2V=?eVi`I zw0_}sxu(ZxT2dI};)Nmi=<~?!?~zQJ#_XP8P#5ZIASc(V%Rs7ZGiHdX8{;$iuul zGUD^0;jC+Xs??@7bDrsm@yQ8@+m)iU*e@?0@9weKO4AS#eH{XQ7ej1@Z!-JieNI{PQl-G?v#E3jf&rn=NSovu3JzTZbW1D&VX5 zzL6(VxWF~d6}PqJ!4{0APcluHzVNul##~IifOFc%Vxd4N$!6QXszQvpoWWqng*Kol-W0Dgy zVu)H(2nY9X(?K#z6uDruND4~(BvVtx7)2Rnk>*Y3DoGq7l&AYO6f6;Ahhi)_U5;roBvAcAy^VLjc1u-dP@dc~-H_?K(1 zS-qp7JC4&U=--RIQZw=NDaFc-Wg`A5K6HOSWS=JHy&6hxb3u;@!-p`JRn9=oluIe4 zQn^_*jNlR(att%!==$^v{dxCS6?DmMcD8!hhB2mN7*bluaS&foIXw5JJDNvoLNFtp za~KW7<5M$JF_%AvrlYh?kt&6HeVGib>D}JaE${4*!~MZmTVH+k^>G~RMy7e~BJar3 z`|SMOKWt_3?)PCWLf!ylyge)n!Qi2c@FY_XuENPD4C*^HO^4|CYB;=|cjEWt3_vv|iMW#7DsUf!I)Nc6ifMgH(E;hJBuj#+ zyqxB8m@(RHk_pW0qYY8lp@fuzyhlW$t`k#d&z80uyUfD{gs-?dI16dp;#E{qk&tf= z=u%kDLyI~Ik!7;Lx z#8f&y7EQZ`<1CtwXir~hl%Zqc@MDL}vk1*yJp+sm&1%=KUAxfV&kp;$Y&YGI!QWK` z;*mo>jxrj6Fc!kgMk$fK^A9%69VR!y@57w?o+H91gU!|_E<{4C@o?1o=@O8iV9{QMzj=|j1qagSK+A)nJ|V9@SU(Zwdb%1krP z-AkP?moj-K+mTc=2;N2+PQN zJPb?w{b+1F{Ml4ZiKW5r+lT$=>Pf7Q#d{Vjm+rqIgTIZk{)D3km~hi}k%uSwh_(px z$$HNDlT`GQU0!aT!o5Hd-KV(^9K(l$g2S2G9n8)%Y1cGYo_Z#1|1&A1jcwb|HEe;j zwtx8U#+GB4zWQH4z$fXdl=eOs3po~o!ZSA?W$V7s)>LQf9`Fr~GPidb9%*TN>4pq$ zxZ$|D)_d+6!ERpR$cbLUe$uXbd>-Xd&Vpj+a}lX>QFT-f&sRsv`GK?WQ|C$&4yM+G z*}C-^5jcGH<#%PGjI!__1HW_go_w-e>5!ahs(SpEqxOvpO3Lf*zqzHn>ZY4A;;Ul} z0r|z_=%&DV5JBSyIHI?fv#_vNPTJ$Xqu0ywlhA0Yu4#D4Q>+gzHvzoqd;dzf&XCIYDVTIV)rO~64U&}W?yzxqI zCLGKlgMT^xzDGFUQ>_Komh96wN;BiZ4#&-r8 zWbiM+v82-sGRPo<3^K?dgA6jrAcJ4onL{D~Ko|gkiVz6$%%M?GVEr{E5IgQazykmP z000000000000000000000000000000002BP);_)9)iY^8$wx(ojpb0|2Ckh$=2o})u}SygHY$N^iflK%8OxU@F^R1)60xZ<$+4;C zG|rFAm?m2_r)EPB4ptCT*u}t^uu*SwRrVxmJ9d{7El1~HE3wcY@3Fi;{?D7&ciuTG z5}f8V{EO(#?>^m-^ze^0x3R%TR>8>lpC_Fqdi%G#3v`d*G^gQRM1Q{denlNF;vGvS zlkkyMJpAkXC!VF%V!%4>SSL9>T}^`Hm`=+_6-$eBIqz7b8~kL&#!o&=Ke5O9Kc}gu zN*@&Q&*?pkkWy0bR0W$&-<}bRJm09j)-Th4H-XKbNkO&aDrLWR%V~||4loA zqmn~9*ag&~$e|NJhoinG0>^2B0N620$yd>sgsu&g4V*9L7i-+H$7Lqtq2T|Rj2j5lbU1DZL_iLm`HQbMfB~rIFxG^SbI?u@=(rh6bTO(awTB+!3sf_& zSmzz~eO4>4SkIpE?8#$^I*YR`tMwVH_^W2Yu}Mi+*P(D=LkDPQDSjBp5FOWmu&^${@k-&vn1-2{D8iQRiwk(f5;cy?HuhOU9&I4A#R~3O`!I7q^=g>$5!Vl#rnLvnkX^g}n^rDV3L_5`S8qrvO z!s^5j;dI$(gmnn=&9|jAPDcoYp=*NU717AJjEYRqi}&w+Rlp~fLpFZE67h&tcyV~- z=`)@*)){K)-cm8J45p{7jte;PVh#*Whee%-b+#R#vAi7vDZ!wD*j>QFdY=9rM-g6= zU^v1EoW?4idiCnZ-R-$c=5;3m5Q>Pu&0km>E*eKf#8&ZdR>?7#4@DOp7ry`g-o1NE zZH2sIogY15iTK1SxM+L&j3Zx_O`!I22i z@*d;roET0Ju%qh^gw=hH{kVfm6}&G|V+bMIR{H%j6svgHnY*x3PJ|;W{`$Wq)6~RC zSgxcxLO9~ozvb60XS?~YtQvdZ-eTb4k1OS;tmDk8I$+gsX9zFGYzqrj1?LY~t``bN zDf`7j!I7ne!10I!dP95uD6A4iTyYH1bl#|nq$PrI+UBU(chuE-7A#Z7VL#W!lWNd=}Y+8c7okbBtpVmB}1h&aoQPYm}inHxvF5hn>Yz8WmelLXKBw<^8t!wN!}Z) z_`K0mR_XV*2~SzanRPb4$FkSt0XZ|QQI}DFst#E3S8AMQ4G@nk9SB7%ngv8)`R|l# z6phoF&$@%{+)8(S%Sl+Tr;<@yByOX`dmH)_`ClxX_-pGj7hwTQ<8m_g3)%1Av#tXw z!755}m5eOqibidW!vW@d+SMQ*=WMJdDjAE#Y>drVdeChzZvhF`bydLkG^!1rPQ9606?+s$EB$&|(7qNw=z z8$I3d?;D-E2W;XI%l70bnH5(mW{In8t~mlQS&gnkSK}ZVQMf3T(x~Hc%ZNQ(o$a=T z)(7$gpjejY*WZP&VKI%mD5#|oYUUTqHpoxbAw46cpmmSMG&bkkvC4aU_gJO9%Hp%T zoMn1RC4;DR1KD-Kt7J4;b%ZyuzMYFB91-@?`v*tx)mNLiwzX7J%|zmJ`?FV#0}(V{ z$>pX|lPndBxm1)ZzEPr%YgM?vYV^0Tq(1Qp={SmMDT6D zW)NSht*q?HyOZG5LZY+lH2uVk_y@?Pso>V=gj(WzDN_*n01zzS1uJxAIYoH zl6c^peD;qV$IGglL60VCwx}m2H>+1kuvEK4GVu%eDlyfaYaQ3lhYWpD%gt4()VB$i zQglni;-Ynco%>9{>vROf8ygJM-ycWtjyA7Y3`J4>{e!$?ZOqM4hw+RB%3kFj%hhtF zB|l+_@W25}sZ8%S6mad2=fPLdt0GP(uq@fOrK&l~h80VuqAmwBniW>@8+Da4zD;Qf z7gW=DwiY>DHZg&93Q9^NW@n(XHqy-DcfW&R8FRlS8cu9&NaT;?wE<$_&bhy5bKlK1 z+TgU>Y)8@*lG~HmriTfu!kEhcb@Y2FFa*(~>3Zb^<&KsNC|l z_GV~87a})TeTszqVWncKnpmW7DA={x&jq|rCywGHHcP(;-Mb%X=M~Flvl%ozWW|S# zhw_XQ@F3_9a_`Mc{#pwqdf-y&}b{Q--3{@ZuBbI9W7iygb4mbbLYlA^u zpIHZ$V{5uho=B`s+jKwuvFsP+i~={@g*IbSJSJJWPo7XL-x;(GSZ9C!yeZd0ZUWNX z@D91^V-s>rLO$B8UBdL|rvCmTXUPuEaPnJ@tY)HCx8(OYFnmJ=$PM;MBI~IFYE?0vJeD(F$4Hr2o=29%K zQe|3ITy1g1vt?gUa&!ji4?vR^u7S7s3k$TWp(Wv^t^6c^#99UZYT`8bgl4Q3)TZ-_6QDeQm zJbPKd>ohM`;D|stLI}s3Pg&2C)d*z>(vtn;E`^$Ox~g3DK`;2Pw-y75I@9n?)>oN=^|kUf&YY@rGL>w|$ZFqN>EwAK$LsROR4O*E z+EY~n{DCi-nedF@h_ZM3Yqk-HrfCKt`{dXtJ?1ax1cQT_c@IWZ)Peg@S=j3_^!ML& zLzCfBu}oGs%gSfu3HBE^IpenW^i5O9*8R=>`&TcPT0Kt)Pvd?C0xJLc#0&CzDeZlO@c zQUx9epq1(JQ`YliiR}C33Zi`Sq&$y?m2~~OoBTD~uXa_c-Q+GuVF@o<_Jnm%vQ+RQ ztzzPrj;vz6r!~!c7(~#J01*lY^}`Epe=#Rkp-Hc&1GMCg2oVTDmC=J_-2Uut=FmX2 zx9)5~^{AipRlA3Lq^YmZ?e~i~&8k|feh4lgY)z7@V}2hiB_I3TLto?$dOKqoSk>MP zx57xo#DbLc4slsljTY+KtvmGzmQB>Jl+t2i+DqJjEb9a<pez{Gs6xR}#iRwvAcDZ?z)FbpS^La-xBo2x$BLyJVGxbsC^#wgd%am<1-aE< zygL$=Y{s4Eg<+In9>?9?EcQ9mYZLSa_5Dn5HXPa+QNfg;jd3-g@g7 z1zf(Wj)1PP;3T;z^#-{prugE(fX+0u1-^>VG@^^#WL z>=UL5Pf__P>v^#XR+MQF7NjMkt0zyIxuf8ny5iSdUa>FStUy7O?L&+iX%Dhwr6 zgETWSbbG9N(qHY9S4wE~cyf%3Nt=4w9by{y-1y;!-z^QF+hTArRliMgYJQhrwc4Hf zALMK`CKjUw{|rk?Niy8dh z2A$4mG!7p`8VGJ%qn%`Vpw?vew;C>eN4 zHn%qyf(bS1;Ss~jf+I_fwJ++RaU!@0RfgPI>9=xjSVH{(WiyXb-kr&@RVk{tU$-!J zCs@ouGWCzIGGZLpJ-DSEBT4Vtf&@`M*6q*zf4sY%Wu;hP$!Wc14exAvrRQ{Wb43dI zs#hq;9oD@yEvD(acYdL89A-El`xr)Pg!T3$GQqt%51%A0bxDK zD65gRIuK$@?2}oRRy3D^~A!UUT>YR-jUAB>q8+0J0lHqSXbskLm66Juxf`(>EKMb zUXCGgX(hWU&3RpN7D5J)!8#CgglDAQ`t?y9Nq&@X`p!M#tFjsi@UvLVI0h#M2R$B7 zTOOOa5yuhDFqFdvCts7Sz+0BNIx@&7>s9$~43#UaG77nkVFehPwt)P6sRZ4TeRv#o+iSht}8D z)@EnOa9e9`t-Adm=FTm)jjW90v6OosDi6ult!PZ6G;LK?ftGAa0nrwta#>(;TLFfO zfvjpc#+HGrnZv*b{7$N#abMq&RM}O(toYj!idlZI&%i*dT5XAQ0dPBuhw0 zeX97M;}qWTOjSfb_ z?3;ZLSvLK*-)fJdV2;pRrQ3ujyn=?d$IC?PfG+X_>CY)6YmO+vWYX1Bo7c z@0mq=Nz2G^Ma(y!?cB2+x@>D>6D9l5ki(Gc<8t_qKI6FdHyv_gg3ymftS278vkX6^e_TvscOFdvRrmt53POS9cd+5i|EBDI@M_ud z*~LH4N1}ni`d?>DL%;gfv7v#Vu7BP7+eRfD{w^LfG&ULxMs5vsrLtKjzqvGd*{b7< z&!J-qY{;-d6uE<>Dg4Il?Csm-`Sm-m-LrBo+u~j8@A(_CSm#E9L@7A)*MS*CfB!<4 zp=aJ_r#hY=t#f7 zVLf72p~om|VP%u?Kg%`?wvG$#3rAhoT<}FS9mLmlx5s<*S%8HsaEFFlDO4%Ds)a($ zS3Bpme4_5`gt#qHq?NEK-_MpSmFX(p9Fkb5R$~7XU|lZH|9PJI?6J9EG!Trel(nBZ zw$Ju#++Ml&9joaeo9uIR-(4( z#M;;>_s@?mzINx>XRJVmUoNeHGT7yz6WJw{f~y1lD3cE?#B*6Ga@-O}CuZLBH`0Z$ z9tE)2z{23*_}aVP_0IRaYi@qhW%+cSK$^<>itHO=!p8w#-~M~h;hE1%V!y_PQ>-0{_(lq?%5 zo@Kdc6kN!NfQ+H)r|*2h>d0(IOWCxXD#iT z7}WCFqSt@XX4$G;fEMs~jUbEi3g3P={MN-5%P*kMhm??-Du9a46r#bQ!1&Nf>a#eq z&PRU%>sYQ(z#`)6)KrYfMg>kP7N@uVH=S646`Z{DeZ5yc9D472!@n~ z?|ou8JP`;4Zmo`v-nnKEr>CBmC5zqzi9bnE@hWfX$dkSOU3Y0a~Oux`%RBUVzqkw zK$hD@4-rxkKrrLTr}B)~a)xR1`6>PYEW#`rPoB^Q(r;QWBDPnt;*a{ON5o!5cOH|n z`y(`uVz?G39y_L|9_{SJKrHBiSzGwA6AcxVyZ4Np|H+cjU7l6dk7-d7teBcl>?F31q?(t2Z93-oLk9w6^H;_|{nP&3FBM z?jy7i*vj#QGcawFx4MrRS=GYRYI}u`h2uZM)(jurUGXzfml};1l@QOLv(nKJ=BD`D zzx~ON{&=;i?ZYReN@PW18pOUKtd3)h?)=9tU2L~(8JbT-W8{+25O<2@3Vqso2{u6jS*W?j4R+5K^C^rEktEqC%`&)s=evC$K?<9 zY8!($R+i}i2xNkA9}APm?%6G0b@}3vvq_Z^r9(}&R$E82L?IIlPOdL*Z#q9?EhiND zz}oA(tLkiRTmiK#_@c>4$B>>?0W3>9EX3nCUw{3^L8{dr3QW+-mtgqiFmsjHB)^?b&k;jg{e)~3E>TK%_OyD+tOso*^H~Q1L7jIK6 z+wr_zor3)!nOv-d=`V+)+Y!j!xy$Ueyuohk%Yq<8SqZ@6r0!l!7oz;x6;hpy!+B|+ zMfwR*LEvH%4=uTyEHXCo-8sp@Fjnb@aUFnGlt39&F7-kTw$G8l?3~+s$s+$c+}CQg z=}JW;;~MIPlo1+7l=!?Ha(f2djz z1X6dW%nDT>KdN_*;s#8d@2GiXwVi7{S}nwsR3cg^P(=!1w+O6PWtrWQGFRw+J8j2fyO4>aC(^lX4Op+hyR6M& zO%K&-W($RMCJ+vGZQAdb6l=hGAAmJF_d1LW)!HKnkqN*d?9_YjivX6TBa9=~0GW>v zt-V3w)-b&g1bQZK&3@6^nt*tGbo3^+jIhx|6e8hUc57)l*!tImX(y^CK zp~QpFQ;v;E$%JZP1%?)J+R=S-qRkSrZ0#pgAwY&@frXfuV3<65?sDO%U@)78-QH@k z4HA$Eu`y_|QV$lHVQU0uKoFhAwliZ(O| zh_Tx38zqemULWnoD!ANL&-+cgzm{`bTi}z-FdDlBVu4p2SKSi0u~>rTr0Gh{cjUQW zPj!D{IT0KO87O3$6Cy1>#k;x}H+jY)uwDs7cs9In1qQ3Lt!+;%I;P-!US)dEY;Ie1 zSRl&8_`=Nox)vK1rVcO5l9B0qEw8D{AuA3G>>Hh%!;&7V)%-H5ymCU6MX~oxCc=vr zhZU!gp;~){ksx7T0ACNrhfaUV(kY9gReWvkHb6>-wI?b>X`K$%FBp9Ip0)Qiy8E%6w?HxMn;SZI-{$3$H%Rp@4WxIrz%7x7GgXO5yL7mU4aVm zHDuXwi`h{%wd{eE$5WFkU>5Sim<%mO4@|pU6n_4rmJF81@AtS!*&X4A0)D!meD?|N z0lxefOxIe#DOB$t*9vuB6;Q~+*EHc35<}QXpQqg{{E+@(mXS@Uih`UlTG&DHeQQe) zSY$*QDON>~!*kyjYhO4LL<;z&IvDn{g(D>`9Nsp17j=jIqfM466JD9Q0`ejDaM9SO zewL5{nfngsrnR}GS0II9&FrgdHJ{@Jb}S}_LiYQ4P08)III6(-IDiE$5(+C6@OBiW zGrge*&$n6`Rt8?`<{X$zw3^d!Yk*Ze9sr_1UB4JDZ}y&f)k-O6A4mtSn=>EZeY#*0 zkP*`P&^I3bcJ7s?7c0Q$1G3IX1;wG~5@41rOL7A1<222=cz5yGwsfGwd^*UI>(MHL zl#}FSQWVD|iOl(H8JI3ZSM7J5ZKhAFRg8v6r0!=&*b{B77LPD6u`qLGSL^&aA*AJ$OrU7b^q#qB5m?Xylb=3a&3mIG z;nkIiz~~#34}bfxt?7k|md^7DC9Cj)Kz6^*Nr_Zi1{d(*mMiM{)7=gy6WU|;^m|!M zN?Atd1;x(f@UAxDLc%Jls#NjVMe`k&|p4q|nlK1VJq^-QAme zP4g<`^VHm)CvS0#kyDa5>tqZpk;!OW)m?J~Sl(K@*$X23{WUVKg6h<9jMJ3_v=pV1 zQ9Oh)kn-%cnVnWR0jCB?Q99A~26w&g?xz!xfSt{`~ z5{e?Yo->&)hLkI-^{!<n{X?LFOfX}>k4Zv!&Bz@l0R%t|e%WP5klMQcE&^PYiQ#9{q=Tr4Y1 zar{u?rB|pOak*Wm{GPXdajoWYS7K9HO{^r+1X!A)ZYnjp-GW)jwAcLSU4Hjl z*RFwb02G-hL{MHKRfO0Rh?zTE+esD&LPet>4QUsxm)`LgvO=F5z=Cqk`&BcDZw0Vw zU{)-K3=nBq-MJAOasZYjK@_tM$f2KOeCM@daMu<68w}Fa@^Y%zk?XLkH3TwHE!?Q5 zU+1{k7#p?Qk6MH1cX}PPA!1=+;o?)RJtU12czfOw7i_0gmCoWJy^NoHs&$GdZ95L; zRg1j3s8PsF%&Y`jpK7TYE{b5YR>pPt%U7l{bVhJxX7s)Pe!4zA8XOV8tF_SgVTXN0!LTqK#Msoflsm|!v`1uKM`C&x|Go*O?PgK zC3{yfr`VmQnv3=dLhT)XBuP7DwNNa?ixQ;L04cN>E;Xd*)STDdVKbF^Ro&MK0Nkz} zj!$wBlcANsLFNpHQgu^cd5)Vo$UWQ%Fa{YRtWm8JV^P9NArwVYbY~v6i!jFPZnv3& z413N`@=Fkt;N-2h0O&fgV7EXpvQWqCX}8%-EmlU=i8v|&y$!fQ0kg9^Mdgo%4A8L1bdZCl6G=(F3VwpE0`DuTA#Y} z5uwdyLaV*~oFa;nrfQr(JXT!`rbsc2?i_#C=wdY8am>t$A6w_%koUSP!fVqwO?aNC zS}DK}nW|mq&gL~Er$6zVu|>9%{_Cg-0VZfD53v$U4>Fz70A<5@tWxt3UZG#J-OOeG zI!}17U%&1rz;aE;rWGZfQq`18!!g>8nwu_O_Icc3>xLL1hxn0+eP++;fdCJTSxwnSEEFnv~>97cT ztM1o03M_dGysE~gea~-&&euP9xUUor639Hb^POGDoZ>?0JTC6D+JKrpJk*yVS`WtU zU-^2y4fT=)Z)hL5deBnQDTUL2h{3qVCs!AHdp}CGPC6&JSjf>oYe}q=HL8<6I!husRWFf10e}0&t~ep>dHHCNr929UDI{Vc`WZdX~KN8wklaEqoRtYu;})b zG7=HX;2x*lK9U~l$^n09tu*m=K1y&!8xdTX+hcjmbJYi?8QAe#-*KZ!lei+!MH3ut zY4t+R?ee%0=)xie_f)Eaqh{>(>6#C`LbtlxZwh`*N8f&(r~!S`uIaa2Z`EoQk{N!( z>p_zE81SRxI%>V?UZrs{mCLeWMgI74M@ej{H%Lgxh-&R*eE{YwNMEX7Ws5yn zpIBb*89J*(;ty69@87F0>iJ0jI_#Q#aJGEeiqceSxzsmwSR9^o-h1u-Y2z}vb7N^m z5Lie5(nk5CR)EEFsOuV;c&>!Fx-_A!vl*MN zU{P>ZO_avAV6Y^bdCA#sJEr+E8k4u9tekgtD=)V;(rSMBd`cF9JvHCGm=j1sNVW9t z#XL4&<?|Qh~g>HsQI+aS$W4x9G(YRlixGDk}A37nbq}opRZ739Q zhY!Q8RSAReJopZ@HaxdZfK|j)u>@G67Tehh5yirXKD0w-Q#6tiqDofrz^*-?IG8$o zINR4J564#>z4z{Zg=|bbFt{NIm1FZufQ&U@Wr;B|f~$7`nId`c)!C(6(Wq1`&(D^> zW}!@;oJyzQ*LpX%@7=$5x~P7JN-YJsq!eE0FGI`%ut=bOsvCyFNBDM7bYp3LJc{gY z_}0Mu?9x?p_yfvE-}vN26l2ItbYc2)WMvmA7ey4YIHkLPzHD+}wlBZF_TZPlyB!oo zF{3ExhTXgS5AO>Mj|ju@hx7CE<*P5w(wx?|18kDKDr#EJXQyx?)8gQqe5Iu2Zaho5SZW(53&I6?|ohwV%@ue*HI6S;hZq@4}nSFMYY!C{_| zMFk7Is@1Ofd_Hmy#0dN_E)T}lfLF9xv`VP;*jFVturo3N7P3JawH*Kp|5Wo<+Z%m| zy^Kd9>cEo33aVElRowNV&!I-f!eLQfJ+4gqe9x=yZcC@dY%g|v%-y+@?abB2o%`l0F@i$$uniX=`~h?c4acv| z??-J7-V-m^T+l*PxA635MEo6r;i^9VRF%VW9Zt+t5s#5*dVMFK6R+A+iCC&{=+6D# z-q-H(xywyo?jM{V&+x1k8D1akUn2!YK0TC;c$8W#&)l{jVW6WaJ$4( z39tCjRa|*&W^^K_M{y$(39gi9^JljkQid*D`fz+QK3fh)x3Y=o=)<|m5ASX{)4vi8 z2`V!(vI1iS$~2Vv(#`nfZ-2Ko_wdbMe(!tZ7zTIX>E5sXE5e8n{Edcd^7qfrfB6Ne zWVJ;@AeL%(loHC~B8Y{Ok)fv4Ea5^<%V}b+)Ys?OE*d%Me50NQA;iZ}w;z*}Q6Xbs z%`>B>(qsaSYN-a{6;sSP7msBQGyv9~C`Y77qdX>%b=3b$N+P{XlmJpK+oR>6wOJ%h zn%+iU+(ir)Vj9~yp<<7Mnu>}$LW3G8Q#V+fJ|cFx!7+MJar$=>=Og1%eZH(Oi?TaP z?>-OZRWXkwwBdCm+Ru}Gkiw7tBJd*>EEi~1H&_Tj7S^v}*?q683StptJuV0}?~zAU z;-_$vqN)l`k>Au{xoQnsRKE4@C$xS=fyMEet(|Iw1F#++*($`~t+vDf1fgE_{mk=x z%I+`?%jrZqo$b2|VjbhPuY7TJc4k5|P;?K4A`>^tn|*c1VCHfrp1;jk9vMV7S33L_ik)s2~tG~A}3lPp`p4qB6Qzga01B5%Cw z^#}2f(dpW&OXV>7`I*JVd?Z*NB$R0=bsQH+d@vdR=R1FT^LCsCuuf2^k8UiLN6|XE z`uRIUiQ$F*{`vl|y%5N1C%_V8#=SdAGHYM#W^~wnSR~%$Xrn@eht}I`c;|~szNi>9Qfeui%fS}qKnDseopg`xZTGzI&}!rNIJN;!c$fkxfTyTU#i#Pm^YcY4GYu z&6TP&oDMJxnP&14l1`_3>_%>L(~dM`B^c%+88(U#!UO9YGiD$|dx+#z7Q9lImzixR zfK{HK-?aV?tZ<0etjY!M70Rj3YW__ZY*3f zrS(#Xs|U&(L7wNqqs(7cFW1A_zQ8>^QaInlQII?Lf;9BJXk%F-`ipSwB! zVKmWP{^HX7!bmKsIkxjdXF-`kAnR*iZy@z5{MqQ*gWvt`!Q_JgfE79csiv=iS1TjK zfj}{D*n3N%c>f@f^&%|MX*q!9tVx#5Z%boSs{KxHcXv1T!q$_juB4S*E~5G9?na*TOwnLgZ zpD(16DU`96v-xdggqy|L`N6?;PT)dho3?dmEveqY7_FA)2m4nd zWbLz1AJ^={rH`5$78WOSECm(`Zg>O48Z7bxja$G=|15abknPQM=}asFlNEpCop1i} zkGJQ7Z7oe-D=*DHm|&!+rm>=!{a|`zwA^3rUW76FZ&FuoPR7^P*4|i)uiXqph{b9p zRtxm3wcWKAa_6uOLngOhs9226LHA`SNc*u?}h8&;B9V`HRMROIBop&?Ad+4GXDxzTDY<*2FCLFML^kZU(8n&lKf_-)w~MK z=tb4-X$YAXq=dw+(N)SGUmj98M!UBTEbs=-3Yj9~!`6F^FNKDbkcvUg=O?i8k#7Kt z_PXPaIWH(;jSvx$5TX7dD3vbu35;S=}L?tjZ^W$p5ERJcMX6Hn;`)aDHC3O>9R@q zAx?gEIkAjjV6ZlenM(unxafL>Xobpy&|3J2X{if6NsbhW3&0Vm+99{q?!wEnCyo z`CpYMS5+k<$Yk{t7GT<=!GR5CbLR4YlREy!ujAMWYwp3?+^^>XgjdbzCGG#!Y`lna zkPrwE#-@6E<>B(u`X&4fFB+E(5Jq$6?d`ux)qQWrtZbK;+73EU9i9UBO2KG%Q3ozQ4nRv}L+ReT_|TY{ z!H35GKiUb8`2?d*p@g8w8o3w}pHOpXhg5Z@FQ@6?RadCf)G|9%JY<?J;|n;ioBMG@}Q=(xIieO>J+t2jh~) zpoM`=r_&m#Z1Ze_z)w?=wl3yfF1R)KJ~PXLYqUsCBbxF>+P-z%2yDB8q{k~{Ox9}^3HC+V3F9t=2!Ic&&UQJd&$aY0*mUHSxsUs(ZV%7K-?{%XEF zbI4|4cQ;BuSZV-kQ>SmXLlYbGzxwO?DzxSoV2P|r$+0a0tej3j*Ak#Kp5 z<4Yg4q}BXVC`5q8O7whc;a72tf887y{8j(b${`CSzq%)l#!)HfQnrI%Tq;-o}{PNli{3Y{b*+m1SnE=)aEYOUrrMfewc=knS_ z6ov5&IAbO*gi;L(J|bGGg9K(!M7uEILVO!WMGT1IMo<(q|9~3J!^T&QC>l*NF$UtJ z;Iovf;3L^8b>UwiaW&w^S&84d@ewyVGe(SlNn}&nK} zYiMn_v!YTR-4k_gbt#+0LD5^S_`dNCJmUAK%ZM(&+9@-L7&_0{^*iGt1Xg~D`%e&^F4jvnEFfey#0 zw+mne3CRoNJ{8gKTtR$aYn=a(EHG|HHSq#HYA#P+6aBi`(7ZNZmyWVKOc;p+D}H$I zJ|u*UF8@Mqr|&zw%WhYR`PGO&B*Bjrz$oyFVAVP@WGm?qFjw$BM9d;ep^9api-C8K zT6--^XVhF}_b83X^d{FU{2=<7uU?rzRTClBHOr#CLOo_<7L?<(P{X;1Z-Wc`+aHXt zUVP)`7I#&#@W{mXiL`S9x6AY1lwL+%S*0)J?+<>n+NM1iUx-WZA8d5tr7S&~P^9ml zTyrmYD_A-gb@RHWAZ_D+qeI2|Xtg?U3ynqm!1#&GKy@@&zG5e37+SOH>Pv#wIn_f7 z+#au2gTXDs!zWL2uPgAXj&Bz{U8AX#6=o4&86*G;!y2e7v%i?DwICgetcTB>!q3uz{9dygo$CA@m?f{CWuOWVX=68jsq{o;q*lq ziCRDlJ=#||t%cj*d+>CSeZ1n3VHnw{W zk1fMNpVEdd;uZZ<#|`ya4DL%)7M4Nbj?O~UjD=e$I~g+_ELK9FMC$rP9$iU`7UfgO z9pDIFp#fk5`woSW?BF87WU?6}#1OEsZ`J@~PScubztK2WFn!L}g{d$tFPO1L1JNW0 zDadRvQ*$sLzHk_GLOHG=3^T^uJwgl*us-SWxZmTzi-V3+l+S}Mn3GJ086}FmtIPhn z1gc|M`@p9!GI{NZJ~koNoG#h6@+|`%uxe9a{hn=eI%73w)w!Fy4|c)}ns#p7`LYDb3(4QD{Qc$8`m)U_Y*QQy zVq10mUO=#K6;-DW32j~ovIaJ1;B`F6TQ|Dx-W+l2Z0hWdl1zcBonKuV4MwPH%wojjz3Di-B}End;A8J!1RoH6nFerI>GehvF9 z`szs>fo8lA-|EF$FFAT)A)v|nCMrLD=ao6#(cKFwRz(K1JqTjaZzkisG7C-XmyH%3 z`ro{5olE|aJT~OcO4zuobIY2wt`k-pcaDKF^(0a_3W?SSTw7s9Ysc#Kf#As#x4GAL zzo+XYsHsHmMIWXrJUPX;8WK4wZO>R(3`>p=R4+{svGNAhX3ZmM%y6mY_-tbqa0t>t ztrf`VyyZJ)rt&Da*RWG~>|^|}(>PKkFFui&r*j1Z3%g&#!alIL-(doyf=_fk7v~k` z4C?5BM`JqL)8`*@dP0G7#l1v3C^Qg)hIg`3tl5pJk}#e-C87lQG}D(+gP&x?(^7miyNs^IvM~IjTO@#(=E{znjAGO4h*rF=}V%wp+eh5(3fF z(M^3@?;FYF%-Kn_O=0(JUSE2uizoMmQt6PEMnJ?^6Xd&Zkc!2y?0i{@PHJ68qbH2M zzMO$V7T`DNd|@*CW)>s(^-UNCf%GHuJ6_jd48rWa`SJPl%~0^>O=1T*I1g=x+901JT?Wrna+MCV=+s|j4u53*`DURkWkCw6sPiqI1&k||Z@ zt$b3dU_0P#e0rLE|$RAjd|hsnN~(?S|kWL#yG z&KM&`F{KD@th^C67@_zo9#>~0W6cgAJtniKmlIki; z8;mpuwPxsfV?R?uj7nFKrOBS2x>1`pJQ#ZxEM+>;fZ&hbgID?NEYCk7NezgqD!Zqj z2hqJKhyvY*no!hqN|9XOqc6y^Vz0+3OErbxJA~4uPYx z%SROPfN&EdUvTN=lSH578w#kR;H3^yVphPd8GrMVAc^n|SxOkVa{cnX z^zx_5LjjMd7A&UejLdrKQVm_Hl(%Pa{KQ6+SEOlz)pe!j<#SU#uc}1@( zcgRZ+yuei_B&w>YMus|M25Zzxmdg|#jdvG8C00000j>w3uB2zJY5O$-9L$hZW3940#Y0}!XUQ)t(3B`tp*RWw@2n|9adXPAX!z7N* z{xdDsTbRz!;`w?>IQ(?Ve9W^8jYgxqEp?y2*|lY`iMC)V$OS4;&mF(N(?+Aw{@N^sVX4y@ z3Wa3P_$z;Bvuq8H^@;0yD)Ubqe_5&Y&-8Dl2SXa|FU?vQgwkOiAw)vs@gTs^3|lL< zj7g-wQaQn6f(I(<%jl?ot&K*b{e@WzgWwEdq{rt+1c0IOTZ8^Sv^t>nT++wLx*oN> ze(Bg2`jADV{dHLjgAlzLBB&NGd&D5X(AX^|HX1|WiW=yJvA6_V%U`PMK>Sr7{op%| z_LJO$F1y_|*ff8;TML8W+|MIOg8?F;k*EekBew>(j7nsasy>1-!g?c;h!7r7)mhQL zSM*p&qy6NgMUsG!xYWPZ8vNF-HG!YyFbE|XBd7)g#OFN%z|gp@!O>BX1mKAZYg2Zc z%_T{QCB5bMJ?nz6HrQx1+K(S+f`S7jjfr$2{a9EDIQytrG}@1Z0S!LI zqHh17Dg5yDbp#=NsNXn#*2Cb7cBBbH-@>3jvBmph4cLOIm~g+Mp1?>%lb8utu8*%P zs|&cLR4f|pJ8c+~P%TkJdeW;w6ZrKX@2y(XdwI1%{H%vT;@UX`eG3DGOHM8rYrvKi zkGCHvSJojU#k~``#{{OrJ?etz@nsPkjYj)2w|`V*tG-NPn23b5AFyBoQzw38-evp| zKmKaJG5oBDp=)V}fYA40K*ZV69ef=5^IHPBIO}z}99Rz*8IOFvL{Xbs-Cr(0yf?xN z^#AG5XkX^uGKSa*XD^o|A}z6Ri@PrTR^J=IpYg+o?yWX}pY<@{$0IYlVeC6FK&A6H zM>s5W{`oBuJ{g`@u9P*g1mvzwaai*zpq5XCdwa1!|8WD2_7yR{npY0HO|Ml#)i!To z>cDT~z3>M*FhZQsO|6M3_(PR9ztCal|lwWZ*LX3O~YMUN0EH z&vFDtZ7tPVpXwh#nk(uJ~Gz6wjTi^XB3SeW)wtz5vYo&!^`jAw6c zg}cU*yoBR8;x#|SI5-*Nh~1Ja^kM-MFKk(n+qKr!%2@EKkRY|U$E3*b{X?rAOk!2B zMEzIlL>Se;B3#5Ee!}xv(QomKo_a3S@M{}bjPN&l_*Jk!!hS!u%BzD0R zYct)F5Ui!G*#c%_KA*2!@-ik#7Neybqc_f<_xXZi9h4fufsMpO1jXZE%36USJ?-Wb zA_nope01KtukaJ^UB}CD4ZlXgKse9EnI$<3Yel`0YtC(a4F-Z+4IyL2RtpPbgy)I{ z&zzTVES#ooWwqnrAw>!CgoXYauXzJb zZU0_?VT#V5(XFBdTZCm1=9NOepcJOgE2}+M_aB=Ufa74|h@vPtz6G{gni(vn%?rp_ zvcz)Q69aBDKeZZ+$v~+@fiwBuxuy-Lb!C#NZL&GBuv}Y8X0~T#ldo%uEGP7_J=@bV zG5Zi%8oRPTwI{i4&8tz##P4ROgLjPRXB;f#MX?y>;SolAkl{Fj z*lNUE2Y%A6h0)LW^)HN0#Lol_O5HFJSkhqdJoY({6rudJ_9J^W7(!JT8nNYYOy&x+ z3re=ADC5t2)N&vI-<{oiF!^Y&NqJ2Pw6$E_B9%K{j3MqwbIU^qPD>rnFfn^!uv9Z^6AgD}8Wi)CA6%3NJy zC0kIAC^Ht6p#_IvO8;6M4o!BDrUi>3a(V|Kla`m5-hwIpZce4Mtf`^S{>#I;eL#bD zGiP#HGcU~^zMQLW!B{erGjpBcDp*N<3XrjzxyIG$+)#B4t}!8p&As(bzY`uH_w3o8 zO78Xh+UkB);nRhg9lLHHeD?I|)7`1uh_hr=QbRZ(gt_d+?w|rP6tvq%;R&mSy>;N{ zB_7Y!S!asSnYY(9{3dLfg8@yOo z8ceC$WEe@I8qxqZ7L_IP5GHrHX>+%rQ8zU%@dvkL|G_zJIj0Y&rR`})M;|Pu)D9`w zmKLa%i3Oyg3R`5Xx~I6!J-M4K+4hUS>~l`5a255O;x@h%ub1d6-*bAtuk-$VzNhz| zOc=J<4|S<_Pbp544xPm(n z)@P$B+J0}2aV=Q>F;@2J^&vW8;m~NIzx}m8Jb(H8=Rf}$ z5!!d`*!Q_nILJZB>jXJi!C3AE|3g2l7beFv3Ta`LEx+;f($dmR7V_gH1}1%Ql1$^K z7~tFekhI=uB^B^9hQ*kngJqIIIzJH$5j5UV-DFs_f0^;nI8hgM`yaY)!V6F&IIu%? z=$pIpS;K<{2PBzNRZ_XL-gX~lD1{;rmT(8Yx}4VMC|7`C(FGkp!4V3`SLHrTwsOkbVMYr{D| zSjL2#aUz&?7xtH1d0i{y^r>8M%|+lvUs0}nna7BHma+`sVbkjUiK70nn)|hVWx$YA z?e|i#bhXysdcJGq5C8nb*M2Ukp03X4|69cY_==GOvj$6!uld~u;H<`R=8H?=Zy}gd;_E|5+S?poEUc+tb6M2vK{Dmbk1&AzZgQ3%!hcH) z{A$DKQ4)(^5dk+BRANw&VBR4@#>UD-d@{57m=Hz)SmO#`b#95 zb(5qz_uU0!?J{NYujsO_L8}Q`ADGpt+R?t=j24Rq{cbCvBdjj}l`_Kz@=cYbsYz?j z1e$ZynhOSHD6|Oq zKaG^xBfn%D@aSx|Tz(2jF#Oj1kIS0YXIH)|_W4NCWY0xN&H4Lx@7}$CVik*hR>q`4 zwO%(#VOT?cz~6qpwY9G9?)_?GeuC@68|=$3SSVjwHSzeHTYN|7!T-7Z_=1W?cIo3F z!iM!m4CFgvAYY5&<1D1IidWr^v0$OSGKvrvup2a`|}JvdRtOUd3?aiB_uF%E9=hz_VxW-r`6YURe}br zW&_wSXUZxDLksRK9$VR4hCVc_3xgDu9T;qVVl$KRQ0@3Vt8ac{N+dv#Z(RK3op(gg zSzI{emPPaCUphJul`lW|J$Lyb;25EpRr=^SB0xSCimHU2^xriUL2rwph%2%7BOja< zue+;`z}c{}>SMF*hdwYT)p&KgQ%$$_-eqld7)Y6t1!rex>);vWT{FINNOdMbl4zE6 zSz!>wL0Em|p^!rzCZCDSqMk$|8j#H75>@4azN=BZQbY%E2;!McG@maN3i(799%QRH zR6n?vqpxzgR3bTGA~T*`AdzRrO1^OVt6$BB4|2_qxtu+x&qgCYy)PAs#9*Wz$3zu^ zz0Ftn98de@yv=teVYZIheYOO+FC3d+o)1TORbMRti<_@R;<;S>g&Cu?cCcUArZ<^< z;pOE%0mAw5;X*pT0If7sPpoOCPo{i6y)6}PzIb4z=TzgRfB*Ya3k#MH^ozD#G9)ZM zWycYOyZqjA4awjrR`P@V(by>NWS2e~&mO7#pk=BqUFng+9JYbM*whT9wbPfceJ1#T z`6_s;cNY3lHY`f*yi-&8zCKvxk?wjqEi7`ARSInI+CqX8Ue%@1J^{zQiAcVXOAVk}iG-Gd9sCzbEr#b#Uu*8`+sm!p z9+4^PLxXs~j>_6nK6?(7yu2I>hx@Kv-j8rXRbKhg9})_JaA9UcKJw!H#pdIOpIn?h zqnm$rva4&Z@JBBD9<1~r6m^iBYw#iS1-~sVK4nK^C7-+ewk~I~^vz0sh@h$??(LAV zOCOSb`&1Rk2UvZ#Hip|MV7+D0k{F7tq8P4jJZibbe;)~wT4Qait{-K^QakV09poe1 z$H%Hun)n{M+^Z%TV-Z_HC0L0CCjq5}b$9me^+T1rMOl0OuQVhIUnGfP82C!^t^Kdu z`^!S9UR>zLNt%`g%K$8R@}lA(cMu{Z1B&hp2#Z8@D2ma}LUrkjr%%r*G^hBSP*rWd zXg&f@ijn|AjapkWmrmJ|!D!QD;o4q=(`xSV*&{i_-h;?mhg<#<}N@11_DxfM>|&<^i)MpjmZNs9ih%?CIh9_9@@ofzOan=PRhbI(wDq zW-QuVG$gZNl+n>66#|5<{KT~Uwqcdzr>f+Cv>X(>LQaE>VwFBr2gXB=I*Db~qJS79^9U7c{DCI(hYq=0-Vl<5zVC z;%jEGOi>QH;7nj-=?3?N1*u$;lw@(e2~glH7@)1_-;Uop`e;M0Ia`TvKnbOiK*Bd* zLTMIrggTS1;fu63F|^WLCE$b-^(J%n0gHjs`vQ_gDg~)1oG3g!-8XM|%iz?kT@@BkcP$-`9cT__UD;cOiR8c9|1;#=ud3`fP#>hy9&P3>$ zrlUV;y6`!lI|8kXiK;c8tMldoW-$7y{nJ)8paD{PO7X6(PV_Pm3p3 z##aqEhGkKVfSjz;Yi%}dxaG&;Wb`kdmX&X?Myb5+`nbW0qvn2{A)6)jcAYs=NVPnj zt)H5bPv0{+9$NG4J8U2CNb`DTk_3jM#f4H-!{*w<%pj~uv9Jo9z(Rh~bh0GB(i+@s zJC)=&!h6555PCwq8{df=2CXd9hjYQX=Qrnsu#&f92~S;^i;d=#Tg5l?8UO)0)%ZU8l_3clFSg`P!iP_fLg;P}(Z-pWzsR8N61%+4ME;qm(js(`$V=R@y zIv@cmV@Ap7E*YAqJWMbBR-289s;ooVRSpO!|GsriOR4k+>5OvJ9I+7Ej$7lbu>pgQg1ubZE) zuZP3SSD9SI5+>@)9E zK{EtFkSJ8pATP_ypNy|%Kt0}XA}sYG9j_(aZY$QWGn)-CP;&;w%!6ls|BFYhUHkSq z;XNguOq~5B!b0e~2~TWHMD-|c#!5mNZkUHz2{Dd5(VT_nJ z?GCTf0m8cv(;AzYo_;cT{k)jR6IT7-`&a_F+@+Ev*4=tW3t0xdko?m|)2jFO+QL;n zSCR-SlZ4i+X+LAkQYb1px-@d@z}(PU=!&?4{c$phL8P3TF=AMUW?wo$ry`Oh3`dVH z{kUn+8}qzaxYZ}DL|CGD(y_TQn`MBW7U`#GkskfijAv;h9~<#3&L8a+u}6t|=jJ?m zv|HX3C0(@rNJ5uP4CJ59KYpG{&2RLuJI-P#x?0HD^_EB>O%ZmxmT=i0H#ZMi3diTe z&lgiGEmB@3!j1$iRegxSFg%wtlLms+;jqqE=BT+iY6Fc?t1P;H%*|Jno?2Z+9S$=d za$*L9)qsJpbn$v`Y-Mg?;(@n*&`O#b?%b&0f2xK%uMO@dCXW_3XUMINVU`hYHcgJ; z+R0m;JRT&@kIGN#jl%Y5QGTTc{#N;!wA$P0F)<^*_nre@r_1efQ5cSYG=1QD)II3* zI%Tku0lCfj>T!UrtWTSGLkSPe|pq#;gw>>9cn|kk$Cjz(aWUj?)Ihx0GU8$zm#8|rCUek zui{B}+#};4tV$sdCMEV5)oPiT)KsTEz#<8v;fpUGJ$d!2d(7isNcOObMS!9$s!T>L z78wbeN$DtHCBJBxJlc?t#bO|=Ns~~(ZdNo)8XYrP)Y4fIBg&S!7xA#~ z@$zI3%!)NkmK(KMEXw@J83RQTAgsdE<&~!em{!;qS^lLA5*9lW3>kE=Fie?f$>HEo zkd(gg>>qWne7}6Tn8C)JYCgNl@^n7C7O>H?>FUzytX2bVMu|{O$iEO8KQ2T_}E0RJ!xH`%q;0}0}Mt7sefF~;i9X#9@&AZpfYaR}q& zJH0RvGKtfu0YYAPIR9XeCv^T41j+w<-<_!^q+*^(t*QCq42HUEZmq0p;_(ryO2}<$ z6+C)~#qf=FSAQ{sl8$74kEYw39`h@C2)EJ_AWE2&SS+Jf>o2D1t;_VqiyP?+7eb1A zBkp()EN0dyp42Fn%0wW)u5=^-nlYq@Az$TV&*x`S^FtyoC{bIRSSA%yn$=@XS`>s8 z_{pQE$2G6gQ)BkW^N9+C%OU!-O0`U+EF8~!2p#2k9LYaFd2&8KAA^!`UN7V$Y)QaU zVluT_B+VVq;Th5dVQcXp7rX8Ak^mgBHOONL>T7ZO=STbotFHcf9Mu^Jvzeq;<>R4v z&4f4JdM~^Z3Dhs(>K!MnP0jFRCYe|&lSEA!b0!Nbg&B^A1m179-5QaJdD1p16N)}A zKdIKJW>DM7Z|GK1Dm4xFi9R4d1SnE8OScV3mr?)0^zqZ%V@?!caJ>f7Tw z0ySfXsRN3x)|!3R+8Uxi6ImH^Vd|<+cir;g0_4#Xk0$l7ez2mk93X^#^YBJeDyC03 z<101=rc_Cz0un9$w)_T$Cwrx0IOn1d!oV^@B?%f*qkb2m{eT!2XS`l3T{B@y(e^7D zSXFH{yK4cZysqHjm^iN$0iePJn$7q6ys#n z<E>V6)(?mehO)YC`!ov2!-MpxTw>0KDf)29bkYp1a6landv zxLX~;PPX?S_WKXCw~a{;EW-@bJc8xYZ<*Za6@#xtY+ENK=>n=v;(1GcKV7=jCK9oc zA0mJVErS>4_mg0m?bFA=&`iinsNv5^W#ad4o`LBWWDrxU)tD)8{v2(X_r+RCF5-4!{WwXH9=j<6 zG!h^T$pPD+W=K|q-FyB--H8(?e$yJXEp(mwzxS^;_X$PCg(H(mJn@Cw24|aqYrfhn zD@yj083L;d9?~0CR>2*kJd%jfj8v&qE5D=BJc+qpc;oSCkFbJYE=o-pO~;@8YjQFY z24BUZboN6yqeM)K)S1-k!n0gHrkHy9{5kYlDrppF7;}V+HWS+NEVdFGiqZ2*Ng+aV zBsK1-u5F|vscrtTdG-8S?xfF0*4?>#fA-q~0m9y)VkNG|A+D*h+FA!;#y!o?3U0Sv zHyE(xR_^&xT?fm#v37UKSYl-|0e&#|GsA4#Sd!7cqW7i*T!Jfuib_o8P5GIJhQ|gw zRGlI=8(m1zdr}$h@>7sywn-mQ4o0m8HQ0)_X~lbqNRh>(@8Ev7L2of{BZi+Q0#*kG zzWNADAXK@WR+$J`uqgm4-G+tRC0++AgA*{7RKeEB`#f67>v-XJ7?f%d7L^SQF~&kk zX51t(oPGnG`&?9OU3)8x>L&*}#8tb*SFejX7~f;V8O-t!%UTL0Rv`1p|;Wi%U8d{{1*Gb3j^CO3i^a?0Du4#rr9xxJBemU&kUW?w?y9ztazW_m@( ze9%~Q7{FX^1L*G^G1wl+7YMJs_QtvPQy*l}&&|6HQXUu!qg<5nU6z^Hw})6b(c0SH zS}!?W!Q7|bZ>;#BK`EAEBuT9q5dhml!c70Y#WnGYTs0cn63OEYcdotgWFH&EngM`$kckzJehr zwn5a<(O}0rkNRM<{V%Ecp24tx>y0 zRJB7CPi#*lV)LWHtWos#`^mkL1+4IVKJ2rI%c!9bg~oJ_*}D_Rj(v+}k*?--LIK_O z>V5la#`klcQE5nJYKPYlhh~i~WVJVWF|`OH0K3U?KM|#n6-^&)n4BDaQw~-lWyudv zlB8a5x9f*DhNWWJv1%oI`7zHC6wTmryP*2oDjDDK80B}n23587N0>;&hQ$*xWuf1o z2iT?<^tb2Sak<>>XOhgRy$tIkaSi6hl!bnS5eFr|VOfR({`y+KA|4-9C{BH(*8#@j z5%fkp?6#28N?VE{R?qm_D+p8F0ZR5a7>Lq_*NBv7qr{o`V=5@9+XP4P=I`j zmY7(tRZ4l_tDTU9rG=Ajm>KrRXCgiH)8A#HN`2|8>11;8`O1<<4A)w@sNxX!MRJi; zY-7b(_WcK7rT*I0(MTjUzY^1z<5A>D?LJ9Xet&w-*$6DvIF&V%&=aoueER1!4QHXQ+yVPLpnD(NI}x29h1MwL7^9tE=(A5)Z}B<4PG=kCP5u>gVMCU5oh-TS|3 z4>-DN#>eF+^<<3w%SyMwEgmt?YQs0gbG1pSarREo9WxWCW&sEpV*3`}RcAjbkR>#8l0!er~ zDiQvXvsL^uKHpdJ)#@^$WCkP0g1A`7+VR}S>qRYwC*KpJZ6d~3bZuO&{D2@O znwFLt+Q41Fy&$18q26QDvr`64P1Xadmfcf7OtH$aq*&G! zl26>dJ3Tu+TQ@NcqvlD@l#P2sb$3o2*%ePSY&U;_pi&^`Samif9~J48K(iBHsU5`j-o7Srgzwr7-jBg!sD{**MW3>#{0Pb4%SQwUzo(*ui40mTGNrnxmz}iM+K!JI zj-RZrt04%dnCm&?E=p!0wk4D4r8eGX`>JeXL60$7zvp(3=`+i0 z3JSXQKlGb7PF3l$Ay|M@Q^}9;y6R zS3;A`Ek)@Z{*5i{b0sgC` zPfjbWiTnU5I&K-&VR~@x-o|9i6f+NbIBI%h;b9&5^`rhX0!R6milLewPQD&2?SoPA zD4GrL^--L_*eq(46~>W=Z9a8svq!`FV=O6=xFkE7-V!d40l^D*TYfO7LIm>rV;Pib zH6jm^hLM>l1}C~T*82KVvH0xcEy>D)Zx=2YQ+6@VrfUFFbI?J*8tV6-4ofkX$A>fc zcPTvQb7m}Y@ax zzqvGo4daRYNGGm#%~X`Nl|nMCH)TsPevWaO1)zryhuQ4l6JGe@PA&$#0g;ZQVrr{W zPzS4p;^W%u7#Yh+t&Z>YO2xHWG`!=35`Zyr{u!+iQWgLv7+^dL z!xsf02!fOCD{>g~XIA7lY5QcQdcE7N)T@&1D}pR^^>*WD^ZMVAJQA;ab!^G zraNb!9hh`kIE=$9Ofe3NORc7tBB9F9;@aiWj#v9xFcm{(MVT8ov(Y68tu8ZmTZS|D z!2=*Q7RofCxk1YyYdJ_}zdW4st$n{OSy?2zjB+&BGFmIW$Jz7|)@>GU7M3fGHrx;0 z(aYxs>GalnQh=M+cb)RT!T|JJ7FW`E2~PB@mL(oLhA4~W+0>Ql#V2_JU)e1QqN3`l zT*;8fM+xrsvrfmBo2uIC6x6LZ)UV2{-8)F3P^P|~&C)9?OGp%8!pSkjSpx2h2n4}b zBqD_*eizHfPO<_o;BgVyPY^^!iPsC+ULvtipuVC|<`sqm{3h_s5N82639<;I{1|K1 zPUcY#QgFEt;YBa?6@@a#Fc|a6qb#5K@Mct;^-CIsJ<4JA(cLQwWieo8Ez83JVT;l| zOA3WD2QZVrR96(rZ}#9o000000LcHf5mZ%GRaI40RaI40RaI40*snv?hM_PF!zX6G zB7};F9a`ue1gfGV;tF*gg}D+vU1lcAHoIFG%%-Czm$r<-U@)jiM8xx4z%O6^4*&oF z0000000000000000000000000n1E)x%LBlF=Gi<-Bik0~E*YtP z^=gw34c7bP>HPg?mAxha{JJT-?h;pF1WCO}i(*y}4A#@j+dedlG{#tzy8v91RFj%X zKax#d=VRYIth=uLI3!`X)vSo^XH0L01?zZx-B-)9ztzUsvI@Y}ne?#Dk}xUR{rb|T zSs2w9`{oj=L=?vHJCOF+#7L7GIN@QYjEFReQ$x_y5Ira)$F9UchjQxTS_gB z?9#)!S!SoH?qugyQ&|*VvFJfpp`svys9mi)V?n#h8G{SWf91xH?U51=nrx?MPL|0e{3uv%S~g$z|~}La|#h) z8B8&1A6PCHfDHlx7F`Znw^y4sDcg1&zA_qF_(j*N4CesLk)uB;q-m@OFvf{7L@Zgr zRmN8?_r_wy6@P~^Npj9=IcwixQL7^aGFTuvdMpELlO#g1w*6c<(pb2#@rAIj7VC55 z$kA^#FQ1t+dp*lm(by>$cao5W+rE3a7r>%q5kT{76E*UI9zMN3U}x4Y6Dzu?UW$|= zjVknchOGiC(3GG6rr(T|O6^8#VPqp$ER3Chz>%Y|DQbB$Gr7+-Uc)HSH&$e}saUA( zJMAS2`fc8w3h_`km`NtEIGQULPTO!;lngOkz9vj))oMjb3)loZ+_-X}%Y%ZnPSuQvFma>j2A@`z^K1-T*ai|HtR8(wS!??+>49v~Pagv)=j(Kh!|0FO&MXNb0G$H#(LozOdkFT+#2^94&}Ft=4-qTaYH#{yjjiz!N+n!I!C;S(%EQ+7_Deu8+c(XG1|1-hIWD7**-fw?)O za)TGjO@Q>mwtF|i?Qm((2Z>bYE$Dxxm?~h?%JgIst*B~mIxhv`)#GL_XU&dDh*6dg zr?~oD5SgtAHLsA176G>F*eCHKfE>@71?US}nr8b=1cx>t#Lwg)&9k*^wlM4oT1n=> z{;B4!zaN1b0RzMFwSozTphZymI~Gz&YJ4ZJTsl`QueJ7+kV8}-m8|6kSej#txpXR> z8(#13dez86AQ;#%q|wihHa~p)=4JToW$DxVk1PWa($%iW?ByUfK%#Je*NKxG5Z*U{ z(CvfaPxbvrk_kG|&2JWOO6KE%9+@TPB__`U%lEOgRJLdZ3@({~Me)1W*P4>1@q8_pTC)2{x?ttH5+&C>g%}k`N|M;rNM40pYELR( z9G+;+^KrCHVnR?GUs=N$jiQOH*I!zT zuMQ3#JoxUx*};)^tNQxKgsq#Vd?E`Wzyhqmxo?Xb(C|)x49~&C;VW!s$R>0#VM{i7 z5kh#czVKm|Zw^S18Qud8aB`^LXe>0_@+$2R>z`<%fGW|YMH*maV4LeDHz2Vz4gvx6 z+YBY6>cpSZZE@UW!B}N=c;#C}sYo_gLws{RL|cMDC$R#SqOCo&mLkB?*k&O+ZgOV8 z8e~Wj3&>zD9Xh^yX;f=!x$K1TnLLRVq^#@+4Fsngx|GU9qZ$E2cKqZF0fWa9utKze z^@J=zzz^h#x$L|N2lDBhXRU?hN08Tb{z#q|0bmDm`CMV*0bb%xry(ex7>YC+i*;QGkl~!B@E?eh5tb>+O-4K{0|e}~ zM;U#b%QZ2|F*Gd*F?$9}HX8~)nS@9U3D|E5GG3r(CwLJs%Xj&aNr8D9!(jO*dAioh z6FUzEzq5CKKaEsT9EW5n3;VDsp$a5+LsKZ5&1PrVxV1>qDlw>wRD)(Q>iQ#^?1TF3 zi%DBrpis(8f7nXfkt$I5w1$H0Hd`*M6PAj& zu;^4tkA|TeYnXjoD3nU2!E<2o2p$HjPw-m{L09*+p=jeMT8nSG11Qtj5YOhu3di!X zCqd~S8LSSO<$~Zju{@lcZEp!O(~`c0OS92wuDIqm%zQesXckHae@-5{oqZJ#*-FB#*pv!Rvcx$ocaBuplm4Wt&d zceZ65{4&or#uetq#lJH>yyn#M})B56+&SdWy z`})=QT7k@r%D+69{j971b5YuF2#!hnf@$HMccx&;j`JT?r!KLxL;7qopbJ0-z+f{2 z7_yRSe!z0hb+!wh2Qe(x%W3)d^ql+H2&W~Gk?{nUcK$g|O0Nt2rgeguoZz(fbD+hO zSX~u4>?Szlg}BpVwh}gX0(04%j>W54c{(fV=Lsw*7fA`3!@RJt2!*f=Oy7pXvMW)E zve}P1_%w_XR_(yxs8v^FK|_t+5SD9?>h}*E&pokh&{%f)0Ly7MX*Jj3b)_;@nPyo$ z6hGP8QXqNQ5m=a;v$!Xlc36ayuv@K0s(gbjU%hvg_V=Nznq`B-XV_sOax&7zB zdi((fODOoGO>=~!SBw4w@FI_Ly)o1Ag$qwO;hLebS6Wp9^hr7gKYDkHIL0=E6`Mqo zi0!ljnNhLL5X`+kBbUl6RgKnSaY*F{NfL)8+XAr0m$0?9wLtF~fZ?E5zvu*~6;=te zS<#ccfMuD3Q#2PqOjqO}<30$jS{+Wyu1G2bFucJJSQ^a$H!eMnn;Tk5z10a?VX2DW zxF7^^6;Q@+b($A63wE>ZcgSqR)?+#=ndP^8DF!JyVYQg&w1j!X-3!yVZnO0TY0;;(}c(s zzvcF-Vcxvkv{pYs0I;-67^~hZD~1)Q{7pr@3{iVp{l(KNm49*Z99aKG{9&-5igo!} zc~k_2-|<$^05OsacX5!2n{J=Z*$+g*4_b6GoWbh30t;SD9IureV$s;ap48O}WJVz! z$%c2MJ%`S?#aKMG%KNn2-$_HTWLp?lw;o$tcjqCEv$zY31``;WU|(DcCDs|9DPd<@ z`->p97zlA%{`FNYWOF?|aVcDHFv|;Ac8&H4Zd|TF3V;RU3aw}e7*{YZ72G%8bT^LnTmeD=;jj}>ndU`A^2?x#dbIrr= z<==rtrS$8&M>kM~QVHZME1v%D2q~wt*)dhYeQ*w}#~!e)ClYW!$KTn}t=OW`gFEky zkGAGN1dzrF-hFpwU3MH84iYxem7SKH48(L)bR}1~?ueW8`2aDtfBco=kqaQx0Dy+D!AsQ>qjgiV6>H<(f<160k;L2pc`6-YRU+%l1<9R>J8w%K$Q2VFxc@nMT{5 zG=f+tpQu*t1aVSYJ+#^_);QNDBzlr(N_c@AmyZGGXE)2@nWBE-m~h+UJjVs`q}>kP zR}*4~j4&LYIs6=CJcm__#yKP!%k59|A*s4*7jvaBhgDD6>~=?zvo*__>(9rfz?%Ih zc>v34*A9%5y+#kV#DO`+FibuJO`BX>aV}`#l@bE{Ze0c$jG}3pRiFrHF=6g}Kr}0~ z*qR2`>~Fv_(zqTEv2Wiv8ZLv;8h(2?L?Vi@21^U>b71iZUIuHNjF3A4dMKLS@%qR_ zYyM*-y8pTqdYa=^ZS2N`FfHE`_Hs(C8LWMY;L_^KN-BWKqeIK?a-Gt*0xZXKl6`kn z=rpb9_0$ic+}QEM@9OmcjH`ui$f+f42MaK?rCR-Vw_Gn8<~7$ZJBH*rX!hazCp@#|2`j``F&- z3$yC-#)l7&HSn79MZw_fmIppgK=#D4gB`z@hFB1z|fSfkDTIeoROt-X<6-g*{Zmj@5f zbdrwcfqtY=l5WsX;+|}>8}F%%y#Xv8h3hejMav4??v-8eY$b+4o@pH1N(;|Z!p9y0 zNuz=#AU8=bgR&E2S4&sLq?bcOD+VhVPTPqBp~dqXRmV_8{V1Vt4ShLDFgguM)5_WI z54+K<=}@tSX5j1jpq($Utd3kyU$(nb@0mOM`Uh#WZ+S!U1$qQa_Ja=IPiWKwuqYC( zvub6nhO)*L&-IRxA)X&ImlAdhygCpw(g=zw(JkbA#gV6|7j%nNWBkBC5L&|=4pONy zO9L6$?@L>?`uD|K?Yzg;{vl$oS~bU3(;=5HvB_i-rjJzad~=bzm=w9n@Hgz2tpWWq=!8Q>s=Am|s{02%K~e1T;W zOWdN_wpU4)(N2*+<`OZagnqFBOLhme_{BxN9`|m%MxpgOlq-;!N_9%&T^)_f)P({b zWn_z~OW-wvm@HL7(5)|!Qta-%Kt9whh(m#g&mAlsP;_6O*MXD~eWYMZ$oJo)wfdE@ z6Hk{w+!$B$SRSvF56{ec&&q4BrM48PLeZGMduvf2d#c)^`c5g$8evtts-z&VOq>^3HtYB($(~F(<{+P>@wos&$0LZLO@pf31pr!Ce z+x0x@!iw%6!+EeY2!g?qU3-T&u)q}IwhBcD7^IYE*n@3v1n+E{R7v*vv?)zH2+e4> zen*dC>jBzJGxr%*nOyfpu+H{L*rwa(aiIDghh1}MfN`xmC zFz^`HD1t0h?RsjbFyx{Eq$o=;Gfe~Q4#F6Z=RDxrNji|Cm1Tr; zfs_Kh)zLmFRf&Yn9Q1y5X+D&6SqY2vaEVp22;*v4qtnx3fT29!7@oaJ#0%n~E6s3W z@Qy2_d*V4~^_W($dd!%ju;OpPIz9EQt}ZQrRIpDp(}csiZ4C8pP>@jeCK)E>Suo-> zouKd(hEY&nJN4jZ2lSM3jicwlddx8>$-xY@zw;p0^Ok~PYOK1fKu`(iKSp_f&0{&Y zWcI~K#A{zi%S;KlfY#SIC-XkvJg%!Cbq7b<2B=LRz9AkH#eQK+B_#(LoHwxSPXD52 zX8QVRz~kANkRSbYzf@wCke}e*Dc&jJb(fd)Qp}aN5-}FOpg`b+T)hbAJ-83B>0;3* z3P<&jdHNmUKSf8p(dW3khZlrVkH9^xbVE748FU9#}6jY|NuuNz`gv$kluP zRE)u4`siBVGURxLA!)GZjb=)QOQAj2q19qKWECk~QO7_7qv)fFaIL2F7*6ll34cL$ zH1CD6)Gz*4)1zW8irqJ8-z6TE;@t)AvMs+n@u!z(Ui& z>Ub8TIW3HR1PSWhtB6v;=&&^<;^`DX>w2Y7*loi3y|`{PCKHamti8CGZoIft#m zUqa!VBDAJlSvfTl(1$O(fxiF#OMeHf+e`DVz2ws2TD?{-moTbqN^;E9LsyfRq{HC1S%zBCSl3fj3V?-SI273SZ1V=_D~bF4e)nF4 zJiiv}amI{P4D03sS8_j1F*R^k3bdq*6#)&My#E`onnz%SV0sA&`2NCzW@2VM} zmn1hg@9@-W7>C4z2b&QeY^8buS0@n?zsT)G!UxziWCl@W@mQOR4Ge?;ei1U@1zJTS zC!|+*5#T3-mA>1o)+;DuJzny7R^~&%zP-CWF%}Hg2}$~}?)LUknIEEQVD(SA^eH-p z>2$u6i1(mphhY-15O%zHCjiUofPpm&EWuP#w~8k~3TKoGREcs8l?qnL{5;UveeouD zPM|4ZF+b?nlZo}kIUNRe4GKkgiUlQQhRFv`Jw?wv;WRr6>R2Qb`n$=z7BcEWdm-&o ztc=E14Jjr1-8~@+yL%J&hPRX{gJH=6r#a*5m~Zp_zt(ykfTauRR`lx|G>NaQYE4`b zi`wluu;HoGpIr;{1``KTx8Ls~z30UGmA$izX(PJ=@LI9~;|I&gW+`fef(R)>2n=fY zOXNUXg%(=UCQaI^+csz=D!NtC_N8xy@%U$)j6LI+8hJd_zrzG$j2S!_!;(P2&Bz1E z1Kq|(YNAG6sY+AjrBz>6>KU`$G+PzhTOQhqvz5B5mA<_*zW1AR&fGgW&bah2BngX( z&29!Sx*0=8%w`N(e=y;XRFwP`kTb5SkW!8YXXA6<-`Ep25@L5_B$5aRhh!xS%XJH~ zmQIk&#ii+x7SsA8kb=yHBPAwSpV2ShpRwLLYaCGbxf?EiE? z0I({gQ!av+N2+@(4xQ@Ustj0(UsflTm@=d5hOOK{9bMVKh7bA*>Wkk&{2R z{ura#?S*+$Y361hB+gVZLe+-QZGeqfX-H*C6;^Y|b<1_S5>LRI@rN^YKibcxBY^rX zxUXbkS#K{{s?~j=hA%#xu}0!?uoX}}T#32bR}QT2Id4x)Swxk}ff}t*#vhEwW`Pwc znI)YCs3`ZLHiV#3jgV%6VmyRWmKRnDlBpmB=zNfPt-KdO;jcs(Y$bUCQ$hC8>?}oC zry+r96M5X^zz`T03BHnSs|k0!P~7E_zO?XMNyuCVhiDzj+yjd zhaJ#&`aPX|{)N#NI)goeGAvOr&JV#Y&lDTuu!uPwqIr0$%$K&tUmX=+io&VOi4AN zHaT|?lgqvh(=U;8l0S%e27>gu@KEHCeujxQI@ zl9MFQqqxI_4@xK-hLF;@IA6!5cDZ~I#sy-K700S*;aS8dS;jUt=0i}-hQhES$+3>B zSLN~%iM3?-Nl_?ezwa?`#BdzN`^SI!yb&dcojreY^x8}J>bHj&*9UH|H`HB#B`Z@7 zXc06T#c{Y@B(^-)G2Xg6IzE>Oj*gFZf8k{xD`K}nqakg?^B9D6^pj@rFOM;;&qnZU zoHl9MzNY87=c0+;aR?x+u09Z!Wd>MtG5^ySKRJ3_S06tnuqcHh6#S4T#IluxikH1P zVKnp4AvRtKE5$r{aU!f^7Z$wz@CfXR}<@3pE!!rox-y zSUT?+W$6d9;egzo-fW**TJo-ct*E=CI4$k|A!yn}tbF_0%ki;* z4+OEKI95l9e})(luuRLfmlt4Q2pO3h9l!A5JGw<(T$nk#;s@&1JJk- zyXLamC#Iw?l39tEhkf&iYXg+LcMh>pAU_b6V`AQ#1heGEz7(a##=4(B|EtzSqZ3n5 z61qsw-urLMj)XPC#i5iBBX~(zM$2$+H>V#T{dHh;)BxCFlVjqxS2 z3riUm;F(p}(Hy!BlXLqk#ZgAuP?9A ze4gc?`y>`PYwl1C-j%h+$Mz4FLhDPZ+)s*O^bsDL1MV<@Rj(7p+mAkQPv6ewet48Xm6hdk6&96pKAONG zM_YGwjPuM#tZ_bgt?!Z7HYI&FBVY=quPcs5$*ZG2GZLlX=5ONfo!M^9J%8Q^7kT03 zh1Tb}?l?-AC+tplC_sj(y|)UC%ZFho6-5q(WkUqm0N42PLup)fIcVvdZ4N@w*ixo+L(h9HyiAwZ)%`G{(-mR@=FyKmo` zv5u(Zwf*BTImdhy7zU>M`1KNVqG~etJe$>vVz^db-8Y_BO<-*NkR>Z+P|8Y`W&t)9 z<|XrL0lF7fR=>wRf=ni4D9Q_JgPultlExh*+4nlj+f=VhN1-lphq`}Q3`>>GB80>; z5k$*{*H|43oq`y6bk-f3N#)*_6)~>)i^;fU5`&UZ64r;WP}e%DdXn+*?ME~2nPl#u zK#Bz`x_w=<&54)|p-~iX8P_u7uULa!U5qGBJ-TH{wCU4dll|KPb{>_HxMy)=#ECn7jX;D5`4v#z*HY7=q-pqHEViPM2tz z@*DcIw{AW1WmIa!{*9k~_#r$8^V9w1Xykk;qzd@}!Dn-ALM9CFGu@DTvoNK+TF{FGib^$(qvds0AXwiN_f1VXz3$=X zUn`2$CJ+RT(kO2JvUH>J0nqVKWFf_5 zvq`OM_|9(In}tft%J%j7Q@*%J&;*K`EZ^Yb-V1q{&@esb0(4dVL>kd28Zo#DOM0g6t}$2nr6C&Gl4%&PEI}2=H6Bm z!9ug$S(fC&0`B+(%NcIs;;;ueYdE;Gd!qTt|`IT{~-#hSYtCF4M9Yy3ix8>|k`mi^lY#9`F30!hQB z10KQAqK1OiFJo$ze> z%2w*@C&oHPVV$mkJ~^3$IeHE1B}j>+#XLOwR%yPvoMYbmz|Llvb1lfm>taa8-Ym^B zBfG>OtrLIzBg@)QG4!_!kY7oY;j^E8H}oJ@S#(kaBzbi>ouCc*?&?5Nx;&>@KoYP})5BgA-vL zSG0%R(xe~|{&0>$!hJYLXJg9ZDKJe3o*U3VqO5@9Fh^gX@8TbZWF=WvkdyLtk`u$vE?8v!UfHI zO+)l9|A~vEaYjhbwnBY#kjntCz*>f_8Z9U)Ftm9RLrCxIEY!gQYqoKAw);RVS1Jm# zV9ki}9o&o%pOB2;fC9fYol3Vh3e5G&LM#X;Y}B@ZO=wt(iGRLPO)PFgxpZqPnQlz) zZ8o(l3MQl8^<}RQM{x&&5P~m0_AzUiw&79|7j5;M%#qfbTKb0K-*OI>RZCMB1KVV!c~Kz8Qne%mlIID;b||dmAuAe(@X&l)+i*4$ zo4u}1jlk35XjuCoa6niDZg!w7%d5WRVy~oJFafEO3PQ+1 zh}RZ#EA23G=~PhKAls-fPuCgB($s( ztqU8iM*uCo8sc3oDK_TK|5%6w_`-H%u-DrH!NEt!UsO`@0%Cx&GIz8O}2Xc?FN zR22`lB5{Oe#tz5zC4Q3zVG%s!guH(?{gx6qMHmZw#nYAv6AHp&B8M#BW<0*>FcE^- zmLaHF$ccu^WCdXuhDpM*nH>nQ*wpxVUVaS7kH!fPD}=-8bZ{sNn|xAloW!xjXWm}^ zU`ia4w_p_U+8l+&9KIndp^z&d@uUp7?#vDgjY8zN7x(~6mTXJ7A0Ws%fd?2 zX9``Vs^j98xbL*lIEElRyY(pJ}wDM>g$u~##w(D9u`FyOP!aD70nBa4IZ+vI0y?j(RT^fpG?QNNcby7z?zM~ zB4`j6A;~W|3OE1Vck{v`aGIvcR1nUaa{e$$`QJE+;|ST?cU+HdiH7PHLYkv>|Cpmq zh9Ert+7!i;6hqNp1yef^Gzbf7uUGTk0GqKgrO0ovW#s+8%tdgN_24F(jTmIb?EdIj zodFssunGUp`4TR$l6v<3GaJVcECVc*;8@|1Wq@IY{rayIL&+C8HM#~(LjwzonG*J2 zT^tky$u!6EMjyqnK}lGJjiuIg&NrO$vV;-C*t(Bd0&d2WsbHA1_#h34hX34kx(HT7 zXG6o85K9B=pT?E7;kIPT?{U1RC3pD9?4Q9gg^hKlhJ8#vih?l_?4z6BZ4j@6>bYQW z){powdME1FudaN%pqKkK^VZNQD}hSs8p96P<$pjHMR8k{B|umn+{V8D1ThDJRlp1_ zZoA#S08qxd*UB}2<856Uy7LlPG5`9dp!qlxg5^Wq=I>gRZh-?3PrjN^2DRZv~Q z7A5ZP!Cfx|hu|Iv?iUU24i}f;PH=a3E^fiy-Q696dl=r-ysuaDb*lQKWmR>by}S2X zi`W0lq#_&^HS{x~NWh5{)+hew%vy#(vYv!bnE?#EpiY04kW8o!4{v}O#N)=I*=%~BCE0(ENsODSRa*d!J0 z>qD0075&vpUW=mC2Y>ZP9jYQLuyQz++#>nAeC#)Ofq4+52`-*-kAqSU!^wS7x;a9@ zkT@&g^w&$!tx{$zmo&f+5O1rBx01(HlYKRB!HKHFKig`cAx**}B6>PYo!>La3f+j4 zMZmyBt5*?nT4&`YGbRflwR>4!*3iJgkdD9ta*}xA4LPJkv2k{2rE=9|2;ct&3{fHc zaC~;W2qbU-t|Kx&1p_n1FK5-f-BAB1g%zD1qkPF)Q^*z(8QUjMIKlfa#Y-H~Pwii5 zmLqVR>xOyB<5&IjRWy&MgE3{$GHt7A7X0QhC=Sl2AVPCS@YjLKP7X3{3qOZ#%^Kut zG5>xgt)#PV7isG`8lvhO9}WM$1K$&Nm$1p1W>Kbm z-Lf0>ect>_ydkyWw_z9F*rkj@ zh({a>VDr<_kwgSYUhSEmQ^WVJ`ZtO_y-$-NMW*En!-1bfEs6R^X|NMudTz*Sdw0m+ z6x$?(RXJtz5_LdX>FFUHh=c`&B(+f%zxZLt;7YLQV?;sNQM15PCP~~>WE4K zNQ}0LkvZ0(#Sp~U5RTqurbK1d2yp`aJU+r#u(k@WcIgA0!o&IlBv9k?!@49!P$b!q z2jj`Vz{hOEoP1;V2jR#Eory{}0o;QYAv zEGf<_&Wk9)7DdF23=YH^@~0C#o){vpTqMU@WQq_`FW1XLy)6-A!5erJ&6NhU=wyz> zK^WI6W-FgG{Ps7S8ErV+8k z*eP}OfpNdJ9N~gp*3dh^?{NadEL@fa%aj${;LGvaJrQK0C)Uiz^e z6O#>-Fa-_)R7i0A zO5knLMS2&@Ea!wdZ3sG`j8AZ+rRO3Dcn5 z@bn~MbR3)4GJsu*E#*q`# z_NjH>9R6xP7&LPxR|+&J70jF*!X`^N#^Mp+NLqRhnLkRfjhoTNj!0Zq?e5bxf1U3x zW~o``1}M?Th$KXtaX-2im&lYBvr(6${`GpTn099zSMeZ%s!o4~0RH-{nZ}IE#*EeA zGt?Eb)J>i0VY`CcOegB|)xNP{>-e{uvyth~3L3Oe(g-%O)Y`hUn2gYAj`S}o^N zc89W|5TC}`6yeLhdx8TNkg4DP+6FopXq|^B+9;X9A0rdbeNx>9<57E%dz#|(lWUSS zsRAgPGY)RZs^*8_nG8Hra3-|ExunrF#uk{p%e|H`@KD-Y1ILGR>l&2HKoxDl!NJ9Y zHX7Tv=8(@5ye0Q6S|jvFiV}@wdg79CC+TfgjTIHLJY9_oNL5}D8z!mpJ?2>tt8AlW zXmnWT3Rnv2ejNlFjm7$N3q>o0q?2Znq(!?ZV}BFvS8XZEqr#$cAf!jG%Bx$RDPJ0w7B z!lHthnjfVu4>RfX0+@21rl)g+UrFAf839v%cVL?gvT8jW=#1<+*3nSFY57x&F}%r~ zN)1THfYE^H`<}ZmaJ^6)Ea!e5!20hmM+p<7x`W-0ZjHh5CM>fF(8E-#3>-lO_kOwd z6I*R|(ylbv>eb49SWOn>ju2eYT^c{Wn3tw4S{%9q>^DR;*oN|H~ zmP@l{nrqd%I~w*~_@b2-m8qxbK#zEuiIUN>MQ1Vs6X$ML<=i2m15JP7!HvP^e3trF{h>MTiiM47a3%&vS<%-;8w*=n^QkLOKE(~!#lX&{7XSS6 zuM6MwI@WgY+KQoxN^-CG1Z)@VY;3inU4K$bOPaki2BU~b=5DXsd`K>#c`dum_O_rf z#Eu`5j^3Iv9_P*SBz7}S0*^B2s_=pgiVUJ~)Jli*z)CoKyrnlXyQ4&OjyB5I?$~{+ zw_7DLyu24H{29+^j06*GBqmV zXjkMyYJ%eMbqp2()c_Z+hC`>2i~D)-BOuj&&6Z0WfNho#9*a}|bjvhQMWp^txo@3b zty|625NDT}@eLX96&!V#(Y<>}k#OSiT^Xk$e^38?Fu7Q^q%19z(;7Jh){w2eNgSOl zMByG#J@J!_fd2B5p#slK!Gl?&T@a)E>~gckeg{h^a$$E zX@$S*R`OGBEqe`&3~&1un1--J$GPsHtCQd}9u|uy!wtFb0kVZfs5ysU!q} zpGyS2dsA}Zs6^5Ct&p^8=Nh(lvmOq-fL+aqv7T!pKolABW?CBQDcCQW4qNf-+CR5k(;FWUor&MN4x;D0Xx*%_?k zNJjI-w3PGIh@mwg^_3XMVjyW$-}=};Nb)SY5J--2%iarT{G0L8w?8;HMRKqPwbRvl zP-OAF@VuJhLGtokudnhR`g-3#iexD!dRKQx>$Ek*5Z@)G^Eq`*WQ`U$K_@QAZG4(J zZm;tL3ylL_T<_hC|9IyZT1Fces?)poxE=MI+uES^tg1C0#a}{afX)o?bYcbGgw~+ zE-%e{>y`Shzn25hW}fg}@`Bl~18;{A<62-XEg9b6n;-C4KJHRuQs;QXl~D)@?(WGg zZ)tNm-)a|XL**itK6ZdmtRFc;bEY?)vZ(ihxs}E5)xqi`Z0adY!dZu=Neibjli6EU z%q|y8E}}eL71bndbV#gH-;b?Kiz;!F%Zv8p6cwke=KlFc!x7i7g6_Q~)9NZ`8#k4l zwW{eEYSb%U$y^`qDlHn;-=KgV1zKgpZqTnfaEwgb_CGxLOJDw!@SSOb2wNswMZdYf zgFCj+3bB-OvD92hQF6(q{O4%2F*;JC+@@-nepknD1*5L4iJq_&p^G)x?>+AF}!{Cd4zB zYXY^D$%O1fliDi0GI>#`4`QuI69U)Yv;YYxg6LmPWufO=C@ zQb|y#vg>pKhm{h(|a3@zE_ukq6X+|ALWegEL-Y?$WhNRFo+ ziZ!;uB+{H`q1vA#-oyvRUO z#SHhq-0lCic-LEBm7+o`69g9++2vRX1V=E`!3Cyli)D#YlB+|P>$YEKH^9{FSJNOh z;TF=8+fi^H>2x#rrNaNWhyVF*7t!Z5Ekc2@HTsmY+wZ2$3QJrBQ*KzwujQAGCz+PWBAqCqhJd2cNG4hZ?}c)G zIUNWmQy!F^Vg?0@#}p##=H3Qa^6w#i4n7tKIk1lp<9kk%!}USl2^^A~M8o z)BE+mx-!QEi-h3ykz0ot{-6;~q7Dm7VR%q(Sw0=89x#Gj(Lxi)(BenYl)ui3|Jfh7V%fwD8-rD|-6(-o65B(B^4qYp1f`eR@Z#&?;2E0z0{HRe(J z%Ay@VQsUg|$AKI=2Bms;Zjw2| z`ztw9gvs?AxLngGt8u-^l|D+KcJtzO+Xzkl937?0@&2cWd96)&Z6xBKPosx2y0zhKxb;ydf&tW;2C$dCrYdJrxX3<<7;+OreJ zW$8|BPa22Y=c3kVk|o>xL2QA~##F|>Z#jc1LaWQbrR66JS>J=~sR6Xjn~n8-m31Xo zK~(&&$ymA((G|NhCXrW(nPFoEx)-_ z-0@H=Bk^x$22W3|Free!e=<#}m|K7OG_Z%v7)o5@}EP;gA}M$W92;icA4;4MA>PiczSAqYVr<%5N%~vPF+s* zv7Y_~uHRY$k%i24k=T`nENw@DeB2B3KU}IQobOkd&5);NdrditnV~5@v0&_!Y;h?>gm%N{~}nhj8>AO1aP^ zhy+h2TllLQ;5wec@tb4R))w@kf}YR2w0$AZ)4#ag7eU-I_;!THCg;pSrtqS6UJmq4 zEUshh9s3n;-oiPeeC997m2jgrdC9OE0d=V$6SKMP9@%b9;|?+>#KG-Db@*H7oexIB zC}A;(5_mp7_Wn|x0_W=|(V8il-Cp6aZ7x@7oJBoB*^nnaRxHBZDt5U7T3ZYid5A=| z4fUndtoObVib}z=FUROBD|dkTSb|3 z=ND>l<~{l-i&$dS46ZC-JaUIM)$pKQ!<6>4Ui))iP)s;c%6}QG;a;dvJtNaR;eg~q zcX&wAfv8{E_H$U@$ch+zl>$BErp_8f{}@z7H7UO4Cm0a+spE=Ki3zWIZ^X0i>&Zr1 zP;w^9D>Sb{(GI=9Mf4psvN5^HU10q(qA8%@{aGcd{WMpwOAUSEs@^@dOI@I*mQ`9q zhAb~o*Y+Y!{bcf2;@T##JD}#No14B}m2iw@%!e?4MsVK3o$`%hDI!3WwJ*D_^zH=t zQ5-%$#A7iu3?ye>oBAHFWkJk&_R@#l5mkl3gcU(Ou2h$9^86+oKqg_1Kzd$mYbCG} zky(wRjpw=sLzRAZNynOrjupjeZ0M%XXa6adY_s#^vi9=Q78q^4xBe|9MLAjCy|s>D zWLs>Y%`aL8ng`pe8zq%s#DGMIeS|WxytjOKSdQ1*7i4RD-#J_o8fZ-RdAr%yq!*UN z+Yt}c%$#_>4ce|?@3@q9HxjdujFV=K&qYxliL6B8MEjSiIaxbOZIZjmM>HhT+lv%~kjF0>d^bQ9-8Hh&Yl*}h z;YJ23?E4Eflk6>*WvbT#?6s@8T;Chpj3tvu|XcPu+T^d zB@`Hx#F%zztHo*L7_-uNc9>`I5!a5QDXL*cnb+5ori}{>F@M&j(eZpAM~w$cnr}{k z239qdl-vl3vEk@MwyBo$-~qSHnba0Nbw;A>COhLhOa}Ll4sAwrM9+6FkcE67S^Pog z_wLf}-U*~fyLTO0f_O2CTNx%G6X*a`x3kR{mKs#0pmY~kkojN_{wp4;MIQ-`>Dw-1 zhgUnbTcacfo=rAwirg7J5eC(5hb3zUW&$hb?13UGOhYIXZJvQ>EI0~n+2R{p)I$VT zaylk-Nr+fd`QPL;rfy`fw+AGy5dS&}te7h(5I%BN^yP! zSXy_pcU|Ygt@RF>N7B@icAfC_j~f0}b$HG>y}A-5qLX%doF5Cz!y1dZH!KE7nnI4f zJgm)G98B(Wf&((aH#N-r;)J8=CIk_nhsf7@ti@Yofynd8%)p@?#MU}lX~37>74>-K zJ}WJ;j#7Y7$L~8BD74U}Gvz&Yh!?&>q>363Gs}~z0%U(sHGZB(!_MDr_VqK&=+^q- z4Sqw$1u>QAgWaG5)+&Cs4B3ACv%KdSS!E!QzUHPRtY@FvQ3;O@u!7dBvh-@jHp%AH z`j!mQo4O3nPOD+u2Lz&lw4%0hR@!09hbg1E#=uT^Q3)vSJ8B1IswIjX`tBE;r4*dM zsKqsw!`ACr#Ria=-Y(Ef7%@@ufQ#e}je`NF@4oDQW*H zzzrbnMdT0(7VW$_BglFCm~t}gZc(5Tyj!CH*83uM}jyitK1z)etKXi%ufm&bY}`f%cTn|Htu^?s=TOM^(1mQ1S&YL5GrFwqh;-~ z^jAO5*GhtrK3#^;hAL=!F74dLF=XT~W5f=tC-xE9wyP0bG~ow4bQqt(#W|lfD%F?$ z;M37lt7#N`3$D`P<0_4E$|b-o*(*xW02tzq4zJM8FKHl~3|W~~XROHf*ht8YWtw9> zUA^!0i@sdlpP(x0jAFRgi&Cg$j>7Z}oVYI_0Q-41u%+S1V>(L7G*v!sj>+-llJo-k zmnF=IgICEth)62((%RiQ-&T(a2heFGN{oTco~#;l#_xSzA0(Hw0)S)23WOhOjrh!| z)597onO`fdYV?BnW>{FgumX57q&RF1z9eC3;t?_5mC#k!fxKA8U;3HD4fu){=@O2*?^ZUSq|2) zGiv}#N4t54BScvP!*RtS2E{ahuG;kn_{9|XScf`~e;)0Uh`+(vM6lXmM85mi%NYtw z&MC6|d>s37(_8tKUK?ucaSa*3gx_P$+$J_aFI|kri1{b#aDSxDsxVDe8u>3;PDOV4 zmpm8AAIg9Q*UCYukj6?XSEI7;We3BNNuXHOVQ*MEMLhEN9wMg7$;rvl(KHyYqFYT1 zr{?RqhCy_*uGq~pOo9_0jtR&Xv=!Ou1J<+$bLVtXq4ZvD9uIbn*XZzpqTps>)+)LI zh%AI#(pa=rdqm;bdAZYLSp52WaU_Ih?q)rM+aPLaqB5i!V9cm3miIvY6Kl$2TWTD* z|7fU3vvlOI(RN=r1q5u=H>Shl=6$vG#)rkK!$aBXoK|A$Tct7x>4KyH)BRw^XY9No zY>LzK)ps3m%%?lE)>cckM~2}6b%b)u;roz+;v_CJz$*h zOr^_VM#W>Se^ay(cWul-yfFcz0T=#d;K}c#A(!we1+tv{Qjcl8+}K)}#ngd(;a9VZ zd1)ID37*$B9?ikkM@>NCh?>;Pgj~CJvx8tpL(!&<0*5=m((ZV);h8In25xOF?dUxr z#$Taua=TNVQ@GDcsuU@@K4~m6d7N^>?_b*7y!J6TGs(?TSTjdE0f>vHCpxFfx5~rfE0w%hUBpyQAck zbB)3!eP#O1^-WOY-@~8*G3L*Z0NQ-|O-M+n^R=~JQ^`zLnF~w` zy=Yvj@hOyC^Q-gUYmFMuZ#j8bS!T5(DE(3}<|fuiVY*oY>rj!r{+Zoxca%KFsBak3%Sk2D za3D%H0<|#L_Ge6)us|=_#X?jzw+Zp3Zj*rs!^mzhW8cD~FtBzas?1VB0GsJ1Db!qq zJyb=hXx)pw6mP^W)UJq1Jf{)|KO<{7SZmKkjJjf-OJK78-#>adPfs|w*$V_t_biVB-44j0tAw3Pt0ibqLtJezp0RF!PoIlVzM`aO#sG^6n4(`)6{F*GSpFCm7Q@1n(v6CFB{U?h-` z>z{>yKEO^blw)}WZDXItw&H?jp_3C=#pvHSTI=6gIsgkkMGyhGzftfP@;98GO>^3? z^YWf$H(Psm`&q^bTa!pvLST1*zDvL;;{z$6ppTCtX8(bYy}VSHPM(I+Z;z{j-w_p} zC@CsTbK4b~6(;=#ic@p^h>L2lij^#duEx<1C6NqoB|h-DBFEFaueBFLcPtpi86B40$~RZ(+0OM13#TupqCtuf zQ9$)<`OjA@>OI^lL6`htt6iTYQd^NsutP}w*i_^d6uqsEz^aFIyQ4^dM_c=HhpU-p z1VJnoFIP9J0!sO-rk{W!e{=tny`Za@n@w>TOHPaCq}|D{o}f9hNaLfH4f_uX_?+_% zXuSXx`yRqCT?>MLP%9FRFCLkHqg+=K2Vo}vQ085Jd@~WS$~7ZGCM5HEXX6~2Pz@Ow zIT<<1)*KD%%nF9Bq`<%fQ`Q2bpp5l;>VZSYpm_ptz;r~DY1~x@$BhX+LgiTYzuogj zCY*wsHrQ(D#u<-aEf;Noo(!gCG*fJ=r440u) zzP+r_#de8#&SYb*B&0zx)~ehJ@hoL&^KOvAcf!1uJ%G_bcT^u3g>>u*tl|4lU<2iAW9tn`)>O$#1edlilh4v3 zfO)L$#f1vdKPiyj)AJ>pQH`GEjEESRnw^oM7Xl44-usrYLi2awx?t);W4qLl1eXrb zgMRBD0<*eCc=BJ79^js-XIQ~9rKwa;Q9hXjNofAxAfX8Nh8Q|zn*Xgh`C)`X~d z3aP1if0~$j#LU|^PfQ~u>dcNkp#5i)vWD^dL5Z<1;hT!_9vXQ|Zf0ZJ4_WBgrqvCu z>=-!(js`?<=yn7O@vIexl`pTe`W2eZrKAnrr$HD(a=%?RH%}Tj^_Lpy3rP4nWNDcR zR+L3HNC!Cq(&g}AOc@2-uKchV5qpZd9o-v6b zL~f|tp6sVyM}7rw=7Lv$She8I$$1d)NXz5wOUM8h7utvs*Vo?N8(l|#9-z8(jyvf{ zFBV-l@Vc5hQqlyx{Bw2EowcX-!A1rlo}yfyd+u)iV9uC4)nt=6@F}yi0LD963u|{R zSHhOT(C{HnLToTS%(VO9vZ87Ub4_Hv zEcO8^E~j}O{evMitaG2Y=qLE&5sPp*rH7BnGQo!!sM9*aw;u~5lOARg4>4WgOWGpD4XZwbV>k*zccFN`@sZ7+} zqbkgSOZGQ6yJvrKw;nv&W2DVXuZL-#EpI`P>FKSpNp8*7g;VQscYXKkQD7LWo%{^H z^Mf&JIy8*%%g#wHXq+T{J??n!%fUIdI)W;_G^0Gk^beajc7E&%C!?~@GMlgspCnDclvejhFDN&4GbL*X#Dv3_f?zq zINcCr)4_c99`OimCCl9YNxfUv`}B&G36I8$$3XDUG{5rMj=AC;>iRTNoXOrvgY6q+ z>0~{KR@dQur!OXSLbg^vwf4(b&03qvE9l#Kbxc8DgNhpN6sUeEmbudWRDoYBx;GPnGV5o92OOv^p7R?-j5 zLoV?`Owa4lSGvIMbCtjP3~Sq?0J8QCI!JYO7{H9>4GbT@E-kV7pDhk(KNfGGKgFir zpT?jyi;K6bP(O98>U;CeMK3?RC7`e_dlM}@X-kH(vBNMr^~r}1cLrV;AH&;eOk$*` zk3yU@MiFG^l3(#?UrY!G&(Ss=E}X78Rk%p&4Su-J6|(rsont5QBe-RG10BECf0_BKWsW7CF8K5cb>DLuZ9?_H{k zFR+>+Ga@%Nmej_S9Z;S+Ca~pV6cA^{t$|4#{3c%!m<&>#V7$11)KiChyEedE6vmaf zu+B1%X_@N&sj7N3DWCO? zV*v#~B^_OCsku_3NaY3oC4~sgCYJg5$&_gsm%wXpxMNZex^CoGdDhbsI}C&I5&O31 z6e?Ec9+Dw;y=EWO?n%-F(H^)#r}(4Y>j!_^+{6{zrmWau-YACnRjJ{5gL5U^_h-aN z9c(CS!OY7nwzSFL{9n81yCsGnbRhgHfJEN~NSGH@i+jdUyGQN15_ z6=oL^^dHb+l7>(W7@WC6l3G&nv)KK?D3131WN(+UN84^1>3AZ}%!s%O3Q~PTGt64) zxq3BMvbEzJ}kh^!!y+8umFQmjU#^2z- zYLQT>d}scn8; z84LnH>JmkIb6rg)Ws|6e?4tvws6dd5?J~1Kyp=DQc*SvcaMr=saJHRQU|ZL&1$)CX za6dhc@~I3eK~U3$)a~O zgZ#6FN>(%FBF56O1dh5MR`xYRgD7rfK1u#UzO6W^!a9@>1kPBT-gOvYYF}+OIS@u@ z$d70VeVAJy5S22n?WP(2#bf7kTy#eh#>Ap-Kn~}~M(yoAHU_CNy?5Wjn=B(N0zF1w zBws8GZRQ6UiNM9z#0|(LY3`XkFi~@K5XxZHy?M^XI4YI(Z69JkP z8~PL_l5Jue`rD?~caZ$eD*n#R=X2nofbqPqOEh+@5+1uAm#cU>OroplrIdB+ONC(F zAwYU^0*lhDGtAvZNYTYOx)?jY1~&GrHhgvrIvUTSsg2ly!ppM$Hm{UZG+<)?{pPZ( zeFt++SGEr**u#}-8$FP1vn;{U5j@BI*!Z^2Di=_*jkifC)ySplAipLPf)$$xF?N%K zq^DNE&9^?MSuDOQ_M>{i?815@>mt$QZ*Q2VhwTNEm%18+)JFQfd5T7b`cIwfipJTb z3eBq}TFSbCipPpZK`r2i4XJ(nkG*ShrZlB)ZzO=JoHP+rQL$=Dh&Z06>9b=LJ>pCr zu=1R@j;n%_6a`KYWsIzVr_QE?MN7N@&GLfJ8Vabzlq}stFlKj6dvKIL5g1h~R~*(* zOZo2~?DRtGjKM%qCjE@2=9-~oDP<77ee01OAYO$*9cz^JEsvfqqYEie>h~LXO^n$@R4`a`Z}uK$zrO-QJ)B${n%p-Ig<{x2E2RVjO4XZowPw1V)FGbLJT96rI#u`JG$b zCkOa}=lW*L(w+Oy7@4Z5`{S)~YNz85NO*x$uD;G|A8i zSO@>Lx;C#|rw<%xRrL+fPj#3Wz;gkKV9{Fr4H--vlP>A+AswiN?8O$uxn%n9ji%iBW-xP7Yi8S&SiKaG1n*xT5|~>B0tnOmKDuEhlNrdSBmiUPq~f zGMK)NO2ZOex?-#kY(zpb-R(9w>W4v0CreGkLKCuwLxMC@@czkX9Ze6DF4;Omo|yUy zn06WeI)otRg6xudp+&=>0YR&dXVAd|^Icl->S2c8oZ>vDrd*ryTALub&*uE>EHtVc z^sKmY=Tk5ftVFIq-tB<-$G_&`2M|MfmYMbRfZt(C*WZvJ=A0DKPo+1J0}FmjNf zawiaeXaLh$Ivb>QGV^aguG4k#-@ECrqi(J0mn;*|982-HVoTBWf=-s$<%eBytH2@&c z8hzLP@)~W^v)dIjc5XTS8h%JTN*%wNp*k|JCpXXD>g{gk@$8t5&TS3|ZaYiM)~6Mm zaw$9M-Px%P!Q%{Vf|FPAfd&eSoO&FF@L|zsW_F?geE)-sUT!6d`F)5PoK1*m&XrT2 zEx&&)rvi#Ddq0E+(#lJ64-RX*mJ%y#t}-LY%i8*TZ++b&JLK2AQdOqVbgNI><7l}; zb&yjF2!r}}Wk>pm#Xj$+2x`&R6>G+XR7cOr-M3d;GhifaK83a}4ofdaC*b#h1?TDO zI(yA{57_2KgdQi%c1kRsKNvj5BAt&QmhV7tzg;HuI2?wopuf^xmV7MMO-zrlL|(RD zS0Wnw9=NX?y8Vd-Yv)uMuIU4(D}KzG)mt>|?YHA!j7Z`KaM+cJPObFZiDFe|=kQmi zjNyi!cF!(Ez0N)(dE`9vGB{fHyu!@_iy=1!A~@RjsIeC1_%!mTX=zPqnPeBYtv#%l7I{&WPR&5Fg6tbK^a#D(30*@V5ms-KpUTvz&Hh&utJ&aq7 z)%HDM$N?>F*N*z_<(04OG7h$>Jyrpd>%5(F#Zr~V@p{a83h=9h^IT`+<2T>7c1ZNG z-~+q)%Uhq9YY)vLf_~Kk*@oT3urT*SZZt`S^ska;n3#}vJ=&g(sxtGXwY>hE)FVN@ z-r7Bc4A6WG_BsTpw2Em+0g)$wG6wkwIM~@8?zIXq`r8Y&?|+h&5@Byd@8zVFGBD`!J!`od z-}5$Dr{Vh9?uv>gP(@6&0yc8TT~XHS`<6(lugnDUe(gD3l>-CbEL;2`e^A~@UzjVh zM~pC8+XqH)my4dT5}-^LU_nx_DF~>MX2TBY>S7!YJGEc@WcU~qd#ZC7y+HKi!wl~? zKTA%$dXDV&fyjs^eWPChP%#s)4Dhk&DDIKrn7TNEB>Ag+3TxzE`yS?KDY-G(YFBp_YGj9~C1kc~(6 zKw_ke@N;emL+%A7Jyz+N|D`#Er$QHurt~nq@W|bFqM!~D?K8-LI8;K1vnKOA-nD75 zkYSN4ZImDV1=+D(e&F{Z%lGztTNN3S4#dx z;Oc2uhDap&{ZF-ovFM*VHeID@9D%O7A9aE3!3}Vqpw2JdWNH|)n5k}29VeWBY{ z?-a0nfr*M`1F@#{MnW?0LE`%FaVGIE5o!d^kID{oH4zQeLLP=nBld5>z3OOk%FsEJ zaR*I+n3ojSiQaX)$JnQp;G)u%gOVLl37Mo)IN`tQ$>*UUUEjc5-na;ajiT2@8Lb$Y zn`D#{70ed3(z=(`7D%C~tnW9a#&>VyE5_?Pt}u`z`2v^tAq!1634II8#}`Zg7)eRW z0Q#{C!&;C~Y+IibaWg@od*?)`sEiQ79A>tt8zBEyCqU)e?q$>rz!^vqCrzmU=q{R< zydzPFi|$~89!Eh^piZmu4k35nM_-`dw*f=wx@g?AGwO5nu+7=-67`esb})DCfFhLyyQy7 zhPgLh=Ece_SU!_Q&Vrws)F^z4i@oo` z_xG(p+83zU3iW%#*Got`J)DvEOoj9HA?wwu$tm{3UW9#}*9QNV)$S+`bwTPv!Ed}C zQXR9a&uCF2MCv{q(c0yNH!cAJ(?oSqNDJ-qZ2cd7;*(CwX3K#H5PpTsu*A@VsLKDJ zgFun+q~u)OIE+4I1X2DlY$%e^mCJaWq!EbjBgMvVSQBFif z+WhFHq&4i}+v%vg7?Ov+YtMHa2ico8KoH(XSVDSt$|)iLPi5wR8-7j1yw`JM4nh+9 z*|qew@RE`MU@BYXGsqe7;%O6sZ2j_qlB-VQ@N-Mk>4%C5{85N3m|q!NTDXdeSbls{ zi(uHy6+b_WrE%Ju=!6JehemXH@;y9y73jL&`Tv)N{=dP=<&~)eCyZ)a7_dvzDIvD~ zQmzmg$}O$L0#s1ml5n@wBni^v7O29t`AC)TpCr{GQd3K5zYwJJnyWb{CLrOx8E6HS zRKjWUx5ImEsr9?#<86KGYg!OK(}|4Hls|^*4k938kmn8yJ4sK&RKYv^UQ8*bdiVN% zWj(e-HuEl8e}B>U&p(IAuXUz+Ua&-ag}>cSE9Uhr4I3ANR_w%fopT@hTN{g;Hwz8+ zvDCxyRLS=ctcN$xn}?mF{VP$Hx6pH+zKd_JbU<8VdPnnP54#ijvd#6X#qzI$W8nj^ zzrw@#5J7GJtSZ5!u^4_T!;Cve;S)l3K3b!?BOyexf+KVZpN}Yj&45_V!vE%xl$&r*4xQ zv*;ho-@29xds$s)QbSN8IQKiJn8G$DzcU~D5oR%{Y0W6Cj+gAmb<1Xg* z+3OExMWEEGMK)WR$Yfc?GgU`PNbHkt%~wMyp||H}j~+hi zD#1wB+Yd}1jO6Y=ROe3F^+`23IIC5uV%(!i2H${oOG|NR;&&LmXJj3<^WJVYmXGzp zMNKLAN)NormsWan_eFn;IvwS&{?JpB>3TmVX34^OU$UOb`uHB%RK-)v%#tZX5A7+d z@vo@R!6fEDXiT=ct76~GTE);2(83S|LJr`ay^#8_Z}%Lf{x_8 z4n6FoQV~4U+HBo?*nK?ft-F0@8jZau+DjBEjKbm1!y)*G>KGno_3+yx?-$f% z;;B!5TXZQ`saQ_;Dw=my-{SvDGL0ZU4d-37)Su&E(^XWIhsHBwv9qL#@?o;l;8Z!rS%CdCjk5^ zHjGJaUY3UB2mR0_mItnzC33mvPEb-^-Mu3XO{yyax;nB^6e{bcBhbjaa99mo3;e2o{MkS$ z_menoB(`~87?Oh9z#LV2=a~8@BuD@U(Jmpr;nUccO{2P zrnH`tGDF|KV~m)w3Tm17yR~?dv)|Ye8&q!p^ zzCueaP`MVv860ZgDwI^vJ8k_~Vkb~Z&a{*vI>|d%+q_7pRV$eLmvp^4fvO7#Imdjw;Rt*)7`hfB5>w;7Y#e+Z)@qF%x@YOmw4(ZR^IiGqIgaY}>Z& ziESqnzx>|6-uv|G^@r~2s;<+$_pa_fd+&ADsv!lVrK50ZDcZ-2t<}BrG=JI5N5t*( zG$tpmw3s%d9{QHS(cOr2xGrX9z}??}AZeQmvRaPVOcJ?Z-EU2g2OHp{CBGkNuC@TVJEvLHY8WX?FMQ>5S zjt%tJjqp&uWZi?j2 zWH@<-taB8u`y}-rKE{nx=xs6hNUmOo8aq823}zb|ylsvGBkB-y^Z=S=05rIY&>wHQN4lpipw|Ey9HoZq@Cx|!|uh#De8N7RZGkjNy z=j~IQueE-${JS0w{f{QRM<$caDZhb%rKyJb&BY;cbN$x%&>L4R9N<94JnJ)OdKZK8 z{9v`e>(f~1Dsbe-j?^3VyiCg`sb?T?5W*~a3;{CNOS_aSns=g3$Ysqv+;}K_QU?)d zOF|W0L!A;pnK6la9*R1Nt;Et z96j@|t9-{ZpV><^`ublIVL?!j=$w2MX6g(4B!U1xh9M_PUGOu{O}u0K6;ESStc4!O zv36S!s(0Bsybc&TI%HhTfNNDnqDWZ=x=ZEKACITopFIco`i>F5ASj|>0#=Jo%f=Rc zB1rRzJ0X?Om=kx@((l9oV{vz>c%u2uOEG!i;a!xG0)HF61*t>0+*i2U%TvSx1SjaaD`z(RPG4foNF$?$Dp95aE#MT%j zTx^)0h&%TZm|-)mSU}TeuhgLBuPCf{_l7CvTSQ{&bJU0UDuCEm!)R*V@ksQ5Z{m&BRp*aNg*(kR-NWxpz9aGQ&#X!SWora|D<%LV`3eI7=aC z`R%o`&wC%OV;&2p9}Bgb81XWtO;zy)!@^M94&KDwoh+uM2J)K_$WMi*lE&YD!<=?pSPfG)^xr^^UQ+2dCy@VwaR-v_?Yd)>tJ0cNo}D3 z4Hy$oTDvuIm7p4i3*$|)^;`Z`&9=NQt!RvRSd{(bsdfY>^|o0J-X7%LMG;r~C-}eHMvaGDHEy0NS8&0zGrPI6G@1M?4(<_0k77Ww z7Y|L}WEt2}#wL)sS;wiOHOtS%y;CCzRi8twk_kY)n9p4;)`Vjxh)wAmj@bMUTP$-c zdfDb`VwQd@PfH!y(8sG6K!LX#gXGOgygA8fDt)Yw_$I`n93_}PJ*O02CRahg4|1G@ zhMl3vw{^DBQmH1jt(d|(BCV-cB=l~`T~Q&|E3O4uIxz;2%Fu#CH4s=-+tPOy8oRIX z;Z%YzjwEWVE-yk=rAQ59zHoY&&*Y|Ch$~3%o%9W)3w6 zr$a||u}3+2Zm-JcC=d58ig&8qgmu!|cArQBOWhM$)KkT^ji$~Ntf7Gt+gsC7PR4jK z`cTHyljakgQmI<=)Cx%1r@ozcM;t+Mn~n<^7HD_TP{8&}lVi=`jTpP&R&d;O!%5St zuDV%njo_C5YLqU-e>b!Ad&Pvgg7#=R?s(NmNUNYWi#t zrghEdWaT|yNdD_bIZKtdy-s|X)H^S7L8EN6!mx6F%g}63&(J_$@YY+E#w=Y;iB#;% z221UjtHC9+H}&ukS-s9>H7Zx3Nu#Y1!35qhjJUxm4i59xyKq7}WaD~X+OaJe&KOv! z&HPd`*W+>u*wivVH4jcej_(2_4xzXowQ( z2_Hk)Qu+J@6B&k`OOZhrOEY?YKPu9_G%*h7gI61=`=+Oyo*>9HqZ>*tsEzuxqP4~Y zKUQ3mVN%P5k1k|+G~$HyZp`~KWJNuzXCVf23TU0Nt2stgw(a^da&`v%NN5d#8cWNq zec`?OvEdM54z^4Cot$7M5>niSoVlM(mGv}iJW`@;Xz0~8EBSjm_NE<=R5m)bgvAjM zZu{JR`6EYZkEj}2LL2hxN>+pFKQa#N0)mJS+Tb(u$slga)rjqS!{ACAj$OtMec>eg z>v=f(Wz$)EY#jscBY6jlhX0H6iYEu=8-`?Zby;JOEYEw5^iz7anB=StO$Ciz;G?bI zOEIVRA+1YW_OET>UiY-{;IV}7f!;9;wDN6B`#9?7$!DCeV)-_XwhEZst7@3Javht0 zSOpdNSQlhv7@#c*&8kY?*zGS48~-@C+^^=l0IMLJsz*ZlhU#Z)O3xWm+Ve^cw?gQb z@w`qjTRzz!sltu(DgAA8VKsgyh!SPDFci|&#*q)2aR&%Bp$2^$fU9fTxqr0_a#kl4 z%GU@X&8d!+|KjJ^M-G^eDXXb^@N>jrCS@v`IL!RX zk>H$ShIjr;h`BfGrp$zTa>Yc;lII7%T>tctFY@sa3nCjdO?dqRJXZZQeiOj65Ni9OA_ z#Gx1DU@S;%o|t$tLh!@22-DnJ?APc=AuL#HGC~NwU+k7rK8;d)*xDalncr{-JOjJ! z;f01NVKgUPYn0O)n`aJzi!w#?(cJ)bXPP)he_cMo%tv*Q*6l-)65t-Z$8Vk*ma#Hg zHjG7OGz+39X5$2f#tpm>!-vH=zm#koxuAobkRNcZj2^YSq9CK1sI9AXRDi>d?V`T( zFOWIrdSEAxbiB_FBs3mmyh>_tbBqn&F9VB##H@dzc?P&uo`z9-m%u9YH$=B~sYOYuPPBP5@mD?O9k1-QgwOFUfz% zqdZnaj8u3&?%yee1~aCnCAdd)7=daONC)hggm`eLd3`-Mw!O(0){sq5^?PT;W|8ZO zJ0Wxt(h3H3Bge83tBO%lbnW`~C|~0<;crTvbWOiNvOs2|q{qvNtE0m}%*g=+Jh>mQ z)A3BgCtm2N=M0Rqm9?M$?8II1{SayEt2i!BIF%y0z5)}H!2FSll6WfHO;z}c>1RRa zI&Fb8G=Q180i`7Hz)?YH%?K4In&!x*F>mzEEKtsx2=gFi82V1%$4VGp9-7KG(^m+% zl-~0Lr~s8;o6y#Yg_3&*Y%#Hf>c_E!II>Ut{e-&}U$X9HAV6AC(NxI@S+mB2R}7BX z&b72;8o7s8ppTfVohu{{Z6yl`9a`fJ8C%oa+-gV!5CX9zWz0(p<^9<79et0bM(a9S zI@EZ?N8DcF!5qx^cRqEw7&~eH`G0i}@U~>=lWh5+w&Mrt++*lCDjS(9>DrV4O$i@_ zEiiqfg%&jJGY;@QIh2rzXUIGD^jUr25zXvnR?PI*J_J+732gJVdslNvFYNUE(Q4o4 z5-aviWYGQM)euAci@^-qib`*Kbi&Wpl1;v$YUb#>s?k!?x%$^r_sILhh!(^qV0~)^ zGZx!4H~XWgK3UqHY&0W9)v~PNeLG%t)}iZJpV{iv={;Re;`$l*%%C}|8woj81>$%2Mr~a%p9wWIcb_apA8PU z06+p1n@tDQWh}nzr6VqY6r@|twDJ6`ITVCp>@1cH&~p=_DH*Ong)Ok@ta1rX+NXx~ zIsmhlkvR$&w?bM&OSiAMy@%~Lpi50T@Y0Rz*{K$U^ed=_gCthA15e0tM}!uOqY`?% z{+Wg1Y4tnzkLtC#*Uyl6C1aCzA>xl0zg66-RkV2jvH9@qte5Tg^0cNY>0#+!6yM4m zpzzalcND@8=i<8732+13iQ9o&W1Wdg!M9pLfcBd2W^90PaGmG4H8Yp9iTTLw^FKz8qEHT;1fEsIj@^~9d4M!H#nBJKB z=R5CbetYpm$x_wwL}fVbIl^?>B!6G zkg|uO^bV7@v`h+9jI2%@N=RPTe#9P~8PZR_97ECA!uwmn5LoJNiJY9ZU7#GTP*UNk z-H~cpABU{$UEPV}A1ASS(Faefq_fvBNy>s)?eFnx)dGBj?k4ry4sQ>iF`_`Mf%K}g zFiBeBL}f}t-EQ5=+wZGxK6XlOF7B7xcE(O``g9U9cSyH?zS0EFcbQ*)D_G3wsYzjp zZdV~!ZEZE@eBSzeW~Zwn+qYB5F;iwKdZr!#yCwvEV~i$UdI8Tg%4$j$lBuHXW{Z^( z?XGX%Sb-JoFny?)|bib z7wsrhg@$HM=n+sulx5qpCz?_L=eeNey^i4sKNIIa1|thpb5Bh@r&YHMd^=pm+!Zdec^Tdj7zYIWfr zp@xeG=+-VtdbuGO&#ko2t+|Xm;DB-ewPvSn^pm1(i?=#19s`E)4ynhi-yA_NL;ef3 zdZuYhOt*x*yME;PvKb>1`bZu@QhThI`C|Lpnv&<_Il(vc&qAYU?eX9uwf-T(q!{Vc z%4oJHd@Io~BdjgvecqHkQjQ4g!B?3o>cQ0IHk$zj$p&GX`p>|~PH*qOBw4W}IE8pr zh{sFRd5Y~C5H57TJ5;=!N9oQ|W-)RHjsk~DG#wXCJWJe!!1O(AWGe`pKYj`=5B+&J zFxa>%b`n470OzA?CnL%*vt(y5;w7oNeluqGBzx<;p2^8BFd`zTU}!Tq@wW!(YD52f zu(mSF@IzpJ9I_Cj7_Sg5zDR}DNH3wSQ19=3&?^n@sx2JCG_+FY_}-f%M0`L!pO)2& zs7mCia-$}cA67w-TZR9ZURU^5UQEmDddyBVia znZR$vp)T&(`YDd=Xgk&!+raMh+K%#lqll2Y4)G%luZ=J>=vN09;1J}OSXBy7b`7nh zxLl7>jB?)TmXxZg&SIqbH?{rWMmawOXM~)ORtOaaGxi%&h4>sT!{=Mk-PJOxqLX3b zn;^Bz?W*==#A30Y)5elSu8qEiE$O!Hm5#=!KOw$niW&y@1TjA=i?X0IppnayboTH0 zE4^R_GgywxkEI@9{20+J@T&sjyqh9(69nCIr0lK=nFIa_nfO5Mr%_#29kWQl1NC=o z_=&Of1G9<)47h3wP~pRd4ZS4vHHk#OK)3~Iuao<@NO z*RQCD?QePhyR#F8Bg^06g7$$TG|-f3~QBTb9{pgxBG!Kr7nBACHqnXG|<%4pd6>|LZ| z333TQA7F_|Dn+pUHn6Wj`gdX$dOvA_+0-g3^<4r@hH+fhdQriYJ8f;eS=pZ+}&wjl9)gNkni7&AfIwncy3^Qd%+s-mKkXWx1Y zC2I04zzf5b9_a5%>~U<;QVW`<(3>4Gj$8~V;bH_*jR`;%5g&M)=uDrV^F2zEct?Kb zGylAwKWcF|91Hpfa(Bgpt_#Rc-k-pvmR`_BU3o@yFRu;Rzt8#U?+m$a5R5B4l)4inf)Zc9XW6zwDP+K`1x95mCyp=0y&k7i!`tibl;YtQx90)XjSRh z%M6!D7in5wU?Ns1kfPgalNrUDciaV8&422sI|G)OpQjp|RWH5MK+nUo?5ZqEw0kd9 z!m6?++2BfS^yxsHD6fxa|LQ4fWEAOsD}zN!OY$rg1b2$6*MZ8weud`24l285j%}Sp zcBb=Z0s()V1AWUS&ouycpMeS%MK<*`%|nf9YHb@OX$6>i1C+nI?y`vr!e-*$+Tu=@ zy8Cp2-?)KFulqw@)nGLft%t=`yG)DrW~;D&7aDeE&j}B+p%zbWpXIp@$s1wcy~QjG z0MUsMV9?0P3$^BIl?4sJM~gY545PI-{K@v$2P3DiOgY!TXk*4*To7AUb}nK!hEtii z$g0OkdfkeV#?k4|flPm>!h5_Fb9NX<5L7_mT$+fFT^CP1yMPZp>|MId#DOvTrStxk zE*>{7iTk@vggf1KV>eg}cXyGeI~CF1U;$4%H>=MY;LyFLWMcE>NDm<(=kqO`N(hb) zfDHob3nRTYPK-^imY=oT=fkxyfK9-KR3+_aMA)&8rwvli{Hi9JyI7wCdRLD-8>m=r z86_7vUOAsj{tT217N;^Tgm%XT;I};0S#CSgnjb^r6CYaRljbRWOZr-i6%x*rK*J^9 zPljCkfJy|=0a`BrM)HP&qc^|?>?sT*@l%Xvq!lH};J%22v`~EB3;&B;)fLFjg4(fgyth^H$zd}A6GSQ%>-^XFCk9t9fSZ!F4Ds0~Y z^O^&+YfMj|J`0&0t8dw~3gyPZefW*Z@SVRY%`JW?36buJ<1D$%;vJm`zG=?&j!kLYt|lX||D13tZPd(LnCWScE(`Ks6tBUqI;d z>(^rjb)?w(4tFF0P<8FciE~6zghGWPGPy9L zD2wc0zeuF_v@6}w!^APV_Bd;8awJL7f!A5>ycv!pK`2G&%)S-9Yj*N1_QMw>&44n| z4EN-SLRass|K3r~tc$5zk>@8hpDzl0?d`0`yG{sm#@sDUzrnsgNHf&*0N#KEPjLNZ zVz8HME(~Jtsi*=`DdTm{TK*(3RPY>c&RSdjXCV<`e)a`D@16_jSE`D?j?=B7Q;kW- zHSIYk4&2@K85UD0UJoR&d)79C&r!2C{ec8)Q2WQGU9LjcTT(qA@#i?8U)MXj{!{ob z_vIV2b-eM3nJcwn@1=;P1DL%3-NGGc0YAQXUS>dE@|V|Qy{7?@>v^i)HPiDrDMl-z zCPN~4{c7@xk9}(K2xg1;?N?BjH=OWpQJZ~iC#hRo>St)rnlIG<_;b@2{{Bj@Z*{FJ z6~5dE<5dZ-sE@}G!!y@SSbe1{*KwT_>`MKn5?ZT&2c@a`^2gI?1jB}UgM11zJnf$GFXj}Y*MnZT(FlaS!49}# zTQJ0-{{!m!e;gUO`Mq1= z<(m_7oZtUZrBo*78PNzews9Bh&a|wbPOE=Zt~UdcPL(p>ZrxzhIg?SQM3l?g&6ZUX zXoTng90&pFmA?(+E(9QRBH%B94)nd@C`=?|X zTI4il$|6#lYdWUDm5Zja>4OZIi56svf6UvOFFOA_S6h#$X11KqNuKsjtua^!kQ^s&JDsC68sjfPM_6{5nm>Zn)Y5Y!B$OLse1h_f|1 zCTJ1Hx%SV3#jG6ewPa)tr20U30T0+Mf0-|L>M2B-V=T<9@0A*_<5dY9M86`HrUtuj zG=1n2e_j6(-TZ6$?4b~70fhePCl>CXBMXf>oA8kMbLpjnC}#Nm`^U+rAJi_Ame+yw&f(lT;nRmu>MMNTP z8ln(1qN4M^q5;ca>l1z14Xv{EQQqv%=e-2<4kVt95ak+k!tRh|cz_jmqP+$2? z`c+M-Z~elj!my`|y~nnjmzAQ2?&nIo>*9|9Quuy!^{zjk|3tCZ`g#u!l;bu{bGP)N zAE7c|bdu<;_miTSY8e;^?j`!~jr)5ry-Q2GHc;Tdv$8iW;+Ds1v#K0?e{&LBVLT6d zIEDIaEfJ-`e4TkYe7U~ohOfK0SIpg(#klJ7yQr*0q_VEfKOTuu!K9{?r9uvdw`o-U zX}a^#r&$lCW$14xUv|tE=hYR7>*(d#gk>t@T6>%vLS%%zSm<{(QEj;~hfxl3D7tNU zlLTYmhmJ?ey8a48djT$6+bSE*E#y!QkW-s^^SZx$(BE%{@=5|>L}dZJHc7ebzqbKD zvTD7byo_?E)tZxRDhe9~CSsjct2s%`s>Yl~tCmGtV(p6wT?x^I`6%genwUw&>aYp( zimQf8-XH4ur`ir7=fa10Qk14nUJf7DpGX8c(`~)m^G}v#2qr4Yx3Jnaje5F5X=Be6zR!~Oev?bxh ze=yJsZ4hA+;xx?(iylZt+F4k{KkS@xlaH^@vg#C~HzhdRVE-8oG0}(?WMH#*Y7<&U z;f#}4mdqkYXBWrC8+2OuQJaU+CKgt=YrxU4?A-Z!wfK3VsrXGbbK8L_QbXc{@N)Qu zYtoNHC$l~DT{16TJOKPVk9=sMbWr< zGC_7I(Xrk4?q3K`R8#?eNSqA?4ib3vsgvU`BR5Q;&sI}T3UYgRL4X1q8ctfC+8Uqn{j6e({MNcRDO1`v_pHe zROCWjUI6Q%#8x~une%uwIUFtKycA;Cn2#lTmV=Sng3sp*2|8L6hxj@y6?#EFIjwzC za(|>ll@7^h&BO7M({H5{0+JQutgc-*ew1ySO zJ;tI!fBJKHe+In|s`*nHBFEd)C+u*X=5_hP?~AyDs^5TlOIWQ?bGMS+c{4oY)@_e56Tax8qOEKQU!@ct2fF9o+i5-QbUqwnwc)qLzTtWC9W$ z^Ct|%o#-wD!cIg|L|Ml!@sk-}ULMbG?%SL1D!x}z#+8`&0^35c+KQ{IGoE}8KjxdS zVqAY+ZMl2#Q+2#CU3S}m6e8tDX66)CWwQXro-)5yATz5jY^cxYs2LMVKt%}bCyYql zshJ-4=R?>=<~@kNsWHy<&zv9vI=cA(wJ#o(<$jK8{<}TkC};ePGizR!fYX_fDMLkD zyNtddFL0Jo=eL^O$mN{f7y!ByjxgRml!sKgOuzN%x4xR|lF$Xg&s!?*rNXrhiY^e^ zb5&<=yq7!ll+%BNUJ7`7B#mo-5KP-j5TLD-|Ir$D0T(YivS|+4P6;)6dhT6$In-ryEWm2MO-sUug$$wktM2qwy4`*VZ)$fA3 zmr-_7aaHTQn4G-Y1Z?`aXUc+pwqsGHrQwb!m%|l;qV?1Eu6{1%(=d7d{o5|GgtFn= zc9c=><@~JI0Y5H}uO0+tWVI_=Tx^{nN%1>;Q1h$JGT$hkE>EsCTmz0^7IXMqt;NL8 zqb~LvuNPuMh8kRv5AqvhLd=fL(ZNRd7_{w1q}J{3(t)SzrWbym$JI&3+2-*03NHPVNVg4a*MW>LMp+x2MnGHrH1S-aa%8iX^X)uI!rx-owb#I>zND1Yv zy;O2Wqeeq*K5!$mC7BANr|K%>4e#5x6`rGK1IvfT@t38G;k(Ct_dA#Bs>>AL^UJ#w zCKK|b6FVD*pO8PXOorJ=S}GG5MA5((8Y&~5&Rl-D&efTv0h@CM7_Id-KP_IIUyt3< zzcVnXpDx6d|HfO2JN(Y{`NpubN0+YmQRs=HSBIHwUqDQX z?&QHpQCoD5ZXZ#b#&{y$hE*vavAwT!PoPztq^Q}B;8|y8^U3Tbm&H9~sYONsqwYM! z%A*obC80^7Cop%{@^03-`<#f7;%ITQ$naq`?e&^etcG@W%e2u!h`qjhiLFG1r!`d{ z1`a)lHy59aM{{zzgn?#2p(L<4>W#M0ihcN=L9;xiTp!JQ+x?xzeQ=YGn(S6{G`)vE0yanqEbvc z*I2Xy9#uX$?TM=FyN(-ylS{eR?@;J!u53tX(gP`9W}?LKbO+YOT6Wh%UWP$ z!Gthn1JrCeQF0z`K`oS3Ksp}_q5PBFiQ=E%9Q@Md@e!DBE;Z?IgOK+wS0C0Uk7gqT z?x91=5{b!?ZvB50x;DazB?-x>BXDI(GWcjJR5o7ROK1|sWElVUP;0BjgqTfFlY((A ze-v? z)u(DvbYznQr)LsO*x2)G@Z?N6Whu^aPWjE!M#N2Hfa~fai3Z%>bZLmOqCsFtyP?VPxdjiaa>s%F(hhhzK}dv z5}bfD^oZwLY=QaL2b7aV+G~*WE6?AkVi5@ANubS;!~e2b#FGsY%*!BViSCZCJBDRL;h6Tb(4ZWgnmo82 zaz%k{y2?uT24QzM-20yL^#pP2Z|8nr!kkx$F1J(?;6C`4beDr>GwewuHNYpBmiKMf zS>VP@wBy37OLI31KT&#+asa5K+%h5|OKL2?n?I%e$t+#7B6>GqYGP z9aR*~%mtGCkbsod&M8s6vQPn7D&$mN+Dp1F)}3a1)t1_k9zofn2pXDaIyzN#sqRvY{~H4Qf0rBIpvY5g_(G;UnA zPH4T3nNg^hAGj983EQ9cx|iJ=``YW(8laUjzV6Z44)RY6rgkcV)U+;aAJ7cRN{nW> zkfar7$tclE$#H*kA78DsR8%f*#4Q^FP99?p+46qr<)NXQL1QLO$gdKUbiIz=-@Y8T z(m^%vEj>KDFwPiTmttK=E?@q6je$lcK|$wQuBaV90Cn=siMd#}0cE8^806aroi=2C z6`NF8U@+if&;(q5b9!36Jz%2nRIlJsFN!viu{#_|rqJXSmYT$*z{t6&+2>fW3*K=4kbG%l6RQ%`Ukx5;Madsdk+31YL!*biwdXOnw3$ zTbKn^XhI8NObW>_&=I&*hK;^dLBd?0dXtk{yeWFSOK8^NT{bVhE0A^cGAX)Sdvnbw zO6qq5WE}Oj5*J&lzFMI%xO6Kq@kGOtS51%Q@on{^i33cZ3q` z5I^0wwWBs=oxgpMLElh0-9kE2j3HmEks(foHVUEq;!F7PpDWCa*YOdSg14nB68cQ_Iz zC`b90o#{KYH&=>1n=*8qsM8X4=%Jw6F1{zhH?T`sYc^Y^{Nea?m-6Uz)mGfo7e6-~ zny{xt3sse=xDfWQqg+dtq02mazd1>Xkl@T)qm)}>R3^w-V&`B$LSD&Yi8uEAYuoK* zN8~U&0mA;Q#JIkteDl<-<04~CS7GlyYVH_rB$-gh#+Emw;Vhc737Qduz+@F>1 zl44~f(GO+%!k!whU0$~~59aWyiW<_>^xNvdsM3OTVDvScWr%=?&cwbf*V~JZRh6pi zHblZr3_5a6@OUGf?Sb@>r&VAqI58;IK5t1et1j!RPlkC=b8Wb_?fR}lfO*T(dE}5& zzRkCm8)tQDHX#R7bPr_yr;L;J3&Gd>AI#_J`gygKSsJTrlxsQ_KRlf$A&O@XP89sn^nkVdD~ew%0fC}6`mLWRGTr;cCvcL(JPgiWThs{iWHj@qLH&+ zl(eS}kGpQ!F8H#;ano=oa3}1KKaK1?pA25Oyk>9m^RJY_L28ng*2^-1ozHDZw`&pR z446>)c6uK^3~PXl48X!UelQfmrJ-h)NtET-R3?w!*;4Dvwq&BWrmt0|yXYM`O-R1VVHY+h+SHJ+l`=N=Rp(zdV>1uqpfN ztm;@~XzI9HOvN-#9XZmbQF4#Uz^3^J;h|qy?p!=(clw?;(&w3mG&%7$;O0k#Z~QLo znK>k(K@{xtJ+!3TFPVs}Y#O36{DSw!rH5f0uH1e+DI7PlhJjep77WrvodYhvcPbMc z8U9|k68Knn628MCBLgx!-d;2~PdRUdIk$V8UTr!X)8x@2vI(P*zFS$Cm^X+Dby4j4 zfPw4gZ}tSgJ@(jT2={Okn*M&HqH1mfHB#9wns_dMo?DQd$S>flh(Z}rK~E}#rU5yI zWvtzco_F(KI6LKqDTlZ_~s+awmyl1$gbwU~2<1)J?cz z!9omYBfg~z&;KU9#UOtvj{d{~HrknK(+fAiC#U=S-#z-XF%2TBgusPKQp1DSfX9j1 zQA_8G-g|jCOZ=#_T%S2;j07#)=jtG&c(hR0F{XU33$UXm;;s{kfD$R2Dlp;9%Vq8f zxdk>Zf{bD_HKAEh7e{jYgafFImAALwu2s5^?NL+k{273-z%fw}bR@hXErmr^bsb(; zB}luy+>L>$Bfatb<#|3`CFRD)?Y+ASv2y$%%eymWT{tjdh5{5QG!!00kvB4DoZbA% z=elG>jsYY$W)H;Guvyr~k7Z9Zihft1iFTC_!B?xJT`-pCl~5kUPy0^s@TSDXkUQSg zp4_P#23iVVwza3%?S`zrThu&g8++4Xyt=&677#h7v|r#fk{1TYWt|up^9gk5ZLWuh zrZS`?)E7_2vTRi;F|D{+`$fXl*SVpV2n$V(p4Jc^l-R;*sGVqjp_aeCZq^J6UE{RL z9mid6ii}dTx9D72W4bbos{(z=vAQ+~i)8u5LKmjfT7(Ge7)*-i~rasHNk^Sz8MXw<1@vl z?xo)8RZ=jEgNr$sQZ5=%CH$rcFGGADUx>7ws@y`a(f%Z^={PshZX?V{>8xMZsL?sY z$JYIFk;`MM-`{XmjA4ud(fD!-&#i6`w{{s%`Wnq$8!gXLQ==!tqm(?HM_Z#U(_~{Fr@f>xSnATdFM{2)(mtVDd zn^<&gYOQh9szAw&Bzo4DwY}w4zD2scQhJP67cQ)64mFy<&@d_?)#yK)wnP-&d>Lf9 zRIsp=aTlp8qg~!(ZjKk;v=9xAlvaj7gV@NAT9W%ofo8Q{!Pi32-Vt>3<@?~Ne($v1 zMY?W(-}pi2yZ$uuf}|)uFc2}#yS>}p^r`>i?;;DSd}U-}Scy4x{@uyE=?HOCypgCi zMH)~!I48*Gcrh=Fv4j2-*$$-sZj^VrV-c9WV^&`DKjz2iT~O3gk*Q&POXisE;_s9w zoeX{D5hqoSTN%L56Sy+H8=Zc)m}D6nA=Qs(91d@Ign`&e@zh+_ebjWZ*Rt*%XVu@T z_-Cf`NMbA9|8efn+EGt37xs6kPJv+^{k8q+lr>YNPg1x^63QGoJLa<#8)|*DrItF9 zl5Vj^uqbvp<<)1XNvpZ(#4-P&Z2x$p+iSGi+1uqguJcvGnF6{Gz=*~ALsDeJFa%S2 z>=?F72wu-f4plbQ^(AK&iIVc>E?XxJW~L2+Gmz@L|K@>@JDb-+(AA0x}g;aqD{hvbcf*bk?~%rQ+e3aWBCpNtCe zI>#kWhw&-(yL}s+AFjy*SHIm|eBsRGSX_%Jhqm$j3<4HZm#jTUPhE~S6iTS;eg;u3 zB{#wA$<;v{p0PslY`HtUI-!ND0zm+}PqSKg>{DBfa(uZXKqO|6kt{!ySRM_R$k!ZX z=21yYC&r143hq<{)%JKFm;nphv(AG9z(Py?AQB7Uw9uB2+cK8(dQCf+XO;E z^^{AzWp!45r-)$RF@FfZe|dwmLa?_Y>v2oiR}~E)pz&(Fxh%A47p>*KUA#SDTq3{&%d-~|F>W>J?0%sQp>xJoGg!DJ(*sUawc_b*0kM-W=}3Tp z#s?)fb`5|b!x>2}s!&B!v}MUA7^NmCEDUNJ$|Yq=d(sNtkDh<2k#&*Rk9MgO|7!%6 zwL+Ky5x}>#LNmrHNifKNHLftFSpCeHVhj!8k&S~e;FVp8B0#cip2|qU{Xba7l-5A^ zro>OiRBZ5->OQlQAI4xS6Z`f5osKFBM7=`;2nzdbQOPs_oTKqu=;*�V}=xPo>uM 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/js/base-analysis/DisplaySettings.js b/src/main/webapp/js/base-analysis/DisplaySettings.js new file mode 100644 index 0000000..652d597 --- /dev/null +++ b/src/main/webapp/js/base-analysis/DisplaySettings.js @@ -0,0 +1,35 @@ +"use strict"; + +var DisplaySettings = function(jStorage) { + var KEY = "baseDisplaySettings"; + var showGridChanged = new signals.Signal(); + + var getStored = function() { + return _.extend({ showGrid: false }, jStorage.get(KEY, {})); + }; + + var store = function() { + jStorage.set(KEY, { showGrid: showGrid }); + }; + + var setShowGrid = function(newShowGrid) { + if (newShowGrid != showGrid) { + showGrid = newShowGrid; + showGridChanged.dispatch(); + store(); + } + }; + + var getShowGrid = function() { + return showGrid; + }; + + var initStored = getStored(); + var showGrid = initStored.showGrid; + + return { + setShowGrid: setShowGrid, + getShowGrid: getShowGrid, + showGridChanged: showGridChanged + }; +}; \ No newline at end of file diff --git a/src/main/webapp/js/base-analysis/MapDisplay2d.js b/src/main/webapp/js/base-analysis/MapDisplay2d.js new file mode 100644 index 0000000..486a4e6 --- /dev/null +++ b/src/main/webapp/js/base-analysis/MapDisplay2d.js @@ -0,0 +1,759 @@ +"use strict"; + +var MapDisplay2d = function(canvas, mapConfig, model, displaySettings) { + var stage = new createjs.Stage(canvas); + stage.autoClear = false; + var bgContainer = new createjs.Container(); + stage.addChild(bgContainer); + var buildingsContainer = new createjs.Container(); + stage.addChild(buildingsContainer); + var extrasContainer = new createjs.Container(); + stage.addChild(extrasContainer); + + var successColour = "#77ff77"; + var failColour = "#ff4444"; + + var buildingSheet = null; + var wallSheet = null; + + var hashCode = function(str){ + var hash = 0; + if (str.length == 0) return hash; + for (var i = 0; i < str.length; i++) { + var char = str.charCodeAt(i); + hash = ((hash<<5)-hash)+char; + hash = hash & hash; + } + return hash; + }; + + var randomColour = function(seed) { + var base = hashCode("" + seed).toString(16).slice(2, 8); + return '#' + base + Array(6 - base.length + 1).join("0"); + }; + + var renderElementRanges = function(mapDimensions, elements) { + _.chain(elements) + .map(function (elementToDraw) { + switch (elementToDraw.range.typeName) { + case "Sector": + return createSectorElementRangeDisplay(mapDimensions, elementToDraw); + case "Circular": + return createCircularElementRangeDisplay(mapDimensions, elementToDraw); + default: + console.log("Can't render", elementToDraw.range) + } + }) + .each(function (circle) { + extrasContainer.addChild(circle); + }); + }; + + var createSectorElementRangeDisplay = function(mapDimensions, element) { + var angleSizeRadians = element.range.angleSize / 180 * Math.PI; + var minLine = createSectorLineDetails(Math.PI / 2, element.range.innerSize, element.range.outerSize); + var maxLine = createSectorLineDetails(Math.PI / 2 - angleSizeRadians, element.range.innerSize, element.range.outerSize); + + var display = new createjs.Shape(); + display.x = mapDimensions.toCanvasCoord(element.block.x + element.block.size / 2); + display.y = mapDimensions.toCanvasCoord(element.block.y + element.block.size / 2); + + display.graphics + .beginStroke("#ffffff") + .moveTo(mapDimensions.toCanvasSize(minLine.coord1.x), mapDimensions.toCanvasSize(minLine.coord1.y)) + .lineTo(mapDimensions.toCanvasSize(minLine.coord2.x), mapDimensions.toCanvasSize(minLine.coord2.y)) + .arc(0, 0, mapDimensions.toCanvasSize(element.range.outerSize), 0, angleSizeRadians) + .lineTo(mapDimensions.toCanvasSize(maxLine.coord1.x), mapDimensions.toCanvasSize(maxLine.coord1.y)) + .arc(0, 0, mapDimensions.toCanvasSize(element.range.innerSize), angleSizeRadians, 0, true); + + display.rotation = 180 + element.range.angle + (element.range.angleSize - element.range.angle) / 2; + return display; + }; + + var createSectorLineDetails = function(angle, innerSize, outerSize) { + return { + coord1: { + x: Math.sin(angle) * innerSize, + y: Math.cos(angle) * innerSize + }, + coord2: { + x: Math.sin(angle) * outerSize, + y: Math.cos(angle) * outerSize + } + }; + }; + + var createLine = function(coord1, coord2, colour, mapDimensions) { + var line = new createjs.Shape(); + line.graphics + .beginStroke(colour) + .moveTo(0, 0) + .lineTo( + mapDimensions.toCanvasSize(coord1.x - coord2.x), + mapDimensions.toCanvasSize(coord1.y - coord2.y) + ); + line.x = mapDimensions.toCanvasCoord(coord2.x); + line.y = mapDimensions.toCanvasCoord(coord2.y); + return line; + }; + + var createCircularElementRangeDisplay = function(mapDimensions, element) { + var allInfo = new createjs.Container(); + var outerCircle = new createjs.Shape(); + outerCircle.graphics + .beginStroke("#ffffff") + .beginFill("rgba(255,255,255,0.05)") + .drawCircle( + 0, + 0, + mapDimensions.toCanvasSize(element.range.outer) + ); + allInfo.addChild(outerCircle); + + if (element.range.inner) { + var innerCircle = new createjs.Shape(); + innerCircle.graphics + .beginStroke("#ffaaaa") + .beginFill("rgba(255,80,80,0.05)") + .drawCircle( + 0, + 0, + mapDimensions.toCanvasSize(element.range.inner) + ); + allInfo.addChild(innerCircle); + } + + var lineSize = 1; + var vert = new createjs.Shape(); + vert.graphics + .beginStroke("#ffffff") + .moveTo(0, -mapDimensions.toCanvasSize(lineSize / 2)) + .lineTo(0, mapDimensions.toCanvasSize(lineSize / 2)); + allInfo.addChild(vert); + var hor = new createjs.Shape(); + hor.graphics + .beginStroke("#ffffff") + .moveTo(-mapDimensions.toCanvasSize(lineSize / 2), 0) + .lineTo(mapDimensions.toCanvasSize(lineSize / 2), 0); + allInfo.addChild(hor); + + allInfo.x = mapDimensions.toCanvasCoord(element.block.x + element.block.size / 2); + allInfo.y = mapDimensions.toCanvasCoord(element.block.y + element.block.size / 2); + + return allInfo; + }; + + var renderElementRangesByIds = function(mapDimensions, ids) { + renderElementRanges(mapDimensions, model.getVillageElementsByIds(ids)); + }; + + var renderElementRangesByTypeName = function(mapDimensions, typeName) { + renderElementRanges( + mapDimensions, + model.getVillageElementsByTypeName(typeName) + ); + }; + + var renderWizardTowersOutOfHoundPositions = function(result, mapDimensions) { + eachBuildingDisplay( + result.outOfRange, + function (buildingContainer) { + applyColour(buildingContainer, 0, 1, 0); + } + ); + + var inRangeTowerIds = _.pluck(result.inRange, 'tower'); + eachBuildingDisplay( + inRangeTowerIds, + function (buildingContainer) { + applyColour(buildingContainer, 1, 0, 0); + } + ); + eachBuildingDisplay( + _.pluck(result.inRange, 'airDefense'), + function (buildingContainer) { + applyColour(buildingContainer, 1, 0.8, 0.8); + } + ); + _.chain(result.inRange) + .pluck('houndTarget') + .each(function(target) { + var display = new createjs.Shape(); + display.alpha = 0.5; + display.graphics + .beginFill(failColour) + .drawRect(0, 0, mapDimensions.toCanvasSize(target.size), mapDimensions.toCanvasSize(target.size)); + display.x = mapDimensions.toCanvasCoord(target.x); + display.y = mapDimensions.toCanvasCoord(target.y); + extrasContainer.addChild(display); + }); + renderElementRangesByIds(mapDimensions, _.union(inRangeTowerIds, result.outOfRange)); + }; + + var renderQueenWalkedAirDefense = function(result, mapDimensions) { + eachBuildingDisplay( + result.nonReachableAirDefs, + function (buildingContainer) { + applyColour(buildingContainer, 0, 1, 0); + } + ); + eachBuildingDisplay( + _.pluck(result.attackings, 'targetingId'), + function (buildingContainer) { + applyColour(buildingContainer, 1, 0, 0); + } + ); + _.each( + result.attackings, + function(attacking) { + extrasContainer.addChild(createLine(attacking.hitPoint, attacking.standingPosition, failColour, mapDimensions)); + } + ); + }; + + var renderEnoughPossibleTrapLocations = function(result, mapDimensions) { + var colour = result.success ? successColour : failColour; + var display = new createjs.Shape(); + _.each( + model.getReport().village.possibleInternalLargeTraps, + function(trap) { + display.graphics + .beginFill(colour) + .drawRect( + mapDimensions.toCanvasCoord(trap.x), + mapDimensions.toCanvasCoord(trap.y), + mapDimensions.toCanvasSize(2), + mapDimensions.toCanvasSize(2) + ) + .endFill(); + } + ); + display.filters = [ + new createjs.ColorFilter( + 1, 1, 1, 0.4, + 0, 0, 0, 0 + ) + ]; + display.cache(0, 0, 1500, 1500); + extrasContainer.addChild(display); + }; + + var renderActiveRule = function(mapDimensions) { + if (!model.hasActiveRule()) { + return; + } + + var result = _.findWhere(model.getReport().results, { 'code': model.getActiveRuleCode() }); + switch (result.code) { + case 'ArcherAnchor': + renderArcherAnchor(result, mapDimensions); + break; + case 'HogCCLure': + renderHogCCLure(result, mapDimensions); + break; + case 'HighHPUnderAirDef': + renderHighHPUnderAirDef(result, mapDimensions); + break; + case 'AirSnipedDefense': + renderAirSnipedDefense(result, mapDimensions); + break; + case 'MinimumCompartments': + renderMinimumCompartments(result, mapDimensions); + break; + case 'BKSwappable': + renderBKSwappable(result, mapDimensions); + break; + case 'WizardTowersOutOfHoundPositions': + renderWizardTowersOutOfHoundPositions(result, mapDimensions); + break; + case 'QueenWalkedAirDefense': + renderQueenWalkedAirDefense(result, mapDimensions); + break; + case 'QueenWontLeaveCompartment': + renderQueenWontLeaveCompartment(result, mapDimensions); + break; + case 'EnoughPossibleTrapLocations': + renderEnoughPossibleTrapLocations(result, mapDimensions); + break; + default: + console.error('Don\'t know how to render active rule: ' + result.code); + } + }; + + var applyColour = function(display, r, g, b) { + display.filters = [ + new createjs.ColorFilter( + r, g, b, 1, + 0, 0, 0, 0 + ) + ]; + display.cache(0, 0, 1000, 1000); + }; + + var renderBKSwappable = function(result, mapDimensions) { + var bk = model.getVillageElementByTypeName("BarbarianKingAltar"); + if (bk == null) { + return; + } + + if (!result.success) { + var exposedMask = new createjs.Shape(); + exposedMask.graphics.beginFill(successColour); + _.each(result.exposedTiles, function (tile) { + exposedMask.graphics.drawRect( + mapDimensions.toCanvasCoord(tile.x), + mapDimensions.toCanvasCoord(tile.y), + mapDimensions.toCanvasSize(1), + mapDimensions.toCanvasSize(1) + ); + }); + + var bkRadiusFill = new createjs.Shape(); + bkRadiusFill.graphics + .beginFill(failColour) + .drawCircle( + 0, + 0, + mapDimensions.toCanvasSize(bk.range.outer) + ); + bkRadiusFill.x = mapDimensions.toCanvasCoord(bk.block.x + bk.block.size / 2); + bkRadiusFill.y = mapDimensions.toCanvasCoord(bk.block.y + bk.block.size / 2); + bkRadiusFill.alpha = 0.6; + bkRadiusFill.mask = exposedMask; + + extrasContainer.addChild(bkRadiusFill); + } + + renderElementRangesByTypeName(mapDimensions, "BarbarianKingAltar"); + }; + + var renderQueenWontLeaveCompartment = function(result, mapDimensions) { + var compartment = model.getVillageArcherQueenCompartment(); + if (compartment == null) { + return; + } + + highlightCompartment( + compartment, + result.success ? successColour : failColour, + mapDimensions + ) + }; + + var renderMinimumCompartments = function(result, mapDimensions) { + _.each( + model.getVillageCompartmentsByIds(result.compartments), + function(compartment) { + highlightCompartment(compartment, randomColour(compartment.walls.join("|")), mapDimensions); + } + ); + }; + + var highlightCompartment = function(compartment, colour, mapDimensions) { + var innerDisplay = new createjs.Shape(); + innerDisplay.graphics.beginFill(colour); + _.each(compartment.innerTiles, function(innerTile) { + innerDisplay.graphics.drawRect( + mapDimensions.toCanvasCoord(innerTile.x), + mapDimensions.toCanvasCoord(innerTile.y), + mapDimensions.toCanvasSize(1), + mapDimensions.toCanvasSize(1) + ); + }); + innerDisplay.alpha = 0.85; + extrasContainer.addChild(innerDisplay); + + var wallDisplay = new createjs.Shape(); + wallDisplay.graphics.beginFill(colour); + _.each(compartment.walls, function(wallId) { + var element = model.getVillageElementById(wallId); + wallDisplay.graphics.drawRect( + mapDimensions.toCanvasCoord(element.block.x), + mapDimensions.toCanvasCoord(element.block.y), + mapDimensions.toCanvasSize(1), + mapDimensions.toCanvasSize(1) + ); + }); + wallDisplay.alpha = 0.5; + extrasContainer.addChild(wallDisplay); + }; + + var renderAirSnipedDefense = function(result, mapDimensions) { + eachBuildingDisplay( + _.pluck(result.attackPositions, 'targetingId'), + function (buildingContainer) { + applyColour(buildingContainer, 1, 0, 0); + } + ); + _.chain(result.attackPositions) + .map(function(targeting) { + return createLine(targeting.hitPoint, targeting.startPosition, failColour, mapDimensions); + }) + .each(function(display) { extrasContainer.addChild(display); }); + renderElementRangesByIds(mapDimensions, result.airDefenses); + }; + + var renderArcherAnchor = function(result, mapDimensions) { + _.chain(result.targetings) + .map(function (targeting) { + extrasContainer.addChild(createLine(targeting.hitPoint, targeting.standingPosition, failColour, mapDimensions)); + return _.findWhere(buildingsContainer.children, { 'id': targeting.targetingId }); + }) + .each(function(buildingContainer) { + applyColour(buildingContainer, 1, 0, 0); + }); + renderElementRangesByIds(mapDimensions, result.aimingDefenses); + }; + + var renderHogCCLure = function(result, mapDimensions) { + _.chain(result.targetings) + .map(function (targeting) { + extrasContainer.addChild(createLine(targeting.hitPoint, targeting.startPosition, failColour, mapDimensions)); + return _.findWhere(buildingsContainer.children, { 'id': targeting.targetingId }); + }) + .each(function (buildingContainer) { + applyColour(buildingContainer, 1, 0, 0); + }); + renderElementRangesByTypeName(mapDimensions, "ClanCastle"); + }; + + var renderHighHPUnderAirDef = function(result, mapDimensions) { + eachBuildingDisplay( + result.outOfAirDefRange, + function (buildingContainer) { + applyColour(buildingContainer, 1, 0, 0); + } + ); + eachBuildingDisplay( + result.inAirDefRange, + function (buildingContainer) { + applyColour(buildingContainer, 0, 1, 0); + } + ); + renderElementRangesByTypeName(mapDimensions, "AirDefense"); + }; + + var eachBuildingDisplay = function(ids, operation) { + _.chain(ids) + .map(function (id) { + var building = _.findWhere(buildingsContainer.children, { 'id': id }); + if (building == null) { + console.error("No building with id " + id); + } + return building; + }) + .each(operation); + }; + + var renderGrass = function(mapDimensions) { + var grass = new createjs.Shape(); + grass.graphics + .beginFill("#598c02") + .drawRect( + mapDimensions.toCanvasCoord(0), + mapDimensions.toCanvasCoord(0), + mapDimensions.toCanvasSize(mapDimensions.totalTiles), + mapDimensions.toCanvasSize(mapDimensions.totalTiles) + ); + grass.graphics + .beginFill("#8cbf15") + .drawRect( + mapDimensions.toCanvasCoord(mapDimensions.borderTiles), + mapDimensions.toCanvasCoord(mapDimensions.borderTiles), + mapDimensions.toCanvasSize(mapDimensions.mapTiles), + mapDimensions.toCanvasSize(mapDimensions.mapTiles) + ); + _.chain(_.range(mapDimensions.mapTiles)) + .each(function(col) { + _.chain(_.range(mapDimensions.mapTiles)) + .each(function (row) { + if ((row + col) % 2 == 0) { + grass.graphics + .beginFill("#87ba10") + .drawRect( + mapDimensions.toCanvasCoord(mapDimensions.borderTiles + col), + mapDimensions.toCanvasCoord(mapDimensions.borderTiles + row), + mapDimensions.toCanvasSize(1), + mapDimensions.toCanvasSize(1) + ); + } + }) + }); + bgContainer.addChild(grass); + }; + + var render2dPreventTroopDrops = function(mapDimensions) { + var allPrevents = new createjs.Container(); + _.chain(model.getReport().village.elements) + .reject(function(e) { return !e.noTroopDropBlock; }) + .map(function(element) { + var prevent = new createjs.Shape(); + prevent.graphics + .beginFill("rgba(255,255,255,1)") + .drawRect( + 0, + 0, + mapDimensions.toCanvasSize(element.noTroopDropBlock.size), + mapDimensions.toCanvasSize(element.noTroopDropBlock.size) + ); + prevent.x = mapDimensions.toCanvasCoord(element.noTroopDropBlock.x); + prevent.y = mapDimensions.toCanvasCoord(element.noTroopDropBlock.y); + return prevent; + }) + .each(function(e) { allPrevents.addChild(e); }); + allPrevents.filters = [ + new createjs.ColorFilter( + 1, 1, 1, 0.15, + 0, 0, 0, 0 + ) + ]; + allPrevents.cache(0, 0, 1000, 1000); + bgContainer.addChild(allPrevents); + }; + + var render2dImageBuildings = function(mapDimensions) { + for (var i in model.getReport().village.elements) { + var element = model.getReport().village.elements[i]; + if (element.typeName == "Wall") { + renderWallImage(element, mapDimensions); + continue; + } + + renderBuildingImage(element, mapDimensions); + } + }; + + var renderWallImage = function(element, mapDimensions) { + buildingsContainer.addChild(renderElementImage(element, mapDimensions, wallSheet)); + }; + + var renderBuildingImage = function(element, mapDimensions) { + var display = renderElementImage(element, mapDimensions, buildingSheet); + if (element.noTroopDropBlock) { + var grass = new createjs.Shape(); + grass.graphics + .beginFill("#6fa414") + .drawRect( + 0, + 0, + mapDimensions.toCanvasSize(element.block.size), + mapDimensions.toCanvasSize(element.block.size) + ); + display.addChildAt(grass, 0); + } + buildingsContainer.addChild(display); + }; + + var renderElementImage = function(element, mapDimensions, sheet) { + var elementContainer = new createjs.Container(); + elementContainer.x = mapDimensions.toCanvasCoord(element.block.x); + elementContainer.y = mapDimensions.toCanvasCoord(element.block.y); + elementContainer.id = element.id; + + var bitmap = sheet.create(element, mapDimensions); + var finalWidth = bitmap.sourceRect.width * bitmap.scaleX; + var finalHeight = bitmap.sourceRect.height * bitmap.scaleY; + bitmap.x = (mapDimensions.toCanvasSize(element.block.size) - finalWidth) / 2; + bitmap.y = (mapDimensions.toCanvasSize(element.block.size) - finalHeight) / 2; + elementContainer.addChild(bitmap); + + return elementContainer; + }; + + var setAssets = function(newAssets) { + buildingSheet = new RedMoonBuildingSpriteSheet(newAssets.redMoonBuildings); + wallSheet = new RedMoonWallSpriteSheet(newAssets.redMoonWalls); + render(); + }; + + var render = function() { + stage.clear(); + bgContainer.removeAllChildren(); + extrasContainer.removeAllChildren(); + buildingsContainer.removeAllChildren(); + + if (buildingSheet == null || wallSheet == null) { + var text = new createjs.Text("Loading Images" + new Array(1 + parseInt(_.now() / 1000) % 4).join('.'), "14px monospace", "#000000"); + text.x = 5; + text.y = 5; + extrasContainer.addChild(text); + stage.update(); + + setTimeout(render, 1000); + + return; + } + + if (!model.hasReport()) { + stage.update(); + return; + } + + render2d(); + + stage.update(); + }; + + /*function renderSpriteSheetDebug() { + var canvasContext = canvas.getContext("2d"); + var useScale = Math.min( + canvas.width / assets.buildings.width, + canvas.height / assets.buildings.height + ); + canvasContext.drawImage( + assets.buildings, + 0, + 0, + assets.buildings.width, + assets.buildings.height, + 0, + 0, + assets.buildings.width * useScale, + assets.buildings.height * useScale + ); + + for (var i in buildingsSheet) { + var sheetDef = buildingsSheet[i]; + canvasContext.strokeStyle = randomColour(i); + // First gap + canvasContext.strokeRect( + sheetDef.x * useScale, + sheetDef.y * useScale, + sheetDef.gap / 2 * useScale, + sheetDef.height * useScale + ); + for (var j = 0; j < 13; j++) { + var startX = sheetDef.x + j * (sheetDef.gap + sheetDef.width) + sheetDef.gap / 2; + // image + canvasContext.strokeRect( + startX * useScale, + sheetDef.y * useScale, + sheetDef.width * useScale, + sheetDef.height * useScale + ); + // Gap + canvasContext.strokeRect( + (startX + sheetDef.width) * useScale, + sheetDef.y * useScale, + sheetDef.gap * useScale, + sheetDef.height * useScale + ); + } + } + }*/ + + var renderGrid = function(mapDimensions) { + if (!displaySettings.getShowGrid()) { + return; + } + + var colour = "#ff0000"; + var alpha = 0.3; + var mapIndexes = _.range(mapDimensions.totalTiles); + _.chain(mapIndexes) + .map(function(col) { + var strokeSize = col % 5 == 0 ? 2 : 1; + var line = new createjs.Shape(); + line.x = mapDimensions.toCanvasCoord(col); + line.y = 0; + line.alpha = alpha; + line.graphics + .beginStroke(colour) + .setStrokeStyle(strokeSize) + .moveTo(0, 0) + .lineTo(0, mapDimensions.toCanvasCoord(mapDimensions.totalTiles)); + return line; + }) + .each(function(display) { extrasContainer.addChild(display); }); + + _.chain(mapIndexes) + .map(function(row) { + var strokeSize = row % 5 == 0 ? 2 : 1; + var line = new createjs.Shape(); + line.x = 0; + line.y = mapDimensions.toCanvasCoord(row); + line.alpha = alpha; + line.graphics + .beginStroke(colour) + .setStrokeStyle(strokeSize) + .moveTo(0, 0) + .lineTo(mapDimensions.toCanvasCoord(mapDimensions.totalTiles), 0); + return line; + }) + .each(function(display) { extrasContainer.addChild(display); }); + + _.chain(mapIndexes) + .filter(function(mapIndex) { return mapIndex != 0 && mapIndex % 5 == 0; }) + .map(function(mapIndex) { + var textSize = Math.ceil(canvas.width / 50); + + var rowLeft = new createjs.Text(mapIndex, textSize + "px monospace", colour); + rowLeft.x = 0; + rowLeft.y = mapDimensions.toCanvasCoord(mapIndex); + rowLeft.textBaseline = "top"; + + var colTop = new createjs.Text(mapIndex, textSize + "px monospace", colour); + colTop.x = mapDimensions.toCanvasCoord(mapIndex); + colTop.y = 0; + colTop.textBaseline = "top"; + + var rowRight = new createjs.Text(mapIndex, textSize + "px monospace", colour); + rowRight.x = mapDimensions.toCanvasCoord(mapDimensions.totalTiles - mapDimensions.hiddenBorder); + rowRight.y = mapDimensions.toCanvasCoord(mapIndex); + rowRight.textBaseline = "top"; + rowRight.textAlign = "right"; + + var colBottom = new createjs.Text(mapIndex, textSize + "px monospace", colour); + colBottom.x = mapDimensions.toCanvasCoord(mapIndex); + colBottom.y = mapDimensions.toCanvasCoord(mapDimensions.totalTiles - mapDimensions.hiddenBorder); + colBottom.textBaseline = "bottom"; + + return [rowLeft, colTop, rowRight, colBottom]; + }) + .flatten() + .each(function(display) { extrasContainer.addChild(display); }); + }; + + var render2d = function() { + var mapDimensions = new MapDimensions(_.extend(mapConfig, { + totalTiles: mapConfig.mapTiles + mapConfig.borderTiles * 2, + canvasSize: Math.min($(canvas).width(), $(canvas).height()) + })); + renderGrass(mapDimensions); + //render2dRandomSolidColourElements(mapDimensions); + render2dPreventTroopDrops(mapDimensions); + render2dImageBuildings(mapDimensions); + renderActiveRule(mapDimensions); + renderGrid(mapDimensions); + }; + + var MapDimensions = function(props) { + var hiddenBorder = 2; + var tileSize = props.canvasSize / (props.totalTiles - 2 * hiddenBorder); + + var toCanvasCoord = function(coord) { + return (coord - hiddenBorder) * tileSize; + }; + + var toCanvasSize = function(size) { + return size * tileSize; + }; + + return { + mapTiles: props.mapTiles, + borderTiles: props.borderTiles, + totalTiles: props.totalTiles, + hiddenBorder: hiddenBorder, + toCanvasCoord: toCanvasCoord, + toCanvasSize: toCanvasSize + }; + }; + + displaySettings.showGridChanged.add(_.bind(render, this)); + + return { + render: render, + setAssets: setAssets, + canvas: canvas + }; +}; \ No newline at end of file diff --git a/src/main/webapp/js/base-analysis/Model.js b/src/main/webapp/js/base-analysis/Model.js new file mode 100644 index 0000000..7e47f35 --- /dev/null +++ b/src/main/webapp/js/base-analysis/Model.js @@ -0,0 +1,124 @@ +"use strict"; + +var Model = function() { + var currentReport = null; + var activeRuleCode = null; + var reportChanged = new signals.Signal(); + var ruleChanged = new signals.Signal(); + + var setReport = function(newReport) { + if (newReport == currentReport) { + return; + } + + currentReport = newReport; + clearActiveRule(); + reportChanged.dispatch(); + + if (currentReport != null) { + var firstFailedRule = _.chain(currentReport.results) + .findWhere({ "success": false }) + .value(); + if (firstFailedRule != null) { + setActiveRuleByCode(firstFailedRule.code); + } + } + }; + + var clearReport = function() { + setReport(null); + }; + + var getReport = function() { + return currentReport; + }; + + var getVillageElementById = function(id) { + return _.findWhere(currentReport.village.elements, { 'id': id }); + }; + + var getVillageElementsByIds = function(ids) { + return _.filter(currentReport.village.elements, function (element) { + return _.contains(ids, element.id); + }); + }; + + var getVillageCompartmentsByIds = function(ids) { + return _.filter(currentReport.village.wallCompartments, function (compartment) { + return _.contains(ids, compartment.id); + }); + }; + + var getVillageArcherQueenCompartment = function() { + return _.find( + currentReport.village.wallCompartments, + function(compartment) { + return _.some( + compartment.elementIds, + function(elementId) { + return getVillageElementById(elementId).typeName == "ArcherQueenAltar"; + } + ); + } + ); + }; + + var getVillageElementsByTypeName = function(typeName) { + return _.where(currentReport.village.elements, { 'typeName': typeName }); + }; + + var getVillageElementByTypeName = function(typeName) { + return _.findWhere(currentReport.village.elements, { 'typeName': typeName }); + }; + + var hasReport = function() { + return currentReport != null; + }; + + var hasActiveRule = function() { + return activeRuleCode != null; + }; + + var getActiveRuleCode = function() { + return activeRuleCode; + }; + + var clearActiveRule = function() { + setActiveRuleByCode(null); + }; + + var setActiveRuleByCode = function(newActiveRuleCode) { + if (newActiveRuleCode == activeRuleCode) { + return; + } + + if (newActiveRuleCode != null && _.findWhere(report.results, { 'code': newActiveRuleCode }) == null) { + console.error("No rule code in current report:", newActiveRuleCode, report); + return; + } + + activeRuleCode = newActiveRuleCode; + ruleChanged.dispatch(); + }; + + return { + getReport: getReport, + setReport: setReport, + hasReport: hasReport, + clearReport: clearReport, + getVillageElementById: getVillageElementById, + getVillageElementsByIds: getVillageElementsByIds, + getVillageElementsByTypeName: getVillageElementsByTypeName, + getVillageElementByTypeName: getVillageElementByTypeName, + getVillageCompartmentsByIds: getVillageCompartmentsByIds, + getVillageArcherQueenCompartment: getVillageArcherQueenCompartment, + + hasActiveRule: hasActiveRule, + getActiveRuleCode: getActiveRuleCode, + setActiveRuleByCode: setActiveRuleByCode, + clearActiveRule: clearActiveRule, + + reportChanged: reportChanged, + ruleChanged: ruleChanged + }; +}; \ No newline at end of file diff --git a/src/main/webapp/js/base-analysis/Preloader.js b/src/main/webapp/js/base-analysis/Preloader.js new file mode 100644 index 0000000..5ee23de --- /dev/null +++ b/src/main/webapp/js/base-analysis/Preloader.js @@ -0,0 +1,19 @@ +"use strict"; + +var Preloader = function() { + return { + loadAssets: function(callback) { + var queue = new createjs.LoadQueue(); + + var handleAssetsLoadComplete = function() { + callback(queue); + }; + + queue.on("complete", handleAssetsLoadComplete, this); + queue.loadManifest([ + { id: "redMoonBuildings", src:"/images/buildings-sprite.png" }, + { id: "redMoonWalls", src:"/images/walls.png" } + ]); + } + }; +}; \ No newline at end of file diff --git a/src/main/webapp/js/base-analysis/RedMoonBuildingSpriteSheet.js b/src/main/webapp/js/base-analysis/RedMoonBuildingSpriteSheet.js new file mode 100644 index 0000000..1a5656e --- /dev/null +++ b/src/main/webapp/js/base-analysis/RedMoonBuildingSpriteSheet.js @@ -0,0 +1,274 @@ +"use strict"; + +var RedMoonBuildingSpriteSheet = function(image) { + var defs = { + "SkeletonTrap": { + x: 1092, + y: 304, + width: 24, + height: 32, + gap: 2, + levelMultiplier: 0.5 + }, + "AirBomb": { + x: 994, + y: 297, + width: 25, + height: 40, + gap: 0, + levelMultiplier: 0.5 + }, + "SeekingAirMine": { + x: 1044, + y: 299, + width: 25, + height: 39, + gap: 0, + levelMultiplier: 0.5 + }, + "SpringTrap": { + x: 969, + y: 311, + width: 25, + height: 26, + gap: 0 + }, + "Bomb": { + x: 893, + y: 313, + width: 17, + height: 23, + gap: 9, + levelMultiplier: 0.5 + }, + "GiantBomb": { + x: 896, + y: 439, + width: 37, + height: 39, + gap: 12, + levelMultiplier: 0.5 + }, + "TownHall": { + x: 0, + y: 5, + width: 90, + height: 90, + gap: 12 + }, + "Laboratory": { + x: 0, + y: 118, + width: 80, + height: 64, + gap: 22 + }, + "BuilderHut": { + x: 697, + y: 342, + width: 36, + height: 38, + gap: 0 + }, + "BarbarianKingAltar": { + x: 749, + y: 339, + width: 60, + height: 43, + gap: 0 + }, + "ArcherQueenAltar": { + x: 824, + y: 338, + width: 59, + height: 42, + gap: 0 + }, + "ArmyCamp": { + x: 0, + y: 196, + width: 121, + height: 93, + gap: 8 + }, + "ClanCastle": { + x: 0, + y: 308, + width: 75, + height: 77, + gap: 1 + }, + "Barrack": { + x: 0, + y: 417, + width: 69, + height: 61, + gap: 7 + }, + "ArcherTower": { + x: 0, + y: 507, + width: 60, + height: 70, + gap: 16 + }, + "Cannon": { + x: 0, + y: 628, + width: 60, + height: 47, + gap: 16 + }, + "AirDefense": { + x: 0, + y: 704, + width: 60, + height: 64, + gap: 16 + }, + "XBow": { + x: 700, + y: 715, + width: 64, + height: 57, + gap: 10 + }, + "WizardTower": { + x: 0, + y: 1092, + width: 60, + height: 63, + gap: 16 + }, + "DarkElixirCollector": { + x: 648, + y: 1094, + width: 60, + height: 59, + gap: 16 + }, + "Mortar": { + x: 0, + y: 1209, + width: 60, + height: 44, + gap: 16 + }, + "DarkElixirStorage": { + x: 645, + y: 1194, + width: 65, + height: 63, + gap: 11 + }, + "GoldMine": { + x: 0, + y: 813, + width: 60, + height: 52, + gap: 16 + }, + "GoldStorage": { + x: 0, + y: 899, + width: 69, + height: 69, + gap: 7 + }, + "InfernoTower": { + x: 893, + y: 903, + width: 33, + height: 60, + gap: 16 + }, + "DarkBarrack": { + x: 0, + y: 995, + width: 69, + height: 69, + gap: 7 + }, + "SpellFactory": { + x: 550, + y: 1005, + width: 68, + height: 57, + gap: 7 + }, + "ElixirCollector": { + x: 0, + y: 1289, + width: 62, + height: 60, + gap: 14 + }, + "ElixirStorage": { + x: 0, + y: 1385, + width: 66, + height: 66, + gap: 10 + }, + "DarkSpellFactory": { + x: 912, + y: 1398, + width: 66, + height: 49, + gap: 10 + }, + "HiddenTesla": { + x: 0, + y: 1491, + width: 49, + height: 54, + gap: 0 + }, + "AirSweeper": { + x: 546, + y: 1503, + width: 49, + height: 44, + gap: 0 + }, + "Decoration": { + "//": "just a dummy sprite for the moment - decorations not fully implemented", + x: 912, + y: 1498, + width: 10, + height: 10, + gap: 10 + } + }; + + var create = function(element, mapDimensions) { + var sheetDef = defs[element.typeName]; + if (sheetDef == null) { + console.error("Cannot render " + element.typeName); + var display = new createjs.Container(); + display.sourceRect = new createjs.Rectangle(0, 0, 0, 0); + return display; + } + var widthRatio = mapDimensions.toCanvasSize(element.block.size) / sheetDef.width; + var heightRatio = mapDimensions.toCanvasSize(element.block.size) / sheetDef.height; + var useScale = Math.min(widthRatio, heightRatio); + var sheetIndex = element.level - 1; + if (sheetDef.levelMultiplier) { + sheetIndex = Math.floor((element.level - 1) * sheetDef.levelMultiplier); + } + var bitmap = new createjs.Bitmap(image); + bitmap.sourceRect = new createjs.Rectangle( + sheetDef.x + sheetIndex * (sheetDef.width + sheetDef.gap) + sheetDef.gap / 2, + sheetDef.y, + sheetDef.width, + sheetDef.height + ); + bitmap.scaleX = useScale; + bitmap.scaleY = useScale; + return bitmap; + }; + + return { + create: create + }; +}; \ No newline at end of file diff --git a/src/main/webapp/js/base-analysis/RedMoonWallSpriteSheet.js b/src/main/webapp/js/base-analysis/RedMoonWallSpriteSheet.js new file mode 100644 index 0000000..767bfcd --- /dev/null +++ b/src/main/webapp/js/base-analysis/RedMoonWallSpriteSheet.js @@ -0,0 +1,34 @@ +"use strict"; + +var RedMoonWallSpriteSheet = function(image) { + // TODO: Nearly repeated in building sprite sheet, sheetIndex only difference + var create = function(element, mapDimensions) { + var sheetDef = { + x: 80, + y: 10 + (element.level - 1) * 52, + width: 14, + height: 26, + gap: 0 + }; + + var widthRatio = mapDimensions.toCanvasSize(element.block.size) / sheetDef.width; + var heightRatio = mapDimensions.toCanvasSize(element.block.size) / sheetDef.height; + var useScale = Math.min(widthRatio, heightRatio); + var sheetIndex = 0; + + var bitmap = new createjs.Bitmap(image); + bitmap.sourceRect = new createjs.Rectangle( + sheetDef.x + sheetIndex * (sheetDef.width + sheetDef.gap) + sheetDef.gap / 2, + sheetDef.y, + sheetDef.width, + sheetDef.height + ); + bitmap.scaleX = useScale; + bitmap.scaleY = useScale; + return bitmap; + }; + + return { + create: create + } +}; \ No newline at end of file diff --git a/src/main/webapp/js/base-analysis/Ui.js b/src/main/webapp/js/base-analysis/Ui.js new file mode 100644 index 0000000..9ccaaf1 --- /dev/null +++ b/src/main/webapp/js/base-analysis/Ui.js @@ -0,0 +1,136 @@ +"use strict"; + +var Ui = function($, model, mapDisplay, window, displaySettings) { + var reportValid = false; + var sizeValid = false; + var activeRuleValid = false; + var panelGroup = $("#results-panel-group"); + + var renderTemplate = function (selector, vars) { + var template = $(selector).html(); + Mustache.parse(template, ['[[', ']]']); + return Mustache.render(template, vars); + }; + + var invalidateReport = function() { + reportValid = false; + render(); + }; + + var invalidateSize = function() { + sizeValid = false; + render(); + }; + + var invalidateRule = function() { + activeRuleValid = false; + render(); + }; + + var renderMapSize = function() { + if (sizeValid) { + return; + } + + var panelGroup = $("#results-panel-group"); + $(mapDisplay.canvas).hide(); + + // Don't know why width - padding is the desired width, found by trial and error + var padding = ($(mapDisplay.canvas).parent().outerWidth() - $(mapDisplay.canvas).parent().width()) / 2; + var canvasSize; + if (Math.abs(panelGroup.offset().top - $(mapDisplay.canvas).parent().offset.top) < 50) { + // Vertical column + canvasSize = $(mapDisplay.canvas).parent().width() - padding; + } else { + // side by side + var proposedBasedOnHeight = $(window.document).height() - $(mapDisplay.canvas).parent().offset().top - 20; + var proposedBasedOnWidth = $(window.document).width() - $(mapDisplay.canvas).parent().offset().left - 40; + canvasSize = Math.min(proposedBasedOnWidth, proposedBasedOnHeight); + } + mapDisplay.canvas.width = canvasSize; + mapDisplay.canvas.height = canvasSize; + $(mapDisplay.canvas).show(); + + sizeValid = true; + }; + + var renderReport = function() { + if (reportValid) { + return; + } + + reportValid = true; + panelGroup.empty(); + if (!model.hasReport()) { + $("#report").hide(); + return; + } + + $("#report").show(); + var panels = _.map( + model.getReport().results, + function (result) { + return $(renderTemplate( + "#result-panel", + { + id: result.code, + title: result.title, + description: result.description, + ruleCode: result.code, + success: result.success + } + )); + } + ); + panelGroup.append(panels); + }; + + var renderRule = function() { + if (activeRuleValid) { + return; + } + + activeRuleValid = true; + var panels = $("#results-panel-group").find(".panel"); + panels.collapse('hide'); + if (model.hasActiveRule()) { + panels.filter("#panel-" + model.getActiveRuleCode()) + .find("[role=tabpanel]") + .collapse('show'); + } + }; + + var render = function() { + renderMapSize(); + renderReport(); + renderRule(); + mapDisplay.render(); + }; + + model.reportChanged.add(_.bind(invalidateReport, this)); + model.ruleChanged.add(_.bind(invalidateRule, this)); + + $(document).ready(function () { + $("#results-panel-group") + .on("show.bs.collapse", function(event) { + model.setActiveRuleByCode($(event.target).data("rule-code")); + }) + .on("hide.bs.collapse", function(event) { + if (model.getActiveRuleCode() == $(event.target).data("rule-code")) { + model.clearActiveRule(); + } + }); + + var showGrid = $("form#display-settings [name=grid]"); + showGrid.prop("checked", displaySettings.getShowGrid()); + showGrid.on("change", function(event) { + displaySettings.setShowGrid($(event.currentTarget).is(":checked")); + }); + }); + + $(window).on("resize", _.bind(invalidateSize, this)); + + return { + render: render + } +}; \ No newline at end of file diff --git a/src/main/webapp/js/base-analysis/main.js b/src/main/webapp/js/base-analysis/main.js new file mode 100644 index 0000000..8fa6adb --- /dev/null +++ b/src/main/webapp/js/base-analysis/main.js @@ -0,0 +1,22 @@ +"use strict"; + +$(document).ready(function() { + // Globals mapConfig, report, document, window + + var model = new Model(); + + var displaySettings = new DisplaySettings(jQuery.jStorage); + var display = new MapDisplay2d(document.getElementById("villageImage"), mapConfig, model, displaySettings); + var ui = new Ui(jQuery, model, display, window, displaySettings); + + var preloader = new Preloader(); + preloader.loadAssets(function(queue) { + display.setAssets({ + "redMoonBuildings": queue.getResult("redMoonBuildings"), + "redMoonWalls": queue.getResult("redMoonWalls") + }); + ui.render(); + }); + + model.setReport(report); +}); \ No newline at end of file diff --git a/src/main/webapp/js/console-polyfill.js b/src/main/webapp/js/console-polyfill.js new file mode 100644 index 0000000..8e651aa --- /dev/null +++ b/src/main/webapp/js/console-polyfill.js @@ -0,0 +1,17 @@ +// Console-polyfill. MIT license. +// https://github.com/paulmillr/console-polyfill +// Make it safe to do console.log() always. +(function(global) { + "use strict"; + global.console = global.console || {}; + var con = global.console; + var prop, method; + var dummy = function() {}; + var properties = ['memory']; + var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + + 'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + + 'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','); + while (prop = properties.pop()) if (!con[prop]) con[prop] = {}; + while (method = methods.pop()) if (typeof con[method] !== 'function') con[method] = dummy; + // Using `this` for web workers & supports Browserify / Webpack. +})(typeof window === 'undefined' ? this : window); \ No newline at end of file diff --git a/src/main/webapp/js/war-bases/main.js b/src/main/webapp/js/war-bases/main.js new file mode 100644 index 0000000..43c688c --- /dev/null +++ b/src/main/webapp/js/war-bases/main.js @@ -0,0 +1,177 @@ +"use strict"; + +$(document).ready(function() { + var LOAD_BATCH_SIZE = 3; + var toLoad = players.slice(0); + var loading = []; + var results = []; + + var townHallContainerTemplate = $("#town-hall-container-template").html(); + Mustache.parse(townHallContainerTemplate, ['[[', ']]']); + var resultsContainer = $("#results"); + var problemsContainer = $("#problems"); + var loadingContainer = $("#loading"); + + var addPermanentError = function(player, message) { + results.push({ player: player, error: message }); + loading = _.reject(loading, _.matcher(player)); + loadNext(); + }; + + var addTemporaryError = function(player, message, numAttempts) { + results.push({ player: player, error: message + ", trying again shortly", numAttempts: numAttempts }); + loading = _.reject(loading, _.matcher(player)); + toLoad.push(player); + loadNext(); + }; + + var addResult = function(player, report) { + results.push({ player: player, report: report }); + loading = _.reject(loading, _.matcher(player)); + loadNext(); + }; + + var performLoadPlayer = function(player, attemptNum) { + loading.push(player); + jQuery.getJSON(player.analysisSummaryUrl) + .done(function (report) { + addResult(player, report); + }) + .fail(function (response) { + if (response.status == 404 || response.status == 400) { + addPermanentError(player, response.responseJSON); + return; + } + + if (response.status == 503) { + addTemporaryError(player, "Game Servers connection not available", attemptNum); + return; + } + + addTemporaryError(player, 'Unknown error encountered', attemptNum); + }); + }; + + var loadPlayer = function(player, attemptNum) { + var timeout = Math.pow(attemptNum - 1, 1.5) * 1000; + if (timeout == 0) { + performLoadPlayer(player, 1); + return; + } + + console.log("Loading", player.ign, "with timeout " + timeout); + setTimeout(_.partial(performLoadPlayer, player, attemptNum), timeout); + }; + + var loadNext = function() { + while (toLoad.length > 0 && loading.length < LOAD_BATCH_SIZE) { + var next = _.head(toLoad); + toLoad = _.tail(toLoad); + + var attemptNum = 1; + var report = _.find(results, function(result) { return result.player == next; }); + if (report != null && report.numAttempts) { + attemptNum = report.numAttempts + 1; + } + loadPlayer(next, attemptNum); + } + + render(); + }; + + var renderProblem = function(result) { + problemsContainer.removeClass("hidden").show(); + var problemId = "problem-" + result.player.id; + if (problemsContainer.find("#" + problemId).size() == 0) { + problemsContainer.append( + $("

").attr("id", problemId) + .html(result.player.ign + ": " + result.error) + ); + } + }; + + var ensureTownHallContainerRendered = function(result) { + var townHallContainerId = "town-hall-table-" + result.report.townHallLevel; + var townHallContainer = $("#" + townHallContainerId); + if (townHallContainer.size() == 0) { + townHallContainer = $(Mustache.render(townHallContainerTemplate, { + "containerId": townHallContainerId, + "level": result.report.townHallLevel, + "rules": _.pluck(result.report.resultSummaries, 'shortName') + })); + resultsContainer.append(townHallContainer); + + new Clipboard(townHallContainer.find("[data-clipboard-target]").get(0)); + } + return townHallContainer; + }; + + var createResultRow = function(rowId, result, anyError) { + var ruleOrder = _.map( + resultsContainer.find("table thead th.result-col"), + function(col) { return $(col).data("rule"); } + ); + + return $("").attr("id", rowId) + .addClass(anyError ? 'danger' : '') + .append($("").append(result.player.ign)) + .append($("").append($("").attr("href", result.player.analysisUrl).attr("target", "_blank").html('Go to result'))) + .append( + _.map( + _.sortBy(result.report.resultSummaries, function(summary) { return ruleOrder.indexOf(summary.shortName); }), + function(summary) { + return $("").append(summary.success ? '' : $('').addClass('glyphicon glyphicon-remove-sign')); + } + ) + ) + .append($("").append(" " + result.report.connectionTime + " | " + result.report.analysisTime)); + }; + + var render = function() { + // Loading + if (loading.length == 0) { + loadingContainer.hide(); + } else { + loadingContainer.show(); + loadingContainer.find(".loading-names").html(_.pluck(loading, 'ign').join(", ")); + if (toLoad.length > 0) { + loadingContainer.find(".queued-button").show(); + loadingContainer.find(".queued-count").html(toLoad.length); + loadingContainer.find(".queued-names").html(_.pluck(toLoad, 'ign').join(', ')); + } else { + loadingContainer.find(".queued-button").hide(); + } + } + + // Table Results + _.each( + results, + function(result) { + var rowId = "player-row-" + result.player.id; + if ($("#" + rowId).size() > 0) { + return; + } + + if (result.report == null) { + renderProblem(result); + return; + } + + var townHallContainer = ensureTownHallContainerRendered(result); + + var anyError = _.some(result.report.resultSummaries, function(summary) { return !summary.success; }); + createResultRow(rowId, result, anyError) + .appendTo(townHallContainer.find("tbody")) + .slideDown(); + + if (anyError) { + townHallContainer.find(".plain-text-summary") + .find("textarea") + .append(result.player.ign + ": " + _.pluck(result.report.resultSummaries, 'shortName').join(', ') + "\n"); + } + } + ); + }; + + loadNext(); +}); \ No newline at end of file diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRuleSpec.scala new file mode 100644 index 0000000..faa52b5 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/AirSnipedDefenseRuleSpec.scala @@ -0,0 +1,39 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.{AirDefense, AirSweeper, Cannon} +import org.danielholmes.coc.baseanalyser.model.trash.BuilderHut +import org.danielholmes.coc.baseanalyser.model.troops.{Minion, MinionAttackPosition} +import org.scalatest._ + +class AirSnipedDefenseRuleSpec extends FlatSpec with Matchers { + val rule = new AirSnipedDefenseRule + + "AirSnipedDefenseRule" should "return no violation for base without defenses" in { + rule.analyse(Village.empty).success should be (true) + } + + it should "return sniped ground when no air def" in { + val cannon = Cannon(1, Tile.MapOrigin) + val result = rule.analyse(Village(Set(cannon))).asInstanceOf[AirSnipedDefenseRuleResult] + result.success should be (false) + result.snipedDefenses.size should be (1) + result.snipedDefenses.map(_.targeting) should be (Set(cannon)) + } + + it should "return no sniped ground when air def" in { + val airDef = AirDefense(1, Tile(6, 6)) + rule.analyse(Village(Set(Cannon(1, Tile.MapOrigin), airDef))) should be (AirSnipedDefenseRuleResult( + Set.empty, + Set(airDef) + )) + } + + it should "return no sniped ground when air sweeper" in { + val airSweeper = AirSweeper(1, Tile(10, 10), Angle.Quarter * 7) + rule.analyse(Village(Set(BuilderHut(Tile(4, 4)), airSweeper))) should be (AirSnipedDefenseRuleResult( + Set.empty, + Set(airSweeper) + )) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRuleSpec.scala new file mode 100644 index 0000000..2caae44 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/ArcherAnchorRuleSpec.scala @@ -0,0 +1,55 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.{AirDefense, ArcherTower, Cannon} +import org.danielholmes.coc.baseanalyser.model.trash.BuilderHut +import org.scalatest._ + +class ArcherAnchorRuleSpec extends FlatSpec with Matchers { + val rule = new ArcherAnchorRule + + "ArcherAnchorRule" should "return no violation for base without element" in { + rule.analyse(Village.empty).success should be (true) + } + + it should "return violation for base with element and no defenses" in { + rule.analyse(Village(Set(BuilderHut(Tile.MapOrigin)))).success should be (false) + } + + it should "return success for base with element covered by ground shooting" in { + val village = Village( + Set( + BuilderHut(Tile(5, 5)), + ArcherTower(1, Tile(7, 7)) + ) + ) + rule.analyse(village).success should be (true) + } + + it should "return fail for base with element covered by air shooting" in { + val village = Village( + Set( + BuilderHut(Tile(5, 5)), + AirDefense(1, Tile(7, 7)) + ) + ) + rule.analyse(village).success should be (false) + } + + it should "return success for base with wall not covered by ground shooting" in { + val village = Village( + Set( + Wall(1, Tile(5, 5)), + ArcherTower(1, Tile(30, 30)) + ) + ) + rule.analyse(village).success should be (true) + } + + it should "return defenses that can hit archer" in { + val at = ArcherTower(1, Tile(30, 30)) + val cannon = Cannon(1, Tile(36, 36)) + val village = Village(Set(at, AirDefense(1, Tile(33, 33)), cannon)) + rule.analyse(village).asInstanceOf[ArcherAnchorRuleResult].aimingDefenses should be (Set(at, cannon)) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRuleSpec.scala new file mode 100644 index 0000000..207834c --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/BKSwappableRuleSpec.scala @@ -0,0 +1,97 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.heroes.BarbarianKingAltar +import org.danielholmes.coc.baseanalyser.model.trash.{ArmyCamp, Barrack} +import org.danielholmes.coc.baseanalyser.stringdisplay.StringDisplayer +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalatest._ + +class BKSwappableRuleSpec extends FlatSpec with Matchers { + val rule = new BKSwappableRule + + "BKSwappableRule" should "return success for empty village" in { + rule.analyse(Village.empty) should be (BKSwappableRuleResult(Set.empty)) + } + + it should "return fail for BK on his own" in { + rule.analyse(Village(Set(BarbarianKingAltar(1, Tile(1, 1))))).success should be (false) + } + + it should "return success for deep walled BK" in { + val elements = + ElementsBuilder.elementFence(Tile(9, 9), 27, 27) ++ + ElementsBuilder.repeatX(Tile(10, 10), 5, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(10, 15), 5, 5, ArmyCamp(1, _)) ++ + Set[Element]( + ArmyCamp(1, Tile(10, 20)), ArmyCamp(1, Tile(15, 20)), BarbarianKingAltar(1, Tile(21, 21)), ArmyCamp(1, Tile(25, 20)), ArmyCamp(1, Tile(30, 20)) + ) ++ + ElementsBuilder.repeatX(Tile(10, 25), 5, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(10, 30), 5, 5, ArmyCamp(1, _)) + rule.analyse(Village(elements)).success should be (true) + } + + it should "return fail for exposed BK" in { + val elements = + ElementsBuilder.elementFence(Tile(9, 9), 27, 27) ++ + ElementsBuilder.repeatX(Tile(10, 10), 5, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(10, 15), 5, 5, ArmyCamp(1, _)) ++ + Set[Element]( + ArmyCamp(1, Tile(10, 20)), ArmyCamp(1, Tile(15, 20)), ArmyCamp(1, Tile(20, 20)), Barrack(1, Tile(26, 21)), + BarbarianKingAltar(1, Tile(29, 21)), Barrack(1, Tile(32, 21)) + ) ++ + ElementsBuilder.repeatX(Tile(10, 25), 5, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(10, 30), 5, 5, ArmyCamp(1, _)) + + val result = rule.analyse(Village(elements)) + result.success should be (false) + } + + it should "return success for very deep non-walled BK" in { + val elements = + ElementsBuilder.repeatX(Tile(5, 5), 7, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(5, 10), 7, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(5, 15), 7, 5, ArmyCamp(1, _)) ++ + Set[Element]( + ArmyCamp(1, Tile(5, 20)), ArmyCamp(1, Tile(10, 20)), ArmyCamp(1, Tile(15, 20)), + BarbarianKingAltar(1, Tile(21, 21)), + ArmyCamp(1, Tile(25, 20)), ArmyCamp(1, Tile(30, 20)), ArmyCamp(1, Tile(35, 20)) + ) ++ + ElementsBuilder.repeatX(Tile(5, 25), 7, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(5, 30), 7, 5, ArmyCamp(1, _)) ++ + ElementsBuilder.repeatX(Tile(5, 35), 7, 5, ArmyCamp(1, _)) + val result = rule.analyse(Village(elements)) + result.success should be (true) + } + + it should "return success for only slightly exposed BK" in { + val elements = + ElementsBuilder.elementFence(Tile(4, 4), 15, 15) ++ + ElementsBuilder.repeatX(Tile(6, 6), 3, 4, Barrack(1, _)) ++ + Set[Element]( + Barrack(1, Tile(6, 10)), + BarbarianKingAltar(1, Tile(10, 10)), + Barrack(1, Tile(14, 10)) + ) ++ + ElementsBuilder.repeatX(Tile(6, 14), 3, 4, Barrack(1, _)) + val result = rule.analyse(Village(elements)) + result.success should be (true) + } + + it should "return correct exposed tiles for offset BK" in { + val elements = + ElementsBuilder.elementFence(Tile(4, 4), 14, 15) ++ + ElementsBuilder.repeatX(Tile(6, 6), 3, 4, Barrack(1, _)) ++ + Set[Element]( + Barrack(1, Tile(6, 10)), + BarbarianKingAltar(1, Tile(10, 10)), + Barrack(1, Tile(14, 10)) + ) ++ + ElementsBuilder.repeatX(Tile(6, 14), 3, 4, Barrack(1, _)) + + val result = rule.analyse(Village(elements)) + result.success should be (false) + result.asInstanceOf[BKSwappableRuleResult].exposedTiles should contain (Tile(18, 11)) + result.asInstanceOf[BKSwappableRuleResult].exposedTiles should not contain (Tile(3, 11)) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRuleSpec.scala new file mode 100644 index 0000000..042d211 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/EnoughPossibleTrapLocationsRuleSpec.scala @@ -0,0 +1,95 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.HiddenTesla +import org.danielholmes.coc.baseanalyser.model.traps.GiantBomb +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalactic.anyvals.{PosZDouble, PosZInt} +import org.scalatest._ + +class EnoughPossibleTrapLocationsRuleSpec extends FlatSpec with Matchers { + val rule = new EnoughPossibleTrapLocationsRule + + "EnoughPossibleTrapLocationsRule" should "return violation for base without wall compartments" in { + rule.analyse(Village.empty).success should be (false) + } + + it should "return no violation for base with large wall compartments" in { + val walls = ElementsBuilder.elementFence(Tile.MapOrigin, 40, 40) + rule.analyse(Village(walls)).success should be (true) + } + + it should "return violation if only 20 possibilities" in { + val walls = Range.inclusive(1, 4) + .flatMap(row => + Range.inclusive(1, 5) + .map(col => Tile(PosZInt.from(col * 4).get, PosZInt.from(row * 4).get)) + .flatMap(ElementsBuilder.elementFence(_, 4, 4)) + ) + .toSet + val village = Village(walls) + assert(village.possibleInternalLargeTraps.size == 20) + + rule.analyse(village).success should be (false) + } + + it should "return no violation if 24 possibilities" in { + val elements = create24CompartmentsHolding(t => None) + val village = Village(elements) + assert(village.possibleInternalLargeTraps.size == 24) + + rule.analyse(village).success should be (true) + } + + it should "return no violation if 24 possibilities with real Teslas" in { + val elements = create24CompartmentsHolding(t => Some(HiddenTesla(1, t))) + val village = Village(elements) + assert(village.possibleInternalLargeTraps.size == 24) + + rule.analyse(village).success should be (true) + } + + it should "return no violation if 24 possibilities with real Giant Bomb" in { + val elements = create24CompartmentsHolding(t => Some(GiantBomb(1, t))) + val village = Village(elements) + assert(village.possibleInternalLargeTraps.size == 24) + + rule.analyse(village).success should be (true) + } + + it should "return violation if 24 possibilities with Decoration" in { + val elements = create24CompartmentsHolding(t => Some(Decoration(t))) + val village = Village(elements) + assert(village.possibleInternalLargeTraps.isEmpty) + + rule.analyse(village).success should be (false) + } + + it should "allocate an equal score for 2 separate 2x2s as 1 3x3" in { + val villageSeparate2x2 = Village(ElementsBuilder.elementFence(Tile(10, 10), 4, 4) ++ ElementsBuilder.wallFence(Tile(15, 15), 4, 4)) + val village3x3 = Village(ElementsBuilder.elementFence(Tile(10, 10), 5, 5)) + + rule.calculateScore(village3x3) should be (rule.calculateScore(villageSeparate2x2)) + } + + it should "give a higher score for 2 separate 2x2s then 1 3x2" in { + val villageSeparate2x2 = Village(ElementsBuilder.elementFence(Tile(10, 10), 4, 4) ++ ElementsBuilder.wallFence(Tile(15, 15), 4, 4)) + val village3x2 = Village(ElementsBuilder.elementFence(Tile(10, 10), 5, 4)) + + rule.calculateScore(village3x2) should be < rule.calculateScore(villageSeparate2x2) + } + + it should "single trap should score 1.0" in { + rule.calculateScore(Village(ElementsBuilder.elementFence(Tile(10, 10), 4, 4))) should be (PosZDouble(1.0)) + } + + private def create24CompartmentsHolding(factory: Tile => Option[Element]): Set[Element] = { + Range.inclusive(1, 4) + .flatMap(row => + Range.inclusive(1, 6) + .map(col => Tile(PosZInt.from(col * 4).get, PosZInt.from(row * 4).get)) + .flatMap(t => ElementsBuilder.elementFence(t, 4, 4) ++ factory.apply(t.offset(1, 1))) + ) + .toSet + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRuleSpec.scala new file mode 100644 index 0000000..03372f8 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HighHPUnderAirDefRuleSpec.scala @@ -0,0 +1,43 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.AirDefense +import org.danielholmes.coc.baseanalyser.model.trash.GoldStorage +import org.scalatest._ + +class HighHPUnderAirDefRuleSpec extends FlatSpec with Matchers { + val rule = new HighHPUnderAirDefRule + + "HighHPUnderAirDefRule" should "return no violation for base without air def" in { + rule.analyse(Village.empty).success should be (true) + } + + it should "return pass for base with air def and no storages" in { + rule.analyse(Village(Set(AirDefense(1, Tile.MapOrigin)))).success should be (true) + } + + it should "return fail for base with air def and storage outside" in { + val storage = GoldStorage(1, Tile(30, 30)) + rule.analyse(Village(Set(AirDefense(1, Tile.MapOrigin), storage))) should be (HighHPUnderAirDefRuleResult(Set(storage), Set.empty)) + } + + it should "return fail for base with air def cutting storage" in { + val storageOutside = GoldStorage(1, Tile(7, 11)) + val storageInside = GoldStorage(1, Tile(7, 5)) + rule.analyse(Village(Set(AirDefense(1, Tile.MapOrigin), storageOutside, storageInside))) should be + HighHPUnderAirDefRuleResult(Set(storageOutside), Set(storageInside)) + } + + it should "return true for base with air def just covering storage" in { + rule.analyse(Village(Set(AirDefense(1, Tile.MapOrigin), GoldStorage(1, Tile(5, 7))))).success should be (true) + } + + it should "return success for base with storage requiring 2 air defs for full coverage" in { + val village = Village(Set( + AirDefense(1, Tile(5, 5)), + GoldStorage(1, Tile(14, 5)), + AirDefense(1, Tile(23, 5)) + )) + rule.analyse(village).success should be (true) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRuleSpec.scala new file mode 100644 index 0000000..fb9c5dc --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/HogCCLureRuleSpec.scala @@ -0,0 +1,31 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.special.ClanCastle +import org.danielholmes.coc.baseanalyser.model.trash.Barrack +import org.danielholmes.coc.baseanalyser.model.troops.HogRider +import org.scalatest._ + +class HogCCLureRuleSpec extends FlatSpec with Matchers { + val rule = new HogCCLureRule + + "HogCCLureRule" should "return no violation for base without CC" in { + rule.analyse(Village.empty).success should be (true) + } + + it should "return violation for base with CC and no blocking" in { + rule.analyse(Village(Set(ClanCastle(1, Tile.MapOrigin)))).success should be (false) + } + + it should "return success for base with paths blocked off" in { + val ccPosition = Tile(20, 20) + val cc = ClanCastle(1, ccPosition) + val village = Village( + Set(cc) ++ + Tile(2, 2).matrixOfTilesTo(Tile(41, 41), 3) + .filter(_ != ccPosition) + .map(Barrack(1, _)) + ) + rule.analyse(village).success should be (true) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRuleSpec.scala new file mode 100644 index 0000000..235caa3 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/MinimumCompartmentsRuleSpec.scala @@ -0,0 +1,37 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.trash.BuilderHut +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalactic.anyvals.{PosInt, PosZInt} +import org.scalatest._ + +class MinimumCompartmentsRuleSpec extends FlatSpec with Matchers { + val rule = new MinimumCompartmentsRule + + "MinimumCompartmentsRule" should "return violation for empty village" in { + rule.analyse(Village.empty) should be (MinimumCompartmentsRuleResult(8, Set.empty)) + } + + it should "return violation for 1 compartment" in { + rule.analyse(Village(ElementsBuilder.elementFence(Tile(1, 1), 3, 3))) should be + (MinimumCompartmentsRuleResult(8, Set.empty)) + } + + it should "return no violation for 8 compartments" in { + val elements = Range(0, 8) + .map(x => PosZInt.from(x * 4).get) + .map(Tile.MapOrigin.offset(_, 1)) + .flatMap(t => ElementsBuilder.elementFence(t, 4, 4) + BuilderHut(t.offset(1, 1))) + .toSet + rule.analyse(Village(elements)).success should be (true) + } + + it should "return violation for 8 empty compartments" in { + val elements = Range.inclusive(1, 22, 3) + .map(PosInt.from(_).get) + .flatMap(x => ElementsBuilder.elementFence(Tile(x, 1), 3, 3)) + .toSet + rule.analyse(Village(elements)).success should be (false) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRuleSpec.scala new file mode 100644 index 0000000..19cbeb2 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWalkedAirDefenseRuleSpec.scala @@ -0,0 +1,45 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.AirDefense +import org.danielholmes.coc.baseanalyser.model.trash.Barrack +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalatest._ + +class QueenWalkedAirDefenseRuleSpec extends FlatSpec with Matchers { + val rule = new QueenWalkedAirDefenseRule + + "QueenWalkedAirDefenseRuleSpec" should "return no violation for empty village" in { + rule.analyse(Village.empty).success should be (true) + } + + it should "return violation for non-walled air defense" in { + val ad = AirDefense(1, Tile(1, 1)) + val result = rule.analyse(Village(Set(ad))).asInstanceOf[QueenWalkedAirDefenseRuleResult] + result.success should be (false) + result.attackings.head.targeting should be (ad) + result.nonReachableAirDefs should be (empty) + } + + it should "return success for deep-walled air defense" in { + val ad = AirDefense(1, Tile(15, 15)) + val elements: Set[Element] = ElementsBuilder.elementFence(Tile(10, 10), 13, 13) ++ + ElementsBuilder.rectangle(Tile(12, 12), 3, 3, 3, Barrack(1, _)) ++ + Set(ad) + val result = rule.analyse(Village(elements)).asInstanceOf[QueenWalkedAirDefenseRuleResult] + result.success should be (true) + result.attackings should be (empty) + result.nonReachableAirDefs should contain (ad) + } + + it should "return fail for shallow-walled air defense" in { + val ad = AirDefense(1, Tile(15, 15)) + val elements: Set[Element] = ElementsBuilder.elementFence(Tile(11, 11), 11, 11) ++ + ElementsBuilder.rectangle(Tile(12, 12), 3, 3, 3, Barrack(1, _)) ++ + Set(ad) + val result = rule.analyse(Village(elements)).asInstanceOf[QueenWalkedAirDefenseRuleResult] + result.success should be (false) + result.attackings.head.targeting should be (ad) + result.nonReachableAirDefs should be (empty) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRuleSpec.scala new file mode 100644 index 0000000..0db2bdc --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/QueenWontLeaveCompartmentRuleSpec.scala @@ -0,0 +1,36 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.heroes.ArcherQueenAltar +import org.danielholmes.coc.baseanalyser.stringdisplay.StringDisplayer +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalatest._ + +class QueenWontLeaveCompartmentRuleSpec extends FlatSpec with Matchers { + val rule = new QueenWontLeaveCompartmentRule + + "QueenWontLeaveCompartmentRule" should "return no violation for base without element" in { + rule.analyse(Village.empty).success should be (true) + } + + it should "return no violation for base with walls but without queen" in { + val walls = ElementsBuilder.elementFence(Tile(10, 10), 5, 5) + rule.analyse(Village(walls)).success should be (true) + } + + it should "return violation for base with queen but no compartments" in { + rule.analyse(Village(Set(ArcherQueenAltar(1, Tile(1, 1))))).success should be (false) + } + + it should "return no violation for base with queen inside 9x9" in { + val aq = ArcherQueenAltar(1, Tile(13, 13)) + val walls = ElementsBuilder.elementFence(Tile(9, 9), 11, 11) + rule.analyse(Village(walls + aq)).success should be (true) + } + + it should "return violation for base with queen inside 7x7" in { + val aq = ArcherQueenAltar(1, Tile(13, 13)) + val walls = ElementsBuilder.elementFence(Tile(10, 10), 9, 9) + rule.analyse(Village(walls + aq)).success should be (false) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionsRuleSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionsRuleSpec.scala new file mode 100644 index 0000000..57ea8fe --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/analysis/WizardTowersOutOfHoundPositionsRuleSpec.scala @@ -0,0 +1,64 @@ +package org.danielholmes.coc.baseanalyser.analysis + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.{AirDefense, WizardTower} +import org.danielholmes.coc.baseanalyser.model.troops.WizardTowerHoundTargeting +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalatest._ + +class WizardTowersOutOfHoundPositionsRuleSpec extends FlatSpec with Matchers { + val rule = new WizardTowersOutOfHoundPositionsRule + + "WizardTowersOutOfHoundPositionsRule" should "return success for no air defs" in { + val wt = WizardTower(1, Tile(1, 1)) + val result = rule.analyse(Village(Set(wt))) + result.success should be (true) + result should be (WizardTowersOutOfHoundPositionsRuleResult(Set(wt), Set.empty)) + } + + it should "return success for no wiz towers" in { + val ad = AirDefense(1, Tile(1, 1)) + val result = rule.analyse(Village(Set(ad))) + result.success should be (true) + result should be (WizardTowersOutOfHoundPositionsRuleResult(Set.empty, Set.empty)) + } + + it should "return fail for wt in range of air def" in { + val wt = WizardTower(1, Tile(4, 4)) + val ad = AirDefense(1, Tile(1, 1)) + val result = rule.analyse(Village(Set(ad, wt))) + result.success should be (false) + result should be (WizardTowersOutOfHoundPositionsRuleResult(Set.empty, Set(WizardTowerHoundTargeting(wt, ad, ad.block.contractBy(1))))) + } + + it should "return succeed for wt out of range of air def" in { + val wt = WizardTower(1, Tile(20, 4)) + val ad = AirDefense(1, Tile(1, 1)) + val result = rule.analyse(Village(Set(ad, wt))) + result.success should be (true) + result should be (WizardTowersOutOfHoundPositionsRuleResult(Set(wt), Set.empty)) + } + + it should "return success for half wts in range of air def" in { + val wtInRange = WizardTower(1, Tile(4, 4)) + val wtOutRange = WizardTower(1, Tile(35, 35)) + val ad = AirDefense(1, Tile(1, 1)) + val result = rule.analyse(Village(Set(ad, wtInRange, wtOutRange))) + result.success should be (true) + result should be (WizardTowersOutOfHoundPositionsRuleResult(Set(wtOutRange), Set(WizardTowerHoundTargeting(wtInRange, ad, ad.block.contractBy(1))))) + } + + it should "count a WT in range of 2 air defs only once" in { + val wtInRange = WizardTower(1, Tile(4, 4)) + val wtOutRange = WizardTower(1, Tile(35, 35)) + val ad1 = AirDefense(1, Tile(1, 1)) + val ad2 = AirDefense(1, Tile(1, 4)) + val result = rule.analyse(Village(Set(ad1, ad2, wtInRange, wtOutRange))) + result.success should be (true) + result should be (WizardTowersOutOfHoundPositionsRuleResult( + Set(wtOutRange), + Set(WizardTowerHoundTargeting(wtInRange, ad1, ad1.block.contractBy(1)), + WizardTowerHoundTargeting(wtInRange, ad2, ad2.block.contractBy(1)))) + ) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactorySpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactorySpec.scala new file mode 100644 index 0000000..c654937 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/HardCodedElementFactorySpec.scala @@ -0,0 +1,36 @@ +package org.danielholmes.coc.baseanalyser.baseparser + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.{AirSweeper, Cannon} +import org.danielholmes.coc.baseanalyser.model.special.TownHall +import org.scalatest._ + +class HardCodedElementFactorySpec extends FlatSpec with Matchers { + val factory = new HardCodedElementFactory + + "Hardcoded Building Factory" should "reject unknown code" in { + a[RuntimeException] should be thrownBy { + factory.build(RawElement(-1, 9, 1, 2)) + } + } + + it should "create town hall" in { + factory.build(RawElement(1000001, 9, 3, 3)) should contain (TownHall(10, Tile(3, 3))) + } + + it should "create construction buildings as level 1" in { + factory.build(RawElement(1000008, -1, 3, 4)) should contain (Cannon(1, Tile(3, 4))) + } + + it should "ignore obstacles" in { + factory.build(RawElement(8000000, 9, 5, 6)) should be (None) + } + + it should "ignore decorations" in { + factory.build(RawElement(18000000, 9, 5, 6)) should be (None) + } + + it should "parse correct air sweeper" in { + factory.build(RawElement(1000028, 4, 5, 6, Some(45))) should contain (AirSweeper(5, Tile(5, 6), Angle.degrees(45))) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParserSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParserSpec.scala new file mode 100644 index 0000000..2358ca2 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/baseparser/VillageJsonParserSpec.scala @@ -0,0 +1,82 @@ +package org.danielholmes.coc.baseanalyser.baseparser + +import org.danielholmes.coc.baseanalyser.model._ +import org.scalatest._ +import org.scalactic.anyvals.{PosInt, PosZInt} + +class VillageJsonParserSpec extends FlatSpec with Matchers { + val buildingFactory = StubElementFactory + + val parser = new VillageJsonParser(buildingFactory) + + "A Village JSON Parser" should "throw an exception if invalid json provided" in { + a[InvalidJsonException] should be thrownBy { + parser.parse("something random[ {") + } + } + + it should "return empty village is empty input" in { + val villages = parser.parse("""{"war_base": false, "buildings":[]}""") + + villages should be (Villages(Village.empty, None)) + } + + it should "return simple village" in { + val result = parser.parse("""{"exp_ver":1, "war_base": false, "buildings":[{ "data": 1000001, "lvl": 1, "x": 21, "y": 20 }]}""") + + result should be (Villages(Village(Set(StubBaseElement(1, Tile(21, 20), None))), None)) + } + + it should "return village without ignored elements" in { + val result = parser.parse("""{"exp_ver":1, "war_base": false, "buildings":[{ "data": 999999, "lvl": 1, "x": 21, "y": 20 }]}""") + + result should be (Villages(Village.empty, None)) + } + + it should "return war village" in { + val result = parser.parse( + """{"exp_ver":1, "war_layout": 4,"war_base": true, + |"buildings":[{ "data": 1000001, "lvl": 1, "x": 20, "y": 20, "l4x": 30, "l4y": 30 }]}""".stripMargin) + + result should be (Villages( + Village(Set(StubBaseElement(1, Tile(20, 20), None))), + Some(Village(Set(StubBaseElement(1, Tile(30, 30), None)))) + )) + } + + it should "return war element aim angle" in { + val result = parser.parse( + """{"exp_ver":1, "war_layout": 4,"war_base": true, + |"buildings":[{ "data": 1000029, "lvl": 1, "x": 20, "y": 20, "l4x": 30, "l4y": 30, "aim_angle": 90, "aim_angle_war": 45 }]}""".stripMargin) + + result should be (Villages( + Village(Set(StubBaseElement(1, Tile(20, 20), Some(90)))), + Some(Village(Set(StubBaseElement(1, Tile(30, 30), Some(45))))) + )) + } + + it should "return war village without not yet placed buildings" in { + val result = parser.parse( + """{"exp_ver":1, "war_layout": 4,"war_base": true, + |"buildings":[ + |{ "data": 1000001, "lvl": 1, "x": 20, "y": 20, "l4x": 30, "l4y": 30 }, + |{ "data": 1000001, "lvl": 2, "x": 40, "y": 40 }]}""".stripMargin) + + result should be (Villages( + Village(Set(StubBaseElement(1, Tile(20, 20), None), StubBaseElement(2, Tile(40, 40), None))), + Some(Village(Set(StubBaseElement(1, Tile(30, 30), None)))) + )) + } +} + +object StubElementFactory extends ElementFactory { + def build(raw: RawElement): Option[Element] = { + Some(raw) + .filter(_.data != 999999) + .map(r => StubBaseElement(PosInt.from(r.lvl).get, Tile(PosZInt.from(r.x).get, PosZInt.from(r.y).get), raw.aimAngle)) + } +} + +case class StubBaseElement(level: PosInt, tile: Tile, aimAngle: Option[Int]) extends Element { + val size = PosInt(3) +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerAkkaServiceAgentSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerAkkaServiceAgentSpec.scala new file mode 100644 index 0000000..f39e3c8 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/gameconnection/ClanSeekerAkkaServiceAgentSpec.scala @@ -0,0 +1,20 @@ +package org.danielholmes.coc.baseanalyser.gameconnection + +import org.scalatest._ + +// Specs ignored at the moment because clan seeker not running +class ClanSeekerAkkaServiceAgentSpec extends FlatSpec with Matchers { + val client = new ClanSeekerGameConnection + + /* "Clan Seeker Service Client" */ ignore should "get clan details for OH alpha" in { + client.getClanDetails(154621406673L).get.name should be ("OneHive Alpha") + } + + ignore should "get player village for Dakota" in { + client.getPlayerVillage(223343461050L).get.village.raw.isEmpty should be (false) + } + + ignore should "get empty for non-existent" in { + client.getPlayerVillage(999999999999999L) should be (empty) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/BlockSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/BlockSpec.scala new file mode 100644 index 0000000..85ebb22 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/BlockSpec.scala @@ -0,0 +1,79 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalatest._ + +class BlockSpec extends FlatSpec with Matchers { + val block = Block(Tile(5, 5), 3) + + "Block" should "find closest coordinate in x axis left" in { + block.findClosestCoordinate(TileCoordinate(0, 5)) should be (TileCoordinate(5, 5)) + } + + it should "find closest coordinate in x axis right" in { + block.findClosestCoordinate(TileCoordinate(10, 5)) should be (TileCoordinate(8, 5)) + } + + it should "find closest coordinate in y axis up" in { + block.findClosestCoordinate(TileCoordinate(5, 0)) should be (TileCoordinate(5, 5)) + } + + it should "find closest coordinate in y axis down" in { + block.findClosestCoordinate(TileCoordinate(5, 10)) should be (TileCoordinate(5, 8)) + } + + it should "find closest coordinate diagonally" in { + block.findClosestCoordinate(TileCoordinate(10, 10)) should be (TileCoordinate(8, 8)) + } + + it should "return empty internal coords when 1x1" in { + Block(Tile(0, 0), 1).internalCoordinates should be (Set.empty) + } + + it should "return empty internal coords when 2x2" in { + Block(Tile(0, 0), 2).internalCoordinates should contain theSameElementsAs Set(TileCoordinate(1, 1)) + } + + it should "return correct internal coords when 3x3 or more" in { + Block(Tile(0, 0), 3).internalCoordinates should contain theSameElementsAs + Set(TileCoordinate(1, 1), TileCoordinate(2, 1), TileCoordinate(1, 2), TileCoordinate(2, 2)) + } + + it should "return true intersect for overlapping items" in { + Block(Tile.Origin, 2).intersects(Block(Tile(1, 1), 2)) should be (true) + } + + it should "return false any intersect for no items" in { + Block.firstIntersecting(Set.empty) should be (empty) + } + + it should "return false any intersect for one item" in { + Block.firstIntersecting(Set(Block(Tile.Origin, 2))) should be (empty) + } + + it should "return false any intersect for edge touching items" in { + Block.firstIntersecting(Set(Block(Tile.Origin, 2), Block(Tile(0, 2), 2))) should be (empty) + } + + it should "return true any intersect for overlapping items" in { + val b1 = Block(Tile.Origin, 2) + val b2 = Block(Tile(1, 1), 2) + Block.firstIntersecting(Set(b1, b2)).get should be ((b2, b1)) + } + + it should "return correct all tiles" in { + Block(Tile.Origin, 2).tiles should contain theSameElementsAs Set(Tile.Origin, Tile(0, 1), Tile(1, 0), Tile(1, 1)) + } + + it should "return correct all coordinates" in { + Block(Tile.Origin, 2).allCoordinates should contain theSameElementsAs + Set( + TileCoordinate(0, 0), TileCoordinate(1, 0), TileCoordinate(2, 0), + TileCoordinate(0, 1), TileCoordinate(1, 1), TileCoordinate(2, 1), + TileCoordinate(0, 2), TileCoordinate(1, 2), TileCoordinate(2, 2) + ) + } + + it should "expand to size correctly" in { + Block(Tile(1, 1), 2).expandToSize(4) should be (Block(Tile(0, 0), 4)) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/HogTargetingSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/HogTargetingSpec.scala new file mode 100644 index 0000000..460b5c4 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/HogTargetingSpec.scala @@ -0,0 +1,28 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.danielholmes.coc.baseanalyser.model.range.CircularElementRange +import org.danielholmes.coc.baseanalyser.model.trash.BuilderHut +import org.danielholmes.coc.baseanalyser.model.troops.HogTargeting +import org.scalatest._ + +class HogTargetingSpec extends FlatSpec with Matchers { + "HogTargeting" should "return correct cutting result for non-cutting" in { + HogTargeting(TileCoordinate(0, 0), BuilderHut(Tile(10, 0))) + .cutsRadius(CircularElementRange(FloatMapCoordinate(5, 5), 1)) shouldBe false + } + + it should "return correct cutting result for just cutting" in { + HogTargeting(TileCoordinate(0, 0), BuilderHut(Tile(10, 0))) + .cutsRadius(CircularElementRange(FloatMapCoordinate(5, 2), 2)) shouldBe false + } + + it should "return correct cutting result for middle cutting" in { + HogTargeting(TileCoordinate(0, 0), BuilderHut(Tile(10, 0))) + .cutsRadius(CircularElementRange(FloatMapCoordinate(5, 1), 2)) shouldBe true + } + + it should "return correct cutting result for random" in { + HogTargeting(TileCoordinate(0, 0), BuilderHut(Tile(0, 5))) + .cutsRadius(CircularElementRange(FloatMapCoordinate(0, 10), 1)) shouldBe false + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinateSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinateSpec.scala new file mode 100644 index 0000000..045de4c --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/TileCoordinateSpec.scala @@ -0,0 +1,16 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalatest._ +import org.scalactic.anyvals.PosZDouble + +class TileCoordinateSpec extends FlatSpec with Matchers { + val coord = TileCoordinate(5, 5) + + "Tile Coordinate" should "find correct x axis right distance" in { + coord.distanceTo(TileCoordinate(10, 5)) should be (PosZDouble(5)) + } + + it should "find correct diagonal distance" in { + coord.distanceTo(TileCoordinate(8, 9)) should be (PosZDouble(5)) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/TileSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/TileSpec.scala new file mode 100644 index 0000000..d888bbc --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/TileSpec.scala @@ -0,0 +1,55 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.scalatest._ +import org.scalactic.anyvals.{PosZInt, PosZDouble} + +class TileSpec extends FlatSpec with Matchers { + "Tile" should "return correct matrix of tiles" in { + Tile(2, 2).matrixOfTilesInDirection(2, 2) should contain theSameElementsAs + Set(Tile(2, 2), Tile(2, 3), Tile(3, 2), Tile(3, 3)) + } + + it should "return correct rectangle of tiles" in { + Tile(2, 2).rectangleTo(Tile(4, 4)) should contain theSameElementsAs + Set( + Tile(2, 2), Tile(3, 2), Tile(4, 2), + Tile(2, 3), /*Tile(3, 2),*/ Tile(4, 3), + Tile(2, 4), Tile(3, 4), Tile(4, 4) + ) + } + + it should "return correct neighbours" in { + Tile(1, 1).neighbours should be (Set( + Tile(0, 0), Tile(1, 0), Tile(2, 0), + Tile(0, 1), /*Tile(1, 1),*/ Tile(2, 1), + Tile(0, 2), Tile(1, 2), Tile(2, 2) + )) + } + + it should "return correct neighbours at origin" in { + Tile(0, 0).neighbours should be (Set( + /*Tile(0, 0), */ Tile(1, 0), + Tile(0, 1), Tile(1, 1) + )) + } + + it should "return correct neighbours at end" in { + Tile(Tile.MaxCoordinate, Tile.MaxCoordinate).neighbours should be (Set( + Tile(PosZInt.from(Tile.MaxCoordinate - 1).get, PosZInt.from(Tile.MaxCoordinate - 1).get), + Tile(PosZInt.from(Tile.MaxCoordinate - 1).get, Tile.MaxCoordinate), + Tile(Tile.MaxCoordinate, PosZInt.from(Tile.MaxCoordinate - 1).get) + )) + } + + it should "return correct distance to touching" in { + Tile(1, 0).distanceTo(Tile(2, 0)) should be (PosZDouble(0)) + } + + it should "return correct distance to x difference" in { + Tile(0, 0).distanceTo(Tile(11, 0)) should be (PosZDouble(10)) + } + + it should "return correct distance to diagonal" in { + Tile(10, 10).distanceTo(Tile(6, 5)) should be (PosZDouble(5)) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/VillageSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/VillageSpec.scala new file mode 100644 index 0000000..5113b8a --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/VillageSpec.scala @@ -0,0 +1,85 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.danielholmes.coc.baseanalyser.model.trash.{Barrack, BuilderHut} +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalatest._ + +class VillageSpec extends FlatSpec with Matchers { + "Village" should "return every coordinate when empty" in { + Village.empty.coordinatesAllowedToDropTroop should contain theSameElementsAs TileCoordinate.All + } + + it should "return all with hit areas excluded" in { + val builderPlacement = TileCoordinate(2, 2).matrixOfCoordinatesTo(TileCoordinate(4, 4)) + val expected = TileCoordinate.All.toSet -- builderPlacement + + val village = Village(Set(BuilderHut(Tile(2, 2)))) + val result = village.coordinatesAllowedToDropTroop + result should have size expected.size + result should contain theSameElementsAs expected + } + + it should "return all with hit areas excluded when on edge of map" in { + val builderPlacement = TileCoordinate.MapOrigin.matrixOfCoordinatesTo(TileCoordinate.MapOrigin.offset(2, 2)) + val expected = TileCoordinate.All.toSet -- builderPlacement + + val village = Village(Set(BuilderHut(Tile.MapOrigin))) + val result = village.coordinatesAllowedToDropTroop + result should have size expected.size + result should contain theSameElementsAs expected + } + + it should "disallow overlapping elements" in { + a[IllegalArgumentException] should be thrownBy { + Village( + Set( + Barrack(1, Tile.MapOrigin), + Barrack(1, Tile.MapOrigin.offset(1, 1)) + ) + ) + } + } + + it should "not include intersections of attack placements in coordinates allowed to drop troop" in { + val village = Village(Set(BuilderHut(Tile(1, 1)), BuilderHut(Tile(5, 1)))) + + village.coordinatesAllowedToDropTroop should not contain TileCoordinate(4, 1) + village.coordinatesAllowedToDropTroop should not contain TileCoordinate(4, 2) + village.coordinatesAllowedToDropTroop should not contain TileCoordinate(4, 3) + } + + it should "return no compartments for empty village" in { + Village.empty.wallCompartments should be (empty) + } + + it should "return no compartments for village with walls but no compartments" in { + ElementsBuilder.villageFromString("WWW\nW W\n WW", Tile(1, 1), Wall(1, _)).wallCompartments should be (empty) + } + + it should "return single simple compartment" in { + val walls = ElementsBuilder.wallFence(Tile(5, 5), 3, 3) + Village(walls.map(_.asInstanceOf[Element])).wallCompartments should be (Set(WallCompartment( + walls, Set(Tile(6, 6)), Set.empty + ))) + } + + it should "return single compartment with a building inside" in { + val walls = ElementsBuilder.elementFence(Tile(6, 6), 5, 5) + val barrack = Barrack(1, Tile(7, 7)) + + Village(walls + barrack).wallCompartments should be (Set(WallCompartment( + walls.map(_.asInstanceOf[Wall]), + Tile(7, 7).matrixOfTilesTo(Tile(9, 9)), + Set(barrack) + ))) + } + + it should "return multiple compartments" in { + val walls1 = ElementsBuilder.fromString("WWW\nW W\nWWW", Tile(6, 6), Wall(1, _)) + val walls2 = ElementsBuilder.fromString("WWW\nW W\nWWW", Tile(16, 6), Wall(1, _)) + Village((walls1 ++ walls2).map(_.asInstanceOf[Element])).wallCompartments should be (Set( + WallCompartment(walls1, Set(Tile(7, 7)), Set.empty), + WallCompartment(walls2, Set(Tile(17, 7)), Set.empty) + )) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/WallCompartmentSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/WallCompartmentSpec.scala new file mode 100644 index 0000000..c2be656 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/WallCompartmentSpec.scala @@ -0,0 +1,32 @@ +package org.danielholmes.coc.baseanalyser.model + +import org.danielholmes.coc.baseanalyser.model.trash.Barrack +import org.danielholmes.coc.baseanalyser.util.ElementsBuilder +import org.scalatest._ + +class WallCompartmentSpec extends FlatSpec with Matchers { + "WallCompartment" should "return empty tiles for no buildings" in { + val walls = ElementsBuilder.wallFence(Tile.MapOrigin, 3, 3) + val inner = Set(Tile.MapOrigin.offset(1, 1)) + WallCompartment(walls, inner, Set.empty).emptyTiles should contain theSameElementsAs inner + } + + it should "return empty tiles for building inside" in { + val walls = ElementsBuilder.wallFence(Tile.MapOrigin, 6, 5) + val inner = Tile.MapOrigin.offset(1, 1).matrixOfTilesTo(Tile.MapOrigin.offset(4, 3)) + val buildings = Set[Element](Barrack(1, Tile.MapOrigin.offset(2, 1))) + WallCompartment(walls, inner, buildings).emptyTiles should contain theSameElementsAs + Tile.MapOrigin.offset(1, 1).matrixOfTilesTo(Tile.MapOrigin.offset(1, 3)) + } + + it should "return empty possible large traps for 1x1 only" in { + WallCompartment(ElementsBuilder.wallFence(Tile.MapOrigin, 3, 3), Set(Tile.MapOrigin.offset(1, 1)), Set.empty).possibleLargeTraps should be (empty) + } + + it should "return 2 possible large traps for 3x2 empty space" in { + val walls = ElementsBuilder.wallFence(Tile.MapOrigin, 5, 4) + val inner = Tile.MapOrigin.offset(1, 1).matrixOfTilesTo(Tile.MapOrigin.offset(3, 2)) + WallCompartment(walls, inner, Set.empty).possibleLargeTraps should contain theSameElementsAs + Set(PossibleLargeTrap(Tile.MapOrigin.offset(1, 1)), PossibleLargeTrap(Tile.MapOrigin.offset(2, 1))) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRangeSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRangeSpec.scala new file mode 100644 index 0000000..6d3a554 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/range/BlindSpotSectorElementRangeSpec.scala @@ -0,0 +1,18 @@ +package org.danielholmes.coc.baseanalyser.model.range + +import org.danielholmes.coc.baseanalyser.model.{Angle, FloatMapCoordinate, TileCoordinate} +import org.scalatest._ + +class BlindSpotSectorElementRangeSpec extends FlatSpec with Matchers { + "BlindSpotSectorElementRange" should "contains inside" in { + BlindSpotSectorElementRange(TileCoordinate(10, 10), 1.0, 10.0, Angle.Quarter, Angle.Half).contains(FloatMapCoordinate(15.0, 10.0)) should be (true) + } + + it should "not contain outside" in { + BlindSpotSectorElementRange(TileCoordinate(10, 10), 1.0, 10.0, Angle.Quarter, Angle.Half).contains(FloatMapCoordinate(25.0, 10.0)) should be (false) + } + + it should "not contain outside opposite direction" in { + BlindSpotSectorElementRange(TileCoordinate(10, 10), 1.0, 10.0, Angle.Quarter, Angle.Half).contains(FloatMapCoordinate(5.0, 10.0)) should be (false) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRiderSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRiderSpec.scala new file mode 100644 index 0000000..18d32c6 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/HogRiderSpec.scala @@ -0,0 +1,54 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.{AirSweeper, ArcherTower, Cannon} +import org.danielholmes.coc.baseanalyser.model.heroes.BarbarianKingAltar +import org.danielholmes.coc.baseanalyser.model.trash.Barrack +import org.scalatest._ + +class HogRiderSpec extends FlatSpec with Matchers { + val origin = TileCoordinate(0, 0) + + "HogRider" should "return defense target" in { + val at = ArcherTower(1, Tile(1, 1)) + HogRider.findTargets(origin, Village(Set(at))) should contain (at) + } + + it should "return non-defense target if none available" in { + val barrack = Barrack(1, Tile(1, 1)) + HogRider.findTargets(origin, Village(Set(barrack))) should contain (barrack) + } + + it should "return empty if only wall available" in { + HogRider.findTargets(origin, Village(Set(Wall(1, Tile.MapOrigin)))) should be (empty) + } + + it should "return closest defense target if available" in { + val at = ArcherTower(1, Tile(10, 10)) + val closeBarrack = Barrack(1, Tile(2, 2)) + HogRider.findTargets(origin, Village(Set(at, closeBarrack))) should contain (at) + } + + it should "not include heroes as target" in { + val bk = BarbarianKingAltar(1, Tile(10, 10)) + val closeBarrack = Barrack(1, Tile(2, 2)) + HogRider.findTargets(origin, Village(Set(bk, closeBarrack))) should contain (closeBarrack) + } + + it should "include air sweeper as target" in { + val as = AirSweeper(1, Tile(10, 10), Angle.Half) + val closeBarrack = Barrack(1, Tile(2, 2)) + HogRider.findTargets(origin, Village(Set(as, closeBarrack))) should contain (as) + } + + it should "return none for empty village" in { + HogRider.findTargets(origin, Village.empty) shouldBe empty + } + + it should "return all equidistant defense targets" in { + val at = ArcherTower(1, Tile(0, 10)) + val cannon = Cannon(1, Tile(10, 0)) + val closeBarrack = Barrack(1, Tile(2, 2)) + HogRider.findTargets(origin, Village(Set(at, cannon, closeBarrack))) should be (Set(at, cannon)) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/TroopSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/TroopSpec.scala new file mode 100644 index 0000000..6031a63 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/model/troops/TroopSpec.scala @@ -0,0 +1,36 @@ +package org.danielholmes.coc.baseanalyser.model.troops + +import org.danielholmes.coc.baseanalyser.model.trash.{ArmyCamp, BuilderHut} +import org.danielholmes.coc.baseanalyser.model._ +import org.scalactic.anyvals.{PosDouble, PosZDouble} +import org.scalatest._ + +class TroopSpec extends FlatSpec with Matchers { + "Troop" should "return correct points can attack building from" in { + val LowCornerCoord = PosDouble.from(2.0 - Math.sqrt(0.75 / 2)).get + val HighCornerCoord = PosDouble.from(6.0 - LowCornerCoord).get + ExampleTroop.getAttackFloatCoordinates(BuilderHut(Tile(2, 2))) should contain theSameElementsAs + (Set( + FloatMapCoordinate(LowCornerCoord, LowCornerCoord), FloatMapCoordinate(2, 1.25), FloatMapCoordinate(3, 1.25), + FloatMapCoordinate(4, 1.25), FloatMapCoordinate(HighCornerCoord, LowCornerCoord), + FloatMapCoordinate(1.25, 2), FloatMapCoordinate(2, 2), FloatMapCoordinate(3, 2), FloatMapCoordinate(4, 2), FloatMapCoordinate(4.75, 2), + FloatMapCoordinate(1.25, 3), FloatMapCoordinate(2, 3), FloatMapCoordinate(3, 3), FloatMapCoordinate(4, 3), FloatMapCoordinate(4.75, 3), + FloatMapCoordinate(1.25, 4), FloatMapCoordinate(2, 4), FloatMapCoordinate(3, 4), FloatMapCoordinate(4, 4), FloatMapCoordinate(4.75, 4), + FloatMapCoordinate(LowCornerCoord, HighCornerCoord), FloatMapCoordinate(2, 4.75), FloatMapCoordinate(3, 4.75), + FloatMapCoordinate(4, 4.75), FloatMapCoordinate(HighCornerCoord, HighCornerCoord) + )) + } + + it should "find targets with correct hit area" in { + val armyCamp = ArmyCamp(1, Tile(10, 10)) + ExampleTroop.findTargets(TileCoordinate(10, 10), Village(Set(armyCamp))) should contain theSameElementsAs Set(armyCamp) + } +} + +object ExampleTroop extends Troop { + val Range = PosZDouble(0.75) + + override protected def getPrioritisedTargets(village: Village): List[Set[Structure]] = { + getAnyBuildingsTargets(village) + } +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayerSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayerSpec.scala new file mode 100644 index 0000000..b32c80e --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/stringdisplay/StringDisplayerSpec.scala @@ -0,0 +1,93 @@ +package org.danielholmes.coc.baseanalyser.stringdisplay + +import org.danielholmes.coc.baseanalyser.model._ +import org.danielholmes.coc.baseanalyser.model.defense.ArcherTower +import org.danielholmes.coc.baseanalyser.model.special.{ClanCastle, TownHall} +import org.scalatest._ + +class StringDisplayerSpec extends FlatSpec with Matchers { + val DrawnRowSize = Tile.MaxCoordinate + 1 + 2 + 1 // All tiles, borders and a new line char + val displayer = new StringDisplayer + + "String Displayer" should "display empty base" in { + displayer.build(Village.empty) should be (EMPTY) + } + + it should "display origin town hall" in { + val result = displayer.build(Village(Set(TownHall(1, Tile(1, 1))))) + for (row <- 2 to 5) { + for (col <- 2 to 5) { + result.charAt(row * DrawnRowSize + col) should be('#') + } + } + } + + it should "display end of earth archer tower" in { + val result = displayer.build(Village(Set(ArcherTower(1, Tile(41, 41))))) + for (row <- 42 to 44) { + for (col <- 42 to 44) { + result.charAt(row * DrawnRowSize + col) should be('A') + } + } + } + + it should "display end of map cc radius without exception" in { + displayer.build(Village(Set(ClanCastle(1, Tile(41, 41))))) + //result.charAt(1600) should be('^') + } + + val EMPTY = +"""+--------------------------------------------------+ +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | +| | ++--------------------------------------------------+ +""" +} diff --git a/src/test/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilderSpec.scala b/src/test/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilderSpec.scala new file mode 100644 index 0000000..17707b6 --- /dev/null +++ b/src/test/scala/org/danielholmes/coc/baseanalyser/util/ElementsBuilderSpec.scala @@ -0,0 +1,14 @@ +package org.danielholmes.coc.baseanalyser.util + +import org.danielholmes.coc.baseanalyser.model.{Tile, Wall} +import org.scalatest._ + +class ElementsBuilderSpec extends FlatSpec with Matchers { + "ElementsBuilder" should "return correctly built elements" in { + ElementsBuilder.fromString("WWW\nW W\nWWW", Tile(10, 10), Wall(1, _)) should be (Set( + Wall(1, Tile(10, 10)), Wall(1, Tile(11, 10)), Wall(1, Tile(12, 10)), + Wall(1, Tile(10, 11)), /*Wall(1, Tile(11, 11)),*/ Wall(1, Tile(12, 11)), + Wall(1, Tile(10, 12)), Wall(1, Tile(11, 12)), Wall(1, Tile(12, 12)) + )) + } +}