From 59fe517875829222500f7551322f9c71c795face Mon Sep 17 00:00:00 2001 From: Ignas Traskevicius Date: Mon, 19 Feb 2024 17:26:02 +0200 Subject: [PATCH] release v3.1.0 --- CHANGELOG.md | 10 +- SportEventHierarchy-light.png | Bin 439723 -> 0 bytes SportEventHierarchy.png | Bin 477034 -> 0 bytes SportEventHierarchy.uml | 94 -- pom.xml | 2 +- sdk-core/.DS_Store | Bin 6148 -> 6148 bytes .../build-tools/checkstyle/checkstyle.xml | 7 +- sdk-core/build-tools/toxiproxy/Dockerfile | 7 + sdk-core/build-tools/toxiproxy/config.conf | 8 + sdk-core/pom.xml | 29 +- .../sportradar/unifiedodds/sdk/UofSdk.java | 3 +- .../sdk/impl/ChannelMessageConsumer.java | 2 + .../sdk/impl/ChannelMessageConsumerImpl.java | 5 + .../sdk/impl/MessageTrafficLogger.java | 34 + .../impl/markets/NameProviderFactoryImpl.java | 10 +- .../sdk/impl/markets/NameProviderImpl.java | 186 ++-- .../markets/MarketDefinitionImpl.java | 52 +- .../markets/MarketFactoryImpl.java | 45 +- .../markets/OutcomeDefinitionImpl.java | 9 +- .../AmqpConnectionFactory.java | 2 +- .../rabbitconnection/RabbitMqChannelImpl.java | 189 ++-- .../SingleInstanceAmqpConnectionFactory.java | 2 +- .../sportradar/utils/thread/sleep/Sleep.java | 20 + .../sdk/ConfigureCacheTimeouts.java | 4 +- .../sdk/ConfigureEnvironmentTest.java | 6 +- .../ConfigureFastHttpClientTimeoutTest.java | 2 +- ...oreBetPalTimelineSportEventStatusTest.java | 2 +- .../ConfigureRabbitConnectionTimeoutTest.java | 2 +- .../sdk/ConfigureRabbitHeartBeatTest.java | 2 +- .../sdk/caching/ci/CourseCiTest.java | 2 +- .../sdk/caching/ci/VenueCiCourseCiIdTest.java | 2 +- .../caching/ci/VenueCiCourseCiNameTest.java | 3 +- .../sdk/caching/ci/VenueCiCourseCiTest.java | 2 +- .../ci/matchers/TranslationsAssert.java | 9 +- .../caching/ci/matchers/VenueCiAssert.java | 9 +- .../exportable/ExportableCourseCiTest.java | 2 +- .../impl/ci/RaceStageCiImplStageTypeTest.java | 2 +- .../sdk/caching/impl/ci/RaceStageCis.java | 2 +- .../markets/MarketDescriptionStub.java | 91 ++ .../caching/markets/MarketDescriptions.java | 136 +++ .../markets/MarketDescriptorProviders.java | 87 ++ .../NameFocusedOutcomeDescriptionStub.java | 37 + .../markets/NoMarketDescribingProvider.java | 28 + .../OneMarketInMultiLanguageProviderStub.java | 107 ++ .../markets/SingleMarketProviderStub.java | 32 + .../unifiedodds/sdk/conn/ApiSimulator.java | 83 ++ .../unifiedodds/sdk/conn/DecimalOdds.java | 26 + .../sdk/conn/FaultyRabbitConnectionIT.java | 235 +++++ .../unifiedodds/sdk/conn/GlobalVariables.java | 28 + .../unifiedodds/sdk/conn/JaxbContexts.java | 36 + .../sdk/conn/ListenerCollectingMessages.java | 68 ++ .../conn/ListenerCollectingRawMessages.java | 35 + .../conn/MarketWithFaultyDescriptionIT.java | 267 +++++ .../sdk/conn/MessagesAssertions.java | 39 + .../sdk/conn/MessagesInMemoryStorage.java | 54 + .../sdk/conn/NoOpUofGlobalEventsListener.java | 27 + .../unifiedodds/sdk/conn/OddEvenMarket.java | 36 + .../sdk/conn/PeriodicAliveSender.java | 48 + .../unifiedodds/sdk/conn/ProducerId.java | 32 + .../unifiedodds/sdk/conn/RabbitProducer.java | 27 +- .../sdk/conn/RawMessagesInMemoryStorage.java | 34 + .../sdk/conn/RawMessagesQuerier.java | 12 + .../sdk/conn/ReceivedRawMessage.java | 25 + .../unifiedodds/sdk/conn/RoutingKeys.java | 31 + .../sdk/conn/SapiMarketDescriptions.java | 87 ++ .../unifiedodds/sdk/conn/SapiProducers.java | 238 +++++ .../unifiedodds/sdk/conn/SdkConnectionIT.java | 18 +- .../unifiedodds/sdk/conn/SdkSetup.java | 117 +++ .../sdk/conn/SimpleMessageListener.java | 8 +- .../unifiedodds/sdk/conn/Sport.java | 20 + .../unifiedodds/sdk/conn/SportEvent.java | 21 + .../unifiedodds/sdk/conn/UfMarkets.java | 114 ++ .../sdk/conn/WaiterForSingleMessage.java | 39 + .../sdk/conn/WaitingUofListenerTest.java | 5 +- .../BookmakerDetailsProviderFactoryTest.java | 2 +- .../sdk/domain/language/TranslationsTest.java | 2 +- .../unifiedodds/sdk/entities/MatchStub.java | 121 +++ .../sdk/entities/SportEventStub.java | 58 ++ .../unifiedodds/sdk/entities/SportEvents.java | 24 + .../unifiedodds/sdk/entities/StageStub.java | 85 ++ .../sdk/impl/ChannelMessageConsumerTest.java | 12 +- .../unifiedodds/sdk/impl/Constants.java | 9 + .../sdk/impl/entities/CourseImplTest.java | 2 +- .../sdk/impl/entities/VenueImplTest.java | 2 +- .../impl/markets/NameProviderImplTest.java | 80 ++ .../NameProviderStatusMessageTest.java | 138 +++ .../sdk/impl/markets/NameProviders.java | 65 ++ .../markets/AbstractOutcomeAssert.java | 138 +++ .../AbstractOutcomeProbabilitiesAssert.java | 25 + ...tationTowardsSdkErrorHandlingStrategy.java | 9 + .../oddsentities/markets/MarketAssert.java | 74 ++ .../markets/MarketDefinitionAssert.java | 85 ++ .../oddsentities/markets/MarketFactories.java | 87 ++ .../markets/MarketFactoryImplCancelTest.java | 255 +++++ .../markets/MarketFactoryImplSimpleTest.java | 255 +++++ .../MarketFactoryImplWithOddsTest.java | 430 ++++++++ ...arketFactoryImplWithProbabilitiesTest.java | 972 ++++++++++++++++++ .../MarketFactoryImplWithSettlementTest.java | 373 +++++++ .../oddsentities/markets/OutcomeAssert.java | 38 + .../markets/OutcomeOddsAssert.java | 31 + .../markets/OutcomeSettlementAssert.java | 24 + .../AmqpConnectionFactoryFake.java | 130 +++ .../AmqpConnectionFactoryFakeTest.java | 81 ++ .../AmqpConnectionFactoryStubs.java | 85 -- .../AmqpConnectionFactoryStubsTest.java | 66 -- .../impl/rabbitconnection/ChannelFixture.java | 114 +- .../rabbitconnection/ChannelFixtureTest.java | 73 +- .../ConnectionAllOperationsUnsupported.java | 176 ++++ .../ConnectionToBeProvided.java | 93 ++ .../DeclareOkAllOperationsUnsupported.java | 39 + .../impl/rabbitconnection/EpochMillis.java | 23 - .../rabbitconnection/EpochMillisTest.java | 43 - .../sdk/impl/rabbitconnection/LogsMock.java | 10 +- .../impl/rabbitconnection/LogsMockTest.java | 7 +- .../NoOpRecoverableChannel.java | 634 ++++++++++++ .../RabbitMqChannelImplTest.java | 824 ++++++++------- .../RabbitMqChannelSupervisors.java | 75 ++ .../rabbitconnection/RecoverableChannel.java | 6 - ...leInstanceRabbitConnectionFactoryTest.java | 26 +- .../SingleRecoveryManagerSupervisorTest.java | 1 + .../externalrabbit/ProxiedRabbit.java | 101 ++ .../RabbitMqProducerConsumerIT.java | 53 +- .../externalrabbit/RabbitMqUserSetupIT.java | 7 +- ...ionChecker.java => ConnectionChecker.java} | 14 +- .../PreconditionsForIntegrationTests.java | 31 +- ...tionsForProxiedRabbitIntegrationTests.java | 49 + .../preconditions/SystemProperties.java | 26 + .../sdk/shared/FeedMessageBuilder.java | 27 +- .../generic/concurrent/LatchTest.java | 7 +- .../concurrent/SignallingOnPollingQueue.java | 1 + .../SignallingOnPollingQueueTest.java | 17 +- .../sdk/testutil/javautil/LanguagesTest.java | 32 - .../testutil/rabbit/integration/BaseUrl.java | 30 + .../rabbit/integration/RabbitMqConsumers.java | 66 +- .../integration/RabbitMqConsumersTest.java | 4 +- .../rabbit/integration/RabbitMqProducer.java | 23 +- .../integration/RabbitMqProducerTest.java | 11 +- .../integration/RabbitMqUserSetupTest.java | 11 +- .../rabbit/integration/VhostLocation.java | 23 +- .../rabbit/integration/VhostLocationTest.java | 14 +- .../WaitingRabbitMqConsumer.java | 6 + .../WaitingRabbitMqConsumerTest.java | 20 +- .../test/java/com/sportradar/utils/Urns.java | 14 + .../feedmessages/markets/TeamIndicators.java | 19 + .../utils/domain/markets/MarketIds.java | 31 + .../domain/names}/Languages.java | 18 +- .../utils/domain/names/LanguagesTest.java | 38 + .../utils/domain/producers/ProducerIds.java | 58 ++ .../domain/specifiers/MarketSpecifiers.java | 26 + .../utils/generic/testing/Booleans.java | 17 + .../utils/generic/testing/Cardinality.java | 19 + .../utils/generic/testing/Dates.java | 15 + .../utils/generic/testing/Exceptions.java | 18 + .../utils/generic/testing/RandomInteger.java | 13 + .../generic/testing/RandomIntegerTest.java | 33 + .../generic/testing/RandomObjectPicker.java | 13 + .../utils/generic/testing/Urls.java | 27 + .../utils/thread/sleep/SleepMock.java | 29 + .../utils/thread/sleep/SleepTest.java | 60 ++ .../sportradar/utils/time/EpochMillis.java | 31 + .../utils/time/EpochMillisTest.java | 51 + .../sportradar/utils/time/TimeInterval.java | 39 + .../utils/time/TimeIntervalTest.java | 121 +++ .../time}/TimeUtilsStub.java | 21 +- .../time}/TimeUtilsStubTest.java | 50 +- sdk-example/pom.xml | 2 +- .../example/BasicUofSdkExampleMain.java | 4 +- .../src/main/resources/application.yml.all | 38 +- sdk-example/src/main/resources/logback.xml | 2 + 169 files changed, 9225 insertions(+), 1152 deletions(-) delete mode 100644 SportEventHierarchy-light.png delete mode 100644 SportEventHierarchy.png delete mode 100644 SportEventHierarchy.uml create mode 100644 sdk-core/build-tools/toxiproxy/Dockerfile create mode 100644 sdk-core/build-tools/toxiproxy/config.conf create mode 100644 sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/MessageTrafficLogger.java create mode 100644 sdk-core/src/main/java/com/sportradar/utils/thread/sleep/Sleep.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptionStub.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptions.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptorProviders.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NameFocusedOutcomeDescriptionStub.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NoMarketDescribingProvider.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/OneMarketInMultiLanguageProviderStub.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/SingleMarketProviderStub.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ApiSimulator.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/DecimalOdds.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/FaultyRabbitConnectionIT.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/GlobalVariables.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/JaxbContexts.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingMessages.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingRawMessages.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MarketWithFaultyDescriptionIT.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesAssertions.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesInMemoryStorage.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/NoOpUofGlobalEventsListener.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/OddEvenMarket.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/PeriodicAliveSender.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ProducerId.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesInMemoryStorage.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesQuerier.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ReceivedRawMessage.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RoutingKeys.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiMarketDescriptions.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiProducers.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkSetup.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/Sport.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SportEvent.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/UfMarkets.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaiterForSingleMessage.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/MatchStub.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEventStub.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEvents.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/StageStub.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImplTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderStatusMessageTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviders.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeAssert.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeProbabilitiesAssert.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/ExpectationTowardsSdkErrorHandlingStrategy.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketAssert.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionAssert.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactories.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplCancelTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplSimpleTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithOddsTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithProbabilitiesTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithSettlementTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeAssert.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeOddsAssert.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeSettlementAssert.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFake.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFakeTest.java delete mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubs.java delete mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubsTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionAllOperationsUnsupported.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionToBeProvided.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/DeclareOkAllOperationsUnsupported.java delete mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillis.java delete mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillisTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/NoOpRecoverableChannel.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelSupervisors.java delete mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RecoverableChannel.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/ProxiedRabbit.java rename sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/{RabbitMqConnectionChecker.java => ConnectionChecker.java} (57%) create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForProxiedRabbitIntegrationTests.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/SystemProperties.java delete mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/javautil/LanguagesTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/BaseUrl.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/domain/feedmessages/markets/TeamIndicators.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/domain/markets/MarketIds.java rename sdk-core/src/test/java/com/sportradar/{unifiedodds/sdk/testutil/javautil => utils/domain/names}/Languages.java (51%) create mode 100644 sdk-core/src/test/java/com/sportradar/utils/domain/names/LanguagesTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/domain/producers/ProducerIds.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/domain/specifiers/MarketSpecifiers.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/Booleans.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/Cardinality.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/Dates.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/Exceptions.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomInteger.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomIntegerTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomObjectPicker.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/generic/testing/Urls.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepMock.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/time/EpochMillis.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/time/EpochMillisTest.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/time/TimeInterval.java create mode 100644 sdk-core/src/test/java/com/sportradar/utils/time/TimeIntervalTest.java rename sdk-core/src/test/java/com/sportradar/{unifiedodds/sdk/impl/recovery => utils/time}/TimeUtilsStub.java (71%) rename sdk-core/src/test/java/com/sportradar/{unifiedodds/sdk/impl/recovery => utils/time}/TimeUtilsStubTest.java (61%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d5efd11..2635bf37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ -### Unified Feed SDK 2.x changelog +### Unified Feed SDK 3.x changelog -**3.0.0 (2023-XX-YY)** +**3.1.0 (2024-02-19)** +* SDK can be used in a construct close-with-resources +* recovering after network outages no longer causes message duplication +* Markets are no longer excluded from messages handed over to the listener when descriptions of markets are unavailable +* Fix: faulty market descriptions are attempted to be re-fetched irrespective from exception handling strategy configured + +**3.0.0 (2023-10-24)** * Consistent casing used in naming in java code as per Google java style guidelines (refer to Migration Guide) * Upgrading Apache http client library from 4 to 5 * methods getName/s exposed more consistently in classes: categoryData, sportData, currentSeason, drawResult, manager, tournamentInfo diff --git a/SportEventHierarchy-light.png b/SportEventHierarchy-light.png deleted file mode 100644 index 969203ac8290db503aa2205d0ebc7a87f6763052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439723 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

_NXttZEvY%<1{nN=B#M_TIW z2P1NYMacKE_*Nx~a;<#qAoTID%WWj1nsBOa$|;Oe#1PQeC+RWl8yNT=PIowUR2|{V zeX%N?c|F}s^XC%0#CuM}sFWQ0ZNvcZd+Pw;5Hv=NX#0fzwE(DbzG;oqyO$xaL$c85&$ z-My>BA#Q|1x09Aa@{l{>lr5^zuCe))bv(MCdt20szd+7tOVmkOUZFSHKD-D4*Xtpo z`F=*qb27rq&!VPA>91QuJhQny6v$yqEHz~*DNFEL#~>awcB@)uH6WK!f|5Y6fD!6s(gL>(UfA2VN~!QVV-#-pWP z8}roA1eXn5sy{xtvn1nR_x{@PgC()J5)Q#e`%!~v9+V6P--_+S7gFNp>+GeK8lTfm zW|3G$8qprty)OmLMMg$OX636Xv3Lz}6I@3V{Fm2wo|ZZT@h12k3$EE2a?z&Svp`Dk zj6Se2PL7l5k`izT!{2?y*l9FA3!?(1k%T?AIYd<9#S96+K!+wBp0)7gj{{P~? zzIaFjsmN*`Z4^Xze1Ffamaiv&ci$u-J{j3ThKsb(zIs2FNI3BL!tHV%RA|I`kPr|s zuQ$n;Zdq7_eb>Gb6E9O8ZuHh>D1B&9Y?8;d;CO9oaee7npIpabaJA9vYS-@z2eXZ~2 z|H%lO+8>`h=uE);_~-Lv{i(`aN+*NeEO4aAzgXVzi#rXM;_v%&4>*rL9C`8BxkvbO_XaI| zCoBTHJ}QO&s;mEg2(?Vwr05Ps+l%_;)%yy=7t*$_-@ljRBItF&(mgysrfMslu3$#x3qFNK89 zJ_ajEUnL`5l`U=UQ%y#UU2IOhuai;8ehl{m@7H&H#831-!bLiUn-6OzqNvSr+L7XSL}Whu28 zPT_x83oc=w!?DD)xU`L1e`Q&Isw{<(`s|qB6z{Q$YlLHjV6l7zSKZE!v8QlvFn;;R z8Tjr4`x3(+m!hhkC3&J{R=wM~{qQz_A8N#ejy`sk5mss3--`8ZFs9@H;#ZfSw(hHC z)H+E@1L0002EvXCgqOS`Q>y9aM-?vbr|K-spHKARu};sS3JR}l@S_;ez**e?<=_Xq zdPQd7u76@F%yCI1!u>}=fifN4WWRleKusPg#wRxPuc}B3$lRNaoV~RIY`hbMG zY>-~23J8YvZ}s$(9OXTZOn}cm`se-s2{y^rn^fN@m-S2ncHvCJ3hH z&iIu@a5y{0LSdRd0v;(_aNo-R5)Sb>$Tk5R>5@OG^Dmckj&K-AE1y|<%#;bs;d%nm zi2wKJAQN{8Zu@>(-*zemU$N2MNu36}@wZn0@M}mO;cqVba~{Oyi`nm*^w?J)tSnC* z)$v@7t6vhB9Yk?1uqdbCrxC14R`CX6R1mnAZU#2j?bkztcC??T(Ug8c^nk}FdWwJ? zU%oNRjO&-#r0OX=r^)qEQqvVf&DGYFt4q^$sye~J1vyNJGk68@lV){YM{L!=kG8?( z!v}Zx`?wbIJ|?7<*n4XQj+HyzKfB-HT!@8-C@jogen;U-+ZY)!B)Wf5=&=h?A`fOl zUU1*%72%9kf`>&;rze6OF1NNG)ZYJ9W^_FJ+F`eiqzgV-@N6?Z5yva=A3WtLx_ibQN zm8kTm>_(qZQnzb<)+_=G^BP2UmZ{ojA!Yjb%-~N&-F3kTb3|*MFR-64Ms}ezu8s zR`Uzj>dw8u!S$BlRy#1B$s`~W3js0SZ~&QIcEd&7K7q?qh4aPXBZ+L6*)$j)zE2a4 z?Qxf+QGp>RdwF(&D`VNIL#*94?;BDlO8W(06QCt|RR^!&LXrP^FZ&tkz8Nu(Yt%iv z!oQdhzPh-hVfC6|Mc5i|G>spI%@$e~R}bf`=g#ozG0pj%w;6BZ9=CNf+p9~}F}~k> zEU7tk1!+v~VYa0ZOr>#lkaef!>sst6%cu8~g>L0I5L%{BYUl9Sj>?N1zV2Gjjvml6 zZ+g>8$hfwJGlxc9c$`RNxsS-!zk=m!Q1YRAtnGeLXy+z!M(olKhJjUK_uvwqjIn<3 zwp@gJ@5G^lYs7diu_kJ2YgE8if*h6t*Iyk1+q)e?u4gRpl)gCP`U5x7kA>^}pZ7j# z{FK3wcy((03Z-55!ye~djH~S~4{Oa8p$i%FfmEj`%4zc&^-+U7{qN%^>aS$%wTLcS&#qrbi#%{t4>`yty2dI?g*%NZ1ZV`;^xD?-ao(N6z z88VSSqQPcAUy4P0n~lF-^#l$HRKBg({P;3fXYvd$H@=kNo$kHAP3;RlJ6^)wfD49H*Z5mzLvhMPX z6c~vT>Zz4kFo<2lSSorPP+7$<82y>aMoomUQB$sv%$LlO(zo#qa9&=2RbsuGdOw|* zo~%sLCi?XlBdzQBtu)Z`&&V=VT0d=-?TCmcpIu)-WwjoD&C4l?d$2>t@%yG!YB6MO z+__Qi4BYxtybihY+z1ZNuuZSAjc}h#eG6K~2?GB@#|MoRF~EWnHZtRHmw%Gs!>w6Z zVyjAO$g7hnY?`EDzB4BA!EHXD%XIK8*|LXXZMg980 zWvYab_BG58M;hYl{dh^q8E+|gr9j=EbAs^0P*zE>H!H)N6x_TxR_S0t_H)9nYkWRYyq6v+>L`JSDkKa($Wxut4l#Qj;YO#Fc9 z;?Asy&8M-S5h22a4;&cZ;CJrGm75%uzKyhF*)FVEI`Klp6!WJb(xf&sagrmS#Yw}16Qi~3V75)7ptVbqo1u8rdJvJH?KGjzQ{ zM|##nWYeOsn><_4Y>s$+2TN+3opSable7vMzwYe40Liv>+KfjMwwezGDf8p`?!9=m z$`}~6f-EEu-~L`Ze~0gp+f$+J<@EbOgxXJp-$zy?(}IC0ncH%KtXTLy@MYu|A3`gh zProYAR_vD7mU=YAlIAYCxb$uv@vnhUD0L-k?IR*Rd5)?nk?s88h{GRcW<`U>?+{{a zjX!R?N7_y{bK2+EwW!X$R0r6Z5k3JwMqlW%;yywF6%eyS|P1&hR}#u@XLq z*JzaEz87J7B`~+Aa9;QROiyoy zzIc6ruo8?MH5?lI;r?fHidE&rvR1E7f*<}CLIMxJe|3{Pr*1-h^nx}yk1QEvYDj<0 z8N|>a-+$_%HQk~dT#|QY-u1s453-*o%CbBtR7={!;^}FI=)&L0;3;d<&>CydE;6EM zQN`-3Mp7Lk*B3R4@wigIK%Xc#gDQ^=oM!D@jM8`w_FSIKVbrL|%kN(v)o9t_vsr!m zx(xGBFMPbot|hJzKCi5(p8$(U9Wp7?VL&dD!hU{o6sgOhG|a?l zCusUv(NM-bxUo>}hxF|}%Qbx~z1LJ05C6<$c~3^jDnHYi7e-2&$}{%`t7N8LIaC#$ zCo;!~j#Gv_8EsmJ$9;hBMpTE^33RqG8y@&V>#-0H~h+|eX3LA zl=jtCJ_pMoBZiL#9h)SBMX)qoI9&2ya}zWU4-ERHvMCdzn1-a%9X=h&Z(fugg{Vn# zzTRr{6RxE7et~98L>|285EUWpT>($hr`waTnK&a|9XUyUNe zkv;$>Y}wX7hp47z|3<)cp3&Mb)8&u+^Ch6HgUQY z;bb&d$-Q`UDwYH!cb0Oit;j!f{BJHBoJIo8m3`XGV4g*=hyf0X>C}7p>}qHkgTSZQ z@(tPICyn^EK>OXFn;0gRwUnB_K*jSxL=bek^H$5fbrab)Nytbt23`9qg*nC}F(+G? zgT1P@A|q*ZVSNS2=Y5F3KS6U^);&$dBXV zH+f)CnQ7K(iFmRab&fty)nR=$E11x!o+LDT&sE8*o$=T~bG(s##!LrPp+l zWc-!|iGnOB5{CMqggAGs=B~1uH^H5P$%A?6Q~dCZN_5hf51-WgpAa z{A4KxjR$U~)?!u=s?1B3_Qv-ijZky$ULv}=g|oggb+oDqx2>vr4}1SW_RH?~J9DSE z>fvR$V-r%ACxXsbKL68c(!HHBpo!v5S^T{Skh6@iACO6|PBPUvV$rst+vWKTQM zJL;TKOGYvQ&W}&5-~~>=_t8mx?n)QZ5NTSolQ}ZsN<*iy<9i-EiIbW5(cQa1G8?}@ zn}S7qVm;P>ags`r%T5L9rbt0^^?sg6uFKVZiW@a2^JQtg+$HNWpD@~IvFY=7>g85= zzZ&(P(ZSPr);Am^3!pz1r+8UeYT@wzQ1_NmajadpC=r4sIO!0A2bacO5(2^9f;$9v zXgmpS0fKvQcZbH^J-9T%t#OxA*}mU%?)cvG=iYJuF{(#XUG>OXYpyxx(}reCuTJBX zHfgiK5C69L3V1Z+e+4KqsMx8m@}aOxw)Pt#EMO}X@3im9be>sPt`^AipbmUGr)_AS zVd3@`52ptg`|&h6bXv>6+`z&L6@;ILN*#@D%}~tf1Rani z57C!c67p=}3ecvwN?Xj8J!PRB zAYcGifu6 zLFGEFQzh2v)C4k^+MoJ9{}Y}Tsj{Q7ndJ*iEOLM$I_7G(qyEZCss>^5nh^P=#db*z z{vQ>j8x9$aGzVwsC?*tW;QDJni9kaOOzi+(%^;e1jx(qv@NfC`{(&}2)3l*g*sUzx z!=9G|HZoyH81py7chLO^DnktA4}w$rRzoTwd04LpSkNjqY^Jr0+67ItYPR|iri$o~ z6s46SxbiGFoV}!rQpL?hjl*?H?kU!9^RrXK*FbY<>KesQmb<({h$rcGB_VHrrd98g z(^nNe9~JR9|Cr?+hJRzvUwF)WAnqld1}w9)q)&85&EvqdFuY|YOeZ^TZB=Tp7NsV?ET zR@kaE(Y=t$Xo?h-*;bL!jEGCZ>s1mVEI*_>h6=gK23$vuF+FbRomibjEFWaJ4co3$ zX`UyA7Zoos*(z?VVol1hK@#}9gTIv;c-SX$DqW?)JLyI|mQ(2LpR^+N2Z=#O2fpZW zq|I%jb#0~u2n<)92xE`iCG-DX9Q~uh7yhlne?;}weV^|BBu)1Abjke!{5#rfT`cuS zfr*c^9{L99&&47#XjlF(&c0h7Sc5&0^w16x`zx11T4qT}S^U=HvDZ5JE4U^;W zy=P}n+LT^i>)>{7A z2}oDRe{q&bWjkYa+j@UD?R7^8(jGy&8r2l#04gFsyuYJ=`e+t>ehM#TcO}pV8SiE+ z9)w2+MfOQgC*_|TJD9)wE{I8l{Qe6}FNnCq#SB>133j3>qjH03QTlx-=5C7=$l#Wg ze^!>+uV5m9##Sll&)uhf&{r_Ip?^MMB!I9rTY?A9rJuXJyw0)M#K3sKPEDx(vuRrMO5+1a3x*)H5ypu{fVMHTZ3|a zXia&ZpL-QOK!f3oRT&r>q7_N{MHT@j03Z(n3^rc{jQN5RHF!mLDo;U6x>7U}*<*aZ z7NW8rxKyV&WsSqmj=R8&~7R@~PTCjH(J{utzN4pASvY8B=tS8fFYi;jTcVgNmKJ zx3GjyIBynMR3(IvFPS6`3ze(Kjr>u;spNznXoBF^%c;jjAeJjlE_mlHPzq#g zx1b)s51yIeK+3XaTG_#fz#HYX8Cumgusl6M%jxkM-K}1frs?oixwSsZa%y(b(0{G+ z?Ldf<2{+na_o>K<%Av3jmr-xP7p^AZ8HFzg50%jWooB?Qx)8Gt{&c}PZep@0)SHN& zb$c*i-w52%U(^;R;^zD*mX_*kZx2oOM}_B}q|lF>rO&?yj5k>Tsf6>+ql|*5-75-? zgfB5lbiEIR<|$~Sw_`d|oKf1)N~!({|gVSTR45lqu&Qj|2@Xh^pBOjEt7Qp;-kT=-1Pz-XmEQYw&g& z6pLODBrAs2x#Abmu{7BeU*_Fq^!z9V!$e$TUG~Rl{k_tkcZQjHavyh?CDmC^B{f-> z(pg#iqG&<^a!kAHP)Y2W0D#MKWJ0%x&tPrk4O#EA zYNqc-vm`kiG5{GM@Vxo{mYtm)?!Limlrz9kGcSa<_)8msi16u=JP_p8zOHgDOeZrF zJ!J7TN&yc_X--mT&ha*Es8`+Q14W~E`_E&^f@4W@?{=IU-yC}eemf#GM(FbTcCco$ z&f@%R9ZQYUR59EF1y6(}T6=E#Wnv1B=T(GM=1g3__^TeiN9`5C*_p!cIjWsH0q-XhX5tL$s$7`91oAEp3{R!{)eG$FSH|YaR z;qxA*41J1MXjK8#J%jrEl`ZK;!sOsLvYtl7cE1`9ZvIEEG8wbqd_fsAMWE3l(OGgV z>%!+e@d8A$0Sx#ex({H8xv%~MtJZ?494mP;WfV^=qUomW3}#nz^97-SZ|W4v#Xh^J zZBl(?{3>bU=3<9qlqQ$P4U(Luhhn-8GB%4qo=3A7&yYY5Hpo&l9E;O;{Z*VpGVE_E^D+ zt@=QgZKFCxb?J-HIhChUe>;}T;(-S%&7Kk{f9c+4v6p6IxXB0P(C#8wrv7d)ni}m+ zj9@rFB`DSYc#v~yVgg`;5=SJn0G6Q`%C!J?p-8he@*HrIfVBljK1)IOnjSOUYuk(} zhRB`WY0XIC0a^68saE(X&O~escBJ1fd)Z;ZJn;)6kPImRJQ<1r`gRUM?V5$Sbv-Nj zDdrJ~p&-?()RnCHAvP!Ht9Doi?rFBlU@IbpT{@bKg?{!7PUhI83_omnz_v36w(rCmUZIJb^A3i0bM?ztoTGfPAd{wnvgV&C7>F#052IHP*v z(P@U07Q&xfB*VF%QBf2{TgY4qJR$t_+4?!k6Tc(VdaZ9H@0j?on@3i7r{<+8*`5Ol zx%-VMSw!u0g5Z|sbL|r(a?qS>&r2RRgRyLM|CcE}>xN_*574}FWW8i#3q>V789xr> z(e?O+2x0#3A-UeA_q@_YXsJY=%B9V+|KI{VLIYb}cjOGp9Ji9KUbczeiSMQL7655&#XuVX1t`SXZfU@~ zo;ij(d~<>S2r`6quILswB{ZZkpl^zhi9F5;CwYSm4x0X2xmCrI&byKIij=OM+k~-J z%5rBcJh0xKz44XRSR2}KvYAtmltf9P7$&gT0^%8eTz|h3$t`H@u2dp3MqNl1 z>ImB+qG;@w8Rod58$=P4-^;44Scnz7YYIcG9f z;-{Piqk%u131ge--!TH50eQ0B?{k$X9r(VtkpykkNkC!67YiGhe`~- zS1obp=$145kR+;7Al>>z+=xB}L^e@#ZM0x07KCGF3DQP3Mf5OIa}sA3D(F5~w(vgq z5)PJt`C}8J910g@N3jP8pF<@@d_cHHfmU0pQqA;P4{K%q*{2@->R8X-8Oy>D zO)QmoqcZRHZg+N^3KCSk@tOp`oD|2@8yNX8Jee+xb@Y;kOA8SD;O(0L1T6jK>-zC~ z%c3?j&GGLaB4l!`f#c`_o>0Sny(B~b;Yu*r4kkh(H|Dj0@M*;c)|uD8SlpDGH3(iq z*Xmm#98u9*9e+=0w-JIoBg~TwOOZ^zRb7w4b*oaFeH*r&<2D|lvBqw?$q9Vu;SSH*xn-hnRLB(^Ji<098A)C|Q5(iYrw zK?53(t z<=9DiU?BD!S^xh%AN&`+VM24S?8}TI;L1)l#I{XvGe5-cth0TP+P8OQpRxSblAA}u zzBo5LxxvkJEa!!HHwu}0sTzb-!PbU%eACkDd|d7_@k!N8xSv<4DCDj4MP;T=+MJMc z?dW9Uv#t};Nn>_=yMj^deFZF-2pKaii{*rI>Nrh`?Ipd!r%&5{|HKxNo@>wF4d3fK zsiT7LcG~lSrl1)gdIo}Vyf2WeW-(oSa0Sc1aa zF{$eJ3=egISYPkWHKOA}_Se)oc5H2n!HN{?myE)kd{?Z})%u2}rh&n78=^DSikL(=Aj~MR!ps5DxXA`k7cZ;3cXbT?yhWoDN z_nQKs%0=`grR?45nwmj&5CGQzpvu>jgWmqjNyeGthy$`{iDOcfjFd$F){a$rJn^FQ zmOofoHnqY(VHLL}e9?otdW$+`Y}%3P%H`W%#tD#v-|?W%jPf}Ce9MFxf@>=CY|UGc z>kyLu*426ZgN~#Gsi%?;Xf)zN#6aR{=SwY*7`S=;t#=TYY<1+b{nl{UtvtYf{BHLz zo}DfKa+oW6`1zLvXtfe31E>=NHf^M2bs_b2v zeA(CiPh1xRM6k|}XXv1M`FTd?vjkbvncu=%i2B0gwbBFLb_nwwFt;B1|Q(};}a)WAMG=a`}X8_fFE=Zed{Y{F}x)$aKY&s?GYjg?* zkD4z!!L5GbIOKxTew>I4-};nv&1L$Y(sN!y^+$9WU>x>n3 z;H4otITv9|sQt;j{0ECGHofsXk5c5eB3)HR&})`g1?D?tQIz4w3jR7+Z>Z&tRb-o! z^1g6F=VvrB^>V-@R8%FC=+~Pl#^WBr=Q`xs$ICc@@->2x>O74hRolX*9ial*-hwoy z7ca99dy32|Gz0)39ENpDo3uX9Oc&#ZC+ytZbgh5{L#*xk7jL#!=EX}C=&IW+-zbPB z|K=r+p7027E*e;d9XB$h<7Xh_{dX4UDdXX7mVRVIzY2dN$9~BYASBC+4Hal_XiYV0Wk!Hld58>WgA*%+hfX^TKv!R=s$*>G-Qa$&OcsbLYql|&K;^)42!BMu+Sy`wUI{^U6&s5w0LrNV@I%*-8PVQHY!4(W zYgCkn=p<0xI$Xk=%7_c*y^5tcD?RQ)=Z06z7ihL0+k&6Ysf`X4S}%_f{;bj8H1%FO zy34FS6$Uj~mrusgJCArFGDfPml@kL+!qbgvLo9X7EV{RpSy~ZPhX(06rJXLy9Ln+iE|jZjNUsSPwLlFA9K5M%22G>a%dVZIPP~xxW?0# z($IpC2|!h@41Zjbc(A7jV7#-7!KeNLlRbKo+rTF`x<#fBM#?&oJP zX1ksh-jhNnJ4Ktm2Uz4$2}MMFPD5r7`RGk=8HK?0>|YJaouFcyondHLys^8tJYs%! zb)iB!Ilwz`(52?VB_f&`K9PpKC7BD#HmDllUO5zIDipyTeJCWAm^LlkAWzEhJ)NXG zMb6ig{G=dLhe{}82lGFWcHQjp_jk9%R+nL3H@UxUI&HD>iRi4u+NQTYW&Rj75Rh0hH1QM#K2=g`7%aR+|el z+AP3a(1mrLL0g*}(oKH8aOqtJ?b7eywFxp`Fu;dbK6yrO8GEO$Wm5ey8BEPNq{jTy zObQ!VD%dioq>{oHejVQdbWjA&%EEeO;sIZUFxq*W_Gi6@d2shf2thUou+G`8=c)(; z^o6xol^t+~#qSFK&IOwUsKBj7-0j|K&tm%AU13R)*foLSY3VAD#@F%>Mf(o;z93%7`igtKnAyH- zH7Dz)^S6T`;#h1Ek0;^m>sh);c-kW(mzSV=##NQ-jO;H{GHc82i*YO$&M|8D`# z+Jn63bkMl^LJYT|(v6(f;Rm)$R;0GN@$RmHfoOi%{nzA=8F3t++?z>(KGaH?q4awO zRLM6srOTH`zlsGH>>l?tU@LiEl@Vff1ASJc?9;g<893 zr~^cHOe9Qg%up)^JRfIWAIS&rbBv==7e7(Pkw{9t3}T6w5|zCW(kLmMoGv-g*HaVh z^Lg3l851e@s=ygsVo5C`#bah@0}(o_xjgA8)tI}45~{&`*Od$@66bg~)Ni3p=`ma> zjRYrqhE)A21Z~z)W6HGA0&}~H_3CreD<SuWfe2;v=ipNgPJk_ds?_+`oWj@ zZ`!X0ShCxH2J6PC{pxR%^-4KO;tR`8`5;}IugFS0t3Z!?|PnA=aLv^ zeUERJgJ$pcE@KwWxD!gC089YYfddtTrB6aNxiflCk}P<;Ub;cDfLXdzXvx`>I#r|1 zL-Y>ah8`|!CV7v#SYjqF;1t8g-0cv_$OFqp2Gd{bjbTxppw-V7Zz)x8%t*z0ehnGJ zyXB~R=`FF9xL<54VxE!k(tC={Ov0-1R3&9Z-(}`%4es2yqoo8Z0bHFX0mkd+<+fn^ zqPx*NZpp+HErmIz=LF4tYYz&n30E2Dk6E$6~ z`zZ(jtL+i;S9ET@w|>ps2sFc_vLK_=C$GRfDogB`_=y^t3p3JImhh3RIrn$a%?pYe z`ce|tFSgnfFbu`Ps%Kh=)5|ZH?^up&02>}D zU*u6#&3Fr`OmXG~SXp@ZdzKc@D^s@nl#&DZjJMj-ywka8-FOm5#{bRe1F&Tlt1)Tk z-GK6}@2;MkK*7_VH9-;rccDn!kd!e2x;C^Jz4rUa5}L$o^yjRLK>MPq_#F;`-hP4A6aeC=q(lQ;Gh}{B-8p#|MuM2*W{UrzOdV?wsGc|6#U?7f} zy{ZZykkj7-3N6&rcbcY(*Q7gF4_7)7cA&oI@X&i~?LJULYwdJ1atp@wyg@Yi89DCG?TL90X z9R5BJn?6aRMg`nJr0`$xx3zd*gyMW+)1}$UtwZnQZwNl^C$N3U&xGz+t9iI>Rx_K zx`X*y{(|zuh5`%rAr-$FD@HY;o80P!{oA0lml5Ko_=JYHZ>M6}_r7#u5rkw#TI7Ge zthjm-`x;ry5^tQ^CYYGjp|dxW9nqVvKuC;0+na-Fhr{@&R+;y$!Du+Awl`H!K-2dt zl>3^hbXaP^T@^FX#E~>_byH#aKri}X$@!TpBFk{Hx;}=jfzhuzC_mz|DFSY|d_4>P zSgw7~6LgR+CfETiDrVSwolq-ZN}RH7v$UlHy!o1nJ9r*dkKxShtZO^LqMV|l{gTJ? z9sTYwVj$k6rIG&DCS-KnCxzyk*Q9j%T#$cpp39akTCm z_fsg55lT`#1lF;D<4Jr~P4o!tovG_ozWX`wq+RI`4k$>o=r5?=xA z(?;LS$+ok+09aJU!z6+YnJVMjAML`IdxX1eHqQPmxByD!|0II}`d%a~8oc@G>9_^C znxHL0OK_@1HyLkZwvvrUAb^V9CP^h&f(;;1l}pZYEf=;r?@Ae=5^PZa!`iR`;SJcO!|IwEsR9U*jEYEh4Vkyueb5?0U&bg`0r&<=!{Uz!on=?ve(0(N5_(no{R<3RLNvT%o>-euh%Q9s`vaj z4|j?~Mi2oGX>GpSY1UR$93LHRSr8zz`yYgN{}$2lF`@al18WMQ#hmzWI=H1I$C#X#>~EL*+?THc{}Ld+*+87!4*O-%d7Z5C5s}Nz=iK-Hn0B{1|Cd21HORpy9De1uMg4Zx;W||1n%GBdmrimHCv+AbmOi{MtPz9!25{A*PwkFDp9JCexP|mV9u9NLl`-*IwQPB(`=fEg{T7wF7!_z&#alb2xzU zMkvPrD)pz9XVzH-m16bdPo=AVQ`TyB|F$RXax(pl`&qn_ zU5)e~KZtA$xFE;Qh5fez_}X<_pmh6-hOxQm9u_WX-B8z1X;}q*UE1>*VZSVA<)x;c z%;{*3L5}RnbfJOksw>HN`Cj+Xo1^|=zGJD^*f2qDC?vx31j5$^)J}40nd4L2F9Oyk zL-$*!f#S5P<@X^t!;7^Rw;XX*88&N=2TBU$L**z zY=q^iH$3lhhu(dz5B(~0{luUE?|9vt{4Y7|br73yuI^WgAOdTOhj=6rqd&x31X_>K zsgqHYkc>V;w#;!KXvY5Y5wipxiI;t_D)N%GtpS2wk7NSFNr8wlHdXwNWJ0KpTyQZB z9Xb8c!(*>RfRa$We@nY_Pn4Kz&`@AD$S-cSsiRk~#y~3!P`7Rm?DM@++1S~CK|br& zck3M;kI!#Tas(-c=a%ly00XFBp}{5&px%An{E%q9>0sczCo*-Z;-#ts9Hx;hFyUR# z=y;~MVaSR`XBPkNx8aH+io>GX(YQde?@*o>K5iPZX=>OBr7Ln(sun1Ij>3_B%A*)+ z7O^)lJiO#EE{!{YoYgrpGP0w6UJp=jN8#rLI}Z_PqdHa#IhhoeM!gD)cZ9ujdReCl zBt&nN2C*D?Q|n=wSDC;oo@VQfbWS{p!Cx$+q8CfsG;P^-q&oW3k} z2KwlpO*>fE1qrhih5~O9qvpta9+%tV5*`l#Xf4~PxAtav3dxZadJSUW-4X)6YakfH>9h0n+AFT61XsFSuFu4L~|WP4oz ze+>!82M8^C075Iv0lAnB*MC<0Sz56?cg8pRuIGgsOI7py3n2(I8cYOH(M&hS1EuO_ z53_tiTU_N~g*G>n8}xcn>8k21d%Z8oaZ!|31t59)?b*)L0W!3zRTc_p|*nJv4bfZRoKA~Obw?yM1cGQ$bLAE6zW{w z7ZB3J5oA34&zR<>tDL2@@A%^4lCmy2zfp5L!?hoaQVvuIa>84BQo;^tF#Co>gW5jN7SbbF1h{ZTX&n$O=tWhwquG>HNm4 zfYKwba7yO(1%La^`Nk9?C1d`x;N|dxm0qgUOsa#Wi_oPHTI_~fT%I>vmtK2Qo|cA& z!e_vFy^4UEqBB7|D$>hy)BGU(D;_d1k9|K_E+q?H*l|G#Afdvbs<#@q3s#U~ zne6fND$Z(JzFUqo!y);+M%Y551(Cnw6T?`qn&FEw18f_fyuT3kDs1YX1mOos`{5|2 ze1_rF)qoQk-&Q@N#{cJH$jsT7>bfEEurWW%zm=pexcoe0b#+MPfg!1^jfU&Gy%>AY zW}GfK-VN|hs`D)RjVd$VL-KZ1s$X)(JnupQEJq?;06Rz-+2z!`lbq;uK!UV%RkW0z zK4;ymMFS*?*J;hFB^;OKl1%%Drte}#4QcoGiPzDX`!q^{4xJLoZ&^77qH##F^*&!A z@W#oypQe7j3n60;>h{UW_W?B&3|!+4!W%XC6+-pn_Df7fQg|m-WDe?vJ-$ASt7+V` zG##h2CBA4u%H3Q~v{tzRf|{P;4Q*vs0wa5afuAL~yh?tLlskjbeS_v?VlV1I-#N4>v}`c` zi;lg~2jUM?mKN;UF?N3Uq9x-x5G+Fzk%sW;)M-V?TTVldFP4MritZqgHc-+T1X&K^ ziJ=t3&achOleq2QGZ^gZ+@I>?ZEC??V}VeJP+d`7);Xodl;cmekyK zt1Z}pvI3~y%B#ab9xU+#V|`aw>(%PI`sQvXdM=j3%(&gZ>Y1#lmJsm-6kw`~hk^H4#pVIYHd$O>sB2q?tIW!koIrn=;M(1FvmgA5h1nOykFkjVE4( z9H911&Y6~!h-fLZ;G(dKg>PXOX>S#BX*`k*SzN}YIpq=TS9`GXQihI)1&7H~M@Qv> z@?Q=gnK`R`s|}0w`lJvhs{?5I625N4{&0%C=0Y+98l+zyqjF3EWMlZ35bYi;{Pret?Y8ivq{^HSIfXgnbB-9XOy_ zJX-z+zy;c~#MS6OO~WM%2!LWYOX^U`zX>!5H~SpO#((+;r=5}opP}nJ(mfE4$H*V# zOSO7u)q1(R^I-?(F0%YH2bOTz<`5LQzZRSqIwQWnkiYw!ct4Xm#ed|pn})ixp*}D; z)0f~H`fA<8;x~@?q{?)I)i|+(R!w=2Y!%gZhxlH6-L<)yhig|#ZEo{*&)~JPv>>UV z+js_7)mqs6{6*MdhO4g!3OL5^Wc?(nKMiXvY@dAgXU)TB?apB;JQs1Tf>Z6T&E%mQ z9MXbi2I^N~jfJYUvuV#!Hkmb`;bo>gK9Hu^Q-Sd2aJV+ZTW341`%!3LsX(651n%jU zWN2f)M+wk4T0(0Ut3?IqeX^pFGo7kVe;Gb;NFGby@Bp6*pMH5G{#$G$R} zc8bXrgZxkj5|;N_R0MoCqB2^d#M}*6>41$a!y<{b(0k&C?LW6FJJoxqPv(6&nqRcX zQ|jp3#T54-8MsJzkp7mBOP~zIsHj9IhYa8U6zxgjKVrZ8Jg1dBc=WJ}{cjJ1uC9`#V%A zvf3h1f9)Fu81osi_4Pb?SwpLpzItSs~HbRE^Xt9sBaC6`FeL!72E3 zIC-{yLZ)ClR-RawlYWJoof)YzpI%|ja1U=tK^Z&p**bNoD*>Cix3u*t28g1o+c zL1)-m<}^A)|JAP*2pCee*%7UJ>M*^>=+}S32bkP#k`7f}4IW!-T@!h+a^v9O=-gjT zd7V3Zox|_;;XaX98(PxCj1rE=;i(T1Dj4ncT#BmP#6o-uXK<2q$}jxGhYX+icW>qC zOz@3QEX)wd%h0b441mX>UWEep6H97R)YjqHN)nonWz^!UKwc*9K zWjzDd)~~ajHnYz%U2A5Ap%=LycGujKi@2+l@+!bEME=jmeJfk8Lpg5iCt8(!bn=a2 zFIcEi$@k)2GaJdI5kWw{mu%Gj2+HI- zy`G5wix4fct#kE0g|~{ziTu}jdNLS`zdD4t0Q(aCnCcktdlm-z!w7ETCM?|*LjFLn zLP1*!3*Jv#T~~B3e*Ua$vs*E?@rIDlN(eFvBFZ8To7z}vCS|NV{b3BUHDvH*a`sXx zmXgv;=2R^hG!wl*>Q{9^{XMCY&|SxPPhay+qEcu6n8ey>QHA+96Q1bw*qFXxx$>#{ zd)Xc0s1N$bW}b6zIPChUvIE_9p49E$p5{Sn=Dz%6kleKi&7{7a{*y z;+vQNpASKf7~6p;G{(ySef7g4@d_YK><}A9|3Bfp_P9{6}_*R12ADMRx~iRL+`m&$1Bx1e*aI3l5fazL@w$YS>GT_ zJhkImVR+eDIfakrlqK!ZE3vD;{#Auotc|Tr+W_SEkC=d|r?c-l@6d zB^ZgFW2)=IGD~>|)aeM~!f%z3e$yqy954SklkpHujT`#h`t}Q+GIO; ze}8}2^Q@x8ZDHraEBsedBplIWIy#C|J%FIsyM49ZYjGsm*^@Ukl~>7CBFyaCvczOu z9`aQtxb$t)BPvE0V>_@LGW0W+eX5~}hHJ;wBhf-3hch#*FZvGWs~On7+CdkQf|rpX z9d}!|xf3gx=YIw(I;z@qvJ;`AgIAXmCUy2FYpiW9*Mj$GE@sWA;bVN0#$(S`!&A#H zH&%=-w8-$Korj6{9{%F(ORF`Hln7eygt>R+SREz^E&n3!_tW!FWq7O)<#lN`hWx<8 z_j1kbmbuG-RFz5nLEPtqrM@u3KFmmHmUQ*DXD@DkvwZDG88;pGL*Zk68I8)3oFYQa zJ+@t0pd*v7ix#z}MS)7zz2!-|BsOqZA)`%qzC;^ejNybfAAT)7ol_(Q^BUYss zVhYgNES=UUnE0AXq19z|gsDleoTTswQKjr*O&YtxMSe^|puwl5u7=T_vwBK{4DQQ} zYAI|Qw5%gM@)EdV#xj>C<{eJfxx2{mIo>`*oA1?#uTdW0+q&+m!Wbwoajb`rWILj2 zQNK@z7s<;wm3ItVX7i z4v$`+w2O;S;nuIZagudotko$eV8abSLrj84E>Yr+}w6+-dn*-RSBHKtpJr zIMS)Ex1m`%NXEXK{cI~qDm~nnd^zX4MrdQxhx@BouC3sV`i>HP_cJYLi*lI68Fl7? zbT!+W);?-@B$3_ajm9QqP>I&@Xtnpe5$+)*evr-CxV7j8CnO%0tl1I*8pk)ZCq4qU zjsg^UnDjG?GyJjAQjUei<~9(%YvE=NF1}WF9H2Z|6?qgPpHb!Z(bdV;!yq{OLZ(@u z?%E$a-Iz9deTyN_Ki+rEf%08M3xJFjw|p-POb{mF8FKq*^Q?o?_*XOdcs~i(+Y@v& zN_9m0*cVlGBX;YnR=h^O`BXGx`L=_R(b{1*@x9Ldj#psfSxgOdtrdxwJ`=q3FX$yI z$4ZU0bug(M+INbWH-0Cj2#ecm}vLB&uRJTGL!h%xVV;7u&1{Oo2;=Z-@8BC+|Bpb99REKKa(L}l1*D~k(S*_VkWqz37q zyOO?#vYTroU`rAu-v!jU*us46gafA2B5*35R#j{O{ew|NR* z9k1clG&lGBicHXmA(brl(C_ON)^MJHWGsBqd|K!Eqn7y{Gl5RBsy<3F=j1kl^Ifsi z_8p+gyfDbiRc>+280&vwnG}`g~(*n-Tf1P({Eaw zO`){yH6Q99nN^FCLb*J9`D=2s4{PRau*Z1@ukH42QJ+Iz+X!JR&=+lsrcG9zQ-pdc z3m-B3Yw5|6isItx#wDAZBnqbDdC>lmCB71j`-xfssJ8sPCEs-P*$BjqGCJf`2fY0( zk!Jty3~zOy_Cz^CngJ%AGGaf|S7Ww~iZ0j?n)H`4Wyeria6pXrO{h-phQ{{gM>4bk z=mj~zRX^*YD$P|iydZ3|)&*6?xq7|HH0vq$^y zPhTkSV*qktLZ$dF_;zS!X2rnR*1*>LJ^rApAx~IRg4*g}cgX-6)%cjMW*QLyx!As( z{c(m~;!>O?%3aa{ngG2L`W7QpC^W*fDuNtj^L5fZLaIT2zPH>p>Ud)q@XNfvea1Q8 zV!aIXFRuXN$URR>+1vlfCy%_@YP|0KHU7^kj$>B9=AI*qgyXK$JL?ls%B5Mu%>=_^ z%=Jl|!;xAJ;{%ZEHlq%tjOCk~RCKxDNF;QBz&BBdlv$4ljjt*X1h_fz_hU6)I-nr! zUY3hSpYunZA7uG|7Ck2VY~*Ug&)sc#NrBL+FIQrXsr}f&1cj3U7xgeanFumb{)+f^ zQ#7xwVd>WD*Lq3PwRh{D1aYVE8Y@q40VW94WsL@!lMK?3vda7vto|TWu#DyrHBYDm zW&4uH;Tm>gh35L?kA2d-bQ$WJ)WjiB-y*Z?Ga5}>5znSXxNANBG&s4xgqFlO&wh2}8M zVM6S|;!#YE+~(2cu$MMN&*8K|*x`kVaaS$;Awur!6&zL}IJHKkiOo^I!$bM6{JtQ< zyHbS?R0|*o`9c-ju&k@B))v2K+1iDPB~XavjPqS``+)p|lQS47#+XErarx%YhPMgW zVFgA(xW_Njmsmx?#QCZAbuec=n|>?srGZDnu^j839e z@}X;`Qko3-^5L@@OXp2|R7$AS_=iKNpv9eV*oC*(3|6=1V;eu^#V=C$~`r_##{f!2- zcs@OB`I(Do zi9uqtt=8!y(?}DYsMLBY#!Xp2v|DvRZrbtaX7bG4L**i`!5yf4B9AL0BU0BrH2aos zCGH4NXx^`6@))ydpk-D`X-o#%}43JVEeoWNUXcN9T*=(^=n?~us{{pVINDsT@ zHrn!gGf%7rNo$Oc@Q@X1*vF`%kD4vZ{y_@S&>#q#7*1h;_zT`&4lDX{HXVkV0sStn z?tLp34$rCu5YNIiLrLdE)%oE7>;iXjFbGsr?rGzm1kLIH)IGs)*b-}o*6nlSV& z9Xj|Y?6H=XK$KQXO$G^+OLO;?B~64Mx6t=xSg~xLK+z&j!8 z3$Qn{%%NGVq-TqS-Oc4&R+6J z4<8kP1_c50=1Z?g_L)a4`_1=vTU#D{H^tUgNTQURqlv^zG=&9VT8AfF4t~5~$Fp$~ zyq{p9B-33Er@{z{tXNe}V~{GqJ{HX}?#%zP=>qUlk7YmBj1s;eYA7!^KDACNYbh=6 znP<;#SgyPjs+uu;(bnGnWIO2zSb5@miAo}WrN|*&VR5m*>4c)!O}7`l6&x@VMz2zM z@Q?m=fkD(X|bnKM%RXiP$IslGigTSPkPJGmL=eX-MhORee)h|yFv2t2iYCnne9 zlr`81d_uP6`)&Wr9&7mu{nL-kIn!ElyZ0vW0q@t`eHHg5nA6J${+K3@yM!?@NnfGk z+&!Ap!+&Vd#wv#9Nb5VhCL4VS7DEUqD=R7EG@UI8^>au2ovi0<@R$v|cDO_DJU_3D7L5LiUHgC; zaTV3{)5v$`n}z|R7vo?JX~ck}L6-;A)Dkgt4Vtjt>Sf znmhk{=|!M?Vr7j_+>oS=R)6Y~P+vISkb8ozq4TZ4{D-MdU2r{zfw65?b(v@aZDqO@ zA#+Wo>qyh+dYL_g>UHmZ|ShShgCa&Sl zsi{n9oF=WH(AJjUjiQ~Q!V8D?q3ZOv0EaR5zEOI~geCECMNsgFxkw?2V&{QL$lkA4 zu{<3{#-Br+y6L7+nJ>>dCAW2zA_;TFr(&H+-~aXktp9*cVB;P08jKuvD3uz2(ll?0 zvHfVB*;ycgne+9}9~z$tQ#b5_9X0Bjec80>>n#gKKl9hD>p_`t9wZ#LG3iJSq~Nuy zoNr`qKrIx{0P_&~5!qxr4R&+8>%AI9|3s^Lacck~ksvF_=hfd|_bAOKO{3>N?T3_M zg&q#?5!#9;BYoMKNBt=h0l_k+S(AP;W$1PcD|BGjPU70wd9qxlY_2{vflD6kH-TNA zy(pb1Z!~wig5moDJm#ia=&&X2LPPgXjX~YoZ0O87z^YNOSILz_yW^*=z|DoE&egZY zn04UDK*F8WAsK(8#|UzVntQ|>+)8tbec+#n&6M09#^W5&=D?LF%B>K2vp#Nhu!OhI zXGK#k#W%$g-e!0GdQh9o*i}D8Rjy#qP>{RSgEhaCCmWo=`Pq}JbapBY(YLH;fj@>s zLsE!?Z{_L~*tIcx8DRE%w|Q03dGrQIEORou)rW0wT#;~vBD&DtL8myMKO{x9=I)DG zvv^liUG%oVk52Dz4%Kh%3l6Z+z>7>nfA0_!=h zyxFvS7HIMZ0u#HWit;;!c`LjbU%g1=XQ*E2<9jehfK$<59%cmXS&5l`_Oo++eI4v| z*?-=2-gtD_bh~Fg#cT8*6DcnXk0Iu6UhuAeL-5MhB&*=Ct?sAq-J|m5kg{Zv<}Ng} z*uq-Im1%nZXtsoA`hYd6I$3meIvBXS^?7wJ=orvNI0(6aTRH- zvnk`r?Zh_xgQ4!b!d`%;*e<{dw2wdT^ak*KnOSm~5ZfS+e;K$VPyRAcx(uEDcw0a9 z16pEsPL4nO6~NQuU3*DTv*1MF2sv+9Dgqc#Z(L@+Ql*zMxMbEx7L(HDr4g0y#~yxJ zekKX7s!O8b1sLHOUk=m7pvbHl6J5cVS#Q>V%-HrZnT(bkiuJ2@ChhYrdy}A~nWE(J zXUpUh+RH-^$-qX@0ctTneq0a!ghe}074%*4g@8H;77w0$W2{;7Y*-9m52Q-by^Wl5 z>PGlfPMUo^9b+%e5Gh7EV_=&`L1-9%VFY~~<0=C!0e(kilzpXk z)Dx6PIb#>8_c=MAG@}7eW+!ORJP+018&zeal|@lq>P)M{y`1JWq~>(WT}0;md@!t9 zcA93wTZyH<(+V1%i7k}=^q!;Q(r13(+&|;}z}}lA(a=>RXgEpZBR)mwp%6u7)7vtR z;g3qQ*Iko8EV|IXbe#POi^1-sJF_L|8S%U=1 zm^kghF5I;#=RIEv*GDG-`Kfy7OBIIaERo;w!LR2II|kZD6l!A@8 z%{ti8$}$f1_4QZibS{J3Q+~DAZ)H6W^?#K11cG0Be?I)}bb@_IVEwahQ}Wd7ZZANE zbCp{$HVLt9Xf&~dC^Wl0PhzgF*qr)b?7dY~TwBy7OhO0=1PBt`f(CcD;O-Wz2<{NP z@Cfei4uwl_Dl5U zl_9!tBj0WgXE@CS9l2dw1~Xh4E`%BMyCpN^R@At8g4e__r*raslb#Nb{j6GAh)JA@6IQdwPWPLC>NUd_Sg($b`YO(qN~wS zw4igKUe_h1j#snjO5>RR2n-j4Q2=SW6|;!`Ugw{kio4EcBv{$9YMN7G9$EZ5Jv@!kfK70ybl{aJoNvv~O*wKYVGubtUkj1>EM=-~|Gs-E)Uh{deL+}$F z!Ukg0nmfjl56a>&FPYYVTTPm*0EGkey?9T6-KK5>^MO(ddR}bfv7OaCpmB$y#w#~c2~>y+T$pqcbhJ0*xmh#1mQRQ)fS3)KZxQOeI;lSG6LixhO^_id zwJI*Bd#uW>S8SnYMUpO=zIMB2 zFqEa!3G*J8Av;p+2whD|jWGY3Jq}ss~sZi`t)zT*>a2y~HOv3^qF;=}TdBk)V*NH-e#EhdYV=QDBcjjA} zMw7W6eFedXDAEnR=vHvq+gHcZ=~(g{$iYLtlN{{q1_on6x%8E%;ZMUIQ8DQjy`G$Km0ohR~eH@yPEgs@Kup9G}0lh80iZRuk2$9q44hakX&ZB z$=&8;HZSUK;G92ER6Fq*aHuNI4Hw(&DjFIBAAdt}U-nHd4FF@gT(WIQz^o+%R`cm4!+#cE|=jA?XioGo4lxE{ADvNQbzoph}q5`GcXLG>90e> zcGIyZ7pFM&I-w`oC}JfX{+(xh6so56?$;Y}k1IqE?+==4S5N>^J^yLKP-T@7338pe zzJse`-MEk@{%#^Otmz@9F&s6kAdN>ySi?N~$AYh$rX>j)Kjo-LkYRN|NcPhp2sQ)v zON#B+!ziQt zML{&1_OO%ounaHo%E!)HCZ0f-^(E}upLXT*$JmZ|*W$A!Lux2etwac6whnzxc$)N@0s;1!al8}I&&|_t^H*HHT3n1m;eL)2=6ykkmJlp z6Mfj%Q)toxnfL$01n=wbXw}=DsQKyOebG!Mtn<)ByZI8h!L*hmbC zg+}`+BCNqNaT{3)l)OtI{B!yvvMjz#e%x2l2I5IHjws)I>V1D}Oz;~8#N7S815J`@ z{evsfS%cl|GIkR4?;ew$3+KIkuoT1A6VCi3m9bysw$&&Ft=D{<0c4=bm()y)F{q~S zNpjQNYAb)s06JY`vxKzii#fv_c?9m_$!lABI9LMC51@c~Lx?=d>VPCiU+P;^y*4sE zd1nXAPbK0Y;9kgUL|ic{SK)@Ic;52Ua=~g1uB?$DPC$oFe2`t&8ZQs{=HmcfSd8h6 zP{L;5B{b>ebo6;T8{11U!he6s9;5xy%qn!RKkx>Lg4aBlXpl9ZJrpV;H)Wu`fHDTbYx#FrAh6e6xfeMcDu{(?~q6Lug&f}QW!b&RWxKpt=VbFn4m zgpa^DJHwA(N}a!LnE56~!8LuGA$Gdr^cd;Pqu_`v+FXb^5ES!o%NNVg zgh(!9zhGLurl=S-+CVLjStQz{A;iWF)^5qi^o&0bEv~NluBKi5?k40*s}LKAtY!>8 zE>ZL@{mdqWu*qH9tm$T=bn)|SzX6j6y65WemA0azq$HNxE5Mba>rI+85yx$)*{(6` z+7)>*z^Jcf>rw(AH*l5|k57e?CDMtgZ>pbK!J>_vX0}U|0<7RwDF8+!30wOacX5j+ zRO(k}^M9-QSqxGF1)AIbJGdlX(|Ymby$A^lN?B=<9AF6buF!YsN9Agk5r1$ycZ*Ie z9S6KH@ZUv*mE(FT9x2!yZnaQmO#%2MucXBITdVY5fOXh{Ij^MW%3&m# z>8nAO9P)cb>Y0Zk)C^nrKMV$*$Xag0~P~0c|uET7aSSP#z1G z{jSjMcC@D$Z3UWU=@B;XCxZ>Cb+k{QMEjyi@(sOgc^i-8O1hSoJqDj+MnB-92eO7jUVnE#p7ph=Js(KOM3$$KflFxzAy!;b(+?~_sHn2T;VaEuqET<6f))(dr@f3GYIP5bs`jBcD%FY0J5BaVvy-t5I zr-EiA_l&9RUDhRKbx3LZ!XZY3r*D@PA31=v^Rdd@$x}?t8|91oUx#UWO|Wz8?67h- zMU`o@E|Pbq6C|~UD)N zNM{+qAvBqg(Njb3v5yspzBT7dxurS<$HK_(29?_nZ`qLXz*>k3qQa)Uc+0GSh;)>QJKpggYRT*T+!JUY`X|F(P3b&2E`mKoNOH} zjcv^wWf$sM@B$3&EO-dz_vb5AfZg}oXU@0daqDQnB}A@^wz#%&Xz=@=z}403+^)CC z&D1^O$$lXbA3)cHf7)=CQKAtv?SPgfl&4_35H0<~`>msNEmXT71qe|K*?8F+orlt% zpgHS?kQe<8i|6!>EsXpR$6?B2JWJPdjn7~dBFNBsVuo+p_eaOwKX)zk;UpgBM;{F6 z^G2}d-u^Zo?^yDx&M1^BLUCeAHfo96X-Zb}T?JrssW?ROJr!{QSxdz{1v6bXQZgn2 z<)Ub)M2t*O1~()c{i4pbr_DdCnVO&9ajyrZE>-s;iVO_4OCoSIuk3)0u2U z3>-{w>*6TYJl%m}Rq#Is!rY&EJho*MIGQFj`5pa|j_(BB$7ZX`&Mj^T1MD5u?7S|5 ziwU)rd9Rj#V0Z$|MCsCOIpihK|H7IvOv1*ZFq=;P8O$9_o~959sz_=PfW9q>R0(YCEJ_xCKi`gw9mU`8@?`Yx>W6tO~?3nn(?N`l6jm% z)!nPBXFWYK6#R#xJnxRXCR~AeZt({PS3$WQ$Xi|JT5Lxh%UAd`-#l-bSLd&o7vjcx z6?ixBt@NZ|sfd@cB#vNU?3Vw+4nCp_-w(jh>KPn^LUOKsCowT{M$hTMlB6THn^cS) z&w?HI@dC^1KvbmdxUUv|5@aWoUMG|o-j6_&JoUY&;kO2Szz9eT83&77g&V{9U1@@W z1=58!<&cy%yRq@Y`?VW3u45)?r7{fq{x?4y;*^7Dq^v5+#`LMYrjbo9mJY8%r{i6B zqdB!2ZJSlO9x^?9&f$+Nk9Xv~G>hHWBgFGg0Da@k;zeZ>aD{|^MCTsb_Zwo@HQm|6 zP0q%x8@L^@r$e=Ib7X9ix!kB^#*pU{*Qy=;i16y_*(eXpSNy9?CT#3KhOlM16~!7u zE4~>X+%34bTUuxX3q8lYvCUV)B*wvNMsh7G(p_zv7s1Q3IRyoQ-+w<9=rY2qGB)fxIr}_s58ZW9!A&FzT@^ir7{;1fF z9x%D6xaA-Z*|h8O^&99>{ckI-e)04e6+l45!x*;xMGr{5b<}O}?h4+C3u!S4IV8fq zmk+9np-F)V)Sz9p*EHWB+}~c-)YP2nrg>aw-0Y2Hi61lq;Bj4?Hv&6B({zu3XK7w* zZhCB#g`1a)=*^MCNhKb?u_Sfuo@P9`erGGW!G8M4t@p?&slnN0=bfl+375oaD@R6 zvxYyfHx_h-hglB%i(1p3QUpj*7?``ZE?Qu4ryg*9`W&{>=b$S`BYX_pB@}RhH!t2a znZ9}X?fx(oFfR^-U*KebGhTND8FhG2N0OAJ5?d4x!M(`h#r|$2k zxcvC!3Y|9iFIVWIfsg#k_v5ecM7#^U1oM^QD*kBGzNa*0{g%CM1%kz`FZH?JoK-Bay~92KCLP>uw|1I1fw{?9 zK2J`?pC-RW4Hy~!8Ldem^2ZAM8;+>rX`V< zv<6;+x%v~TaIJ5EZ%o+s->#d%3cR_G^Vhxy|IcG^Z~1?Z;s3|SAg8DZ^q1ep_Mg(W zjXkIc0csSD0#6U-Bkt3alvZpF&Yl@XFk{SR%o0iriB9r-ii@9p|AnWO;?o`gycpyC zSA=3i*c?n0D=#Z{FHEIs}jJ>XBhW zHa^F%w@;sCE{4PXmvIBqX2funT4cwD$=Tj8uoOnIBmp`>A4|=g7#N!ur~Nx~Heq#y zqf{n2GF|O$|H`w_%e;mPud6QuE)NwfC4<1XaJfE56rCa+3Sjn9v{6cECccp&oZ2ge zBXs}W@+98}G?t}r6u+-X*iXHR`C>S>SYyYfGWO}*&ZFy>_u_JhNvex4Ve1?)kVJwk zvj(_J|M)^S%f{+bR&}&phk0|t<(Sc!VPI;iPoE&OqZ71z79&^B71I&J);K`<=eaHV zBxHQ}vn1;q1ov$Tb2?i9bG%$Ia;uzmz9)9ipJm%Ta$3t|+yClfkFON{xmB!rRm@h% zjJ+86Y}V6Y{P?HhBb>qVmTRLV@muiyp02#mAz=K}hSh;b5Pm7BxkH$msD)r{)pd?o zLI4zMB;@e<*UsOi|F<8xs^dyLi;15uV6tuBz6u>V6J$h6QI&bE{Zyx*rk|^JcKaq$4s_2~j&N)qc+jYh_Qn{RGN?Kk^-7+7b8P1KV zALKuK$}+NHy{(71k*Us$r|BXSvMLv88)K@S5q7Nng>(qB4n>$Hne2}hYvQV6?pY+?8KUXYR91mN)Nid(8&7HD^qz^RBI}mAVXAd?1E` znbv6Es}7vFzJIH9qsA(V3yc|A2Szf1T#+vqoYS7TJ}2WiHIy{7$b?r_$@xdK!PaK? zacYy?@Ra%O=+|^D5uHKg*bLOz0E^9tm4V67pSNGzUhI~y@yOsS3ZrP$*`u=H~o#T;e~y^B5!P+W@9S0m!cQ4xfyis)6O_Uom#gU^a?;@@@R)Y zi0;yhzLmiGy#JAI>62r3pJ?#{;3(t(jzSR#=V+oCrH^Qd=6Db4X)<+{izY=_@h*7| z61rtDbMX^NFQ^P|j3V&u`O&FKhjixXhe$sBz|hdv;IUJ?qD$WREW0)xJcSfe!UfP> zrY9*H4qlgOHlLen%#QH3hEi!;T~Ou8AbYEjpaTE_wkYwq{dJgh8H{_}%|jwZ7F4S3 z=?`5-3GM808a5|!?L_!aprAA+kb8@%+b;>jna>A_Y@m6kIV%i=Mc2Jz^9@H+C^0et zw@BD3%HwYoaWSzoU@Wl&3x5S!1=m)RTf<9AKgz8+*DkqKo3&nmORE$u^B`rJkG9#R ztZW*YW#MM7OXs-qd&1crS&XD?s?>U7xD58X@DT?;mE#phZdEy1*kW&H?V?D^-W?DA z;9*^)L%X-H>KvCAdmL(S!qQ$kB_#!|(&~v0-=Ztqdn%W5V62HQMFA|E+Rj79$emGP z>iS{i)Kp1~s1v|aQZ0bjLdaIkEv$?&wz(Bxm|t;wKu!U|G_HPg5q*a$RZ4ou6t$Ga z9kw$l5;&_}Re;>s5U<8~%i=hi$er)NPoj-$ztz!%tWG2a4Dt+y7~dE0eFTr+eC?xi zMHdX~Q^Ih@{V{}4#qKtU{ZL#*`YL9T@=Uq}wwG9RGgb{{lJz&MLs9j)`Qz1aySw+5UHcs&D5VVTrT>kIMVEc) z8LbbwB`BVHJ`;kKcHM6x0c`{-bQ5ytz9q15;iRtst`R0T+U~Cj9~sb`5 zmj#v_m2k*%m(i8Pup5I9{2MNNKWg|six^wVmc6rGex)lRwa;x( z1L=0+we1i7n9u6)#!PEzq~DRV5#87RWEK{vFk)c-v#0>1UQQ}1iP?|FNBZkjJw|in za6F4;+>Pb16%DFK@3}hMyo{Rb-2DFP6ndx^j|P;k<^2^HV>~Plfi*UUrlXlo-C_gM zAtf;f4aoqvIUn~As8Y9I;&cqKu z#V&=g`$>idT;O43wzYzq2^ngTwyj7yqLz_94~@?`(Opxe9?@Ko*0RV zg=}7Ear$Cph=`0oNhB*5NPV3V^unz;r}JJ2om)~QB(~HanNIhdy3xt|5Iq5{6koe% zc30M?;ODFC2eDXhv-h2dQ9WyF7GM<{{q0L3qHp~Ezsn7;cL13+hCr($n3}AabWF^F ziY1t~GYHH(C|+>1)U0d4oWA$*VIBGVX55eYSsv!%nuP9cV*{30>eUo+%^Q{s}I%8P|IWD1P-e-&`y+ z(OR|wDd>^zfK~@cU7&~pzQ}JHkNDD;3io{y6E1E}M`*ltI+XHxOHqVDwOUvL$GgOl zJTF?eN6XHj*5~$;AYsTgAI4&OS{_HO;6fgYP9_IuH_eaU_1I^iU@RVE6km$XD+*TL z#sTj`*=AQ)hcg(RN5Mn?zknm4WH73vh20!_7!%I}3hW-ikG~-ITg}A}hhY=AyKlK% z7I7Tmr^@N~Y&)k16Gwj%V7g(m&zt$!pWg4|mHR}>z1>lXuaA${J~IMqExzg?2;`CM;To$~%@*#=>$=Q1o& zI`MChBeyiQG@h;P-t~FA^9|&tz`nZ9!)v2UXGRQV#c_x2N=NhMZ|0~Uosi_X(W5cw z&fdtU99L=G|6~K#`s(29yk`YK zX6!->)CUS%&pF0#%iJD5y$nN}C8%=mdW5_nB&R%9jRt2^YmUWdRZeA9kD{kR5lv^c zF-_R{s&2AEy45N(!%P@6{;4*H8`62hMD>2T0AY0Y?tZkxX(Oo8(cL(}lLUpL)ac`% z>mNgFutRhqqnqoax(bfdQ0_wr>ogYsg=EzUhwinna{LCE^kl3WzK^Wme?u+nUJGYp zCO12b*96^Is6XC0ibpFPcinXhu#@f2IHai+ z`g*c1b=6_Hg2&A@@p@IHtT4m;k=Q@=RV^IlPyEgiN(lAqD3&l0gB3fHXUU9s_^2;0 zdsZW`O`^fm6txpR2NoPk(8?_&kd0b(Ks)bty3x47T_Q=CFP6eq z8f=s|^c6(WJE;xt(g?=FqSyYsp{8?ir7-MB?B(?4J9rS%qh7e>FD%BPf}Cd6G%Ij; z7S{~U2`~mt9W+pV&d5n!2`)5n<^RRv$XPxkzzwkX#?%7JOB?kVF%-_Dgz#gtKT3+5 zxv^)00kNCiAF*3o{#!#|@ptbeo*g7V4}>dnO>`}9OqI9R5ZKtQVU7X#kz0pHMrG3X z$HKDNE@S{jKcrJj5~!jagv3+B3}StUT5G;wZa)&wMXDrI?lpDkT_;#RZssH{d0u$qoZev`RyLY%V%tEl{719AYSmeBwP=XLw5dt6G}GudNY93=dS{>qqWpzS!7F8#p3!?|*FL zrDV7!QjKFI2Q$I8Fv>E)_q$~0_sK{cj+=uAp&ixLE-G2di1t7eO*NGdBx)Qb=?Ot@ zy?7_O8v)eUFE`P`gpGiU%0yhd$yO?Bz!dv=?O-$O=Nr221@Z03#6E(V$V@_(yz5>V z^);W%{g#c3XXoEea{-Z%RxU?Q|C@udSrUp6JAx`oNm;Zy?@!hrcT6`CZbJ)XKM zljsN6b<5N1P0$Q=2o}NS3B`?P-~0$8s2*I^d)KPch*8e!L~X+-n}hXy&{}m9i{er5 z3vU?GH;*U22S74AdHUWnM@<)RbvH1;a;c_`&G-P`SH3POFj&nyhqn@3-xQ+YD#0vJ z;V8j=2wD6VWaK9M8qu=xT8h7`f1^rP+zT zR;sOAza!wyQ`juHW`|sMu_Ff23O5g)IjH{Foy4jO!HU2sR7DTRs}K_9Inq8FE`;N6 zV+c~G7)*+?RJ$-j9WMRkK}8~cBu}Sa)&{l(8V8lzX=&O?#tBb-bDv>)#qFLGpgF`g zy_jazh0dly5*k$Okyw$ubXMC$zA9bs$9yD6^?5}~4N;Tp(?Yscgs4E!`nQTL0OH*g z{!nEEMMv9(P6F~}>KD1m-HPGQd(YmVx3X23u&8qd&}&Eulh6j|B(=OAI2q4&Wv-qo zN@M=*#oq7(kao_PgC|v9ZuwuqCPtO3;U4y%#o=k1ir#2%q++rXG*Ba{Ls8i3$S0|| z+?3vjkg>xm6R)&4qFU^H5c78a29vNHAK?AktUYyGV_; zS69QfI8xgkc|Ryx42f=~zG!S4o6jCpz&A*>*pKZ>RH2#-oG)HvvB40u=kw_)&{B*Y z*%3XY;;0;!k`Ak~*J}F4wdRp05;V82MNW$-nc|PlfED8T{sm$kSI zP!kmTgbMrsvKV>#qw@ZhT(DqdNS$T;!$u?ozGY$z_+}1|a)R zG)Lw&B^aWzQL-Pom=qTcDZ3u33%WNC%l2+a7A8PYi%S%VZWuM|nA5Jz(@H#U@FITR zF(8WiWi+kM?n1j>S86^Gq00W%-qLZ`HsL`}X)%v0 z8D&PRQ1<@eZ6Rr*r8_09$8mQ+0fV2QnP;`XBDDjeeA%^C8%dv_r5R!=lK&WU@vJ1< zU+98$9ypUtwXG|-l@-L--W1ye%g}cl5T|spP)79#Jgf=in4ILxdq`OTbi9~nKnmxQ zm@XApwJ2Nvf$$VZCNpe#Wx1G_s=9X`7sd@mHr~tcderlYZD2(sYpiiT-VUwAumRd$ zZIp@b!7~#%iIF(a)G(RH5rAf44JuC3Z>X^u0y~2kNeMQn`yckw1Sr_1=UbGuubXQ; zq}1r~T?1&YsdInXpNQ;DIqSwJ1Yt?~y<)SA14qcC`D7#R6i(hUM~bn5EK7rAF?I(q z9>=9u-#y%Tzg4F-nL2n zdJucH`F-y;7L%g$|iRy{2lmpdqb2h$B*YMPL z%BR7(5V!UcrkSWK@o$d#px#by4}0j7B%%G7kmL`4oWaKmn_Bc>dt z&w1!pF&>bA94bofp*zOk9E%k~>kx&F4UA#-gW(g9CQ41O!HH6TY2?~=-QMIc)!==95W597-SE=v7ufLZZ z=fE^$MMXmSU9P4$(oP}%_&cJk{h2)#Maa|Pb8W^u!N4#M)Yt-&oM)I?`*t5XK>nnNj2k_YGQSiVam$4KFlw9>o{?1_MC$il_R>Elh+4S0n%mE^FFg#O ztF<#|a`KFR-ppdiIaF2mB9D|remNeWUF=*` zl3(+%n~wW|A}T*?O9ZT7-+{Ts8G-d#+~A8n?Y+w`M06GHOE3cBqE+I$iXJY z&#vo@+&imZ(!@Vd6aktvQ$R~Us#wx$dAKa8>T63*#ab1~@p`K;`T0;!nAXvpqn_BC zyEF*>IM%6e{>-`_4xqWl2%T7Zn6+66R4q-(U{^Mnu%JPOP&k-Z&tq8PV!L;CbcJWJ z>AnN-LSjD0>1JE%>d}2bo(e~OIB>D`7B9A~z%UES?TDuJ~K2zfL^7rmzETqVwkGR83uY z?XC9W>d0|us6|42j1(HXVGJnOeB$=MW!yz6SBbDzcf?Q*)tHG3jOA`pY%LPb{8dCt z`JQ#iBM_nSv8Mya(SF10;k2vrHo2%Vxz5e$Uk$%tj=s?qS;lh0C7nvv;Y6x~mw0gf ztPxw!#t)h5JS`T`Tbdmn2mZt!3m|c3(m#hWq)9CeD`YmvTB!2{&Dg6o#x5fxeL6p> z9T4f4V&xn? z`B^Whyz6_7`O^&?*z3F2ku9cG`l-(`y&e>jo!p7I=d-aRcHS@K3+&xH6ehG600$He zY?C$fnLwU=OdOb2^XMY>I>_7DuG_q5vSkx)0W*PKwB4W<12aT@PVs0Hq(-m|V(QTI zi`G-<=qqcBruT@FHi!;n(l&lQ)%{jQ<0C@t5LncaHjC~`y#|NC8LQEHgPFQ(sGeAh zm&%Q)@q7mP7!%+YV168bM1I8Y*q8V6Gt?D03_?HD8Vx#Dkb&&@La1uJZaJXtQ+_OT z&cR5=tkG=7@D7U2U^8d&63pP8(H-PP z53oJi|N8KrQKdUX&8=G)%0F{_9ER2{gf9EE24lfK#^pz^TmMNFpHmp*x>RvT!%cP& zwy|Gomkx3gDIY1boD);jltKlQ)9@YYEi*?P7rpDx&Lt+Vsgn6Vu4CZw>z zQSwp^cy71)7tISNzVL)Tlb=<0<=yI^A`3)3aXi4og+uoIz~~f`4-OM#+fDWCL5Nl3 z?kM?c9`Wq16(ZwB>NbAB3c~Jv9dQ!A4?vG%Rn&FAn~p;)JDA;Pb9c{D${P2JQcUW& zY$lX328xih*w*~c!(@DtUZ$xY9RvEsvSWR#fj~^M#Sp9@8Z}dqxNR$6rf|=~8q_Mx zlw^zjoMtuMi?bm~p>O&hpky2DT}r%-%nVb&p%{ z84F+3lU~0NXz?2YsA0CpTOpI4*N}F|jgp^J?|x_}qE&t%8L)(oLxgfJ-9I#q^rbz5 zNHqX~I}I@M@9!`#5?S+cCrY;oky>j_hqtSqi~n69G78|vgjrt ztNMn3s-JcFOqh{N^Hep%61okzCrDQ)S|)IIhQd9)?ctFZ!$SDey`6s?fjN~)Bh2RkUKJQ<5BQCGs@)Fj#EaE|LXOM(AH-93 z>6*~w;r+EL7waT8{G1qa_jxEa#zbXX$5mbO%1`D#H z@(N(M6Wv4hsfaJ+$B)LGXQv~8=q(W&#V@`#r#6Frs<8S>9X==L54$kBZwmdaPt$qU z*BX>={Z-ItTSGY2FX>2uyvM36ghn!G!rCBzX4WA#&~>zgH#HaoHH3_JlZ5?Ehc?<2 zi@H|T;igp6N%UDk zKl8ra1OS^5N&q!%%kO!m@XZZh+~23`G!IDIw4pX-^M=g4v4^%{sQc_!&PU>nnzP!tXR3n-&Z9=f{$AX^?{T+c@c#V z&_?5K`%BGfAz0=`9bgVn_pgr=H)w&N+L#{*H(XGUG>ScY#)?{{xoP{KVlOlYBj>=j z(=ra5^cbDp5B&?yOR_`j?@GZwYA8S_?pMAXKp73hYvpk;K68o-Q2gVLbktnH145Jn zDp`d}O$J8BCi;_3gRju%0{_2)RMfOP5>t8r;Fc{90exo#l}=PGCVyRWk1^CAuIQ$T z((0T?DcR=VvosZK9Qj2i1k_=~)qKb7Gzd~YF^p0V-hqp(#4ICM}qao&xRxRo+W zTohK3Rey?2z^l|7Jns3dqza@}S(y-hZiaqvS#?P>JZ_rCDg}0 z*T@r$mvInXz6PO`f4$Fq6JkR8+v=^O8KZ#nxx9g#S%$EpB&NY?(BRWbS90qLzng7{oheI0~`$-#X^I_I}q(Xo3mS&)_UW2UhINjCoo%U(Xn^?xVR8`P|9IFzXBcXcmISvSZaaM>sCP;I%#|US)X>Xx5OB zQKzQP2@s{Nq49ElNcdZZ(z50f(vC58UPpje&1AP>kmItq7ck41N8mjlQ`KC#qq=XY zGhM!zv&l8F19Wa?=YZsdG-6;Hm4(6n$=STmyc>5cWL)YhuC25M@ZUA9U_~;Jw}#Y+ ziguLj4=x%Yk+RR2orgk|eYu|O#1gSTcZUIYGY2HR6H!C?C}+UiwNCf0CFq!>&g%6~ zORh7^=wa5+e?Y;Z@3GLk{*$WSWtIdfpfoG-g*!uhfI+bnS(A<2-S=iLh#&-Ov+rF) zbV%1)DY%11qS|9eT32cBPZ-v|6vWuXXI;9%FST%NYFbt2nX%lkgeo}S&N;4$rrb)S z{#yYT1uEc%vciK2Q;sKW<+)!eMklv3gSF+lUE)bWTm zUKiRt`kETev;pyjog?g!KeK(GKLU2nL5V4YO+e~#ngJ`mq$&^R|4KS15*2cS&2TaR zjcEb5aKfIt`*Al^_R@3}^wX8fjaN-*?-W_=uFR=%oj}f#fda#LMNe(zd1B$Y%*jCd zCOK>{Gd4rH>6?F)ieCoS$ahn95dezy@!E^X`Q>zpVvT*B@a81fzbCYhkF**mhAk~i z=5XP4U#4V8J(mjRt&;IY^c+y0b!K1l$?*1Zh#3Pjxy+jrc#SxHs+zYhtLzLK{;ImB zJs9spndTlDf~Bl{qwF}qRZk+X=dkp_MtkW)nDd3(_2?i8ARPV@cq*c^cVhl&AtuYB zd-M$0oy2ZFp&wvx64V`3&uu3_Zx@ax0qxx{-dHx=IVBXOiEv$oZ=W}R8a4-Gy*R3N z%^zsG=o86N0gfd!hSvTsrUjO`{Te&wP+~}2ougASb3fqTmI^-!>gLsk`_LQ!puq@DofZFuX%gcA08r7g6vxK zp$GAx$52gpd{@&DY?q4AQJ_rj^|T$|E?WAbsq28xiu|V2t*rI?`rRFa1JvE z{#&KIoQO8Cpd!)jnUP`$R>~3^Y<20bH0%1|JYcD9=O{`{7^_a5;d0o1i^q`sm|VVr zpJJJ-?49x>$~8$(yN>&lkyl1H11i-QJ27z#y6~pl*1Fc24%H@>2~)o74;uw3!C3fq zP;h;ZORN;~)1Wg~iZk7(3iX?;D)lR}ZE4!_9nW1BJgPkJR-C>RRuE_DEZ{^dmCd&! zbKa&=r=R==*yni>Sd^5>SwV(}N$9z6>;eC5*l&c^8;={Ft8JxCOGIE@xQS5N7Kh*g ziB5c*K1m2cO4x3>0`m!U!o+I2U`G3=dGZmX@z|WN3o8;fmllBefJ0=K@TV&CVJBkS zs|(F@vg`>C95KyOC$A;7p5Y&>h3kchX#B!kbBK!^O)GM7>ZEpez_rC~@su#qis&}} zT^;8W%8Q_T6=-Eu;q(2WP?YKJX7{r!sgI~RAFAfkazlP;Txf!CH%+LdJGr5iu~XqwDET|JeZ- zfCdn6ik-lLdbqNoQ`N?|s3m{VT%lcgT75?r8RwxsrM)zDHv6D)*<)3}{|psjnv;s- z>ueS%afFJC~Lk5#+sf`KipeKXVXJyz0jYcM0# zrpyN>7$2v5fg0|(NwDDW9*Q%3c4L;9b~OpZi5*gTLiIuh?b=_RL0F)lX^x3}K#^G* zt0UAM-U4@gW5GA_HY;6DO)i%PxP*->P)5k8=^o}W3lp;|^f8(8tTUAQay{hF_JEm~ zEIQurlCb1BgA?^psFQXkV9-FNzkz{QLQglAwmXDXhS;1EJ(DJiNGBG+ua$SWLw$*% z8WwEi1XNjd*X~lTS9dzU9nTEkbaonBTDl&q+_eA0QD-r-?3edaHQHgFBR@1FGxZl& zUxmQE&X}?9>`X@0Lai6&Gm(`|k*4&X=l}LTgyXk;hLXfiet)WC1os;%8o6lY_f*^7 ztb}33(hG+?9`T|_^3hWEY3BT$nTr)>zq)4LpQKf$(&0$ zR<7@L;{T7tY$Z}2mU=ZlY=Pjy-Rm`D8F1&jXLY^G9=*t}}VGsgGvP z+wVrJR=g`W2lDzrM7rBcy22#7*F8H(5-0nWED3x;@h>ZLIcG9unO-J?7{2!uVKL(u z<_IOC>kELGs+;Ci?d$P(j=S`vycjXTZ*`X$iJgcer|uO8?tJDO!jc6T`5&Xs6K+Z> zkaQBk>9t921uSkLoN=h(*RmwwA70jW8O>mtekKg@>Q4j zcTbjZA3K?{fLu$Hd@igJU+}dX6~DX`4aP!x#q-?f3%-u>UGmSq$-<@T8+m;6ATmRG zo|@xUg^OQBHFyjZqq(BU{4{D>)_xs!d|?rbudLlXQ_!v>FYnih+U&V7z(Gi=cVM+TLc8_`SE> z2Eh-E!cBeVw{s2SBa9*a1);q6@Ws}g(oYfFDPsqk$|gY4+4T~U9w=7!7zWC-XN(Rr zu{P97eZ%iy$B3~71{_3^GbO~we`e{0Md3|n12+4%Iy7oFb?#iO=PTXDyb*6oL;-ON za#Ek(L@Bdaj-ole^XR3?2k86e#;2SK&Qa$vgVecsKf*k<;K4G6B5^*>Jf%rfAiaRn z>r&x(9~vChEKE6>sksm=z|nSYkr`RpJ1%KpB{Kfvwn!&`F9w4P-Lz(xhX^%E2T?gc zQZZ)6g&MZ`tutwh*lLJ1=h>c2RJB43N<|*Wl%O?z;=LP7*OzfOb|h?`s!fQ{DbTTL z@U62x(0`4n&quRl-g9xUT>g|n z5%YulWa9D$5NUT-rB)~(50>At{!)_%*__0%uh5N!9W0Pc^2lp&1Lsf;IMENgyLy3~ z0H{AvWn~*9m>k#^Q!@{8*!V{5IM7IwaXvlC?jtwqsHo}N7U zeKIaj_D^kp;%}Om(L|XO_|Wn(QIb7@isc=iSH1OxljJheOSJpT9~rZ8I@; z);LR}^byaV(W1R?#cv4bjrx?q2s(S%Mjr> zv#*QP#KLR$gFKU1qq;{^&6NX zgg9+GtaY!qiaF5e-yDUdRygq$QAZq;l=f>q>kNux2q2P$*nj?RO*5p#bb``&Zj_0KOJyuka}QVzx)1%tGKhoyki- zbiPc2bsyaV*7M)*;ccd01w4|D5Mali zHLDlLcZmh;*j5$W-IY}n)fM5EO4DS+4kA(;|yF~Y|QYie6zo!$m6z}%ReXnG-v0kBNVXICR+eyvXn+qyV zZva!=50!QSD$U(pb2aO;=8Q>00MXw8eQ1cqDCkJD>TxF+?^oI4iU;T_?J^+pTD}cc z1Y0iJGKe|i)EK8Tw)tsPu{K>nMZ@WZ3MOGQLU ztX%`rn4XI~$hoJ5z_=0)L$EumYSaH>?<>Qq3Y&Im>F!Pu5J9>dq`Nx=>5fg8bT>#z zHwe<*N=hT$-Q92&yrJ*=o!{rjxxSzKlD+nFt(kdd?wR|ZUWDu|yE&w!1PKEjU1R9HtB{mVkpoJyD+~~ z9}&MUsGh4U3NH(eNT<182V~dyU4=@w){^CQ0@_JB8n8cStG23!!LZ|$-3m07WvH81 zS0Kz#v*~NsSVdC1UathvK-}l>-{xFg3_jKc+PmpR3Z2Bd^>y!8VYj4NZ95Y`{s0Cv zBr47VeYItEP1|PqGo*LtAOQ&&;tGr)XnP=PVZjF8iJ26OP#T4y&k!H-ys=|$oczr> zSb*=q>5*S#q%Y(I5(iawYAv2(Z;1tffssm3#?tfVd`Zggmj*@1(r>rOs0!^}5c$8d zD8&rdF6s(XikfUBVBi{Zsyu(lS3S+n3`Abg5j+MbAI7jna`5~$d%Gz_iV5W5^kLf; z(XW_UR@mrGUKmlaNsMtEFCHMFqb3+VKbwYALM)+oq6%+cww^`-E`u(+@KCZi?_=4yolwv>qbdRcAsF?nc&s>l_@g2nX8XND7uEbZ*bRlPS+d}V76Ws=dZ~OER z12{>-5dG2??YcaUs8DvtoM8*h(qHR2ec}t{0H_>m{S8L35!+J%iLE%}VRk6W?A4dy z)&)^&i56(l~XJLgm`sw;C!#3v9es*4vFvL}+~4 zp-WdTx{Lu0e%+*l1eISsraBD~i?>BO=LQ?VXB}o0<@ARl-!`kwzUo4|1DE6eo66!U zx`6)7m)f4bld_lktfgG*h)28aCf&{7(k~cGi)pCv5jTY?d%!JiQ_@2ilYy64sDrZS z2Gf!|r+>kS`)zFpW`)4{PrI!y zQ_)@M}ns}c)d&5u-26|8yc%`{RgGzWmCo#37oE^E=*Lb&I2_7n@ zx+Bb4)HxXhij*OR*LfoOGHpk)QFdyX20Y}}@4C;1+1mh^3LpgR=^TyiX6*^wNF^ggSR=>J$FlG|HJFN1eh5KaS)PJpD|c$RV*3s z@y{uB5FILzzbMvp$vFErv#98fK(0`)!Pktjw9LPrC&(pirfh0Pak7w^cbKE{vhyWs z*Jbg)4yvSmG?3r=IMpl<92uPcR>w%e z*Vv)XSQq_6fSbdyu>zNDfJAy7!LP(s4nT)-vY#Vxod=fGa}zH2>YP z>CCq7aOTmS+Yhgtj3u0sGcUv}9g1tyXIZj1=cO5YPzIWBDl?~8mFvjsC=XhVC%puE zH~ngt=jYp2(|9D0$3ar9*g$!3Pt{mM@4{EnIx#xWJI2cc91L$!+#6^4%k|D^ZHEzSZjUuI0%ZuIz)s5@0TPm=9@`jB z3a?8z^j6=egoEEW%Y5Py^(VO<2|5ql3t9USH7;Dglb@QHSd|73bcUv1htXxlZOyH7 zmiGIWUO*bT{(5{NVxz+XL{2I(w{Yc@5fdCOiGmo-ac&j-EHXQhI;G?oO^i>Okn*qp z#V(I-dS;gkOoPi){^1>KLA<<#Cb(Q!u*H)oR{}AAc&`5-h(k=nMw5eqy8q(3m+$?9@BO&)zkKii<$M4CM!PR4EaXm* zbVTg7DCZcsoavny3tc36CSj9Cyhw$-F%TQGGz(x!2Dpo4Lt_0hZO{Ms+xV|g`z8+n z$1p#@!vZrvGk?1|#4`mpgQ~0|Vf{GQi~jkGJ{8aUBLW5{xViN}J0>s9iV~|p4^RgH z+sFSaaD06h)BrBG@pl>mXon1MbGeLGJTF#mcZzzxzyGN$fFO_G*ZRI7@uyBWCEE

mJpD=wn627@3D>`2zuozyDYNW{}JOn?dd) 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�tt|zq6FwB9 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%0D-jqKU>+Oh+SnwKO!iw3_(eaI@_qoJ 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

RsszHU6nZmO3I?44@=kryt#TDw~VGav4%&M8EdO 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

E; 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 Rv3K{^G}Lrd^OPUI`ae&ZWo!Td diff --git a/SportEventHierarchy.png b/SportEventHierarchy.png deleted file mode 100644 index 40bb93ca115e5f2e7cbec03876f3e9a753c968bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477034 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 _=>T6*S{eY})3wpCu9rO78Bp5lMF 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

)vrNwS*2#ozj z36~Xuq7!&p?fnSg`84BQ4sZ9oP?PZ$>5aLWzI|jxPdyU@(f`^g>`79pq5E|#oz&6eB)N50TtjxUhBR(uDAvq1qJ5xCBxHw6V)HMVq&63(I-Sj z<>I{YefiXX^~~WPP7T~r0a-q{>TG4eR7N+gk72gq$ph*ZUDE`PH8tYB&aKc0JA@*M zuD!bxT5dB+ij#V_8EjlC$XnC5l`c4TLhUntoT+di!}K6A{f$8Iv<;+wH-er?UUH^9 z+X-@^Iu4xB7MH7DpvzUVZz)zWlAcTDj9gM;06smo=^#ZUL+C_=SVeDYVnTHvJlutc zHX4fs4wgwGLfFTWq=tbU$l$Nm{PNrM6n{N(Ag~RwU*UU0%(=W53i}5(7;fhIo&`gt z>nr5HB!|NpqK;G_!M-z1v<*7vrVrhmmmXV*K4CfKv-BkzSo>O{DJ?SzlJ?s z(FYqYl6@u94_Jt+JW~ZCwiZI{4mj{aGF%TgVS^=LieU9;a^j`wEWTcC8`g215X@QS zf1Rh{4Oj}rZJt;SUU1e%<)ddWn*f0KjY&mLxpQ9m1{=JtJNdVy!NF4G)nV6UF@7`f zjKad#{?r@|p|krB5uyGra{JvWJgVd_+RJrhg4Z^$fTe&B#YOkHmt%(lxbxnR2|r8k zawkoF>Pj9_g6#I-0eBeAtN|3$y3&7VFH{)X_{zLaDKUIO8d1QnM>)NlGS{pOj?8T{+OpD+!_w{Mi0Lc?TWPXUG#nd4#JXf;XlN>4o`QR1ZCyTEUwJVf*H@=3246i6!4sIGL13> z1$_4qv(W-%D)91ge)At#=8ll@t$ookPJHWwB;=MBSi|@Bx^=VOD(V0}QVLNwQiq@k zA`7|eCq@6VY5#I(|98-YbLehZ_Q)yfG(|_bL1nk7YFz2v%s1m$CEuK`2&rI8LTFq-ubH-K-T9zB>K2w4|1 z#c2)!#A%brj7A=1erb?;!eHJA0-jx&W1b|7bD%+H%txhEmh?)v-YbI|?`|X}N#|4~Jwup5%@=1myPdxn z-mk-a30&y_)ZUy|4n#kXs{Q5UWgPf{ha{7yIR7;VEMh;SnjKDyOTW z5vX%CGSySU44s9J#B6GR7$KVxe~Z#vCkHZnla62sR!P{z zLJtN9{sZ^SV&fkRu~Iqp?peEHnk(zlBgvZ3R3E_bP;s4#pj2|aK{&W969!u?n{;w| zL!u+r;@q+EhXWw^Ketn*oKtpuc=(59V(%ldSnS1LDdTnx-=DsHmhSrW$zLkdXaiD4 zo6b%rRb6ErV(W51#$HPNd8t{^_=f?bp;`Q%vuSb9Zm$DjmM%`oI1-V$ZJK=cCD+6C z{XFvX;NXo(SEtDP&n@Hyj^rZlBmME}3y%e(=uX0e7&a3{dNKd}JRgX~ zPO#Aba)i!!LyAoG>&)}X7n|ZPc~ofKor|pI^$di|2DOF)Y3E^Po4>Yx;fZ!VGV>e& zj@3GQmy+ff5DG7Z|EmQiwfR#j=$HMk*5+@K<-d8Ne=8aP)h7gz`lpEIzn)2oi1}xv zya=Gs*e1c&AL9uBLi^_=;2*o%?W_L)7s8(r zai`t;Po0mXfH*rj;-&JR9!V*%A*w?4qO^AeY|8%(T~rXdZD0SwL4WHD|IGsbEjj(2 zW8gAFs_FC^=6Q-7A*AW}QeqqZVK)&4qK_%b%fQs#`rkhWDWPgkr)*j|%lAaQYjK`% zH{LojpR@o=aP-l8{WFsOk2fNUc-Oh~q%4P{W3a&bq(h`rl-8JE_1>Ky9>3?faOq!M zREDk*PW`cBIAI2EQg`mK?*5h@{@2?4s7sZl?r~l(eSy>WUQyj*p441Kd?4vC0Aom0 zbo{JE*wqh_eC5@O`-_7d??v0Zwu{<0HYyCoh&%oazc1-yz6hB$qj6#zqG+a98Ym3C zOsG{;JMy(NKTsds@rV5970~jO*@znHJhG2P!_{c7oQXIjc1Pt7kv}5c~X=eFUdcZNE>|Uh2Dp zA&*m=pr(Ewo)leSwRnG_djUri@j1vB|0%e~pzB?K%quW{qNLgu0^)W$jTj%|_ zvCyLw^SRwR6cv46LGex2x@oDvEL$_Pog}zZu!2VIO;*$L%EkRV#2{w=kqrgiBK73A zb#7nkqJh&kEx#(&a+8z1W~zYOjcDX~qA|>a5bXlYiy4@`SeTHjLm_?sTk8H_>7h^) zi*Y#rg=o^{zyS?7He*?|4!b>dwCVilwtxlnU|K))ya_R>Bp{ ze*PS3iNL<3qq!{l@|PY?f7Zqz^Kgpoiw6es{+>_;B5lr_?@{g_l>9toEm7 z_1VXQ`+FeWzEAnjTl@k9ntqOwtDi%1_1B1J?W}rC*LRtvaia$8A+KgF>P5@P$9*x8 z%{APP5Nb0sjT4q#lfMtEk&4{8V|nklG#^F(tB<_8`cwD$r+``>N)BWu91=m>7h$bs+)Ral>sl8NgZDh78x+w52VIX1s%cN zU#hH*n&$+L=0^^5;c02K*Gr>`NeT+HHg0oI*M?nP&aF1~rW$3B6l-O_%oZt`u^80`yHvwZGsyPr}-tZ56Tfuw!?Z;HR#tB`V`;GVB=5+CJCwdj`E^nruq?v{+a^cTo9Pb zV@_rrJ(uyOJ#VttPue{@M$){7C9)Qm+pz-z9e968qJH;ROiL*R1Gg-cx<;|kWV;8^;(o`-|-b%wB z-Mie!GmKZNy3VDWa-s=QpB(E&t>)!5jy8+UIpHy98zFZsAa;*gkLPHv0~PHsQ>jg@ z-j4tGCAK9T@5DW} zE|=Tw<4$><(~A{;&t%W(1&d-@pACJ<@?P*vf}vLqXWNW>mZG#B%nb3TXtEbVeV;b4 zX`K3b9Ip5CP+MR_AxYZ#BzG=Ce$W4K9ZK0ih;={hNwrqQ-Ltl_xA2ibvT$vVhQKD_ zkWWf)vz9{mrXHDSdO@xX4XWBAK&9$87f&C%%}v5`zoF@Z#jn!lf~1H(a!TGG*B)@~ zL+QAN&}lT+vyl==T-8IRodahH13_~V7MgF_b^1s1NJaD|j(YJsB+fDIp#&?v0ha;k zwT-1972X9$^gqfh3dH<2Fh)cI(;Kc z4W~czQz3T`(lq)sHqe!o)x&f6MYS?XQ$0MY)LWuAXI)MCBo5pqUxDwKX=u2NQTB49 z#*KPcxJYToGk)ReIkj@MSWg6+(nwMSEUwBYMo%rCrQ~4gk=j$E4V*Vc)(O&rGyBl;a8Z?V^uv3=Q2&SQ^{3aX*mRf2$Xfr*Ypl2UR&53r)KLY5mkE zy7SyXID2w!e~77+ZszQB3=nV|uHN6-iU=RtPu!N#vXpUzybLORoON~z3z`;(&Q`dJ;JUB0iB=Bys3f2wOYUIEK~q zOiRX?sdc(ZrZ~*##_Z%ohGY_k8w$dK;l)7LyiMfA1I+f%03~d+ctM7;#963JaPhK? zt9;T2E|6Uq`8^)kIPzNH!sFP0NHB)id$_DNRk&neuzYQ+D!%=-o%YEYWjojKw-`y| zC3(&;A6KxfD(W!P5)Ki~ef}b0(w;OHC%wi)1K*K|)nGSqj2Bdd+rO{0%&yL87E-o~ zC1%@4>kOexIn%SoN+yzmG+@VJtpDhdu--#Fiy1Wqhb(`u(Y2>6)EX4r5oH4Z>uhleNj4db)T^wGtF zC!eNpfdMC+*546LYe2G*d6jC7JSIxK6e6f1gRt@`&%+=P6$q?!(Z+~I1N#MKyZJoOn)$rccGji|qMEC+x~oYE$EitraqjtR zbE~84%mI6({Wn)RVmaysdTLL$$nqTu-$X=ox)`&yY+Lnfr~8l#8yLk_4I>T=KNB*r zxZ5RV)l@w9u!>_@hYY>EZeX0HarACs!S4lIGqv&b<+9ocU?SV!U+S8nP3P1{?KT9W zX9kWu2f*WO{m8aWQc5!exfePct+*w=tD`g1ra%w+n#*6fZN6QT5;Z76cvS*AEgid4 zTshMoPBXuzGu!+mxb2k&dX7LU5LOkWpvf^PTW)kF7K)4;&M;gqve{@&L@oNt^y?kk zlQWD$wXb0Et1*UaOmig_k!Y%RjU#&Ws8ty#YXkmSH1>g0S2YjzPG+;wCqT&BN^-}a zPFF|Hm4EXJZ@00dyX8Y}xfr>U1wAfsoFnaQ^}n?K@k>?Ch@1zdAJ7wJuOjCMtM2U~ z5?voVZy6;BZ$4i?8_&9U(@V$6{95uln8n6IMRly7W8uJZ1s?y|6OJ;EyAL#&&B2!{ zeYAO>YEyDrk|qGHVdqlZteV)*@S2|dny~JO$1&d`>MY<%*F1|-S_zCemu!@kdvd0W%`;*Lq5cD@gRCXop58T0Y}LBQPQ10)#Dw0o;LH*euMo*8#B3zgXp z-P+2_&306q!AA3*md_Job|0q-MZ3mJnxh%VBzosb+A664K_d7Yh)ie*99~zX7cAmH zW>0119^}Z5&7k}4`>t;M?#Th9tUz;k8h4ch9hepRP^s%{lu2{UWQnSK9SnaO*T}w8 zkCrUB$SJc?y|5&Zk0fwTX<{5rymqUbbA*EOYM*wLdg!1;?!@#<;(BNMx0^e?-O%Wm z1alNsm@3eTz0kHLap20;2WFr#HCMxXQK#V7dJl@(o~mq5Juc~5Fvv!w4)d)q7|td# zQiJihyk8t_M!o?r3vTbgkoCA;=h`cBSn9lg^SBLh30v+jibZQjVE_BGe=Tvch}eMM zDx|^zIjDyYI(zZ4E|y`nfNLQJEu-K8vHNQ54rc6VXJ@q%0XOj$b;}pCo^DzSiY%HO zZUF88a_w=k4s9Q?blbSlewth>Z~wg|Zsl{ZK zh-_oT5Q}qSdH2-U1aL|u7QYcU3$Wlhm65bsvKdy=_S5RrhHcS z09wgKo(3e}B?qqp*y?`Xk2syR@q~nTR-}`%BIYm|XHk6(34T+4QwT1z{4SpZ0ZO2~ zEw>Jh_v;d;gxfO&a40I!J;eYQ;N+V4YPkv5gZCJI>Q-0nCEPN;zbAn4zaoI60jW%g ze1+U$OIAPd6zyGnsn%@#lgn8bUmdfX_tGEkV8Sa0VkwW=3w=SCJa>dp&h;;`@M#?M ztSo5p&8-9OXs}JeL_)eiy01@iy1?4Oq|f-Kw-4~>fgEZRdKvE8A-!zkq*de|ehob&ydhsKdcn!N6m0S?&5tzNG^40Qwy90rbZVeOivX22S7G zO4b$>FUWmW1{~~2PprGv-vpy}4iKct$@Et+@wd2WCA7LVT}gvk)vK|UJH|o)rXg#( z=%A+C!R6rDaiw530A0}xIUn|rbQl>Td+VM#y2O;yH^i-Io10Ne=EulPjtNb6=W&O{ zlmLIqs;DtrYD#%HGqB~ujen=17owwD-BJF4Sz-JD^X|JJhk`79UGxJ%36yzf?2iFb z7%%`ep2|E}%QR6G6tIDrf4v2bK5C^OfaqV%Ih~m?Mu%SP3;YtA%Hc6`4iNY+TrP5M z3yL;_Sh7X)D;m({ZvKAm;UmBT{e$xb-cIi`3>^<0XaH)%k{5)ERvQQ5vq%)EQmK9HE!2CG)^BDaVItv>DZw0H) zX)PM0_8olx8QDt5oiND1F(0WM%a~7zZU9L6bdV zy6UUBhuC4BPuZGHYr#2j^N0Y>`o=zd1l*gqutC~wL3$?}lm_#>D6l9+Jk@I4{jfI% zfXLazo(Y+f#8u-K2Mi7E?|@Zum+zfq8vLSewxHm~v5Bz?gDc6+__1-Js=dJGwkV3K zZ!DNb&>Z1T-(mpz;ZG)4ucKWTAkg(B4GN&o=J2a%!gDW9$Q9HtNb@Z6$-ScnkDHU- zmEF(u5GW1JIkOA~P6C5Tm@k|1JzY(i!k&)F?1IL4w}F$ zdvOvo)|aPltm*WhtAvTx-*te7VS#-EK5+vjd=bR7)E=6AQCD!Yc=&UiY(h|hIhh@2 zQ|lh&y%`S|;;>n?I}Ywg*an$3LZf~5xl;*}F^2O=WK3jcQHf{JRWye2>x%QQ`OC_m z#}G6BmJD2lqti+iUpf1pVxVUmzST8#)?9YK_$MVpDlhFF#4jY*;dZZ&gs#+o-+ktF zIXbzkWiESZRXjrl&RA~B#gLwhLlRu&1C*wNd1TLO!}?f=eaCgoL8q`dpR&Hvi^-vy zb3hOY7{Lh@6pm;CGYPTaG}vXxaF5Eb>rGvO6ud&LJwobrc%jiSKl1ic3#EBX| z<@siKD5k@4u*if(PaKkxaa+S4o3%=#5km<}6PRHEXne80&ICXm9NA$XcQ;jU0#{56iH7K#Fzs5(WQJ0nO@`-X$AJ!!ch)sOKRzLCC7uu8gKJfYB6+3+4 zky`eE5fA&SloHyFQ+iqfJ?)_R+INS6_J^PWvk&3a2j=xEv$czw z_zEHA&ijLrxZ-kk_RMGrPTWc&E3MUF+6?H*=f-ql{MA7TMzm|Xp+6#sT7J-rT%;1L zcMV#02KVFnIIcd8eIs46HpbYS*RzoLKs)42)@jbk^8yc_eaMjxQWnKAps@n_zn9uF zeMWunPwrc?^#Y3-7~xQVYNrw@ry+00t1H{&X(TgEcaqW`>=l@zhw^kJW* zt)oJqyvLV3^F6Zt0!V}w+NZR{G?a7$?r!eER)BC}$C*TJTJFi<@5!Hn=CkWLIx`-K zgXuy2qz|0ejTph9Mnb#8WBb9wv~=uV$%OW9N)ZVff$EiMV9 zOw4@oc+0!k!CT4m`+B>>V)~-`bE=DzuwAbRvyu|+98?1BCl8RcbgM8xx>SOR=<6of@ST_l*~UzEiwg7^o(58Z%tF#V(+uF;yf(7@~j z?4>W67a`C~AD(Iz1JIb_q|LmsR&{HU&l!H$vvdHte%f5S*VFU*J18d|PpG*Qsl(ok z7oVZ&Js3E>ahD~TF6PS{zMbgvYHqoOPw`aA^g1rgc-4?poM3NH=s2a$$o66QLul*7 z)IjUB-#u5ecjf}3-_6vJl%9B+e6qPxM^zOkvvp-wdn>eCt>@66>FeTQ5u)c=E`Qly z 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%0At7*7 zXtkW`VCmspw9~Wl1~KW^uw7aaEJVb%Qz91`#Y4UZP|I#2o+*+nm$_o<7j!wi)(%qt z!ZI19d6E5hroP>!qQ7P1yI`wsJr!kd!FmTW`R&e4%Rdc<2nfaVm&!GFsGBD^@lJQV zlgdF(V~MF|(0E4PkQe^b0srOzR-0m&-ND2$7aRNTba10}6(SA}uDxQR$hAw}ozQLH zcTbzA2cJQGdJJOJxa6zob9LY%qHnJE6Mu?(9;Y-!U@B!p*r^Y`qZXPbO;2g3_50-j*@Ea&gc=IaQ)V!gTW zxDp;rzx0j<_ag8Ioj7^!vC5`ZP zv(n0U(Z3|u(k2O79q_`!10({%)sz`H>7n%#>2s;o?ix0uKH6n-&4{+r+xOhcV-?4ShSC@S~_5hb2^b z*yoxi=$o=jNqzpnimy>u*@gc77be@B0+}VLwQYUvp_oyM!5S(nk|9+beF^L??t<&F zHmm2tbiF0D;$HLX5WDf1?K+LDJ|udK@B16D>|uRk5GP#-#fEfrKWof3F2^ zDJ13+2_^+I5!vDD!n8Qkz{HQ_aw^VArv`;O%c&WmtHVlbva-Qd7N&w982fbP3u5238DYkdBAF{m7QoTk8jCa&7pSm{oZ=yc5lc2N~S8YYgTh;nrRHF z@xwm|lhVlF>vFI&e)fj_PN?MWdC_YO5?51?q&7#>!gz%@nY(siOu24DhsjbVT-Y)j zd%Dx%SCqX3hXLgGezZfgbflbCPe++q=nM0Z8>IqR%1#0dK^t`#$yz*_sA_}LAG?wC zH-71sy(wiRT|?J>{pY{)hE>VesLhsLgA1C`oKytpuy?a5i;V93f&#v{~JFg-w;@V|U_Gx*#R zI|B+tUj6atkI#ALxYVX&k#cBK?lyR$;*7KSl$Qs7fF|(rtWt^I2r*TAvitwod&{sW z+pcXG15`k|Td>HX1d(nOkp}6K9s$Xr1w|S}q`Q$00f7M|hVE{Jk7h1s9WMzv$G4s;b{Ma|1b zX#rt<_2~%9(|*j~r@@1#{mYJp84-8hnDc3pK|tsxC)|0OMfUF2uixMF9*p>gn(L5# zO?PIiH(iS5FoHL;gVnMjnez$U~%+exIJG-cnJjE$Nmo9s(*dUh2P(jh5g;XlhMC{ zK{@zvm&gG4^8T#b9Ka5^{LEdy$>Nv#`<~}@g?>q7;I*v`@jv1w{VjND4f}3_A@==W zF+_J$iPYrRAd+61f1(Y%h5y#mtcjXPwGT}h^JZaJ!Cfoj`uGE}126Gk`zx${G~H~ zJkXOvlM(tW7Dr4>r_?PpCG;c(UZwLjr)JT4inSl)C+UpGLkpRgY}CQ5iodviYE#; zR<{sS&fiP!;3=nGB7d9^vrZUl5&Fln$344(QV=R6^lQ}&o9b7mpw)fw>f|&k#$;cktCD}^w;XP6$#&D zK;#9E7t9_yfJWOP>MXWL?@@p51*qgIqL?An`^M?kE`~qsUyf>#t#%WK=4_v7sSaKY zsrbXpln<{()VI)f&76EsoHby5)U`gy3E)@`ItCq@i0$k)Y{Dfp;jxp$ar1y>s1W>{ zO`+$j)RZz;S2;4|0Pm9J$5!T$yz!O5f7T0uDh*$|@unV#R(DqfU(XrO5P)``l8n@6 z(!6RGqAk9cNvK4bR6S`H$C0)5gC+TBepXJq?MRy1Oi1t=oW58XjcyE-S2-3?es25y z$hnqEAG>ngLUFJXLHgK z*4XkS?eIKEoeeFds4LZW*nF-iFCIBc=toy`%`b8z&DXd2vUI^^lqo--QzHLqKw%~Idk{dm z&dBKiY?2H&*Gf)Awg3W;?QAbpmN-w|^mXQ_sF6!(QcB&-tbaDP?LnV`g@E1iIHij{ z4O)>-bpIMasDTGAhRgN2$0QNbM1Z{QTd)0AqANi3j=uH>s3-+;1phb{n`5q~ZoNg^ zT2tqU^t;U;_#(?j68_DbI{qr>`$qo`X*bVvg&2JU0RgRe{e(Vh+$zbuv`%0 zm;`mWYLCkME;NH*3(lpmidR_O7DCh^bHU!ZkQU0pC0`75Zu!k&;zh!I>Ka(mP8msHJjo$ichnAt+1_ zj-x@#MzbGmKhH+hbJ6yWB9ZhPJZ78Hg&aaLfz!KYJbQj4le-#T1IA#DgXXKPF@m24 zWacy#p08U(om)-XuA3s_9p~517@{I+ikfqIlQh>}95J5k9~6u4+eb`VVNX_`CwdJy zxE2q|C|wdpj9uld9e0}g`gZ2__!xQ8$fEHLdtRAr%g|uS2#~8epM={X^4z~EBQ&4% z&KXGSJ-<&B3B^i;i|y;o;;OVy0EQ#4roTgS^CxVw=p%FR_z=eG5x@D`S}n6 zy2#D(jt#2F8s2iU1ns-1)$17-PL#!zweR=d#nErFhRd7^!B!erYK9Sr6L7C=Y;1z2 zmXBI%Sc!|K$e6;{q-*;(@CAQvTTD7CS~28N@6A z)Q~uGIw8SKtFf7}`8!T}y(t?WYZka@y|l-*RkmlhWa~eVY=qH1D;qt2kzndihEOg7 zWbs|fUpP`VzB!N~tGV2g@BOH;cJ8$lx>b>f1Zl9KinY5)NvW!N&uJ`H*VBFH8bjGf zzEj()Sq}C~o->8&@fld|S!~zESIgv^+DRG-ckGu=*IuJo&_q5dR8)jdRm3iz69ix?^^S()V3-pUWfeim|B!+x?MN$9zyX(XB%>>|>DP~sarLVniYMS*nz|B!@ zb^HVQM~`P1y&r+o6uuLdC06IkwW27? zXBAbJ(;E|k&uCGSg7OynSmKr?+|n)U*21Hk9{c>Bhjd~~x#bzIFn^(6m)5f!il#K^ zogJmEFc^T8-1nyv8fyzNS~8o`nz<*|)_b3Ijt)9FyPh@&5``ne)xUkY`y!xk4MhST z+Jr#p@YxSWCdMEk1Wsc9w7*~p(+ebmhs_tSi+Xjq&v>ZLsm*Z?mgYr1HKV~Y+ZHsk zs$Zu0kmq5S-6(Xm*>;s2;+IkmbzDNhis5JbW(PS{b#V8doHT-beZz!R-{HR!%w`@xbCI zAKgeiYPCBoH8PeZ8@$tFl-AuG+(71XLKLZ>ADLtsxI@U0 zZ5P&)Xfgg{PGPR~kYT8z42$iXjb@d;;>x`Ce^ zwAfgyRi;9K26B$f?cIgl({7zbWDvwE>QS~|%r$1}3Fj;CX5HMk)uVCU4@1S7?s1(t z4|bpYG#Oi(guIG#D$%nJmdKm|w9Qu)lcE7;EP7lixG;ILp0I1*$NLj0@nN4VPJ14d z+3$uUFr80Q?)TJ9g+S>_2=-Osb_JvBO3m#DYPoueYYL2IT>wU%dSS;(GKbJ)J6&u| zk7J$9C5!_yd%2r?KR4PK#EF|xLC`@K?<4*nSqEi_sMN~IJ@caNogq)i%0&g&{5dp2 z!eG@ajoZ9(e@T3Z+fedMh$r{WVonwhD4@6moPELsI%e;n9)=-tuQO3%K4Yj@ZWKob z?Crs#c#!FO7Vecj{kT7DuX+Zurn#tp*G<|G3B2W9o$Jo!ZlT-96K(&9%y; z{ZnHPdU{HfZyu+VWqDR;7NoZ`oZhElcgg^|P%3UGFnwiw6Y@ZNx#Q$0O>_E4U4G?Zq^y&~nMP&2 zIaKDsxZQ{GlA{Ogy>qkf+X2j@NpXgXkp@o2#c6x2Q$V*R!pRQX$2{SeE6eUwc&>J1 zYU7rPsr@UH(v#{r#~C~5=RJA5Z!cxn6GLJb96gi^EG!*ePxil4cf$rPD3Bo^I0P3jpw@o*_ zB=O1hI9lHY^rf!UP8vF6Ieb$aVUwaDs`4vrz(Zn!i0-|IZeQNgF+Pzy6eae>-7`T; z5xWsj?_=ZgYx|4U1Phb%m$yh)k6)$0;UdN{kr=0a_RH2u(vEy7%IEVYs7nY8}s^ZX=u|5Lid~9c?v}vHnp4CsHs>gfkDnv#Axt5E7Ofz&s zXYlo81c}Vl*&;zOpw3^b8lW0OVVzTNoHyJX{GukN(enJoWEk7n785-atXwmWVPH_Cc2u*Nh) zb}oV#9o$0<#qoC?FRQ8?tUl$4T`sX_^w7Y(6%yQkP}$E@Uy4`VW$r5vcw-oE|HZ83 ziu~+*IM>;j(qanA9C7ZiCH@y-fZ$psNg!0*2nfcL7uLoz#`(z5U5toqO1U-5`!4Km zb^HZP<%9)}Y`$ozzY!Z5-O# zl&1tp{b-t>3`1N$$Jv(~%E~h{-o!-0IUS_6d1*NHn@{(_!;Nlk3s?g3W{_YxG$~#8-zf@5XJXmL= z<(Jh~!$&2keK4@5XXkoP9iJoGF{dwdB8o3dv@m{D;zecgc{93s)q(NHP^F(?VFGKT z+l3=Bx)>3uyJe;AJ-DM%v4w|m6S)R{B=>-m^?NpYp!9fDx$!7XDwBCm>FkG+zd-CK zN=Q|MC;UDAn>K@^uJA=uggDyUS8qqYnr%FONTd24%aHN$W3sVAFGGxBPMd|2(@ZK3 z-Ivg{5y1rC!$%z!2SrjOOb=hWY%wwLTXJn}lrvk1Hu2wR z#~_w9Zx30nxeJ!SV5OY&xQy(*Wlcgp+mT9c$>h%ZRbiSfUeAj~arT0#l(i%Q| zP#WNFG}>rl$-nQj6klZCufO!eteQZHir}# zbnf(hc=SC=Y+cAqwnu=r_NutY0To5k!qhibah$Ht2=%b=aJ@-k&iWM>gqEmu7GFhD*WLL7an~_%qbbrjAGyNHeOkh1T#N{6(-ZCu&qI#p{Oz z?A+UfBTU&#nq`T*;C&}UQ-l5U-OBMoI#ZX6Bh+Fd+#&^U_yE#uEiZly9>}$b;z+1x zNKN&0*TMugA}>xjb4y;9SbF~z@y}7*N6zQwdq=Hyf?<3X0ewq7<@ivHlR2eZClSKq z(aER=D96BeG4(_hlK0;p5yY;ZgEa4%n9TFBn}+TXfgHc&OnUm1Vo=?ct=o;c9T{#; zxKDf@dAK@XtA6ADv}qc(ar7wsQH^N1@DsU2Qs3>kc5UOM?m%C+i@goaOp)4`hMaLi zH8dIl$)QUk@2c5HJW>UvYlZHB7IF3Yn>s#jdEFT@3TktM)fq%hbh;RjCav1uBGb z0#tlov{`;qgJNHv+DwQJXd%&pXXT55W+P`}B4hMG#|yDxYdr5rOKp;M7|_0??k$|g zpeIM3pq+~4f^`+%Z;p+WWRG_?UtjKNgE*SNa$+^dYB3~2gg-szdCz1+#F5nscvvT)Kn&a!n5tM}mJSC+~#>8Q8 zE^7g>37Matp1 zMLiG|2<+!QK*t{R+I#MlshC{i#x!^R^+Si^(dUYTE*r3>X^v^6;80AXN393vN?Yk6 z1GBeO$9SEPvJ`$oj}iaqXGv5X%-9M}wy4`k+o)D@ilj^& zu8KK#G-|YDj!K_K+^m9B&{DAEWbcrC z<|NEo@h0Te#REjnGs{@27>zM!NuV0dQ>0yz zu7ElQ1&cra)j-65xS$}(~aVm-Jx>u% zWY)VC5oJaN?I_n|#i`E79qyv>Kbi`}II_AwaOUAS2IP}C<@3E0S^5j-F@BBj*qApv zgGjNDWe!xUfG{Q??0oM(1S@n~!Zv`arA)nKTg z2Ir)GqaYV?3C#-~&(4jy)z^hjFK$Gt@%DW@>_V;No7yX9^0RD;Lz>PZw?CLJ-5Uz7 z?xI{1j$W_6f`B1$j%NLCaH%K%dE6ER!H2J8gp`mUXBk2|e1Usb#N6c<~#p9d`C zGjE9oTTPgV?jQrcyqfw=v&at3XQyGfKhIZ;$X7+JlkO3jHP<@U58=w8K1zr`eNyPa zsK+u}9q+-d!=$%w!#Ci8dR$UV&#P-cBq`+kPEJudq3^7cwkK*p<|nOWte_ylaNz|z zxhpJiL4EEH8d@(|9J8{nh2iq-YB6)il(g@)h`m)oyvC&1vaD)iUs$^lhPQK}N#&BNss_>JsfolslbwoPF+dH1xYbr+mU09zUPjgN{$>ESVMelyvCbQ%qM zoWQ4+aY1q>S8uY04m9E0K(DkRdCj%?vmt@=py}vyfQUmsrhY!S4@MuA^)#9BoZZ(p zTC3(A$t#$Ip~eE6j|ukPBag-=>U&F;R8e?o$XV7b*VElxTet#^JenP0t`^F8kM>?seDGb&ap(X6u~E*srX%rCwL;MrFd|m-AO3LCledXuSe1C)uBbKiqr$<&} z!z5XSdWEO~cSPm6Re2Db5~W{I%X&!(>G4=21>)SSq7nBrPvU{+HT z9lb5|J<4|gz7~EGMGpG(4&alLZZa2ia%fP?t=B|( zhmK<5+n*_*FdivO>MHUjvD|2!zxUz60w5>9Y*30(EzueX=2D3J}a;R)QIcNG@JyqvVpr1YNZWmO7}rEU%6M%rJ5DgNbbDdvYLbP+3#& z=VEWidDJ1KmFSaf(E5NOq!U`6)dplJ+ks>aKq)La)wWX#-@@1v;I?-xoxu28Wb&_l zScIZK$gM_5y)nYKXgiiQM!LPOK4hYwqtcQPuoORR@O)itODh*EPztSf8}7P|XUG#T zPmzn6##T0+$NvT?DgHEFX+CA4%$%v~r-qTdczT~jS<&&Q8Kb7Y5~d z!Flqv-QsIZ)yIs7p<8P6Gf{$k^-8!&7^*qO*^xI)5qxGC-O6ZG=aKWxfg!OnMgp{& zQjWT>JP6pn=C&)q0_U-IoB#|&OBUo&U+4?-N1Q;$Mo3K;h6gs%8cC|RhY3Sb^c}gM ziu?@V(RC+c#kz5ZB}I2-dcK=aw=xyxSef=tI{Vdd2a(=lqCrZ|d?}@5^PPP8NcSN{ zY3=rq9698tpFy-AOih4&aelCo;SlznMs!r=WNu85}-Q25*iiRkEPcQJ`yrcCKv4hvsw5)aA@Y4t7``cfjt z4=B-WD+?pG8+`T^)Ct-wUzDuu^!*yaQxVrnV3EHzNvrxZvePeW=jaVlj<7zKZmVz~ zVqxDu&p344N+{WRe5*+MI7VK5U?}@_X}3IlB~n)o>8K|H2?edoq8`_aKK6 z_A!naI}X=Yg->DA1k(3)1vA6ON0Jj{F=lNB%qNx%o5dMQN^B_D3?HjXc|dzw ztEgV@o&#BoHeSVAdK=8HMHKNo{>_%GC(nD#m|Mrphm-K?w7J$&2bx%QRdI)dUwuqI(Ko?Pm81A_B?a*^CIycHi>OB zd-vfI8*Ss17cZXWpm1lw6JnM%n@kMKqsNR0JF-&S-*7Dv8mUJ@B6};DXHBJ>&QEv3 zC?WAUSgtR;59P^A+qMR(LYR%YiPd*xYGP5+vsG+m9-gKeRksDY-b{tcBuEKglq>y#C@}i^I>M*e$>%$%f(^n z^@#6-1#fm;XvJ5m*8+@m9Ae2o?(}@5kWWvsfG77#x)I}Z6yROnKWb$WTia4-ROq3Q z#>0y>$-8y<{}I2I^kwQIV*+m7qDpoS zP$+|TiI4H4?JiEDJX81&r%wIRM$sL^IA)6+8cJysM_H$tCE!r0>D^C=KM(UKGD;uD znsU}a9_|Kv_cNhG1AD-67(gojNXwl52Qw3EL3VETOiL-|X*)@E_)rp^6ohqneYL%{ zTe*w!>;7)3m5HTFf-uI!+*W`8wdsZijH+*BJi7^1BEDv$a}Ga2mx~A;Wf-5LTp&zR z?f*Z3sq3Z6Fk}I2_8iOD$S$OvzUH6!k6kKwU-6v?mt0K_dt2jR^-FIPClB|~XT4Xy zq8_W!g5>SON*;!hSyI?mL41Yu2oL5g|EK03z6bQ(^V&}7pVC*tGi`yYaCqmP>V&ka z;w#y{l=5u&HHID|Bk3cm5}WPgka@e)xO8mFK(h z@QZ~$M^&`aPjK$xdA z_yVY~?kvoxr5x7yEV&U@TmuX~ziB$}8#C$^R{yVP&gs?jw5we08>82~hP2iDiED=? z`Xa37+#=`w&^jJS7j85YJ&nZA`GB6;4LI@$bjG|jm_3d{0&3nx3vZY%K2dkN1DvCJ z!m7&`TTrtHq?M?Kx4Sr_OaKA@w$wRd;+$D?2^5R)iatsI*5J~Nr8_>`aH>GP}hM1fp{v@8eUzunaKZ+-9)2}8x@uK@8qnTXGywF z1mHbAPYwm7R~Vunl~|GD9KS?@jhr2FG|>?;IjPSbb553caK7T-uAWVF-uWzR-9ZQeVyqG9~t`vAD2Tfdcd-_dLf_~R!f8#E-gP3+Gv;ghY}?c@NnfcjNi)JyM*yljNY;NgyR*{(Q! zb6|nyJncv(J@dOY^S%h1&ZF=fkAOb?w0f+Ut1Jj8fElH@I@%nmh3?Q8Z#gK3^0L`+ zq0xO=(sajGS5$rmL88a8DISK=3sgOee@vhH;U?>|Py%e;z--6X@XSU5LjaaR_I zwKZ#25mJ}MZ|Nm^R)9X7)~`&ECt+yz?!w@seiXw}UqUe58WiGjU@||`6LoP=>W3>1 zVu8gxGtE`dlVAD#1ee~F!z!3)yM(Y4mSQ7oL%^#`_Hp`(7QHCa=MKC;4-|s~T09*K z@iCZ8&-g*|%+8+a=t-^qIZKEfbG8iq{@QD<-GyWk1X?kPQ2zbq0v6`vW;zX@EIkL+@Us=G}m+y?m6e9Q^ zGU7e*vDAcyov7+2DNtp;M2WfGQf=ZZzcd!buLKeKvOp9lR+N>3>uyE8jqIs1Jr@6B z7b_F@zQKRBcskEjD~R;NPy**n5;k$Lew@$6lGWe!y2DJ!-DSP(DC`jPEf`m@x!T*s+=sahx5`HLq*`BFrq(1i^bUcIVhf0yHx_enO3 z#~MMpW4-i=9e~wK#UUl#xU`#y$UaxAW)%##{=(KjOgZK#$m^N^?4xcomf^8fw*K;u zF=oTX=JIP$6?Wab*{~o|jIn1JCk{2>lvf;rg@x0qH!EN_f*U(GTQ_~171xi_4bQa7 zj=1M4+u4|&seU}dT}-)<5_dc6aOmWF~9mt$!& zl$@Go8=h-Z?lxVn>72wwzlMU? zJ^POxn^GRr@9H&<{;ku9JBcz3I{9-xhXgtQ!KSu+1CwmID~Z%Wp4yo6j^|q?VP{oi zbc;#vQU-ughl%q3jEqkUD=^EonDHq3Z7)IbAwtD2B)S$P?#}_3z8q_K<6Yh) z0t`3qNFq9_m>6Q7#Z?wCo`nhVOIpDJxjJ@5CBC^rRl4LFfbUf2>FDx!WMUevLz)Lb z)WR6lCmUG574qR18vT^$r5LGg^D1X;_|?ZDPKU*X9Vsg?S~8;JD~A%zhjn({B2zuH z@Ap(Kot`$#qqengU6xiakdhiY13VOvrqx{f4+g;Aj{2UM5A?|GfTh29dJRPVT!${tw>~viOyzwIZ$*(7M;0@SB0Sco zX5FR!ftvA*bbYWeR0J%TbWqs?|58DAtF; z<1%5%*+1I%9@H;g7YkyMz()EAEATz$L10;T&bYrx_KfzWfAhCcaW3A$>F_G1G$Ilo zQcLr%5+B$JW}*YhR_YwfzUB@mY&^GQvzwv`{%rTsKheRJlYzL%{3^6m5*H^KkQZWGMRUl zUb8e}*Xqo>cn0h54t#FgzMTLknTN>_ergQ2OR403!&X&O+k~Jw(Dv75A%_M=3+T#6 zwCnku6ORfpF!wbFB2rG}3w?8pt8^4M-y|a%pYTRi!x*|=y&Uwgv3WkNf#V8Q2^$6v znOjGZd@f;W1jmgbJ&@|>Z5rP4peYJ& zkO5a1v0hOn(RyG;uU}2qWt4-8&YL4?AwBy(Swb;7+FfGkEmKrIGlFO3!`7*f^`m~< zWIYeRt7sPSc<1{wU%`5F3vjeh$j4V}YHL^*R|C#AQB~LsuQ_l%GBPcg3teKi-cgcb z4lx3nSpPcg@hUuWHoDqbaXf|V_F+z^q9FqY23ige8xr$^zIy5fCxbL9mJ9|8cyPT; z$)1X+u0l@Od;Xm8e__fh?E13tfY4wPM_5ukKI%vTsGme!Za`x|r~`}Q>mgCQmy(OJ z_0pnaFKDs%;a3b~)hQT%_FkldK}_53f{`@v6@CZN+KZc>7O7R0;_#~#kAW>}F?d&4 zz%tJQ8sYSUBlbp1<|Qczo?EtjJ8!Y}O!}vwyN@w+oaQt6uXd&UTU{AcCTN{#$a~Ul zizIXr-{NA^b8Q8mt4Lbf&qN~#p8@L*1!PGt%gTDhr}87M@t!ITuM?F@enIh_zgt}0 z8WsOCMXuoP<JL~@_(IYYe!T7YAz zJnp`OT4%Ec{!PPKn1`I=lO!cuBm$V9++788e&%UD1Zm9AsprOFk#M3`T!!6}edOfD zJih}tie-1G&Y@ZtLOnfdUAMc8EeSQf7b@I5yW~mQ`7OE3M}O&^qMyVb2yaRz@}61}!wX5_%PA0(P*7 z^<*M97;G1;_9r!Q%pGR`1rQ`!lA<0<9p456W zHX2%$4ab`6O?S(#NtQ2Gom((vR-Vv`WT2pgj25>ry1N$u^|9Ek6(=psjWCB3zn6uAB5f!JSB7EEBH=PzAZx(vUNi0AX$RgZo zMV3k96RM3#y~S;s%jp-9QoFk&B{ zyhZE8A>8tL7-#;KBqTKS02jhg5O}$FU=CCRPspD}atgWgF&Sf{$bxyj367T;*v&mmk{P+=;9>xlN zNqFrS6%lZwMoEO|+7@@mP9W(1>Wpplb~Aus1E9tg_FYxYlZbL2Rr$DM&i+X<=1Ht{ zy;R7A%QwE&#oVyAfKHgGwO8F8fAX$E_a#<~l*vdqz( zaab`pDx0_Cf8>E1Wq=+_l_*_rJdrajs`sYnp_puv)naunyR*A z%#QtogrB~!vRe%?vy~-OIZVa7TMhsQ0i%xQLw)_YPk8x)_;HzS7N!`1xfO}3yiUEA zm3C)<+~%G)6@14D$U&nfeGbQaOSmc&tZK)};90a;)^JK})ioGJjdI&}i^chsOrEF~ z*=tLJ9v>bhCRIv8y7*gK#r!~UM$H-Va}l%TzMd|+Fa5VcME$gMW9o}ZpG+|$n@ZD( zOa=x_u)HpY4M{i^u_cbd9i>ZwxgL@d?XY?2Jf;1zn*0M7LW!6Qh8Hj(r(O?PsFcv-L#;QJ5r+v`T|Mjlhm_ z<;RW5!`TOJ)>}XujovrJ+vmF zOl6rl0=-J@6ilI5wntLd?TH)DPr6nj?*-)ralb(;2Fy#BgxZKaiJv<-nhsrUz8A{d zrpoR`d^Hp8PAkIM$;xA7R^jm#Bx3(rM_+T&)l|AWqDXXHl}}f6ltd(?Hy-na zZd3fg$saSK{%-Z~6_nQL}zuX^KdwanvKQesHEcW=+@M*DA*Ut`) z*yoG5E}r(hN>f1b)hbTI6Q?26qwYgmzu@{>jYL8Yjg0XNKqd>O5DFIa)q+?m%eM3S zsn$|b=2^L?wd8qbg}N1Lx_}*m!4K^WR?d+pkHAr)oOU1{Ax?Ns>+AHu_;lszl)e_v z44%7vT|bR(9u(Vp(8uWi%sW7-i3A* zVK+Sk@;Gc@wU|@f?_Amqc0%NwgZ2uRRN&r^AETZ5+1j0D(zLqTa6M46?eo6p)f0Zg zS33jn49bIUfgg*#5t z`RHZqZs$)Kdj1~TlM8w+kLSFlp`#iBpEWr3x#J!Zjj1nV9#TO`9isq=_n5VbfT+P; zpn^mePuNw3e=;V`Mu$BIGogp=x{zKzU&=$9u2JR0`VhzAf|Ir;T8-dK+cAvQ{^*zM zI6Q*tV$OlkGdaAjKAd`$0^%4qFnT`lkEwWnz3$4&XsxC@`D>6F~&->UR1PKd>o1a z7UWOrD&5kp-oaxNsEyZum{!*_l|%$o@QnON{i2=`aKE_10k~{WUae+cYvWUtDiZi$ zEC*>yIiUAjQTsy$(oRyLLK6NQ^|Baixe0dww;6vtNqx+5vUqv8s{*1YoOQ zTxhx9uP7Z}x|CnTy`jxDHia40@_QGwm_?VGgPzC1q}WwXuJ4}-hjgwflbVojNbANH z@BSDXTb`eEbGW!NMc>->i{3(n9} zMFiPnY7*b6)Q6GTf-%eH8O|YZdko6+Ec-r+Hx@wN?5*!%mm50`n_z5HRnNh&27QH; zj%{owhhfKr%Q#rK^VmmddVI}q@~dapjTi;KagUV&udxXqr)Qt##17Jslk zAp6+zZzOe8m4U5QMYqaM5Cj*CV-|;8%$b|rE0YsAx)(SWp1(jn*mjpRp7Z~g^JF544Om9kChA$}3MF>7wlrJ0xGEweF40Bfs=%ON-#421%yU68x zUf&rqOq&oiaQea$9Hetg5W){Mel$vw|1mQDVP|{t=`JIk17fROU4tr_HC$_oRbg7y??G0OwRe%o3;o7ZRN4lNXtdxy}W?`8mZ9ol!7zgs!LKY1&V@pWyv&R31rD{)(mZy6IPm&%iL*aBDN~}C;riE-(#~Yy652FG0tn#3tm}1z)J*_u< z!mcO4FlH%#0UFWHHN$7p^8TjzzQ1j8kC5nTQ(AY~JX&LN%}bk5uOjweWoDfjI1qjW zqMItuOtWLNY5v6kVOM-}>_inS!E=%ZU|$cOCi9EHuVwe-y~lWAd<9KU34qC0PWxm0 zJ)k5VpXLXSxa*J|kG+KfdnY)qy3BvL!8j4jRxz*lWIC-W3K9YwrDwrk1E37A+T>`FF9uG39g7}vcwcV`gqg%ggQ z&{4oMjliymN*l0sA)X!!kz7WEdjQ)0d)&j+2cnNtk|~G? zo7>o!JP&^+e-~eiRQV?o-ZK4NqM|eoqN2t{j^}IPrleOd?DMx9nKK5?&No~R$~U!c z?WSg&m;o!Cu44)CQ2b-|MDwFHip{sOHg&pa-D;X#`q^J!Ukrv~SXtMOa`F6f6b+S= zL2A>%63RQgnjvF51+tk3fy4*hM7Nz5J|8lWJBp|bZf59b<~ib?41xJJbsPTGKY$k) z8Zg;F5UWH@9rM_o@3H;omRa+gH6S z_RCl85*JJgHm4)aA674VbU@zdoBr*?Vqe7o?|b`iGd}pA(WigJQy>xO(Y#IY`YUZT zs!P-G ze_a2U*CqJBUkVH)11s@=@6_*kBL64h#~h~N^epF1a`wul1z+s7D_tYQrO_7rZ7)9< z-1Mv$CfY}e&^OeVQs|Tli-TR7(6<);@NJR&PvZ>A$~2rTa-6>uh{r<%?GFQfdG67+ zB7e`scs&La#g8KU;ID8hr5F!;a(T)7{|A?>cw8M447(fvfClgSJwXBtbn{D5hc+=^ zzG!{*4`KcPcLN<>TMSRRy1hT6>&`W5?B<-HntN1_(+KGFinRwp<~*pSC?DXsalzs{ ze+zp^1NzrXyOXD^V2S`NZtQi5U+{!CKko%N45w;eJ@t|OH8>A6k+xc&Vb@$b-``Lx ze6--qNN1v~4@s%$6YP(eP>Q)jWB8L;U4d>9SEWb~f81x~Tp0&4n0-sO6?%`ag^|ZHI7%muW zjpyr#^Mskjw|4IPpM{45N!+rIJq_O-ngCz07*E_SjuKQlqDI}XqV-}&wM>9+SW{*0 z0B@o$7`h9*T4xM|pe&n+TP07b71fiI(0y~)CkyiXr~qyj{~IPlu5+3^u9RSE)TJkF z{rM4uW(1gAmrF@+Ulb|S+6V|YZ=ZHADAH$CwgqvsAecV z&38#s-gLDtZ-fg(U!b~j>Vz!cPV_!-vZP61q*=Dfm@s5K)Z>rsSXY-PIUSg{{l=nK zYj$duvC{ogQC&O}J|8FUmhN}wURm+pkHgNPO3KZK`a8JP(civRq_xbpNAY^t`N?^9pKRaeJlCxH>wI>* z8V4y}_(wmk@`+;{96s5vQDlU_XP=0wuo0-M8NTy1OY`|h{cCzPPz#o_4u1MVw#Wva zx>|Jxr`K=tLZDw+z6G{xq-B*{nRgIfZl3wdD)zYU0_uv`!(h}hrC{{$WDwSuF`5!bL^bF@;C z`uZ8;X6YnH+POpA?bMV(oCa+646=FM?=c4F^A0nOFjXsTQmc_W(Pyk0HX6;iIb`02 zi7X!>=t%2LUi(3Ru>*%YUs0(ihh(QOaO7BvN%|cmUIEQ!1T(H~P3_D>PTeMfIp=bf ztK-<-5pT(Ca?e&GU|fPb=uQ%G^Amn-T-Bk?iJL<`;|ymE5o;n5dq(s)fg zX(cK1?eEkN8Th!%dWYTfQZkVGGh0XVuA{K!*3Xt@(v)2}>uMb4PyXt|D&^#I#Cd!-20eNiYv_`+VP{@yve? z^{yaLaKpMg(&M}{Yw0a6ME&IeeIcKfMlHWy`3kK)vl9mrQL)%w`zUwo-F$#>jh64a zUX8_yb=xPW$>aCzx{s%P4&&k%zxBx)t%J=ZQ(S$H+QOlJiz2gl`OLgqw&xU|>w zrOAG5{!WKP|NZ0RV%ApWbeEFDAmr(=`|jYkQv&RiSZg-a*}$X2Sk*Ld<0&}mDh!tS za$5ajoC31eO*IJSBV0>dsflS0yqo5X+UI&Kv&hq>e#_f0k^1R}Ky_N@Gvcq?<5OJ>Sh&?~aqq>Je#zVuPYdL55`h@~N5cfkBtF219|bC$uXBw@?v9=D~_KCtWV z#y?rz>ncB!fswqZ3h{f3_f#P<%g|*0&i(>PWZQ|=n^qY9j^E;#(k(Ntn`&3DS_DA# zYE+(yFi>9!?VOEtDQ*d_0hhbU!@0P3?>#E@AusV_)#0v(oQCfAMyPt`d>XN&yB9$? zZgtHVl+lnqOGg`JoQwt^W;1%b%lgG4S}$%})W!pf>rD=!m;JrogX?^6Z?tu)9ytfm z=y-EuV30!|{{9&hmmQvh*D-(4;N|yY5*w~z(17~0N`)7*Ke*j5a45bJ;nnnb!k~bu zq>5@Gp?+};C(;3opGvM)oG;ceL!!sOn=of=lO1@u{GkbRTHnM)ga`RKN3v_(uwjo7-^yjZ{RaL|Wsl<(*mA&J3`nG+C>$5AmBl&Y4X~)QF znU2X53_B*MdAUiejtuw*;E_`?NMW&ThZzoDe$X#=!oMzxww3E69C{7OWovC4fKGZq zomAOgVacnz#vL8M(GUc!m?RELXp=I1A*v~*wshrNuVu0Et3_f-uGt*66xC0xloY|F z#l$AR?zhdpb+1vLv9ixtNct<^DQ#6V2NP(XJYMP8_0;Ua1d_Qok~fiv+7vtvFFjvB`a5Y2)y?!R8j;UUe$?-q!uj?{SNc$q*cb) z9FEE^Oo;kq_`X8n|6%Vf_EYAE(4J6kZzC; z>6Y%2u6ObGe$KgX&wIWjjOr7`-UyM7!}v^fq2q?LOsio=VxDBblQl z#*D%gt&S(R=Z0&%e@A7GDk&%ACM4Mvnj|SOlprl~#0(27e5Cq|;$#6DJ%^sgpB73M zhBU+e85Tj_F`6Zb6K$eETnW{9N@?k7DxNVz4QNpNcxX&?j+M zWm1=ga4nX0#TLyl-CGs1Un~YT6LY%x32Am|t4f9&a=BAz-lf z^zJK}90vD7cIy?6Dk32&3w$LYofJ}XRyu(&@q1Ob@m?^eEw!J?7ahg*=o14q3UR?&iMs8&k2+*!*_IPH> zx!rBNhPS@|k-pufm^m77;?AwpCZTh4XE1M-c||?gE;|Uk00$PZ8h*8NbYj)l5m096 zDh|99nxtQXdaT%!;hjp5q~iKAap(c1t~3 zbLhq!E=%-rw^tM-0s}e1Ce2Wof`bodnC-%5s+4U*GfP`CGS2RPpO+-D-Da^Uf))a_ z@`5Y(KdtUJIMb^U{N?NLAT71lHus;8u&A&^|S}c%nF=tk(o_Nsg|MDFb z(pMStc;mi6q7}r=XDS90Y3oZSNm`i*r2UuS6z)a^19a#WIP$OTCEfA8Pgqi)^n23| zB;PyL2j)cx3*_(F{E(L6x&>!B4tM*Wp-xkI%heuVrj7SetD%eI+ZMswyH{nUUtd^o za94Etp_-)Ze5voWfULZ6#o#p1f1(ZdOc=UA0{k-+xwjnTvAoSt5~8c<)}2@*Zaf`c}ob zbKykNzOz_taia|~ja5PycGNjQQy+-*1y-m^xao^F=7p;OpBh}7E^qKcNm_GF=^ds| z=yNY->{YwxD*^Sja9$H=eXnqf>2)Oi&bkxqXRQs_F zHjl<8+(5hL?gWARJpTJ>zw7d(lou1fn1}-Q#VgGjvkD&LW2;1^yPhfR(>qUuiVN%H zF+4L zTExjLVlGsK=410^KgP)11m?Z}2l=GO@Ka-UKPMdz5brnB*OK@UAJXHbc1l4P32-+Z z)>!BUBF?L3=C4D0ExRDaStW4ZVM&>_aQoV|bo|tJ6$M@hJSaSDX66DaUn_IAcH3B- zVr=oLlA8)$?*s5D1qAy{seE*vZdmt}M3@(51v0?{=l7Wc-521s^IW-Cun^}9?hU~ zW4chryqx!&={6HQ?7kOxhvW2}@AJypHoK>UY>7}w@$w(; z>!VyQ95Bb2mag7j;()|zjCQ3NwShv9WNf@<2zm0^9wLg|?C->wyiiu6K( zr$N`rE94!755MUkjC>lp_8z9PasQ3nT}gM7pZi_mV2;qS)pQC9sr?SZlb+QDLD?!k6@G`cO~!<9;=Mbn*DY2m zB(aip5h#h6u~~@s@bP6QY8MiIe5b$X9502?(|8?T+a|2UQjX`of>tbayRi3KIIq|# zu%Iw6xs|IY2+KXA5h$}f6~NYvkDmzqjXj)zA=jJw}!e2i1A34 zqBgDa#rcJ&FwQQUSGj#VRnZu3XidG>8#2&(cugj;^KC9m#>Qp|e;ue2(Z#Vi?QDju z`QsM%VkCsxxAOV9V8$;XV0PKWA%?A)P$ z1ijBn10P~mgfd^yc#K5yd!{Ki)Olh)By4;Aww5k+SZrz7yBtTc_9NftTVVJ;G?wKXErdr4rsRUwHNj! zlft>^1vXZ}tfHjweqqD}e;(VovJ)OTUo!@tY)#M`tXv*Hok+S)C@Gu&L|{BEiiH_G zv`*q45$+WvAp}ekq@+D)UP1SGFfwrz`3 z&>Wc`9ZpZL@l0V(D$O=z4m0}|hR7hl=Td&r?!m4I8?OYknzzgxEoSmWe5ma`E(BTO znB=?{bd@Qky-$O0NGKCtk6#6(fB}04g>*qsYwRI{m!DG)%3EYs3X{CtntiD1-tLrn zET6l$pE>Q>*7wDxPADd0xh;$8YCkg>&f~}m~;0ku1%K`kwYg9It`~_i;Z-Qgv(>r9QXf4=~o7l{+aV4KxAdktP z=eEG>+n@k4v0nGPz3p~}fr1oGJ9ZUnej5)};|nr$#ltT(CH2BJrTxiD!*de@MEU12 zM>N~Rh7B+j*^K?{&1Xbo`V}f}rEJ$^{OT*&RT6VDL{RqqGFf6%*ZWoEte2{{SR>zs zoIO5Ld_~_Z7@{mrg@>*L%%>b5oV$1VLi9LwckL!GGF7~5#a^GJx^b1lTEDBv@y65Q z%Z8$mO7DFe7&dLC6u+4&VE@dC5S@$^1q$)B7g0J|R*03qK~9fC3Q@gkbPUMRjBeg`LsH|)W>J;TG zO-_dNjaLwbj51K!{doRW4nzPhP?Sb#mkttsg{r)_wDSpnX;BZMK`4i-i zARkT3Xhh0W(v&bws1IJ_^~*K8q+O~c(!Cd%0vm8^Fl}@@2Y??_qM#CO|0l#e%b=rn zI)0yJyS#LrYQf=a$~C8+QlQ zypSZtFk6bHQG@H`eewqO9D+6cH{6fzj+JrgsXehK_{B=B3b0R5~;={Cpfo1%s?oJEdoL(l^VL@{L8G}sG?T2i8eLZe> zwxuQK?l}2NVxIhq@b(zi9#a`yC)z15sK`F1sBsrMg0%zTshjpC<(andD;xEA9@7RG z)_JIQy_=VWDl33+Fl>AiifCbzSDI zYrk)}FwRD1w4Cs9IQt2+FZ?Dxcp%xB0+>~^urvOYm!kuOs(#Eb*cHB{#TY0C4Tl!r zD3gksW)R(prm(2kbR88qR?%h-zyWYp0Aot?K+wlzH{B z%7t3LQCj)P1Jh^8E(W^C*DN23ETyMGZfYK|OS)-+l7#GblNIwuOtXhn!^zp>8FjMp z37Zg~S{wFG+MWuL(1w{^hcZsFUpK{b>!p#D^UuktHyQ_2@GQYr5}PSsU{Z2!8A6V~ z;xOp-;mDYg=u!&eWTB}Gcx<;-5Fxws+duGqtpYuC}l~X%ZCvn4+B( zV6o5t!D4^abJrtu5JY5&a6bXVC^v>kcVs$pJ3qO#k1B(};OeJW3cugiT(?)x?&YF6 zMCC7QIYL_$h0d8UliaU$8tQ+*5;t(RmRC&n8SGjEqgsV5lB98XDQ?ocRY>dY&DB*v zRZg-kO;oBSdIzAVK5r?rqolew10!{dJ+>uo4 zL>r1kM^|W&RA`I~rO*`D`6MgKfLQR14-7uQT6E6~_a zgoj6zG}4jhZv6DWVPv+Lo#;Z(#kr4HC`#j{V&@73$o(VPIOnoF^CgHNKm zHM53nzx1&T^84!q_nt)*VFB|e94<*%KR!(SFmA4MkNa;n(z7y?izX}-g7l4ds7DCd z#pl9^R(spK^ZJU<_jB^!$D{* zo#Jo}$~`m-GTZN}Pj7tb9soCD*wC{YSp8h=5oA@bG#zP7v(qe&Yf#%`cIUhfRT3#> zGQ`ffA($NiFCvmZ+TN)6{RmIib7Nv&L5yT>H(qV5^d4$!7F2ucEK8~Q6WylaVk^XE z!S{gWn^mL|X(?=?6d*+J+l#~fpv8KLU-mAGb9kuEz^0awAe^|N85TDBTnD1oWyk4 zChZ2~`M8jgxI?XD}%$Yhl9~@{o__+L%qA_9VSj z`N-jQkdRDwtiuj5AM=*4RW-qM4fn0LzT{L?PZ+TS&q8d0G1#~H4QwljHV~0x0m3O2 z-TG7;Y=eg3pyZ?=$NW}(qp7*h5KmLbkxzMampuZ@stWBfuvbxC=$A!#s@T6p!-zWx z9jDY481Eo3HYB+iTT~-)ncM$!BUpRHr0HAs*Ue&`_Lb1kZcMQs>yr8Yz<$z|&qr8X zJYY7@VTmvH;U^z;^DmOA#BiP5Gi2UxOU38=x)pIoVc_1p%i#<$e9 zt))s}Ng%LROSemN&RyeZWTP2qh(p5XMRLc-NA;Xx5rC}&SZbcuZyC&QL#`U5f|d*} z>0(V*IuH3weD$EjaDur{%a~|oe&>m_?VfJLit&r$_*Q({GhrQ39}ixki;x2emD5lrWks$snLgBazWX0b6gj4Y;2+ZT(@QD=|m{Mt6Zbc35L%@l9Can}f%Rgb7v>`bmVcMWC@BD~s;Qf@z5E!WgP`qxU zWei;2mk_YrN&i{ys8$xJn^dfq7X0_;`LC1S8NCFj4ho0d`zf;G9K){AoEB7t)457~ z7Y(9`+D}Jtb|#vvE%f7EPm z5ZXMMDi|9qEI7qP-o4-7S`2bmcQ?=x_{_$Jy`xNG8$X)P2S6X-rCSR*$C6!6xTM<= z?!&KOnu6{h>(n-smTkw8{r8q&8Hay04jq}vCWs1;86bEhAc(HBk$CV!hy5=!S+YaJ zd0#8qY(Ascdza?Xzm9{b!6Kv@uBF`o_laBku0){#Bs|7D>eg~=Kv6edYCeM~Uyd`G zAOz+g!JP%D0bu8}bI=9k@2jzG1r?;CXA)iL)miUQfXA3O+xH4J4S03WncR8kNW*>9 z=Tmt4#h279tqU=Xi@ER+|FLt_av=neY|@VPsb|HZf*h0Zh0P^e`X>hT%F&(41c|^^ z4IvU=>R^3d`(v&8D`Fd_P-l!xtyMQ3PTj*5O(+QS%E)nPdQBT^o<SB-Ji4qJc_x`;1T7)jN6{pZK&;@C$iRI} zH6;*KQ=3CZYSgwuTA-~{@m4TCNBWJf2bux>wYCxh6hCoCc* z%m{f+TAyyHE=xXj9vg||$ z4U7DobU&5b^Ru?w{Fi0=H8)v>Jvp44KNm= zMYZ2nOAf}retl%J5-|Ht)B)+Z+j$!lB8bV{1t=X8P`fh)*6N#e-SBO#yJ_icg(6e@ zF}mEs+-a#NUFdQ<91~-K+Y*9_8^1A;bsz~r8u^WPmu|U<2eSReX)pMPNMDjcru`nX zibOMvIO~hCK~8?_D)0_Kd?t9QVr)$E^dVWJmQip-u|PA3ReZjJXsMwxW;%Q^i(GXW z1RN?xj9WaXLeqbQ9Em|IFn+V4D-wO676N5MxzKX*KM99&EOjca+w?&~()TN;7`7$i zj~u$+W_t-&5P4=7O~F)fRmxt;iR(b^*dv-Q+@XqWyr`C(1n>3h_@JYFo^G6uZYXYX z&Wsgc`ZiAZlrOjU^$y?I%Eu4Lm2KZ|dU=$r=Q71VbHiDHemduW<#x{7%%OHybMArX zYiCp&B`XDthx9+Qxvq$le?^&#Je(Ao3V-^@jzia9#U&KX42s4-v6Zj-_8Chu!sWIp z859dbg3cZnbHC=o&r73ubYX1MnaIvE($e(m3L4Nx$A#O99n=YxJ(Ac(n!zvEC;e|g zt;7Q~||hs(T!W!f<8z+~8_TMiChsL+|KJW(mL+<{&h*{qRe!<15V1dDqk zKPM&&#ka6&W+#mClrM}{gc9Q)k5kS<@z<97J(WUhR>Ki781ke)j$H$)SC~A?xg%3T zG)@<~{_nQ($!3fS_d^_vu%Q;+jfDN4he8v{A-^-B74ns_#WPF$a%ZI)AIt_QDS9E0 z#m!{3(&PtK{a3>KJ0=G$=fBnz-Jdm;9dHlr=80_UBZ+@U-}OT0+v}vGHgopR!*xGP z$~iwWg7#XA@KvTRjCJlNxryR{%r!4MWJxCcl^5n(E^+P89*Fg~XG8ij;V|lo8ZUvEc+T2@*@(qES=R2K1=Fw;tO&#cLS|=DyA2k_he!h{kp#BK*+dy>zd~PuH z!};B9>OS!UP>EE29;}tPdww(w05d}|rg&>gcY8jLS?%kpLNIH5NfR)JZE}u$!{=g~ z%sh5D?ClLLb!Of4DbhXhG2i@;fSzD~tu`(TQbK@jWzGSDh?oV30y< zMO-uAK0_%;`Dvk2Hed!hI+zx#TcW5s#IYrf4KFP^0pMwmD*X&eNI}5Xcz8!%XLYw{ zzaQ3PvG#yk^Q&O|DHLm%#_FRCgBuUKu6}PB^qQo3I#2{_eLU?WF2YgHh@%yPSH~#3 zvg!I{2?+yC5K|@>`%1w0VTd^YI*C6hh_SQq%sVBOr=Mt5%{CW z?H#Nn&fQ``&ft}|*`dpHp4EGF5WYO^+RuBIXB|wAKPdwVANdcR)-VcTtvqF&D~ekF zoXz$w#cV_MO~uMF+j`zMtK+D0-BgJ&kxc-0n1f?go+{YU%L8Wxv9#m`#jL1Q1zQ%% z_BfSGr{fpcT7_C-H)Z^G%V)xkwQRey7oi*B$6s)r?!cb5I3l_Url88iogsNhMNtwE zl8c-w6-usOnP^(lxKjTyGDLV~`m(du4j==gDNn5! znDN6kBti+P?xT)q0{;n_IEz)&bkwH1Fjz<-?(yO5V)=4BaWOJ(Kq)vTDm(hM`P#0!83oT_FBk1xmf5kbleli`X9EZk z7~Fn{4qAa)qL?yBn>=ICR>n%i?C~~HKzAW75kfn|`#bpr#KQW9rsSczfS;}}ZA(f+ zuCHYK>K>ooF8H#yE(vQhzAtf{Dr6WiIZLG#pQ;6mnx7+%r1bGXg*x1CPGdt*Dr2G; zoeFua%cMSjOQ8G0{|N3`k6b4O?gG?@WIc1SfF~6`rygo&pp-xgYiojEi$&=yGCq`S zeRo+U4edMWhU+4!4J9ma6u+fx(xGZt|JKXb9Ng@FfGFIcHAKQsoo5uDJuWS3dof3o zxw6Ne^JZ}I@JflAQ=!6PYSu1J*vi^~WL;+=Jd7A1vUVIUhoUlOkkxGOPS(Nr@D;*{ z@C@P^z-shP^Hp36TI+asCy7zUSANK2d^C7{lLq=zZ#{pg8&`xAU(%^uq<;Ufp)q#1 z4>&zs^BQAw+EWm3rSF&yviFKudYldq~?52|JF zxVS01xO0sVF3k<}$sxW*-ShI8Xvru6iEpnwBx%!wPpP;5rN~KzUtd?~@)n&<&)cv6 zY?f$*vX9ftT>~|VlMLA65s^bE(*s-6mQ(TR&39gGLi;Jrml>rqwC*x?D}c3jh+Lg^ zE+q9@$LkEkEP(aRe^+pw6$l6|g3*l#b2tIImMI^Lyjn{dI}^MJ*Aq#%6vD#F*meE0 z^V+y{pZB59bp-4sGpIV^5}Dd94LqBXkJm68q(W84&1ve0@O6j>fMe>_kMUm6ruIkG z)3LN%9ynvDD(U~QChh6k9GLl$sCLWQ9WHimDZBJ5Ivz4ZOuCxC{Em-3L%Khe3;EJ2 zCUbC^30=VVlr%oXUGs-C2jnGy5ryyh=CvBHZ-@4EUWy_RMGpUjYbN>q>+=)cK`1Pb z<-IH2f`ELB^vfvcm4qUl+d{TNGz)c*lO%VcLszDt%e@{3g18@AUNFtn_)`e)BdMMjsRTirlq$%|V* z#O&?HIxuy!=aP-~_O`vQOinG2AM@C(CtFyjK$R!4DAcr3c=@gBmsNWX|8eri@BR8; z5ps{~8fah&jn~&6fBRm<&p}UxCm^M1%hdrmH57b1?M)s5!uRAKU~b-O&LeCofQH0+ z?MB*C9#mZ_f%-tY%It-J1)3j#w7NHwD*|9q)a~9SUTV9r=c9Vz(4}u^TVaCL(6VOc?9@UKZsZfNk@DVGhf1B5Q|4Tw;h?4#ruP4;RtZ@`wAeHsq zvoarj_#@EWyxR;bVU9q7SFvLYRk`Qw@!eIPqO2s*3N%uwc&87bHf8hLF7z}KIH>0* zgaycb=@Y<+%pVS6D)9o#km>~n8omzm;df@rA^0C?G!9<{ukr6SilpVG4ILj+E2J;W zxlFyS0FJMmd~sZ^gnVXlYgJ^YG5~Ew;_r>c+yt!IWqgnZoV%tK!Zq34oM89x2Idgi zmNYFp*dnCT)_?ZIw)Fq$Cyb?qV{C50)~6E}V;c1H<9F5@y-AdC;+EDby0?H_qRdq_ zlg?)=bkhn->_0uVf7ss=cMbmHHw2Qg06Ao23BANm%g z-4fbsj-@<4&bxhvG3l~cay15hEFp>p1us`^;Zg{hE_(68E49JJTaHj_fc#UjW}sSO zgy0U6)a8d1zL9Ea+9h9dEIXoCV~VUX^{Mm5*Y8pqetttt`*8kAhLj?2M?G@-o%W&j zI7Zg=;x@>N!1GW;E#Jd~V)@Az5_G*#=Y^8lv5b`c$`|DYsb>T8hefYGc62~-Ro7VH zRywB<7t?53eA?k{)vFUigl;+n3Y7p&GeoPJeAf>hODkb=uL&^LtbW^fp{LTKJ2!t= zVS93CYqpqd)jtTyNKz3Zol2+R2D`tOUH>GE*mZG~rMr}($^K9rE*$nC8_?3ZNRvMF?bCgMNM0ANCt}PT1dsT=5ETik>H0{Z)bGgEE35%L3?tz{ zDl>{e-Rj-1#LL6|7};1zj2P_9nEn3bv}T6;{O5I7k{8lJ3p|Eh5%AWJtcK;u!-z#Z zWax!h#Q^tz-eIY5f{(gDCXzpQw;A&PsRN<>_aWI3f|CaTOp#; zu*2&Z5OkRrLzLe4dB@=;m{w>g-Bnf_gGrPbZ8o-roj)>+ds@&btaTxRv?}7N?pHM4 zOztHX+?ZBVWC>`Plh9V8qL)I;f!l!1409mMfEPzKjq07y^@GJYCo*K4M|D!+bSr?P zy^t|O^nPW9Z5rCTZaa8VC_G>o1^QWlv@CXzTHQ$Db~*CRwOQ|`Kh0)ah-6AJX-I%> zJP^MP9U~*7Q}{ERZi{7^q_hCX0OU~F9c0xbF7Wutwo^K2G-}z+1nMlOGF0t~pCHvh?#?=m-UW2*70we2H z)~#}K*z)C##!4TFxY40ZI11TGitU=Rk1bX|KJy`f2Yeea)ao`@=)|3#kW96ax=pzT zbP>v9h`ilDE@prBEQx9i8-T8L-s4n^WBtHuV4a1!UU~xNzZDUt1jyBr3w9!ok3yLM zHVb4Dy7y6VLNc%1EQHujYK&W(&sJ``v*knU*U;|g<3|Xp0a|%wDbTl);!a+c zwA$}-yNRT{d6r)9UX$}(b^$bQA6Gj=LvD%6qF?CTUR0b&Eg*U?a+Y|-<22!VSzQO_ zuI?=(G*~b#ZQriA0p1EQx4=@PyqjtpqRx2p(lWQ9k+IHS^>wwCze$6B&nOdTZQ@ys z>Ky25hS)0s9){recf9d%WK4WBkBdh!@gg#B(Jy|B?hX4`wL1DJ6KYaro-UDY7gzvG z2qG;#9p<&n?!v1?q04>uO2wjro`zd#zGP_{j}7JS9Z-u_|>@@@R!51J4>Syk}n8mg&I{xOFc< zyiH?A6HO8G+r3*D;-}wyGmDfb2oMX)+J>R|Fwa7U7Id4JvUo&xm+|PSZJdyFPX=AP zg%|Tp6G9=noSv16<0QPZBye@+)sO?>1&wpB7F|I1UajxQ+(h{*BLK?l<4izUu;%Q^ z-Z>C6wUELU*87@QM3z}k8^uBtKdDcr@GLK&hmB`<+_Jc#45QL%2=)kt8`(*PtLk_! zs*anA7mWXy@9w@>0L5Q;F50RK<8t_l6;VrnZ+mYbQFX^h{VIk$3-9pcHMj^b*E3Si zUiz#_ZBa}$q{{1{_bsR=IYT&^=@zHnmyZ5);=er~|C|{Yc6;wJN&s!9=GYzG3iz8g zg2J?8+T-GAzDoN9M=1n%l%*y4@x+`D)ipAWdkf2xAMoFk`wWVomDZ&bjk8yJa}C5L zSb!?i+}jxM*j=hxMUu)IkEA+I(K&^lXTThdi6aPZ^BGdo9jX5ccf1Q5U}s+M?Nd3;Z#MiF}o$}{b^ zYU4jsw3PErEC#@myl^3CuuhehP_>rxq30i>z5iXdtnppksbIwxTL zF;ObEX;N>NK2=F;tk!>0zU_Kn_DJS<6h=YYzQnuL9Q4p~z9+!i)#lPPHq-4$IhY#A zwS+urg>h6)FdJ~xH2ik1jH(t87%*++%hX;%hDUe!9Xj{Ua%I{Z_K4mT*g?teHN@WmeH)P_u3R$4*s38+0*Ys}*|8g;j#)F}f?YxNf;W!#|QUZ66{X{3fYxBGYag5awiBPU7gLc{e zs!T?57LJ*_;u9hh;wA0a$>X^ospUGp_`u+ zH}9-bT+jDH?V4+u#zhS`UMCWxMB&wj#gC|Ns27ZwRlf?4&|){3ZToiw9R&2QrO& z@;2Xm_JZlqmfca;c=5`p5>07_ARV+uWeLX8)~U__g_0kOmw30oj24Wa>+x zo1AQZR56_|1bG4Y*_P57xi@X`*X9*V-;bA6PVQbFpFJL?tCTJ`p(R~Ggnv-EDVSsp zhucTHeHs*B=saMg1I60#G>-sh)pPbncXRy)Ynysndc6g9&OZk^C^U{z zVqy#hs)ToD6qe74dW9Oa?aT_zH$|LYFQhWj2fum?h-3cR8hh3^^#99Ozk2xUEPsD> z8~X`a9I(b;eg1Q?R%C$_A$UHE{hvP`=+JOx;s08fe&yD_)F{5xzasw#&5Ro!o>k-j zXAA*9lDZoCueLL?$vk*R1knzvKe9wXRRYhf=s%#=&3BLW;&}X%9KU*a4g0S}gWX#P z5H%FvVBtSkC+g_o*_7NS-iP|g-1x^=e|Y2%uTlQ}bK@NGA3he>>(4p|QcUoyEPePt zj(41g*93>@q>S{zd;fWe2|n9-3VsL*&E21H4&=DtnIZotnc+R54AsC*+6*%pI_ihl z+_L_Xc`E$t8sCikvmgP|0KPgKX+rw*Te;cb8+y zG0NRB(Yo9#%=uim#(5{DOGI{$y@5MfChgzL49o%qg0daBvPUe(Y>T!cMo&l#bJ%9` zIRa;OkjcpHCvy~c%361TWot}5r{cDpA1ww&&qDGOCvljM2?O3}h$R%uL}=myB#8V_JNn+nbzr|& zUq~Bg$uLq2TpA#DcU!zOHOo9kuuN>_Y;>p61iGePGW=KM=3Bdh>`+&r)U!_%u@k3o zSMveb|92jruO`OTRD5iFUJehM^+t!pgR``hLYpm4t-a$e8-hJa`6bB-*HX28kMMsT z+RQ8BzuO93&xI~aZJ1B#&VX!1Sc{|F@TIH`G!71b{yuK(JJ)4i^y1_5TIu=tF)#tkk56UcB3%66 z*0`!0>N8(L3FFoFrew~O(Fk=wThx*CUTp1k1C*CKe0e*QFbZRkz;F7q+tA8T;N7z- zKYtis!t(*sF&;CINLJ;`RcqP2>w%Q&@Jh_GX(*$I9(`8UhZW@yK+DPFL>%AONQU<- zfs`#U?q};*qH(-$TD?0D2fb;@Y2BB9J6#LP5aQCT;&cdbpKFcLP-*MCC3-tOq0{3{ zx%Lv>7CxsB`H~D155QAA76Y*W-^p~G{HJqbqQ9x^+D865%Q;Qw8);)fp9Ur{PN70} z9fRyLj*M;XW9oamyK@uTCsEGbXltxXie8j56<(f=c#6MAuqO9L+Vtl0+qyupeYWe= z%Wuu$t3#K{1x6a&S(WgQ;~hTRtUoa+xC^2JH$y7s2i!Ep6UOVhNK_p_=g7J}T=H)q z7PaD@*K349yAf%D~|cOvS((ouq&NTNd{o$eU0wGoBqj!%sF+vQ$pgO!-vyTWtNS_ zFr#ybEZ8$~c>D~<>r1vya1*t0cYise4@@;&otlid6$Yi;&emGp6)2|e&Nsq?Qom3n zT-Axp1O~$!kU+?b8;Xs-IJ(hjTRiDt;bLF9vaO{yn%`FvIHP2~*cUqiHursUm8rhQQ8KFez>e43PnlDUCnIt&VA< z_0@=8#)Q!|GJ3RnFAlqIlsPIfBSFKyzXBHsV4v@U@&Cu>q1#!Aw(1ylf3tlpDIeYk zX~oIET*q4!*6}OR@DP4Ap`&Dcy`BB5?$H)XQiFk+{c$HH&za|4p~38sCB-ksymGE^ zVn7c~Ix#j5MgLOy;S72^J{8AFY9!i0ws#u0iJH(Q8OXHQ9#{&@l8<%3?J7ccD|6l& zAhf@hh+jUvj5HwDvjp{uIm9=MIZUCcn`2731unkG-oGT|0)Vs zSQgX7!N>QPDF!?+TrhNXv1yRnM;xS3Jsuhn(L$o7>qMD$6Zhe2PbjCo;6tfzIV+E) zWf@o2&=0upt?x-1c*-lK>tqpQ;1@}IRq!>0XhpnyWXVbMFx#2V#x?^*I{`o=951sO z(bOI-us7I!4`t)E!^KPb@tw>*QE)6^OF?Bt2mmnL@sB2y`X_z^aON?cIoItJ-5Fi%L>sGb4@M$VQM+PDw*F4EC22WlF+(GAhPgmjs$&ChoWNTVV`i75; zPyGf_eDCb5!2jJ{g9L@_A9D?rMo0l%%~ni9B|xAG9UeUnBd+RH-M#wdVk8?ayFmQt z;KMRESQTr!NaW-M0q&%@&uU6xj+D}3x9xJ@xqJ|v37n$o7>2^u=m67;xp_mV%$iRs zzp#hkCXv9*nj1v>5|%V@WXct%CU2I^A^{6W-PTrvJ83B=Rcq6B&1UoqZEdQbqVI|y zhSFa6a-(i$?SEAqsxqkNElRZ4^q)mNQM=AqVKI06#86>1#TE(%joKHoSANC7qDY}M zbRsiZqjaJ3YROxt5aGsKJzuS7j`y^qIY(=$f}?}C4=oD8Lw*n-!sV((rIWfc5aF>b ziv_?j5}4EbZo^uw_cKWK^(YE@)tWQpZKJ9g|6P-5mRqYPnw@&gPBz1S^^%SBqNWue z7c4exLgcPhoP0WYzBia4;{ZyY%9XR0Ov=fj)9;rEQ}OS7Jeq$I9sIGgI3UkOob_^PWK_?8RglO5opKDd`eFZZ=@1IsFFEMm_yCl*TN;-TDg%cphr zt3h~;O+nQ`p*ovEJw z@fx;*AWT;6?~6Yt1~!Jq`pz#ARhMm+fbJjgNEOG@k+HCW=K?!tRSRiRgq6V0)wyte zzgMwu5`Z8l;C)WQK8g;QcTG>faiQePK_Jl%!|={YU>x`hfH*HdxY!ZC{NlkigDmJ= zeQeIjZVk6uuj$;-s*CAO^AD;gV21(5jN1s1(JljVhKkcuGOZVGM>o+jJd_7J`x^z1 zRKkmHv<{1Prpjkb=d!XYNwv!7LVV==kPWI$$tlxXGMN!rJtYqqEq3J8Nsa|#@XEpxs{eY6ErkDT^w94;A+e;sqsBN(vji zMT(m9{v{dF@#wBbXDKvDA~&V)f&EFT_?svoO+TiCYxN6?skcXyF6-0LZY7;gr}+6` z`-UU1Yw;Tkh@4|^XWbfw?EVXiEK0zO+D((XpV1O(+P^;_{UXjK$cnuPN2Z-O3pv=A z#<#J>&`|4PVSD_Tj=FZ-&`rxR&|Mm)()lN!|BvV1A#gi2rjv9XKp74wCnNQe+R+Il zkivI4=R=7%=lCXk3kdF95l=(*(MgnT(XT!+%!Kb(?*j5qDQ3ljq zwr&?+stV+B@TkR>lIFW5MA1>ZKVtlaS^*CzmdUkCw7bBb)7!cP_~QagpzB*Y!LV z;5)1xTPj@jgWre<_9bNBP`O_TTAb7J^7e7J&#kLs^c&wKiIO>~g6ZihyX~@F*2~Om zV7>1mVf!v^OFGq74C5x((k^^csvaiXT>OTP=CEj*{nMN`@dk1qp%=8$Q{A+|+x;$a zl2E2MznQ%K?ry!1_pG4yGZsgP{`l;|GQ*}$!!7eu6&c@Qxksl2v53uG_1NU5;Y3
_uUl>_bH#)5D%fKFE<}bO@HNtdRj(j1kkxg}3g0{k z&`_UST!r8bF8C-@TS6Z?EMNH0CpQts%hT{ARt|Q$N9FQ{25J(DlDrKI{Ac3;IhdA8 z>_0tD5V)@EpaQecp%;bjXKT79kB-|cwhEehPVLA(b>E>dt0Pqvec#D9)_03LNS_r-Zo%m7diaVQU-|2Q9WvE-QEckfoVUQ8{NHoE-wSRLq03oH@+7JBgO2?g zx;-N*{Q}gl6Dm5@KT1wM(Yoz{kN^p)K`E89DoI0QFI4ESex-Wo#oywB= z!v*Mp-?}%yaP!=N#{>)`*nHG^>i2|9)&ju#U;QPs=`FL6tC_6q$XdvS=lf0Ipxv_8 z6f^kQ?PM6RvO_B1!Hmxa^f)>Xa8h|zuX=K^D6V}a_MRuL;3hIBph(h&QM1Rf9{2~K zIGqZ{R=W0C5uV8whv3aA&o@~~-Hd2DX;_dESB_6infw0*sfCVj*=}r%dM(6SHB(&C z$+Y=QHFzwnT==e=nFMwNvUhGOF)2Oar^=q+D-1^%J{TXOiL@MIbk*r(GRwJ7^A)ro zzf=BgxAZYh|Byac25TKn)M(fF35Sg!!#IO_)I_=B^@=qWu@Ko*h60BozbYb?EB)f# zGa9tglsv$guHt1g>=nR|P=eeJsP(@l$*-K}P{6_G@X712et#!{=h`+Mgf@KQ4_^E3 zc&|E_H~aLmqfxFrueerX?|vUq31Z4TeS%8qg{zJA_H?1T{0dIe(UW$GdpfunX9C`b zO+2aOpiR$TxZN<*O)6*8KvAaE{H^mICEJ~DbKB7Npp%|+pxuVC96)Gyu5^3)sYB@# zTXzoJtN02{X*~6wYJ|VN4y_yaX=;4H;`ZirwLhlz?i!rdPQaH5QxV_5mGm42+>tXN z;NZop`iG#5WB83e!gyem&<~D($qunH`#b(5UJVb+?L6vsm0u%O>|d4o4r3=V2RR@CD2&Py@a{QB_=xS(v`42P!0w8bzsxTQL1K;Jhofl)YzzhBd zjvpm!McvC6$4y6=*ri-%=+`*#-|npdhE~KEN`8LJdgRLLvj!`OyWyr-XG3=XhQ4l| zosAwA3uCkG8j$>DRwCjcfd74zbHo^z_GhPJFU}exMrp?)eXoT4w?4aLXeov=a$P4I zaeV_I&ol9Kp3??5`;Uxd!m{;|E@DZefADe?hF+WLvF;fEgTjHSBxn6HEb9q-IkRe2slG=J7Tgga)CUs2%4)V^p^e1S^(OuyMX%ai zVvRI62x%w^{f*PMBHL7Vz=~h9HUF+(&~$D=AEJo;4e+SjPiQ4aC(n7=9nHk~e?0ih zl8KW)wevJr%s_g6itqBA3EUVgAj=^?N1Ut8t-N)RdK1JosAm9i zaa6!a*w4z~v;LV+iM^V80}U7dL-?Gbs6f5>#Dm%r~mEG(HX5VKxFQ? zx-u}8V5rFrUI-c8tTywCK4?# zR^<2}Chi8)irZ7mC1@QFR8@_cp(X6|#d0O((39g)RB~^`YS4|&SEuSd?u~n(gGHK! z9`pm=yFN_!Lh8T_J6_fG1huk?Bpeb=eyd%GkI}m?@wETm%FgL7*{XLi5F+6vu=vd_ zIeCc@8-n&FC2t7y*WHon+0nIlIGw)-^_vJ%P_R)HC|{HnU{s)Eln6TbmQ@%hkv|j{ zobAYG2~B02cjOou>Fc-FZM-b9Iz?Q?KK1i;P%+f%SvC<5xsV*I?2Luwpa||e^l58gci*K zl*Fi6c=;J@RxW%ZuRhc7EqX;4(W6eBk_nLC)4#0}V{DWR=JW1nN>jV{fmz(>SwA=e zv@xa5+z+}IvnncuL~NC`%=g}(-5X~~eLXWqV!Dpw*blVLpKT)uYxpNc3^oB*bvDoh zbu5h4{1>)Qs~;_wP-iIqGhN$>@tj)tq!Y6y@#JV8_~W`a_d0sr&1)w`o#l)2Dl)jLnVt^bBF%CXaS) zd(RI7O#7X{Y2PV)YpKo>Uo-LAY*=b0NG80rCBXzmBUn?znP4HT|G2c&3NYGJJ7Y}2 zI98#gZhjYS2&!8KL5;z5IP15r{Lgzcf)l2S8q}4{{#%LeLPS2S8Jk0hDxbZbCEp%0=;!v^XCBv)xy;W_apN|I{kZ?+yP;NqNrSOK>l{kNYlE zgUn5_RW~|SAE|5tTM61ye(!Du*|W7jcd*Lb{@0GshnFSiLk7IowX z#_*WSM3`K@?E`Dh$GEOmbd8=c05uX zvU!O{&LqG7W|?wtbT0mgcOmB)vX z?Xdw4h7K7qfrbJaA(OtX9 za;jU@_TV2+2LiOjATtX%ch6Kzrea+3)wi&*?spmZ)Xn?E&9FNad@Om0$X~=JhcQ$l zj>db6rZ7z;q`YjRH{r#()RoCs#2#YA8r%Og*4)uu_t`NG^utQ{D&#}(fZg``KDM`a zMbM2VVEK{~@G!PQnRC1xl3S`>P z8thMyNqa5$!>>dIDh6B-ZaGPx>#vWmA|AE5NP@7nLHZaNy@SU=y|2gDKRXv0s~<^o z3jBH36bbTQZhuU{&0gYr4PNx$xQaW0^T5Y}!$?N*E>;{;=aLG0;`U1!{yZsFi71v1 z24z`+^aw}$V{4!{w9+a%%nHW?IoesN&Va zs2M{oI2w_kxT zuwSeFPkNc)6j=!UVI^uSg340jj)r^I+PU$nk=Kyh^0N0KezDBTG;<8hRe_BDypc8r zj-Qd1KNlZTS=HLY5w~IW_;=wM=++&Km^>9T{=rO#^vZ)nQ;U{mnt=vVLsuMrQF(M0{SBFyzXDJqd_`?( z8I1;n1;w_oUw*JtlNln2gfNf=dB0uxCdu>8BC1nSbfDrZBYpeUQ~rV!0DE54dIQ{f zsO8P(H??^s8z)+Rh8V{;d;aD)GGtu;3I>XIC%-k@pQ$L1DYHex96&qNm~zFDo7{xl zD98|T=`i_=98116t)tQ2bJg81hUeq2r+a&dgDyh-OIUg(6X8+P@)Hn^^9pPvt(P5- z8v@A|Z7_9eVmzEcuWoL`c~h0|%e~*1NIRovNxdeKAs2*p{ky-wBoNwk4D1z@~M6g3tK z9fxt)3?{1d$o1%Z;q$6eZH^gYoP2oFyff^H`lnuyS7_;5e)+*~RlO}soRN&)GdhAbYDR|PHKKFSf-j!_hp&;$vj47)i{ZFRhJ_gLdV`cC? zuY#@d?L`ef{6NoXkrJ;qJcohb|^@}D*A{( zEZ{AS)fBCv23O_lmkoyUZ&b|7r^D6c{IWEJnwiKFTt9|XHBQ6VVNbzia`EfN5fAxA~FGeWa*Y>MDg? z>v4sCQ%PZ_R6Q%t0+xnvEwjJ28O?L?sq|m z^P;TTjpUI9oYh=fWhc*uB-^y>BX@hRd7LhS;}^h1rVK@>rUBlWke>Zo>(H5>AL!Pt zSBo7cn{q{9l@IQmIX>+j?p2pc`I(+ zQPk`Mzu^-}p9WGj^M3KX!8LOUiGsjVQq^cQJuwm`uS!c(&J0dL7Z>!>3Oa4_Px{qJ zP2Uq*uS7a_aK^|!gu1Tu;%32}?ZMd+X9$#AB>_x9L87gdL0;kd&5WjNV zfx&g@FeNB)ci}dMvh*?51~(X}lzCCfgdN)*?y&7(`qhX61u0sJ)K*Dnz+Y&RcKQ_m zRHckdsj<@UB#lrfT!Wxfu4Q<}&AD3Yt7JRNubso%jEk*nndBO--WZ`!4^I*VRbo^)Csv$h>U7=^8+`6n?7}-u!mS z_gEphV_sNbv$oq(z-M_t?&e9O@bnfexyHVubN8>NV~kArv7|!mw6T$sj!PBh6X%vx zq61$LUa-kd3Nk%HnwdiB)%As_-*gT^#(dM?%7Jri)n!!PAWb8x>~Ga7xJfzpg+-9I zrADSR48io6IiezWXR9<=Yi-><`w4FVIiqg!s{7rGd+qPwxebBAZR*ckzrjEZKu8mG z^;rNde_XA7w#_6-v4Xv0tE2eo?YdLm;5I69#clzV<~Z|=`<%Km;asOb#o&3 zg%x-!!Tm`+R45|}(f{rN57Pm{21AjIl{VjEy)h;mo`EeEnx2(&mno=o?j&(!zXd91y#g(Hd+mTej|I;B4?Z zSgPRd{pbXZPNL8xBv>6)M@IkLu*N^JUSfY6VLrZ>wI3k`&cTrW>(h0;OWvaiC)JU2 zTicCmNWF6yB|T=2x!F%|b`^dwK|!^TNs4VYm51+!u(}Dx3W*$(31mT@q5nNAIh1?- z9#fC=F|FJF9mcWLI)1!b-2n1K+9LVNv4|uCOula&p`&CF5)-)Pn>+Rb=HtQ~0@p*j z`|LIxtTtG(U-m>v;f}TVpWD}t>kLDc)=pVJUTnYotp>svZkhwTfsgh8kv)4TnU5lL zI6hqw=XrHeLvl4dCd7a3Bykh%NpnZ%(O-*S_;C+${&t1`{IQ^c_0>tl1(?K%7^)_) zj6Q%>P{q`xH#NH;_=?kYcXnm+7f>@O+$eg;#d)sHLXXxnnk(HcJ$-@7-cT#HY_%$j zTfoJ|d+lUo+Jr)i>95`e&T6WT4dtKTUi8SIl78v)hkv@WWqa!++{e zc+urQ8y_Safs`ZmzpaqqeKe?3DYh6F?7YTQ4OrvJ`N1mTIdpDlRepTvz~b^j~LjZ2-rquY|{ z&o%ugpYPA>x4Ca<5uH@^|FwSXN>qa)Cbj>h*Zn6j>(A?V?ts-s7$W8PUnzD=nuRDt z#nrc${op?#tAAeqlX>?FGj8R-mRW0sG6AQ$75VL(|L3WI+`?NXy+Y{dddP>qcJ5?i z1-pRkHf!&WJvSG418IQJm9SK{sdj`vPmN&Yf>Yk!=f&+}|6eZ_oPsg2P%Z1F;_hR$ zlSK7mvPZXnfGgp2``D|26zS- zf$2&z64$`Nh$<6(Hxbrmtc3@B`AQiHDvIqlD6hVa35GFPPOxK{G|n{|)z&@q7>>)s z_5Ty7_`fa%5TP_WJMMNh&v;WRzCXCE5E5mlHBWkaRQSEo&h_SUD-v(L=%Jf}8tE4J zexv?*2!)?X^Z8FWkL9qzqLnhb)D^thj3;iR?6g>7DglBd$e%5!V{rydDj?=qj0u=a zUXLV~L+alFB`QkG&0yPTPxLg1dICH={U&U#9D?$`>KH9@Bq{E-H?-;3uZk)Vgabqk zKn@J2-0F)&klQMRa*6O4nS+cRZ!^%N!8aP9EH7q!_BVQwr$CalGeE6?ih_ineSC(i zE;p9-pZ%4H$%4r>pzXS?UcBIMV&a~Mp3u~ydU-mm<9B0v3ebhtCUrNPIz~Zr8T7uI z2bF?pW#=At&OGm4cXqV{vb`b6&2l~lN*+S|9$V4LsjYkay&(6y7SfcJ?*pRB z_BY?LX^&NHpE%S!21WY1TiSG5vo!Eeu;hP&o`yQZc5L?!oT@^8oT5j_6(q>Shd1`; zB_8a}x>qdxJG`s6U-FEtDXsBY*xsUb&+!Zo4A&3ZWw2lc6?dJS!Hb_yjP+cV+}vx8 zC&NC1>Q?I{`+0n;jV47*AdIRxWlGfei!-x)B=)cE7TwQ6rfT_+Zz1NVfCY@mWR>Iu zx74$V9Hd)+v<3k(bE{F|gnb1_-H=B=ZCEz{f&7yKf|ouO_f zL)w#7>i<+ODDbDG(mQm7Pq!#HDEvF5YX(A_@*IS8!N#B1rL?sxfssqlhq#wH;SAPs zB2P33Ss|a?L2MXBTnK#z>#1jOag2`6s{KTDxGOa(SHMCi^b){ys*X}ZUHdv{$eM&&bJvN`X*MnK zAY#wUTbA<&RTVc)s#Bb-tGOHJ6is9DHdU4P(pV#1LW8#Oy*XjX>DGbw+1<&7$;ky_ zxa(x`lFOEunn;*?Ptu2!ypu3D{gBhnt<%Qos-sSkV7=_n|A)P|imIz?x`c6ecXvCu zyE{a1IJkR)99)8Ha0pI9NRZ%gaCdhL4j}}G;MV(j^8P)(i_ZIxzVA!MIPA6elB!uX zXVrS)O>L?hapS-lEl-!E%)kqNugriKE&ozCtUoqyb7;Y$6{ar2?Ls1fmQo6u_|xQk z^-4G>$e{K%@Tgz;TX~KUxHX4eT2i0w?!a%Z{6SA>#KSk-AVf%hrypHQ_q^WxdcUz{ zcCbGRB!hB#d+|ZZR$?!~I=)ftIIih=&z>;7XElZLyrNH*tS2#*{6*`7 zQO91}ec;U0c8$iXk@l(E@erOfme45LQOJ~(U}8>=aM0#2Il+`_k8S(r?IRx$oe=n^ zM*5HOr~WH&?%7dAn9j@9&d>fxCFvg$sVZIU><=hE7_@|k?^TNLXy|ozrMrB$Qcb$Q zE!y&&yJ*(#vtzPJWS8AWlz&yp&i#%=t2{sH{U=;_KI!joL42#by;WW5Y!hAZn`1#z zN!?YZ#-J7tHrt!1fL-}3?AAVg6d99MqlrsGqm7Hp++DiXhi5;X`zP71rt$LVj|q{s z5*;n3(YyI;6)d9(yL1{SFajFRr{S$NXL<8xTO;V~zY6>>=h4;f#*aGgJ&`;-VbC+E zy{-~x`5Of4ysi_+t0hqa39Q(=F^twh&} zYrem!;qBFPRQYEW>5|Su|6SJP8af{E;ml7ryQliN6YpFqLana%@ju8f0y=E4dY5jV z8v0}VB#BMG%^Z9fnSRsCh1^4H)iV#aQdV}uzZG;nj{at7_^pyh zZ&!Ec3Fym#^$KPE9Kzr7s^M$loRGcm**Lr0d4?lW)Z%u*nT6F4I#VdAmLZb4? zvY>Yk4)%W@+v%Lu;Xz&E6~l&gnq5%8TEbktTSJ^=nqmHbS`&DhX?(4aPmQ;9JW&Js zLt-|qkh-)5b5ELVQyELsq95vNOfJ5nN4N+6ky*mOI?!q*WB4`ZABzu#$< zy}4k=6`7qlD2*{f9RG9@OnWc)GV$*{7v%e4ukZ%kaVm1 zge_}{%0~37gWaxBSAd<?o5#_~5Fq`6PfWHChR$2X@$sUBr{BwrzR1A_x zK)*R5aXG#@q4yTEhW<|2DmoU`dcK4!o5+4;r)ck=oUFh~Dg;te=A zoW$y6A+k&b653Pg$`2>1Ty9LvjNusZ-6SB%HY3>GAph6JB&_D#r?;_WD4V?%xDnxT z{IP{rE!;3XBpy}FhaeZcYY*Ejn&w~S3&4LAjB)hfMCpA_^Oa*2e^AwFuZ)bXIn)OrgFTQ*v(T z%<((8WshZb(gnwU{^oj?A+DMavg4o%qQ)X@*M2{x?*z1?L&%gV&@@lvrtsmAZ?sEr zoMBYX9bDgaXeJRm$7@lIH)-#5AMVxiIxK$6?lNPc? zwi8y0zP^Iq(GR#q{_3YOLV|A=k3xQE13P@FJ%oXJx)}lWD2TES&(3usZxv!2L_gTV z%Di@nz(3aiVyB8^?E1z~R5Hn~(uDBiv1EHW#@U?Vza~N1s+H!ST^jwVTse-|$v7|m zq~xJTFJ!jz%NerOqRD)2)<8xl7BPEv-&sH`=gu3#ExUI8b3Ya*y;I^?8vDRf7m^U;$z3;!A|5p-%QHJBIrSd?32S|2beOM zf@CwEm<*VxH467w+x!!+n&0Cvbq_;L{uw4d`kZ4HP=Q}R^tf*?QrJ$uQn=f{RoGUj zQF)#?V4Qp-tY(zPFVzV7j>!1@$YAGjv!|z4c-r-ec_jV!7`j5fM9Mgd6vuC2!pPdh zx#H(LMG?nE*Au2iN)^b8EDM+&trhZRMFC1v2_+1{SnlA1PjwI`%d;TrEP@hJh z&SgsMG%w>|)>3^A+%6ZZ%tuG30|V%x8gWSZs_&E#24##~LrKw@g=ta4$DrR^xq8xS z*Y+HvtSmjr7`7WmjrHCrsz2sWjuuE0aw$xq57MHmM;UIS9}Q^NF(@R3>$}O2g8IgC zAIaKqu_8+E#t{x91Z}yF@qf8~KR$=3mM&=s3vzQA#ZZwu@guhfO;aw(&9ILM1(;HT zgSg_OFEZ3h-|-f^8cj^cmz+A*R(0dT5O#l#XaF1dXuMik+9fYvzR;uUrcAJ^i7bqn zQXi$#W9UbZ`bYp@+ib;79U(Fojq`4)y*Ux&q&`Fd&!?NHJYVICDcrt;iD>i7jt=1y z!@wv7%pmfJf^`=unM>mCS%B!l{L&|3F7VY9qcw8rOgcgm5>57gA_Iq&{%FKKzE2hW zF{*jzfY6AprWL#9PGX(S)43vPZ!wfF2d-OIp%Mv!!RVfi`ZN0{rmU-P(`x2?-VVV&B{Sa}-H_a?=CA;bd(%OEBAq=Iln_H)S$l^u3( z3=%C@xF6gEWkVp;a5Tevep%lJs_~5Gam{pIPIMc_6RXC4K1%HqP{?tJ0V}mq*qQaP znnw47Bg8lGO%p?E2ZE#-wG(F(oV0P92OW86Gj-+tINcAKkW)X)-pAYdATGg2bQCXY z?Qaym{10sNES%l?#-2DGh80=EE{D$h*W^BJwBk{Qmb||Of`{myVF+|7%p6nA@~1r= zcv%%_34|Donzgj@I_{!8*(VpMj}P^7(!70Ql=iq}oS_%PW40ws#Dohkc|OdDBKLDs zDH2sm+3$;Rf>FY7+@_CbY+sd=YLm|nvAH^(q%Gl$8TAhgq3g*RU~UjhW^_rulAW~h zZqm{KZ}?5`*RRynkxs7mU;*tAvhL1JD%K+_dS)E`MS8I(-{_VsG$Jjb$-~w37+6_w z7h}Zb53uL9K{AeT=4ykLKOfBYF3;Bn=WYfO4cYH2HEVWHxFK8J%fZY~F2D0e3c(kk zJc^yf`Iunx7yLQz5=V?nmvEvdNI^6a8ujtkV(574SDn;%!{+QgspHpX{q|XHFi^om zqU&`GDtE8thvd3d)=7x+2MJ&2BbI=)WF;Fc7w z-=U-Od~9Qfh@+$rfD@AU-Yl85A$!}|fEyI&0GtVEq7*wFf$3Gx!mHzSL&jy9QgjaJ zzVr*T&@Km_r$bdUq)?4wm=h4epu-^hw_ez>?ikS}rcbtZXboKJ5TYN&UZIeYFdi_& zuVMnM0nOocF3ztmX7o4WWsP8{xPpZa<>SY#aqu&Gmr8npl;RX5x+s}P78kMWbkCz71d`qv9Cx)UgguVNi8VOjn7_+(U3gBRnzN>%+T&bcK~`nTDVxzZ$dCjH450V{ruq0HicU zeRgO0QgXObG;E&oJgE=K6%!nvXDTk-`)vEW3;dzsPWbSqgy8)1C#yUtc4s&9sQuY> zh5(_DOzekn=Hx0IRyU^Srx01O5aL?I)_i)Ik3Qmz6@E3O6xB9;GuPV^Xl-b#ZX2?*#bb70kR0Wn ziiB=P!ftN;n^&^Vg#@Z+iR50d9-JN^ZLe)u`=P)69Q!)jsH1i>&)_}`a4hgz31PZf zGw@VmVE0aUK##@HP>AY0L=72j1Tb|~Z)pl8WORAj=@#?<7jUd=qCE478~NEpATsOJ6A z>U|nS>Q?;lB;E3SNT;L~H+Y2+{&$qx!UI;{(W}mx)AXbx8Yh^m=`OFlMN8CYOo1)? z^f5?Z9KAd7$M(b~uH#~QKy--v5nw8>1+1WlpXb@wjduKAaf7R7(brAck44|-Sqgd1 zFK^g#lDT?-e&l^*Td zK6MOX*}8J6t&k*%BS^Iw4wtyk|EyaFC$ByEiyqmR)pXBY&aO!6C$BBGNDx^?ye9<} zlqPcBD#inDT~UyXsvlClpHHR#)7_%sXdAOZN+La?^!A0{4QYy-|5MQq*~(hB^_M?+ zdsgp%gU#G>sBIVQ>TjsnPB$HRjMZ*Nr%83`zaLTGa0&pyS!eddxmr(CRq6V7HYweV zyxc600v1C29H%>1%dks%$JWfF;cnTJp`1Dbcw++b18lud126OleqZ^^m7QEF(e$wi ztY~G$U4kj%?ahLL+3DVH}!_j{1_b@9diW&iVR_3 z)$2t=uK=6eqxH1d?Q5`F_&U4Cy`k z8$)B4AoT;s{wc^0p5zH*X}p<%FZ*O)Q~+RFQT0r~3!@VbgSv#~Ck^9}lh^aqJPhog zCe40o5UKgvI8M+|CGT>DnZmZlJc`19hA~)$fafM1-tKhfiZ4z}bR4s{LiWf-f;NIg72WWEl4ooCJB`vDM1uasP*LC??4)4%&6(Kr&*f7?8c!yRPoO zFbapHl59i^E3HAyJ|{@ZR%K#7`;HI`JRT{G`8VP>|KRl=HcrHUEAp^X@und`F=h!S z_vUV&q8!23;c(ty`s>@=mqM7B!KF0fIN8kf-Bma~Jj}NwT)D#`wQ`Ro*w$5~cj?2O z%~Er>FN0x2j9osvn#aP~^1g*g^ABFt8O1|vX(9}cCcd%PL28mG>Z}4=X`9S^wgIUw zaCh089H$1kU6|e?61YbI!mi;!+(?#Xj0cDnW#v@ZmdOIWJKogvyhu$k-c$)OirJr} zsk1pq{`p(fBVIfk>zoTlFVg>vQ+!~SfE5y<${mRiW+kV@yQ#V4ok|80IBw04n;yKK6Ts@e-@ntd~eMu}`Xep2PJ&3f3m zryhg$Q|C-<>EK$j`?|s69Da#*k$BXk*=TOkV$4Iv7L&7ARWok}pr}60FgGy_7SB7g+6+|M=GW1WnvA9A3Z(4Flh2J|qRok1@&~x`r zfa&~sj5;f=3g>R|=(j(=^zOvyA_r~6xJln$>EcDdJcVqf63S1w2yp+ zRm@SWR5&s^&yv(OVff0-JX`SbD{Fh(Yv|-bG9%tzm!6)~+I#HME1@MReXh`+x1kHR zA>{S@)NWdWh^uSb|5&b@A?x*>VNfOVV_H|_ug7pWyNQj>g8TVpv7O6_mm>}~Kqbqz zbcuy3OlTCUT`P>H1{YlqU)hXfqr0ZH?@_w&P>4Z&R| z-Al2Jn4b$e9L#a9GA$%|4EicO7 zx5@Y&T1`5=pU)hPBjepxNM?)=0(uQxjZEEM&gaQ!sp!Z?sS6(VS-(=96sld_HQGX8 zVJX`kas06C{@j{es{HGPl6|Y)zGV32>5OcqE&^HYwQ0!ec1$k>);-n2tU=p17`vwm zhmOA;XCb=hV=s(WuLzmGgFHr$d@mUt?J~;daDmmQ_eWBb44f&|llWFzImd4-nmBdZ zd!>tX@7Llyyml6ZhEL*}wD@hL7nxQJD6RETq@*`sS0BUI3a$uj)NHhYAXWFL1giA4> zwGyg{7)5K{Bq!P^J5vcFsFCHzkxRKrC7k@RE^#VC2p&Uz8EWo}3gt@VvonX@8?B*B zW+26?DXr`{>Zks=o5zG*E_-*b)tLtwOp56w-c~MqjgpTLXnU0^^e&!Qo0(|%VeGWv z4E|wLReKRBfHW{RVyHbBseN-_$Ng0pcOzGg+ilkwA76cB!iS1sM@fsu-3v)1KSqOb z1|t6=Ik@)I>;xo{qv_gDyLE=XpBURS>w`T#>lXq#AL%;SVIVVIaql7&EtswVo9^_!D3rN`rs@q&jcHka$Ii&{q!2}>AmCo?Y~aXN ze60pb8~MPewPJ&(zsXYbP1?Iu-HI&s`(L?l!D0>gTJ@vXulr5$@z*z>QFxmfL+`5U zZM9vKuLaC8@MEf2C6;s|zcRCJ_a#{}SLfw~I&VduezD-kuN@$aK7-q0;o*K2*VWto zyV4(MuY{OL5)mDx1a$et?M{3MIB3iuxKir)=)_aW4Gbe?2l(oz9ywF>KKQBGZB{Lr zQ~zfyAjS_29J7slyq6L`y~FsXVE?>b3_IXH zo4cc+tUPNL4J9*#&>Z$^JMYU+=181-ENAFo9domr?@KIxoeON?B;s{NkS`(88b?tJ zsp6C6A4KEfdaP8^vG6B}Nws1X&OgD*w49821TsQa^9}{GoLM%IZA7G@pnyt4`W+iN zsd$dpnqzKTjdu3Vlb^&UIu~1opaV;=*7X|N@CVj7H@eh$;4u)U>Pd+}=IP3lnOa6U z-n?UEHP9)6xUwq`NWGNzw#`Kgy?u3lMgOhjrnvN(zr|yK4O>-BzqB!qxb*~9 zW%5^b*U`X4Rrh9=&UXXdi-v+dORI5qmr@72F5PN*4-R?)>Mvre3i^XB3_SFG8?(v! zN4-Alq{#j7Sg(n)J|XYHqbJ^QWR}U<0JH==oAGs+5V(q)mAz5BLF!`W)Luch@UK+R zd_p|2rl$qN_I*r$?2m+~^Y{O_$*mVFZvymHEjSX2;h>txuC18|Nk|7qY!#S{U&S9a zyuN$fX-}eO0GV(gxW+yCnzL7X`~0Q?BQkMQKTt8q{NOOA(xkm(qgDfee!(Iz3soD$ z<7NQJ-592PSb^BJ-pq~FoH!Q`rgH{%p;)$VlwgwBp*2a-=Ela~Uo_Q_>fEBK`CeFk zW*+mh?wT7)XAa^|Yc$3GO(93hM1o4Dk+AwY$<~EU?Wnw7;=7^6=XT*i7rfFuyLe*A zda#tlw`ShV8T}7Tz7`~Md;U$Sz&+taLbNtzlu9CHWQKhe0D8|n+j3h_*%_=(k$CsY z68&J*s8g#EDn5;YkpJ|dYi&|PGlgl5Y{joyo_Vwv27VhI9Q4vfw;M>Rawhw7Q6p)Q zZ1P*-%c*5 zk@O(+q&n2Ld>271MzpTC_Kb83TDq?^{}nw9={jCnt{?_Nd~|j!27{gT$fSb*k%Q~) zROdm$N53vOqgzIi`8Z=Sl(?W~9YPxH==N|dW0qhFxMDb!S%<{e`X^dHHtCo!qEK%= z>AY}==vasDx}Dyd6c*PHFE7w!1=HSHh;ge8tb=F8bFZYMlJm%v1G<7w3H5$Md#y*z zQg@Uag4fLdMQ7YbO()KAi$>LJ>d=?1 z6B9OYSBUCXaA$bvQ(1)DTha|T4f`gKU#!t{vsO(AU| zF@xCDpKm11Vw7w(GxyAtfq@d}EvAMmw2oyIuddeW;E>Ow$1@>m#+sTr17+#fz9`u8 za8O=DHE$YMgm<@vYNg~=2+PsvQKx0`W^ZEq91{(UVWl=gwt@1CmU#AT4&%U1ht5HS zQl zherzfmzAYsbsXrAEw4QK4%uWy^}QD%08;Z&kl6;HFON`;K?w4Izt48xh)BKwt@uLZ zJ8_~FG7!-{!Dpfm!!LuLJ8k1`4h=BL9h4mVg4WPKNSSfuyP1bWxh~t~$4nnkpO>l|4o(ss;E0Ej3XA; zRr0d*TL*y0VqW3fk%xKi2-I92QZn(qHu@H;9ZXUX%#Ds07j&_?Czp3b8S}K5wm{urC&C| zt85jv1LUBm$ApO{xN5r{75d=lkID7jgslbS)B0>as)l87rjmB%A^4jP^zELC$M@nb z{xx;goCAs^G(^_-kVyO4p-B)sgp zXcHt&=q>lnP+)yWqxBlP)#mxT^y63aqn$xf1+s?-En4}ziPjs->?t{%@bSd{!|eT| z%bY3uBv76Hw&a^P0}~N$puU5 zu#_SC8DvbnU9aSCI3|~Q$9!~rCTY6KL3fY#dfjhRTfS+3v6x*Q$Vj7YH&pwVW{r*` z{=>Vb0yv|{)=rjUy)j5&x>#`5B3D|J*{zeFHrx)dt%F}herh~UaApK6Zuga3r&h25TW9o`2KXeYy>s)Z{@8Vi zFLlMN>S~A6kS?Ta>uWUDl{b7&j;&@CU#qreLk|ObwIibCcI};VZ$RMrr~BNPd}G$z z@i$XJ63PA~u7i-ms|iL5j_S^eo9+3g_tcPB>u7a1+IQ9Ao(5xaJ9QouyXE#y_>Fk- z>VUU{dFhO0Z}-%Tl8z8ZypI-i0=un{_1pPfKf2@uf)+!6>_1A5k<>5V&aK+68b=tK zh_?*y1EQDHvfD*I0kmG!l7m#xWfJj)^G~>o@;xTMg!w-{AI~|g zQ&lj{f{!JPiz;w2{tRwv-_t^}>Pxq5yzYHGdb=B3$mw~8&~U-EZ5j}r2Q#zZZb=JX z_|tR*X{VhezkK4}Mm$M3lg{Q5ZEk(F-FMx{wUmadU=bXACcDpK(`r|S<$o*eq_Q}h zU}!oy63T*7wGrQ8hQrD{b8oyn%We~G1B}3 zU~RlN;)r1z5fZIh^}iRM75R*S^mV^)D|@65{G;qt8B)*SWW}QRVWMFAKF%7y=bodr{u#~2VKrjz@Ap;v zhjJ&0B0reh$zBn~AjqeUz|pMG^O&5!sYPG2AO=roiRvDTirb2lZ*F(3J+UqFkby%^S?PPU%EDx2* z1sJlnni;!}@!;I;uS4ki$+@5k=B;z5j$w688Pa2M;d+J(?Yyi@pD2ZGL^(%wKShRYPFVUpI_PAilL(o^ZNRaWRf@A9$oF(4+G(!%l2l9Wl^|BTG?fG|U z%JIZi%%&>l))o34bpHWDRYE|cEza~MbhlA&zy(jewC|IB!fZX=@b6r8_gRj1jwg2V z_qmDUhYS4l^23NLOH!h+qsQ`d>t1%p-atkhbAVbgz#1^IsK+mpDrBX=p3)2-bNGw`fKzWyfX%zB}U zjVp=R_e$dVF_AP}TBul=io6_}IIfYv0PBaLLDQiX-roe6wnqv8iht_~2n4Ka(esko z9u{K_*smNfp$TGACjctS+->>%6*DN;xHW2K!sjzb$M|%yrOuVK;JoH zTK{d?Lj5$lQOIT$VgRbg>}N|Kt+sA9W@+0BOm7mGq;V=8{iqkDo##3^ttd@-m|>vk@NA2eEJ-x@$5ja`0=UnI)FVmM~o=-5`l|Ut2Yj`iHe`G zrE&lGj!mP=GNQtx2bd=~?5q|lseIspetX8?CCEDAv2Xd2QBQGgr)*GA8zLNtP zAT!jmOmzG*leSA)_8X3wL(T6^=Nq`XBxz@%r0A{2s+^>(^B8rs=jegvdgzon&>$T- zbX}CO?U9j#4{c9#igidc56vLeude&al(E(LeC=V(>Q;DjwPvW|ihFG}gRq!%Yi0l$ zO~$b^Rv;$*chwI{Jh6g~=fh;H6HbuP>6b4^*K@8;{!+9rE{+&kk1nM0K*BH0HF(H> zp>Zxmtm;Eaom#7kRX$Dwfg(%(p&MglpcAY(6lrVkMZ zyWU8WXD1v+%*E9e$OA$t9Os_u?|)U`f&*Ws(^#kh;d;CL(G))YO<{#Fj`B>vxRgPS z??Jc|OGi}^mbavcdmdqTK0MJlxOHsLQ`_~HBv{m?NZFs+#FER+km~KqzOwzB__hfG^AW@v+xrvRb@6A<>q6Wh`g0pd=a%~O1!5JItyxY(D^*|82G^y)s{rqkb zLlEpi{XU1K$la%5B|0DNOA29k2J;=2=$(@FJztfWS$~vWS1R7*gdyMV^L}t`ZLuQ2 zHW`R~GpYA@jOG~RFV+V#L6R;0ADgxj((63(`+EvsZC_hGf~1y$pa%>dq;h-dDKA4q zSEiR0zc1}3J)y<0VVj};w(x(hF|{QzJ#C_f@$=fiQnGG^amX%CHB?*3H*`85q=3Un zkA&}r*B$RB5zbksb_n)E+#M0h8}gN_m_jh2b&?f=7k7MB`h6KOk*bWd!hUB2pI;P( ze8WXfZv?GJp6P`Ix*c<@R>ArN``77g4lb=1_v!mH$QXxD;cfs6b&IU*I| zVwOg%{)+=GJcASF@pZZ0z9*Fh&u|0U8UWZQnW>^JqC=hzUd+Xcm<}WV1H`B@=I?Jp z8ljc6^dspz?o1ODBi*QwMFYX}C(wd_PkZNZ^x+$CwCpC^{#esB7RQPjI_J6hnMhtP zEURbtgWPdbW9&ChKomUwG*z68A5Y5F^0k^jKECPsP<0a8p;%)5t~;?roHI?gg!Aix zv?zNkA5p5NF>s!0_)^?vpIku>rH!9SXDfSvSlTIl-Y3c3@%0Cp%@Q2|NO`Djuwtd_ z^Om=#DV3gc0x9|%i`~!fXYYQcQ}5n71p)-_$l=(UcFuvjZ%r~FRjh9Q9kgDf>V(!G zt9=Qx-oc{dx&K--VHIJb@hb-*6+&4I5IXad@q0--GA~nV54Fp$7yWQEa?{Fc2_F;P z3)jE6UsSPo{(-V5fV#yQJo79aXkRaHpkc4^O3vs6P{u*+Z-4kX?c>x3wNj-xO;oN| zI!b;x9&Bh4$E=WG7YaCN0ht7``MKBHJKA3XL|4r+km-OGsA_sYv~deF1xW(n5qX*P zW0IxQ1mLq_viXR!IW0YorT7kb9-+oiybXvcfA|Ke|lA2M#MmwmTLM$=*1{C|P;$ z6yn!yO#F{YiM3=NsKN;h&Mm}i8+sW8#Wy8L@c*FwCl(xxC&qboB+32mr)IebfdvT@ z9Tg$%3k8%cU3wVsUGImLOU&S1@-=^vej*cJD zHmSZD1!5P1TJzGLvnDB_{@N_*azvidlIu?+rjnbbtW|(69p{DrVdAjhyGIr=Zm_fn zmuBOB$5jIx`)fF2#P~?^`=+466pap}P${%ysb<@aDe2Ky8|r|1Xw*w=$vLU`QJPBq zF4>%hngh|mKIsSVR{#p?iA;Y$os;FC^P7x7(k=MLjZ+>Gt)|zIPUhn=5AV$(pn$D~ zJU%!+P7Vq#%CT~4!iZv~)m{fIkMzxBuJu0Kac=-D+00(yG@k6mtS) zP8K^GP?6w4tD%x8lZ#ZRy?>y6@Ob8EI?{HN+a=F87XVky8bi2w_rjI3EXIO2HqF$C z(HDDvGtiZicwV1bTSrySC;!QBZX^Cvw4lsjt>DrM$kn_=+JinB(U$p_yDcWSw`&hF zod`WfF?=LG=@8^hJF0R{mU+ds~47s7X;p9e0AQ zGC(GM4lD@`3c^xRo!&GGpnHb2OQ*vd@PlC@*{4s(9{^H~Q{zp1E73M0_xI%67UXHQ zuS!R^Y2IyAR0;zwGE#f3phKoTj(F16&qmi1#&V&i!NMMd@2ho8JuxoL_I z))PFhC8WQulnWC*JAi%dlT95y)pF%(yl}ePQ(l}nO-gAqEd#)N5ypcVJNEeY`49{W z-4EbZfvktOQ$m5$k%J49V*jrS;=^6Nym46j8q@y6zLpvco}x3^qx{WI3gDi()?rSL zfo`BINBe#O=7TZDcLZSt+vlh?t1eWkEa1xRADPCjOf6`6SM8f&8weZPgza~uoobpR zgWb{Wq<~4ddFRy6^;#mhE4AC0R~+ChjC2s=i0!?YM=mxmwaBXTHw{XVvu(Qn!z=9c zqYDrlL>KBoPFbQ3XqxfM;t7GnAHHN`gZ2LGNjAhuB$}W$WXTAZNK)o;qG8_P)lSdc z)@*8l)X-p$Y%Vww5Jd!^?lbH8Gik0tHph9ZIncAaV0)Oo+0a5SB%}vp1Pzk*ztO;V zVZ{+kt0ZIv5%JQf8jB`za+OUjY#52k?*OU@PX$;%1TDa%uT)$Yh_l1Mjo}~2+k|E? z0TBL&%?E^FeoWAMQ;BL=zy>>gE*dgeBVgv>*N_3w()z6%F zU$h#w;9qJp-R|5Rv$9<=I$$?=n1eAD3P9VnN;Cl9(kp@cCH^QKFvrU;c|YsAB$z_C zF!K)AEBQ{vowuLMGpFOQD}79*ta+k1s_sg%}Z zqy0NXbjU`{eYNl+h}KT|$-j`?k%8OHz4s%mpsBE98&V|ZbSYo*5G@*(H*L=I8cd95HA5_=6o425~DYAJ0v|&<}8DT&Nn2&;wJ%syhauBrg2k94V z{F&BMH^0FOCo)FG%!om|>zNp)*f8FNzI7J7&ow?GA!aWGOalD~hg zQv-W!o6E>M*GpEe{W0Cc9}A64QJFn>!55vjmxt%^YlUC$dUAbJ9um=6zllbH>G}tA zgi55_mGP4crUV+UIgQha?5^+j?i2H~aBIUCZr?`B!Q*+#;F|#P`4b{1ILJczN+7z8 z`NJm0C%Eowd19{h3>|cjtNS-jqu^F{mzVd%Xzo5Shf6*jk4WIvvm}G1JhHZGK;7Rx zH}Fs|w=!PglDZ%eD^T`$P;-r;VXlfA-1gB)vmR5kqUt;?{u-!X1GZiPscfBFcquY> z@iHLIsZpV^o0!_R_2{?iEB(#%cHyhaT0c+Fe&E7aRFjvJhTNO~sjC4PcR7rQz$hAsNXa`a84L0X0RqugRci1B9)H()f zQe?Pc?$wq4T7JGVEk$q0B!p;$Ca*U_i1*kA+4w5=#ygx-hZjuYs_iBYuzNr_$>A%r!5idTUsuh)!(7s`#&kjb&}sBt zo9>#0kLFmR1yw%NB6IksY(*|te zfI>QBc#^eRDD>N`vrV-6DaVPsh%yeO{F?a!(!$vrS@yU@ljh~Zrh9l2YJoi|(Q zl(1g!#`~;P2IfQ~O5SbhLt`T5U4BZyJ42rk=+^jKx+NkL_7{h$=i>Js#w#S=S=0y} zTG3A9u!lSm2+CA4xP&fln5hYkxOQb4wCH$$p`XQUY!RPSIQM>YwRHr5ICm|CUow$f zfP5b?A6ZSe{&{Sse68Lz;~7it-SSMoSn?5j>@>q`?`N!4@)5*Gw(19JB=GC*ek9=k z1S`;R|0K`T_4kkYFPI-lGSDV$L@JfjM*PHVjuGeUd?RxD0Ce}+LLNB}>r|F4a-D1t z9yqLHj6S)I&P=%+VrnbOut1iU@OoZ)OF3lT|C!VdS&~u`rtT7L2Pzo zmRAZJkfWI$1VlA`N0t8*zX0SO%{(4_m9{hi^E{3bi!99*!DZjqn~(>yuTjq%_MV0f z{3>7l_TKI&1I5PRpio!?U-;2}51@)wk{n;=kSdqQ=eD2k#$&8jZrLNT^y?{zq}2?)n2DEJ;PQc8owO{*67nuXs#ZhP7j z?n#N4kJg0y>qIT`*s~%v+zm}srn$sHiG6c`x+8reM?h$J_60qEiyND9<72oAVY|Bu0GmpSWfp&uXgg;eU3*&LbD7_{Y z-2L!L*+52ItljUQsUVYTG7imedxpL`+cAFfZ@gI6=K2-`=kM`V-n|R@MR}Ha%;dbH z9gqoUf}{lYjcB(#i(6<=@&F2$B%cEu^ybZ$|HafcP~cM|usv?-lW8%AleosMLxi2=Nu!W2V0i;9O^_mbM zl_PEI4iuIH3IVlq)zSj1{X6`RK9$cv`a7!s{cNEB4N#J2G0E$*S!$sF^R&L;@2aWe zc;Yj)aAxa8RoXpUVrr)wG z2EZLXmABRcTX_g)&4Z(3k=Wpg$=NJ}lg>qdOFz>+hm9B2v)5U1uQof24?i#@sTI{p+W2@PhyCJacyS2Ri*3v$rMe??)V{r2S`*t)oAa zPyFwgQQoM3w}3#2_&LLbYV$ zilTZtamefxzMMra0!+1mY*Fj!$Y|ktotWiuMDlC*nY?1?FPdK2uY$-=zqr^UP5Ej& zW*upOT&UQc5$$?I&ZU-po$(Eqg#MtL>M_*Is)3ecf_TP^LVbhrfGJ9N9)Lfv* zSN0lX(XQ9?@d>@(lV;37y%K|l=->{Q84sF>g&0t`C~Q}tXqY71mmTm z=3`E)dPcDLqk(r-QJw_~Ry%wOf6lZJnzoid9vWPF>%{<-(*qeR8yfE|1Oa;6=Hk&X z$`CW+hTEfAoDm0+bKQR;)uAW(yxE2&%cvvcOHfJN22kYn@Iz~45U+8V#1x7l1nc&L zFxJQtvG*I`Fn}`SJ+9Soh~@5&+QR)bz$2X<3oc6drdR`AOxBqJz*MI@!1`bIm0jzk zokvlu1u{pfP*mE88-_#fM_3Nz?UVYFaPY!(^dUW=uKNriOmxzl2e_eCf71|PiVauS zn!!K_`VH|^csI5$Gx_%x;~-Qpm3^Mn=#GqcOEw&^fscj|EeA6Ak&)6X3#XA z$pH?HyV~xt2(M-wF+s_IKgAF8j1&c)TmyNG*59N055NS{FO-ixEka-z)Rm^M$!MW) zwdJ_EqH8rWuZi`!Gp8a?F{SG+08C?1l4wjh{K&h*jP9B7GWilvQ*+Z=IH^qj9Op8L z1oZ$#_PRi)6tTcfG=gruGKliS7VBA`A8!}Hb zvUyo4`>mfgm};NE6bop$=>Y{Y*1JfrVv5eTG{pa_y#eTYE?r6@69O^0N`a_LJ_jIw2%Y&w!*QrFJA9C z>T;xq_W|s>VxsR5L(lWFEBHT~h8{w!C2?>3;ja2GEqp3r4D(geM1l*PRO6A4m| zNzI2{j(hD}`{L?-ByWse`$2JDo$Y|)Sz}WnLsy0%H-z=LvI+TwHLwK}-JIIS9syiXstx3)qnNipu?gie}3@iy5q_f-?>8`buCB&XgC1Ow;;3B`MEHs zJb=p=%0e#OZ|YB7a%{}bs(w+Fq$$Ks1)#q9#+2u}ONrM4{oZB{!?Py)XMYWJy&t-D zNZmA9;r+pwv@_5q3*iu~VIK+80X@aI^J-ytLRzeNqN=(9RzZAKcmm)?uU?Vzi;IkB z?WR$Z*FgmEA6stLN`^E>sl>mP511{L{Wqu2gDSrlFRC6p2ePqo&QckxTy2qXuo_Fe z_$1J36=;J`RG|d@7PI!^LR|P82^q(106;`gnb>8htO(;npj+Ql0OJS%!ZB5`u&%}M zvubM%&{I9f3;dz6by~Paop8V04C_VE2$kCv<|lt`Qfd3FsU=>`{u73e7l%j}rLO!b zB0|0KX0qraN1YMhh9=@GO^?4#au))YAw9j10|{pKl2%>?qZBrGzdz1s?SmqQc3G4* zE|JJF&8v}W`LwUM$vYdGhX`rD17MR|*eEzuUEJ^M0>ORM#+)fcuVC9-k1|U`^_Ic< z38zo(gc(=Va_re_dSU4l(V0k{S-FoS(vyK73JIP>rp~AJCaOxvJ)*+AWs_mp+^t57 zBuk|t^_IvW8jnwiAutfWTi?T8&Gf#y&@5?06ZxuENEVX!T!m|neJA{Zfw*KMLGgFa ziOsuiW~93`vsFz?y5H{PA$d={=AuH-(>rbcs;9+fC3P_yeDbM+N!|qjl~%)NSttdU zUVEIduUyRi+O1@a@)wE6Zb@uNGeX`?Rs8yi<(NU<9H_jSC5mB?IPvbLP{29jr?@q=a|Ght)6qernIUXH%IHA7wbvP zo%LPpW8C4m@Aso#vLs=F5R`pzcdaH+GWXa*W*8=xX&ec=dGjJw#)Y5t4^p1%4Y&6R zHy$mbALyqf=%6r6PxI6NbJw1h&GBl(Ex_5!5YP0Fb zA~l~T?045Zsz!EP)BGaZ+-P$%Ni4sTFU+L0tyOi5!Eh|R7Pu~>$$hc^J?{fFyEZrP4q4r2e@g(OkNpJ(<5L; za~d|1CYf_B30M>_x=2kEkl(V9E3w<^@0~|PB@P6f*E26aH{Zci5iR%Z)qhD!B35TN za8kPuigE=^0&K_%-OLSo6Bi%%MuABOSiCunj3m7mlzR+FnsvC^e(58p`vBWx68%Hn zuIBm)t#10m2&KiD-OYQ)8(6LKpMc-zbpg)r7@x4^6Eq#=R@9cWP6Ks%H$oD{ClC#8 zU1;0)9?v~IC`HAPE`3a|#>Bmnb7Vgu082JV7v|!%wvSwwcGFBM9gMkL&q0cUMFGrh_*20F+>5lv6OAMCv zrs6g)9D+B4ar-(OOBb$J)T{)jYHuQ+(jeMCuC6+hJt3dC5Lev?#sT!WUxqYSW7wih z7ywqhFNdMs3;Fn>=oP6ELF#8yJzaSLNq9tcfMKD5hh67*Oa}oJ=e0ouL;GCF^%Bb> zl9Gh&pFQfW4k$k9{9LP@xG_HHduR@yN*OW*SlDGW@37nS-fE7?fY>yf(BgQ(6LyY; zmYAnnnCWaUCJ`$H=36L7v)^+p?>CQ}5>$%DV_w|M87yrT3Ktr`GqFl@w-IA{aT3A8 zFyB)@LX2UQ$>HfZz}Ik7Q#wC09leae3z`&J#r&{%x$z_SkgNzc&tUmx1IkO*#=Xw6 z)*AbtB6_sQ**hOBv~HvpxuC;8;6??Vj*+!o-JL0=Nt(vip<7spQzYRSUAx|j68{+t z6W-}my+8Cv|hY(Ep@3IPp8vXqEdy%zT{p z9oq13Ln)+hT(`=8vGUXDr)ZE^CN$~& zK4{ZIOOG10dI#4(6EJi*44p4j1neRS74`YVrHeK3bk)R@ff zy&gS}L1$yFNto*v(FLYaP-PpQUazVjCjo-im^vPeSr%7JlM{jXN#P6(XAA z1e*Zmvu#0nNmOadh)Td*TS|fPZ{iFUUJ5nPVD!9L$~6t2l%uDuv49W%E25>UTJyGb zsTeuzvk|7xDVm^;E$q?aef7yC(B_R0EPd}u?2YSU_HBEzLHMJm<&b6hu+%%qywYEM z8Wpxx+L9?(Cv7963g92@^V=;CAOJiT;z zrEBo|6T6drVtnVy3CKKhv&D3+>@|1R>d8HNM0HU%>H@!?7U5<4>ha#e~J4Zyx0_M`s{>-wamd7n{b5&NzClX|+aI z!lCFkm&NgZ7}UGI-?KpIQytT#syDp5fB2MxgSTa)+^wTZcKGHvw5Qz(Qgifki7B?) zK|M!?h#Ow{Noj8r9I+zG7NX&r>ppZ?$l@~)E%*yT%k!eG>4Rp@Kl*szH-^{i%_$>d z`!6CBfrb7jPE4n_@ULC@Zx}SqumSzeNTGP^$gxB_ezvmHsko*Ol;{I>cWY83-EaZh z#XTMXtltiNRX6u7pSID6uT)L*H~R#uax<`6)i^&^MqeeA@}81nGLEN4X9FOay7WCS zZZtrXx2GP3q?Iys-K%VRdI7)@Wz6QMs`P`}KAUa%)?aYT4XcXfx{XXNx~>3w>gixN zS;FyzY`javtlm{R{kGZZ`c;Ar6k+GF7w)K}geh^4UQmhi;8vpT;(AIT|;>?g{|y$6aW zP0j|*^jv=si+E#1B|PBfqt?Sotad2R`raJ7*1_~>Ly%$Y;VlUY_lrx0|6@fG75Kw4d*7Dtd@*bC0N{b zD}tCu5Bmo@UWv*IxKr5>VP|=pB*bjR-7|l;A$5PWYdqIdj1%kMhuz^2mxYX@ziywW z>}#92sR+?{T~#Py;tX?B3J5j+pvggfsu0pn_3b{qZzHFpoS>=;Pp_~G?-q?7G`5>x z?rtT!>atRuu;i)U1ekNUWv>8p&M4xE92fbwd_A!QpGc5)C^(UclZtKjT6*JL$A($M zE_^Jr!2p`F(Q#;n0nyUWvLp!GQX}^=8v<~@G63d!9>?P1r5$*0+nK^1X+(Ss+_Im3j zfGj<+=!s6>g*4p--HX#+>NPnae8G#dJ=#iM`wKRPS1Hu_Au`zdOx;UQ=cE)P(Yuwj z-Xld9j5Im_jsAs$k zx@8+URKAFqVy}1dKyx=3(X%N{hT>_~>F^%V)vq7xbVx6&_)#6rg3D z6S?0v^;Q5j^sD7V{swy{$^y#0hmuY7h9EY}Y{Rt6bh7fz1T=|Q1XfcN{;^HIL!VUA z=G4Xn9|GDc5CnJ>s5Gr0bAMIZ4axv?csW!pt8nXZH>j)XBthtHqo9Zo6}xtJa@Kc8 z8#5ytvzQ(1?>qGg0G%8dNeAF96;{OCw~T1kxfl)CaocSzlue(6gkLa)zkPc=Z)sd4 zIUah!8eW?YtB4>h62%eZ@HAQG+9FR}zA#$-SunZWhR@<6LAkV6T-y?_JvEDoAG3#a z_kf1e)29#VDl<4a_jO2qV6!#w$C_39@lFv`2B{N4CzPA(RgBoTt3Z}-zW-bW%%LRb zcwASe$4Wp<^gjIXhLJ-j?;R0ne+2=!zlxpzvI4aGo8iad#X=&AMh*4_B&xQ$8o_ww0;vp>TiY z$P**b6^-u0#Iw5;wG{P``&5iHy&4@8v%{=V(wuWHrymsW$4KXrZSIS0wX(nG`$AK( zc?IC}?sM!R#0Y7)VY$5C8^LmD#6@KR0ruatboLSy5WORw`Y6j5CA<$f5S{6&hxT2* zCi$~O)CB$I;VSnF+Ca|wbx&OF>vd#4sEo|wH*$vEB-IG*1ub+P2;b~jyc$(?QmyPT zG6{cSH*?}a_mqY<7~$^w&!0a(U443Q^(nFVy{gZKn&C#3hSfUEoq221Yl(SNYuj5} zZ_AzBoU6*+vO>qk*4DGqCB@s0?Bg*CUI^MaNdS@WHv@e6`nP?J73*?kx2bw6UelgmC@T##wbyq|B3Cxd_kS>|KBjnH{N%7Gi+p0y z*sMOCGuznD{aGaYZFJG1p$VVpr4F0oiuDvS%RmN7_Ik^3z?wO;5?#+cP6EFPl^C5QDVN!H z0-=%3@Gm3;1aI(Rpn6DCLr}-b(b60mhq0EL2fd(%=FYNqXVpk7gSGZe=g2uHVbP*6 zwE<;Y=2^ zG^?VKsI>#9p!2D?>y#_8R|!{jTCt7uy>bIi8Fp^UOOlMsW739?XX7@qw|~U3jOsc@ zGeP$@(kYX4ElSu5L&j^}U2@P5`UvcT(GGHNwwLSEg?Fg)e?e>%->aKCEh+2lGhH@N z#^F;M_O^CnX1faVQNdpiL}iaj4+_)SXNw6lhi>t4sJjxYr2a_jFc?bey<WkRJgrc)_pWamTa(KuX6Kv>oP*j`X<)a`Qeh@ARdh)|`QUAVnV_ssA|mF>)! zId`n$POXGpZUb z7$5fd-iMFc+X#nw6PwkBo~7`LYzW037E&t>xZ4H1%gpUgjZawQOUgBK@sYw1Tt{XU z(AqZWj@1(tc#^b|anFQjCJ*Obmc=vktt`*g^?ue$9r7>YgEO#gF+cp3_h#)?J$F-1 znJb6EIcRkB=Qi20mDJTptjo6$h|7k=TV^xbMnuL%TuZM_@NRgIj&aX=_^jwH9GcDfaLT$4hoS zomjZU6N;mWDsK`0oT7E<%B$J$3&W+fFGHRikgxH3dV1PAuD(tXf2ZwqxEUE5VUD3! zC5PBYqyD)% zlB%7CvHkA+hQQ6#L7!1A+cpLV^m|9d`i5yY%r*}a^4`|cBJ}_=ZFsYiU!}Zh#nrjT zCfUBnHaR_bQ}yJ*i3zc~V{i6(O0(q*dv{E7RGXpKnM8~hN_F=3V-${`XIRNOFxbS+ z{Ee9a{r6>3(k-r6#&CBTQOSTtwFy5c#*MA1*+B*x$K%IH10g`wTP`jeGyIeEo7cnG z77GJ*-g)4S?3bSo$XM>z-RkWBKAqsw9HX~h^+an zF(y@4teg{V{lawD3VomC;#DU$wYF=}6{EL>m2btg`*;e3RN^jL{IG3S7IwV-zB!eh z%hD_U>7&Jke2W?B!Sc_I5noh>Oce&ox+>%G{;kH~0}ygQW_{PwsV|<24d6vallvQG z%=(f&W_HL7E7577LrETr>MVWU5X+E42)j^@(@)KqXw6z`TxRbTPcA~4?`nmoVn8US za>Y*c8-h4{|E0MVHZ(S(%9g}TRL^Nuct+#v+Q(souxnUJPRUeYw$#*TB0 zH?h$9#}d`D)bIwaANt*bp3`Cu1HgjkW=n2SCVatVk@s2(*Wbzq2AjY;2d^Qh+x$@q zA$)br?KOLEIi`Qc8QM^e&H81xAhF!)zLBwluGZ%Z2yepHoxf31Oh%|}xp^p$yy7t= z(DA$FZt|&abXniAXJP5Tl=Xa3r?Ff%!WOzE4L?mFzZO~pCS2#idMI^?rYw7%6Le@2 zZvzN3KB7rqOk7u0ZCA{H`0Cj0nK!Z4;L}Jf$fd8Ta4=pbie|%hR`ml6NSoKsI#0@q zUoguqSdbokytX7Vsd=-Z-hJg}@62g}_)>wYtR_)gU=~loAi|qCSyW`_hE0juIFgcc znL3`;1$?{URopLr$*XoHzK^qXg(2T?!!zu!zBWuPVB0S5h{tV$-_C5 z$&b&tWNv1$I}@(fTRdD6x|6<>wM^cF7sNz2rGgKPzafI-^(ub)!RAMrpJRPjxH>lS z=>(cjirw6hTdzr;*x*Z6F}@ocJ7alE>Uky$rQM&Umzh>a4SHjmj>{b)mc=~h5jeT) z3Q9?efZnGmf9giX{n_ptx}SF;70MpJuptxz9u4QZIYuJb#Ziv=JlQ#qlzCy}V_#T# z9{GZGW0)CFhzszAT_r2KpUj?}$(TI|Xil{V9L}fCsnh%7(kfe?kFx0W z-Xe^fZT?8!v5LkKXlcBqc^Bf~(8&NOBAN_Nw!~bozKeZkmc3NcBdE`_4 zi3kA!4-P(zb`0MA3E>y51p|nks>ON7PYP z_HjPMe4*#o62MQGTDEz*ia`W#>+OEj(OW_psWp59?WGPrUCBo(Z`7H?X0fE|JXd$V z3N4tmgO z*tZ)Ka#(^YnmC~r#{xkUKtEor&*}}U{uyT`dBs0`(ImCCNgmE8Qd-@T^^(~vdZ+7H zYeeZwsrx(|b3P|G-zvvk{rjhrGAQ`NU(E~!Qoec0_UcrYS6pXG=hQr04txW&!~Mg8 z$(8PSqwGQOJL**x`+9XgRBz?)EKSOzaA1wRSaY+8^L;L#+ROApEQ?E}U)NQ>dua_F zc)TPlQjj>ptwGAQ4t(jkI~+P`T^}yshUew+@a&^LaOXzlsu?Iav+2J3u7Xp z$~q4%!OU=>A;`K>h%tCOyCiScS5T%X!EDieH&a^t4u^`7Q7ZP%qwp2G8FnL=gQx+v z8ONpog2Q&YesCPSzf0u*rE=^eKD-*}qxUPHem~CVxDBvXP z%;A{jBl(jqSi1Z2C+RCkCg&TB*R_{*mr%EtS+zl|V+uE+dO2OPxmHCAhilG@9;TvW zihJuFFPHWAKESfR%+zj2B{@G)myptjgl0BGUc}KVVHOSQI&L6J;=%Eb_LE^b{$dpa zTI%>DcdCnRhcM$JD50aWXpL3T#Pdua&>@#Ym=_9}Ss0XXJh6tG4PTh&p-`*YA}7_& zWn{NGd+4h#yeI(~QL*(qb1~oR+18FkZEt)Wj@zn}nj>91WYiqr#!b?6Z5srV#qbwb z432~=YnbV7Ja!Z#h(t>pSLEBqO)5F-yDUs)&x;F%rA2{l(a|B}mhj{q)X8d0F+UM4 z<v9|^fy zg&x}<0F6JX_je@LG|8JLB=?8i-rT^TXDCU?e68M9h1HeTyjE3GbX#q5;c*V&PvEzm zlh*BY+R(tCLcUnyU0J4fb>~HVsF)HlU>BElUcYJ!9N4I&ovg7F$pEy<>-rhP&?HS4 z1OSVw;L^{Lk=UuU zuncfWV(9UPAa!=>tdeHWqB=6aT3>YrvO;NF9ZyH{okc{q#5^a$7_UQ9>pz?_JyFYD zr(JW3r;;Xb8=Fv`TN@8%S~>X&@jw*egxCnh%)UpuX(r0yfuebtTm_%sp& za;hwvhOgY;KX857SReXUM)@0YYiSQ7dsY_hZhM(NvQ`EymkPCjlrOs@-%Ve@!LU_0 zJXuL#sBO!n?)fX+OO#CVlM_Anfr2MV{#lknPMxaC(L{qkhx6)>TaA~yW`0IQ*?L}w z>8Pp|@0*b4j5O)YLz{S`S(EfXu|nrMyJ`;#ZxEMki0565h*ziL)wf0Tbj~I7k6R-X z)E(wpQa~_wLLr<+^bv|t)_}>QRZ+Rns`dL-AUfwHc@%M1ZELc_mMXA*fGZj3=gn$0 zKj||l-JM+w))}3y$*N;y;IRZgh_LNJub{*48^QpUL#MOw?pbM6o zpMHkT%Xsp(zICyhaTm`Y$=@GT!ynn(eN*8LD(Y$o3Qb2|u~_iP_B3ry+S#al_)8~{ zTjaow=d5{^{mNQ^oBPVz6L>U%_tL$`wG@E;3{>-hSxp0P-EQQC&JP==uIu4qR1P zvUF#^^@!-IeJYZBu4vu0^7RvnVKhEvE;1? zbD2%5f=rL}OVh+SSO$^t5^;xa-qej`H{%1@hcZ$}Umu4xjL)=r6UPm{?%>t>a;$8F zau@R9^qK#Ni!IZHSt50}QHNO^HM7I6cziDw1qm@n!ld*d$hs5;L5YS#B%<+CmZvop zQB5e>5D;i?KgGNWGCVe#s5SmMWSE;`;+ERO)n|X)*hVI)oehj7=dB!0@I>=-C&yj! z!Q6m)zx8Vy+X<+isnH9yx2iou5|KBD9b&2DvU+1jbpJ znRW2Vl4`cPk~Xn}wohr7&G$?92j0)*U9ToqwX?5}CBs zlsAJniABTAw46$XB&a{d%j7kE6>67mW??B<5g1 zF70Yva>|>^ESBwGyt;~0Ko+5xL5=D2P>}h)>2)@dC3sfKQd9p9z9ur|xd}u!ZML~wmRf*vi-~AP z{*vDlM$1`nmYw}-*}bbOvBG?&D{3fGIV)E)V zyJ$VqnJSdSW4+&d@_Kcx6PV(Iz>c!5RaHz}kkk@Q)CUe+tSIdvuAYNn_kD1L7rEOuj~s>P>KMpFcKcJ7Z@r3f4H zfnSPXMk=w_AGv~4iMGc?aQz@JL^YFpC2c+Opi!UW6RSYpXt`{ZZ z17R|@pbcxEu`c{h#==GgcVv?A%MNq2BmpyXR#a$)i}6hEo%tE6GPwAMPg*c z)jQr4pplpF$RfY^7&_^4Y-YPgpPTW9fsITM`hA{mUhD1UX5_wLoNO*<=ikIpxDY7Z zbeN{O%FIc-f;w~3JL^&VdHDew^TzI0KmYv@Re_UFBW*%ImqVte>+g^bpMzA9Tlt#E z_JIr%opzfmZ%zL~g|pin>{=56aCZT}0O5t?GZph%0K*opbkL zvB$+~H@&^i8rDiCMyc%$skui&e6b>#*@9ByKZsPW8WNtqd^$Xbi^TUxb@zd!hr@W9 zjQ!l#8>wq2)7Q3Jba7b^(KdzjYjv+o<<;BL^~vF@rg!B;*f%)XkR#f(xS_N!b0Tr~ z)odHG>S6pBi5HDq5B&* z$3Y3pJCDq5Og{y?_3BO367x9Ud1Glb#ETp$P^bbn(r5+cvBdDK?>o`76{PN_c_rd% zxx>J!gFTKM3?XBH1W3jbJCRX7B1FdEp^1ul^)Ds zyG4jS|0aw(ZNOASAr%(;%x6};5pkA%ddXZtC#CQ>rY9Y zm{sa@(AgkRTT#Ls`%U%5v*r1AEk};)KD!y8*hV2qk=UZUkikf_mOxI0tT(xPwf%Zx zy6r6f;A2xk6UPp#HKDYLKlMB}Z}8n+A$pEB>U;T7)fi2o?Nuq}m7#NDlbD2Xer|%V zB-hur7XiX5k0h@p7d4hZdbebM{iU*I*p&{WfvBx!wI2=#`xHgF=j!Vazh9+7eXY`p z25M%m%MI-@AhI*AHRAA0V4t~yy7f|7zC8%J81BK%WAASGBW6gT-YgZZ&B%fOlwjgXp7ebs8#J_CYix=B2V=WgjTOF!56ZfntC% zKacm9oI2NE0z4XNOLq-RN0vOfCQc`ol<77c-X>sI&gfVV%UfKp4awW~5Lwu;?on~W zO3rsgwePa{M>MLd$C-5;Z4K$)D>cgQA!m7s)DTn%5djd3=xh6))-(ij!<7$;E|G@) zhtUVFyAMX0l3DkDTt_ozdxJ7~MQ;A9UKTVrTa{F(az3bMZ7lt&tJM|Ey{hpgnuyr# zs3JN`Q<TT=V*nNtyTw5>5|h{h|J@Taw^Fn+4cKXl~Io$)ndho6{7!5?r)e7 zju#mjWrVGoqiM@CEafV#Wg?N65iWj}SZ#jRv%iCO_s$RK)dH_|c6Tmwd;iBz1-X;) zhw+;Z6NPw9KdS=cf9YPI@oSmcSz5!Y<@m;s-BQoRD45DPx-ierj8$u&=)H1L)3&rS zdJ*NEdGdyifl5J`*z&;v+oL_XxNJKz7W@AGqro;*7Vd!?2g5pfLq`u*&XNFr@eQqL zqbE3fHDt_1aar~ym8KRfU5pSNMY^3BtBLQp%mu|_eREkJUqh3B=5Kn3gALiLK4;m8 z>wfDT*Lfb$4vtKJ)_MHTejc|nVN+7z5WHCcQRKlRGJJJcCo3(r?bsQm2^n(KQ( z9oaReyxkqrFX5u|q?&J4=hSbm>Gso=Ey#2yb;i@*H_Jxr=|FTe856%azRh)y5s;b> zP#^s2r-57dJ28@r1!+*rp&N+ z=R?6H!}l2dY9=sRE?(ju5dDat#=_}(=wN+|KW2@TJ_faZ?s1y2~f2TU+@XvrNtT#3fUG3EwIc4ILs>p=M zYrSaWuh$A3Lb4cYj^W){XsDbO(7t7RF)pU9heCv6s$Y_r{C2LL%e6pl(Dy4UL!jew z*3Esp*4~X2yiVNqSBceDQ@+W`8pE?Fgp84q>W};c#dzF0tJKsA3`WcU%tL`7FyxG3 z*g>iwcBjwBl`B6^2KiabS<2AzlJ6O55yKUS-ZmEFZtQ5YfWcQD8+~zj?$r6Ji58lZ zZs&1xs-pMHY_*4oKQee&K4Kfa`SQQxLMc#Zh}`b1n5t|gE9M-Te(4eD$Der{zFlA6 zTrGW?sr=<`4nM!%i@iBBsMa|>Npe<=vY1a#8&;h(3~dAz^D5Vj{SgJEI!>Y3O);O1 z@vK=XTcd<{&|T)9T9=hv=3;9qxT2r(L|LUIa8`;!?d?R*l!PD06i)CHh~~(fDQPvV zi-_OK1>UykSY=TAEzz>psOV>^W0TDCB8-E_gO~4Mdx{sW14jokS)Q)n=aL{OMC^$< zrQ4Afw=cf*syEhcHixa^RbBi}MV5%+&p!k`U>*|pq zFQ~25%XRkPc9=DiQt^I_3=2E{wI*muW~~XkHgI!M{L&gY^V~K<1V>iBntfyY$JOdp zQQ1Q%?RtITTC)O7z|r*CwfZGuViJr#YLhgf#7a)_7n?V+t;Rtpq=Pyzqd}rImpmiT z02Yp)lK7RsJZ#oCE3tokEh>Sp{6uWLa>uoG`&aDn{^mE*2L8;%sLQ%@!|J1^O})Bl z$GNBQUQV<^SS@zwGvpF4WGrlQ$nows-N6 zna*!I2b%eo+g>?(J6K+x&(T49Bv#gf#?$GFZedt8PFFhE_07DFiZ?M%Zg6mkvYRaR ztD&oD@y`5hD>q(UF&>R!70Olqbbdx1^&@O*d}}K+wXiJ_wPe@L!~% zsduWt)WmW{-RG#7@Phx5!GKN@+$SK{@nbH*vlv9&%t2w@Q;5HNPp}18qU&~|L0lsbANeO zJA2okgU}8B^Y;Hk9sYaJe`YfLtIoWz)cyTxG(EX*e=h_Oi5~GUs`}h)gY5T0+FJcN z91NnF6Zr3f!_)mh{ofNb^_>d&m4){x$qo zDCX*Jx}LKE^2zhS3dvhYj|uH+;%oWg6t{bs6MJX%gC02GC~QpMQ8A9#IuEgH^{ zhd$luDWiuUUBQ8f;8pxbJ-na+8;53Z*BKj(qR-u_Ju)6}2z#{WTg%RFdxiA(qfUxu z@S~BJ=rqp*q0L7?3wy+GWvEBx`5ytF&d=?T zfg#Vezzp+tvo)K}hlG298vv*m?|W;0ys)io5CZ(_%)uZU0gsbhzPPj?$pDT+$A2DG z6Mglmg6I)-d%t=USDqdMf(_9v@(+Qxq5+Yf>N*cBj@ROsi5TWQlp?JJ2e$fu5c@;z z#c>>VI%b?nAZ*rETaUQ4!V?jpUh}uHn?*(Y3_Yzz1rvwA*6O~P7ystKsjP=T^G}1i z$*tjv+=-0rccy!B-E7Q{v^DMZS^6UuNe#H0v zho=CfvXq+n%d_Wd1HobzwAl`v2UnBSHG3`O=Q#3>f4gZmA9iZ5mT{-7>wpfVZ!*pg z`X)chEt-I9jf%UoMH!a;xU4@ayCz=Jh|#G-K$v}WTZ2Tfu<=2DE_|trjNrw8c$EZ? zoSyC3IgZ3KR-PD)uydI z$Q7!bb1*mxn+$J|D;&OLf(0fUrt($X=dmz|YQL5L)Bijx{`Z&Ld{4{u)nkG1J4ST} z5+@Tg9zqQl;fNms{&t!0>}M_-oV&v?_l{0r`%$&{2sXDzb>M#<=r?lN^4FPlGp z{$J<)4NK~xt}SoBP1Y{jPF-$3ve(exs|nZPacJ#`P1fu9kRRZx&qqeU{M#e;6s!G( zbW`0q213C=59`IB0d*HK>zf&J63RXJ4+Mk^Q}U64-|wCO@FJ& zqpmx~m#^dBf5A3dV?m&y|Jy~bA3lh>l8k>(u=#QT$o~AlWrxS@HFl*D?B&-YdA+q= zxChj{CK$DxAGzIZ4(m?+`R^rf0)+uwa0Kqkh^-*c-{oTm25xu(>&{a{=n1gmnr}$q zt2;Z^XaFsmjA!C}ES4t=U(Tml$+ay+fL02F#TQ!0r%l$ zWxQAMxc-cj6?YI2v_rY^5W?oBkpE@+y&iF*Luj^tOC{3t6hZQ%Gmzr9$wx@8r-8n& zXbq7C-scfNG9n)7w8+1WxIdE5EXq99{}S{MqfCQ=t6nC2dwlzFY%~g?LFr?h{Bkn^%(SX>@HC#v_E@_ zy`R{YPKYtTtWZ_O;6)5L&~pE^4?9!A)PV!Iw~B}$KL0Nz&}V`6>!4JNq|!bhPGe5m zCE7ZG+UwX-)$OLHc1n6@z%Ru;9Br7WLdUtT2e3qtFNnpiQZoX$qmLXB^xxpYpH9*N zFDK4`8UcYkt(;w3N(=|#solWDU40Rt3Zo90F5B~0u2pZknJEv_qEjoB=lR?f2l^h| zznh$9Onf-hQ0lO$A|xMQnVkQL8=UqJ?YBxN1AG_W##)by^NWiKL^#jk5a! z5fQ$Sl*v5D0wXQ*26dd*GN`i9i#r&jiio%QyCI-_nT!!6d&K6=?_p}d?M>Wjvb;>~ z@zBi8IjPnP8Aya4@oX2#HWc_Y7N{Oiv@f2paCo<4pvPDRTF?ty{;3|Em#_Zb`Gi})rK|ij=lg6)4lNj|Cu%2o45P9tj9hirfOJ6QXd!({`i2d z^y5c$S0<+Fxzn#SkmYvVoXoW@(K5@jo@qk%T6Lh~x1U#XDbhQWx!Qun{fcXn8 zE(9;brV z;^xNbthK?ej|8RkY7Ig5Bh;(pxn(ug3KI+(yFV9>c+0G2MEG4D%#JsQs{J0CI341s z4L^YjQ(1Nvb!ZjFWSseNEWJ&vf-1A)M~20uT5|j_F?2e?4rq<9DzVxB86tw#5;rbr zzrTO974@zGQ%}p)!+v7g=YBc|oB!MUGOAjNTTW&&P;!{YVn<;>AksbIrMUqYufG&%U`?u1U-9Ki< zR9>u+W)~4upM+@fDXS`}nNDlK{jV-sx7{x>H==IQLt?_l9+BM*L6eu_ggczk03kw& zNKf8qO3XO#P*PV{M~Q&IdY>(28uIZyI}1X+GznKt)DJ>rgy+(76Lj>bVCQ(Hj6DKj ziTJV~e(Kmw29<-)$PfEw-LA zHgQ{Amf86h$oej>)X8B6wim)P`E7ka!9>6X#q46&huF$F@YHG8vWrK+gKcOM7P3CQUo3d^LYqddg1SP3^TDh#y``|9B;!tA^ke!ui0`E7@BO z3xS4|%QEyc$*naYII9*;l^OO|{y+_X1Z>UrQAN$Ua~N~)Dpyc0E`%Uj6*SF@xkW}r zA0N|9_PIbyU^ew>^$yASlvEhlC<|2gxOsxCH)~n{Ym#{nh7kiRc)04gOE$F7aIv2_b1{bFE&9`l~Ckqt(;f zuiNfb1y>;@ep@75nQMutA=B4ejy|^bxt?()jMmdVnagy1^68@v=hniP8xg1X|9f#- zC?j{jq>X@HF;3@(Y{hK(peZPtrF`j)X6#^>y6hIyY(a@$wABSD0)gHrT}Iw15TBVW;=!~*u3 z`Ft*hf?5^ytaQ{I_3y&lYFP689zj6@fWuFQ2cM2fYOOqSP7*f${~Ah`X!p(RtX&98 zpg@sf=+f=a7Be6*6}kDwpmYyW=_RfyHd~>6Tk@30|u;!WOzY3>}Ew8|N zEp@VvvL8CsN4Dfyb1gAl_J_8TLnSr8chl<7Ua>I8*;)P(C9ISK>2bH&AHx1hR*>!i zLa=}IKPAxjQZr$I(zu!CW^0d(1Imfh6kQ6_ecb?670Fp@xsf>$GuQbmJT1RxCkgev z-JP=Pfr(Z06;m(^A;yO!a07!ajGAtSy5PyN5ht*vp3IGW)DD!10+ct1kmtP`Bclvi zxu(HHAo@e&=1cvsZ}fXKK?wWu-x61P$M@0yTQTH6j%0)fuAM#1yBX432WuX=sozNy zBk%tml4sY;l(ub`6stE%cD=PSmxlfqkhbTMGe1*Nr!felzccCunwN=NS_2{r( zqdQ)$2hy_D8S(|%Tf6ObbCYSP>fk#CxrF%Gf{}a<2g{=w>#B0|S@Qp7gcQNwHhRt8 zbj-%fz1*ZBIq=2O^1k-<{18#chCua_a^S%WT7#BQVg?q3mVcvMkA`?RoMf01rx@t} zS(&{I#*ei}uDh0yztvVdeoajWcVytiC){+mX-irb)2nr4%d7$h_V@1BAN80Tm4L%X zCCWRU%VC3~a=hmlWCSs)R$B|_9(W5+P3srG{b51>V>R<6)v9U?UbMIDSoxqf>zyZz z6?T66>f-g>m`MG{`Fo^Kc^_`4T4f+vn|c9%k1jl#LH+k!w1G99fOzH0I;M zHl=??D0KS1&s)QF;nMlFvDf8!XYDGeD-*3?Gm4~SR9L7tElq)3SA=PN&C*0maHC(s z=c@@?ZHvQb4cOIumqMb9R&A<&pZA!_?61_b#)mij?SG8ivmUOPGUXW@z?nJ#TIS_8^8 z8az%Xon;I7`zVq_Rv^2YKK>7|p5J{^Eh&10GQ%dhNntlcMwgJevGCq@bvy?w@$nW9 z&Vk_bV}D{rF*Yk32`!TH(0$sCL5-4LO}Fm?7@u_i7OH2lU(7>xTrVR4wmAG3d?e!} z<`_7T>}eZE5FfX0**JlSZyM`BS>d4vr$c+&yIIV^t}Kg~CT#uuDdwHf$OQ7pXtF^< zI43t7opO(Wv#N$tQr;73Ewv8QL-e4tfq`YKib;k9KTevcoaY$@F((ubcb-b!a54~d z2=DcTC&CAH%bsf`)ogmZmJyke_-rI3uzBEROUKo3AEd2am?!OLtJyNyz6}X-07Tul zZL#Y2?lRc(0NyK%TF=2`|7W=*SW4T~fhZ>7eKC7aj5_1Uwu{!7aEZMHMdr}M%Eg!xIY8UzwiRo;Ew0dVqAPbMYF20!qf`ay0XKZ*XC6 z8G{f-rcS{)uhDP%LbPXAA+9R{Zb8Yzp=BBzrR4yqUs+@AYC(n`-gAAh@#6TmpLuB` z`+v$T&y@}fk=+h8YoF;wyD!$@1n18^0&9}Qm>Qc4A2qu5%gY~Qy}T6pP$bbnZ=Dh4 zT(8PbQUU96wTdW61!TtAM3b(r;P)#F{sIogD<`}t#s5AFVxfO#0iTzXynd}{E$6&i z*Y>TcRjenq*80XL&i{(z!L*eszmtvCEMuj$F}Zb$XVUU``N54S^Opf)>-#nEY$bIf zu*;rtqODIuiRatK47JuMdwF)1cR=a`I`jti~lNi%4t>t(swXoWZqp1JFbM4eG2*rBcXyZeyj z7VkeLr)Vi;iD6$4NX7gA^^N~1S+OH|#mRrAZ2sxCWM;N;sD1#5;r`Jojrf}L<%xp> z^dnnF<&9&rs^j({5z~mtt!*-X=jH9T^>xjmp-myc>s4SUj_-wn)7s1x-6&dY417s&m?Q zlc0=h`(Vbx)y$!UJui~t9ZqjdLwV^aMP$QevyB@2kIzUY+-$;pvm($)71y35+4=Zd zR69QMl^7a|grWIwbM)z zJOk-os&dUDuT>En3rk67&PFG#@gUghVoP2%P4i*4JJ&>OmqcDp&guXq$B3vaXXNS> z;eFTbN;WgdROfsbm}<`EbfG0YbSPQiD>90VRsK26VY4*Uk~Qv$!a@4BXNKE(!MUw> zdf~q4EKUP1%OCdkD9PZ(ke6|N;yy`U?qntwdYVAB&*rG?b&rWS<~0yg-`K}-wCxV0 zv}&n2c$^pF>day)`M0(w?RUq<0WJ4WteWC+D9krhS34(sT@516=4cZW7GLY6TuT3; z0C0DlpdRCA`R*+f)8IUdR?zf=P|h2|Pu&Z}Y@-jf6We(&VjJI9b4*77nE3b1R5u4H z;w`|iq&4AO+*}NGl7;%TjJvQCQVcH!TDIYg0_Z?pin7^v)Bqajt15VLy5J>8eW5V% zi)wSxpD@)yFgHgE6 zbz3~Jyu^DU%_YIJ(!7w0$*nzy7Gr)UE8$H}%N2>)pGli>yk$iW=L{q~UTxCSn)`j> zw8z=`##jOpgNx%YUeG>4vbHf&y2J?T>-L#$F&8QP+|=B5fY8*)6~z5V`T>w^{|TUFgW166QkH91;cm5bNdt2p%b zbhnB$pO@ICU#3J~x}9@V5&Wx^)O%vLdX1zycHYtu9!HWMNBTSZp1@Gf`M4(KoPS$W zT^Zpb%pux+D>Z)T4zCdvx3ZUlIr5tCWXPJ?cQ&+R4vQoW#|OFfk1X#TAYfqM zYMaK?mHfSVHLVREfnG;>yIpTcvs>O|v?TBM-+YmV)4ba_E*;Mwmc;5C*$JAJ!)7z< zdY3ypJNR6;tIISo*sg!Ea-F9{a17hqfHUZRnK4x&#@D`mQR(c30q39sX;xw)%NW?6 z^_Da($hmk8gM+K7Y5K&mb=m0{Y*7aH0qszqvSm;uvCTfhC;1i^(sklb z{DdL*Y%(5h@x!jfcioAN*N4`!0jX66=F!HFo8X+aMX}M)Ot8V)+0ms;l$w6tt5KD* z^^7#HEJfW!RYlIu^>@;dHg&JY!^m3T&H0s;7wo1@%J@oj9g#@MH%e>OM#V(r1qjee z5`TocCOH;ljjNCJeB2A!M#jHY4v~)yLSAD>83HVsb@@GUp74A|_J)P|ZE zR|5dkE8l4?zA4>gKg)1DP(~h+CB~FoP0fMB&C3tU0`kDwv=vP!B=qXY2a$D7*Vt7b z0W+(+X6f(jGCd}Z`#DP9f&Y)*2iDr7Tk-sgSfa;1igd($-BVpm_n6`rNkjBOS{l-Z zGVADX$_x{MEDhB`CNTT5f9f|va^oMVO&h%#iE~vukw0?zF^_id)A@;t-quhN6$1_T_Ggp zF?8BQDEe8QRu$OSZMf(OJVrHvm~603)i2R|UAAOotm9y%Exb8M@e0R8@)Dyf$Ed7U zVRxY^0395B&4V!%xGdQfT;9Qgdo%vSUhXhhAtz5`?hKFEvs(8sI){U$v-5G<6@qhl z@e^Pm1t%m`OlQYLbHYR>p${NmK3{#Fx*onr%$?!+UYRSjrKqBjULYF!FUtXK0UUf_ z#gIFEb_feyp(Ry4QNdfG<=Q;bYg>z>1PODtYzE!{N7vfsc{yHJQjwmNw&B5t^t?A( zK#Rw2-@Q)2`rf_RzQ42XUiU8LTh62USg}8Oqsn8OE6M)j+cd8#SCx^t2f(@9drydY z?UeFsuNPwHi^2l(Caw1$J(BEndT^Y>9}NsZ16V-*=Fw3@dkDb0{+~DzN;W5`Sr0@u zV$m_-Ab$J!P8IU_*j;R4_FAsmmX@j_vp=<;fa^9>&o{+fEWpNkuo_Sol)Z1>)GBJS z4A6$gex1=sfgn2IT0sw>vJau{z|-+`@Kmp`2UMj~Rm6lNw$7=bME`qXWo~Aw^Xhh^ zXNEvj*N)4+tzdt)wg4z}Ekaet3q5Tg7K=N-#lbJv&sW0m%rcR3%~g+nzej_5SMSZQ z^1(zUI%!+TQAzmoBfGY%(>}jKQ&brBAu|)RPpne!{g%KS^oauP)#cM>XwMc;^G@_B zUq}~Z)-fGXP+?an(jkI>j8#ramCp4}^M+w>r}ylmGG#lnItQ0#J)^DiUeY3A1y^mK zwRue3{~ittZ)IvDd^l?PD8+KtzcpVt?#$d{wf-C;8p)( zb|D;uDy6u6(^ibom#=u5(?8LlXXZc>TW7RIPeV_`>L#K1_Hiz73fN^C<9-)jaCLl|D!N~&H25Sko?ald@hi+7&J zd2=E<8+Jzwpb%-3@-&tW`MKQ~L=%%TT0XB8bCSVsdElrW9YuA=##dRjZD<~C$SSF( z@E5~#+{WM%%T&!llyp38a0%YV!6@^tvV~=~0v065HZLsA)?;giBYVVmHlRA)bfru; zqHLW*LS0dFHr0-o#a5PxQ}|LSyKJI_2??@7RyXuK3sb=FOboI-(Gg?3qUi3BH&i!) zOs9hP&x#Amm9>NI=^yoUa|lG6V;xu4ISz1w+IY#s9WvMoo(R*?EBoMTsi);Sl8n~7 zNx7ipp+3p;aeRrgMbS?T=XBUKDeNcfgVs`46vdk^?Z;#E*~A#G;8#lRsY>h7NAfN&r|2-Uc|bEu9~cO@&1 zI(m_z!hV>yCS%9bEVU(DLlE3(e(p(eS;O}UnEme__)$}2{ioumK|^@>fMoka)5VV=H%jxn z4?3^nLyNvAj?>QUSWen-+{ZzO<)q8A5-IT;5KUjWG{#jCpQa9dG4xi;DGI||A$6wh zynMI+j0vZLTnv*scHZ62a-=X7!V`u8Oiy-CV;Mn>_jD+9=SW7S;fWipt4n-!Q0ZZ&cm_>?`^Sk#%xc3;oeGP zaE%mp9=FAiIKqFrPMuo!>#Z~P~d39L>UhZunuLC zPE_EJkwxoMHSbaW$0fep)vJ+gJA^sXvCSWq)gCNPaV)zukm=XQOdS3weoup13`pg4w}P`NI8 zp$Dycq(SypE8lDj)Me_XW~MXrEb2j_I!}*oe(#9gb?0oOI{n?aUmV=MbK>jQ$UtDiHB)9Asam zY>={MATZs(b@c8HMlD57m{3NUA*~P?8g0CUhzEhW>NI3H8jDt(Trv=bX_bqj zx{RI0WlEF(ltd;XWd`mN~hDj3wMrowA&`KbZ&Yb zo`XH|Ky2zguDaS(gbId~3(CGZ19>~_Oje$Do*+49*$I2zQs++)Q?KY$@aLM4|?AFA$vd!%&!I>Id9MbJb`W33>Q zf?rb?iX#MRN-gh$8}Tp#(w%nMBsJ81{P@ej{ZnJ*czQ=YpLLk}*eRq1mYQON>M`>2 z46Ugk|4Ksy1mVxO{;oF}V(rX8it+TL$2<eeqx!@PA&OsFBt>-9#DaSX*tAEk*5D~U0wZ4oi;Vt(S5_dem@Nlj)_nC zfHA>YD)MYO8)9KM?=wQSa*&o4SSlj9OToaPN$js-yLK#Z`sv(vy}E`BiT^hbmvs;P zk+;mhQocIRynjVv@;JplNnSytdpMyp3&xs$awmW00mU4 zzt@+{SWwmwfRsiVBDiTKCz-UwMc-W4)Wc=?ejP^rVvaBllW-6?4)$xq{ zn;sR>f6S6+NPMz!M$KAca6u2e^cvVmjVoYhC!(q)c*UR{yK=ZZ2^=YTmmL0h6WsH! z@y1zN!e|~zF3qZPVLk>2Q|SK0vgol|Dj%TFmY0_M1kR<*QV<~u$^m1eb_hYoB%dd} z?GxReEKv5oiUTcu(4Bomeweyn?9rwHt{?H_iiaB;&(8eVS&^;1V72x$N^-)kbJ}s# zvkNplKw#T{=RN1SU{^zDOb9v>Pwg=k71WYO9-u&@FT#LxF}!~SrhC^xxe1%3G12=Q z@A6PftWgq|1Nj8!;0m3Y%OPu3qtXM2urUl&@+!Fg`+Cr?1s%aEI}~@k6$D|)HtE3? zV@d~1^#5jwmg}u-chz~>h9{f*=;cicB&NlX}Dfa*&bN6L`CK&sDU0>9icbt zZGe-fMilH}PVP$bhX4L0r~;UE+75QsZjGY?=?AOxZ)%xpUo`Lipo?Yf>g|xC1k~Cr6lTepsmT)XwA0)76z+r>vn3`woPbn?9y6>{F(%P8Rd@jy9DBospy4v1thrgd${o=vhmT3f4xq;X|RCasR4(g?)Hi!95O{qoqtc(lCrqLw+ZwxGfg-rjrAtjmb*#m!;!5D5;hrT(?Q zZfat_W+%`|{9Q;F{=RJEjiC4=b_7phoR%3(Sz#pw*ev3dk?Vo0Lio2GJD;<=EeBMr z(9`Otavk}Lb8105*2B-gl+dBIcL+>983fmM)2gO^Wo1{_Uow%z69_y+lYC^%OA(I- zURf2U2oa~k^1-?Lh8k>!@W)GCOsS|E^43_;6u@+i#pu9KdjHp%(MwcB_CXyUZ)rC3j0KDNNQ_i|HWBgHqao1B?M*h!aVoqMqJlRM?q`kn~thZ|-{OEIP z7})L5iZZY#E0o7wb^Sf|(`O>cgJB<3SJGoKz?ru$Aj&wu?22C9r9~K(lXK5IHL{Hn2*n1%w3xJa}?d7*Diq{)H#y` zczcVNyZ?usvgjjul(0&Z$hfKGkBSP%{5T zR@=?KM2~58#sU2mV2M$0(a>7Ex?5E={gs4ga;gRTK}yf;6`MV(_UOvC-==flHCuF2 zd6qos{!IFwP|9$z1i3|F@=(HR>ij!KO}FOb^(}nJ=OIG^u6=>WFhLr> z35|f96nx05E*>+tj$g})V@P$eIMJ!^@4XWjmff80uOSX`d3ZPfQYbe&KO%1upMW4H zUip5B_Go8bMn5yOA6r3bu%X-&pXz+~)k8fLqI;NcH8fZBHX};QF|m+{vGDpwK@$ zMw*JTu(mI#OjfFMRQtLrsQ%vU%4~J+)HB97=YkY5a%Vo0kRZltG}EF|PS9gf*(kQJ z>Y|9Fh( z)fI*bk>pGQ*EL65BjP8{{vxct{~0TVbdx-G-jopXDkW-k44O9!<7cV5FRux$4Im@r zu`_RTxZ^I9(6edrTbq~Yn+iUD?2oo@n5Vep6{nejCUE>(c;|C34*sG_)Pi<&3KA-s zF$5eeSsYl#VW995SoE_ycT1LT=Wb`hXOG?SUBW}4J3?lVqR%w-vSM@gx6l|*Vjk-L--2D*f@!73(qF#Z_>3;Wn2HO6+6GHevg8d)|YR! z`f7K1xA}wVK^4GLDcEN=h9BY4Ln9l|+GvoeyfGiH>~LUDW5J(wB>8`v8oB#be z!TlMD+ndI(R*$nTZK%u*u_@ghI&s;#dbvm=?7y`MD4X*ZrR(lb<|wfBQmaOE;S5(C z6%X<2!%IXUpzVF>ta4a7mjkV=G zQ0ycN>C{ErEz_19-R&+TxjbVaf-EdxGZswa+IP%zPkHJNZzs-1g8wr8vz62z_j3V8 zRyn;{7$qS@Zh*B)S>ZBSXdm*=>WvCx5_s=21|yHs(^WX*9!yS5V{c%xSSmg68t|oJ zD~=$;tb~T4d&}i;?I5-R6jP}ctn;CLv52TaUd%PR!{@d0;1YSDhJhw`&)bGuxD^HK zHqqpesp3oh!f;uj!GU4jJ?kH}ppSBG=dCm=_tZ})viN9)$o-O@_Un;1nPZ0^KG3lg zVfcO;9j?LjX&QNOJ$YFZOhiIwbq!>Ih1YXA#+d*zr)*MRYzd+5lz$#iLqYLjechJ$ z2LVJyaVGGN=W_6yRBURRv3G&w5s86RFKAaRa=L!Z>8SU`(eTkl#aD>Tl{#A5rKK5H z7UrsTM=>qqM)YV*hTz#o&%%R9-BDOa3q9!~lB^WP3i8ckHLIQ#;1}7Qq)4K~F1(L0 zp2n66HWzSyLW138U-J?2LYJvl((_$8l{lE7l&) ziIQ36n~i&PaWcBgBPFeYuKgDGXkXa6oy8(?3(I-( z+|wzV?7~$ik*%4xH`}&#* zT6&_{e7v?yv~P#C_C?|k(^-EvkR}|hjxK)OfPmj>?l_UAWSnbAkX3F1xZln}PJ3pi zupb-WAZg-zw9JJ;!2yvrD%HV(5-aSm(3T+u@zfCm?CuW37_P!e%XDFp>(9x_$wQ|! z1PfB+jwMN<%=~v|{J6M=-86$Mo(CwQxIFXiwK7zia069IkDEg>B zh9^0$7n}ldlakfx0hHR~a9jLe+IaJVIs z597A3eNP=0DbbI8&{}X>-IYEl0;!D5K}yeut~xDmqiVjqZdR2XWwP@@U(AMAEc@fh z%C1-0o`lJvDNpYU`#q_dLt0sV#kuHtnN>WoV!h9(kUPU!RLEBAd{11uY;PKrz_35u zMG<45SpeGHeZEdojArgHOqVWB&Q~83TUOwBJyGSuC*p-_RUawZ2e&s9|kIyP-MbNU=i^5}1+t z{xw%x?hQ4!!Fkj8;CrxlGQQ6tBXT~*V2Rau@w;JE(@SJ5nyJ4K_~)H_WQzOZe_6cF zivSvmDz6Ip`x5nP`aZjgQWTp5M2lk|$k0Zsn@Z>^z><{Op#P}<`K*FpijgZh`IKe) zXH(=NBKx)*FL#Aqc~#eRj?!zCn-SHYG)Z0mT29*tD%3rwn}m^riazcrLR8$b?60X> zk*>SY7q=(0Y^B_;NwP~@sJx36COJ8YKFwzGdBIoB>^0UJ{%t<^-Vh?O5F8VPM?Non zL&P)G*J6%CvT`0 zK1_Q}bQDowvM5vukB`&UvxLoCO0#y`SbOeUE1KEvZZpM3PkV<}%|Q|;ITLrq$j=!s z0r39VE6crydBEBqB}+p5xcIxRkXmG!ZMW#Ts=TFozr&qk-R1n5->;lyKVHmt0gd5G zgteyfzl|F}=srp*2%?oG99ImVrOp($>^XV*ay0fIm^^y`G5!czXA7OsEysZG~oL?oka637^h1Pu7>h&sn z8!u~QYkI(CvPK#cZVre8Ev=Gy_>QQW9-3K=m1LvC9hO#VfI)L6WU)1{T0A|huu~C5 z@l+i;P@<%1=x&N6iO661B1#c&_9RmAN7{H@E?Z__*eM{uM85Tkep62gg$;kI;-gJs9C(M3 zAF+S*pL_1TtM%=r;C~!t~(=5?z=*xD@Kk zZ;i^Nr{Zq$)&cu(ep6vR)a~k>bUpR0qWg4I(}!06Efagvc zT@f%HsVV>195=xCijQ>Y)aTB!qC1p8Y z3YIFJdYMA4(gov=N#;jXMm)0OUS-lS`NU#tr{+9=!z*<{U7W!q*R{2$7Oyn5l)4+H z-clftHKX47q~?=>hapg4fnteEkqX+9hHoh^t8EsGxYZzm)Sz}kY)xIJDF=y3Jfh~N zbfr7I-zCls9&N5Oa9*LwF#2dx{H?8j$gS1?G5bFsGC|{rNCm3*?s^Z2`h|7%uNn?g z^QFH1rC{XR&8%NFTh1QdFQ*sD;d%^TKcXJ~%+w!A(fbB&_+UMBKJ#rko%87^%5oT;pcJ}E16Zq11Gj4r=EN?~#2Y2ae_t^ild9n4!?Ub<$DwfN(?)rVe3=yJ?X z&|Y2*TA5rgC?37iEUuj2YYW5up7izs#7{m`N9Qq|@ar#Re{LrS~+D9A@0^S|?bJdp^biv%?>M>NP@CGc11U)O!v`DB7|VqXLe&1< zy{7tw=T;PKggIR0oIH#z#6$$UbWPnBr_GF1$cu=@+y*~pd^N(xa-0s3n0J4C{3-S$ zVJ!D+`_=V_I)A(n!s+!b^tf%`I$6tv8NU*hQmsu2kUf;(?`TIQ-bCS6e76V1T$W#n z&yPJibfCDKhG0S^WejFBH)Qmt=jHR~)?e8%HFGhKn?JtMrR=zM*KVT}D7PBpH#aye z_vsJj%c6+<0sShfTQ4pU-0AqS$g0)vwEm3cozBZebn$A5TKVx0XI5X}Mg06CFQJ8w z!UL_gaXkyD1Q4u+6tcIgmyUgF!3f}``YUJhQKP_V(vDLQkUI&Hez7)+>c7wI9tI-u zyU89oJa04c)x8HMuaKdkb*`YI6^9rfi4fw{OQkIrx0jdKRGoa^Y)ndw7T&A{Rq_!H zrkghWiMSJ@iY;ZyTq(Iqlt+o$acxzBqfeS!GKb(G^2^0-BtftLdMCoYFF|<$;Z(Z{ zqFI#uT0i0}aXb9`=>5}zAX@(E7cbhEyVLn=SCtOa0Y%fZ9D0tv z)5d^>U-Hqu-RzibyKcs*N7@jQqGlhF9rH>ot_-6(qy}Zm`A` z#8p4W>B&Os(_uKKJ~=^oj0Hdm<+{}```nJ#-m=^$xszMZCb*=kM!y8FT`c|MSP@;# zCyul<-Bq2a9%wV+D*HB9oL{VohUHa5Kg=>Rwi&}53gk{8oTJ<{rD{bSL$)h`uN+lGs+%9!6Gx)DXGvRHN{Izb2$PKah7qx@NxIxXm2}RfU-xWeF>5b?Jt|qG`8Nh zH9aUauVRC*YI)c>fUa;ad7sabvd3IWNqYOZg}q0`7wX4bdlXErFC{jsSI$i-(SqE!`MDlOK2LBQJPXOz- z#QAIH`-9Yd^_QU+u|pqge3O3(rN>LuCPhIYQkLxPB*Lys<&N9?Fith>Q_-%_2?r)nd4eKjXU?~XDr-=v^_Duk}V=e zGM`?GD5?fhyP(+&Q_VluQtj0bXe5B}!=Q>GIqy0?=^nPJ^CFTfY{5$+$5NWWTyF2Af6;2Cj_5r9{cQ$Z5M zPY_erTE_akfct&J>1Fzu2*!O(MqqeS3{C8pF#OU4Tqwj|o58ndx^_sa244Gp^Kqbn zz#F^vcL3#JSK*IbzE%UZ>fgvU|5B2tw?y!UiN6s4 z>tTS!`z-!P;V0>s!hh9rg6DvPZ{9Fu`b@2&I(2SIleKz}UKfmNTl&RF%Ot4VzFb6%wKi=(@Mc&{anx50oaJNCX8=nB zrQi3lyU%*=<_z^=*Y3GR4{s*aRwiLY@s{p$6Zjkj!}G^OMMY)!1EC>m;KjSwjworlH-(Mz z>0gO?BkC#sB{s=>Qw@eJ&?y4@m89$a0eKR^-qDe`ar>&hWFvutTE0+O#7sjS4J=>m4?yS&uI*Rs2|KA{loAYOR8NKqUS-Czar;3Id zvV|`!}wg0oAub<-jm?0qKU>MTEB z-SXZ38WT`7}0SkWE}Ah3%hNRr`ik36(+$w z<&?lAHe>#0s-O*_<$2rcC!=Ysa`_=jCgv%JSUing)!qjqfw$XUiPLl;GFCW?Em9d5 z%O*1$_D_#mwy_XRpKSZPf^yWa2kEWt zLtk{UrT(GU>z7cthSf;xZeP6RiT?I#yjoAu*pn}N3xhpP=4Log-5ge2N7)da5d(ja z-hlgpR~8nUJSc?Y)~gaPcKVzgJ@6|hkoDm|*A|(6D9_GNo4J>s1aWKh1^Q`%&zrv+ z02;;#K|SV7Ki@nE_=eBN0WJ$8PS}>hMHKj;R9Dk0Y*uukE(iww+0wIs4@JEOEoP5G zD9@A6rc47D>0aeT`x-kGj<>e6@#4lJf%Ay}F;{MixR~JICIE;`WZ}QM#CTEUizt!W zqR4D?-x11^H|U94=G=2+TJAn{t5Z%>%68bZAB`J#soGoEuX@?-d_8Hlc9M^0`Rd}t z9LLge<0n2O^z1TNBC^E1;4z?CSuZie&KvL`IoDU(dY>chOOwk|OeA z?CyLBf^p#s>>R#mMLC<5x>iMD=hvE>9nwZ$0Bts5qp4Pu7P)5)1*Ek25DGT#ZuxSX zL_7|`YO!?fhKYFe7DkX(7N1-Fd^}AZDH94lbyh2x!P^`{!YO)Jn4#ec+Fk0*PzR&; z?W$J1Ho#Q5A(%6$x1R1zN~ZkhloWb)BhP$EQCdVr7CqT0)tw(=f_@c+ne9`&6V`LY z7}0z>xxBM0`Be#2t3?r0ZTIN2<33q`JT}DNN?FmkN?Gq)Q9Ss+5yAOFKWmz|JM58& z%^OE8C!hF>)S01NGz%HSRo3j!#pgcS9|6Pa_LI7#r z>(Mof5(UM2__rLTKy{kM^n!5~=G;V{K5#Q^f~5S^$$x}NGR<|i@)h~r5cL;?kjLq% zJr@w--rk zwgG4}6@YiPJWT!)>U}^*0a~ohd1$GebZB8cv$i;$TX!3J4RGx`0`NpVc)0lNrIXOA zC=B2ZFY`2X5cYK8KR0aMT$W9=h&nMU&JAYJH0xn%y=si?&lY*PvM#f6wN&l6A42O1 z77?B4wJMJfS||h@s`@kyDN9@ZMyy!N!}VZQ#5j8g(pN+f*Rw*YxVOMcei=^np68N5 zWYeuZ`v+NbF3!DP){!OwE4~`@+=mkmmd4%SJ?t|-+Wv1pj=18Cfdvg+fM|tgKm9p_@V9~Rs6r|bhSErX?BGX? zzFEW7dHc`%&B+JCS9YL$Hw?=;_^$+-c1W72cstj(fQNV8uKyx46O&q5xK!2KTb)Ea zRqddRt%7oXCx5vtJZ5q6gVFxminfxXy|RkEyQiLXF{t3Wp#lwWASk?eLN=49uF!X$g^p_NbLSIbRnJma+ z3w76anpF35d-6wLA&ZE+M@M%z*Rzj{rODQx79$GQRj(V~Pu3}|#A)B4#D~n8EFf@;|I3hUidrMo$-d_`M*lj3uRMw3xH}=w0>^rI zrpxxrmQ%nwfDQa;Mkq7_eMGozLGGy-fPbSZXe z@%pTs6@q5+ST|g+&CkdAhCI3yT`d1zd^3LIHfX%DyZm6zy|SV`Yh_A$?Zv3(6+sP{ zu5HoyHjx~v_)Oc^Gg)C@b^xk&8Tct-^JG%QHO z?%F2H`7SC>uYYnd0A<>6GfeyIV}YHasJ**%ui+GT=X*#u~nO^IkFr&hNe_lr#8y5%pw=tb1I&vzt9fyOR9u;v%3R z!XJ;sqZg?F7y=8O`;@KCAEoZF+n{;Zg87_p0>3TO(58TBK!Bavysr~7?X-(EQ843h zS0_}CHJ2TxsZK^n4?O#i(nr~vUr^i;0E@t;&pJO9j@BMIsuus*>i0skduTu4Djpsx zub^F=8aeW^SQP0N!WO1q0e6s$UDvj(RQgcyzL1cAlP$$f3Jm~odqv)_oq|uHM{x-@ ziUQao=J=~tfMJWkP`fQOwV;f9J*V_q{vc#xasRz=w#YSzf2kPCSrtfO22q753lpR_ zKwtNsFmCl=Wur+R>e7sGdF4GMDd%C*@0YSREyFn?XL0~|-Q($Q625BS}1f;u%?go_-B!=#iu6^V4 zygR=AeaC_P=`qaQ*Sgj^&)>P`5s;$TS0Enq&B^_Hf+o<2H+DIrA_LKPm(eWOBiCL< zfQrU{&2SwenMTZZVg`i+B8nZ$`bT}%IPQ4SwQG|}T_?LGtvHI400>m7H|Vr{NeYM% z#&D`Kc_%?B^^NnGy}CoJ#r@#YSe7vYB$t?DGib#3J~l^5*CsZL#pcqck{n_3b^F7^ z`TfvEv6&c(KjzLcDn@-&K>}bn6wU7deE?hEvZ^owyH&u+_hUX?l@JinUu}dd=_4Ps zNc|C+sKr1cD4t?k;zNt;PwcHuO};x25`LM{;ji<=0xPL(I?+*5t+c$d_q7V_Xe_K) z4I78gmQdR#7RC>sll)s2MYM?aD9C{Ftr8O8%$l7;5fVZkt7hmlRJ726=A{}V3@Rz-*I^Ee%K}d5UTv2!8Q`UVzM8U_r4{U(p6hA*${FAg_n;)G>diCo*YA7U z-lI`S%(NfWtaUELd}mset)}0b`fwT`S@v@miUOSH9CjYRBX9h(noj#4&x?=iaRac| zd$g{FRHXbBC=7@<>PL!dB+R4ZrtXgmYY+R*yp|yFy1&x(?YAk2jFI==u^mAgWIa>Tf=E*0VnSF z&rhk@;T^;GwnB`$W{Ax-UQ{jK9HY($uWa=5-NyTJJ_3D9MoZZA)Xh#xX50r5Lz zsYR8E14IX0F$>~e3|bmk-4O#na^W6`=kZBi{b z9vLG8gbdVYNyrBz z`TtZ*eRre8)%Wwsonv*i$8}lxJ7hB*GwHn54EQs=2)taPx7i+^Jhxq1aap&7`mFam zpv=Srn}Ofy-50s#Vw4nIxIPf#tCO)04+!_2q2+RRH#5O$3%JJgMXX{O%2{$;hi-hH z@mli_buVT;0#sbWQr8csK#FiZ8O8uQ@y@i1|G5p!)EGuaw3@J|fsHY3PDoS3HjJL1_m}hWbkJK6ChgkT zkP|F}r5_L1Cow&XWHHJ2$!`IgspTwW)doTo;#ms}pG@u=xF->u*0 zMbn_AD)03U32P{}rAG5-W8Z^{1jk%E92}VP3sk5pfilB(@pZ_qc-V_8rAIu|g=r81 zPn4Yd)Z+m|>FLo{b6*Nh+U<4v9KxN}@3lco{cF}eQ>Pb1y8L_|*t-1hBaEaGYaJwg z=_j(eQXRz_ERS(7vLvty>8`Zk-J)h$lBARy7a;1hOPo%Z?l0o}BYJ?R6ksY4VoVc$ zS#JexDhfQgfgr{$p+5D|&z`z#7k$9IG!0@EbMaO&xjowZG6UBvumYaH>oC?jVBe6@ z0}UX>na78&`P{D%*?GYMp-cT zzZ7{k*IMXrbNr6_E7Rs)BfXt;IQ8rJ3jXInJMoFWYb2j*eiK|9Y`_bQK+-&}(cHdo z9l&9RhM^%bEx=nlK=NcfBRTwaygR(2>{A4brxn|dfTJ#r=Y$PNNR%eSwyk;k@70kM z>t>e4XMS>Liy4Q?EnK}D$m)Q;Pc48-et9$e=RrI;EME_~4xuVWvC&GFm@YZH`?3wN@`J}uYPj12N%xS`raFqYqoTk+cV763V z6h^yIq5`D<)ow}cVxQGSsfkSW<(n%E1E2-@(^!437(s~Le-HTlid!=uPeR8+%YT=n za_YZ)p3_ot;^U1@8yMhp(lb8;_AUD4g_>IzEc?%34SX`l-_tYL{XG+Eb$;PJ-!1Ty z30i}m@eo{1;Igi0kaVA2yzIwyBr;nA?5QICxE-5>7fTGmgyVT2za{xo&QTFg&iEm0 zoTozg*FXn!wO*&32Yjo)mdRS=Q*orTATFMXdWih2&uK?w926+ba$#p*aW85pwcuKy(%XjlmA6N9qydQEc@Uxw$cLAI2+MtcRaT67wFUs%Fsa#9 zG&qDV5dTH{>3vs1;ybH)4wl_t>qfxGG4b}rMGJ3!O*~3?KnM=Rf##g&`UMtf6{T)xH}FCM9^Rm0;>kc zr2u$oKK6zC1Ky%<-7Z;5e}~-v`20^Z!Qj(49Qd^??4Teo0LB!-*|nmfgHP5@U$>p- zu3tQ^ErF>2OlQMTLDP(XfW%4^q;_5_@ToF++F6!oNioA-8NZRGalq`TAFl%fPe7PI z@```%M{K(e0sz-lH3BUBxS1l$ zUmNU6%CjeCf6lE{9h3!ezLj0pSa9)i-^kgC?DOt>eJD_GlpqZSUi|{C^3h= zffa!YANp-5k<4onGRJCWn#fPf$k7F}!(A=}{0S52eAF%BN=+iyXkvzqiWYc{K%$OR z7CJ}C_s{X7i<;(h51E8?F{rPi#cWMFEKz$rR}Xzm8DmGUrk_9Y7VlUf%O>g0 zV%L9U&|#ExeoTu<`C_w-SDKEFRJ|cxCr~7`TFI~o~@x%R z01(k(9PpD%Zyh(I-oXJtz>{k-fp8C4Tt`9}x3<@lJux7c{_S{>>m%?*0;lvH-g+KB zY|2v=3D!}~k_q?M4_k0|``}kc&-^XvmPqeSlrFxsl{_3PaX{^+AnJg%eAHGEAvv>g z0ogAZzg*0?G=pxJG~AsX5H$GYc6{>|OUh55(A+Z>JPg=}{CVYe88L@B>U1D;v{Hav zy~j@Y5&O2yPsnZa~e(sb8;jTLcOI<8U9TGU$@ryC_45$sdz z3Lr*sXE^JQjPnsEXMZwkiw$0Nv)-c$7Q{KiZ}&55J3(3ih!miCT@-nK`U)6H`zwT~ zC=_P^qs>W`J5J8_JwOUIJr33zOpuA7uJ2HJd1G~fhB-^S;6HiM&vlb5oCmz{eQugE z;_{uJCp2IhjUr*DJ^Gm1jn+!nsSB$O#5s_e#5r04RL;1y)o{Rk`Gk8#6vi;XI!@Ig}(M_x2Iy_(lJQtx%{ zd?hk2p&TI{9mXfUb}ImHFknEum|7Cto!XTg@|XZb;9OurT!*uKo~x^rIW5Cv8`W3{ z%PFxwLWNB&Ik7JNP1mvKK8G*ixm`AY;WWyO9j_;f9den-S{t{Vq`U2`LL%784!6BE)(G1&Q+L?%$plFu9%@6u<+Ad+J{(h9NG0P&1Xr zLmr0)*Q8VfcWy#Q1LoMS*3O0jYyN&k;iN5cANb2$)|pXe`E&J~`wmtAfT8cv4d|6@N zl7{07N&h|{qJ$wUOeptR@kxx_THk9&P=KBC>TmHj`!rk~;Uw*rqh%%nMFerHt1BF; zh1prm-h>V>!v|n2oL!=NYtwL>9YvBfEJo;&&3p{u0qn$<685M9t5xL)>nW2hj#PxL zPO@2N95304V3fG@&f`##xA9I&{ueXAhPoC@6LhSLv%x<+L_hx#$b@96Y3!tks6}0LHgTQp&+D-q+mTkfz}hob`M0_Zo^U zEo%w&7QnfkhIh}?Jx5$~?(I9tmL*(tL|}EukNN;~9fK zU{2J^Q>HC3j*N3%{tyK#QXpXCJoMCJc%_d_MD$#^O&>-SHa+55SDlPEbxU+wIO&uu z_^7Av2M>R=3y@O=1}i}^3KJc8hV;KMh*ENXEQ6JD~h2?Ad< zugjUevGflc%dsu$l0WrTpw(MeGpcf*!HcC22=waNFY+JeABld50i+{*HaD zTd9?J)bK9+z<7L=riIM$Rn*c*k2E;^SkMD*2#h++OhlwH>;N%s(@nWVB~=SDlJ9o- z{W;$4x@deqX82xD@zM5x$U)!qdAgX}L5!$Ng)3#;dTP#DDG$}?{_er|3SXNxF9LiIeS=?fE}ZBt zKAYQ}jW;^E(LUdFR#0t6@17}`NzPsN9IzA8*q2X0?3n@T=bwtjQzDcXYD|H>_g{wS z?|fbkIfvtVu`M(`awAzZsVI+)277FWCJ89?1G*P5S+Ny=O8vuz7OIDj(JfuqWh9N= zO{JEoyL(b5YyK{21QBmEI96DmxJ>=&ZtMbu)$pnU5SWzN)(ddG^jFIS?r~yN?h0w5 zej(B=7BcTS$QITAj^;hdxqv_THzczMpy!S1!Yrq$*3&QoT%^)Aq!?*FPB zLJPfPen8mUqW-Iz{UV1`5Xs(S)Ve?i_}OG_x2Xy7zwnU4x7~wL8eWw*bfVcJqm2;;-pb z`q1#e9d74&DHf#V(`YIwo*T4?`+^3v0mg2t11_3*H>V8 zN}S<8HD}wRTNB536Bhl^fct*EKKg>D!VIC(Kxbi8$JM1N(fs`R{pr>hM7h7bL7*Hr z;51$rEZYw0SG$y!;lC|2j$7G$*2Kryj^WyppPuI;jZ}f{l0LQKFKh|D+V|3yub3?+ z{|DoO%X?Qieb#|HXYd}SzN7tg)U1}wnbK=s-mnSD(*NN3<|NtG^YEg2#wH5{j}lj-gOp=b@eFiWd)!Mtb!0@z?M z3(2$zxbHQ;1()5F#U|YGdtGFq#uuB%DPW8sVDe|^A!(!1Pk{YtZOaRp#65$<38Ju1x$c~eG)@0{B~SrQFy_0{b$T>Y~ClXL-%tWRl*dhwmhr5O z<|TAnNA$N4ec}I0oE17tGfh;??j8RKj#pkMSPp;nS)~b;n+H3-z*7;$r3KIe(8yv(keqEkcbEqj7`FKixRXz5E{^kl zZxxO5*o_4KV-S2~Dzt{a^x_O^y&;SR%~?Nu_gNHc0~Ph^;^Uj8Ml?+ahHyVMuyPf~ z&S{@b6fi8Ikm_x43N79**2OPHZ!K$Yb#=Rnvehr!3tD^wt9tOTSHqp0K<`A6#+D`B z{E1vy!~ULxec>f%=%P~(2S*7D8Rv0}-r<=^Oudku6P&XJyOSiBy*40$;7Mo60X^$Q zo|4$2#VztDJvQi&uZ=J3*Xd^_nL3kSEf9*f$^-tB5Xz?GL} z@?|=dTxdMwon5EZu0W=#j=pUHfI=aA=vn-K8xte=d=k|9_X6rs)%dYqYwoxE?W{sS zgiVtGc<7}j<@ahdVy_#7uB7*gBYz5E=8{+q6r`KchSp*C%--{R*g4g(%P&T;>vnLj zy9Ws1ts(F0waDk%@kTLI#i7;r+efjFN7d5ZWW~znPg{Q7j^lz`Y4H)5(DK~Qc-LNeY5W$ml<2dPYTkQ8>;2+JGnjp=XX>$p+Ug_-$f zq2UpF-)l{=hKX^4WS_i?#2T1Ap>@$qpLi$SMF{t&iAwRxi1g0{_>CfXWz_KM@jjiP z>t7kQ{=s4v^*^`btjjkxf&77R5B6ck7AO-M6>^JF>uX|(K`k{lkOKO#8u`!$`L6NU*reT~Ksxe`>unJDVw`zbr%g?J&-S^8x@|V#W z9Tse@A?gI;Air)0YEG5wtHDEJ!tLYX`}@1jUP8N~D1R6pOkA>Zn>U@sea61?2EuLW z83yK*iUo2Bs;C$EAk(Cd6fYV74i3cK_sHFHTS8nro0MpDiLbwMb$U?-QBW^f5CB}2 zc=n6D;ZdlmFg?HO9KCVIx+*!R^D60;=qgI7ISP^2xjP>?1{luQD#4yJSx0T#mEO6- z^%N?av&Vo&<81XI_3#YFCI6oZ5g?Mkmi}CvHeTtE?sr3kl}1ExD?in@Zqh!YSWFuG zsidz+mm9>qVCU%NkUElC|!PdeKAWFC?0Oy(X4Kw z>>X{@ z<_3hd&MIv~qxeUvG3M}N8T^5dQZNa*XJU(?#PxG9^az=08XVamWDe~YmK!NrwN=xT zJHnb9DLSHt_!OK{1W7+AD)^Q7rmBGqt#H=rggzyr%qXxk1t*PKR-&Wn(SCXT0w+Yg z2Em8MNtX{yA+U6<_}@mx(R+dGL$B}FPAYaPM)Cz@VC-}Q&CATsH_94nau)G5cCV?` zQhHhO?6r*VpZpyPXwe$9^3V6?(~4<|Xx5d7LmOd138j3aebsOe3f#K~{XV4tk&*3h zhLKcrB%n$6*LydB40)?SZa|Vs7>315|Pz5Byn^iS+ zvCk6({j!og+r=@9g9q3^?p}yklTg)BoFLFu%5Y8R(e6edegW=al zsVltoaK1X13^g14kY@ly>O3ad{N89^;~?z^)Z>gfC6GRj9d^%S{LQ`E02k~C*m+B9 zrMA``Q2#V>5N5#H@c?I~tZ2vihjS4_&r7(&hYU_YFpp|!xGp!E3*oQXO030H>QmLK zAWCcdmPp)#W{wJogDU}iIy3G~l+_u{4L#qTD1f%8Vn59p6Ynbvp@&!0Qu}4xGI#~_~2Smm2x=^l1>}5SO z?U%|C5$G&W^d(^G+X!9tRh%0C98=$NYdKAx9-;SqhAz4I>~dJ`T1lT7LAtrH^N%x2 z=5*(WxmY9m+lx@(fHZwUBjbEH2^(nX?d(1ph2VdgG1+i?e6QV_&sf2DnmKSMh>aAz z5IzIxYWKf_hqd}{>d)${abL#Bk;9GyER4u==^!H%u#mFkl<-rc8iD>K2?ZREiUBr%f~y z)Q@>Z(c1-Ztrf*MT;LbK^m+iX_i%!Eert#7FOi5$(ASG8(gaiX;e@P(w!Q3HW&o6* zr?(B=j7XD@BjWC^{p=TZMb(@(BQH2cfHk~!pRZ?0gClhhFM*u1N(og?#gGK4A;_3I zLdf_s$Ias7IExkY3pSpUa4X_d5sj$Zi5QTfFvjP{verFd8<0!t!dvd|D;Dph0b-35 z<^)+_!o@NG{DP}TZgx>)z^T9k#=VMnmoxrFKAqWy(v(Wx;}T6 zlHKgRNRw&|Xv!2fS4AT6rxgtBsM{l}<(SAci{*$|P%kDx{x*J#1Jv_eOUit@MH;d=6$DtmAPZ#CPN*ml3Go8~k zE&162l6hJwUfZRrAXIn`@ijo5jEZ)<$TKl6f!~otS0iTjj3ew+hKf*3aRXALvyKI5 zM|dqoE8?d$fF()Fo&R#T`gngA{ad5r2AM%W`;ry~_$N2F#>}iA&XlW+=R|no|B17g z?&Gk#G1eY6t*cwl-3&*me_*_d3q?AVn}LDK%JT8UcEkZysoh>UBIjbzb~b3 z@m#`(U1Q-_&seH~27N$L%;q8fU0`WXLV8w1%Ol6Sl$lJ;tSOWIiCOw1Ffxro5fc?q zX@KA|;wycJRKX|@3}93wA}5Xoy$UFWk=-X7C(<%}dqPpyyOMd;`~ZrX^yg&j3*2J+ z`?w<`PJ%9vYi}x+WoFjLy5wfrrJ_tnAGy^B-WpIwGOsoTu;uFo8qaP1Rbkaf(YsFI z;)Y(Gn{61bndyec0GFoTNXJ2Hl+V?#`a29?-h>G;i6cWNQ`>8l%P6c=^fzUn&jf^F z==vKXj6GiYm#{LZT%g-HefW6mWL%|h0HAv=4A-~x@->pQz68ejxGfFlhj#$-T>ev} z@g%S9F_x6Gm#|f72ol&QMp5CeB3IQ`F}Ah}G3dv%Xbcg>uP0Licvw^SgL_>kp%Jqe zcxip_qW;rc&Ik(7f=SUoGyj@)8^37IX|g{=~R)qN3*KVyafMYFc|P7@u8-Cw@5FIn}pW%4J@MrHs%uNS!gA3j+N)>BXKe0DVQm5X7-X3g73;=;5M4T! zbQk?y!7Nta#Mhs-@hgkc)XD z?6P_s?H4_D`aZPTZd1G*84f?;kIhcMmR;XjAkDY&-wW)iS8)Z90w{m!7#L{#jvU|F z>9)T~;O1^F*n%z=aJPE5))h`Yww?w5GqR>+eq{T_%oadSEdb0jy-^^TG7}BTo2R-T z*z}>u8%@d()El(iIxIIN%YyWIwj%HFp(mHZn3+}6FlL^}Zt}JcZ#C!z9?gkvtXed3 zmg7;{m($lPPnf;keNW+SvC`v}vF&=eV0N*n{F=O7^VyJ@@R-GTc#1KVIrJO53SRg% zsxE!_qn#-T;W6~2gPaxioFfh*lZt4y2F%-8`Befjj}}o!H~ww_)lyPGr=qW;Vwoq64-$g-(E%_P7>9RSq%%l zB8d8bdRz+o>%?sJiA`X`*0PJZ(UYgV#7lC0!_0;UJZ+t`M#>h#9Oke*tq%Wn56Fs) zmUA&0DCcqcb{uoAOQf9}v@mXySxX`~A>1Ae3RO z2s7J^FA!pldVp)*Q{5jOQJP{wcn$E?sQ8{X7rYFg6*{rpdQ?=6@&9rD-FZ_n*KZ>9 z*a9viXf#v0GZA>2FqwsO!+2AXl_ z7hXGu^0t4Ig_4YcRTzY)w|0OasMozZAQ-)YX|;Xc63~9Y)^)Qb?yqfPd^xLC;XX4j z`?8ZNSJ&TxJ)n76hsJ%jSeVt@Z=kZfoSy?i^uERiwawlA-*WaJM;=) z71E4#f-lh40W;0rp{?5GZub|9Zi&-c&Y3=wIj|des=59q4qmeU(C+~54iwgge5zEk zaiER;T*xcV&dbc)`n#7K9#h4stD(LI@BGt?J-9c!UEAAOQ??_kHWHKUR5a3A5Nq|$ zY-_a>%y0=Zm~Hbx)Ni~lfc zk)SZ=K1OdgBH$^~ka*?aJgbW)`TrbV*WD-rJ)52yiizb!APSpx;F7J>^k=Ol^>$G= zIqL*rZ4lQpYLaM>g}=Kf5ah>ZS)CCb0ec7s$hXc1sWnfE9HEg;_t(8?LR|LzO}ki6 zU}MfeL{jKulhezpsyx4X_TOc{UrW6o--#+85q+HxJxCO2U7#O&###1E_-ae*jYt2g z5k4O1Q^_|wgC#F2eoc z#@(vCBu9poP)WAx^8EP3Vi^oL+rIct@0XEVTRN)5kM|VEhe?1HB%EXlfA#J;klXP8d&v*a0N-l z@DUEv(*uXTw{WXRy9C$9)yfiAX>-_p0(AbscOh-f^qxS>-kbkwj;o;&@abCVrSS=_ zsCm@f)bdo|!h7O^J}{RS@`-MJLnCu>HU9T-(M)GlmJ5T%;T{g(f|WlBOK=o2EYlh1 zDpP8(M^?{WQ5eq92-UC;QHJjFJDU(oDvcHV4f!5r=E|6Qqv~;n zXDTbLeEbf5a~cfzxR!VieF?U7kbtcRCw|q*DeUuYT=Se%snr>JEV}X)uTy`^?{83L z*fA4s9s0TR8%wyokGasr{cTZt2ZTzDn{>niZK}h>5ZmA0ITxXMIJr;m@diG2TuBbj zCUvFU3j3!z;(`=~sWaJ%n;zudH5mmVUG>AaS9hsU{Bg0vczW=)ne>WWhS8fS#@FU{ zo|Ts{3&;Befb`in0#36Y5%n*;0n0%SXUSlk_c+b7<>6x+Ywu7D%`w{Ls(G7p|K672 z_Tu<-+``zopMOIigF-2ThqCE|WbfK~hZWVO}kT+X%7N`wKcD@l{*l@`ICu#=C6lyId=$!Esr_R1~ zc{okv)C^oH7ref&FSs8F29$fi&vw;2pN&=pThIX?|3|=uFn#^2h#cAe9b|pp5a$wV z4>aE9ZuY=UIZvahXhE=0n&RJh67)M~P3K;U#WmaA!q|tLvwgKh1k>5+83gv$pK?&i zWjV!UDH-tP{P>)XN*bJB%MBIV9Szv|AA+G2Ds;dO0=!lrcJ;S?H6@6!NNn)91ajD0 zY1t?4@p>Bzmw0A;t8_TJ{iQzUBFtmU!r?vX>4vj2q7og={uBDo)21W^1`48m4?a-H z2KCvF0E-dES&KP}ZMuu+u$4S`6Uy^w7}-bK?(l%L=>h0G8@v=KEX<|f1gusTN}(__ z)zF;fS|X5t+cFW|L-YiN!WWil$xKDBR53zADIfnHQWiX{8*4U+t|!T$$(*>+8)RU; zCW^CVYivW(CjPr=GCS-U1LZ!p_J(g5cd)Exjp7QhmwaO#VrLP9azboio{(I6u z%0oW=x3n0w;K?JqG=SBGf+3jd*bDlp#tN4b4WJH$ciaGK{T#}O8 zLs#uG(k13CK3ddJcOYx>m;72%bY9liwwbs+U$o!0^<*1(eJ1`PfGo2!*LO&mzUWM5 z=zmORDI8xpxA~`2Xlj5k0*j5PCoL)KmUtG6VRsyle_IGi%-o=ZU)QUAde@l@! zIt%92R$T?w)<<1JG-r**QJ^&*H;;|Y+FzTrCL>xRtCHG$tMYZ6L61=>)R{qh@rcso zo?XUo&8kI}OK@wt^BD*FvKi^1+hi0yYAYRhr0;ce_(rAjm=gJ=nCD@QrUL^U_J)vz zjaMt}p^f@tci@vMBb^v@&{8h@zWBD($`^v16)qz*gjQvd7-}e7I|y$dS*+)#R@EdX zZpP}t(V-+@1fBDupp@%1{qej{Jq+@Zi?m_(`)4h)#^P>FQUQiuq>*~(MFRutP#ndD ztZxWjBgigV{qGvysCnLKgk;6d#U6WfKr5c**mcrWB}W5)!Oy=X8AJ7MA8- z{s-3k3fJf8BNV9!S>-HWRPK&;Vn;Ee?PxLX(q*3YrG{PFHO(*zG%C_Ak@wR=P4;z* z_oB;31rZGi=9J2(XbM8hX*~lLSMrbuf^szyqX5G<#J1mCEM45*z z&Q58lA-W%9a+f%Aw_O*?G>{b(m$@V^&M^0$5xRAy;R7okeTk*_k*+Q+rarnOFwb^B zj~12;XnlAiNEIiMaTv(Xj8fwln)vJLm8K2!Arbi0fVgdcoby)hZLnXTKdmj^V3RmeIWlS?$$t_Ak@9C=+`vkQu`0FA|Rfj;56;WR%q3zYmd@Mt#d_ zzg?BEQ9J!>O;uw+C1>Pnd1Av8-iHM&k@@jh=2^|4$<>u(;PPVSV2z@l^Hs-C2$^Z; z=MLVTfDxlQ9%CWS^mIYqZua4pZcGa^4kQGN%@JTT0oH#eQa5h@_b*rHrq4u&GXDnS#-q;?r+@vf~uaemxCxAG;T zN{8!<%!8<9wUzNI@siCM36m}c6@6(FJe^ec6MlupxuRss;Di2~@oOAK(|{R_7+v{t zX@vRXcoMB9uSdcwNwx%X1{P>~$9+xt*4H71Y==bI zgfe)gA(9SaWlcK)CaCq^^Yzx>91VR@+^aHJIk}h0JZ3Djgy8oxzx0C$Ug=(;O3FZR z`dF$QVXkRLXh-m!YbEBDs>EP8=lgu|kKI42zgD}7*Y+I>%&PLs@B8MBZDCn=veKH7 z%2~W*5Bwxe_ouv=6|yR???9--zUZf$_!%iy{zcSwR=~#??uL*M&@j@0kv-9ZZM^jY zIXU`&_AU~Ao^!xuJVE2UDE?VY4E__FwHDvqGr|VBYMa^Uf*h;PTb0)DxZ-n8PSN;x zgwZ?6j%avQ-D$iI8K9wFMb0n(&QTU^6m`5IM+k;cpu|wb`QFv-GByrBxEH50%cmcA zH($)C@Th%VwCZ}x07aAM2Z85Kieg->SL0Jp(JG517v7)CjXTN7B0L<|wRDo>PeXSG z;UunWH)6!DN=%*YGb(8!vf&=v*~q4{q=r9ljV{c%CAOu@T2@LX(e*_X`j|L<#JAq$ zERXwQ^)~J9yX{Z#OPM`I@(+E7Sp?Yr7dJm5n+@_oX($6$RUvJk&7H8wMQOx>B7W=* z058adK5!D4W#2${c4@C@8;%id$#E}h>DM~HgcoTpXTi zigP-;g{#J!Q4gn%Ax@iT)4z@?lXb4X9@>5tnng;@7M@#~lx$ZQm}7I#FrA4%8m3Qw z++vj;3!#e$Wyh&=ka{?_I)pq+dN<*R#}L#@*bfm2x0Qk zpQFthyFjN3S|sZ?ZYPg1 zuW|Fg-9PY?Wm8ahnTBVZU@hq+80xmLNam#ZrHe(%)&SJFw8OT6e%^pvd7xTS)ga5u zJ3pt}fK#~I7AE%p2)IB41t*LmSuMG&uYM*OL(%)` zZ@{1VoOwVwU`cQ^yk4w$Q2VFgE|^HKm+UM0F2a`ZcO-0YTLM9cg% zh?0wS?zHzR=IgHWBbv@om~{6^G*y#n4E8>)PRcZYEq}YIXZk z@jM47dphV}j4tSf#s||z@vL52=$j}$!Yg$hGin1SR;cslOXHm3?tf0Y#rDT4Sgnxm z4G$~35#*ef1Z=p2yG!|S)1ouh<`kvCw;DQKR%;L(IC*XK(TNjvZTMjsxTm|VyQ8ny zy7={^R^ar=gJ`d3>5FxlDJcZngj{dq z9TlLR7W%8I4J!V|NV6^;*l{P?NY#WdBaegL)miF1w>LwNoRDvqjxO|p(|YTtElZBc zNrfi7v}+(juUz*`Bx%~D+C~n3i9V~H=zS6UZ=ctOqz-WGcGO-Aw_$bt$M`>H2tp%t z!^Xh4H%lnZmx)piXYcGMLO?rY;_Wc|L$UrwV~}oKhv&9fg*R5nT~PR~Vi`^`CpAix zxvG~82W#hN?&G{D_j&bdjye%li}q(9KIK;4J2L6rpkkgDBH34rRB#UQ`%s{~ieuOB z{QfEC?Ob$aP`6lPaVrODQ5)01=xsOz3ng~h?9?jL{4CA^DOM+GkFVRy!gBj!C{_o{ zP>Lc<2Q-!Ez-*5GX)oNH_R=!o|OscOKK{u z=)y|Q8Nx+pQ&ZXwiO~ujhnzc$yXuWRzp(RtAOw*oyTAGqJy$suD2x`%$jW}$)<7U% zgTh2_kf(#ST0mUA>NBU{5kb6w)j1jn>=Ui9i}Vn(u3R;osV@N@<}lRsxBi_+@_4}Q zJ(oqv?W+eo_Ohvsv_U2mZr^?Y$7E@uXj?jYyvU)yV6jtPmWOY&=i}Xm(_H{?weIafP z@Yg1su#?k&>M7sT%pK4kU12S=X%7>*|ry zqxs9>s_6=K2j;?*t_HoD3=}w*6=eG9SrpqdECZ=G;*obZEB$24s*E#6M-)896ZmeS#9r?< zcF;n5OC*@PC-AT(LNJ9Zr}4{5qqm=2Q}nd*cP-k^u0*WlVBZ@S(k!uMhxha6!DIR` zb9&QN`6GC0(*0nUV&8R*O4JDvURksr%-J)aS*2W+b!AE^%4}>)_v?{Xei+|b&K-fT z-vj|fxvCX9_qj!#j63s%2O2pM80+T`XSXwqx^mVMv-owOmP0~`c@)3J>p7@;opBFv5LQ0Z4tq?M;s%e8VP&mQ47-%<$5lbRU zv3DBlEOlGGV<(@2I%8z?99zDoP)sP)e^nuaDA7hdjCUoggx?5#fH}vW{+~M$ zTaWv|SDyC~i>a{hx$a<3d3f0zSZ2n46`N~OoT2eB_eFaaQ^PdnRD)o{Z${_`MaKu6 zFstSgesS?3Pwc-@COo-3CXa=lS9jgfY_Gu>As{o*RZf1_-+KktWj$FVM{4?T>vg{S zz6&_n$XuSI(bx~{Z+IrtQx3SU#0#SpYbCMSKL+&^NcT@TqND!=#cyd{v3ZnM`3}GP zQET7I$w9=I{I+(#Ym{~xd8Tv7FttO6X3eD8HQ;@1+2vr)fO*^j zH*}8RfoY7tr~p-S_O(Z|qz@<4ImDftrj}V5Yk9^^!*HCb)S>_KRv38*dQBg}4#$tG zIfAQHLT>(Ue%m4xr1(0{jQS3q{j#96USY3G_V>3>LLN7HS9*#l3e_hk)ymDG8++a& z=bJHwwD&5ZaFT*L7Il`eN?cOX>|u5`UP~c9Z%q%dI?xR1Y;eY=!{uYIOuj8iXis<* zU#aKRut}^Pf#?(w3X<9g)X||YybW>Y@9oBP3p2CaKqummg#2CvV0~RA`bo+EMcG?M zRoO;sqlkcXmvn>F0!c{$X+%Ila#0e}2*RR~ZlzlU#Gn`5vFH#4B&8N9N-VnZ-01u6 zbN1ffH}=_M_{ZVUAv7G{IGqOU2&>0H*7qO~d%zHSKDD(#&-IBa|EoK(MgxBYwMoP36wo4*Y89WWT( zQeO;UUE^@xU|9M7pH2_CzF>Z}`ORfD#j*6fjI(0nmg%@4aEOA$jIfFvcei=C zUS;aHfaOplTL0jZMh#ed>p&dA!p*;7IQZ><&JW(ZlBck~p#_(2tYZlondA@icQVXs zJ5WTGic3!&7WBD}d^83)gY2*(Q5L2RKl>gCz-|uzZhq=h&ZaPW>X1V`jb87=(bQH{ zjX3J@4Ee?&l~Xdo;G7T^Uz_$ar`YPIoWQpSU>4mS<8Db@U%xyFe*n7?Q`6Yl*!Eo0 zqn-eZz@HoslEm!Q|Hv5+mlUV9-ZY-w8*gJk^y8nlwV?1Na1B}P&t zrq^l7hsPw3v|P0k@G<+|7g4P9{QjJIZn!|18dz3WC2 z+gR)YN%kKofD%!^+cD_r6Nh7(9roZw+`BX3_BY;d#Bn;87tZv}n z_T31SoE)Ac{jB(BepS+oDV}1uZ&6d>r-*W$OA5e{Q~CEr{uhAB#@1wp63c?OH{(yd zTv~CK7L6_)b^gp(HB&4vFq+Bg<*WesUB0pLpY@jWkKQWw;z5nMdOgD}H-(?=O38YJi12R@&+drv0xAisKM#RVb`l9^pu_BH&NXw-vIrf@@gTh zibg&7UU~HUg6a2uzWk=V#HW|bg~~Sj50!53K2Y#^#FX?%Zo)CRC<#j`6vd4JzuAtt zAoxSdgU0BC{Q0IgVmg%V?4*VzH<3zKH>%QQAaZCVPd+2 zfx`Ow;w>%))ZXRz?leVZF_!H>2b#jgz-9&5YtAGZ$6|0Z zDIvC)8eFMY|531+o4!(qR9jp$ZcZ&ivwM_JWFjF%{;xN-Z!e&j(?gbw`Xbkg<3*p= z_kMo!K_`2|Wsc@>wO;46f>%@OlzlvQ3mSl9T5a@|ro;s|a3rH|vJ`I{`m&sFgS;0* z&etpOc7C-_dA-~H3BD?;lPDguB~s3kh1AkgM;YIhspm#|q6_}f+M6}ui6!LFP2#^W z+GXk)OOL;p*51)&0}&;{OStoW!L4dS_Im5r9p$Fg{+phas`hv7%ponfxcjpowk4Ez zN(wpZ3r$@P#V(mo`La(6rQVaEL1<(R_NjewGcD%@JWO`-C2F zINieHuYA8mtbGv8VR|c^#o)0fKM#OS7Oa1{(cY*(E2#eg!{6x<(XpK4{IX23G-p=J zI%VtaFn@gO^X3bvziR=6w)ZI2u^;P{KFA#XGN|rUgHeO$2v9@wdG4mf@tS71|D}@|c6nBKyvXhxO`S+N7 zN%m(xk6iJXv>v~_a1zMr{oV8_Qdup5TM2^obT~)c$3SO(MjCq+Fx=0A&51GK>d&|7 zh@F^OoD&bMzppIKp;=SS2+F&FgPmpkXJx9A7Mp#bPDMNg>mMXqGs8M_)LnxYLS+)1 zPfG<2*|SqN2@ayh9e)cKn6?q_KTN6K5(W=+zsGHcd&_tHwG-}Au&po5r)SP|g4_`4 zj^=7n@0RW4kE*!X2qoq^Kj$gX*P*rITb^jcgBbE)AiKo!c=_g}Bwpv>NO=dq?jqDD z=OsgSFeWeIo5X;|L&NR2li!gr{qg1dX+SWO2i~s_FLR9RzU)*tQ@U}QM~of zhBC^Y*qXJR*5n7F@^;HLP$<4&D(FcXY6*e<@1taQ3x>=}YT4s3J?KG!_6!+#wjOy(P z@NH;MFfF!i6DvlZMV-VsydH&H`EbX7_!w zbHsvuBY3*~eO6$Nvz!CQpP`S|;LjfWe;EWx6IkxVZ7tDPjHjtHpstsPw~XMl1Sn<5 zvFn)#oTNzJ9(?Y%qw#>>5hIiej9B}Jrz{4~j%T1ByhBzamnhQ1i?$Nt0}kp)GyUA) z`o>pwg=n6;HknSbXJIvx=QWd#feh-0Dof8Ga@b1XO~;SxK~N7FcZ&G zH(Gy5d(tT{z0rB9CIU&nJLN{`uSqaSWT64O1x4*DKBSAe#Vys*&aJVa9IUSVE!9E) zr&68G-}K`)je0T)eTqst&}I$!ZcyHo*ngy+Gn8t?Y}7|8G7 z*-i0#hY#IiXqNT4j9mG0mHHSqGBpwnkzQ7XJR~-Kp#^hYTheW@>tW$(S~SOz+>7Eq znaREh{+{-qi>($y)tIE#x(dqBsn>7M(v+6;J6T)D9#6h^33eYbNMu`o68UxJGC#Q< z-BSJJ#c_=D$(zcyMrj@Hl98EtpTc}+{pJs=b{h;KuaC4M=)rko;LgtdxtJSw6_4yY z9r?Uk+72%atD!$heEL71vv$Bt#i#0ZDvhf8{UW&{j_?uZs+{_Wo9a-A0v~Z*seh;l z6}o7j?6(m4rRMgfUeglatNjQUa^UUwYVyes!Q1$|Z=b{sEDnf%C|Vu1Uqa;g?Lk8^iofL&)=2Ho$X|XJPER zeL#sSs-|olOHXtja_LOW(zmGsbc(@dJH-loI<++H?bdeIrFM5^DN4RX2(g{MO}93_ z2)Ax1Ppp`+Zb@On7BpgNideVdk#nwTFU}k7<5ZqfLt+lTBJ?b6w@Xa=Xn&yPH0XkA zRQZ}-Y`|a|*3oR5zigjOOAPI7QL~t!SHQpKN>&DV{}Ol%|5H8852exzf6UTUelhp- zm3Jcj@B32y2fsudKJ!J;oaqbBPo(L>ZLyR zpE@3UDk9-DZfV%?6L1sqTeT@HXLr7c{2ohY@o--Z4qbYYqgZi%h?JT-&hJUKi#)@W^-n$nBY%sy=(k62pPFtQ->-kq4r%&o zE8?;(5L2m)5G-A8Rf{?4L4)n7=iQ?sqk#VSQUeM~^l`{aXWQ%+6`+?l483}wuB)#i z-%L{0zu3n9KGFkKKkohSxSLw zUq%`_Nx%3q7HoM9@LYa&9~BWTpg~(>=5AAG2Nf3h?0l{=H=V`GfIQ!bWlrceeTB!MBU8 z)G3^p{$-vpEDj^eK|Tj+p~<(x^tTr!Z$)tvmAiAk`r0(g!vN^H=wgkNKaV$_OI5uv?)55iR~4ZoLe3#erz5TTx~*H)+{_ zTOddh*b!frWzdt6-3gavTSBu^dC8m^a(;`)ikGgc$9$0%&2u;;TVWRu0`%RbZ5LZr zU6Xiv8&JzCOY`jw)oR7u>K4Qva8&^3{~zkbMti7SMVJ zRg_?Ga=UA3F$yohU+k0Bsafuc*l__)Yk*g6)91l3q(Y}}i{W=2{zF-STvaoeJvG(m z44Y8sEpiUNE$Sz&g&Hf|?1EU=P{;e*f%S9iSfGR1HScaF(+5DmoN7Ezs3Kko zfZC+3D1s zE#C}p=%TkkHaxu(DcE@*{+&VdA94DcFnsaC;2LGp%KbaA0ov~VKRVy{I7+BHL0msB zMhz5P4Qj0C@HG^(kRsF^Ehwjmso^=du#Logmm6j9v$z-M#npWQKPm3G= zRcQ$5%1I~{O$k;Q$)-)=eVvzXY@cvWe*H3}^lZ1AxRhWsKJl&g_%QhxS($XsJLbpm zgzsX_A5++@G5#kbh}zo3v+N9!O(q~vYcrS2C~@b&xFrDIbj>t@;I zV{(A{VuF|HkXoXJaZ=rUJ)c7;m6XIoMgrY@Y9G$I4&QCt_#CunSkz%+I3^%f9~i0( z9PzcsXX>f)hEY6XIrI)YuCTqPtEHp)$8{3Er|tHX=>e@uVm_CuOl-ZMoHkwR+;UwN ze0B!a%27W%#0>M(U-IxYfkF@1qM*5XQ%8x}_5NLj%I=O!7jmwqI#50$da%CLx?9MK ze*8wJN*s~~o*i0PSz7azgQ<7tim|?Sc&m7tL^)e-4qqZUhI|Ivk1x*#2KP?V4v?MG z1`g?^BKkrm*Q#_=OEsPh`jP-`Oe{9!O~+-20Df9^16EHt#!GzZj~ui0p#rKC!Zpjc z`R09|7Hhh#QY_-%1KjgV%f`9YFMPb=&E<*9mSanJX`fIm<@35~7Wjf%V0`k|nb7rdI&Zi&bKf`dfqLIOiB<+;G z`B<94VW;US$wW^n)W>eO5|RGVA@p;K8o3GYu& z9PZ~-(B3Y?N+cwYKEDH4!|sR5XYkIALxM;A=%K4Gmr|;~D3@FLKNsNvED->t?TCsQ z4p$$$Rst%DU?9vv65=G-bS|-Ia5DR^EYVnIu(x>KzJQQ*JhGRpV76#iIll7X59P z^$PjHZNY%^f;kFN;`=*q-uVzedKifdS!zwhs;?F{5;(V2fq{M+JP)??> z|Io#v6&BZ&Z{9x!8ILMdo~Ny`9*mh%UjP~UUSOZcR9ywe9QIck7+B1p%)Kky^o&va z^LSc`0&mmTU)4Vzx59)sla=wY2(W6!CvTGso0%XL@y`gu$fCcI>z9`|%J8av;v?US ziAcu%-J*lbZkhvGdVSLItG)2prbAPl;||xpYFS%tN)QPRP!st1XVH;eJ&y|6V$IvM zuDUWM;BhzVMj`lNis!a>YRy$&z7h_SH%ivhO`(z*dk{*sYh3W42W=1 zOydFU)u~#_c3I&eNdi;b+JPCTE`g&yx}(dqCtzb+ie^4^fETE4Z*lLzjqH)2IZ^s; z%TUl60hz;f`)$^`H?9vgcFE`X04VBtb6n6CJWs?JU&+dqjaKbTf} zN4$UiL*ZOHq`!X$eJ^xBBM#pzc|NNhw^j)jkBkuL;f;$c6VI#73cAY+DJy3VTH&T+5UdCMa7`c2iVMaKQ_-&BFU83YINHTP?C0t0_SLDyg ztnN{K9R0%!->J*|7zNmFk7r?y=7|-_fZVlS_Nuoi8tK4FJ&W#bw*2(@H}M$8;-p>H ziyyA+Py8-~iyhi{u1#Cqn#?zD269h<^%j_j=*ck>LD3}pkq7?g_kY4@WmY=#r;6qG zk~U<_VOzQ$ef315c(LJz9k1?#lHBQ)OiJI;;{Fn!-~qr;BcIuAJ+}KFw%`)JD%DGI z?ED4kaxyS{B`#km z_ufozcQzN&N}d3sq5VFxYqrD_j7tMcL$T#*0z@JH?%+p4xpn8zUNpejMy^XMY_FiN zQa=RW-dg{RbaTcM7v!Vi+mlo@3BQk5-!)BlQNr8CbG8R-FLI*ze1@X{2|Hg*tih? z4!?&@sHH=90Z}D~#UukF0R6xnkBpPE6v)SWNGBFV^6{ER_eKu!*iJ~gzb(V;wno>I zgmVmtyL>WQT8WNTa{ejh;Vpq8K29Juf+0~WyN#$HUqp9Fs+Eux!XCZGltE0?pq#qx za+|W_?f3aGc=y^GK(%kWchfz&A|w9O0;?y;z%sZViy(4z+x6XElWC zr9E8GLZBX&didtw(rWR?jr0$(EC{6dd-Z?5Mil!_Wdg0>87q$xAS;-n9IKV9wqhNX z@&3cL)cgMFBGQTycn^OCLHCFC?8jDFpcl)l?{1m!Hi?6UesTN2ZFVwWt%IX=b(uUm zzJU!k@P`6R+l|U}_i@Z@B@uh17`HF-$?mEQGb;|0Bw|6jI7IfS5QW})ciOFIEIa^m z7(zh-Ah3!%{&Q{ur6yZR?}Qy$S7aB4Y0)!8^gTJST$#J>fGzjL3O<$nc;Gm_$oW6H zkJxHZLCI*ALOi7JP^06@D4;)>S6D6aS3e9tWhTLB2j}U=SXV(25qi4=Ykt4h+xV`= z_UYw!DlBh)42v?WzIxGv2T2p&TH5oQ9s~2kZMsZrX@@Wr%gFy86>=$N;9PJO!Qb$K zCM52L7y$;nf4m^JU))Ty>=T|86covLQO0mGQ$p!@``V6fMRnBwv`myoVxme4NT*g; zpM33b_Y?nwb<&lM?U|%h)XoY8G)g9FI3sk&xo6?^=Tt*S=qO5n`JmySSWVf1z$ zF*{N;gr59Ik9GXsl(Az6fnJPmD{+??JMxp+3ofp*(AF{;U(2enRqV(s2eJfmF3%xNhKm%tUZ?s@{` zaMB)(3jOJ&*BY{F;QVd6{EMzNsi5S#;{{r<_G1Vhq;e5?Y?xXhCFDKbO3S6Kh}C@G zpaW>0p?#ma5PhYG%NR^t!7yOkDpQk(2~K4liY7TeD4VTlly?|YjT-3y0%<-b7dC2W zEu2u-eK1&}KmIk0ojdzRhlBgUYm`ay6R~fij7JoBR2Q?Wzh1q2eFWlEg0RaVZ(w#~ znNsK#^tD@xf*nu6E(<=tkRa`x=fFXRij0M}LLT|6F7!V8v3`&9dE(bU=TC>NiL1zd z$;Z+m6%}L^NUD4zvfUaRLi!J70fwtuV&0g_BDfz-q(M4>py@+14_Q0BeSjbls0uL!iTFA8c;3$k5h@A z&*Tu$jP8lQ|C8U~&>VTKE~ARhDfE9FKd7svzYRW$1-S$~!7MyNi!7%Fx8W$jzt-3| zf{nRJfLa)gkXT3ZCcO*u->jw!;yJgoNw8$UQp54BTGg5*Owd?E9$SavsNx0!x_Gmx zkv~NO))+!Xn8~2NID@Dr6?5XQY_GowTA5zmZA3JH6fqinSPabp=DVfu-KL;^*977N-tQLnS*B_m^J0`v9l+gf}7<2<3>SfL%3k zEHy~*MciBQXfLIcUNV3$t}j3^Stt>nE|Dym8o1RmNx&zA*%=JcQ#%JcexN#p@A z+f^dKwd5kB`^z`|r<9va>#3G=}MX52>hLPY|qsapgLmPWUvp zXXVS?12J*`a{=lA^iPnAsPDfw^|Un5co~L2qYO4D$~DnLsaji1M|{3AtGm@}$R`3m zNVJz|E&3FTzmXx>yiFWJ1hdC2(HebXeSY*p;31B{cPfulP=3%P>_c4$1z^;<3zlk+ zRXv|L<)F~hB-gqS0eDIH!q!%j_yWDx&I3OR^5VAIJCq8bjLN4kQU|j3DBWZxz+fy6 z!h!VLWvUm_!qQsITMZ?p?!AsZSLQ!ax99b+Q9YE?gB`5Y)vY_2j*MRFa<%&IpSB+{ z0H4*yVF%-WZLq59J2mGT^8p3>&q`-X9MUZoe;nw7*F)ti!14eIaIl|@3;6jP>i4PX zXw=@3xnH6KpxI@4Gw!Wabcf1hcT|ZyF$ON=Lkc5m|0YY3;ipf|=Ca6BNrW|dUjt_=u;<|B1f5o^z4tLeHWv(+At(fY1=a%zz~6}KjgmNc7inK$6~OsER%Hz z5Cat8SL*-PXub0Ii_)W%pifDNZcA)f@`8H|zx7vsVYlldo+l%rZMk)QOF!oR3;$n% z8vKjCQ})Ct1?Y=CJs(HENm`kQd^bM{pU!J-#wp_e>l05=SVD^guJ6HP=96Fd3QYWy@v4!UDq2TYNmSS(iecB;ag}D#u-g-R!i=xzfqh2yl z-MzE_HUhjinwxj9BSTzg4ozOBn@QYoo=|cQ0lpTqyj~aV=`Fu53e-rl!t=R^xez7i zex5>*B6+^WaBxP3z2D0JFA(#@hEQMdsXMqpf_3#ZTHVSG+>`y)9dnbtcAeue=C*)O zI>TA&YuX`_o;j)OyH@|}9W1p))imeNIz^lfv#oVx8d~VH_p*Bm{mU!jP)nS(&$c0B zqq?mD#+cPPErlaL-GoKQAX`m}4h`!{Qia0&PeOwZR zLfFL-2fQyDck5}&k-~$rul(hwdp*@nTgz zBmYv&lOgd*^HX2r=&Cg%L42KBouTR+pW|Q}&HOxcbq>epNb@ zg`|FK+=+d=ZK>JQNaA&SxvNMG4C#}i+{@G^sb=DZxg>tOt*cD|wzr~7K`Rephu@2=pnk&*zR46}C>N7lIsgz!tgO6A^@6a~*?%$iB ze5x41K>VTT&9es<0^>A;QpKp=`vPHKHxD@zx~*P5oT4V=;|~|Kyq6W~o;tI(kLOt~ zN*tvwEJ_ym(NwjP%*G~{vQS^OLFsj(zMncLkH!-Bon?mq-YZ@&SS3FQBVlOyUb3!L zK#>f0IEe5a5s^zmiSK&aN<4o`uv4@0!U@w6Q( z0w{<1(N_~H_(oDfV?4>&&NqP13)nnB#AX)^mH~by=ZTqCL_L1_j+&~)U!@0sJP{~1 zQ*K?nS94E#fC$==-FhMz9+A@>C*$ia;l0G050WlFyW=*SSY&3Gt=$&2#Ns$-it6d3 z|446q{ycix3st+lv%a;a+}~&pFX3j}d%#6UY1C~0@x^Nqi8h%J1?ryD1@4nJ2(LNG z<-}Mdz3f9PQQ>M8<(EzUDh5qgI%zDF+b#Bk#FWz(Su=p9Z*-cUQr{G|uTXu~;D-9< zU@*$QiUZI+oVvNaF{8!2<>BbRz6?kx$|C&T_;c?4FM%B#LfZaf#DiaU+vUG;dSoiz z@?^MjNK|UP8hbbWUgUPQk#8pY>(7`_vNwCWcrFT9HstF<7d2?9GggzSD;d&+H)B$r z%P~7;!m(c_Ukq6q)kp`R`ttPNdnle_z9UH zn)|kgZU|!unMQvTe)%pmg;#?U+rkLQR+)5QxH&YMHvH$FUSlG6YjKS_ zl)C?nXTU6ZB19LR%y)6g=`#4VrmNQc8ur0muT4kdCVJe-VNbQ$+8q>G7wR#NT^=;( z+bb0J471sm5Qk7LL|oBuVr}WlTaQz_kF)PbWV}Hw0T~`vJcD=^O2tu9j6#@?4Kohk zxM29~i*d6BeJt-=l~EwH%r8I`W>;~s2UTPi`_`=Nsw*HcpPac9!5A%Z7M6<|>?(pU zj1pIL#^HK_EJq_xDWhc}6H@VoQI;O>!x91x;f3;ROqH}_jIcI>^O@Bw;OV_9(J3Sq zpsBiG<6R3rT}qOqstE;WU^iwopO-TBR*7cE6ROs_$F2c`PZuA~8y0*Prar0Pb%9y2 zYFycr%?2V;oS1(~!4LnucmNGhF?oDG(TO9`>Qlo&hX>~VDAr|MXX37ZtP2AnRQ^T5 zt@e@K4)w%hAaLtR5kS}_bu!GE92bLa)2$zl_htP-s=F1p-1{uR1665gLilX8V!vQ4 z>fpx>qjbT8ejxuxza2$HPi*>L4JH1uWBRT4E8&3lEDz-6#|$3_e%c)}Llxuc3|~Ir zQp4FMiJdYHwQU}?rey|wXKuSeFe~#{QlxM_zXoh~nbr!BYzYMoOuS(cIRFP z^~ALPG{$RSZKr9_z30$J0|#_-r|2>8Aso&3z@Y~=p|!l@E4MHLUpTw9HPS4E44eg4 z?_KW(;#0Gh6UYwMB}XqX6ZcdexQ8bKuUzFvx0^_=8P&(%eZ`4!Ate)vv(4nX6Sw4X z+Syf~NAg*IG)R2N!j6a*PR3Fwf33;q7-s$CUnqMQi8;D-w0q2NvBr~8O{>q|>V=_+ zyLR*lQi#;1+*}!yal4@HnMG(9XpWE-i}CWCkMS^iq2 zNg#uwJl_HfJ;2XQ5!sQ~ujcgtH=oIuUz`cnxfP+Z7&rZ%Z05Hxos7I>Idry848wu2 zd56X(f{9$)~=VID0vvIhbDfX`5mw4+kha4h$r3O|!C6kOLLUxA)dVn9h z8*aAg%R@=@3m3wshMwjRz(yJ!oh|Q|#q(Jc@Zbf%WrSvvuQ~_^@@PEdYNe%4UTajH z{6V#i@i?*a!IMtP%CX`;j(AdJC?5~4veMXPwYMAjV>i7zQX+PaI^B)En<|Y=o5zT!vu-2{eKp-8-*TibFYsn&^Kj7w z4^szNe^fC4D=po#TtRd26m=FE+r}8g>}s&}SXI3SEnD+(hJB5}Dyy4AIuPfzsn#>_ z!!SBANRc2D&D~?g)i22TtxqY0in5ZBaQ&D~z@ceIukvENbWm*BOvb0I24RDw_Z@MC4W33YYe#Gvb6i*ygpo@fyPQ7NncQfm@I#C=! zss1KBoBEGyXbDi4g-tCKe$+s!HC6AtKcO22B2{(zUcMfoWr|fw_SPP6=aTa$%5o&l zz79+4c zoy^SV;(ThLhV?!rF>2E@BzwjxmjKZ^8r@Ago;CP<^47-Ad& zD`Rf_Gd3EE|Hv3PA-nhsMxE=w{qh1RExV||*&5g8yqSL7!?BP+R<85I`!h4;1s82K zA+s%hd_7v@S4Sg;E?N8p^A?zh@DWlJT5j41d3>*hjyyU63vzc(-Hspd1^ReQNB{(~KwkA4)*{H=8u zG{z-%tDc_ed8MJN^iO>IumIS*h8$g)4VB98Z(9z#*8!a&j)Z(ZEGTncdN~nh1t@D@ zh!*axpblMS4o0|vdyZ6DSfS}W-$L!$nFS)cLTbM@MNL5P0+0)rz_X>2Dg1SLRuHmz zB@1Dp695#bfNctvTPJ)0&^__8MrZQBB?s8Q_WgQpuH6F?dQ|ZPv5TxF#)#ERA8(6Y7hhnk z)kh!4anVAp5LfzxGe2d(nVNW~&Cd80%KJGZCs(~p)-8pg8$aALfRUrFaEd{qm=E9I zwN#^{=rj5eiD@>Xkzoe&T6Tm z`$CfZVN{rYJG1#JLDj^_Y^-^U$hZ+%`*MD<;-MNwhC^AP`83Ovxd@Usst37R( z0C_mI2Q*a|-0+55>@7UDSi09{cvIJ|slooe;K{mygZ||uj0G|7zqxd{g@ypI6{WPE zbHCZ8V8415bJp);a=Jun>r!19DotIXSseFCh}60ABq8a|UsH@%uMV1kTyul|V%4v* zx4o}$2sTsSU;g!&^iN}8TK`aMz143(o0jSlW$lPs{z4-6io^((t5XE0)Zh#_NQVyh zJVGdk$G6sLF-2Np(0%Uf3|^CnU2m)~XRvMze91EuEAY&WA1)~CrFY7wultnTJfK=a zL_g&<17=D0cd&+aD>!PG)yX=V!~lsYMES322C>nGLAZ{-fNg)e-G#nu<=g1Ne)$%4 zvRsvkt-*Q{o#ICZ)tL)yHEmRf?#VlFXF5J4&4#b{~=&q*!q{LoRL1^ zLkfM1Q^E^rOdcY7;f?ifi(rxmp7`9~p97v%eE4j+6De>FIAO+mO)psFP2da{+sbb0 zC;3cG!BLQDCc|tjX*%%W4a_st4u{^$ZZa9T!Eb_@f;rAV{tYUx*Iub?D!g`}lbPUc z4iUpIXXl?^%U-`jEzLz^2Ee$*m%H#4!`$>G;%|nQN7oUDQpq-HpT&k+w1fi}#0)P< zw9{|D0`h)y$c6Y6FNR|3SGW6L6$0ma683r*$u0>9{mW{Zr{(^=IU7{r5qF&Gc2 zPA4VwNhzjAP!E^tc(c%+^6#w(@RqbMAAH)OMnu)UJB$HcyEDV~VTNKxjNiu3t9ZQPB9)O2Ki301aPRcF zcsHdy45iqfonF}~rMzJ&0X`~cv~QyH-B=z^hc33Le1q?^{DxEfU&8cwkOnMeG5#jB z(FwPa+ql7yZ`9ZBs{8StfbJ1n*xo6HB zL0Sy803DV2{`A|ZG&ZUz)>Gy>$tuOq1HJbuDk?I_PA{S4i8-<>!CUXg)r>#a^GYAK z#^DsPJ!QF0LTL=K?FA@AeNC)ckH!dgFSUzLB6h}x1gW-FbGj=c9c>@H zrGB5Xapj(T&y=XV<15&;-TX_T9^?yb13bSxj3|ugS>G$VNTEwLulf?HEwSiBQbrzL z+0DexC|ww0gbDnHrTCkn*~L(9a^>MOGnr2@rw6)QW^R#bPHir2fUjWHt`_yc zppv*r+4wCrGD}<%uNsiB%S92?58RRs=(mA|P^%htoc!!me3pYRobEao`i=3Y2W-#S z3ln(m-?5VqE%-n8RIYNCxEr`Ice1JG0Khnk<#^b_Ew(-hD|HDTgEM?O?&r? z04%rNkP3s=4v4+|Ty;0z@R{}>JAIdBR~`;zh~i15vh3@-^mq`;NjPG&3={ABW)O~9 zcAF4K0Qob#;;EK{avfspmoWTYiC6&Al8l+aaFs^N`+MjGj>euDO~Wrblo;h(qv+ol zW8|9W;ya*m1~T&5lUd^<6&-UAYl*nu{rp%v!2VpWEo=!oDDX<8-cuP3y4)I;Jym6IYCvJsO*9&umv#Bw^lR&^ayD+slJr5Bf zT=nmz2d26BEuPM|!046x=%h7iW9VMRhdeZ%Zo_U$D2DutHbj&}BA?K}vgHxBlXiK5 z;jLk4DcC2$TjnT%&v+xI=!Vb3GAY84Bu0T3Wv$ekCJ!I?gckTrwG@k%j%)qHg~tBX zz`&S}d+nV{6c44c%a*(Fj|JvttYZYjnbPWlE7NnV(@8tuf$YJC&%Un$()i?C>h&*1 zmQg>4K~5^+N3moUHO}TZjfjuuQTWGk7dhaZO!cmK`Vns`=*bD!^e?bV;@w5+G53k( zmT=r_6I_s0I9N(}f6)uq=8|o7u`x*}k=w*ov!|KPC;?_{uuMQCb_+z@`S}-m5a2jG zk0lXwpqcT3_uIy+ef9XaR75%~b!VXDjqg64@1=s4*oBg=|5i`j^e^EktwuDNuOfZ) zsSJ>ci|-dL;8CRTkDs4-4xh;Ab5TODtr5|H)17a8($*ngftUUMmXLQ70iWfe6)o~d zE5T~lwW+vTy`S(5gu3>D&=C#|dz&;J5O! zK3NK66(J!lf_Lz5J}wrvYN?{_ATb;bXdo5dZi~jlTsqI1mLW>1tR6s{m%12^riuKp z-Ts(!VFVGx&zU^H$v26I!V`-a$#yWHuJrF%9^@wxW#5xo!dXc-){qWTg^=|gk zLn^I+Pni_Jiz(2d@)d__qv{tuX%&@&`GJ2mWy~CE#lp>I>Jb+3nwt+CwJ_`T&cdRP z=U=X^M1QX&rZ-@CUK3&aSA$!ETa1KIEh)DGe_e}9eFdgkmgyYlhRxyu+n<}OkDQr3 zNi?z|jqFIoF-L&ls{hX)RueKoUt4?=YYpRm~8-cm?oj^Dvl(;maR_@x8y zA<2bS8y)InhDG9t6Q^jX(QSm|K>UGjI?I4R9qt*Fe+i_SVgYbbiOO!3%!k*qUUjq` zdIi)Fug#llKl?m|i1y^TwBXC;8ABQL2DPR~mVf;C9W&aJWX_O_tSS>tg9#BcGQ-YK zB_v8VXd@`W?$^m$6ZoZuBXVd8SX5?w9+?wKJU-zdbK-nwBfyp2GhB`U|7c%VqlNk{ z=`7Q_o2wx8SRvmAM$MyZH{A>H|D3G$h#Dv%6zd1$4z~o7w2jNKO39g|c0|%%9OEtu2hcju`F}+Z?i1 z_+_J7MZ~t3;Kp@si@j@6!N$MZP2^S`+@AxEdx_Z-rTjv<6UHI4XcOFi)>#+^oEC%x z-qs(n5qsy}>GRDh6%h!~t>*e%o)AJc65q?=1UR+QvaNNz(@qwxgwx|uL})+d6_*r1 zt>FvyCV&GSV5aZ*F1`djb&A4mchx+0#qk3O`7AGo#&w>+uDyt=Ps+eGQlXQ-e`L6M zyjxvR)qfa5Wg$yuA^7X-G=#7c?ura;es3ftN8kP#NWS`boi!70*&bO1A zo0+^sXdQa$r_45BIk4-OY;$?e1eP~;zcJ4*$JW+w(qf&ItIqPkfDY)ovfl& z$12`t!I8)aD~-XqpcJrksW_y5x3fhW*udJkBM)O<{blhPcsRfk6Fb7pA>0BMKoK&$;Ld!olHr%&coGA?9R+Z>_$%t?oRv zhil$XokHM6x)7gC=xCXrBC{hH8;ema+Ko8Ro_V338t6@S?gV84HYh~+z?b4*&6O-fv`p7JE!4c!huf}3`8HioF2zd;s>CrrJi#qkCj69(@i}5 zV#qgswU{o00J&=^j%SkycP00b+1I3%495xVQ+a&4+h;FwLXR^5_(U)J{MB-)C@+5b zE{M@CiCI}#z>=rr1^d($o)s$Vugn-T?EVyBK!&R2gFyB?Z%4z3+)>dtr|?|fVTZfj zw7x7u>LD%ZtGCL!cnseFbiL8mabMuZmVv)=(3FY(rlzlgn7HVd$wGJehE)Jtm-ax9 z^seL^SnjB+gOB`pNa*Pl)XiGstpPqF%XIWxHT3{wU6)z)BPv;g5kwlbH27TS3RELT|HhBEe@8LRZ z#)0R=yygfz`1TEehV(_Ic#H2@lR!=e4$X`OCP?W-Z<`uY&SI{n)2fvK%$w`xaHl2h zhdNnVo|3-h|c10LgCj%`TJg|C!;koq(apWYJ-474EIc;;8)Sh~QD&aH*M&=sU%g?7g#SxK>tW zu=WB=uc?NpT-=!Zdq(v(O4OF1++f%0d2t986y}Q{`R=W`Mwz18R@g$4{uNImpIu0j z2+LSY@3G$Z7`{iQhSmgWv}GGEInPWvM)}H|SAA0c#=j|FQviMdmb8)Zu@(5z`AlwJ zXv1KcT^&2s{Nh&atZBtBe*M~S|40f)S$OlQ5NUi%n2!ANLZO5tJ!ZmB0HY0``PJk4 z9TV>B_WzBnt;OOt1|A8F(h^<7P>@C{5r0mFKEYTh<4uP&O{D<4`oxm+KDU{2S3iz<`*TstAn8< zI(fF5k-ZxDAn<9TW}j!x{p=sHPV}$$9Z>pr{^Tw|VnUx@^XigD%ei8i5xd3J&G%(a zU3uTqQYck1~_hlgFL*te2&rhZ4#)nRRRFPW9o6~?D2iPK_rg%tJof>#Nvp1FZ{%b&Q5>078vIHi*KKwe0J%-CN!7i zZy1YBym%+5?pxtJIh4w0=qJs`OEsaSw5^Db_0T7o-mEm+bfIjqZ2pn6aQQn`Yh=o9+lk-$QjdS3%R&JJmEynBAE*l*;9%8^|-sKJa9;IpS!{pk%wq<}TLvSeFC|jf2MUY7tX>JFx*Em)?JfMz zB}UQRNbD}F`=Qnwi+pEspSQ{Ek(glMbFJAvAVo~y>R8*0k(DBl>1qqr z2h8-VOHqgoiuV*0hj*EG7jNK(&y9!;POAN1Hc)^SXP@k(I$KSnb0~`zV~`7DyU%h` zT13>(qz&M(o%jRk)w22O{(d`!DA?Qy+|>!cLMaR_3-LxS2pf$hW47D*RjPb{l>NsDldLktbt^-P_J$5%Ns42z@H?d zWRrYtKy;9!j{d@vyB^5YWG2X`uY#KLJy7Y+-&c=!!z>kDKs(tlqM3hQdzY0kz;|P!FI827-FWA)B>7bRbf{}lXL<2# zr&_ny#b=*qVCKALD=(J)*bsQ z;1su_%3>L-$=Bh4RvA*Kg}?78KI^KQfz1ZAgM*(!fjDG?O>nqBPJU(Jg|()QJS-T!ps?4>U?SrnK{Zw4DFrCc8_Ih5}$p9 zz?-SD_^-Rvz`dGWe`{|ngIyNbtO2b{g@B5u^ zoHNe7=Uj(>Is9w?)|zY1XFl=u_9W*AxyeBBgbj$dJ%~pi z-f|w-?wXS28_UN2uxYSr6}%3PK|*-1y?%^qI{p{zR`JD?QE$&#_o;C26yBP6*OQPd zVC(Y-B2P5YK#F78H2_))J(5TQ<4$V5?eC&BW!=E9Iner}NKjJoP37StYAJ;0pXCJ- zsXjEP`{d&0QW8MVlqbPrp{!82%|BFffO#P+t-p-OpdnY;pzU zaVadP*|dKKtsIIXSFO|mJt%;4SFkI^q1<`hDHoC2v)t{QS>4uY|6a-WY^ zLs{#LEFbM2=p_+v-K0Fmil1AA$1Rr$J^y`LF4J#KXTrh`9c02eje^|m*~AAfcDvdO z3%_7@*~)Dvm^$>$3?u$VPWfQ^^RgmoMh^hYmyyJ`)E58Tut2Zwmf-mO^t6xHbOifq zx2C9*OA84+%3q%iM#=z+i*Qo{4YRWbsCxr|y8W40X~aGrGv!O})YW|{wt z84tN~q%|amnmf@_YVoT=63dpf!gJOxD`OMw;GF2$BPCaHzy~o%ma?`dFg~^wni8bt z+X^GbEab(fcu7wjtZ=fLQL|{Foy`C((4zf(Q1)LzJV+=p5H?<2yy>)`gS)?*H}nc= z=2&ML?gegVFfH2K1s;m_2zMq!MYnqZyR;5k)~nKo@@#_#hA##ym*;OWp@}OgW>)?Z z`n8d$Nvai+%HiFUvn~$V@i^Eb7&ulkLAHu0bKDaX+q+|#%RbJtcHirY##Zs&_HK@r zPVv`L!)9rVo{g%zTyU$+BoKtZ#En;V%cH$}+8WWWdo+|{)!w|?&c7oU4ifa!LJO=T zO)P|G_d_dBeqDW79Mr3?Ob=!!1@?&FEHDFv0(=>o4|m6E?C7qfGS;^pijHaCD;5!i z(Rg|nb1o#_J$cG!BRBz!pn4CxO&d7j5Nm-e>+Glku#D;ePCn1ib}0cBw69-AvA6R0 z&hFrN#3Q!YqzeKe9O%rKvO^>UzcupT%&;DFjWR zH|WE_L92Ij{ErXGx{E$ji#@GG91=rmBt5iNy3zjYx9ywsF#du+q8_~XV|ak8NE+or zT2&+=u+Mv4GCgeUrMFEoh#`GPdCb5f%Y^k{5l`Xhm(B*J=0^r7j`cnGk4THU1sx_MDkH%!Qsp{awa*sbrVz&PRAnQZ^7ybaJ_2$zr4^+2#H{Tvh z;bPPQEeOcz##y|O#v_i(?lq!ma3=1PUevWIl~PZ8KJqHp!ZGJW$$W)Ol}o-~KIcT) zF~TJJ6{SBEqCyTcdoSUThli)PL70K;qi4s6ByF1x9QMq zW?8poSm^V&X@U=dX`k*y10EsV;~<8F);L0y)WRZ*BtvQID_PYGUy6O73zBCI8W3P> zt#&$q?RjD=UEW^J>!D?k`9iI?kSz-|ufL*K?6uw?tPn$iaR$HH(1~VsJrU%I5Syvx z4!mXYgJjx~$k~^KmB&1-2cP#55ub#%Ze?O>8 zbyLvhBG1D)f&J2|QK5T-W}^$c2Zh$v=jm0C8k73_U;L4(r{P>DL;a;1!Q0%!TNLpq z@bC_bzz!ZKzu)ii=^$L8buV_Sb2mo#T-n`elxblxWknl!XFo1!p$F6w-Bwmry@6p% zTr;GYVXL4ex%_0%qhVbX0p5OI zI&y>X45_^EDKk9bLP+uEs=#zK;@_sDxF`fD2kUfCVA2D9X8!)qH?*FZWL#G}IVnP@ z!}68aVe#{LX;g(g2JLH_#X7I+(ROa1xW%Qo1taraX{QiQO?mvW5oxUH3M#!H7^$cb zzKXI~6<+0MugKsC_A<#cdYm{5|3zZOWN_W{J-_sBh*@_GO}wwKs3DQBm6!=e*6BM| z=%a7bC0*2d5pd~OFpYK|7#l4x>nH!ZxrWF{#-Da(3FQr?Jr?3#OEM`xHaB=#M8Flr zvzik&#O&$GNi>5f>ohV4=T9s_E^wZf@~xfot$=)H+b}1 z{B^ww9B+oY=Y3>fc%ft;rl7N{G~`Dl75k`OUH_C0=};ho(85RSDSM@`RVMEkXMUiu zy6o@iB2%NdFME#01P!#_8JIz*d}lQ>Q6Nl$YseJf_o^!?#9kNTLZ|+#D>y-&V)XO$ zhsizO4nM}CvCCTtrd!r(QdwAE%@4(*ZqZukN;dw1+(2C*41)=3$|h1hD}2sAnQ zZzT7NYx1;*4ZW=^dRH|}yY*n;mwlvX%-Z44dB#Y*+%fe=MjZna_jYvn;VuoQdLtfq zgKm~a+3})Nn)De!;7qOXf5y%b7Ug|@w%5tnqu6(=ev*5KGqE&0~ zaxfrq%e3Yp^99qnQrZ5sBc&)=7yyR z?$R2pUO>KTjvu5Rm>565D@gXcb3mgYykns5USR$6gTe_R@nKLBA3t(pY{*iUpY|fM zO_Se=c>i45x3M!s-OAH0Mq_mcaWKYls_@YxP-CPdv_7!=UP;x;b|lcLN_G2@&>TZ8 zNg24w*J@ns>Mv&>_Wh%H?r}O(A`9_`<{LwaO_$WT;a1EivgYY{ttz~q;Tks|Adi0J zswYKHJjv|f^5v^fTEaJGY_jD~y=TC?-WfZ`lpiTJO%mFgXE0`Hb5L%)>FvkVJZoCf zeuh*{*42b$QhU5MG28w9-2Ku&(a-U-N%Q_$z2lH88_irvsX5(yoD$x!A&m@T z*xFD52buvoyYW>|C(Xmrfw;sR?j^|a}jAhjzXFjv?j)2w8ofVGm7Oxq2 zO->byacP4dF1-`09y+(3&@^9n_y}=qhpnGYe-d}~MBegC{~GMT1Qm}K+1exK7HiRu ztPGv|^_zcqMhpD2oLV{8LHLBdrjd*5o798cujHHq7`^4ob|MruLE`P(DoEVhV-#2=$1BoRr*KYNK= z$rL|fS-cT!+#AmS0<>-6e_lCt13V2#9VhE`t)<)A8PQtAzRf$#No&+heP`8UkA z1%t_{D7a{%LnuQGUr?7^;QO7uK5Y;rga69(uz0-1U_!S(p&LW>ev7n51iUQa+^;mA zh7s~YCjBIdl6-&gvyx`Ez|ACCd=}t#Gia3#i#Un{mwh|D-;)h0=Qh-lO4Iq*6}Ab) z=1Id;9Hyj570bt?xU45nIkWEbr4&0wd%*%@Ld>^4_UodU;*vlPmqT3Df3?PG@O+Is z!H?wLx4OA}F`7qL57y?|z>kn;+k7E*h{(ie)z#^8u$bA^LofLzz_QzYO3#PQO zLTA&Kq&R*d+`5kpD7)$|*IO-?EtW(TjD4VSX0zD6HV_R+=uWN{VN(_5(NmusTqEv=49{an z{a>Heu%_B`4m5V>mTmTDJ5I%>!{7m(k0}q_dq!TLS_N(g#Q&2zvs(h=T~L>pA)B~0 zAvQa7^$Yt|rnz0}pg4wJK-(u%b#!(T!Q9_U+PfY0Y^_MlZXp}ExS_;(Z+p(l$uS>y z_kghtCe{W8lY_Gq+(fMK6|-AO&EE+`-fD{z}jsa3TxZWMW62AuJ}w;gJ3y%s0xrYkyzXZ$ESMENeq#@>1wk5@1jll`^*&f(yqG9?;2;#HwlM0ZU1 zI~*^#-{_^v54oAbO0R-|_s+^5*T>815GBwCa3H#Et z>J@VGIe0xvbgA_O__5zp8&o}?fvZR2KraDA!&oK8L+6P>88BR_+z#5VKA*!VWQZeZ z08h%M$3DGlMFYw`a~IJu+(b$e)ZN2V?GkbASM9(+n@tuOxoI`XiAR6aneq1&#khySzY%*EahLC+Dj#r-$<@o( zS)f1n+eY)lBL0|@$U2~@Z2JC!Y6$-75tog5>mOI`)d#8Is=c-INx(K$gdu5>h^$+@ zohf>u5waDAyCeMc?PdDjvxggR>Rr49n^59D3Uw0PQ#|7 z1DvwbifYR{os3bJ?l-K!GU@E0wuLHI`E7k>Z*&gMTzXATqAYaw5C;xK7z(&iV+b-^ zPEd}&Y9-I7!lIG={f0gE+ozU}FrgzOeM7RGQ!^?PlUja^ zhe)zHn&f&0_5D1T3N{jQ^rFkx+iWm^sjGdt6t) zTGYH}uZ%j0=?ObfKcZYott5GHt1kMe=TFpYHtkoNF@_9o9m`hRl3m;@^3iXB5vyrp zi+4v9!z(le3=r0H*V^Zd*=-14l0kU+;mB1Z>f6V#3Scl#9~-JZYVo{CKmTNg>9533eLzk?&9 z=GM(ifs3xJfK)-;8IVT01Vyd>Ga*LeVJ`!HmnncDucuJyOh99@(_7iVkq30 zcGV-*S95F}Jk2Av7=pV}?~&TQ+n0Ukdt^`KV(>-Fk2_fBan_XigKcH-Z-*a(e(x-q zU$Uh|)23!q`qk=Ytug1+JzAx`PJOshd^I~mh0bpALMMUofIcZNH6kFx(TTc)_!IHh zMTk%^G;dbKV;kN?$Fk&~O;A_|sJM*;RZk)3{6BIRbST|gywC_dD!#v~ju{t@1+FHe$ z5BSD5pP%fH*%L5m_pAPyjw~B~K623b>GB#Y`{?VY{0OK4{u>vzerF#l)-#l|=(ive zTpodF?DaY3h%shtC+Nrf6(rB{(AXP=q{O9_X}_7s_2dk9YSY7r_V9ZpB&xZ8eq|EW z{5kZd80X$-idvqVB?8|Vw2-f_itCVevYwl+?nblgLB^-~56?=qx3=3g`DY;V4a&2U zasj)IYQ1*DO`G-b=TAh~D`u1Y@b+jFI)#H88l3kuvB|+uMUqb5#91_At+>iQWb@r| zZ`R@y-;5=qWbj`iLIR^8&9r%?1ZdY!{FS=_ehZx%tNtzR?Cc?aF)giUc* z4_LsDqvAFM|4Is*gjb+&8n%^6s7119=2uc4hCoQEr23lVs0Km=P zFaI*CC~PcZ90~Qm0OP5~gNXBbQU;|iGt@NbyJB!iknE!`m)J7(mYWNB#ylxeZ_H4# zgME{SzuGhXIb4q({1xTCvP|-a(ptg7?De0&MbmYu#t!>2S41B}n5VQMH=+(X(LbhP zD3rK~>p1;XDUq6*)J&xWNi5K~yAmTd=N6gH};}gQXJW{o)o5)3X?J&B@Kv zCv+0UUB8}9{47Lt!Rbm3IKHu0l3%}oFCD{L%@3KzjVu5f#fdO|@z(=Lb@gW8}+Qor<9GaL`=`J(cZLA%TB^FI(jQw}XBdOLqK?4CLST)jYka>gEy?yq3 zRQV1+J?5AJ?kT!(JrWUo$suKOn^go5qxpNdKF(q@byd+Ri{%`JRRa3rpC`XDgc*8F zzmTS|ca=`ET2;#UM41K%Qo&zb*}o7V1z4D?CSQ=)8GC+WVq<~{#es&=KULs3Y4o%q zz>}}({gfTwGwp4C#|xB+O@%PxMgmUbi;flMiM@~qZFEs-qe7FEhlwzJ>z#bR=C)p zCw=~+FExYdQ6dnPkt{bZeFGPSxbXh&ylfse$cxK>h4t*5|j`%X?fZjm59gy~I@4v;C`CaWz zqL+6{wq%}Mq>435E1T5|Dd+6n&gw>PYUZ+$ptotG96VUPY-W>UhCW)R_*HKd3(%5z z5+YtA4Om}exZFV)2BR$Rv#5R(t}A+;TzFX=TB*2L)_=_` zn_kGtBy3Q|@azp8s4pO3RXo{jF+kd6sCtJ<;IOJ8`Mx}p?1eO;yi5!?cT=$eYDEzE z#R9*kHoUz+TNok9Y7LLdDejIbv~yUwq|y1=4Cyn_a|9MP7LbK+*z1(`4^mqCas+i* zrx`{%m=T;U&p(;YQzE=>|Ln+Evz8%}Jkthb;`pHW`UZk2WB~8WGbBo0Ur|UfB$v^g zSKMW8&9o0Q?MLjbZ2)F$OVWH7GNBqqZN<`}H#r=W9d<~{Y3ROdCCcXcHwcc=RG;lwttL#S0y!v(6ho}6u2fLizD(KF z?!p~KxymLOJK`*VBtJ99A}$BENV(LK9Fr0PVvcUQ`2kypBCiA#$>Eb6zKvfkK(B+w zCzjZ6v}c~MlAwhIy{E_HZS7*BT_K zRCajKjr~;J%rw;Jr;{aw83KH2r3E-YM$UwY(6*JI;o%z>`JAqHfMNQS7j4ZQ)cQw# zmOjbVdgU{|4LwNtgkpxzeP84XO>R0eH`(z|Z}h$|Dk;a$yJfAElXn-nViu15YjKG^{c7>Hn4TO60!z(YH%G)Co%jokpq)JM~w)$fcE;M-)V z!>wMOC$$hXPoJjriff*q$Yi0_jUYD?djS$Dg z+U>0bRap-JwiQ1q;~xaqu4fZ#vo=v-2)V#4Y+zv%V)>U{k_nP)pW-GIOZU0t;ofx~ zQH0|dFOm^>+*!S3gVsLV^Cjl$fY4PC%~wdnkTi0gu67PSI0dIC-d%k;y|8wjs~r*0 zOudGcWFUkmrc#cm-p?JFmuy_#R!@AyZ{(^WeK5!+Hg`!s5c45bP6#A2}GGMHRk z_Vtlze8nK@ep0i)zpAaTY*Vqm#wb)X#vUX%{Uh4~^CS{A3KaKy`nJEU_HqmV`ndnH z+WY%^9hjoB^LV>hCFGC11J~u+kaC6I#YQb63(NmCXLb_NSj%>+p-c}2JExYd`zCK3 zC_!%?6J56KLtX|)OHG1+0Ww=Wb8wMb>p!+^?u#qD672BAR{!(qXP5xx;_pVUGYyZ% zbzfGLx}g^(=IWM>idub8UOmCqb?%&XUJ6l3<~cNu!%J#Z?|CZ}Gr5l-A_CY#47rd6 zHFwZ=1&U`o58bkf7fuscW(vkHsOY|0^5{uq?3XIVf2CQzxsI9ss1S~yMv_*V0!HLB z@p907_4!GvSf70J#WrIE<8)?_=u+@0e!bC;uSQ{nr$&e_-#O_P>M@3+E9@pkT9goQ z;UGTaPn4jdX#355Tb~6NZ`s0^lh#Jh;cuf>%K%QfT2ob0o-C%egI%3y?^eH}q+jUwk6}!1=xO(BoJ3w?fteR?!#fM{@-;Yi*NGlxg!xA)kp~Dr5PE z0gz+^n+^--p^*mFrrk?lTazRuplIsN{hlW5Fu%N5{Xu0cE(f zMl5z!ogUR(k;^su`wx>R1}V%l@pegqH~r4(BDC3J&Jq994~76ZF_V)WZXmL*<~I?W zm*2;EUIHpVwL;8}B>Moa$xUN{^l>#H>Xv^|q4D6)t#`he7Q){oI<=o5ZEqDin&!ud z=2^ojB*ZaI3R0~<%7hUH4l3VsItVW{qtsZKFj|>UHewvRSp_@56KPv7b<3wy5%1Tt zy+!^SMeVyWik5d^E5gOBDO0vh-dBtGzT4a<+A!7lkq)73p_K#UgRhq-zi3!Pb$j2E zU5#M#J+@?m@OOCYT=k^FuY`?WeL4iihI1MND$SohVnX$ridO_9Zz6CSckpT9IH|Q$ z`+A`>F(NKD+t@PBimxx((j9)o*WBmUH>EWqz1;vNUx>59eGE2$|9EQV7W_9C-Jt`6 zeM;UtMR_&gO8#JQRee^{`hjsplvbi9se+Bf_v_v0iiuXccgOB>L589bd8tC*oZf0_ z6V~jTP5UMsYSJqJc`2p)6pYvLCHy)Q`p~mlxt;oS!2UKUBG&n0-d^FAKsx8-4%g3+ z9Fd1NqDQG>Jg6&Ej?RuhD~`Hu?vhVg`(DRL@~!q5x9yCx>tx`*@E$z|NsqXCUwc69~ zuQTw+kpIA8l8X%KOO(kQZnTdsylt$}yKOS$}X|oO($Nx@Q*+=}VFaB4`%6_@XhXZH(8zacLzYC*r zH^yotom6S;l$C_l`w=uHTnckoAAoFjFzxehIzuBFPck~Zs6E;`I2l1zRp4EMb$>At zE&smPv%J?Mk#doBA{a&tW@!e*5tTvw1rT;3ezn^_Lbu-Tp@7>VyHaaYEt>oKD=n(y)F5qxI^8DK`>ahsLD@xXln{U=06iq{?Bl|ejT@$k|??L0> z^JJ#!cV|HLH_Ub}2^`KxPNFT(v`b(4c!!swl=|kT_gAPkw0;Tm{R(*x=Er~BrqTYI z4*$b#S`);v!)AZC9S7UeA9p}M({R{3r53U*&b)0;1Tl z&r5U8XM|Q+TnESv^!7C$T>8l#&)4K(OsDy9a||^dNz$7xe1cGh5-E@L(m)=od`GY+cl9`MR#1a@|jZ0eF zS!*Q2n>KTzOe)Zrt8S%OY}pj5ep(IEVz?w}=J9iBcsx-i z?x&x@DQCGbIo?HAtU$;u2mQM58$^lTM9?^@ecc_EbGMSBHCNliv}KF`mePHMjy4sV z7VkPogqfz5%@V^d8(#9!Y^+Cm;KlOya6)Fg5DQXFn>qW21@3y~AwJtz=cr{#=gzjb zR5s`Ij3D;pCB&5DeSP27B3B#fBUQPw9D6s4X}S}i#3hh6!Xe=N!ns3ZUxKts^2495 z*s1<+!4w4a@c+aL2ua{p!bOjO95^7O5-0Eh@!>+`3++V4diEZf$KAJL_h@B&uTD^U zi%=vsXS6!yqg&9OVW*#-afkT6 z0%+-KS%+wK!e*bi{}*F;AF)%y)qq?+5x!r^+0rmXmU+6zAP45EZ^?Y_;|JEsi>=e5 zpoV}3V;YR?pxbjD+?IC2@%=j)+C5>f0%O1(+!O#IQKx%Od@IDQ!PNE2~QM2P;=y zJ(kZHmeOe(YH%biSfo!F=3x{D=jXZD+7BK6KIO%qnxEhLR#}Oy_cfCYyA6dt3De59 zfv(Wfef^o5_r8VyP910f^t?9jV@f`Xrs{aosT*k+iTN3gDz`)LeVvCH6w}P==Ut9| zE>=5pe#UROp36QG&#fzNt2YwVRCsfAJn^Nps`AW}f*%yWmlnLT+fEX?LTtu$f{So`GJ=Vo&ym&}Re>vM(Lb6w?Vz3{nqEsz@%avoPNjHKF`QBjR)(f^dO> zmEU?#w79mMI0tH10oN`3V8zLww-%@f|7iXsqd`;qPaGS=-_zy4;@JMC2`$V3rD zu;^3QaFQP={D5bSIcQ1L_E*LU&@fzN33-Z1HjC>Gy~+Ktm4D)wAV z&n${}NJU}B>A3xAN7x+8^o?VeeMS;nr(NdvH8YA9sbXIY3=LAcr|4p9@^ya@qx5t1 zC53J_UDtC|MPiar&dCRXF|xg+>NM@*No&wEdqmLywc(iuEgGfqJ>L99f}^U~qtT5a zsTTqQ4~-hf3lTw9#oZWj%b|*&4ZcNVNs{LJy{`3iIgoGeI|OwqY_K~f<@5QKP<$qW z@oto=3I@7;!Ne}xSoAdlDS#W)3j=>DG3hP4xV-h!9Ow*`Br2C2K5vNVPYFaTt9sLa zx|?i$>B!Amj@7onk{ng$9u5Z6Tc*IXbZg7;r~PS%*SD{d zU2LGNA=m9W>>Nf|XH{`IUmHfs5qcF56rrQ_4~{;j59DyFP_@X}A?-$2!&iKlYuA@l z{svAT^R*$3(%g^L98sZ1n}Fr=g{QHz;vY#UmdO9q2$^88e>*>qATTcS-&frXMLQO$&8?jBN2IIR$g2I}LEtz6jBmv3z%0GD-$446tzm!70ELT%(3` zGT8UN;B!qEOqu@&0ey$NKB^`hI1SmWV{z~gt&``E6nH>ITn+dt)ACxVhr0EEy$N+b ztdRK^@%<$_s9Z(U1ro7sRB@SRe9!#OB=@&Ht=)=KA1)oQSmcM3gqzA1E;qg94cwV? z&h`Ac!p{S{13CyHiPJW`Wf717`tMZr6WJ%jl(?bAbFmT?s!X5I@i5adZpH#4`3 zdf?3;cm;qJ3kNEUYs_CL+2kGb1a5}Hq;Dr+L=0&?QSqNs8C+oz-|S_yiu^GE3?z z3U9GmQzgi^GGH6M?bCjr9Hljb5hWLB^Wg_RA}%*z3CPQg^bY&wo5-szEba{A5Mc6t zHDct=Fw{@qLaV4EOvNFV*%rPkwtDl**!I^S?xg*G^Pn9UHT@YCn^@*hVc4|nsI*%Z*ftp+lQ8M}1H zJT%h^w7mbmhd%uM#97lvJ(u`64vr)Wwrm<{gFa~Abdzc#*m--{bc4v-qdUf8IV8GF zLAXIR5lTRkyEekm&2)eLS+W`zCCEru*^Ddgd}>ZiZ}j0_(zrx~kroZPKkyUT;~+N) zr!XwxWY5)4k0qF?wYi1cvO*Z@pG9DaQeqMLzqZh94+K=V6hBZykrecBN}k)4qaxmZ zr!QAGfj{R(M7q69e-Mygt10mE&Y!i~|B&1@gL1bzEa&>DQOtmJB2$Ocxr95P=s7g&s*P40l<)E1U`LwvM z_+z_ED&O(GNX3tDOL$3sv7<{CVM>v}rJ_zcNxV06r|%Sulz`x*^YI5M(U0Yj)4cag zIuOU7%sPA-AsPY>@&N4=P8cFiD9oZu9}J{OP}FUSQwyF zaJH>-0YD+MI9$@CAqm3kon=j14zy8@dgpDCN?Hyq@d0UdA8H?t4+JF*vJ@{sr$$9w zgWB@CKmBNE*U8fv$Y%FDEt*4_sQ6K1{0;!zaGOhI%_oZUUwNA3D~CV911)7Y!b_7D9h`eno6npRGnLy zCScNk`sqZ#6)0Cs0<&RjT5GAG^G=K==PZuo*_TR`jm?BxG7WoZW&KHZe=3z1XQ`+r zeoSiu*HKv`p=7cqk8LBRW^mjVVOc+XG=|!p=wz%T-+wK?KZua>CGCC^6>IcC&hovhtvMktkmayfb-#V_Y z-on&dv?^$d_aO+adrChFRv2ZnMnVWr72{8Q(1Ih0LFww@p7E1Ri$l6+9A%ym;u<+h z8sE@$s&a&GgrOSwy`IQYgF_;EIXPn)hiOO{Y#jT1+3eX}@`z{vAC3Ok=e9Ot*eGl@ zV!C_5MbYAb8S|7yXuK0$9m46h{=UlfXb{tw7_;Cr^zbb|-v{m}Y&(xH_$(Ke<${3~ zUw?`MS)n3$R7_ny)EViJUdOgspy{kV12f+$$nnu)#D5$e^4sN~7@&kdi@pEnVAgQ_ z;a=&&4A0oKB(|d?A%abuV<|)nqMpg3K%?WsZHJz0x%yF7H+aoI!mXcH+l!iqNET1K zE}Dvs6lUp{4OZ9;+==R4ClZ^C&N2J1~8AEz@AzLK{|IQkY1$8B*UNrO;$*C1vT z!+MISk-@|)+^T{|KvDJ_!uf2>KbZJ_&acG-Ho+vsmt>AB%?!S_4J)H63OquvPiB=x zg=UH)Pny0Ze`~3Vy2-1DdgH?}?EYv&1?Weg+lI$v8V3tBjyTs8242 z9SSzE4O$Oz=pX34hn7UGfaF~$Dg#uY;)nUw;Aq_FA`PkL%*rX6YiQFIGCr?hB`xhz za<-A0j+(#u?-HC7c+)Hdda1GsvFAcW*$zTttSm=|`GKdP=dRkg-PF%FxhPPW7-5zz z36NB?H_U76J2D@}wv~KL0K7a^N0?t9M^#o{SZ-P}NNJNA(x-*uXHl_!lQru@V|DR5 ztt)zeCoFc_T*=*B4*A175MYD`y4pfwZT`UT|38;}xqG6A4l0g)!9KH@=d`g^JgVE( zjX^|A4d2mBCWrI^^C(u9FI)tYawNHBVIUaNu%&`=>gwlOh=X2ZLU4}mgVh{@l>K;T!R)b!CE97lLoFrF%8;_+CiD@QC!Jjg;(@sT_OvEY?!;yZP#H$7=9T0)xE7Laew6e4N`1k7RdG+b@Xi% z?0X_W8+EhmaB8`MkZCeA&KxU+r}A4en^obUD`GcU4y*i?>zSe289!Mu2@Nf>GBb^+-P-~v+1Zk0Kww_$_ZO^^-LEjbQe;@@9a`#yx?^0}lw-M4 zj^U3)J6CL=Gsj2MzY9vbm-c4C*Rielz#%Zc)xyK31z*L^px5RWrc+6#sZl3s>A>BQ zP8A8kRe_j!#w3#X-Y-&e`AXJCpd2G46Hhfpn%Vo_8xrEP?1B0^-WA`g3sDcaX64f` z^wZFJ0gva<#n_=c^cm@_jRq>PJj+&Dh4~CB;88)SSa6a+i;b|r&GXEGZn-oBtZ=oHA`jjtx{Y!* zfqsakQPOEfiVIi^e|K37uZE*!+Z^dU9Xm`Xm&YX6fQ`AIevM%U437}$_bOvn-yAoM*WY4`}q{+m*jnwo#kze=0j)X(p^CZ5-<0R$_9(PH2G zQk-Z-SX7@3l^lL9tB3+=0`3V49;N78v?uO18l6n2l%zGQh)Z4Q6tRM>h3=@>9Qvz0K?`xS81L6= z|6W4==RMUQ`1*9X0x;rN7qHR(B=P`>50N*F)+9*l-J`|kl(4p4KIo(L`gL~xkd(M0nr{{Q;2)ozr?4P=kE$+L2NCe#&D@?W2}HkCgb+b0ifqUpbAaeS&Dz zD5k7}SE#OtZkLrAcIa*a3sa&&xcr9k!m-`kxO`?LfU`c=TmZjWT!+NbnZ&Dj`X`o> za(av;PE(U}+eg`8Dsw8J7;P5z#25w~(i7RCW1_Uzw5jf=IJ|fGBh4)B-7&OLyDbJs zra}OkslSe#%L?~Wz3wO0Hv{aSd@=fnR}8xRC9_7pe>4UedM#tfLF)Q5!9LaRFj>cc z_DLxYgiPb%io>LDki4KD0W=`L5?*!h@t>~_AO$HXO;x4jZir|LGfZxpwEtPdn@Rq6 zxS~HXIC_@&m)s9)c%-%%SDVwm>(u|WkVy$;*Z0Azx5({6*$ZlRyxB<=XRJ*(B6^q1 zdJwqV33iD<$*uRY_Cu|zjs$>&uUDdSc^b7E`v6cqTk0PJ8&uQ?9FG7hD^x2=KtQlD zH%-oXJ9YFX9a(yCjK_Sy|43JoN8SRbTRuJw8_Yj|d_){Zr71O#FNT`;5ei%5E%w z8b#%7L?W~1G{&4s-;?&CXP9G<3r@;G9evTJppI4U4c?(Kp!Y$=Xsx*GUcH?-{euVv z`19&MIg+YY2Z9&eL*~;AJ+J02vt~eTk01u}CXA@AoJ5dBg$x==YwvJpU3JUq&%zSL zJEU1aKH*_&52pwXBh)*SdfoQf%3FuR4&L{K$oLUZ@YLl3BC)=`>(2Whrsh#9!dGyd z`e3wR73Sx87B}jmmCVEChTu8J4KKs-t{WqtE*~{1DeavZ9Z(G>+i}tB{J5L>rT6<0 zPewIRM0E}Vp#j5lAmyAIh>Pcff;>nIqLE))fw)?Z0nY!7qfYdHRA=^VEdE#wf738} zVdDSY$A`l)E^4V?qk@t=**3sJ`Rn#ZBZnB@fHe}g!9OG(IxH@jw4Vz)GT&u~Q|e>B z7p_J!o>}dCp$DJhG=ysf*>MWsFXtS(n6OxLN5IM?Gsf>cwoF$*`^iRB;%TCo*kJw& z%Zv>I+XoB=Y5A_oRUCpp&8QC}a(*Di@Mn0+n^08zPOZ|BY{$Vun+{cRJrqM1?--xogl+-<(xnx>a%hu1sRH09xs1dp!_y4im2 zuD$TI{MeW5_|vJjumJJrN8Ga{DsU|7K($`*(`P_`uCG$)JmK@D+}WN{aNnqlnY))WDK4?A93C68SRinr(Jf}WN8 z-1)(PhCZy{Ie~})yqRxHQouObj&j8RIe+^C-eFr7(R$m9DI zU(PnTK1eU^eA>wqW*i!3A#G-+D|!Sp6umNUkqPuhm%X(N{U%K18w3}@(MdlN>B(w0 z!ZH4%#2hmmC@IJX)KB_KqvGkgoJ=5)G9L>XzcP?`0^jg^Vix{zcbDvfNGGHEcktc5nm|JSI36$m1We&XcH z+_ESFu8CU@KAN2u=JA(q+exskKBBz0ARh#L{V#0m3Qow^GnT(NQDo)l7bYxI_1UmD z4hw#A$uislawP+DsX!vvcgC#_8?m%u^rz+KbeIJ+41 zIFceT^(}CVO-4?gwa7I{1AKIb;`N$+o~l69bFCA9JZRxD1ES0AO*M{pf$sfx)_N@_ z7_#i}_bJ|$kc%6Jv@4@wWwEuZkx#d50G5zLgdrtl<%Lm`LcC?I;wunT$NS&K_~!Pt zsrrPMo@_T`u%}4sVT`P%#EY>b2xeL&Y+GsUVP;5&q2#@&x2JL;F#h}-lWhrKQghJe z;IRfbRo^tjRaPWx6{_08#ItJW5^K~ytY<(rvAuH{>U4bbpDzDZqoGde*e@9NExC%t zF=L!@o?x8#R8}p%Xs?HhB{A4TwtiXj)ve%0xF=)7Uu$10lgY`TSqnSg%a|1*sC!b- zY;V!`8^NM)ZP35g+#-GrYp!r6W6X>DmC=F9JCp%njb>v1ej4y&33l5cJhDHVGzzp-GopFX2V5 z`q@#u1W7kEWo2*jDbh#CkDn8oM@PG;Jiw9vP45|f0q=XSV>^RpkU10kkczYmVobFk zjvS~_24==syf#A#;&iyj56w@WlXMufxA@L8#ko@#&%VCjZt*SO*!*xV6hc7rAaMpw>EKH|~JxbN`!_D*Xy@NoLrs?22Y%V$~ zdmJ`=#UjaMp7hcH$yj1|)+Il%OAexxFDk1)9A0};iTPT9=iqE(Bray+L0Q|c!hNv@ z7fvM~9|Z>)#mUkA&UTI(v_hc4(KBI&sySLabGY`8#zoYhKL4+P7Epa@%ex{fIRPb^>hS_)R9Xp$!_Qw?fECqKfx!@-pxs|UF!oUul4h;FNPtzNd(HbHFwhYy5&Ri<2De3XDTHRXUoTFlg&o6Y9(I9DeR6N~S;tFleTg5%I@xA+~N-B}K&%$%crOd6=q-l|8v-XeT;UFW+!k~q zwFwIRnT+dS!lYGP=N0CLvQy)Px9el@KeU_t;ds`m{t-YFzSZw)i%3BC7+|a97P<3X z=gLVBp6Gj}LN44U{BMd7HP|8>iuIgb85B$Bl`ZGc)>@)qv6PNI?pC}nu6t%{288yE z2AMEUfnJ_(eS&t)G3Qw?*QplQ2Cy0Ep(jg#`roK5s3Dc z&hfUJ+Zuy?Nk^Ijv3mhfpwnQ$a3!J#rWaXH+k6%zCYgM9*9zD%vuhef8v@)XC)C-o zCwkS##^N`(V(V*_(32W2A~d6KBPKyU(Bg^N?bo(8bUpbcLhLT}!K8gBwii=C(`elI z3nn76#%6&gJt;zf*^S(JrCiV6P}hQ|u1-#^lq>9*7m4m-+#rX#&A|1Z z$17e++k5thS8H>ALDqgVJAt-+ViJUmlTj=AGVn9Jiwam51BLzi4^7qjpR=|V+4;u` z=4g_E4R()#3xrNnL>O%UGC`Vz3@C(^ED~qw=tM7GA4K!d)BVdufWp#xc`k$YctCEL zl`BJdDDu^|!}%?iHu1w*{asU4!|CDy;2Mx><1SNsJ<6yyGEAt?WIboR*07xK8k*A< zz|{(BZHw-k;jxK6BInR_8Gu>A@x^(=X7A}0T13h5J_vlb5Pw(%CYQgo1aPZ8PfF49 zkl|$H8%!#&YDR^7YH-;ZizsMO+)~%pD$UxsyEFWJ-_l-aYepVviyc}q9RH#ucL|r^ zGfJ4R5#aVW`@i`+`ZGSF+wEle>uWd}0)I%_sPM2jB1e}uqvo*yC1+?De(`M~M%6Mo zSXP~;q7o+GTBBc&+&U?&Ck;`~nI&9!8~JQ(w9Y zOQl#7)Lc%BaK*QaklL;aVi1&?^M=8mxlFG#7qX<8A0}IE^qUvCjN|!@leomhuY;i* zvF|U{z>4H|xfQX+-I48TZW>CbF=3vn42AYqyHF>R;mhJV=m*>-1W_X^L2*xWH0@+C zlRy20q(|tMd#?0|oM)hamo{6sF*nFM0vx=T7li+OrkyVgwhpQlqQd0%s>B}$B-g@3 zi@k+-Ik=s>u*v}HMRb8`1Uu*>Z{+@7K6nn;e zWmYOl(1I{nH#~#D1uZ(eGYp?x7;8-3MF{mTYphbwpvMV%F2`o?x3BnxiKG*2Gltwh zEV38sF1CU+=P6}Q^(30d4>mPN8x99jiA@E+3Z)T`pLt?&E2f-S)4`6FAs!3Fj(p^o zzZ9_HD$^c*E>Ts-OdX8(7i9}->Ga36-&{}zAum%QIowYWzQq0dmD%}`3d{;j?DDPA zUo;^A5N&g~X??`t&uv)|mn*=W`Y3HfUb zt_fGF-s-#$Uqh+HgG2OP=GJoIS=rN{3Qo`871p+XAu8P{NGGpI@|R!9;V zpWo8=xU_?%DJGLjGURPn_4?}^>Xi$ST-O_{2Du9~*+heN&PFPuEji{*DL>R7_OCIChU45vd*S;v4(`Mno4x$U&R;*{JYWWbEm@mvTAtRo~?lU8GOr7};Zre2gI zX*HH_ksX>YTw~0_-Yf4St3bbl>O+;*-lBssDq2)mfhs@$wfeA zWHI%zo8Q%VftFf=);#rk@VV{F^4YJB-)6*J`M**|)IIjsT>VTf+g=VphN*SHo zlkz34zBoI;Sv7v@>)M##5h`t~!Pa+tGSe@U8NbkR@rSO)YA_)Ijzg%=R8hOYRC4N=86BlR zuVICPfBj_8;SFd;CnBzzqIhpw-!d;HFq+@tI)`Q5Eh`~{gyogscZu-~BEcOyTtORj zg^C0m>1&`iPMic?oN}+1u?0qc9j7 zsA{;ApHHu-spB8%7~o*m+^i<=dJt!3-qjaVCn)som56yryZqKtt%ngfLzWibeHSdY zX?1dbjGpXvel`d7I-~9W0O(hhQ21HkBx&D7%#WfCH9jA^fb~9eH;KksBUl3*`s}zF zUe<2IU(HO^i(i79aW0@7Sf_d2l`NDFCW%TB3yDW5ZBSO*%Mccn z_of_siqh%5P=t9~KY6K#e(ks8lvAw67|v zV@$k86+DYeo#3Evqcrk4hfT4+TA(k8?4ZeDrkWvXAA9DGMSia&E!=3o$NHenG%WDUa6v-pTcJz+zjsiL}f^kFGw3wTVA9c^$C5=QZu_goT zQDjOhMScEDGCB>%Eqks}BE})k#&zesvs87GLbdHb67QH@p?}jT2On&X;tSsz6O1bp z(6pj9OD6FsEhaYq$KHS9#OB|t5Q9TO2Vpaa%EiUG2CW7B&;U?fZgc&|{Q4g&4Qwrw zDe>k2a!#e8u2M5-%(JX-Q&%as$?(YzhbW(sa$A8~Vf(XlGlOStPXo)|^{M-sUJe=r zdg8f3_F`a@#Q+&=kLcKA3T}44mz(TcsAB?dE(gUV>?DnZ_$UU%FjF=6jWA7ky^K#P zAN_yYyw$b*DSZE@3IK&8nw}OhKletQbF1{*Lwiww88Qb)8|-6U95t>@$!I)He9mj2 zwV(lspwG4I<<-zAFTCH7n}2iH2^T;j=g53YFHxV3)kwr(m;`bfO4uS8;B~gnSTID} z^EF^s3A73yz99|Q?w$jWM#xu2ZGkcc*e1o!FE-(VAVd=0t!z|CSn|0qT&Zv!#-QWgZLg(Z)Wme6eeTBfy>#V-%+7f1CW ztfY4bVCNDZ6=`ET+4WJw^JHQclW#lLUz2<5PK&OdT@}$u!%(BCP7?;e2 zi%Bk$PY2EmxaC62rD!@eqAuc1{~^u7Y3mIPiPwS^nbQQsuVMb@-T=p z$zgE$j{)vKzJ9=XSkIK7DJvv7;0TMTV5GA+nUPwKY}2)x|JARv1nNZ}$;h`&+Ob=x zDT21SJKi2G@WyeKX}#ndPP6u>Xx*k^v+%mCi5$^%vl zzUL|u-agBbVL4=5GZ*pYFJHO4YaW|XGd@kwEKS8k%WuigWuTge5RpojZ)%IvBEvqK z&bYk5LGzwWIJ0OpmZvk_iv5 z0?yMCuk)h;nfe$_$r$m(x5bM&COJxd8lMfkVzZg-P|d8(IlFNJnfHL;?ZKMg8;SJR zJJV%TspG{T(1&^$x{GqAEAMP~np{69T-q(m1Lo0r9+UDg))zqPo>IQy7ql_cwsCOY z9%vRA#3=KVmNS>FIUilZ_QKB<^ahd`!*3yTIT%`keHxse zkqh6~SmT+U-nqoY<g4qp7d{S3TKbwTaFGJq_PdxxQR`v0c0#9I8|?HVfS-onkAIy zh4$eExeJ}M&Y-@NYC~LTvoozkqT+qB)f3SJ#Kr)k2ebSe75+JB?ccXZev2`U#rbbU z!lqS>N@%1KCO#SWY2wPlmE@xs%LA<$(#E5UDy4c35x>q&3!}bB%Nd9BKI-%OYRF0_uv`ErY9P<)4k-bOMbOK)r32@%qP;UOGz5`a!*2FZIR zp{l~pn`CC64xg4xux6)=w~7jcKH}%-ui*Fwp=o>)ntHj)igoB^)J}-B8gZ8Koi-s* z66?vjJW9m1pLhCCCjS{3q#K~)pLR7xCLHcZxKT&l+TJ0=%_%kpzIi%sHF4Dr#o>|3 zpsK1;NVF*k9WN@^D7+s4Q|^a21l=94^t~;ur1DX>nBkU!Xav zkcL*(fF+5(w884A`vhfG1y5sUQRN`mU{qAn@Eq-y#BpDoylNCA8cSa_Ri)rQ0Zx!Z zgF`axIuvC4eq?h-&h9I{8xZ9RtI0G}KAk$ErOwX;e4iVD8`EXVCS$7?P`v-WqA-ZY z=^8ZX$@bmDn4_o^s~)FX_@Aw$sLLud)leMP!14{JoMrVIT8Lypkf!M)n~<7{am8sT zl8*pV>{40GNJZ0QVrwl^NNg0Y8YqEab4j|M4q2>9lbGIo~@5lHXv*551 zV<>Gt+KgR0aq3#4zjQO+Qb-l5kKWejp{E-3ls2BWA!rtP-Vfg^h6nw0f02$R)b`F#e(bdaN6#y*`@S?irPZ;+_;&*y&LIWWpoQx! zr4i3nH7FlAKCRIUuR&_>|3!TEf#QIbIXZt>btviR8#6aA^S~i_$bINYd?1_Zw|Teg z76~$i;u&?7m}EMc*xK{R@;l=GLV@uzg=aAa)eag&X)Wg=ig?AX)SBVv#>=sW}W6O0e z6L(JvET4BJNop!Fiyf+twmEj%t2s@GR9O10Kpl0c$_lo8jb=l9qH?VChJ zuYA0;x2&(Fibt{1Q7wn z%zuF?{HIzig7$RipGviK?f)3RF(Zz$8LD0ak7eEy0@;1H;visgA50Vg*LXXJQ zC^MVn^uE_6wf?I}13sZr?>A?d&akq(2>Qzam1F-?y(&y;Q9p_EgCu4N_@7$MCu3@Z z+1l`ubO&udQFp*-*<)SMIHNqy*mfU*bTjVd1vP@%KB#+d$>ewMql@AU%0-M=&mhOM z3dV3j?>Bk4*c}zH&bSQ49hr&!d1&xKb{x)Bc0)r+%;6< z=|?Bm5fZ>|R{vGmOupjz)s-3IBJ3({BBmIk7@2^KQYll{lazH;#&X8H?4vCuI5P)#{~a`zN`ew+J3`8k(NW ztj<-|9<~PwNs;^#Vl!)+s}%@Oj&r_}cB?NoZ-sEj!3@+Y@B{mTIxdIqEH5;&^xBfU zF>|D-NVtr-kvD8tYXQ?{%R)R`l*`5uwrqYM2WEv-PAqZGObnKp)qZ^+sL}w(nZN6& zN+p9B?hmik%CpH93So`QX!F6Y|A0RJ#dxX}+hp$VFGBV(EUO3pAC`Z^*fRk@y7S;I zp~R~0K!mgpURZe-Xe7hnWn`u&>5kFJ)f{kb4`kqp#ruJBw;&5u=D%ai_22kAGI0fyrz*W=sBxy4<3RY z*-&!48h$D9ctgg0cO#-(f+H7W-T`N;ibizX6fFEavW>rJ&)VU4gYZCZH7O!1 z(zd_pX|t&kG0{0i+w||#7kRTG43yFJ2I`$*pNVYk_HU6~RZ-soD_BQ=gii)vv@M)+ z>S-NVF%tMVdKl3Ph0t#kka9Z1zcD9oEWGAjYX3GKlg*(5#@qZ+Nf-FLkL})2wO@;j zO%Rx+q0wU!JGAI%UC(>`xkuFW8x28X~~3%Y{jpS&`m@M2WB4@$7pt79F^ALYNiS)i;B zdpJ~7v^b@v%s#N3 z{;|R4Vk@phf)N)uvgk6%v=zvUL&C*Z-Sp#H^j%ZmMR&U;dSAJA-Z3O$Rfu6VbRX?| zjZM}wudnb;62a3DCpNLfNh30y!g8}0ZyI+N+{<$ds$})iVMgEd+wwc`hJ)vdgf6ZAiL4;}I7ncBBWm-am zN`$yiQn;kQk+wP&2}~brg;slPUQfXb{GBm!ZN*Z)6U-%HK;x(y0DNFmriyzqQ3V>c z$ffhLW{SM+K+xokg+6CUpK>lg#^BYd?|m9I9H~yL~_!p zlS?Kj|H@W_n1p37IQ%QLZEVjv-EVUQJ>%>;mE>nnA}uqQ9W#65wz7IZO4tPdf>@WF0N!^W4&h;S{MTY$B?vo9crYv$0MRvx3&v-S$R03HD zmgRr9RUc<*LvCT`)HF&bDnLVst;O#6wZkj7Fvhc>P@lhxIjQ#3I}d8U&+nfCn2WGS z7YrWi%JMxawGwfvv_>vTF_wIQ-n;}!ed?w~FlHEAYj>=Jwm{sHwoX@9)uD(Q zMtaBJ-mVSXJ`{=p=OhCq)^tYy)rB=f2vvTChQkzc$#pOup3Q?ab|Q{|4{2$f;5C;K zlEDUstFfBOD-^049*^%N!K+NN??tHWRiQ{VupmUU1HLx;0rj`euB{Kgj}E?>i6(8Vdpu_9+#DVVk274(C`UCk9aCdl zxK^-!rYnkXR11Z0*g-? zG_n#k((L>P{_ z{A1~pJmqg zH!T?u??!*MYgic?VoOgB$$#{w@mM|I?nI)wvmkg11Ue%cXs03cwlblF%2o(vk<2?a zx8Ro+N%uJBO1-8XK-i@XIwGe`viaQxLHhXP<%V&cq}YPSgrnpKkdn?mEQ(T_u>&7Q z7DK<jKu5oGYKDA^tph+3M+n2eYk1eGQyN=Z?K{FI3Yd}g!L`U;CK|Nm47sY@s}H; zx?nBCRy<}^1_}ZbK@`$AWP`1;!#AIU$UlA}`8HHoo-Mjl8GD^K4SPBNLwGfgfvw>7 zQ~dH*+^$q_PpYwj3ecA#u6=T%3zllOa>n= z{p8rIKNWcNBsfHV+NWl$W-8l`%o{5G9!9v72o2Aek4>7EZ5WG8VCvakrRzIes-U{h zdOEVA$viJbrsGqH3%d6{X+F^?qMI?anRhr6JPB(OUU7K8Q`zXK*T{rfW+nH~jKT*|%8DJjVJH4}!!s@PRfB&8f>saXg)VdSaw|ZQe zD|}b={MXvbfp3kCWVdjHkb}c{)R-h;7Yh1%#S3mR+}>@tSpvh{?`zBnr;C;5rXi12?h-{!AX_o@sdsmhf{ixR^Yvzpgp~ zC%FAb&ycT9_f-R-FwyPFJCsT|i3qEQ{BjRh3oDV5t@MN%H;o(Q`j%`qmt{4Ro7PkN z%2Jiao3!oi6itNZGwMavS%m#w@tc!s-T4u38hvgu-{D3^w&61uc%^rkRhxH|Ue^%4Dj8m!%y; zgw>~pl3H$Qi7^Zo?h=a$>e?e{+x%Uow0;lk3iPc`JlS4*!!L%%@Jy^0jj=>OSM?;# z4c`z>Syj2aklO=Fh{=*0)YKOjkf(@WyX{Obc;itw+2iWX|=ni2Zv) zv`j3jhDy6k<*6h{+IXom5)xf{i}bc^_TJ)y%PPZ}zQB;Pa?_X$_7xfx`g^sQ?=(?A z4dcm+Lz~N86BUDa6XIi@5-q&ST$r~x1X^f{Q{s;S8@uR>t9AXJrag5}@x?L<{9G&R zzFWqE%drbpkiTCqt1<*G5gH9o~q%5%T4*s4>>EPHx^%!zVd zOR;5FZChA}jo}kw0e(NO*Qz>XP3p+puV8xpeZz7uZIForP#WPFuRha_aEg8GAya}E zi*X|PMh$0mxL0rEzoDrrto$vgyyL8*Ff#>3{ilB87L}gf+!z^OjvAxw3=si889d_QHw=9z0HK zyr?5TTfu@tn(AMq$CY?^iJcUR-RN3)X9V15)(2r#cC57@T%g*;<|@2AsvP!`hRkB< zm{WLfkNE}E)RZDR0#HD{$hDf^tO)Rjbu3v#s_Vud_C-RPn8)jczFM{|&+@de3S@}= z(n%GVh0n=7%|^cq6(b#sh@a>$*{w&B#vb0UlrhuzbeLl*A#c?XHIh?;oRSS*!9BGK zcZ@~%wC7ZsN)g2T9(4mm1A7UGdFY+_m{yK{ zoB18pzn@j!t!VV+q6unT1Utq#|8%66xoUuiYTpe_5Uc-4aMaMalhOq6h-G&`}M>;Qed1MlC_&Axjel1|V zZH2<*MM~<`>6rI7zn-iku3yN+A}7FwSbuBkB(XagDopghgy5&atX~BWkN4<#R-vlK ztHth#_x5Zw1+h0-RFi14{K8WutdFX>MD9=|PKJ2c$%`p}jus#EDbjJ3i5l%+8|eEJ ziecAM7Ra&lmhKXh%tk{4gCwFO)G&>P9xj%Gjw>6j%-I0(an?7I5i|p5HFX9ss2{xG z5V#wCR%yn!xIFhiR=-#=`S-P~SfE#BsniPo5Pw;3vFr2ZmB?o* zdhX1LulT9@U(8RrmfyD7n47TLxG5l0(Br(;&}bz@*TV=FCq;)S0e4}Q`g>?z{Padz zm@eEd(xp!L%jf9~{AGCexfU8OP_tjtd$GP9+pz$n?b^UG2N0nOUe9I2cueGzaPK3T zg4rX@ee`0Zl4ax4!8&G)r9mHby&Yh=Zots-Fq(E&{_Dcpk4`T`vwz4@BqSnNp`bUi z!OKgMovUti(6UG^2kzZ~5*%B*a71mxEUhlhmYQapC%PG$(=U+!V}5&Gv~$1O)J^j2 z>q*n8U*?zNqT7cDxEF_InC_p7nv;XNdLYa>c&L}G0gccR@#YZJ3ScWoJ!Nj}cJ z@Usd9t@uRyB63vO)!m(RK5}aFO?iFgbbMMAsjD;b*Q=Fo%;`b$Swi|h#Gd*tRl+Oz zFPs@lKBlLK>ed>zlM$&l(7(cS8@`!sra^%A8c=4ncD31%${`Ah83nf0PNTs*^8-d2}boGI@pW6dgP78Rz@$&whc?_#DJ|X}F`mw0&RUaoX#tPW zLzh||eT~zM)2#DJuC!*U6?MHe7SP8z|1`LwN_!}(6$XMAuOA4h<|vdt0H$9{-G5-X z573_%FYKN|)I!AcF)Em|kI0!A>^PP1pLC)ib^eB+8$K^^?&L=f=m5F>L7c#_6N0_U z<7J@)j^Rxxb;?nv-o!lp8~?YRlh6EOG#{@kCDibwU0A#&RQzF|j~b-DLdud?q@`c} zezZ22Y@ym9^Q{9I=fHMZO?6NjVz_zNV{&S$t1bkT-BiYtXDw>Z&1QaIL)Vr>=S9c4 zqvlk1q`Lkr+8e|9(fao=B12CY6+QTRJtq&xt`Isr9(VB%YT(2>plHB9uX;S8OPJ79 zosDvEB)DL9VWBU#VXr-I);s%BN!4t!v;8H$s2c7U=YVemUm^?M`%Mp$|~p#%geHf@|3JeVK5Q?4Ww===3NGB6r> z@@2`+SyS;L2+g#o6ucst_8ANC@1$jao-|p=;{Qz7kXV*1R)A-^}p6@iZeBX{eP zUc@Y6TvMgzvkY(Pf~g#1O0{R@FlHr`vkh|z7~=!gWN=gv7$K%iiwL{-D<1rbyLtj(sZ!s~*B7jZ&vJXb zp;s*FIyaE_6&@MapH;~h_UWY;s8(?CbwI>_{BmT4A#f^0|-by>$r%X=p zADWrS!&f62(H=M4o1gaB59|1j%$wzbU&kRp~Qd<|Hl(~I&0RFiP{#CNxnW4 z7r~zW)4^gC+>`$9QVrMT!^39tOQC12Z@(;W*Ck8Or$7%y2r)s{hB3^o>vqbIg6SyT zJd;iBV9cX{VD-k;R(Z>}58vy0Qd%B*eUOU4w zLbOo?9*u|NYt)B9@Mxzo2gc`(!1&z4q|dHEP{_JMM$JXTq4O5kl&ps&rU$j2UC z+wUz~xoI%KJ`+G4Q1l8{VCfz1^=w#%)p@;uULONVnjXNUd3foK^W$7pys+VCO)guo zq{zu)pr*q+C~0+;vCBxhW@Y>1?5MGf<^IE>t0wQ`s-354ETY)YAqDJ-q|N zHd8B!SVgKs6BFJpIlo7vog07N+py!3;w?S*S3Y*9L@FOj3*J*6HPBaKV!o{0N)A~` zSs6X5pZgx;r!FQB(epyUPiqL`DjjIQKj;W;Ocpj&{grI3=vq0og1TGa~xs)N(w35>pz z8}6`>$Ly}hCnwMM(f=~gejbDUSL5Wh8py=pul(`Vvt@hszplJ8ALyhL2;L29rz;f8 zAj-oO96=}X{^@{QM!|NRF*2Axe_MCFc04TWhm@OHVX^b#%OrHzx5~k0BPxe-b;pc0 z%&7A{;UzF`21)nx$;TKYd>u9VV{OP9Sxd|EyBAGa;tlHD>JL0-eOrd9{x7Gkg&vYA zs`k0;(kVI0RL$-5J?%r1t~EWT>ES*&LM*d7mnC-%d-bZ)Vz^x$ocLJ{-KZPEBugfWyBUv z32ElTEKTtasWwQ?&Y}zM>r=o5=MwfS0i=`k2i}`;Jo;dQd0R({JxYEP0OO{d1OT`7 zZygiqirhFF{Cw(4TncikUn&CA!*esI3aycUe_*R;^KxkEHvJ-b-&#G1t@6}TwMiW5 zFwfW43>8!n!#UM^w-%cf#8IDxh74@BU$G}^eSDi&r*i!8C5P{-U=Q z#7Z=`lY^@J&zqx^`Sj)-BQg1$if}YX>%AkIWl7OV)O@V@1N{ek;jfuz-L5RtC>nw3 zB9E3d0%4WN<>9(=NA6=v@#!BKmP%MV_t(|!yC%u!pi8~-ik4L_l9?Ltze|;#7Z5;L zpyZeSu#vjXuJaikUv~8N2rc=@FYl$$+t}y7nF#?nK>1lDxBMkONI~HG34DOE*7dY- zek)(zUt8r^+$BK?Z7v&T7G0ffBWsJG^Cqx2nOhvd2}lo^?32VXJPWHO^MrGBt+)^)0BwLUhs7{lL?Cbts6gM>M=G>pf@W6-mke?SV$ zsru^=Eojc1pxuOApxyYBO5&Y#vJRE#;0V4n8p=J6}tRUZ7i5$Ky@Dsom4Tv{YnLO=&uIuZ`0NVVA{GsxNv~3_5FNJfrF_e1m$4L$;{{Q zi(DaQxLnJn%@#y)lGD{gF4*)`g}f9*$l&+YEs!2l;lSWp{-+J+N&%aY&0rnRr`5OjG(8i^Py@B z5)U?+hHj_p1F{~1B~y4(&8Vi@g@by|b6-hXKWEjcXwJR$5kTJyqzwS1GOxZk9r(}e zO>|xRfii0Yb9W-?iE$?PxzC#_jSPg9e*~3nj3*a6Im^8F6t@76?LW4-ssFaf|MLrf zB}i@;a4{9Jm_5jQ5p}fag)m^ZW8CyhJC*TjT^;AqjUhnQi#6T7b^w3O<5EjRzkGNR zU5SGwFK}vAtMzi{F_Y$TMIG^dt-rRD&4=TGZYYf8xO4H;fyCS7HzoCiXyv>^o<3Y zV6}PwuKN~f$`q8EhS#RMH#@yqa9_#dVoUS#H*EA47JfP=E5=#4)GpDjVa!+wM%E<97@IkJ_O z3sgU5<;nJ`;=w9<^1Ge550Yn2tUoo=uRp0qcoAyHV-6SHKc)x5IvF*SzK*OvIvx^S zD9Bp5TgSXR%6(Bk58+#P# zS%Vd?%a!+Z;kh6 z=<*7Y;Fj&E{X@SWA_s0vh&G}wJf5q?se0JA>Xa_9&2HB(W!w)n>A@Wc@H2AZb8QUG zMa(XCD!8n4@RDd(RBKp6s;qF82iJwM!0p$5))QajLW&AMUw?g5`z5|cnn4o=H}Q~l z(We*Py7PozP(A?nHhw3MmkFk0??inyP5x=kI|9#yULXE~c&-aJ-u{7NrYI$U&@9Rr zmnXv1V<^pEsi>7Dx{CxU?{3>I^ydYo;+hqWIqS0P9oPWd|MYvTZ*2*-mO_8eF2&i` z9tc|<#M%hg`)SJIRs#BeJ1gISQ1uLj8lPw(JLM%}H2skJAo_;8@h zqu|-7Hl>AC`(7nSQGj5mXYRtcmuWG!DYEs{_r)Q&A>FqbH+_NPEfo!fcUs^hbSFSx z8fdgPIyfsrV#yS94z~&4F-ZajecPcHB~2%ixhR#Bykl;B*&^Q)G*aoh+H=rz$fmtx zBfxWbJG!wp^XVEK(@jJ|KFA3}=tvHWO3Is2cIOK)nq7UbQ&~OCAAOsb;1`D8-Rnag za96n#bdjDOQ;;Y+NqdlgLox>Kmq%dk~TAS9Ir@S}DChnF+)eLWS~>mdRnib%%5yctocp5N+(1Vo zYNlqL`y&I?LPORt228EoWDZcsy=rM+zw#N=RupJU+A9A8uD$1jTK{Fo;e?ju<3NNw z1oq}QE?|GL(#E61;>)`KY0bJuz z(h(b3g9E}m7{FJkaGYJ_ad~0Iy)-lfjT$wktdX3?lz|UO5WvNMRKq*G35JbMHnQ6B zFbeyGb}^oVxuV|Y7PeNSvFXhldj`EAnmo}NH#?h?K^P0y>xW&*#6tixh$uLMA%-AT zT^HursFvDha3P0UCTY9((f7J?3zwaplNRM!ualj3s$ZkxUU!CVmO^bq&6CQRM`gSP zs5^rNjHV-+%(fI+m6l^}V4jt(F_eNtc2GCZ3Epd`g`xi%a)12Skelsakp8J#3DHyk z8=n~O3_F<*3h4~vE~qnD)3QZi8XYu*r~^ap0>xz{Y;lg~{niJ!8DB3uNFNVX^DGiC z%-p+Q{Sv5G>+BS&@`12gp}AHF6-t~(;l|6Iv^ftIC!FUfz5MZbSq3>>gr-IX(l;op zw2{?RC{ls4xIa9!rwrb%8!=Nm1y;mdwZsg~U>Sw?(Iw^~-rIQKeZC~BZq|Cyt;*`K8rcC3 zurK7tj#bV4{WPBKRx&AGJ7~x$HzV{~Y?qE4aU+l5aK>r8WL*thHtq!-gy#yWiNg(R z1emnJjj1@^$-BGn`1SgzjQSl~X2>d-sP9ZTgFM)llNj1t0ARN~vr?Wk9iuIn0rs%< zNJJH--6^}Q?U8NnDyWpqg?1Uq9E?XvKPx8IiZ!`p%*TjY>0ho?WZ6y|$74`JE|PY(BociwNX6w=CX(s&TrRrw~%K*)kNd ztXhn>blxJe+DU4p#RhYqnm%(yZ_Nnt>^rccO{3ZOkyyWgpvuteX7wp|s~K%2W+%bC zDKj+*ew)VQ3P9Jex{PCPwz+FcILSA6?qI_XsjN~m&FW27*YMp?bYwWfXs@OrBydH3 zY6k=UwlX9W0q_)cBF@u0g8%QR4t{U=_Z207jc)rUt0I?k$KVG3iS?J#htgTq_@is8 zJFhIyN!5&pnn&>=dT)59g_eG{Y@+LfKkj0RYplP+VQ7z$>M5kpE=$5SqZ zA?Hv(J$~V1vW0&Tm;L#0r-c87N^l5l&$Rc4tmy0V3(3FAfTypvnJbo#fvKN0>tMB| z=f}-VIz^;2E@B&xcJw~Hqb z8{s+o{Jxnl81Dqtb3x_?oz@H2-j4CI-Er4Dyxr__E$x^D5HO;}8k{4|yp*lk3o(B^RH)4a~z zCQgpM0FrTC_qkAOliw^)6W4!DTK|`xA_q7zds2X9ro1mKmR3LF&$g38!hfBZwRR`$ zU%|vfvEoBzDil0iNcFdp;b?6;q>O1J>@$(z+UGN$xpBbN;aMULjbH$23+AL2A83fS zB(oyo1Oyn{<`XSZqkJnSQ(+Y!T|O2l49RlZyt$QTegoUP5F#WQh=TU9g$ms_W?dW% z;orkwUFnqDe-*&djo)9u5>AQ+{i`vhluO4JUGl++PW%*+QzT%Rz6iiO%&ELUh9qek zORSqCfLE14#JU2^8%&F?p>=w_dxPr$xQHN=a@z(Z5KAK&-(u2bwWJrp)Vca0A=5g& z3E&zP+Zf!K3Bto3&+613H!&-`p`aB2T*xamDOgr}er(}TVBsO{-=`d)82I2{%v^gU zOttt7jyfUh?yi%;6f7@#M8!y8daT@e0AvB~h|q_Rul|khd1~eU20XxVf&OSw1Xdx| z7QAY}U9{Mp34zH9b+Z{EC?(`I_tj=|G$M#<{61Khsj*^btz>DNf?Vuo_twJD%wiQ* z?}xd}46l~##^axg=tckI_0&8i$q$J~C9q^<@a?22Jq!J|K|OUJ5P}l>o$&4&@+tC6 z0oA6@TvY)TColl%(Y^)`NucqQQ$ZI>1VzxV?=Bv(zACE9?^~O0DQS?BkPa#7mJpEc?nYX=8xiSlk&rHFHr)ae(v1khrW?M+FV1(y zf1Go1#_-Y$UHe^g&H2>S)~=mTW@Wy>*92ush5>Yg>Ok3XdH=-PJ-i=%6nyd8!_V!P z%Eh`Pr?mJyHmv1mMHR);~3KRyYl{HiSdIFWmrXzbUW#@|8so`t(@yf2_ZaW0VX-aMV5`SfW13$BGeM7iJ5{f zcJL$T;0}0Bak=b%zNM`zzEpmM%bB25p+}ZT8bYBc?OmVcwl&ICuDETyh)G@orJkyI zIP>kOJ5ShAj~l=)}()1?uxSzK_q3qgb1 zsoL*xJ7utJI5ehqCx}~3v6S?;x{l|!G41RcUeP5Vn%o3@l-~Rb#=l^~lvFPX##R|r zB-x=cw%uQ(-5Z=?bnpOxT?pAk2c!H5)s?t4e)7KLnv~D~y_1rOx1xiZO2$g{Kq4UM zuV?rNmvA1J2_M$8`aZ#QeIT@mRwU`WSKG=72HhMa8VGgf?v0F7ZK#kY9-~C(Ehe-_ z^WIQ%TC^;BmV^C}^6hOP^6J4`HYN}!;}9vNFQ=pQfX^z0PQ|#G@~HuPqK&##_SSvG z#gw}8P8V+U54=7(Zf91n(s;g5LYV9E4;R@9^_FVW^|_6*j;K<#^pC9!Nzzy@uddtY zfd+WK$(h&-OUvX`XLR}G!!{F@7@{AI7pn&fS-vE}kx7S|)>V3Rtw#Iu>e|m7zGUg+ zoMdykof;>BN=b|J)Lo4tiGF|X6(l@%+yQGY+FOAX?A3GU9? z>)z%nJie%v`Tr^t{yQoJCVjM_vIG#%dlQH9H^G?liR@|fLkHoDPo+--Z0}w@UNE93 zB+O(Y1XQOUl5ahaR`n{%Z~FqiKkQVNW$ohRzlPyO?uETv%zv>tL`-!y*gwvM^S%b0}&&oJG10sRByiU<&VT!Gh~ z)f4gkf60vhaRsV8k~cki8YLyaw~h;1i=%d|KKmpGKc;la|BnOGE?B<9{S)DSRHUg# zdS1d<>dDIcf9ZArl=!){!{Eah<_tQXE{xFGD+F%!$YN``qT{Mlka=m4ypf?W5NQL0m-;-1~(B@nR0223) zeA0qmEepH^0n4Ia-j9fPaTo;31jRgkRbtujAX z2TcE>p=eqk6RJ=c9%XnYeNBI1rV98L#MtL|o@ z8#bEe*0hTd_Bo(!ZmHdvWm;yZvuQ#1%S&x%w4v*M!YX!390O2t6qr{eOqEqvEMz^z zBL}yCfoh!$5KB9l?}MNff6M1~hQp=kVg5?69f0*bFd0mE-PW&B*?74AkJtht1U)i5Z?sL5 z=i$EzZJMk9#Ow~|rM40#VuF8FvWEH=0P1m$QF55X9j&^_#^@#d;EZ#=qM@MzvJo9s zY&oQuq>F|QBT<7=^G19KtFVP9`0!kT9Yb2dIQ16|EC??I>sE6F+doExAR(d+0Nk~HndX^I;at~-Y+z*W__+o1pPsq;k9mg*!-Er z`Q!kw(pMD?gk{?3eNBujCiM}H=-?M|TrRl>d(_+CdDw$(xuFQy4_^9rZK61W5>S>T z#_2f@LUf0Bdv+h{Gz!$0$dB)7Q`IHs7hZb|dBsWk(E;@V(3glLMKIp4)D9J8Ge^tb ze{!i}|3l9!$B~W*wxZovbh{_7OA@3Ne1n{Wp8bt8?A-%k4)BiQVSp;Z{5tLsDGKzC zoJoZUy%bs*e?FqKb;_aTdw7dKTfCJ$)Bz zZbg1Yz5M*#_9>7P0Ocn&S6J@?z#M!?@PM!mdUcgC$$_PSRCBVW-B~BCyu2gwgR+b> z)m}?oMZX`7R4KDhLf#NjwpOPNU*I^&W4FQfx~UOE_r{^E)!%eRr4sklRi?z5 zT4D6iZPtlmZ_%QzId1?^_-s5;URZqJdZ8yc9OWE6bR=bDWD;MwBpowz+P6{MzwN-h zh`W8Xnp9Qb2-a(9TcTw+-r@!wMvCgo(;K!#|BI(D5ZIux0C~*Ag$h+_)p*cy;DW^R z%#dsQR@mkB8{x&hwtLkMUtxlJfToJD=iOZ?(i; zNIRP^5}g|G$N$vN=(^SL#;9rF#QakKr|mhrGs7Pt2|&gTV{rps$Sqn@imGsv~v!@DRqT7N18n=Sa##rnXx^R@P1bGp}J$LfM{Yh#jT%IY#5G zolB2KdG}4yUn0MuAWKPv=1|NjeeIHTc49+GS32~%x|SO5F#QIo)ywCak35h98k>*x zxs<=q!!2s&X|kj@#v>UV@htjp+YnlIQ;1qshPyW4zc&R^)_!Bj6WYFNy|3$5G;JP! z>Cad;LGeBojeT+bRu5NEeaMmGTE3OkFL@zWvPF(a1C&78in`Vo9{Bn0qK%e$1GHf* zB=XjmEyrrt*x8yY#MrnGLJNhhMy~Es*y@I@BbtLyPR;M3i0wS&a-|^*u5gT?LN{7*uq&4;I_UO4)+LTd!4B6GTkK!7G5R z8}g4!%f*SAft5+LD3&(F?a7y-dq&BPc;1CIqr~q562^INh+i&|ZW^?w8ln4hTT;HO*eFIpS9L%BEr_@4JEf22f=sEj$on&6 zN)^$WBSb1{eeXk*4$a%1L$vvn($aEUhg}kxT6#W_pO3-?^FURTPHyA&9H58V(`hjd zu`dpT4j}}6!--~epTTgN1d6AP!DGu(4lMw>{MKpt(OiWJ~oT)bdSv@5h2F>YoUYx+T{mK_1~hltpJ%&1SFJt)Xk-Z{?~LDZD`)nL;+AwGO$KTKRZnFN z)wmB&ge6SuYuSa|uI_EWavYgA9km4UDBLkMvq0TG}_W?=#Z zRap2%zPv=a&mO%bWU~fM{h#V%QJxz7aPh)xdP_eRW6bha#VusT_b~5Y;;jf8q?`~h zr1tiet_Jcrt7=g=5Hx0m^&G|+!svXx?h{q);nM+*-}O2v88LA?ZeV5D9h0vj0}4y# z3Egt&7!ob1oSo9+c^W$ZCoCP;Z?5iA#~sPaG$Si%_IRrAWu296f4pL);P=NRFk4!$3jHTSLlehZ(7tD##rXUq=FU!jGGd%{ncXT`l-ypc|U%C#pI14mTqU`u5eVftohthgXx4`jgjoyA`s3NhoVQ# z_oeqh$3u)TX2?px!)z;ka(_a)NeY6_M+j)w@DEu933-#mWaJcjXp312MGoZu-Xpfj zs57!bQFQJ_vM%wYn-Q%RPq}O@WLVS0J;!rl}}1=zdhjP7R^yj;qm^z2r^U3J-MFqf(A6c0qB zqpRlxeb(t4|HUgfto5?~kLuE+1h zOag*lZ=ko+JHTsr zhoHlb#)Bs|;xD&r+;G&l^wh?|TSr60$@Wh{{*=MXlbDtjbqFMStd*8@Np2?90+$7p zAWex)7R}mXG}z@EXy)5#R{@$e&bAG_dO)G=87=XRK&>_R0+Gn>E2;ImFebQ0X8_SWoy1=rZRDW zsEPj>tR=iE<%?XwM+nybTbeZex*PY9k-Hg4j1x4;bN3KQ^qPGto7)wBi=_bzL%ymJ z=_>Hr+`kYEAA!l`*@nn)5hRWgGcKrquBAEzh?eV6JZlfB!vWhyrP-y3TC<}DfD0u%?g?Z2^ znzP)q9VKgUepw($L=b`1Pt}q_Pw6LR|F(wF1<;aI*sVY}@%OKK(k2pfaS`vs3<)uu zPb`4Z^lv{zD~BJI2F5{%mVqJ3&tUW|g)JU!c8uH?3#awFAMdU~DFtHyKh|J^4aZvO z;FtIBIItWx=I%kPgp=-v7qbBw4_Q=)#kR9+3g5k?|%GgG`!#&k9-K}bFDOadd`Pqnnb2e z0M;hG-$n=_WawgopLx1~XAvG`P^a;E zxK1Oj_dvBlzLXx1N&vRCSdDf1gwH3cch9YwRioLhul9UedNye)wgc28;`C1IlfjUp zM_1aAz)d&Yw1jt6(p${eJ-C&@-HY1;}W}wyPpNP2`oWpMX&V z=*28FLl}yITgzMeGbXRwTxNXA9?o9=B(V+2dO?h&d`mt8gj7u5PH-KgsQ{b z#poLa3q@|U8hWG5z+KH)@_f{0!sKd56qCf4c=D+w%@$)9dsT=&>~<1ZVI-MKtv}DS z0eDVM!)FGWj%-fz%1n`jn4o*Mz3+CqKbHZ2Yyi*SJEh#fUP^7F==o$F+f>KO{t!tZDa0h#Kl{ zg^1|3AILX6%(N!6FypX35(FJ(bzH?zU^#u+4XG;{GwVGDvb&;|vYNiP13@-2Y0bw2 zR->x|)_=%D9HSgp+-+od>~haGwcCrzInZO+3V`j42TE{V9ikuT)`7xa3H*8|_5o7` zFKfONZbUcc-R>8e(+Qyh)DpXD0!*|Ss1ud{#yFUleI<&vuI5i8RQ4mpas0dn8bcE} zhQO(xH%WQPV5en@LX*@T4AUw+!FG~ z3F&?i0nH_zLtY=I<-fC8!>T&qoK>6eW&a+{jzbkl&6i;J)tyud{C$*l<`#capeWwi zNy#XQM+r1qfibKd%Dkk{Qc|(u@e`X?{WWOsOFz^dt9#=|FLAd!C3IxNcD0;nd~OU_ z37vZkJ-M>b(x+I@5H!MBg zZCXw7dV1RKF>B#T76t@&{AJi_!%<(4?#7%aB7=8-VoG?|-wD_{A zRl!M}gKOCNHxqbbJ0H+0_}iQWpYk&daB?^<`j6pPk*7l8zPa%r_hI}APtUSLv|pL1 z3Z~m*Jc2}HWMGmQ^<6(cn%)FH1|=H4E(QbQaIHdXwk1_vg!AtQ?hjgj8MW}@Mp?vD zf8*=yp3oz*Nt?~wz}18|B3N~!%pPe#U10(S-? zAS#)oG&Y3L>5J8Oja-QShj4@nz201=R(CQ>A_4YAX6rG`JrX-TB9>sOA62oLxG}I?IUh&6U-dS8%X>%o^O;~v$u_#YN0o#%&HK-3CE9jMr3o<*V?6Sd{+dECrz^d6;vRa4=Y& zoA=rLEE-|nm-V;lOX{m41FSNm^PfyErB^w{;j3?dakN&+#a>Qrg%VbGpj=*G_wT$* z0TQP7Me0UQYx~#zy)T{tB2%^>Y&qZTN#h`jd^wzwOm&O5CeI9=#W2t_d6In4YIi96 zeYfbJOMfnrFr-st+ z3lwN^!rWZnFs zyTJL^*G^M7U94o8Yq)mhHAFodyOY?Ta2i0I*jagy)K$GII*mwR4lN@yP>q1FIvu3B z-&OxU-FdpM9_0A(3|<85#noVJ)h|_wiU=LF%Pg6qSCgdc&uYH@a@4aMHNOq; zzBET9D{b`9bfOH|^%m0VS3-70#{k4sc;*ZKJ5T-y@pTiSNC#Y8qFp_UQ~=!KBlAeh zo$gW;eg!f27fR%7Z&sR7y7*Z&(5+I4l*n8Dw@!&Ce+#q>kvu+ay9FE*GZwMKRH zBCbGpK8djD)kYE=?%$wOgkg9|I-1Xc94Evg9&Hiz$ygs%q#8dY@w1oMA@XApqUJSZBeo8E>>z9R7O0+XNFgT0 zAZMx5-X6^O?G!Y{qI#!kP+!M{irk4bTUZB%(y_!DZ->wRKGnBXmrc>-wpD8Urf$9q zAa}`vI`84rZ+>C<*^)K+xlW_y)ZAp2>ZDMo#yNc}JpuqF

DWrpteZ=ALOcv6zLI*zbPYXB8yv)Xl3?5_PPesduk+r4L-y zrHKg?S#kSUcJvQh2^>2A<-nfcWzI58P|WXzKj___Jr6}bO!~A;J(9kAEbj6Yb-cj- zImh-aa9R@FswT_(b*Q|WUhA7z0#VLq%9WGNJw%=4p9>CsD2X=Ha#s7U;{Q_7ORBux zjbXmz@xiG{%WC~J^o<)f@C`vN)l8Q5f~irVVeVRwwRJh=WvJ#1x2gJt_EEzd8k|Qr zv~fz($;!pxKHXsrM0`Q>UVldE^$LnV9{I9Z@1smY$hHE`zd}$WL8S;1bF6ZRJ_W0` zIp|9oyJey-tEi{_4zL6ug!Xqs9dMP1n^n>7bP5E2- zk-$`t(%#AJw8{!8`@&YAqSgUBUF+pai+PROGloySQ|)gi(h_^h>Xg@dw+yJNu8Pal zZzW_Zh6D6v_4$C_<+xCspoYBb%h_Wp2l=}5&z%?+M@_mYMUGkeEo?Pl} z_YXmd3PgWr`PtRuOAPsLKj<)TzO?FGa;qDqZK==qf9CL2#h7eT%^~B!RUVP}ji)j9 z@Use{)AebyUk$Z*tyd4AaD~}?#N}f_X#6OLyHF~b2FF&&PQvv?QKkY4x6j=E+;DR; zFt8p{)_?p#`%V6+{_l8t{*b+MKhcr9YVh_!yNyuLc28iQ8enk0eoG+@Kb6%ODI{Vrvwyy{smkMEzkz2Unll%J%8&}p z|1E>QB1{5$hNct&-c!k_iM;gL8OBsQOtM$fupkVA>z7fag+?|4q=-lb^9z^Ji*WkN zRVuikJ1@Q2`6m|Xj$}{%0qXyM2srAa6kRqGg8uV1-454Y|1ZBqv&P6Y+erGKgb@x} zkhhFw6U*Ok&J0am#cEHs>`*~bHdyC=W#4?a7()2G@0KKE@0$Qw`s-xpJpD{-ep1$9 zqZiYRIghmd$xDYAB6uSpq!f(fSh3&CV&YsC<%zDK>F*JbuSCa~w4dDwUC(-h6KI_1 zHF`uL-se~3brAM(Gyhv{P9+P_*}cS^e6uNuYi)Jd#U#k%5!`#13`rizCTs4Q{fw{^ zH^LJ>3Uw{R{RWHE3Bl0K;)v+^)6{;9urt&IJP3~6^@h`Z?L`xF() z^D-{rTQkY?;&3|xLh^`yNLe+o!;HR)#fAR>rzznWKi*$d>h{(_CYlK&PNgh7di@iwq^4EyNwerT1FA|NlBST@%E7unS}h zl4UAfP8n2GP6W$F%2*T=AT`CqpByA>t$wLo&+gg$B-xtlbHH{a=pQN+Gm{mXK)r4P&NAoQBJ$laHR?X$*>hJVL;BXTADDz=VZ=(#`RRreII$6M?(!Lxp|b1<)J%W|C|L9!9F5NaNklSh9m zCykXHCV$Y#;u#qI@Uo8aK$=RIsg2Ej+>adPNP+WUjZWW4Z#O#$<7K6&Q4e z_zk>6PjIK8vCb5_i_XcT}4p3bI%=rhr7*ALk!vqc!v>RuRpQCEwr2d*9K{9DC zI2Q6+`xvLD;Z{Ky)|Rvw8pN=n9sb4>wjs%J9Hs@vG0O;TEygHi%&$79y!E?&W4$*! zW$WAM22^HBAF@=fx(m$??arUWg) zIfn2yF+8{MUBtXMnisO@dn04Enb4rK?u1ugl1I}Y?{5ZI?RM8Uz05YRr+V*>Z%wkh zKesGqoB@Nch)^<{olvft{%@yRZQNBLiLq!|oZQ8=Y`#A+s_>XWdbIjHwXdjeDhCV( zuEOuUiPEDNA_*hAl=kWk6f4ZVg94dO?;WeF*abFM^*mr?-Zku!)|wD$Z7zjEtf=fk zkN0q!oXSH4LgV~B?87E<1C2$;Yc78?h+Rzn1<8iwZ{PpXmRfz&z@^4~ye5Zw3Y|$E z&$0Cqc^lIm#zsrqv`zHduaGO~@b*4}uvFNWxPg2Ygj}ei;=IfSAw^ml&|4fFQjC>m z&zo;t!rx++UGn#2l6`ppa`{BSs=Szt%t$w>`L-OOVS()*&L z-i202q(LX|n|?y=VbI!vIX;nO>D#XD_m>pXaQu#k&jKy%Qod!3r}N*aa69vAxy-_x zvcEqAo5I6X!)$T2bk!|fyqq>)FL;}I!vZm})*cI|* zI=O?XlerQK+C$a1W%0W#M#c-Fj`nLB2G&XC35l0}NTL9G%#HwYzxIULC z>NqJL8TQ0YrV@qGY>$anN^|B(SBH@;Lq2Ei2^~b-u88x>G655cw*1 zY>o+qK~2^r5uPN2aHIK7>!V!RRym-o2P!6$<)`eUHGUrt5fKctxQ4vyqJujN#{5U3 z#sm>YcmGat|vYZSrc~bFPr-h5FZE0n+4JZ<5qc>q9!i zsbXB3Z-H*OiER<1peR4(-TKIj1L_349wcVC19c76@!6oZZf}8vGS1Nu<|uD8ptDv( zk-=E&UHgowy@5ydE)Ui=gMZ9Oc6Fe`wdd#4j6il@7UqOuhR))WFa&mjxGFUcE1$nz}O&H-vG;|r!(QCti7=blJY44!1H7Q)- zbA+k*)!wem=U3+91h^Qw_)6GxG%Vet)c$zM{iFl`a#H^}@5Vv%TN?s%45M?rqKR-4 zbBZ?x1(|ZVQ3-k#z+qE?@nYoNAYnE%+ja1si3}DoFo}N*Z5MSMZA^*wdyt86kIscc9Hx!=e%?GkR(~#6k7kL~A^fzV zoj^hwo?mtIs%F>L5iw}Ys6A?qX19X5^|Ecp;!+36hx-w!Wz}JrGHgn`Alp$?lZ{ zp>N!+#c!zhEp26v;MphF!?f+K45id~xI-F;MPHn)1X=BG_u-LgZo%>P9wsSOKhVh; z_0U>N=*@h+>HC$*j%%V1q}GXJM=QEyBZ1EU#fmm;KbuW>N7FBq0v}=-L=T>KU2%bZ z(NDV*?hU`)l7aZfIsDO~BAS`ETuB!V1dC@}nCF$2nMMS25$fOoV&t_gh!Oy%e8aoDD~6D&QBM6bmare$Ao@uBbS4(shmPSxp40mg zd4W^_j{L){QEMvBXfXII-s5EQSPrcL`l1LSPtCTa#urRlb6*ftUhE9ieY;(O2MLUd%%Kh+Ew=Opi#cu+IK`+10)Z2MLeHr6cXQl6L8^w%1A^i~}DO&OU=D}HY1wwE48 zq~#4cO-N>bNGb_D;F>^UiixbH_pY^COKarmWNvVjcZT3 z4DB^LVH&1te1zyKE=`KBj{`>atwOp367K$Z!{&s1_oPxC;GkfGx{keDv=2jHFm&wF z^=|1J94zuK;~wzdL0g4Dj@VC-h3ilH`^Bu)0!{Jny$zh6h5Siv6ZJ%v>=~?;CpUbj z+8)hEvu~j~Ac={?SNfJk-xr3oV&(mT!+w?433J13*m--j?sDI#H(Qd<1Bwnq5BdwbEXXd4gJsn0a(x2|XSc)!*f)y$jNfS2HF$}OC< zs@C|?u*!%|&1FEA#FQ3l0v*vae$O4l_SJ?c<7@|u@T*kyPFXLKz7npp1o z({mpP(D;b*W)Wud1=~eT)K!sVLVOj*9BX7@_-tJ?6usR2c9zLsk0Ud`o#?6Xe?0o!YL zl2|aYk{eE+uMagl(I(iPn~)KV(FTa}mDyRDhQ2ak<;Er4kQz{V&MZ@%1wlN$ybT?B zN0jDC%vR_vABW7sjT?I;UNIxiWtPJgP%E#w7SMg?DS~4QqQ(+Vwk?qSxho*LTgzZ;*uj6_FCiIb8}#a7$R_=AiR#{2(Zjo#HX?fZL@Dm9J%6+>NCM{J(Y zzVcq|8@+0|KT!O6W5aWd4WsPtNeM(+l<62T;?k5of*tYGFc?SLp;NZzHg2nBHPQv0 zD&>X;5oK`UEgk1RdDuIRg^>wn(iVlUPQ1%{DJu9*f?j?;V7_EpjCSx26@VE@LC4@h z5~6i+X50C#;=gJEE1)xBWclI#<;v6Qmae|&?0HwakOKZsBt&eQ1OBaBzHg9U)FQY4 ze!0>6dGf*zlaFdF$maENsNZ(a4&*=wByP9E3DH z&Hu(@4VA|LPxIQb=!p^wnxWupd`1ni=P!AyFa{Sfz;}CfeLqZXnuIx$5imXAvR*dCNFt7nJ9V=DP+OVIaDJ#ta5IILgQYj zmZmsf9y&LZE`%m*JnIDg#M}t77jcz9MwMYKRY>rYsRuBTy5udP`{=T^EDtwW(oWJs=0u#sf9 zkBs=-r#S~GW5h?hXrvQwe}C?()YD4MHd}F#Qv`xcq7D1|9yJJlqSJB^Q4Hb3H+?F( zdjwJJ9)s}FhX?)-nhZ5Z>$4X<<4mTdCv5IPQSYe`HCPl8=?6%<^)pe3T;*=@jw)w^ zlHmoyTir%A9fY@d#a92IKRicY>Bp2LO9>)k{0a*{`g3?T~+jU(84gWEBr!(_WI2D1{nlFD>k;pYN=#!1}SEt^kNsLI%klbz#?l3uj; zMSqKJ$#;FL($&H*+{$#et#*;J7I6%#XVJQM$eadxM?Z1yugjybR0Qcu?+63g&`?)o0e{nKb)|g|?IJ8O z`^fu0YhRKNcy>8!cD_dy;>C#}WR~bNa|)B$ zH3-aDGTI1rWlKUqSf{Y_!m4Q;bL8+K^ve3&;ja}*!G6Dyd>Q;&=EXeq#Onp$Si<*G z=FCz#>=ecb8=>L_{gr;$n3DSY(MbcI%6r3;$T+PbAMMU5Y8qcr9c){6Lr@mgX(~*1-{l9h@r?HAB7qjBaavP*m9cLck08l`{%n?-g z4?5HSZ$|8!J9Fn($!pllj3&_p2jWMuMD8L*%pz8$PVM3TIv2}kS9`U&t|Z}WO$+`B zU;2n$?ba|?AMD;cuKP5tZx%yBzi7$_O0BFcUsyC;-V9SA)q0zWZ}e`@Ba9eB>_5~N z8&Wz>tg-V15B>xbg8N;}#bwFd>pDLsr;#D?lWk-#GcF8<)WtmVkFG3~E=xsYKC;2P zTh=zeay{SZ`yfn4SEw-U~Z}E695F4X}Q>lGmw$>Ww zQxesPhuuz>Kt>R2typEL8%gNdw-Bmnlj9Vbhru&W1Ks@8-oLr%BLU1v`XAdCnWm$j9N_#xKDMrb>aFLpK47y6)0OKXlf-}}~d zmd>6d#?Y4rqD}qowHyPeBpKnKI`~vp&U$E|mcf-Tp?luTSVYYJ!f+2$M)is^)7Zi zZGDkFv){&2x#%-wDWYO?W{2ecuJcWIDcdvxJ!}xMhELLVC?IwF(BpEmQA~yg`nYiS zJhERZh0Xj@vcmEwF(&4uT+x2#cSf-K;z?^@)inclM@VqdS}ft(JvOqNx-`2%=Qbj3 z(n#&EBmKD#_Z-36dgzoSG}TDCO%eHXyu`iRUU#-vRPu(^m1*J|lqcT}Nk(um$3`bt zaa+F2zoXocGR#^Lr5t*T!hHG@+B!LPE5<_KZMcNHJfdwPRl+t4ht3MpW|+*^g#=NC zAZcrR%Z@&4Mjj#?h){XM8R^vIG&~&nbdvTy$Qlb4Vg)Ll)va@}&Z%#XZ}?K|yeBL@ zcfBTy>+DTG+O_|)F3+y*OsopdZC0*z%`^Qm&p>n82bY%hy%cW4jxWZu1O`R^KKplH zppk6b4ydJhvJCTK?-K}d6zXC@N5Q6AZW8eVRvlpj5y6VfAZD}zWnpc7+jjs7kj4Z*Pu)e+ygbX?!CVX|+Mi|YC4eJ{Rp+O$(Ua_hrcV+wcv8`6mc>Vz$G z8-2vVNVirLkkttON-a+FUha~CYR_{t4{5o)vYt{3M0&{P?A{H*@ zMjfh-;BuB;S@|8O5W;I<;b^&PYuSgeP^uFmF5wA$V(b?n$#1z8*OCrQb)>>s`*QNt z#=FVw8a_{<)@*z3Bx)#X$W{w?cKc~Cgkvp+aD(txUBt)*$Ep_Q4e@7A|1~JdO#7GzlupjJezF3*^x@imb zJ#?V0_Sa}84MvHISky6vSL<|p4GT%Q0`E#fY#ArJR$XG~V3E6TT!qHm6Y&C3xzc?@ zpD^)N4=lZeXWAOk(j}h+TuzI1IP(x&{M_5#{GuA*D&yD`E7yBA78qbMKBHJ?zV6k> znzF-?*+|K=(ObbL?;}ydu~K?+aQeZ67B$rh%Zr-FK$9W!X#Kir#rGKWcEa$RW|s-c z=w)F-*>0Wm6d6)ex+!BMp$;)*C1mhn9a~%YiThp zJBv;A$`Av5T%g=Q_)Xw92+4}nkz6byTe7*&Gt&vio`NgA|D1e9b(Xtd5vn-)E53&$ zV4XV3MBKmwuQv5Zs`|Ux3s$suRNebu1=m@*ycD;L*9MkWy@;_D{CsC0+MBu4H8)Pf zK26NLaleIhfoHcfmh^A6zwJysQG#EEL@7O;Ra&J%iFLU|CO>3CquI-F)d=Ns@z7H zFZhDtozBjk^ntZmGY~R;_4s$bJ%*p3qFT3ViKH!PIv%N50xX(hU9(*@O!O8vJCQ5@ z2+jb>volB7IgZN`lCu#1HRGVp??ApMG$Mx3$y|$2kHa{n>P6{ydB!3u(rpD{GMs#t zmj;=FEj^g^HSPHAkw)LJH*bd&CNg|L>0+<|9yzbBnbQ5r_LkVg@eoCVyXt=3SC`;e z8}X^jXDGS7`#UG+mNU+Uea`n<@FBEZC5}rZhnx|(G$;(rm3&_<_^XsYh^qreo0diIZC+qu==#Jekn= z=dLgHn$JH{#0;pB=qZ^@OAnQ12(>RnPb^YSk&Glgu|M(lm@#5ZoAgH(;n_g+|1xq! zIfR7+KE+C@wLi-30j@F|Qm1Ue10Fm$^84leksIqm}aE`0xRVfkUIhxUsG_{W_q~C;y>!4Uizrx!u zaX)CvOF?$t;qdXiap-zE%j9Pr8m+-W#74<#is*skLsIOiU*yz>POufPgb-(9%N3QQ zhgFUAZO@xbuTBo{V4ZTQemB*H+<5%*;M#yHpV8X69+SmNAuEr?>hj*_x87X3$xV>F z7|t*9w4V4|73{bBrKa-Sr7fBn?WD83@?53yGxih4saahdyzAwDE zG=9sIv+7;0y?THCNsj5>(|T;EcauOce^UO4+n_T^ujK@`W9lG5%mJx{ZLDUC3kNhC z(a8mc-iOc_To0kg9#ZmBVqkjSi4D~=EmE#11l@g7Xrng`QAt@!fp6UW^xs)x&HD#0 zcJBxERQ3chnbkX&CfQ70S`qo1@Yi{~foz2kR|RmBWqgqm{abb~A|e80Qj9U>;t(DJ zQ*F$8wmwz>5xX0S~Q4+AR#46=b}SGQdo3L zgGh%UAR>)`AhKv!bazO1FKHzHiQ9etd(XaioI8eN?4f&)E#Lg+_s-{i;+=#Uq6Owv zWG79WmW4M+-2-|pKQz`e!qo4pFBILMV$QKT_gl)i$EyAw#lQo#i^BXx!}K@gXGZ5j-EShzf_08`h+3;$rxux73I>C;)X zQjs;E$E>C@6PVNmTwgrY0mwNm@hJAG)i}EtF?N~dpj?!${?YKNF;IjsiPXCxC`++i zJi2&oSV|R%z`m5DLysgACt7L_f$K0H_Jkg%@15#sSOh9J#W1MOS-I=>J@BRp%%LdN z3MebT0}L4L27Z!pF0T!6RuqpcquO+f7cP>QsfhMBlVnDSz9NkeD}7$y;vKr(DEn#d z){6AwF8?(F($w1=gqaa!naVwOa4j)kBD>KlA^2f>6n=&6VQy^$hr1RSMRGBgF1#~WR zsgY46&!Y^no+BMTh>4;iUES`l4h6@vvr3Hn+dntNMGC&_SmxCqz52Fn5cci047Dza ze5+nbi0ZZXu8{0^_E9y6Y;p}&8JDyk)mUWWfqw>AF^dy6u7=Bo_ zy)n=%|1>awq}2CVOUyNDc+;evqQ11#A1|W1)TQQ2He|`MW=K8!VXVjt2nN0Evb@4) zMHG8A+-9A8>3sU?CpFPFsVA4A*%Hs6oN-T=y zzUdh*v#R;3j5O1OvDrNM8^Y!G{MXuDK7%ENjjoO1L4MCu_Ya>(5kJTXG$iZ#tZ`S4 zE(a9GXy@A(fY(Mpr-Ctl2Eb|;8$Jqm~NvXI(>X}ZgMpSeTj1S z|H?H6sm&!f7(8)jmlSxz2Q^&@vkQF_Sf#xONQADnne5N4ZVMs}z`z3!xW@;bTjVjQ z{hSc2Lxv>>YQ=N?C7*_aM#XXF+j+aAeOlJw=0Ys7-d~5y;sZPp`uqt!S>g-*-YMN`eHrRtq?zX~HDTN(y^$MXG0WX4Tu9%jC>ndg9A zIw;D#9&&*D5EiF#5c1~T=AR);o%+@_i)O54a|(`B6t>2xK~aC7xTDJ#IRf?`+|tD@ zN0t#}C^`g^Gonir##MX8x9qld7LNI{!p} z`D5qj?6uQgdrQ9C!Ah&$Be}VGP1<~T(fu$# zj#2}QC^2ybs_O}g&=&t4ot0{C1iqvz(TlYv)k zQl!;M`J0217P7EP`q?ESbj%ilAo{`Dy8F}y|I6u@gKW~)CX!vm5chfd=je-D-gLNF zG*J#+lNlM|zGA#5xrm`4O1YEANOK@KEe_1_Tqd{dr|;fxWMi7jI&C_RSU*1AL9SQG z7s~$fl-PP6;GwZa4V8(Fr_>~wTTC*xP zEVkIhFl{&fZ1ibw$;{7_&9A?Tcvm^yXoGdWpFMYuj#!SseF;xGo+eV7nGw9b4Hz@& z{kGQgTPQZnHp=RswXvX?$gJAkiZ)H7M94&M1ZI;(Q&TlXAhle)iFV}ZPE47Vo%@@^ zM}5^+jhCq1IqJCQICVF?vHfcXuI9=fFnW|Qe?H-UJ~bJsk7WrL>hGchAF#9C?%u7D zWFC7@=)et)cT8X2{2WgxOz5OKd7Wo36tSSYWJg*g6S^MdecWIshpqE9WfJtr&OzRn zyFdH{p#=0VtRlPWzLW3CaBMUkNHPwQofd_(T>qO}(s!&;!ou%|Vb$CZBeY{9whgs> z3mL7kTV>8#Jz zXHX{w$uNCmI{6@D(a_|%z+^VhX|FMTT8KRv7Yn73n8!*Fx~}1fdGZKj4@Ld-)H>iz zvT_CPQn`|b1uDySko=^zJ1uBUoIvZlCu0If@h+YB8s2KGMpYzXQ$%M#xAvBO$|>w@ zPIFVQ?lNhY0Z-XH>b;pV2Wep^BalLiL|ML6eHDC;cM}^0G7Dobyb;5oiKoo5U>Ji$ zRd7UMx45aY@T$Q@Y+24k_Ud#*7p2P?Ra_6g&^I(QAf8|gQCW`&S{_MqCL^STgt1+) zUD&HNt;T{H$R7R5{8hseac>V@R_iKy%Ir8Ic4M_Hu`6yPK6S>KlDBK@^j3-)E3U%) ztMXq;IZkX}$$RuFUIU=nO2zs4F@EX}p0d?j-cPDyZ{W@^@y;9?U8c{S21fdEeRu$bO7c zktGh;4dAcf8BdC_9T2klewx13=ZXKc(J+P{O(7l4y1AOfC18Ra=E=&eegx6Y8UIyt ztGFYIy+Ar!t>gW}GgXe{LaB?s;zX=kY#=TOYHw9NEPI`7{#x1g%;yL8a5xDCr0MSC z1ntP0lMU&^oW`_#2F41$_~gq8i&rQKX91%;^KZvF18tN~aj7L2gB0m4q7vH5qmJau zd$QJx6f7c-KLzYm$-IOU&@_`h8ksL^bH!7Fd17&#RG_!R?dDIrn{LiZw_qqfny=M$ zU42N}82?}daZuRw)2i^$S6|1(kfZ)}2}0`Xq_78CI7+qup2VcQV0;ZwCxF?hFKgTM z(`sj9wKztP?u-Xao$g^|x@+9`*Pjjw^DHhuQq)(i7{+82YFiCNSb+l;$iJC1tweqedjvEiz{MG&6?f)~v+ib72Gf;juW44mgPnku+_3h{H zC?F>u6EX7^f3;V1&|AOzt6C(g<>tN*)~dL@%*`sw^mK(7mN1ras{v1ojtB78BhWAf zD^)r0xF+&KLH!j?dN5~)xRD`VLYhqT(f>AG`*sIiv!6uCS!Ri$y%3axB($?X{j-2i z^`ep({lb9TtxG!LH<-8Px<{^-^Xi|6V2(o!UcjM)s$`Xs~`l7dJGg@f@Kds^6uhjmX*y=7oQ@~-hf=#|EByW*` z<`M|38a1-_=3n#FE**woMv|!*NJG0j8=N+#nO}It+P}I<)4jZjJY$tyHSxVL{*+*^ z*lqjyP-gz#H5?UXX32#t;Qu*Z#me^d{ZxQhMAfRV3 zkt{snrlaumN;@-R_U@dpP2|drVpNACO8;9kZNg`5<0@|vmi`7)zhuo=-Pc40qT)zm8H=oKT*k%*EALsjyG) zmh4s|ba>syf_wymrqhdT@AC_nz2@SrAV0hecI~SOA9|Y-x#2P7Vje$!=*ACPz!R#( zq=dx*n-4NigwlK5hTftS6_-LXvu~3W3kqhCFL=B!o*W-F2n_(Ifsn^(iY3Oy;MZV% zM%5JMj6qkXX{NSX7Y*SJTRh!koPJgY1(T$jpY>_$}i z%6OiJ~7SssrAVda# zVtwLWis_A(Jt1)x!YJZon=-~tM4+fRTgydb6^gDzXw4VVwio{OpLCt($3XS;X1Ycp z)OS4O%=+@y;aRQ=_oA+8P0v_FIJ!ih%D3AGzOBRzPFrntdc?E3xH0?^8*Iey%rp|0 z)@?~6@B2J?dLW$htUwXV?Bm-r9NhoX2AF(fpp@jJ4C2+qZzC8?Yb2USG0bnGzDw|` zevg~HSOqXIy9IgOfzLwnv-%Y#9fL#!70@gaZ3jM{!GVrTI|dhsnH4XL@azfBC6(kn zKz$NBQw%hDPco$N)2`CSM?TWF;n~9+g&cRHvK@0C44HSfUY|Lx%8tEs+DL^RzJ=c8PU&ZM9CL5`zl#k9lo~1`VeyNTY75E{bue5l^{fLu^ zBaUe*F&4PG@Unxhx+$V^9IwLZCHk%6e7rO;X!rjDuRo!RuTAG!8j_2>(sR7YzKP70 zXqNH4Wwa5bP}gE!>Ql~VctpP-sZf1oa;mp0*1_tC-DUrtpO<9~tw^t^*)=mIf#_VL zrRJu`dm#7SE(oMn|Ey&j-aUOm^o9CPWMhTn=7TNkgL9r)1?qQM(I#I}532VDkk9wSDD`DGb%NtdEaAN_L7aB+RknE*0XeR#y8DW--iLJ>%U` zJlp4@E!dl#zwl04y?bm{%8iC+vhhvm!jZw=7&hoy;Gi@z?%+8w*w)BT zn3~(^1EM^kjOseg^pRu}E*1*Mm<<-r%8!4$lK^==X#90QLnNqBjgRg4*WRhjURr0f zvb&G_!sSj*)?Z*weCDUm^Ye@5P8)?g@NuZ%y?`)voYRTOvPZE;Io?yiIS4Sa-9cLK zVpSNKe0)~@jN`I1O@ixnot0ta)MyGw<~R!|py8`HmRJM;_Lnya!weyS2Vt3315S4K z#>ML}pVj`BRyO=nhmD0%>kG-H`$blkyYKZ6HP%qd_TQhAGnkkC#QqVv4L}XdO?!R= zjUF`XL+`F9-#L)~=~KzUZ~Xoo3i8g2L3%k7Q|OnSv%^t1uY!0Fl)Lx#c~$s$GB^Dj zqZLi-+~;e_y4i^(`(em23w6+8JmHy`KbHI0ZfY@EUL3i+Y({f(O1?y!@V>M}c}Hze z-;Ok#!)Jd+A-by0F0WMIgv;oWhfMM{if96^;t}0Ggt?|9L-&>~#N~CQVym7NI+>EF z-j~xBscR!Co(bG=*nCMzxPViWuaTuMd>Qvgb*uJdKgs<&=<)InCL&jMkX9PKIe>4< zy6NTL!c&KZBkSvQ8x3+w42IJlA>CvB8-ndCYk(?1TN1WWUq6#p?Y&y<$~^@Q$_e$F6?jGId=H6K>Hi=v=;frtO$>nfADuMiHJ$4do~x{vq1 zJQQR8^2Sl8?E2~pynsK5>3Y^5!5^_F^c8&V?)$JrB&rZYdoC-(#kVo@Oimmj4&YO1 z#TSr2DgG8)iU{z)mwqtE&8(q;w#Q0^Cc55Eay67lReQ)GiGxI&w*NC zecaxD(Apubd^K)kYhBfzbeTe)u0x%wze$s9YDOC>GzjxFH1@uG`C+8zeUl2$Ey+99 z_jCU`V7UIL17;0@y#m-ZH*0BAsn}tf%_Ubqtv0woIAhu4E^B@$01BQ3y~)|Zv?nuf z$q(}fMZBP&G>S1j)aRi836QSffZa2gI>&3qn2~Oy(z$^ zk2dAa@suL69!iTZ#FZs@y&fe{wdNIzM;F?0x}8cw^WfEm-GtyT8*2L0Vt8NlZQs7+ zy4*IWt4126f6p{?%?-a070Lo=wAx zWKXbtJPZ!4mxg3_y3hnHS68b@;^rpR>v#hhrK}a(pspsjX0PYy5=5X;Kn%xMY7+rT zfz6@ToINw`kQO{EPZp}^~Zhr+Uh{y@3)aE-!nLGOUzK00( zE1z0>`dm*TbbCvZ^a5Fps1D=KYjmgft!^!eRtr_f`sYTTj*krCCryIhUQCIzkn|O1 zKbFN6DY1%kNFA-QyJxhWdNCTHcf*14&mIU77P#M|XbcKuXb zc&6|q=%jyRZm+&EM*xu%d33*_UsAcFV5O_bOx6~g7Jh-9^BXt1K+6bkmX_~!o&a2W z=dO)glEQe>iiM}sw(lAtu*vCuy3tuA7Jp*R=C}j7W_|uh$@JGaB5?TAr%x)sm(7@@ zh0wwI^pn(!2(XAx745jL1u^CdWR|rl!$%~;g|1IqSSWk^h>6KcRdgvr!6WjUI>-e~ znKqdFC4{%{@osg+s7)+tm(-x1tVUil{Ar4|!BY_l*ixo&`-eDdYA4%XV=&zWM%^*3 zlq0Z-so~|%;}!}cQLk1^Em00QMSlD7zdyd*0~DcQ{;cR;3agmclE6l7b(>MH_(Ag1 zxg_51%LA%Cv@No!`6MJ4`=`f_QNY#NF1yK`U6fpm3T9snz1P_CkKHIz=<6DG8Pl4x zuo0W8hLF~;|9Vu-wB z&Cok|+|}8`GRarp_#%&=a;O|MOZ_My2h&u7GRgDt3nj!CSYkjU_%O;?SEA#EL0$~- zq^H>;JH1>12hYY*@)>?yF?-4_^0nQCl0vSqfZtC3U#oA5z0CA`;h+Bg2XhqIquela zfsaVzyuv6qb`%@EfAcNdfs4UG;DI3(PxJ=xEq|I+(C`yULV7%qLWBdwwTKHf5-*k0 z@;v=GYm_1m4mvETZu9#Nf>RoB+J;XpA2Pob>F%M!1$0?T*HG!*BfR>kDzo{LCTj9_ zadrO4VUUsqcK2D!@T z&#u4dKWnD4a6dDW%qx2cAS}rM3|?pm<-Z)9wxrjVVV=P>KLOOtt{X8O%K%!<;0i!L zkH{a8b|0ft(0vs1xG_oG`yR7%v$O;#&Gm%CyO1{ryehU$jQCj7pY+oxWwKVUD2 zw;tWl=~NnD<|H1&eOYke8ozu?-=ffB*5fSAQY3q297_+XvN?1Dz5X#D_rnPBURdS4 zMPPq$TEmGd`E09QeM;<2F3j7v%eI3E-&k49YIKYzZ4<0G4yzd!-pUspW!|_Q$~2*2 z{jX})LE0(z_j7{Bm8ZV`3UjRYYlW>4L|8pJ&sXB&b4||(LC|U(RMbI zN#XrseV}!d%7+PDwI;jml`E~veQo}JA%6geTo)qDP#d_`I2=Mv-3yD!AJ)^V>8S)% zdYuYe!{MEIA2qGL7ai)75L4cd(5<0eMA$`Q)Hf<1u*a%Dk||7Eww z+>yny{bONim9=iIDY5ddzS|UqqDR#=1zwb*t4?w&J$3yzeaaX3Dyy-IFY77 z79eyz4*KDXhxMUIC9Qxuv;?^TNYB$o2x<690X?dK#Ucr%DCb@NySu9vPi}V=I4D;B z=s5mOd;258*K;_6blMnIUj_y=Q$TzR^==6>p~&W?($ab1BCu6IDe-;#)S9vP02OTD z)7rhK?`*%miTHg#B0a#9nQ7OR@z0z2*z!V>3KG@61Y8ye(ZL+N^nZ(fKi2(!X!09u zspY=ugdu+@Kw13yVGea{RJiE%lf@?k@hXJy03bKP);&Sr;^hf41I66rVORO z|9&9wTyaA3mW%(;Gl#5$|9&*ff_iirhxBK|@$XoF9T+WNv+{LJxNT!3xybUMrPovt zV)@oSI}G_q&!a-tsXGUHkTURwI$wS%mjHp0G@v+e;=>do8%{e(1}-@`^?jDAuku&H zkUH$VSHe+j%9JK+iZtLzN2iaB1pqEntlk}a5wFzcS8^kDQ}4GDpv>5*4RdO~bch8E zU3JiyknPdplgyh3(DDd~Ag=R|$LWS6@7cAj(tN2*gg%lW% zL1@bzTkI&V-9HwpcXwYH$0Z<=Ot@$^oNLN#*#aAj60(!QF;}x-4BtyT8hzqd3m|ib z=>E=T_Tf9?WY|qU==oWCc*Z&463-OUdml<|o4H)Ih7Q68pf3?f5*M^ts&^A3sQ{zD zX%;V^@-)W0X*1)I%z#Y{rN4%dgaDaW97jw30^N6znR-E$xNio_ia^xIFmXe!#h{tA z2OHo!6RW^aC-i}LbaM!S*QUOhZ?{eQ`Y!Q*c#WVFbM6!H6Azyz`NfcyIj-NOOmk-j z+?Hea6$0{4_?qx2^tqbEut`1h0I2#V-%L`e$>Oy)^<>!vLqOO@LXL<1<%UnK&e^{1 za@Ug^si?l@AqLZ&WC9Gqg3w{1NG)7+?4WLEZ2*6A$H{(Lbr{@gu~7^EUMkg2OIxF! zPv_KJUM)GzB)=Hc`VoP&hf*r_t0|e?`^NLw!>qr#anZ>dEDUF0iHi9DS80C3@A*iw zO8+~BH~oVot&YRIhAYwtY@r^7*fjvuyddkw+U^ph=~9!J$mL3twu7Ur2vlZTFRu_e zX*}oPDr)rH864R!sM7iV=Cla*9}W<#2r`Pwb0KobC(b?I;DFzny>x&^_W7w&$qmUC zTAFHC(%N3M7*Kqt1LfE+cRk{P165i;|JfV!4~;)JJvgUJM_&?0T^&}Q+i}IFQ_1asu%yJoTRI7pA~;>e>?DyZyw29@wT8f2m02nPn6u=+$do8 zx|hU6fV0r?D=A}d(~5rbAXT2KX&A+98nAoinxRuLhOt`pbKQ8v;UEY=q_##xLb1^n zWvYHp>4dtliFs5&H77uvrDU2m(_S}f$x1{%zY3l0Md* z#k_3LWn&1?#Z~UhX(!5o1&(B$_P!%hm8F|C;BXmtrebj#;H0AzA580z2}{}~Ohnb* zsKUAhI?wWAfW<0v&tEwBYb{Q^e%Un` z(@2g7v^{^Mf!xVMH;D}e)V5FnI2a0P9(K4)el{LeRVbZwCcnuU&nEYr&e_zo&O)t;Za&ST?I#kM~@y~w{o`+g3_kI znbsCcB$mQKfNS2t(OY4GHC1CZD6YeX;1r@U(tM+Rah&+x$87^KQ(`bWoz^~P6_+$+ zk|$nD7Z`hW900mdI(1G1n$FV$Bj#rq4NSi|_pj%3*|$d~w=J@Q?!OsQr*e}HyJl40 zf(Ri!RIyt+p8n-VR@)-)lerQB5AHXqen{&jMpM0i<%EeKq}0JsVgnUoRAFDBu-rr`#m)m6*at8=zfT- z%sZO`{{I~c&tNS|`+xY`38IE#1lDW9OMSm~grI|*AXY-%bOL`ElQ6t>-celnzs3Cx%3(H0ZbyhJsf2YfLp(pdI#@PrX0BR z*iJ9kTz@(XkxpuvAgjTn{=uDW@oD~aT#RjRrysZHuEdMYp~0eRF5P^FmbUozYe)cg z(%-uJB|6a6?aocEX)p?_&=Q$B zEV)hc8L^23x}Af(@ZyC;s)Ni&qI%i7fQ#W@yN$ow_RSkT%~wP&~p*?Y&o-WL0NfvwpOh| zB&pnuhb-I|1*EW&ZLyF{Y=p90<N{Q#4JVX-PxGw4FsA*^+sP`sfNiQ{~zjjbtIWwSeKF3 zTDhq3?n$HhdRMr#0@}m7ugX=VlRwwf%TFKPy)Xe`hRc-e<_&ag=TE`^*Pkv+_Ie)z z)9QUb;d8$#4XK+|!rUUgeWy_%;E~h0?CHS+gdcms%3SSpX*4z~-8oI$lptC;f>|8d z*?4$%nhYU!}grM z%`1JbO|cBBX$IBn0J;Hm*a1an8MMrM`HRUqaMThx?^r7FqWUZsk;F6>*}u6ArSSHa36r_!tj~24 z6WXl_$#*pvnNIFrt=UnW956w)?r+Gh-X(J{>vPfBRhqi`IUKn?tNUQ3$~{0$7zbwP zb!Zg+24rWC!K%8fqE*YY+3ZrM_#OeIaP)eLpk@9+k<~Q(_>LDAn3m4L@+O~hDjGkc z&(6kVF~=G|UPrWkp2~D_2V1CgCq}N0jY4^~Na7#;0O4Qo6WrM%1YW~P3IM3J*{Vn$ zD2lAbtYr6m$UZD zX0^&IAdnZzwEllwXn(hRdzv#kgcJizU)zLF_31{rOL`VU*!zF#M3UXkVVKQ#T3MUF zRhP&jeXonJplj=lyd@a9Q-&e<+53N^D+_i#Bcrt=$g zJVDdu19Jm3@zSqx`6+?r86~#-`pGB+YG(CcXfSX5bmtK{{!p+wtnK~8KZNn7)4e)8 z*-xaW&}8{?&&4lonwbH+W}gpVCO>p3;=T(71MdmQKLqKoj7O4M=QHeGF{3_k%xO)q z>#V?{0^Qt#qwp=sBEcM8r)bBHmvdGPM*G|J50{v@8q(se75gTS&lnxQ3h=feh2@L? z^B#;uHd%HMQ$TR8Hm4pJ^+t%(3B24G$rtFVipHc$#nFZ%{d<~YMKcK|*rA|P>G=Tn zshsP&Tk-_;hCU>qV>ZJ9$fx2z;}#m5?V~~BcsVpCR)7Ac_;fzyB;iu3Hsg2hL59avmokvomP$$M`DAJO6bqcd$?xHPn zoi2=euolfPO(UWpf$nVV~X0==wosKhBdwDFcR5=uQ93SUEfDUCLtNIH6wT!BSCs z;RGn*$>+ZDy2>moqw@?QZ+h4bf`0&yP1VZ7PoyPt7+a!Vc;BZZw_#jBRrS71SGCB* z#(P{G#hUT9B8u~Hk32NW*)t8rC^3SzqY z>Q#5=nH%Egr=db_&5>A-#KCN$d!>Aq<(4Nm8n)#g;TcXax{v}Y?ZtaF*GLROZK~d7 zi<|CNt;!xCAOZpbozduZ3_ zb5_l)YOLA!cm>io55ybZgP^9VrEmS|9qGT=WnmwGuVlT;#N1cY8=#M0d{wUZrSAdP zA_mG7bgMjm3bz>bV(@XVMIU@!_;U7^daIkT0QA#apKl8-Naa=PQf#4`OZTp0jj%7s zor*EF#>a~oKLM33RCBwAes<&i^E{P?#wX!de9Br#=eYa^Zd$qcT~TK-Mq$T55(Wps z%Kch&LfPvSK)5aVmdfgsa(I851cG+IEzvj=NV4Wp%_*yv8`OHW+x()}x$ZdU8{h5E z4+b^dw!iR&k3hFJXpp~d_UhMhDt`7wV4E7hLc_zlck5%_l@Q{99p&m5$h@{0sOz9j zoqxzBN<}s;?z<4zY~ZX!G?lR?bfDpF0S5~(t@ft_EQB-xw}sHA3UJ116}oxw+K_3E zQgDn?%f8gzeE{dNmkVO?M_{ARH~|EuT^&_{<8w#~HwOK8F8UbXmqfLNd-U)5=>ORY z0q4_ie1*w?_Zv0-9>_5PUT{vC@X8mIQip1|#CXyX$9iJ~nW~=(BfQ7|uZbMO&UenY zWRh9G9UuadQMc|;LKJU~j6vX$;Q~JqJ$QrMM|H>|)74L^xiR_V|ba7=<;P7_M!iTr|t_rTn=w z6F-+$@mnDA;M8<(`KjFNhH<|Z>08*&K|%3Fk&}{8QxJL>V79(ifd67tDu;hA%zXO` zXB`=+S@XW1dT-Pv(k+A_EWgufCCz^OWxTPVA$yesj3GLqz#$vnR7O{#4$Kpk8R^=1 z-FADwa7YDqZ{NN1c(p(9N?g)f(ApFcp2@pUkB`!@K>33))^kiknFWMZfA+96F+3O* zxm9TgxT04*X4{TmU6w~xEoqZ=Od}nVKf;g3$G0ZOx57T7ckB%_^nU0^pD9T~W`Q7+ z5cva#UsqOHR*cv7p2g0d+`QY!c&y<6OR+nX$pytO@Fq5J?el-~+1v$W0726fJM5(B zC`i5Eo&=-<}oXTz%7s(B=+2 zUvN3CCK@Hy?l&}t!*=zaf4aTYYE0l_x(aJL6+>s z@3n3?DYR$8d2H7*+{!V)WI+l)Wet=LTHuirx+abtbtSN@r50P4H=`#)G5v_zE^Ze@ zHe{GjXj**y_3<0J96HlKi2DDQAJZ)gMZmz+(-Q#-$g5{d*Cx1)AR#3T|JTA`hX4v* z7=MzjCo<=y$Ydl4B*b&^mSq}`)qBWZO}|oP$&L$#?X(*FRt9P-qYA#gL;UAIxD>RJqjk1~~o$j=*tH$jlkbH8(!U zu3??d2qwY#q+EW{P7|r(+I#f|f&Gp6eC26hM|t|372}aHSudKM#`%f;{|Sn{*l{^7TCl*_1-o1Z(-J%cVNdQJy$A2B7#}fFGFABLvMm zT&1bDuNxIKWu7K6Bo zLNH;BO+{K?W71WjY>1|nADBniJpI2@34i#KzcRoY)*#DE9n%5EzOB)Ux9tW6|A`y{ z^+Df&J8Jkj1*FcS!@8URO#i^R79D784Ay!`pE=Tj2EE5jX17&#^9B(bFZ7!v1tdy6 zPyi}|sh%kH-2#4+OhoT3_-_M z*;hPMX00=d8dj!19yLoSM7G$#xh$6F7A#+?GtPz=o{)-xp><$8gpfI&M4NHt9lrD= z8wB&b3<|(}L{F|?ag-DL+-r*Kf zOLO|1xvVP37?5ckf>B|=-Us-g-dOR$GS3NgJslSnte`PAFZ3WC zFDAeOW<~g&)4-=&hdSpKb;iGn^Riz%5kW1|U)-1cSuP09>nbMu=}5QdInC(ZO>f}^ z%#6FI5AYBXMA~dnH+0}z!MSt_zZun)XRQwNo!bLN13x_C9|v5vDL+(bklnhNbl``r zX*)FG9V^Z63lPyI;2PI#(ly8M-6FLi;}kz5hOqbfR`D{+-@*{t$=mb!FrprGK#>iv z@K7D(>*OL4fgpPV^dZt%N-7`6TE!*vKVxb7p)W}*eU7?;xY}xq+}P495p=uBHAv0i zC9RuN|Em31GhCaI7ka*JhD)7q?`cq5kNqr||7iG=$zreM0Ab_UjcUouMUIkfwEN}1 z6zHF3b3wT>I(x7jQ1SC1U&M=3-zZo%su+KxdITiq5VBD?gJ;fRnsC<^22Q|3G;62A znM+^w1w#Zj43}(cgh)bu8h4x@;CxDcnfg9MqkYZ-7XJ^*sGn`O%_9Mno`Z=rzPicu zW~igvVeTGCs5Ui{TGL#z95SUNQ8^iDQul-vyb|4CHS2P>IN5{A1rO`7ngP22^#09w zwKtuXcPRc@nK~@sLJ9f}vjZy=pG6WbKjf%;e30=1qeanNi&RG z0tFZ4CU9Mvk8c61eq`INe*7=qt8V7c`mYkfXCmYckfNJX`G9ect411mdJ7`CYi!wy zgNhnt&CkP*>+$<1Mc>75_LD0XZhpv(&3~R9dIPTxGzzKa1F5|8bYMzH`!n7FkoO#3 zAW1{#1V$5C3wcO!q3$@mFY4jV#h`*6@+nU*57|sC$Bt{x_}{fqKnw33moYZ?J-#-- zfG+~?_ZRUyi$T>$dxD<^NVhk+t13&O3s{xEMLS zr_#|)UN8Fd{Z&w=*u<4LUsMwQ2RB?dc+ zd1-Z=-vXguZ^z8i21;1Nd-~Wei|>V34h5*PGr~k_9~lArhu_tEb?hgodvmet{f5s3 zYf&kclq&aPkf`pIe(Gg`?NwTX-EPgZuYvcqQIoDS3`cz#9;(K4KHe%{`BQRno@vnk zQ0PTkR{CZH8p)}8JX-}wdzWlI50?jOy86h$kGJhbr(HPy!EViSc>)KCPk@k6)UVs& z0N07akAF6uy$_ot9ROIJ%WN`C|MfoAluc|a+p+%Zwv$so;^eG6C;N3Py2uu=h+s}& zBx!-A>FS57%XSb>IA@B;b~LlK7F2lUU<^|k_xLa*VWsoz!=oF1F-HqwZ;qhTZz&*Z z!i;$K4rW4JQ&PuI`(seh#8}YJqs=)0so-0MXK8f!oV03&t;ou>Rl||mZ&2aH8#OlM z)3RSZ<}2uPm5$?`@PBS(V0HgZ-2a#K0ex&+Ql@bA+Xo}yoj?9GXb8rNVV~zK5s5SW zzSz{a_8V%G6qso`OM(k1*4?e4?Q2!<^j;(xmcL34NR;0I;l>+M?QQArz>5Ug1NK8K zIk|YVoGecz!}FsN-!E=YVJ*#`pNhT#)yqP~UB zN@0p3T7i1>eLaJ5E9>PPDZ@{E)`Cvw^yVU@w)d{?T2o-sj>>kA>goN$Nq*={2c_NP z&;9VRtnkx=DJT>B6}^-tyn!^bG0v!bQ<0+k0|B^bi#Mlvt^!9lfA9)-lk5Ih_aJba zWBou{6hZu`;g@A>>_jFpd+7Sa=^3BGw{Uwp#OkO>oipPDo-b4El>h8in1hiEd(vP3 z=n;?4L77R+|KmB8 zQ(X|}@$yXJZZXM=Jx%;Bo^7Nt@l(u2=`a~_C+Riz=l9lyK8#YV7GuS8J>NlXVc~*$ zwi?n(Z4G_OtBtnWW1ogmE4+Ria{tcu3%u(i=dWMLY?vVQbA@}EQorsc?bqxl1^1t{ z&5>sqFlm>>edm-qNk(>OKrw$5+TjNs4&D>C-tzILDAV?|9;okMrV&YZC=%D*O1LNp zHY+>ph|SgKWBMhz1f3`mv1?48UvH?@3{Yh&gIQPgzlM3Pj~2U7qoAPJ^#q-6R+N;( zFWJv-K8~uFa%P2xgCQxs;g3HeHav_=5aF?+&CV-qRH=8-h-6cNYWT=uV{2`pD3^FQ zL+c&KI+Xz?`c&Wk#8Hd)@&tr9v{HAU6M-GGaj-@2)9NXA_gBxpii47_MqRVvd~PfL z?;EjiR&&vQ4GN+7dfh^V zmyqYVqc^oQ6 zN57d_p8W_GM@p6t%GGI|dV<9u%9z-a9BKwHHUIW`wDn;5k&8v8bGxMy?fY7JGUlm? zNl5d*p1&LdVp}=G*6FWYMJbOjhnAZX6Ftk{@2ogZkr|}13yUQ>6hTsrxI4NKEmYuU z(Vn{(>zw$tww9YlcDB9j-uFheY+X9ij5!UO%b{RDl6fr)N3A5FNC|J^a0uF{9)c)NOO4-!N?q%Gu?T;0?rs~&KDcv|rz zrQQ@!)hH+p*-tBEAO8Iz5umq5FHFLWzF4$JkgZ(pYeraQM?wjTKgJc1v~Bymeo9%$ z`v_1CNx>{m&pFDqsX>Z&q_A2rHZN_x?So(fOO43rl0A=l6HNMeKa(DT+B8Brg$Uo9I^z zhM#OdFJFw+ZQZJSA?eaK8Z08LAE=b)*Rc#f;$~jWlgy7roqJAWG%^znXecOqoNtlF zFE6}!XieQcfDLOBK8Pj?i`4E7M%267`O3raldT%>lQchmH~)Ku!fk+J^%E$u^9 zk$%9S$U0}=1h&&cMf_A>usLcF34d90C;~gOaafeE)_xzWCj)ERcAF+{fC zCZ5|W(#%KTrx zpPceM_NXf=8B&6zI!5ftTGN8D9mo{%>gSLTpC*Do+)gi!iL7g1tofuX_9Rp(&62UN z-XE$*t0Jq@nvxiJQ7Ia+3guki-C)o{kMPJxiv(ZkpQ7TJ6=YPWvN?}(ldi87j95jI z5AW;71UtWK*y9YLBvUK!`o-pnCn(=NIvKxi^KjWuBS zKG{{6s16tm+R`n!4h-wDR;S0#ApkW*jqUpF88u&$R)AxL>UgG!D}~$k7&>WY<;T9R zO(#2kJt4?mHw9miUDdARft#|gm@5{7A3omsYni|$OM=)q%4l^icM+2-MD7f*C%`yu zu%b`ih6;Mb{WYuroG-GsR3#BulpZi-xC~=07t{JI(X*LZ=mVEU0{XVrG@?cNOxksU zHCC90^})#LdMd~{mNzi>cGcgC*cVgvOzCT*H+@0fD&A~dL2-Maz5By1h+|w;E;%_c@lSkwN1B1F6b?LMnUs1gif@7fOF0xu$XaZ9oh z|H!BlDtLEQCSK{f|F-KTrOIqo$DXN-YC>r0%!uTlgX#75kwXdx2JKTZNJg6%r_ecL z=PPFwX(?EtJk$=tsc1n|7&DC(#|+qV^dy9m}V*VWn0I1GWc8WE3UOn5s=E;Tc}iHMe| z#;h@lh&%gUF#`jgH9Uc^>c~EG;NUV;Tk)pDx$ORo|CnikaIU0~??xgs&dY3Ls zt3!@$F~f~(5}Odll|6+_qiMx^r^aHqEUKSpZSuTX)ui87?`*^Twul(2yJ9HKBD=$W z%tn0@*uxc5rk)PsIWV+NMQPk?S`(k6@3Rf+^X_@~eQM0VVX91hAAGY5gi%+$vg}dg zhtY2K*{`3%BtGf7!CfSCfC=qH`{}BO>8g^|+&M)~t78Xh<_JMnZBZo5%oBc0$(uQyqh42%fJb1u z$T=sEH`Vi5PQ6~EAYzXAc?#vGO*@cVrv^5dNs1-AymD_&_JqTd_O}ug0*1vG%~+A$ z%|5R5HmK13AR`N}S>qBIVe}3`!2w~U!PbexP^RIuaIB(cwYa=o+4}&qw2G{sW|4h{ z{VO6NIU4P}Y8JoTykQ^n7TEtY`-d537w*?k0<-kb6OLG3%9SXPY|-wp)K`m6B@1Qx zh~U`nQDtOqq3i3PESG<5R8$GPWGZjc_Bwdu zGeQ*@5^RcOEUr2|MiL>?TS>Y8qLGD`+2cH;4c|C*f#%<&`%&A9{UXDrI?gYr6sqR@ zI0fyUwU`0Q#PaJxIm7(Ce*MjA)d2;}raPmqGqq+}z<21U?NCFqzDd4ZN(c|(7xcER zoH2(x)fQxu49=c+6ynTH=9jP#QkU_98B9Ood9^MiP#zDxwX1~gX4e+?r6o{vgauF3 zz#2hts8c@?k>@fjBRr=WI~DkyK?+VtX-b266W(8uula9%_Qq6eI#(>1q!eP)#ut~% znM)nAwE5iHspFoV<>OmXUNvTh8i5rwIXC$YAtR?UeRu#^buPkJf(rnVQlb6-^~guW!hQcu$hjg&w2F6!p(LIzHx*v@c3%X>#sM!g5mLd4e)i;BHetaHk^Qc* zH=q#9-l&fNRq68kqHmTywQ&pt5&B;kci1>yI^6GDzx5HfK^|~z)3q`BdEGX+Rvs&z zWc0?&f+e!eXIRzH^5YEZLAvTz5Ll`vZu#{WH>@pnO+!l;*70Go=8gy)>1Co8)5Jog zxD4NMO43$wl6%p@fHj7|993S^OA>b(j#)c=pyWj04vpU+E;SsBv{$@(Uc+|pAXxQT zRt@KrIEH!ZiQq3c>f$yBFrWv$`f%Y(l(_$(-tf=%P<8fBlNmUnOvuy^*FV4$h|0a0 z%fkN$#s2tnO~lTs>0P!W1o$HiR-Qgy5eb0t(z$qUvU(eBCC~^+hA5t_fj*97wL9!2 zHfe+IGBP6ONb_x6+uB2eavf(ZrBsE=`is@7eV;o~Q%C5vTaI|Mmo+yIg{JeJ47<4C zen;L>yq9Oz4v{icX8<GpJQ&c7qsP&eB3NaZuAXgrWSvgK(9;j< z_(-;?hGT&?L5lwU996_oXCoeiAQ%+TyUF+tr^b-7!+$n`3CEKiwNhmnPos|MUG*4? zeF*7G!zNL9E`tg$A&8fO!!%I{0`;jT)}fo;`)2Ok-5q>u0ZNLXyqmzcJJFhotJn%qClXBAa8ab z?dcYIl{(YwnlW8ug_$}@%YZ<_yo>`Cj&mK*x25dpTuY)2eK};55{}E1mMJgi3EE4V z?Fu8iRA~VTa54uk78=x^#ij_co_b7oTr5$Wra>#(*Xne+pkzakFYtf6kB z-a>b_VhU@06**Ay;<-qB=(}_dZN$OnPe1kxeRLbto4i01vDADWcH&F-28-XqCBI78 z@xria1eeaek}Z_&Q$y_c1#fz!L&Gnoru!ND=6gHi*pm7@YB?E~+7Vb%5U+|laf=yo z3?KpEjLWPruABL^Rmz8$ikN6f`7aOS#*=m()dz-4`E{GqG!vHQ` z^^#4;NlP#)v4CW6f}EB&+>4-zr1M&m(BO3X>R!Rx##>0sVK*8=|Hgw^TatDW@p&|tkIRP(E^Yq5cl3#Mljs~kMl6yV^;NQQp#4Qx8>p*~)JdV1n6#X? z#i)$8ug$>K=ft@I3ajd6dxH^yHn6=BV4Ti$KNb-A>d8!cIaVKot_opMuf=~j4X!(k zs2EGaFPynF3A#*hQZ^nHVQgKEtJlvq2a#yBZ5Jz=EA&r3CS7i%M^Cy;|GCMfrCJ|0 zxZ6`K?A#YyHK`krGiE+Hc3IiWqfW}EUDo(3l_mhC+ukVA)<$t>6?*fFhBf9*$->h) zRcb0e>Qq{NhdMKUH!BuC_$NyVh$Ktn+m5&vjdc-W+ridh9wr*!8Yw?nP zs%Eo*8&JjMIAvsZcS0LjdrWungLl}=W>PokqTJttNX|Di&l~8PoS#BMwbA2@K-ScZ z>Glu_5MVqrE@G8-v0Uvoh@T>cnWf`m;i+`G*8>MU^o^C)3khl(g6ekY^V?Fsf80Gh~Bx>?LUl|puw#f_=HeJ5v@b@{6VtD30VL#x{`=atTqIUCe; zL1VWvJDKggtAL1hOW_#Fq-o|Yib2M_lz^q1UQMt57^cTS=Kh*g-O1XaXirAFc3E%l zTk%RUZo9Fo>w4R;G^tH7ltLCYv&O^A-O8~#Q8}ac5T0Ik2-qG6SU}Lq#N!aa>z(8A z@O;@^@T=zhn3+Re#8lO71=)DwQ3#G<`s#WZ{~a8Om_{U7Kg}HKjDX&C#mb~^WFROP zRIERmHxwQ0*cGa@9b;Pa`TPR24^+o?>^gREzYbhr;K)PFQ<+$PE`w4ZTxDWX<%}eM zJ8RIF+5DYD> zHpPq-A1WasVNBjcvq$p~Kr}hka2e~dCzJ9p1pLaTOk+{-Mw5wLJWdUGHc-l3hU2b@R zLQ+LUXW(0sY_PTR-FkbCqfBA+5j)fUt|97)2 zw8(1XEZe1gTMA5|IY?xOpN&27U42WXQHRROVqj!YSy!l?AYw_tuem@y+9n;N?%(sO zRORsjW#r4`dM?N4c$JQJ4wMV6rX{?0qcM8DazE2`{^%mFUV8K16#ZXifAYW+et+Pd z2vXjqgI>?;a4A>TOjwkhseMm~da-)_VJJm+9Ld{W#j0T<^>{l`X&D)v6rUDGP=t+sm*=7X7lcW*=-%>bU4IA zh%)_K3J=kNHBs|1wjKzxlr^ec`o<7%J)vTjc@dk%rQ5O%YAGj!d4O5qzPF<|7;#n^ z0@#v%;UqUh_f~15B8TYq8@M~}=N9e9Ie*d)z2m5P6>PZ6qCS4pjWvT7#2f^*vHUzx z!dcPeNf-!Dt<8)i`40cLlS_Q%v~$F&LxE_E2f5KWnI+XM-8_f_g{i5>0EcGnqrU}} zV)YOI#l-%N>eLcexD*34J@eZ*<9)}xjRTyrigdi<~l#WQKD&5?zWmXq@MX}(U!6czZkr$h66(sXhvU&lY zpeOr)pE-sz#_S+jaDnah1lLcjm_z96fcz}J8hg;qv9}73evpKe%aufA*)}rwyehP) z3dXtcRuZ$^xbFLI5>tZF9EjTE@2Z5W?vta0$!ms{bbjwYD6pdPgf#+OZ86yeOgU75 z^yeVm9;Js{%Zy6520oU}c47Zq_K5@G?X>>(gP8}VaoD>LwgC z{P;MXlz+p*fS!wVa(7nXKJ+T40iePR7}Hfoo7{+)-s-pCCJSv4H*T+TbStAy?kt3m zHT*H(tPpV88B^IFDS_h|+iY*gAo_ItQ!x3?<3b)g|EpSB+!DC=ZP)T$oHOoG$;c|pvB>i%5FHi*?*7#%#RPgg!@<$9e{dzD#$x}r5Iy0 zLy2+-@tE_W9bhU7ineXua8zs!&^Zbiwnc+hy2@!Ikw{9KlLxYu{ta7A%;H-Kfq!1? zw%;uiz+3+K>v!838^&k@GuBRUe^}(isoBHRf}vVX&cr(~N1)Y1`Q+zdA0WDlQQXvN z#x9fW`gLR1heWMu&p3>a`&%9NWE@`}Ha9T(r1rHED4S8J9F>V0X(908{Q0a)-(@O& zhs#6H`eLsGKn(jXR-ZbuD`C{db>3NT={>}EB`>fKp*kvBOn3p z)ctyhx5TjiVm-?KXCIOoo$nxjVlAZVk{XABCkdv|>13Rn+}mZwxR6ZhVX>N&S#^U8 zX)NOs^aLYUKHRcDP`WTM8)Gm0`pxG}8yTvF(VL&V9LhkS%%MS$`3vTm!K4LS>;3Qk(9E_;@B@xB9l`L)zh&vb;I0}2S za{Zf?!UVGl(g2h3e2FrC?ZYIAS=rFR3TR*m(*{0P4;b44j7G6? zYsvJGh~q`j^Yv3KrQuvCvtkDbWI zmq3!YL4C$ED_* z*WHP3Y=C}tNs=t}bPR{1HM?<2I%^H->e3z6<7Vm0wEk;kDNM}Ob{$1P+a4NXniW+% z91EAb#vD*Av_@G}3a0Te)(_Yihe^U{@VpV^cpkMgqs3_`Wy&+zAIS{RWE(x9n$qB< zv^@fho0wMzbOPpo0fUD``M z7~Ngdl_JwAke-eVI(g5S>=ma}JdIZ-F#hcH{RhTS78jst_@8|F|2zXa^_!@Qtiny3 zf}>$1D2hXSUG223E8oGc2Z$G61IS__59_M5F$d(OgRTeOf+)Irrk&Mo7VFeydW+SH z{VTZea}pG(R~G7kMb620Zp{bux+lA^y16M?Wo0+LyNIDC4@Luolx~yV+>z8EhcZmN zXV2EOYR^ZDW@DR0nn)~`TxJg3Ty#0wpc?{^xYypj;Lx|+;gIR;!o^?(mrCA8mImRL zieBxgX9&}@+E^)F1W$Jj1(n8TOre-yhLoYrxLny<+oK~{5vJrDUR__rEYsIs_q<^QQSAAt#Hg=6q`#<6MyLV-p}(1 z*oZsDv)FU(Dus%zUh2|Cyqa%K-_{D*gzEiwKCWG$jh@mHl853CkMHBE%{jAi+$eQ5 z+ub`}qQgUF^wAkPw|Jcy;8?9bt-f74Hp)XT4SlDymb~1j>5EttXaEFmOc+e!30-cD z(oiuRbi%#HW%2gbc}FTCzZIW&y$lxdM3G|i?Etb8lsFs)sa`mH3j^2;eHvG6_{@jx zcep>#J$Q4b`$kgO=ZFEKk-F!k(jy0`G?pX{tn{e4^^%(a&zMkEtoO+KA!uk~)F+8L z`Hcko>kS4wMPmM0D@;4Uh*78EeD-enUO2Q{w>+COnfuxd?nckp21lPQ3;@x%=0HOs z3>gA!Zl*@NM%`U`?ouFJA|TPZG;oi4Xi4 zwA_A>0v(L!NeBR}KY!&3t!%ZZAa^W0=N^+!FOG(2QG+rx4YI&74!brorYZq`9V8jL}a-HlMBc5{V5atSI| zuEm=8kEJRK9$|de%G4eGDzbjz^8)kUPou@tH!Dqi|M0zBtPBOUgbDXz7h!$mM?+{; z7{$Cohr0>-<`-VoK9eeC|H*W0YrB!#^&EDlOHZzi%$-81MCpr0skJKr`_fXrI12a2 zA-Gk`xFVw8mRNsGSIm}N_L;Qly)oU577$0+f*=7_ZBI(s{J1)KR`qxQ@GCMuyyOVD zIvDQXpIh=Y;+gqPJYJ}shSHd|vUdeR$;^wxChV4~ zsfE!aI$D{fj4g4%ol3EPseSNe0U8rf+}xq{pHntupHvOV3dH7q=4ApC;rZJXOhj^G zmAJ^_8)5zN7(Ba_GOn8SPSv2B=O(ng@9Ie-C?S?jx|*8x1S@lQUo3H0)3v@~qeoyN za1f?g>7{E~HIuPAR_#_{Tkhh2)0Hzyb+i|Ade*hC&Yg3T3d+3y$vph+BhK9j0~RD3 z2GE-%2)SO6QUC-+{dOoQHI6By6V9~`BhmbbLjNv$l0wNZ1YdBHnK2`N+JCyC6VI!S ziA&uFCjn61XmrbWP@o_2bO{HjrOvz6I3-ijxmnk8G~=wmEgkdalG)=*4}POCK)GLC z8BhwG^JD{?l6J;J&(U&eR0C1)54DV^KaW7UDD4E8xphCG4DEpL^F7lhceIzW$KOnw zdaCw~#GsV|pOf0wanMJ1SvNwG)~*Y8&dnP-4id!IL2ogBU(|~!PD-}8nE`i|BXTMC zuH7aEqXz#?kSNP{#~<= zflZqgMhm^ac6oc7qdFbodE;qt07o!Yci7z42)SrugyPGaaLtyRG1Eoo7@$UJ5k!)Z z@KS0RmI?V-m^8{)PL(oH$LJD|bpCnhM1betmN7ydy(OhFCu>`}L!g!QaVKF=_~>aN zXZs8UFbe_6vVcNTaSfxAI3Nm<&Iu51sGS`F_aizklRk87%lS}g(ry?nf>s|CuSbaq zSggfdnm(pUbal`Vbyg-HA>uH6$D|W7=3cy=gYqCmh(}=g)S{b1NE!_TRV7J(>P2mZ z=r`?rhr_6S)ff@%B|HO(A9}Oi1(Xk$Z+gYaog`+lkui$$&jN;S?QJl9(pb+-7igs9 z=f}iu>ZrA5dc%Ts8bNN^68YmD@dTH_ZnQx&S>jd+obgjIkv4@3#5M~k)uwc%`v>ei zPESLrL#g-8?yq*0?Ais(2D(=^oCU!_NP-m%q*=ChAz*B4s9{u)pPm%TDIXx0v5R*T zk6IA@UGPYTpL0h!=9)H%RtItB!nku zL)(pDqqnQl>w2IL1GHuAF}5CTC21O*3uF4EGcRkPC)eiqQsT^Z=)jn6#!ajcZ| zW;3xFs?^!os8Aat94FzOL}tjjJ7_ebPS$L&Zb2naOA06@~KjmPp_)zDN;9 zlfFRgXMQzd1u}Bk6+k7Sa7LFMVV#0Z+Kez1iO*uJ$ud_9@|nL^yue{lw&shx#8T$* z7pHW@t!U(zQpzM_sSx}d@bR}g?0+XM`P%}gQ{vx7Q)_z~NSCRBs72TF+!iN6>B^G{ z@|yIJ0eVZ2o}t>Fb+5NTz_@~{%%?(*lnas9tMp(UPw1g6hJi~+5ZF$nL{MklUUw0) zM1*#S8Rp1;?`YG3w!TE^(`H2vg6If?w>gY}uhlwWhng$D6Pt~vu)<-uH|9+r{&6|Y zwi+1rn=f^Yp{4UlqaE6^8QKtInW%Oi-71o&u`%KYqCeIQKx-1cSV8D8?ElhuAACnu zVrePfjPMU7pyD6Cs!dmpKz}+SxpEM|87fMnEm>^++&=+dF9CT?Hq_ir>(~>#p~U`? zLd>d!1v5YtWEWzIwv5B90sLE-CAY^e599_OgP$|U0^>7hyIk$42VA39FUIDBw|jj7 zG+&OzsQs6h18|xnpWy#z1Bm%IYLma1G_&K;+Y2)CH1=L+bUNL^q!?h8?yvP`Q*76} zJo8pOF2}>fNa262U&2bh-!+$4&CM3%#!8t`uQwpB!c>)}4pY z<3ranPkbKY}c7=Ohp}x~XcTVckG^ zb+wVJD|J~rPu?qj_1f3+<-=XRCN4OED@yQ*v@k-sZlTTgMs;L@mb8FolMM*rYyECc zk23$=$pm|5)wBiN$hi4+#D3Fdm>QYJpt*N60_z~AfV>ZyM7zfV4cd-(Z&qiIIDFz$ zj_9MjgJNCw)-g@kFOU?ClFYJCxKl@6>ZZ;t$zB6-^#XJ3`Gqgh3tb{J2%#aL8OV#Q z>f=|VZ$cnHwqVb9#A2`+Bx@L#VZ*JqT zn*fL=G!!w|PjQ6t&wyB5es@^Y#Mxwp!8CP>>(B-!rGt+4Blh^@$;;mmH-KQ?Sj|%G zR1avC(~KcrZBBYZgMYJglO;d_-CDhqhjjD5@uQ7w6M5?%(_x0fpBhN_DQiPS{e zVfMyPvd;BqGlURc= ztcQJc-@F!5;njo5nX)w&pWr_qvLw1IOXcG3Q%Pf-A1j#b8N0p_A9Sw98)aE#cu$%t zvjhtxK@&k_W|>tt;hIsa3hMa}CtIKIB_m}lsx~lGE@Wus8DD`ULsbfwYJQZ@%9&MD zZ{WF$>9-lz?ZT!Fj!jd3iR~vh4BSNb6v5qLfb2H9h^t8>!7Vi7qJsgAyFyt$^FV&| zcg4znJ<48sS?A!tYy5$U6TklqYK)N9zZuc@r8VYJ{|cbq-|TlMV7Xm355Rp=m!#=# zl)uFT)R>6wNEqo+C(Dt2941gxG950T3=LaE#(PfL5v7zgvuVJJ0!A(!Od-)J>tz<` zMzQfICa1F06Tj-ijz0= zxneXvVh}x|X#?iT%@AOjnBl{RboyyZfG%(rC2cWDOK!T!_4F-LZ>apGcp;Uy-o5)r zw}`=LA@2ZuA2F)QgUO~$_~OyEfs1NqI3YIJf)igomrdGIJ~R=bK$DVih9yMsnxL0> zhLvc_@3CB0Tee^-urGL{1p;vy5!LUYcnA9z{OxPk^uCIz`@d+~wJx-Ss{K~peXM3=8($}iCi->r(iLN% z&_&LnA`0IWmwHADx_Gy$57xwAAh1d`#DGs+8!3Oi|GeX-)!tmc+0z2x}Aa_ru{ z2oLsS4uw5_pv*GOdMpp_uQ7xqK!49{MA7Rda@vg*Oc(7IPks|Ja`&&M(@ zd%mXCSLOhCYRcsLj(7bk3`2bQ{ll@Azy6XSz$PWqVHh*rZX}vE45Gw>=*{o<)%8Mt z4wx8#wi}Q{I(%5-+>D*CagkFF{c>)nQ!?K5*Nqa!sa(ly54JP#fJU%R|39Ny@QI5irU6Ng?++)N|OA zp+Ggt@cK(m4uiK(=}ZQ;84A;+wv248Q8J6z?_xFPg(LV{(Qk>6x}trS%#)=7#iQPG z2WDKCnvqO(P!+-5jXbp-0n`&P2c1q6Nzgq#*gjtCgT(B?c=M8VKmZ%BIy;ly>+Y~4 za#yDAQRw2hx`oCBmttI&eICK^+?gFO$!ZrUiG-C)#Idef$^3+VjZ|4uNK7tqP!J}T zyPle@7ibqVeJ??5TXRH~YeJqv#M*qMq$3{-(yfyBhGOQ)b6wQL;h;uLBIIlJU+wAL zPluh{Ce8(Z6rDXP6Vks?Uysy$>D1}x(3wxa^eGi%4o8W-d&+jDm2(DN8n6!?ulT}_ z;(ejX(79a2#@M912+{0n+YpOU@>h7g>E?*F4G|vi$UsMDvX9 z4tobgD~Vgl*v=OITAtLs$8GW(p?1A*eWx>s=Qk?$XKkWypW{$ub(@X|(n5ata!MO$ z#5dpNFQyyGcOT=uy(x|-pRgwxM&2mqT_GjFSDvPbxs6}f1W9}>w2mV)b z(X1wzkgkel6e9r)r$JW3s@xNVKi%0j<&dCSD z_`%h!Ai*=tB9{676_ifp$2#yHbAsLF7$Md-hi&FTDW{Q#7S4&&%|f&O#TiFQMN7b6 z4`FL&_8DxmR55LnV38b_xvy%7W(+adf5W>%^qN+h(LG+g7ZG&i8nmrk=l;ZhJ-5cN zOyk3}p27ox9v;j5AQql096t=-SR#bV?w{1=mh@2HSsOXHspg$FuU%lmfWTDu(Q#A< z<<-kNXg#2L81kzE`x+8flW0I>RzxPx7NK|u(@(Ni&*Mk8E+Ody3f`&EB~DK&a)g`M zIehA@;D^?UMj3En-F|iX_?P|fSpA@>Q6I42oAdKJ^f1j^F2nxjX#c^2mo200x{e z&nhmD$ukt5-HdD{J~>u;6d4ox-l0kK_E}|(=~dSl5Kl~yklJDxJCoj0k1A26}JLB140j*llkQ0m%w^ zsV;j94X&k#Kdp3E@#o=ElALVszyURHMJ`lwTwoeWITa1$rA?4aP!2O$y{Ii5`_L zjmm;;I`3)wtBx+EPM&v}Pu=SkDfIs22(?CWGv?L=wkt5v3LWul|CR~_OUkI`vF2Go zTwH}V_2jU{v{0=JsT&W0(*cM5XAM$U5+rNbTq3z?6aI8j#bf~f8+eDz>I5fm_)bf&;O!y{S}(<7+9(4Y%*NA=@U7i zS3)u8;syKs{^>ZwvNHSg0(#9=Lb##D`W^=WCU0IyVVl`dg$!QX3Q^HWY3}p=@Nu~} ze{=)_m0=7mm}*OQ3d#R&1NVI1wZBCKuogXQ>k_pw>-GY$Pojc>v#PUuJ8_B-5Slej zHCLAfm42~B=!R8}$j1mDX%7JUq*kC^f5-F6(#hw8hWPK*#aa&#b#lLmYSnMaJ~Zz- zk?3NxQoBO#_{_b3@~3i93scnTcA_4P=Gx74D1HqrooLHb#Tz=lW`%YgC`kPDU*FBZ z6Q%RM3LQYDc|Y3s;K>Az&=3}ZKUVke!_E@Ch{K2AZ$=yfAfw~a&mb(r;ha5f}>%UaQakil@>s|6@&%n}I#JDUOi&~&sVm35E;BQaD`IAU6Dei1e` zdH)qa<9wQLRf(WL?a(A)R*pUU^}?$xZrGd8X13U8p;K&IUB}sE@KfTqaco*C$Tnab zX7e~aifUD7_j5nDP)10Ygu6NIez6`XD`@a2Y0Woj#B6 zxTMS=c(amX#?~;-$EE5;xlv>TWC~#LnFM!_rbgOZmViDl0fAiWG z@X7# zbs@(5Ek8=M{B6zo8&)Z&iN}E7t(fFMdT!w}n9n}9^I}z8zC7dXA(0koN`u*T{e>SN zd^Bf%!YnOvk88B~)B@h%-MVr9=Fi`C(x%ajBgj|0K5x$^w-SNx(8pCEpGUIETifk{ zzhtnYnPF3Oys|o7LR@%!e*f7#a(Ma@MxPeA0)n)^d|hQ$d+^${coDZ|*QnZ*Bk(=o z)A$D-fB^^~M`NWz$oMWJAB#@O;-U2iq%4D?>=zHOZ`NGP@{ z7R?&qMD74Fs?&m1IIy~4{sAcJwai`aOpc$1$PmT7Pd!VHKy^+-Ub{yFE!cs-+Fbe~ zgHnN#iwI9T_%CdCd06oWX=SmfCM|sA3#2Dh?e#B8=Kvvd&E@q5vc8`Iv)aj5f;oXH zyd?GAVi$0%PFIKh!8+PJvn=?q2_=h8FHxU7aWXFNBo0gygSo{d5&4tRJ)$WxX9OR~sCMu68GPcu@%dl_LGoV-m0R>bFC+ zVCX$I!%)8!=1aXM*@8z+rzpoz$U}q1wdq2?_U#dxo1JeBwMQq#0uZsi_Cld=OiTX( z(#pv5^nTH3l}g_G?}GA!$@-B=By>4Hw0#_lqhy9IufOZidOhma@A+Yu@Z*kz%1>_( zl5`zszRs59M6WXj4@za1>3(K8(5N{;9vK1s{a6z4H<&6BX+?Ot^R+0E?kjkI_>~TD z6Uo?#cK;;!0PbklN9X-p&OPTfUHs7&$$S}th6!{a$#JCL7UvbuA856AEuS>x_ z7G48DBAU!~y;HrIM3;I5;F?o`R|n6&YWX@E1JpYI=H^^PYn$@w4X|wn)mn>AmZRN1 z7X~sjDXQ=Jn9CzxbS@m zI`gxxtGIJDYEhe{T%Lhi!0_S8gF5H+@N?3)WX{ngFr$7!SmWN`a=mrJ!kggxARycR zlbYVUL#StUbC^rSKZt0*-fw)B_|R*Y9GV7anz#-H>bu$#DlL{^T%H$r0{jJ09!q0P{ZxUx5t)K;wZIiwS_bNXZVH^OjXkB&9@#-cYn z7hiU5<%;4SW~jPv-D+&PAWeui6G>;UW-oNoe?wfu8B^?YjgtOQeRZrc!CoZUtDJ9VAJ?^ceWjBIjUIw#{Li}2{FOO z8`+9IYZvQXpeT`YS2782=_iFKqi-2^(=X6ty zGT7>SUo*93YjP7h3pYN%(!nwo3T}7968!n&IUcj>*o;rtYg{0qH_a9A7sjs-*hDY= zZlPy`1ODQy-R>KcQeJRuS2o(u)K6AB0?^2y4ajb+hRQq$U;LXiQ71o2RVfvfs$X*q zOQZ?wVwQcM{vP+g`*MSgD0y4tvXK}Pj&*6P5*g+%^B``RaTh7Cwrn7G{o({scB>ar zOMzb*wvkZ@f5groPYw3_*YB^x zE$&Dn`GMTr(HN-6yG*z>^<}|TJ*LfHY(SF=ikS!3b{Z@FcI31DAby3&$P%l>RKA@X zqD9xXA=$k#+w5I{M%|Y9>5>DPBem}u^O|QB&rMLo204ik*evzZ)yFcX4%hCp3>b~D39b5uey zz~OiB>!_T}0Ox7AyF*a_X3%oJP^#TJnpGM}**5{blr^o@sDRUhM4b)|80i1yc!F}p zIpRtw!S4pBOkXa1VlP*!Q^CFEfBC)KYcyX}G&=;!=VZ3vjYaqXgWDi?uC!6#*8aIU zwYA-<;EeJJ;A-kYQVp1e3W#jm+a#1Nx2nCh;^hb0$hgW@CO=Z#;=Nj#fTB7k?76#4 z;&Yt(sn+KCGX@KOhbT~)8gb%Ga0t%57Gl*#WaGZP;h>m#loJ&t|chks?>9WAH?0n0eN(x6j7cEu?b@wyN9<$jsMNi(acK60RFl-9 zo-W0~ttFt8G7?B{skI^lZ~8(`i_AP?Zl76sBMDEU7$S1e3a{LxD_itA+pqNjq?pol zmC#9E!6iI2M6?6@$4CmO4FwwiT+t=Q#@J_|4RkFnhMbv_4pNA?QSvn?pRXK^%u9(+c3e-n( z#5BUhJ91GZn6YKKLHJIYCz*Sy`7|Pepo5Z!NCPYUPn|V}_hX}cAB!rW{KF#U%c1jl z75btDvwN{Xr_w323(_fcTTB3q`_T`i0uqu4sU`ifC61v$(1A(#fl|`C^s))I=t@wL ziS7_<<@9CaRyEX%jJ8hYUOEk%ZhYq}}d^o~b~0bnhy{ z3%XUHsamWiIcmQYb2|y7dh{?Js=d%SUsCEM}~37uTm?Ury<5K%3uCmhilV5 z?j3}1Ud?7C5RI0r^A9~6bzSX6S06paXQ=k7lmC#)?FysCr&jzDGx*u?lp`YlC@JjPUnk zWUM-@+908A4}a1dv^_^0eiV#T!ik1sWrlR>hUm(^YD@=FP)H{rfDV+NU5Fq`Q2XV; z&7kD(P`0dr5q^EgCYr<$f}^xnNv zzJZAW8o{}oavb4PF4+apdmtakK*W5Qu5JgCJ+m0F_-p|re4Ty>Q1cBr5YpVmr0ZQj zW8ASVdu5K|%2p!&SjG4C681+#qpYoU2z_tNg(KX#e?8oob08EB@F(QNFA6US~ z{pzdB^st*WuweYc$ghVmM(ynVD;^MsIr{UifMFd`PRb*0&jR5g5m|h622dGAnjaM#GO9;}!KSnp~4b|3gY?p}f zbawi%j{gZM9Y0^G)w+-!IbRBexFkq->4DUZ#Zik{Z9 zKSy3ZOFN%(q_;jpHCiYq-iLHbD0;iV&A-!qzA42kSao{%K8x(cgm^4yG6*&>K0>Gvm$ZtOlZ8hr3kK2p1L6q zxsoi61s4k!e$JQ#CZ{LISpNTPH+sZ}$_Ey--hijNzW;f$jb&?<05AFdv5{hA@#gp(ksuYWXuAvX!?U z4HK#x5uLxob_Iy~w;rx?UTN~gc5Sg#IFbZ*uQ;2PDsZ;|QPvY( znc!|;&}4eEzP(IhX>kmb0umR+90ac~9ti!l1JCuWDzSrj;2-F# zfF?0gNXHIi^D&vwateL!o=V>Yk4v2zEnS*X95g)cK<9(_qM@X~LM@tmrNQ&yNtkkNqBpZ}!!kbJ@3Pj0-DWkHW*O zq5!bw+B?WJxF3z^ysPM!+r;7LkRN$wagFL*kD`MGW%mkG#~c?Amj^{B+!q{qUP1CT z+eH(FM(iXk~42dg+L`LzHUiZP5byc z_@N0=cn11z&G{8ex?&Oz#sp@T8Z89oUazCD8L(s9yk&rJYzAL1m&0ANZ7aIT`YPLoOaUXkc?YijMgrJ2@tOhj)|n|a1u+Gs$x9Fmw;a( z+q)K40vI`;Gu>9Jo`p*l2g6BX!L*)SH6W$`^&MDoVB+GJO{Okya6B7M<~6AZ;=2VyY9n|ls=Dg-l>)%P10!_G z4mLMUnonN^{m4?L8d;2$=Pen=(#01fjyP$3Yj4;%l)Tb?kj^h4DiH?n0Vf@RO&9?j zB~I<>;hwV4Tssp(>m#=zao3Z3e z+Jl+A9=l!FmM=))lmM@%{IRuYpwFC0GHGZ5$N%+h4&H|+Q`u1Z-O(cd_n90re=VXI z!!nb3RJJ~}Gc=Er-WoYf9UEjEtFEFi?8YCo+#vu;4x)AYgKLF@c;>xPaUO5_T^n*A zkA-~Geb~c5N&Z#gYTC0B3afdg@^j{8nuvSr^VQfXl3ZDEo=I9Xx{o5!4fBY7M*JZk zak-g~%(3efC;(|b%!>4y4>B6`pRLtyVd3uFkbl_^7*cPxHID`dqnNt*Cf>fcu-U`_ z158bo9-4W-CBbnu76L4M!+>JgihIStcyMp4qjUMVM(Xm^wuMqPAObY$9ZmS`@6GOW znuC-iz$y$zUp_(~tZ<}*y5QA@D_K6^(hQ^tF7cORow4M8-T?_db9Js6294LcseFx1 z;8-GXP|A=FU^tY)kvWPAV3Ik0Ku`(5eTc5&#X(9u=0H$w?493@Vf^2L&igv*=T5LC0RU6a(0q+;k zr*vg(HZQsa&IARXm2*?K*B*EH&Q7SLw#3~bbtT89)-?iC zTEOAAq-&P&{rtua5!mUyZh3WNXX$7Be$)ldt4zE>ACvYFOv4b_y4-B(e?dlB1aF_L zlYDFe3T`hDpkrvsRK$R)Yk;H8Gx0F*HLlF%dLVjN`1Gr9KmF#gIrOof;1WaSy3qXy zw+466c|MVH;{xNz;G7wgl+(L;mM!Af zmehXl>6v~383)YBgdJ+^!q#30n^p>(_lQjnNhE85ci___R9S7W`H8R&?*BIHw+cJv zhAq~IBwk!%*`N%ta72r#k;C_8ZOBiBvBx877w zywk!Ws-D9nuwn>ithsqo^+5Xy)6AdL+UEW?} z`Q--f0N)^M)X3q`d0C6ProQRhrD5{(a21CbCa$R}cBinK_gKl8JuHQpi<5cOVS-$b z!`&KUY0yZLj`E=%tj^a;h4vww_HxZk4;!aE?Kos#7H1L=T&@PujP_NdlP$6J(S; zLfIQf(@H51tUVlj5y$G2?tahv@p074<5s6eS&Ow9!-?DwqhCy|;+Sn#-X)tVkH@Wf zS+kSK92*XXs8hw6B*z8gME?4+1l@3uij%SYs3%WD-+$6oCQ{JdH@cP>OvP)kdhM5& zZ)v(Dcd(UQ@f&MkNv)?grS(Jq*xW-A$Z6i{w}X+b_jsc2QX}j(0|CP^z1kXvNtt!v z68Q|~+81dyl6CTNWRqxaMQYJzHBqySE*BNn#vNb8vSjMbEQceMU5$GC>v(lNRV&m8 z&C~oavh%!l)1%(sMyXf~53?kpR;Q)1O<(e>TR1PtMG%I_bq)d+>Qh4 zl-VG>Z^k>F>jdR~Jr8`j@Ur=s%-83dbBk|>)m@A26SKuqN^=z+ygc{%c4(}WF zsJf;E<=4(Lw&IbA==~gB))ubBY+<^Mdimse3=;o%*> zwucqmrk=_-_%>*td2_p!P0y*BMfFrZI<`J&n7u8^FUv3U$4ZI4(VQNW_2txLpNz&6 zMaM1ddQ((lYq?2EmaGk|1Dh>D15ID;Jgy4rw&*{9{v{kUPpyZJ(FigbPCag;gvFis z!Af09x>hP*h6d@Fj(yG)J6HLGcBFUZci+-!!bJs@j)mWJhozL}@mifAn_Gt;FWn#f zOrFrjS1I+B*yG6N@~slH>SuMXN0uHUNivf93F%f+9(uG^ZB8tow!=C( zmQkDRw9@t3PpZHi1;1}@Pd``LiRp0HqylL(hINaM;&(rLhNl@T_2nxuPM71gqP~mH z1(E58*F!b~$NnWBW7j3Fc^q1JtV~;XEp-hIbe( zwqR_|rXKqPC%s(*6EmLHyHa*-!@fRixWay2@bHf10t#5T`^RJS5onDP+kG5oQC0YUm$+G(hbzwmqeCmR; zhS)kf4&xawqNRc{-=voIQh1T_J@z*CMj9oO>pM;Ntk<7Ng`Zj}DDzorHC&5j4OOOe ztmRqr^eDV9FR9YIpQgLFa6mOp8ZMrmJXNQ!D9W8QslQFr9KElAge2$rKVr^bh_T4@P2`wigdC1x}sOeDLi4TKK2 zTE8^#q;|UQFUKcSlo>cwAe|h8Zw>Zi7QIthU%txwAY3Xv@i0yA${}y#ufN$kjSHjK z;NkW^mX&YUwQs(k%Cydf(_MAzWUB2v#t37Q)zkJ|Nh^r3*=;eT-@aZbTpbG9bZmAh znXKa5xXN(rwYa>*{PwfoZS_z}ppkxS?$LO9v?bUDSxkKaCq13hxh9`NS+X_RRW;iS*x_VBVj$Ju!5=BrUp(Jd6vh9S+otCB^k*y>2JIrMX#L ze$8d0aIB$^!V7z}opX0c_@AFpay;0(yNw?tnfYwU%-RS`pSj6;61`J4Wx?Q3xMbbj z`#Gk#g2PuHF8Amd#+%vcJZHkxv-S32wH|-yA$TOw5zCAVKcB(F$;hfv1 zJ}!riy4Nw``W;VUyfDc`ub(M4&ZXh&zb++Yr6y!c2Z>U23fv;F7Tw5xW6*?Ui(NiL z`_I={KtqO7+`YiRA3l?*nM@`MgxI(*u$?qfDeP#YdOr_0d0Vj@hYHPQw~QB0GarwF z*g&nrG;P?Qg{6{Ii$p(a{7Z&8I(TZ~CH&*M0;vz2@EFfsl(~`wq-^YZ&dydiW}t%d z=R9de%uyV7Avk8Gnh^)%x*pYPKh7K4_HNq5k+`1dT}Ji7&xE|3o@o^%_gDP`AY#Fy zCk82Y!axiU-p&xZB>`}EO+98+s$bX4%_%vO){Eb(;XQoc>cyEu>2YrhC?6S`0W25C8 z4sN|HS)P#~k?4Z=vuuQ)*xV`OnK*0|f+YrBm2qReq!i*N^x*Tspkna+oxZ`b^(LG; z;bg4-82lZ+dyW*PaFYs?^e8c}XU@4Q#XOT~jC%ajq_02dil3y~^?ZKz4S$T1#8%5O zF5cG9@?Y5%UH`5U02xu~F5y)oL;E*4MI5QNcW zh@CuB+l*4ft9BO$NvPDun)$Mi%%JYw*>QE)HWMFRpiwRKaC4OaBw|J)KT+nSotkJ@ z{`9l;oGR;CZr_Tpsbw_Nj=z|^n~!gaTp5BTAG5L}+U6PMr3pqp+-?^>aV6sV6Kt** zb6%#QFNBO^_Bquk2SChwv4q=n`Xg_bSlkp{-oK_U5I!haDt<7s=0V8sEiie?n9IJd zF(?QM9W70Mk@8sk2;SS%Sx38RVPS^DbhqxrqpynggwaAUp`9v{xLaqI+r#azbW5GO z36W{zig8kA0=7pI%6_MrM`;WRuUS%;g)H_08ekfS;^o-L%tnH#3e*KW1#M%a8nOEs zZZc~KCv`X*a%1s)BcY~R;KhxRZ>1`)^o(x0g4;4%A)R(9`C&R)W4yPdL+iPXI_mBE z){ao-SlCz26N~ELx^cpgj6VA9$UM{?p~Jq&H$4P)_P4vPQdqR(`8RWqJmmc66QJpy zzA*iXPLmg3w&T`kN-1tm{8Lh^wP|zgQ{bqEPiVSy#6I`X)}vOxn0z3Z&?aL%gCVkTzUWcb}%XxN8%aY zTNFf&P0YP|{?=eC(CLk1kBJ+``{>I$=iS+OC&)4J>yu3A|2y!3LG;z?+wp>y4z34 z6#}LH1T}4A?v&BQk-;{}0y}Au26DVe8oc$s10)TM_}0v_lML}5X8O~pcnHgK`HnmHO38niDHo%wq65P=TRc8N;n zKC~WlwQ=w>u|?Kn|GpM~=kPaVA1CaiMGDS(B44I`*7MU0^SU--)o>tjW}OGc@cB$s zX805rue2v**Jig_^pz$q9xRH%(g`($uf5s%-yAnQpZO&e;G(beqb+ z#mS2c(F&Z97w!CQZUo-a#@Z56&p(5HXiEHK-fz8#x?aj*E%5(c;?RN;N0)%xJ^IEk zwjsV)yuc!7om|B|vcNLu%^_)YAf)d1oBjX^*6h9=LxWh=&QJ6{>kk&%O7KC2Qjwx2 zZ;DFNnE4<8GV|y@;0D)tlXln&rx+uaxNKoH^?R>C9vM`6wBB)e68GeSx|#9S{M-zm zo(a`>e!eiyXbLiQtUJeKo0k&*kkyZBYsN$8IbSrt{0wp!h2+(U@w^;2am7r6R&+sM z->9x#_07#T;>h(gqO(=wAvcKPGIKiU%-VYcpTko*8jJM`B6gumBVCs{lv)q$xIUI= zsQ0@}TIj_%sY`gSbYzzx2qL#os9Qm~np*nni%qH2e0pzIJ%VnmFFtC7eO$Nek=*1KZD0 z_h!l(5GeaOwb_K9;3i7=yqp3Y{)>*2_Z@G07AbaLP5BmfijqgkJw0>5lcl*mR6ub1 z`Zc~2#Kfo$K%d7746wPO_QPL~W#O46)u0Npk)3nT-7HrWdKGDQpwQ>`rGVe2%?A-~ z9mRto%p#UfqPM#gPBvI;r=#`pV+4I0MFxzZ-*s=^3$00fgzR+_+QG`W_3{$CP-D|B z6lLyB+&Sg3Sjm7O|6>E)hpmZH%X3q>o~qsWz7bE^-3?t(@8coGVqRcbI~LK*#!Pze zP}!E)y^swl9FAymKHQ5);2hAMrz-!T%;=oRp*I_tV7bt-Y2cl`c-7GJ6w5a)s+({J z_R1?H|FvV75Pj}Y@0ytKy{he*3#57f9U+!tD|YQC5;|k+T?3O`28$ajPDzYsI&uoe z>*@CDSdOo`SjV9&lLO4;}8mM};m~&5ri^3^!C&s`})I>n8W?6!DM9m+$oU zqP7J@XlD%l92!)#j2N6}EG&uiby3Fur!?`mU?GbB>E)e#(eVh@psx=NmH)}xsry^H z?(GZCyyz1@93mJIMm&k3F=5Hp(~~$^zN@3x(SkL|U4i>HQ=Pc_YqgFSvlkgN&$1sM zs)3+JUhlo`4|M}0MJ_07HTx~U*$5=Q2y34FAUuQ+WHw)XC8Z;N38A5oWN-<_H%PR> z?htW(6$qJ8kEnnD`98zo(D38wND>$#!kNG@5V9TT|K#g{Gi%#Upcv!11xtmDNHm9g zjP9P%7fKrIZ_5~GE^>BQymJQqeuC=@RVdOoU%nUI^g@MOAI4PjTI_vG%+F+Ebx8TM zSNG5B3Yh6l7BY51PSQ(z5%o@$DUD@_&%zKGh1>g#QEA})xPEslzgbOVzfou~W#MoC zb-A~+(XheNF<93(uhX5fSr<||FLJ#DgYq2i3mKw>Wiw+pl6I^dM4jJ6bNIW<1WteD zdXa|HA%>hFH6M zP@SEn(@dqF%evJ!Mu)rAq0vE#QU1NpR%~+MHPrSHnH|X%2RI z(r`gaWulx;cp9#-``dgk2YYXD6`Qmvi*32x&PqM~xqa=W+V$BL%g#pGoV(O}22RU> z=*$1V09m)pN|(uEjpfj9d-XuX>$m&J!MFI_-g6 zmLU7ae2i2EN$+ZzIEG4+@QW@B?oIAN+{xGab22&tzY2xNiBkqUKk&Ec`P8qnc$6Ln zlEX5IafWG$6tQ%6euKWD*yqNILEvc~J58Txf8Ccg_nT2(Y<=%Ky>u!Z;#9`ypNV~? zS$l`e-bhU9g2jkkniB+y#|&4er7p6``%~U;y-z=4>IXIvthcwz!vtm`trDr!n z{FRrmZA9KPiQE|^jUSglKcn%LAYUC>S6UTGC$}8T?Ee2xJw0Ldv z!63Gx6QluFIWi|~Re^pRB%%CIo#vm?#ben$Bbsu-_z3ZdE?zACnWqQx8Ggrd4RR=P zV|@rTs9BSZ^S6e|Q6=@nuKM~ev1ZoMU~dCq6%&8{Y2pb=z`x}^Um2V_5A0F4@KV)s z(7QLVxr&5|>HxICx^)qBHL?e1>-W2*2a;0wO2k5p3dEqde2MYB?VR zcLRhZ?(mA;-yq5O`QQ|3GG^(Kml9yiaf@ktF1pz#I4(9K#KqIu=G$3r-wY}_MqZ*q zzpOYfJBP#xrVZ93g{LWz%bOkAYpdA6!?6OhpUFBkDUIu<544<@yP$#OJ)5|Rz~y(WH(fO+$qYZRpJoO8X6%i3wvN-{W_Bs3j*V% zj2?=wY;>to^snLXnYozWDmyDWUU#u=(XfB9z*?Hsl0ioJS~=V2Gq@k<@1K370LY*A zeGeTZ2pf53c(_a~^?z3XXXsZb_cukhktwt*L}xYeyqK>uxMr;1O(Kk$=3EuMZRS~) zj-F-xL0)9rr1PPyi^C@J#4C+&nU2M74)AcQg7cClMvm#oPK9xIMdZ3Zrpq_7IY3ys_N~u~jK9_rz zN^iG7DvV?DaDEvD%6NExC~P3sP(ix6-WBt7PGF5CrZ@N2`NwHr-}&)j7^t3mt||2b z+PPe?e>S?hUZWPt8`YXFHu@ zjt0(d5&4I*+hqYKH_CP&(BVQKobQVjiq1OjEJV1eI%h<07>x zs&uwDuZOnu{FEa`9hmfgT6+2J1=QgQ!}PmlrV9iDtc7XBKQiO>Io&^8RxatsE%U&` z(%++-2PyxReN2D`{l=;qT?2ugG1v=5AfZ54P6){+kA)iy0K~JYO^N+L z2?$70mpyz+_Ee{ldTZW3N8sv$cYjHXiKtPXw2K4LA*Cl0_p%Sw)dA|SR^lNI%iI^hV->xEr4|LDii5!nZ@XI5004)x3OPa zYpbe)<38>$6~@Q!4E^kdIC!AO-mk7n$YAj(d@|US)9X2B?Kk^R&iAzgEyLUnoHp%0 z4bGD^Rm}+S%j$s8;Z|Rq%#R{KnY_h1)hC2m7R(E-JBi{{D7TA-3o??1x2BNn zG>*wM|J+ga=QVO){$FcE(e+;|6dg-w_8j#!w;8PY1VQkBl+C-+vB3Xh-l(E zHvlp1fMN|BMxrf17b8go`)Rp^nkI@ThPZ?>wT2vz7d-Vf&P8;JDrSB~^Qg8Qh5O{o z+z%GLE80)(FP|P&C$SYnv3Qc!-FI5te(H22zzVBa7#%GxFq`{ezx#?w)^(e;GY0Gw zIJKWRzZ98dsB<&;MB@%G9L@t$dZI2&UNR=_(2IKcX{b?B_K|b@a$d7;-5bwiUsKy~ zHR7{C3Z=3!hFZ@;(X)b2hYLqx;|2{u^F-^&R@0vABBaf%-D+^^{4Ih9zkx;6cpQ?O z=jQyn;&FDt3KrQQ3RER8Ebemf%8U2=$9WB>{NlrJ9lc#Rv)jY7+Z?lj{5cg*mGJ+c z!qan9=tjxpr5W=#?)TXG6_>b7q}6Xs>!-%EOTH%Kk-KAdWQFUO;3BI$yh4Z@TT+xL zJxZ1hrAkwnBYDhvOA#mClP*1e8h9j%5&I_TQ5dJ~?)n}&J`lt0xA z{_9fhlSaSVIP!UPj|Gn%8UFQjI|90pFRmJtWH0qAKKU<>|?ov3(j8}cFn^=V-YP6XED|9}*hOH}Cxc%++iZR$_j~kp_ zW;YG87lUYMmfHykf1^P!y2^%S`xqYFxX^Ay5IXYmr?*|8x3sT*FW*O#Oh}b5^!T-w zYA=no(SKapdr=2^_-FqTq91X&|CZrkZL}WmBh?(_3s-UP%(|27(SKY25f;Jv#w3bE z^{4oY!)HA-ClgVant!#%_|df0<2@tY-!5*%whMesUEV)3OX4`(HTx40tW5qab8nX? z9Jw%HgX(&42mdijpR#xBb~y9Zm0cy`=giW@c@x{=ku+?WQV(W|^}?f1Ub}T>A5^>f zxQ&c7%~|kpv;^;3wa|p*SFOLndzoX+x79@m3;nMKXT9dFIX_R*X$Iw^!lj(rmr0+f z%=c(Ogmr)?Fl|$!Fn2HiwCLW6Mup-yHvoIUtKHvibh0RlR=;~ifP-(z_SIa7?xIK_ zMAvuiB#KRw?bk!iBx;*RVpgq#!EnlT^5i5666XiL0xd3np1S!;LCkI{Lwl%#ZVu7^PEq=}( z_IYRvh*1@Vw+@!EBavw}EueszodH34V&j0SO=uY7X9}C&W~JCu?~!~d6Cr92u=Cxc zlT^hZm6}b>;P{Sgo=Hy2E+9SoRzC9G%dT|`;wJPcI!6Qf)=Scij&L{1tDCE+2Gy~o zn8!QZN=eeJY_(A_27YC0tntrUH_9Cz&Tq|4TK7hep;T7hr{}i(-rr`H+MhP~Da;|y zw1OclA!^o%=FbjMXD<58-o*IstMCiP>7<@XY;1kJ)xpX2cjO+J1FuarBV`igeez~y z+N=~&G4B&Q|M;MH%T7S6z`_%IUCL*GSnMOiZ8JeKa5OSFtA042Hn>QlBk2F^t37$c z_hc3z;(L_YHS)y9<7XWNLR@1v1{J-FF};ubt0#=1eM8GrqoC(#^TK=9TS2O`M>VV- zgsmT%_lR}iz%9w}KU1X~q`}4uWhUbsEH9 z_U`0?>ztZs7zK5#DlL25j+zhY54qH4_h7%0mFic{4ujn_)b*MPth(XinWC|;XJ>xo z;dT2Unn1bcsS|1*lK-SpyofVLEvwFKnaeeOwMjRa((frZ=+_%d&)u1ALZT{4f^0J^)DRhaX5w0r}sQYa) zTy>>{%}*02_n!_TB|HFP^OdS;>*?QSQ}N%92l)MuQQ~Z(7G9=@rpQ%vez_XceaeH; zvT5+wS5wvUqx1YE6nOZO+J4~v*Q>IxZ7+_&+xvLSyNsz~>96CR3i}7I%VS5rbR16V zo_O=lw=Br|dS91(`-00V=uj$P5;6)TneoBP2i{viHwsk`w!G3rU9Gy^a5cu%4{8a^ zMTdve_?h^xkZQL1a3y3!O7TnW1$67t%@5WK4Vv8#XMJJ_I2MYK@TV|}6;mr9k-YqX z?GIgXJnt01A%Ri&+Ls?;)GnIvkE?5B-;ONqeV;wn2wE@1(K4j^purz>u|Fq64@BnO zIUEUBUUK<{HB6Dc0NzoH6?;+N6gnN2rEL+vrMA-;9OrPx5liL|y(}-QHgA{Ji-QdF zqmwr0N+GXQ`vP1yIs(eqByRJHZ8VsN5#spMo+0bq6>!X!9&WGM1jfwaJc=(Gu$1*I zTG57HveCO@`p{5_GA==F?Bn440(i`Tc{$hdAAVW_c2y?4|2?1gE_TiX;FQ27|< z`~$wc$$DA0jPz; z)vb&dSPJxh$Nh&(jtX_+yz&b8vNVgO@wc$Y&&nNEv&)G(f-kh#o14wU$%xkscPvY;$3$n`9v4E{$SwK?)k?CF2Z51 zF`ILfzIx94$L*WJJ2u#*h5N_V4}2rVwb>Vu?4`N_;sqY6<%AkVge=CVg{ld>mzsNX zbxaxBHs_2xnsOE$Kr`p$mKe1AWkA&*5!^}i2*#Gr09z%?c<}(nG{y94P6M>!z`MRV z)tk>|PBqwZzp*W?py4!ZpVW@Nxo%-Y^Vosw5##SdSDdoYss_)iT|cOa=HOnr2=Mm& z;wvp03Fc2wm!Ff8hIw`R8LJw@#Ko%W{q*|_#2s9(2LoU|1p*}uM!@(z@3nGvzcv-< zaQvN2IO9o_S72};9RGb~Y?AY@dEfx8cdHc!JT0!O3vNS8k{NmHd$sXHa)z#YoZLCJ zjYj?b6^Y8>OdQyc&YBT$Oa-U>il$iYjJJkH=`+MP809uw5d)=_frZfuFJsM~BEoQcyCA#uMeNqSVVi}T^Z1|9s3(`y_*4D52@MA38- zVVCG7+^W64v?u!i?ABiyAwzR}zuu|=daY*o{I|F+Gei8l7C8>)vz8KjiS(MD5w zqXtqhu+qEvNc&yuPWRHIx=RLh6_1lHPFg|Yb^U61ClCApm4-C5c_&zfG4;}0wRcIy zt?qrdfl9z3Qh9k7{4)I92J)Qt*C}qn{g5s*wFmJI=*1E&)VHk*-|yoX7l|416oTHz zHb{o{eypmGI(_$KGFI5qtJHRpa^Rl*2XK=+R%{}VLrtTCs^*L!tFV_(Q46N3F#M=2 z{vdg?YwOt7^Mab7oKlgcFWat|%{84p#@a9ktK>njy*(!jJi#W#R@pR3T{)d$owiMD zsV#8glr&+NVG#Q^1L;rpNxZthGBs+G83H{YMCMmFP;%A&sjfdO);xM)!SH1~M>L0L zs%mLtuRge3tSqLGGoT+Xo07^X-B+;;s*1~4yB}eu_0bCN%ovV{$MEyRV~@0-u*S}c ze`H$g?PbdP)V|Sg%tIrCZxu)zOT-;_!1yoeokn6W+uS*<^-T`J&@wml1%ocvQ3Kzs zWwUTHi$f!iQ$vq#QaR?Od|^VAZ;yQ=)FgPq{Y1_Kf$4fBUgTtJ<>^<|A98UJ#iw_^ z`2%r^GS137@w}2rb$xBPVdf}n&P1p2*2d+KPeYPe6#a2GV64Caj{e8nJ^*8K)wn0X zx9@mj&?Ix?_z~<>z5PNUayYSFsef0LTDJAcS-L^D8YEY%$~ascZ`d99XwcmAkuTy8 zEC=kL=aLC<2_`B&fc)(I#x7FneKCE)g0we{W@oG|bz+p;BX`@$KF6rrcTcpTTvtA| zaVKgbRiD0~)AZ&bS1`U~SeehcvtH`ed}2jWgM8ywK zJBqBc#}|Dcb3=1zE%gijNos^3qwCk4;E=s=7l}9^!!KgjFe1gUB8#VcZlDq71PoM6 zp(LO%3o|j}t^Ynhc zDkq@TI5gib_DQNCLAjO;=c>s^3SuKX*5=c&SShFv+rbuCZL+b~>s<*8bRQ&V4DwL| z`KLH#@Wa({Eb~X*dC9L`A6fM@kC0pW36ePvDrJTJzOUNXo_ti}adS&0H-M3TaUY&= z@t@t0XZR<(6?%#Y7AwoG#JHd)Ee&Oz4cp1Gwn&{7HV;$jSJZQ;qF&U}wmF+~$b7(M zKmt3nX})R+7Tf@onP084C{Nall%6Fdd1?&cY@R%2B zyJVfDoc416!_FllPyl}6IJ`vE!<6ARKC{O;5U*A%@BmODt|nJfH}F4uhsXMG-j}O2 zGx>QQzc?KvRXE6SjB_d7I^+5B&-_g}7YHGPNPJ{;7m@o2duM(@Y|t+n{a8-hn;LZ4 zx(s+V1(v1>)1|ssMovdc;!JojL_d4+nu5f@6ZmNlKUB`WULOchZ`!Ve*c#W4{oKN4 zABdtaYLS3*%BvVHG%TD8NCX0-nq?=ZhcE(KZStqUl7q}39`^p(-K^hminmE>*avv_5puS)sNS4CbK8% z`NN=^wcj9#I%{{8NlS;>Z8bS`i&1;?_1Hp%)aOTq)?||vN^4F&eonVz(_GjQPW_iC zvi}r@V1Ilh$*uiR53aztnLPPQi3O=OQM`(G;y@-4qLRefmpxEz-HlntQ^Fq!`Qn1_hRyc3{t&9>Gcjp(-SX=;H1dBP>bIWlT*nrE?~3j4uAT^XR-4k-uNAmMuVclhnx(H)MEVy9P@uy#Ri%|%P`CR`a-di@x|I3Ylc~Ag zcXiQNUdG)ltrNU2Y)3G%-vJ1mxu(yyKT#k7+yzWMbq0s=5&6P%Pq66N!1oGWEG2B( zu1?Yw8ONwJX&R9jh@8GH_|#kGGA-5o#v~UZUM7FtlILCa?RjGmc{#*2js4)eU}Ng5 zfpfokmQ|I9-gj@dr|{nU)Z13K_kTl{fO}%M+xr`Pszie(_l>OUxg@GRE*<-{i~8xZ z+&cLDBVu&QAvWoj+4c14ccs7&q^h6u&If7*Zy4u+DL`z6)yDmvrTN`JJ!qjSS^x~T z4LoimFThsYMS?Ek^;rE-n|(`8wT*rHD{(;0CT@z{w+aNqAMo-lx)bxkC$?)Q!eN8VmwmLbt`@@`Cex_N*d_(58?^L?l`ZUP-07u{%4U?dMu*Ej zj3Lf6cd%A<>(j{2e{l?6yd?B#vEK`L@{xP)=>wZ@3A%6MX`@<*tZ~FNkw0>xI1;d? zBnw)&ezjY}{%y0iR^asJf&3Zt`AFX4;HSZAJv>pO`W;dj#Xw2R@^JxGZkDX%QlsL5 zF>C%L#-y5aEEP+RV4FW{k!omnT~wX}L?jY@fblKy38;^5L7I5X6Q1C6Eae7Woy!B0$joQ0=eW?LoSeG!-tl=bR?*5m4175Q5vAL`Yc=%D%RN+EWVdQ?^WcAU^Cr(R{BQ8^@%@pNkl=j+AT&U>2udZ z{eFyu8O`;+nd5RCqfxZi)uHK$?c{Wqa7AOqd` zJnUTOld7n7G%tY4e;>#qVaj&@Y62KvuBoYU!G#=z&oFjY-6cPzO!Td(X`sP9u>`w( zb>Z&c8v+-$lPK$BC92rlPMf&vb}eWa`grAY-b*jE3I;14^$?M)H+U{)X|7z($UT(p zdH4ZT6VhJeUumwRSIz<44zL_&VRNVgU@Dv?WDU>P{d>fxCgym$$T*ws!nMdBTz!e@ zUxm;nqH{7l7RX3W;`EIXDAC*lkc<_c{A;~opwUpnRj6(H1L9`eTS2GbY<3N*vZX9p zc0nRs8dPL>_^sQt#$W(vlMUtkkxxYe+n0V!t^2==&0CqjwHW>u#h0!`f#wU8IM)O8 zYbtxZx6OCO`n)HSDw#BsF-}E$5r~4HG#|l8ZT5i8e0XE@qOwsi&95Yy!_2b;)eWI3 z=D5=QJAUTuI3HTLH+wEvw*1mK1&5~P&)ofhlf{*~PVpyj%nP6SvRJhYq&Ol53)-gZPo#@tex_hEO6K~vZ-NEdI!GF1JEnLLTU9)Lqsfz_+v@rm} zod)vlGkkUu&xUWGGn5$foH0UVStw&qftc;!A9(0OH>ILeQov%$_l*jIo#$T$c(`Q{ zY^1Dyu{WLDm^&OFAEdsNet1)aE3SZTyTxys%YxR#!5^7w*E+)_SPbG#$eidDsn?zn zjB6>Ket#noAW~(|RrVHgxaI@TqIvoQiEPk=lv7_5w59ppYg)Xbb$x6lu7{aMq-rrd zp%0cq5iCW+gTD27p3_3lDXQq=HAkERQUT;Z+6P?QMJ3kDB$Ehn8o+=Ey}n~Wl$lkT zXFR@>YTGUaiAl(Y)f}Uc_E1XoeO$4GR3Hhry9lN>i~W|A=w>6{F&*iw;`%zOh=%4}HU58x;i<9ed0-cAQ_icP z83;d$e+IApK}B}nLd=Ts~c6u^+woY6kO@V(DPbiN!0ngbliTG<5i5I|9+h%#} zm?_X+>(J-E*Wx=T;sv}CwV*O~(XHw5(Fu;vy2cX#^EooOV9JeJeBdg|?2JrBH(P-8 zFqURsDEg;IN7umN7Tsuem=*tXy0ZhGAiS<>K%C1c{u*hsM=>q12>+3!s6)bkLDndK z-%?{7K~o$H3d(i++$h)A^hXI?U{VII7^dVRfw@fu>9ofsg%Krd(?u@5MR$!^y2X01 zq+nFcO$DY8NdBHhX#H2;+kgZ1#q8ZPKTSArGf=xSqBbdY93Vw%MgB|J{rS`r=Aef? z8S^YFyGv1UOzm~!1dW2lNjX+8CI9-6fDlYlm=c4jNx%KovZ&@c5G8F2pd0XV?t{(C z)@NNS77mq1NV7@%EuK`as@?35)a;030Dlp%{45kaK0N@-gjE52qBZ%AcCad4!p~*? zF;-+_VwF6)VHkC*TrJ=gTkx2yuN6L++idLU6p1L*L&>Z+I zTaNfvKK$ELJnkZ_hWi8DmSA9sastD}WK7ocdwVDQpAGx!mXFcq?wZh#&p#ah&l$eA zWH2d0*^k`rLtI3ann?c%5vP*X;8}WCE=pt9FLc(IUr^xy)J3c~PGR`gDrX6(o%f|L z+e!&``j__H9J>*npT?0~cuKlnzI&HW5G{1i6KBZ}&=toofPo9phG4&km>auutk>(M z+2qWtPSH3(>3)*@9@nDwA#0&h5_$j2Cu;-9fe@G)vbo}M3WomC7;;$SUR>{e7nLy& zcsPFLXW!>dfYg}{($>@$r=N(3XT!97iEijkBD)trxK3e(?GKykx!|611ew*uRX%e( zqjHTb>Guh!KWb1%Mtf0bKa98Gb)H?7g3%vPV%Lb{!NB;2T>0GTjymb@jR-X!w2-7N zR=W_xK`T#}a2Osk6uB_8Wuz~&r5sFiu})xc;lUDbyHKG;#l_&%PH>tk+PMk7um0b6 z5`h0xpn}>rx}#6-CwcpS`Q?f1fyH!U(f=|W!*LW7RCbawW3sSfyo+|C5 zDOPlSytX#oie?R4lg9D-b9?Sth6Thsq*>y!Q7L0fz(ULgCXn!fVO!6_=m3X2iBP~h z9Z2Y{%&PjlSEyicX=M;Xr<6knt-zXmU0fvDZOJW5*>ethCB=>%MiU-G(?CeAZHqH5 zDEdu`5ahR?TO26^5Ga*R=Ou3CQ=uGfK{zACEHm%a3hzc`ZtLK0#Aq5-s3X%L6LVYN z*qd(0AH$>$;z+dipN^|g|3O0j^Uv34yj^%WY&eV>>who>8g{jTfPh-~DGnV&yU+FF z431eVBSA{96R0XMlm`zlt+c6Q^4z0p&pb0>QhKoDsN;Zw$r_-vFj}Qk2{Lh0Sl8}6 z>*Ej!9)N>84}vi`ohDw%vCaX>Ywfp>zs?&lGRXeM<wZnp`!XUT8?s5yJxACzXg z0vhkufydTNz(fkmEVcjwhae?J*S!y}8ZTx!NMS#TS!$S=%5z)%KEoP#w+SM$5}bUm zk~4)$9%Hr&Z&6o&OT*hdb)+n3aUYuSNath)=?4GXn=f-F;m)BIVR(PeWc|-G`^$m( z!zn_1Sl=d~l`xm-B(5#ws!GOn)zI_~M1Fml9K+~qPx)z}#P8C|E^s>YS2xq4Gw7RY z-ro6*x#Ij%Iemoe5Fzzb%ca=1j}NZEGq>9{PArD zBg@@xEWTp@9+a}^tq`2D65HRn!0#Lqe*r6h?jCL68G}RTM#0B*X8-Q7%K3zD=4dzr zhg^QFdJy6+g#P!>J7ekl$lwA$ElE5WQDgrOU(BECn2}Ijh8Xe|ars@+6wnCGa(mfz znu?Ihv)y``kd*#L?pmQ&lRi^tn?Js8;KzBuP5%0$X`JMx_dhBa%fuW|8~UpQ$|J+C zNL(oNi+F@=tYC!i2=8bu_+ymC{kLEnpWJloIMgw=Td6hKY%pz)fmLL#y!$-kYt#5@NZ04T3#4&OSl&wi4cJwFFaM5st1wLguv12~6|dV1-_ zIy*nEE6jm{^h2|d%*uuLMpLEh zO*V#q1TU)}eaafw2&Ty(?MH<+(9$-c(%TMr2TLTxX|MxUhP35j00d|gGw+ro$qH4@ z-WE!8fN3R)mZcdh?E$SckKEv`q^r02I_f-bPJu2GeL$OVcF@x)=VJP#D{iW{In!j1 zJ33By2Y+JAvHsi#vj=*?%i4j3nOped6LZ3h6Mi(}=zm`#`JV;lji-6J7clX2Qr4hi zC=6VU>M2p6LbIyo9bd81^b&1AQAeYD&Cq3?) zcg^ka9!3&aC>8P7L2L)Qf-v$3^XkP9em)y~>QP5NP(4Bay4rJCwA%2X}szAM&i>)ke z!UY{G6}G-uG}h0&kX!U;WmsJl$mw=lh)*VgkPEEMJJ9w0oqKx+QK@C=x1N5+;q`j% zyQJqBi1Cxjkfc9lI~OyPA5znk)<-W0f455N1fGWbPOp8{vTPHbv^_+KGNIs$=0 z|3@X4DIBS8_N?Bhb*z`&?D@6s;yC5#^i#us0fdJMI1mH+~2n!WO}g&jz$h? zd{!yOK4*14DA3COq(cBw-B9*v>>D!lg^$_^z=@tlm}jt#V)W|l$;U~p3{DFB5cMkp z=HqYMmq;YD?+x=w5dO>Oq<4O&U*%&>jYXi=We8g*NYOg?gf*72DF=R5+XpFN`q-Sh zW+N(zv9)qO>2EK1M&FLDk#d=D3e}AQG&ztA}UVK;I#dqb+ILvSV_TFo)=Xut% zRQ7P&MOhEOvL`J*!YFMxRHK0#K1Ky<+@AyAa=;uul0Ku{leCi6!$ba-W&@}4$5&TN z82R2CyEWtdkO#^3%RQjwp#E_aOHT@D(yWVRGj2TvlxTd(EXcohJ2{r(n_h7ojL5Uk zE%NEjdW&*xx&Dkte|HQ_@Ul(U{`nPD4D|XT54`Rw>Sn zNK8eO+Ar>NAA5;-&+J#_vFV?vtMcofK#BDG=ol>z=}om;{(t*VEwuK z|M>TNlraG!n8?&AUs(4U&*n3$QB^S{3258?<;oF-s@9~DYOUH>WR-7o3rz*R`qi>= zQLHv%A584c-e!DBFDH#;Mz`xIYJ zU=LmxPr^n8@Yf)5`)a&i(SpP*AIUcL`k0;|D0OuCoyn`rTRzIq?xU}9V@6HjFK%N| zd85aDxaBJ-Qzv24#I*1~{XG6y=>@H*S3ogX+|l)o{fskaq!agsw|D$AaL+ir_b+Ui z9zg^k)G3~It)8lxKdFnk&TirC^1|}i{$$LiKbc|e5H$~PD39h*WS{eRzsL9t zopxqiEuo?;`Kq|-X{bxjyeGRdI+miiBDhum<$Z@UVvr&hih3Nd*J2IW@?lW>PaLAN zaS8Ss8xw~AWRdYH@C)c?;v&aI$Y1dH07PK--IeEXim7s?ad`4ySTlr?C*0beTO}e)LsuUh>u6{aHrPU^GAwHQ83^Jaa%3NfQCcN-{qCNjD z{Fem*LxIZ%Bv-TVV?Vzetg|fezL$Ry-96~PJTiscKYH{3OH2O+XRA_o^R30-+@wbm+{>4WDFFpvW zCWR6+XX0{T8Pl95*`niW_(mX`+TTP2f3Q9Im_=V5V)og`r^+0Leg+W8FTkC_c z=rvsxZ8@s!uH7Y_&QcY9U3;J%$XEFq{?Yj_9`8BQzgLAqZG-~20L)VNhA#oSWR?|I zL_g11Nwf&)om`?nj)k}xsNu66xNPGZB!Lu$b`3Ptc2$ow9v`(g*B&L#r5)Km8nhy= zlFN$P)9cP;esgaH4VMr zJq?(~Snp8ED8`m0wWkA`O7G5K!k(Ge>2ZK0U$s-3&2GNv*OTS|7D8>%u8u`?$UWCP z+Pl`CP+f}(g_5YNrA7Rh+<(F5kpo0)D^4VPHleGsZeNnBfsc`sU8b|OjplX~7(2%= zJD07@{!qBX?m-ZUmgUUUV?)C@GW$o~@p~eSxyti{{nb1!N5k{&o80=_X9AjkndJYJ zEtsI`kb5|{CpYm!@4YQUo~u@33@ZiETA%AQ==CL^L9N-Ew?}P5i@ciL;lC<27(39T ztf$D3r}B0KTGj2YpyPg}AL~rFH5$^oPwMxH5&z@wvd@bGU7ubEVrx?;1?tmbZd&Gg z?r82=0%^0n7_O6VPQKSgOBd%)8&=6}Vhq^&;!+I(djU8MUt{An6d|vRi+C%zARZ~u zAl{FS?uFQiDO=!PHkv(}{-r87G)&R=diA5ntkx4F^a(F0=Tj5S#2fXp!=m4xmr=?5 z!k#KmHC`Ro)4F}-F9eq<73pJj5^qi)<7RTgP!am!Un>PD;HkTK~o(ymiEJphs&kw_X5BhqPC>th; z3G;TJtDWgso2H88Vxaqi2lKY({3yH2?cV>MAFVQqh$F*=Ci6;1Ijp7#>==OT1Cf5q z^#dUCj1H~sqMEvRK3OusYrYB);-J)?rIekqxyX3Y)MUVZ9{$16B;+~WVZi^E(}0l5xT3xC$T@2BMC!_ zU4MX@rFUZBo;^o}PLQ6$`9S6ES`CfHjh0@%@F;H$9kg z*83bTgVXLX!l~({_cdga8RVLGz-XK^b%2b&dlXu~9;lV` zX-ap?$iYgcUR@ua+LMIxz~WV-?aZDbvJQ#X?qf!kZA7IZ}c%9@xKZClso4IZb!n zRwN-62tpN5r6N_0`5vm!vEL$xT0_^}-*d+~2OsgB4KH&I`5Hgf0%9|y|EIl|!?iQT zw9M0TjJXQ$A`c-|-<@i%QX*>Odh=%7EyM2a#K}^Lc(kvahVEoMKd+WOpi~wDV1oOW zl7}`K6s75J;`V1xIh*hqB3SwQU-oay>P#is;t-#hz?-qd-rZ3mgMbM*lbVGV^Mj`&;J3)0$55s2x@YKY_RG4YDj|HmkVpjJh^t1HJ@N z5&;Y{-@3o{J?Dlf8@ZKl1Jw4osJS8Zy>*q%+^clczRmia@mRTpswy2I)n;m%H^7}# zN`H2kV%@AmoD3>Gh;Sg0;MQGjlWC0B|GaX5wVV4+U+`bc@Q+K${3@&Q!RfSlG777Qyl!y12ZslW8$n&O`Q zTR>uO3kM<4)?cp!%Alo$I11+ETt~8dRc$pHTCaETobK+8HMc+{_2nef`S|GBfbLnx z+%T;dJzi&OI`G1((@lAZ5U2 zz#B?$Ye45g7omIXiQNZ4FOn5lU{JnH`1=XPO{Osz?`yGcoI@4^Fpg^@G z8x%jD-wgm{Pex^amSbyER^0G7{P22>Gz4! z!*Y-BBrgTd5h{fc8>&lvt3C2%F|NHiRV;Fr34VC1s6oBX3-@(V?X}D6#1^TK5>#j& z*6&R*ow6BYt5=Nb*~n7&b4cI%eG%+R$^rx{_JX3T(}taR0y3VHMGx5)sVlGa_I8Wn z*Gt}~=zMTsW+&*boMve1?)366t~pm^#;h{_A1W8ixV!hDoS4QWrF7s1kOg3e!(m-A zX#EvSbclrbJ3NgNbKS2UK)-XGSxq+yd(`%)$i1vgEhU;hk!@c~DU%4{fobJeCE1VCA$x=_aT0>25UxVfc zB)OmOc)Y2H-{V_NuVXF&v1VO8fG+)976f)RBP3Y4*!DPrC|~n{hK5;o63~JEE=Wmh zhX%Hj#v{Tt8aO%d9@*AtPf4HGr6#5kp*6v#a zA@9}OUEDHnjRgF;=1(k$M6hG6XG(HSi!00Jq3t3))5+MU^-e9{;$R%gYnSJ$=>(}m zZ~P&IfmYj7ICj1<_Mll|+aD7Ui}$z(MpnI)WFUSfKt+RT|1)+k{~PX2r*tb8Xh2Af zf3?66W=YC-BW(pZ#|?c%C8ZmeKm#z;+)YlyL*D`&B`yqNii1wObe8p=%Z6U_54_s2 zYUdY~IQsSGjlS!_8oF^Fr05=A?1|mhp?Rv@rZt@+?brpkU2dtwv>HW4aSt#VBJX0{ zxhGEefd=EJyuaYu1a@!oGww|1-HnY@QblIVG=FnjIs4Uzx;0tMx^XsQ)(HCEBeu_9 z+B!IXyZ0$k^0xUfMQ~e||F@OZGT%HMhal;1ByJXok|zD@$z_kreH^0ff4a=~93|f| z>>hXviK{AV-baaBd7wLCrf!G=-DXs;a3p`E$3IhOjrp8vL&NFAN%Q)a;M6o!;ruP$p|0?XVmJ-;Vj$ zRppPS?_cO+o>B2jtD4#o4caU!O){Q6jXUE@wC}25r0uL83lpkxG{mV8h3UNn zc4J1m6xT(!{b~0<@-t4V9ED$<;hBk~2gI`py3{0H@$)LnWf6qEUA4LB7ie-H;|2{^ zD%lLVi)7|q+?Rd8_A62KcBjy(X4juq<63EVq0Jr^S9+`!%C(Hiy{zF?%u|hw4w7o4 zq*#x6607H`(A;V>62W#c-I#j(#0(GO8yu=0ec19Cj7RBq!afSQ+U0SKT0r4wnM#g{ z%VK;%dm2RIy9%3rRn8VTb2w9_#g~7()2p{gGi=*cmF%)zA}d|HF2vSjgYPCdQsxgC zS#aNYutwua-rh-k^zCMoJD4~09%~2 z^)oTu1JSHP(+GEE(-QHVms;{<2l`Km9%S%pN>In4K<65UIp~k$J}^*5>e1kMTpeh? zm)-HC4?M7yqR^di6!oaw^k!$zdPju_R?hoIQe&}vQz$nXxQgoR8f;s*5gxlBzPDxv53u$GMrmz&+UknC_0XD1;`z2TW> zVihg7XVtQ69+p|Z`$Mdn3@!H}ttWz@*1BHNLpE6nnbjW^SDn8QXK84oP7wgRoD8$t+USzq}X0u7lw57NldQ)B& z(0n@jXh=i8SHL%jS?MfExVH(CPBy2LrRbC1T&^)8znxg=9>oxO6XbygQX*$$fd4^D zoQ&>m!0`1qlJhjQlktgEq3V3jHkG%}ehUuoa6j$63JP$#+3LAgewKA3TWZ z(Yq)(pS4?N0PYA|>TnZiNeDM1fLRCa={(<&*QQ2lCdWi)DzWbjIvt2~pwcpfC?(t7 z#b~}l63K5U<2pR$dg{LPH9jL&vkenA;Ee7Y-zI|A^f(gH8?abV-z&T_&DvgUC@K4I z&=3;ll>Qbn-c2S|jzN~I)nB@V#qXm^w(mz_hBW%oIEqePx$x_3Q52>sp5FAP+!^Gg zvU!81jP&oTj+RIoHQxx%4Vn!7p_j&@MCJ~E!~zq1>M5|S_|CIDYG=H{X0MONY7&Se^YnY7dRQ2lfXgo8ni)l$W}vTvY5=h96Xi z@xK_%vkq7wxVLnQqwH`Flj2v~Mp@c$U;$2GJ%XN|lY5S?jNXq$!-I`L$SjMI858H! z?B?CxkTvuznnW=|9xotwM!4J%9RH)A7H%mitk79>_j31tZ<)29FrK)6I zJkzx_rX?;9$mxQ6df3uAC^_Z??MV<5h(qP%uC*YQH6%|lVe#Q(p}i>yQ^(Uc7T)C==o~p{WwjZdcq1B924MqbZZxvy7*<+V|*o26e7DvR#JKcTX zkMP?k!;-)WxOyUl1!Lb40mDr93z45wo|T{ox>0$v>Q(s91RW<)M;#cprc$~DMHV-v zeTqVeQDpfuvIXpgmF-52#MW=5uQmvXO^ZEN0yZy*%W`ofD?_eVGjC^MM8tLzUEuRt z*M8#Xq=`DFfh%5Nd?eWpgeqL?H#9_Yjco@GZz1V3*$(~Un=snUx`xP|k|mc?if7G@ z*LKTtOejkd5Ji^KAj8a_4QjZ{9*A&Of0*=eMMTa4XTbhi~QU zCB)sg@KK>WWW*_ouw6p?#*$Iija;Ppw9n5q{~r8d(o>of4KIEYmhSM(z?9fI!My{D zeo^|ithQTc`m`8tbGCS~C4)H^^(O7poO=^72#dC)v&j-`M}O*Bw)-Th&yb*wkdqAS z!iYYA8fc>DBHxc+JYoK-@%B~u+aa5M<{NE`&op1XvKLXI67_P6sb4Kopq;&>_OcoF zItLm>`1f8);=EmI`CrNp-J7+Cp(IY^C&C&U-d4 zg+h=DYJSF_?0$*B9`jb)YA1`QZyUKLQ4E=R+2s<#-#T54NtyVVU9rmOxu)-h-Z zZd2{_`301eD35z+ zc;{SGEDmMSqnSn*+}2Q#fEda-86A}<7Qc_?)YQ}qg|XYrn=*#&@^|&URXQ(r>pW%m z%Ldtr1OhDQ+X1yCpI1(S;TtY3(~Zw_6#VOC92ozNJ%vN-2Ud@Y#EG|F6p zvrkuEO*T%W>(BUq_|j)kqBbymwitHj2HWpO{Biz8N6?(f-KM(+h==jc7#L1>vO-)4 z{@5U+1#sD@5~hRU7g8Aq<#DrAU2vsd*t;wfo`PO^pIA;q|A0(vY%*O1a!s#^ay`L70+50{edRf#Z z;T0>Sb2f}_r*6!=lN8BzLv=qPc^BjN5qIng2@(W82bp*i*V+#)aE%a>ydy@SZ^cGY zDaL(-?jUzIa_~eloxO=kLz4ZR8p37*W|j)(%27O(EhkZmaHtWltRn>Up+738YJ6*! zwtbZ_u;Nyn9504NM!#1x1kI4U*LY`D9>UM4Yh$kMUF-*_=Sj+9X$r@gq5RQJ4<6XbOTQ9O`0=-ZcYWz$ z)BTpl=ID*LFaLVm$jW&>B*kh8ggk=pCwP^H_<67U@kM?k3uq19s4)@3p=fVu*{hV4 zj38Zl%Dww0D|#}GI%XJ$Qt$G^6W1MXC-b((P=v^ArH8D8w#pmDuG@nIcqGPBrlsc0 z;?-LSHPkbjQ4O?iVVrX9w}xsKmQ+9Xm*Y$b!`DF4wKv}16};z39zcj#xSm`#QhqK@ zc69YsWcos483GlV#M*?4vO9)nO{;j5kfU2`0fro!w|>OVgj0+OF;e}nA98Il*FY14!={s%f!wSdYiCDz%r$l>U=YT5_AGa>je+(;TLQ3uMXi8c&lvkt^$c&Tvp%Tj&Q&q(3OGKV5bqp+ znSRV8rE3O(``J(tAl8M77o?<1V|bFgoQ%w1U41^|XOaiabf<1Vr;7JGcC2f~G6GxQ zLOilZs}iuQ2N$y9lQYCz;Ul5Wf-eeZl`NjBg5Fj7xQLM4%(?n{OE3fXnDZKoxk zLUF~3;Vk1uARf$S{x$};%|KWm8sHsic`9nuM+Ya^6+}kqE?Vs9HZIDJz6>;f@YgTV z|AFkcHhU1$q}&kh{ed(GkFj9Qi*BA1>$34}l0gvFyDG;S;&B^8S z!7DP8cLD<+yzs@Qd+GH>wVf2MW+l%d{W# zTwxp1h z{?s4-_cP}04_QntHmF5Y-Jmhy(IFfw`;H4cyRM<*w3&Am_27PZb|wlceko9=GRMCkLj%9n|AxSuJb= z@dFUUrF@jy$-ZIw`PDN!Yf(Oqt-AcklrmX|pt{J`d1rSKn-(q}TgbyW8g@8+Y5~pN z!a8(Y*b!G{@Na%u8-5QN+P{Khs#Zl@@%~G*^n{9?trg?#2z=!|y8~hCs|I2zN zM)zoGf-eis{K&uiJ3IUw_JWKf+RwcE(Bs267&Nk-eZ&j3 zNblX`?lKP_zgq3R0y**w1u_Bm_Ua4ov#ZlntiZq#5G2J%tYUAEElD?|oM{c3N~C$- zi@m;iHROD7jhi+qX|xg&UpTpf-NjhhMx%P*o%LE^I#nKRuL!xz)_Pgu4>8L$PfeZC zbt(-Av&Qmbb zCzxmnQH?sCrD}K{8tXIFj3^1Sf2lVsZQVtQKSz>J19#jxdEuGakC)w-E~BG9Jj20G zo$AQ=Ab3i^k@HR3C%n^GOrHw9?8AFd$x~J9M?+1t$+T$Dyp&E>XCF_aV>H5cQy5j-5b#hslLO*P z!nJiFdu`sDtym|vo&0W9M^V*V>hu}hGH>{`IPTy;N445 zff2j_M09??WO;l-f-cu#GopBL=HiT9EN zg2;pN3@J_D9-=WubI1s4_*iAslzzJ!{$6s-92{GpT5rBNKkFEX5iI=HQYyi*jnrCb z`9=vZ)U%-1x0vmyGQA6=;cii&DnG=Dk|%3;fGXG@b~92zahD~Zviv8ZUhUD@-iFT`53 zr8$q#97w<&_h}7j_ZBkb&=)r{6gThwQ+;w--3p~%zc@R`zcPvdAHu&7vmlY;^D*6Znok@)AM%^0~y!3E&t`!uVjk2OQu$gtWbrmm|m_iK;(hWNbhiY-}Bx*f-ZZ`;!wIo9k zE;s?XeNG|Swuq6XZ1~Q1yg;q^tv%)_St71MYsQD>;+~&w%NDUq zLwq6)2f)gTLjJbP~iT}*Jjxt8J8y|$?s<`(MjlNF%h9)?L8#zNIz(i_rifx=}hidbn1EX z^D|J9_*NwJ)uHXbaQ6`vQgU7SUWw|%yVTF4>O5?8dq^~1C9;=vOi@pRO<*EBXP-sG zsc~JnCQ8rT?)40>$Nd2!II1hHuYT$<>Z|(Nxruh)Lr_EuA`Ta%*3IQ$y)6!&OTz6? zgT^tvbc5URT+>-~jPK+p4_ZTM<~7AL9m00^gGf^M-h>2!c!RxsyQQil_HE_@2&EI<2yH+S11Nj}z9S>37pc$l;R= znPR6x&$d;cdUGu&w%qRDbwn=7zGa3R1|MVib>0u@eKTSp;ylZ^X>Snghxn8dyFEMk zMpn~+hWV>(3@alJQBMsBg2pr11O0EBaYUzq+pEPqdFIkWpvIQq*W>1wZz1A+X=E3Z zQML23?mzl*$K5@)6q$SgYGqG)QMR(0S-pZn9QG>w^d1zILUcGoytx=4tW0jZ)B^e# zsQYF(3bXWAF}W`XO^W&YCV06N%nkE(-No!SD6y*SB<&nmXL9&|FZ0=ZW#qxnqJYR% zu|as)7zS~`%MKTYFHU}UnsO1p1M0r_WAal>^qN;UN-$${Gl{Ait)7tyq6eOUmx`K>q;^m6gN&xrH zlDlS|yUZpghUrN-w9K8iMd8EIBhAP4h<;7w^Ks2${(;{^3(2LzHiqa^o<(OIh`O`C z)AP^MGnZZ`O))lKcWIIlwcI9S3c|0>5_?J}6r_a_>Wpz3DELhubD!b^NudK<1`%s( zfJXZpz;Mw-Mf~fY9s=%A-}O%=3b6&4UHS?}ek>JfWlXL!iy(bYgDzVdIc^4?41*ck z<(sxFp4qIge)A_S)ZB1oU4&t;eby-KQ5+@eNh zqcScTI=?`HKwraeFihd_u#V*StI#HQ9nlpkGW^OrP&>LX5;E+59uoZ^Q;oc*>-|`d zfT|G>#CidobHb?MrQWWq13U@i`>dHAR`T)~raeztc|28}$ds#eg9a+5NQ62H`7erO zoou=U@@uaA4}^?76~&QwtCb5V*Ua_I?*g&{Vz3p8(u!jwSx1CoIpaP?-Q$|kWOX4X zqXb+g+!;B3R3U9A>Jge4rD7^8*54d04ZCv?)inxPW$BmW6r8(e8YKI$w>kP`%{k(g z1ltmrWcC}rj5IR&@A}s-362RMtl2!Hqb^2Y@r=AZ?w^kpD&8F5<;A;MwJaB$GrzGc zV0`cU$+zTd}<`cE@aqFjdjv{z`@; z1Mc;+{5{i2CXHu@i`ztx5v8nM{VxA)B?s+=J2=3JVQESZ}i4{P5NOPqeaBbta9X=j2 znFN5$`HF(98Lq))sn_MV(A3vd32Y%^m3vf`7b&g_tIoUUGnW)rg&&T}WUM6VaCo9;DEN&p2G3uK4$eywLOKEV@*GLU{`*ieEr29R^0K>fcvdfcsAkbnfSS zL^=e($o;q1(h~k__y7KpJ}}wlZ+46<5C6B5b@xw2H0J+nKLx=IYJJ6m?)Q8nl1Yii zgkC0+s@C!ddL8qRao?q+q~1^8{f(1_@Ja69pVz_cPqS(z@n8EhJQxr5kTCN@*yA|S zglw_T7{y%bvTABP2aw+#y%-nZaUtSuvJ$WhL{i7q}VLbYOdtWcIz@(FRc>!+P z$UshbuRd4yIiY;T3n{7b>SLia#Qqil@ek!#JA7V4#qDTHZ$thtnN+SAQY+Mg&f5>PUsl>x=P31&-(G4VjZDn+ z^&l+&47WHm{M+6@$NIH52)*iQIv!I*l*k!$PyT4CFUcRA~77XTD^ zkRY$O!!&0y=XaIJS7^75uX&dr9VW^8uMeO%wh+iMhfvk?t1No&PE$#v!(<2AyMQ>o zU+s^*2>#wDGSlDV8y`emzqz`-xL%*%Cp#AYnfk!7@)?niamJlJXygE0rQ#1>?K#uO zea!I3<#o?;htQZvI$ZB~mh_as{3L9)AK;Hu654Z(*Bl*%_eDN_u~y=Ws}QHb&#G?a zC>;LjK|)g=qS(*I#4PN{c88MVVKE;glav%nPyS2nZvj&prv&kCs3n~0{BBv(+vyaM zJl4BZfND(8n**=OX8pkd+U2y?;;ZGmXYn(qk8K`4q=ymWOuly2%o>pojchEP=uYBceJ$8g(j5 zX2QidPx*(4KQ-`=J24W}A{!ZmUhU@?hDeFX+aN!ROWwqWGvnFul}W!>7%@Yicb4y( zVMM*qZ^c@4V^||XJV@5dQQcS$onC5)P%aoTp{QYfH;{ssCY0EC7gnQ|m|_6x1D5$n zfhSElFALf!XCe;Xyk~5AG1Kh+suJ>En1aw=HhC7go4n*)m#?1P^0iz_d~^EZK#ny~ zA3S-P*>^11{kYKqSR)>+lNi&nI%z3HXUc5t=8gRBFw?;7w9i>abJP5ut-+j^^fY({ z#I79P22L>*iO&t=W2)GjNh@at*=;C1{w;KO`9r+F(A8a`|81fLd(5wZ7z}0(jFC{X zOFKTubtv{Ca4E*J8hWjlM$K`|O}tBIsz*^NkOs!Jdd_=i@61 zth~(i&YlZ!F$L}@Q6XMFjF~>gv-m#K#swa9u->{#{Is*G43Smgd%MrJcpkh>nM72R zTecweePNV_Urf04lPhSl`R8nb;Liz(sxSR9ii7E+{2}|J746OROZNdoA}wdE|G_~4 zi=Op)M~N z+C)`;;bg(L-{Q0P+1Y|ixJ7`EQ_PXE0rTrNf7~p`rLvu5 z9JnN<*ojIA!jKZ1bKe5pjvA*!Ws6PSS$OG_Vxzg|z0RWI3>vRL%-A}K#>E^JT-2QR z3UAwVi4b7_^q;-QD%j9emW)`>g4T1ou@AAoyYj0gKM3qfmNd!rboGdj!@pZBOZfQT z_Jg25M7B89xAg^^znoV!UihK01iYT-Q?wjq@3|@OQ5r^<aZCj0)827-pE>YHRo@JESq*zq@Zixs-M<|ZXc=hI*Zrc{CIP2iu?+ta0)&$~3% zJh3fRG#)z{_HbVBJ?B`N;}&W0Y_t34mk$H0R~}Ybffwz>Zb+Q|xhOHrM!u}fX(%cd zC~zddpUu3?R_Smf+#pYaXpGjJl!Y^@AGfhOP2JUu*D4n5Vl5&@h31Tx9LgE}y0Cq> z6k(30_)^wza44#le-YTT&qIDtR=JtpmOG5%JMC0?U*3otITd^kVk<1Kx_mtrbqQ^d zYFm&}U5h9Sd8s}A!%FJ(&A`Otr-i7@@lxspAO7twp@%;fXp(GM$Rutxoy98LJTsgp zvj1rQB(V>(L$>kF9xm{zmhgJn;~!x(G9EHjzz(Sp)cL{ z?(rY5J(XFkgs2^OEuSs9iEHyxqkldM>m80`yZm^S!=u7oIZ21<(GgoT^NOc3Qy}r$ z28)i^rku714P5nuZPi=U7FC|&&Ujt<301$JH)-apR63CeSZvhOS?r2)YL@NDkqMy& zsI$Y%Pm$SN$W2^!xMLPDf@}*1v8`}CZGhFwu)Zwhi^ej|a%I~@9h^_ct=U}(|2d)y zafw8+jfhNPE;2eb^xSDEOD3d`E}zvpD^~hvF_eHlr#Ldh*kWm=70akfq63dpEh)21 z(L*6YP1baY4>EJyJW||Rm17iLhCFAwFKkHHR}1_n{pObqCop*hvpVh@)4JHX zg_MIOR7hg4okC2MTZavj!}-a(J9OLLpq`5akI6?=;L?e4O<1?Sr{C?+qGxGMDI{=J zQrYNk>c{!H9!BW*kJR_~)zuPY8$Flru0`{^?%Zv2vQ3WkU60riyF(j5>$%|%d8=Az zjHN5zfR68Yd_iO=_;{x1i*~m^#ChB~ zsuI)?0~PIge!iB9+u$1-LRKA2iEPkB!|s({CM&(Rpgv^=B06!+NjTNb=SD^guX}Cu zW^3o#8?^Y7=ZrWATqx+HJ&3W~rNT9m^^D6aecUQ> zx%=cyjp>w=Qw3hvAB-H6(Rbg&Y^1o6$ZNzi7(%@!3T52>Q%a)nG)DXk$M_XXFo|<0T`;f!W~Y98@E(0CcRZrmb|# zYE`8rrEZKho#kzJh&zuZf&LZ_7LAVBit@U3VnDEc9QIHfNhgx~y0oc`4*vT?kbwl3 z#xb5y66c}=e;FF?v5tFMsbA1U&05)Zol)0~aI!~nGE5&~c2gF;VR`&M_IpRtJ$;{t z?mUBh;LvL=ep%f1J?;GPd57Rrk3T&oNtHlU6l?$9xAZ!oiF2tsbp@F5MU7}{gwdZ# z?Hv%YEZrATsoAk4`V0m%ro@`Rq`A>B$9a=%0;tg?NnfjPy`D>s900oih6@6&QOnH# zCi%Upi_NE7E9*`1un~sXQFhZ2?%d*;$vVsggiBN$}j9fvPRZry5Y_TksR58>lyKU zmcbkSfix5Q?3tEDm4s=H8IpxxsrXW-3N*@PHaw#8hV>94%9-j{mJ=|A@pM63pt?N%9ASUjJB2t`hdIa*1 zB0a}Ca&#qM8AjVm03~Zk`)M=Q9O)5MiQHKvP`3)J6M7VTY+Gdf@CQn_VzLs_e}}4# zB=4p5lgkg=qTcyx`GH|C%$~SI@8@cyv^4{$KJ;J16hsJa_()f>HMCCbhR7&;PO{~* zPIg6-slrdO_k<*4-x&8>vG{Q9e*~!9uN25!kn&F6?2;d|hcyrq0)$+hg56wKKJj|7 z3TW(rJ{e;^yRz-d-5t}?YY77VA@-@4ip|HoMmrx=FlEvmTH2fpyH&P{;eJR59k8{-nwEdi=+HW7`3JLS^{g=^X47e!fm z6Y}uv|BhERg_LRD1mo()gHzO=zdZym*>2x&I zYWl+HzVCr8!1;g*m5)nM)@Ln3FFQfIMdsaR%jVjo570N))>-*(agsZqE_MSR36POy z8QJ#96h_D2(5&=lkUgj((?CU%p#yfAqVd))vrAP+%H^26u;pidCR{!JoJLWC@e(l* z${>_3D3`{M4OCZd49h-$do52uP3$`954lews@1X|L%g}XG|BH9#j8Is69jIZDKphoOED-gfoMULg@j~nBCMu$Yg=l~xA1p2>$4M3lo(LT5iL^~PB@9s~r0S`EJ z$DSp2K-Ok2UG_cU8|=ICqlSp3)kZ>ZT0VA5>I0F#0mjdt31SH4&njLy>P2Q8^RMB4 zT+w1d3qTb~#x2&T>pqpqHNNItjz!s3C7Vq$pB+oZR&3OYl_{s4>}!G*;B z%1p|8d1Y=^K_WwLw`}SjGap|XsssTwbHgydo2*avPXVX*N+Z>rXbVVt23eHH?R}-K zN_%V%)PW0aC+JK7B=pZIj*Cj^mCo&V7U6z|YoaXFx)a(iezXll60)!AoG$*Yr6C-e|h=Mk88YKr3dYGwV>W_EA#7_puLMJus7 zB?#<`bgj;qe+T-^zXjsLT(A{>HN9L7@=uu2ZJ~@-4ID5l7db4KMVw$V!VOc7{#Mys zp}!zwjP|Qqkkv%EmeLOHNy}HS>&PnbIEe$V>JVE;gE~!%v-9Ys{Tv3}khw_e+g2MA z+bbtV=BXxr%yWCIj5uj}GPLf=qclfPF=}>PLIlm*VH8^5{VJ0Z`pMK1X6CXn{q#XW5CQosa%x7^-9cj$HFfJ?qxom0|+7 zac5JnLa6CRh`s$!Otb{MLp}D53H{gzyFpitPm?s@<}S)c%K9B6T(ah(BD3i2PI8Ba zFIOuG-M$klkR5Pc2MUKigBe{EB!taX%Lj*(^r!hO%ir)5k)~?9H{>pzv7*yrn}C^I z4+2912?2?03W)=>2PiB-YE)Hb4Szn7`W!8JHIyv!Uf@2C;dKRV}J{rcd?7tty&Dp^=~MRFss6{qn)p9lZ)=RwTP z_92*zt16JYc8=GagfZ%H_jYYi21UE^Op8BPRP3kC)&FUc(=ELXvcdriWMP+C_EH>b@ubZ_;LNV4OBSoyOE@Zg3p+u zOZ9JG*ASpWxSSC(!R;$*;&@QObH=cgx9uOcpJ)g)xuu+tF^O$nr>hloPDa6293FF# za*V7WU49hlJ~3G(xi}H^5rW;EJeq*W9_Hi44dwy!dFP0F8*ux)f zms2<*?v`ftr@K_v`JgL-2B%nZbgs==@O9c?v`$lhD}L#cfXhCJaNwRj`4oKzQ2q;Hut`-SZmES=Ukd3yqieA z!b7Yto&$SMF3Y)F!6?lQ+*5s+oJEnQKn{%>gSCTdO@vQQRi%}Nil>2PWX!oV&GUV+ z-9@7&u!#%40?XuyZ=dC<8(KBF?GFtToKbgK<>W>M5daxfmpWm}8E(4=x3FbXk#O8T zd)1_mUtjX8<2T9%iy6bRJ?-Z&3(vI=EwSr1S`8+N{?_R;F?lz$4=q^e#tFQ?Exu2# zLH={Az6O~2LpoQqv`38cdhes0&$wR$*g<)AU4=3VS~Vqo->&=JLncam{OFDZZvMN> z?;V~M>In7q)@!LaN@>`F<))nk(*QnoxBbWl@ z#>9byu&~xmWmXCr-G?>fH)D$=U3}OR3_1z(!yK+09nlW0d6AD{Q=DX=7!AlH#_2Kn zTWjaR&2J4BPx`3mXGrVECx}}9FEH*l@PWF)=UDQa-$dW`HCYQw1zW{Hjg)Zz^t--a&aSZQ~3wcm0gqcKHtMl@H3$m$@?3yHC}|RX0OEiiW+=IthVsKG~i>R$_MM zJuC1>#7lYhdf2#hB!v%*si%Ps8M1Q zx+|`4Hl+IKzOS|pq^cYcf0b|x^ZEQUQ*f<%|2g6&=JL&irc#6nENf1l(bkuCPJ|{? z(cA{yd^quQs4P;ItHV$?o9L38q{lFo6=EaKPyS#U!0RJ#$gsGHKw`hG_l|F^I{Bzr z=AAs!eq51`blyky(i#jaaZDCb@qrJyh`QnXF~n*fI}IdFG;cmXj0?7d^#rzG#G?}wO)5CClV6joL_E2b!fc={D$r|NTZw%vz9ong5y|u4e&PdfYq04~ z32#B2U&9rCcqZ9lrR}0Df_jxiJGoO27}Lqi@!1PRQg$m{K^cle>pXp_@<7#<(|<}( zRNLNup1?C})~0)8?gNqnU+cvesm!kqv$^J_-!R=@enyu&wVznWs2ek`<(^BU9tc}ZjFKBq?7O|-4Mm*4)G#}b zT8r!pyP$X+<7w%N8L=hY&Oo+PHDEcrlAi-YGbn@7h8)4X8dPxay{Fl&^L(LMKcFns zg9&z$%>epyM|@ymdzeYsbPGSt&d38f=$NyvNthKuq0BC?wFft6!7pEy(ee>b`EyZM zsZXM6<6KQY;G@P*YF{)5JuL;p*>nsZ5kgt#X=seZqBQvZKLO!Z(hhFYy2TbA8ghj8 z+V@>avE(jh^;rQNT$>74-rV<{5KVHf#)z%XHZ<;*AozsVVyXXAJH|rdMxWJnf(BF} zI#gh`3OrQ2U$Y64IR-6brot)Y6VmB+Fe{bz=b8gVo5I(N=Jr6(Y739}o=nkP?B&u} z9us+IxeG#i&g?OXf1S(uGIcrr%H%N5Ikwaopkdp1e}6>ANp83Yr`6Fu8k#SyRb1E8 z(J|1>&q;4A(U|%GsGy%C`&RtTeP3pC6)j#7QEGSpY7OmkLvbtWe<@vDIA_gcma}rS zYMT-YWNI4O_WO|^=5JNVkDCp}05pB@@-qz$zm)AJy}+XVK8Jwk;OCNqQB9vgOB%wui4X# z<`&R~b+72RQGtj?o04FKv?XZTacEJ_<9z@71h#XGqcPQKJ7XxM0mtm5hk)LMdudsS zZ(HYPCDrT^rtASRlhC;>OClXcYaasaBHZL)iDI^|1p%g2SU1u6Y;W%Q5D$uNCU)c( zC10$DI6LXktEAQpL!!G%PCz#*_C*zF{_>loN3{_pJ+#5CE%8mwj&qJly}-wi>Wboq z+j{c`6;bPJ%O>WBuAi6-Dy}sqqAD#xfo+wP-lBtFE3=0KK_z?f?s2X`&(p?XqbKR0 zR0CrAVRlbYho2-*R-FzuX8U)0Q&TkxyVCe8Rt@GAdA$iEsFdgQLOw$jom0D`n*^@>2ENV7JYz8bLt?pmC zPZOnSsWz8*Et%Ek##eco5Tk>s)GEDYRg_3xI{JT`tHH&G!1hSU?un={3}Av0Mi?Aq zvc-V88mh3CxQoiz?BK_epJRchjQDzzy?WD?8KKO{KGf?tiPV`NXYCc)C#`gUe)PM) z)hDk7L0wBMUc^54OKAUs#tTymAcB48oFgKmMe%nqt(d->Lg&Lmq{*EodS`}(aDnwr zucML;gvn!}h@*QClKa&>>EvJb-jD#bCJ3TdMNH%MFQIqghX7sS{1saa^*pP&fLX12 zSy1L#z)fO^H31OwkKCVO+ z*qA){44F58`T&VgV%Kx6l891YizWt+lTf#zYfzvn`cW@NhG$P$`e*P-`969YsPwp) zXB2owo9Tb4(4IOor(vurd3Wbxu$NFW(7p4NFsAvvYvxLGXv{14h3-?Bx8Prg7f5%vq6o+Sz>$Q7M15B6tv6XFAQl|>@2zrLvN)k2s7ZUjEg~+iu{Cwj zwhvi(4Ejapljv`DA7NBTT1ZsaNIl5K3c>BZ?JD;EreokSqf%?kHc^MJ493<%$VwvA1IM<7K)EKd$EToCCMHv!M?dz&4mXgL(8ofupPUk*nSIZ zqDkJIE2VN@Ie;SyaM70%~M#0-(j(JHQsXu=V7+J zE0wdgq_B%5UO-UWK&b}nYBHUCD=24i=?B$HdYMw-t;!qpOyCPUdV9{b`*iG+=oiskdHqn-e9Ghx5#cZFOQ zHO=orGQ`itjQ`d|{-|dSx+uV&2B6gcBcO4*2Lc)#$m@B6zVC{yzkIdU#YAcBNsrSn zqo2Z(`!9BS-!RG?2;?hzp28KISmHX*uk?F_^Zv{SgIP&OY|0`!)Fa*P=CoA1!6hvm zASTGK5KZdr#@d2ttKMXvvL1wGvwW&GB#xhr-(XC~FdUKA&n~Ms|5_Q3+xc*`tK-JF zo%OuysA|u%Ratf$4ytD9VWGZgcUm9RE0(_$H6ym?ixR%V-|+M~9xd8?f_t;~3o@sG z-B37;Y;-8<8xhVHGE3LYB3w)bVehSFWBLGqiL${CXt7qw3q#$ zmZFu_d@6$(pU=Bn4*^zJ>{FqDBX2wAqvRis2>fl3(TEzpciYQpN>!wi!^a3Br$|T= z)by4JhdJFUxalt7s1H8&`K;vpjYIaMv=;ayZR(hNd(w(46XaSyb~7R4tI__Kemvda zXy4og{rLjC+XTwm(UC`OhvY=gXtJmdWYmX5bMcSljLWayJH;=vc)2j$i=4k;LvU}! zNFl26hIn~3%cxL-1@OK=IoI&JUJ|OM)cGkJ{ zf=4|*?j>)e=@?vT2zm4qcExuIU5)x%G;J^~=o65H{g$=x`91}@7BH2Fa-3kR02jG2jUd!?qAZ?9qa}?!N1nkx_N!NlT8MjmLRi)xrTXcqQK+)hh2@AiyHS#%zI?zINa(Hz1y4b!O7~5d2IKo3RIiD zVBw;|Sk=%a6ZFd+OIXAA;std7I(pgSkrw0JxwtvZfbGx|9nR|AEWG-#2|5{PE{ zdM);EJCSC^RkG%L)>8Y<;bM0``*V4!yLh&f8dQ25SGpo&Ra6qyHN>*p%Z?iQLY`?l z@{(67E1&%dMv)@@wp-|>E<7|#8!zWj4i@OpMfF$?s=6s-k0b;7KP<_vxn4jW z6apCD9$8y2d6!X<*7V_kYa35u`nF&nC!;blf6)5~&Mu!uMO6rFROW|(u|tWFcqm%K zceVuwc+xvD6IP3F_XjDW0nN_~_5KQg|6+CC{f)EvAiEXlfKU@%xksVy6~r|alfO>n zDwfiATECi4c!EuDxy64Av{+!EG*b33mAmY9DyKB^N2gk9p|QB#O8!Q^&3IM}Jdk(n zI61STqFr_b9f{XVcYkJ|k7}>J+08$?ciDYejrRt0UObOSu)rtW=PQYNXP5wCt!G7g zU1QhfekjOxanW1D(Ay{~t-_Jo`+8yqagf z7Wkm6_~%^cUiL%fQBMx@C$WGyX&iD@OIa(xFd6>d>E)Ywfbv(%=0`K1l}_(dfH#@T zdcUi=zc^nP>tem)R{lgFdnUr9tOWzlSw>LG9PC$j06M1+QA7c#pTr`G>925*F<+v2k6|l}jp#VoBzt7#9QySstY9jZv=%g=JK}xnr=x)odaK9*ogQJK zr?=CXv2R|J-T{2q$ULV}r1**=MiAvm<$UA_b&(}z$XmKkN}xv<(?zKe9g-BZhl5n= z@e{xOdD@D#z_w2~VqVkRte(&>>-&@AUazl02!WybTm2vZI5&fCXbm;5|HJzSGN*m6 zdT%4sD>eHM3(XjF{Tgj8esA+1s~! z=C)a;mA$hSQ>2mPTaT6TVpd`z+Ez2W)CS-c@0;U3J=L&NiJT{POawzi6ODw(Vk`w{pJ=;uC4QHNpDIJF=5 zl_VW2HrO2hB-a1oAyrCb^Pi^2gY0fH00+M`V@N=@~XGp#7a9 z*k^jgJiattu2)17zyEB(PLZ<>0C`E$^9ro?&-$?NZj0O?5x^^;2{^KAxsL*iLhly< z(r;~l8!R`+)$}%>#$<^s=$EhJQu1#M{9eoJ8sg;s7R(f%a~@%}s7AocLC>2p2@m{C4JiQszkuq7zy!Cy)O z^wz&sw7;DHOP?0&#!yRbhXI7<*}r1k8@|6m7_ERE30Q}~%Ke3S>$jgTUNyfxSR(%T zm#W9-@^2lAXN3RNCvZ&oD1Er@ zZ8~UV5zhksAq)H(Ao*G}TS)zrEC>1#2l&^y5}v-1RP#X#CPK}`dBDKV0dzJiZcd!i z0%UV8TF(d0&&dC8Lht8Mi4(*-l*<3GQ>m3*3&OI>*SNd~evV<|h~cLxxm|fJaU-zc zjVnlupnSV*c2zn8pmejR%9SaLQSOXsxog%R^Xm9PAuC@{@9nz=CzG=Q4-jx#fiGWZ zgo`1XtMIy5&(AUF0*(MqjKwX6W*bv#oN3>3z4lw+@{?5*4s7sd&XK!O0z2jqfC&*` z&`1`1vbxcVk5(42d}iZr;#ch9_b15}c*%fe%QncIv%VF-x`$WZUwz+UgY|hir~kUs zH&j=BxWK53c^in6ES?Ip3XG~8qS$Q7TZ&|S5UUh$Qx-@v(bm&_Kk2!~W zegC-u#pk-Fh>1CS6_HrtdAxaWqGn-MJn>-#UnK8;*3lc#%73=^+y_ep^KK29!U=pG zdd+$>355PN0*?*E~uDX}nc|8KEa2+OD&9_PE(vs-B~ z9apJ03r_@a>Q20?bJ4)(i1%+hL zcM6(mJpuy2k>puU&zxh~KS}Q=zn*yNq0GH)E)mn*p6*tzlW%gRy|ak9GUg1@9xJ5j zdMiwlH%1{Ym2zC{D{y-k7^f*CEDjPs_oEWR%XqQQ#T4@P-0|%dC)p;66%%?2nEAr$ z{sWuaH9xBO+O)Hks;>wyhNGf7!?5eJSq4q0{z;_(JW0wiwJQ;oE9u|6FSBvuStEws z%|*X)p~eN92KmAf@%4=Is?~x5cU=Fkd}1zVS#9H+CEsm$0LVH3bY+poVPeI;TRz8q zmc6B}x9Q&XjOi!-Yc)Dx-YK~Ewywh{KO9gMBF^|cW!h03u#u$-*;5+gRpzmxtC8M+ z1%B~vB7>E0pZ%UA##vR;@l6GujsXRPAAz&IvXa7%2^+NHoRj!`@GdFr&w~lzu>*WJ zm8Vy}Ar~JQBkz{PJ zTZ_${w}NOATH%*w5F5PFERt;gfUD;iQ5ZY}~}FNBu(s(oCDa!FcQQu9%_l(*!Q%L==Pi zV_{^e1_HA$JL_~5yPVv)d-foEGfXcpJIsAoABJ~-4>jne56^XE%%ti3w_sI;QOjZ3 zH~EvISEckAd2D9*9n$kit5~AI_wb_bc$n&liAL;0!f7Z(mHV;>as28?=Zj$n{OEhQbg2Yyb<-?h}8W*u(B zSX7Mibi}mtZAVM5np^G2#fkb>FGk~PgW)K$Vye;W&X`m(TF7H@iTrI3-6xUVVxTmwqpFR3lFt93njv)*E@> zT6o?%j3lxnLKx)rLHzSk&dVspY&niebr}s=byUhyqB2o|)tfY32izkgw{%H#)5(eW>5#gcPxRQke%o)`veT9ghLY532^Yqj~ zHveX&#RMzEoflDJ)Us?4?}kzWuZ|yWp@>I^?rifUdVAHiYOu@57^ZZN?@lS&v>U`% zXr`IWwmv+cq1f`epPhm%_k~?0Cz((pIT!8a-yJPC-Mh~k@EN#i9}rnp=3l|m;{6sl zREZ9TqzhxP)_ZET6C6J)c{RE?d-9%B3f0P?i9Cul{pBEOZ-IIX+}f| zVV8x^3&&)aZOApR?`TIPx`|;lr>?`+?1<{TYuodhKkP0_n`al9D5sR`4R7N#d3G}w z+6%=MFUHBV<`%0V*4QV+7H7;?r-}X}vV2XWO|@Nh4%L=|oZ@>@lJz2VJLydn*#c*l z%2!)_4`OG?Qpm_Cs&K?MSGUV2?}v9CkJpQOZIbbGZ!Xj6G$r@0HaEXOXU@sAi@x2B zI&mT%&5ev7X^O6Tc}$rU**S07M!4)+=q-nD{=yF%jpGw~)-mqg85Gf5_Xs1r61(tS zWUNHKz*z!y(%z?m`a!J_ni~Cm$?WwJ-E?e7&tWVibm8pK&UnQPy-x)AhzRA|D;*x#^kuy3v0!|iT z#m3i7%dz_&-(jb%yV>vRk$b6P5-=c^y_ul|+*p+PoQw{uy|?RmO(y}x^o$baDYQ->^VS21c~R56MNS zXd+AQm*JI%BE^c))7)mkqmpag3I>-0juqa&B9;CcE6es5LtavliT?8hK7^@YsBt zkRF9{F;-7p-l+K!Lj+l>yJO?UQ7Yp>JjvygnQ5n+Z#SnK)6{1Y5y;{1&|_43^95*+ z`tDX0bWtOhsyX9>P3BSaG+gmdJ{r@bq{GOVBB7U}(VuYgs6V zQJb!RzG>qGIXyBu@TNBJW>~Osnn?#UxnPn=XJTl66G|N#-yWrYeQj2FmXMZ|A2h&% zPkpR-$!3T*u!@a^T{E-&LU4@$>u8;5*8iT$i+5CC%;QkniDbfWU&HjS=N4IFb!e{& zr2@+Y;ybaQa;~;Ephz-ukv&}8MqG>I))^Xn^B^M&%27FR(d2nmwdlbhVcC8&>>6tm z#OpPss)2L7wzNx9DRHhf=FCXLkp5qvUyq=A^vDBVE zqqKZi!yb=uR)?JI7**vxzGAavFNns%e$1Q*-CTeQ1`WK9O)4ueYj8ZqmogKBY4X%H z*;8mH4cr=e-eU@6`D~WTWLp-7K~jmqR6$$c3f)4*FMZYb2@@J}@^u=VnZ!Dr`P=F0 z97sLK?AJFMkX&0nO0HKp^Ui&3lu=_3Z=X4v5ag7?*Tf&2M+@p_xbfCW4cuDq)Md1w z%%wkV=!q<4q*!n45rt8i?E7w{>^rHHY17~k=kYME;3iUv$=Md#*G0SNZuNd18)c#0 z`a}hV7AnLu?cm{Ye6Yc)wl5CgdeIM#1G1{xJh}(oi~;a}a;{jPQng!#JEz*Ji7LlV zwwEfajSV-?-vum+_P$s?3hc`_DjIU*?}u~o7LKyhP7Qtvn6`e%9}$P*_^_%F!T_!i^&1MWEP0Hfib7f6Os_ftNV1n| z&Y-vfUiHz`O-5nD4@o*VL_|}evm2U~1uc{5#-fb8F|Juc8H^h77?asSnNJBDH=8p_ zer(ac(4)yp>?XUBI6V)~DjNgl(XyNBJW}b5EZ&qP6B#es?v#}8?`NE4@eXcIlDf@z zVu?i7)UOk7Y;i^WdU@-OE>Kp4?F}p%oY5o$N*kMNh~p^EbIQqY-du(LDq`WM+BZ4z zVl;YhD!uzndp&Z-g?H|I@2VjJJaDV85rHk{ZYN2UWaN!z>ZMab_4yOU0SUL|2A^0# z4!Uf|=M8*V@L9sI#qa2LxFCs&i=UTI*RFb*-dxT3HQHW}8-#Di-i@7;-P*Z|_}WX! zS4vAa-FNtA)r91{BQf(H33cDl)@J2B>Cx}^Gu%S>z@`=Tm|JeKepu*n1d zNWBq^w-Yl*HIcn6A-h~C?{j+Hy0XWwzTHe}Ymmz!N{q~G6?1m@&p9vBz7+S>8`T-F z$=g50SL*0+486k^JYsPuoL11n5I3l$3wly$AOh_~Bz8>76(DW{7b2Ny!~;c<01E9j ze0BN{eKwr;>$jGKGGg`#`ky&uKf#oxnjK4olZaDuO=T>eQLg7b)6ktHd1oN0*tC}5 z{=8OkjidJILf?=kJ&i`xVOn-eNtkGcruv#@JmI0(_LK_o`{PZ-FaEdNB>3U}a?`t% zMfR52OpAU;%;i?by2H9ear53E;f&JBQ;g(FzH0hoUl-r4ZlSU`o^19irYf<#=%06| zaqy0=R7_n<4Sxi&5@D3^;^cSI*x-bls8%kNE-E-l!_SCD_6 zJB&BWqaQQ9St$L$6~w5eU(XG_jS!?7F#)L%$bE6e#@|xCi*5|B>DB!=9{Q1NIhs{# zhnExA3C}6ZqB6M@E4LMK*KEMo*K0{-mU-{OeM$E^qfqk<8#`)n;9#?`YIZ7#=H%KG z9Cf0((1KA3og7BP$x9Jf?EH12ZWc1eF3zsANyFDH-UQ3{8ADp|hy6^2PN8^aTduJ$ zGV|n$#Xo}qR6M4a3p$KiH(MsvF7E;dT~naWQk)H8{L=BVRePPvx4t z>^l#>JZwwUjhKbPd`~{t+RSyIw-v7ORAmw-JxU+dr|ua;`C-{0BVG~j^kZN4l+Wv@ zPSw7@B_XRP3dYQu7Yf|@aOeFEgc%?1HXdbWqWF!bH%+lfLs92LU(PM103{L`gO>R# zo&w~`Q@s6F=w__^z&(ZdDo8#>P*Q*+d?*N2I|JP_MHGfs8v>07c8h27$7w)2EgG%u zabaU~c~h4(x~$kU)YX~ousDBMo>x}=qfTAkmc^-1iNf^SJAzy5B=k+@_;Fhxs}^(B z5Gx%ZC~hG{i7Qy6;nwpzjp42B%J;>_ zoEHNq*2D(B)4YZQ-*nitD07_>q=)9p$F$AYjh8!;(~ZzA;?R{0X=|A$;1-$|2Tj9!3UZU8 z^K47#$qh8s3-`HV6NJ{L6q%c*pCz+7baESF`1*zl;lWz3kx2X(*ivQ%?nd$r9 zm!8Ktq2#2B2*2ywtvE%_6F#}vKE#4bw6yO?;{J4y%%;#rA_M8br0UxfXZy`P1guKQ zwV3D?sdECRFUn+_k%ZS_)#pfc+zj`5{m~F%Jsyd;Q2ctg8kAyQa-;hJv zGKAqBX?&+*XAq_Vs}?1s)v3)!&VXQEzkg;z5vTkU+*zk*wuF(QjH4pT>%LG)g2W5o zgYclMdfiDWc}AI*toinPm${^j98;}fei!gk(ET!jXI4x;IlhtYe%LVit(HHxX*M6u zT~Vq4fey6~5vf+6+;zTR4$4VwFEcyc$zgb|r9!V=6avBG-|qil7sAlzr5|~iihJ`1 z&4hDlX}RdQ_N1CI2dQ?TIM30^NrSR5KCHh8ue@%;Tuwf->4$r)S_U>%^$v$ApAV|| zI}p3JD#zYMLUxUEHHFTS*sb{VhpopNZ9wVeNYc8oC}t;_`_bm%T?5zh*S1nm+uh8nZ>W~9+z zSHuwJ;=tw){5?GC(O4YVROG45w-}Kt$2*y$DL=?>y}-ITT{XOxvO^aZ|CO!xp-`|h zND$iXlz+7@tZOSu`T~(Kh*?V`pmQp%vTy>q)T{+nmO{vEPs4&QA?@f!s2*7witnRZ z&PIf?&$)8esj&_Mh3Rb6r}45(f08Av4csZlJS5yJSw3dlA9AB;12D2^b+?yJ0-AQ& zS2XqE0_vz0>Ox^6Ze2rgbtSb;d#l;f{Trlh>^HXA>3-5PDQ99YF#?!v7GuWvxE-c7 z;xdvzMzN(}EA5UW>x-WjY+TPtPo?%NQb3p~ywCpizVv&i8VLyS1U6 zX5E~9?nVqf?+T&o{e|+Ov@W3Sm!NaawUanj= zh2fjgf^y{rWRZoUDk6brnW3S&ahJ4a0okDeA8)53$1?*mq=0vhG+(D_YS$4m2X+3uSHPVbFhio!DmxJSQ zWk>S*&F&5Tx}S1qQ0ekIO|;@sK)EuJN^kuHUjAoJJ2&F=fQZ54ROMmlc7kFL*wVW^ z#mKvX7Et-lAduQHYKhi*5Hi%3sr*!P%+PIcZX-F{jFlagQT~Bm7=na1{Hq1&82^|9 z9l_i%8f!giPW8>62lCXr^s=)~!yJ=eF8u0vDG<4~kD8w!bbLWOwgm1}K_ z1*?&#xm~-p7Si%$@~_&zoM~Ol2H6k!sJYQB3%T7tbr9V*WZ}EBED3GK2KCFfdc8r$ zsJbqdCWtvMlKp&k5jf-(wvA6Zu)^o$@ZhfYBcbU=dXBfEBZFzd5X)le-I26j0~tD+ zT#cRAs~`Szi)OBX6vRi3D|VE*NNw}pXws&Z zKxB=;_K9O#`}YutMdg=D-GvYR?xhi2ley&T#e~e}xZtK7#7fNwhQ!RhBVb+b2;3p4 z{48c`vCmZS%5CC_VnB!7SB)d8=Flt~PbcEL(9?yWJ=@zh{Nt*ZtMT;NE;4eRh~64y6w;-ZH;l(tU%}e4m3AYd$5?3?pO2NaFu;obz(mrR# znpoufFe!~1+|UMZqT>hx0ZI!pMyulbJr=mE=eeuhPnvmxA1^x6h99=-^onMmrqAqR%=8Y( zmX3J8Nt@Z0$C^OeFC&sv|8%tViMD>cT-F|7SBgzj2w5)`^L)?lkj{Fsdoa`$&mdjq zGC0b5T|>FOVil(bX*HzFR_HE>59PEwxg7RZ>xcT?0?8QOi^6&uMK_AjomDCXI}t^g z5&g+9<7@AVUY2o|D?tA@%ocRp7&_uPO)f^BNtgaRx}N@W*7v;&T5p^_oKLx4yX?*= zbiq?zx4r1O4c%`ZHw}-vzpb2DA7$YENIF`hJ?zZDYRn?%uVJaz7PKADq*c)0GYmVM z-oMh`bIP$zTF|w~564~_7BlM;%Lsu449ax|NlRYRGa5HsoSBzrmPNRy!rpfVy}Wxc z!lc!$Y)GXn-sa3u(jhvWvV!HvvdhKFYw>6N3kZg|MvE3Ys$hnax;d-gecyfZNIf{# zvTfLBMP7N2D5W+F`y!grtU;yOA8IT2lpmxg#MpDW*5nxf8K* zg*>Ed*JV?skBNS?Gf068Vfl&iU)fqc)CCP@t@uac&H2t?+yfffA2AwUiMIb<<@x8C#|B3Mq+2r|ruJWao*4V+n0q6= z=uA?H#|U`u7?GsQ``*2dE@M^NX?Z_yq^ZMobfZT-KIrm3t#Q7-m5<#cNJQR7)B^vX z#5MaCzY3tCmS^tWDZ3#Qa{q&~wdy2*E=>rR9)30b9<`c6b4x7DXFZ?2iTZ+$3oFxnRr!rC zu9a?c#9us(m(Wv1c1GWm#Kk(lR4qnz*>^sSWH>EW&O;*BJ#esW&!5yUtN=eVj$l4q zc3Eh)P`EemREcC;LCoQEX^N;~H~kcCPB0FPAZVW;81fxpQj5;zBxlpZ{`>s8^hQf> z$I=ADm=1={2L-w1E4o~~4PosIEK8D7Y*JbFy-j)aDomZl zfKAJ|hmSf#!poiO2o?^hnsRGFWl+&dhgR4ZmlA2pNNo;!6NkZcXbQU+U5xW1gm~zc zIp&}UZ81C|JEycGk2C<9dYdD()vAvv6Z&;Uobiq`?K)MI!XG^oYq)I`Z!|8Vn_hNw zs;C!5QmZ0kPv&W82Oez6@iZWQdlBqs+H8vE)IyP&x5d0S?33yriVc1x>t4(d%~5Ny7@HO~#=JK}QLy$@q^=Wj z7^O&Le*D^!eJ}vvPq|kPSe-@vxS+OicpcGpIXUD?!=*wo;%7uc>z{$YD?&JoIl$M1 zVZ$wYzP5^s=(BhmE`7P=QcO3T2Rn!F6MybRly&)erKBxid3emusNes=@BrcKtn=aJ zJ2S%|NzKl+Suj@bc#MN?eP}*_h9jT}^|nQ7pX z8}6Cz9^^$JH{3N+#WdYj3OPYm(`MmiWXVQ00BJVp-nku@nr5f+7~06@zm`eEuCupw z9{$<=$@-+wAiJwhNlih`q`BlJ9xSVf`)AVkajqI6LZm3%egFESV4usi=)x6nWhEgL zSlv^wX?=UnSMj^n`_S+}GO#mqSm$XkFBV2VuY?)>WyC9j&fjf^8~sXv9r1 z#oU^JMMH^CEcDAgxD;q7R_@42G&MAqeR*gwZ*S&Ach2vk91wD74C$JU6QeL&gfgW1ayAJ7?W*t5}vVpMj;-gRb!Zy_QlbuRYlVmY(hDeA|5f0KBTe{hm$&6D-*Bs zPZte*$MXb0C8n8!gkjtz0 zkOdqHNO%*BH=V@Y=KM1$-s(i`>Jw8rHR{vY^=7R8Ioo)UFC=~@re42eM4J;m&Ee(3 zz?e#PwRYJlne^$Qwxw6({X{sY;svoIo^r;~qd#$vC78;_Wy|RV(E?Z%3d0!rRZsdv zoQe@vtyvD!_Y6b}=;b%sid)f$ZfFjo8`F#6Gz%*sD3YA@8i_zxi-bCSk1fAcsV&43 z;S$y~E?iZ8v%j8=J8WH;ZMwW{A-wI#JGh+g#F{=nO`==p(_otKG0Q*RJnF}T5zAj@ ziCM?aoVMY2`Z=;)IJjhaJ^)e2R01tr>Tw$BTz>CwOv6)1&VIY(&@GOBnjf24OJSlq zhiX{Riu!49-VR37v((}=(#{|Ni+4grt@@$ey#$j}7bl=Sg)FJ1K<2t=1d1rTfj~I< z>hottaOXE$>QJ8*;=WEn%b*RdkoZgf~ zfTJ)~k>W2WE9R@loKSzBIvvS?H7CEhw43efE8U}x%Iyu5mIH=ivUwp&h;`>bE_&iZD_3;cg*Zy1e@E00>br08$!2MSx(>}K> zeXV=HC0Aa1voc|;*wi>A%AcL#eXrd#xqH~2QUCR)@_0243>{z*u`{`%^0l=LY!~Le z)_jQ}kP){9ul&7Wf~1Cby9hj%@+1KD<0SjCS{k2rl6N0^OR>}G@BKCa zZYubyioB@F1X9gtoiUE^W zJEgX^XIZ0q&a=^`iJbZks3!UR5r@j8)#S@2>~-$~sjcp`**b@3xuaL!DX6mDk3tI> z9c9DOS~R=>mkQI=Hmp7!re&0|J{qlA&fcY^i0~Mhpu1Mh?M_^u2yh&@0w;bbn*<{kd%5H4jQCW1 z7POo=Sv4k9;m>F5CPA_{SEQn?+$)UFw~6cdL!#gbq*EOhzk0Aen!J9lh_4 z)_|*z&ukRuAH14YxSEzgY1wl)hJ7_?cMe~+y&KOo93QO5NR`wSvPH7xLJ6D1A=e&`SuHyc0haeV{BUVa0@C4Ugg;SsA|f7)yNUSp%fj!9Ohm|{@w4e*MctdhHQ2LM=BRe( zMe3Ky^=Fg>13J7l4$?xJkx^r;4jY>D2vxy&A^tzlW+8uEC``h4K5vW-h+b4@{| z(Omq&JH=)wCex2xGS1=7T|I;GH;wS9Zs$@1r-x7HlRS@Q^h?p)y`Ycd)YXF5<2JdidVc z=JsmnOKeqh0(G~LD17wYu!85kBGeKmtFh`K+#FaD51LAT@Jwmt=nX-Ck(?KOGZ z@fE932O(^Zxb*OTWn!H@vBji4hfLlt{CgL0=xSh0+5 zFo2{g%SX+D6O)YZ@_H+10R+5Qaf^c4uU*wIZg@X5}heW5@hXzy&JO=EL z9gNDJ%t5%DyJ_ZV!lRq8%%czUDMQSg@uQI8>Is49OXV}6HDTJ(nzT}Wz1#UBCN5p< zVIija;PaKJy;q6V$Qc$5s6DH>E7*>byTS3L1OA7tXi58b!@DkF-l}}H3$o}XO@7sk zGb-288K5W3)=3_My1H7cP(5`za2yg7BK5n-nJ|x>{*-#UIly{M{ZSnE@()r*tqqM) z@stiv#PhE8g&pQ?Z6e16rcib{dM*FX?1jMo6sdusl!Qzz>;{nIM-Td3Cy@AHXOe=% z$wsJ9yywGY6UMr7{GIgJepP}4z+``yg?vV{&WrvTl?OzL$TNJ(5_BU?iS+;tug{sP zykBwYvwV%qtYuEb<#?$@%Hk_DbKXHSNL6`mRWhkimVt$aWRAPU! zW84I#JJQd;*NZ%i>N*uu5r-zF#=7rrV-#L??N4^6G4=>RdbZ4fz2LTL%{=hA1NG-@ zt(uD@O+x+sY#FZKx12Ae^=o?`#;nv7U?Z-Co)PfqS&3|Sk70$uI)`XEe`9(g24p>s zE=$Ni8S|3k8qun7Vd$01{`24A7VT-92k*x3K?Hy*7hT$AqByYiqJE>)3;bt-^9tnJ z*Mb(dx#dSU440zXPq4679KXD9#lLk`)N0f}>pRyyGgpE)7PWIvUiyWR;42nbh1tn- zNUgV59o;)ol=1m)3=UroM2w%|ru376dbf5<(Cy3OS)Dha{3IHsfc(P7zS}uksc)Yt z7=pm65(2r$lN_<$k8`+RqlgT5+45?@Dqq?6Z#q6VP6Ji?@&9S>I>VaE(y+5qr3ROx zG(n|^^j<`I%YuPWq(ubjP3Zy>bOsg_(4m8Z0s^BzAPGTA3@Ak)G(ing!YV`rCL%&$ zLIn1N8F#>ap8dD~=Ki@)?tSi;lXFkL^L_98e&^_4+-2VEdg5VG5snjw}A9dOJp?OM)HeHf2t!&X)SN~fMv8U~JL^*xrvDo}Tz-uI4 z|7_k)yCls}e+=g7cWoB76_4DOD_ZdeL5`;CC5y~Y?< zh0+6}y3I=u)=lzf2 zb|jgxL2}bytW8y~1aWH)Tq@7ueTsaxGFKcS@{#L5$3{P-Ogq^Xz>B2(V!A=@YTfxf zJ9*w6YrC^bfC$;}Cort)w1>r?$X_5ZN^)p^`n@3N$S%~K5uJZjc*5)zT}6P->EM_( zi3NG}`^-D}6#E$nDSXMD5E5fU4($I+vv1%+~Y7&+gZfzv)0^L0LIc_S##txrQ zU}1Amf_~_s4>c+Gm6Hde&dKuYJ)?Tmw?hiFbFJ#n~C*k0n&hb=lSK*+X{0bZ)a5Uhq&`eK=X3~A7epl8{rS(0P#oQgI4AA=JuPFOi>&r3`$rq$Re4P23lXOgaaeuiz+*f5d zTVD~C%@X1uS4LVV{HwS4K^IvUmExY0?0j?pXC54ZV!4O&CI7u*YVKlL-2SntEN$N10Fi9#>th5o$IRdXJe`M zH&>fDq}ERLhT)BNiCF+N@}n!vyASFBPD zcPl(@@Z*w895S;Qwe@=JQ+R1OzM*Y#kr0IA?7j7|N<`3DsI&k}zC3FV=IDvrx-hMF zNHZ}9xovR*skWfRZ&F{Nf*Ai@Ja}d{MF662V}Hf8>r1i4)sCTQp@>~y(a6Xci!El*68MSKFQ(m@mi3xhWcLD;mmv) zF)A7c0-))H(_+(j*8*;;p4>^x;ncBS!3=&Aq}fG$!!C^d!bKGk06|x<`f@@}o;Fa8 z^t5>sE{S!qkPF?XVTu=3M!=&}4-I8G8tMvew$;>0-VeTar0(b^-sVt-Y6YdbFO&kN zl?)Wm1m9Dsh=eWEmSyuI=c40qGC)TXVxe?}_0P@2|y(e5;1@>g$NRzFQ!r_F$J}49BeeO{(#0?w*K` ztp_Z84r-`!f7o@w%m>`;_IBjKS=QZMFZz>rnISK{5r?Ae-d}kg*kqdU{e66>AddZ% zpYuN&A)?H0LbTpHT$nbQCXT>_xZH@m8NwW8l!tr$7t<#AhB9tB=3kZ_G-aV1jT?8&}te+nug zNR8QVq42jF(~c$H9+_c7PE!>;9Bo2eDBIL7RIYjZm@l!@1k Fe*;IB*3|$2 diff --git a/SportEventHierarchy.uml b/SportEventHierarchy.uml deleted file mode 100644 index fd8df5a4..00000000 --- a/SportEventHierarchy.uml +++ /dev/null @@ -1,94 +0,0 @@ - - - JAVA - com.sportradar.unifiedodds.sdk.entities.Competition - - com.sportradar.unifiedodds.sdk.entities.Stage - com.sportradar.unifiedodds.sdk.entities.Match - com.sportradar.unifiedodds.sdk.entities.SoccerEvent - com.sportradar.unifiedodds.sdk.entities.Draw - com.sportradar.unifiedodds.sdk.entities.Tournament - com.sportradar.unifiedodds.sdk.entities.Season - com.sportradar.unifiedodds.sdk.entities.Lottery - com.sportradar.unifiedodds.sdk.entities.Competition - com.sportradar.unifiedodds.sdk.entities.LongTermEvent - com.sportradar.unifiedodds.sdk.entities.BasicTournament - com.sportradar.unifiedodds.sdk.entities.SportEvent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Fields - Methods - - All - public - - diff --git a/pom.xml b/pom.xml index 6ee78c15..d446cbed 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ 4.0.0 com.sportradar.unifiedodds.sdk unified-feed-sdk-parent - 3.0.0 + 3.1.0 pom Unified Odds Feed SDK - parent UnifiedFeed SDK is a client library that enables easier integration with the Betradar XML feeds. SDK exposes XML feed service interface in a more user-friendly way and isolates the client from having to do XML feed parsing, proper connection handling, error recovery, event queuing, data caching and dispatching. It also makes a client solution more stable and robust when it comes to feed handling, especially with the release of new and updated XML feed versions. diff --git a/sdk-core/.DS_Store b/sdk-core/.DS_Store index 8d42d48f74ab3ce7ab6bffef0644afe148033652..91a7914c43115676172e50edb6eca094365f09c9 100644 GIT binary patch delta 112 zcmZoMXfc=|#>CJzu~2NHo}wrt0|NsP3otOGGL)ngC+8&P=jTi;RF?!vurZV{Br+5+ xq$5jiW@KVx+bqBo%ea}HgP#Lv6j0B`mu~2NHo}wrd0|Nsi1A_nqLn=c_Qh9MfQcix-#Er`*8;G#fvoVw~ zBr+5+q$5iLHS9<#$jK}&F)+Bs$i&RT%Er#Y&cV$Q8=R3}9$b=GQd;bkSQHK7h2-bw zB*EB;Nnx3( - + + + diff --git a/sdk-core/build-tools/toxiproxy/Dockerfile b/sdk-core/build-tools/toxiproxy/Dockerfile new file mode 100644 index 00000000..480b5b31 --- /dev/null +++ b/sdk-core/build-tools/toxiproxy/Dockerfile @@ -0,0 +1,7 @@ +FROM ghcr.io/shopify/toxiproxy:2.7.0 + +COPY config.conf /app/config/proxies.json + +EXPOSE 8093 +ENTRYPOINT ["/toxiproxy"] +CMD ["-host=0.0.0.0", "-config=/app/config/proxies.json"] diff --git a/sdk-core/build-tools/toxiproxy/config.conf b/sdk-core/build-tools/toxiproxy/config.conf new file mode 100644 index 00000000..d76c42fa --- /dev/null +++ b/sdk-core/build-tools/toxiproxy/config.conf @@ -0,0 +1,8 @@ +[ + { + "name": "rabbit-proxy", + "listen": "[::]:8093", + "upstream": "rabbit:5672", + "enabled": true + } +] diff --git a/sdk-core/pom.xml b/sdk-core/pom.xml index 164abd13..bb482e63 100644 --- a/sdk-core/pom.xml +++ b/sdk-core/pom.xml @@ -8,7 +8,7 @@ com.sportradar.unifiedodds.sdk unified-feed-sdk - 3.0.0 + 3.1.0 Unified Odds Feed SDK @@ -124,6 +124,12 @@ ${rabbitMQ.http.version} test + + eu.rekawek.toxiproxy + toxiproxy-java + 2.1.7 + test + com.github.tomakehurst wiremock-jre8 @@ -239,7 +245,12 @@ 2.12.5 test - + + org.awaitility + awaitility + 4.2.0 + test + @@ -778,7 +789,19 @@ 3.1.0 - pre-integration-test + require-toxiproxy-unless-toxiproxy-tests-skipped + pre-integration-test + + java + + + ${skipITs} + com.sportradar.unifiedodds.sdk.integrationtest.preconditions.PreconditionsForProxiedRabbitIntegrationTests + test + + + + require-rabbit-unless-IT-skipped pre-integration-test java diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/UofSdk.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/UofSdk.java index 51e83754..20d94345 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/UofSdk.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/UofSdk.java @@ -68,7 +68,7 @@ "VisibilityModifier", } ) -public class UofSdk { +public class UofSdk implements AutoCloseable { /** * The logger instance used for the UofSdk logs @@ -520,6 +520,7 @@ public boolean isOpen() { * * @throws IOException if the AMQP connection closure fails */ + @Override public void close() throws IOException { if (!this.feedOpened) { logger.warn("Invoked close on already closed UofSdk instance"); diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumer.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumer.java index 87468c34..e14ff875 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumer.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumer.java @@ -26,4 +26,6 @@ public interface ChannelMessageConsumer { * @param receivedAt - the time when message was received (in milliseconds since EPOCH UTC) */ void onMessageReceived(String routingKey, byte[] body, AMQP.BasicProperties properties, long receivedAt); + + String getConsumerDescription(); } diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerImpl.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerImpl.java index ed087062..69d2aba1 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerImpl.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerImpl.java @@ -286,6 +286,11 @@ public void onMessageReceived( messageConsumer.onMessageReceived(unmarshalledMessage, body, routingKeyInfo, timestamp); } + @Override + public String getConsumerDescription() { + return messageConsumer.getConsumerDescription(); + } + private void dispatchUnparsableMessage(String msg, byte[] body, Urn eventId, MessageTimestamp timestamp) { logger.warn(msg); messageConsumer.onMessageDeserializationFailed(body, eventId); diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/MessageTrafficLogger.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/MessageTrafficLogger.java new file mode 100644 index 00000000..d9bd8360 --- /dev/null +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/MessageTrafficLogger.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl; + +import com.sportradar.unifiedodds.sdk.LoggerDefinitions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MessageTrafficLogger { + + private static final String TRAFFIC_LOG_DELIMITER = "<~>"; + + private static final Logger TRAFFIC_LOGGER = LoggerFactory.getLogger( + LoggerDefinitions.UfSdkTrafficLog.class + ); + + private MessageTrafficLogger() {} + + public static void logReceivedOnClosedChannel( + String consumerDescription, + String routingKey, + byte[] body + ) { + TRAFFIC_LOGGER.debug( + "{} {} {} {} {}", + consumerDescription, + TRAFFIC_LOG_DELIMITER, + routingKey, + TRAFFIC_LOG_DELIMITER, + "received on closed channel: " + new String(body) + ); + } +} diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderFactoryImpl.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderFactoryImpl.java index 69f51b33..d256cb20 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderFactoryImpl.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderFactoryImpl.java @@ -11,6 +11,7 @@ import com.sportradar.unifiedodds.sdk.caching.ProfileCache; import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptionProvider; import com.sportradar.unifiedodds.sdk.entities.SportEvent; +import com.sportradar.unifiedodds.sdk.impl.TimeUtils; import java.util.Map; /** @@ -23,22 +24,26 @@ public class NameProviderFactoryImpl implements NameProviderFactory { private final ProfileCache profileCache; private final NameExpressionFactory expressionFactory; private final ExceptionHandlingStrategy exceptionHandlingStrategy; + private final TimeUtils time; @Inject public NameProviderFactoryImpl( MarketDescriptionProvider descriptorProvider, ProfileCache profileCache, NameExpressionFactory expressionFactory, - SdkInternalConfiguration cfg + SdkInternalConfiguration cfg, + TimeUtils time ) { Preconditions.checkNotNull(descriptorProvider); Preconditions.checkNotNull(profileCache); Preconditions.checkNotNull(expressionFactory); + Preconditions.checkNotNull(time); this.descriptorProvider = descriptorProvider; this.profileCache = profileCache; this.expressionFactory = expressionFactory; this.exceptionHandlingStrategy = cfg.getExceptionHandlingStrategy(); + this.time = time; } @Override @@ -56,7 +61,8 @@ public NameProvider buildNameProvider( marketId, specifiers, producerId, - exceptionHandlingStrategy + exceptionHandlingStrategy, + time ); } } diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImpl.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImpl.java index b7c06b35..631294f1 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImpl.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImpl.java @@ -21,6 +21,7 @@ import com.sportradar.unifiedodds.sdk.exceptions.internal.CacheItemNotFoundException; import com.sportradar.unifiedodds.sdk.exceptions.internal.IllegalCacheStateException; import com.sportradar.unifiedodds.sdk.exceptions.internal.ObjectNotFoundException; +import com.sportradar.unifiedodds.sdk.impl.TimeUtils; import com.sportradar.unifiedodds.sdk.impl.UnifiedFeedConstants; import com.sportradar.utils.SdkHelper; import com.sportradar.utils.Urn; @@ -66,8 +67,9 @@ public class NameProviderImpl implements NameProvider { private final int producerId; private final ExceptionHandlingStrategy exceptionHandlingStrategy; private final Supplier> competitorList; + private final TimeUtils time; - private Date lastReload = new Date(0); + private long lastReload; NameProviderImpl( MarketDescriptionProvider descriptorProvider, @@ -77,8 +79,10 @@ public class NameProviderImpl implements NameProvider { int marketId, Map marketSpecifiers, int producerId, - ExceptionHandlingStrategy exceptionHandlingStrategy + ExceptionHandlingStrategy exceptionHandlingStrategy, + TimeUtils time ) { + this.time = time; Preconditions.checkNotNull(descriptorProvider); Preconditions.checkNotNull(profileCache); Preconditions.checkNotNull(expressionFactory); @@ -100,7 +104,12 @@ public class NameProviderImpl implements NameProvider { @Override public String getMarketName(Locale locale) { - return getMarketNames(Collections.singletonList(locale)).get(locale); + Map nameTranslations = getMarketNames(Collections.singletonList(locale)); + if (nameTranslations != null) { + return nameTranslations.get(locale); + } else { + return null; + } } @Override @@ -176,7 +185,13 @@ private String mapMarketNames(MarketDescription marketDescriptor, Locale locale) public String getOutcomeName(String outcomeId, Locale locale) { Preconditions.checkArgument(!Strings.isNullOrEmpty(outcomeId)); Preconditions.checkNotNull(locale); - return getOutcomeNames(outcomeId, Collections.singletonList(locale)).get(locale); + + Map outcomeNames = getOutcomeNames(outcomeId, Collections.singletonList(locale)); + if (outcomeNames != null) { + return outcomeNames.get(locale); + } else { + return null; + } } @Override @@ -205,7 +220,7 @@ public Map getOutcomeNames(String outcomeId, List locale MarketDescription marketDescription = getMarketDescriptionForOutcome(outcomeId, locales, true); if (marketDescription == null) { - return Collections.emptyMap(); + return null; } Optional optDesc = marketDescription @@ -412,49 +427,29 @@ private Map handleErrorCondition( List locales, Exception ex ) { - Preconditions.checkArgument(!Strings.isNullOrEmpty(message)); - Preconditions.checkNotNull(locales); - - StringBuilder sb = new StringBuilder("An error occurred while generating the name for event=[") - .append(sportEvent) - .append("], market=["); - String specifierString = marketSpecifiers == null - ? "null" - : marketSpecifiers - .entrySet() - .stream() - .map(e -> "{" + e.getKey() + "}={" + e.getValue() + "}") - .collect(Collectors.joining("|")); - sb.append(" MarketId=").append(marketId); - sb.append(" Specifiers=[").append(specifierString).append("]"); - - if (outcomeId != null) { - sb.append(" OutcomeId=").append(outcomeId); - } - - sb.append("]"); - - sb.append(" Locale=").append(locales.toString()); - - if (nameDescriptor != null) { - sb.append(" Retrieved nameDescriptor=[").append(nameDescriptor).append("]"); - } - - sb.append("]. Additional message: ").append(message); - + String statusMessage = new StatusMessage( + sportEvent, + marketId, + marketSpecifiers, + message, + outcomeId, + nameDescriptor, + locales + ) + .toString(); if (exceptionHandlingStrategy == ExceptionHandlingStrategy.Throw) { if (ex != null) { - throw new NameGenerationException(sb.toString(), ex); + throw new NameGenerationException(statusMessage, ex); } else { - throw new NameGenerationException(sb.toString()); + throw new NameGenerationException(statusMessage); } } else { if (ex != null) { - logger.warn(sb.toString(), ex); + logger.warn(statusMessage, ex); } else { - logger.warn(sb.toString()); + logger.warn(statusMessage); } - return Collections.emptyMap(); + return null; } } @@ -499,15 +494,20 @@ private MarketDescription getMarketDescriptionForOutcome( if (marketDescription.getOutcomes() == null || marketDescription.getOutcomes().isEmpty()) { if (firstTime) { - handleErrorCondition( - "Retrieved market descriptor is lacking outcomes", - outcomeId, - null, - locales, - null + logger.warn( + new StatusMessage( + sportEvent, + marketId, + marketSpecifiers, + "Retrieved market descriptor is lacking outcomes", + outcomeId, + null, + locales + ) + .toString() ); if (canReload()) { - handleErrorCondition("Reloading market description", outcomeId, null, locales, null); + logger.warn("Reloading market description"); descriptorProvider.reloadMarketDescription(marketId, marketSpecifiers); return getMarketDescriptionForOutcome(outcomeId, locales, false); } else { @@ -534,15 +534,20 @@ private MarketDescription getMarketDescriptionForOutcome( !SdkHelper.findMissingLocales(optDesc.get().getLocales(), locales).isEmpty() ) { if (firstTime) { - handleErrorCondition( - "Retrieved market descriptor is missing outcome", - outcomeId, - null, - locales, - null + logger.warn( + new StatusMessage( + sportEvent, + marketId, + marketSpecifiers, + "Retrieved market descriptor is missing outcome", + outcomeId, + null, + locales + ) + .toString() ); if (canReload()) { - handleErrorCondition("Reloading market description", outcomeId, null, locales, null); + logger.warn("Reloading market description"); descriptorProvider.reloadMarketDescription(marketId, marketSpecifiers); return getMarketDescriptionForOutcome(outcomeId, locales, false); } else { @@ -563,14 +568,77 @@ private MarketDescription getMarketDescriptionForOutcome( } private boolean canReload() { - Date date = new Date(); + long currentTimestamp = time.now(); boolean allow = - Math.abs(date.getTime() - lastReload.getTime()) / - 1000 > - SdkHelper.MarketDescriptionMinFetchInterval; + Math.abs(currentTimestamp - lastReload) / 1000 > SdkHelper.MarketDescriptionMinFetchInterval; if (allow) { - lastReload = date; + lastReload = currentTimestamp; } return allow; } + + static class StatusMessage { + + private final SportEvent sportEvent; + private final int marketId; + private final Map marketSpecifiers; + private final String message; + private final String outcomeId; + private final String outcomeName; + private final List locales; + + StatusMessage( + SportEvent sportEvent, + int marketId, + Map marketSpecifiers, + String message, + String outcomeId, + String outcomeName, + List locales + ) { + Preconditions.checkArgument(!Strings.isNullOrEmpty(message)); + Preconditions.checkNotNull(sportEvent); + Preconditions.checkNotNull(locales); + Preconditions.checkArgument(marketId > 0); + this.sportEvent = sportEvent; + this.marketId = marketId; + this.marketSpecifiers = marketSpecifiers; + this.message = message; + this.outcomeId = outcomeId; + this.outcomeName = outcomeName; + this.locales = locales; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("An error occurred while generating the name for event=[") + .append(sportEvent) + .append("], market=["); + String specifierString = marketSpecifiers == null + ? "null" + : marketSpecifiers + .entrySet() + .stream() + .map(e -> "{" + e.getKey() + "}={" + e.getValue() + "}") + .collect(Collectors.joining("|")); + sb.append(" MarketId=").append(marketId); + sb.append(" Specifiers=[").append(specifierString).append("]"); + + if (outcomeId != null) { + sb.append(" OutcomeId=").append(outcomeId); + } + + sb.append("]"); + + sb.append(" Locale=").append(locales); + + if (outcomeName != null) { + sb.append(" Retrieved nameDescriptor=[").append(outcomeName).append("]"); + } + + sb.append("]. Additional message: ").append(message); + + return sb.toString(); + } + } } diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionImpl.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionImpl.java index 56514ffd..b2d9c3d1 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionImpl.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionImpl.java @@ -37,8 +37,10 @@ class MarketDefinitionImpl implements MarketDefinition { private final MarketDescriptionProvider descriptorProvider; private final Locale defaultLocale; private final ExceptionHandlingStrategy exceptionHandlingStrategy; + private final int marketId; MarketDefinitionImpl( + int marketId, SportEvent sportEvent, MarketDescription marketDescriptor, Urn sportId, @@ -49,13 +51,13 @@ class MarketDefinitionImpl implements MarketDefinition { ExceptionHandlingStrategy exceptionHandlingStrategy ) { Preconditions.checkNotNull(sportEvent); - Preconditions.checkNotNull(marketDescriptor); Preconditions.checkNotNull(sportId); Preconditions.checkNotNull(descriptorProvider); Preconditions.checkNotNull(defaultLocale); Preconditions.checkArgument(producerId > 0); Preconditions.checkNotNull(exceptionHandlingStrategy); + this.marketId = marketId; this.sportEvent = sportEvent; this.marketDescriptor = marketDescriptor; this.sportId = sportId; @@ -68,7 +70,17 @@ class MarketDefinitionImpl implements MarketDefinition { @Override public String getOutcomeType() { - return marketDescriptor.getOutcomeType(); + if (marketDescriptor != null) { + return marketDescriptor.getOutcomeType(); + } else { + if (exceptionHandlingStrategy == ExceptionHandlingStrategy.Throw) { + throw new ObjectNotFoundException( + "The requested translated name template could not be found" + ); + } else { + return null; + } + } } @Override @@ -82,7 +94,7 @@ public String getNameTemplate(Locale locale) { try { translatedDescriptor = descriptorProvider.getMarketDescription( - this.marketDescriptor.getId(), + marketId, specifiersMap, Collections.singletonList(locale), false @@ -101,19 +113,35 @@ public String getNameTemplate(Locale locale) { @Override public List getGroups() { - return marketDescriptor.getGroups(); + if (marketDescriptor != null) { + return marketDescriptor.getGroups(); + } else { + if (exceptionHandlingStrategy == ExceptionHandlingStrategy.Throw) { + throw new ObjectNotFoundException("The requested groups could not be found"); + } else { + return null; + } + } } @Override public Map getAttributes() { - if (marketDescriptor.getAttributes() == null) { - return null; - } + if (marketDescriptor != null) { + if (marketDescriptor.getAttributes() == null) { + return null; + } - return marketDescriptor - .getAttributes() - .stream() - .collect(Collectors.toMap(MarketAttribute::getName, MarketAttribute::getDescription)); + return marketDescriptor + .getAttributes() + .stream() + .collect(Collectors.toMap(MarketAttribute::getName, MarketAttribute::getDescription)); + } else { + if (exceptionHandlingStrategy == ExceptionHandlingStrategy.Throw) { + throw new ObjectNotFoundException("The requested attributes could not be found"); + } else { + return null; + } + } } @Override @@ -135,7 +163,7 @@ public List getValidMappings(Locale locale, boolean adjustMap try { completeDescriptor = descriptorProvider.getMarketDescription( - this.marketDescriptor.getId(), + marketId, specifiersMap, Collections.singletonList(locale), false diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImpl.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImpl.java index c638baf2..69d3bba4 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImpl.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImpl.java @@ -80,13 +80,12 @@ public Optional buildMarket(SportEvent sportEvent, UfMarket market, int Map specifiersMap = parseSpecifiers(market.getSpecifiers()); - MarketDescription marketDescriptor; + MarketDescription marketDescriptor = null; try { marketDescriptor = getMarketDescription(market.getId(), sportEvent.getSportId(), specifiersMap, producerId); } catch (CacheItemNotFoundException e) { logger.warn("Failed to build market with id:{}, reason:", market.getId(), e); - return Optional.empty(); } return Optional.of( @@ -96,6 +95,7 @@ public Optional buildMarket(SportEvent sportEvent, UfMarket market, int specifiersMap, parseSpecifiers(market.getExtendedSpecifiers()), new MarketDefinitionImpl( + market.getId(), sportEvent, marketDescriptor, sportEvent.getSportId(), @@ -121,13 +121,12 @@ public Optional buildMarketWithOdds( Map specifiersMap = parseSpecifiers(market.getSpecifiers()); - MarketDescription marketDescriptor; + MarketDescription marketDescriptor = null; try { marketDescriptor = getMarketDescription(market.getId(), sportEvent.getSportId(), specifiersMap, producerId); } catch (CacheItemNotFoundException e) { logger.warn("Failed to build marketWithOdds id={}, reason:", market.getId(), e); - return Optional.empty(); } NameProvider nameProvider = nameProviderFactory.buildNameProvider( @@ -144,6 +143,7 @@ public Optional buildMarketWithOdds( specifiersMap, parseSpecifiers(market.getExtendedSpecifiers()), new MarketDefinitionImpl( + market.getId(), sportEvent, marketDescriptor, sportEvent.getSportId(), @@ -158,6 +158,7 @@ public Optional buildMarketWithOdds( market.getFavourite(), market.getMarketMetadata(), buildOddsOutcomes( + market.getId(), marketDescriptor, nameProvider, sportEvent, @@ -180,13 +181,12 @@ public Optional buildMarketWithSettlement( Map specifiersMap = parseSpecifiers(market.getSpecifiers()); - MarketDescription marketDescriptor; + MarketDescription marketDescriptor = null; try { marketDescriptor = getMarketDescription(market.getId(), sportEvent.getSportId(), specifiersMap, producerId); } catch (CacheItemNotFoundException e) { logger.warn("Failed to build marketWithSettlement id={}, reason:", market.getId(), e); - return Optional.empty(); } NameProvider nameProvider = nameProviderFactory.buildNameProvider( @@ -203,6 +203,7 @@ public Optional buildMarketWithSettlement( specifiersMap, parseSpecifiers(market.getExtendedSpecifiers()), new MarketDefinitionImpl( + market.getId(), sportEvent, marketDescriptor, sportEvent.getSportId(), @@ -215,7 +216,7 @@ public Optional buildMarketWithSettlement( defaultLocale, market.getVoidReason(), buildSettlementOutcomes( - marketDescriptor, + market.getId(), nameProvider, sportEvent, producerId, @@ -238,13 +239,12 @@ public Optional buildMarketWithProbabilities( Map specifiersMap = parseSpecifiers(market.getSpecifiers()); - MarketDescription marketDescriptor; + MarketDescription marketDescriptor = null; try { marketDescriptor = getMarketDescription(market.getId(), sportEvent.getSportId(), specifiersMap, producerId); } catch (CacheItemNotFoundException e) { logger.warn("Failed to build marketWithProbabilities id={}, reason:", market.getId(), e); - return Optional.empty(); } NameProvider nameProvider = nameProviderFactory.buildNameProvider( @@ -261,6 +261,7 @@ public Optional buildMarketWithProbabilities( specifiersMap, parseSpecifiers(market.getExtendedSpecifiers()), new MarketDefinitionImpl( + market.getId(), sportEvent, marketDescriptor, sportEvent.getSportId(), @@ -273,7 +274,7 @@ public Optional buildMarketWithProbabilities( defaultLocale, market.getStatus(), buildProbabilityOutcomes( - marketDescriptor, + market.getId(), nameProvider, sportEvent, producerId, @@ -293,13 +294,12 @@ public Optional buildMarketCancel(SportEvent sportEvent, UfMarket Map specifiersMap = parseSpecifiers(market.getSpecifiers()); - MarketDescription marketDescriptor; + MarketDescription marketDescriptor = null; try { marketDescriptor = getMarketDescription(market.getId(), sportEvent.getSportId(), specifiersMap, producerId); } catch (CacheItemNotFoundException e) { logger.warn("Failed to build buildMarketCancel id={}, reason:", market.getId(), e); - return Optional.empty(); } return Optional.of( @@ -309,6 +309,7 @@ public Optional buildMarketCancel(SportEvent sportEvent, UfMarket specifiersMap, parseSpecifiers(market.getExtendedSpecifiers()), new MarketDefinitionImpl( + market.getId(), sportEvent, marketDescriptor, sportEvent.getSportId(), @@ -367,7 +368,9 @@ private MarketDescription getMarketDescription( ); } + @SuppressWarnings("ParameterNumber") private List buildOddsOutcomes( + int marketId, MarketDescription md, NameProvider nameProvider, SportEvent sportEvent, @@ -383,13 +386,13 @@ private List buildOddsOutcomes( for (UfOddsChangeMarket.UfOutcome o : outcomes) { OutcomeOdds outcomeOdds; - if (isValidPlayerOutcome(sportEvent, md.getId(), o.getId(), o.getTeam())) { + if (isValidPlayerOutcome(sportEvent, md, o.getId(), o.getTeam())) { outcomeOdds = new PlayerOutcomeOddsImpl( o.getId(), nameProvider, new OutcomeDefinitionImpl( - md, + marketId, o.getId(), sportEvent.getSportId(), producerId, @@ -412,7 +415,7 @@ private List buildOddsOutcomes( o.getId(), nameProvider, new OutcomeDefinitionImpl( - md, + marketId, o.getId(), sportEvent.getSportId(), producerId, @@ -436,7 +439,7 @@ private List buildOddsOutcomes( } private List buildSettlementOutcomes( - MarketDescription md, + int marketId, NameProvider nameProvider, SportEvent sportEvent, int producerId, @@ -453,7 +456,7 @@ private List buildSettlementOutcomes( o.getId(), nameProvider, new OutcomeDefinitionImpl( - md, + marketId, o.getId(), sportEvent.getSportId(), producerId, @@ -475,7 +478,7 @@ private List buildSettlementOutcomes( } private List buildProbabilityOutcomes( - MarketDescription md, + int marketId, NameProvider nameProvider, SportEvent sportEvent, int producerId, @@ -493,7 +496,7 @@ private List buildProbabilityOutcomes( o.getId(), nameProvider, new OutcomeDefinitionImpl( - md, + marketId, o.getId(), sportEvent.getSportId(), producerId, @@ -513,7 +516,7 @@ private List buildProbabilityOutcomes( private boolean isValidPlayerOutcome( SportEvent sportEvent, - int marketId, + MarketDescription marketDescription, String outcomeId, Integer outcomeTeamIndication ) { @@ -526,7 +529,7 @@ private boolean isValidPlayerOutcome( logger.warn( "Received invalid player outcome, sport event is not a match. SportEventId:{}, marketId:{}, outcomeId:{}, outcomeTeamIndication:{}", sportEvent.getId(), - marketId, + marketDescription != null ? marketDescription.getId() : null, outcomeId, outcomeTeamIndication ); diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeDefinitionImpl.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeDefinitionImpl.java index fff8eff5..ed5e72c5 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeDefinitionImpl.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeDefinitionImpl.java @@ -24,7 +24,6 @@ @SuppressWarnings({ "ParameterNumber" }) class OutcomeDefinitionImpl implements OutcomeDefinition { - private final MarketDescription marketDescription; private final String outcomeId; private final Urn sportId; private final int producerId; @@ -32,9 +31,10 @@ class OutcomeDefinitionImpl implements OutcomeDefinition { private final Locale defaultLocale; private final MarketDescriptionProvider descriptorProvider; private final ExceptionHandlingStrategy exceptionHandlingStrategy; + private final int marketId; OutcomeDefinitionImpl( - MarketDescription md, + int marketId, String outcomeId, Urn sportId, int producerId, @@ -43,7 +43,6 @@ class OutcomeDefinitionImpl implements OutcomeDefinition { Locale defaultLocale, ExceptionHandlingStrategy exceptionHandlingStrategy ) { - Preconditions.checkNotNull(md); Preconditions.checkNotNull(sportId); Preconditions.checkNotNull(defaultLocale); Preconditions.checkNotNull(descriptorProvider); @@ -51,7 +50,7 @@ class OutcomeDefinitionImpl implements OutcomeDefinition { Preconditions.checkArgument(producerId > 0); Preconditions.checkNotNull(exceptionHandlingStrategy); - this.marketDescription = md; + this.marketId = marketId; this.outcomeId = outcomeId; this.sportId = sportId; this.producerId = producerId; @@ -95,7 +94,7 @@ public String getNameTemplate(Locale locale) { private MarketDescription provideDynamicVariantMarket(Locale locale) throws CacheItemNotFoundException { return descriptorProvider.getMarketDescription( - this.marketDescription.getId(), + marketId, specifiersMap, Lists.newArrayList(locale), true diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactory.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactory.java index 540a5cbe..5985b63f 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactory.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactory.java @@ -38,7 +38,7 @@ Connection getConnection() * * @return the status of the connection */ - boolean isConnectionOpen(); + boolean isConnectionHealthy(); /** * Get the timestamp when the connection started diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImpl.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImpl.java index 21961dd0..1d7c563a 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImpl.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImpl.java @@ -8,13 +8,11 @@ import com.google.inject.Inject; import com.google.inject.name.Named; import com.rabbitmq.client.*; -import com.sportradar.unifiedodds.sdk.impl.ChannelMessageConsumer; -import com.sportradar.unifiedodds.sdk.impl.RabbitMqSystemListener; -import com.sportradar.unifiedodds.sdk.impl.TimeUtils; -import com.sportradar.unifiedodds.sdk.impl.TimeUtilsImpl; +import com.sportradar.unifiedodds.sdk.impl.*; import com.sportradar.unifiedodds.sdk.impl.apireaders.WhoAmIReader; import com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ChannelStatus.UnderlyingConnectionStatus; import com.sportradar.utils.SdkHelper; +import com.sportradar.utils.thread.sleep.Sleep; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.*; @@ -78,17 +76,19 @@ public class RabbitMqChannelImpl implements OnDemandChannelSupervisor { /** * Connection factory for getting new channel */ - private AmqpConnectionFactory connectionFactory; + private final AmqpConnectionFactory connectionFactory; /** * A {@link Channel} instance used by this instance */ private Channel channel; + private LastMessageTimestampPreservingConsumer consumer; + /** * An indication if the current channel should be opened */ - private boolean shouldBeOpened = false; + private boolean isChannelBeingSupervised = false; private LocalDateTime channelLastMessage; @@ -100,7 +100,9 @@ public class RabbitMqChannelImpl implements OnDemandChannelSupervisor { private long channelStarted; - private TimeUtils timeUtils; + private final TimeUtils timeUtils; + + private final Sleep sleep; /** * Initializes a new instance of the {@link RabbitMqChannelImpl} @@ -117,12 +119,14 @@ public RabbitMqChannelImpl( WhoAmIReader whoAmIReader, @Named("version") String sdkVersion, AmqpConnectionFactory connectionFactory, - TimeUtils timeUtils + TimeUtils timeUtils, + Sleep sleep ) { Preconditions.checkNotNull(rabbitMqSystemListener); Preconditions.checkNotNull(whoAmIReader); Preconditions.checkNotNull(connectionFactory); Preconditions.checkNotNull(timeUtils); + Preconditions.checkNotNull(sleep); this.rabbitMqSystemListener = rabbitMqSystemListener; this.sdkMdcContextDescription = whoAmIReader.getAssociatedSdkMdcContextMap(); @@ -131,6 +135,7 @@ public RabbitMqChannelImpl( this.channelLastMessage = LocalDateTime.MIN; this.channelStarted = 0; this.timeUtils = timeUtils; + this.sleep = sleep; } /** @@ -151,11 +156,11 @@ public synchronized void open( Preconditions.checkArgument(!routingKeys.isEmpty()); Preconditions.checkNotNull(channelMessageConsumer); - if (shouldBeOpened) { + if (isChannelBeingSupervised) { return; } - this.shouldBeOpened = true; + this.isChannelBeingSupervised = true; this.routingKeys = routingKeys; this.channelMessageConsumer = channelMessageConsumer; this.messageInterest = messageInterest; @@ -187,6 +192,7 @@ private void initChannelQueue(List routingKeys, String messageInterest) return; } channel = conn.createChannel(); + consumer = new LastMessageTimestampPreservingConsumer(channel); } catch (Exception e) { logger.error(String.format("Error creating channel: %s", e.getMessage()), e); return; @@ -199,41 +205,6 @@ private void initChannelQueue(List routingKeys, String messageInterest) channel.queueBind(qName, UF_EXCHANGE, routingKey); } - DefaultConsumer consumer = new DefaultConsumer(channel) { - @Override - public synchronized void handleDelivery( - String tag, - Envelope envelope, - AMQP.BasicProperties properties, - byte[] body - ) { - MDC.setContextMap(sdkMdcContextDescription); - try { - channelLastMessage = - LocalDateTime.ofInstant( - Instant.ofEpochMilli(timeUtils.now()), - ZoneId.systemDefault() - ); - channelMessageConsumer.onMessageReceived( - envelope.getRoutingKey(), - body, - properties, - new TimeUtilsImpl().now() - ); - } catch (Exception e) { - logger.error( - String.format( - "An exception occurred while processing AMQP message. Routing key: '%s', body: '%s'", - envelope.getRoutingKey(), - body == null ? "null" : new String(body) - ), - e - ); - } - MDC.clear(); - } - }; - channel.addShutdownListener(rabbitMqSystemListener); ((Recoverable) channel).addRecoveryListener(rabbitMqSystemListener); String consumerTag = String.format( @@ -262,14 +233,14 @@ public synchronized void handleDelivery( */ @Override public synchronized void close() throws IOException { - if (!shouldBeOpened) { + if (!isChannelBeingSupervised) { if (connectionFactory != null && connectionFactory.canConnectionOpen()) { logger.warn("Attempting to close an already closed channel"); } return; } - shouldBeOpened = false; + isChannelBeingSupervised = false; channelLastMessage = LocalDateTime.MIN; channelClosePure(); } @@ -321,7 +292,7 @@ private void stagesNotExitingTheLoopButPrematurilyTerminatingCurrentIteration() : 1; // to avoid long overflow channelStartedDiff = Math.abs(channelStartedDiff / 1000); if (channelLastMessage == LocalDateTime.MIN && channelStarted > 0 && channelStartedDiff >= 180) { - String isOpen = connectionFactory.isConnectionOpen() ? "s" : ""; + String isOpen = connectionFactory.isConnectionHealthy() ? "s" : ""; logger.warn( "There were no message{} in more then {}s for the channel with channelNumber: {} ({}). Last message arrived: {}. Recreating channel...", isOpen, @@ -341,7 +312,7 @@ private void stagesNotExitingTheLoopButPrematurilyTerminatingCurrentIteration() : 1; // to avoid long overflow lastMessageDiff = Math.abs(lastMessageDiff / 1000); if (channelLastMessage != LocalDateTime.MIN && lastMessageDiff >= 180) { - String isOpen = connectionFactory.isConnectionOpen() ? "s" : ""; + String isOpen = connectionFactory.isConnectionHealthy() ? "s" : ""; logger.warn( "There were no message{} in more then {}s for the channel with channelNumber: {} ({}). Last message arrived: {}", isOpen, @@ -350,47 +321,59 @@ private void stagesNotExitingTheLoopButPrematurilyTerminatingCurrentIteration() messageInterest, channelLastMessage ); - int channelNumber = channel == null ? 0 : channel.getChannelNumber(); - - if (connectionFactory.getConnectionStarted() < channelStarted) { - channelClosePure(); - logger.info("Resetting connection for the channel with channelNumber: {}", channelNumber); - try { - synchronized (connectionFactory) { - if (connectionFactory.isConnectionOpen()) { - // Throws rabbit AlreadyClosedException which is a RuntimeException - connectionFactory.close(false); - } - } - } catch (Throwable e) { - String msg = String.format("Error closing connection: %s", e.getMessage()); - logger.error(msg, e); - } finally { - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - // Do nothing - logger.warn("Interrupted!", e); - } - } - logger.info( - "Resetting connection finished for the channel with channelNumber: {}", - channelNumber - ); + onlyIfConnectionHealthyRestartConnectionAndChannel(); + } + } + + private void onlyIfConnectionHealthyRestartConnectionAndChannel() { + boolean connectionStopped; + synchronized (connectionFactory) { + if (connectionFactory.isConnectionHealthy()) { + logManualReconnection(() -> { + channelClosePure(); + closeConnection(); + }); + connectionStopped = true; + } else { + connectionStopped = false; } + } + if (connectionStopped) { + sleep.millis(5000); restartChannel(); } } + private void logManualReconnection(Runnable reconnect) { + int channelNumber = channel == null ? 0 : channel.getChannelNumber(); + logger.info("Resetting connection for the channel with channelNumber: {}", channelNumber); + + reconnect.run(); + + logger.info("Resetting connection finished for the channel with channelNumber: {}", channelNumber); + } + + private void closeConnection() { + try { + // Throws rabbit AlreadyClosedException which is a RuntimeException + connectionFactory.close(false); + } catch (Throwable e) { + String msg = String.format("Error closing connection: %s", e.getMessage()); + logger.error(msg, e); + } + } + private void channelClosePure() { try { if (channel != null && channel.isOpen()) { ((Recoverable) channel).removeRecoveryListener(rabbitMqSystemListener); + consumer.close(); channel.close(); } } catch (TimeoutException | IOException e) { logger.error(String.format("Error closing channel: %s", e.getMessage())); } finally { + consumer = null; channel = null; channelStarted = 0; } @@ -405,4 +388,58 @@ private void restartChannel() { logger.error(String.format("Error creating channel: %s", e.getMessage())); } } + + private class LastMessageTimestampPreservingConsumer extends DefaultConsumer { + + private volatile boolean isConsumerOpen = true; + + public LastMessageTimestampPreservingConsumer(Channel channel) { + super(channel); + } + + public void close() { + isConsumerOpen = false; + } + + @Override + public synchronized void handleDelivery( + String tag, + Envelope envelope, + AMQP.BasicProperties properties, + byte[] body + ) { + MDC.setContextMap(sdkMdcContextDescription); + try { + if (isConsumerOpen) { + channelLastMessage = + LocalDateTime.ofInstant( + Instant.ofEpochMilli(timeUtils.now()), + ZoneId.systemDefault() + ); + channelMessageConsumer.onMessageReceived( + envelope.getRoutingKey(), + body, + properties, + new TimeUtilsImpl().now() + ); + } else { + MessageTrafficLogger.logReceivedOnClosedChannel( + channelMessageConsumer.getConsumerDescription(), + envelope.getRoutingKey(), + body + ); + } + } catch (Exception e) { + logger.error( + String.format( + "An exception occurred while processing AMQP message. Routing key: '%s', body: '%s'", + envelope.getRoutingKey(), + body == null ? "null" : new String(body) + ), + e + ); + } + MDC.clear(); + } + } } diff --git a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceAmqpConnectionFactory.java b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceAmqpConnectionFactory.java index 7c4e4939..fad8244e 100644 --- a/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceAmqpConnectionFactory.java +++ b/sdk-core/src/main/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceAmqpConnectionFactory.java @@ -229,7 +229,7 @@ public synchronized void close(boolean feedStopped) throws IOException { } @Override - public synchronized boolean isConnectionOpen() { + public synchronized boolean isConnectionHealthy() { return this.connection != null && this.connection.isOpen(); } diff --git a/sdk-core/src/main/java/com/sportradar/utils/thread/sleep/Sleep.java b/sdk-core/src/main/java/com/sportradar/utils/thread/sleep/Sleep.java new file mode 100644 index 00000000..c265a63e --- /dev/null +++ b/sdk-core/src/main/java/com/sportradar/utils/thread/sleep/Sleep.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.thread.sleep; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Sleep { + + private static final Logger LOGGER = LoggerFactory.getLogger(Sleep.class); + + public void millis(int amount) { + try { + Thread.sleep(amount); + } catch (InterruptedException e) { + LOGGER.warn("Interrupted", e); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureCacheTimeouts.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureCacheTimeouts.java index a54267e3..92353a10 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureCacheTimeouts.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureCacheTimeouts.java @@ -10,15 +10,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; -import com.sportradar.unifiedodds.sdk.cfg.Environment; import com.sportradar.unifiedodds.sdk.cfg.Environments; import com.sportradar.unifiedodds.sdk.cfg.StubSdkConfigurationPropertiesReader; import com.sportradar.unifiedodds.sdk.cfg.StubSdkConfigurationYamlReader; import com.sportradar.unifiedodds.sdk.cfg.TokenSetter; import com.sportradar.unifiedodds.sdk.cfg.TokenSetterImpl; import com.sportradar.unifiedodds.sdk.cfg.UofConfiguration; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; -import java.util.Locale; +import com.sportradar.utils.domain.names.Languages; import java.util.Map; import org.junit.Test; import org.junit.experimental.runners.Enclosed; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureEnvironmentTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureEnvironmentTest.java index 3f29bd7c..b6bbf2b1 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureEnvironmentTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureEnvironmentTest.java @@ -6,7 +6,6 @@ import static com.sportradar.unifiedodds.sdk.ConfigureEnvironmentTest.ToolsForTests.SdkInternalConfigurationAssertions.assertThat; import static com.sportradar.unifiedodds.sdk.cfg.Environment.Custom; import static com.sportradar.unifiedodds.sdk.cfg.Environment.Integration; -import static com.sportradar.unifiedodds.sdk.cfg.Environment.Production; import static com.sportradar.unifiedodds.sdk.cfg.Environment.Replay; import static com.sportradar.unifiedodds.sdk.cfg.Environments.getNonReplayEnvironments; import static com.sportradar.unifiedodds.sdk.cfg.Environments.getReplayEnvironments; @@ -15,13 +14,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Provides; import com.sportradar.unifiedodds.sdk.cfg.*; import com.sportradar.unifiedodds.sdk.impl.ProducerDataProvider; import com.sportradar.unifiedodds.sdk.impl.apireaders.WhoAmIReader; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import java.util.HashMap; import java.util.Locale; import java.util.Map; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureFastHttpClientTimeoutTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureFastHttpClientTimeoutTest.java index 16c40cfb..2c8b31d8 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureFastHttpClientTimeoutTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureFastHttpClientTimeoutTest.java @@ -16,7 +16,7 @@ import com.sportradar.unifiedodds.sdk.cfg.TokenSetter; import com.sportradar.unifiedodds.sdk.cfg.TokenSetterImpl; import com.sportradar.unifiedodds.sdk.cfg.UofConfiguration; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Map; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureIgnoreBetPalTimelineSportEventStatusTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureIgnoreBetPalTimelineSportEventStatusTest.java index e5cb6398..2af34d33 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureIgnoreBetPalTimelineSportEventStatusTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureIgnoreBetPalTimelineSportEventStatusTest.java @@ -14,7 +14,7 @@ import com.sportradar.unifiedodds.sdk.cfg.TokenSetter; import com.sportradar.unifiedodds.sdk.cfg.TokenSetterImpl; import com.sportradar.unifiedodds.sdk.cfg.UofConfiguration; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import java.util.Map; import org.junit.Test; import org.mockito.MockedStatic; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitConnectionTimeoutTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitConnectionTimeoutTest.java index e17a53a6..10b09640 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitConnectionTimeoutTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitConnectionTimeoutTest.java @@ -17,7 +17,7 @@ import com.sportradar.unifiedodds.sdk.cfg.TokenSetter; import com.sportradar.unifiedodds.sdk.cfg.TokenSetterImpl; import com.sportradar.unifiedodds.sdk.cfg.UofConfiguration; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Map; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitHeartBeatTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitHeartBeatTest.java index 61a2609d..dce8bc03 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitHeartBeatTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/ConfigureRabbitHeartBeatTest.java @@ -16,7 +16,7 @@ import com.sportradar.unifiedodds.sdk.cfg.TokenSetter; import com.sportradar.unifiedodds.sdk.cfg.TokenSetterImpl; import com.sportradar.unifiedodds.sdk.cfg.UofConfiguration; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Map; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/CourseCiTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/CourseCiTest.java index 817e70a6..10ffad85 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/CourseCiTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/CourseCiTest.java @@ -8,7 +8,7 @@ import com.sportradar.uf.sportsapi.datamodel.SapiCourse; import com.sportradar.uf.sportsapi.datamodel.SapiHole; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import lombok.val; import org.junit.Test; import org.junit.experimental.runners.Enclosed; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiIdTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiIdTest.java index 68df7145..edb47fdd 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiIdTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiIdTest.java @@ -12,9 +12,9 @@ import com.sportradar.uf.sportsapi.datamodel.SapiCourse; import com.sportradar.uf.sportsapi.datamodel.SapiVenue; import com.sportradar.unifiedodds.sdk.exceptions.UnsupportedUrnFormatException; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; import com.sportradar.utils.Urn; import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; import java.util.Locale; import lombok.val; import org.junit.Test; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiNameTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiNameTest.java index a6a1bb09..1f7717b0 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiNameTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiNameTest.java @@ -17,16 +17,15 @@ import com.sportradar.uf.sportsapi.datamodel.SapiCourse; import com.sportradar.uf.sportsapi.datamodel.SapiVenue; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; import com.sportradar.utils.Urn; import com.sportradar.utils.Urns; import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; import com.sportradar.utils.domain.names.Names; import java.util.Locale; import junitparams.JUnitParamsRunner; import junitparams.Parameters; import lombok.val; -import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiTest.java index 9e37ed29..5c570c92 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/VenueCiCourseCiTest.java @@ -10,9 +10,9 @@ import com.sportradar.uf.sportsapi.datamodel.SapiCourse; import com.sportradar.uf.sportsapi.datamodel.SapiVenue; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; import com.sportradar.utils.Urn; import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; import java.util.Locale; import lombok.val; import org.junit.Test; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/TranslationsAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/TranslationsAssert.java index 68047260..417c5735 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/TranslationsAssert.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/TranslationsAssert.java @@ -8,6 +8,7 @@ import com.sportradar.utils.domain.names.TranslationHolder; import java.util.Locale; import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.Assertions; public class TranslationsAssert extends AbstractAssert { @@ -22,14 +23,14 @@ public static TranslationsAssert assertThat(Translations translations) { public TranslationsAssert hasTranslation(TranslationHolder translation) { Locale language = translation.getLanguage(); String word = translation.getWord(); - org.assertj.core.api.Assertions.assertThat(actual.getFor(language)).isEqualTo(word); - org.assertj.core.api.Assertions.assertThat(actual.export().get(language)).isEqualTo(word); + Assertions.assertThat(actual.getFor(language)).isEqualTo(word); + Assertions.assertThat(actual.export().get(language)).isEqualTo(word); return this; } public TranslationsAssert isNotTranslatedTo(LanguageHolder language) { - org.assertj.core.api.Assertions.assertThat(actual.getFor(language.get())).isNull(); - org.assertj.core.api.Assertions.assertThat(actual.export().get(language.get())).isNull(); + Assertions.assertThat(actual.getFor(language.get())).isNull(); + Assertions.assertThat(actual.export().get(language.get())).isNull(); return this; } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/VenueCiAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/VenueCiAssert.java index b9e09ae5..b5770663 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/VenueCiAssert.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/ci/matchers/VenueCiAssert.java @@ -14,6 +14,7 @@ import java.util.Arrays; import lombok.val; import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.Assertions; public class VenueCiAssert extends AbstractAssert { @@ -28,11 +29,9 @@ public static VenueCiAssert assertThat(VenueCi venueCi) { public VenueCiAssert containsOnlyCoursesWithIds(Urn... ids) { val idList = ofNullable(ids).map(Arrays::asList).orElse(singletonList(null)); for (int i = 0; i < idList.size(); i++) { - org.assertj.core.api.Assertions - .assertThat(actual.getCourses().get(i).getId()) - .isEqualTo(idList.get(i)); + Assertions.assertThat(actual.getCourses().get(i).getId()).isEqualTo(idList.get(i)); } - org.assertj.core.api.Assertions.assertThat(actual.getCourses()).hasSize(idList.size()); + Assertions.assertThat(actual.getCourses()).hasSize(idList.size()); return this; } @@ -49,7 +48,7 @@ public VenueCiAssert containsCourse(IndexHolder index, LanguageHolder noTranslat } public VenueCiAssert containsAmountOfCourses(int amount) { - org.assertj.core.api.Assertions.assertThat(actual.getCourses()).hasSize(amount); + Assertions.assertThat(actual.getCourses()).hasSize(amount); return this; } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/exportable/ExportableCourseCiTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/exportable/ExportableCourseCiTest.java index 06f77c7f..f55e2cd4 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/exportable/ExportableCourseCiTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/exportable/ExportableCourseCiTest.java @@ -8,8 +8,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.sportradar.unifiedodds.sdk.testutil.generic.collections.Maps; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; import com.sportradar.utils.Urns; +import com.sportradar.utils.domain.names.Languages; import com.sportradar.utils.domain.names.Names; import java.util.Locale; import java.util.Map; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCiImplStageTypeTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCiImplStageTypeTest.java index f9e0971c..c575a17a 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCiImplStageTypeTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCiImplStageTypeTest.java @@ -18,7 +18,7 @@ import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; import com.sportradar.unifiedodds.sdk.caching.DataRouterManager; import com.sportradar.unifiedodds.sdk.exceptions.internal.CommunicationException; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import junitparams.JUnitParamsRunner; import junitparams.Parameters; import lombok.val; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCis.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCis.java index 63455dfd..3ef408ec 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCis.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/impl/ci/RaceStageCis.java @@ -15,7 +15,7 @@ import com.sportradar.unifiedodds.sdk.caching.exportable.ExportableRaceStageCi; import com.sportradar.unifiedodds.sdk.caching.impl.DataRouterManagers; import com.sportradar.unifiedodds.sdk.testutil.guava.libraryfixtures.Caches; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import java.util.*; import lombok.val; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptionStub.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptionStub.java new file mode 100644 index 00000000..93affbbd --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptionStub.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.caching.markets; + +import com.sportradar.uf.sportsapi.datamodel.DescMarket; +import com.sportradar.uf.sportsapi.datamodel.DescOutcomes; +import com.sportradar.unifiedodds.sdk.domain.language.Translations; +import com.sportradar.unifiedodds.sdk.entities.markets.*; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.val; +import lombok.var; + +@RequiredArgsConstructor +public class MarketDescriptionStub implements MarketDescription { + + private int id; + private Translations name; + private List outcomes; + + @SuppressWarnings("HiddenField") + public MarketDescriptionStub withId(int id) { + this.id = id; + return this; + } + + @SuppressWarnings("HiddenField") + public MarketDescriptionStub with(Translations name) { + this.name = name; + return this; + } + + @SuppressWarnings("HiddenField") + public MarketDescriptionStub with(List outcomes) { + this.outcomes = outcomes; + return this; + } + + @Override + public int getId() { + return id; + } + + @Override + public String getName(Locale language) { + return name.getFor(language); + } + + @Override + public Collection getLocales() { + return name.export().keySet(); + } + + @Override + public String getDescription(Locale locale) { + return null; + } + + @Override + public List getOutcomes() { + return outcomes; + } + + @Override + public List getSpecifiers() { + return null; + } + + @Override + public List getMappings() { + return null; + } + + @Override + public List getAttributes() { + return null; + } + + @Override + public List getGroups() { + return null; + } + + @Override + public String getOutcomeType() { + return null; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptions.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptions.java new file mode 100644 index 00000000..1984e349 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptions.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.caching.markets; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; + +import com.sportradar.uf.sportsapi.datamodel.DescMarket; +import com.sportradar.uf.sportsapi.datamodel.DescOutcomes; +import com.sportradar.unifiedodds.sdk.domain.language.Translations; +import com.sportradar.unifiedodds.sdk.entities.markets.MarketDescription; +import com.sportradar.unifiedodds.sdk.entities.markets.OutcomeDescription; +import com.sportradar.unifiedodds.sdk.testutil.generic.collections.Maps; +import com.sportradar.utils.domain.names.LanguageHolder; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import lombok.val; +import lombok.var; + +public final class MarketDescriptions { + + private MarketDescriptions() {} + + public static MarketDescription namesOf(DescMarket sapiMarketDesc, LanguageHolder language) { + return MarketDescriptions.NameFocused.singleMarketFrom(Maps.of(language.get(), sapiMarketDesc)); + } + + public static MarketDescription namesOf( + DescMarket sapiMarketDesc1, + LanguageHolder language1, + DescMarket sapiMarketDesc2, + LanguageHolder language2 + ) { + return MarketDescriptions.NameFocused.singleMarketFrom( + Maps.of(language1.get(), sapiMarketDesc1, language2.get(), sapiMarketDesc2) + ); + } + + static class NameFocused { + + public static MarketDescriptionStub singleMarketFrom(Map translatedMarket) { + int marketId = getMarketId(translatedMarket); + Translations marketName = Translations.importFrom(onlyMarketNameOf(translatedMarket)); + List outcomes = extractOutcomeDescriptions(translatedMarket); + return new MarketDescriptionStub().withId(marketId).with(marketName).with(outcomes); + } + + private static List extractOutcomeDescriptions( + Map translatedMarket + ) { + Map> translatedOutcomesByOutcomeId = new HashMap<>(); + setUpOutcomeIds(translatedMarket, translatedOutcomesByOutcomeId); + groupOutcomeTranslationsByOutcomeId(translatedMarket, translatedOutcomesByOutcomeId); + val translatedOutcomes = toOutcomeDescriptions(translatedOutcomesByOutcomeId); + return translatedOutcomes; + } + + private static List toOutcomeDescriptions( + Map> translatedOutcomesByOutcomeId + ) { + List translatedOutcomes = new ArrayList<>(); + for (var singleLanguageOutcomeTranslation : translatedOutcomesByOutcomeId.entrySet()) { + String outcomeId = singleLanguageOutcomeTranslation.getKey(); + translatedOutcomes.add( + new NameFocusedOutcomeDescriptionStub( + outcomeId, + Translations.importFrom(singleLanguageOutcomeTranslation.getValue()) + ) + ); + } + return translatedOutcomes; + } + + private static int getMarketId(Map translatedMarket) { + val marketIds = translatedMarket + .values() + .stream() + .map(DescMarket::getId) + .distinct() + .collect(Collectors.toList()); + if (marketIds.size() > 1) { + throw new IllegalStateException("Test fixture is not designed to hold more than one market"); + } + return marketIds.get(0); + } + + private static void groupOutcomeTranslationsByOutcomeId( + Map translatedMarket, + Map> translatedOutcomes + ) { + for (Map.Entry singleLanguageMarketTranslation : translatedMarket.entrySet()) { + val language = singleLanguageMarketTranslation.getKey(); + val market = singleLanguageMarketTranslation.getValue(); + market + .getOutcomes() + .getOutcome() + .forEach(outcome -> { + translatedOutcomes.get(outcome.getId()).put(language, outcome.getName()); + }); + } + } + + private static void setUpOutcomeIds( + Map translatedMarket, + Map> translatedOutcomes + ) { + translatedMarket + .values() + .stream() + .forEach(market -> + market + .getOutcomes() + .getOutcome() + .forEach(outcome -> translatedOutcomes.put(outcome.getId(), new HashMap<>())) + ); + } + + private static Map onlyMarketNameOf(Map markets) { + return markets + .entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, m -> m.getValue().getName())); + } + + private static Function toOutcomeStub( + Locale language + ) { + return o -> { + val outcomeTranslation = new Translations(language, o.getName()); + return new NameFocusedOutcomeDescriptionStub(o.getId(), outcomeTranslation); + }; + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptorProviders.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptorProviders.java new file mode 100644 index 00000000..7cd6a91b --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/MarketDescriptorProviders.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.caching.markets; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; + +import com.sportradar.unifiedodds.sdk.entities.markets.MarketDescription; +import com.sportradar.utils.domain.names.LanguageHolder; +import java.util.List; +import java.util.Locale; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +public final class MarketDescriptorProviders { + + private MarketDescriptorProviders() {} + + public static MarketDescriptionProvider noMarketDescribingProvider() { + return new NoMarketDescribingProvider(); + } + + public static OneMarketInMultiLanguageProviderStub providing( + LanguageHolder language, + MarketDescription marketDescription + ) { + return OneMarketInMultiLanguageProviderStub.Builder + .providing(singletonList(language.get()), marketDescription) + .build(); + } + + public static OneMarketInMultiLanguageProviderStub providing( + LanguageHolder language, + MarketDescription marketDescription, + TranslatedMarketDescriptionHolder afterReloading + ) { + return OneMarketInMultiLanguageProviderStub.Builder + .providing(singletonList(language.get()), marketDescription) + .andAfterReloading(afterReloading.languages, afterReloading.marketDescription) + .build(); + } + + public static OneMarketInMultiLanguageProviderStub providing( + LanguageHolder lang1, + LanguageHolder lang2, + MarketDescription marketDescription + ) { + return OneMarketInMultiLanguageProviderStub.Builder + .providing(asList(lang1.get(), lang2.get()), marketDescription) + .build(); + } + + public static OneMarketInMultiLanguageProviderStub providing( + LanguageHolder lang1, + LanguageHolder lang2, + MarketDescription marketDescription, + TranslatedMarketDescriptionHolder afterReloading + ) { + return OneMarketInMultiLanguageProviderStub.Builder + .providing(asList(lang1.get(), lang2.get()), marketDescription) + .andAfterReloading(afterReloading.languages, afterReloading.marketDescription) + .build(); + } + + public static TranslatedMarketDescriptionHolder andAfterReloading( + LanguageHolder language, + MarketDescription marketDescription + ) { + return new TranslatedMarketDescriptionHolder(singletonList(language.get()), marketDescription); + } + + public static TranslatedMarketDescriptionHolder andAfterReloading( + LanguageHolder langA, + LanguageHolder langB, + MarketDescription marketDescription + ) { + return new TranslatedMarketDescriptionHolder(asList(langA.get(), langB.get()), marketDescription); + } + + @RequiredArgsConstructor + public static class TranslatedMarketDescriptionHolder { + + private final List languages; + private final MarketDescription marketDescription; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NameFocusedOutcomeDescriptionStub.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NameFocusedOutcomeDescriptionStub.java new file mode 100644 index 00000000..ac827dca --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NameFocusedOutcomeDescriptionStub.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.caching.markets; + +import com.sportradar.unifiedodds.sdk.domain.language.Translations; +import com.sportradar.unifiedodds.sdk.entities.markets.OutcomeDescription; +import java.util.Collection; +import java.util.Locale; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class NameFocusedOutcomeDescriptionStub implements OutcomeDescription { + + private final String id; + private final Translations name; + + @Override + public String getId() { + return id; + } + + @Override + public String getName(Locale language) { + return name.getFor(language); + } + + @Override + public String getDescription(Locale locale) { + return null; + } + + @Override + public Collection getLocales() { + return name.export().keySet(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NoMarketDescribingProvider.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NoMarketDescribingProvider.java new file mode 100644 index 00000000..705042e3 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/NoMarketDescribingProvider.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.caching.markets; + +import com.sportradar.unifiedodds.sdk.entities.markets.MarketDescription; +import com.sportradar.unifiedodds.sdk.exceptions.internal.CacheItemNotFoundException; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class NoMarketDescribingProvider implements MarketDescriptionProvider { + + @Override + public MarketDescription getMarketDescription( + int marketId, + Map marketSpecifiers, + List locales, + boolean fetchVariantDescriptions + ) throws CacheItemNotFoundException { + throw new CacheItemNotFoundException("any message"); + } + + @Override + public boolean reloadMarketDescription(int marketId, Map marketSpecifiers) { + return false; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/OneMarketInMultiLanguageProviderStub.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/OneMarketInMultiLanguageProviderStub.java new file mode 100644 index 00000000..51420626 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/OneMarketInMultiLanguageProviderStub.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.caching.markets; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.sportradar.unifiedodds.sdk.entities.markets.MarketDescription; +import com.sportradar.unifiedodds.sdk.exceptions.internal.CacheItemNotFoundException; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class OneMarketInMultiLanguageProviderStub implements MarketDescriptionProvider { + + private final List availableLanguages; + private final MarketDescription marketDescription; + private final List availableLanguagesAfterReloading; + private final MarketDescription marketDescriptionAfterReloading; + + private int reloadMarketDescriptionsCalledTimes; + + @Override + public MarketDescription getMarketDescription( + int marketId, + Map marketSpecifiers, + List requestedLanguages, + boolean fetchVariantDescriptions + ) throws CacheItemNotFoundException { + if (getAvailableLanguages().containsAll(requestedLanguages)) { + return getMarketDescription(); + } else { + throw new CacheItemNotFoundException( + "market description provider test fixture " + + "does not contain translations for all requested languages" + ); + } + } + + private MarketDescription getMarketDescription() { + if (reloadMarketDescriptionsCalledTimes == 0) { + return marketDescription; + } else { + return marketDescriptionAfterReloading; + } + } + + private List getAvailableLanguages() { + if (reloadMarketDescriptionsCalledTimes == 0) { + return availableLanguages; + } else { + return availableLanguagesAfterReloading; + } + } + + @Override + public boolean reloadMarketDescription(int marketId, Map marketSpecifiers) { + reloadMarketDescriptionsCalledTimes++; + return true; + } + + public void verifyDescriptionWasReloaded() { + assertThat(reloadMarketDescriptionsCalledTimes).isGreaterThan(0); + } + + public void verifyDescriptionWasReloadedTimes(int times) { + assertThat(reloadMarketDescriptionsCalledTimes).isEqualTo(times); + } + + @AllArgsConstructor + public static class Builder { + + private final List availableLanguages; + + private final MarketDescription marketDescription; + + private List availableLanguagesAfterReloading; + + private MarketDescription marketDescriptionAfterReloading; + + public static Builder providing( + List availableLanguages, + MarketDescription marketDescription + ) { + return new Builder(availableLanguages, marketDescription, availableLanguages, marketDescription); + } + + public Builder andAfterReloading(List language, MarketDescription description) { + availableLanguagesAfterReloading = language; + marketDescriptionAfterReloading = description; + return this; + } + + public OneMarketInMultiLanguageProviderStub build() { + return new OneMarketInMultiLanguageProviderStub( + availableLanguages, + marketDescription, + availableLanguagesAfterReloading, + marketDescriptionAfterReloading + ); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/SingleMarketProviderStub.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/SingleMarketProviderStub.java new file mode 100644 index 00000000..1ffc2538 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/caching/markets/SingleMarketProviderStub.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.caching.markets; + +import com.sportradar.unifiedodds.sdk.entities.markets.MarketDescription; +import com.sportradar.unifiedodds.sdk.exceptions.internal.CacheItemNotFoundException; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class SingleMarketProviderStub implements MarketDescriptionProvider { + + private final MarketDescription marketDescription; + + @Override + public MarketDescription getMarketDescription( + int marketId, + Map marketSpecifiers, + List locales, + boolean fetchVariantDescriptions + ) throws CacheItemNotFoundException { + return marketDescription; + } + + @Override + public boolean reloadMarketDescription(int marketId, Map marketSpecifiers) { + return false; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ApiSimulator.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ApiSimulator.java new file mode 100644 index 00000000..dbf675a3 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ApiSimulator.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static com.sportradar.unifiedodds.sdk.conn.ProducerId.LIVE_ODDS; +import static com.sportradar.unifiedodds.sdk.conn.SapiProducers.buildActiveProducer; + +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import com.sportradar.uf.sportsapi.datamodel.DescMarket; +import com.sportradar.uf.sportsapi.datamodel.MarketDescriptions; +import com.sportradar.uf.sportsapi.datamodel.Producers; +import com.sportradar.uf.sportsapi.datamodel.ResponseCode; +import lombok.val; + +public class ApiSimulator { + + public static final String XML_DECLARATION = + "\n"; + private final WireMockRule wireMockRule; + + public ApiSimulator(WireMockRule wireMockRule) { + this.wireMockRule = wireMockRule; + } + + public void activateOnlyLiveProducer() { + Producers producers = new Producers(); + producers.setResponseCode(ResponseCode.OK); + producers.getProducer().add(buildActiveProducer(LIVE_ODDS)); + + wireMockRule.stubFor( + get(urlPathEqualTo("/v1/descriptions/producers.xml")) + .willReturn(WireMock.ok(JaxbContexts.SportsApi.marshall(producers))) + ); + } + + public void defineBookmaker() { + wireMockRule.stubFor( + get(urlPathEqualTo("/v1/users/whoami.xml")) + .willReturn( + WireMock.ok( + XML_DECLARATION + + "" + ) + ) + ); + } + + public void stubEmptyMarketList() { + stub(new MarketDescriptions()); + } + + public void stubMarketListContaining(DescMarket market) { + val descriptions = new MarketDescriptions(); + descriptions.getMarket().add(market); + stub(descriptions); + } + + private void stub(MarketDescriptions descriptions) { + wireMockRule.stubFor( + get(urlPathMatching("/v1/descriptions/en/markets.xml.*")) + .willReturn(WireMock.ok(JaxbContexts.SportsApi.marshall(descriptions))) + ); + } + + public void noMarketVariants() { + wireMockRule.stubFor( + get(urlPathEqualTo("/v1/descriptions/en/variants.xml")) + .willReturn( + WireMock.ok( + XML_DECLARATION + + " " + + "" + ) + ) + ); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/DecimalOdds.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/DecimalOdds.java new file mode 100644 index 00000000..d20da7da --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/DecimalOdds.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.utils.generic.testing.RandomInteger; + +public final class DecimalOdds { + + private static final int HUNDRED_PERCENT = 100; + + private static final int MINIMUM_PROBABILITY_PERCENTAGE = 1; + private static final int MAXIMUM_PROBABILITY_PERCENTAGE = 99; + + private DecimalOdds() {} + + public static double any() { + double decimalOdds = + HUNDRED_PERCENT / + (double) RandomInteger.fromRangeInclusive( + MINIMUM_PROBABILITY_PERCENTAGE, + MAXIMUM_PROBABILITY_PERCENTAGE + ); + return decimalOdds; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/FaultyRabbitConnectionIT.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/FaultyRabbitConnectionIT.java new file mode 100644 index 00000000..134a0103 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/FaultyRabbitConnectionIT.java @@ -0,0 +1,235 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static com.sportradar.unifiedodds.sdk.conn.PeriodicAliveSender.periodicAliveSender; +import static com.sportradar.unifiedodds.sdk.impl.Constants.*; +import static com.sportradar.unifiedodds.sdk.integrationtest.preconditions.PreconditionsForProxiedRabbitIntegrationTests.shouldMavenRunToxiproxyIntegrationTests; +import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.Credentials.with; +import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqClientFactory.createRabbitMqClient; +import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqProducer.connectDeclaringExchange; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assume.assumeThat; + +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import com.rabbitmq.client.ConnectionFactory; +import com.rabbitmq.http.client.Client; +import com.sportradar.unifiedodds.sdk.MessageInterest; +import com.sportradar.unifiedodds.sdk.exceptions.InitException; +import com.sportradar.unifiedodds.sdk.impl.Constants; +import com.sportradar.unifiedodds.sdk.impl.TimeUtilsImpl; +import com.sportradar.unifiedodds.sdk.integrationtest.externalrabbit.ProxiedRabbit; +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.VoidCallables; +import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.*; +import java.io.IOException; +import java.util.Locale; +import java.util.concurrent.TimeoutException; +import lombok.val; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +@SuppressWarnings( + { + "ClassDataAbstractionCoupling", + "ClassFanOutComplexity", + "CyclomaticComplexity", + "ExecutableStatementCount", + "HiddenField", + "IllegalCatch", + "JavaNCSS", + "LineLength", + "MagicNumber", + "MethodLength", + "MultipleStringLiterals", + "OverloadMethodsDeclarationOrder", + "ParameterAssignment", + } +) +public class FaultyRabbitConnectionIT { + + private static final int MILLIS_IN_SECOND = 1000; + + @Rule + public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort()); + + private Credentials sdkCredentials = Credentials.with(Constants.SDK_USERNAME, Constants.SDK_PASSWORD); + private VhostLocation vhostLocation = VhostLocation.at(RABBIT_BASE_URL, Constants.UF_VIRTUALHOST); + private ExchangeLocation exchangeLocation = ExchangeLocation.at(vhostLocation, Constants.UF_EXCHANGE); + private Credentials adminCredentials = Credentials.with( + Constants.ADMIN_USERNAME, + Constants.ADMIN_PASSWORD + ); + private ConnectionFactory factory = new ConnectionFactory(); + private RawMessagesInMemoryStorage rawMessagesStorage = new RawMessagesInMemoryStorage(); + private MessagesAssertions messagesAssertions = new MessagesAssertions(rawMessagesStorage); + private ProxiedRabbit proxy; + private final Client rabbitMqClient = createRabbitMqClient( + RABBIT_IP, + with(ADMIN_USERNAME, ADMIN_PASSWORD), + Client::new + ); + private RabbitMqUserSetup rabbitMqUserSetup = RabbitMqUserSetup.create( + VhostLocation.at(RABBIT_BASE_URL, UF_VIRTUALHOST), + rabbitMqClient + ); + + private BaseUrl sportsApiBaseUrl; + + public FaultyRabbitConnectionIT() throws Exception {} + + @Before + public void setup() throws Exception { + if (shouldMavenRunToxiproxyIntegrationTests()) { + proxy = ProxiedRabbit.proxyRabbit(); + } + rabbitMqUserSetup.setupUser(sdkCredentials); + sportsApiBaseUrl = BaseUrl.of("localhost", wireMockRule.port()); + } + + @After + public void tearDownProxy() throws Exception { + if (shouldMavenRunToxiproxyIntegrationTests()) { + proxy.close(); + } + rabbitMqUserSetup.revertChangesMade(); + } + + @Test + public void messagesAreNotDuplicatedAfterNetworkOutage() + throws InitException, IOException, TimeoutException, InterruptedException { + assumeThat("see developerREADME", shouldMavenRunToxiproxyIntegrationTests(), equalTo(true)); + wireMockRule.stubFor(get(anyUrl()).willReturn(WireMock.ok())); + stubBookmaker(); + enableOnlyLiveProducer(); + final int nodeId = 1; + + try ( + val rabbitProducer = connectDeclaringExchange( + exchangeLocation, + adminCredentials, + factory, + new TimeUtilsImpl() + ); + val sdk = SdkSetup + .with(sdkCredentials, PROXIED_RABBIT_BASE_URL, sportsApiBaseUrl, nodeId) + .with(ListenerCollectingRawMessages.to(rawMessagesStorage)) + .with1Session() + .withDefaultLanguage(Locale.ENGLISH) + .withOpenedFeed(); + val periodicAlives = periodicAliveSender(rabbitProducer); + ) { + periodicAlives.startSendingToLiveProducer(); + assertThatSdkReceivesSystemAlivesForLiveProducer(); + + goThroughOver3minuteNetworkOutage(); + + waitEnoughTimeForSdkToRecoverConnectionAndChannels(); + assertThatSdkNotDuplicatesMessages(); + } + } + + private void waitEnoughTimeForSdkToRecoverConnectionAndChannels() { + sleepSeconds(30); + } + + private void assertThatSdkReceivesSystemAlivesForLiveProducer() throws IOException { + final int countBefore = rawMessagesStorage.findAlivesOf(MessageInterest.SystemAliveMessages).size(); + waitUntil(() -> { + final int countAfter = rawMessagesStorage + .findAlivesOf(MessageInterest.SystemAliveMessages) + .size(); + assertThat(countAfter).isGreaterThan(countBefore); + }); + } + + private void enableOnlyLiveProducer() { + wireMockRule.stubFor( + get(urlPathEqualTo("/v1/descriptions/producers.xml")) + .willReturn( + WireMock.ok( + "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "" + ) + ) + ); + } + + private void assertThatSdkNotDuplicatesMessages() throws InterruptedException { + letSdkToReceiveInflightMessages(); + messagesAssertions.assertThatSystemAlivesHaveNotDuplicates(); + } + + private static void letSdkToReceiveInflightMessages() throws InterruptedException { + Thread.sleep(5); + } + + private void waitUntil(VoidCallables.ThrowingRunnable condition) { + int gapsBetweenRecheckingInSeconds = 1; + int timeLapsedInSeconds = 0; + int timeEnoughForSdkToReestablishConnectionInMillis = 20000; + while (timeLapsedInSeconds <= timeEnoughForSdkToReestablishConnectionInMillis) { + try { + condition.run(); + return; + } catch (AssertionError e) { + //keep checking + } catch (Exception e) { + throw new RuntimeException(e); + } + sleepSeconds(gapsBetweenRecheckingInSeconds); + timeLapsedInSeconds += gapsBetweenRecheckingInSeconds; + } + throw new AssertionError( + "Condition is not fulfilled during time SDK is expected to re-establish connection" + ); + } + + private void sleepSeconds(int amount) { + try { + Thread.sleep(amount * MILLIS_IN_SECOND); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + private void goThroughOver3minuteNetworkOutage() throws IOException { + proxy.disable(); + sleepSeconds(3 * 60 + 30); + proxy.enable(); + } + + private void stubBookmaker() { + wireMockRule.stubFor( + get(urlPathEqualTo("/v1/users/whoami.xml")) + .willReturn( + WireMock.ok( + "\n" + + "" + ) + ) + ); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/GlobalVariables.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/GlobalVariables.java new file mode 100644 index 00000000..b00123e2 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/GlobalVariables.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import java.util.Optional; + +public class GlobalVariables { + + private Optional producer = Optional.empty(); + private Optional sportEvent = Optional.empty(); + + public ProducerId getProducer() { + return producer.get(); + } + + public void setProducer(ProducerId producerId) { + this.producer = Optional.of(producerId); + } + + public SportEvent getSportEvent() { + return sportEvent.get(); + } + + public void setSportEvent(SportEvent sportEvent) { + this.sportEvent = Optional.of(sportEvent); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/JaxbContexts.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/JaxbContexts.java new file mode 100644 index 00000000..e401b4c1 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/JaxbContexts.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import java.io.StringWriter; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +public final class JaxbContexts { + + private JaxbContexts() {} + + public static class SportsApi { + + private static final JAXBContext SPORTS_API_JAXB_CONTEXT; + + static { + try { + SPORTS_API_JAXB_CONTEXT = JAXBContext.newInstance("com.sportradar.uf.sportsapi.datamodel"); + } catch (JAXBException e) { + throw new IllegalStateException("JAXB contexts creation failed, ex: ", e); + } + } + + public static String marshall(Object unmarshalled) { + StringWriter writer = new StringWriter(); + try { + SPORTS_API_JAXB_CONTEXT.createMarshaller().marshal(unmarshalled, writer); + return writer.toString(); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingMessages.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingMessages.java new file mode 100644 index 00000000..4cfbda7e --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingMessages.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.unifiedodds.sdk.MessageInterest; +import com.sportradar.unifiedodds.sdk.UofListener; +import com.sportradar.unifiedodds.sdk.UofSession; +import com.sportradar.unifiedodds.sdk.entities.SportEvent; +import com.sportradar.unifiedodds.sdk.extended.UofExtListener; +import com.sportradar.unifiedodds.sdk.impl.RoutingKeyInfo; +import com.sportradar.unifiedodds.sdk.oddsentities.*; +import java.net.URI; +import lombok.AllArgsConstructor; + +@AllArgsConstructor(access = lombok.AccessLevel.PRIVATE) +public class ListenerCollectingMessages implements UofListener { + + private final MessagesInMemoryStorage messageStorage; + + public static ListenerCollectingMessages to(MessagesInMemoryStorage messageStorage) { + return new ListenerCollectingMessages(messageStorage); + } + + @Override + public void onOddsChange(UofSession sender, OddsChange oddsChanges) { + messageStorage.append(oddsChanges); + } + + @Override + public void onBetStop(UofSession sender, BetStop betStop) { + messageStorage.append(betStop); + } + + @Override + public void onBetSettlement(UofSession sender, BetSettlement clearBets) { + messageStorage.append(clearBets); + } + + @Override + public void onRollbackBetSettlement( + UofSession sender, + RollbackBetSettlement rollbackBetSettlement + ) { + messageStorage.append(rollbackBetSettlement); + } + + @Override + public void onBetCancel(UofSession sender, BetCancel betCancel) { + messageStorage.append(betCancel); + } + + @Override + public void onRollbackBetCancel(UofSession sender, RollbackBetCancel rbBetCancel) { + messageStorage.append(rbBetCancel); + } + + @Override + public void onFixtureChange(UofSession sender, FixtureChange fixtureChange) { + messageStorage.append(fixtureChange); + } + + @Override + public void onUnparsableMessage(UofSession sender, UnparsableMessage unparsableMessage) {} + + @Override + public void onUserUnhandledException(UofSession sender, Exception exception) {} +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingRawMessages.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingRawMessages.java new file mode 100644 index 00000000..be959100 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ListenerCollectingRawMessages.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.unifiedodds.sdk.MessageInterest; +import com.sportradar.unifiedodds.sdk.extended.UofExtListener; +import com.sportradar.unifiedodds.sdk.impl.RoutingKeyInfo; +import com.sportradar.unifiedodds.sdk.oddsentities.MessageTimestamp; +import com.sportradar.unifiedodds.sdk.oddsentities.UnmarshalledMessage; +import java.net.URI; +import lombok.AllArgsConstructor; + +@AllArgsConstructor(access = lombok.AccessLevel.PRIVATE) +public class ListenerCollectingRawMessages implements UofExtListener { + + private final RawMessagesInMemoryStorage messageStorage; + + public static ListenerCollectingRawMessages to(RawMessagesInMemoryStorage messageStorage) { + return new ListenerCollectingRawMessages(messageStorage); + } + + @Override + public void onRawFeedMessageReceived( + RoutingKeyInfo routingKey, + UnmarshalledMessage feedMessage, + MessageTimestamp timestamp, + MessageInterest messageInterest + ) { + messageStorage.append(new ReceivedRawMessage<>(routingKey, feedMessage, timestamp, messageInterest)); + } + + @Override + public void onRawApiDataReceived(URI uri, Object apiData) {} +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MarketWithFaultyDescriptionIT.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MarketWithFaultyDescriptionIT.java new file mode 100644 index 00000000..84b091a8 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MarketWithFaultyDescriptionIT.java @@ -0,0 +1,267 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.evenOutcomeOf; +import static com.sportradar.unifiedodds.sdk.conn.SapiMarketDescriptions.oddEvenDescription; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.WithOdds.oddEven; +import static com.sportradar.unifiedodds.sdk.impl.Constants.*; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_CATCH_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.OutcomeAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.Credentials.with; +import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqClientFactory.createRabbitMqClient; +import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqProducer.connectDeclaringExchange; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import com.rabbitmq.client.ConnectionFactory; +import com.rabbitmq.http.client.Client; +import com.sportradar.uf.sportsapi.datamodel.DescMarket; +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.exceptions.InitException; +import com.sportradar.unifiedodds.sdk.exceptions.NameGenerationException; +import com.sportradar.unifiedodds.sdk.impl.Constants; +import com.sportradar.unifiedodds.sdk.impl.TimeUtilsImpl; +import com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy; +import com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketAssert; +import com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.OutcomeAssert; +import com.sportradar.unifiedodds.sdk.oddsentities.MarketWithOdds; +import com.sportradar.unifiedodds.sdk.oddsentities.OddsChange; +import com.sportradar.unifiedodds.sdk.shared.FeedMessageBuilder; +import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.*; +import java.io.IOException; +import java.util.Locale; +import java.util.concurrent.TimeoutException; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import lombok.val; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(JUnitParamsRunner.class) +@SuppressWarnings( + { + "ClassDataAbstractionCoupling", + "ClassFanOutComplexity", + "CyclomaticComplexity", + "ExecutableStatementCount", + "HiddenField", + "IllegalCatch", + "JavaNCSS", + "LineLength", + "MagicNumber", + "MethodLength", + "MultipleStringLiterals", + "OverloadMethodsDeclarationOrder", + "ParameterAssignment", + } +) +public class MarketWithFaultyDescriptionIT { + + @Rule + public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort()); + + private GlobalVariables globalVariables = new GlobalVariables(); + private ApiSimulator apiSimulator = new ApiSimulator(wireMockRule); + + private Credentials sdkCredentials = Credentials.with(Constants.SDK_USERNAME, Constants.SDK_PASSWORD); + private VhostLocation vhostLocation = VhostLocation.at(RABBIT_BASE_URL, Constants.UF_VIRTUALHOST); + private ExchangeLocation exchangeLocation = ExchangeLocation.at(vhostLocation, Constants.UF_EXCHANGE); + private Credentials adminCredentials = Credentials.with( + Constants.ADMIN_USERNAME, + Constants.ADMIN_PASSWORD + ); + private ConnectionFactory factory = new ConnectionFactory(); + private MessagesInMemoryStorage messagesStorage = new MessagesInMemoryStorage(); + + private WaiterForSingleMessage listinerWaitingFor = new WaiterForSingleMessage(messagesStorage); + private final Client rabbitMqClient = createRabbitMqClient( + RABBIT_IP, + with(ADMIN_USERNAME, ADMIN_PASSWORD), + Client::new + ); + private RabbitMqUserSetup rabbitMqUserSetup = RabbitMqUserSetup.create( + VhostLocation.at(RABBIT_BASE_URL, UF_VIRTUALHOST), + rabbitMqClient + ); + + private BaseUrl sportsApiBaseUrl; + + public MarketWithFaultyDescriptionIT() throws Exception {} + + @Before + public void setup() throws Exception { + rabbitMqUserSetup.setupUser(sdkCredentials); + sportsApiBaseUrl = BaseUrl.of("localhost", wireMockRule.port()); + } + + @After + public void tearDownProxy() throws Exception { + rabbitMqUserSetup.revertChangesMade(); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsWhenMarketDescriptionIsMissing( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) throws IOException, TimeoutException, InitException { + globalVariables.setProducer(ProducerId.LIVE_ODDS); + FeedMessageBuilder messages = new FeedMessageBuilder(ProducerId.LIVE_ODDS, SportEvent.MATCH); + final int nodeId = 1; + Locale aLanguage = Locale.ENGLISH; + RoutingKeys routingKeys = new RoutingKeys( + ProducerId.LIVE_ODDS, + Sport.FOOTBALL, + SportEvent.MATCH, + nodeId + ); + + apiSimulator.defineBookmaker(); + apiSimulator.activateOnlyLiveProducer(); + apiSimulator.stubEmptyMarketList(); + + try ( + val rabbitProducer = connectDeclaringExchange( + exchangeLocation, + adminCredentials, + factory, + new TimeUtilsImpl() + ); + val sdk = SdkSetup + .with(sdkCredentials, RABBIT_BASE_URL, sportsApiBaseUrl, nodeId) + .with(ListenerCollectingMessages.to(messagesStorage)) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .with1Session() + .withOpenedFeed() + ) { + rabbitProducer.send(messages.oddsChange(oddEven()), routingKeys.liveOddsChange()); + + val market = theOnlyMarketIn(listinerWaitingFor.theOnlyOddsChange()); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsWhenMarketDescriptionIsMissing( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) throws IOException, TimeoutException, InitException { + globalVariables.setProducer(ProducerId.LIVE_ODDS); + FeedMessageBuilder messages = new FeedMessageBuilder(ProducerId.LIVE_ODDS, SportEvent.MATCH); + final int nodeId = 1; + Locale aLanguage = Locale.ENGLISH; + RoutingKeys routingKeys = new RoutingKeys( + ProducerId.LIVE_ODDS, + Sport.FOOTBALL, + SportEvent.MATCH, + nodeId + ); + + apiSimulator.defineBookmaker(); + apiSimulator.activateOnlyLiveProducer(); + apiSimulator.stubEmptyMarketList(); + + try ( + val rabbitProducer = connectDeclaringExchange( + exchangeLocation, + adminCredentials, + factory, + new TimeUtilsImpl() + ); + val sdk = SdkSetup + .with(sdkCredentials, RABBIT_BASE_URL, sportsApiBaseUrl, nodeId) + .with(ListenerCollectingMessages.to(messagesStorage)) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .with1Session() + .withOpenedFeed() + ) { + rabbitProducer.send(messages.oddsChange(oddEven()), routingKeys.liveOddsChange()); + + val oddsChange = listinerWaitingFor.theOnlyOddsChange(); + val outcome = evenOutcomeOf(theOnlyMarketIn(oddsChange)); + + assertThat(outcome) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsWhenOutcomeDescriptionIsMissing( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) throws IOException, TimeoutException, InitException { + globalVariables.setProducer(ProducerId.LIVE_ODDS); + FeedMessageBuilder messages = new FeedMessageBuilder(ProducerId.LIVE_ODDS, SportEvent.MATCH); + final int nodeId = 1; + Locale aLanguage = Locale.ENGLISH; + RoutingKeys routingKeys = new RoutingKeys( + ProducerId.LIVE_ODDS, + Sport.FOOTBALL, + SportEvent.MATCH, + nodeId + ); + + apiSimulator.defineBookmaker(); + apiSimulator.activateOnlyLiveProducer(); + apiSimulator.stubMarketListContaining(oddEvenDescriptionMissingEvenOutcome()); + + try ( + val rabbitProducer = connectDeclaringExchange( + exchangeLocation, + adminCredentials, + factory, + new TimeUtilsImpl() + ); + val sdk = SdkSetup + .with(sdkCredentials, RABBIT_BASE_URL, sportsApiBaseUrl, nodeId) + .with(ListenerCollectingMessages.to(messagesStorage)) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .with1Session() + .withOpenedFeed() + ) { + rabbitProducer.send(messages.oddsChange(oddEven()), routingKeys.liveOddsChange()); + + val oddsChange = listinerWaitingFor.theOnlyOddsChange(); + val outcome = evenOutcomeOf(theOnlyMarketIn(oddsChange)); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + + private MarketWithOdds theOnlyMarketIn( + OddsChange oddsChange + ) { + assertThat(oddsChange.getMarkets().size()).isEqualTo(1); + return oddsChange.getMarkets().get(0); + } + + private static DescMarket oddEvenDescriptionMissingEvenOutcome() { + DescMarket incompleteOddEvenDescription = oddEvenDescription(); + incompleteOddEvenDescription.getOutcomes().getOutcome().remove(1); + return incompleteOddEvenDescription; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesAssertions.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesAssertions.java new file mode 100644 index 00000000..0a099531 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesAssertions.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.sportradar.uf.datamodel.UfAlive; +import com.sportradar.unifiedodds.sdk.MessageInterest; +import java.util.List; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class MessagesAssertions { + + private RawMessagesQuerier querier; + + public void assertThatSystemAlivesHaveNotDuplicates() { + List> systemAlives = querier.findAlivesOf( + MessageInterest.SystemAliveMessages + ); + + assertThatAllHasDifferentTimestamps(systemAlives); + } + + private static void assertThatAllHasDifferentTimestamps(List> systemAlives) { + final int amountOfMessages = systemAlives.size(); + if (systemAlives.size() >= 2) { + long uniqueDeliveries = systemAlives + .stream() + .map(m1 -> m1.getFeedMessage().getTimestamp()) + .distinct() + .count(); + assertThat(uniqueDeliveries).isEqualTo(amountOfMessages); + } else { + throw new RuntimeException("not enough message to decide whether there are duplicates"); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesInMemoryStorage.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesInMemoryStorage.java new file mode 100644 index 00000000..47e3df7c --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/MessagesInMemoryStorage.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.unifiedodds.sdk.entities.SportEvent; +import com.sportradar.unifiedodds.sdk.oddsentities.*; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.stream.Collectors; + +public class MessagesInMemoryStorage { + + private final Queue> oddsChangeMessages = new LinkedBlockingDeque<>(); + private final Queue> betStopMessages = new LinkedBlockingDeque<>(); + private final Queue> betSettlementMessages = new LinkedBlockingDeque<>(); + private final Queue> rollbackBetSettlementMessages = new LinkedBlockingDeque<>(); + private final Queue> betCancelMessages = new LinkedBlockingDeque<>(); + private final Queue> rollbackBetCancelMessages = new LinkedBlockingDeque<>(); + private final Queue> fixtureChangeMessages = new LinkedBlockingDeque<>(); + + public void append(OddsChange oddsChange) { + oddsChangeMessages.add(oddsChange); + } + + public void append(BetStop betStop) { + betStopMessages.add(betStop); + } + + public void append(BetSettlement message) { + betSettlementMessages.add(message); + } + + public void append(RollbackBetSettlement message) { + rollbackBetSettlementMessages.add(message); + } + + public void append(BetCancel message) { + betCancelMessages.add(message); + } + + public void append(RollbackBetCancel message) { + rollbackBetCancelMessages.add(message); + } + + public void append(FixtureChange message) { + fixtureChangeMessages.add(message); + } + + public List> findAllOddsChange() { + return oddsChangeMessages.stream().collect(Collectors.toList()); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/NoOpUofGlobalEventsListener.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/NoOpUofGlobalEventsListener.java new file mode 100644 index 00000000..4a6656e9 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/NoOpUofGlobalEventsListener.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.unifiedodds.sdk.UofGlobalEventsListener; +import com.sportradar.unifiedodds.sdk.oddsentities.ProducerStatus; +import com.sportradar.unifiedodds.sdk.oddsentities.RecoveryInitiated; +import com.sportradar.utils.Urn; + +public class NoOpUofGlobalEventsListener implements UofGlobalEventsListener { + + @Override + public void onConnectionDown() {} + + @Override + public void onConnectionException(Throwable throwable) {} + + @Override + public void onEventRecoveryCompleted(Urn eventId, long requestId) {} + + @Override + public void onProducerStatusChange(ProducerStatus producerStatus) {} + + @Override + public void onRecoveryInitiated(RecoveryInitiated recoveryInitiated) {} +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/OddEvenMarket.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/OddEvenMarket.java new file mode 100644 index 00000000..356b086c --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/OddEvenMarket.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.unifiedodds.sdk.oddsentities.MarketWithOdds; +import com.sportradar.unifiedodds.sdk.oddsentities.MarketWithProbabilities; +import com.sportradar.unifiedodds.sdk.oddsentities.OutcomeOdds; +import com.sportradar.unifiedodds.sdk.oddsentities.OutcomeProbabilities; + +public final class OddEvenMarket { + + public static final int ID = 26; + + public static final String ODD_OUTCOME_ID = "70"; + + public static final String EVEN_OUTCOME_ID = "72"; + + private OddEvenMarket() {} + + public static OutcomeOdds evenOutcomeOf(MarketWithOdds market) { + return market.getOutcomeOdds().stream().filter(OddEvenMarket::isEven).findFirst().get(); + } + + public static OutcomeProbabilities evenOutcomeOf(MarketWithProbabilities market) { + return market.getOutcomeProbabilities().stream().filter(OddEvenMarket::isEven).findFirst().get(); + } + + public static boolean isEven(OutcomeOdds outcome) { + return outcome.getId().equals(EVEN_OUTCOME_ID); + } + + public static boolean isEven(OutcomeProbabilities outcome) { + return outcome.getId().equals(EVEN_OUTCOME_ID); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/PeriodicAliveSender.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/PeriodicAliveSender.java new file mode 100644 index 00000000..93ccb210 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/PeriodicAliveSender.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqProducer; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class PeriodicAliveSender implements AutoCloseable { + + private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + private ScheduledFuture alivesStarted; + private final RabbitMqProducer rabbitProducer; + + public PeriodicAliveSender(RabbitMqProducer rabbitProducer) { + this.rabbitProducer = rabbitProducer; + } + + public static PeriodicAliveSender periodicAliveSender(RabbitMqProducer rabbitProducer) { + return new PeriodicAliveSender(rabbitProducer); + } + + private static String aliveForProducer1() { + return ""; + } + + @Override + public void close() { + if (alivesStarted != null) { + alivesStarted.cancel(true); + } + executor.shutdown(); + } + + public void startSendingToLiveProducer() { + final int frequentAlivesToSpeedUpTests = 3; + alivesStarted = + executor.scheduleAtFixedRate( + () -> rabbitProducer.send(aliveForProducer1(), "-.-.-.alive.-.-.-.-"), + frequentAlivesToSpeedUpTests, + frequentAlivesToSpeedUpTests, + TimeUnit.SECONDS + ); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ProducerId.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ProducerId.java new file mode 100644 index 00000000..af4c3304 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ProducerId.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +public enum ProducerId { + LIVE_ODDS(1), + BETRADAR_CTRL(3), + BETPAL(4), + PREMIUM_CRICKET(5), + VIRTUAL_FOOTBALL(6), + NUMBERS_BETTING(7), + VIRTUAL_BASKETBALL(8), + VIRTUAL_TENNIS_OPEN(9), + VIRTUAL_DOG_RACING(10), + VIRTUAL_HORSE_RACING(11), + VIRTUAL_TENNIS_IN_PLAY(12), + COMPETITION_ODDS(14), + VIRTUAL_BASEBALL(15), + PERFORMANCE_BETTING(16), + VIRTUAL_CRICKET(17); + + private final int numericValue; + + private ProducerId(int numericValue) { + this.numericValue = numericValue; + } + + public int get() { + return numericValue; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RabbitProducer.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RabbitProducer.java index 4c21004a..ebd351aa 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RabbitProducer.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RabbitProducer.java @@ -1,5 +1,6 @@ package com.sportradar.unifiedodds.sdk.conn; +import static com.sportradar.unifiedodds.sdk.impl.Constants.RABBIT_BASE_URL; import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqProducer.connectDeclaringExchange; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -72,7 +73,9 @@ public RabbitProducer(TestProducersProvider producersProvider, final RabbitMqUse testProducersProvider = producersProvider; Messages = Collections.synchronizedList(new ArrayList()); ProducersAlive = new HashMap<>(); - feedMessageBuilder = new FeedMessageBuilder(1); + GlobalVariables variables = new GlobalVariables(); + variables.setProducer(ProducerId.LIVE_ODDS); + feedMessageBuilder = new FeedMessageBuilder(ProducerId.LIVE_ODDS, SportEvent.ANY); isRunning = false; try { @@ -95,7 +98,7 @@ public void start() { ManagementClient.closeConnection(connectionInfo.getName(), "cleanup"); } - val vhostLocation = VhostLocation.at(Constants.RABBIT_IP, Constants.UF_VIRTUALHOST); + val vhostLocation = VhostLocation.at(RABBIT_BASE_URL, Constants.UF_VIRTUALHOST); val exchangeLocation = ExchangeLocation.at(vhostLocation, Constants.UF_EXCHANGE); val adminCredentials = Credentials.with(Constants.ADMIN_USERNAME, Constants.ADMIN_PASSWORD); val factory = new ConnectionFactory(); @@ -156,11 +159,7 @@ public void send(UnmarshalledMessage message, String routingKey, long timestamp) } when(time.now()).thenReturn(timestamp); - try { - producer.send(msgBody, routingKey); - } catch (IOException e) { - throw new RuntimeException(e); - } + producer.send(msgBody, routingKey); String result = String.format( "Generated:%s, Routing: %s, Msg: %s", new Date(timestamp), @@ -227,14 +226,18 @@ private void timerCheckAndSend() { private void sendPeriodicAliveForProducer(int producerId, int periodInMs) { try { Thread.sleep(periodInMs == 0 ? 5000 : periodInMs); - while (ProducersAlive.containsKey(producerId)) { - UfAlive msgAlive = feedMessageBuilder.buildAlive(producerId, new Date(), true); - send(msgAlive, "-.-.-.alive.-.-.-.-", msgAlive.getTimestamp()); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + while (ProducersAlive.containsKey(producerId)) { + try { int sleep = periodInMs > 0 ? periodInMs : new Random().nextInt(10000); Thread.sleep(sleep); + UfAlive msgAlive = feedMessageBuilder.buildAlive(producerId, new Date(), true); + send(msgAlive, "-.-.-.alive.-.-.-.-", msgAlive.getTimestamp()); + } catch (Exception ex) { + Helper.writeToOutput("Error: " + ex.getMessage()); } - } catch (Exception ex) { - Helper.writeToOutput("Error: " + ex.getMessage()); } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesInMemoryStorage.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesInMemoryStorage.java new file mode 100644 index 00000000..f18d4548 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesInMemoryStorage.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.uf.datamodel.UfAlive; +import com.sportradar.unifiedodds.sdk.MessageInterest; +import com.sportradar.unifiedodds.sdk.oddsentities.UnmarshalledMessage; +import com.sportradar.unifiedodds.sdk.shared.Helper; +import java.util.List; +import java.util.Objects; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.stream.Collectors; + +public class RawMessagesInMemoryStorage implements RawMessagesQuerier { + + private final Queue> feedMessages = new LinkedBlockingDeque<>(); + + public void append(ReceivedRawMessage feedMessage) { + Helper.writeToOutput("Received: " + feedMessage.getFeedMessage()); + feedMessages.add(feedMessage); + } + + @Override + public List> findAlivesOf(MessageInterest interest) { + return feedMessages + .stream() + .filter(m -> Objects.equals(m.getMessageInterest(), interest)) + .filter(m -> m.getFeedMessage() instanceof UfAlive) + .map(m -> m.withMessageAs(UfAlive.class)) + .collect(Collectors.toList()); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesQuerier.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesQuerier.java new file mode 100644 index 00000000..b7f9d6cf --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RawMessagesQuerier.java @@ -0,0 +1,12 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.uf.datamodel.UfAlive; +import com.sportradar.unifiedodds.sdk.MessageInterest; +import java.util.List; + +public interface RawMessagesQuerier { + public List> findAlivesOf(MessageInterest interest); +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ReceivedRawMessage.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ReceivedRawMessage.java new file mode 100644 index 00000000..71806581 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/ReceivedRawMessage.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.unifiedodds.sdk.MessageInterest; +import com.sportradar.unifiedodds.sdk.impl.RoutingKeyInfo; +import com.sportradar.unifiedodds.sdk.oddsentities.MessageTimestamp; +import com.sportradar.unifiedodds.sdk.oddsentities.UnmarshalledMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class ReceivedRawMessage { + + private final RoutingKeyInfo routingKeyInfo; + private final T feedMessage; + private final MessageTimestamp timestamp; + private final MessageInterest messageInterest; + + public ReceivedRawMessage withMessageAs(Class messageClass) { + return new ReceivedRawMessage<>(routingKeyInfo, (U) feedMessage, timestamp, messageInterest); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RoutingKeys.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RoutingKeys.java new file mode 100644 index 00000000..b8959986 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/RoutingKeys.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static java.lang.String.format; + +public class RoutingKeys { + + private final ProducerId producerId; + private final Sport sport; + private final SportEvent sportEvent; + private final int nodeId; + + public RoutingKeys(ProducerId producerId, Sport sport, SportEvent sportEvent, int nodeId) { + this.producerId = producerId; + this.sport = sport; + this.sportEvent = sportEvent; + this.nodeId = nodeId; + } + + public String liveOddsChange() { + return format( + "hi.-.live.odds_change.%d.sr:%s.%d.%s", + sport.getUrn().getId(), + sportEvent.getUrn().getType(), + sportEvent.getUrn().getId(), + nodeId + ); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiMarketDescriptions.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiMarketDescriptions.java new file mode 100644 index 00000000..784ad240 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiMarketDescriptions.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.EVEN_OUTCOME_ID; +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.ODD_OUTCOME_ID; +import static java.util.Arrays.stream; + +import com.sportradar.uf.sportsapi.datamodel.DescMarket; +import com.sportradar.uf.sportsapi.datamodel.DescOutcomes; +import java.util.Arrays; +import java.util.Locale; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +public final class SapiMarketDescriptions { + + private SapiMarketDescriptions() {} + + public static DescMarket oddEvenDescription() { + return oddEvenDescription(Locale.ENGLISH); + } + + public static DescMarket oddEvenDescription(Locale language) { + return oddEvenDescription(MarketTranslation.getFor(language)); + } + + public static DescMarket oddEvenDescription(MarketTranslation translation) { + DescMarket market = new DescMarket(); + market.setId(OddEvenMarket.ID); + market.setName(translation.marketName); + market.setOutcomes(new DescOutcomes()); + market.getOutcomes().getOutcome().add(oddOutcomeDescription()); + market.getOutcomes().getOutcome().add(evenOutcomeDescription()); + return market; + } + + public static DescOutcomes.Outcome oddOutcomeDescription() { + return oddOutcomeDescription(Locale.ENGLISH); + } + + public static DescOutcomes.Outcome oddOutcomeDescription(Locale language) { + return oddOutcomeDescription(MarketTranslation.getFor(language)); + } + + public static DescOutcomes.Outcome oddOutcomeDescription(MarketTranslation translation) { + DescOutcomes.Outcome evenOutcome = new DescOutcomes.Outcome(); + evenOutcome.setId(ODD_OUTCOME_ID); + evenOutcome.setName(translation.getOddOutcomeName()); + return evenOutcome; + } + + public static DescOutcomes.Outcome evenOutcomeDescription() { + return evenOutcomeDescription(Locale.ENGLISH); + } + + public static DescOutcomes.Outcome evenOutcomeDescription(Locale language) { + return evenOutcomeDescription(MarketTranslation.getFor(language)); + } + + public static DescOutcomes.Outcome evenOutcomeDescription(MarketTranslation translation) { + DescOutcomes.Outcome evenOutcome = new DescOutcomes.Outcome(); + evenOutcome.setId(EVEN_OUTCOME_ID); + evenOutcome.setName(translation.getEvenOutcomeName()); + return evenOutcome; + } + + @RequiredArgsConstructor + @Getter + private static enum MarketTranslation { + EN(Locale.ENGLISH, "Odd/Even", "Odd", "Even"), + FR(Locale.FRENCH, "Pair/Impair", "impair", "pair"); + + private final Locale language; + private final String marketName; + private final String oddOutcomeName; + private final String evenOutcomeName; + + public static MarketTranslation getFor(Locale language) { + return stream(MarketTranslation.values()) + .filter(translation -> translation.language.equals(language)) + .findFirst() + .orElseThrow(() -> new RuntimeException("Language not supported by test fixture")); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiProducers.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiProducers.java new file mode 100644 index 00000000..4bdbed90 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SapiProducers.java @@ -0,0 +1,238 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static com.sportradar.utils.generic.testing.Urls.anyHttpUrl; + +import com.sportradar.uf.sportsapi.datamodel.Producer; +import com.sportradar.utils.generic.testing.Booleans; +import com.sportradar.utils.generic.testing.RandomInteger; +import java.net.MalformedURLException; +import java.util.HashMap; +import java.util.Map; + +public final class SapiProducers { + + public static final String LIVE = "live"; + public static final String PREMATCH = "prematch"; + public static final String VIRTUAL = "virtual"; + + private SapiProducers() {} + + public static Producer buildActiveProducer(ProducerId id) { + Producer producer = createAllProducers().get(id); + producer.setActive(true); + return producer; + } + + private static Map createAllProducers() { + try { + Map producers = new HashMap<>(); + producers.put(ProducerId.LIVE_ODDS, createLiveOddsProducer()); + producers.put(ProducerId.BETRADAR_CTRL, createBetradarCtrlProducer()); + producers.put(ProducerId.BETPAL, createBetPalProducer()); + producers.put(ProducerId.PREMIUM_CRICKET, createPremiumCricketProducer()); + producers.put(ProducerId.VIRTUAL_FOOTBALL, createVirtualFootballProducer()); + producers.put(ProducerId.NUMBERS_BETTING, createNumbersBettingProducer()); + producers.put(ProducerId.VIRTUAL_BASKETBALL, createVirtualBasketballProducer()); + producers.put(ProducerId.VIRTUAL_TENNIS_OPEN, createVirtualTennisOpenProducer()); + producers.put(ProducerId.VIRTUAL_DOG_RACING, createVirtualDogRacingProducer()); + producers.put(ProducerId.VIRTUAL_HORSE_RACING, createVirtualHorseRacingProducer()); + producers.put(ProducerId.VIRTUAL_TENNIS_IN_PLAY, createVirtualTennisInPlayProducer()); + producers.put(ProducerId.COMPETITION_ODDS, createCompetitionOddsProducer()); + producers.put(ProducerId.VIRTUAL_BASEBALL, createVirtualBaseballProducer()); + producers.put(ProducerId.PERFORMANCE_BETTING, createPerformanceBettingProducer()); + producers.put(ProducerId.VIRTUAL_CRICKET, createVirtualCricketProducer()); + return producers; + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + private static Producer createLiveOddsProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.LIVE_ODDS.get()); + producer.setName("LO"); + producer.setDescription("Live Odds"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope("live"); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createBetradarCtrlProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.BETRADAR_CTRL.get()); + producer.setName("Ctrl"); + producer.setDescription("Betradar Ctrl"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope("prematch"); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createBetPalProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.BETPAL.get()); + producer.setName("BetPal"); + producer.setDescription("BetPal"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(LIVE); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createPremiumCricketProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.PREMIUM_CRICKET.get()); + producer.setName("PremiumCricket"); + producer.setDescription("Premium Cricket"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(LIVE + "|" + PREMATCH); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualFootballProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_FOOTBALL.get()); + producer.setName("VF"); + producer.setDescription("Virtual Football"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createNumbersBettingProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.NUMBERS_BETTING.get()); + producer.setName("WNS"); + producer.setDescription("Numbers Betting"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(PREMATCH); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualBasketballProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_BASKETBALL.get()); + producer.setName("VBL"); + producer.setDescription("Virtual Basketball League"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualTennisOpenProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_TENNIS_OPEN.get()); + producer.setName("VTO"); + producer.setDescription("Virtual Tennis Open"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualDogRacingProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_DOG_RACING.get()); + producer.setName("VDR"); + producer.setDescription("Virtual Dog Racing"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualHorseRacingProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_HORSE_RACING.get()); + producer.setName("VHC"); + producer.setDescription("Virtual Horse Racing"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualTennisInPlayProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_TENNIS_IN_PLAY.get()); + producer.setName("VTI"); + producer.setDescription("Virtual Tennis In Play"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createCompetitionOddsProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.COMPETITION_ODDS.get()); + producer.setName("C-Odds"); + producer.setDescription("Competition Odds"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(LIVE); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualBaseballProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_BASEBALL.get()); + producer.setName("VBI"); + producer.setDescription("Virtual Baseball In-Play"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createPerformanceBettingProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.PERFORMANCE_BETTING.get()); + producer.setName("PB"); + producer.setDescription("Performance Betting"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(LIVE); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static Producer createVirtualCricketProducer() throws MalformedURLException { + Producer producer = new Producer(); + producer.setId(ProducerId.VIRTUAL_CRICKET.get()); + producer.setName("VCI"); + producer.setDescription("Virtual Cricket In Play"); + producer.setApiUrl(anyHttpUrl().toString()); + producer.setActive(Booleans.any()); + producer.setScope(VIRTUAL); + producer.setStatefulRecoveryWindowInMinutes(anyRecoveryWindow()); + return producer; + } + + private static int anyRecoveryWindow() { + final int minOneHour = 60; + final int max5Days = 7200; + return RandomInteger.fromRangeInclusive(minOneHour, max5Days); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkConnectionIT.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkConnectionIT.java index 3ef82006..ec817760 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkConnectionIT.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkConnectionIT.java @@ -66,13 +66,14 @@ public class SdkConnectionIT { private UofConfiguration config; private UofConnListener sdkListener; private Scenario.Factory scenario; + private final Client rabbitMqClient = createRabbitMqClient( RABBIT_IP, with(ADMIN_USERNAME, ADMIN_PASSWORD), Client::new ); private RabbitMqUserSetup rabbitMqUserSetup = RabbitMqUserSetup.create( - VhostLocation.at(RABBIT_IP, UF_VIRTUALHOST), + VhostLocation.at(RABBIT_BASE_URL, UF_VIRTUALHOST), rabbitMqClient ); @@ -106,7 +107,10 @@ public void setup() throws Exception { sdkListener = new UofConnListener(); scenario = new Scenario.Factory(sdkListener); feed = new TestFeed(sdkListener, config, sdkListener); - feedMessageBuilder = new FeedMessageBuilder(1); + GlobalVariables variables = new GlobalVariables(); + + feedMessageBuilder = + new FeedMessageBuilder(ProducerId.LIVE_ODDS, com.sportradar.unifiedodds.sdk.conn.SportEvent.ANY); // establish connection to the test rabbit server for rabbit producer TestProducersProvider testProducersProvider = new TestProducersProvider(); @@ -163,7 +167,7 @@ public void cleanup() { } @Test - public void normalRunTest() throws InitException, IOException { + public void normalRunTest() throws InitException, IOException, InterruptedException { // setup for producer 1 // open feed and check that recovery was done // wait till snapshotComplete arrives and check if all good @@ -363,7 +367,7 @@ public void normalStartWithSetAfterTest() throws InitException { w -> checkProducerRecovery(producerId, false), "Producer recovery info is not null", 1000, - 10000 + 20000 ); producer = feed.getProducerManager().getProducer(producerId); @@ -493,7 +497,7 @@ public void multipleProducersWithAfterTest() throws InitException { w -> checkProducerRecovery(producerId1, false), "Producer 1 recovery info is not null", 1000, - 10000 + 20000 ); waitAndCheckTillTimeout( w -> checkProducerRecovery(producerId3, false), @@ -700,7 +704,7 @@ public void multipleProducersMultiSessionTest() throws InitException { w -> checkProducerRecovery(producerId1, false), "Producer 1 recovery info is not null", 1000, - 10000 + 20000 ); waitAndCheckTillTimeout( w -> checkProducerRecovery(producerId3, false), @@ -1539,7 +1543,7 @@ public void aliveSubscribedFalseTest() throws InitException { w -> checkProducerRecovery(producerId, false), "Producer recovery info is not null", 1000, - 10000 + 20000 ); producer = feed.getProducerManager().getProducer(producerId); diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkSetup.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkSetup.java new file mode 100644 index 00000000..9e40b7a8 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SdkSetup.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategies.anyErrorHandlingStrategy; +import static com.sportradar.unifiedodds.sdk.impl.Constants.UF_VIRTUALHOST; + +import com.sportradar.unifiedodds.sdk.*; +import com.sportradar.unifiedodds.sdk.cfg.UofConfiguration; +import com.sportradar.unifiedodds.sdk.exceptions.InitException; +import com.sportradar.unifiedodds.sdk.extended.UofExtListener; +import com.sportradar.unifiedodds.sdk.extended.UofSdkExt; +import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.BaseUrl; +import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.Credentials; +import com.sportradar.utils.domain.names.Languages; +import java.util.Locale; +import java.util.Optional; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public final class SdkSetup { + + private final Credentials sdkCredentials; + + private final BaseUrl rabbitBaseUrl; + + private final BaseUrl sportsApiBaseUrl; + + private final int nodeId; + private boolean configureSession; + + private Optional rawMessagesListener = Optional.empty(); + + private Optional messagesListener = Optional.empty(); + private Optional exceptionHandlingStrategy = Optional.empty(); + private Optional defaultLanguage = Optional.empty(); + + public static SdkSetup with( + Credentials sdkCredentials, + BaseUrl rabbitBaseUrl, + BaseUrl sportsApiBaseUrl, + int nodeId + ) { + return new SdkSetup(sdkCredentials, rabbitBaseUrl, sportsApiBaseUrl, nodeId); + } + + public SdkSetup with(ListenerCollectingRawMessages collectingRawMessagesListener) { + this.rawMessagesListener = Optional.of(collectingRawMessagesListener); + return this; + } + + public SdkSetup with(ExceptionHandlingStrategy strategy) { + this.exceptionHandlingStrategy = Optional.of(strategy); + return this; + } + + public SdkSetup with(ListenerCollectingMessages collectingMessagesListener) { + this.messagesListener = Optional.of(collectingMessagesListener); + return this; + } + + public SdkSetup with1Session() { + configureSession = true; + return this; + } + + public SdkSetup withDefaultLanguage(Locale language) { + defaultLanguage = Optional.of(language); + return this; + } + + public UofSdk withOpenedFeed() throws InitException { + UofConfiguration config = UofSdk + .getUofConfigurationBuilder() + .setAccessToken(sdkCredentials.getUsername()) + .selectCustom() + .setApiUseSsl(false) + .setMessagingUsername(sdkCredentials.getUsername()) + .setMessagingPassword(sdkCredentials.getPassword()) + .setMessagingHost(rabbitBaseUrl.getHost()) + .setMessagingPort(rabbitBaseUrl.getPort()) + .setMessagingUseSsl(false) + .setApiHost(sportsApiBaseUrl.get()) + .setDefaultLanguage(defaultLanguage.orElse(Languages.any())) + .setMessagingVirtualHost(UF_VIRTUALHOST) + .setExceptionHandlingStrategy(exceptionHandlingStrategy.orElse(anyErrorHandlingStrategy())) + .setNodeId(nodeId) + .build(); + + UofSdk sdk = createSdk(config); + + if (configureSession) { + configure1Session(sdk); + } + + sdk.open(); + return sdk; + } + + private UofSdk createSdk(UofConfiguration config) { + if (rawMessagesListener.isPresent()) { + return new UofSdkExt(new NoOpUofGlobalEventsListener(), config, rawMessagesListener.get()); + } else { + return new UofSdk(new NoOpUofGlobalEventsListener(), config); + } + } + + public void configure1Session(final UofSdk sdk) { + sdk + .getSessionBuilder() + .setListener(messagesListener.orElse(new NoOpUofListener())) + .setMessageInterest(MessageInterest.AllMessages) + .build(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SimpleMessageListener.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SimpleMessageListener.java index b0803300..c6a8cc86 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SimpleMessageListener.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SimpleMessageListener.java @@ -251,7 +251,7 @@ public void onRollbackBetSettlement( */ @Override public void onUnparsableMessage(UofSession sender, UnparsableMessage unparsableMessage) { - Producer possibleProducer = unparsableMessage.getProducer(); // the SDK will try to provide the origin of the message + com.sportradar.unifiedodds.sdk.oddsentities.Producer possibleProducer = unparsableMessage.getProducer(); // the SDK will try to provide the origin of the message String message = String.format( "[%s]: event=%s, data=%s", listenerVersion, @@ -283,7 +283,11 @@ public void onUnparsableMessage(UofSession sender, UnparsableMessage unparsableM @Override public void onUserUnhandledException(UofSession sender, Exception exception) {} - private void logBaseMessageData(Message message, SportEvent event, Producer producer) { + private void logBaseMessageData( + Message message, + SportEvent event, + com.sportradar.unifiedodds.sdk.oddsentities.Producer producer + ) { logger.info( "Received " + message.getClass().getSimpleName() + diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/Sport.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/Sport.java new file mode 100644 index 00000000..29bc649c --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/Sport.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.utils.Urn; + +public enum Sport { + FOOTBALL(Urn.parse("sr:sport:1")); + + private final Urn urn; + + private Sport(Urn urn) { + this.urn = urn; + } + + public Urn getUrn() { + return urn; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SportEvent.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SportEvent.java new file mode 100644 index 00000000..bd991c01 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/SportEvent.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import com.sportradar.utils.Urn; + +public enum SportEvent { + MATCH(Urn.parse("sr:match:1000")), + ANY(Urn.parse("sr:match:1000")); + + private final Urn urn; + + SportEvent(Urn urn) { + this.urn = urn; + } + + public Urn getUrn() { + return urn; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/UfMarkets.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/UfMarkets.java new file mode 100644 index 00000000..728d5e6d --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/UfMarkets.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.EVEN_OUTCOME_ID; +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.ODD_OUTCOME_ID; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.WithOdds.UfOddsChangeOutcomeBuilder.activeOutcome; +import static com.sportradar.utils.generic.testing.RandomObjectPicker.pickOneRandomlyFrom; + +import com.sportradar.uf.datamodel.*; +import com.sportradar.utils.domain.feedmessages.markets.TeamIndicators; +import lombok.val; + +public class UfMarkets { + + public static class Simple { + + public static UfMarket oddEven() { + UfMarket market = new UfMarket(); + market.setId(OddEvenMarket.ID); + return market; + } + } + + public static class WithOdds { + + public static UfOddsChangeMarket oddEven() { + UfOddsChangeMarket market = new UfOddsChangeMarket(); + market.setId(OddEvenMarket.ID); + + market.getOutcome().add(activeOutcome().withId(ODD_OUTCOME_ID)); + market.getOutcome().add(activeOutcome().withId(EVEN_OUTCOME_ID)); + + return market; + } + + public static UfOddsChangeMarket anytimeGoalscorer() { + final int anytimeGoalscorerMarketId = 40; + UfOddsChangeMarket market = new UfOddsChangeMarket(); + market.setId(anytimeGoalscorerMarketId); + + String anytimeScorer1 = "whenFoundExampleOfSuchPleaseReplaceThis1"; + String anytimeScorer2 = "whenFoundExampleOfSuchPleaseReplaceThis2"; + market + .getOutcome() + .add(UfOddsChangeOutcomeBuilder.activeOutcome().withAnyTeamAndId(anytimeScorer1)); + market + .getOutcome() + .add(UfOddsChangeOutcomeBuilder.activeOutcome().withAnyTeamAndId(anytimeScorer2)); + + return market; + } + + public static class UfOddsChangeOutcomeBuilder { + + private UfOddsChangeOutcomeBuilder() {} + + public static UfOddsChangeOutcomeBuilder activeOutcome() { + return new UfOddsChangeOutcomeBuilder(); + } + + public UfOddsChangeMarket.UfOutcome withId(String id) { + UfOddsChangeMarket.UfOutcome outcome = new UfOddsChangeMarket.UfOutcome(); + outcome.setId(id); + outcome.setOdds(DecimalOdds.any()); + outcome.setActive(UfOutcomeActive.ACTIVE); + return outcome; + } + + public UfOddsChangeMarket.UfOutcome withAnyTeamAndId(String id) { + val outcome = withId(id); + outcome.setTeam(pickOneRandomlyFrom(TeamIndicators.values()).getValue()); + return outcome; + } + } + } + + public static class WithSettlementOutcomes { + + public static UfBetSettlementMarket oddEvenWhereWonOdd() { + UfBetSettlementMarket market = new UfBetSettlementMarket(); + market.setId(OddEvenMarket.ID); + + market.getOutcome().add(UfBetSettlementOutcomeBuilder.activeOutcome().wonWithId(ODD_OUTCOME_ID)); + market.getOutcome().add(UfBetSettlementOutcomeBuilder.activeOutcome().wonWithId(EVEN_OUTCOME_ID)); + + return market; + } + + public static class UfBetSettlementOutcomeBuilder { + + private UfBetSettlementOutcomeBuilder() {} + + public static UfBetSettlementOutcomeBuilder activeOutcome() { + return new UfBetSettlementOutcomeBuilder(); + } + + public UfBetSettlementMarket.UfOutcome wonWithId(String id) { + UfBetSettlementMarket.UfOutcome outcome = new UfBetSettlementMarket.UfOutcome(); + outcome.setId(id); + outcome.setResult(UfResult.WON); + return outcome; + } + + public UfBetSettlementMarket.UfOutcome lostWithId(String id) { + UfBetSettlementMarket.UfOutcome outcome = new UfBetSettlementMarket.UfOutcome(); + outcome.setId(id); + outcome.setResult(UfResult.LOST); + return outcome; + } + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaiterForSingleMessage.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaiterForSingleMessage.java new file mode 100644 index 00000000..0e2745d0 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaiterForSingleMessage.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.conn; + +import static java.util.concurrent.TimeUnit.SECONDS; + +import com.sportradar.unifiedodds.sdk.oddsentities.OddsChange; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import org.awaitility.Awaitility; + +public class WaiterForSingleMessage { + + private final MessagesInMemoryStorage messagesStorage; + + public WaiterForSingleMessage(MessagesInMemoryStorage messagesStorage) { + this.messagesStorage = messagesStorage; + } + + public OddsChange theOnlyOddsChange() { + final int tenForSlowMachines = 10; + Awaitility.await().atMost(tenForSlowMachines, SECONDS).until(anyOddsChangeMessageReceived()); + List> allOddsChange = new ArrayList<>( + messagesStorage.findAllOddsChange() + ); + if (allOddsChange.size() != 1) { + throw new IllegalStateException( + "Expected 1 odds change message, but found " + allOddsChange.size() + ); + } + return allOddsChange.get(0); + } + + private Callable anyOddsChangeMessageReceived() { + return () -> !messagesStorage.findAllOddsChange().isEmpty(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaitingUofListenerTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaitingUofListenerTest.java index 7ce0893c..cf7eacf8 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaitingUofListenerTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/conn/WaitingUofListenerTest.java @@ -4,17 +4,18 @@ package com.sportradar.unifiedodds.sdk.conn; import static com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.SignallingOnPollingQueue.createSignallingOnPollingQueue; +import static com.sportradar.utils.time.TimeInterval.seconds; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import com.sportradar.unifiedodds.sdk.UofSession; import com.sportradar.unifiedodds.sdk.entities.SportEvent; -import com.sportradar.unifiedodds.sdk.impl.recovery.TimeUtilsStub; import com.sportradar.unifiedodds.sdk.oddsentities.OddsChange; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.FluentExecutor; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.SignallingOnPollingQueue; +import com.sportradar.utils.time.TimeUtilsStub; import java.time.Instant; import java.util.concurrent.*; import lombok.val; @@ -67,7 +68,7 @@ public void shouldFailIfNoMessageReceivedIn1Sec() { executor.executeInAnotherThread(() -> { queue.getWaiterForStartingToPoll().await(2, TimeUnit.SECONDS); - timeUtils.fastForwardSeconds(2); + timeUtils.tick(seconds(2)); }); assertThatThrownBy(() -> listener.waitForOddsChange()) diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/di/BookmakerDetailsProviderFactoryTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/di/BookmakerDetailsProviderFactoryTest.java index a5cffe9f..ef1f9094 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/di/BookmakerDetailsProviderFactoryTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/di/BookmakerDetailsProviderFactoryTest.java @@ -10,7 +10,7 @@ import com.sportradar.unifiedodds.sdk.SdkInternalConfiguration; import com.sportradar.unifiedodds.sdk.impl.Deserializer; import com.sportradar.unifiedodds.sdk.impl.LogHttpDataFetcher; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import lombok.val; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/domain/language/TranslationsTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/domain/language/TranslationsTest.java index 8d141591..30d265b5 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/domain/language/TranslationsTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/domain/language/TranslationsTest.java @@ -15,7 +15,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.sportradar.unifiedodds.sdk.testutil.generic.collections.Maps; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; +import com.sportradar.utils.domain.names.Languages; import com.sportradar.utils.domain.names.Names; import java.util.HashMap; import java.util.Locale; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/MatchStub.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/MatchStub.java new file mode 100644 index 00000000..bf32802c --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/MatchStub.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.entities; + +import com.sportradar.unifiedodds.sdk.entities.status.MatchStatus; +import com.sportradar.utils.Urn; +import com.sportradar.utils.Urns; +import com.sportradar.utils.domain.names.Names; +import com.sportradar.utils.generic.testing.Booleans; +import com.sportradar.utils.generic.testing.Dates; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Optional; + +@SuppressWarnings("ClassFanOutComplexity") +public class MatchStub implements Match { + + private Optional sportId = Optional.empty(); + + @Override + public BookingStatus getBookingStatus() { + return null; + } + + @Override + public Venue getVenue() { + return null; + } + + @Override + public SportEventConditions getConditions() { + return null; + } + + @Override + public List getCompetitors() { + return null; + } + + @Override + public MatchStatus getStatus() { + return null; + } + + @Override + public SeasonInfo getSeason() { + return null; + } + + @Override + public Round getTournamentRound() { + return null; + } + + @Override + public TeamCompetitor getHomeCompetitor() { + return null; + } + + @Override + public TeamCompetitor getAwayCompetitor() { + return null; + } + + @Override + public LongTermEvent getTournament() { + return null; + } + + @Override + public Fixture getFixture() { + return null; + } + + @Override + public EventTimeline getEventTimeline(Locale locale) { + return null; + } + + @Override + public DelayedInfo getDelayedInfo() { + return null; + } + + @Override + public SportSummary getSport() { + return null; + } + + @Override + public Urn getId() { + return null; + } + + @Override + public String getName(Locale locale) { + return null; + } + + public SportEvent withSportId(final Urn urn) { + sportId = Optional.of(urn); + return this; + } + + @Override + public Urn getSportId() { + return sportId.orElse(Urns.Sports.urnForAnySport()); + } + + @Override + public Date getScheduledTime() { + return null; + } + + @Override + public Date getScheduledEndTime() { + return null; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEventStub.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEventStub.java new file mode 100644 index 00000000..a9c726b0 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEventStub.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.entities; + +import com.sportradar.utils.Urn; +import com.sportradar.utils.Urns; +import com.sportradar.utils.domain.names.Names; +import com.sportradar.utils.generic.testing.Booleans; +import com.sportradar.utils.generic.testing.Dates; +import java.util.Date; +import java.util.Locale; +import java.util.Optional; + +public class SportEventStub implements SportEvent { + + private Optional sportId = Optional.empty(); + + @Override + public Urn getId() { + return Urns.SportEvents.any(); + } + + @Override + public String getName(Locale locale) { + return Names.any(); + } + + public SportEvent withSportId(final Urn urn) { + sportId = Optional.of(urn); + return this; + } + + @Override + public Urn getSportId() { + return sportId.orElse(Urns.Sports.urnForAnySport()); + } + + @Override + public Date getScheduledTime() { + return Dates.any(); + } + + @Override + public Date getScheduledEndTime() { + return Dates.any(); + } + + @Override + public Boolean isStartTimeTbd() { + return Booleans.any(); + } + + @Override + public Urn getReplacedBy() { + return Urns.SportEvents.any(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEvents.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEvents.java new file mode 100644 index 00000000..672b70aa --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/SportEvents.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.entities; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.mock; + +public final class SportEvents { + + private SportEvents() {} + + public static SportEvent any() { + return new SportEventStub(); + } + + public static Match anyMatch() { + return new MatchStub(); + } + + public static Stage anyStage() { + return new StageStub(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/StageStub.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/StageStub.java new file mode 100644 index 00000000..d3ebd894 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/entities/StageStub.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.entities; + +import com.sportradar.unifiedodds.sdk.entities.status.MatchStatus; +import com.sportradar.utils.Urn; +import com.sportradar.utils.Urns; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Optional; + +public class StageStub implements Stage { + + @Override + public BookingStatus getBookingStatus() { + return null; + } + + @Override + public Venue getVenue() { + return null; + } + + @Override + public SportEventConditions getConditions() { + return null; + } + + @Override + public List getCompetitors() { + return null; + } + + @Override + public Urn getId() { + return null; + } + + @Override + public String getName(Locale locale) { + return null; + } + + @Override + public Urn getSportId() { + return Urns.Sports.urnForAnySport(); + } + + @Override + public Date getScheduledTime() { + return null; + } + + @Override + public Date getScheduledEndTime() { + return null; + } + + @Override + public SportSummary getSport() { + return null; + } + + @Override + public CategorySummary getCategory() { + return null; + } + + @Override + public Stage getParentStage() { + return null; + } + + @Override + public List getStages() { + return null; + } + + @Override + public StageType getStageType() { + return null; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerTest.java index 42fb9255..0492c48c 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/ChannelMessageConsumerTest.java @@ -167,7 +167,17 @@ public void testUnmarshallerThreadSafe() throws Exception { .onMessageReceived(Mockito.any(), Mockito.eq(data), Mockito.any(), Mockito.any()); } - //Helpers: + @Test + public void getsConsumerDescription() { + MessageConsumer msgConsumer = Mockito.mock(MessageConsumer.class); + chanMsgConsumer.open(msgConsumer); + + byte[] data = new byte[] { 1, 2, 3, 4 }; //this can't be deserialized + + chanMsgConsumer.onMessageReceived("routing_key", data, null, 0L); + + Mockito.verify(msgConsumer).onMessageDeserializationFailed(Mockito.eq(data), Mockito.any()); + } private byte[] oddsChangeBytes() throws Exception { return Files.readAllBytes( diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/Constants.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/Constants.java index 6b3871b2..0c65752f 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/Constants.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/Constants.java @@ -1,5 +1,7 @@ package com.sportradar.unifiedodds.sdk.impl; +import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.BaseUrl; + @SuppressWarnings({ "HideUtilityClassConstructor" }) public class Constants { @@ -25,7 +27,14 @@ public class Constants { // local rabbit data for tests public static final String ADMIN_USERNAME = "guest"; public static final String ADMIN_PASSWORD = "guest"; + public static final String TOXIPROXY_IP = "toxiproxy"; + public static final BaseUrl TOXIPROXY_BASE_URL = BaseUrl.of(TOXIPROXY_IP, 8474); public static final String RABBIT_IP = "rabbit"; + public static final BaseUrl RABBIT_MANAGEMENT_BASE_URL = BaseUrl.of(Constants.RABBIT_IP, 15672); + public static final int PROXIED_RABBIT_PORT = 8089; + public static final BaseUrl PROXIED_RABBIT_BASE_URL = BaseUrl.of(TOXIPROXY_IP, PROXIED_RABBIT_PORT); + public static final BaseUrl RABBIT_BASE_URL = BaseUrl.of(RABBIT_IP, 5672); + public static final BaseUrl RABBIT_BASE_URL_WITHIN_DOCKER_NETWORK = BaseUrl.of(TOXIPROXY_IP, 5672); public static final String SDK_USERNAME = "testuser"; public static final String SDK_PASSWORD = "testpass"; public static final String UF_EXCHANGE = "unifiedfeed"; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/CourseImplTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/CourseImplTest.java index e652178e..b4a3e2bc 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/CourseImplTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/CourseImplTest.java @@ -10,8 +10,8 @@ import com.sportradar.uf.sportsapi.datamodel.SapiCourse; import com.sportradar.uf.sportsapi.datamodel.SapiHole; import com.sportradar.unifiedodds.sdk.caching.ci.CourseCi; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; import com.sportradar.utils.Urn; +import com.sportradar.utils.domain.names.Languages; import java.util.Locale; import org.junit.Test; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/VenueImplTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/VenueImplTest.java index 2595e175..0f4e4a8e 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/VenueImplTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/entities/VenueImplTest.java @@ -10,9 +10,9 @@ import com.sportradar.uf.sportsapi.datamodel.SapiHole; import com.sportradar.uf.sportsapi.datamodel.SapiVenue; import com.sportradar.unifiedodds.sdk.caching.ci.VenueCi; -import com.sportradar.unifiedodds.sdk.testutil.javautil.Languages; import com.sportradar.utils.Urn; import com.sportradar.utils.Urns; +import com.sportradar.utils.domain.names.Languages; import org.junit.Test; public class VenueImplTest { diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImplTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImplTest.java new file mode 100644 index 00000000..a41638f5 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderImplTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.markets; + +import static com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategies.anyErrorHandlingStrategy; +import static com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy.Catch; +import static com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy.Throw; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.noMarketDescribingProvider; +import static com.sportradar.unifiedodds.sdk.impl.markets.NameProviders.usingFactory; +import static com.sportradar.utils.domain.markets.MarketIds.anyMarketId; +import static com.sportradar.utils.domain.names.Languages.anyLanguages; +import static com.sportradar.utils.domain.producers.ProducerIds.anyProducerId; +import static java.util.Collections.emptyMap; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.sportradar.unifiedodds.sdk.SdkInternalConfiguration; +import com.sportradar.unifiedodds.sdk.caching.ProfileCache; +import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptionProvider; +import com.sportradar.unifiedodds.sdk.exceptions.NameGenerationException; +import com.sportradar.unifiedodds.sdk.exceptions.internal.CacheItemNotFoundException; +import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import com.sportradar.utils.domain.names.Languages; +import lombok.val; +import org.junit.Test; + +public class NameProviderImplTest { + + @Test + public void failsToConstructWithoutRequiredArguments() { + val profiles = mock(ProfileCache.class); + val expr = mock(NameExpressionFactory.class); + val config = mock(SdkInternalConfiguration.class); + val time = mock(TimeUtils.class); + val desc = mock(MarketDescriptionProvider.class); + assertThatThrownBy(() -> new NameProviderFactoryImpl(null, profiles, expr, config, time)) + .isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> new NameProviderFactoryImpl(desc, null, expr, config, time)) + .isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> new NameProviderFactoryImpl(desc, profiles, null, config, time)) + .isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> new NameProviderFactoryImpl(desc, profiles, expr, null, time)) + .isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> new NameProviderFactoryImpl(desc, profiles, expr, config, null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + public void throwsOnMarketNotFoundWhenSdkConfiguredToThrow() throws CacheItemNotFoundException { + val marketDescriptorProvider = mock(MarketDescriptionProvider.class); + when(marketDescriptorProvider.getMarketDescription(anyInt(), anyMap(), anyList(), anyBoolean())) + .thenThrow(CacheItemNotFoundException.class); + val nameProvider = usingFactory() + .withMarketDescriptorProvider(marketDescriptorProvider) + .withExceptionHandlingStrategy(Throw) + .construct(); + + assertThatThrownBy(() -> nameProvider.getMarketNames(anyLanguages())) + .isInstanceOf(NameGenerationException.class) + .hasMessageContaining("Failed to retrieve market name descriptor"); + assertThatThrownBy(() -> nameProvider.getMarketName(Languages.any())) + .isInstanceOf(NameGenerationException.class) + .hasMessageContaining("Failed to retrieve market name descriptor"); + } + + @Test + public void swallowsOnMarketNotFoundWhenSdkConfiguredToCatch() { + val nameProvider = usingFactory() + .withMarketDescriptorProvider(noMarketDescribingProvider()) + .withExceptionHandlingStrategy(Catch) + .construct(); + + assertThat(nameProvider.getMarketNames(anyLanguages())).isNull(); + assertThat(nameProvider.getMarketName(Languages.any())).isNull(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderStatusMessageTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderStatusMessageTest.java new file mode 100644 index 00000000..b8ff2498 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviderStatusMessageTest.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.markets; + +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.EVEN_OUTCOME_ID; +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.ODD_OUTCOME_ID; +import static com.sportradar.unifiedodds.sdk.entities.SportEvents.any; +import static com.sportradar.utils.domain.markets.MarketIds.anyMarketId; +import static com.sportradar.utils.domain.specifiers.MarketSpecifiers.anySpecifiers; +import static com.sportradar.utils.generic.testing.RandomObjectPicker.pickOneRandomlyFrom; +import static java.util.Collections.singletonList; +import static java.util.Locale.ENGLISH; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.sportradar.unifiedodds.sdk.entities.SportEvent; +import com.sportradar.unifiedodds.sdk.impl.markets.NameProviderImpl.StatusMessage; +import com.sportradar.unifiedodds.sdk.testutil.generic.collections.Maps; +import com.sportradar.utils.domain.names.Languages; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import lombok.val; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Test; + +public class NameProviderStatusMessageTest { + + public static final int INVALID_MARKET_ID = 0; + + private final int mId = anyMarketId(); + private final Map specif = anySpecifiers(); + private final String oId = anyOutcomeId(); + private final String oName = RandomStringUtils.randomAlphabetic(10); + private final List lang = Languages.anyLanguages(); + private final String anyMsg = RandomStringUtils.randomAlphabetic(10); + + @Test + public void requiredParameters() { + SportEvent event = any(); + assertThatThrownBy(() -> new StatusMessage(null, mId, specif, anyMsg, oId, oName, lang)) + .isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> new StatusMessage(event, INVALID_MARKET_ID, specif, anyMsg, oId, oName, lang) + ) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new StatusMessage(event, mId, specif, null, oId, oName, lang)) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new StatusMessage(event, mId, specif, "", oId, oName, lang)) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new StatusMessage(event, mId, specif, anyMsg, oId, oName, null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + public void includesEvent() { + val event = mock(SportEvent.class); + val eventDesc = "eventDesc"; + when(event.toString()).thenReturn(eventDesc); + val message = new StatusMessage(event, mId, specif, anyMsg, oId, oName, lang).toString(); + + assertThat(message).contains("event=").contains(eventDesc); + } + + @Test + public void includesMarketId() { + val message = new StatusMessage(any(), mId, specif, anyMsg, oId, oName, lang).toString(); + + assertThat(message).contains("MarketId=" + mId); + } + + @Test + public void includesSpecifiers() { + String name = "specifierName"; + String value = "specifierValue"; + val specifiers = Maps.of(name, value); + val message = new StatusMessage(any(), mId, specifiers, anyMsg, oId, oName, lang).toString(); + + assertThat(message).contains("Specifiers=").contains(name).contains(value); + } + + @Test + public void mentionsAbsenceOfSpecifiers() { + val message = new StatusMessage(any(), mId, null, anyMsg, oId, oName, lang).toString(); + + assertThat(message).contains("Specifiers=[null]"); + } + + @Test + public void includesMessage() { + String message = "anyMsg"; + val statusMessage = new StatusMessage(any(), mId, specif, message, oId, oName, lang).toString(); + + assertThat(statusMessage).contains("Additional message:").contains(message); + } + + @Test + public void includesOutcomeId() { + val message = new StatusMessage(any(), mId, specif, anyMsg, oId, oName, lang).toString(); + + assertThat(message).contains("OutcomeId=" + oId); + } + + @Test + public void excludesOutcomeIdWhenUnavailable() { + val message = new StatusMessage(any(), mId, specif, anyMsg, null, oName, lang).toString(); + + assertThat(message).doesNotContain("OutcomeId="); + } + + @Test + public void includesOutcomeName() { + val message = new StatusMessage(any(), mId, specif, anyMsg, oId, oName, lang).toString(); + + assertThat(message).contains("nameDescriptor=").contains(oName); + } + + @Test + public void excludesOutcomeNameWhenUnavailable() { + val message = new StatusMessage(any(), mId, specif, anyMsg, oId, null, lang).toString(); + + assertThat(message).doesNotContain("nameDescriptor="); + } + + @Test + public void includesLanguages() { + val oneLang = singletonList(ENGLISH); + val message = new StatusMessage(any(), mId, specif, anyMsg, oId, oName, oneLang).toString(); + + assertThat(message).contains("Locale=").contains(ENGLISH.toString()); + } + + public static String anyOutcomeId() { + return pickOneRandomlyFrom(ODD_OUTCOME_ID, EVEN_OUTCOME_ID); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviders.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviders.java new file mode 100644 index 00000000..92b1fe48 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/markets/NameProviders.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.markets; + +import static com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategies.anyErrorHandlingStrategy; +import static com.sportradar.utils.domain.markets.MarketIds.anyMarketId; +import static com.sportradar.utils.domain.producers.ProducerIds.anyProducerId; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.SdkInternalConfiguration; +import com.sportradar.unifiedodds.sdk.caching.ProfileCache; +import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptionProvider; +import com.sportradar.unifiedodds.sdk.entities.SportEvent; +import com.sportradar.utils.domain.names.Languages; +import com.sportradar.utils.time.TimeUtilsStub; +import java.util.Collections; +import java.util.Optional; +import lombok.val; + +public final class NameProviders { + + private NameProviders() {} + + public static BuilderViaFactoryOnly usingFactory() { + return new BuilderViaFactoryOnly(); + } + + public static class BuilderViaFactoryOnly { + + private Optional marketDescriptorProvider = Optional.empty(); + private Optional exceptionHandlingStrategy = Optional.empty(); + + public BuilderViaFactoryOnly withMarketDescriptorProvider(MarketDescriptionProvider provider) { + marketDescriptorProvider = Optional.of(provider); + return this; + } + + public BuilderViaFactoryOnly withExceptionHandlingStrategy(ExceptionHandlingStrategy strategy) { + exceptionHandlingStrategy = Optional.of(strategy); + return this; + } + + public NameProvider construct() { + val config = mock(SdkInternalConfiguration.class); + when(config.getExceptionHandlingStrategy()) + .thenReturn(exceptionHandlingStrategy.orElse(anyErrorHandlingStrategy())); + val factory = new NameProviderFactoryImpl( + marketDescriptorProvider.orElse(mock(MarketDescriptionProvider.class)), + mock(ProfileCache.class), + mock(NameExpressionFactory.class), + config, + mock(TimeUtilsStub.class) + ); + return factory.buildNameProvider( + mock(SportEvent.class), + anyMarketId(), + Collections.emptyMap(), + anyProducerId() + ); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeAssert.java new file mode 100644 index 00000000..9180cd28 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeAssert.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static java.util.Collections.singletonList; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.exceptions.NameGenerationException; +import com.sportradar.unifiedodds.sdk.exceptions.ObjectNotFoundException; +import com.sportradar.unifiedodds.sdk.oddsentities.Outcome; +import java.util.Locale; +import lombok.val; +import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.Assertions; + +public abstract class AbstractOutcomeAssert, ACTUAL extends Outcome> + extends AbstractAssert { + + protected AbstractOutcomeAssert(ACTUAL actual, Class selfType) { + super(actual, selfType); + } + + public AbstractOutcomeAssert nameIsNotBackedByMarketDescriptionForDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInMarketDescriptionNotFoundWhen(actual::getName); + resultsInMarketDescriptionNotFoundWhen(() -> actual.getName(aLanguage)); + resultsInMarketDescriptionNotFoundWhen(() -> actual.getNames(singletonList(aLanguage))); + } else { + assertThatIsNull(actual.getName()); + assertThatIsNull(actual.getName(aLanguage)); + assertThatIsNull(actual.getNames(singletonList(aLanguage))); + } + return this; + } + + public AbstractOutcomeAssert nameIsNotBackedByMarketDescriptionForNonDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInMarketDescriptionNotFoundWhen(() -> actual.getName(aLanguage)); + resultsInMarketDescriptionNotFoundWhen(() -> actual.getNames(singletonList(aLanguage))); + } else { + assertThatIsNull(actual.getName(aLanguage)); + assertThatIsNull(actual.getNames(singletonList(aLanguage))); + } + return this; + } + + public AbstractOutcomeAssert nameIsNotBackedByOutcomeDescriptionForDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInOutcomeDescriptionNotFoundWhen(actual::getName); + resultsInOutcomeDescriptionNotFoundWhen(() -> actual.getName(aLanguage)); + resultsInOutcomeDescriptionNotFoundWhen(() -> actual.getNames(singletonList(aLanguage))); + } else { + assertThatIsNull(actual.getName()); + assertThatIsNull(actual.getName(aLanguage)); + assertThatIsNull(actual.getNames(singletonList(aLanguage))); + } + return this; + } + + public AbstractOutcomeAssert nameIsNotBackedByOutcomeDescriptionForNonDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInOutcomeDescriptionNotFoundWhen(() -> actual.getName(aLanguage)); + resultsInOutcomeDescriptionNotFoundWhen(() -> actual.getNames(singletonList(aLanguage))); + } else { + assertThatIsNull(actual.getName(aLanguage)); + assertThatIsNull(actual.getNames(singletonList(aLanguage))); + } + return this; + } + + public AbstractOutcomeAssert methodsBackedByMarketDescriptionFailForDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + val definition = actual.getOutcomeDefinition(); + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInObjectNotFoundWhen(definition::getNameTemplate); + resultsInObjectNotFoundWhen(() -> definition.getNameTemplate(aLanguage)); + } else { + assertThatIsNull(definition.getNameTemplate()); + assertThatIsNull(definition.getNameTemplate(aLanguage)); + } + return this; + } + + public AbstractOutcomeAssert methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + val definition = actual.getOutcomeDefinition(); + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInObjectNotFoundWhen(() -> definition.getNameTemplate(aLanguage)); + } else { + assertThatIsNull(definition.getNameTemplate(aLanguage)); + } + return this; + } + + private void resultsInObjectNotFoundWhen(Runnable runnable) { + assertThatThrownBy(runnable::run).isInstanceOf(ObjectNotFoundException.class); + } + + private void resultsInMarketDescriptionNotFoundWhen(Runnable runnable) { + assertThatThrownBy(runnable::run) + .isInstanceOf(NameGenerationException.class) + .hasMessageContaining("Failed to retrieve market name description"); + } + + private void resultsInOutcomeDescriptionNotFoundWhen(Runnable runnable) { + assertThatThrownBy(runnable::run) + .isInstanceOf(NameGenerationException.class) + .message() + .containsAnyOf( + "Retrieved market descriptor is lacking outcomes", + "market descriptor is missing outcome", + "Retrieved market descriptor does not contain " + + "name descriptor for associated outcome in the specified language" + ); + } + + private void assertThatIsNull(Object result) { + Assertions.assertThat(result).isNull(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeProbabilitiesAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeProbabilitiesAssert.java new file mode 100644 index 00000000..0051c35b --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/AbstractOutcomeProbabilitiesAssert.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static java.util.Collections.singletonList; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.exceptions.NameGenerationException; +import com.sportradar.unifiedodds.sdk.exceptions.ObjectNotFoundException; +import com.sportradar.unifiedodds.sdk.oddsentities.OutcomeProbabilities; +import java.util.Locale; +import lombok.val; +import org.assertj.core.api.AbstractAssert; + +public abstract class AbstractOutcomeProbabilitiesAssert< + SELF extends AbstractAssert, ACTUAL extends OutcomeProbabilities +> + extends AbstractOutcomeAssert { + + protected AbstractOutcomeProbabilitiesAssert(ACTUAL actual, Class selfType) { + super(actual, selfType); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/ExpectationTowardsSdkErrorHandlingStrategy.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/ExpectationTowardsSdkErrorHandlingStrategy.java new file mode 100644 index 00000000..77df623b --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/ExpectationTowardsSdkErrorHandlingStrategy.java @@ -0,0 +1,9 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +public enum ExpectationTowardsSdkErrorHandlingStrategy { + WILL_THROW_EXCEPTIONS, + WILL_CATCH_EXCEPTIONS, +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketAssert.java new file mode 100644 index 00000000..af949d08 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketAssert.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static java.util.Collections.singletonList; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.exceptions.NameGenerationException; +import com.sportradar.unifiedodds.sdk.oddsentities.Market; +import com.sportradar.utils.domain.names.TranslationHolder; +import java.util.Locale; +import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.Assertions; + +public class MarketAssert extends AbstractAssert { + + private MarketAssert(Market market) { + super(market, MarketAssert.class); + } + + public static MarketAssert assertThat(Market market) { + return new MarketAssert(market); + } + + public MarketAssert hasName(TranslationHolder translation) { + Assertions.assertThat(actual.getName(translation.getLanguage())).isEqualTo(translation.getWord()); + Assertions + .assertThat(actual.getNames(singletonList(translation.getLanguage()))) + .containsEntry(translation.getLanguage(), translation.getWord()); + return this; + } + + public MarketAssert nameIsNotBackedByMarketDescriptionForDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInMarketDescriptionNotFoundWhen(actual::getName); + resultsInMarketDescriptionNotFoundWhen(() -> actual.getName(aLanguage)); + resultsInMarketDescriptionNotFoundWhen(() -> actual.getNames(singletonList(aLanguage))); + } else { + assertThatIsNull(actual.getName()); + assertThatIsNull(actual.getName(aLanguage)); + assertThatIsNull(actual.getNames(singletonList(aLanguage))); + } + return this; + } + + public MarketAssert nameIsNotBackedByMarketDescriptionForNonDefaultLanguage( + Locale aLanguage, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInMarketDescriptionNotFoundWhen(() -> actual.getName(aLanguage)); + resultsInMarketDescriptionNotFoundWhen(() -> actual.getNames(singletonList(aLanguage))); + } else { + assertThatIsNull(actual.getName(aLanguage)); + assertThatIsNull(actual.getNames(singletonList(aLanguage))); + } + return this; + } + + private void resultsInMarketDescriptionNotFoundWhen(Runnable runnable) { + assertThatThrownBy(runnable::run) + .isInstanceOf(NameGenerationException.class) + .hasMessageContaining("Failed to retrieve market name descriptor"); + } + + private void assertThatIsNull(Object result) { + Assertions.assertThat(result).isNull(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionAssert.java new file mode 100644 index 00000000..eea1a195 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketDefinitionAssert.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.ALL_METHODS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.METHODS_EXCLUDING_VALID_MAPPINGS; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.exceptions.ObjectNotFoundException; +import com.sportradar.unifiedodds.sdk.oddsentities.MarketDefinition; +import java.util.Locale; +import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.Assertions; + +public class MarketDefinitionAssert extends AbstractAssert { + + private MarketDefinitionAssert(MarketDefinition marketDefinition) { + super(marketDefinition, MarketDefinitionAssert.class); + } + + public static MarketDefinitionAssert assertThat(MarketDefinition marketDefinition) { + return new MarketDefinitionAssert(marketDefinition); + } + + public MarketDefinitionAssert methodsBackedByMarketDescriptionFailForDefaultLanguage( + Locale aLanguage, + MethodsBackedByMarketDescriptionInScope methodsInScope, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInObjectNotFoundWhen(actual::getOutcomeType); + resultsInObjectNotFoundWhen(actual::getNameTemplate); + resultsInObjectNotFoundWhen(() -> actual.getNameTemplate(aLanguage)); + resultsInObjectNotFoundWhen(actual::getGroups); + resultsInObjectNotFoundWhen(actual::getAttributes); + if (methodsInScope != METHODS_EXCLUDING_VALID_MAPPINGS) { + resultsInObjectNotFoundWhen(() -> actual.getValidMappings(aLanguage)); + } + } else { + assertThatIsNull(actual.getOutcomeType()); + assertThatIsNull(actual.getNameTemplate()); + assertThatIsNull(actual.getNameTemplate(aLanguage)); + assertThatIsNull(actual.getGroups()); + assertThatIsNull(actual.getAttributes()); + if (methodsInScope != METHODS_EXCLUDING_VALID_MAPPINGS) { + assertThatIsNull(actual.getValidMappings(aLanguage)); + } + } + return this; + } + + public MarketDefinitionAssert methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + Locale aLanguage, + MethodsBackedByMarketDescriptionInScope methodsInScope, + ExpectationTowardsSdkErrorHandlingStrategy errorHandling + ) { + if (errorHandling == WILL_THROW_EXCEPTIONS) { + resultsInObjectNotFoundWhen(() -> actual.getNameTemplate(aLanguage)); + if (methodsInScope != METHODS_EXCLUDING_VALID_MAPPINGS) { + resultsInObjectNotFoundWhen(() -> actual.getValidMappings(aLanguage)); + } + } else { + assertThatIsNull(actual.getNameTemplate(aLanguage)); + if (methodsInScope != METHODS_EXCLUDING_VALID_MAPPINGS) { + assertThatIsNull(actual.getValidMappings(aLanguage)); + } + } + return this; + } + + private void resultsInObjectNotFoundWhen(Runnable runnable) { + assertThatThrownBy(runnable::run).isInstanceOf(ObjectNotFoundException.class); + } + + private void assertThatIsNull(Object result) { + Assertions.assertThat(result).isNull(); + } + + public enum MethodsBackedByMarketDescriptionInScope { + ALL_METHODS, + METHODS_EXCLUDING_VALID_MAPPINGS, + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactories.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactories.java new file mode 100644 index 00000000..59112846 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactories.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategies.anyErrorHandlingStrategy; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategies; +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.SdkInternalConfiguration; +import com.sportradar.unifiedodds.sdk.caching.LocalizedNamedValueCache; +import com.sportradar.unifiedodds.sdk.caching.NamedValueCache; +import com.sportradar.unifiedodds.sdk.caching.ProfileCache; +import com.sportradar.unifiedodds.sdk.caching.impl.NamedValuesProviderImpl; +import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptionProvider; +import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import com.sportradar.unifiedodds.sdk.impl.markets.NameExpressionFactoryImpl; +import com.sportradar.unifiedodds.sdk.impl.markets.NameProviderFactoryImpl; +import com.sportradar.unifiedodds.sdk.impl.markets.OperandFactoryImpl; +import com.sportradar.utils.domain.names.Languages; +import com.sportradar.utils.time.TimeUtilsStub; +import java.util.Locale; +import java.util.Optional; +import lombok.val; + +public class MarketFactories { + + public static class BuilderStubbingOutSportEventAndCaches { + + private Optional marketDescriptionProvider = Optional.empty(); + private Optional exceptionHandlingStrategy = Optional.empty(); + private Optional defaultLanguage = Optional.empty(); + private Optional time = Optional.empty(); + + public static BuilderStubbingOutSportEventAndCaches stubbingOutSportEventAndCaches() { + return new BuilderStubbingOutSportEventAndCaches(); + } + + public BuilderStubbingOutSportEventAndCaches with(MarketDescriptionProvider provider) { + this.marketDescriptionProvider = Optional.of(provider); + return this; + } + + public BuilderStubbingOutSportEventAndCaches with(ExceptionHandlingStrategy strategy) { + this.exceptionHandlingStrategy = Optional.of(strategy); + return this; + } + + @SuppressWarnings("HiddenField") + public BuilderStubbingOutSportEventAndCaches with(TimeUtils time) { + this.time = Optional.of(time); + return this; + } + + public BuilderStubbingOutSportEventAndCaches withDefaultLanguage(Locale language) { + this.defaultLanguage = Optional.of(language); + return this; + } + + public MarketFactory build() { + val profileCache = mock(ProfileCache.class); + val config = mock(SdkInternalConfiguration.class); + when(config.getExceptionHandlingStrategy()) + .thenReturn(exceptionHandlingStrategy.orElse(anyErrorHandlingStrategy())); + when(config.getDefaultLocale()).thenReturn(defaultLanguage.orElse(Languages.any())); + return new MarketFactoryImpl( + marketDescriptionProvider.orElse(mock(MarketDescriptionProvider.class)), + new NameProviderFactoryImpl( + marketDescriptionProvider.orElse(mock(MarketDescriptionProvider.class)), + profileCache, + new NameExpressionFactoryImpl(new OperandFactoryImpl(), profileCache), + config, + time.orElse(mock(TimeUtils.class)) + ), + new NamedValuesProviderImpl( + mock(NamedValueCache.class), + mock(NamedValueCache.class), + mock(NamedValueCache.class), + mock(LocalizedNamedValueCache.class) + ), + config + ); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplCancelTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplCancelTest.java new file mode 100644 index 00000000..bffae332 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplCancelTest.java @@ -0,0 +1,255 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions.namesOf; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.noMarketDescribingProvider; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.providing; +import static com.sportradar.unifiedodds.sdk.conn.SapiMarketDescriptions.oddEvenDescription; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.Simple.oddEven; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_CATCH_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.ALL_METHODS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.METHODS_EXCLUDING_VALID_MAPPINGS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketFactories.BuilderStubbingOutSportEventAndCaches.stubbingOutSportEventAndCaches; +import static com.sportradar.utils.domain.names.LanguageHolder.in; +import static com.sportradar.utils.domain.names.TranslationHolder.of; +import static com.sportradar.utils.domain.names.TranslationHolder.with; +import static com.sportradar.utils.domain.producers.ProducerIds.PREMIUM_CRICKET_PRODUCER_ID; +import static com.sportradar.utils.domain.producers.ProducerIds.anyProducerId; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions; +import com.sportradar.unifiedodds.sdk.entities.SportEvents; +import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; +import com.sportradar.utils.domain.producers.ProducerIds; +import java.util.Arrays; +import java.util.Locale; +import java.util.stream.Stream; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import lombok.val; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class MarketFactoryImplCancelTest { + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketIsNotBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsInDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory.buildMarketCancel(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsInNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory.buildMarketCancel(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketCancel(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguageForPremiumCricketProducer( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketCancel(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(aLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForNonDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketCancel(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForPremiumCricketProducerForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketCancel(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(anotherLanguage)).isEmpty(); + } + + private Object[] nonPremiumCricketProducerIdsAndExceptionHandlingStrategies() { + return Arrays + .stream(ProducerIds.nonPremiumCricketProducerIds()) + .flatMap(id -> + Stream.of( + new Object[] { id, ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + new Object[] { id, ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS } + ) + ) + .toArray(Object[]::new); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + public static class WhenMarketIsBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + public void marketHasNameForDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory.buildMarketCancel(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market).hasName(of(oddEvenDescription().getName(), in(langB))); + } + + @Test + public void definitionHasNameTemplateForNonDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory.buildMarketCancel(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market.getMarketDefinition().getNameTemplate(langB)) + .isEqualTo(oddEvenDescription().getName()); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplSimpleTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplSimpleTest.java new file mode 100644 index 00000000..05401e57 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplSimpleTest.java @@ -0,0 +1,255 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions.namesOf; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.noMarketDescribingProvider; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.providing; +import static com.sportradar.unifiedodds.sdk.conn.SapiMarketDescriptions.oddEvenDescription; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.Simple.oddEven; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_CATCH_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.ALL_METHODS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.METHODS_EXCLUDING_VALID_MAPPINGS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketFactories.BuilderStubbingOutSportEventAndCaches.stubbingOutSportEventAndCaches; +import static com.sportradar.utils.domain.names.LanguageHolder.in; +import static com.sportradar.utils.domain.names.TranslationHolder.of; +import static com.sportradar.utils.domain.names.TranslationHolder.with; +import static com.sportradar.utils.domain.producers.ProducerIds.PREMIUM_CRICKET_PRODUCER_ID; +import static com.sportradar.utils.domain.producers.ProducerIds.anyProducerId; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions; +import com.sportradar.unifiedodds.sdk.entities.SportEvents; +import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; +import com.sportradar.utils.domain.producers.ProducerIds; +import java.util.Arrays; +import java.util.Locale; +import java.util.stream.Stream; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import lombok.val; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class MarketFactoryImplSimpleTest { + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketIsNotBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsInDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory.buildMarket(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsInNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory.buildMarket(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarket(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguageForPremiumCricketProducer( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarket(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(aLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForNonDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarket(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForPremiumCricketProducerForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarket(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(anotherLanguage)).isEmpty(); + } + + private Object[] nonPremiumCricketProducerIdsAndExceptionHandlingStrategies() { + return Arrays + .stream(ProducerIds.nonPremiumCricketProducerIds()) + .flatMap(id -> + Stream.of( + new Object[] { id, ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + new Object[] { id, ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS } + ) + ) + .toArray(Object[]::new); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + public static class WhenMarketIsBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + public void marketHasNameForDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory.buildMarket(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market).hasName(of(oddEvenDescription().getName(), in(langB))); + } + + @Test + public void definitionHasNameTemplateForNonDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory.buildMarket(SportEvents.any(), oddEven(), anyProducerId()).get(); + + assertThat(market.getMarketDefinition().getNameTemplate(langB)) + .isEqualTo(oddEvenDescription().getName()); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithOddsTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithOddsTest.java new file mode 100644 index 00000000..a77254f7 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithOddsTest.java @@ -0,0 +1,430 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions.namesOf; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.noMarketDescribingProvider; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.providing; +import static com.sportradar.unifiedodds.sdk.conn.SapiMarketDescriptions.oddEvenDescription; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.WithOdds.anytimeGoalscorer; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.WithOdds.oddEven; +import static com.sportradar.unifiedodds.sdk.entities.SportEvents.anyStage; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_CATCH_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.ALL_METHODS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.METHODS_EXCLUDING_VALID_MAPPINGS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketFactories.BuilderStubbingOutSportEventAndCaches.stubbingOutSportEventAndCaches; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.OutcomeOddsAssert.assertThat; +import static com.sportradar.utils.domain.names.LanguageHolder.in; +import static com.sportradar.utils.domain.names.TranslationHolder.of; +import static com.sportradar.utils.domain.names.TranslationHolder.with; +import static com.sportradar.utils.domain.producers.ProducerIds.*; +import static org.assertj.core.api.Assertions.assertThat; + +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions; +import com.sportradar.unifiedodds.sdk.entities.SportEvents; +import com.sportradar.unifiedodds.sdk.oddsentities.MarketWithOdds; +import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; +import com.sportradar.utils.domain.producers.ProducerIds; +import java.util.Arrays; +import java.util.Locale; +import java.util.stream.Stream; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import lombok.val; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class MarketFactoryImplWithOddsTest { + + private static MarketWithOdds buildAnytimeGoalscorerMarketVia(MarketFactory marketFactory) { + return marketFactory + .buildMarketWithOdds(SportEvents.anyMatch(), anytimeGoalscorer(), anyProducerId()) + .get(); + } + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketIsNotBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsForDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguageForPremiumCricketProducer( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(aLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForNonDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForPremiumCricketProducerForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(anotherLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void nonPlayerOutcomeDefinitionIsNotDescribedForDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val oneOfOutcomes = market.getOutcomeOdds().get(0); + assertThat(oneOfOutcomes) + .isNonPlayerOutcome() + .methodsBackedByMarketDescriptionFailForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void nonPlayerOutcomeDefinitionIsNotDescribedForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val oneOfOutcomes = market.getOutcomeOdds().get(0); + assertThat(oneOfOutcomes) + .isNonPlayerOutcome() + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + willRespectSdkStrategy + ); + } + + @Test + public void nonPlayerOutcomeIsCreatedForTeamOutcomeForNonMatchSportEvent() { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithOdds(anyStage(), anytimeGoalscorer(), anyProducerId()) + .get(); + + val oneOfOutcomes = market.getOutcomeOdds().get(0); + assertThat(oneOfOutcomes).isNonPlayerOutcome(); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void playerOutcomeDefinitionIsNotDescribedForDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = buildAnytimeGoalscorerMarketVia(marketFactory); + + val oneOfOutcomes = market.getOutcomeOdds().get(0); + assertThat(oneOfOutcomes) + .isPlayerOutcome() + .methodsBackedByMarketDescriptionFailForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void playerOutcomeDefinitionIsNotDescribedForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = buildAnytimeGoalscorerMarketVia(marketFactory); + + val oneOfOutcomes = market.getOutcomeOdds().get(0); + assertThat(oneOfOutcomes) + .isPlayerOutcome() + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsInDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = market.getOutcomeOdds().get(0); + + OutcomeAssert + .assertThat(outcome) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsInNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = market.getOutcomeOdds().get(0); + + OutcomeAssert + .assertThat(outcome) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + private Object[] nonPremiumCricketProducerIdsAndExceptionHandlingStrategies() { + return Arrays + .stream(ProducerIds.nonPremiumCricketProducerIds()) + .flatMap(id -> + Stream.of( + new Object[] { id, ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + new Object[] { id, ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS } + ) + ) + .toArray(Object[]::new); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + public static class WhenMarketIsBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + public void marketHasNameForDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market).hasName(of(oddEvenDescription().getName(), in(langB))); + } + + @Test + public void definitionHasNameTemplateForNonDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithOdds(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market.getMarketDefinition().getNameTemplate(langB)) + .isEqualTo(oddEvenDescription().getName()); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithProbabilitiesTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithProbabilitiesTest.java new file mode 100644 index 00000000..b834f525 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithProbabilitiesTest.java @@ -0,0 +1,972 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions.namesOf; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.*; +import static com.sportradar.unifiedodds.sdk.conn.OddEvenMarket.EVEN_OUTCOME_ID; +import static com.sportradar.unifiedodds.sdk.conn.SapiMarketDescriptions.evenOutcomeDescription; +import static com.sportradar.unifiedodds.sdk.conn.SapiMarketDescriptions.oddEvenDescription; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.WithOdds.oddEven; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_CATCH_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.ALL_METHODS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.METHODS_EXCLUDING_VALID_MAPPINGS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketFactories.BuilderStubbingOutSportEventAndCaches.stubbingOutSportEventAndCaches; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.OutcomeAssert.assertThat; +import static com.sportradar.utils.domain.names.LanguageHolder.in; +import static com.sportradar.utils.domain.names.TranslationHolder.of; +import static com.sportradar.utils.domain.producers.ProducerIds.PREMIUM_CRICKET_PRODUCER_ID; +import static com.sportradar.utils.domain.producers.ProducerIds.anyProducerId; +import static com.sportradar.utils.generic.testing.Exceptions.ignoringExceptions; +import static com.sportradar.utils.time.TimeInterval.seconds; +import static java.util.Locale.ENGLISH; +import static java.util.Locale.FRENCH; +import static org.assertj.core.api.Assertions.assertThat; + +import com.sportradar.uf.sportsapi.datamodel.DescMarket; +import com.sportradar.uf.sportsapi.datamodel.DescOutcomes; +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.conn.OddEvenMarket; +import com.sportradar.unifiedodds.sdk.entities.SportEvents; +import com.sportradar.unifiedodds.sdk.oddsentities.MarketWithProbabilities; +import com.sportradar.unifiedodds.sdk.oddsentities.OutcomeProbabilities; +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; +import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; +import com.sportradar.utils.domain.producers.ProducerIds; +import com.sportradar.utils.time.TimeInterval; +import com.sportradar.utils.time.TimeUtilsStub; +import java.time.Instant; +import java.util.Arrays; +import java.util.Locale; +import java.util.stream.Stream; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import lombok.val; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class MarketFactoryImplWithProbabilitiesTest { + + public static final TimeInterval CIRCUIT_BREAKER_OPEN_PERIOD = seconds(30); + + private MarketFactoryImplWithProbabilitiesTest() {} + + private static OutcomeProbabilities getEvenOutcomeFrom(MarketWithProbabilities market) { + return market.getOutcomeProbabilities().stream().filter(OddEvenMarket::isEven).findFirst().get(); + } + + private static DescMarket removeAllOutcomesFrom(DescMarket oddEvenDescription) { + oddEvenDescription.getOutcomes().getOutcome().clear(); + return oddEvenDescription; + } + + private static DescMarket removeEvenOutcomeFrom(DescMarket oddEvenDescription) { + oddEvenDescription.getOutcomes().getOutcome().removeIf(outcome -> isEven(outcome)); + return oddEvenDescription; + } + + private static boolean isEven(DescOutcomes.Outcome outcome) { + return outcome.getId().equals(EVEN_OUTCOME_ID); + } + + private static void getName(OutcomeProbabilities outcome) { + ignoringExceptions(() -> outcome.getName()); + } + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketIsNotBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsForDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguageForPremiumCricketProducer( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(aLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForNonDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), nonPremiumCricketProducerId) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForPremiumCricketProducerForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), PREMIUM_CRICKET_PRODUCER_ID) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(anotherLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeDefinitionIsNotDescribedForDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val oneOfOutcomes = market.getOutcomeProbabilities().get(0); + assertThat(oneOfOutcomes) + .methodsBackedByMarketDescriptionFailForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeDefinitionIsNotDescribedForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val oneOfOutcomes = market.getOutcomeProbabilities().get(0); + assertThat(oneOfOutcomes) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsInDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = market.getOutcomeProbabilities().get(0); + + assertThat(outcome) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsInNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = market.getOutcomeProbabilities().get(0); + + assertThat(outcome) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + private Object[] nonPremiumCricketProducerIdsAndExceptionHandlingStrategies() { + return Arrays + .stream(ProducerIds.nonPremiumCricketProducerIds()) + .flatMap(id -> + Stream.of( + new Object[] { id, ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + new Object[] { id, ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS } + ) + ) + .toArray(Object[]::new); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketDescriptionHasNoOutcomes { + + private static final long MIDNIGHT_TIMESTAMP_MILLIS = 1664402400000L; + private final TimeUtilsStub time = TimeUtilsStub + .threadSafe(new AtomicActionPerformer()) + .withCurrentTime(Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS)); + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFails( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val faultyDescription = removeAllOutcomesFrom(oddEvenDescription()); + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(aLanguage), namesOf(faultyDescription, in(aLanguage)))) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val faultyDescription = removeAllOutcomesFrom(oddEvenDescription()); + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(faultyDescription, in(langB)))) + .withDefaultLanguage(langA) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsDueToMissingOutcomeInSpiteOfReloadOfMarkets( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val language = Languages.any(); + val faultyDescription = namesOf(removeAllOutcomesFrom(oddEvenDescription()), in(language)); + val descriptionProvider = providing(in(language), faultyDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val outcome = getEvenOutcomeFrom(market); + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForDefaultLanguage(language, willRespectSdkStrategy); + descriptionProvider.verifyDescriptionWasReloaded(); + } + + @Test + public void reloadingMarketsRepairsMissingOutcome() { + val language = ENGLISH; + val faultyDescription = namesOf(removeAllOutcomesFrom(oddEvenDescription()), in(language)); + val repairedDescription = namesOf(oddEvenDescription(), in(language)); + val descriptionProvider = providing( + in(language), + faultyDescription, + andAfterReloading(in(language), repairedDescription) + ); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(ExceptionHandlingStrategy.Throw) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val outcome = getEvenOutcomeFrom(market); + assertThat(outcome) + .hasNameInDefaultLanguage(of(evenOutcomeDescription(language).getName(), in(language))); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void reloadingOfMarketsAreThrottledTo1CallPer30secondsTimeframe( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy notUsed + ) { + val language = Languages.any(); + val faultyDescription = namesOf(removeAllOutcomesFrom(oddEvenDescription()), in(language)); + val descriptionProvider = providing(in(language), faultyDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + getName(outcome); + time.tick(CIRCUIT_BREAKER_OPEN_PERIOD.minus(seconds(1))); + getName(outcome); + + descriptionProvider.verifyDescriptionWasReloadedTimes(1); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void throttlingAllowsToReloadMarketsAgainAfter30secondsTimeframePasses( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy notUsed + ) { + val language = Languages.any(); + val faultyDescription = namesOf(removeAllOutcomesFrom(oddEvenDescription()), in(language)); + val descriptionProvider = providing(in(language), faultyDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + getName(outcome); + time.tick(CIRCUIT_BREAKER_OPEN_PERIOD.plus(seconds(1))); + getName(outcome); + + descriptionProvider.verifyDescriptionWasReloadedTimes(2); + } + + private OutcomeProbabilities getEvenOutcomeFrom(MarketWithProbabilities market) { + return market.getOutcomeProbabilities().stream().filter(OddEvenMarket::isEven).findFirst().get(); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketDescriptionIsMissingOutcome { + + private static final long MIDNIGHT_TIMESTAMP_MILLIS = 1664402400000L; + private final TimeUtilsStub time = TimeUtilsStub + .threadSafe(new AtomicActionPerformer()) + .withCurrentTime(Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS)); + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFails( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val faultyDescription = removeEvenOutcomeFrom(oddEvenDescription()); + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(aLanguage), namesOf(faultyDescription, in(aLanguage)))) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val faultyDescription = removeEvenOutcomeFrom(oddEvenDescription()); + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(faultyDescription, in(langB)))) + .withDefaultLanguage(langA) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsDueToMissingOutcomeInSpiteOfReloadOfMarkets( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val language = Languages.any(); + val faultyDescription = namesOf(removeEvenOutcomeFrom(oddEvenDescription()), in(language)); + val descriptionProvider = providing(in(language), faultyDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val outcome = getEvenOutcomeFrom(market); + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForDefaultLanguage(language, willRespectSdkStrategy); + descriptionProvider.verifyDescriptionWasReloaded(); + } + + @Test + public void reloadingMarketsRepairsMissingOutcome() { + val language = ENGLISH; + val faultyDescription = namesOf(removeEvenOutcomeFrom(oddEvenDescription()), in(language)); + val repairedDescription = namesOf(oddEvenDescription(), in(language)); + val descriptionProvider = providing( + in(language), + faultyDescription, + andAfterReloading(in(language), repairedDescription) + ); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(ExceptionHandlingStrategy.Throw) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + val outcome = getEvenOutcomeFrom(market); + assertThat(outcome) + .hasNameInDefaultLanguage(of(evenOutcomeDescription(language).getName(), in(language))); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void reloadingOfMarketsAreThrottledTo1CallPer30secondsTimeframe( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy notUsed + ) { + val language = Languages.any(); + val faultyDescription = namesOf(removeEvenOutcomeFrom(oddEvenDescription()), in(language)); + val descriptionProvider = providing(in(language), faultyDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + getName(outcome); + time.tick(CIRCUIT_BREAKER_OPEN_PERIOD.minus(seconds(1))); + getName(outcome); + + descriptionProvider.verifyDescriptionWasReloadedTimes(1); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void throttlingAllowsToReloadMarketsAgainAfter30secondsTimeframePasses( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy notUsed + ) { + val language = Languages.any(); + val faultyDescription = namesOf(removeEvenOutcomeFrom(oddEvenDescription()), in(language)); + val descriptionProvider = providing(in(language), faultyDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(language) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + getName(outcome); + time.tick(CIRCUIT_BREAKER_OPEN_PERIOD.plus(seconds(1))); + getName(outcome); + + descriptionProvider.verifyDescriptionWasReloadedTimes(2); + } + + private OutcomeProbabilities getEvenOutcomeFrom(MarketWithProbabilities market) { + return market.getOutcomeProbabilities().get(1); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketDescriptionIsMissingOutcomeTranslation { + + private static final long MIDNIGHT_TIMESTAMP_MILLIS = 1664402400000L; + private final TimeUtilsStub time = TimeUtilsStub + .threadSafe(new AtomicActionPerformer()) + .withCurrentTime(Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS)); + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFails( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = FRENCH; + val langB = ENGLISH; + + val marketDescription = namesOf( + oddEvenDescription(langA), + in(langA), + removeEvenOutcomeFrom(oddEvenDescription(langB)), + in(langB) + ); + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langA), in(langB), marketDescription)) + .withDefaultLanguage(langB) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val faultyDescription = removeEvenOutcomeFrom(oddEvenDescription()); + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(faultyDescription, in(langB)))) + .withDefaultLanguage(langA) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsInSpiteOfReloadOfMarkets( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = FRENCH; + val langB = ENGLISH; + + val marketDescription = namesOf( + oddEvenDescription(langA), + in(langA), + removeEvenOutcomeFrom(oddEvenDescription(langB)), + in(langB) + ); + val descriptionProvider = providing(in(langA), in(langB), marketDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(langB) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .nameIsNotBackedByOutcomeDescriptionForDefaultLanguage(langB, willRespectSdkStrategy); + descriptionProvider.verifyDescriptionWasReloaded(); + } + + @Test + public void reloadingMarketsRepairsUntranslatedOutcome() { + val langA = FRENCH; + val langB = ENGLISH; + + val faultyDescription = namesOf( + oddEvenDescription(langA), + in(langA), + removeEvenOutcomeFrom(oddEvenDescription(langB)), + in(langB) + ); + val repairedDescription = namesOf( + oddEvenDescription(langA), + in(langA), + oddEvenDescription(langB), + in(langB) + ); + val descriptionProvider = providing( + in(langA), + in(langB), + faultyDescription, + andAfterReloading(in(langA), in(langB), repairedDescription) + ); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(langB) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .hasNameInDefaultLanguage(of(evenOutcomeDescription(langB).getName(), in(langB))); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void reloadingOfMarketsAreThrottledTo1CallPer30secondsTimeframe( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy notUsed + ) { + val langA = FRENCH; + val langB = ENGLISH; + + val marketDescription = namesOf( + oddEvenDescription(langA), + in(langA), + removeEvenOutcomeFrom(oddEvenDescription(langB)), + in(langB) + ); + val descriptionProvider = providing(in(langA), in(langB), marketDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(langB) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + getName(outcome); + time.tick(CIRCUIT_BREAKER_OPEN_PERIOD.minus(seconds(1))); + getName(outcome); + + descriptionProvider.verifyDescriptionWasReloadedTimes(1); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void throttlingAllowsToReloadMarketsAgainAfter30secondsTimeframePasses( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy notUsed + ) { + val langA = FRENCH; + val langB = ENGLISH; + + val marketDescription = namesOf( + oddEvenDescription(langA), + in(langA), + removeEvenOutcomeFrom(oddEvenDescription(langB)), + in(langB) + ); + val descriptionProvider = providing(in(langA), in(langB), marketDescription); + val marketFactory = stubbingOutSportEventAndCaches() + .with(descriptionProvider) + .withDefaultLanguage(langB) + .with(exceptionHandlingStrategy) + .with(time) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + getName(outcome); + time.tick(CIRCUIT_BREAKER_OPEN_PERIOD.plus(seconds(1))); + getName(outcome); + + descriptionProvider.verifyDescriptionWasReloadedTimes(2); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + public static class WhenMarketIsBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + public void marketHasNameForDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market).hasName(of(oddEvenDescription().getName(), in(langB))); + } + + @Test + public void definitionHasNameTemplateForNonDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + + assertThat(market.getMarketDefinition().getNameTemplate(langB)) + .isEqualTo(oddEvenDescription().getName()); + } + + @Test + public void outcomeHasNameForDefaultLanguage() { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(aLanguage), namesOf(oddEvenDescription(), in(aLanguage)))) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithProbabilities(SportEvents.any(), oddEven(), anyProducerId()) + .get(); + val outcome = getEvenOutcomeFrom(market); + + assertThat(outcome) + .hasNameInDefaultLanguage(of(evenOutcomeDescription().getName(), in(aLanguage))); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithSettlementTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithSettlementTest.java new file mode 100644 index 00000000..a9f41957 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/MarketFactoryImplWithSettlementTest.java @@ -0,0 +1,373 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions.namesOf; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.noMarketDescribingProvider; +import static com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptorProviders.providing; +import static com.sportradar.unifiedodds.sdk.conn.SapiMarketDescriptions.oddEvenDescription; +import static com.sportradar.unifiedodds.sdk.conn.UfMarkets.WithSettlementOutcomes.oddEvenWhereWonOdd; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_CATCH_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.ALL_METHODS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.MethodsBackedByMarketDescriptionInScope.METHODS_EXCLUDING_VALID_MAPPINGS; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketDefinitionAssert.assertThat; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.MarketFactories.BuilderStubbingOutSportEventAndCaches.stubbingOutSportEventAndCaches; +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.OutcomeAssert.assertThat; +import static com.sportradar.utils.domain.names.LanguageHolder.in; +import static com.sportradar.utils.domain.names.TranslationHolder.of; +import static com.sportradar.utils.domain.names.TranslationHolder.with; +import static com.sportradar.utils.domain.producers.ProducerIds.PREMIUM_CRICKET_PRODUCER_ID; +import static com.sportradar.utils.domain.producers.ProducerIds.anyProducerId; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.ExceptionHandlingStrategy; +import com.sportradar.unifiedodds.sdk.caching.markets.MarketDescriptions; +import com.sportradar.unifiedodds.sdk.entities.SportEvents; +import com.sportradar.utils.domain.UniqueObjects; +import com.sportradar.utils.domain.names.Languages; +import com.sportradar.utils.domain.producers.ProducerIds; +import java.util.Arrays; +import java.util.Locale; +import java.util.stream.Stream; +import junitparams.JUnitParamsRunner; +import junitparams.Parameters; +import lombok.val; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class MarketFactoryImplWithSettlementTest { + + @RunWith(JUnitParamsRunner.class) + public static class WhenMarketIsNotBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsInDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketNameRetrievalFailsInNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + + assertThat(market) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithSettlement( + SportEvents.any(), + oddEvenWhereWonOdd(), + nonPremiumCricketProducerId + ) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForDefaultLanguageForPremiumCricketProducer( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithSettlement( + SportEvents.any(), + oddEvenWhereWonOdd(), + PREMIUM_CRICKET_PRODUCER_ID + ) + .get(); + + val definition = market.getMarketDefinition(); + + assertThat(definition) + .methodsBackedByMarketDescriptionFailForDefaultLanguage( + aLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(aLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "nonPremiumCricketProducerIdsAndExceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForNonDefaultLanguage( + int nonPremiumCricketProducerId, + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithSettlement( + SportEvents.any(), + oddEvenWhereWonOdd(), + nonPremiumCricketProducerId + ) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + ALL_METHODS, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void marketDefinitionIsNotDescribedForPremiumCricketProducerForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithSettlement( + SportEvents.any(), + oddEvenWhereWonOdd(), + PREMIUM_CRICKET_PRODUCER_ID + ) + .get(); + + val definition = market.getMarketDefinition(); + assertThat(definition) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + METHODS_EXCLUDING_VALID_MAPPINGS, + willRespectSdkStrategy + ); + assertThat(definition.getValidMappings(anotherLanguage)).isEmpty(); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeDefinitionIsNotDescribedForDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(aLanguage) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + + val oneOfOutcomes = market.getOutcomeSettlements().get(0); + assertThat(oneOfOutcomes) + .methodsBackedByMarketDescriptionFailForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeDefinitionIsNotDescribedForNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val defaultLanguage = Languages.any(); + val anotherLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(defaultLanguage) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + + val oneOfOutcomes = market.getOutcomeSettlements().get(0); + assertThat(oneOfOutcomes) + .methodsBackedByMarketDescriptionFailForNonDefaultLanguage( + anotherLanguage, + willRespectSdkStrategy + ); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsInDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val aLanguage = Languages.any(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .withDefaultLanguage(aLanguage) + .with(exceptionHandlingStrategy) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + val outcome = market.getOutcomeSettlements().get(0); + + assertThat(outcome) + .nameIsNotBackedByMarketDescriptionForDefaultLanguage(aLanguage, willRespectSdkStrategy); + } + + @Test + @Parameters(method = "exceptionHandlingStrategies") + public void outcomeNameRetrievalFailsInNonDefaultLanguage( + ExceptionHandlingStrategy exceptionHandlingStrategy, + ExpectationTowardsSdkErrorHandlingStrategy willRespectSdkStrategy + ) { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + val marketFactory = stubbingOutSportEventAndCaches() + .with(noMarketDescribingProvider()) + .with(exceptionHandlingStrategy) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + val outcome = market.getOutcomeSettlements().get(0); + + assertThat(outcome) + .nameIsNotBackedByMarketDescriptionForNonDefaultLanguage(langB, willRespectSdkStrategy); + } + + private Object[] nonPremiumCricketProducerIdsAndExceptionHandlingStrategies() { + return Arrays + .stream(ProducerIds.nonPremiumCricketProducerIds()) + .flatMap(id -> + Stream.of( + new Object[] { id, ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + new Object[] { id, ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS } + ) + ) + .toArray(Object[]::new); + } + + private Object[] exceptionHandlingStrategies() { + return new Object[][] { + { ExceptionHandlingStrategy.Throw, WILL_THROW_EXCEPTIONS }, + { ExceptionHandlingStrategy.Catch, WILL_CATCH_EXCEPTIONS }, + }; + } + } + + public static class WhenMarketIsBackedWithMarketDescription { + + private final UniqueObjects uniqueLanguages = new UniqueObjects<>(() -> Languages.any()); + + @Test + public void marketHasNameForDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + + assertThat(market).hasName(of(oddEvenDescription().getName(), in(langB))); + } + + @Test + public void definitionHasNameTemplateForNonDefaultLanguage() { + val langA = uniqueLanguages.getOne(); + val langB = uniqueLanguages.getOne(); + + val marketFactory = stubbingOutSportEventAndCaches() + .with(providing(in(langB), namesOf(oddEvenDescription(), in(langB)))) + .withDefaultLanguage(langA) + .build(); + + val market = marketFactory + .buildMarketWithSettlement(SportEvents.any(), oddEvenWhereWonOdd(), anyProducerId()) + .get(); + + assertThat(market.getMarketDefinition().getNameTemplate(langB)) + .isEqualTo(oddEvenDescription().getName()); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeAssert.java new file mode 100644 index 00000000..fead20ee --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeAssert.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static java.util.Collections.singletonList; + +import com.sportradar.unifiedodds.sdk.oddsentities.Outcome; +import com.sportradar.utils.domain.names.TranslationHolder; +import org.assertj.core.api.Assertions; + +public class OutcomeAssert extends AbstractOutcomeAssert { + + private OutcomeAssert(Outcome outcome) { + super(outcome, OutcomeAssert.class); + } + + public static OutcomeAssert assertThat(Outcome outcome) { + return new OutcomeAssert(outcome); + } + + public OutcomeAssert hasNameInDefaultLanguage(TranslationHolder translation) { + Assertions.assertThat(actual.getName()).isEqualTo(translation.getWord()); + Assertions.assertThat(actual.getName(translation.getLanguage())).isEqualTo(translation.getWord()); + Assertions + .assertThat(actual.getNames(singletonList(translation.getLanguage()))) + .containsEntry(translation.getLanguage(), translation.getWord()); + return this; + } + + public OutcomeAssert hasNameInNonDefaultLanguage(TranslationHolder translation) { + Assertions.assertThat(actual.getName(translation.getLanguage())).isEqualTo(translation.getWord()); + Assertions + .assertThat(actual.getNames(singletonList(translation.getLanguage()))) + .containsEntry(translation.getLanguage(), translation.getWord()); + return this; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeOddsAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeOddsAssert.java new file mode 100644 index 00000000..39ca70c8 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeOddsAssert.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.exceptions.ObjectNotFoundException; +import com.sportradar.unifiedodds.sdk.oddsentities.OutcomeOdds; +import org.assertj.core.api.Assertions; + +public class OutcomeOddsAssert extends AbstractOutcomeProbabilitiesAssert { + + private OutcomeOddsAssert(OutcomeOdds outcomeOdds) { + super(outcomeOdds, OutcomeOddsAssert.class); + } + + public static OutcomeOddsAssert assertThat(OutcomeOdds outcomeOdds) { + return new OutcomeOddsAssert(outcomeOdds); + } + + public OutcomeOddsAssert isPlayerOutcome() { + Assertions.assertThat(actual.isPlayerOutcome()).isTrue(); + return this; + } + + public OutcomeOddsAssert isNonPlayerOutcome() { + Assertions.assertThat(actual.isPlayerOutcome()).isFalse(); + return this; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeSettlementAssert.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeSettlementAssert.java new file mode 100644 index 00000000..3a4c7a1d --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/oddsentities/markets/OutcomeSettlementAssert.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.oddsentities.markets; + +import static com.sportradar.unifiedodds.sdk.impl.oddsentities.markets.ExpectationTowardsSdkErrorHandlingStrategy.WILL_THROW_EXCEPTIONS; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.sportradar.unifiedodds.sdk.exceptions.ObjectNotFoundException; +import com.sportradar.unifiedodds.sdk.oddsentities.OutcomeSettlement; +import java.util.Locale; +import lombok.val; +import org.assertj.core.api.AbstractAssert; + +public class OutcomeSettlementAssert extends AbstractAssert { + + private OutcomeSettlementAssert(OutcomeSettlement outcomeSettlement) { + super(outcomeSettlement, OutcomeSettlementAssert.class); + } + + public static OutcomeSettlementAssert assertThat(OutcomeSettlement outcomeSettlement) { + return new OutcomeSettlementAssert(outcomeSettlement); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFake.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFake.java new file mode 100644 index 00000000..a7694ddb --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFake.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; + +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ConnectionHealth.HEALTHY; +import static com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.WaiterForEvents.WaitingStatus.EVENT_NOT_HAPPENED; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.mock; + +import com.rabbitmq.client.AlreadyClosedException; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ShutdownSignalException; +import com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ConnectionAbsent; +import com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ConnectionPresent; +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.WaiterForEvents; +import java.io.IOException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.*; +import java.util.concurrent.TimeoutException; + +public class AmqpConnectionFactoryFake implements AmqpConnectionFactory { + + private Optional runtimeExceptionOnClose = Optional.empty(); + private Optional ioExceptionOnClose = Optional.empty(); + private ConnectionToBeProvided currentConnection = new ConnectionAbsent(); + private ConnectionToBeProvided afterCurrentConnectionStopping = new ConnectionAbsent(); + private WaiterForEvents alreadyClosedConnectionIsClosed = WaiterForEvents.createWaiterForEvents(); + + private AmqpConnectionFactoryFake(ConnectionToBeProvided connection) { + afterCurrentConnectionStopping = connection; + } + + public AmqpConnectionFactoryFake afterClosingStarts(ConnectionToBeProvided nextConnection) { + if (afterCurrentConnectionStopping instanceof ConnectionPresent) { + throw new IllegalArgumentException("next connection to be opened is already arranged"); + } else { + afterCurrentConnectionStopping = nextConnection; + } + return this; + } + + @Override + public Connection getConnection() + throws IOException, TimeoutException, NoSuchAlgorithmException, KeyManagementException { + rotatePlannedConnectionsIfThereIsNoCurrentConnection(); + if (currentConnection instanceof ConnectionPresent) { + return ((ConnectionPresent) currentConnection).getConnection(); + } else { + return null; + } + } + + private void rotatePlannedConnectionsIfThereIsNoCurrentConnection() { + if (currentConnection instanceof ConnectionAbsent) { + currentConnection = afterCurrentConnectionStopping; + afterCurrentConnectionStopping = new ConnectionAbsent(); + } + } + + @Override + public void close(boolean feedStopped) throws IOException { + if (currentConnection instanceof ConnectionAbsent) { + alreadyClosedConnectionIsClosed.markEventHappened(); + throw new AlreadyClosedException(mock(ShutdownSignalException.class)); + } + assertConnectionIsNotClosed(); + assertSdkLetsConnectionToAutoRecover(); + if (runtimeExceptionOnClose.isPresent()) { + throw runtimeExceptionOnClose.get(); + } else if (ioExceptionOnClose.isPresent()) { + throw ioExceptionOnClose.get(); + } + currentConnection = new ConnectionAbsent(); + } + + private void assertConnectionIsNotClosed() { + assertThat(currentConnection).isInstanceOf(ConnectionPresent.class); + } + + private void assertSdkLetsConnectionToAutoRecover() { + assertThat(currentConnection).isInstanceOf(ConnectionPresent.class); + assertThat(((ConnectionPresent) currentConnection).getHealth()).isEqualTo(HEALTHY); + } + + @Override + public boolean isConnectionHealthy() { + boolean isConnectionHealthy = + currentConnection instanceof ConnectionPresent && + ((ConnectionPresent) currentConnection).getHealth() == HEALTHY; + return isConnectionHealthy; + } + + public boolean hasConnection() { + return currentConnection instanceof ConnectionPresent; + } + + @Override + public long getConnectionStarted() { + if (currentConnection instanceof ConnectionPresent) { + return ((ConnectionPresent) currentConnection).getCreatedAt(); + } else { + return 0; + } + } + + @Override + public boolean canConnectionOpen() { + return true; + } + + public AmqpConnectionFactoryFake onCloseThrowing(RuntimeException t) { + runtimeExceptionOnClose = Optional.of(t); + return this; + } + + public AmqpConnectionFactoryFake onCloseThrowing(IOException t) { + ioExceptionOnClose = Optional.of(t); + return this; + } + + public static AmqpConnectionFactoryFake initiallyProvides(ConnectionToBeProvided connection) { + return new AmqpConnectionFactoryFake(connection); + } + + public void assertThatAlreadyClosedConnectionWasNotClosedAgain() { + assertThat(alreadyClosedConnectionIsClosed.getWaitingStatus()).isEqualTo(EVENT_NOT_HAPPENED); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFakeTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFakeTest.java new file mode 100644 index 00000000..c0146e36 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryFakeTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; + +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.AmqpConnectionFactoryFake.initiallyProvides; +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ChannelsToBeCreated.creating; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.rabbitmq.client.Channel; +import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import com.sportradar.utils.time.EpochMillis; +import java.io.IOException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.concurrent.TimeoutException; +import org.junit.Test; + +public class AmqpConnectionFactoryFakeTest { + + private final Channel channel = mock(Channel.class); + private final EpochMillis createTimestamp = new EpochMillis(1664402403L); + + private final TimeUtils time = mock(TimeUtils.class); + private final ConnectionToBeProvided.Factory provides = new ConnectionToBeProvided.Factory(time); + + @Test + public void shouldBeAbleToProvideConnection() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + when(time.now()).thenReturn(createTimestamp.get()); + AmqpConnectionFactory factory = initiallyProvides(provides.whichIs(creating(channel))); + + assertNotNull(factory.getConnection()); + assertTrue("connection should be able to open", factory.canConnectionOpen()); + assertTrue("connection be open", factory.isConnectionHealthy()); + assertEquals(createTimestamp.get(), factory.getConnectionStarted()); + } + + @Test + public void connectionCreatesProvidedChannel() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + AmqpConnectionFactory factory = initiallyProvides(provides.whichIs(creating(channel))); + + assertSame(channel, factory.getConnection().createChannel()); + } + + @Test + public void shouldClose() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + AmqpConnectionFactory factory = initiallyProvides(provides.whichIs(creating(channel))); + factory.getConnection(); + + factory.close(false); + + assertFalse("connection should be closed", factory.isConnectionHealthy()); + assertEquals(0, factory.getConnectionStarted()); + } + + @Test + public void shouldThrowRuntimeExceptionOnCloseIfRequestedSo() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + AmqpConnectionFactoryFake factory = initiallyProvides(provides.whichIs(creating(channel))) + .onCloseThrowing(new IllegalArgumentException()); + factory.getConnection(); + + assertThatThrownBy(() -> factory.close(false)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void shouldThrowIoExceptionOnCloseIfRequestedSo() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + AmqpConnectionFactoryFake factory = initiallyProvides(provides.whichIs(creating(channel))) + .onCloseThrowing(new IOException()); + factory.getConnection(); + + assertThatThrownBy(() -> factory.close(false)).isInstanceOf(IOException.class); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubs.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubs.java deleted file mode 100644 index 9dca2253..00000000 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubs.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) Sportradar AG. See LICENSE for full license governing this code - */ -package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; - -import com.rabbitmq.client.Connection; -import java.io.IOException; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.util.Optional; -import java.util.concurrent.TimeoutException; - -public interface AmqpConnectionFactoryStubs extends AmqpConnectionFactory { - public AmqpConnectionFactoryStubs onCloseThrowing(RuntimeException t); - - public AmqpConnectionFactoryStubs onCloseThrowing(IOException t); - - public static AmqpConnectionFactoryStubs holdingConnectionCreatedAt( - long epochMillis, - Connection connection - ) { - return new AmqpConnectionFactoryStubsInstance(epochMillis, connection); - } - - public static class AmqpConnectionFactoryStubsInstance implements AmqpConnectionFactoryStubs { - - private boolean isClosed; - private Optional runtimeExceptionOnClose = Optional.empty(); - private Optional ioExceptionOnClose = Optional.empty(); - private long epochMillis; - private Connection connection; - - public AmqpConnectionFactoryStubsInstance(long epochMillis, Connection connection) { - this.epochMillis = epochMillis; - this.connection = connection; - } - - @Override - public Connection getConnection() - throws IOException, TimeoutException, NoSuchAlgorithmException, KeyManagementException { - return connection; - } - - @Override - public void close(boolean feedStopped) throws IOException { - if (runtimeExceptionOnClose.isPresent()) { - throw runtimeExceptionOnClose.get(); - } else if (ioExceptionOnClose.isPresent()) { - throw ioExceptionOnClose.get(); - } - isClosed = true; - } - - @Override - public boolean isConnectionOpen() { - return !isClosed; - } - - @Override - public long getConnectionStarted() { - if (isClosed) { - return 0; - } else { - return epochMillis; - } - } - - @Override - public boolean canConnectionOpen() { - return true; - } - - @Override - public AmqpConnectionFactoryStubs onCloseThrowing(RuntimeException t) { - runtimeExceptionOnClose = Optional.of(t); - return this; - } - - @Override - public AmqpConnectionFactoryStubs onCloseThrowing(IOException t) { - ioExceptionOnClose = Optional.of(t); - return this; - } - } -} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubsTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubsTest.java deleted file mode 100644 index a4cef633..00000000 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/AmqpConnectionFactoryStubsTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) Sportradar AG. See LICENSE for full license governing this code - */ -package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.Assert.*; -import static org.mockito.Mockito.mock; - -import com.rabbitmq.client.Connection; -import java.io.IOException; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.util.concurrent.TimeoutException; -import org.junit.Test; - -public class AmqpConnectionFactoryStubsTest { - - private Connection connection = mock(Connection.class); - private final long createTimestamp = 1664402403L; - - @Test - public void shouldBeAbleToProvideConnection() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - AmqpConnectionFactory factory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - createTimestamp, - connection - ); - - assertSame(connection, factory.getConnection()); - assertTrue("connection should be able to open", factory.canConnectionOpen()); - assertTrue("connection be open", factory.isConnectionOpen()); - assertEquals(createTimestamp, factory.getConnectionStarted()); - } - - @Test - public void shouldClose() throws IOException { - AmqpConnectionFactory factory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - createTimestamp, - connection - ); - - factory.close(false); - - assertFalse("connection should be closed", factory.isConnectionOpen()); - assertEquals(0, factory.getConnectionStarted()); - } - - @Test - public void shouldThrowRuntimeExceptionOnCloseIfRequestedSo() { - AmqpConnectionFactoryStubs factory = AmqpConnectionFactoryStubs - .holdingConnectionCreatedAt(createTimestamp, connection) - .onCloseThrowing(new IllegalArgumentException()); - - assertThatThrownBy(() -> factory.close(false)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - public void shouldThrowIoExceptionOnCloseIfRequestedSo() { - AmqpConnectionFactoryStubs factory = AmqpConnectionFactoryStubs - .holdingConnectionCreatedAt(createTimestamp, connection) - .onCloseThrowing(new IOException()); - - assertThatThrownBy(() -> factory.close(false)).isInstanceOf(IOException.class); - } -} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixture.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixture.java index 1648eefa..5adc65f5 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixture.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixture.java @@ -1,75 +1,83 @@ package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Consumer; -import com.rabbitmq.client.Envelope; -import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import com.rabbitmq.client.*; +import com.sportradar.utils.time.EpochMillis; import java.io.IOException; -import org.mockito.ArgumentCaptor; -import org.mockito.verification.VerificationMode; +import java.util.concurrent.TimeoutException; +import lombok.AllArgsConstructor; @SuppressWarnings({ "LambdaBodyLength" }) -public interface ChannelFixture extends RecoverableChannel { - void sendMessageAt(long epochMillis); +public class ChannelFixture extends NoOpRecoverableChannel { - void verifyInitiated(VerificationMode times); + private Consumer consumer; + private int initiatedTimes; + private int closedTimes; + private boolean isOpen; - class Holder { + public ChannelFixture() {} - private ChannelFixture channel; + void sendMessage() throws IOException { + consumer.handleDelivery("any", mock(Envelope.class), mock(AMQP.BasicProperties.class), new byte[] {}); + } - Holder(TimeUtils timeUtils) throws IOException { - stubInitiationBehaviour(); - setupControlMethods(timeUtils); - } + void verifyInitiatedTimes(int expectedTimes) { + assertThat(initiatedTimes).isEqualTo(expectedTimes); + } - private void setupControlMethods(TimeUtils timeUtils) { - sendMessageAt(timeUtils); + void verifyClosedTimes(int expectedTimes) { + assertThat(closedTimes).isEqualTo(expectedTimes); + } - verifyInitiated(); - } + @Override + @SuppressWarnings("HiddenField") + public String basicConsume(String s, boolean b, String s1, Consumer consumer) throws IOException { + verifyChannelIsClosed(); + initiatedTimes++; + isOpen = true; + this.consumer = consumer; + return null; + } - private void stubInitiationBehaviour() throws IOException { - channel = mock(ChannelFixture.class); - AMQP.Queue.DeclareOk declareQueue = mock(AMQP.Queue.DeclareOk.class); - when(channel.queueDeclare()).thenReturn(declareQueue); - when(declareQueue.getQueue()).thenReturn("any"); - } + @Override + public AMQP.Queue.DeclareOk queueDeclare() throws IOException { + return new QueueDeclareOk("anyName"); + } - private void sendMessageAt(TimeUtils timeUtils) { - doAnswer(invocationOnMock -> { - ArgumentCaptor messageConsumer = ArgumentCaptor.forClass(Consumer.class); - verify(channel) - .basicConsume(anyString(), anyBoolean(), anyString(), messageConsumer.capture()); - when(timeUtils.now()).thenReturn(invocationOnMock.getArgument(0)); - messageConsumer - .getValue() - .handleDelivery( - "any", - mock(Envelope.class), - mock(AMQP.BasicProperties.class), - new byte[] {} - ); - return null; - }) - .when(channel) - .sendMessageAt(anyLong()); + @Override + public void close() throws IOException, TimeoutException { + verifyChannelIsOpen(); + isOpen = false; + closedTimes++; + } + + @Override + public boolean isOpen() { + return isOpen; + } + + private void verifyChannelIsClosed() { + if (isOpen) { + throw new IllegalStateException("channel is already open"); } + } - private void verifyInitiated() { - doAnswer(invocationOnMock -> { - verify(channel, invocationOnMock.getArgument(0)) - .basicConsume(any(), anyBoolean(), anyString(), any()); - return null; - }) - .when(channel) - .verifyInitiated(any()); + private void verifyChannelIsOpen() { + if (!isOpen) { + throw new IllegalStateException("channel is already closed"); } + } + + @AllArgsConstructor + public static class QueueDeclareOk extends DeclareOkAllOperationsUnsupported { + + private final String name; - ChannelFixture get() { - return channel; + @Override + public String getQueue() { + return name; } } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixtureTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixtureTest.java index c42f575d..2d823e04 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixtureTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ChannelFixtureTest.java @@ -1,24 +1,29 @@ package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; +import static org.mockito.Mockito.when; import com.rabbitmq.client.*; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; +import com.sportradar.utils.time.EpochMillis; +import com.sportradar.utils.time.TimeUtilsStub; import java.io.IOException; +import java.time.Instant; +import java.util.concurrent.TimeoutException; import org.junit.Test; -import org.mockito.exceptions.verification.TooManyActualInvocations; -import org.mockito.exceptions.verification.WantedButNotInvoked; +import org.opentest4j.AssertionFailedError; @SuppressWarnings({ "MagicNumber" }) public class ChannelFixtureTest { - private TimeUtils timeUtils = mock(TimeUtils.class); + private TimeUtils time = mock(TimeUtils.class); @Test public void shouldDeclareQueue() throws IOException { - RecoverableChannel channel = new ChannelFixture.Holder(mock(TimeUtils.class)).get(); + NoOpRecoverableChannel channel = new ChannelFixture(); assertNotNull(channel.queueDeclare()); assertNotNull(channel.queueDeclare().getQueue()); @@ -26,51 +31,63 @@ public void shouldDeclareQueue() throws IOException { @Test public void shouldSendMessage() throws IOException { - ChannelFixture channel = new ChannelFixture.Holder(mock(TimeUtils.class)).get(); - TestConsumer consumer = initiateChannel(channel); + ChannelFixture channel = new ChannelFixture(); + TestConsumer consumer = initiateChannelWithConsumer(channel); + when(time.now()).thenReturn(1664402400001L); - channel.sendMessageAt(1L); + channel.sendMessage(); assertTrue("message not processed", consumer.isProcessed); } @Test public void sendingMessageShouldUpdateTime() throws IOException { - long time = 1664402400000L; - ChannelFixture channel = new ChannelFixture.Holder(timeUtils).get(); - TestConsumer consumer = initiateChannel(channel); + long aMoment = 1664402400000L; + ChannelFixture channel = new ChannelFixture(); + TestConsumer consumer = initiateChannelWithConsumer(channel); - channel.sendMessageAt(time); + when(time.now()).thenReturn(aMoment); + channel.sendMessage(); - assertEquals("message not processed", time, consumer.currentTimeEpochMillis); + assertEquals("message not processed", aMoment, consumer.currentTimeEpochMillis); } @Test public void shouldVerifyChannelWasInitiated() throws IOException { - ChannelFixture channel = new ChannelFixture.Holder(timeUtils).get(); - initiateChannel(channel); + ChannelFixture channel = new ChannelFixture(); + initiateChannelWithConsumer(channel); - channel.verifyInitiated(times(1)); + channel.verifyInitiatedTimes(1); } - @Test(expected = WantedButNotInvoked.class) - public void shouldFailVerificationIfChannelWasNotInitiated() throws IOException { - ChannelFixture channel = new ChannelFixture.Holder(timeUtils).get(); + @Test + public void shouldFailVerificationIfChannelWasNotInitiated() { + ChannelFixture channel = new ChannelFixture(); - channel.verifyInitiated(times(1)); + assertThatThrownBy(() -> channel.verifyInitiatedTimes(1)).isInstanceOf(AssertionFailedError.class); } - @Test(expected = TooManyActualInvocations.class) - public void shouldFailVerificationIfChannelWasInitiatesMoreTimesThanExpected() throws IOException { - ChannelFixture channel = new ChannelFixture.Holder(timeUtils).get(); - initiateChannel(channel); - initiateChannel(channel); + @Test + public void shouldFailVerificationIfChannelWasInitiatesMoreTimesThanExpected() + throws IOException, TimeoutException { + ChannelFixture channel = new ChannelFixture(); + initiateChannelWithConsumer(channel); + channel.close(); + initiateChannelWithConsumer(channel); + + assertThatThrownBy(() -> channel.verifyInitiatedTimes(1)).isInstanceOf(AssertionFailedError.class); + } - channel.verifyInitiated(times(1)); + @Test + public void shouldFailToInitiateAlreadyInitiatedChannel() throws IOException, TimeoutException { + ChannelFixture channel = new ChannelFixture(); + initiateChannelWithConsumer(channel); + assertThatThrownBy(() -> initiateChannelWithConsumer(channel)) + .isInstanceOf(IllegalStateException.class); } - private TestConsumer initiateChannel(ChannelFixture channel) throws IOException { - TestConsumer consumer = new TestConsumer(channel, timeUtils); + private TestConsumer initiateChannelWithConsumer(ChannelFixture channel) throws IOException { + TestConsumer consumer = new TestConsumer(channel, time); channel.basicConsume("any", true, "any", consumer); return consumer; } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionAllOperationsUnsupported.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionAllOperationsUnsupported.java new file mode 100644 index 00000000..603925fc --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionAllOperationsUnsupported.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; + +import com.rabbitmq.client.*; +import java.io.IOException; +import java.net.InetAddress; +import java.util.Map; +import java.util.Optional; + +public class ConnectionAllOperationsUnsupported implements Connection { + + @Override + public InetAddress getAddress() { + throw new UnsupportedOperationException(); + } + + @Override + public int getPort() { + throw new UnsupportedOperationException(); + } + + @Override + public int getChannelMax() { + throw new UnsupportedOperationException(); + } + + @Override + public int getFrameMax() { + throw new UnsupportedOperationException(); + } + + @Override + public int getHeartbeat() { + throw new UnsupportedOperationException(); + } + + @Override + public Map getClientProperties() { + throw new UnsupportedOperationException(); + } + + @Override + public String getClientProvidedName() { + throw new UnsupportedOperationException(); + } + + @Override + public Map getServerProperties() { + throw new UnsupportedOperationException(); + } + + @Override + public Channel createChannel() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public Channel createChannel(int i) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public Optional openChannel() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public Optional openChannel(int channelNumber) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public void close() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public void close(int i, String s) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public void close(int i) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public void close(int i, String s, int i1) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public void abort() { + throw new UnsupportedOperationException(); + } + + @Override + public void abort(int i, String s) { + throw new UnsupportedOperationException(); + } + + @Override + public void abort(int i) { + throw new UnsupportedOperationException(); + } + + @Override + public void abort(int i, String s, int i1) { + throw new UnsupportedOperationException(); + } + + @Override + public void addBlockedListener(BlockedListener blockedListener) { + throw new UnsupportedOperationException(); + } + + @Override + public BlockedListener addBlockedListener( + BlockedCallback blockedCallback, + UnblockedCallback unblockedCallback + ) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean removeBlockedListener(BlockedListener blockedListener) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearBlockedListeners() { + throw new UnsupportedOperationException(); + } + + @Override + public ExceptionHandler getExceptionHandler() { + throw new UnsupportedOperationException(); + } + + @Override + public String getId() { + throw new UnsupportedOperationException(); + } + + @Override + public void setId(String s) { + throw new UnsupportedOperationException(); + } + + @Override + public void addShutdownListener(ShutdownListener shutdownListener) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeShutdownListener(ShutdownListener shutdownListener) { + throw new UnsupportedOperationException(); + } + + @Override + public ShutdownSignalException getCloseReason() { + throw new UnsupportedOperationException(); + } + + @Override + public void notifyListeners() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isOpen() { + throw new UnsupportedOperationException(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionToBeProvided.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionToBeProvided.java new file mode 100644 index 00000000..f748a1c4 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/ConnectionToBeProvided.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; + +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ConnectionHealth.HEALTHY; +import static java.util.Arrays.asList; + +import com.google.common.collect.Streams; +import com.rabbitmq.client.Channel; +import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Stream; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +public interface ConnectionToBeProvided { + @Getter + @AllArgsConstructor + public static class ConnectionPresent implements ConnectionToBeProvided { + + private final long createdAt; + + @Setter + private ConnectionHealth health; + + private final ConnectionCreatingChannels connection; + } + + public static class ConnectionCreatingChannels extends ConnectionAllOperationsUnsupported { + + private final Iterator iteratingAllChannelsAndRepeatingLastOne; + + private ConnectionCreatingChannels(List channels) { + Channel lastChannel = channels.get(channels.size() - 1); + iteratingAllChannelsAndRepeatingLastOne = + Streams.concat(channels.stream(), Stream.iterate(lastChannel, i -> i)).iterator(); + } + + @Override + public Channel createChannel() { + return iteratingAllChannelsAndRepeatingLastOne.next(); + } + } + + public static class ConnectionAbsent implements ConnectionToBeProvided {} + + public static enum ConnectionHealth { + UNHEALTHY_AUTO_RECOVERING, + HEALTHY, + } + + public static class Factory { + + private final TimeUtils time; + + public Factory(TimeUtils time) { + this.time = time; + } + + public ConnectionPresent whichIs(ChannelsToBeCreated toBeCreating) { + return new ConnectionPresent( + time.now(), + HEALTHY, + new ConnectionCreatingChannels(toBeCreating.channels) + ); + } + + public ConnectionPresent whichIs(ConnectionHealth health, ChannelsToBeCreated toBeCreating) { + return new ConnectionPresent( + time.now(), + health, + new ConnectionCreatingChannels(toBeCreating.channels) + ); + } + + public ConnectionAbsent absent() { + return new ConnectionAbsent(); + } + } + + @AllArgsConstructor + public static class ChannelsToBeCreated { + + private List channels; + + public static ChannelsToBeCreated creating(Channel... channels) { + return new ChannelsToBeCreated(asList(channels)); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/DeclareOkAllOperationsUnsupported.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/DeclareOkAllOperationsUnsupported.java new file mode 100644 index 00000000..50783c55 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/DeclareOkAllOperationsUnsupported.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; + +import com.rabbitmq.client.AMQP; + +public class DeclareOkAllOperationsUnsupported implements AMQP.Queue.DeclareOk { + + @Override + public String getQueue() { + throw new UnsupportedOperationException(); + } + + @Override + public int getMessageCount() { + throw new UnsupportedOperationException(); + } + + @Override + public int getConsumerCount() { + throw new UnsupportedOperationException(); + } + + @Override + public int protocolClassId() { + throw new UnsupportedOperationException(); + } + + @Override + public int protocolMethodId() { + throw new UnsupportedOperationException(); + } + + @Override + public String protocolMethodName() { + throw new UnsupportedOperationException(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillis.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillis.java deleted file mode 100644 index c944cca0..00000000 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillis.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; - -@SuppressWarnings({ "MagicNumber" }) -public class EpochMillis { - - private long epochMillis; - - public EpochMillis(long epochMillis) { - this.epochMillis = epochMillis; - } - - public long plusMinutes(int amount) { - return epochMillis + 60L * amount * 1000L; - } - - public long get() { - return epochMillis; - } - - public long minusMinutes(int amount) { - return epochMillis - 60L * amount * 1000L; - } -} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillisTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillisTest.java deleted file mode 100644 index 6c734dac..00000000 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/EpochMillisTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -@SuppressWarnings({ "MagicNumber", "StaticVariableName" }) -public class EpochMillisTest { - - private static long MIDNIGHT = 1664402400000L; - - @Test - public void shouldGetUnderlyingValue() { - assertEquals(MIDNIGHT, new EpochMillis(MIDNIGHT).get()); - } - - @Test - public void shouldAdd0Minutes() { - assertEquals(MIDNIGHT, new EpochMillis(MIDNIGHT).plusMinutes(0)); - } - - @Test - public void shouldAdd2Minutes() { - assertEquals(MIDNIGHT + 2L * 60L * 1000L, new EpochMillis(MIDNIGHT).plusMinutes(2)); - } - - @Test - public void shouldSubtract0Minutes() { - assertEquals(MIDNIGHT, new EpochMillis(MIDNIGHT).minusMinutes(0)); - } - - @Test - public void shouldSubtract2Minutes() { - assertEquals(MIDNIGHT - 2L * 60L * 1000L, new EpochMillis(MIDNIGHT).minusMinutes(2)); - } - - @Test - public void shouldBeImmutable() { - EpochMillis midnight = new EpochMillis(MIDNIGHT); - assertEquals(MIDNIGHT + 60L * 1000L, midnight.plusMinutes(1)); - assertEquals(MIDNIGHT + 60L * 1000L, midnight.plusMinutes(1)); - } -} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMock.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMock.java index 77d03ebe..faf576c7 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMock.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMock.java @@ -33,12 +33,18 @@ private void addTestLogAppender(Class target) { } public void verifyLoggedLineContaining(final String text) { + if (!loggedLineContains(text)) { + fail("Could not find log line that matches: " + text); + } + } + + public boolean loggedLineContains(String text) { for (ILoggingEvent loggingEvent : appender.list) { if (loggingEvent.getFormattedMessage().contains(text)) { - return; + return true; } } - fail("Could not find log line that matches: " + text); + return false; } public void verifyLoggedLineContainingAll(String... tokens) { diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMockTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMockTest.java index c0abd32b..5609331f 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMockTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/LogsMockTest.java @@ -3,6 +3,7 @@ */ package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import junitparams.JUnitParamsRunner; @@ -37,6 +38,7 @@ public void shouldStartCaptureLogsForGivenClass() { LoggerFactory.getLogger(TargetClass.class).info(SPECIFIED_LOG_LINE); logsMock.verifyLoggedLineContaining(SPECIFIED_LOG_LINE); + assertThat(logsMock.loggedLineContains(SPECIFIED_LOG_LINE)).isTrue(); } @Test @@ -48,10 +50,11 @@ public void shouldNotCaptureLogsForUnrelatedClass() { assertThatThrownBy(() -> logsMock.verifyLoggedLineContaining(SPECIFIED_LOG_LINE)) .isInstanceOf(AssertionError.class) .hasMessageContaining(COULD_NOT_FIND_LOG_LINE_THAT_MATCHES); + assertThat(logsMock.loggedLineContains(SPECIFIED_LOG_LINE)).isFalse(); } @Test - public void shouldFailtToValidateIfRequestedLogNotPresent() { + public void shouldFailToValidateIfRequestedLogNotPresent() { final val logsMock = LogsMock.createCapturingFor(TargetClass.class); LoggerFactory.getLogger(TargetClass.class).info(SPECIFIED_LOG_LINE); @@ -59,6 +62,7 @@ public void shouldFailtToValidateIfRequestedLogNotPresent() { assertThatThrownBy(() -> logsMock.verifyLoggedLineContaining("requestedText")) .isInstanceOf(AssertionError.class) .hasMessageContaining(COULD_NOT_FIND_LOG_LINE_THAT_MATCHES); + assertThat(logsMock.loggedLineContains("requestedText")).isFalse(); } @Test @@ -75,6 +79,7 @@ public void shouldVerifyPresenceOfLogsInQuestionInMultilineLogStream( LoggerFactory.getLogger(TargetClass.class).info(line2); logsMock.verifyLoggedLineContaining(SPECIFIED_LOG_LINE); + assertThat(logsMock.loggedLineContains(SPECIFIED_LOG_LINE)).isTrue(); } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/NoOpRecoverableChannel.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/NoOpRecoverableChannel.java new file mode 100644 index 00000000..4437b40d --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/NoOpRecoverableChannel.java @@ -0,0 +1,634 @@ +package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; + +import com.rabbitmq.client.*; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeoutException; + +@SuppressWarnings( + { "ClassFanOutComplexity", "MethodCount", "OverloadMethodsDeclarationOrder", "ParameterNumber" } +) +public class NoOpRecoverableChannel implements Channel, Recoverable { + + @Override + public int getChannelNumber() { + return 0; + } + + @Override + public Connection getConnection() { + return null; + } + + @Override + public void close() throws IOException, TimeoutException {} + + @Override + public void close(int i, String s) throws IOException, TimeoutException {} + + @Override + public void abort() throws IOException {} + + @Override + public void abort(int i, String s) throws IOException {} + + @Override + public void addReturnListener(ReturnListener returnListener) {} + + @Override + public ReturnListener addReturnListener(ReturnCallback returnCallback) { + return null; + } + + @Override + public boolean removeReturnListener(ReturnListener returnListener) { + return false; + } + + @Override + public void clearReturnListeners() {} + + @Override + public void addConfirmListener(ConfirmListener confirmListener) {} + + @Override + public ConfirmListener addConfirmListener( + ConfirmCallback confirmCallback, + ConfirmCallback confirmCallback1 + ) { + return null; + } + + @Override + public boolean removeConfirmListener(ConfirmListener confirmListener) { + return false; + } + + @Override + public void clearConfirmListeners() {} + + @Override + public Consumer getDefaultConsumer() { + return null; + } + + @Override + public void setDefaultConsumer(Consumer consumer) {} + + @Override + public void basicQos(int i, int i1, boolean b) throws IOException {} + + @Override + public void basicQos(int i, boolean b) throws IOException {} + + @Override + public void basicQos(int i) throws IOException {} + + @Override + public void basicPublish(String s, String s1, AMQP.BasicProperties basicProperties, byte[] bytes) + throws IOException {} + + @Override + public void basicPublish( + String s, + String s1, + boolean b, + AMQP.BasicProperties basicProperties, + byte[] bytes + ) throws IOException {} + + @Override + public void basicPublish( + String s, + String s1, + boolean b, + boolean b1, + AMQP.BasicProperties basicProperties, + byte[] bytes + ) throws IOException {} + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare(String s, String s1) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare(String s, BuiltinExchangeType builtinExchangeType) + throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare(String s, String s1, boolean b) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare( + String s, + BuiltinExchangeType builtinExchangeType, + boolean b + ) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare( + String s, + String s1, + boolean b, + boolean b1, + Map map + ) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare( + String s, + BuiltinExchangeType builtinExchangeType, + boolean b, + boolean b1, + Map map + ) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare( + String s, + String s1, + boolean b, + boolean b1, + boolean b2, + Map map + ) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclare( + String s, + BuiltinExchangeType builtinExchangeType, + boolean b, + boolean b1, + boolean b2, + Map map + ) throws IOException { + return null; + } + + @Override + public void exchangeDeclareNoWait( + String s, + String s1, + boolean b, + boolean b1, + boolean b2, + Map map + ) throws IOException {} + + @Override + public void exchangeDeclareNoWait( + String s, + BuiltinExchangeType builtinExchangeType, + boolean b, + boolean b1, + boolean b2, + Map map + ) throws IOException {} + + @Override + public AMQP.Exchange.DeclareOk exchangeDeclarePassive(String s) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.DeleteOk exchangeDelete(String s, boolean b) throws IOException { + return null; + } + + @Override + public void exchangeDeleteNoWait(String s, boolean b) throws IOException {} + + @Override + public AMQP.Exchange.DeleteOk exchangeDelete(String s) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.BindOk exchangeBind(String s, String s1, String s2) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.BindOk exchangeBind(String s, String s1, String s2, Map map) + throws IOException { + return null; + } + + @Override + public void exchangeBindNoWait(String s, String s1, String s2, Map map) + throws IOException {} + + @Override + public AMQP.Exchange.UnbindOk exchangeUnbind(String s, String s1, String s2) throws IOException { + return null; + } + + @Override + public AMQP.Exchange.UnbindOk exchangeUnbind(String s, String s1, String s2, Map map) + throws IOException { + return null; + } + + @Override + public void exchangeUnbindNoWait(String s, String s1, String s2, Map map) + throws IOException {} + + @Override + public AMQP.Queue.DeclareOk queueDeclare() throws IOException { + return null; + } + + @Override + public AMQP.Queue.DeclareOk queueDeclare( + String s, + boolean b, + boolean b1, + boolean b2, + Map map + ) throws IOException { + return null; + } + + @Override + public void queueDeclareNoWait(String s, boolean b, boolean b1, boolean b2, Map map) + throws IOException {} + + @Override + public AMQP.Queue.DeclareOk queueDeclarePassive(String s) throws IOException { + return null; + } + + @Override + public AMQP.Queue.DeleteOk queueDelete(String s) throws IOException { + return null; + } + + @Override + public AMQP.Queue.DeleteOk queueDelete(String s, boolean b, boolean b1) throws IOException { + return null; + } + + @Override + public void queueDeleteNoWait(String s, boolean b, boolean b1) throws IOException {} + + @Override + public AMQP.Queue.BindOk queueBind(String s, String s1, String s2) throws IOException { + return null; + } + + @Override + public AMQP.Queue.BindOk queueBind(String s, String s1, String s2, Map map) + throws IOException { + return null; + } + + @Override + public void queueBindNoWait(String s, String s1, String s2, Map map) throws IOException {} + + @Override + public AMQP.Queue.UnbindOk queueUnbind(String s, String s1, String s2) throws IOException { + return null; + } + + @Override + public AMQP.Queue.UnbindOk queueUnbind(String s, String s1, String s2, Map map) + throws IOException { + return null; + } + + @Override + public AMQP.Queue.PurgeOk queuePurge(String s) throws IOException { + return null; + } + + @Override + public GetResponse basicGet(String s, boolean b) throws IOException { + return null; + } + + @Override + public void basicAck(long l, boolean b) throws IOException {} + + @Override + public void basicNack(long l, boolean b, boolean b1) throws IOException {} + + @Override + public void basicReject(long l, boolean b) throws IOException {} + + @Override + public String basicConsume(String s, Consumer consumer) throws IOException { + return null; + } + + @Override + public String basicConsume(String s, DeliverCallback deliverCallback, CancelCallback cancelCallback) + throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + DeliverCallback deliverCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + DeliverCallback deliverCallback, + CancelCallback cancelCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume(String s, boolean b, Consumer consumer) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + DeliverCallback deliverCallback, + CancelCallback cancelCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + DeliverCallback deliverCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + DeliverCallback deliverCallback, + CancelCallback cancelCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume(String s, boolean b, Map map, Consumer consumer) + throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + Map map, + DeliverCallback deliverCallback, + CancelCallback cancelCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + Map map, + DeliverCallback deliverCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + Map map, + DeliverCallback deliverCallback, + CancelCallback cancelCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume(String s, boolean b, String s1, Consumer consumer) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + String s1, + DeliverCallback deliverCallback, + CancelCallback cancelCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + String s1, + DeliverCallback deliverCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + String s1, + DeliverCallback deliverCallback, + CancelCallback cancelCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + String s1, + boolean b1, + boolean b2, + Map map, + Consumer consumer + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + String s1, + boolean b1, + boolean b2, + Map map, + DeliverCallback deliverCallback, + CancelCallback cancelCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + String s1, + boolean b1, + boolean b2, + Map map, + DeliverCallback deliverCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public String basicConsume( + String s, + boolean b, + String s1, + boolean b1, + boolean b2, + Map map, + DeliverCallback deliverCallback, + CancelCallback cancelCallback, + ConsumerShutdownSignalCallback consumerShutdownSignalCallback + ) throws IOException { + return null; + } + + @Override + public void basicCancel(String s) throws IOException {} + + @Override + public AMQP.Basic.RecoverOk basicRecover() throws IOException { + return null; + } + + @Override + public AMQP.Basic.RecoverOk basicRecover(boolean b) throws IOException { + return null; + } + + @Override + public AMQP.Tx.SelectOk txSelect() throws IOException { + return null; + } + + @Override + public AMQP.Tx.CommitOk txCommit() throws IOException { + return null; + } + + @Override + public AMQP.Tx.RollbackOk txRollback() throws IOException { + return null; + } + + @Override + public AMQP.Confirm.SelectOk confirmSelect() throws IOException { + return null; + } + + @Override + public long getNextPublishSeqNo() { + return 0; + } + + @Override + public boolean waitForConfirms() throws InterruptedException { + return false; + } + + @Override + public boolean waitForConfirms(long l) throws InterruptedException, TimeoutException { + return false; + } + + @Override + public void waitForConfirmsOrDie() throws IOException, InterruptedException {} + + @Override + public void waitForConfirmsOrDie(long l) throws IOException, InterruptedException, TimeoutException {} + + @Override + public void asyncRpc(Method method) throws IOException {} + + @Override + public Command rpc(Method method) throws IOException { + return null; + } + + @Override + public long messageCount(String s) throws IOException { + return 0; + } + + @Override + public long consumerCount(String s) throws IOException { + return 0; + } + + @Override + public CompletableFuture asyncCompletableRpc(Method method) throws IOException { + return null; + } + + @Override + public void addRecoveryListener(RecoveryListener recoveryListener) {} + + @Override + public void removeRecoveryListener(RecoveryListener recoveryListener) {} + + @Override + public void addShutdownListener(ShutdownListener shutdownListener) {} + + @Override + public void removeShutdownListener(ShutdownListener shutdownListener) {} + + @Override + public ShutdownSignalException getCloseReason() { + return null; + } + + @Override + public void notifyListeners() {} + + @Override + public boolean isOpen() { + return false; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImplTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImplTest.java index beb2c3d9..842a0922 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImplTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelImplTest.java @@ -3,7 +3,14 @@ */ package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; -import static org.junit.Assert.assertFalse; +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.AmqpConnectionFactoryFake.initiallyProvides; +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ChannelsToBeCreated.creating; +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ConnectionHealth.HEALTHY; +import static com.sportradar.unifiedodds.sdk.impl.rabbitconnection.ConnectionToBeProvided.ConnectionHealth.UNHEALTHY_AUTO_RECOVERING; +import static com.sportradar.utils.thread.sleep.SleepMock.onSleepDo; +import static com.sportradar.utils.time.TimeInterval.minutes; +import static com.sportradar.utils.time.TimeInterval.seconds; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; @@ -11,392 +18,515 @@ import ch.qos.logback.core.read.ListAppender; import com.rabbitmq.client.*; import com.sportradar.unifiedodds.sdk.impl.ChannelMessageConsumer; +import com.sportradar.unifiedodds.sdk.impl.MessageConsumer; import com.sportradar.unifiedodds.sdk.impl.RabbitMqSystemListener; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; import com.sportradar.unifiedodds.sdk.impl.apireaders.WhoAmIReader; +import com.sportradar.unifiedodds.sdk.impl.rabbitconnection.RabbitMqChannelSupervisors.Builder; +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; +import com.sportradar.utils.thread.sleep.Sleep; +import com.sportradar.utils.time.EpochMillis; +import com.sportradar.utils.time.TimeInterval; +import com.sportradar.utils.time.TimeUtilsStub; import java.io.IOException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; -import java.util.Arrays; +import java.time.Instant; import java.util.concurrent.TimeoutException; +import lombok.val; import org.junit.Before; import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@SuppressWarnings({ "ClassFanOutComplexity", "HiddenField" }) +@RunWith(Enclosed.class) +@SuppressWarnings({ "ClassFanOutComplexity", "HiddenField", "VariableDeclarationUsageDistance" }) public class RabbitMqChannelImplTest { private static final long MIDNIGHT_TIMESTAMP_MILLIS = 1664402400000L; - private static final String ANY = "any"; private static final EpochMillis MIDNIGHT = new EpochMillis(MIDNIGHT_TIMESTAMP_MILLIS); - private Logger logger; - private ListAppender appender; - private TimeUtils timeUtils = mock(TimeUtils.class); + public static class OnInitiation { + + private final TimeUtilsStub time = TimeUtilsStub + .threadSafe(new AtomicActionPerformer()) + .withCurrentTime(Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS)); + private final ChannelFixture channel = new ChannelFixture(); + private final Channel anyChannel = new NoOpRecoverableChannel(); + + private final ConnectionToBeProvided.Factory connection = new ConnectionToBeProvided.Factory(time); + + @Test(expected = NullPointerException.class) + public void shouldNotBeInstantiatedWithNullTimeUtils() { + new RabbitMqChannelImpl( + mock(RabbitMqSystemListener.class), + mock(WhoAmIReader.class), + "anyVersion", + mock(AmqpConnectionFactory.class), + null, + mock(Sleep.class) + ); + } - private ChannelFixture channel = new ChannelFixture.Holder(timeUtils).get(); + @Test(expected = NullPointerException.class) + public void shouldNotBeInstantiatedWithNullSleep() { + new RabbitMqChannelImpl( + mock(RabbitMqSystemListener.class), + mock(WhoAmIReader.class), + "anyVersion", + mock(AmqpConnectionFactory.class), + mock(TimeUtils.class), + null + ); + } - public RabbitMqChannelImplTest() throws IOException {} + @Test + public void rabbitMqChannelShouldBeCreatedOnOpeningSupervisor() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + new RabbitMqChannelSupervisors.Builder().with(connectionFactory).opened(); - @Before - public void setup() throws Exception { - // Sort out logging interception - logger = LoggerFactory.getLogger(RabbitMqChannelImpl.class); - ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) logger; - appender = new ListAppender(); - logbackLogger.addAppender(appender); - appender.start(); - } + channel.verifyInitiatedTimes(1); + } - @Test(expected = NullPointerException.class) - public void shouldNotBeInstantiatedWithNullTimeUtils() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - "anyVersion", - mock(AmqpConnectionFactory.class), - null - ); + @Test + public void rabbitMqChannelShouldNotBeCreatedIfConnectionWasUnavailableWhenOpeningSupervisor() + throws IOException { + new RabbitMqChannelSupervisors.Builder().with(mock(AmqpConnectionFactory.class)).opened(); + //ensuring no exception is thrown + } } - @Test - public void rabbitMqChannelShouldBeCreatedOnOpeningSupervisor() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - mock(TimeUtils.class) - ); - - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - - channel.verifyInitiated(times(1)); - } + public static class OnInspection { - @Test - public void rabbitMqChannelShouldNotBeCreatedIfConnectionWasUnavailableWhenOpeningSupervisor() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - AmqpConnectionFactory connectionFactory = mock(AmqpConnectionFactory.class); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - mock(TimeUtils.class) - ); - - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - //ensuring no exception is thrown - } + public static final TimeInterval IDLE_INTERVAL = minutes(3); + public static final TimeInterval LESS_THAN_IDLE_INTERVAL = IDLE_INTERVAL.minus(seconds(1)); + private ListAppender appender; - @Test - public void rabbitMqChannelShouldBeCreatedOnInspectionIfChannelIsNotYetCreated() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = mock(AmqpConnectionFactory.class); - when(connectionFactory.getConnection()).thenReturn(null, connection); - when(connectionFactory.canConnectionOpen()).thenReturn(true); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - mock(TimeUtils.class) - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - - supervisor.checkStatus(); - - channel.verifyInitiated(times(1)); - } + private final TimeUtilsStub time = TimeUtilsStub + .threadSafe(new AtomicActionPerformer()) + .withCurrentTime(Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS)); - @Test - public void rabbitMqChannelShouldNotBeCreatedOnInspectionIfChannelIsAlreadyCreated() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - - supervisor.checkStatus(); - - channel.verifyInitiated(times(1)); - } + private final ChannelFixture channel = new ChannelFixture(); - @Test - public void rabbitMqChannelShouldNotBeRestartedOnInspectionIfItIsNotUsingStaleConnection() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - - supervisor.checkStatus(); - - channel.verifyInitiated(times(1)); - } + private final ConnectionToBeProvided.Factory connection = new ConnectionToBeProvided.Factory(time); - @Test - public void rabbitMqChannelShouldBeRestartedOnInspectionIfItIsUsingStaleConnection() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - when(timeUtils.now()).thenReturn(MIDNIGHT.minusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - - supervisor.checkStatus(); - - channel.verifyInitiated(times(2)); - } + @Before + public void setup() throws Exception { + // Sort out logging interception + Logger logger = LoggerFactory.getLogger(RabbitMqChannelImpl.class); + ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) logger; + appender = new ListAppender<>(); + logbackLogger.addAppender(appender); + appender.start(); + } - @Test - @SuppressWarnings("MagicNumber") - public void rabbitMqChannelShouldBeRestartedOnInspectionIfItHasNeverEverReceivedAnyMessageAndIsIdleFor3minutes() - throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - long pastMidnight1Minute = MIDNIGHT.plusMinutes(1); - long pastMidnight4Minutes = MIDNIGHT.plusMinutes(4); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - when(timeUtils.now()).thenReturn(pastMidnight1Minute, pastMidnight4Minutes); - - supervisor.checkStatus(); - - channel.verifyInitiated(times(2)); - } + @Test + public void createsChannelIfIsNotCreatedYet() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + Connection connection = mock(Connection.class); + when(connection.createChannel()).thenReturn(channel); + AmqpConnectionFactory connectionFactory = mock(AmqpConnectionFactory.class); + when(connectionFactory.getConnection()).thenReturn(null, connection); + when(connectionFactory.canConnectionOpen()).thenReturn(true); + val channelSupervisor = new Builder().with(connectionFactory).opened(); - @Test - @SuppressWarnings("MagicNumber") - public void shouldBeRestartedOnInspectionIfItHasEverReceivedSomeMessageButIsIdleFor3minutesAndConnectionIsClosed() - throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - anotherChannelCloses(connectionFactory); - channel.sendMessageAt(MIDNIGHT.plusMinutes(4)); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(7)); - - supervisor.checkStatus(); - - channel.verifyInitiated(times(2)); - } + channelSupervisor.checkStatus(); - private static void anotherChannelCloses(AmqpConnectionFactory connectionFactory) throws IOException { - connectionFactory.close(false); - } + channel.verifyInitiatedTimes(1); + } - @Test - @SuppressWarnings("MagicNumber") - public void shouldBeRestartedOnInspectionIfItHasEverReceivedSomeMessageButIsIdleFor3minutesAndConnectionIsOpen() - throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - channel.sendMessageAt(MIDNIGHT.plusMinutes(4)); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(7)); - - supervisor.checkStatus(); - - channel.verifyInitiated(times(2)); - } + @Test + public void doesNotRecreateChannelOnEachInspection() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); - @Test - @SuppressWarnings("MagicNumber") - public void shouldCloseConnectionOnInspectionIfItHasEverReceivedSomeMessageButIsIdleFor3minutesAndConnectionIsOpen() - throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - channel.sendMessageAt(MIDNIGHT.plusMinutes(4)); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(7)); - - supervisor.checkStatus(); - - assertFalse("connection should have been closed", connectionFactory.isConnectionOpen()); - } + channelSupervisor.checkStatus(); + channelSupervisor.checkStatus(); - @Test - @SuppressWarnings("MagicNumber") - public void shouldNotCloseAlreadyClosedConnectionOnInspectionIfItHasEverReceivedSomeMessageButIsIdleFor3minutes() - throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs.holdingConnectionCreatedAt( - MIDNIGHT.get(), - connection - ); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - channel.sendMessageAt(MIDNIGHT.plusMinutes(4)); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(7)); - - supervisor.checkStatus(); - - assertFalse("connection should have been closed", connectionFactory.isConnectionOpen()); - assertDoesNotContainLogLine("Error closing connection:"); - } + channel.verifyInitiatedTimes(1); + } - @Test - @SuppressWarnings("MagicNumber") - public void connectionClosureDueToIoExceptionShouldBeLogged() throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs - .holdingConnectionCreatedAt(MIDNIGHT.get(), connection) - .onCloseThrowing(new IOException()); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - channel.sendMessageAt(MIDNIGHT.plusMinutes(4)); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(7)); - - supervisor.checkStatus(); - - assertContainsLogLine("Error closing connection:"); - } + @Test + public void doesNotRestartChannelIfItIsNotUsingStaleConnection() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); - @Test - @SuppressWarnings("MagicNumber") - public void connectionClosureDueToRuntimeExceptionShouldBeLogged() throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - AmqpConnectionFactory connectionFactory = AmqpConnectionFactoryStubs - .holdingConnectionCreatedAt(MIDNIGHT.get(), connection) - .onCloseThrowing(new IllegalArgumentException()); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(1)); - OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( - mock(RabbitMqSystemListener.class), - mock(WhoAmIReader.class), - ANY, - connectionFactory, - timeUtils - ); - supervisor.open(Arrays.asList(ANY), mock(ChannelMessageConsumer.class), ANY); - channel.sendMessageAt(MIDNIGHT.plusMinutes(4)); - when(timeUtils.now()).thenReturn(MIDNIGHT.plusMinutes(7)); - - supervisor.checkStatus(); - - assertContainsLogLine("Error closing connection:"); - } + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(1); + } + + @Test + public void restartsChannelIfItIsUsingStaleConnection() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + time.tick(); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + anotherChannelSupervisorRestartsConnection(connectionFactory); + + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(2); + channel.verifyClosedTimes(1); + } + + @Test + public void channelReceivesMessage() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + val consumer = new CountingMessagesConsumer(); + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(consumer).with(connectionFactory).with(time).opened(); + time.tick(); + + channel.sendMessage(); + + consumer.verifyMessagesReceived(1); + } + + @Test + public void discardsMessagesReceivedFromChannelClosedDueToOperatingOnStaleConnection() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + val channelToBeClosed = new ChannelFixture(); + val consumer = new CountingMessagesConsumer(); + val connectionFactory = initiallyProvides(connection.whichIs(creating(channelToBeClosed))); + time.tick(); + val channelSupervisor = new Builder().with(consumer).with(connectionFactory).with(time).opened(); + time.tick(); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + anotherChannelSupervisorRestartsConnection(connectionFactory); + + channelSupervisor.checkStatus(); + channelToBeClosed.sendMessage(); + + consumer.verifyNoMessagesReceived(); + } + + private static void anotherChannelSupervisorRestartsConnection( + AmqpConnectionFactoryFake connectionFactory + ) throws IOException, TimeoutException, NoSuchAlgorithmException, KeyManagementException { + connectionFactory.close(false); + connectionFactory.getConnection(); + } + + @Test + @SuppressWarnings("MagicNumber") + public void restartsChannelIfItHasNeverReceivedAnyMessagesAndIsIdleFor3minutes() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + time.tick(IDLE_INTERVAL); + + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(2); + } + + @Test + @SuppressWarnings("MagicNumber") + public void messagesReceivedFromClosedChannelsDoesNotResetCountingTowards3minutesThresholdOfIdleness() + throws IOException, NoSuchAlgorithmException, KeyManagementException, TimeoutException { + ChannelFixture channelToBeClosed = new ChannelFixture(); + val connectionFactory = initiallyProvides(connection.whichIs(creating(channelToBeClosed))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + time.tick(); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + anotherChannelSupervisorRestartsConnection(connectionFactory); + + channelSupervisor.checkStatus(); + + time.tick(IDLE_INTERVAL.minus(seconds(5))); + channelToBeClosed.sendMessage(); + + time.tick(seconds(5)); + channelSupervisor.checkStatus(); + + channel.verifyClosedTimes(1); + } + + @Test + @SuppressWarnings("MagicNumber") + public void notRestartsChannelIfItHasNeverReceivedAnyMessagesAndIsIdleForLessThan3minutes() + throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + time.tick(LESS_THAN_IDLE_INTERVAL); - private void assertContainsLogLine(final String text) { - for (ILoggingEvent loggingEvent : appender.list) { - if (loggingEvent.getFormattedMessage().contains(text)) { - return; + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(1); + } + + @Test + @SuppressWarnings("MagicNumber") + public void notRestartsChannelWhichHasEverReceivedMessagesButIsIdleFor3minutesIfConnectionIsAutoRecovering() + throws IOException { + val connectionFactory = initiallyProvides( + connection.whichIs(UNHEALTHY_AUTO_RECOVERING, creating(channel)) + ); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(1); + channel.verifyClosedTimes(0); + } + + @Test + @SuppressWarnings("MagicNumber") + public void restartsChannelAlongWithConnectionIfChannelHasEverReceivedAnyMessagesButIsIdleFor3minutes() + throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(seconds(1)); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(2); + assertThat(connectionFactory.getConnectionStarted()) + .isEqualTo(MIDNIGHT.plus(IDLE_INTERVAL.plus(seconds(1))).get()); + } + + @Test + @SuppressWarnings("MagicNumber") + public void notRestartsNeitherChannelNorConnectionIfChannelHasEverReceivedMessagesButIsIdleForLessThan3minutes() + throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(LESS_THAN_IDLE_INTERVAL); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(1); + assertThat(connectionFactory.getConnectionStarted()).isEqualTo(MIDNIGHT.get()); + } + + @Test + @SuppressWarnings("MagicNumber") + public void leavesSomeTimeGapBetweenRestartingConnectionAndRestartingChannel() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + Sleep sleep = onSleepDo(() -> { + assertThat(connectionFactory.hasConnection()).isFalse(); + assertThat(channel.isOpen()).isFalse(); + }); + val channelSupervisor = new Builder().with(connectionFactory).with(time).with(sleep).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + + channelSupervisor.checkStatus(); + + verify(sleep).millis(5000); + } + + @Test + @SuppressWarnings("MagicNumber") + public void idleFor3MinutesChannelWhichHasEverReceivedAnyMessagesCausesHealthyConnectionToBeRestarted() + throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + + channelSupervisor.checkStatus(); + + assertThat(connectionFactory.hasConnection()).isFalse(); + } + + @Test + @SuppressWarnings("MagicNumber") + public void leaveUnhealthyConnectionToAutoRecoverIfChannelHasEverReceivedAnyMessagesButIsIdleFor3minutes() + throws IOException { + val connectionFactory = initiallyProvides( + connection.whichIs(UNHEALTHY_AUTO_RECOVERING, creating(channel)) + ); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + + channelSupervisor.checkStatus(); + + assertThat(connectionFactory.hasConnection()).isTrue(); + assertThat(connectionFactory.isConnectionHealthy()).isFalse(); + } + + @Test + @SuppressWarnings("MagicNumber") + public void restartsConnectionIfItBecomesHealthyWhenChannelHasEverReceivedAnyMessagesButIsIdleOver3minutes() + throws IOException { + val connection = this.connection.whichIs(UNHEALTHY_AUTO_RECOVERING, creating(channel)); + val connectionFactory = initiallyProvides(connection); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + channelSupervisor.checkStatus(); + + connection.setHealth(HEALTHY); + channelSupervisor.checkStatus(); + + assertThat(connectionFactory.hasConnection()).isFalse(); + } + + @Test + @SuppressWarnings("MagicNumber") + public void notClosesAlreadyClosedConnectionIfChannelHasEverReceivedAnyMessagesButIsIdleFor3minutes() + throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + connectionFactory.close(false); + + channelSupervisor.checkStatus(); + + connectionFactory.assertThatAlreadyClosedConnectionWasNotClosedAgain(); + } + + @Test + @SuppressWarnings("MagicNumber") + public void afterRestartingConnectionNotEntersIntoConnectionRestartingLoop() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(seconds(1)); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + + channelSupervisor.checkStatus(); + channelSupervisor.checkStatus(); + + assertThat(connectionFactory.hasConnection()).isTrue(); + assertThat(connectionFactory.getConnectionStarted()) + .isEqualTo(MIDNIGHT.plus(IDLE_INTERVAL.plus(seconds(1))).get()); + } + + @Test + @SuppressWarnings("MagicNumber") + public void afterRestartingConnectionAlongWithChannelNotEnterIntoChannelRestartingLoop() + throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + + channelSupervisor.checkStatus(); + channelSupervisor.checkStatus(); + + channel.verifyInitiatedTimes(2); + channel.verifyClosedTimes(1); + } + + @Test + @SuppressWarnings("MagicNumber") + public void connectionIsRestartedAgainIfTheUnfavourableScenarioHappensInSubsequent3Minutes() + throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + connectionFactory.afterClosingStarts(connection.whichIs(creating(channel))); + channelSupervisor.checkStatus(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + connectionFactory.afterClosingStarts(connection.absent()); + + channelSupervisor.checkStatus(); + + assertThat(connectionFactory.hasConnection()).isFalse(); + } + + @Test + @SuppressWarnings("MagicNumber") + public void connectionClosureDueToIoExceptionShouldBeLogged() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))) + .onCloseThrowing(new IOException()); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + + channelSupervisor.checkStatus(); + + assertContainsLogLine("Error closing connection:"); + } + + @Test + @SuppressWarnings("MagicNumber") + public void connectionClosureDueToRuntimeExceptionShouldBeLogged() throws IOException { + val connectionFactory = initiallyProvides(connection.whichIs(creating(channel))) + .onCloseThrowing(new IllegalArgumentException()); + time.tick(); + val channelSupervisor = new Builder().with(connectionFactory).with(time).opened(); + channel.sendMessage(); + time.tick(IDLE_INTERVAL); + + channelSupervisor.checkStatus(); + + assertContainsLogLine("Error closing connection:"); + } + + private void assertContainsLogLine(final String text) { + for (ILoggingEvent loggingEvent : appender.list) { + if (loggingEvent.getFormattedMessage().contains(text)) { + return; + } } + fail("Could not find log line that matches: " + text); } - fail("Could not find log line that matches: " + text); - } - private void assertDoesNotContainLogLine(final String text) { - for (ILoggingEvent loggingEvent : appender.list) { - if (loggingEvent.getFormattedMessage().contains(text)) { - fail("Found log line that matches: " + text); + public static class CountingMessagesConsumer implements ChannelMessageConsumer { + + private int count; + + @Override + public void open(MessageConsumer messageConsumer) {} + + @Override + public void onMessageReceived( + String routingKey, + byte[] body, + AMQP.BasicProperties properties, + long receivedAt + ) { + count++; + } + + @Override + public String getConsumerDescription() { + return null; + } + + public void verifyNoMessagesReceived() { + assertThat(count).isZero(); + } + + public void verifyMessagesReceived(int expectedMessageCount) { + assertThat(count).isEqualTo(expectedMessageCount); } } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelSupervisors.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelSupervisors.java new file mode 100644 index 00000000..285d939a --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RabbitMqChannelSupervisors.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; + +import static org.mockito.Mockito.mock; + +import com.sportradar.unifiedodds.sdk.impl.ChannelMessageConsumer; +import com.sportradar.unifiedodds.sdk.impl.RabbitMqSystemListener; +import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import com.sportradar.unifiedodds.sdk.impl.apireaders.WhoAmIReader; +import com.sportradar.utils.thread.sleep.Sleep; +import java.io.IOException; +import java.util.Arrays; +import java.util.Optional; +import lombok.NoArgsConstructor; + +public class RabbitMqChannelSupervisors { + + @NoArgsConstructor + public static class Builder { + + private static final String ANY = "any"; + + private Optional connectionFactory = Optional.empty(); + private Optional timeUtils = Optional.empty(); + private Optional sleep = Optional.empty(); + private Optional messageConsumer = Optional.empty(); + + @SuppressWarnings("HiddenField") + public Builder with(AmqpConnectionFactory connectionFactory) { + this.connectionFactory = Optional.of(connectionFactory); + return this; + } + + @SuppressWarnings("HiddenField") + public Builder with(TimeUtils timeUtils) { + this.timeUtils = Optional.of(timeUtils); + return this; + } + + @SuppressWarnings("HiddenField") + public Builder with(Sleep sleep) { + this.sleep = Optional.of(sleep); + return this; + } + + @SuppressWarnings("HiddenField") + public Builder with(ChannelMessageConsumer messageConsumer) { + this.messageConsumer = Optional.of(messageConsumer); + return this; + } + + public OnDemandChannelSupervisor opened() throws IOException { + OnDemandChannelSupervisor supervisor = new RabbitMqChannelImpl( + any(RabbitMqSystemListener.class), + any(WhoAmIReader.class), + ANY, + connectionFactory.orElse(any(AmqpConnectionFactory.class)), + timeUtils.orElse(any(TimeUtils.class)), + sleep.orElse(any(Sleep.class)) + ); + supervisor.open( + Arrays.asList(ANY), + messageConsumer.orElse(any(ChannelMessageConsumer.class)), + ANY + ); + return supervisor; + } + + private T any(Class clazz) { + return mock(clazz); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RecoverableChannel.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RecoverableChannel.java deleted file mode 100644 index 99b88f7c..00000000 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/RecoverableChannel.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; - -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Recoverable; - -public interface RecoverableChannel extends Channel, Recoverable {} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceRabbitConnectionFactoryTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceRabbitConnectionFactoryTest.java index 14eca1f5..4a2f6734 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceRabbitConnectionFactoryTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/rabbitconnection/SingleInstanceRabbitConnectionFactoryTest.java @@ -3,6 +3,7 @@ */ package com.sportradar.unifiedodds.sdk.impl.rabbitconnection; +import static com.sportradar.utils.time.TimeInterval.minutes; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @@ -13,6 +14,7 @@ import com.sportradar.unifiedodds.sdk.SdkInternalConfiguration; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; import com.sportradar.unifiedodds.sdk.impl.apireaders.WhoAmIReader; +import com.sportradar.utils.time.EpochMillis; import java.io.IOException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; @@ -120,7 +122,7 @@ public void shouldNotInstantiateWithoutTimeUtils() throws NoSuchAlgorithmExcepti @Test public void initiallyNoConnectionShouldBeCreated() { - assertFalse(factory.isConnectionOpen()); + assertFalse(factory.isConnectionHealthy()); assertEquals(0, factory.getConnectionStarted()); assertTrue(factory.canConnectionOpen()); } @@ -130,7 +132,7 @@ public void closingFactoryBeforeFirstConnectionIsCreatedAndIndicatingFeedIsStill throws IOException { factory.close(false); - assertFalse(factory.isConnectionOpen()); + assertFalse(factory.isConnectionHealthy()); assertEquals(0, factory.getConnectionStarted()); assertTrue(factory.canConnectionOpen()); } @@ -140,7 +142,7 @@ public void shouldBeClosableAlongWithFeedClosureEvenBeforeBeforeFirstConnectionI throws IOException { factory.close(true); - assertFalse(factory.isConnectionOpen()); + assertFalse(factory.isConnectionHealthy()); assertEquals(0, factory.getConnectionStarted()); assertFalse(factory.canConnectionOpen()); } @@ -162,7 +164,7 @@ public void shouldCreateConnectionOnInitialRetrieval() throws Exception { Connection connection = at(NOON.get(), () -> factory.getConnection()); assertNotNull(CONNECTION_WAS_NULL, connection); - assertTrue("connection should be open", factory.isConnectionOpen()); + assertTrue("connection should be open", factory.isConnectionHealthy()); assertEquals(NOON.get(), factory.getConnectionStarted()); assertTrue(CONNECTION_SHOULD_BE_ABLE_TO_OPEN, factory.canConnectionOpen()); } @@ -172,7 +174,7 @@ public void shouldNotCreateConnectionIfConnectionHasAlreadyBeenCreated() throws when(rabbitConnectionFactory.newConnection(any(ExecutorService.class))).thenReturn(openConnection); at(NOON.get(), () -> factory.getConnection()); - Connection connection = at(NOON.plusMinutes(1), () -> factory.getConnection()); + Connection connection = at(NOON.plus(minutes(1)).get(), () -> factory.getConnection()); assertNotNull(CONNECTION_WAS_NULL, connection); assertEquals(NOON.get(), factory.getConnectionStarted()); @@ -186,7 +188,7 @@ public void connectionShouldBeClosedAfterClosingTheFactoryIndicatingFeedIsStillO at(NOON.get(), () -> factory.getConnection()); factory.close(false); - assertFalse("connection should be closed", factory.isConnectionOpen()); + assertFalse("connection should be closed", factory.isConnectionHealthy()); assertEquals(NO_CONNECTION_TIMESTAMP, factory.getConnectionStarted()); assertTrue(CONNECTION_SHOULD_BE_ABLE_TO_OPEN, factory.canConnectionOpen()); } @@ -199,7 +201,7 @@ public void connectionShouldBeClosedAfterClosingTheFactoryIndicatingFeedIsClosed at(NOON.get(), () -> factory.getConnection()); factory.close(true); - assertFalse("connection should be closed", factory.isConnectionOpen()); + assertFalse("connection should be closed", factory.isConnectionHealthy()); assertEquals(NO_CONNECTION_TIMESTAMP, factory.getConnectionStarted()); assertFalse("connection should not be able to open", factory.canConnectionOpen()); } @@ -226,11 +228,11 @@ public void shouldCreateConnectionAfterClosingFactory() throws Exception { at(NOON.get(), () -> factory.getConnection()); factory.close(false); - Connection connection = at(NOON.plusMinutes(1), () -> factory.getConnection()); + Connection connection = at(NOON.plus(minutes(1)).get(), () -> factory.getConnection()); assertNotNull(CONNECTION_WAS_NULL, connection); - assertTrue("connection should be open", factory.isConnectionOpen()); - assertEquals(NOON.plusMinutes(1), factory.getConnectionStarted()); + assertTrue("connection should be open", factory.isConnectionHealthy()); + assertEquals(NOON.plus(minutes(1)).get(), factory.getConnectionStarted()); assertTrue(CONNECTION_SHOULD_BE_ABLE_TO_OPEN, factory.canConnectionOpen()); } @@ -241,7 +243,7 @@ public void connectionShouldNotBeOpenIfItWasShutDownByRabbitMqUnderTheHoods() th at(NOON.get(), () -> factory.getConnection()); openConnection.getControlApi().closeInitiatedByRabbitMq(); - assertFalse("connection was open", factory.isConnectionOpen()); + assertFalse("connection was open", factory.isConnectionHealthy()); } @Test @@ -250,7 +252,7 @@ public void shouldNotCreateConnectionAfterClosingFactoryAlongWithClosingTheFeed( at(NOON.get(), () -> factory.getConnection()); factory.close(true); - Connection connection = at(NOON.plusMinutes(1), () -> factory.getConnection()); + Connection connection = at(NOON.plus(minutes(1)).get(), () -> factory.getConnection()); assertNull("connection was not null", connection); } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/SingleRecoveryManagerSupervisorTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/SingleRecoveryManagerSupervisorTest.java index 10bddb75..b5a1cbbd 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/SingleRecoveryManagerSupervisorTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/SingleRecoveryManagerSupervisorTest.java @@ -18,6 +18,7 @@ import com.sportradar.unifiedodds.sdk.impl.apireaders.HttpHelper; import com.sportradar.unifiedodds.sdk.impl.apireaders.WhoAmIReader; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; +import com.sportradar.utils.time.TimeUtilsStub; import java.time.Instant; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/ProxiedRabbit.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/ProxiedRabbit.java new file mode 100644 index 00000000..af9553d1 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/ProxiedRabbit.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.integrationtest.externalrabbit; + +import static com.sportradar.unifiedodds.sdk.impl.Constants.*; +import static com.sportradar.unifiedodds.sdk.integrationtest.externalrabbit.ProxiedRabbit.Action.DISABLE; +import static com.sportradar.unifiedodds.sdk.integrationtest.externalrabbit.ProxiedRabbit.Action.ENABLE; +import static java.lang.String.format; + +import eu.rekawek.toxiproxy.Proxy; +import eu.rekawek.toxiproxy.ToxiproxyClient; +import java.io.IOException; +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.http.io.entity.StringEntity; + +public class ProxiedRabbit implements AutoCloseable { + + private final Proxy proxy; + + public ProxiedRabbit(String listenOn, String upstream) throws IOException { + ToxiproxyClient client = new ToxiproxyClient( + TOXIPROXY_BASE_URL.getHost(), + TOXIPROXY_BASE_URL.getPort() + ); + proxy = client.createProxy("rabbit", listenOn, upstream); + } + + public static ProxiedRabbit proxyRabbit() throws IOException { + return new ProxiedRabbit( + "0.0.0.0:" + PROXIED_RABBIT_PORT, + RABBIT_BASE_URL_WITHIN_DOCKER_NETWORK.get() + ); + } + + public void enable() throws IOException { + proxy.enable(); + } + + public void disable() throws IOException { + proxy.disable(); + } + + @Override + public void close() throws Exception { + try { + proxy.delete(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void disablePreconfiguredProxy() throws IOException { + preconfiguredRabbitProxy(DISABLE); + } + + public static void enablePreconfiguredProxy() throws IOException { + preconfiguredRabbitProxy(ENABLE); + } + + private static void preconfiguredRabbitProxy(Action action) throws IOException { + CloseableHttpClient client = HttpClientBuilder.create().useSystemProperties().build(); + HttpPost httpPost = new HttpPost("http://" + TOXIPROXY_BASE_URL.get() + "/proxies/rabbit-proxy"); + httpPost.setEntity(new StringEntity("{\"enabled\":" + action.isToEnable() + "}")); + client.execute( + httpPost, + resp -> { + if (resp.getCode() != HttpStatus.SC_OK) { + throw new IllegalStateException( + format("proxied could not be %s: %s", action.getPastParticiple(), resp.getCode()) + ); + } + return null; + } + ); + } + + public static enum Action { + ENABLE(true, "enabled"), + DISABLE(false, "disabled"); + + private boolean isToEnable; + private String pastParticiple; + + private Action(boolean isToEnable, String pastParticiple) { + this.isToEnable = isToEnable; + this.pastParticiple = pastParticiple; + } + + public boolean isToEnable() { + return isToEnable; + } + + public String getPastParticiple() { + return pastParticiple; + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqProducerConsumerIT.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqProducerConsumerIT.java index fb87419c..3ad6211f 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqProducerConsumerIT.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqProducerConsumerIT.java @@ -3,19 +3,21 @@ */ package com.sportradar.unifiedodds.sdk.integrationtest.externalrabbit; -import static com.google.common.collect.Iterables.getOnlyElement; +import static com.sportradar.unifiedodds.sdk.impl.Constants.*; +import static com.sportradar.unifiedodds.sdk.integrationtest.preconditions.PreconditionsForProxiedRabbitIntegrationTests.shouldMavenRunToxiproxyIntegrationTests; import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqClientFactory.createRabbitMqClient; import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqConsumers.connectToExchange; import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqProducer.connectDeclaringExchange; import static com.sportradar.unifiedodds.sdk.testutil.rabbit.libraryfixtures.WaitingRabbitMqConsumerDi.createWaitingRabbitMqConsumerFactory; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assume.assumeThat; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.http.client.Client; -import com.sportradar.unifiedodds.sdk.impl.Constants; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; import com.sportradar.unifiedodds.sdk.impl.TimeUtilsImpl; import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.*; @@ -27,26 +29,33 @@ import org.junit.Before; import org.junit.Test; +@SuppressWarnings({ "ClassFanOutComplexity", "MultipleStringLiterals" }) public class RabbitMqProducerConsumerIT { - public static final String DEFAULT_ADMIN_USERNAME_IN_DOCKER_IMAGE = "guest"; - public static final String DEFAULT_ADMIN_PASSWORD_IN_DOCKER_IMAGE = "guest"; + private static final String DEFAULT_ADMIN_USERNAME_IN_DOCKER_IMAGE = "guest"; + private static final String DEFAULT_ADMIN_PASSWORD_IN_DOCKER_IMAGE = "guest"; + private static final int ENOUGH_TIME_FOR_CONSUMER_TO_REESTABLISH_CONNECTION = 5000; private final Credentials producerCredentials = Credentials.with("producer1", "producer1_P4ssw0rd"); private final Credentials consumerCredentials = Credentials.with("consumer1", "consumer1_P4ssw0rd"); private final Credentials adminCredentials = Credentials.with( DEFAULT_ADMIN_USERNAME_IN_DOCKER_IMAGE, DEFAULT_ADMIN_PASSWORD_IN_DOCKER_IMAGE ); - private final VhostLocation vhostLocation = VhostLocation.at(Constants.RABBIT_IP, "/testhost"); + private final VhostLocation vhostLocation = VhostLocation.at(RABBIT_BASE_URL, "/testhost"); + private final VhostLocation proxiedVhostLocation = VhostLocation.at(PROXIED_RABBIT_BASE_URL, "/testhost"); private final String exchange = "test_exchange"; private final String routingKey = "specifiedRoutingKey"; private final String messageToDeliver = "specifiedMessage"; private final ExchangeLocation exchangeLocation = ExchangeLocation.at(vhostLocation, exchange); + private final ExchangeLocation proxiedExchangeLocation = ExchangeLocation.at( + proxiedVhostLocation, + exchange + ); private final ConnectionFactory factory = new ConnectionFactory(); private final WaitingRabbitMqConsumer.Factory consumerFactory = createWaitingRabbitMqConsumerFactory(); private final TimeUtils time = new TimeUtilsImpl(); private final Client rabbit = createRabbitMqClient( - vhostLocation.getHost(), + vhostLocation.getBaseUrl().getHost(), adminCredentials, Client::new ); @@ -69,7 +78,7 @@ public void deleteCreatedResources() { public void shouldTransferMessage() throws Exception { try ( val producer = connectDeclaringExchange(exchangeLocation, producerCredentials, factory, time); - val consumers = connectToExchange(exchangeLocation, consumerCredentials, factory) + val consumers = connectToExchange(exchangeLocation, consumerCredentials, factory); ) { val consumer = consumerFactory.expectingMessage(); consumers.registerConsumer(routingKey, consumer); @@ -81,6 +90,36 @@ public void shouldTransferMessage() throws Exception { } } + @Test + public void shouldTransferMessageOverProxy() throws Exception { + assumeThat("see developerREADME", shouldMavenRunToxiproxyIntegrationTests(), equalTo(true)); + try ( + val proxiedRabbit = ProxiedRabbit.proxyRabbit(); + val producer = connectDeclaringExchange(exchangeLocation, producerCredentials, factory, time); + val consumers = connectToExchange(proxiedExchangeLocation, consumerCredentials, factory); + ) { + val consumer = consumerFactory.expectingMessage(); + consumers.registerConsumer(routingKey, consumer); + + producer.send(messageToDeliver, routingKey); + + val actualDelivery = consumer.waitForFirstDelivery(); + assertMessagesAreSame(messageToDeliver, actualDelivery); + + proxiedRabbit.disable(); + + producer.send("secondMessage", routingKey); + consumer.waitExpectingNoDelivery(); + + proxiedRabbit.enable(); + + Thread.sleep(ENOUGH_TIME_FOR_CONSUMER_TO_REESTABLISH_CONNECTION); + + producer.send("thirdMessage", routingKey); + assertMessagesAreSame("thirdMessage", consumer.waitForFirstDelivery()); + } + } + @Test public void dashSymbolInTopicIsNormalSymbolAndDoesNotRepresentWildcard() throws Exception { try ( diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqUserSetupIT.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqUserSetupIT.java index 8d0468b2..aa83cabd 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqUserSetupIT.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/externalrabbit/RabbitMqUserSetupIT.java @@ -3,6 +3,7 @@ */ package com.sportradar.unifiedodds.sdk.integrationtest.externalrabbit; +import static com.sportradar.unifiedodds.sdk.impl.Constants.RABBIT_BASE_URL; import static com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.RabbitMqClientFactory.createRabbitMqClient; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertNotNull; @@ -29,9 +30,9 @@ public class RabbitMqUserSetupIT { ); private final Credentials producerCredentials = Credentials.with("producer1", "producer1_P4ssw0rd"); - private final VhostLocation vhostLocation = VhostLocation.at(Constants.RABBIT_IP, "/testhost"); + private final VhostLocation vhostLocation = VhostLocation.at(RABBIT_BASE_URL, "/testhost"); private final Client rabbitClient = createRabbitMqClient( - vhostLocation.getHost(), + vhostLocation.getBaseUrl().getHost(), adminCredentials, Client::new ); @@ -91,7 +92,7 @@ private Connection createConnection(Credentials credentials) throws IOException, final Connection connection; val factory = new ConnectionFactory(); factory.setVirtualHost(vhostLocation.getVirtualHostname()); - factory.setHost(vhostLocation.getHost()); + factory.setHost(vhostLocation.getBaseUrl().getHost()); factory.setUsername(credentials.getUsername()); factory.setPassword(credentials.getPassword()); connection = factory.newConnection(); diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/RabbitMqConnectionChecker.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/ConnectionChecker.java similarity index 57% rename from sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/RabbitMqConnectionChecker.java rename to sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/ConnectionChecker.java index fa556695..7a92e142 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/RabbitMqConnectionChecker.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/ConnectionChecker.java @@ -1,17 +1,21 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ package com.sportradar.unifiedodds.sdk.integrationtest.preconditions; import com.sportradar.unifiedodds.sdk.impl.Constants; +import com.sportradar.unifiedodds.sdk.testutil.rabbit.integration.BaseUrl; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; -public class RabbitMqConnectionChecker { +public class ConnectionChecker { public static final int TIMEOUT_IN_MILLIS = 1000; - private final int port; + private final BaseUrl baseUrl; - public RabbitMqConnectionChecker(int port) { - this.port = port; + public ConnectionChecker(BaseUrl baseUrl) { + this.baseUrl = baseUrl; } public boolean isServerUp() { @@ -20,7 +24,7 @@ public boolean isServerUp() { private boolean pingHost(int timeoutInMillis) { try (Socket socket = new Socket()) { - socket.connect(new InetSocketAddress(Constants.RABBIT_IP, port), timeoutInMillis); + socket.connect(new InetSocketAddress(baseUrl.getHost(), baseUrl.getPort()), timeoutInMillis); return true; } catch (IOException e) { return false; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForIntegrationTests.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForIntegrationTests.java index bcd7d1fe..f68b377d 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForIntegrationTests.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForIntegrationTests.java @@ -3,13 +3,11 @@ */ package com.sportradar.unifiedodds.sdk.integrationtest.preconditions; -import java.util.Optional; -import java.util.function.Function; -import java.util.function.Predicate; +import static com.sportradar.unifiedodds.sdk.impl.Constants.RABBIT_MANAGEMENT_BASE_URL; +import static com.sportradar.unifiedodds.sdk.integrationtest.preconditions.SystemProperties.isBooleanSystemPropertySet; public class PreconditionsForIntegrationTests { - private static final int RABBITMQ_MANAGEMENT_PORT = 15672; private static final String MAVEN_SKIP_TESTS = "skipTests"; private static final String MAVEN_SKIP_ITS = "skipITs"; @@ -23,34 +21,21 @@ private static void validateRabbitMqIsUp() { if (shouldMavenRunIntegrationTests()) { if (!isRabbitMqServerUp()) { throw new IllegalStateException( - "Running integration tests require RabbitMQ server management interface to be running on port: " + - RABBITMQ_MANAGEMENT_PORT + - ", however the port or not opened. " + - "Start RabbitMQ server or execute unit tests only e.g. mvn clean test " + - "(NOT RECOMMENDED: or skip integration tests via adding -DskipITs in maven build)" + "Running integration tests require RabbitMQ server management interface to be running on: " + + RABBIT_MANAGEMENT_BASE_URL.get() + + ", however the port is not opened. " + + "Start RabbitMQ server or execute unit tests only e.g. mvn clean test. " + + "NOT RECOMMENDED: or skip integration tests via adding -DskipITs in maven build" ); } } } private static boolean isRabbitMqServerUp() { - return new RabbitMqConnectionChecker(RABBITMQ_MANAGEMENT_PORT).isServerUp(); + return new ConnectionChecker(RABBIT_MANAGEMENT_BASE_URL).isServerUp(); } private static boolean shouldMavenRunIntegrationTests() { return !isBooleanSystemPropertySet(MAVEN_SKIP_TESTS) && !isBooleanSystemPropertySet(MAVEN_SKIP_ITS); } - - private static boolean isBooleanSystemPropertySet(String name) { - String value = System.getProperty(name); - return Optional.ofNullable(value).map(toBoolean()).filter(isTrue()).orElse(false); - } - - private static Predicate isTrue() { - return v -> v; - } - - private static Function toBoolean() { - return Boolean::valueOf; - } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForProxiedRabbitIntegrationTests.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForProxiedRabbitIntegrationTests.java new file mode 100644 index 00000000..c2ba7e7e --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/PreconditionsForProxiedRabbitIntegrationTests.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.integrationtest.preconditions; + +import static com.sportradar.unifiedodds.sdk.impl.Constants.TOXIPROXY_BASE_URL; +import static com.sportradar.unifiedodds.sdk.integrationtest.preconditions.SystemProperties.isBooleanSystemPropertySet; + +public class PreconditionsForProxiedRabbitIntegrationTests { + + private static final String SKIP_TOXIPROXY_TESTS_MAVEN_PARAMETER = "skipProxiedRabbitTests"; + private static final String MAVEN_SKIP_TESTS = "skipTests"; + private static final String MAVEN_SKIP_ITS = "skipITs"; + + private PreconditionsForProxiedRabbitIntegrationTests() {} + + public static boolean shouldMavenRunToxiproxyIntegrationTests() { + return !isBooleanSystemPropertySet(SKIP_TOXIPROXY_TESTS_MAVEN_PARAMETER); + } + + public static void main(String[] args) { + validateRabbitMqIsUp(); + } + + private static void validateRabbitMqIsUp() { + if (shouldMavenRunIntegrationTests() && shouldMavenRunToxiproxyIntegrationTests()) { + if (!isToxiproxyServerUp()) { + throw new IllegalStateException( + "Running integration tests require Toxiproxy server interface to be running on: " + + TOXIPROXY_BASE_URL.get() + + ", however the port is not opened. " + + "Start Toxiproxy server or execute unit tests only e.g. mvn clean test. " + + "NOT RECOMMENDED: or skip integration tests exercising proxied rabbit " + + "via adding -D" + + SKIP_TOXIPROXY_TESTS_MAVEN_PARAMETER + + " in maven build" + ); + } + } + } + + private static boolean isToxiproxyServerUp() { + return new ConnectionChecker(TOXIPROXY_BASE_URL).isServerUp(); + } + + private static boolean shouldMavenRunIntegrationTests() { + return !isBooleanSystemPropertySet(MAVEN_SKIP_TESTS) && !isBooleanSystemPropertySet(MAVEN_SKIP_ITS); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/SystemProperties.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/SystemProperties.java new file mode 100644 index 00000000..c336ced9 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/integrationtest/preconditions/SystemProperties.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.integrationtest.preconditions; + +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Predicate; + +public class SystemProperties { + + private SystemProperties() {} + + public static boolean isBooleanSystemPropertySet(String name) { + String value = System.getProperty(name); + return Optional.ofNullable(value).map(toBoolean()).filter(isTrue()).orElse(false); + } + + private static Predicate isTrue() { + return v -> v; + } + + private static Function toBoolean() { + return Boolean::valueOf; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/shared/FeedMessageBuilder.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/shared/FeedMessageBuilder.java index 69113c61..753dfa21 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/shared/FeedMessageBuilder.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/shared/FeedMessageBuilder.java @@ -5,6 +5,8 @@ import com.sportradar.uf.datamodel.UfOddsChange; import com.sportradar.uf.datamodel.UfOddsChangeMarket; import com.sportradar.uf.datamodel.UfSnapshotComplete; +import com.sportradar.unifiedodds.sdk.conn.ProducerId; +import com.sportradar.unifiedodds.sdk.conn.SportEvent; import java.util.Date; import lombok.val; @@ -14,10 +16,12 @@ @SuppressWarnings({ "ParameterAssignment", "ClassDataAbstractionCoupling", "MagicNumber" }) public class FeedMessageBuilder { - private final int producerId; + private final ProducerId producerId; + private final SportEvent sportEvent; - public FeedMessageBuilder(int producerId) { + public FeedMessageBuilder(ProducerId producerId, SportEvent sportEvent) { this.producerId = producerId; + this.sportEvent = sportEvent; } /** @@ -35,13 +39,24 @@ public UfOddsChange buildOddsChange(Long eventId, Integer productId, Long reques UfOddsChange message = new UfOddsChange(); message.setEventId(eventId == null ? "sr:match:1000" : "sr:match:" + eventId); - message.setProduct(productId == null ? producerId : productId); + message.setProduct(productId == null ? producerId.get() : productId); message.setTimestamp(timestamp == null ? new Date().getTime() : timestamp.getTime()); message.setRequestId(requestId); return message; } + public String oddsChange(UfOddsChangeMarket market) { + UfOddsChange.UfOdds odds = new UfOddsChange.UfOdds(); + odds.getMarket().add(market); + val oddsChange = new UfOddsChange(); + oddsChange.setProduct(producerId.get()); + oddsChange.setEventId(sportEvent.getUrn().toString()); + oddsChange.setTimestamp(new Date().getTime()); + oddsChange.setOdds(odds); + return Helper.serializeToJaxbXml(oddsChange); + } + public UfOddsChange buildOddsChangeForExactGoalsMarket() { UfOddsChangeMarket exactGoalsMarket = new UfOddsChangeMarket(); @@ -149,7 +164,7 @@ public UfBetStop buildBetStop(Long eventId, Integer productId, Long requestId, D UfBetStop message = new UfBetStop(); message.setEventId(eventId == null ? "sr:match:1000" : "sr:match:" + eventId); - message.setProduct(productId == null ? producerId : productId); + message.setProduct(productId == null ? producerId.get() : productId); message.setTimestamp(timestamp == null ? new Date().getTime() : timestamp.getTime()); message.setRequestId(requestId); @@ -165,7 +180,7 @@ public UfBetStop buildBetStop(Long eventId, Integer productId, Long requestId, D */ public UfAlive buildAlive(Integer productId, Date timestamp, boolean subscribed) { UfAlive message = new UfAlive(); - message.setProduct(productId == null ? producerId : productId); + message.setProduct(productId == null ? producerId.get() : productId); message.setTimestamp(timestamp == null ? new Date().getTime() : timestamp.getTime()); message.setSubscribed(subscribed ? 1 : 0); @@ -200,7 +215,7 @@ public UfAlive buildAlive(Integer productId) { */ public UfSnapshotComplete buildSnapshotComplete(Integer productId, long requestId, Date timestamp) { UfSnapshotComplete message = new UfSnapshotComplete(); - message.setProduct(productId == null ? producerId : productId); + message.setProduct(productId == null ? producerId.get() : productId); message.setTimestamp(timestamp == null ? new Date().getTime() : timestamp.getTime()); message.setRequestId(requestId); diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/LatchTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/LatchTest.java index 37abe1a2..fd018a9d 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/LatchTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/LatchTest.java @@ -3,11 +3,12 @@ */ package com.sportradar.unifiedodds.sdk.testutil.generic.concurrent; +import static com.sportradar.utils.time.TimeInterval.seconds; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; -import com.sportradar.unifiedodds.sdk.impl.recovery.TimeUtilsStub; +import com.sportradar.utils.time.TimeUtilsStub; import java.time.Instant; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -49,7 +50,7 @@ public void shouldFailIfTimedOut() { val timeUtils = timeUtilsStubs.withCurrentTime(instantAtMidnight); val latch = new Latch(1, timeUtils); - Executors.newFixedThreadPool(1).submit(() -> timeUtils.fastForwardSeconds(2)); + Executors.newFixedThreadPool(1).submit(() -> timeUtils.tick(seconds(2))); assertFalse(latch.await(1, TimeUnit.SECONDS)); } @@ -68,7 +69,7 @@ public void shouldIndicateLatchHasStartedWaiting() throws InterruptedException { private void tearUpStartedCallables(TimeUtilsStub timeUtils) { int enoughSecondsForCallablesToFinish = 2; - timeUtils.fastForwardSeconds(enoughSecondsForCallablesToFinish); + timeUtils.tick(seconds(enoughSecondsForCallablesToFinish)); } @Test diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueue.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueue.java index fa34211e..eec77759 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueue.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueue.java @@ -30,6 +30,7 @@ public T poll(long timeout, TimeUnit unit) { while (timeUtils.now() < startPollingTimestamp + unit.toMillis(timeout)) { val element = peek(); if (element != null) { + poll(); return element; } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueueTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueueTest.java index 986f2731..b13bb8e2 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueueTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/generic/concurrent/SignallingOnPollingQueueTest.java @@ -6,12 +6,13 @@ import static com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.WaiterForEvents.WaitingStatus.EVENT_HAPPENED; import static com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.WaiterForEvents.WaitingStatus.EVENT_NOT_HAPPENED; import static com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.WaiterForEvents.createWaiterForEvents; +import static com.sportradar.utils.time.TimeInterval.seconds; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; -import com.sportradar.unifiedodds.sdk.impl.recovery.TimeUtilsStub; +import com.sportradar.utils.time.TimeUtilsStub; import java.time.Instant; import java.util.concurrent.TimeUnit; import lombok.val; @@ -38,7 +39,7 @@ public class SignallingOnPollingQueueTest { @After public void tearUpStartedCallables() { final int enoughSecondsForWaitersToFinish = 3; - timeUtils.fastForwardSeconds(enoughSecondsForWaitersToFinish); + timeUtils.tick(seconds(enoughSecondsForWaitersToFinish)); } @Test @@ -50,6 +51,16 @@ public void shouldPollElementSuccessfullyIfItWasAddedEvenBeforeStartedPollingFor assertEquals(element, queue.poll(1, TimeUnit.SECONDS)); } + @Test + public void shouldRemoveElementAfterSuccessfulPolling() { + val queue = new SignallingOnPollingQueue(timeUtils, createWaiterForEvents()); + queue.add(element); + + queue.poll(1, TimeUnit.SECONDS); + + assertThat(queue).isEmpty(); + } + @Test public void shouldPollElementSuccessfullyIfItWasAddedWithing1SecondFromStartedPollingForIt() { val queue = new SignallingOnPollingQueue(timeUtils, createWaiterForEvents()); @@ -68,7 +79,7 @@ public void shouldFailToPollIfElementWasNotInsertedInOneSecond() { executor.executeInAnotherThread(() -> { queue.getWaiterForStartingToPoll().await(1, TimeUnit.SECONDS); - timeUtils.fastForwardSeconds(2); + timeUtils.tick(seconds(2)); }); assertThat(queue.poll(1, TimeUnit.SECONDS)).isNull(); diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/javautil/LanguagesTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/javautil/LanguagesTest.java deleted file mode 100644 index 0d90a21a..00000000 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/javautil/LanguagesTest.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) Sportradar AG. See LICENSE for full license governing this code - */ -package com.sportradar.unifiedodds.sdk.testutil.javautil; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.junit.Test; - -public class LanguagesTest { - - private final int sampleSize = 100; - private List languages = Stream - .generate(() -> Languages.any()) - .limit(sampleSize) - .distinct() - .collect(Collectors.toList()); - - @Test - public void anyLanguageGeneratesNotAlwaysTheSameLanguages() { - assertThat(languages).hasSizeGreaterThan(1); - } - - @Test - public void anyLanguageDoesNotGenerateNullLanguages() { - assertThat(languages).doesNotContainNull(); - } -} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/BaseUrl.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/BaseUrl.java new file mode 100644 index 00000000..604fb06b --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/BaseUrl.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.unifiedodds.sdk.testutil.rabbit.integration; + +import lombok.*; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class BaseUrl { + + @NonNull + private final String host; + + @NonNull + private final int port; + + public static BaseUrl of(String host, int port) { + return new BaseUrl(host, port); + } + + public static BaseUrl any() { + final int anyPort = 987; + return of("any", anyPort); + } + + public String get() { + return host + ":" + port; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumers.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumers.java index 63b96b2b..8b5196ac 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumers.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumers.java @@ -8,6 +8,7 @@ import java.util.concurrent.TimeoutException; import lombok.NonNull; import lombok.val; +import org.apache.commons.lang3.exception.ExceptionUtils; public class RabbitMqConsumers implements AutoCloseable { @@ -50,9 +51,72 @@ public void registerConsumer(final String routingKey, final Consumer consumer) t private Connection createConnection(Credentials credentials, VhostLocation vhostLocation) throws IOException, TimeoutException { factory.setVirtualHost(vhostLocation.getVirtualHostname()); - factory.setHost(vhostLocation.getHost()); + factory.setHost(vhostLocation.getBaseUrl().getHost()); + factory.setPort(vhostLocation.getBaseUrl().getPort()); factory.setUsername(credentials.getUsername()); factory.setPassword(credentials.getPassword()); + factory.setExceptionHandler(getExceptionHandler()); return factory.newConnection(); } + + private static ExceptionHandler getExceptionHandler() { + return new LoggingExceptionHandler(); + } + + private static class LoggingExceptionHandler implements ExceptionHandler { + + @Override + public void handleUnexpectedConnectionDriverException(Connection connection, Throwable throwable) { + log(throwable); + } + + @Override + public void handleReturnListenerException(Channel channel, Throwable throwable) { + log(throwable); + } + + private static void log(Throwable throwable) { + System.out.println("logging exception: " + ExceptionUtils.getStackTrace(throwable)); + } + + @Override + public void handleConfirmListenerException(Channel channel, Throwable throwable) { + log(throwable); + } + + @Override + public void handleBlockedListenerException(Connection connection, Throwable throwable) { + log(throwable); + } + + @Override + public void handleConsumerException( + Channel channel, + Throwable throwable, + Consumer consumer, + String s, + String s1 + ) { + log(throwable); + } + + @Override + public void handleConnectionRecoveryException(Connection connection, Throwable throwable) { + log(throwable); + } + + @Override + public void handleChannelRecoveryException(Channel channel, Throwable throwable) { + log(throwable); + } + + @Override + public void handleTopologyRecoveryException( + Connection connection, + Channel channel, + TopologyRecoveryException e + ) { + log(e); + } + } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumersTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumersTest.java index cebd72d6..183da5ce 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumersTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqConsumersTest.java @@ -27,7 +27,7 @@ public class RabbitMqConsumersTest { private final String exchange = "givenExchange"; private final String queueName = "givenQueueName"; private final Credentials user = Credentials.with("GivenUsername", "GivenPassword"); - private final VhostLocation vhostLocation = VhostLocation.at("GivenHost", "GivenVhost"); + private final VhostLocation vhostLocation = VhostLocation.at(BaseUrl.any(), "GivenVhost"); private final Connection connection = mock(Connection.class); private final Channel channel = ChannelMocks.createDeclaringQueue(queueName); private final ConnectionFactory factory = stubSingleChannelFactory(connection, channel); @@ -68,7 +68,7 @@ public void shouldCreateConnectionInProvidedVirtualHostLocation() throws IOExcep connectToExchange(at(vhostLocation, any), Credentials.any(), factory); verify(factory).setVirtualHost(vhostLocation.getVirtualHostname()); - verify(factory).setHost(vhostLocation.getHost()); + verify(factory).setHost(vhostLocation.getBaseUrl().getHost()); } @Test diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducer.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducer.java index 12f66908..3a4f9af0 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducer.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducer.java @@ -10,6 +10,7 @@ import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.VoidCallables; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeoutException; @@ -53,10 +54,21 @@ public void close() throws IOException, TimeoutException { connection.close(); } - public void send(String message, String routingKey) throws IOException { - byte[] body = message.getBytes(StandardCharsets.UTF_8); - val properties = asProperties(time.now()); - channel.basicPublish(exchangeName, routingKey, properties, body); + public void send(String message, String routingKey) { + rethrowExceptions(() -> { + byte[] body = message.getBytes(StandardCharsets.UTF_8); + val properties = asProperties(time.now()); + channel.basicPublish(exchangeName, routingKey, properties, body); + }); + } + + @SuppressWarnings("IllegalCatch") + private void rethrowExceptions(VoidCallables.ThrowingRunnable thrower) { + try { + thrower.run(); + } catch (Exception e) { + throw new RuntimeException(e); + } } private static AMQP.BasicProperties asProperties(long timestamp) { @@ -70,7 +82,8 @@ private void createExchange() throws IOException { private Connection createConnection(Credentials credentials, VhostLocation vhostLocation) throws IOException, TimeoutException { factory.setVirtualHost(vhostLocation.getVirtualHostname()); - factory.setHost(vhostLocation.getHost()); + factory.setHost(vhostLocation.getBaseUrl().getHost()); + factory.setPort(vhostLocation.getBaseUrl().getPort()); factory.setUsername(credentials.getUsername()); factory.setPassword(credentials.getPassword()); return factory.newConnection(); diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducerTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducerTest.java index 735fb59e..43973db3 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducerTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqProducerTest.java @@ -16,8 +16,8 @@ import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; -import com.sportradar.unifiedodds.sdk.impl.recovery.TimeUtilsStub; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; +import com.sportradar.utils.time.TimeUtilsStub; import java.io.IOException; import java.time.Instant; import java.util.concurrent.TimeoutException; @@ -34,7 +34,11 @@ public class RabbitMqProducerTest { private final Connection connection = mock(Connection.class); private final ConnectionFactory factory = stubSingleChannelFactory(connection, channel); private final Credentials user = Credentials.with("GivenUsername", "GivenPassword"); - private final VhostLocation vhostLocation = VhostLocation.at("GivenHost", "GivenVhost"); + private final int givenPort = 987; + private final VhostLocation vhostLocation = VhostLocation.at( + BaseUrl.of("GivenHost", givenPort), + "GivenVhost" + ); private final Instant instantAtMidnight = ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); private final TimeUtilsStub time = TimeUtilsStub @@ -88,7 +92,8 @@ public void shouldCreateConnectionInProvidedVirtualHostLocation() throws IOExcep connectDeclaringExchange(at(vhostLocation, any), Credentials.any(), factory, time); verify(factory).setVirtualHost(vhostLocation.getVirtualHostname()); - verify(factory).setHost(vhostLocation.getHost()); + verify(factory).setHost(vhostLocation.getBaseUrl().getHost()); + verify(factory).setPort(vhostLocation.getBaseUrl().getPort()); } @Test diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqUserSetupTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqUserSetupTest.java index 31c32725..a06afa2f 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqUserSetupTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/RabbitMqUserSetupTest.java @@ -9,7 +9,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.codehaus.groovy.runtime.InvokerHelper.asList; -import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; @@ -81,7 +80,7 @@ public void shouldSetPermissionsForUserToSetUp() throws Exception { @Test public void shouldCreateVhost() throws Exception { - val userSetup = create(at(any, virtualHost), rabbitClient); + val userSetup = create(at(BaseUrl.any(), virtualHost), rabbitClient); userSetup.setupUser(with(username, password)); @@ -90,7 +89,7 @@ public void shouldCreateVhost() throws Exception { @Test public void shouldSetPermissionsOnGivenVirtualHost() throws Exception { - val userSetup = create(at(any, virtualHost), rabbitClient); + val userSetup = create(at(BaseUrl.any(), virtualHost), rabbitClient); val permissionsCaptor = ArgumentCaptor.forClass(UserPermissions.class); userSetup.setupUser(Credentials.any()); @@ -168,7 +167,7 @@ public void shouldDeleteTheUserOnceEvenIfItWasSetUpMultipleTimes() throws Except @Test public void shouldDeleteCreatedVhost() throws Exception { - val userSetup = create(VhostLocation.at(any, virtualHost), rabbitClient); + val userSetup = create(VhostLocation.at(BaseUrl.any(), virtualHost), rabbitClient); userSetup.setupUser(with(username, password)); userSetup.revertChangesMade(); @@ -180,7 +179,7 @@ public void shouldDeleteCreatedVhost() throws Exception { @Parameters({ "user1,user2" }) public void shouldDeleteVhostOnceEvenIfMultipleUsersAreDeleted(final String user1, final String user2) throws Exception { - val userSetup = create(VhostLocation.at(any, virtualHost), rabbitClient); + val userSetup = create(VhostLocation.at(BaseUrl.any(), virtualHost), rabbitClient); userSetup.setupUser(with(user1, password)); userSetup.setupUser(with(user2, password)); @@ -191,7 +190,7 @@ public void shouldDeleteVhostOnceEvenIfMultipleUsersAreDeleted(final String user @Test public void shouldNotDeleteDeletedVhostWhenRevertingMultipleTimes() throws Exception { - val userSetup = create(VhostLocation.at(any, virtualHost), rabbitClient); + val userSetup = create(VhostLocation.at(BaseUrl.any(), virtualHost), rabbitClient); userSetup.setupUser(with(username, password)); userSetup.revertChangesMade(); diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocation.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocation.java index c8289327..79e469b6 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocation.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocation.java @@ -3,28 +3,29 @@ */ package com.sportradar.unifiedodds.sdk.testutil.rabbit.integration; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.NonNull; +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class VhostLocation { - private String host; - private String virtualHostname; + @NonNull + private BaseUrl baseUrl; - private VhostLocation(@NonNull final String host, @NonNull final String virtualHostname) { - this.host = host; - this.virtualHostname = virtualHostname; - } + @NonNull + private String virtualHostname; - public static VhostLocation at(final String host, final String virtualHostname) { - return new VhostLocation(host, virtualHostname); + public static VhostLocation at(final BaseUrl baseUrl, final String virtualHostname) { + return new VhostLocation(baseUrl, virtualHostname); } public static VhostLocation any() { - return at("someHost", "someVirtualHostname"); + return at(BaseUrl.any(), "someVirtualHostname"); } - public String getHost() { - return host; + public BaseUrl getBaseUrl() { + return baseUrl; } public String getVirtualHostname() { diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocationTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocationTest.java index 35786cb4..305c4f85 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocationTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/integration/VhostLocationTest.java @@ -16,14 +16,17 @@ public class VhostLocationTest { @Test public void hostShouldNotBeNull() { - assertThatThrownBy(() -> VhostLocation.at(null, any)) + final int anyPort = 987; + assertThatThrownBy(() -> { + VhostLocation.at(BaseUrl.of(null, anyPort), any); + }) .isInstanceOf(NullPointerException.class) .hasMessageContaining("host"); } @Test public void virtualHostnameShouldNotBeNull() { - assertThatThrownBy(() -> VhostLocation.at(any, null)) + assertThatThrownBy(() -> VhostLocation.at(BaseUrl.any(), null)) .isInstanceOf(NullPointerException.class) .hasMessageContaining("virtualHostname"); } @@ -31,18 +34,19 @@ public void virtualHostnameShouldNotBeNull() { @Test public void shouldPreserveHost() { val host = "internet.com"; - assertEquals(host, VhostLocation.at(host, any).getHost()); + final int anyPort = 987; + assertEquals(host, VhostLocation.at(BaseUrl.of(host, anyPort), any).getBaseUrl().getHost()); } @Test public void shouldPreserveVirtualHost() { val vhost = "/unified"; - assertEquals(vhost, VhostLocation.at(any, vhost).getVirtualHostname()); + assertEquals(vhost, VhostLocation.at(BaseUrl.any(), vhost).getVirtualHostname()); } @Test public void shouldCreateAnyVhostLocation() { - assertNotNull(VhostLocation.any().getHost()); + assertNotNull(VhostLocation.any().getBaseUrl().getHost()); assertNotNull(VhostLocation.any().getVirtualHostname()); } } diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumer.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumer.java index 11bd7256..00e0929a 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumer.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumer.java @@ -4,6 +4,7 @@ package com.sportradar.unifiedodds.sdk.testutil.rabbit.libraryfixtures; import static java.util.Optional.ofNullable; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import com.rabbitmq.client.AMQP; @@ -41,6 +42,11 @@ public Optional waitForFirstDelivery() { return message; } + public void waitExpectingNoDelivery() { + val message = ofNullable(receivedMessages.poll(1, TimeUnit.SECONDS)); + assertFalse("Message was received", message.isPresent()); + } + public static class Factory { private final SignallingOnPollingQueue receivedMessages; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumerTest.java b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumerTest.java index c3f875dc..4f52cdbe 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumerTest.java +++ b/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/rabbit/libraryfixtures/WaitingRabbitMqConsumerTest.java @@ -6,6 +6,7 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.SignallingOnPollingQueue.createSignallingOnPollingQueue; import static com.sportradar.unifiedodds.sdk.testutil.rabbit.libraryfixtures.WaitingRabbitMqConsumerDi.createWaitingRabbitMqConsumerFactory; +import static com.sportradar.utils.time.TimeInterval.seconds; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -15,10 +16,10 @@ import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Envelope; import com.sportradar.unifiedodds.sdk.impl.TimeUtilsImpl; -import com.sportradar.unifiedodds.sdk.impl.recovery.TimeUtilsStub; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.FluentExecutor; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.SignallingOnPollingQueue; +import com.sportradar.utils.time.TimeUtilsStub; import java.time.Instant; import java.util.concurrent.TimeUnit; import lombok.val; @@ -107,7 +108,7 @@ public void shouldFailIfMessageWasNotReceivedForMoreThan1Sec() { executor.executeInAnotherThread(() -> { queue.getWaiterForStartingToPoll().await(1, TimeUnit.SECONDS); - timeUtils.fastForwardSeconds(2); + timeUtils.tick(seconds(2)); }); assertThatThrownBy(() -> consumer.waitForFirstDelivery()) @@ -127,4 +128,19 @@ public void shouldReceiveOnlyFirstDeliveryInCaseMultipleDeliveriesOccurred() { val delivery = consumer.waitForFirstDelivery().get(); assertSame(firstEnvelope, delivery.getEnvelope()); } + + @Test + public void shouldBeAbleToReceiveAnotherDelivery() { + val consumer = createWaitingRabbitMqConsumerFactory().expectingMessage(); + val firstEnvelope = mock(Envelope.class); + val secondEnvelope = mock(Envelope.class); + + consumer.handleDelivery(any, firstEnvelope, anyProperties, anyBody); + consumer.handleDelivery(any, secondEnvelope, anyProperties, anyBody); + + consumer.waitForFirstDelivery().get(); + val delivery = consumer.waitForFirstDelivery().get(); + + assertSame(secondEnvelope, delivery.getEnvelope()); + } } diff --git a/sdk-core/src/test/java/com/sportradar/utils/Urns.java b/sdk-core/src/test/java/com/sportradar/utils/Urns.java index dbd7f7b2..e221b179 100644 --- a/sdk-core/src/test/java/com/sportradar/utils/Urns.java +++ b/sdk-core/src/test/java/com/sportradar/utils/Urns.java @@ -3,9 +3,12 @@ */ package com.sportradar.utils; +import static java.util.Arrays.asList; + import com.sportradar.utils.domain.UniqueObjects; import java.util.Random; import java.util.function.Supplier; +import java.util.stream.Stream; import lombok.val; public class Urns { @@ -47,6 +50,17 @@ public static Urn urnForAnyStage() { String anyId = "338"; return Urn.parse("sr:stage:" + anyId); } + + public static Urn any() { + val urns = asList( + urnForAnyStage(), + urnForAnySimpleTournament(), + urnForAnyTournament(), + urnForAnySeason(), + getForAnyMatch() + ); + return urns.get(RANDOM.nextInt(urns.size())); + } } public static class Lotteries { diff --git a/sdk-core/src/test/java/com/sportradar/utils/domain/feedmessages/markets/TeamIndicators.java b/sdk-core/src/test/java/com/sportradar/utils/domain/feedmessages/markets/TeamIndicators.java new file mode 100644 index 00000000..4d40c37c --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/domain/feedmessages/markets/TeamIndicators.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.domain.feedmessages.markets; + +public enum TeamIndicators { + HOME(1), + AWAY(2); + + private final int value; + + private TeamIndicators(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/domain/markets/MarketIds.java b/sdk-core/src/test/java/com/sportradar/utils/domain/markets/MarketIds.java new file mode 100644 index 00000000..f189b08b --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/domain/markets/MarketIds.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.domain.markets; + +import java.util.Random; +import java.util.stream.IntStream; +import lombok.val; + +public final class MarketIds { + + private static Random random = new Random(); + + private MarketIds() {} + + public static int anyMarketId() { + val ids = generateRangeOfIdsForTests(); + return ids[random.nextInt(ids.length)]; + } + + private static int[] generateRangeOfIdsForTests() { + final int maxIdIsNotTooHighToGenerateNonUniqueValuesInAttemptToExposeWeaknessesInTests = 9; + final int minIdIsPositiveNumber = 1; + return IntStream + .range( + minIdIsPositiveNumber, + maxIdIsNotTooHighToGenerateNonUniqueValuesInAttemptToExposeWeaknessesInTests + ) + .toArray(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/javautil/Languages.java b/sdk-core/src/test/java/com/sportradar/utils/domain/names/Languages.java similarity index 51% rename from sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/javautil/Languages.java rename to sdk-core/src/test/java/com/sportradar/utils/domain/names/Languages.java index 08551523..110dc15f 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/testutil/javautil/Languages.java +++ b/sdk-core/src/test/java/com/sportradar/utils/domain/names/Languages.java @@ -1,12 +1,18 @@ /* * Copyright (C) Sportradar AG. See LICENSE for full license governing this code */ -package com.sportradar.unifiedodds.sdk.testutil.javautil; +package com.sportradar.utils.domain.names; +import static com.sportradar.utils.generic.testing.Cardinality.anyFromZeroToTwo; + +import com.sportradar.utils.domain.UniqueObjects; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import lombok.val; public class Languages { @@ -26,4 +32,14 @@ public static Locale any() { ); return languagePool.get(random.nextInt(languagePool.size())); } + + public static List anyLanguages() { + val numberOfElements = anyFromZeroToTwo(); + final val uniqueLanguages = new UniqueObjects<>(() -> any()); + return IntStream + .range(0, numberOfElements) + .boxed() + .map(i -> uniqueLanguages.getOne()) + .collect(Collectors.toList()); + } } diff --git a/sdk-core/src/test/java/com/sportradar/utils/domain/names/LanguagesTest.java b/sdk-core/src/test/java/com/sportradar/utils/domain/names/LanguagesTest.java new file mode 100644 index 00000000..aabcd23a --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/domain/names/LanguagesTest.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.domain.names; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class LanguagesTest { + + public static class SingleLanguage { + + private final int sampleSize = 100; + private List languages = Stream + .generate(() -> Languages.any()) + .limit(sampleSize) + .distinct() + .collect(Collectors.toList()); + + @Test + public void anyLanguageGeneratesNotAlwaysTheSameLanguages() { + assertThat(languages).hasSizeGreaterThan(1); + } + + @Test + public void anyLanguageDoesNotGenerateNullLanguages() { + assertThat(languages).doesNotContainNull(); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/domain/producers/ProducerIds.java b/sdk-core/src/test/java/com/sportradar/utils/domain/producers/ProducerIds.java new file mode 100644 index 00000000..0013cc4a --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/domain/producers/ProducerIds.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.domain.producers; + +import static com.sportradar.utils.generic.testing.RandomObjectPicker.pickOneRandomlyFrom; + +import com.sportradar.utils.generic.testing.RandomInteger; +import com.sportradar.utils.generic.testing.RandomObjectPicker; +import java.util.Arrays; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import lombok.val; + +public final class ProducerIds { + + public static final Integer PREMIUM_CRICKET_PRODUCER_ID = 5; + + @SuppressWarnings("MagicNumber") + private static final Integer[] PRODUCER_IDS = { + 1, + 3, + 4, + PREMIUM_CRICKET_PRODUCER_ID, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + }; + + private static Random random = new Random(); + + private ProducerIds() {} + + public static Integer[] producerIds() { + return PRODUCER_IDS; + } + + public static Integer[] nonPremiumCricketProducerIds() { + return Arrays + .stream(PRODUCER_IDS) + .filter(id -> id != PREMIUM_CRICKET_PRODUCER_ID) + .toArray(Integer[]::new); + } + + public static int anyProducerId() { + return pickOneRandomlyFrom(PRODUCER_IDS); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/domain/specifiers/MarketSpecifiers.java b/sdk-core/src/test/java/com/sportradar/utils/domain/specifiers/MarketSpecifiers.java new file mode 100644 index 00000000..4ea43c0d --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/domain/specifiers/MarketSpecifiers.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.domain.specifiers; + +import static com.sportradar.utils.generic.testing.RandomObjectPicker.pickOneRandomlyFrom; +import static java.util.Collections.emptyMap; + +import com.sportradar.unifiedodds.sdk.testutil.generic.collections.Maps; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import lombok.val; + +public final class MarketSpecifiers { + + private MarketSpecifiers() {} + + public static Map anySpecifiers() { + val noSpecifiers = new HashMap(); + val oneSpecifier = Collections.singletonMap("total", "2.5"); + val twoSpecifiers = Maps.of("total", "2.5", "hcp", "-0.5"); + + return pickOneRandomlyFrom(noSpecifiers, oneSpecifier, twoSpecifiers); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Booleans.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Booleans.java new file mode 100644 index 00000000..08f93164 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Booleans.java @@ -0,0 +1,17 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +import java.util.Random; + +public final class Booleans { + + public static final Random RANDOM = new Random(); + + private Booleans() {} + + public static Boolean any() { + return RANDOM.nextBoolean(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Cardinality.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Cardinality.java new file mode 100644 index 00000000..beafca4d --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Cardinality.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +import java.util.Random; +import lombok.val; + +public final class Cardinality { + + private static Random random = new Random(); + + private Cardinality() {} + + public static Integer anyFromZeroToTwo() { + val zeroToMultiple = new Integer[] { 0, 1, 2 }; + return zeroToMultiple[random.nextInt(zeroToMultiple.length)]; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Dates.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Dates.java new file mode 100644 index 00000000..bafaf919 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Dates.java @@ -0,0 +1,15 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +import java.util.Date; + +public final class Dates { + + private Dates() {} + + public static Date any() { + return new Date(); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Exceptions.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Exceptions.java new file mode 100644 index 00000000..d5bdf0b4 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Exceptions.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.VoidCallables; + +public final class Exceptions { + + private Exceptions() {} + + @SuppressWarnings({ "IllegalCatch", "EmptyCatchBlock" }) + public static void ignoringExceptions(VoidCallables.ThrowingRunnable runnable) { + try { + runnable.run(); + } catch (Exception ignored) {} + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomInteger.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomInteger.java new file mode 100644 index 00000000..b3d0455b --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomInteger.java @@ -0,0 +1,13 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +public final class RandomInteger { + + private RandomInteger() {} + + public static int fromRangeInclusive(int min, int max) { + return min + (int) (Math.random() * (max - min + 1)); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomIntegerTest.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomIntegerTest.java new file mode 100644 index 00000000..7139ef49 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomIntegerTest.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.Test; + +public class RandomIntegerTest { + + private final int sampleSize = 100; + + @Test + public void generatesValuesFromRangeInclusively() { + final int lowestValue = 5; + final int midValue = 6; + final int highestValue = 7; + final int rangeInclusive = 3; + + List integers = Stream + .generate(() -> RandomInteger.fromRangeInclusive(lowestValue, highestValue)) + .limit(sampleSize) + .distinct() + .collect(Collectors.toList()); + + assertThat(integers).hasSize(rangeInclusive); + assertThat(integers).containsOnly(lowestValue, midValue, highestValue); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomObjectPicker.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomObjectPicker.java new file mode 100644 index 00000000..9a6cd19b --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/RandomObjectPicker.java @@ -0,0 +1,13 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +public final class RandomObjectPicker { + + private RandomObjectPicker() {} + + public static T pickOneRandomlyFrom(T... objects) { + return objects[RandomInteger.fromRangeInclusive(0, objects.length - 1)]; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Urls.java b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Urls.java new file mode 100644 index 00000000..508061a0 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/generic/testing/Urls.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.generic.testing; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric; + +import java.net.MalformedURLException; +import java.net.URL; + +public final class Urls { + + private Urls() {} + + public static URL anyHttpUrl() throws MalformedURLException { + String scheme = RandomObjectPicker.pickOneRandomlyFrom("http://", "https://"); + return new URL(scheme + anyDomain() + anyPath()); + } + + private static String anyPath() { + return randomAlphanumeric(2); + } + + private static String anyDomain() { + return randomAlphanumeric(2) + ".com/"; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepMock.java b/sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepMock.java new file mode 100644 index 00000000..696034de --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepMock.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.thread.sleep; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; + +import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.VoidCallables; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +public final class SleepMock { + + private SleepMock() {} + + public static Sleep onSleepDo(VoidCallables.ThrowingRunnable runnable) { + Sleep sleep = mock(Sleep.class); + doAnswer(i -> { + runnable.run(); + return null; + }) + .when(sleep) + .millis(anyInt()); + return sleep; + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepTest.java b/sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepTest.java new file mode 100644 index 00000000..6c082714 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/thread/sleep/SleepTest.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.thread.sleep; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; +import static org.hamcrest.Matchers.equalTo; + +import com.sportradar.unifiedodds.sdk.impl.rabbitconnection.LogsMock; +import java.util.Optional; +import lombok.val; +import org.junit.Test; + +public class SleepTest { + + public static final int MILLIS_IN_SECOND = 1000; + public static final int UNDER_A_SECOND = 800; + public static final int OVER_A_SECOND = 1500; + public static final int FOREVER = 30000; + + private ExceptionPreserver exceptionPreserver = new ExceptionPreserver(); + + @Test + public void sleepsMillis() { + assertThatTakesAroundOneSecond(() -> new Sleep().millis(MILLIS_IN_SECOND)); + } + + @Test + public void swallowsInterruptedExceptionAndLogsIt() { + final val logsMock = LogsMock.createCapturingFor(Sleep.class); + Thread thread = new Thread(() -> new Sleep().millis(FOREVER)); + + thread.setUncaughtExceptionHandler(exceptionPreserver); + thread.start(); + await().until(thread::getState, equalTo(Thread.State.TIMED_WAITING)); + + thread.interrupt(); + await().until(() -> logsMock.loggedLineContains("Interrupted")); + await().until(thread::getState, equalTo(Thread.State.TERMINATED)); + assertThat(exceptionPreserver.exception).isEmpty(); + } + + private void assertThatTakesAroundOneSecond(Runnable task) { + long before = System.currentTimeMillis(); + task.run(); + long after = System.currentTimeMillis(); + assertThat(after - before).isGreaterThan(UNDER_A_SECOND).isLessThan(OVER_A_SECOND); + } + + private static class ExceptionPreserver implements Thread.UncaughtExceptionHandler { + + private volatile Optional exception = Optional.empty(); + + @Override + public void uncaughtException(Thread t, Throwable e) { + exception = Optional.of(e); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/time/EpochMillis.java b/sdk-core/src/test/java/com/sportradar/utils/time/EpochMillis.java new file mode 100644 index 00000000..bdb5a8ac --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/time/EpochMillis.java @@ -0,0 +1,31 @@ +package com.sportradar.utils.time; + +@SuppressWarnings({ "MagicNumber" }) +public class EpochMillis { + + private long epochMillis; + + public EpochMillis(long epochMillis) { + this.epochMillis = epochMillis; + } + + public EpochMillis plus(TimeInterval interval) { + return new EpochMillis(epochMillis + interval.getInMillis()); + } + + public long get() { + return epochMillis; + } + + public EpochMillis minus(TimeInterval interval) { + return new EpochMillis(epochMillis - interval.getInMillis()); + } + + public EpochMillis plusSeconds(int amount) { + return new EpochMillis(epochMillis + amount * 1000L); + } + + public EpochMillis minusSeconds(int amount) { + return new EpochMillis(epochMillis - amount * 1000L); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/time/EpochMillisTest.java b/sdk-core/src/test/java/com/sportradar/utils/time/EpochMillisTest.java new file mode 100644 index 00000000..e8b44669 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/time/EpochMillisTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.time; + +import static com.sportradar.utils.time.TimeInterval.minutes; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +@SuppressWarnings({ "MagicNumber", "StaticVariableName" }) +public final class EpochMillisTest { + + public static final long SECONDS_IN_MINUTE = 60L; + public static final long SECOND = 1000L; + public static final long MINUTE = SECONDS_IN_MINUTE * SECOND; + + private static long MIDNIGHT = 1664402400000L; + + private EpochMillisTest() {} + + @Test + public void shouldAdd0Minutes() { + assertEquals(MIDNIGHT, new EpochMillis(MIDNIGHT).plus(minutes(0)).get()); + } + + @Test + public void shouldAdd2Minutes() { + assertEquals(MIDNIGHT + 2L * MINUTE, new EpochMillis(MIDNIGHT).plus(minutes(2)).get()); + } + + @Test + public void shouldSubtract0Minutes() { + assertEquals(MIDNIGHT, new EpochMillis(MIDNIGHT).minus(minutes(0)).get()); + } + + @Test + public void shouldSubtract2Minutes() { + assertEquals(MIDNIGHT - 2L * MINUTE, new EpochMillis(MIDNIGHT).minus(minutes(2)).get()); + } + + @Test + public void shouldBeImmutable() { + EpochMillis midnight = new EpochMillis(MIDNIGHT); + assertEquals(MIDNIGHT + MINUTE, midnight.plus(minutes(1)).get()); + assertEquals(MIDNIGHT + MINUTE, midnight.plus(minutes(1)).get()); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/time/TimeInterval.java b/sdk-core/src/test/java/com/sportradar/utils/time/TimeInterval.java new file mode 100644 index 00000000..acb5fefc --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/time/TimeInterval.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.time; + +public class TimeInterval { + + private static final long MILLIS_IN_SECOND = 1000L; + private static final long SECONDS_IN_MINUTE = 60L; + public static final long MILLIS_IN_MINUTE = MILLIS_IN_SECOND * SECONDS_IN_MINUTE; + private final long currentInMillis; + + private TimeInterval(final long millis) { + if (millis < 0) { + throw new IllegalArgumentException("Interval cannot be negative"); + } + this.currentInMillis = millis; + } + + public static TimeInterval seconds(int count) { + return new TimeInterval(count * MILLIS_IN_SECOND); + } + + public static TimeInterval minutes(int count) { + return new TimeInterval(count * MILLIS_IN_SECOND * SECONDS_IN_MINUTE); + } + + public long getInMillis() { + return currentInMillis; + } + + public TimeInterval plus(TimeInterval interval) { + return new TimeInterval(interval.getInMillis() + currentInMillis); + } + + public TimeInterval minus(TimeInterval interval) { + return new TimeInterval(currentInMillis - interval.getInMillis()); + } +} diff --git a/sdk-core/src/test/java/com/sportradar/utils/time/TimeIntervalTest.java b/sdk-core/src/test/java/com/sportradar/utils/time/TimeIntervalTest.java new file mode 100644 index 00000000..ec638b78 --- /dev/null +++ b/sdk-core/src/test/java/com/sportradar/utils/time/TimeIntervalTest.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) Sportradar AG. See LICENSE for full license governing this code + */ +package com.sportradar.utils.time; + +import static com.sportradar.utils.time.TimeInterval.minutes; +import static com.sportradar.utils.time.TimeInterval.seconds; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +@SuppressWarnings({ "MagicNumber", "StaticVariableName" }) +public final class TimeIntervalTest { + + public static final long SECONDS_IN_MINUTE = 60L; + public static final long MILLIS_IN_SECOND = 1000L; + + private static long MIDNIGHT = 1664402400000L; + + private TimeIntervalTest() {} + + public static class Minutes { + + public static final long MILLIS_IN_MINUTE = SECONDS_IN_MINUTE * MILLIS_IN_SECOND; + + @Test + public void getsUnderlyingValue() { + assertEquals(MILLIS_IN_MINUTE, minutes(1).getInMillis()); + } + + @Test + public void adds0() { + assertEquals(MILLIS_IN_MINUTE, minutes(1).plus(minutes(0)).getInMillis()); + } + + @Test + public void adds2() { + assertEquals(3L * MILLIS_IN_MINUTE, minutes(1).plus(minutes(2)).getInMillis()); + } + + @Test + public void subtracts0() { + assertEquals(3L * MILLIS_IN_MINUTE, minutes(3).minus(minutes(0)).getInMillis()); + } + + @Test + public void subtracts2() { + assertEquals(MILLIS_IN_MINUTE, minutes(3).minus(minutes(2)).getInMillis()); + } + + @Test + public void allowsToHaveIntervalEqualToPointInTime() { + assertEquals(0, minutes(3).minus(minutes(3)).getInMillis()); + } + + @Test + public void preventsIntervalFromBecomingNegative() { + assertThatThrownBy(() -> minutes(3).minus(minutes(4))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Interval cannot be negative"); + } + + @Test + public void shouldBeImmutable() { + TimeInterval interval = minutes(1); + assertEquals(2L * MILLIS_IN_SECOND * SECONDS_IN_MINUTE, interval.plus(minutes(1)).getInMillis()); + assertEquals(2L * MILLIS_IN_SECOND * SECONDS_IN_MINUTE, interval.plus(minutes(1)).getInMillis()); + } + } + + public static class Seconds { + + @Test + public void getsUnderlyingValue() { + assertEquals(MILLIS_IN_SECOND, seconds(1).getInMillis()); + } + + @Test + public void adds0() { + assertEquals(MILLIS_IN_SECOND, seconds(1).plus(seconds(0)).getInMillis()); + } + + @Test + public void adds2() { + assertEquals(3L * MILLIS_IN_SECOND, seconds(1).plus(seconds(2)).getInMillis()); + } + + @Test + public void subtracts0() { + assertEquals(3L * MILLIS_IN_SECOND, seconds(3).minus(seconds(0)).getInMillis()); + } + + @Test + public void subtracts2() { + assertEquals(MILLIS_IN_SECOND, seconds(3).minus(seconds(2)).getInMillis()); + } + + @Test + public void allowsToHaveIntervalEqualToPointInTime() { + assertEquals(0, seconds(3).minus(seconds(3)).getInMillis()); + } + + @Test + public void preventsIntervalFromBecomingNegative() { + assertThatThrownBy(() -> seconds(3).minus(seconds(4))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Interval cannot be negative"); + } + + @Test + public void shouldBeImmutable() { + TimeInterval interval = seconds(1); + assertEquals(2L * MILLIS_IN_SECOND, interval.plus(seconds(1)).getInMillis()); + assertEquals(2L * MILLIS_IN_SECOND, interval.plus(seconds(1)).getInMillis()); + } + } +} diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/TimeUtilsStub.java b/sdk-core/src/test/java/com/sportradar/utils/time/TimeUtilsStub.java similarity index 71% rename from sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/TimeUtilsStub.java rename to sdk-core/src/test/java/com/sportradar/utils/time/TimeUtilsStub.java index 28ac2344..60a2028c 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/TimeUtilsStub.java +++ b/sdk-core/src/test/java/com/sportradar/utils/time/TimeUtilsStub.java @@ -1,7 +1,9 @@ /* * Copyright (C) Sportradar AG. See LICENSE for full license governing this code */ -package com.sportradar.unifiedodds.sdk.impl.recovery; +package com.sportradar.utils.time; + +import static com.sportradar.utils.time.TimeInterval.seconds; import com.sportradar.unifiedodds.sdk.impl.TimeUtils; import com.sportradar.unifiedodds.sdk.testutil.generic.concurrent.AtomicActionPerformer; @@ -32,14 +34,27 @@ public Instant nowInstant() { return instant; } - public void fastForwardSeconds(int amount) { - atomicActionPerformer.perform(() -> instant = instant.plus(amount, ChronoUnit.SECONDS)); + public void tick(TimeInterval interval) { + atomicActionPerformer.perform(() -> instant = instant.plus(interval.getInMillis(), ChronoUnit.MILLIS) + ); + } + + public void tick() { + atomicActionPerformer.perform(() -> instant = instant.plus(1, ChronoUnit.MILLIS)); } public void travelTo(final Instant newInstant) { atomicActionPerformer.perform(() -> instant = newInstant); } + public void travelTo(final long epochMillis) { + atomicActionPerformer.perform(() -> instant = Instant.ofEpochMilli(epochMillis)); + } + + public void travelTo(final EpochMillis epochMillis) { + atomicActionPerformer.perform(() -> instant = Instant.ofEpochMilli(epochMillis.get())); + } + public static class Factory { private final AtomicActionPerformer atomicActionPerformer; diff --git a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/TimeUtilsStubTest.java b/sdk-core/src/test/java/com/sportradar/utils/time/TimeUtilsStubTest.java similarity index 61% rename from sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/TimeUtilsStubTest.java rename to sdk-core/src/test/java/com/sportradar/utils/time/TimeUtilsStubTest.java index 8060759c..99932e11 100644 --- a/sdk-core/src/test/java/com/sportradar/unifiedodds/sdk/impl/recovery/TimeUtilsStubTest.java +++ b/sdk-core/src/test/java/com/sportradar/utils/time/TimeUtilsStubTest.java @@ -1,8 +1,9 @@ /* * Copyright (C) Sportradar AG. See LICENSE for full license governing this code */ -package com.sportradar.unifiedodds.sdk.impl.recovery; +package com.sportradar.utils.time; +import static com.sportradar.utils.time.TimeInterval.seconds; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; @@ -15,6 +16,7 @@ public class TimeUtilsStubTest { private static final long MIDNIGHT_TIMESTAMP_MILLIS = 1664402400000L; private static final long MIDNIGHT_PLUS_1_SEC_MILLIS = 1664402400000L + 1000L; + private static final long MIDNIGHT_PLUS_1_MILLI_IN_MILLIS = 1664402400000L + 1L; @Test public void shouldRespectStubbedTime() { @@ -28,26 +30,40 @@ public void shouldRespectStubbedTime() { } @Test - public void shouldMoveTime1SecondForward() { + public void shouldMoveTimeForward() { Instant instant = Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); TimeUtilsStub timeUtils = TimeUtilsStub .threadSafe(new AtomicActionPerformer()) .withCurrentTime(instant); - timeUtils.fastForwardSeconds(1); + timeUtils.tick(seconds(1)); val expectedInstant = Instant.ofEpochMilli(MIDNIGHT_PLUS_1_SEC_MILLIS); assertEquals(expectedInstant, timeUtils.nowInstant()); assertEquals(expectedInstant.toEpochMilli(), timeUtils.now()); } + @Test + public void tickMovesTime1MillisecondForward() { + Instant instant = Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); + TimeUtilsStub timeUtils = TimeUtilsStub + .threadSafe(new AtomicActionPerformer()) + .withCurrentTime(instant); + + timeUtils.tick(); + + val expectedInstant = Instant.ofEpochMilli(MIDNIGHT_PLUS_1_MILLI_IN_MILLIS); + assertEquals(expectedInstant, timeUtils.nowInstant()); + assertEquals(expectedInstant.toEpochMilli(), timeUtils.now()); + } + @Test public void shouldEnsureStateModificationIsSynchronisedWhenFastForwarding() { Instant instant = Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); AtomicActionPerformer noOpAction = mock(AtomicActionPerformer.class); TimeUtilsStub timeUtils = TimeUtilsStub.threadSafe(noOpAction).withCurrentTime(instant); - timeUtils.fastForwardSeconds(1); + timeUtils.tick(seconds(1)); val expectedInstantNotChanged = instant; assertEquals(expectedInstantNotChanged, timeUtils.nowInstant()); @@ -55,7 +71,7 @@ public void shouldEnsureStateModificationIsSynchronisedWhenFastForwarding() { } @Test - public void timeTravelingShouldChangeCurrentTime() { + public void timeTravelingToInstantShouldChangeCurrentTime() { Instant instant = Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); Instant newTimeInstant = Instant.ofEpochMilli(MIDNIGHT_PLUS_1_SEC_MILLIS); TimeUtilsStub time = TimeUtilsStub.threadSafe(new AtomicActionPerformer()).withCurrentTime(instant); @@ -67,6 +83,30 @@ public void timeTravelingShouldChangeCurrentTime() { assertEquals(expectedInstant.toEpochMilli(), time.now()); } + @Test + public void timeTravelingToEpochMillisAsLongShouldChangeCurrentTime() { + Instant instant = Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); + TimeUtilsStub time = TimeUtilsStub.threadSafe(new AtomicActionPerformer()).withCurrentTime(instant); + + time.travelTo(MIDNIGHT_PLUS_1_SEC_MILLIS); + + val expectedInstant = Instant.ofEpochMilli(MIDNIGHT_PLUS_1_SEC_MILLIS); + assertEquals(expectedInstant, time.nowInstant()); + assertEquals(expectedInstant.toEpochMilli(), time.now()); + } + + @Test + public void timeTravelingToEpochMillisShouldChangeCurrentTime() { + Instant instant = Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); + TimeUtilsStub time = TimeUtilsStub.threadSafe(new AtomicActionPerformer()).withCurrentTime(instant); + + time.travelTo(new EpochMillis(MIDNIGHT_PLUS_1_SEC_MILLIS)); + + val expectedInstant = Instant.ofEpochMilli(MIDNIGHT_PLUS_1_SEC_MILLIS); + assertEquals(expectedInstant, time.nowInstant()); + assertEquals(expectedInstant.toEpochMilli(), time.now()); + } + @Test public void shouldEnsureStateModificationIsSynchronisedWhenTimeTravelling() { Instant instant = Instant.ofEpochMilli(MIDNIGHT_TIMESTAMP_MILLIS); diff --git a/sdk-example/pom.xml b/sdk-example/pom.xml index a7c25d21..012804ab 100644 --- a/sdk-example/pom.xml +++ b/sdk-example/pom.xml @@ -8,7 +8,7 @@ unified-feed-sdk-parent com.sportradar.unifiedodds.sdk - 3.0.0 + 3.1.0 com.sportradar.unifiedodds.sdk.example diff --git a/sdk-example/src/main/java/com/sportradar/unifiedodds/example/BasicUofSdkExampleMain.java b/sdk-example/src/main/java/com/sportradar/unifiedodds/example/BasicUofSdkExampleMain.java index e7a3ee31..f52b2e39 100644 --- a/sdk-example/src/main/java/com/sportradar/unifiedodds/example/BasicUofSdkExampleMain.java +++ b/sdk-example/src/main/java/com/sportradar/unifiedodds/example/BasicUofSdkExampleMain.java @@ -11,6 +11,7 @@ import com.sportradar.unifiedodds.sdk.cfg.Environment; import com.sportradar.unifiedodds.sdk.cfg.UofConfiguration; import com.sportradar.unifiedodds.sdk.exceptions.InitException; +import com.sportradar.unifiedodds.sdk.impl.EnvironmentManager; import java.io.IOException; import java.util.Locale; @@ -29,12 +30,11 @@ public static void main(String[] args) throws InitException, IOException, Interr // - directly setting the access token in the builder using the setAccessToken(String accessToken) method UofConfiguration config = UofSdk .getUofConfigurationBuilder() - .setAccessToken("tkIQxFhK84x4QdgPXR") + .setAccessToken("your-staging-token-here") .selectEnvironment(Environment.GlobalIntegration) .setNodeId(SdkConstants.NODE_ID) .setDefaultLanguage(Locale.ENGLISH) .build(); - // create the new feed UofSdk uofSdk = new UofSdk(new GlobalEventsListener(), config); diff --git a/sdk-example/src/main/resources/application.yml.all b/sdk-example/src/main/resources/application.yml.all index f32df782..6c0287dd 100644 --- a/sdk-example/src/main/resources/application.yml.all +++ b/sdk-example/src/main/resources/application.yml.all @@ -1,4 +1,4 @@ -# all the configuration properties are optional, for detailed description check the "ConfigurationAccessTokenSetter" +# all the configuration properties are optional, for detailed description check the "TokenSetter" sportradar: sdk: @@ -11,27 +11,25 @@ sportradar: defaultLanguage: # a comma delimited list of the desired languages [en,it,de,...] desiredLanguages: - - - # message broker related properties - messaging: - host: - port: - username: - password: - virtualHost: - # an indication if the connection to the messaging broker should use ssl (boolean) - messagingUseSsl: - # the api host - apiHost: - # the api port - apiPort: - # an indication if the request to the API should use ssl (boolean) - apiUseSsl: # a comma delimited list of producer identifiers that should be automatically disabled [3,4,...] disabledProducers: - - - # the exception handling strategy that should be used through the SDK (throw/catch) + # the exception handling strategy that should be used through the SDK (Throw/Catch) exceptionHandlingStrategy: - # a value indicating to which unified feed environment sdk should connect + # (Integration, Production, Custom, Replay, + # GlobalReplay, GlobalProduction, GlobalIntegration, + # ProxySingapore, ProxyTokyo) environment: + + # message broker related properties - only used when setting Custom environment + messagingHost: + messagingPort: + messagingUsername: + messagingPassword: + messagingVirtualHost: + messagingUseSsl: + + # the api host related properties - only used when setting Custom environment + apiHost: + apiPort: + apiUseSsl: \ No newline at end of file diff --git a/sdk-example/src/main/resources/logback.xml b/sdk-example/src/main/resources/logback.xml index b7e0ac1d..80183c63 100644 --- a/sdk-example/src/main/resources/logback.xml +++ b/sdk-example/src/main/resources/logback.xml @@ -147,6 +147,8 @@ + +

j`t6E&YuMr>zs4UF}~wFJ~Pugtnf-2 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