From 08368caffd47ad3ce1ccb8b57f770865173837a4 Mon Sep 17 00:00:00 2001 From: Ron Conescu Date: Tue, 2 Jun 2015 22:02:16 -0700 Subject: [PATCH 1/8] New task-scheduling infrastructure. This commit contains a major architectural revision: cleaning up our scheduling system. The original system scheduled tasks into the future; this system maintains the scheduling rules, but doesn't actually schedule anything until the user taps on it. We also: - centralized lots of code, making it easier to maintain and debug - made certain common features (schedule delays and task-expiration periods) data-driven instead of software-driven --- .../APCAppCore.xcodeproj/project.pbxproj | 441 +- APCAppCore/APCAppCore/APCAppCore.h | 18 +- .../APCAppCore/Consent/APCConsentTask.h | 6 +- .../APCAppCore/Consent/APCConsentTask.m | 28 + .../DataMonitor/APCDataMonitor+Bridge.h | 8 +- .../DataMonitor/APCDataMonitor+Bridge.m | 59 +- .../APCAppCore/DataMonitor/APCDataMonitor.m | 10 +- .../APCDataSubstrate+HealthKit.h | 40 + .../APCDataSubstrate+HealthKit.m | 45 + .../APCDataSubstrate+ResearchKit.m | 1 - .../DataSubstrate/APCDataSubstrate.h | 85 +- .../DataSubstrate/APCDataSubstrate.m | 283 +- .../APCDataMigrationMetadata_Model4ToModel6.h | 52 + .../APCDataMigrationMetadata_Model4ToModel6.m | 54 + .../APCDataMigrationPolicy_Model4ToModel6.h | 44 + .../APCDataMigrationPolicy_Model4ToModel6.m | 545 +++ .../DataSubstrate/Model/APCDateRange.m | 10 +- .../xcmapping.xml | 644 +++ .../APCModel.xcdatamodeld/.xccurrentversion | 2 +- .../APCModel 5.xcdatamodel/contents | 152 + .../APCModel 6.xcdatamodel/contents | 145 + .../Model/APCPotentialScheduledTask.h | 48 + .../Model/APCPotentialScheduledTask.m | 95 + .../DataSubstrate/Model/APCResult+Bridge.m | 2 - .../DataSubstrate/Model/APCSchedule+AddOn.h | 74 +- .../DataSubstrate/Model/APCSchedule+AddOn.m | 274 +- .../DataSubstrate/Model/APCSchedule+Bridge.h | 4 - .../DataSubstrate/Model/APCSchedule+Bridge.m | 113 - .../DataSubstrate/Model/APCSchedule.h | 84 +- .../DataSubstrate/Model/APCSchedule.m | 78 +- .../Model/APCScheduledTask+AddOn.h | 10 - .../Model/APCScheduledTask+AddOn.m | 167 +- .../DataSubstrate/Model/APCScheduledTask.h | 71 +- .../DataSubstrate/Model/APCScheduledTask.m | 68 +- .../DataSubstrate/Model/APCSmartSurveyTask.m | 1 + .../DataSubstrate/Model/APCTask+AddOn.h | 23 +- .../DataSubstrate/Model/APCTask+AddOn.m | 112 +- .../DataSubstrate/Model/APCTask+Bridge.m | 2 - .../APCAppCore/DataSubstrate/Model/APCTask.h | 88 +- .../APCAppCore/DataSubstrate/Model/APCTask.m | 76 +- .../DataSubstrate/Model/APCTaskGroup.h | 156 + .../DataSubstrate/Model/APCTaskGroup.m | 258 + .../APCAppCore/DataSubstrate/Model/APCUser.h | 20 +- .../APCAppCore/DataSubstrate/Model/APCUser.m | 45 +- .../Model/MODEL_MIGRATION_README.txt | 211 + .../Model/{MODEL_README => MODEL_README.txt} | 34 + .../Library/APCMotionHistoryReporter.m | 34 +- .../AppearanceHelpers/APCAppearanceInfo.m | 80 +- .../Categories/CLLocation+APCAdditions.h | 1 + .../Categories/CLLocation+APCAdditions.m | 13 + .../Categories/CMMotionActivity+Helper.m | 9 + .../Library/Categories/NSArray+APCHelper.h | 91 + .../Library/Categories/NSArray+APCHelper.m | 194 + .../Library/Categories/NSDate+Helper.h | 150 +- .../Library/Categories/NSDate+Helper.m | 342 +- .../Categories/NSDateComponents+Helper.m | 7 + .../Categories/NSDictionary+APCAdditions.h | 26 + .../Categories/NSDictionary+APCAdditions.m | 91 +- .../Library/Categories/NSError+APCAdditions.h | 106 +- .../Library/Categories/NSError+APCAdditions.m | 84 +- .../Categories/NSManagedObject+APCHelper.h | 25 +- .../Categories/NSManagedObject+APCHelper.m | 19 +- .../APCPassiveDataCollector.h | 1 + .../APCPassiveDataCollector.m | 6 +- .../Collectors/APCHealthKitDataBridge.h | 52 + .../Collectors/APCHealthKitDataBridge.m | 99 + .../Data Sink/APCPassiveDataSink.m | 2 +- ...BGuidCreatedOnVersionHolder+APCAdditions.h | 10 +- ...BGuidCreatedOnVersionHolder+APCAdditions.m | 40 +- .../Categories/SBBSchedule+APCHelper.h | 45 + .../Categories/SBBSchedule+APCHelper.m | 53 + .../APCDataArchiver.h | 82 + .../APCDataArchiver.m | 787 ++++ .../APCDataUploader.h | 71 + .../APCDataUploader.m | 283 ++ .../APCPassiveDataCollector.h | 47 + .../APCPassiveDataCollector.m | 335 ++ .../Trackers/APCCoreLocationTracker.h | 43 + .../Trackers/APCCoreLocationTracker.m | 361 ++ .../Trackers/APCCoreMotionTracker.h | 42 + .../Trackers/APCCoreMotionTracker.m | 87 + .../Trackers/APCDataTracker.h | 62 + .../Trackers/APCDataTracker.m | 101 + .../Trackers/APCHKCumulativeQuantityTracker.h | 44 + .../Trackers/APCHKCumulativeQuantityTracker.m | 184 + .../Trackers/APCHKDiscreteQuantityTracker.h | 44 + .../Trackers/APCHKDiscreteQuantityTracker.m | 173 + .../APCDataArchiverAndUploader.m | 5 +- .../APCDataVerificationClient.h | 23 +- .../APCDataVerificationClient.m | 10 +- .../APCDataVerificationServerAccessControl.h | 49 + .../Library/DataVerificationClient/ReadMe.txt | 5 + .../APCAppCore/Library/Insights/APCInsights.m | 2 +- .../APCAppCore/Library/Logging/APCLog.m | 12 + .../APCMedTrackerDataStorageManager.h | 25 +- .../APCMedTrackerDataStorageManager.m | 107 +- .../APCMedTrackerInflatableItem+Helper.h | 3 +- .../APCMedTrackerInflatableItem+Helper.m | 16 +- .../APCMedicationLozenge.h | 4 +- ...CMedicationTrackerCalendarViewController.h | 3 + ...CMedicationTrackerCalendarViewController.m | 14 +- .../APCMedicationColorViewController.m | 4 +- .../APCMedicationNameViewController.m | 4 +- .../APCMedicationTrackerSetupViewController.h | 6 + .../APCMedicationTrackerSetupViewController.m | 29 +- .../APCAppCore/Library/Objects/APCConstants.h | 136 +- .../APCAppCore/Library/Objects/APCConstants.m | 108 +- .../Library/Objects/APCKeychainStore.h | 1 + .../Library/Objects/APCKeychainStore.m | 73 +- .../Library/Objects/APCTasksReminderManager.h | 2 +- .../Library/Objects/APCTasksReminderManager.m | 2 +- .../APCAppCore/Library/Objects/APCUtilities.h | 114 +- .../APCAppCore/Library/Objects/APCUtilities.m | 38 + .../Permissions/APCPermissionsManager.h | 1 + .../Permissions/APCPermissionsManager.m | 1 + .../APCScheduleExpression.h | 6 +- .../APCScheduleExpression.m | 6 +- .../Internals/APCPointSelector.m | 2 +- .../Internals/APCScheduleEnumerator.h | 9 +- .../Internals/APCScheduleEnumerator.m | 32 +- .../Internals/APCScheduleExpressionParser.m | 2 +- .../APCScheduleExpressionTokenizer.m | 11 +- .../Scheduler/APCActivitiesDateState.h | 40 + .../Scheduler/APCActivitiesDateState.m | 147 + .../Scheduler/APCScheduleDebugPrinter.h | 52 + .../Scheduler/APCScheduleDebugPrinter.m | 269 ++ .../Scheduler/APCScheduleIntervalEnumerator.h | 50 + .../Scheduler/APCScheduleIntervalEnumerator.m | 270 ++ .../Library/Scheduler/APCScheduler.h | 129 +- .../Library/Scheduler/APCScheduler.m | 3443 ++++++++++++-- .../Scheduler/APCTaskGroupCacheEntry.h | 64 + .../Scheduler/APCTaskGroupCacheEntry.m | 65 + .../Scheduler/APCTopLevelScheduleEnumerator.h | 80 + .../Scheduler/APCTopLevelScheduleEnumerator.m | 205 + .../APCAppCore/Library/Scoring/APCScoring.h | 1 + .../APCAppCore/Library/Scoring/APCScoring.m | 70 +- .../Resources/get_debug_ip_address.sh | 39 +- .../APCAppCore/Startup/APCAppDelegate.h | 15 +- .../APCAppCore/Startup/APCAppDelegate.m | 275 +- .../Startup/APCTabBarViewController.m | 3 + .../APCTasksAndSchedulesMigrationUtility.m | 31 +- .../GraphCharts/APCCubicCurveAlgorithm.m | 2 +- .../GraphCharts/APCDiscreteGraphView.h | 2 +- .../GraphCharts/APCDiscreteGraphView.m | 87 +- .../Components/GraphCharts/APCLineGraphView.h | 2 +- .../Components/GraphCharts/APCLineGraphView.m | 24 +- .../APCAppCore/UI/Model/APCTableViewItem.m | 3 +- .../UI/Onboarding/APCOnboarding.storyboard | 186 +- .../UI/Onboarding/APCShareViewController.m | 10 + .../UI/Onboarding/APCSpinnerViewController.m | 1 + ...APCStudyOverviewCollectionViewController.m | 12 + .../APCStudyOverviewViewController.m | 15 + .../UI/Onboarding/APCUserInfoConstants.h | 2 + .../UI/Onboarding/APCWebViewController.h | 3 + .../UI/Onboarding/APCWebViewController.m | 62 +- .../SignUp/APCEligibleViewController.m | 4 +- .../APCSignUpGeneralInfoViewController.m | 33 + .../SignUp/APCSignupPasscodeViewController.m | 9 +- .../Activities/APCActivities.storyboard | 603 ++- .../Activities/APCActivitiesViewController.h | 3 +- .../Activities/APCActivitiesViewController.m | 983 ++-- .../Activities/APCActivitiesViewSection.h | 62 + .../Activities/APCActivitiesViewSection.m | 210 + .../APCDashboardEditViewController.m | 2 +- .../Dashboard/APCDashboardViewController.m | 2 +- .../Dashboard/APCGraphViewController.h | 2 +- .../Dashboard/APCGraphViewController.m | 2 +- .../Learn/APCLearn.storyboard | 22 +- .../Learn/APCLearnMasterViewController.m | 16 +- .../Profile/APCDemographicUploader.m | 22 +- .../Profile/APCProfile.storyboard | 85 +- .../Profile/APCProfileViewController.m | 226 +- .../APCActivitiesSectionHeaderView.h | 2 - .../APCActivitiesSectionHeaderView.m | 5 +- .../APCActivitiesSectionHeaderView.xib | 11 +- .../APCActivitiesTintedTableViewCell.h | 30 +- .../APCActivitiesTintedTableViewCell.m | 180 +- .../TasksAndSteps/APCBaseTaskViewController.h | 21 + .../TasksAndSteps/APCBaseTaskViewController.m | 274 +- .../APCSimpleTaskSummaryViewController.m | 16 - .../UI/ViewControllers/APCPasscode.storyboard | 17 +- .../APCPasscodeViewController.m | 5 +- .../APCActivityTrackingStepViewController.m | 28 + .../APCAppCoreTests/APCNewScheduleTests.m | 74 + APCAppCore/BridgeSDK/BridgeSDK.framework | 1 + APCAppCore/openssl.framework/Headers/aes.h | 149 + APCAppCore/openssl.framework/Headers/asn1.h | 1418 ++++++ .../openssl.framework/Headers/asn1_mac.h | 579 +++ APCAppCore/openssl.framework/Headers/asn1t.h | 973 ++++ APCAppCore/openssl.framework/Headers/bio.h | 878 ++++ .../openssl.framework/Headers/blowfish.h | 130 + APCAppCore/openssl.framework/Headers/bn.h | 934 ++++ APCAppCore/openssl.framework/Headers/buffer.h | 119 + .../openssl.framework/Headers/camellia.h | 132 + APCAppCore/openssl.framework/Headers/cast.h | 107 + APCAppCore/openssl.framework/Headers/cmac.h | 82 + APCAppCore/openssl.framework/Headers/cms.h | 555 +++ APCAppCore/openssl.framework/Headers/comp.h | 79 + APCAppCore/openssl.framework/Headers/conf.h | 267 ++ .../openssl.framework/Headers/conf_api.h | 89 + APCAppCore/openssl.framework/Headers/crypto.h | 661 +++ APCAppCore/openssl.framework/Headers/des.h | 257 + .../openssl.framework/Headers/des_old.h | 497 ++ APCAppCore/openssl.framework/Headers/dh.h | 392 ++ APCAppCore/openssl.framework/Headers/dsa.h | 332 ++ APCAppCore/openssl.framework/Headers/dso.h | 451 ++ APCAppCore/openssl.framework/Headers/dtls1.h | 271 ++ APCAppCore/openssl.framework/Headers/e_os2.h | 322 ++ APCAppCore/openssl.framework/Headers/ebcdic.h | 26 + APCAppCore/openssl.framework/Headers/ec.h | 1281 +++++ APCAppCore/openssl.framework/Headers/ecdh.h | 134 + APCAppCore/openssl.framework/Headers/ecdsa.h | 335 ++ APCAppCore/openssl.framework/Headers/engine.h | 960 ++++ APCAppCore/openssl.framework/Headers/err.h | 389 ++ APCAppCore/openssl.framework/Headers/evp.h | 1519 ++++++ APCAppCore/openssl.framework/Headers/hmac.h | 109 + .../openssl.framework/Headers/krb5_asn.h | 240 + APCAppCore/openssl.framework/Headers/kssl.h | 197 + APCAppCore/openssl.framework/Headers/lhash.h | 240 + APCAppCore/openssl.framework/Headers/md4.h | 119 + APCAppCore/openssl.framework/Headers/md5.h | 119 + APCAppCore/openssl.framework/Headers/mdc2.h | 94 + APCAppCore/openssl.framework/Headers/modes.h | 163 + .../openssl.framework/Headers/obj_mac.h | 4194 +++++++++++++++++ .../openssl.framework/Headers/objects.h | 1143 +++++ APCAppCore/openssl.framework/Headers/ocsp.h | 637 +++ .../openssl.framework/Headers/opensslconf.h | 265 ++ .../openssl.framework/Headers/opensslv.h | 97 + .../openssl.framework/Headers/ossl_typ.h | 211 + APCAppCore/openssl.framework/Headers/pem.h | 615 +++ APCAppCore/openssl.framework/Headers/pem2.h | 70 + APCAppCore/openssl.framework/Headers/pkcs12.h | 342 ++ APCAppCore/openssl.framework/Headers/pkcs7.h | 481 ++ APCAppCore/openssl.framework/Headers/pqueue.h | 99 + APCAppCore/openssl.framework/Headers/rand.h | 150 + APCAppCore/openssl.framework/Headers/rc2.h | 103 + APCAppCore/openssl.framework/Headers/rc4.h | 88 + APCAppCore/openssl.framework/Headers/ripemd.h | 105 + APCAppCore/openssl.framework/Headers/rsa.h | 664 +++ .../openssl.framework/Headers/safestack.h | 2672 +++++++++++ APCAppCore/openssl.framework/Headers/seed.h | 149 + APCAppCore/openssl.framework/Headers/sha.h | 214 + APCAppCore/openssl.framework/Headers/srp.h | 169 + APCAppCore/openssl.framework/Headers/srtp.h | 147 + APCAppCore/openssl.framework/Headers/ssl.h | 3159 +++++++++++++ APCAppCore/openssl.framework/Headers/ssl2.h | 265 ++ APCAppCore/openssl.framework/Headers/ssl23.h | 84 + APCAppCore/openssl.framework/Headers/ssl3.h | 774 +++ APCAppCore/openssl.framework/Headers/stack.h | 107 + .../openssl.framework/Headers/symhacks.h | 516 ++ APCAppCore/openssl.framework/Headers/tls1.h | 813 ++++ APCAppCore/openssl.framework/Headers/ts.h | 862 ++++ APCAppCore/openssl.framework/Headers/txt_db.h | 112 + APCAppCore/openssl.framework/Headers/ui.h | 415 ++ .../openssl.framework/Headers/ui_compat.h | 88 + .../openssl.framework/Headers/whrlpool.h | 41 + APCAppCore/openssl.framework/Headers/x509.h | 1327 ++++++ .../openssl.framework/Headers/x509_vfy.h | 641 +++ APCAppCore/openssl.framework/Headers/x509v3.h | 1055 +++++ APCAppCore/openssl.framework/openssl | Bin 0 -> 17120740 bytes DataVerificationServer/ReadMe.txt | 5 + .../dataVerificationServer.rb | 297 ++ DataVerificationServer/simpleFileToUpload.txt | 6 + 263 files changed, 54417 insertions(+), 2950 deletions(-) create mode 100644 APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.h create mode 100644 APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.m create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.h create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.m create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.h create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.m create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCMappingModel4ToModel6.xcmappingmodel/xcmapping.xml create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 5.xcdatamodel/contents create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 6.xcdatamodel/contents create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.h create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.m create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.h create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.m create mode 100644 APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_MIGRATION_README.txt rename APCAppCore/APCAppCore/DataSubstrate/Model/{MODEL_README => MODEL_README.txt} (50%) create mode 100644 APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.h create mode 100644 APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.m create mode 100644 APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.h create mode 100644 APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.m create mode 100644 APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.h create mode 100644 APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.m create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.h create mode 100644 APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.m create mode 100644 APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationServerAccessControl.h create mode 100644 APCAppCore/APCAppCore/Library/DataVerificationClient/ReadMe.txt create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.h create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.m create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.h create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.m create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.h create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.m create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.h create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.m create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.h create mode 100644 APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.m create mode 100644 APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.h create mode 100644 APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.m create mode 100644 APCAppCore/APCAppCoreTests/APCNewScheduleTests.m create mode 120000 APCAppCore/BridgeSDK/BridgeSDK.framework create mode 100644 APCAppCore/openssl.framework/Headers/aes.h create mode 100644 APCAppCore/openssl.framework/Headers/asn1.h create mode 100644 APCAppCore/openssl.framework/Headers/asn1_mac.h create mode 100644 APCAppCore/openssl.framework/Headers/asn1t.h create mode 100644 APCAppCore/openssl.framework/Headers/bio.h create mode 100644 APCAppCore/openssl.framework/Headers/blowfish.h create mode 100644 APCAppCore/openssl.framework/Headers/bn.h create mode 100644 APCAppCore/openssl.framework/Headers/buffer.h create mode 100644 APCAppCore/openssl.framework/Headers/camellia.h create mode 100644 APCAppCore/openssl.framework/Headers/cast.h create mode 100644 APCAppCore/openssl.framework/Headers/cmac.h create mode 100644 APCAppCore/openssl.framework/Headers/cms.h create mode 100644 APCAppCore/openssl.framework/Headers/comp.h create mode 100644 APCAppCore/openssl.framework/Headers/conf.h create mode 100644 APCAppCore/openssl.framework/Headers/conf_api.h create mode 100644 APCAppCore/openssl.framework/Headers/crypto.h create mode 100644 APCAppCore/openssl.framework/Headers/des.h create mode 100644 APCAppCore/openssl.framework/Headers/des_old.h create mode 100644 APCAppCore/openssl.framework/Headers/dh.h create mode 100644 APCAppCore/openssl.framework/Headers/dsa.h create mode 100644 APCAppCore/openssl.framework/Headers/dso.h create mode 100644 APCAppCore/openssl.framework/Headers/dtls1.h create mode 100644 APCAppCore/openssl.framework/Headers/e_os2.h create mode 100644 APCAppCore/openssl.framework/Headers/ebcdic.h create mode 100644 APCAppCore/openssl.framework/Headers/ec.h create mode 100644 APCAppCore/openssl.framework/Headers/ecdh.h create mode 100644 APCAppCore/openssl.framework/Headers/ecdsa.h create mode 100644 APCAppCore/openssl.framework/Headers/engine.h create mode 100644 APCAppCore/openssl.framework/Headers/err.h create mode 100644 APCAppCore/openssl.framework/Headers/evp.h create mode 100644 APCAppCore/openssl.framework/Headers/hmac.h create mode 100644 APCAppCore/openssl.framework/Headers/krb5_asn.h create mode 100644 APCAppCore/openssl.framework/Headers/kssl.h create mode 100644 APCAppCore/openssl.framework/Headers/lhash.h create mode 100644 APCAppCore/openssl.framework/Headers/md4.h create mode 100644 APCAppCore/openssl.framework/Headers/md5.h create mode 100644 APCAppCore/openssl.framework/Headers/mdc2.h create mode 100644 APCAppCore/openssl.framework/Headers/modes.h create mode 100644 APCAppCore/openssl.framework/Headers/obj_mac.h create mode 100644 APCAppCore/openssl.framework/Headers/objects.h create mode 100644 APCAppCore/openssl.framework/Headers/ocsp.h create mode 100644 APCAppCore/openssl.framework/Headers/opensslconf.h create mode 100644 APCAppCore/openssl.framework/Headers/opensslv.h create mode 100644 APCAppCore/openssl.framework/Headers/ossl_typ.h create mode 100644 APCAppCore/openssl.framework/Headers/pem.h create mode 100644 APCAppCore/openssl.framework/Headers/pem2.h create mode 100644 APCAppCore/openssl.framework/Headers/pkcs12.h create mode 100644 APCAppCore/openssl.framework/Headers/pkcs7.h create mode 100644 APCAppCore/openssl.framework/Headers/pqueue.h create mode 100644 APCAppCore/openssl.framework/Headers/rand.h create mode 100644 APCAppCore/openssl.framework/Headers/rc2.h create mode 100644 APCAppCore/openssl.framework/Headers/rc4.h create mode 100644 APCAppCore/openssl.framework/Headers/ripemd.h create mode 100644 APCAppCore/openssl.framework/Headers/rsa.h create mode 100644 APCAppCore/openssl.framework/Headers/safestack.h create mode 100644 APCAppCore/openssl.framework/Headers/seed.h create mode 100644 APCAppCore/openssl.framework/Headers/sha.h create mode 100644 APCAppCore/openssl.framework/Headers/srp.h create mode 100644 APCAppCore/openssl.framework/Headers/srtp.h create mode 100644 APCAppCore/openssl.framework/Headers/ssl.h create mode 100644 APCAppCore/openssl.framework/Headers/ssl2.h create mode 100644 APCAppCore/openssl.framework/Headers/ssl23.h create mode 100644 APCAppCore/openssl.framework/Headers/ssl3.h create mode 100644 APCAppCore/openssl.framework/Headers/stack.h create mode 100644 APCAppCore/openssl.framework/Headers/symhacks.h create mode 100644 APCAppCore/openssl.framework/Headers/tls1.h create mode 100644 APCAppCore/openssl.framework/Headers/ts.h create mode 100644 APCAppCore/openssl.framework/Headers/txt_db.h create mode 100644 APCAppCore/openssl.framework/Headers/ui.h create mode 100644 APCAppCore/openssl.framework/Headers/ui_compat.h create mode 100644 APCAppCore/openssl.framework/Headers/whrlpool.h create mode 100644 APCAppCore/openssl.framework/Headers/x509.h create mode 100644 APCAppCore/openssl.framework/Headers/x509_vfy.h create mode 100644 APCAppCore/openssl.framework/Headers/x509v3.h create mode 100644 APCAppCore/openssl.framework/openssl create mode 100644 DataVerificationServer/ReadMe.txt create mode 100644 DataVerificationServer/dataVerificationServer.rb create mode 100644 DataVerificationServer/simpleFileToUpload.txt diff --git a/APCAppCore/APCAppCore.xcodeproj/project.pbxproj b/APCAppCore/APCAppCore.xcodeproj/project.pbxproj index eef52084..48dda6ba 100644 --- a/APCAppCore/APCAppCore.xcodeproj/project.pbxproj +++ b/APCAppCore/APCAppCore.xcodeproj/project.pbxproj @@ -71,12 +71,17 @@ 08EA2AB31A7AD564007549C0 /* UIImage+ImageEffects.h in Headers */ = {isa = PBXBuildFile; fileRef = 08EA2AB11A7AD564007549C0 /* UIImage+ImageEffects.h */; }; 08EA2AB41A7AD564007549C0 /* UIImage+ImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = 08EA2AB21A7AD564007549C0 /* UIImage+ImageEffects.m */; }; 360C63D11A339746002EC86C /* NSDateComponentsHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 360C63D01A339746002EC86C /* NSDateComponentsHelperTests.m */; }; + 36175FB61B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.h in Headers */ = {isa = PBXBuildFile; fileRef = 36175FB41B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.h */; }; + 36175FB71B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.m in Sources */ = {isa = PBXBuildFile; fileRef = 36175FB51B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.m */; }; + 3624092B1A8181350005B1A7 /* get_debug_ip_address.sh in Resources */ = {isa = PBXBuildFile; fileRef = 3624092A1A8181350005B1A7 /* get_debug_ip_address.sh */; }; 36257FBD1AA714B60060B95A /* CMMotionActivity+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 36257FBB1AA714B60060B95A /* CMMotionActivity+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 36257FBE1AA714B60060B95A /* CMMotionActivity+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 36257FBC1AA714B60060B95A /* CMMotionActivity+Helper.m */; }; 3627D3481A9A7517006B02E8 /* APCMedTrackerMedication.h in Headers */ = {isa = PBXBuildFile; fileRef = 3627D3461A9A7517006B02E8 /* APCMedTrackerMedication.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3627D3491A9A7517006B02E8 /* APCMedTrackerMedication.m in Sources */ = {isa = PBXBuildFile; fileRef = 3627D3471A9A7517006B02E8 /* APCMedTrackerMedication.m */; }; 3627D34C1A9A7517006B02E8 /* APCMedTrackerPossibleDosage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3627D34A1A9A7517006B02E8 /* APCMedTrackerPossibleDosage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3627D34D1A9A7517006B02E8 /* APCMedTrackerPossibleDosage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3627D34B1A9A7517006B02E8 /* APCMedTrackerPossibleDosage.m */; }; + 363BCA2A1AEC074D00B10A7F /* SBBSchedule+APCHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 363BCA281AEC074D00B10A7F /* SBBSchedule+APCHelper.h */; }; + 363BCA2B1AEC074D00B10A7F /* SBBSchedule+APCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 363BCA291AEC074D00B10A7F /* SBBSchedule+APCHelper.m */; }; 364D348A1A7B1C8F0060B3F5 /* APCDataVerificationClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 364D34881A7B1C8F0060B3F5 /* APCDataVerificationClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; 364D348B1A7B1C8F0060B3F5 /* APCDataVerificationClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 364D34891A7B1C8F0060B3F5 /* APCDataVerificationClient.m */; }; 3650C65B1AA29BB50075C935 /* APCCatastrophicErrorViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3650C6581AA29BB50075C935 /* APCCatastrophicErrorViewController.h */; }; @@ -86,15 +91,24 @@ 3651424E1AA78521008A5CFA /* APCDataArchiverAndUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3651424C1AA78521008A5CFA /* APCDataArchiverAndUploader.m */; }; 3654318D1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 3654318B1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3654318E1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 3654318C1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.m */; }; + 366F5A2E1AE5C42900E1D28F /* APCTaskGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = 366F5A2C1AE5C42900E1D28F /* APCTaskGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 366F5A2F1AE5C42900E1D28F /* APCTaskGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 366F5A2D1AE5C42900E1D28F /* APCTaskGroup.m */; }; + 367067501AF57DBE0069B4E5 /* NSArray+APCHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 3670674E1AF57DBE0069B4E5 /* NSArray+APCHelper.h */; }; + 367067511AF57DBE0069B4E5 /* NSArray+APCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3670674F1AF57DBE0069B4E5 /* NSArray+APCHelper.m */; }; 36829A411A96B937000AA2AB /* APCMedTrackerPredefinedMedications.plist in Resources */ = {isa = PBXBuildFile; fileRef = 369E27E41A96B7A200D35DFA /* APCMedTrackerPredefinedMedications.plist */; }; 36829A421A96B937000AA2AB /* APCMedTrackerPredefinedPossibleDosages.plist in Resources */ = {isa = PBXBuildFile; fileRef = 369E27E51A96B7A200D35DFA /* APCMedTrackerPredefinedPossibleDosages.plist */; }; 36829A431A96B937000AA2AB /* APCMedTrackerPredefinedPrescriptionColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 369E27E61A96B7A200D35DFA /* APCMedTrackerPredefinedPrescriptionColors.plist */; }; 36829A531A96B98F000AA2AB /* NSOperationQueue+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 36829A511A96B98F000AA2AB /* NSOperationQueue+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 36829A541A96B98F000AA2AB /* NSOperationQueue+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 36829A521A96B98F000AA2AB /* NSOperationQueue+Helper.m */; }; + 3687642A1ACF5E4200806A32 /* APCDataVerificationServerAccessControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 368764291ACF5E4200806A32 /* APCDataVerificationServerAccessControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36879C221ACF720600C4BE91 /* APCNewScheduleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36879C211ACF720600C4BE91 /* APCNewScheduleTests.m */; }; + 3689C1F21AF45594002426C5 /* APCActivitiesViewSection.h in Headers */ = {isa = PBXBuildFile; fileRef = 3689C1F01AF45594002426C5 /* APCActivitiesViewSection.h */; }; + 3689C1F31AF45594002426C5 /* APCActivitiesViewSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 3689C1F11AF45594002426C5 /* APCActivitiesViewSection.m */; }; 368BAFE91A9AD91A00F04ABB /* APCMedTrackerDailyDosageRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 368BAFE71A9AD91A00F04ABB /* APCMedTrackerDailyDosageRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; 368BAFEA1A9AD91A00F04ABB /* APCMedTrackerDailyDosageRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = 368BAFE81A9AD91A00F04ABB /* APCMedTrackerDailyDosageRecord.m */; }; 369B47551A853E8500777639 /* APCUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 369B47531A853E8500777639 /* APCUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; 369B47561A853E8500777639 /* APCUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 369B47541A853E8500777639 /* APCUtilities.m */; }; + 369DD5591AC0EBBE00327729 /* APCCMS_UsingOpenSSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 7473070F1A96E1DE0071D863 /* APCCMS_UsingOpenSSL.m */; }; 369E27EB1A96B7A200D35DFA /* APCMedicationActualMedicine.h in Headers */ = {isa = PBXBuildFile; fileRef = 369E27BB1A96B7A200D35DFA /* APCMedicationActualMedicine.h */; }; 369E27EC1A96B7A200D35DFA /* APCMedicationActualMedicine.m in Sources */ = {isa = PBXBuildFile; fileRef = 369E27BC1A96B7A200D35DFA /* APCMedicationActualMedicine.m */; }; 369E27ED1A96B7A200D35DFA /* APCMedicationColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 369E27BD1A96B7A200D35DFA /* APCMedicationColor.h */; }; @@ -130,6 +144,8 @@ 369E28161A96B7A200D35DFA /* APCMedTrackerPredefinedPrescriptionColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 369E27E61A96B7A200D35DFA /* APCMedTrackerPredefinedPrescriptionColors.plist */; }; 369E28171A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 369E27E71A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 369E28181A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 369E27E81A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.m */; }; + 36A4BBDA1B0018870035F4B7 /* APCTaskGroupCacheEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = 36A4BBD81B0018870035F4B7 /* APCTaskGroupCacheEntry.h */; }; + 36A4BBDB1B0018870035F4B7 /* APCTaskGroupCacheEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 36A4BBD91B0018870035F4B7 /* APCTaskGroupCacheEntry.m */; }; 36AAB34F1A9A75BB00FAC255 /* APCMedTrackerPrescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 36AAB34D1A9A75BB00FAC255 /* APCMedTrackerPrescription.h */; settings = {ATTRIBUTES = (Public, ); }; }; 36AAB3501A9A75BB00FAC255 /* APCMedTrackerPrescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 36AAB34E1A9A75BB00FAC255 /* APCMedTrackerPrescription.m */; }; 36AAB3541A9A760D00FAC255 /* APCMedTrackerPrescriptionColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 36AAB3521A9A760D00FAC255 /* APCMedTrackerPrescriptionColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -138,6 +154,16 @@ 36B1AAE61A38DEAF00CE7DB5 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36C8B3ED1A38DA4C0051096B /* SystemConfiguration.framework */; }; 36B7D2551A8D848D0043F968 /* ORKAnswerFormat+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 36B7D2531A8D848D0043F968 /* ORKAnswerFormat+Helper.h */; }; 36B7D2561A8D848D0043F968 /* ORKAnswerFormat+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B7D2541A8D848D0043F968 /* ORKAnswerFormat+Helper.m */; }; + 36B9101A1B1510A400EE37D9 /* APCScheduleDebugPrinter.h in Headers */ = {isa = PBXBuildFile; fileRef = 36B910181B1510A400EE37D9 /* APCScheduleDebugPrinter.h */; }; + 36B9101B1B1510A400EE37D9 /* APCScheduleDebugPrinter.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B910191B1510A400EE37D9 /* APCScheduleDebugPrinter.m */; }; + 36C1A6281B0467F000E15BC5 /* APCTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 36C1A6261B0467F000E15BC5 /* APCTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36C1A6291B0467F000E15BC5 /* APCTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 36C1A6271B0467F000E15BC5 /* APCTask.m */; }; + 36C1A62C1B0467F100E15BC5 /* APCSchedule.h in Headers */ = {isa = PBXBuildFile; fileRef = 36C1A62A1B0467F100E15BC5 /* APCSchedule.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36C1A62D1B0467F100E15BC5 /* APCSchedule.m in Sources */ = {isa = PBXBuildFile; fileRef = 36C1A62B1B0467F100E15BC5 /* APCSchedule.m */; }; + 36C1A6301B0467F100E15BC5 /* APCScheduledTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 36C1A62E1B0467F100E15BC5 /* APCScheduledTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36C1A6311B0467F100E15BC5 /* APCScheduledTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 36C1A62F1B0467F100E15BC5 /* APCScheduledTask.m */; }; + 36C1A6341B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 36C1A6321B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.h */; }; + 36C1A6351B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 36C1A6331B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.m */; }; 36C8B3EC1A38D9FF0051096B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36C8B3EB1A38D9FF0051096B /* Security.framework */; }; 36C8B3EE1A38DA4C0051096B /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36C8B3ED1A38DA4C0051096B /* SystemConfiguration.framework */; }; 36CCF38A1AA4572F0086CD1D /* APCLog.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B9476A1A73272C0034C522 /* APCLog.m */; }; @@ -156,7 +182,15 @@ 36CCF3A21AA45BC40086CD1D /* NSDate+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B947491A73272C0034C522 /* NSDate+Helper.m */; }; 36D0510E1ABB92F0008FC9B3 /* NSFileManager+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 36D0510C1ABB92F0008FC9B3 /* NSFileManager+Helper.h */; }; 36D0510F1ABB92F0008FC9B3 /* NSFileManager+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D0510D1ABB92F0008FC9B3 /* NSFileManager+Helper.m */; }; + 36D733C21B0BE9C100D6FB65 /* MODEL_MIGRATION_README.txt in Resources */ = {isa = PBXBuildFile; fileRef = 36D733C11B0BE9C100D6FB65 /* MODEL_MIGRATION_README.txt */; }; + 36D733C51B0BEC5C00D6FB65 /* APCMappingModel4ToModel6.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = 36D733C41B0BEC5C00D6FB65 /* APCMappingModel4ToModel6.xcmappingmodel */; }; + 36D733C81B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.h in Headers */ = {isa = PBXBuildFile; fileRef = 36D733C61B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.h */; }; + 36D733C91B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D733C71B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.m */; }; + 36D8E7D71AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 36D8E7D51AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36D8E7D81AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D8E7D61AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.m */; }; 36E06F1C1A33F071005D6EB0 /* APCScheduleExpressionRealLifeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36E06F1B1A33F071005D6EB0 /* APCScheduleExpressionRealLifeTests.m */; }; + 36FF93521AE1BA8B002E8827 /* APCPotentialScheduledTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 36FF93501AE1BA8B002E8827 /* APCPotentialScheduledTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36FF93531AE1BA8B002E8827 /* APCPotentialScheduledTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 36FF93511AE1BA8B002E8827 /* APCPotentialScheduledTask.m */; }; 5B04329F1A318AA2000DC9ED /* APCSignInTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B04329D1A318AA2000DC9ED /* APCSignInTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5B0432A01A318AA2000DC9ED /* APCSignInTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B04329E1A318AA2000DC9ED /* APCSignInTask.m */; }; 5B0432A71A322BEE000DC9ED /* APCOnboardingTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B0432A51A322BEE000DC9ED /* APCOnboardingTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -211,29 +245,29 @@ 6C7346091A7ECD3B00DA9CD8 /* APCConsentTaskViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C7346071A7ECD3B00DA9CD8 /* APCConsentTaskViewController.m */; }; 6C8646401AF8077300B46C49 /* APCCorrelationsSelectorViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C86463E1AF8077300B46C49 /* APCCorrelationsSelectorViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C8646411AF8077300B46C49 /* APCCorrelationsSelectorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C86463F1AF8077300B46C49 /* APCCorrelationsSelectorViewController.m */; }; + 6CAF4D4B1B112BBC00D9C340 /* APCActivitiesDateState.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CAF4D491B112BBC00D9C340 /* APCActivitiesDateState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6CAF4D4C1B112BBC00D9C340 /* APCActivitiesDateState.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CAF4D4A1B112BBC00D9C340 /* APCActivitiesDateState.m */; }; 6CD8B6741AC5011D0061E6D6 /* APCTaskReminder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CD8B6721AC5011D0061E6D6 /* APCTaskReminder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6CD8B6751AC5011D0061E6D6 /* APCTaskReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CD8B6731AC5011D0061E6D6 /* APCTaskReminder.m */; }; + 6CDE39CD1B1A03200033F9DD /* APCDataUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CDE39CB1B1A03200033F9DD /* APCDataUploader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6CDE39CE1B1A03200033F9DD /* APCDataUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CDE39CC1B1A03200033F9DD /* APCDataUploader.m */; }; 712AB44C1A9E692400556DA2 /* APCMotionHistoryData.h in Headers */ = {isa = PBXBuildFile; fileRef = 712AB4481A9E692400556DA2 /* APCMotionHistoryData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 712AB44D1A9E692400556DA2 /* APCMotionHistoryData.m in Sources */ = {isa = PBXBuildFile; fileRef = 712AB4491A9E692400556DA2 /* APCMotionHistoryData.m */; }; 712AB44E1A9E692400556DA2 /* APCMotionHistoryReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 712AB44A1A9E692400556DA2 /* APCMotionHistoryReporter.h */; settings = {ATTRIBUTES = (Public, ); }; }; 712AB44F1A9E692400556DA2 /* APCMotionHistoryReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 712AB44B1A9E692400556DA2 /* APCMotionHistoryReporter.m */; }; 7423AB5B1AA3FFD8004A325A /* APCConsentRedirector.h in Headers */ = {isa = PBXBuildFile; fileRef = 7423AB591AA3FFD8004A325A /* APCConsentRedirector.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 74423B531AD981F8008AC7B3 /* APCCMS_NoEncryption_JustAStub.m in Sources */ = {isa = PBXBuildFile; fileRef = 369DD5561AC0E26900327729 /* APCCMS_NoEncryption_JustAStub.m */; }; 747307101A96E1DE0071D863 /* APCCMS.h in Headers */ = {isa = PBXBuildFile; fileRef = 7473070E1A96E1DE0071D863 /* APCCMS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 747307161A96E2FB0071D863 /* openssl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 747307151A96E2FB0071D863 /* openssl.framework */; }; 747FB1451ABDDFAE00345000 /* ResearchKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 747FB1441ABDDFAE00345000 /* ResearchKit.framework */; }; 7B07B8AE1ACDD7B400734558 /* APCHealthKitBackgroundDataCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B07B8AA1ACDD7B400734558 /* APCHealthKitBackgroundDataCollector.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7B07B8AF1ACDD7B400734558 /* APCHealthKitBackgroundDataCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B07B8AB1ACDD7B400734558 /* APCHealthKitBackgroundDataCollector.m */; }; 7B0DC4141A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B0DC4121A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.h */; }; 7B0DC4151A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B0DC4131A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.m */; }; 7B0DC4181A5EFECC0072EE80 /* APCActivitiesViewWithNoTask.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B0DC4171A5EFECC0072EE80 /* APCActivitiesViewWithNoTask.xib */; }; - 7B362C061B02A34500127051 /* APCDataArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B362C041B02A34500127051 /* APCDataArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B362C071B02A34500127051 /* APCDataArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B362C051B02A34500127051 /* APCDataArchiver.m */; }; 7B544B331ADF084F00361FB6 /* APCDisplacementTrackingCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B544B311ADF084F00361FB6 /* APCDisplacementTrackingCollector.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7B544B341ADF084F00361FB6 /* APCDisplacementTrackingCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B544B321ADF084F00361FB6 /* APCDisplacementTrackingCollector.m */; }; 7B544B3B1ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B544B391ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7B544B3C1ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B544B3A1ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.m */; }; - 7B558D281AE587DF00129167 /* CLLocation+APCAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B558D261AE587DF00129167 /* CLLocation+APCAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B558D291AE587DF00129167 /* CLLocation+APCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B558D271AE587DF00129167 /* CLLocation+APCAdditions.m */; }; 7B6C8CB71AA26ECE0007B560 /* APCConsentBooleanQuestion.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B6C8CAD1AA26ECE0007B560 /* APCConsentBooleanQuestion.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7B6C8CB81AA26ECE0007B560 /* APCConsentBooleanQuestion.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B6C8CAE1AA26ECE0007B560 /* APCConsentBooleanQuestion.m */; }; 7B6C8CB91AA26ECE0007B560 /* APCConsentInstructionQuestion.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B6C8CAF1AA26ECE0007B560 /* APCConsentInstructionQuestion.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -246,8 +280,6 @@ 7B6C8CC01AA26ECE0007B560 /* APCConsentTextChoiceQuestion.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B6C8CB61AA26ECE0007B560 /* APCConsentTextChoiceQuestion.m */; }; 7B6C8CC41AA26F150007B560 /* APCStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B6C8CC21AA26F150007B560 /* APCStack.h */; }; 7B6C8CC51AA26F150007B560 /* APCStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B6C8CC31AA26F150007B560 /* APCStack.m */; }; - 7B751D571B0A61A600E77BD2 /* NSDictionary+APCStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B751D551B0A61A600E77BD2 /* NSDictionary+APCStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B751D581B0A61A600E77BD2 /* NSDictionary+APCStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B751D561B0A61A600E77BD2 /* NSDictionary+APCStringify.m */; }; 7B76F94B1AD34A72003508EB /* APCCoreMotionBackgroundDataCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B76F9491AD34A72003508EB /* APCCoreMotionBackgroundDataCollector.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7B76F94C1AD34A72003508EB /* APCCoreMotionBackgroundDataCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B76F94A1AD34A72003508EB /* APCCoreMotionBackgroundDataCollector.m */; }; 7B8C20131AA3AB8600BFEFDA /* APCTheme.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B8C20111AA3AB8600BFEFDA /* APCTheme.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -256,6 +288,10 @@ 7B8DBEC31AA186C4007B4026 /* APCHorizontalThinLineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BF54F8E1AA1354D0081C935 /* APCHorizontalThinLineView.m */; }; 7B8DBEC41AA186C6007B4026 /* APCHorizontalThinLineView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BF54F8D1AA1354D0081C935 /* APCHorizontalThinLineView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7B8DBEC51AA1871D007B4026 /* APCVerticalThinLineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BF54F901AA1354D0081C935 /* APCVerticalThinLineView.m */; }; + 7B939C121B0FEF6300D252A4 /* APCKeychainStore+Passcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B939C101B0FEF6300D252A4 /* APCKeychainStore+Passcode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7B939C131B0FEF6300D252A4 /* APCKeychainStore+Passcode.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B939C111B0FEF6300D252A4 /* APCKeychainStore+Passcode.m */; }; + 7B939C161B0FEF9C00D252A4 /* CLLocation+APCAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B939C141B0FEF9C00D252A4 /* CLLocation+APCAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7B939C171B0FEF9C00D252A4 /* CLLocation+APCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B939C151B0FEF9C00D252A4 /* CLLocation+APCAdditions.m */; }; 7BA5D99E1AA43F50006F505F /* APCStoredUserData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BA5D99C1AA43F50006F505F /* APCStoredUserData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7BA5D99F1AA43F50006F505F /* APCStoredUserData.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BA5D99D1AA43F50006F505F /* APCStoredUserData.m */; }; 7BA67A7A1AB174B500238899 /* APCTasksAndSchedulesMigrationUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BA67A781AB174B500238899 /* APCTasksAndSchedulesMigrationUtility.h */; }; @@ -266,6 +302,8 @@ 7BCF70331ACB6C5C00838717 /* APCPassiveDataCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BCF70311ACB6C5C00838717 /* APCPassiveDataCollector.m */; }; 7BD1D3D41A702ED200D6A377 /* APCDataResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BD1D3D21A702ED200D6A377 /* APCDataResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7BD1D3D51A702ED200D6A377 /* APCDataResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BD1D3D31A702ED200D6A377 /* APCDataResult.m */; }; + 7BDF4D2A1AE5403E00ACC1F8 /* NSDictionary+APCStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BDF4D281AE5403E00ACC1F8 /* NSDictionary+APCStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7BDF4D2B1AE5403E00ACC1F8 /* NSDictionary+APCStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BDF4D291AE5403E00ACC1F8 /* NSDictionary+APCStringify.m */; }; 7BDF4D321AE5492400ACC1F8 /* HKWorkout+APCHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BDF4D301AE5492400ACC1F8 /* HKWorkout+APCHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7BDF4D331AE5492400ACC1F8 /* HKWorkout+APCHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BDF4D311AE5492400ACC1F8 /* HKWorkout+APCHelper.m */; }; 7BEC13D31AA3AA5B00CA316C /* APCActivityTracking.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7BEC13CE1AA3AA5B00CA316C /* APCActivityTracking.storyboard */; }; @@ -288,7 +326,7 @@ CF130B781A9E8DCD002DA023 /* APCSetupButtonTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = CF130B751A9E8DCD002DA023 /* APCSetupButtonTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; CF130B791A9E8DCD002DA023 /* APCSetupButtonTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CF130B761A9E8DCD002DA023 /* APCSetupButtonTableViewCell.m */; }; CF130B7A1A9E8DCD002DA023 /* APCSetupButtonTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CF130B771A9E8DCD002DA023 /* APCSetupButtonTableViewCell.xib */; }; - CF61A3801B0A53490014AD1A /* APCDemographicUploader.h in Resources */ = {isa = PBXBuildFile; fileRef = CF61A37F1B0A53490014AD1A /* APCDemographicUploader.h */; }; + CF64CF2C1AE860CC000795B5 /* APCDemographicUploader.h in Headers */ = {isa = PBXBuildFile; fileRef = CF64CF2A1AE860CC000795B5 /* APCDemographicUploader.h */; }; CF64CF2D1AE860CC000795B5 /* APCDemographicUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = CF64CF2B1AE860CC000795B5 /* APCDemographicUploader.m */; }; CF7945861AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = CF7945831AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; CF7945871AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CF7945841AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.m */; }; @@ -350,10 +388,6 @@ CFFDEDFA1A95734000B25581 /* APCSetupTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = CFFDEDC01A95734000B25581 /* APCSetupTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; CFFDEDFB1A95734000B25581 /* APCSetupTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = CFFDEDC11A95734000B25581 /* APCSetupTableViewCell.m */; }; CFFDEDFC1A95734000B25581 /* APCSetupTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CFFDEDC21A95734000B25581 /* APCSetupTableViewCell.xib */; }; - EE028FE31AF94B36001C8251 /* APCKeychainStore+Passcode.h in Headers */ = {isa = PBXBuildFile; fileRef = EE028FE11AF94B36001C8251 /* APCKeychainStore+Passcode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE028FE41AF94B36001C8251 /* APCKeychainStore+Passcode.m in Sources */ = {isa = PBXBuildFile; fileRef = EE028FE21AF94B36001C8251 /* APCKeychainStore+Passcode.m */; }; - EE4B95251AF82BA6000097C7 /* NSError+Bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = EE4B95231AF82BA6000097C7 /* NSError+Bridge.h */; }; - EE4B95261AF82BA6000097C7 /* NSError+Bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = EE4B95241AF82BA6000097C7 /* NSError+Bridge.m */; }; F50738C01A682E12004CF100 /* APCDateRange.h in Headers */ = {isa = PBXBuildFile; fileRef = F50738BE1A682E12004CF100 /* APCDateRange.h */; settings = {ATTRIBUTES = (Public, ); }; }; F50738C11A682E12004CF100 /* APCDateRange.m in Sources */ = {isa = PBXBuildFile; fileRef = F50738BF1A682E12004CF100 /* APCDateRange.m */; }; F5306CCD1A8BE7F600732E60 /* ORKQuestionResult+APCHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = F5306CCB1A8BE7F600732E60 /* ORKQuestionResult+APCHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -446,6 +480,8 @@ F5B947D41A73272C0034C522 /* UIScrollView+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B9475F1A73272C0034C522 /* UIScrollView+Helper.m */; }; F5B947D51A73272C0034C522 /* UIView+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B947601A73272C0034C522 /* UIView+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5B947D61A73272C0034C522 /* UIView+Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B947611A73272C0034C522 /* UIView+Helper.m */; }; + F5B947D71A73272C0034C522 /* APCDataArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B947631A73272C0034C522 /* APCDataArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F5B947D81A73272C0034C522 /* APCDataArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B947641A73272C0034C522 /* APCDataArchiver.m */; }; F5B947DB1A73272C0034C522 /* APCLog.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B947691A73272C0034C522 /* APCLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5B947DC1A73272C0034C522 /* APCLog.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B9476A1A73272C0034C522 /* APCLog.m */; }; F5B947DF1A73272C0034C522 /* APCConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B9476F1A73272C0034C522 /* APCConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -509,6 +545,8 @@ F5F129E31A2F78490015982C /* APCDataMonitor+Bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128861A2F78490015982C /* APCDataMonitor+Bridge.m */; }; F5F129E41A2F78490015982C /* APCDataMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128871A2F78490015982C /* APCDataMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F129E51A2F78490015982C /* APCDataMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128881A2F78490015982C /* APCDataMonitor.m */; }; + F5F129E81A2F78490015982C /* APCDataSubstrate+HealthKit.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F1288C1A2F78490015982C /* APCDataSubstrate+HealthKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F5F129E91A2F78490015982C /* APCDataSubstrate+HealthKit.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F1288D1A2F78490015982C /* APCDataSubstrate+HealthKit.m */; }; F5F129EA1A2F78490015982C /* APCDataSubstrate+ResearchKit.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F1288E1A2F78490015982C /* APCDataSubstrate+ResearchKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F129EB1A2F78490015982C /* APCDataSubstrate+ResearchKit.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F1288F1A2F78490015982C /* APCDataSubstrate+ResearchKit.m */; }; F5F129EC1A2F78490015982C /* APCDataSubstrate.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128901A2F78490015982C /* APCDataSubstrate.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -529,28 +567,21 @@ F5F129FB1A2F78490015982C /* APCSchedule+AddOn.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128A11A2F78490015982C /* APCSchedule+AddOn.m */; }; F5F129FC1A2F78490015982C /* APCSchedule+Bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128A21A2F78490015982C /* APCSchedule+Bridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F129FD1A2F78490015982C /* APCSchedule+Bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128A31A2F78490015982C /* APCSchedule+Bridge.m */; }; - F5F129FE1A2F78490015982C /* APCSchedule.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128A41A2F78490015982C /* APCSchedule.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F5F129FF1A2F78490015982C /* APCSchedule.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128A51A2F78490015982C /* APCSchedule.m */; }; F5F12A001A2F78490015982C /* APCScheduledTask+AddOn.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128A61A2F78490015982C /* APCScheduledTask+AddOn.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A011A2F78490015982C /* APCScheduledTask+AddOn.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128A71A2F78490015982C /* APCScheduledTask+AddOn.m */; }; - F5F12A021A2F78490015982C /* APCScheduledTask.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128A81A2F78490015982C /* APCScheduledTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F5F12A031A2F78490015982C /* APCScheduledTask.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128A91A2F78490015982C /* APCScheduledTask.m */; }; F5F12A061A2F78490015982C /* APCTask+AddOn.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128AC1A2F78490015982C /* APCTask+AddOn.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A071A2F78490015982C /* APCTask+AddOn.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128AD1A2F78490015982C /* APCTask+AddOn.m */; }; F5F12A081A2F78490015982C /* APCTask+Bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128AE1A2F78490015982C /* APCTask+Bridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A091A2F78490015982C /* APCTask+Bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128AF1A2F78490015982C /* APCTask+Bridge.m */; }; - F5F12A0A1A2F78490015982C /* APCTask.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128B01A2F78490015982C /* APCTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F5F12A0B1A2F78490015982C /* APCTask.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128B11A2F78490015982C /* APCTask.m */; }; F5F12A0C1A2F78490015982C /* APCUser+Bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128B21A2F78490015982C /* APCUser+Bridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A0D1A2F78490015982C /* APCUser+Bridge.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128B31A2F78490015982C /* APCUser+Bridge.m */; }; F5F12A0E1A2F78490015982C /* APCUser+UserData.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128B41A2F78490015982C /* APCUser+UserData.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A0F1A2F78490015982C /* APCUser+UserData.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128B51A2F78490015982C /* APCUser+UserData.m */; }; F5F12A101A2F78490015982C /* APCUser.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F128B61A2F78490015982C /* APCUser.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A111A2F78490015982C /* APCUser.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F128B71A2F78490015982C /* APCUser.m */; }; - F5F12A121A2F78490015982C /* MODEL_README in Resources */ = {isa = PBXBuildFile; fileRef = F5F128B81A2F78490015982C /* MODEL_README */; }; + F5F12A121A2F78490015982C /* MODEL_README.txt in Resources */ = {isa = PBXBuildFile; fileRef = F5F128B81A2F78490015982C /* MODEL_README.txt */; }; F5F12A6C1A2F78490015982C /* APCAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F129201A2F78490015982C /* APCAppDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A6D1A2F78490015982C /* APCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F129211A2F78490015982C /* APCAppDelegate.m */; }; - F5F12A6E1A2F78490015982C /* TabBar.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F5F129221A2F78490015982C /* TabBar.storyboard */; }; F5F12A6F1A2F78490015982C /* APCCircularProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F129251A2F78490015982C /* APCCircularProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; F5F12A701A2F78490015982C /* APCCircularProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F129261A2F78490015982C /* APCCircularProgressView.m */; }; F5F12A711A2F78490015982C /* APCConcentricProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F129271A2F78490015982C /* APCConcentricProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -780,6 +811,8 @@ 08EA2AB11A7AD564007549C0 /* UIImage+ImageEffects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+ImageEffects.h"; sourceTree = ""; }; 08EA2AB21A7AD564007549C0 /* UIImage+ImageEffects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+ImageEffects.m"; sourceTree = ""; }; 360C63D01A339746002EC86C /* NSDateComponentsHelperTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDateComponentsHelperTests.m; sourceTree = ""; }; + 36175FB41B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataMigrationMetadata_Model4ToModel6.h; sourceTree = ""; }; + 36175FB51B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDataMigrationMetadata_Model4ToModel6.m; sourceTree = ""; }; 3624092A1A8181350005B1A7 /* get_debug_ip_address.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = get_debug_ip_address.sh; sourceTree = ""; }; 36257FBB1AA714B60060B95A /* CMMotionActivity+Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CMMotionActivity+Helper.h"; sourceTree = ""; }; 36257FBC1AA714B60060B95A /* CMMotionActivity+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CMMotionActivity+Helper.m"; sourceTree = ""; }; @@ -787,6 +820,8 @@ 3627D3471A9A7517006B02E8 /* APCMedTrackerMedication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCMedTrackerMedication.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 3627D34A1A9A7517006B02E8 /* APCMedTrackerPossibleDosage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APCMedTrackerPossibleDosage.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 3627D34B1A9A7517006B02E8 /* APCMedTrackerPossibleDosage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCMedTrackerPossibleDosage.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 363BCA281AEC074D00B10A7F /* SBBSchedule+APCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SBBSchedule+APCHelper.h"; sourceTree = ""; }; + 363BCA291AEC074D00B10A7F /* SBBSchedule+APCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SBBSchedule+APCHelper.m"; sourceTree = ""; }; 36469C311AA1433700C10CA7 /* APCModel 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "APCModel 2.xcdatamodel"; sourceTree = ""; }; 36469C321AA1650F00C10CA7 /* APCModel 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "APCModel 3.xcdatamodel"; sourceTree = ""; }; 364D34881A7B1C8F0060B3F5 /* APCDataVerificationClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataVerificationClient.h; sourceTree = ""; }; @@ -799,8 +834,17 @@ 3654318B1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCMedTrackerInflatableItem.h; sourceTree = ""; }; 3654318C1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCMedTrackerInflatableItem.m; sourceTree = ""; }; 366433821A7DA29F007E2BCF /* ReadMe.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = ReadMe.txt; sourceTree = ""; }; + 366F5A2C1AE5C42900E1D28F /* APCTaskGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCTaskGroup.h; sourceTree = ""; }; + 366F5A2D1AE5C42900E1D28F /* APCTaskGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTaskGroup.m; sourceTree = ""; }; + 3670674E1AF57DBE0069B4E5 /* NSArray+APCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+APCHelper.h"; sourceTree = ""; }; + 3670674F1AF57DBE0069B4E5 /* NSArray+APCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+APCHelper.m"; sourceTree = ""; }; + 3673957E1AE02E610057F158 /* APCModel 5.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "APCModel 5.xcdatamodel"; sourceTree = ""; }; 36829A511A96B98F000AA2AB /* NSOperationQueue+Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSOperationQueue+Helper.h"; sourceTree = ""; }; 36829A521A96B98F000AA2AB /* NSOperationQueue+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSOperationQueue+Helper.m"; sourceTree = ""; }; + 368764291ACF5E4200806A32 /* APCDataVerificationServerAccessControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataVerificationServerAccessControl.h; sourceTree = ""; }; + 36879C211ACF720600C4BE91 /* APCNewScheduleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCNewScheduleTests.m; sourceTree = ""; }; + 3689C1F01AF45594002426C5 /* APCActivitiesViewSection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCActivitiesViewSection.h; sourceTree = ""; }; + 3689C1F11AF45594002426C5 /* APCActivitiesViewSection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCActivitiesViewSection.m; sourceTree = ""; }; 368BAFE71A9AD91A00F04ABB /* APCMedTrackerDailyDosageRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCMedTrackerDailyDosageRecord.h; sourceTree = ""; }; 368BAFE81A9AD91A00F04ABB /* APCMedTrackerDailyDosageRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCMedTrackerDailyDosageRecord.m; sourceTree = ""; }; 369B47531A853E8500777639 /* APCUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCUtilities.h; sourceTree = ""; }; @@ -842,17 +886,38 @@ 369E27E61A96B7A200D35DFA /* APCMedTrackerPredefinedPrescriptionColors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = APCMedTrackerPredefinedPrescriptionColors.plist; sourceTree = ""; }; 369E27E71A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "APCMedTrackerPrescriptionColor+Helper.h"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 369E27E81A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCMedTrackerPrescriptionColor+Helper.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 36A4BBD81B0018870035F4B7 /* APCTaskGroupCacheEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCTaskGroupCacheEntry.h; sourceTree = ""; }; + 36A4BBD91B0018870035F4B7 /* APCTaskGroupCacheEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTaskGroupCacheEntry.m; sourceTree = ""; }; 36AAB34D1A9A75BB00FAC255 /* APCMedTrackerPrescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APCMedTrackerPrescription.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 36AAB34E1A9A75BB00FAC255 /* APCMedTrackerPrescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCMedTrackerPrescription.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 36AAB3521A9A760D00FAC255 /* APCMedTrackerPrescriptionColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCMedTrackerPrescriptionColor.h; sourceTree = ""; }; 36AAB3531A9A760D00FAC255 /* APCMedTrackerPrescriptionColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCMedTrackerPrescriptionColor.m; sourceTree = ""; }; 36B7D2531A8D848D0043F968 /* ORKAnswerFormat+Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ORKAnswerFormat+Helper.h"; sourceTree = ""; }; 36B7D2541A8D848D0043F968 /* ORKAnswerFormat+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ORKAnswerFormat+Helper.m"; sourceTree = ""; }; + 36B910181B1510A400EE37D9 /* APCScheduleDebugPrinter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCScheduleDebugPrinter.h; sourceTree = ""; }; + 36B910191B1510A400EE37D9 /* APCScheduleDebugPrinter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCScheduleDebugPrinter.m; sourceTree = ""; }; + 36C1A6251B04653100E15BC5 /* APCModel 6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "APCModel 6.xcdatamodel"; sourceTree = ""; }; + 36C1A6261B0467F000E15BC5 /* APCTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCTask.h; sourceTree = ""; }; + 36C1A6271B0467F000E15BC5 /* APCTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTask.m; sourceTree = ""; }; + 36C1A62A1B0467F100E15BC5 /* APCSchedule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCSchedule.h; sourceTree = ""; }; + 36C1A62B1B0467F100E15BC5 /* APCSchedule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCSchedule.m; sourceTree = ""; }; + 36C1A62E1B0467F100E15BC5 /* APCScheduledTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCScheduledTask.h; sourceTree = ""; }; + 36C1A62F1B0467F100E15BC5 /* APCScheduledTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCScheduledTask.m; sourceTree = ""; }; + 36C1A6321B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCScheduleIntervalEnumerator.h; sourceTree = ""; }; + 36C1A6331B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCScheduleIntervalEnumerator.m; sourceTree = ""; }; 36C8B3EB1A38D9FF0051096B /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 36C8B3ED1A38DA4C0051096B /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 36D0510C1ABB92F0008FC9B3 /* NSFileManager+Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+Helper.h"; sourceTree = ""; }; 36D0510D1ABB92F0008FC9B3 /* NSFileManager+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+Helper.m"; sourceTree = ""; }; + 36D733C11B0BE9C100D6FB65 /* MODEL_MIGRATION_README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MODEL_MIGRATION_README.txt; sourceTree = ""; }; + 36D733C41B0BEC5C00D6FB65 /* APCMappingModel4ToModel6.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = APCMappingModel4ToModel6.xcmappingmodel; sourceTree = ""; }; + 36D733C61B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataMigrationPolicy_Model4ToModel6.h; sourceTree = ""; }; + 36D733C71B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDataMigrationPolicy_Model4ToModel6.m; sourceTree = ""; }; + 36D8E7D51AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCTopLevelScheduleEnumerator.h; sourceTree = ""; }; + 36D8E7D61AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTopLevelScheduleEnumerator.m; sourceTree = ""; }; 36E06F1B1A33F071005D6EB0 /* APCScheduleExpressionRealLifeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCScheduleExpressionRealLifeTests.m; sourceTree = ""; }; + 36FF93501AE1BA8B002E8827 /* APCPotentialScheduledTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCPotentialScheduledTask.h; sourceTree = ""; }; + 36FF93511AE1BA8B002E8827 /* APCPotentialScheduledTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCPotentialScheduledTask.m; sourceTree = ""; }; 5B04329D1A318AA2000DC9ED /* APCSignInTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCSignInTask.h; sourceTree = ""; }; 5B04329E1A318AA2000DC9ED /* APCSignInTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCSignInTask.m; sourceTree = ""; }; 5B0432A51A322BEE000DC9ED /* APCOnboardingTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCOnboardingTask.h; sourceTree = ""; }; @@ -878,8 +943,8 @@ 5B827B541A80CB0400C685A3 /* APCFadeAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCFadeAnimator.m; sourceTree = ""; }; 5B827B5E1A81CAE200C685A3 /* APCDashboardTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDashboardTableViewCell.h; sourceTree = ""; }; 5B827B5F1A81CAE200C685A3 /* APCDashboardTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDashboardTableViewCell.m; sourceTree = ""; }; - 5B9B36A11A95D9B500389F42 /* APCActivitiesTintedTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCActivitiesTintedTableViewCell.h; sourceTree = ""; }; - 5B9B36A21A95D9B500389F42 /* APCActivitiesTintedTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCActivitiesTintedTableViewCell.m; sourceTree = ""; }; + 5B9B36A11A95D9B500389F42 /* APCActivitiesTintedTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APCActivitiesTintedTableViewCell.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 5B9B36A21A95D9B500389F42 /* APCActivitiesTintedTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCActivitiesTintedTableViewCell.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 5B9B36A51A95D9C900389F42 /* APCActivitiesBasicTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCActivitiesBasicTableViewCell.h; sourceTree = ""; }; 5B9B36A61A95D9C900389F42 /* APCActivitiesBasicTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCActivitiesBasicTableViewCell.m; sourceTree = ""; }; 5B9B36A91A95DC1700389F42 /* APCActivitiesTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCActivitiesTableViewCell.h; sourceTree = ""; }; @@ -907,8 +972,12 @@ 6C7346071A7ECD3B00DA9CD8 /* APCConsentTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCConsentTaskViewController.m; sourceTree = ""; }; 6C86463E1AF8077300B46C49 /* APCCorrelationsSelectorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCCorrelationsSelectorViewController.h; sourceTree = ""; }; 6C86463F1AF8077300B46C49 /* APCCorrelationsSelectorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCCorrelationsSelectorViewController.m; sourceTree = ""; }; + 6CAF4D491B112BBC00D9C340 /* APCActivitiesDateState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCActivitiesDateState.h; sourceTree = ""; }; + 6CAF4D4A1B112BBC00D9C340 /* APCActivitiesDateState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCActivitiesDateState.m; sourceTree = ""; }; 6CD8B6721AC5011D0061E6D6 /* APCTaskReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = APCTaskReminder.h; path = APCAppCore/Library/APCTaskReminder.h; sourceTree = SOURCE_ROOT; }; 6CD8B6731AC5011D0061E6D6 /* APCTaskReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = APCTaskReminder.m; path = APCAppCore/Library/APCTaskReminder.m; sourceTree = SOURCE_ROOT; }; + 6CDE39CB1B1A03200033F9DD /* APCDataUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataUploader.h; sourceTree = ""; }; + 6CDE39CC1B1A03200033F9DD /* APCDataUploader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDataUploader.m; sourceTree = ""; }; 712AB4481A9E692400556DA2 /* APCMotionHistoryData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCMotionHistoryData.h; sourceTree = ""; }; 712AB4491A9E692400556DA2 /* APCMotionHistoryData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCMotionHistoryData.m; sourceTree = ""; }; 712AB44A1A9E692400556DA2 /* APCMotionHistoryReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCMotionHistoryReporter.h; sourceTree = ""; }; @@ -923,14 +992,10 @@ 7B0DC4121A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCActivitiesViewWithNoTask.h; sourceTree = ""; }; 7B0DC4131A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCActivitiesViewWithNoTask.m; sourceTree = ""; }; 7B0DC4171A5EFECC0072EE80 /* APCActivitiesViewWithNoTask.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APCActivitiesViewWithNoTask.xib; sourceTree = ""; }; - 7B362C041B02A34500127051 /* APCDataArchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataArchiver.h; sourceTree = ""; }; - 7B362C051B02A34500127051 /* APCDataArchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDataArchiver.m; sourceTree = ""; }; 7B544B311ADF084F00361FB6 /* APCDisplacementTrackingCollector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDisplacementTrackingCollector.h; sourceTree = ""; }; 7B544B321ADF084F00361FB6 /* APCDisplacementTrackingCollector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDisplacementTrackingCollector.m; sourceTree = ""; }; 7B544B391ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCPassiveDisplacementTrackingDataUploader.h; sourceTree = ""; }; 7B544B3A1ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCPassiveDisplacementTrackingDataUploader.m; sourceTree = ""; }; - 7B558D261AE587DF00129167 /* CLLocation+APCAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CLLocation+APCAdditions.h"; sourceTree = ""; }; - 7B558D271AE587DF00129167 /* CLLocation+APCAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CLLocation+APCAdditions.m"; sourceTree = ""; }; 7B6C8CAD1AA26ECE0007B560 /* APCConsentBooleanQuestion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCConsentBooleanQuestion.h; sourceTree = ""; }; 7B6C8CAE1AA26ECE0007B560 /* APCConsentBooleanQuestion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCConsentBooleanQuestion.m; sourceTree = ""; }; 7B6C8CAF1AA26ECE0007B560 /* APCConsentInstructionQuestion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCConsentInstructionQuestion.h; sourceTree = ""; }; @@ -943,12 +1008,14 @@ 7B6C8CB61AA26ECE0007B560 /* APCConsentTextChoiceQuestion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCConsentTextChoiceQuestion.m; sourceTree = ""; }; 7B6C8CC21AA26F150007B560 /* APCStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCStack.h; sourceTree = ""; }; 7B6C8CC31AA26F150007B560 /* APCStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCStack.m; sourceTree = ""; }; - 7B751D551B0A61A600E77BD2 /* NSDictionary+APCStringify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+APCStringify.h"; sourceTree = ""; }; - 7B751D561B0A61A600E77BD2 /* NSDictionary+APCStringify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+APCStringify.m"; sourceTree = ""; }; 7B76F9491AD34A72003508EB /* APCCoreMotionBackgroundDataCollector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCCoreMotionBackgroundDataCollector.h; sourceTree = ""; }; 7B76F94A1AD34A72003508EB /* APCCoreMotionBackgroundDataCollector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCCoreMotionBackgroundDataCollector.m; sourceTree = ""; }; 7B8C20111AA3AB8600BFEFDA /* APCTheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCTheme.h; sourceTree = ""; }; 7B8C20121AA3AB8600BFEFDA /* APCTheme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTheme.m; sourceTree = ""; }; + 7B939C101B0FEF6300D252A4 /* APCKeychainStore+Passcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCKeychainStore+Passcode.h"; sourceTree = ""; }; + 7B939C111B0FEF6300D252A4 /* APCKeychainStore+Passcode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCKeychainStore+Passcode.m"; sourceTree = ""; }; + 7B939C141B0FEF9C00D252A4 /* CLLocation+APCAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CLLocation+APCAdditions.h"; sourceTree = ""; }; + 7B939C151B0FEF9C00D252A4 /* CLLocation+APCAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CLLocation+APCAdditions.m"; sourceTree = ""; }; 7BA5D9971AA43E96006F505F /* APCModel 4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "APCModel 4.xcdatamodel"; sourceTree = ""; }; 7BA5D99C1AA43F50006F505F /* APCStoredUserData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCStoredUserData.h; sourceTree = ""; }; 7BA5D99D1AA43F50006F505F /* APCStoredUserData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCStoredUserData.m; sourceTree = ""; }; @@ -960,6 +1027,8 @@ 7BCF70311ACB6C5C00838717 /* APCPassiveDataCollector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCPassiveDataCollector.m; sourceTree = ""; }; 7BD1D3D21A702ED200D6A377 /* APCDataResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataResult.h; sourceTree = ""; }; 7BD1D3D31A702ED200D6A377 /* APCDataResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDataResult.m; sourceTree = ""; }; + 7BDF4D281AE5403E00ACC1F8 /* NSDictionary+APCStringify.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+APCStringify.h"; sourceTree = ""; }; + 7BDF4D291AE5403E00ACC1F8 /* NSDictionary+APCStringify.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+APCStringify.m"; sourceTree = ""; }; 7BDF4D301AE5492400ACC1F8 /* HKWorkout+APCHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "HKWorkout+APCHelper.h"; sourceTree = ""; }; 7BDF4D311AE5492400ACC1F8 /* HKWorkout+APCHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "HKWorkout+APCHelper.m"; sourceTree = ""; }; 7BEC13CE1AA3AA5B00CA316C /* APCActivityTracking.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = APCActivityTracking.storyboard; sourceTree = ""; }; @@ -986,7 +1055,7 @@ CF130B751A9E8DCD002DA023 /* APCSetupButtonTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCSetupButtonTableViewCell.h; sourceTree = ""; }; CF130B761A9E8DCD002DA023 /* APCSetupButtonTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCSetupButtonTableViewCell.m; sourceTree = ""; }; CF130B771A9E8DCD002DA023 /* APCSetupButtonTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APCSetupButtonTableViewCell.xib; sourceTree = ""; }; - CF61A37F1B0A53490014AD1A /* APCDemographicUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDemographicUploader.h; sourceTree = ""; }; + CF64CF2A1AE860CC000795B5 /* APCDemographicUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDemographicUploader.h; sourceTree = ""; }; CF64CF2B1AE860CC000795B5 /* APCDemographicUploader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDemographicUploader.m; sourceTree = ""; }; CF7945831AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCFrequencyEverydayTableViewCell.h; sourceTree = ""; }; CF7945841AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCFrequencyEverydayTableViewCell.m; sourceTree = ""; }; @@ -1048,10 +1117,6 @@ CFFDEDC01A95734000B25581 /* APCSetupTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCSetupTableViewCell.h; sourceTree = ""; }; CFFDEDC11A95734000B25581 /* APCSetupTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCSetupTableViewCell.m; sourceTree = ""; }; CFFDEDC21A95734000B25581 /* APCSetupTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APCSetupTableViewCell.xib; sourceTree = ""; }; - EE028FE11AF94B36001C8251 /* APCKeychainStore+Passcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCKeychainStore+Passcode.h"; sourceTree = ""; }; - EE028FE21AF94B36001C8251 /* APCKeychainStore+Passcode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCKeychainStore+Passcode.m"; sourceTree = ""; }; - EE4B95231AF82BA6000097C7 /* NSError+Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+Bridge.h"; sourceTree = ""; }; - EE4B95241AF82BA6000097C7 /* NSError+Bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+Bridge.m"; sourceTree = ""; }; F50738BE1A682E12004CF100 /* APCDateRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDateRange.h; sourceTree = ""; }; F50738BF1A682E12004CF100 /* APCDateRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDateRange.m; sourceTree = ""; }; F5179B2919D09128001DCCB7 /* APCAppCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = APCAppCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1145,6 +1210,8 @@ F5B9475F1A73272C0034C522 /* UIScrollView+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+Helper.m"; sourceTree = ""; }; F5B947601A73272C0034C522 /* UIView+Helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+Helper.h"; sourceTree = ""; }; F5B947611A73272C0034C522 /* UIView+Helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Helper.m"; sourceTree = ""; }; + F5B947631A73272C0034C522 /* APCDataArchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataArchiver.h; sourceTree = ""; }; + F5B947641A73272C0034C522 /* APCDataArchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDataArchiver.m; sourceTree = ""; }; F5B947691A73272C0034C522 /* APCLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCLog.h; sourceTree = ""; }; F5B9476A1A73272C0034C522 /* APCLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCLog.m; sourceTree = ""; }; F5B9476F1A73272C0034C522 /* APCConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCConstants.h; sourceTree = ""; }; @@ -1197,7 +1264,7 @@ F5B947A51A73272C0034C522 /* APCTimeSelectorEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCTimeSelectorEnumerator.h; sourceTree = ""; }; F5B947A61A73272C0034C522 /* APCTimeSelectorEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTimeSelectorEnumerator.m; sourceTree = ""; }; F5B947A81A73272C0034C522 /* APCScheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCScheduler.h; sourceTree = ""; }; - F5B947A91A73272C0034C522 /* APCScheduler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCScheduler.m; sourceTree = ""; }; + F5B947A91A73272C0034C522 /* APCScheduler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCScheduler.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F5B947AB1A73272C0034C522 /* APCScoring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCScoring.h; sourceTree = ""; }; F5B947AC1A73272C0034C522 /* APCScoring.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCScoring.m; sourceTree = ""; }; F5B948161A7328F30034C522 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; @@ -1208,6 +1275,8 @@ F5F128861A2F78490015982C /* APCDataMonitor+Bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCDataMonitor+Bridge.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F5F128871A2F78490015982C /* APCDataMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataMonitor.h; sourceTree = ""; }; F5F128881A2F78490015982C /* APCDataMonitor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCDataMonitor.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + F5F1288C1A2F78490015982C /* APCDataSubstrate+HealthKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCDataSubstrate+HealthKit.h"; sourceTree = ""; }; + F5F1288D1A2F78490015982C /* APCDataSubstrate+HealthKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCDataSubstrate+HealthKit.m"; sourceTree = ""; }; F5F1288E1A2F78490015982C /* APCDataSubstrate+ResearchKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCDataSubstrate+ResearchKit.h"; sourceTree = ""; }; F5F1288F1A2F78490015982C /* APCDataSubstrate+ResearchKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCDataSubstrate+ResearchKit.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F5F128901A2F78490015982C /* APCDataSubstrate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDataSubstrate.h; sourceTree = ""; }; @@ -1224,33 +1293,26 @@ F5F1289D1A2F78490015982C /* APCResult+Bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCResult+Bridge.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F5F1289E1A2F78490015982C /* APCResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCResult.h; sourceTree = ""; }; F5F1289F1A2F78490015982C /* APCResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCResult.m; sourceTree = ""; }; - F5F128A01A2F78490015982C /* APCSchedule+AddOn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCSchedule+AddOn.h"; sourceTree = ""; }; - F5F128A11A2F78490015982C /* APCSchedule+AddOn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCSchedule+AddOn.m"; sourceTree = ""; }; - F5F128A21A2F78490015982C /* APCSchedule+Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCSchedule+Bridge.h"; sourceTree = ""; }; + F5F128A01A2F78490015982C /* APCSchedule+AddOn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "APCSchedule+AddOn.h"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + F5F128A11A2F78490015982C /* APCSchedule+AddOn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCSchedule+AddOn.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + F5F128A21A2F78490015982C /* APCSchedule+Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "APCSchedule+Bridge.h"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; F5F128A31A2F78490015982C /* APCSchedule+Bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCSchedule+Bridge.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - F5F128A41A2F78490015982C /* APCSchedule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCSchedule.h; sourceTree = ""; }; - F5F128A51A2F78490015982C /* APCSchedule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCSchedule.m; sourceTree = ""; }; F5F128A61A2F78490015982C /* APCScheduledTask+AddOn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCScheduledTask+AddOn.h"; sourceTree = ""; }; - F5F128A71A2F78490015982C /* APCScheduledTask+AddOn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCScheduledTask+AddOn.m"; sourceTree = ""; }; - F5F128A81A2F78490015982C /* APCScheduledTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCScheduledTask.h; sourceTree = ""; }; - F5F128A91A2F78490015982C /* APCScheduledTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCScheduledTask.m; sourceTree = ""; }; - F5F128AC1A2F78490015982C /* APCTask+AddOn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCTask+AddOn.h"; sourceTree = ""; }; - F5F128AD1A2F78490015982C /* APCTask+AddOn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCTask+AddOn.m"; sourceTree = ""; }; + F5F128A71A2F78490015982C /* APCScheduledTask+AddOn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCScheduledTask+AddOn.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + F5F128AC1A2F78490015982C /* APCTask+AddOn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "APCTask+AddOn.h"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + F5F128AD1A2F78490015982C /* APCTask+AddOn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "APCTask+AddOn.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F5F128AE1A2F78490015982C /* APCTask+Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCTask+Bridge.h"; sourceTree = ""; }; F5F128AF1A2F78490015982C /* APCTask+Bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCTask+Bridge.m"; sourceTree = ""; }; - F5F128B01A2F78490015982C /* APCTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCTask.h; sourceTree = ""; }; - F5F128B11A2F78490015982C /* APCTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTask.m; sourceTree = ""; }; F5F128B21A2F78490015982C /* APCUser+Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCUser+Bridge.h"; sourceTree = ""; }; F5F128B31A2F78490015982C /* APCUser+Bridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCUser+Bridge.m"; sourceTree = ""; }; F5F128B41A2F78490015982C /* APCUser+UserData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "APCUser+UserData.h"; sourceTree = ""; }; F5F128B51A2F78490015982C /* APCUser+UserData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "APCUser+UserData.m"; sourceTree = ""; }; F5F128B61A2F78490015982C /* APCUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCUser.h; sourceTree = ""; }; F5F128B71A2F78490015982C /* APCUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCUser.m; sourceTree = ""; }; - F5F128B81A2F78490015982C /* MODEL_README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MODEL_README; sourceTree = ""; }; + F5F128B81A2F78490015982C /* MODEL_README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MODEL_README.txt; sourceTree = ""; }; F5F1291B1A2F78490015982C /* update_version.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = update_version.sh; sourceTree = ""; }; - F5F129201A2F78490015982C /* APCAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCAppDelegate.h; sourceTree = ""; }; + F5F129201A2F78490015982C /* APCAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = APCAppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; F5F129211A2F78490015982C /* APCAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCAppDelegate.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - F5F129221A2F78490015982C /* TabBar.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = TabBar.storyboard; sourceTree = ""; }; F5F129251A2F78490015982C /* APCCircularProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCCircularProgressView.h; sourceTree = ""; }; F5F129261A2F78490015982C /* APCCircularProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCCircularProgressView.m; sourceTree = ""; }; F5F129271A2F78490015982C /* APCConcentricProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCConcentricProgressView.h; sourceTree = ""; }; @@ -1322,7 +1384,7 @@ F5F129751A2F78490015982C /* APCTermsAndConditionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCTermsAndConditionsViewController.m; sourceTree = ""; }; F5F129781A2F78490015982C /* APCActivities.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = APCActivities.storyboard; sourceTree = ""; }; F5F129791A2F78490015982C /* APCActivitiesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCActivitiesViewController.h; sourceTree = ""; }; - F5F1297A1A2F78490015982C /* APCActivitiesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCActivitiesViewController.m; sourceTree = ""; }; + F5F1297A1A2F78490015982C /* APCActivitiesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCActivitiesViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F5F1297C1A2F78490015982C /* APCDashboardEditViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDashboardEditViewController.h; sourceTree = ""; }; F5F1297D1A2F78490015982C /* APCDashboardEditViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDashboardEditViewController.m; sourceTree = ""; }; F5F1297E1A2F78490015982C /* APCDashboardViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDashboardViewController.h; sourceTree = ""; }; @@ -1374,7 +1436,7 @@ F5F129B41A2F78490015982C /* APCDashboardProgressTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCDashboardProgressTableViewCell.h; sourceTree = ""; }; F5F129B51A2F78490015982C /* APCDashboardProgressTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCDashboardProgressTableViewCell.m; sourceTree = ""; }; F5F129B71A2F78490015982C /* APCBaseTaskViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCBaseTaskViewController.h; sourceTree = ""; }; - F5F129B81A2F78490015982C /* APCBaseTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCBaseTaskViewController.m; sourceTree = ""; }; + F5F129B81A2F78490015982C /* APCBaseTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = APCBaseTaskViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; F5F129B91A2F78490015982C /* APCBaseWithProgressTaskViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCBaseWithProgressTaskViewController.h; sourceTree = ""; }; F5F129BA1A2F78490015982C /* APCBaseWithProgressTaskViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APCBaseWithProgressTaskViewController.m; sourceTree = ""; }; F5F129BB1A2F78490015982C /* APCStepViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APCStepViewController.h; sourceTree = ""; }; @@ -1421,6 +1483,7 @@ files = ( 747FB1451ABDDFAE00345000 /* ResearchKit.framework in Frameworks */, 5B5523AA1AC915140068B51D /* Social.framework in Frameworks */, + 747307161A96E2FB0071D863 /* openssl.framework in Frameworks */, F5B948171A7328F30034C522 /* ImageIO.framework in Frameworks */, F55653B31A6F0918003E0B0C /* libMobileGestalt.dylib in Frameworks */, F5F12B2F1A2F86600015982C /* libbz2.dylib in Frameworks */, @@ -1562,6 +1625,7 @@ 366433821A7DA29F007E2BCF /* ReadMe.txt */, 364D34881A7B1C8F0060B3F5 /* APCDataVerificationClient.h */, 364D34891A7B1C8F0060B3F5 /* APCDataVerificationClient.m */, + 368764291ACF5E4200806A32 /* APCDataVerificationServerAccessControl.h */, ); path = DataVerificationClient; sourceTree = ""; @@ -1671,6 +1735,18 @@ name = "Main classes. Please modify only the Helper files. The others are generated by CoreData."; sourceTree = ""; }; + 36D733C31B0BEBCF00D6FB65 /* Mapping Models */ = { + isa = PBXGroup; + children = ( + 36D733C41B0BEC5C00D6FB65 /* APCMappingModel4ToModel6.xcmappingmodel */, + 36D733C61B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.h */, + 36D733C71B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.m */, + 36175FB41B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.h */, + 36175FB51B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.m */, + ); + name = "Mapping Models"; + sourceTree = ""; + }; 36EE894F1A2FEFD700AEA9E6 /* APCScheduleExpressionTests */ = { isa = PBXGroup; children = ( @@ -1816,8 +1892,6 @@ 7BCF702F1ACB6C4A00838717 /* PassiveDataCollector */ = { isa = PBXGroup; children = ( - 7B362C041B02A34500127051 /* APCDataArchiver.h */, - 7B362C051B02A34500127051 /* APCDataArchiver.m */, 7BCF70301ACB6C5C00838717 /* APCPassiveDataCollector.h */, 7BCF70311ACB6C5C00838717 /* APCPassiveDataCollector.m */, 7BEFD7D51AD595FB0087F46C /* Data Sink */, @@ -2035,7 +2109,6 @@ F5179B2A19D09128001DCCB7 /* Products */, ); sourceTree = ""; - usesTabs = 0; }; F5179B2A19D09128001DCCB7 /* Products */ = { isa = PBXGroup; @@ -2049,18 +2122,18 @@ F542EF441A69735000D48C4D /* Autogenerated */ = { isa = PBXGroup; children = ( - 7BA5D99C1AA43F50006F505F /* APCStoredUserData.h */, - 7BA5D99D1AA43F50006F505F /* APCStoredUserData.m */, F5F128951A2F78490015982C /* APCDBStatus.h */, F5F128961A2F78490015982C /* APCDBStatus.m */, F5F1289E1A2F78490015982C /* APCResult.h */, F5F1289F1A2F78490015982C /* APCResult.m */, - F5F128A41A2F78490015982C /* APCSchedule.h */, - F5F128A51A2F78490015982C /* APCSchedule.m */, - F5F128A81A2F78490015982C /* APCScheduledTask.h */, - F5F128A91A2F78490015982C /* APCScheduledTask.m */, - F5F128B01A2F78490015982C /* APCTask.h */, - F5F128B11A2F78490015982C /* APCTask.m */, + 36C1A62A1B0467F100E15BC5 /* APCSchedule.h */, + 36C1A62B1B0467F100E15BC5 /* APCSchedule.m */, + 36C1A62E1B0467F100E15BC5 /* APCScheduledTask.h */, + 36C1A62F1B0467F100E15BC5 /* APCScheduledTask.m */, + 7BA5D99C1AA43F50006F505F /* APCStoredUserData.h */, + 7BA5D99D1AA43F50006F505F /* APCStoredUserData.m */, + 36C1A6261B0467F000E15BC5 /* APCTask.h */, + 36C1A6271B0467F000E15BC5 /* APCTask.m */, ); name = Autogenerated; sourceTree = ""; @@ -2068,16 +2141,20 @@ F542EF451A69737F00D48C4D /* MemoryOnly */ = { isa = PBXGroup; children = ( + 7BD1D3D21A702ED200D6A377 /* APCDataResult.h */, + 7BD1D3D31A702ED200D6A377 /* APCDataResult.m */, F50738BE1A682E12004CF100 /* APCDateRange.h */, F50738BF1A682E12004CF100 /* APCDateRange.m */, + 36FF93501AE1BA8B002E8827 /* APCPotentialScheduledTask.h */, + 36FF93511AE1BA8B002E8827 /* APCPotentialScheduledTask.m */, F5C3635E1A40E21000113129 /* APCSmartSurveyTask.h */, F5C3635F1A40E21000113129 /* APCSmartSurveyTask.m */, F5F128B61A2F78490015982C /* APCUser.h */, F5F128B71A2F78490015982C /* APCUser.m */, F5F128B41A2F78490015982C /* APCUser+UserData.h */, F5F128B51A2F78490015982C /* APCUser+UserData.m */, - 7BD1D3D21A702ED200D6A377 /* APCDataResult.h */, - 7BD1D3D31A702ED200D6A377 /* APCDataResult.m */, + 366F5A2C1AE5C42900E1D28F /* APCTaskGroup.h */, + 366F5A2D1AE5C42900E1D28F /* APCTaskGroup.m */, ); name = MemoryOnly; sourceTree = ""; @@ -2225,8 +2302,8 @@ F5B9473F1A73272C0034C522 /* Categories */ = { isa = PBXGroup; children = ( - 7B751D551B0A61A600E77BD2 /* NSDictionary+APCStringify.h */, - 7B751D561B0A61A600E77BD2 /* NSDictionary+APCStringify.m */, + 7B939C141B0FEF9C00D252A4 /* CLLocation+APCAdditions.h */, + 7B939C151B0FEF9C00D252A4 /* CLLocation+APCAdditions.m */, F5B947401A73272C0034C522 /* APCDeviceHardware+APCHelper.h */, F5B947411A73272C0034C522 /* APCDeviceHardware+APCHelper.m */, F5B947421A73272C0034C522 /* APCStepProgressBar+Appearance.h */, @@ -2235,6 +2312,8 @@ 36257FBC1AA714B60060B95A /* CMMotionActivity+Helper.m */, F5B947441A73272C0034C522 /* HKHealthStore+APCExtensions.h */, F5B947451A73272C0034C522 /* HKHealthStore+APCExtensions.m */, + 3670674E1AF57DBE0069B4E5 /* NSArray+APCHelper.h */, + 3670674F1AF57DBE0069B4E5 /* NSArray+APCHelper.m */, F5B947461A73272C0034C522 /* NSBundle+Helper.h */, F5B947471A73272C0034C522 /* NSBundle+Helper.m */, F5B947481A73272C0034C522 /* NSDate+Helper.h */, @@ -2245,8 +2324,6 @@ F5B9474D1A73272C0034C522 /* NSDictionary+APCAdditions.m */, F5B9474E1A73272C0034C522 /* NSError+APCAdditions.h */, F5B9474F1A73272C0034C522 /* NSError+APCAdditions.m */, - EE4B95231AF82BA6000097C7 /* NSError+Bridge.h */, - EE4B95241AF82BA6000097C7 /* NSError+Bridge.m */, F5B947501A73272C0034C522 /* NSManagedObject+APCHelper.h */, F5B947511A73272C0034C522 /* NSManagedObject+APCHelper.m */, F5B947521A73272C0034C522 /* NSObject+Helper.h */, @@ -2261,6 +2338,8 @@ F5306CCC1A8BE7F600732E60 /* ORKQuestionResult+APCHelper.m */, F5B947581A73272C0034C522 /* SBBGuidCreatedOnVersionHolder+APCAdditions.h */, F5B947591A73272C0034C522 /* SBBGuidCreatedOnVersionHolder+APCAdditions.m */, + 363BCA281AEC074D00B10A7F /* SBBSchedule+APCHelper.h */, + 363BCA291AEC074D00B10A7F /* SBBSchedule+APCHelper.m */, F5B9475A1A73272C0034C522 /* UIAlertController+Helper.h */, F5B9475B1A73272C0034C522 /* UIAlertController+Helper.m */, F5B9475C1A73272C0034C522 /* UIImage+APCHelper.h */, @@ -2273,10 +2352,10 @@ F5B947611A73272C0034C522 /* UIView+Helper.m */, 36D0510C1ABB92F0008FC9B3 /* NSFileManager+Helper.h */, 36D0510D1ABB92F0008FC9B3 /* NSFileManager+Helper.m */, + 7BDF4D281AE5403E00ACC1F8 /* NSDictionary+APCStringify.h */, + 7BDF4D291AE5403E00ACC1F8 /* NSDictionary+APCStringify.m */, 7BDF4D301AE5492400ACC1F8 /* HKWorkout+APCHelper.h */, 7BDF4D311AE5492400ACC1F8 /* HKWorkout+APCHelper.m */, - 7B558D261AE587DF00129167 /* CLLocation+APCAdditions.h */, - 7B558D271AE587DF00129167 /* CLLocation+APCAdditions.m */, ); path = Categories; sourceTree = ""; @@ -2284,6 +2363,10 @@ F5B947621A73272C0034C522 /* DataArchiverAndCollector */ = { isa = PBXGroup; children = ( + F5B947631A73272C0034C522 /* APCDataArchiver.h */, + F5B947641A73272C0034C522 /* APCDataArchiver.m */, + 6CDE39CB1B1A03200033F9DD /* APCDataUploader.h */, + 6CDE39CC1B1A03200033F9DD /* APCDataUploader.m */, ); path = DataArchiverAndCollector; sourceTree = ""; @@ -2300,6 +2383,8 @@ F5B9476E1A73272C0034C522 /* Objects */ = { isa = PBXGroup; children = ( + 7B939C101B0FEF6300D252A4 /* APCKeychainStore+Passcode.h */, + 7B939C111B0FEF6300D252A4 /* APCKeychainStore+Passcode.m */, F5B9476F1A73272C0034C522 /* APCConstants.h */, F5B947701A73272C0034C522 /* APCConstants.m */, F5B947711A73272C0034C522 /* APCDeviceHardware.h */, @@ -2310,8 +2395,6 @@ 087255BF1ABA390500586492 /* APCJSONSerializer.m */, F5B947751A73272C0034C522 /* APCKeychainStore.h */, F5B947761A73272C0034C522 /* APCKeychainStore.m */, - EE028FE11AF94B36001C8251 /* APCKeychainStore+Passcode.h */, - EE028FE21AF94B36001C8251 /* APCKeychainStore+Passcode.m */, F5B947771A73272C0034C522 /* APCSegmentedButton.h */, F5B947781A73272C0034C522 /* APCSegmentedButton.m */, F5B947791A73272C0034C522 /* APCTasksReminderManager.h */, @@ -2366,14 +2449,14 @@ F5B947941A73272C0034C522 /* Internals */ = { isa = PBXGroup; children = ( + F5B9479B1A73272C0034C522 /* APCScheduleEnumerator.h */, + F5B9479C1A73272C0034C522 /* APCScheduleEnumerator.m */, F5B947951A73272C0034C522 /* APCDayOfMonthSelector.h */, F5B947961A73272C0034C522 /* APCDayOfMonthSelector.m */, F5B947971A73272C0034C522 /* APCListSelector.h */, F5B947981A73272C0034C522 /* APCListSelector.m */, F5B947991A73272C0034C522 /* APCPointSelector.h */, F5B9479A1A73272C0034C522 /* APCPointSelector.m */, - F5B9479B1A73272C0034C522 /* APCScheduleEnumerator.h */, - F5B9479C1A73272C0034C522 /* APCScheduleEnumerator.m */, F5B9479D1A73272C0034C522 /* APCScheduleExpressionParser.h */, F5B9479E1A73272C0034C522 /* APCScheduleExpressionParser.m */, F5B9479F1A73272C0034C522 /* APCScheduleExpressionToken.h */, @@ -2391,8 +2474,18 @@ F5B947A71A73272C0034C522 /* Scheduler */ = { isa = PBXGroup; children = ( + 36C1A6321B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.h */, + 36C1A6331B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.m */, F5B947A81A73272C0034C522 /* APCScheduler.h */, F5B947A91A73272C0034C522 /* APCScheduler.m */, + 36A4BBD81B0018870035F4B7 /* APCTaskGroupCacheEntry.h */, + 36A4BBD91B0018870035F4B7 /* APCTaskGroupCacheEntry.m */, + 36D8E7D51AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.h */, + 36D8E7D61AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.m */, + 6CAF4D491B112BBC00D9C340 /* APCActivitiesDateState.h */, + 6CAF4D4A1B112BBC00D9C340 /* APCActivitiesDateState.m */, + 36B910181B1510A400EE37D9 /* APCScheduleDebugPrinter.h */, + 36B910191B1510A400EE37D9 /* APCScheduleDebugPrinter.m */, ); path = Scheduler; sourceTree = ""; @@ -2437,6 +2530,8 @@ children = ( F5F128901A2F78490015982C /* APCDataSubstrate.h */, F5F128911A2F78490015982C /* APCDataSubstrate.m */, + F5F1288C1A2F78490015982C /* APCDataSubstrate+HealthKit.h */, + F5F1288D1A2F78490015982C /* APCDataSubstrate+HealthKit.m */, F5F1288E1A2F78490015982C /* APCDataSubstrate+ResearchKit.h */, F5F1288F1A2F78490015982C /* APCDataSubstrate+ResearchKit.m */, F5F128921A2F78490015982C /* Model */, @@ -2447,10 +2542,12 @@ F5F128921A2F78490015982C /* Model */ = { isa = PBXGroup; children = ( - F5F128B81A2F78490015982C /* MODEL_README */, + F5F128B81A2F78490015982C /* MODEL_README.txt */, + 36D733C11B0BE9C100D6FB65 /* MODEL_MIGRATION_README.txt */, F5F128971A2F78490015982C /* APCModel.h */, F5F128981A2F78490015982C /* APCModel.xcdatamodeld */, F542EF441A69735000D48C4D /* Autogenerated */, + 36D733C31B0BEBCF00D6FB65 /* Mapping Models */, F542EF461A6973EF00D48C4D /* AddOns */, F542EF471A69740900D48C4D /* Bridge */, F542EF451A69737F00D48C4D /* MemoryOnly */, @@ -2480,7 +2577,6 @@ F53C047E1A9B8C7D00BBEC03 /* APCTabBarViewController.m */, F5F129201A2F78490015982C /* APCAppDelegate.h */, F5F129211A2F78490015982C /* APCAppDelegate.m */, - F5F129221A2F78490015982C /* TabBar.storyboard */, ); path = Startup; sourceTree = ""; @@ -2687,6 +2783,8 @@ 7B0DC4121A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.h */, 7B0DC4131A5EFDDA0072EE80 /* APCActivitiesViewWithNoTask.m */, 7B0DC4171A5EFECC0072EE80 /* APCActivitiesViewWithNoTask.xib */, + 3689C1F01AF45594002426C5 /* APCActivitiesViewSection.h */, + 3689C1F11AF45594002426C5 /* APCActivitiesViewSection.m */, ); path = Activities; sourceTree = ""; @@ -2731,7 +2829,7 @@ F5F1298D1A2F78490015982C /* APCProfileViewController.m */, F5F1298E1A2F78490015982C /* APCSettingsViewController.h */, F5F1298F1A2F78490015982C /* APCSettingsViewController.m */, - CF61A37F1B0A53490014AD1A /* APCDemographicUploader.h */, + CF64CF2A1AE860CC000795B5 /* APCDemographicUploader.h */, CF64CF2B1AE860CC000795B5 /* APCDemographicUploader.m */, F5F129901A2F78490015982C /* APCWithdrawCompleteViewController.h */, F5F129911A2F78490015982C /* APCWithdrawCompleteViewController.m */, @@ -2892,6 +2990,7 @@ F5F129D91A2F78490015982C /* APCAppCoreTests */ = { isa = PBXGroup; children = ( + 36879C211ACF720600C4BE91 /* APCNewScheduleTests.m */, 36EE894F1A2FEFD700AEA9E6 /* APCScheduleExpressionTests */, F5F129E01A2F78490015982C /* Info.plist */, 360C63CF1A33971B002EC86C /* NSDateComponents+HelperTests */, @@ -2929,7 +3028,6 @@ F5F12AF01A2F78490015982C /* APCDashboardProgressTableViewCell.h in Headers */, 08EA2AB31A7AD564007549C0 /* UIImage+ImageEffects.h in Headers */, 5BB10C0A1A91D540002D2DD2 /* APCStudyVideoCollectionViewCell.h in Headers */, - 7B558D281AE587DF00129167 /* CLLocation+APCAdditions.h in Headers */, 5BD6EBC41A9D905100C3BFB0 /* APCPermissionPrimingViewController.h in Headers */, 3654318D1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.h in Headers */, F5B947EF1A73272C0034C522 /* APCParameters.h in Headers */, @@ -2940,6 +3038,7 @@ CFFDED7A1A95731F00B25581 /* APCMedicationTrackerMedicationsDisplayView.h in Headers */, F5F12AB21A2F78490015982C /* APCSignupPasscodeViewController.h in Headers */, F5B947C91A73272C0034C522 /* NSString+Helper.h in Headers */, + 367067501AF57DBE0069B4E5 /* NSArray+APCHelper.h in Headers */, F5B947BF1A73272C0034C522 /* NSDateComponents+Helper.h in Headers */, 5B9B36AB1A95DC1700389F42 /* APCActivitiesTableViewCell.h in Headers */, F5F129EE1A2F78490015982C /* APCDBStatus+AddOn.h in Headers */, @@ -2950,16 +3049,19 @@ F5F12ABC1A2F78490015982C /* APCDashboardEditViewController.h in Headers */, A7CFE4B51A8B05F4009A171C /* APCStudyOverviewCollectionViewCell.h in Headers */, F5B9462F1A7309A20034C522 /* ZZDataChannelOutput.h in Headers */, + 36FF93521AE1BA8B002E8827 /* APCPotentialScheduledTask.h in Headers */, F5B947D51A73272C0034C522 /* UIView+Helper.h in Headers */, F5F12AFD1A2F78490015982C /* APCIntroductionViewController.h in Headers */, F5F12AB71A2F78490015982C /* APCTermsAndConditionsViewController.h in Headers */, CFFDED771A95731F00B25581 /* APCMedicationTrackerDetailViewController.h in Headers */, F5B946321A7309A20034C522 /* ZZDeflateOutputStream.h in Headers */, + 36B9101A1B1510A400EE37D9 /* APCScheduleDebugPrinter.h in Headers */, F5F12A771A2F78490015982C /* APCStepProgressBar.h in Headers */, F5F12AAC1A2F78490015982C /* APCSignUpGeneralInfoViewController.h in Headers */, F5B946261A7309A20034C522 /* ZZArchiveEntry.h in Headers */, F5B946311A7309A20034C522 /* ZZDataProvider.h in Headers */, F5F12AD41A2F78490015982C /* APCCheckTableViewCell.h in Headers */, + 36C1A6301B0467F100E15BC5 /* APCScheduledTask.h in Headers */, 7BEFD7DD1AD596070087F46C /* APCCollectorProtocol.h in Headers */, 7B6C8CBD1AA26ECE0007B560 /* APCConsentTask.h in Headers */, 08023C4F1AA94F48008E6DDA /* APCAllSetContentViewController.h in Headers */, @@ -2969,6 +3071,7 @@ F5F12ABA1A2F78490015982C /* APCActivitiesViewController.h in Headers */, CFFDED801A95731F00B25581 /* UIColor+MedicationTracker.h in Headers */, F5B947B71A73272C0034C522 /* APCStepProgressBar+Appearance.h in Headers */, + 6CDE39CD1B1A03200033F9DD /* APCDataUploader.h in Headers */, 5BD6EBA21A9A46BB00C3BFB0 /* APCStudyLandingCollectionViewCell.h in Headers */, 5B827B601A81CAE200C685A3 /* APCDashboardTableViewCell.h in Headers */, F5F12ADA1A2F78490015982C /* APCPickerTableViewCell.h in Headers */, @@ -2984,6 +3087,7 @@ 5B234E141A329BF300A5A3A0 /* APCWithdrawDescriptionViewController.h in Headers */, F5F12AFB1A2F78490015982C /* APCInstructionStepViewController.h in Headers */, F5F12A8B1A2F78490015982C /* APCIntroVideoViewController.h in Headers */, + 36D8E7D71AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.h in Headers */, 7BDF4D321AE5492400ACC1F8 /* HKWorkout+APCHelper.h in Headers */, F5F129E11A2F78490015982C /* APCAppCore.h in Headers */, F5B947EB1A73272C0034C522 /* APCDebugWindow.h in Headers */, @@ -3024,8 +3128,10 @@ 3627D3481A9A7517006B02E8 /* APCMedTrackerMedication.h in Headers */, F5B948081A73272C0034C522 /* APCScheduleExpressionParser.h in Headers */, F5F12A6C1A2F78490015982C /* APCAppDelegate.h in Headers */, + 3687642A1ACF5E4200806A32 /* APCDataVerificationServerAccessControl.h in Headers */, 36AAB34F1A9A75BB00FAC255 /* APCMedTrackerPrescription.h in Headers */, 5BB10C131A91F970002D2DD2 /* APCWebViewController.h in Headers */, + 36C1A6341B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.h in Headers */, F5F12A871A2F78490015982C /* APCSignUpTask.h in Headers */, 36D0510E1ABB92F0008FC9B3 /* NSFileManager+Helper.h in Headers */, F5B947AF1A73272C0034C522 /* UIColor+APCAppearance.h in Headers */, @@ -3033,7 +3139,6 @@ CFFDEDFA1A95734000B25581 /* APCSetupTableViewCell.h in Headers */, 5BE106F01A9EE2D900CA5A07 /* APCDashboardGraphTableViewCell.h in Headers */, F5F129FA1A2F78490015982C /* APCSchedule+AddOn.h in Headers */, - 7B362C061B02A34500127051 /* APCDataArchiver.h in Headers */, F53C047F1A9B8C7D00BBEC03 /* APCTabBarViewController.h in Headers */, F5B946211A7309A20034C522 /* zipzap.h in Headers */, CFFDEDDD1A95734000B25581 /* APCFrequencyTableViewTimesCell.h in Headers */, @@ -3046,26 +3151,24 @@ F5B948101A73272C0034C522 /* APCTimeSelectorEnumerator.h in Headers */, CF7945861AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.h in Headers */, F5F12A7B1A2F78490015982C /* APCCircleView.h in Headers */, - F5F129FE1A2F78490015982C /* APCSchedule.h in Headers */, - EE4B95251AF82BA6000097C7 /* NSError+Bridge.h in Headers */, 0875C3D81A797A7B00CE50FB /* APCButton.h in Headers */, 5B9B36A71A95D9C900389F42 /* APCActivitiesBasicTableViewCell.h in Headers */, 3650C65B1AA29BB50075C935 /* APCCatastrophicErrorViewController.h in Headers */, - 7B751D571B0A61A600E77BD2 /* NSDictionary+APCStringify.h in Headers */, F5B9480C1A73272C0034C522 /* APCScheduleExpressionTokenizer.h in Headers */, F5F12A851A2F78490015982C /* APCOnboarding.h in Headers */, 369E27F31A96B7A200D35DFA /* APCMedicationLozenge.h in Headers */, + 7BDF4D2A1AE5403E00ACC1F8 /* NSDictionary+APCStringify.h in Headers */, 364D348A1A7B1C8F0060B3F5 /* APCDataVerificationClient.h in Headers */, 089465471A8C179700A983AC /* APCDashboardInsightSummaryTableViewCell.h in Headers */, F5F12B001A2F78490015982C /* APCSimpleTaskSummaryViewController.h in Headers */, A7CFE4B71A8B05F4009A171C /* APCStudyOverviewCollectionViewController.h in Headers */, F5F12A931A2F78490015982C /* APCStudyDetailsViewController.h in Headers */, F5F12AEC1A2F78490015982C /* APCDashboardMessageTableViewCell.h in Headers */, - EE028FE31AF94B36001C8251 /* APCKeychainStore+Passcode.h in Headers */, F5B947B11A73272C0034C522 /* UIFont+APCAppearance.h in Headers */, 369E28171A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.h in Headers */, F5F12A731A2F78490015982C /* APCConfirmationView.h in Headers */, F5B947FC1A73272C0034C522 /* APCPermissionsManager.h in Headers */, + 7B939C161B0FEF9C00D252A4 /* CLLocation+APCAdditions.h in Headers */, F5F12ACA1A2F78490015982C /* APCProfileViewController.h in Headers */, 7B544B331ADF084F00361FB6 /* APCDisplacementTrackingCollector.h in Headers */, F5B947E71A73272C0034C522 /* APCSegmentedButton.h in Headers */, @@ -3075,6 +3178,7 @@ 087468061AA691A400BE2572 /* APCThankYouViewController.h in Headers */, 081A477A1A93EC4700E13148 /* APCBadgeLabel.h in Headers */, F5F12A891A2F78490015982C /* APCTableViewItem.h in Headers */, + CF64CF2C1AE860CC000795B5 /* APCDemographicUploader.h in Headers */, F5F12AC31A2F78490015982C /* APCLearnMasterViewController.h in Headers */, F5B9463A1A7309A20034C522 /* ZZHeaders.h in Headers */, F5B947CD1A73272C0034C522 /* SBBGuidCreatedOnVersionHolder+APCAdditions.h in Headers */, @@ -3089,6 +3193,7 @@ F5F12A751A2F78490015982C /* APCPieGraphView.h in Headers */, F5B948121A73272C0034C522 /* APCScheduler.h in Headers */, CFFDEDF21A95734000B25581 /* APCMedicationSummaryTableViewCell.h in Headers */, + 36C1A62C1B0467F100E15BC5 /* APCSchedule.h in Headers */, F5B946471A7309A20034C522 /* ZZStandardCryptoEngine.h in Headers */, 7BA5D99E1AA43F50006F505F /* APCStoredUserData.h in Headers */, 369E28101A96B7A200D35DFA /* APCMedTrackerPossibleDosage+Helper.h in Headers */, @@ -3100,6 +3205,7 @@ 7BD1D3D41A702ED200D6A377 /* APCDataResult.h in Headers */, F5B947BB1A73272C0034C522 /* NSBundle+Helper.h in Headers */, F5F12B0A1A2F78490015982C /* APCPasscodeView.h in Headers */, + 6CAF4D4B1B112BBC00D9C340 /* APCActivitiesDateState.h in Headers */, CFFDEDE61A95734000B25581 /* APCMedicationColorViewController.h in Headers */, F5F12ACE1A2F78490015982C /* APCWithdrawCompleteViewController.h in Headers */, F5F12A7D1A2F78490015982C /* APCGraph.h in Headers */, @@ -3114,6 +3220,8 @@ F5F129F21A2F78490015982C /* APCModel.h in Headers */, 7B544B3B1ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.h in Headers */, F5F12AD21A2F78490015982C /* APCAddressTableViewCell.h in Headers */, + 36C1A6281B0467F000E15BC5 /* APCTask.h in Headers */, + F5B947D71A73272C0034C522 /* APCDataArchiver.h in Headers */, F5F12ADC1A2F78490015982C /* APCSegmentedTableViewCell.h in Headers */, F5F129E21A2F78490015982C /* APCDataMonitor+Bridge.h in Headers */, F5B947D31A73272C0034C522 /* UIScrollView+Helper.h in Headers */, @@ -3126,14 +3234,16 @@ F5B947F61A73272C0034C522 /* APCParametersDashboardTableViewController.h in Headers */, F5F12AF21A2F78490015982C /* APCBaseTaskViewController.h in Headers */, F5F12AF41A2F78490015982C /* APCBaseWithProgressTaskViewController.h in Headers */, + 366F5A2E1AE5C42900E1D28F /* APCTaskGroup.h in Headers */, F5B947B51A73272C0034C522 /* APCDeviceHardware+APCHelper.h in Headers */, 0894654D1A8C1F0200A983AC /* APCInsightBarView.h in Headers */, F5F12ABE1A2F78490015982C /* APCDashboardViewController.h in Headers */, F5F129E41A2F78490015982C /* APCDataMonitor.h in Headers */, + 363BCA2A1AEC074D00B10A7F /* SBBSchedule+APCHelper.h in Headers */, + F5F129E81A2F78490015982C /* APCDataSubstrate+HealthKit.h in Headers */, F5F12AD81A2F78490015982C /* APCPermissionsCell.h in Headers */, F5B946241A7309A20034C522 /* ZZArchive.h in Headers */, F5B947DB1A73272C0034C522 /* APCLog.h in Headers */, - F5F12A0A1A2F78490015982C /* APCTask.h in Headers */, F5B9463F1A7309A20034C522 /* ZZNewArchiveEntryWriter.h in Headers */, F5B947C31A73272C0034C522 /* NSError+APCAdditions.h in Headers */, 369E27EB1A96B7A200D35DFA /* APCMedicationActualMedicine.h in Headers */, @@ -3195,20 +3305,22 @@ 089465521A8C211100A983AC /* APCInsights.h in Headers */, F5B947ED1A73272C0034C522 /* APCParameters+Settings.h in Headers */, 712AB44E1A9E692400556DA2 /* APCMotionHistoryReporter.h in Headers */, + 36175FB61B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.h in Headers */, 5B7D471E1B0549FA00958921 /* APCNormalDistributionGraphView.h in Headers */, CFFDED701A95731F00B25581 /* APCMedicationTrackerCalendarViewController.h in Headers */, 369E28081A96B7A200D35DFA /* APCMedTrackerMedication+Helper.h in Headers */, - F5F12A021A2F78490015982C /* APCScheduledTask.h in Headers */, 369E28041A96B7A200D35DFA /* APCMedTrackerInflatableItem+Helper.h in Headers */, F5B947C11A73272C0034C522 /* NSDictionary+APCAdditions.h in Headers */, F5F12A101A2F78490015982C /* APCUser.h in Headers */, 08023C531AAA12DF008E6DDA /* APCAllSetTableViewCell.h in Headers */, F5B948041A73272C0034C522 /* APCPointSelector.h in Headers */, + 7B939C121B0FEF6300D252A4 /* APCKeychainStore+Passcode.h in Headers */, F5B946221A7309A20034C522 /* ZZAESDecryptInputStream.h in Headers */, 6CD8B6741AC5011D0061E6D6 /* APCTaskReminder.h in Headers */, F5B947E31A73272C0034C522 /* APCGroupedScheduledTask.h in Headers */, 08970F121A8D407600EA46C3 /* APCFoodInsight.h in Headers */, 7B6C8CB71AA26ECE0007B560 /* APCConsentBooleanQuestion.h in Headers */, + 3689C1F21AF45594002426C5 /* APCActivitiesViewSection.h in Headers */, 5B827B4C1A80A39900C685A3 /* APCDashboardMoreInfoViewController.h in Headers */, 369E27FA1A96B7A200D35DFA /* APCMedicationUltraSimpleSelfInflator.h in Headers */, CFBD289A1AA4408800F49161 /* APCMedicationNameTableViewCell.h in Headers */, @@ -3220,11 +3332,13 @@ F50738C01A682E12004CF100 /* APCDateRange.h in Headers */, 5B04329F1A318AA2000DC9ED /* APCSignInTask.h in Headers */, CF130B781A9E8DCD002DA023 /* APCSetupButtonTableViewCell.h in Headers */, + 36D733C81B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.h in Headers */, F5F129F61A2F78490015982C /* APCResult+Bridge.h in Headers */, F5B947DF1A73272C0034C522 /* APCConstants.h in Headers */, F5F12A9B1A2F78490015982C /* APCEmailVerifyViewController.h in Headers */, 7BBC9BCB1ACF416700E022DB /* APCDataCollector.h in Headers */, F5B947B91A73272C0034C522 /* HKHealthStore+APCExtensions.h in Headers */, + 36A4BBDA1B0018870035F4B7 /* APCTaskGroupCacheEntry.h in Headers */, F5F12AE01A2F78490015982C /* APCSwitchTableViewCell.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3336,10 +3450,11 @@ 369E28141A96B7A200D35DFA /* APCMedTrackerPredefinedMedications.plist in Resources */, 7BEC13D31AA3AA5B00CA316C /* APCActivityTracking.storyboard in Resources */, 08027A871A7319AC00B358CC /* heart-fitness@2x.png in Resources */, + 36D733C21B0BE9C100D6FB65 /* MODEL_MIGRATION_README.txt in Resources */, CFFDEDE81A95734000B25581 /* APCMedicationColorViewController.xib in Resources */, CFFDED721A95731F00B25581 /* APCMedicationTrackerCalendarViewController.xib in Resources */, F5F12A8D1A2F78490015982C /* APCOnboarding.storyboard in Resources */, - F5F12A121A2F78490015982C /* MODEL_README in Resources */, + F5F12A121A2F78490015982C /* MODEL_README.txt in Resources */, F5B947F11A73272C0034C522 /* APCParameters.storyboard in Resources */, CFBD289C1AA4408800F49161 /* APCMedicationNameTableViewCell.xib in Resources */, 08027A851A7319AC00B358CC /* handtapping01@2x.png in Resources */, @@ -3375,8 +3490,8 @@ 5B4574CA1ABFD07A00601DCC /* License_BridgeSDK.txt in Resources */, 08027A831A7319AC00B358CC /* consent_06@3x.png in Resources */, 08027A9A1A7319AC00B358CC /* walkingman_monitor@3x.png in Resources */, - F5F12A6E1A2F78490015982C /* TabBar.storyboard in Resources */, CFFDED791A95731F00B25581 /* APCMedicationTrackerDetailViewController.xib in Resources */, + 3624092B1A8181350005B1A7 /* get_debug_ip_address.sh in Resources */, 08027A881A7319AC00B358CC /* heartbeat@2x.png in Resources */, 08027A7A1A7319AC00B358CC /* consent_04@2x.png in Resources */, F5F12AFF1A2F78490015982C /* APCIntroductionViewController.xib in Resources */, @@ -3410,7 +3525,6 @@ F5F12AF11A2F78490015982C /* APCDashboardProgressTableViewCell.m in Sources */, 08BABB431AD62D5D00059C35 /* APCExampleLabel.m in Sources */, F5B9480F1A73272C0034C522 /* APCTimeSelector.m in Sources */, - F5F12A0B1A2F78490015982C /* APCTask.m in Sources */, F5B9463E1A7309A20034C522 /* ZZNewArchiveEntry.mm in Sources */, F5F12A861A2F78490015982C /* APCOnboarding.m in Sources */, F5B9480B1A73272C0034C522 /* APCScheduleExpressionToken.m in Sources */, @@ -3423,12 +3537,12 @@ 7B6C8CC01AA26ECE0007B560 /* APCConsentTextChoiceQuestion.m in Sources */, F5B947FD1A73272C0034C522 /* APCPermissionsManager.m in Sources */, CF7945871AA7AEC70019160F /* APCFrequencyEverydayTableViewCell.m in Sources */, + 364D348B1A7B1C8F0060B3F5 /* APCDataVerificationClient.m in Sources */, 7B6C8CC51AA26F150007B560 /* APCStack.m in Sources */, 7B544B3C1ADF09E900361FB6 /* APCPassiveDisplacementTrackingDataUploader.m in Sources */, F5F129F91A2F78490015982C /* APCResult.m in Sources */, F5F129FD1A2F78490015982C /* APCSchedule+Bridge.m in Sources */, F5F12A0D1A2F78490015982C /* APCUser+Bridge.m in Sources */, - F5F129FF1A2F78490015982C /* APCSchedule.m in Sources */, F5F12A6D1A2F78490015982C /* APCAppDelegate.m in Sources */, F5B9462E1A7309A20034C522 /* ZZDataChannel.m in Sources */, 5BFEB41E1AA72CCD0089DEF7 /* APCSharingOptionsViewController.m in Sources */, @@ -3450,12 +3564,10 @@ F5B946351A7309A20034C522 /* ZZError.m in Sources */, 5BE106F11A9EE2D900CA5A07 /* APCDashboardGraphTableViewCell.m in Sources */, CFFDEDF31A95734000B25581 /* APCMedicationSummaryTableViewCell.m in Sources */, - 7B362C071B02A34500127051 /* APCDataArchiver.m in Sources */, 7B8DBEC51AA1871D007B4026 /* APCVerticalThinLineView.m in Sources */, 5B0432A01A318AA2000DC9ED /* APCSignInTask.m in Sources */, F5F12A0F1A2F78490015982C /* APCUser+UserData.m in Sources */, F5F12AC11A2F78490015982C /* APCGraphViewController.m in Sources */, - 7B558D291AE587DF00129167 /* CLLocation+APCAdditions.m in Sources */, 5BD6EBA31A9A46BB00C3BFB0 /* APCStudyLandingCollectionViewCell.m in Sources */, F5F12A111A2F78490015982C /* APCUser.m in Sources */, F5F12B0B1A2F78490015982C /* APCPasscodeView.m in Sources */, @@ -3468,16 +3580,18 @@ F5B947D21A73272C0034C522 /* UIImage+APCHelper.m in Sources */, 5B9B36B01A95DEEB00389F42 /* APCActivitiesSectionHeaderView.m in Sources */, F5F12ABD1A2F78490015982C /* APCDashboardEditViewController.m in Sources */, - 364D348B1A7B1C8F0060B3F5 /* APCDataVerificationClient.m in Sources */, F5B947F51A73272C0034C522 /* APCParametersCoreDataCell.m in Sources */, 7B6C8CBC1AA26ECE0007B560 /* APCConsentQuestion.m in Sources */, + 36C1A6351B0541DA00E15BC5 /* APCScheduleIntervalEnumerator.m in Sources */, F5F129E31A2F78490015982C /* APCDataMonitor+Bridge.m in Sources */, 5BD6EBB81A9C77D900C3BFB0 /* APCBaseGraphView.m in Sources */, F5F12A961A2F78490015982C /* APCStudyOverviewViewController.m in Sources */, F5B947BE1A73272C0034C522 /* NSDate+Helper.m in Sources */, F5F12AD51A2F78490015982C /* APCCheckTableViewCell.m in Sources */, + 36C1A6311B0467F100E15BC5 /* APCScheduledTask.m in Sources */, F5F12AE51A2F78490015982C /* APCTintedTableViewCell.m in Sources */, 7B76F94C1AD34A72003508EB /* APCCoreMotionBackgroundDataCollector.m in Sources */, + F5B947D81A73272C0034C522 /* APCDataArchiver.m in Sources */, F5F12A091A2F78490015982C /* APCTask+Bridge.m in Sources */, 7BDF4D331AE5492400ACC1F8 /* HKWorkout+APCHelper.m in Sources */, F5B946231A7309A20034C522 /* ZZAESDecryptInputStream.mm in Sources */, @@ -3486,6 +3600,7 @@ F5F12AD71A2F78490015982C /* APCDefaultTableViewCell.m in Sources */, A7CFE4B81A8B05F4009A171C /* APCStudyOverviewCollectionViewController.m in Sources */, F5F12A781A2F78490015982C /* APCStepProgressBar.m in Sources */, + 36D733C91B0BF03000D6FB65 /* APCDataMigrationPolicy_Model4ToModel6.m in Sources */, F5F12AF71A2F78490015982C /* APCStepViewController.m in Sources */, CFFDEDDB1A95734000B25581 /* APCFrequencyDayTableViewCell.m in Sources */, F5F12AFE1A2F78490015982C /* APCIntroductionViewController.m in Sources */, @@ -3498,6 +3613,7 @@ F5C363611A40E21000113129 /* APCSmartSurveyTask.m in Sources */, F5F12AF51A2F78490015982C /* APCBaseWithProgressTaskViewController.m in Sources */, 0875C3D91A797A7B00CE50FB /* APCButton.m in Sources */, + 3689C1F31AF45594002426C5 /* APCActivitiesViewSection.m in Sources */, F5B9464B1A7309A20034C522 /* ZZStoreOutputStream.m in Sources */, F5F12B0D1A2F78490015982C /* APCPermissionButton.m in Sources */, 369E27F61A96B7A200D35DFA /* APCMedicationPossibleDosage.m in Sources */, @@ -3505,6 +3621,7 @@ F5B946421A7309A20034C522 /* ZZOldArchiveEntry.mm in Sources */, F5F129FB1A2F78490015982C /* APCSchedule+AddOn.m in Sources */, F5B9463C1A7309A20034C522 /* ZZInflateInputStream.m in Sources */, + 6CDE39CE1B1A03200033F9DD /* APCDataUploader.m in Sources */, F5B946401A7309A20034C522 /* ZZNewArchiveEntryWriter.mm in Sources */, 369E28181A96B7A200D35DFA /* APCMedTrackerPrescriptionColor+Helper.m in Sources */, 7BEC13D71AA3AA5B00CA316C /* APCFitnessAllocation.m in Sources */, @@ -3524,6 +3641,7 @@ CFFDEDE41A95734000B25581 /* APCColorSwatchTableViewCell.m in Sources */, 7B8DBEC31AA186C4007B4026 /* APCHorizontalThinLineView.m in Sources */, F5B947F91A73272C0034C522 /* APCParametersUserDefaultCell.m in Sources */, + 367067511AF57DBE0069B4E5 /* NSArray+APCHelper.m in Sources */, F5F12AEF1A2F78490015982C /* APCDashboardPieGraphTableViewCell.m in Sources */, CFFDED7F1A95731F00B25581 /* NSDictionary+MedicationTracker.m in Sources */, F5F12A721A2F78490015982C /* APCConcentricProgressView.m in Sources */, @@ -3532,16 +3650,15 @@ F5B947FF1A73272C0034C522 /* APCScheduleExpression.m in Sources */, F5306CCE1A8BE7F600732E60 /* ORKQuestionResult+APCHelper.m in Sources */, CFFDEDF01A95734000B25581 /* APCMedicationNameViewController.m in Sources */, + 36D733C51B0BEC5C00D6FB65 /* APCMappingModel4ToModel6.xcmappingmodel in Sources */, F5F129EB1A2F78490015982C /* APCDataSubstrate+ResearchKit.m in Sources */, 3627D34D1A9A7517006B02E8 /* APCMedTrackerPossibleDosage.m in Sources */, 5B9B36A41A95D9B500389F42 /* APCActivitiesTintedTableViewCell.m in Sources */, F5F12AC61A2F78490015982C /* APCLearnStudyDetailsViewController.m in Sources */, - EE4B95261AF82BA6000097C7 /* NSError+Bridge.m in Sources */, F5B947EA1A73272C0034C522 /* APCTasksReminderManager.m in Sources */, F5B948051A73272C0034C522 /* APCPointSelector.m in Sources */, F5F12AAD1A2F78490015982C /* APCSignUpGeneralInfoViewController.m in Sources */, F5B948151A73272C0034C522 /* APCScoring.m in Sources */, - 7B751D581B0A61A600E77BD2 /* NSDictionary+APCStringify.m in Sources */, F5B947B81A73272C0034C522 /* APCStepProgressBar+Appearance.m in Sources */, 6C8646411AF8077300B46C49 /* APCCorrelationsSelectorViewController.m in Sources */, 7BDF4D2B1AE5403E00ACC1F8 /* NSDictionary+APCStringify.m in Sources */, @@ -3555,7 +3672,9 @@ F5F129F31A2F78490015982C /* APCModel.xcdatamodeld in Sources */, 087255C11ABA390500586492 /* APCJSONSerializer.m in Sources */, F5F129E51A2F78490015982C /* APCDataMonitor.m in Sources */, + F5F129E91A2F78490015982C /* APCDataSubstrate+HealthKit.m in Sources */, CFFDEDDE1A95734000B25581 /* APCFrequencyTableViewTimesCell.m in Sources */, + 36FF93531AE1BA8B002E8827 /* APCPotentialScheduledTask.m in Sources */, 712AB44D1A9E692400556DA2 /* APCMotionHistoryData.m in Sources */, 36AAB3501A9A75BB00FAC255 /* APCMedTrackerPrescription.m in Sources */, 36257FBE1AA714B60060B95A /* CMMotionActivity+Helper.m in Sources */, @@ -3567,6 +3686,7 @@ 5B827B611A81CAE200C685A3 /* APCDashboardTableViewCell.m in Sources */, F5B947EE1A73272C0034C522 /* APCParameters+Settings.m in Sources */, 3650C65C1AA29BB50075C935 /* APCCatastrophicErrorViewController.m in Sources */, + 6CAF4D4C1B112BBC00D9C340 /* APCActivitiesDateState.m in Sources */, 36AAB3551A9A760D00FAC255 /* APCMedTrackerPrescriptionColor.m in Sources */, F5F12AB81A2F78490015982C /* APCTermsAndConditionsViewController.m in Sources */, F5B9462C1A7309A20034C522 /* ZZConstants.m in Sources */, @@ -3579,6 +3699,7 @@ F5B947EC1A73272C0034C522 /* APCDebugWindow.m in Sources */, 7BBC9BCC1ACF416700E022DB /* APCDataCollector.m in Sources */, F5B947C41A73272C0034C522 /* NSError+APCAdditions.m in Sources */, + 36A4BBDB1B0018870035F4B7 /* APCTaskGroupCacheEntry.m in Sources */, CFFDEDE11A95734000B25581 /* APCMedicationFrequencyViewController.m in Sources */, F5B947CA1A73272C0034C522 /* NSString+Helper.m in Sources */, 369E28111A96B7A200D35DFA /* APCMedTrackerPossibleDosage+Helper.m in Sources */, @@ -3596,6 +3717,7 @@ F5B946331A7309A20034C522 /* ZZDeflateOutputStream.m in Sources */, F5F12AED1A2F78490015982C /* APCDashboardMessageTableViewCell.m in Sources */, F5F12AE31A2F78490015982C /* APCTextFieldTableViewCell.m in Sources */, + 363BCA2B1AEC074D00B10A7F /* SBBSchedule+APCHelper.m in Sources */, F5B947CE1A73272C0034C522 /* SBBGuidCreatedOnVersionHolder+APCAdditions.m in Sources */, 369E27FF1A96B7A200D35DFA /* APCMedTrackerDailyDosageRecord+Helper.m in Sources */, 369E27F41A96B7A200D35DFA /* APCMedicationLozenge.m in Sources */, @@ -3611,8 +3733,10 @@ F5F12B051A2F78490015982C /* APCPasscodeViewController.m in Sources */, F5B947E81A73272C0034C522 /* APCSegmentedButton.m in Sources */, F5B946391A7309A20034C522 /* ZZFileChannelOutput.m in Sources */, + 7B939C131B0FEF6300D252A4 /* APCKeychainStore+Passcode.m in Sources */, 369E27F21A96B7A200D35DFA /* APCMedicationDosageTaken.m in Sources */, F5B947E01A73272C0034C522 /* APCConstants.m in Sources */, + 36C1A6291B0467F000E15BC5 /* APCTask.m in Sources */, F5F12B071A2F78490015982C /* APCUserInfoViewController.m in Sources */, F5B947B41A73272C0034C522 /* APCAssertionHandler.m in Sources */, F5F12A011A2F78490015982C /* APCScheduledTask+AddOn.m in Sources */, @@ -3627,23 +3751,24 @@ F5B947B21A73272C0034C522 /* UIFont+APCAppearance.m in Sources */, CFFDED811A95731F00B25581 /* UIColor+MedicationTracker.m in Sources */, 7B6C8CBE1AA26ECE0007B560 /* APCConsentTask.m in Sources */, + 36175FB71B1532100011108F /* APCDataMigrationMetadata_Model4ToModel6.m in Sources */, F5F12AE91A2F78490015982C /* APCDashboardEditTableViewCell.m in Sources */, F5B947B01A73272C0034C522 /* UIColor+APCAppearance.m in Sources */, F5B947F31A73272C0034C522 /* APCParametersCell.m in Sources */, - 74423B531AD981F8008AC7B3 /* APCCMS_NoEncryption_JustAStub.m in Sources */, F5F129F11A2F78490015982C /* APCDBStatus.m in Sources */, CF64CF2D1AE860CC000795B5 /* APCDemographicUploader.m in Sources */, F5B947E61A73272C0034C522 /* APCKeychainStore.m in Sources */, F5F129F71A2F78490015982C /* APCResult+Bridge.m in Sources */, 36B7D2561A8D848D0043F968 /* ORKAnswerFormat+Helper.m in Sources */, 08970F131A8D407600EA46C3 /* APCFoodInsight.m in Sources */, - EE028FE41AF94B36001C8251 /* APCKeychainStore+Passcode.m in Sources */, 712AB44F1A9E692400556DA2 /* APCMotionHistoryReporter.m in Sources */, + 36C1A62D1B0467F100E15BC5 /* APCSchedule.m in Sources */, F5B947B61A73272C0034C522 /* APCDeviceHardware+APCHelper.m in Sources */, + 36B9101B1B1510A400EE37D9 /* APCScheduleDebugPrinter.m in Sources */, 369E280D1A96B7A200D35DFA /* APCMedTrackerPrescription+Helper.m in Sources */, F5B947BC1A73272C0034C522 /* NSBundle+Helper.m in Sources */, 5BD6EBBA1A9C77D900C3BFB0 /* APCDiscreteGraphView.m in Sources */, - F5F12A031A2F78490015982C /* APCScheduledTask.m in Sources */, + 366F5A2F1AE5C42900E1D28F /* APCTaskGroup.m in Sources */, F5B948131A73272C0034C522 /* APCScheduler.m in Sources */, 3654318E1A9A7BC200D66D97 /* APCMedTrackerInflatableItem.m in Sources */, CFFDEDEA1A95734000B25581 /* APCLozengeButton.m in Sources */, @@ -3657,6 +3782,7 @@ F5B948031A73272C0034C522 /* APCListSelector.m in Sources */, F5F12AF91A2F78490015982C /* APCGenericSurveyTaskViewController.m in Sources */, 5B09ED201ABC1BEF003C5061 /* APCLicenseInfoViewController.m in Sources */, + 369DD5591AC0EBBE00327729 /* APCCMS_UsingOpenSSL.m in Sources */, F5B947BA1A73272C0034C522 /* HKHealthStore+APCExtensions.m in Sources */, F5F12A7C1A2F78490015982C /* APCCircleView.m in Sources */, F5F12A8C1A2F78490015982C /* APCIntroVideoViewController.m in Sources */, @@ -3684,12 +3810,14 @@ 7B6C8CBA1AA26ECE0007B560 /* APCConsentInstructionQuestion.m in Sources */, F5B947F71A73272C0034C522 /* APCParametersDashboardTableViewController.m in Sources */, F5F12AAF1A2F78490015982C /* APCSignUpInfoViewController.m in Sources */, + 7B939C171B0FEF9C00D252A4 /* CLLocation+APCAdditions.m in Sources */, F5B948071A73272C0034C522 /* APCScheduleEnumerator.m in Sources */, F5F12ACF1A2F78490015982C /* APCWithdrawCompleteViewController.m in Sources */, 369E28031A96B7A200D35DFA /* APCMedTrackerDataStorageManager.m in Sources */, F5F12ACD1A2F78490015982C /* APCSettingsViewController.m in Sources */, F5B946251A7309A20034C522 /* ZZArchive.mm in Sources */, 368BAFEA1A9AD91A00F04ABB /* APCMedTrackerDailyDosageRecord.m in Sources */, + 36D8E7D81AE6FFDE00DC3456 /* APCTopLevelScheduleEnumerator.m in Sources */, F5B946301A7309A20034C522 /* ZZDataChannelOutput.m in Sources */, F5F12AA51A2F78490015982C /* APCSignInViewController.m in Sources */, F5F12ADB1A2F78490015982C /* APCPickerTableViewCell.m in Sources */, @@ -3716,6 +3844,7 @@ 36CCF3951AA457420086CD1D /* APCScheduleExpression.m in Sources */, 360C63D11A339746002EC86C /* NSDateComponentsHelperTests.m in Sources */, 36E06F1C1A33F071005D6EB0 /* APCScheduleExpressionRealLifeTests.m in Sources */, + 36879C221ACF720600C4BE91 /* APCNewScheduleTests.m in Sources */, 36CCF3911AA4573D0086CD1D /* APCScheduleExpressionTokenizer.m in Sources */, 36CCF38D1AA4573D0086CD1D /* APCPointSelector.m in Sources */, 36CCF3931AA4573D0086CD1D /* APCTimeSelectorEnumerator.m in Sources */, @@ -3727,99 +3856,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - 3624498B1A7C68D700812317 /* DebugAndSendToDataVerificationServer */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - "USE_DATA_VERIFICATION_CLIENT=1", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "$(OTHER_LDFLAGS)"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = DebugAndSendToDataVerificationServer; - }; - 3624498C1A7C68D700812317 /* DebugAndSendToDataVerificationServer */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; - INFOPLIST_FILE = "$(SRCROOT)/APCAppCore/Resources/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_CFLAGS = ( - "-Wextra", - "-Wall", - ); - OTHER_LDFLAGS = ""; - PRODUCT_NAME = APCAppCore; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = DebugAndSendToDataVerificationServer; - }; - 3624498D1A7C68D700812317 /* DebugAndSendToDataVerificationServer */ = { - isa = XCBuildConfiguration; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - "$(PROJECT_DIR)/ResearchKit", - "$(PROJECT_DIR)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = APCAppCoreTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = "$(inherited)"; - PRODUCT_NAME = APCAppCoreTests; - }; - name = DebugAndSendToDataVerificationServer; - }; F5179B3A19D09128001DCCB7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3915,7 +3951,11 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/BridgeSDK", + ); GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; INFOPLIST_FILE = "$(SRCROOT)/APCAppCore/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -3941,7 +3981,11 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/BridgeSDK", + ); INFOPLIST_FILE = "$(SRCROOT)/APCAppCore/Resources/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -4047,7 +4091,11 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/BridgeSDK", + ); GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "DEVELOPMENT=1", @@ -4094,7 +4142,6 @@ isa = XCConfigurationList; buildConfigurations = ( F5179B3A19D09128001DCCB7 /* Debug */, - 3624498B1A7C68D700812317 /* DebugAndSendToDataVerificationServer */, F58767F319E4A20E00254897 /* Development */, F5179B3B19D09128001DCCB7 /* Release */, ); @@ -4105,7 +4152,6 @@ isa = XCConfigurationList; buildConfigurations = ( F5179B3D19D09128001DCCB7 /* Debug */, - 3624498C1A7C68D700812317 /* DebugAndSendToDataVerificationServer */, F58767F419E4A20E00254897 /* Development */, F5179B3E19D09128001DCCB7 /* Release */, ); @@ -4116,7 +4162,6 @@ isa = XCConfigurationList; buildConfigurations = ( F5179B4019D09128001DCCB7 /* Debug */, - 3624498D1A7C68D700812317 /* DebugAndSendToDataVerificationServer */, F58767F519E4A20E00254897 /* Development */, F5179B4119D09128001DCCB7 /* Release */, ); @@ -4129,12 +4174,14 @@ F5F128981A2F78490015982C /* APCModel.xcdatamodeld */ = { isa = XCVersionGroup; children = ( + 36C1A6251B04653100E15BC5 /* APCModel 6.xcdatamodel */, + 3673957E1AE02E610057F158 /* APCModel 5.xcdatamodel */, 7BA5D9971AA43E96006F505F /* APCModel 4.xcdatamodel */, 36469C311AA1433700C10CA7 /* APCModel 2.xcdatamodel */, 36469C321AA1650F00C10CA7 /* APCModel 3.xcdatamodel */, F5F128991A2F78490015982C /* APCModel.xcdatamodel */, ); - currentVersion = 7BA5D9971AA43E96006F505F /* APCModel 4.xcdatamodel */; + currentVersion = 36C1A6251B04653100E15BC5 /* APCModel 6.xcdatamodel */; path = APCModel.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; diff --git a/APCAppCore/APCAppCore/APCAppCore.h b/APCAppCore/APCAppCore/APCAppCore.h index 32c919f5..eb86bc48 100644 --- a/APCAppCore/APCAppCore/APCAppCore.h +++ b/APCAppCore/APCAppCore/APCAppCore.h @@ -48,6 +48,7 @@ FOUNDATION_EXPORT const unsigned char APCAppCoreVersionString[]; #import #import #import +#import #import #import #import @@ -58,6 +59,7 @@ FOUNDATION_EXPORT const unsigned char APCAppCoreVersionString[]; #import #import #import +#import // Tasks #import @@ -73,6 +75,7 @@ FOUNDATION_EXPORT const unsigned char APCAppCoreVersionString[]; #import #import #import +#import #import #import #import "APCAppCore/ZZArchiveEntry.h" @@ -93,6 +96,7 @@ FOUNDATION_EXPORT const unsigned char APCAppCoreVersionString[]; ------------------------- */ #import #import +#import /* UI */ /* ------------------------- @@ -273,6 +277,7 @@ FOUNDATION_EXPORT const unsigned char APCAppCoreVersionString[]; ------------------------- */ #import #import +#import #import #import #import @@ -310,6 +315,8 @@ FOUNDATION_EXPORT const unsigned char APCAppCoreVersionString[]; #import #import #import +#import + /* ------------------------- Appearance ------------------------- */ @@ -321,14 +328,21 @@ FOUNDATION_EXPORT const unsigned char APCAppCoreVersionString[]; /* ------------------------- Schedule and ScheduleExpression components ------------------------- */ -#import -#import #import #import #import +#import #import +#import #import #import #import +#import +#import #import #import +#import + + + + diff --git a/APCAppCore/APCAppCore/Consent/APCConsentTask.h b/APCAppCore/APCAppCore/Consent/APCConsentTask.h index 1155f3ad..10d1ac24 100644 --- a/APCAppCore/APCAppCore/Consent/APCConsentTask.h +++ b/APCAppCore/APCAppCore/Consent/APCConsentTask.h @@ -39,9 +39,9 @@ @interface APCConsentTask : NSObject -@property (nonatomic, strong) ORKConsentDocument *consentDocument; -@property (nonatomic, strong) id redirector; -@property (nonatomic, strong) NSString *failedMessageTag; +@property (nonatomic, strong) ORKConsentDocument* consentDocument; +@property (nonatomic, strong) id redirector; +@property (nonatomic, strong) NSString* failedMessageTag; @property (nonatomic, strong, readonly) ORKConsentSharingStep *sharingStep; diff --git a/APCAppCore/APCAppCore/Consent/APCConsentTask.m b/APCAppCore/APCAppCore/Consent/APCConsentTask.m index f6987d50..cfee108e 100644 --- a/APCAppCore/APCAppCore/Consent/APCConsentTask.m +++ b/APCAppCore/APCAppCore/Consent/APCConsentTask.m @@ -348,6 +348,34 @@ - (ORKStep*)stepAfterStep:(ORKStep*)step withResult:(ORKTaskResult*)result } else if ([step.identifier isEqualToString:kSharingTag]) { + // Check for the sharing options answer and set the answer in the data model + ORKStepResult* sharingStep = [result stepResultForStepIdentifier:kSharingTag]; + if (sharingStep != nil) + { + NSArray *resultsOfSharingStep = [sharingStep results]; + + if ([resultsOfSharingStep firstObject]) + { + NSNumber* sharingAnswer = [[[resultsOfSharingStep firstObject] choiceAnswers] firstObject]; + + if (sharingAnswer != nil) + { + APCAppDelegate* delegate = (APCAppDelegate*) [UIApplication sharedApplication].delegate; + NSInteger selected = -1; + + if ([sharingAnswer integerValue] == 0) + { + selected = SBBConsentShareScopeStudy; + } + else if ([sharingAnswer integerValue] == 1) + { + selected = SBBConsentShareScopeAll; + } + + delegate.dataSubstrate.currentUser.sharedOptionSelection = [NSNumber numberWithInteger:selected]; + } + } + } nextStep = findNextStep(); } else if ([step.identifier isEqualToString:kSuccessMessageTag]) diff --git a/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.h b/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.h index 75e65b00..99d6deac 100644 --- a/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.h +++ b/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.h @@ -33,8 +33,10 @@ #import "APCDataMonitor.h" +typedef void (^APCDataMonitorResponseHandler) (NSError *error); + @interface APCDataMonitor (Bridge) -- (void) refreshFromBridgeOnCompletion: (void (^)(NSError * error)) completionBlock; -- (void) batchUploadDataToBridgeOnCompletion: (void (^)(NSError * error)) completionBlock; -- (void) uploadZipFile:(NSString*) path onCompletion: (void (^)(NSError * error)) completionBlock; +- (void) refreshFromBridgeOnCompletion: (APCDataMonitorResponseHandler) completionBlock; +- (void) batchUploadDataToBridgeOnCompletion: (APCDataMonitorResponseHandler) completionBlock; +- (void) uploadZipFile: (NSString*) path onCompletion: (APCDataMonitorResponseHandler) completionBlock; @end diff --git a/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.m b/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.m index 9b24b798..ae25e8e8 100644 --- a/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.m +++ b/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor+Bridge.m @@ -32,39 +32,54 @@ // #import "APCDataMonitor+Bridge.h" -#import "APCSchedule+Bridge.h" +// #import "APCSchedule+Bridge.h" #import "APCAppCore.h" NSString *const kFirstTimeRefreshToday = @"FirstTimeRefreshToday"; @implementation APCDataMonitor (Bridge) -- (void) refreshFromBridgeOnCompletion: (void (^)(NSError * error)) completionBlock +- (void) refreshFromBridgeOnCompletion: (APCDataMonitorResponseHandler) completionBlock { - if (self.dataSubstrate.currentUser.isConsented) { - [APCSchedule updateSchedulesOnCompletion:^(NSError *error) { - if (!error) { - [self.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeToday]; - [self.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeTomorrow]; - [APCTask refreshSurveysOnCompletion:^(NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:APCUpdateActivityNotification object:self userInfo:NULL]; - }); - if (completionBlock) { - completionBlock(error); - } - }]; + if (self.dataSubstrate.currentUser.isConsented) + { + [[APCScheduler defaultScheduler] fetchTasksAndSchedulesFromServerAndThenUseThisQueue: [NSOperationQueue mainQueue] + toDoThisWhenDone: ^(NSError *errorFromServerFetch) + { + if (errorFromServerFetch) + { + [self finishRefreshCommandPassingError: errorFromServerFetch + toCompletionBlock: completionBlock]; + } + else + { + [APCTask refreshSurveysOnCompletion: ^(NSError *errorFromRefreshingSurveys) { - } - else { - if (completionBlock) { - completionBlock(error); - } - } - }]; + [self finishRefreshCommandPassingError: errorFromRefreshingSurveys + toCompletionBlock: completionBlock]; + + }]; + } + }]; } } +- (void) finishRefreshCommandPassingError: (NSError *) error + toCompletionBlock: (APCDataMonitorResponseHandler) completionBlock +{ + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + + if (completionBlock) + { + completionBlock (error); + } + + [[NSNotificationCenter defaultCenter] postNotificationName: APCUpdateActivityNotification + object: self + userInfo: nil]; + }]; +} + - (void) batchUploadDataToBridgeOnCompletion: (void (^)(NSError * error)) completionBlock { if (self.dataSubstrate.currentUser.isConsented && !self.batchUploadingInProgress) { diff --git a/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor.m b/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor.m index 9fac5be8..82c63bc3 100644 --- a/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor.m +++ b/APCAppCore/APCAppCore/DataMonitor/APCDataMonitor.m @@ -47,7 +47,6 @@ - (instancetype)initWithDataSubstrate:(APCDataSubstrate *)dataSubstrate schedul if (self) { self.dataSubstrate = dataSubstrate; self.scheduler = scheduler; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateScheduledTasks) name:APCScheduleUpdatedNotification object:nil]; } return self; } @@ -78,20 +77,13 @@ - (void) addDidEnterBackground - (void) userConsented { [(APCAppDelegate*)[UIApplication sharedApplication].delegate setUpCollectors]; - [self.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeToday]; - [self.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeTomorrow]; + [self refreshFromBridgeOnCompletion:^(NSError *error) { APCLogError2 (error); [self batchUploadDataToBridgeOnCompletion:NULL]; }]; } -- (void) updateScheduledTasks -{ - [self.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeToday]; - [self.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeTomorrow]; -} - - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; diff --git a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.h b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.h new file mode 100644 index 00000000..619c2b80 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.h @@ -0,0 +1,40 @@ +// +// APCDataSubstrate+HealthKit.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@interface APCDataSubstrate (HealthKit) + +- (void) setUpHealthKit; + +@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.m b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.m new file mode 100644 index 00000000..3ace9096 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+HealthKit.m @@ -0,0 +1,45 @@ +// +// APCDataSubstrate+HealthKit.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCDataSubstrate+HealthKit.h" +#import + +@implementation APCDataSubstrate (HealthKit) + +- (void)setUpHealthKit +{ + + self.healthStore = [HKHealthStore isHealthDataAvailable] ? [[HKHealthStore alloc] init] : nil; +} + +@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+ResearchKit.m b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+ResearchKit.m index 5d7a5205..98674ce4 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+ResearchKit.m +++ b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate+ResearchKit.m @@ -33,7 +33,6 @@ #import "APCDataSubstrate+ResearchKit.h" #import "APCAppCore.h" - #import #import #import diff --git a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.h b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.h index dcd242fb..0d7b2fb5 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.h +++ b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.h @@ -32,6 +32,7 @@ // #import +#import #import #import #import "APCParameters.h" @@ -41,54 +42,102 @@ @interface APCDataSubstrate : NSObject -#pragma mark - Initializer + +// --------------------------------------------------------- +#pragma mark - Setup +// --------------------------------------------------------- - (instancetype)initWithPersistentStorePath:(NSString *)storePath additionalModels:(NSManagedObjectModel *)mergedModels studyIdentifier:(NSString *)studyIdentifier; +- (void) setUpCoreDataStackWithPersistentStorePath:(NSString*) storePath additionalModels: (NSManagedObjectModel*) mergedModels; + + -#pragma mark - ResearchKit Subsystem Public Properties & Passive Location Tracking +// --------------------------------------------------------- +#pragma mark - ResearchKit +// --------------------------------------------------------- @property (assign) BOOL justJoined; @property (strong, nonatomic) NSString *logDirectory; @property (nonatomic, strong) APCUser *currentUser; + +// --------------------------------------------------------- +#pragma mark - HealthKit +// --------------------------------------------------------- + +@property (nonatomic, strong) HKHealthStore *healthStore; +@property (strong, nonatomic) APCParameters *parameters; + + + +// --------------------------------------------------------- #pragma mark - CoreData +// --------------------------------------------------------- @property (nonatomic, strong) NSString *storePath; @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel; -/** Main context for use in View Controllers, Fetch Results Controllers etc. */ +/** + Main context for use in View Controllers, Fetch Results Controllers etc. + */ @property (nonatomic, strong) NSManagedObjectContext * mainContext; -/** Persistent context: Parent of main context. - * Please create a child context of persistentContext for any background processing tasks. +/** + Persistent context: Parent of main context. + Please create a child context of persistentContext for any background processing tasks. */ @property (nonatomic, strong) NSManagedObjectContext * persistentContext; - -#pragma mark - Core Data Public Methods - -- (void)loadStaticTasksAndSchedules:(NSDictionary *)jsonDictionary; - /** EXERCISE CAUTION IN CALLING THIS METHOD. */ - (void)resetCoreData; +/** + Former name for -countOfTotalRequiredTasksForToday. + Please use that method instead. -#pragma mark - Core Data Helpers - ONLY RETURNS in NSManagedObjects in mainContext - -- (NSUInteger)countOfAllScheduledTasksForToday; -- (NSUInteger)countOfCompletedScheduledTasksForToday; + This method used to run a CoreData query which counted + today's total (completed + uncompleted) tasks. The + replacement method, in contrast, simply tracks the most + recent stuff appearing on the Activities screen, which + was the point. + */ +- (NSUInteger) countOfAllScheduledTasksForToday __attribute__((deprecated("Please use -countOfTotalRequiredTasksForToday instead."))); +/** + Former name for -countOfTotalCompletedTasksForToday. + Please use that method instead. -#pragma mark - HealthKit + This method used to run a CoreData query which counted + today's completed tasks. The replacement method, in + contrast, simply tracks the most recent stuff appearing + on the Activities screen, which was the point. + */ +- (NSUInteger) countOfCompletedScheduledTasksForToday __attribute__((deprecated("Please use -countOfTotalCompletedTasksForToday instead."))); -@property (nonatomic, strong) HKHealthStore *healthStore; +/** + Tracks the total number of required tasks for "today," whenever + "today" is. This is updated by the Activities screen, or the + CoreData method called by that screen, whenever appropriate. + */ +@property (readonly) NSUInteger countOfTotalRequiredTasksForToday; +/** + Tracks the total number of completed tasks for "today," whenever + "today" is. This is updated by the Activities screen, or the + CoreData method called by that screen, whenever appropriate. + */ +@property (readonly) NSUInteger countOfTotalCompletedTasksForToday; -#pragma mark - Parameters +/** + Called by the Activities screen, or the CoreData method + called by that screen, whenever appropriate. Updates the + two -count properties on this object. + */ +- (void) updateCountOfTotalRequiredTasksForToday: (NSUInteger) countOfRequiredTasks + andTotalCompletedTasksToday: (NSUInteger) countOfCompletedTasks; -@property (strong, nonatomic) APCParameters *parameters; @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.m b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.m index 640e06e4..5e991ce2 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.m +++ b/APCAppCore/APCAppCore/DataSubstrate/APCDataSubstrate.m @@ -32,67 +32,80 @@ // #import "APCDataSubstrate.h" +#import "APCDataSubstrate+ResearchKit.h" #import "APCConstants.h" #import "APCUser.h" #import "APCAppDelegate.h" // should be replaced #import "APCLog.h" - #import "NSDate+Helper.h" #import "APCTask+AddOn.h" +#import "APCDataSubstrate+HealthKit.h" +#import "APCModel.h" #import "APCSchedule+AddOn.h" #import "APCScheduledTask+AddOn.h" #import "NSError+APCAdditions.h" static int dateCheckTimeInterval = 60; -static NSString * const kCoreDataErrorDomain = @"kAPCError_CoreData_Domain"; - -static NSInteger const kErrorCantCreateDatabase_Code = 1; -static NSString * const kErrorCantCreateDatabase_Reason = @"Unable to Create Database"; -static NSString * const kErrorCantCreateDatabase_Suggestion = (@"We were unable to create a place to " - "save your data. Please exit the app and " - "try again. If the problem reoccurs, please " - "uninstall the app and try once more."); +static NSString * const kCoreDataErrorDomain = @"kAPCError_CoreData_Domain"; -static NSInteger const kErrorCantOpenDatabase_Code = 2; -static NSString * const kErrorCantOpenDatabase_Reason = @"Unable to Open Database"; -static NSString * const kErrorCantOpenDatabase_Suggestion = (@"Unable to open your existing data file. " - "Please exit the app and try again. If the " - "problem reoccurs, please uninstall and " - "reinstall the app."); +static NSInteger const kErrorCantCreateDatabase_Code = 1; +static NSString * const kErrorCantCreateDatabase_Reason = @"Unable to Create Database"; +static NSString * const kErrorCantCreateDatabase_Suggestion = (@"We were unable to create a place to " + "save your data. Please exit the app and " + "try again. If the problem reoccurs, please " + "uninstall the app and try once more."); +static NSInteger const kErrorCantOpenDatabase_Code = 2; +static NSString * const kErrorCantOpenDatabase_Reason = @"Unable to Open Database"; +static NSString * const kErrorCantOpenDatabase_Suggestion = (@"Unable to open your existing data file. " + "Please exit the app and try again. If the " + "problem reoccurs, please uninstall and " + "reinstall the app."); +static NSString * const kAPCJSONFileKeySchedules = @"schedules"; +static NSString * const kAPCJSONFileKeyTasks = @"tasks"; -@interface APCDataSubstrate () -@property (strong, nonatomic) NSTimer *dateChangeTestTimer;//refreshes Activities if the date crosses midnight. -@property (strong, nonatomic) NSDate *tomorrowAtMidnight; +@interface APCDataSubstrate () +@property (strong, nonatomic) NSTimer *dateChangeTestTimer; +@property (strong, nonatomic) NSDate *lastKnownDate; +@property (nonatomic, assign) NSUInteger countOfTotalRequiredTasksForToday; +@property (nonatomic, assign) NSUInteger countOfTotalCompletedTasksForToday; @end @implementation APCDataSubstrate -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} -- (instancetype)initWithPersistentStorePath:(NSString *)storePath - additionalModels:(NSManagedObjectModel *)mergedModels - studyIdentifier:(NSString *)__unused studyIdentifier +// --------------------------------------------------------- +#pragma mark - Setup +// --------------------------------------------------------- + +- (instancetype) initWithPersistentStorePath: (NSString*) storePath + additionalModels: (NSManagedObjectModel *) mergedModels + studyIdentifier: (NSString *) __unused studyIdentifier { self = [super init]; - if (self) { + + if (self) + { + _dateChangeTestTimer = nil; + _lastKnownDate = [NSDate date]; + _countOfTotalCompletedTasksForToday = 0; + _countOfTotalCompletedTasksForToday = 0; + [self setUpCoreDataStackWithPersistentStorePath:storePath additionalModels:mergedModels]; [self setUpCurrentUser:self.persistentContext]; [self setUpHealthKit]; [self setupParameters]; [self setupNotifications]; } + return self; } -- (void)setUpCurrentUser:(NSManagedObjectContext *)context +- (void) setUpCurrentUser: (NSManagedObjectContext*) context { if (!_currentUser) { static dispatch_once_t onceToken; @@ -102,20 +115,46 @@ - (void)setUpCurrentUser:(NSManagedObjectContext *)context } } -- (void)setupParameters +- (void) setupParameters { self.parameters = [[APCParameters alloc] initWithFileName:@"APCParameters.json"]; [self.parameters setDelegate:self]; } -- (void)setupNotifications +- (void) setupNotifications +{ + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector (appCameToForeground:) + name: UIApplicationDidFinishLaunchingNotification + object: nil]; + + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector (appCameToForeground:) + name: UIApplicationWillEnterForegroundNotification + object: nil]; + + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector (appWentToBackground:) + name: UIApplicationDidEnterBackgroundNotification + object: nil]; +} + +- (void) parameters: (APCParameters *) __unused parameters + didFailWithError: (NSError *) error { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(instantiateTimer:) name:UIApplicationWillEnterForegroundNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(instantiateTimer:) name:UIApplicationDidFinishLaunchingNotification object:nil]; + NSAssert(error, @"parameters are not loaded"); } +- (void) dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver: self]; +} + + +// --------------------------------------------------------- #pragma mark - HealthKit +// --------------------------------------------------------- - (void)setUpHealthKit { @@ -124,16 +163,19 @@ - (void)setUpHealthKit -#pragma mark - Core Data Subsystem +// --------------------------------------------------------- +#pragma mark - CoreData +// --------------------------------------------------------- -- (void)setUpCoreDataStackWithPersistentStorePath:(NSString *)storePath additionalModels:(NSManagedObjectModel *)mergedModels +- (void) setUpCoreDataStackWithPersistentStorePath: (NSString*) storePath + additionalModels: (NSManagedObjectModel *) mergedModels { [self loadManagedObjectModel:mergedModels]; [self initializePersistentStoreCoordinator:storePath]; [self createManagedObjectContexts]; } -- (void)loadManagedObjectModel:(NSManagedObjectModel *)mergedModels +- (void) loadManagedObjectModel: (NSManagedObjectModel*) mergedModels { NSBundle *bundle = [NSBundle bundleForClass:[self class]]; @@ -147,19 +189,19 @@ - (void)loadManagedObjectModel:(NSManagedObjectModel *)mergedModels self.managedObjectModel = model; } -- (void)initializePersistentStoreCoordinator:(NSString *)storePath +- (void) initializePersistentStoreCoordinator: (NSString*) storePath { self.storePath = storePath; self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; [self setUpPersistentStore]; } -- (void)setUpPersistentStore +- (void) setUpPersistentStore { NSError *errorOpeningOrCreatingCoreDataFile = nil; - NSURL *persistentStoreUrl = [NSURL fileURLWithPath:self.storePath]; - BOOL fileAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:self.storePath]; - + NSURL *persistentStoreUrl = [NSURL fileURLWithPath: self.storePath]; + BOOL fileAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath: self.storePath]; + NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption : @(YES), NSInferMappingModelAutomaticallyOption : @(YES) }; @@ -170,10 +212,12 @@ - (void)setUpPersistentStore options: options error: & errorOpeningOrCreatingCoreDataFile]; - if (persistentStore) { + if (persistentStore) + { // Great! Everything worked. (Sound of whistling) } - else { + else + { /* In case we want to switch() on them, the list of possible CoreData errors is here: @@ -182,7 +226,8 @@ In case we want to switch() on them, the list of possible */ NSError *catastrophe = nil; - if (fileAlreadyExists) { + if (fileAlreadyExists) + { catastrophe = [NSError errorWithCode: kErrorCantOpenDatabase_Code domain: kCoreDataErrorDomain failureReason: kErrorCantOpenDatabase_Reason @@ -191,7 +236,8 @@ In case we want to switch() on them, the list of possible relatedURL: persistentStoreUrl nestedError: errorOpeningOrCreatingCoreDataFile]; } - else { + else + { catastrophe = [NSError errorWithCode: kErrorCantCreateDatabase_Code domain: kCoreDataErrorDomain failureReason: kErrorCantCreateDatabase_Reason @@ -215,9 +261,9 @@ milliseconds from now (like, thousands of actual } } -- (void)removeSqliteStore +- (void) removeSqliteStore { - NSError *localError; + NSError *localError = nil; [[NSFileManager defaultManager] removeItemAtPath:self.storePath error:&localError]; APCLogError2(localError); } @@ -233,22 +279,13 @@ - (void)createManagedObjectContexts [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChangesToMainContext:) name:NSManagedObjectContextDidSaveNotification object:self.persistentContext]; } -- (void)mergeChangesToMainContext:(NSNotification*) notification +- (void) mergeChangesToMainContext: (NSNotification*) notification { - [self.mainContext performBlock:^{ + [self.mainContext performBlock: ^{ [self.mainContext mergeChangesFromContextDidSaveNotification:notification]; }]; } - -#pragma mark - Core Data Public Methods - -- (void)loadStaticTasksAndSchedules:(NSDictionary *)jsonDictionary -{ - [APCTask createTasksFromJSON:jsonDictionary[@"tasks"] inContext:self.persistentContext]; - [APCSchedule createSchedulesFromJSON:jsonDictionary[@"schedules"] inContext:self.persistentContext]; -} - - (void)resetCoreData { //EXERCISE CAUTION IN CALLING THIS METHOD @@ -260,14 +297,12 @@ - (void)resetCoreData APCLogError2 (error); [self removeSqliteStore]; [self setUpPersistentStore]; + APCAppDelegate * appDelegate = (APCAppDelegate*)[UIApplication sharedApplication].delegate; - [appDelegate loadStaticTasksAndSchedulesIfNecessary]; + [appDelegate.scheduler loadTasksAndSchedulesFromDiskAndThenUseThisQueue: nil toDoThisWhenDone: nil]; } - -#pragma mark - Core Data Helpers - ONLY RETURNS in NSManagedObjects in mainContext - -- (NSFetchRequest*)requestForScheduledTasksDueFrom:(NSDate *)fromDate toDate:(NSDate *)toDate sortDescriptors:(NSArray *)sortDescriptors +- (NSFetchRequest*) requestForScheduledTasksDueFrom:(NSDate *)fromDate toDate:(NSDate *)toDate sortDescriptors: (NSArray*) sortDescriptors { NSFetchRequest *request = [APCScheduledTask request]; request.predicate = [NSPredicate predicateWithFormat:@"dueOn >= %@ and dueOn < %@", fromDate, toDate]; @@ -309,39 +344,133 @@ - (NSArray *)scheduledTasksForPredicate:(NSPredicate *)predicate sortDescriptors return nil; } -- (NSUInteger)countOfAllScheduledTasksForToday + + +// --------------------------------------------------------- +#pragma mark - Date-Change Test Timer +// --------------------------------------------------------- + +- (void) appCameToForeground: (NSNotification *) __unused notification +{ + APCLogDebug (@"Handling date changes (DataSubstrate): The app is back in the foreground. Restarting the date-change timer, and checking immediately for a date change."); + + [self hootAndHollerIfTheDateCrossedMidnight]; + [self startTimer]; +} + +- (void) appWentToBackground: (NSNotification *) __unused notification { - return [APCScheduledTask countOfAllScheduledTasksTodayInContext:self.mainContext]; + APCLogDebug (@"Handling date changes (DataSubstrate): The app has moved to the background. Cancelling the date-change timer."); + + [self stopTimer]; } -- (NSUInteger)countOfCompletedScheduledTasksForToday +- (void) startTimer { - return [APCScheduledTask countOfAllCompletedTasksTodayInContext:self.mainContext]; + /* + We can only stop a timer on the thread from which + we started it. Since this block of code is + very small, the main thread is fine. + */ + [[NSOperationQueue mainQueue] addOperationWithBlock: ^{ + + [self stopTimerInternal]; + + self.dateChangeTestTimer = [NSTimer scheduledTimerWithTimeInterval: dateCheckTimeInterval + target: self + selector: @selector (hootAndHollerIfTheDateCrossedMidnight) + userInfo: nil + repeats: YES]; + }]; } +- (void) stopTimer +{ + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + + [self stopTimerInternal]; -#pragma mark - Properties & Methods meant only for Categories + }]; +} -- (void)parameters:(APCParameters *)__unused parameters didFailWithError:(NSError *)error +/** + Intended to be called only from within the above + -startTimer and -stopTimer methods, above. + */ +- (void) stopTimerInternal { - NSAssert(error, @"parameters are not loaded"); + if (self.dateChangeTestTimer != nil) + { + [self.dateChangeTestTimer invalidate]; + self.dateChangeTestTimer = nil; + } } +- (void) hootAndHollerIfTheDateCrossedMidnight +{ + [[NSOperationQueue mainQueue] addOperationWithBlock: ^{ + + NSDate *now = [NSDate date]; + + /** + This calcluation handles the date moving both + forward and backward, so it handles normal + calendar-day turnovers as well as debugging + situations. + */ + if (! [now isSameDayAsDate: self.lastKnownDate]) + { + APCLogDebug (@"Handling date changes (DataSubstrate): The date has changed. Sending notification."); -#pragma mark - Date Change Test Timer + self.lastKnownDate = now; -- (void)instantiateTimer:(NSNotification *)__unused notification + [[NSNotificationCenter defaultCenter] postNotificationName: APCDayChangedNotification + object: nil]; + } + }]; +} + + + +// --------------------------------------------------------- +#pragma mark - The count of required tasks +// --------------------------------------------------------- + +/** + Called by the Activities screen, or the CoreData method + called by that screen, whenever appropriate. Updates the + two -count properties on this object, so objects that + need the count can read it without running a CoreData + query and lots of calendar math. + */ +- (void) updateCountOfTotalRequiredTasksForToday: (NSUInteger) countOfRequiredTasks + andTotalCompletedTasksToday: (NSUInteger) countOfCompletedTasks { - self.tomorrowAtMidnight = [NSDate tomorrowAtMidnight]; - self.dateChangeTestTimer = [NSTimer scheduledTimerWithTimeInterval:dateCheckTimeInterval target:self selector:@selector(didDateCrossMidnight:) userInfo:nil repeats:YES]; + self.countOfTotalRequiredTasksForToday = countOfRequiredTasks; + self.countOfTotalCompletedTasksForToday = countOfCompletedTasks; } -- (void)didDateCrossMidnight:(NSNotification *)__unused notification + + +// --------------------------------------------------------- +#pragma mark - Deprecated count methods +// --------------------------------------------------------- + +/* + These methods are deprecated. Their replacement methods, + -countOfTotalRequiredTasksForToday and + -countOfTotalCompletedTasksForToday, are more accurate + and centrally managed. + */ +- (NSUInteger) countOfAllScheduledTasksForToday { - if ([[NSDate new] compare:self.tomorrowAtMidnight] == NSOrderedDescending || [[NSDate new] compare:self.tomorrowAtMidnight] == NSOrderedSame) { - [[NSNotificationCenter defaultCenter] postNotificationName:APCDayChangedNotification object:nil]; - self.tomorrowAtMidnight = [NSDate tomorrowAtMidnight]; - } + return self.countOfTotalRequiredTasksForToday; } +- (NSUInteger) countOfCompletedScheduledTasksForToday +{ + return self.countOfTotalCompletedTasksForToday; +} + + @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.h new file mode 100644 index 00000000..545610a3 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.h @@ -0,0 +1,52 @@ +// +// APCDataMigrationMetadata_Model4ToModel6.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +/** + A tiny class we use to maintain state during a data + migration. We shove an instance of this object into the + MigrationManager's userInfo dictionary, and then retrieve + it at various points to inspect the progress of the + migration. Allows us to only do certain processes when + all the required objects have been migrated. + */ +@interface APCDataMigrationMetadata_Model4ToModel6 : NSObject + +@property (nonatomic, assign) BOOL haveMigratedUserDataYet; +@property (nonatomic, assign) BOOL haveMigratedScheduleDataYet; +@property (nonatomic, assign) BOOL haveMigratedScheduleRelationshipsYet; +@property (nonatomic, assign) BOOL haveMigratedTaskRelationshipsYet; +@property (nonatomic, assign) BOOL haveMigratedScheduledTaskRelationshipsYet; + +@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.m new file mode 100644 index 00000000..49bba333 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationMetadata_Model4ToModel6.m @@ -0,0 +1,54 @@ +// +// APCDataMigrationMetadata_Model4ToModel6.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCDataMigrationMetadata_Model4ToModel6.h" + +@implementation APCDataMigrationMetadata_Model4ToModel6 + +- (instancetype) init +{ + self = [super init]; + + if (self) + { + _haveMigratedUserDataYet = NO; + _haveMigratedScheduleDataYet = NO; + _haveMigratedScheduleRelationshipsYet = NO; + _haveMigratedTaskRelationshipsYet = NO; + _haveMigratedScheduledTaskRelationshipsYet = NO; + } + + return self; +} + +@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.h new file mode 100644 index 00000000..3b90a3c9 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.h @@ -0,0 +1,44 @@ +// +// APCDataMigrationPolicy_Model4ToModel6.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +/** + Used automatically when migrating from our database model + 4 to model 6. (Model 5 was internal, not released to the + outside world.) To see how this was installed, please + see the MODEL_MIGRATION_README.txt file. + */ +@interface APCDataMigrationPolicy_Model4ToModel6 : NSEntityMigrationPolicy + +@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.m new file mode 100644 index 00000000..8e8e037a --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDataMigrationPolicy_Model4ToModel6.m @@ -0,0 +1,545 @@ +// +// APCDataMigrationPolicy_Model4ToModel6.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCDataMigrationPolicy_Model4ToModel6.h" + +#import "APCAppDelegate.h" +#import "APCConstants.h" +#import "APCDataMigrationMetadata_Model4ToModel6.h" +#import "APCDataSubstrate.h" +#import "APCLog.h" +#import "APCSchedule+AddOn.h" +#import "APCScheduleDebugPrinter.h" +#import "APCScheduledTask+AddOn.h" +#import "APCStoredUserData.h" +#import "APCTask+AddOn.h" +#import "APCUser.h" +#import "APCUtilities.h" +#import "NSDate+Helper.h" +#import "NSManagedObject+APCHelper.h" +#import "NSError+APCAdditions.h" + + +static NSString * const kAPCTaskIdPrefixGlucoseLog = @"APHLogGlucose"; +static NSString * const kAPCDataMigrationMetadataKey = @"kAPCDataMigrationContextKey"; + +typedef enum : NSUInteger { + kAPCErrorFetchingSchedulesWithNilStartDatesCode, + kAPCErrorFetchingUsersCode, +} kAPCError; + +static NSString * const kAPCErrorDomain = @"APCDataMigrationError"; +static NSString * const kAPCErrorFetchingSchedulesWithNilStartDatesReason = @"Unable to Fetch Schedules"; +static NSString * const kAPCErrorFetchingSchedulesWithNilStartDatesSuggestion = @"Unable to fetch schedules with nil start dates during migration. You may wish to make sure the migration is happening correctly."; +static NSString * const kAPCErrorFetchingUsersReason = @"Unable to Fetch Users"; +static NSString * const kAPCErrorFetchingUsersSuggestion = @"Unable to fetch users during migration. This doesn't mean there are no users in the database; it means we can't tell. You may wish to make sure the migration is happening correctly."; + + + +@implementation APCDataMigrationPolicy_Model4ToModel6 + + + +// --------------------------------------------------------- +#pragma mark - Migration methods called from the model file +// --------------------------------------------------------- + +/* + All methods in this section are called by the migration + process, because we typed these method names and + parameters into the migration-model XML file + (APCMappingModel4ToModel6.xcmappingmodel). For details + on how to do that, see the README file + MODEL_MIGRATION_README.txt. + */ + +- (NSNumber *) generateNewScheduleSourceFromOldSchedule: (id) scheduleFromV4 +{ + NSNumber *result = [self extractScheduleSourceEnumValueFromOldSchedule: scheduleFromV4]; + + return result; +} + +/** + Takes an old Schedule object, extracts its task ID, + and converts that to a bunch of actual Tasks which we + can then relate to the matching Schedule object in + the new model. + */ +- (NSSet *) linkTasksToV6ScheduleMatchingV4Schedule: (id) scheduleFromV4 + usingMigrationManager: (NSMigrationManager *) manager +{ + NSSet *tasksWithCorrectId = nil; + NSManagedObjectContext *context = manager.destinationContext; + NSString *taskIdV4 = [self extractOriginalTaskIdFieldFromScheduleV4: scheduleFromV4]; + + if (taskIdV4.length) + { + NSString *taskIdV6 = [self generateNewTaskIdFromOldTaskId: taskIdV4]; + NSNumber *taskVersionV6 = [self generateNewTaskVersionNumberFromOldTaskId: taskIdV4]; + + NSError *errorFetchingTasks = nil; + NSFetchRequest *request = [APCTask requestWithPredicate: [NSPredicate predicateWithFormat: @"%K == %@ && %K == %@", + NSStringFromSelector (@selector (taskID)), + taskIdV6, + NSStringFromSelector (@selector (taskVersionNumber)), + taskVersionV6]]; + + NSArray *tasks = [context executeFetchRequest: request + error: & errorFetchingTasks]; + + if (! tasks) + { + // We don't really care about the error, but + // for debugging this migration process. + APCLogError2 (errorFetchingTasks); + } + else + { + tasksWithCorrectId = [NSSet setWithArray: tasks]; + } + } + + return tasksWithCorrectId; +} + +- (NSString *) generateNewTaskIdFromOldTaskId: (id) maybeTaskIdFromTaskV4 +{ + NSString *taskIdForV6 = [self extractSageStyleTaskIdFromV4TaskId: maybeTaskIdFromTaskV4]; + + /* + Only the tasks from the server had that format. + If we couldn't extract it, just use whatever we had. + */ + if (taskIdForV6 == nil) + { + taskIdForV6 = maybeTaskIdFromTaskV4; + } + + return taskIdForV6; +} + +- (NSNumber *) generateNewTaskVersionNumberFromOldTaskId: (id) maybeTaskIdFromTaskV4 +{ + // May be nil. + NSNumber *versionNumber = [self extractSageVersionNumberFromV4TaskId: maybeTaskIdFromTaskV4]; + + return versionNumber; +} + + + +// --------------------------------------------------------- +#pragma mark - Cleanup, validation, other lifecycle methods +// --------------------------------------------------------- + +/* + These are (some of) the lifecycle methods for the Policy + class. Look at the documentation for these methods for + details, as well as the discussion of CoreData's "three- + stage migration": + + https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmMigrationProcess.html + */ + +- (BOOL) endRelationshipCreationForEntityMapping: (NSEntityMapping *) mapping + manager: (NSMigrationManager *) manager + error: (NSError * __autoreleasing *) __unused error +{ + BOOL result = YES; + APCDataMigrationMetadata_Model4ToModel6 *metadata = [self metadataForManager: manager]; + + if ([mapping.name hasPrefix: NSStringFromClass ([APCStoredUserData class])]) { metadata.haveMigratedUserDataYet = YES; } + else if ([mapping.name hasPrefix: NSStringFromClass ([APCSchedule class])]) { metadata.haveMigratedScheduleDataYet = YES; } + else if ([mapping.name hasPrefix: NSStringFromClass ([APCScheduledTask class])]) { metadata.haveMigratedScheduledTaskRelationshipsYet = YES; } + else if ([mapping.name hasPrefix: NSStringFromClass ([APCTask class])]) { metadata.haveMigratedTaskRelationshipsYet = YES; } + else if ([mapping.name hasPrefix: NSStringFromClass ([APCSchedule class])]) { metadata.haveMigratedScheduleRelationshipsYet = YES; } + + if (metadata.haveMigratedUserDataYet && metadata.haveMigratedScheduleDataYet) + { + [self generateStartDatesForSchedulesWithNilStartDatesUsingManager: manager]; + } + else if (metadata.haveMigratedScheduleRelationshipsYet && + metadata.haveMigratedTaskRelationshipsYet && + metadata.haveMigratedScheduledTaskRelationshipsYet) + { + // For now, just breaking here so I can inspect the results. + [self printMigrationStatusUsingMigrationManager: manager]; + } + + return result; +} + + + +// --------------------------------------------------------- +#pragma mark - Migration methods called from the lifecyle methods +// --------------------------------------------------------- + +- (APCDataMigrationMetadata_Model4ToModel6 *) metadataForManager: (NSMigrationManager *) manager +{ + APCDataMigrationMetadata_Model4ToModel6 *metadata = manager.userInfo [kAPCDataMigrationMetadataKey]; + + if (metadata == nil) + { + metadata = [APCDataMigrationMetadata_Model4ToModel6 new]; + manager.userInfo = @{ kAPCDataMigrationMetadataKey : metadata }; + } + + return metadata; +} + +- (void) generateStartDatesForSchedulesWithNilStartDatesUsingManager: (NSMigrationManager *) manager +{ + NSManagedObjectContext *context = manager.destinationContext; + NSError *errorFetchingSchedules = nil; + + NSPredicate *nilStartDates = [NSPredicate predicateWithFormat: @"%K == %@", + NSStringFromSelector(@selector(startsOn)), + nil]; + + NSFetchRequest *requestNilStartDates = [APCSchedule requestWithPredicate: nilStartDates]; + + NSArray *schedulesWithNilStartDates = [context executeFetchRequest: requestNilStartDates + error: & errorFetchingSchedules]; + + if (! schedulesWithNilStartDates) + { + // Error. Should literally never happen if the + // rest of this migration has been progressing + // at all -- we shouldn't have gotten here. + NSError *couldntQueryForSchedulesWithNilStartDates = [NSError errorWithCode: kAPCErrorFetchingSchedulesWithNilStartDatesCode + domain: kAPCErrorDomain + failureReason: kAPCErrorFetchingSchedulesWithNilStartDatesReason + recoverySuggestion: kAPCErrorFetchingSchedulesWithNilStartDatesSuggestion + nestedError: errorFetchingSchedules]; + + APCLogError2 (couldntQueryForSchedulesWithNilStartDates); + } + else if (schedulesWithNilStartDates.count == 0) + { + // Nothing to worry about. + } + else // have schedules with nil start dates. + { + APCScheduleDebugPrinter *printer = [APCScheduleDebugPrinter new]; + NSMutableString *printout = [NSMutableString new]; + + [printer printArrayOfSchedules: schedulesWithNilStartDates + withLabel: @"\n\n During migration. About to fill these schedules with start dates" + intoMutableString: printout]; + + NSDate *consentSignatureDate = nil; + NSError *errorFetchingUsers = nil; + NSFetchRequest *requestAllUsers = [APCStoredUserData request]; + NSArray *users = [context executeFetchRequest: requestAllUsers error: & errorFetchingUsers]; + + if (! users) + { + // Error. Should literally never happen if the + // rest of this migration has been progressing + // at all -- we shouldn't have gotten here. + NSError *couldntQueryForUsers = [NSError errorWithCode: kAPCErrorFetchingUsersCode + domain: kAPCErrorDomain + failureReason: kAPCErrorFetchingUsersReason + recoverySuggestion: kAPCErrorFetchingUsersSuggestion + nestedError: errorFetchingSchedules]; + + APCLogError2 (couldntQueryForUsers); + } + else if (users.count == 0) + { + // Hm. Shouldn't happen, but we can deal with it (below). + } + else + { + // There should truly never be more than one user, as of the date + // of this migration -- that's not how our code works. + APCStoredUserData *user = users.firstObject; + consentSignatureDate = user.consentSignatureDate; + } + + if (consentSignatureDate == nil) + { + // Same logic as in -[APCUser estimatedConsentDate]: + // if we can't get the user's consent date, try a + // series of best guesses, ending with today's date. + consentSignatureDate = [APCUser proxyForConsentDate]; + + // Should truly never happen, but: + if (consentSignatureDate == nil) + { + consentSignatureDate = [NSDate date]; + } + } + + for (APCSchedule *schedule in schedulesWithNilStartDates) + { + if (schedule.startsOn == nil) + { + /* + The effectiveStartDate is startsOn + delay, + but migrated schedules don't have delays. + (We're migrating to a data model that + gives us delays.) + */ + schedule.startsOn = consentSignatureDate; + schedule.effectiveStartDate = consentSignatureDate.startOfDay; + } + else + { + /* + Should never happen. Prevented by the fetchRequest at + the top of this method. (This "else" clause serves to + ensure that we don't destroy existing start dates; + ending up here is not a problem.) + */ + } + } + + [printer printArrayOfSchedules: schedulesWithNilStartDates + withLabel: @"Here's what we did" + intoMutableString: printout]; + + APCLogDebug (@"%@", printout); + } +} + + + +// --------------------------------------------------------- +#pragma mark - Utilities +// --------------------------------------------------------- + +/* + The methods in this section are called by the + migration-mapping methods above. + */ + +- (NSString *) extractOriginalTaskIdFieldFromScheduleV4: (id) scheduleFromV4 +{ + NSString *result = nil; + + if ([scheduleFromV4 respondsToSelector: @selector (taskID)]) + { + id maybeTaskId = [scheduleFromV4 taskID]; + + if (maybeTaskId != nil && [maybeTaskId isKindOfClass: [NSString class]]) + { + result = maybeTaskId; + } + } + + return result; +} + +/** + Our old "taskID"s were a mash of the original Sage task ID, + a date, and version number if it was available. We ignore + the date, and use the task ID and version number directly. + + Compare with -extractNewVersionNumberFromMaybeOldTaskId:. + This method extracts the leading "id" part; that method + extracts the trailing version-number part. + + Here was the original method that converted the ID, date, + and version into a single string. This is what we need + to undo. + + - (NSString*) uniqueID + { + NSString * retValue; + if (self.version != nil) { + retValue = [NSString stringWithFormat:@"%@-%@-%@", self.guid, self.createdOn, self.version]; + } + else if (self.versionValue > 0) + { + retValue = [NSString stringWithFormat:@"%@-%@-%lld", self.guid, self.createdOn, self.versionValue]; + } + else + { + retValue = [NSString stringWithFormat:@"%@-%@", self.guid, self.createdOn]; + } + return retValue; + } + + This was in a category we'd written around a Sage-provided + class, SBBGuidCreatedOnVersionHolder. + */ +- (NSString *) extractSageStyleTaskIdFromV4TaskId: (id) maybeTaskIdFromTaskV4 +{ + NSString *taskIdForV6 = nil; + + if (maybeTaskIdFromTaskV4 != nil && [maybeTaskIdFromTaskV4 isKindOfClass: [NSString class]]) + { + /* + Sample Sage ID: 88e6db5b-0afa-499f-88e5-83465471be3d + + If you know a one-character replacement for "hex digits" + ([a-fA-F0-9]), please replace each of the "[a-fA-F0-9]" below + with that character. (Maybe \x? \h?) + */ + NSString *uuidRegex = (@"" + "[a-fA-F0-9]{8}\\-" // 8 hex chars + literal hyphen + "[a-fA-F0-9]{4}\\-" // 4 hex chars + literal hyphen + "[a-fA-F0-9]{4}\\-" // 4 hex chars + literal hyphen + "[a-fA-F0-9]{4}\\-" // 4 hex chars + literal hyphen + "[a-fA-F0-9]{12}"); // 12 hex chars + + NSString *taskIdFromV4 = maybeTaskIdFromTaskV4; + + NSRange uuidRange = [taskIdFromV4 rangeOfString: uuidRegex + options: NSRegularExpressionSearch | NSCaseInsensitiveSearch]; + + /* + This is part of the analysis: the task ID has to be the first part of the string. + */ + if (uuidRange.location == 0) + { + taskIdForV6 = [taskIdFromV4 substringWithRange: uuidRange]; + } + } + + return taskIdForV6; +} + +/** + See comments on -extractNewTaskIdFromMaybeOldTaskId:. + That method extracts the leading "id" part; this method + extracts the trailing version-number part. + + In practice, the version numbers were often nil, so + this method will likely often return nil. + */ +- (NSNumber *) extractSageVersionNumberFromV4TaskId: (id) maybeTaskIdFromTaskV4 +{ + NSNumber *versionNumber = nil; + + NSString *taskIdForV6 = [self extractSageStyleTaskIdFromV4TaskId: maybeTaskIdFromTaskV4]; + + if (taskIdForV6 != nil) + { + NSString *taskIdFromV4 = maybeTaskIdFromTaskV4; + NSString *stuffAfterStrippingTaskId = [taskIdFromV4 substringFromIndex: taskIdFromV4.length]; + NSString *regexForTrailingHyphenAndInteger = @"\\-\\d+$"; + NSRange versionNumberRange = [stuffAfterStrippingTaskId rangeOfString: regexForTrailingHyphenAndInteger + options: NSRegularExpressionSearch]; + + if (versionNumberRange.location != NSNotFound) + { + NSString *hyphenAndInteger = [stuffAfterStrippingTaskId substringFromIndex: versionNumberRange.location]; + NSString *theInteger = [hyphenAndInteger substringFromIndex: @"-".length]; + NSUInteger versionValue = theInteger.integerValue; + versionNumber = @(versionValue); + } + } + + return versionNumber; +} + +- (NSNumber *) extractScheduleSourceEnumValueFromOldSchedule: (id) scheduleFromV4 +{ + NSNumber *result = nil; + APCScheduleSource scheduleSource = APCScheduleSourceLocalDisk; + + /* TODO: Is there a way to get compiler help with this name, if the + field I'm trying to access has been physically removed from the app? */ + id maybeRemoteUpdatable = [scheduleFromV4 valueForKey: @"remoteUpdatable"]; + + if (maybeRemoteUpdatable != nil && [maybeRemoteUpdatable isKindOfClass: [NSNumber class]]) + { + NSNumber *remoteUpdatable = maybeRemoteUpdatable; + BOOL isRemoteUpdatable = remoteUpdatable.boolValue; + scheduleSource = isRemoteUpdatable ? APCScheduleSourceServer : APCScheduleSourceLocalDisk; + } + else + { + scheduleSource = APCScheduleSourceLocalDisk; + } + + /* + If this is the singleton schedule managing the Glucose + Log, set its Source to GlucoseLog. + */ + NSString *taskId = [self extractOriginalTaskIdFieldFromScheduleV4: scheduleFromV4]; + + if (taskId != nil && [taskId hasPrefix: kAPCTaskIdPrefixGlucoseLog]) + { + scheduleSource = APCScheduleSourceGlucoseLog; + } + + result = @(scheduleSource); + return result; +} + +- (void) printMigrationStatusUsingMigrationManager: (NSMigrationManager *) manager +{ + NSManagedObjectContext *context = manager.destinationContext; + + NSArray *schedules = [context executeFetchRequest: [APCSchedule request] error: nil]; + NSArray *tasks = [context executeFetchRequest: [APCTask request] error: nil]; + NSArray *completedItems = [context executeFetchRequest: [APCScheduledTask request] error: nil]; + + NSMutableString *printout = [NSMutableString stringWithFormat: + @"\n\n========= Current state of the world: ==========\n\n" + "-------------- Schedules --------------\n%@\n\n" + "-------------- Tasks --------------\n%@\n\n" + "-------------- Completed ScheduledTasks --------------\n%@", + schedules, + tasks, + completedItems]; + + [printout replaceOccurrencesOfString: @"\\n" withString: @"\n" options: 0 range: NSMakeRange (0, printout.length)]; + [printout replaceOccurrencesOfString: @"\\\"" withString: @"\"" options: 0 range: NSMakeRange (0, printout.length)]; + + APCLogDebug (@"%@", printout); + APCLogDebug (@""); // someplace to put a breakpoint +} + + +@end + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCDateRange.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDateRange.m index 0caeabce..c06fccb1 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCDateRange.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCDateRange.m @@ -52,9 +52,15 @@ - (instancetype) initWithStartDate: (NSDate*) startDate endDate: (NSDate*) endDa - (instancetype) initWithStartDate:(NSDate *)startDate durationString: (NSString*) durationString { NSParameterAssert(startDate); - NSParameterAssert(durationString); + + NSTimeInterval delta = 0; + + if (durationString.length > 0) + { + delta = [NSDate timeIntervalByAddingISO8601Duration: durationString + toDate: startDate]; + } - NSTimeInterval delta = [NSDate parseISO8601DurationString: durationString]; self = [self initWithStartDate:startDate durationInterval:delta]; return self; } diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCMappingModel4ToModel6.xcmappingmodel/xcmapping.xml b/APCAppCore/APCAppCore/DataSubstrate/Model/APCMappingModel4ToModel6.xcmappingmodel/xcmapping.xml new file mode 100644 index 00000000..204ed162 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCMappingModel4ToModel6.xcmappingmodel/xcmapping.xml @@ -0,0 +1,644 @@ + + + + + + 134481920 + 1994F3E2-3BE3-4DAD-92D3-8967EED8F7A7 + 221 + + + + NSPersistenceFrameworkVersion + 526 + NSStoreModelVersionHashes + + XDDevAttributeMapping + + 0plcXXRN7XHKl5CcF+fwriFmUpON3ZtcI/AfK748aWc= + + XDDevEntityMapping + + qeN1Ym3TkWN1G6dU9RfX6Kd2ccEvcDVWHpd3LpLgboI= + + XDDevMappingModel + + EqtMzvRnVZWkXwBHu4VeVGy8UyoOe+bi67KC79kphlQ= + + XDDevPropertyMapping + + XN33V44TTGY4JETlMoOB5yyTKxB+u4slvDIinv0rtGA= + + XDDevRelationshipMapping + + akYY9LhehVA/mCb4ATLWuI9XGLcjpm14wWL1oEBtIcs= + + + NSStoreModelVersionHashesVersion + 3 + NSStoreModelVersionIdentifiers + + + + + + + + + effectiveStartDate + + + + taskID + + + + numberOfDosesTakenForThisDate + + + + bloodType + + + + effectiveEndDate + + + + name + + + + taskIsOptional + + + + 1 + dosage + + + + YnBsaXN0MDDUAQIDBAUGXV5YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK8Q +FgcIExQZGiIoLS4zODk8PUFGR0xQVlhVJG51bGzVCQoLDA0ODxAREllOU09wZXJhbmReTlNTZWxlY3Rvck5hbWVfEBBOU0V4cHJlc3Npb25UeXBlW05TQXJndW1lbnRzViRjbGFzc4ADgAIQBIAGgBVfEDpkZXN0aW5hdGlvbkluc3RhbmNlc0ZvckVudGl0eU1hcHBpbmdOYW1lZDpzb3VyY2VJbnN0YW5jZXM60xULDRYXGFpOU1ZhcmlhYmxlgAQQAoAFV21hbmFnZXLSGxwdHlokY2xhc3NuYW1lWCRjbGFzc2VzXxAUTlNWYXJpYWJsZUV4cHJlc3Npb26jHyAhXxAUTlNWYXJpYWJsZUV4cHJlc3Npb25cTlNFeHByZXNzaW9uWE5TT2JqZWN00iMNJCdaTlMub2JqZWN0c6IlJoAHgAqAFNMpCw0qKyxfEA9OU0NvbnN0YW50VmFsdWWACBAAgAlfECJBUENTY2hlZHVsZWRUYXNrVG9BUENTY2hlZHVsZWRUYXNr0hscLzBfEBlOU0NvbnN0YW50VmFsdWVFeHByZXNzaW9uozEyIV8QGU5TQ29uc3RhbnRWYWx1ZUV4cHJlc3Npb25cTlNFeHByZXNzaW9u1QkKCwwNNDUQNjeADIALgA6AE18QEHZhbHVlRm9yS2V5UGF0aDrTFQsNOhcYgA2ABVZzb3VyY2XSIw0+QKE/gA+AEtMNC0JDREVZTlNLZXlQYXRogBEQCoAQXxAVc2NoZWR1bGVkVGFza3NfdW51c2Vk0hscSElfEBxOU0tleVBhdGhTcGVjaWZpZXJFeHByZXNzaW9uo0pLIV8QHE5TS2V5UGF0aFNwZWNpZmllckV4cHJlc3Npb25cTlNFeHByZXNzaW9u0hscTU5eTlNNdXRhYmxlQXJyYXmjTU8hV05TQXJyYXnSGxxRUl8QE05TS2V5UGF0aEV4cHJlc3Npb26kU1RVIV8QE05TS2V5UGF0aEV4cHJlc3Npb25fEBROU0Z1bmN0aW9uRXhwcmVzc2lvblxOU0V4cHJlc3Npb27SGxxPV6JPIdIbHFlaXxAUTlNGdW5jdGlvbkV4cHJlc3Npb26jW1whXxAUTlNGdW5jdGlvbkV4cHJlc3Npb25cTlNFeHByZXNzaW9uXxAPTlNLZXllZEFyY2hpdmVy0V9gVHJvb3SAAQAIABEAGgAjAC0AMgA3AFAAVgBhAGsAegCNAJkAoACiAKQApgCoAKoA5wDuAPkA+wD9AP8BBwEMARcBIAE3ATsBUgFfAWgBbQF4AXsBfQF/AYEBiAGaAZwBngGgAcUBygHmAeoCBgITAh4CIAIiAiQCJgI5AkACQgJEAksCUAJSAlQCVgJdAmcCaQJrAm0ChQKKAqkCrQLMAtkC3gLtAvEC+QL+AxQDGQMvA0YDUwNYA1sDYAN3A3sDkgOfA7EDtAO5AAAAAAAAAgEAAAAAAAAAYQAAAAAAAAAAAAAAAAAAA7s= + + 1 + scheduledTasks + + + + 1 + schedules + + + + reminderMessage + + + + homeLocationAddress + + + + 1 + prescriptionIAmBasedOn + + + + completed == YES + APCScheduledTask + Undefined + 1 + APCScheduledTask + 1 + + + + + + alphaAsFloat + + + + 1 + generatedSchedule + + + + timesOfDay + + + + updatedAt + + + + scheduleType + + + + APCDBStatus + Undefined + 5 + APCDBStatus + 1 + + + + + + createdAt + + + + dateThisRecordRepresents + + + + completed + + + + YnBsaXN0MDDUAQIDBAUGMzRYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKsH +CBMUGRoiJyorLlUkbnVsbNUJCgsMDQ4PEBESWU5TT3BlcmFuZF5OU1NlbGVjdG9yTmFtZV8QEE5TRXhwcmVzc2lvblR5cGVbTlNBcmd1bWVudHNWJGNsYXNzgAOAAhAEgAaACl8QKWdlbmVyYXRlTmV3U2NoZWR1bGVTb3VyY2VGcm9tT2xkU2NoZWR1bGU60xULDRYXGFpOU1ZhcmlhYmxlgAQQAoAFXGVudGl0eVBvbGljedIbHB0eWiRjbGFzc25hbWVYJGNsYXNzZXNfEBROU1ZhcmlhYmxlRXhwcmVzc2lvbqMfICFfEBROU1ZhcmlhYmxlRXhwcmVzc2lvblxOU0V4cHJlc3Npb25YTlNPYmplY3TSIw0kJlpOUy5vYmplY3RzoSWAB4AJ0xULDSgXGIAIgAVWc291cmNl0hscLC1XTlNBcnJheaIsIdIbHC8wXxAUTlNGdW5jdGlvbkV4cHJlc3Npb26jMTIhXxAUTlNGdW5jdGlvbkV4cHJlc3Npb25cTlNFeHByZXNzaW9uXxAPTlNLZXllZEFyY2hpdmVy0TU2VHJvb3SAAQAIABEAGgAjAC0AMgA3AEMASQBUAF4AbQCAAIwAkwCVAJcAmQCbAJ0AyQDQANsA3QDfAOEA7gDzAP4BBwEeASIBOQFGAU8BVAFfAWEBYwFlAWwBbgFwAXcBfAGEAYcBjAGjAacBvgHLAd0B4AHlAAAAAAAAAgEAAAAAAAAANwAAAAAAAAAAAAAAAAAAAec= + + scheduleSource + + + + consentSignatureImage + + + + YnBsaXN0MDDUAQIDBAUGPD1YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKwH +CBMUGRoiJywtMjZVJG51bGzVCQoLDA0ODxAREllOU09wZXJhbmReTlNTZWxlY3Rvck5hbWVfEBBOU0V4cHJlc3Npb25UeXBlW05TQXJndW1lbnRzViRjbGFzc4ADgAIQBIAGgAtfEBB2YWx1ZUZvcktleVBhdGg60xULDRYXGFpOU1ZhcmlhYmxlgAQQAoAFVnNvdXJjZdIbHB0eWiRjbGFzc25hbWVYJGNsYXNzZXNfEBROU1ZhcmlhYmxlRXhwcmVzc2lvbqMfICFfEBROU1ZhcmlhYmxlRXhwcmVzc2lvblxOU0V4cHJlc3Npb25YTlNPYmplY3TSIw0kJlpOUy5vYmplY3RzoSWAB4AK0w0LKCkqK1lOU0tleVBhdGiACRAKgAhYc3RhcnRzT27SGxwuL18QHE5TS2V5UGF0aFNwZWNpZmllckV4cHJlc3Npb26jMDEhXxAcTlNLZXlQYXRoU3BlY2lmaWVyRXhwcmVzc2lvblxOU0V4cHJlc3Npb27SGxwzNF5OU011dGFibGVBcnJheaMzNSFXTlNBcnJhedIbHDc4XxATTlNLZXlQYXRoRXhwcmVzc2lvbqQ5OjshXxATTlNLZXlQYXRoRXhwcmVzc2lvbl8QFE5TRnVuY3Rpb25FeHByZXNzaW9uXE5TRXhwcmVzc2lvbl8QD05TS2V5ZWRBcmNoaXZlctE+P1Ryb290gAEACAARABoAIwAtADIANwBEAEoAVQBfAG4AgQCNAJQAlgCYAJoAnACeALEAuADDAMUAxwDJANAA1QDgAOkBAAEEARsBKAExATYBQQFDAUUBRwFOAVgBWgFcAV4BZwFsAYsBjwGuAbsBwAHPAdMB2wHgAfYB+wIRAigCNQJHAkoCTwAAAAAAAAIBAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAJR + + startsOn + + + + startOn + + + + APCDataMigrationPolicy_Model4ToModel6 + APCStoredUserData + Undefined + 10 + APCStoredUserData + 1 + + + + + + APCMedTrackerPrescription + Undefined + 11 + APCMedTrackerPrescription + 1 + + + + + + didStopUsingOnDoctorsOrders + + + + profileImage + + + + taskDescription + + + + archiveFilename + + + + customSurveyQuestion + + + + createdAt + + + + taskCompletion + + + + taskContentFileName + + + + medicalConditions + + + + 1 + scheduledTask + + + + taskTitle + + + + shouldRemind + + + + redAsInteger + + + + consentSignatureDate + + + + notes + + + + hasHeartDisease + + + + dateStoppedUsing + + + + sharedOptionSelection + + + + createdAt + + + + medications + + + + interval + + + + APCMedTrackerPossibleDosage + Undefined + 2 + APCMedTrackerPossibleDosage + 1 + + + + + + 1 + prescriptionsWhereIAmUsed + + + + scheduleString + + + + updatedAt + + + + 1 + prescriptionsWhereIAmUsed + + + + uid + + + + secondaryInfoSaved + + + + resultSummary + + + + YnBsaXN0MDDUAQIDBAUGUVJYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK8Q +EwcIExQZGiInLC0wMTU6O0BESkxVJG51bGzVCQoLDA0ODxAREllOU09wZXJhbmReTlNTZWxlY3Rvck5hbWVfEBBOU0V4cHJlc3Npb25UeXBlW05TQXJndW1lbnRzViRjbGFzc4ADgAIQBIAGgBJfECpnZW5lcmF0ZU5ld1Rhc2tWZXJzaW9uTnVtYmVyRnJvbU9sZFRhc2tJZDrTFQsNFhcYWk5TVmFyaWFibGWABBACgAVcZW50aXR5UG9saWN50hscHR5aJGNsYXNzbmFtZVgkY2xhc3Nlc18QFE5TVmFyaWFibGVFeHByZXNzaW9uox8gIV8QFE5TVmFyaWFibGVFeHByZXNzaW9uXE5TRXhwcmVzc2lvblhOU09iamVjdNIjDSQmWk5TLm9iamVjdHOhJYAHgBHVCQoLDA0oKRAqK4AJgAiAC4AQXxAQdmFsdWVGb3JLZXlQYXRoOtMVCw0uFxiACoAFVnNvdXJjZdIjDTI0oTOADIAP0w0LNjc4OVlOU0tleVBhdGiADhAKgA1WdGFza0lE0hscPD1fEBxOU0tleVBhdGhTcGVjaWZpZXJFeHByZXNzaW9uoz4/IV8QHE5TS2V5UGF0aFNwZWNpZmllckV4cHJlc3Npb25cTlNFeHByZXNzaW9u0hscQUJeTlNNdXRhYmxlQXJyYXmjQUMhV05TQXJyYXnSGxxFRl8QE05TS2V5UGF0aEV4cHJlc3Npb26kR0hJIV8QE05TS2V5UGF0aEV4cHJlc3Npb25fEBROU0Z1bmN0aW9uRXhwcmVzc2lvblxOU0V4cHJlc3Npb27SGxxDS6JDIdIbHE1OXxAUTlNGdW5jdGlvbkV4cHJlc3Npb26jT1AhXxAUTlNGdW5jdGlvbkV4cHJlc3Npb25cTlNFeHByZXNzaW9uXxAPTlNLZXllZEFyY2hpdmVy0VNUVHJvb3SAAQAIABEAGgAjAC0AMgA3AE0AUwBeAGgAdwCKAJYAnQCfAKEAowClAKcA1ADbAOYA6ADqAOwA+QD+AQkBEgEpAS0BRAFRAVoBXwFqAWwBbgFwAXsBfQF/AYEBgwGWAZ0BnwGhAagBrQGvAbEBswG6AcQBxgHIAcoB0QHWAfUB+QIYAiUCKgI5Aj0CRQJKAmACZQJ7ApICnwKkAqcCrALDAscC3gLrAv0DAAMFAAAAAAAAAgEAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAwc= + + taskVersionNumber + + + + 1 + task + + + + name + + + + APCResult + Undefined + 3 + APCResult + 1 + + + + + + endsOn + + + + dateStartedUsing + + + + name + + + + createdAt + + + + uploaded + + + + birthDate + + + + 1 + medication + + + + homeLocationLat + + + + greenAsInteger + + + + APCDataMigrationPolicy_Model4ToModel6 + APCSchedule + Undefined + 7 + APCSchedule + 1 + + + + + + blueAsInteger + + + + YnBsaXN0MDDUAQIDBAUGODlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK0H +CBMUGRoiKCssLzAzVSRudWxs1QkKCwwNDg8QERJZTlNPcGVyYW5kXk5TU2VsZWN0b3JOYW1lXxAQTlNFeHByZXNzaW9uVHlwZVtOU0FyZ3VtZW50c1YkY2xhc3OAA4ACEASABoAMXxA+bGlua1Rhc2tzVG9WNlNjaGVkdWxlTWF0Y2hpbmdWNFNjaGVkdWxlOnVzaW5nTWlncmF0aW9uTWFuYWdlcjrTFQsNFhcYWk5TVmFyaWFibGWABBACgAVcZW50aXR5UG9saWN50hscHR5aJGNsYXNzbmFtZVgkY2xhc3Nlc18QFE5TVmFyaWFibGVFeHByZXNzaW9uox8gIV8QFE5TVmFyaWFibGVFeHByZXNzaW9uXE5TRXhwcmVzc2lvblhOU09iamVjdNIjDSQnWk5TLm9iamVjdHOiJSaAB4AJgAvTFQsNKRcYgAiABVZzb3VyY2XTFQsNLRcYgAqABVdtYW5hZ2Vy0hscMTJXTlNBcnJheaIxIdIbHDQ1XxAUTlNGdW5jdGlvbkV4cHJlc3Npb26jNjchXxAUTlNGdW5jdGlvbkV4cHJlc3Npb25cTlNFeHByZXNzaW9uXxAPTlNLZXllZEFyY2hpdmVy0To7VHJvb3SAAQAIABEAGgAjAC0AMgA3AEUASwBWAGAAbwCCAI4AlQCXAJkAmwCdAJ8A4ADnAPIA9AD2APgBBQEKARUBHgE1ATkBUAFdAWYBawF2AXkBewF9AX8BhgGIAYoBkQGYAZoBnAGkAakBsQG0AbkB0AHUAesB+AIKAg0CEgAAAAAAAAIBAAAAAAAAADwAAAAAAAAAAAAAAAAAAAIU + + 1 + tasks + + + + YnBsaXN0MDDUAQIDBAUGUVJYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoK8Q +EwcIExQZGiInLC0wMTU6O0BESkxVJG51bGzVCQoLDA0ODxAREllOU09wZXJhbmReTlNTZWxlY3Rvck5hbWVfEBBOU0V4cHJlc3Npb25UeXBlW05TQXJndW1lbnRzViRjbGFzc4ADgAIQBIAGgBJfEB9nZW5lcmF0ZU5ld1Rhc2tJZEZyb21PbGRUYXNrSWQ60xULDRYXGFpOU1ZhcmlhYmxlgAQQAoAFXGVudGl0eVBvbGljedIbHB0eWiRjbGFzc25hbWVYJGNsYXNzZXNfEBROU1ZhcmlhYmxlRXhwcmVzc2lvbqMfICFfEBROU1ZhcmlhYmxlRXhwcmVzc2lvblxOU0V4cHJlc3Npb25YTlNPYmplY3TSIw0kJlpOUy5vYmplY3RzoSWAB4AR1QkKCwwNKCkQKiuACYAIgAuAEF8QEHZhbHVlRm9yS2V5UGF0aDrTFQsNLhcYgAqABVZzb3VyY2XSIw0yNKEzgAyAD9MNCzY3ODlZTlNLZXlQYXRogA4QCoANVnRhc2tJRNIbHDw9XxAcTlNLZXlQYXRoU3BlY2lmaWVyRXhwcmVzc2lvbqM+PyFfEBxOU0tleVBhdGhTcGVjaWZpZXJFeHByZXNzaW9uXE5TRXhwcmVzc2lvbtIbHEFCXk5TTXV0YWJsZUFycmF5o0FDIVdOU0FycmF50hscRUZfEBNOU0tleVBhdGhFeHByZXNzaW9upEdISSFfEBNOU0tleVBhdGhFeHByZXNzaW9uXxAUTlNGdW5jdGlvbkV4cHJlc3Npb25cTlNFeHByZXNzaW9u0hscQ0uiQyHSGxxNTl8QFE5TRnVuY3Rpb25FeHByZXNzaW9uo09QIV8QFE5TRnVuY3Rpb25FeHByZXNzaW9uXE5TRXhwcmVzc2lvbl8QD05TS2V5ZWRBcmNoaXZlctFTVFRyb290gAEACAARABoAIwAtADIANwBNAFMAXgBoAHcAigCWAJ0AnwChAKMApQCnAMkA0ADbAN0A3wDhAO4A8wD+AQcBHgEiATkBRgFPAVQBXwFhAWMBZQFwAXIBdAF2AXgBiwGSAZQBlgGdAaIBpAGmAagBrwG5AbsBvQG/AcYBywHqAe4CDQIaAh8CLgIyAjoCPwJVAloCcAKHApQCmQKcAqECuAK8AtMC4ALyAvUC+gAAAAAAAAIBAAAAAAAAAFUAAAAAAAAAAAAAAAAAAAL8 + + taskID + + + + name + + + + 1 + scheduledTasks + + + + endOn + + + + updatedAt + + + + endDate + + + + APCMedTrackerInflatableItem + Undefined + 8 + APCMedTrackerInflatableItem + 1 + + + + + + metaData + + + + taskCompletionTimeString + + + + delay + + + + allowContact + + + + numberOfTimesPerDay + + + + homeLocationLong + + + + reminderOffset + + + + expires + + + + amount + + + + startDate + + + + ethnicity + + + + zeroBasedDaysOfTheWeek + + + + 1 + actualDosesTaken + + + + dailyScalesCompletionCounter + + + + naturalSortOrder + + + + 1 + prescriptionsWhereIAmUsed + + + + status + + + + APCMedTrackerPrescriptionColor + Undefined + 9 + APCMedTrackerPrescriptionColor + 1 + + + + + + updatedAt + + + + inActive + + + + APCDataMigrationPolicy_Model4ToModel6 + APCTask + Undefined + 6 + APCTask + 1 + + + + + + consentSignatureName + + + + sleepTime + + + + maxCount + + + + serverConsented + + + + sortString + + + + glucoseLevels + + + + biologicalSex + + + + APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 4.xcdatamodel + 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pWXhZh1mWWaVZtFnDWdhZ2VnhWe1aAVoQWh9aLloyWkFaUFpfWm5afVqJWptaqlq5Wsha11rmWvVbBFsHWxZbJVs0WzhbUltTW1lbZVt5W4hbi1uaW6lbuFu7W8pb2VvdW+xb+1v8XDRcNVw2XDdcOFw5XDpcO1w8XD1cPlw/XEBcQVxCXENcRFxFXEZcR1xIXElcSlxLXExcTVxOXGNcZFxsXHhcjFybXKpcuVy9XMxc21zqXPldCF0UXSZdNV1EXVNdYl1xXYBdj12kXaVdrV25Xc1d3F3rXfpd/l4NXhxeK146XkleVV5nXnZehV6UXqNesl7BXtBe5V7mXu5e+l8OXx1fLF87Xz9fTl9dX2xfe1+KX5ZfqF+3X8Zf1V/kX/NgAmARYCZgJ2AvYDtgT2BeYG1gfGCAYI9gnmCtYLxgy2DXYOlg+GEHYRZhJWE0YUNhUmFnYWhhcGF8YZBhn2GuYb1hwWHQYd9h7mH9YgxiGGIqYjliSGJXYmZidWKEYpNiqGKpYrFivWLRYuBi72L+YwJjEWMgYy9jPmNNY1lja2N6Y4ljmGOnY7ZjxWPUY+lj6mPyY/5kEmQhZDBkP2RDZFJkYWRwZH9kjmSaZKxku2TKZNlk6GTpZPhlB2UWZStlLGU0ZUBlVGVjZXJlgWWFZZRlo2WyZcFl0GXcZe5l/WYMZhtmKmY5ZkhmV2ZsZm1mdWaBZpVmpGazZsJmxmbVZuRm82cCZxFnHWcvZz5nTWdcZ2tnemeJZ5hnrWeuZ7ZnwmfWZ+Vn9GgDaAdoFmglaDRoQ2hSaF5ocGh/aI5onWisaLtoymjZaO5o72j3aQNpF2kmaTVpRGlIaVdpZml1aYRpk2mfabFpwGnPad5p7Wn8agtqGmovajBqOGpEalhqZ2p2aoVqiWqYaqdqtmrFatRq4GryawFrEGsfay5rPWtMa1trcGtxa3lrhWuZa6hrt2vGa8pr2Wvoa/dsBmwVbCFsM2xCbFFsYGxvbH5sjWycbLFssmy6bMZs2mzpbPhtB20LbRptKW04bUdtVm1ibXRtg22SbaFtsG2/bc5t3W3ybfNt+24HbhtuKm45bkhuTG5bbmpueW6Ibpduo261bsRu027ibvFvAG8Pbx5vM280bzxvSG9cb2tvem+Jb41vnG+rb7pvyW/Yb+Rv9nAFcBRwI3AycEFwUHBfcHRwdXB9cIlwnXCscLtwynDOcN1w7HD7cQpxGXElcTdxRnFVcWRxc3GCcZFxoHG1cbZxvnHKcd5x7XH8cgtyD3Ieci1yPHJLclpyZnJ4codylnKlcrRyw3LScuFy9nL3cv9zC3Mfcy5zPXNMc1BzX3Nuc31zjHObc6dzuXPIc9dz5nP1dAR0E3QidDd0OHRAdEx0YHRvdH50jXSRdKB0r3S+dM103HTodPp1CXUYdSd1NnVFdVR1Y3V4dXl1gXWNdaF1sHW/dc510nXhdfB1/3YOdh12KXY7dkp2WXZodnd2hnaVdqR2uXa6dsJ2znbidvF3AHcPdxN3Incxd0B3T3ded2p3fHeLd5p3qXe4d8d31nfld/p3+3gDeA94I3gyeEF4UHhUeGN4cniBeJB4n3ireL14zHjbeOp4+XkIeRd5Jnk7eTx5RHlQeWR5c3mCeZF5lXmkebN5wnnReeB57Hn+eg16HHorejp6SXpYemd6fHp9eoV6kXqlerR6w3rSetZ65Xr0ewN7Enshey17P3tOe117bHt7e4p7mXuoe717vnvGe9J75nv1fAR8E3wXfCZ8NXxEfFN8YnxufIB8j3yefK18vHzLfNp86XzsfQZ9B30NfRl9LX08fT99Tn1dfWx9b31+fY19kX2gfa99sH22fbd9zH3NfdV94X31fgR+E34ifiZ+NX5EflN+Yn5xfn1+j36efq1+vH7Lftp+6X74fvt+/38Dfwd/D38SfxZ/F1UkbnVsbNcACQAKAAsADAANAA4ADwAQABEAEgATABQAEwAWXxAPX3hkX3Jvb3RQYWNrYWdlViRjbGFzc1xfeGRfY29tbWVudHNfEBBfeGRfbW9kZWxNYW5hZ2VyXxAVX2NvbmZpZ3VyYXRpb25zQnlOYW1lXV94ZF9tb2RlbE5hbWVfEBdfbW9kZWxWZXJzaW9uSWRlbnRpZmllcoACgQnagQnXgACBCdiAAIEJ2d4AGAAZABoAGwAcAB0AHgAKAB8AIAAhACIAIwAkACUAJgAnACgAJQATACsALAAtAC4ALwAlACUAE18QHFhEQnVja2V0Rm9yQ2xhc3Nlc3dhc0VuY29kZWRfEBpYREJ1Y2tldEZvclBhY2thZ2Vzc3RvcmFnZV8QHFhEQnVja2V0Rm9ySW50ZXJmYWNlc3N0b3JhZ2VfEA9feGRfb3duaW5nTW9kZWxfEB1YREJ1Y2tldEZvclBhY2thZ2Vzd2FzRW5jb2RlZFZfb3duZXJfEBtYREJ1Y2tldEZvckRhdGFUeXBlc3N0b3JhZ2VbX3Zpc2liaWxpdHlfEBlYREJ1Y2tldEZvckNsYXNzZXNzdG9yYWdlVV9uYW1lXxAfWERCdWNrZXRGb3JJbnRlcmZhY2Vzd2FzRW5jb2RlZF8QHlhEQnVja2V0Rm9yRGF0YVR5cGVzd2FzRW5jb2RlZF8QEF91bmlxdWVFbGVtZW50SUSABIEJ1YEJ04ABgASAAIEJ1IEJ1hAAgAWAA4AEgASAAFBTWUVT0wA2ADcACgA4AEUAUldOUy5rZXlzWk5TLm9iamVjdHOsADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEgAaAB4AIgAmACoALgAyADYAOgA+AEIARrABGAEcASABJAEoASwBMAE0ATgBPAFAAUYASgQLsgQSVgQckgQF3gQTrgQmogQVigQHqgQZlgQUxgQS8gC1bQVBDU2NoZWR1bGVZQVBDUmVzdWx0XxAXQVBDTWVkVHJhY2tlck1lZGljYXRpb25fEBFBUENTdG9yZWRVc2VyRGF0YV8QEEFQQ1NjaGVkdWxlZFRhc2tfEBtBUENNZWRUcmFja2VyUG9zc2libGVEb3NhZ2VbQVBDREJTdGF0dXNfEB5BUENNZWRUcmFja2VyUHJlc2NyaXB0aW9uQ29sb3JXQVBDVGFza18QHkFQQ01lZFRyYWNrZXJEYWlseURvc2FnZVJlY29yZF8QG0FQQ01lZFRyYWNrZXJJbmZsYXRhYmxlSXRlbV8QGUFQQ01lZFRyYWNrZXJQcmVzY3JpcHRpb27fEBAAYABhAGIAYwAdAGQAZQAfAGYAZwAKACEAaABpACQAagBrAGwAJQAlABAAcABxAC0AJQBrAHQAOQBrAHcAeAB5XxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNvcmRlcmVkXxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNzdG9yYWdlXxAgWERCdWNrZXRGb3JTdGVyZW90eXBlc3dhc0VuY29kZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzc3RvcmFnZV8QJFhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zZHVwbGljYXRlc18QJFhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zd2FzRW5jb2RlZF8QHVhEQnVja2V0Rm9yU3RlcmVvdHlwZXNvcmRlcmVkXxAhWERCdWNrZXRGb3JHZW5lcmFsaXphdGlvbnNvcmRlcmVkXxAhWERCdWNrZXRGb3JHZW5lcmFsaXphdGlvbnNzdG9yYWdlW19pc0Fic3RyYWN0gBSANYAEgASAAoAVgQLSgASAFIEC1IAGgBSBBJSAEwgS5+rZw1dvcmRlcmVk0wA2ADcACgB9AH8AUqEAfoAWoQCAgBeALV5YRF9QU3RlcmVvdHlwZdkAHQAhAIQACgAkAIUAHwBqAIYARgB+AGsAigATACUALQB5AI5fECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc29yZGVyZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3N0b3JhZ2WAEoAWgBSANIAAgAQIgBjTADYANwAKAJAAmQBSqACRAJIAkwCUAJUAlgCXAJiAGYAagBuAHIAdgB6AH4AgqACaAJsAnACdAJ4AnwCgAKGAIYAlgCaAJ4ApgCuALoAygC1fEBNYRFBNQ29tcG91bmRJbmRleGVzXxAQWERfUFNLX2VsZW1lbnRJRF8QGlhEX1BTS192ZXJzaW9uSGFzaE1vZGlmaWVyXxAZWERfUFNLX2ZldGNoUmVxdWVzdHNBcnJheV8QEVhEX1BTS19pc0Fic3RyYWN0XxAPWERfUFNLX3VzZXJJbmZvXxATWERfUFNLX2NsYXNzTWFwcGluZ18QFlhEX1BTS19lbnRpdHlDbGFzc05hbWXfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwC3ABMAgAB5AHkAeQAtAHkAvgCRAHkAeQATAHlVX3R5cGVYX2RlZmF1bHRcX2Fzc29jaWF0aW9uW19pc1JlYWRPbmx5WV9pc1N0YXRpY1lfaXNVbmlxdWVaX2lzRGVyaXZlZFpfaXNPcmRlcmVkXF9pc0NvbXBvc2l0ZVdfaXNMZWFmgACAIoAAgBcICAgIgCSAGQgIgAAI0gA3AAoAxQDGoIAj0gDIAMkAygDLWiR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VTUxHZW5lcmFsaXphdGlvbkltcF8QFFhEVU1MTmFtZWRFbGVtZW50SW1wXxAPWERVTUxFbGVtZW50SW1w1wAKACFBlAAdACRBlQAfQZYAEwBNAE1DzgBQAC2BBWCAAIEFYoEFYoEGH4EFMd8QEEPRQ9JD00PUAB1D1UPWAB9D10PYAAoAIUPZQ9oAJABqAGtD3AAlACUAEEPgAHEALQAlAGsAdABAAGtD50PoAHlfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc29yZGVyZWRfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3N0b3JhZ2VfECBYREJ1Y2tldEZvclN0ZXJlb3R5cGVzd2FzRW5jb2RlZF8QJFhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzd2FzRW5jb2RlZF8QHVhEQnVja2V0Rm9yU3RlcmVvdHlwZXNzdG9yYWdlXxAkWERCdWNrZXRGb3JHZW5lcmFsaXphdGlvbnNkdXBsaWNhdGVzXxAkWERCdWNrZXRGb3JHZW5lcmFsaXphdGlvbnN3YXNFbmNvZGVkXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc29yZGVyZWRfECFYREJ1Y2tldEZvckdlbmVyYWxpemF0aW9uc29yZGVyZWRfECFYREJ1Y2tldEZvckdlbmVyYWxpemF0aW9uc3N0b3JhZ2WAFIEFc4AEgASAAoEFZIEC0oAEgBSBAtSADYAUgQYegQVjCBLSziwB0wA2ADcACkPsQ+4AUqEAfoAWoUPvgQVlgC3ZAB0AIUPyAAoAJEPzAB8AakP0AE0AfgBrAIoAEwAlAC0AeUP8XxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNvcmRlcmVkXxAkWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXN3YXNFbmNvZGVkXxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNzdG9yYWdlgQVigBaAFIA0gACABAiBBWbTADYANwAKQ/5EBwBSqACRAJIAkwCUAJUAlgCXAJiAGYAagBuAHIAdgB6AH4AgqEQIRAlECkQLRAxEDUQORA+BBWeBBWmBBWqBBWuBBW2BBW6BBXCBBXGALd8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATRBMAE0PvAHkAeQB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fALIACgAhALMAtAAkALUAEwATABNTaQB5AHkAeQAtAHkAvgHEAHkAeQATAHmAAIAAgACBBpQICAgIgCSAUQgIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMBBgATU2kAeQB5AHkALQB5AL4BxQB5AHkAEwB5gACAKoAAgQaUCAgICIAkgFIICIAACNkAHQAhVAkACgAkVAoAHwBqVAtSBw+TAGsAigATACUALQB5VBNfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc29yZGVyZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3N0b3JhZ2WBBpGBAVyAFIA0gACABAiBBqDTADYANwAKVBVUHQBSpxBDEEQQRRBGEEcQSBBJgQFqgQFrgQFsgQFtgQFugQFvgQFwp1QeVB9UIFQhVCJUI1QkgQahgQaigQajgQakgQalgQamgQangC3fEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAExBcABNTagB5AHkAeQAtAHkAvhBDAHkAeQATAHmAAIEBcoAAgQafCAgICIAkgQFqCAiAAAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAExBrABNTagB5AHkAeQAtAHkAvhBEAHkAeQATAHmAAIEBdIAAgQafCAgICIAkgQFrCAiAAAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAExBrABNTagB5AHkAeQAtAHkAvhBFAHkAeQATAHmAAIEBdIAAgQafCAgICIAkgQFsCAiAAAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwBRABNTagB5AHkAeQAtAHkAvhBGAHkAeQATAHmAAIEEvIAAgQafCAgICIAkgQFtCAiAAAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwEGABNTagB5AHkAeQAtAHkAvhBHAHkAeQATAHmAAIAqgACBBp8ICAgIgCSBAW4ICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAQYAE1NqAHkAeQB5AC0AeQC+EEgAeQB5ABM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H8oEICYEIIIEIN4EIToEIZYEIfIEIk4EIqoEIwYEI2IEI74EJBoEJHYEJNIEJS4EJYoEJeYEJkIAtXnRhc2tDb21wbGV0aW9uXxAUY29uc2VudFNpZ25hdHVyZURhdGVfEBVjb25zZW50U2lnbmF0dXJlSW1hZ2VccHJvZmlsZUltYWdlXWdsdWNvc2VMZXZlbHNZc2xlZXBUaW1lXxAVc2hhcmVkT3B0aW9uU2VsZWN0aW9uWWJpcnRoRGF0ZV8QD3NlcnZlckNvbnNlbnRlZF8QFGN1c3RvbVN1cnZleVF1ZXN0aW9uXxAPaGFzSGVhcnREaXNlYXNlXxASc2Vjb25kYXJ5SW5mb1NhdmVkWWJsb29kVHlwZV8QEW1lZGljYWxDb25kaXRpb25zWndha2VVcFRpbWVfEBRjb25zZW50U2lnbmF0dXJlTmFtZV8QE2hvbWVMb2NhdGlvbkFkZHJlc3NfEA9ob21lTG9jYXRpb25MYXRdYmlvbG9naWNhbFNleF11c2VyQ29uc2VudGVkWWV0aG5pY2l0eV8QHGRhaWx5U2NhbGVzQ29tcGxldGlvbkNvdW50ZXJcYWxsb3dDb250YWN0W3Bob25lTnVtYmVyXxAQaG9tZUxvY2F0aW9uTG9uZ1ttZWRpY2F0aW9uc98QEgCsAK0ArlxPAB0AsACxXFAAHwCvXFEAsgAKACEAswC0ACQAtQATABMAEwAlAEkAeQB5XFkALQB5AGsAeQGfW/4AeQB5XGEAeV8QIFhEQnVja2V0Rm9yU3RlcmVvdHlwZXN3YXNFbmNvZGVkXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc3N0b3JhZ2VfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzb3JkZXJlZIAAgACAAIAEgQckCAiBB1IIgBQIgG6BBzYICIEHUQgSO5kaptMANgA3AApcZVxoAFKiAagBqYBHgEiiXGlcaoEHU4EHXoAt2QAdACFcbQAKACRcbgAfAGpcb1wZAagAawCKABMAJQAtAHlcd18QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzb3JkZXJlZF8QJFhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzd2FzRW5jb2RlZF8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzc3RvcmFnZYEHUIBHgBS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AADG3AAAx9gAAMfgAADH6AAAx/AAAMf4AADH/AAAyAAAAMgEAADICAAAyBAAAMgYAADIHAAAyCAAAMgoAADILAAAySgAAMkwAADJOAAAyUAAAMlIAADJTAAAyVAAAMlUAADJWAAAyWAAAMloAADJbAAAyXAAAMl4AADJfAAAyngAAMqAAADKiAAAypAAAMqYAADKnAAAyqAAAMqkAADKqAAAyrAAAMq4AADKvAAAysAAAMrIAADKzAAAy8gAAMvQAADL2AAAy+AAAMvoAADL7AAAy/AAAMv0AADL+AAAzAAAAMwIAADMDAAAzBAAAMwYAADMHAAAzCgAAM0kAADNLAAAzTQAAM08AADNRAAAzUgAAM1MAADNUAAAzVQAAM1cAADNZAAAzWgAAM1sAADNdAAAzXgAAM50AADOfAAAzoQAAM6MAADOlAAAzpgAAM6cAADOoAAAzqQAAM6sAADOtAAAzrgAAM68AADOxAAAzsgAAM/EAADPzAAAz9QAAM/cAADP5AAAz+gAAM/sAADP8AAAz/QAAM/8AADQBAAA0AgAANAMAADQFAAA0BgAANFEAADR0AAA0lAAANLQAADS2AAA0uAAANLoAADS8AAA0vgAANL8AADTAAAA0wgAANMMAADTFAAA0xgAANMgAADTKAAA0ywAANMwAADTOAAA0zwAANNQAADThAAA05gAANOgAADTqAAA07wAANPEAADTzAAA09QAANRoAADU+AAA1ZQAANYkAADWLAAA1jQAANY8AADWRAAA1kwAANZUAADWWAAA1mAAANaUAADW2AAA1uAAANboAADW8AAA1vgAANcAAADXCAAA1xAAANcYAADXXAAA12QAANdsAADXdAAA13wAANeEAADXjAAA15QAANecAADXpAAA2KAAANioAADYsAAA2LgAANjAAADYxAAA2MgAANjMAADY0AAA2NgAANjgAADY5AAA2OgAANjwAADY9AAA2fAAANn4AADaAAAA2ggAANoQAADaFAAA2hgAANocAADaIAAA2igAANowAADaNAAA2jgAANpAAADaRAAA20AAANtIAADbUAAA21gAANtgAADbZAAA22gAANtsAADbcAAA23gAANuAAADbhAAA24gAANuQAADblAAA28gAANvMAADb0AAA29gAANzUAADc3AAA3OQAANzsAADc9AAA3PgAANz8AADdAAAA3QQAAN0MAADdFAAA3RgAAN0cAADdJAAA3SgAAN4kAADeLAAA3jQAAN48AADeRAAA3kgAAN5MAADeUAAA3lQAAN5cAADeZAAA3mgAAN5sAADedAAA3ngAAN90AADffAAA34QAAN+MAADflAAA35gAAN+cAADfoAAA36QAAN+sAADftAAA37gAAN+8AADfxAAA38gAAODEAADgzAAA4NQAAODcAADg5AAA4OgAAODsAADg8AAA4PQAAOD8AADhBAAA4QgAAOEMAADhFAAA4RgAAOIUAADiHAAA4iQAAOIsAADiNAAA4jgAAOI8AADiQAAA4kQAAOJMAADiVAAA4lgAAOJcAADiZAAA4mgAAOL8AADjjAAA5CgAAOS4AADkwAAA5MgAAOTQAADk2AAA5OAAAOToAADk7AAA5PQAAOUoAADlZAAA5WwAAOV0AADlfAAA5YQAAOWMAADllAAA5ZwAAOXYAADl4AAA5egAAOXwAADl+AAA5gAAAOYIAADmEAAA5hgAAOcUAADnHAAA5yQAAOcsAADnNAAA5zgAAOc8AADnQAAA50QAAOdMAADnVAAA51gAAOdcAADnZAAA52gAAOhkAADobAAA6HQAAOh8AADohAAA6IgAAOiMAADokAAA6JQAAOicAADopAAA6KgAAOisAADotAAA6LgAAOm0AADpvAAA6cQAAOnMAADp1AAA6dgAAOncAADp4AAA6eQAAOnsAADp9AAA6fgAAOn8AADqBAAA6ggAAOsEAADrDAAA6xQAAOscAADrJAAA6ygAAOssAADrMAAA6zQAAOs8AADrRAAA60gAAOtMAADrVAAA61gAAOxUAADsXAAA7GQAAOxsAADsdAAA7HgAAOx8AADsgAAA7IQAAOyMAADslAAA7JgAAOycAADspAAA7KgAAO2kAADtrAAA7bQAAO28AADtxAAA7cgAAO3MAADt0AAA7dQAAO3cAADt5AAA7egAAO3sAADt9AAA7fgAAO70AADu/AAA7wQAAO8MAADvFAAA7xgAAO8cAADvIAAA7yQAAO8sAADvNAAA7zgAAO88AADvRAAA70gAAPB0AADxAAAA8YAAAPIAAADyCAAA8hAAAPIYAADyIAAA8igAAPIsAADyMAAA8jgAAPI8AADyRAAA8kgAAPJQAADyWAAA8lwAAPJgAADyaAAA8mwAAPKQAADyxAAA8tgAAPLgAADy6AAA8vwAAPMEAADzDAAA8xQAAPOoAAD0OAAA9NQAAPVkAAD1bAAA9XQAAPV8AAD1hAAA9YwAAPWUAAD1mAAA9aAAAPXUAAD2GAAA9iAAAPYoAAD2MAAA9jgAAPZAAAD2SAAA9lAAAPZYAAD2nAAA9qQAAPasAAD2tAAA9rwAAPbEAAD2zAAA9tQAAPbcAAD25AAA9+AAAPfoAAD38AAA9/gAAPgAAAD4BAAA+AgAAPgMAAD4EAAA+BgAAPggAAD4JAAA+CgAAPgwAAD4NAAA+TAAAPk4AAD5QAAA+UgAAPlQAAD5VAAA+VgAAPlcAAD5YAAA+WgAAPlwAAD5dAAA+XgAAPmAAAD5hAAA+oAAAPqIAAD6kAAA+pgAAPqgAAD6pAAA+qgAAPqsAAD6sAAA+rgAAPrAAAD6xAAA+sgAAPrQAAD61AAA+wgAAPsMAAD7EAAA+xgAAPwUAAD8HAAA/CQAAPwsAAD8NAAA/DgAAPw8AAD8QAAA/EQAAPxMAAD8VAAA/FgAAPxcAAD8ZAAA/GgAAP1kAAD9bAAA/XQAAP18AAD9hAAA/YgAAP2MAAD9kAAA/ZQAAP2cAAD9pAAA/agAAP2sAAD9tAAA/bgAAP60AAD+vAAA/sQAAP7MAAD+1AAA/tgAAP7cAAD+4AAA/uQAAP7sAAD+9AAA/vgAAP78AAD/BAAA/wgAAQAEAAEADAABABQAAQAcAAEAJAABACgAAQAsAAEAMAABADQAAQA8AAEARAABAEgAAQBMAAEAVAABAFgAAQFUAAEBXAABAWQAAQFsAAEBdAABAXgAAQF8AAEBgAABAYQAAQGMAAEBlAABAZgAAQGcAAEBpAABAagAAQI8AAECzAABA2gAAQP4AAEEAAABBAgAAQQQAAEEGAABBCAAAQQoAAEELAABBDQAAQRoAAEEpAABBKwAAQS0AAEEvAABBMQAAQTMAAEE1AABBNwAAQUYAAEFIAABBSgAAQUwAAEFOAABBUAAAQVIAAEFUAABBVgAAQZUAAEGXAABBmQAAQZsAAEGdAABBngAAQZ8AAEGgAABBoQAAQaMAAEGlAABBpgAAQacAAEGpAABBqgAAQekAAEHrAABB7QAAQe8AAEHxAABB8gAAQfMAAEH0AABB9QAAQfcAAEH5AABB+gAAQfsAAEH9AABB/gAAQj0AAEI/AABCQQAAQkMAAEJFAABCRgAAQkcAAEJIAABCSQAAQksAAEJNAABCTgAAQk8AAEJRAABCUgAAQpEAAEKTAABClQAAQpcAAEKZAABCmgAAQpsAAEKcAABCnQAAQp8AAEKhAABCogAAQqMAAEKlAABCpgAAQqkAAELoAABC6gAAQuwAAELuAABC8AAAQvEAAELyAABC8wAAQvQAAEL2AABC+AAAQvkAAEL6AABC/AAAQv0AAEM8AABDPgAAQ0AAAENCAABDRAAAQ0UAAENGAABDRwAAQ0gAAENKAABDTAAAQ00AAENOAABDUAAAQ1EAAEOQAABDkgAAQ5QAAEOWAABDmAAAQ5kAAEOaAABDmwAAQ5wAAEOeAABDoAAAQ6EAAEOiAABDpAAAQ6UAAEPwAABEEwAARDMAAERTAABEVQAARFcAAERZAABEWwAARF0AAEReAABEXwAARGEAAERiAABEZAAARGUAAERnAABEaQAARGoAAERrAABEbQAARG4AAERzAABEgAAARIUAAESHAABEiQAARI4AAESQAABEkgAARJQAAES5AABE3QAARQQAAEUoAABFKgAARSwAAEUuAABFMAAARTIAAEU0AABFNQAARTcAAEVEAABFVQAARVcAAEVZAABFWwAARV0AAEVfAABFYQAARWMAAEVlAABFdgAARXgAAEV6AABFfAAARX4AAEWAAABFggAARYQAAEWGAABFiAAARccAAEXJAABFywAARc0AAEXPAABF0AAARdEAAEXSAABF0wAARdUAAEXXAABF2AAARdkAAEXbAABF3AAARhsAAEYdAABGHwAARiEAAEYjAABGJAAARiUAAEYmAABGJwAARikAAEYrAABGLAAARi0AAEYvAABGMAAARm8AAEZxAABGcwAARnUAAEZ3AABGeAAARnkAAEZ6AABGewAARn0AAEZ/AABGgAAARoEAAEaDAABGhAAARpEAAEaSAABGkwAARpUAAEbUAABG1gAARtgAAEbaAABG3AAARt0AAEbeAABG3wAARuAAAEbiAABG5AAARuUAAEbmAABG6AAARukAAEcoAABHKgAARywAAEcuAABHMAAARzEAAEcyAABHMwAARzQAAEc2AABHOAAARzkAAEc6AABHPAAARz0AAEd8AABHfgAAR4AAAEeCAABHhAAAR4UAAEeGAABHhwAAR4gAAEeKAABHjAAAR40AAEeOAABHkAAAR5EAAEfQAABH0gAAR9QAAEfWAABH2AAAR9kAAEfaAABH2wAAR9wAAEfeAABH4AAAR+EAAEfiAABH5AAAR+UAAEgkAABIJgAASCgAAEgqAABILAAASC0AAEguAABILwAASDAAAEgyAABINAAASDUAAEg2AABIOAAASDkAAEheAABIggAASKkAAEjNAABIzwAASNEAAEjTAABI1QAASNcAAEjZAABI2gAASNwAAEjpAABI+AAASPoAAEj8AABI/gAASQAAAEkCAABJBAAASQYAAEkVAABJFwAASRkAAEkbAABJHQAASR8AAEkhAABJIwAASSUAAElkAABJZgAASWgAAElqAABJbAAASW0AAEluAABJbwAASXAAAElyAABJdAAASXUAAEl2AABJeAAASXkAAEm4AABJugAASbwAAEm+AABJwAAAScEAAEnCAABJwwAAScQAAEnGAABJyAAASckAAEnKAABJzAAASc0AAEoMAABKDgAAShAAAEoSAABKFAAAShUAAEoWAABKFwAAShgAAEoaAABKHAAASh0AAEoeAABKIAAASiEAAEpgAABKYgAASmQAAEpmAABKaAAASmkAAEpqAABKawAASmwAAEpuAABKcAAASnEAAEpyAABKdAAASnUAAEq0AABKtgAASrgAAEq6AABKvAAASr0AAEq+AABKvwAASsAAAErCAABKxAAASsUAAErGAABKyAAASskAAEsIAABLCgAASwwAAEsOAABLEAAASxEAAEsSAABLEwAASxQAAEsWAABLGAAASxkAAEsaAABLHAAASx0AAEtcAABLXgAAS2AAAEtiAABLZAAAS2UAAEtmAABLZwAAS2gAAEtqAABLbAAAS20AAEtuAABLcAAAS3EAAEu8AABL3wAAS/8AAEwfAABMIQAATCMAAEwlAABMJwAATCkAAEwqAABMKwAATC0AAEwuAABMMAAATDEAAEwzAABMNQAATDYAAEw3AABMOQAATDoAAEw/AABMTAAATFEAAExTAABMVQAATFoAAExcAABMXgAATGAAAEyFAABMqQAATNAAAEz0AABM9gAATPgAAEz6AABM/AAATP4AAE0AAABNAQAATQMAAE0QAABNIQAATSMAAE0lAABNJwAATSkAAE0rAABNLQAATS8AAE0xAABNQgAATUQAAE1GAABNSAAATUoAAE1MAABNTgAATVAAAE1SAABNVAAATZMAAE2VAABNlwAATZkAAE2bAABNnAAATZ0AAE2eAABNnwAATaEAAE2jAABNpAAATaUAAE2nAABNqAAATecAAE3pAABN6wAATe0AAE3vAABN8AAATfEAAE3yAABN8wAATfUAAE33AABN+AAATfkAAE37AABN/AAATjsAAE49AABOPwAATkEAAE5DAABORAAATkUAAE5GAABORwAATkkAAE5LAABOTAAATk0AAE5PAABOUAAATl0AAE5eAABOXwAATmEAAE6gAABOogAATqQAAE6mAABOqAAATqkAAE6qAABOqwAATqwAAE6uAABOsAAATrEAAE6yAABOtAAATrUAAE70AABO9gAATvgAAE76AABO/AAATv0AAE7+AABO/wAATwAAAE8CAABPBAAATwUAAE8GAABPCAAATwkAAE9IAABPSgAAT0wAAE9OAABPUAAAT1EAAE9SAABPUwAAT1QAAE9WAABPWAAAT1kAAE9aAABPXAAAT10AAE+cAABPngAAT6AAAE+iAABPpAAAT6UAAE+mAABPpwAAT6gAAE+qAABPrAAAT60AAE+uAABPsAAAT7EAAE/wAABP8gAAT/QAAE/2AABP+AAAT/kAAE/6AABP+wAAT/wAAE/+AABQAAAAUAEAAFACAABQBAAAUAUAAFAqAABQTgAAUHUAAFCZAABQmwAAUJ0AAFCfAABQoQAAUKMAAFClAABQpgAAUKgAAFC1AABQxAAAUMYAAFDIAABQygAAUMwAAFDOAABQ0AAAUNIAAFDhAABQ4wAAUOUAAFDnAABQ6QAAUOsAAFDtAABQ7wAAUPEAAFEwAABRMgAAUTQAAFE2AABROAAAUTkAAFE6AABROwAAUTwAAFE+AABRQAAAUUEAAFFCAABRRAAAUUUAAFGEAABRhgAAUYgAAFGKAABRjAAAUY0AAFGOAABRjwAAUZAAAFGSAABRlAAAUZUAAFGWAABRmAAAUZkAAFHYAABR2gAAUdwAAFHeAABR4AAAUeEAAFHiAABR4wAAUeQAAFHmAABR6AAAUekAAFHqAABR7AAAUe0AAFIsAABSLgAAUjAAAFIyAABSNAAAUjUAAFI2AABSNwAAUjgAAFI6AABSPAAAUj0AAFI+AABSQAAAUkEAAFKAAABSggAAUoQAAFKGAABSiAAAUokAAFKKAABSiwAAUowAAFKOAABSkAAAUpEAAFKSAABSlAAAUpUAAFLUAABS1gAAUtgAAFLaAABS3AAAUt0AAFLeAABS3wAAUuAAAFLiAABS5AAAUuUAAFLmAABS6AAAUukAAFMoAABTKgAAUywAAFMuAABTMAAAUzEAAFMyAABTMwAAUzQAAFM2AABTOAAAUzkAAFM6AABTPAAAUz0AAFOIAABTqwAAU8sAAFPrAABT7QAAU+8AAFPxAABT8wAAU/UAAFP2AABT9wAAU/kAAFP6AABT/AAAU/0AAFP/AABUAQAAVAIAAFQDAABUBQAAVAYAAFQLAABUGAAAVB0AAFQfAABUIQAAVCYAAFQoAABUKgAAVCwAAFRRAABUdQAAVJwAAFTAAABUwgAAVMQAAFTGAABUyAAAVMoAAFTMAABUzQAAVM8AAFTcAABU7QAAVO8AAFTxAABU8wAAVPUAAFT3AABU+QAAVPsAAFT9AABVDgAAVRAAAFUSAABVFAAAVRYAAFUYAABVGgAAVRwAAFUeAABVIAAAVV8AAFVhAABVYwAAVWUAAFVnAABVaAAAVWkAAFVqAABVawAAVW0AAFVvAABVcAAAVXEAAFVzAABVdAAAVbMAAFW1AABVtwAAVbkAAFW7AABVvAAAVb0AAFW+AABVvwAAVcEAAFXDAABVxAAAVcUAAFXHAABVyAAAVgcAAFYJAABWCwAAVg0AAFYPAABWEAAAVhEAAFYSAABWEwAAVhUAAFYXAABWGAAAVhkAAFYbAABWHAAAVikAAFYqAABWKwAAVi0AAFZsAABWbgAAVnAAAFZyAABWdAAAVnUAAFZ2AABWdwAAVngAAFZ6AABWfAAAVn0AAFZ+AABWgAAAVoEAAFbAAABWwgAAVsQAAFbGAABWyAAAVskAAFbKAABWywAAVswAAFbOAABW0AAAVtEAAFbSAABW1AAAVtUAAFcUAABXFgAAVxgAAFcaAABXHAAAVx0AAFceAABXHwAAVyAAAFciAABXJAAAVyUAAFcmAABXKAAAVykAAFdoAABXagAAV2wAAFduAABXcAAAV3EAAFdyAABXcwAAV3QAAFd2AABXeAAAV3kAAFd6AABXfAAAV30AAFe8AABXvgAAV8AAAFfCAABXxAAAV8UAAFfGAABXxwAAV8gAAFfKAABXzAAAV80AAFfOAABX0AAAV9EAAFf2AABYGgAAWEEAAFhlAABYZwAAWGkAAFhrAABYbQAAWG8AAFhxAABYcgAAWHQAAFiBAABYkAAAWJIAAFiUAABYlgAAWJgAAFiaAABYnAAAWJ4AAFitAABYrwAAWLEAAFizAABYtQAAWLcAAFi5AABYuwAAWL0AAFj8AABY/gAAWQAAAFkCAABZBAAAWQUAAFkGAABZBwAAWQgAAFkKAABZDAAAWQ0AAFkOAABZEAAAWREAAFlQAABZUgAAWVQAAFlWAABZWAAAWVkAAFlaAABZWwAAWVwAAFleAABZYAAAWWEAAFliAABZZAAAWWUAAFmkAABZpgAAWagAAFmqAABZrAAAWa0AAFmuAABZrwAAWbAAAFmyAABZtAAAWbUAAFm2AABZuAAAWbkAAFn4AABZ+gAAWfwAAFn+AABaAAAAWgEAAFoCAABaAwAAWgQAAFoGAABaCAAAWgkAAFoKAABaDAAAWg0AAFpMAABaTgAAWlAAAFpSAABaVAAAWlUAAFpWAABaVwAAWlgAAFpaAABaXAAAWl0AAFpeAABaYAAAWmEAAFqgAABaogAAWqQAAFqmAABaqAAAWqkAAFqqAABaqwAAWqwAAFquAABasAAAWrEAAFqyAABatAAAWrUAAFr0AABa9gAAWvgAAFr6AABa/AAAWv0AAFr+AABa/wAAWwAAAFsCAABbBAAAWwUAAFsGAABbCAAAWwkAAFtUAABbdwAAW5cAAFu3AABbuQAAW7sAAFu9AABbvwAAW8EAAFvCAABbwwAAW8UAAFvGAABbyAAAW8kAAFvLAABbzQAAW84AAFvPAABb0QAAW9IAAFvXAABb5AAAW+kAAFvrAABb7QAAW/IAAFv0AABb9wAAW/kAAFweAABcQgAAXGkAAFyNAABcjwAAXJEAAFyTAABclQAAXJcAAFyZAABcmgAAXJwAAFypAABcugAAXLwAAFy+AABcwAAAXMIAAFzEAABcxgAAXMgAAFzKAABc2wAAXN4AAFzhAABc5AAAXOcAAFzqAABc7QAAXPAAAFzzAABc9QAAXTQAAF02AABdOAAAXToAAF08AABdPQAAXT4AAF0/AABdQAAAXUIAAF1EAABdRQAAXUYAAF1IAABdSQAAXYgAAF2KAABdjAAAXY4AAF2QAABdkQAAXZIAAF2TAABdlAAAXZYAAF2YAABdmQAAXZoAAF2cAABdnQAAXdwAAF3eAABd4QAAXeMAAF3lAABd5gAAXecAAF3oAABd6QAAXesAAF3tAABd7gAAXe8AAF3xAABd8gAAXf8AAF4AAABeAQAAXgMAAF5CAABeRAAAXkYAAF5IAABeSgAAXksAAF5MAABeTQAAXk4AAF5QAABeUgAAXlMAAF5UAABeVgAAXlcAAF6WAABemAAAXpoAAF6cAABengAAXp8AAF6gAABeoQAAXqIAAF6kAABepgAAXqcAAF6oAABeqgAAXqsAAF7qAABe7AAAXu4AAF7wAABe8gAAXvMAAF70AABe9QAAXvYAAF74AABe+gAAXvsAAF78AABe/gAAXv8AAF8+AABfQAAAX0IAAF9EAABfRgAAX0cAAF9IAABfSQAAX0oAAF9MAABfTgAAX08AAF9QAABfUgAAX1MAAF+SAABflAAAX5YAAF+YAABfmgAAX5sAAF+cAABfnQAAX54AAF+gAABfogAAX6MAAF+kAABfpgAAX6cAAF/MAABf8AAAYBcAAGA7AABgPQAAYD8AAGBBAABgQwAAYEUAAGBHAABgSAAAYEsAAGBYAABgZwAAYGkAAGBrAABgbQAAYG8AAGBxAABgcwAAYHUAAGCEAABghwAAYIoAAGCNAABgkAAAYJMAAGCWAABgmQAAYJsAAGDaAABg3AAAYN4AAGDgAABg4wAAYOQAAGDlAABg5gAAYOcAAGDpAABg6wAAYOwAAGDtAABg7wAAYPAAAGEvAABhMQAAYTMAAGE1AABhOAAAYTkAAGE6AABhOwAAYTwAAGE+AABhQAAAYUEAAGFCAABhRAAAYUUAAGGEAABhhgAAYYgAAGGKAABhjQAAYY4AAGGPAABhkAAAYZEAAGGTAABhlQAAYZYAAGGXAABhmQAAYZoAAGHZAABh2wAAYd0AAGHfAABh4gAAYeMAAGHkAABh5QAAYeYAAGHoAABh6gAAYesAAGHsAABh7gAAYe8AAGIuAABiMAAAYjIAAGI0AABiNwAAYjgAAGI5AABiOgAAYjsAAGI9AABiPwAAYkAAAGJBAABiQwAAYkQAAGKDAABihQAAYocAAGKJAABijAAAYo0AAGKOAABijwAAYpAAAGKSAABilAAAYpUAAGKWAABimAAAYpkAAGLYAABi2gAAYtwAAGLeAABi4QAAYuIAAGLjAABi5AAAYuUAAGLnAABi6QAAYuoAAGLrAABi7QAAYu4AAGM5AABjXAAAY3wAAGOcAABjngAAY6AAAGOiAABjpAAAY6YAAGOnAABjqAAAY6sAAGOsAABjrgAAY68AAGOxAABjswAAY7QAAGO1AABjuAAAY7kAAGO+AABjywAAY9AAAGPSAABj1AAAY9kAAGPcAABj3wAAY+EAAGQGAABkKgAAZFEAAGR1AABkeAAAZHoAAGR8AABkfgAAZIAAAGSCAABkgwAAZIYAAGSTAABkpAAAZKYAAGSoAABkqgAAZKwAAGSuAABksAAAZLIAAGS0AABkxQAAZMgAAGTLAABkzgAAZNEAAGTUAABk1wAAZNoAAGTdAABk3wAAZR4AAGUgAABlIgAAZSQAAGUnAABlKAAAZSkAAGUqAABlKwAAZS0AAGUvAABlMAAAZTEAAGUzAABlNAAAZXMAAGV1AABldwAAZXkAAGV8AABlfQAAZX4AAGV/AABlgAAAZYIAAGWEAABlhQAAZYYAAGWIAABliQAAZcgAAGXKAABlzQAAZc8AAGXSAABl0wAAZdQAAGXVAABl1gAAZdgAAGXaAABl2wAAZdwAAGXeAABl3wAAZewAAGXtAABl7gAAZfAAAGYvAABmMQAAZjMAAGY1AABmOAAAZjkAAGY6AABmOwAAZjwAAGY+AABmQAAAZkEAAGZCAABmRAAAZkUAAGaEAABmhgAAZogAAGaKAABmjQAAZo4AAGaPAABmkAAAZpEAAGaTAABmlQAAZpYAAGaXAABmmQAAZpoAAGbZAABm2wAAZt0AAGbfAABm4gAAZuMAAGbkAABm5QAAZuYAAGboAABm6gAAZusAAGbsAABm7gAAZu8AAGcuAABnMAAAZzIAAGc0AABnNwAAZzgAAGc5AABnOgAAZzsAAGc9AABnPwAAZ0AAAGdBAABnQwAAZ0QAAGeDAABnhQAAZ4cAAGeJAABnjAAAZ40AAGeOAABnjwAAZ5AAAGeSAABnlAAAZ5UAAGeWAABnmAAAZ5kAAGe+AABn4gAAaAkAAGgtAABoMAAAaDIAAGg0AABoNgAAaDgAAGg6AABoOwAAaD4AAGhLAABoWgAAaFwAAGheAABoYAAAaGIAAGhkAABoZgAAaGgAAGh3AABoegAAaH0AAGiAAABogwAAaIYAAGiJAABojAAAaI4AAGjNAABozwAAaNEAAGjTAABo1gAAaNcAAGjYAABo2QAAaNoAAGjcAABo3gAAaN8AAGjgAABo4gAAaOMAAGkiAABpJAAAaSYAAGkoAABpKwAAaSwAAGktAABpLgAAaS8AAGkxAABpMwAAaTQAAGk1AABpNwAAaTgAAGl3AABpeQAAaXsAAGl9AABpgAAAaYEAAGmCAABpgwAAaYQAAGmGAABpiAAAaYkAAGmKAABpjAAAaY0AAGnMAABpzgAAadAAAGnSAABp1QAAadYAAGnXAABp2AAAadkAAGnbAABp3QAAad4AAGnfAABp4QAAaeIAAGohAABqIwAAaiUAAGonAABqKgAAaisAAGosAABqLQAAai4AAGowAABqMgAAajMAAGo0AABqNgAAajcAAGp2AABqeAAAanoAAGp8AABqfwAAaoAAAGqBAABqggAAaoMAAGqFAABqhwAAaogAAGqJAABqiwAAaowAAGrLAABqzQAAas8AAGrRAABq1AAAatUAAGrWAABq1wAAatgAAGraAABq3AAAat0AAGreAABq4AAAauEAAGssAABrTwAAa28AAGuPAABrkQAAa5MAAGuVAABrlwAAa5kAAGuaAABrmwAAa54AAGufAABroQAAa6IAAGukAABrpgAAa6cAAGuoAABrqwAAa6wAAGuxAABrvgAAa8MAAGvFAABrxwAAa8wAAGvPAABr0gAAa9QAAGv5AABsHQAAbEQAAGxoAABsawAAbG0AAGxvAABscQAAbHMAAGx1AABsdgAAbHkAAGyGAABslwAAbJkAAGybAABsnQAAbJ8AAGyhAABsowAAbKUAAGynAABsuAAAbLsAAGy+AABswQAAbMQAAGzHAABsygAAbM0AAGzQAABs0gAAbREAAG0TAABtFQAAbRcAAG0aAABtGwAAbRwAAG0dAABtHgAAbSAAAG0iAABtIwAAbSQAAG0mAABtJwAAbWYAAG1oAABtagAAbWwAAG1vAABtcAAAbXEAAG1yAABtcwAAbXUAAG13AABteAAAbXkAAG17AABtfAAAbbsAAG29AABtwAAAbcIAAG3FAABtxgAAbccAAG3IAABtyQAAbcsAAG3NAABtzgAAbc8AAG3RAABt0gAAbd8AAG3gAABt4QAAbeMAAG4iAABuJAAAbiYAAG4oAABuKwAAbiwAAG4tAABuLgAAbi8AAG4xAABuMwAAbjQAAG41AABuNwAAbjgAAG53AABueQAAbnsAAG59AABugAAAboEAAG6CAABugwAAboQAAG6GAABuiAAAbokAAG6KAABujAAAbo0AAG7MAABuzgAAbtAAAG7SAABu1QAAbtYAAG7XAABu2AAAbtkAAG7bAABu3QAAbt4AAG7fAABu4QAAbuIAAG8hAABvIwAAbyUAAG8nAABvKgAAbysAAG8sAABvLQAAby4AAG8wAABvMgAAbzMAAG80AABvNgAAbzcAAG92AABveAAAb3oAAG98AABvfwAAb4AAAG+BAABvggAAb4MAAG+FAABvhwAAb4gAAG+JAABviwAAb4wAAG+xAABv1QAAb/wAAHAgAABwIwAAcCUAAHAnAABwKQAAcCsAAHAtAABwLgAAcDEAAHA+AABwTQAAcE8AAHBRAABwUwAAcFUAAHBXAABwWQAAcFsAAHBqAABwbQAAcHAAAHBzAABwdgAAcHkAAHB8AABwfwAAcIEAAHDAAABwwgAAcMUAAHDHAABwygAAcMsAAHDMAABwzQAAcM4AAHDQAABw0gAAcNMAAHDUAABw1gAAcNcAAHDZAABxGAAAcRoAAHEcAABxHgAAcSEAAHEiAABxIwAAcSQAAHElAABxJwAAcSkAAHEqAABxKwAAcS0AAHEuAABxbQAAcW8AAHFxAABxcwAAcXYAAHF3AABxeAAAcXkAAHF6AABxfAAAcX4AAHF/AABxgAAAcYIAAHGDAABxwgAAccQAAHHHAABxyQAAccwAAHHNAABxzgAAcc8AAHHQAABx0gAAcdQAAHHVAABx1gAAcdgAAHHZAABx3AAAchsAAHIdAAByHwAAciEAAHIkAAByJQAAciYAAHInAAByKAAAcioAAHIsAAByLQAAci4AAHIwAAByMQAAcnAAAHJyAABydAAAcnYAAHJ5AAByegAAcnsAAHJ8AAByfQAAcn8AAHKBAAByggAAcoMAAHKFAAByhgAAcsUAAHLHAAByyQAAcssAAHLOAAByzwAActAAAHLRAABy0gAActQAAHLWAABy1wAActgAAHLaAABy2wAAcyYAAHNJAABzaQAAc4kAAHOLAABzjQAAc48AAHORAABzkwAAc5QAAHOVAABzmAAAc5kAAHObAABznAAAc54AAHOgAABzoQAAc6IAAHOlAABzpgAAc6sAAHO4AABzvQAAc78AAHPBAABzxgAAc8kAAHPMAABzzgAAc/MAAHQXAAB0PgAAdGIAAHRlAAB0ZwAAdGkAAHRrAAB0bQAAdG8AAHRwAAB0cwAAdIAAAHSRAAB0kwAAdJUAAHSXAAB0mQAAdJsAAHSdAAB0nwAAdKEAAHSyAAB0tQAAdLgAAHS7AAB0vgAAdMEAAHTEAAB0xwAAdMoAAHTMAAB1CwAAdQ0AAHUPAAB1EQAAdRQAAHUVAAB1FgAAdRcAAHUYAAB1GgAAdRwAAHUdAAB1HgAAdSAAAHUhAAB1YAAAdWIAAHVkAAB1ZgAAdWkAAHVqAAB1awAAdWwAAHVtAAB1bwAAdXEAAHVyAAB1cwAAdXUAAHV2AAB1tQAAdbcAAHW6AAB1vAAAdb8AAHXAAAB1wQAAdcIAAHXDAAB1xQAAdccAAHXIAAB1yQAAdcsAAHXMAAB12QAAddoAAHXbAAB13QAAdhwAAHYeAAB2IAAAdiIAAHYlAAB2JgAAdicAAHYoAAB2KQAAdisAAHYtAAB2LgAAdi8AAHYxAAB2MgAAdnEAAHZzAAB2dQAAdncAAHZ6AAB2ewAAdnwAAHZ9AAB2fgAAdoAAAHaCAAB2gwAAdoQAAHaGAAB2hwAAdsYAAHbIAAB2ygAAdswAAHbPAAB20AAAdtEAAHbSAAB20wAAdtUAAHbXAAB22AAAdtkAAHbbAAB23AAAdxsAAHcdAAB3HwAAdyEAAHckAAB3JQAAdyYAAHcnAAB3KAAAdyoAAHcsAAB3LQAAdy4AAHcwAAB3MQAAd3AAAHdyAAB3dAAAd3YAAHd5AAB3egAAd3sAAHd8AAB3fQAAd38AAHeBAAB3ggAAd4MAAHeFAAB3hgAAd6sAAHfPAAB39gAAeBoAAHgdAAB4HwAAeCEAAHgjAAB4JQAAeCcAAHgoAAB4KwAAeDgAAHhHAAB4SQAAeEsAAHhNAAB4TwAAeFEAAHhTAAB4VQAAeGQAAHhnAAB4agAAeG0AAHhwAAB4cwAAeHYAAHh5AAB4ewAAeLoAAHi8AAB4vgAAeMAAAHjDAAB4xAAAeMUAAHjGAAB4xwAAeMkAAHjLAAB4zAAAeM0AAHjPAAB40AAAeQ8AAHkRAAB5EwAAeRUAAHkYAAB5GQAAeRoAAHkbAAB5HAAAeR4AAHkgAAB5IQAAeSIAAHkkAAB5JQAAeWQAAHlmAAB5aAAAeWoAAHltAAB5bgAAeW8AAHlwAAB5cQAAeXMAAHl1AAB5dgAAeXcAAHl5AAB5egAAebkAAHm7AAB5vQAAeb8AAHnCAAB5wwAAecQAAHnFAAB5xgAAecgAAHnKAAB5ywAAecwAAHnOAAB5zwAAeg4AAHoQAAB6EgAAehQAAHoXAAB6GAAAehkAAHoaAAB6GwAAeh0AAHofAAB6IAAAeiEAAHojAAB6JAAAemMAAHplAAB6ZwAAemkAAHpsAAB6bQAAem4AAHpvAAB6cAAAenIAAHp0AAB6dQAAenYAAHp4AAB6eQAAergAAHq6AAB6vAAAer4AAHrBAAB6wgAAesMAAHrEAAB6xQAAescAAHrJAAB6ygAAessAAHrNAAB6zgAAexkAAHs8AAB7XAAAe3wAAHt+AAB7gAAAe4IAAHuEAAB7hgAAe4cAAHuIAAB7iwAAe4wAAHuOAAB7jwAAe5IAAHuUAAB7lQAAe5YAAHuZAAB7mgAAe6MAAHuwAAB7tQAAe7cAAHu6AAB7vwAAe8IAAHvFAAB7xwAAe9oAAHv/AAB8IwAAfEoAAHxuAAB8cQAAfHMAAHx1AAB8dwAAfHkAAHx7AAB8fAAAfH8AAHyMAAB8nQAAfJ8AAHyhAAB8owAAfKUAAHynAAB8qQAAfKsAAHytAAB8vgAAfMEAAHzEAAB8xwAAfMoAAHzNAAB80AAAfNMAAHzWAAB82AAAfRcAAH0ZAAB9GwAAfR0AAH0gAAB9IQAAfSIAAH0jAAB9JAAAfSYAAH0oAAB9KQAAfSoAAH0sAAB9LQAAfWwAAH1uAAB9cAAAfXIAAH11AAB9dgAAfXcAAH14AAB9eQAAfXsAAH19AAB9fgAAfX8AAH2BAAB9ggAAfcEAAH3DAAB9xgAAfcgAAH3LAAB9zAAAfc0AAH3OAAB9zwAAfdEAAH3TAAB91AAAfdUAAH3XAAB92AAAfeUAAH3mAAB95wAAfekAAH4oAAB+KgAAfiwAAH4uAAB+MQAAfjIAAH4zAAB+NAAAfjUAAH43AAB+OQAAfjoAAH47AAB+PQAAfj4AAH59AAB+fwAAfoEAAH6DAAB+hgAAfocAAH6IAAB+iQAAfooAAH6MAAB+jgAAfo8AAH6QAAB+kgAAfpMAAH7SAAB+1AAAftYAAH7YAAB+2wAAftwAAH7dAAB+3gAAft8AAH7hAAB+4wAAfuQAAH7lAAB+5wAAfugAAH8nAAB/KQAAfysAAH8tAAB/MAAAfzEAAH8yAAB/MwAAfzQAAH82AAB/OAAAfzkAAH86AAB/PAAAfz0AAH98AAB/fgAAf4AAAH+CAAB/hQAAf4YAAH+HAAB/iAAAf4kAAH+LAAB/jQAAf44AAH+PAAB/kQAAf5IAAH+3AAB/2wAAgAIAAIAmAACAKQAAgCwAAIAuAACAMAAAgDIAAIA0AACANQAAgDgAAIBFAACAVAAAgFcAAIBaAACAXQAAgGAAAIBjAACAZgAAgGkAAIB4AACAewAAgH4AAICBAACAhAAAgIcAAICKAACAjQAAgI8AAIChAACAtQAAgMcAAIDcAACA7gAAgP0AAIEaAACBWQAAgVsAAIFeAACBYAAAgWMAAIFkAACBZQAAgWYAAIFnAACBaQAAgWwAAIFtAACBbgAAgXAAAIFxAACBsAAAgbIAAIG1AACBtwAAgboAAIG7AACBvAAAgb0AAIG+AACBwAAAgcMAAIHEAACBxQAAgccAAIHIAACBygAAggkAAIILAACCDgAAghAAAIITAACCFAAAghUAAIIWAACCFwAAghkAAIIcAACCHQAAgh4AAIIgAACCIQAAgmAAAIJiAACCZQAAgmcAAIJqAACCawAAgmwAAIJtAACCbgAAgnAAAIJzAACCdAAAgnUAAIJ3AACCeAAAgrsAAILfAACDAwAAgyYAAINNAACDbQAAg5QAAIO7AACD2wAAg/8AAIQjAACEJQAAhCgAAIQqAACELAAAhC4AAIQxAACENAAAhDYAAIQ4AACEOwAAhD0AAIQ/AACEQgAAhEUAAIRGAACESwAAhFgAAIRbAACEXQAAhGAAAIRjAACEZQAAhIoAAISuAACE1QAAhPkAAIT8AACE/gAAhQAAAIUCAACFBAAAhQYAAIUHAACFCgAAhRcAAIUoAACFKgAAhSwAAIUuAACFMAAAhTIAAIU0AACFNgAAhTgAAIVJAACFTAAAhU8AAIVSAACFVQAAhVgAAIVbAACFXgAAhWEAAIVjAACFogAAhaQAAIWnAACFqQAAhawAAIWtAACFrgAAha8AAIWwAACFsgAAhbQAAIW1AACFtgAAhbgAAIW5AACFwgAAhcMAAIXFAACGBAAAhgYAAIYIAACGCgAAhg0AAIYOAACGDwAAhhAAAIYRAACGEwAAhhUAAIYWAACGFwAAhhkAAIYaAACGWQAAhlsAAIZdAACGXwAAhmIAAIZjAACGZAAAhmUAAIZmAACGaAAAhmoAAIZrAACGbAAAhm4AAIZvAACGrgAAhrAAAIazAACGtQAAhrgAAIa5AACGugAAhrsAAIa8AACGvgAAhsAAAIbBAACGwgAAhsQAAIbFAACGzgAAhs8AAIbRAACHEAAAhxIAAIcUAACHFgAAhxkAAIcaAACHGwAAhxwAAIcdAACHHwAAhyEAAIciAACHIwAAhyUAAIcmAACHZQAAh2cAAIdqAACHbAAAh28AAIdwAACHcQAAh3IAAIdzAACHdQAAh3cAAId4AACHeQAAh3sAAId8AACHiQAAh4oAAIeLAACHjQAAh8wAAIfOAACH0AAAh9IAAIfVAACH1gAAh9cAAIfYAACH2QAAh9sAAIfdAACH3gAAh98AAIfhAACH4gAAiCEAAIgjAACIJgAAiCgAAIgrAACILAAAiC0AAIguAACILwAAiDEAAIgzAACINAAAiDUAAIg3AACIOAAAiEsAAIhYAACIawAAiG4AAIhxAACIdAAAiHcAAIh6AACIfAAAiH8AAIiCAACIhAAAiJcAAIiaAACInQAAiKAAAIijAACIpgAAiKkAAIisAACIrwAAiLIAAIi0AACIvAAAiMAAAIjUAACI2QAAiOEAAIjnAACI8QAAiTwAAIlfAACJfwAAiZ8AAImhAACJowAAiaUAAImnAACJqgAAiasAAImsAACJrwAAibAAAImyAACJswAAibUAAIm4AACJuQAAiboAAIm9AACJvgAAicMAAInQAACJ1QAAidcAAInZAACJ3gAAieEAAInkAACJ5gAAigsAAIovAACKVgAAinoAAIp9AACKfwAAioEAAIqDAACKhQAAiocAAIqIAACKiwAAipgAAIqpAACKqwAAiq0AAIqvAACKsQAAirMAAIq1AACKtwAAirkAAIrKAACKzQAAitAAAIrTAACK1gAAitkAAIrcAACK3wAAiuIAAIrkAACLIwAAiyUAAIsnAACLKQAAiywAAIstAACLLgAAiy8AAIswAACLMgAAizQAAIs1AACLNgAAizgAAIs5AACLeAAAi3oAAIt8AACLfgAAi4EAAIuCAACLgwAAi4QAAIuFAACLhwAAi4kAAIuKAACLiwAAi40AAIuOAACLzQAAi88AAIvSAACL1AAAi9cAAIvYAACL2QAAi9oAAIvbAACL3QAAi98AAIvgAACL4QAAi+MAAIvkAACL8QAAi/IAAIvzAACL9QAAjDQAAIw2AACMOAAAjDoAAIw9AACMPgAAjD8AAIxAAACMQQAAjEMAAIxFAACMRgAAjEcAAIxJAACMSgAAjIkAAIyLAACMjQAAjI8AAIySAACMkwAAjJQAAIyVAACMlgAAjJgAAIyaAACMmwAAjJwAAIyeAACMnwAAjN4AAIzgAACM4gAAjOQAAIznAACM6AAAjOkAAIzqAACM6wAAjO0AAIzvAACM8AAAjPEAAIzzAACM9AAAjTMAAI01AACNNwAAjTkAAI08AACNPQAAjT4AAI0/AACNQAAAjUIAAI1EAACNRQAAjUYAAI1IAACNSQAAjYgAAI2KAACNjAAAjY4AAI2RAACNkgAAjZMAAI2UAACNlQAAjZcAAI2ZAACNmgAAjZsAAI2dAACNngAAjcMAAI3nAACODgAAjjIAAI41AACONwAAjjkAAI47AACOPQAAjj8AAI5AAACOQwAAjlAAAI5fAACOYQAAjmMAAI5lAACOZwAAjmkAAI5rAACObQAAjnwAAI5/AACOggAAjoUAAI6IAACOiwAAjo4AAI6RAACOkwAAjtIAAI7UAACO1gAAjtgAAI7bAACO3AAAjt0AAI7eAACO3wAAjuEAAI7jAACO5AAAjuUAAI7nAACO6AAAjycAAI8pAACPKwAAjy0AAI8wAACPMQAAjzIAAI8zAACPNAAAjzYAAI84AACPOQAAjzoAAI88AACPPQAAj3wAAI9+AACPgAAAj4IAAI+FAACPhgAAj4cAAI+IAACPiQAAj4sAAI+NAACPjgAAj48AAI+RAACPkgAAj9EAAI/TAACP1QAAj9cAAI/aAACP2wAAj9wAAI/dAACP3gAAj+AAAI/iAACP4wAAj+QAAI/mAACP5wAAkCYAAJAoAACQKgAAkCwAAJAvAACQMAAAkDEAAJAyAACQMwAAkDUAAJA3AACQOAAAkDkAAJA7AACQPAAAkHsAAJB9AACQfwAAkIEAAJCEAACQhQAAkIYAAJCHAACQiAAAkIoAAJCMAACQjQAAkI4AAJCQAACQkQAAkNAAAJDSAACQ1AAAkNYAAJDZAACQ2gAAkNsAAJDcAACQ3QAAkN8AAJDhAACQ4gAAkOMAAJDlAACQ5gAAkTEAAJFUAACRdAAAkZQAAJGWAACRmAAAkZoAAJGcAACRnwAAkaAAAJGhAACRpAAAkaUAAJGnAACRqAAAkaoAAJGtAACRrgAAka8AAJGyAACRswAAkbwAAJHJAACRzgAAkdAAAJHSAACR1wAAkdoAAJHdAACR3wAAkgQAAJIoAACSTwAAknMAAJJ2AACSeAAAknoAAJJ8AACSfgAAkoAAAJKBAACShAAAkpEAAJKiAACSpAAAkqYAAJKoAACSqgAAkqwAAJKuAACSsAAAkrIAAJLDAACSxgAAkskAAJLMAACSzwAAktIAAJLVAACS2AAAktsAAJLdAACTHAAAkx4AAJMgAACTIgAAkyUAAJMmAACTJwAAkygAAJMpAACTKwAAky0AAJMuAACTLwAAkzEAAJMyAACTcQAAk3MAAJN1AACTdwAAk3oAAJN7AACTfAAAk30AAJN+AACTgAAAk4IAAJODAACThAAAk4YAAJOHAACTxgAAk8gAAJPLAACTzQAAk9AAAJPRAACT0gAAk9MAAJPUAACT1gAAk9gAAJPZAACT2gAAk9wAAJPdAACT6gAAk+sAAJPsAACT7gAAlC0AAJQvAACUMQAAlDMAAJQ2AACUNwAAlDgAAJQ5AACUOgAAlDwAAJQ+AACUPwAAlEAAAJRCAACUQwAAlIIAAJSEAACUhgAAlIgAAJSLAACUjAAAlI0AAJSOAACUjwAAlJEAAJSTAACUlAAAlJUAAJSXAACUmAAAlNcAAJTZAACU2wAAlN0AAJTgAACU4QAAlOIAAJTjAACU5AAAlOYAAJToAACU6QAAlOoAAJTsAACU7QAAlSwAAJUuAACVMAAAlTIAAJU1AACVNgAAlTcAAJU4AACVOQAAlTsAAJU9AACVPgAAlT8AAJVBAACVQgAAlYEAAJWDAACVhQAAlYcAAJWKAACViwAAlYwAAJWNAACVjgAAlZAAAJWSAACVkwAAlZQAAJWWAACVlwAAlbwAAJXgAACWBwAAlisAAJYuAACWMAAAljIAAJY0AACWNgAAljgAAJY5AACWPAAAlkkAAJZYAACWWgAAllwAAJZeAACWYAAAlmIAAJZkAACWZgAAlnUAAJZ4AACWewAAln4AAJaBAACWhAAAlocAAJaKAACWjAAAlssAAJbNAACWzwAAltEAAJbUAACW1QAAltYAAJbXAACW2AAAltoAAJbcAACW3QAAlt4AAJbgAACW4QAAlyAAAJciAACXJAAAlyYAAJcpAACXKgAAlysAAJcsAACXLQAAly8AAJcxAACXMgAAlzMAAJc1AACXNgAAl3UAAJd3AACXeQAAl3sAAJd+AACXfwAAl4AAAJeBAACXggAAl4QAAJeGAACXhwAAl4gAAJeKAACXiwAAl8oAAJfMAACXzgAAl9AAAJfTAACX1AAAl9UAAJfWAACX1wAAl9kAAJfbAACX3AAAl90AAJffAACX4AAAmB8AAJghAACYIwAAmCUAAJgoAACYKQAAmCoAAJgrAACYLAAAmC4AAJgwAACYMQAAmDIAAJg0AACYNQAAmHQAAJh2AACYeAAAmHoAAJh9AACYfgAAmH8AAJiAAACYgQAAmIMAAJiFAACYhgAAmIcAAJiJAACYigAAmMkAAJjLAACYzQAAmM8AAJjSAACY0wAAmNQAAJjVAACY1gAAmNgAAJjaAACY2wAAmNwAAJjeAACY3wAAmSoAAJlNAACZbQAAmY0AAJmPAACZkQAAmZMAAJmVAACZmAAAmZkAAJmaAACZnQAAmZ4AAJmgAACZoQAAmaQAAJmnAACZqAAAmakAAJmsAACZrQAAmbIAAJm/AACZxAAAmcYAAJnJAACZzgAAmdEAAJnUAACZ1gAAmfsAAJofAACaRgAAmmoAAJptAACabwAAmnEAAJpzAACadQAAmncAAJp4AACaewAAmogAAJqZAACamwAAmp0AAJqfAACaoQAAmqMAAJqlAACapwAAmqkAAJq6AACavQAAmsAAAJrDAACaxgAAmskAAJrMAACazwAAmtIAAJrUAACbEwAAmxUAAJsXAACbGQAAmxwAAJsdAACbHgAAmx8AAJsgAACbIgAAmyQAAJslAACbJgAAmygAAJspAACbaAAAm2oAAJtsAACbbgAAm3EAAJtyAACbcwAAm3QAAJt1AACbdwAAm3kAAJt6AACbewAAm30AAJt+AACbvQAAm78AAJvCAACbxAAAm8cAAJvIAACbyQAAm8oAAJvLAACbzQAAm88AAJvQAACb0QAAm9MAAJvUAACb4QAAm+IAAJvjAACb5QAAnCQAAJwmAACcKAAAnCoAAJwtAACcLgAAnC8AAJwwAACcMQAAnDMAAJw1AACcNgAAnDcAAJw5AACcOgAAnHkAAJx7AACcfQAAnH8AAJyCAACcgwAAnIQAAJyFAACchgAAnIgAAJyKAACciwAAnIwAAJyOAACcjwAAnM4AAJzQAACc0gAAnNQAAJzXAACc2AAAnNkAAJzaAACc2wAAnN0AAJzfAACc4AAAnOEAAJzjAACc5AAAnSMAAJ0lAACdJwAAnSkAAJ0sAACdLQAAnS4AAJ0vAACdMAAAnTIAAJ00AACdNQAAnTYAAJ04AACdOQAAnXgAAJ16AACdfAAAnX4AAJ2BAACdggAAnYMAAJ2EAACdhQAAnYcAAJ2JAACdigAAnYsAAJ2NAACdjgAAnbMAAJ3XAACd/gAAniIAAJ4lAACeKAAAnioAAJ4sAACeLgAAnjAAAJ4xAACeNAAAnkEAAJ5QAACeUwAAnlYAAJ5ZAACeXAAAnl8AAJ5iAACeZQAAnnQAAJ53AACeegAAnn0AAJ6AAACegwAAnoYAAJ6JAACeiwAAnsoAAJ7MAACezwAAntEAAJ7UAACe1QAAntYAAJ7XAACe2AAAntoAAJ7dAACe3gAAnt8AAJ7hAACe4gAAnyEAAJ8jAACfJgAAnygAAJ8rAACfLAAAny0AAJ8uAACfLwAAnzEAAJ80AACfNQAAnzYAAJ84AACfOQAAn3gAAJ96AACffQAAn38AAJ+CAACfgwAAn4QAAJ+FAACfhgAAn4gAAJ+LAACfjAAAn40AAJ+PAACfkAAAn88AAJ/RAACf0wAAn9UAAJ/YAACf2QAAn9oAAJ/bAACf3AAAn94AAJ/hAACf4gAAn+MAAJ/lAACf5gAAoCUAAKAnAACgKQAAoCsAAKAuAACgLwAAoDAAAKAxAACgMgAAoDQAAKA3AACgOAAAoDkAAKA7AACgPAAAoHsAAKB9AACgfwAAoIEAAKCEAACghQAAoIYAAKCHAACgiAAAoIoAAKCNAACgjgAAoI8AAKCRAACgkgAAoNEAAKDTAACg1gAAoNgAAKDbAACg3AAAoN0AAKDeAACg3wAAoOEAAKDkAACg5QAAoOYAAKDoAACg6QAAoPIAAKEFAAChEgAAoSUAAKEyAAChRQAAoVwAAKFuAAChuQAAodwAAKH8AACiHAAAoh4AAKIgAACiIgAAoiQAAKInAACiKAAAoikAAKIsAACiLQAAoi8AAKIwAACiMwAAojYAAKI3AACiOAAAojsAAKI8AACiQQAAok4AAKJTAACiVQAAolgAAKJdAACiYAAAomMAAKJlAACiigAAoq4AAKLVAACi+QAAovwAAKL+AACjAAAAowIAAKMEAACjBgAAowcAAKMKAACjFwAAoygAAKMqAACjLAAAoy4AAKMwAACjMgAAozQAAKM2AACjOAAAo0kAAKNMAACjTwAAo1IAAKNVAACjWAAAo1sAAKNeAACjYQAAo2MAAKOiAACjpAAAo6YAAKOoAACjqwAAo6wAAKOtAACjrgAAo68AAKOxAACjswAAo7QAAKO1AACjtwAAo7gAAKP3AACj+QAAo/sAAKP9AACkAAAApAEAAKQCAACkAwAApAQAAKQGAACkCAAApAkAAKQKAACkDAAApA0AAKRMAACkTgAApFEAAKRTAACkVgAApFcAAKRYAACkWQAApFoAAKRcAACkXgAApF8AAKRgAACkYgAApGMAAKRwAACkcQAApHIAAKR0AACkswAApLUAAKS3AACkuQAApLwAAKS9AACkvgAApL8AAKTAAACkwgAApMQAAKTFAACkxgAApMgAAKTJAAClCAAApQoAAKUMAAClDgAApREAAKUSAAClEwAApRQAAKUVAAClFwAApRkAAKUaAAClGwAApR0AAKUeAAClXQAApV8AAKVhAAClYwAApWYAAKVnAAClaAAApWkAAKVqAAClbAAApW4AAKVvAAClcAAApXIAAKVzAAClsgAApbQAAKW2AACluAAApbsAAKW8AAClvQAApb4AAKW/AAClwQAApcMAAKXEAAClxQAApccAAKXIAACmBwAApgkAAKYLAACmDQAAphAAAKYRAACmEgAAphMAAKYUAACmFgAAphgAAKYZAACmGgAAphwAAKYdAACmQgAApmYAAKaNAACmsQAAprQAAKa3AACmuQAAprsAAKa9AACmvwAApsAAAKbDAACm0AAApt8AAKbiAACm5QAApugAAKbrAACm7gAApvEAAKb0AACnAwAApwYAAKcJAACnDAAApw8AAKcSAACnFQAApxgAAKcaAACnWQAAp1sAAKdeAACnYAAAp2MAAKdkAACnZQAAp2YAAKdnAACnaQAAp2wAAKdtAACnbgAAp3AAAKdxAACnsAAAp7IAAKe1AACntwAAp7oAAKe7AACnvAAAp70AAKe+AACnwAAAp8MAAKfEAACnxQAAp8cAAKfIAACoBwAAqAkAAKgMAACoDgAAqBEAAKgSAACoEwAAqBQAAKgVAACoFwAAqBoAAKgbAACoHAAAqB4AAKgfAACoXgAAqGAAAKhjAACoZQAAqGgAAKhpAACoagAAqGsAAKhsAACobgAAqHEAAKhyAACocwAAqHUAAKh2AACouQAAqN0AAKkBAACpJAAAqUsAAKlrAACpkgAAqbkAAKnZAACp/QAAqiEAAKojAACqJgAAqigAAKoqAACqLAAAqi8AAKoyAACqNAAAqjYAAKo5AACqOwAAqj0AAKpAAACqQwAAqkQAAKpJAACqVgAAqlkAAKpbAACqXgAAqmEAAKpjAACqiAAAqqwAAKrTAACq9wAAqvoAAKr8AACq/gAAqwAAAKsCAACrBAAAqwUAAKsIAACrFQAAqyYAAKsoAACrKgAAqywAAKsuAACrMAAAqzIAAKs0AACrNgAAq0cAAKtKAACrTQAAq1AAAKtTAACrVgAAq1kAAKtcAACrXwAAq2EAAKugAACrogAAq6UAAKunAACrqgAAq6sAAKusAACrrQAAq64AAKuwAACrsgAAq7MAAKu0AACrtgAAq7cAAKvAAACrwQAAq8MAAKwCAACsBAAArAYAAKwIAACsCwAArAwAAKwNAACsDgAArA8AAKwRAACsEwAArBQAAKwVAACsFwAArBgAAKxXAACsWQAArFsAAKxdAACsYAAArGEAAKxiAACsYwAArGQAAKxmAACsaAAArGkAAKxqAACsbAAArG0AAKysAACsrgAArLEAAKyzAACstgAArLcAAKy4AACsuQAArLoAAKy8AACsvgAArL8AAKzAAACswgAArMMAAKzMAACszQAArM8AAK0OAACtEAAArRIAAK0UAACtFwAArRgAAK0ZAACtGgAArRsAAK0dAACtHwAArSAAAK0hAACtIwAArSQAAK1jAACtZQAArWgAAK1qAACtbQAArW4AAK1vAACtcAAArXEAAK1zAACtdQAArXYAAK13AACteQAArXoAAK2HAACtiAAArYkAAK2LAACtygAArcwAAK3OAACt0AAArdMAAK3UAACt1QAArdYAAK3XAACt2QAArdsAAK3cAACt3QAArd8AAK3gAACuHwAAriEAAK4jAACuJQAArigAAK4pAACuKgAArisAAK4sAACuLgAArjAAAK4xAACuMgAArjQAAK41AACuQgAArlUAAK5XAACuWgAArl0AAK5gAACuYwAArmUAAK5nAACuagAArm0AAK6AAACugwAAroYAAK6JAACujAAAro8AAK6SAACulQAArpgAAK6bAACunQAArqsAAK60AACuvgAArtYAAK7xAACvAwAAr04AAK9xAACvkQAAr7EAAK+zAACvtQAAr7cAAK+5AACvvAAAr70AAK++AACvwQAAr8IAAK/EAACvxQAAr8cAAK/JAACvygAAr8sAAK/OAACvzwAAr9QAAK/hAACv5gAAr+gAAK/qAACv7wAAr/IAAK/1AACv9wAAsBwAALBAAACwZwAAsIsAALCOAACwkAAAsJIAALCUAACwlgAAsJgAALCZAACwnAAAsKkAALC6AACwvAAAsL4AALDAAACwwgAAsMQAALDGAACwyAAAsMoAALDbAACw3gAAsOEAALDkAACw5wAAsOoAALDtAACw8AAAsPMAALD1AACxNAAAsTYAALE4AACxOgAAsT0AALE+AACxPwAAsUAAALFBAACxQwAAsUUAALFGAACxRwAAsUkAALFKAACxiQAAsYsAALGNAACxjwAAsZIAALGTAACxlAAAsZUAALGWAACxmAAAsZoAALGbAACxnAAAsZ4AALGfAACx3gAAseAAALHjAACx5QAAsegAALHpAACx6gAAsesAALHsAACx7gAAsfAAALHxAACx8gAAsfQAALH1AACyAgAAsgMAALIEAACyBgAAskUAALJHAACySQAAsksAALJOAACyTwAAslAAALJRAACyUgAAslQAALJWAACyVwAAslgAALJaAACyWwAAspoAALKcAACyngAAsqAAALKjAACypAAAsqUAALKmAACypwAAsqkAALKrAACyrAAAsq0AALKvAACysAAAsu8AALLxAACy8wAAsvUAALL4AACy+QAAsvoAALL7AACy/AAAsv4AALMAAACzAQAAswIAALMEAACzBQAAs0QAALNGAACzSAAAs0oAALNNAACzTgAAs08AALNQAACzUQAAs1MAALNVAACzVgAAs1cAALNZAACzWgAAs5kAALObAACznQAAs58AALOiAACzowAAs6QAALOlAACzpgAAs6gAALOqAACzqwAAs6wAALOuAACzrwAAs9QAALP4AAC0HwAAtEMAALRGAAC0SAAAtEoAALRMAAC0TgAAtFAAALRRAAC0VAAAtGEAALRwAAC0cgAAtHQAALR2AAC0eAAAtHoAALR8AAC0fgAAtI0AALSQAAC0kwAAtJYAALSZAAC0nAAAtJ8AALSiAAC0pAAAtOMAALTlAAC05wAAtOkAALTsAAC07QAAtO4AALTvAAC08AAAtPIAALT0AAC09QAAtPYAALT4AAC0+QAAtTgAALU6AAC1PAAAtT4AALVBAAC1QgAAtUMAALVEAAC1RQAAtUcAALVJAAC1SgAAtUsAALVNAAC1TgAAtY0AALWPAAC1kQAAtZMAALWWAAC1lwAAtZgAALWZAAC1mgAAtZwAALWeAAC1nwAAtaAAALWiAAC1owAAteIAALXkAAC15gAAtegAALXrAAC17AAAte0AALXuAAC17wAAtfEAALXzAAC19AAAtfUAALX3AAC1+AAAtjcAALY5AAC2OwAAtj0AALZAAAC2QQAAtkIAALZDAAC2RAAAtkYAALZIAAC2SQAAtkoAALZMAAC2TQAAtowAALaOAAC2kAAAtpIAALaVAAC2lgAAtpcAALaYAAC2mQAAtpsAALadAAC2ngAAtp8AALahAAC2ogAAtuEAALbjAAC25QAAtucAALbqAAC26wAAtuwAALbtAAC27gAAtvAAALbyAAC28wAAtvQAALb2AAC29wAAt0IAALdlAAC3hQAAt6UAALenAAC3qQAAt6sAALetAAC3sAAAt7EAALeyAAC3tQAAt7YAALe4AAC3uQAAt7sAALe+AAC3vwAAt8AAALfDAAC3xAAAt8kAALfWAAC32wAAt90AALffAAC35AAAt+cAALfqAAC37AAAuBEAALg1AAC4XAAAuIAAALiDAAC4hQAAuIcAALiJAAC4iwAAuI0AALiOAAC4kQAAuJ4AALivAAC4sQAAuLMAALi1AAC4twAAuLkAALi7AAC4vQAAuL8AALjQAAC40wAAuNYAALjZAAC43AAAuN8AALjiAAC45QAAuOgAALjqAAC5KQAAuSsAALktAAC5LwAAuTIAALkzAAC5NAAAuTUAALk2AAC5OAAAuToAALk7AAC5PAAAuT4AALk/AAC5fgAAuYAAALmCAAC5hAAAuYcAALmIAAC5iQAAuYoAALmLAAC5jQAAuY8AALmQAAC5kQAAuZMAALmUAAC50wAAudUAALnYAAC52gAAud0AALneAAC53wAAueAAALnhAAC54wAAueUAALnmAAC55wAAuekAALnqAAC59wAAufgAALn5AAC5+wAAujoAALo8AAC6PgAAukAAALpDAAC6RAAAukUAALpGAAC6RwAAukkAALpLAAC6TAAAuk0AALpPAAC6UAAAuo8AALqRAAC6kwAAupUAALqYAAC6mQAAupoAALqbAAC6nAAAup4AALqgAAC6oQAAuqIAALqkAAC6pQAAuuQAALrmAAC66AAAuuoAALrtAAC67gAAuu8AALrwAAC68QAAuvMAALr1AAC69gAAuvcAALr5AAC6+gAAuzkAALs7AAC7PQAAuz8AALtCAAC7QwAAu0QAALtFAAC7RgAAu0gAALtKAAC7SwAAu0wAALtOAAC7TwAAu44AALuQAAC7kgAAu5QAALuXAAC7mAAAu5kAALuaAAC7mwAAu50AALufAAC7oAAAu6EAALujAAC7pAAAu8kAALvtAAC8FAAAvDgAALw7AAC8PQAAvD8AALxBAAC8QwAAvEUAALxGAAC8SQAAvFYAALxlAAC8ZwAAvGkAALxrAAC8bQAAvG8AALxxAAC8cwAAvIIAALyFAAC8iAAAvIsAALyOAAC8kQAAvJQAALyXAAC8mQAAvNgAALzaAAC83AAAvN4AALzhAAC84gAAvOMAALzkAAC85QAAvOcAALzpAAC86gAAvOsAALztAAC87gAAvS0AAL0vAAC9MQAAvTMAAL02AAC9NwAAvTgAAL05AAC9OgAAvTwAAL0+AAC9PwAAvUAAAL1CAAC9QwAAvYIAAL2EAAC9hgAAvYgAAL2LAAC9jAAAvY0AAL2OAAC9jwAAvZEAAL2TAAC9lAAAvZUAAL2XAAC9mAAAvdcAAL3ZAAC92wAAvd0AAL3gAAC94QAAveIAAL3jAAC95AAAveYAAL3oAAC96QAAveoAAL3sAAC97QAAviwAAL4uAAC+MAAAvjIAAL41AAC+NgAAvjcAAL44AAC+OQAAvjsAAL49AAC+PgAAvj8AAL5BAAC+QgAAvoEAAL6DAAC+hQAAvocAAL6KAAC+iwAAvowAAL6NAAC+jgAAvpAAAL6SAAC+kwAAvpQAAL6WAAC+lwAAvtYAAL7YAAC+2gAAvtwAAL7fAAC+4AAAvuEAAL7iAAC+4wAAvuUAAL7nAAC+6AAAvukAAL7rAAC+7AAAvzcAAL9aAAC/egAAv5oAAL+cAAC/ngAAv6AAAL+iAAC/pQAAv6YAAL+nAAC/qgAAv6sAAL+tAAC/rgAAv7AAAL+zAAC/tAAAv7UAAL+4AAC/uQAAv8IAAL/PAAC/1AAAv9YAAL/YAAC/3QAAv+AAAL/jAAC/5QAAwAoAAMAuAADAVQAAwHkAAMB8AADAfgAAwIAAAMCCAADAhAAAwIYAAMCHAADAigAAwJcAAMCoAADAqgAAwKwAAMCuAADAsAAAwLIAAMC0AADAtgAAwLgAAMDJAADAzAAAwM8AAMDSAADA1QAAwNgAAMDbAADA3gAAwOEAAMDjAADBIgAAwSQAAMEmAADBKAAAwSsAAMEsAADBLQAAwS4AAMEvAADBMQAAwTMAAME0AADBNQAAwTcAAME4AADBdwAAwXkAAMF7AADBfQAAwYAAAMGBAADBggAAwYMAAMGEAADBhgAAwYgAAMGJAADBigAAwYwAAMGNAADBzAAAwc4AAMHRAADB0wAAwdYAAMHXAADB2AAAwdkAAMHaAADB3AAAwd4AAMHfAADB4AAAweIAAMHjAADB8AAAwfEAAMHyAADB9AAAwjMAAMI1AADCNwAAwjkAAMI8AADCPQAAwj4AAMI/AADCQAAAwkIAAMJEAADCRQAAwkYAAMJIAADCSQAAwogAAMKKAADCjAAAwo4AAMKRAADCkgAAwpMAAMKUAADClQAAwpcAAMKZAADCmgAAwpsAAMKdAADCngAAwt0AAMLfAADC4QAAwuMAAMLmAADC5wAAwugAAMLpAADC6gAAwuwAAMLuAADC7wAAwvAAAMLyAADC8wAAwzIAAMM0AADDNgAAwzgAAMM7AADDPAAAwz0AAMM+AADDPwAAw0EAAMNDAADDRAAAw0UAAMNHAADDSAAAw4cAAMOJAADDiwAAw40AAMOQAADDkQAAw5IAAMOTAADDlAAAw5YAAMOYAADDmQAAw5oAAMOcAADDnQAAw8IAAMPmAADEDQAAxDEAAMQ0AADENgAAxDgAAMQ6AADEPAAAxD4AAMQ/AADEQgAAxE8AAMReAADEYAAAxGIAAMRkAADEZgAAxGgAAMRqAADEbAAAxHsAAMR+AADEgQAAxIQAAMSHAADEigAAxI0AAMSQAADEkgAAxNEAAMTTAADE1QAAxNcAAMTaAADE2wAAxNwAAMTdAADE3gAAxOAAAMTiAADE4wAAxOQAAMTmAADE5wAAxSYAAMUoAADFKgAAxSwAAMUvAADFMAAAxTEAAMUyAADFMwAAxTUAAMU3AADFOAAAxTkAAMU7AADFPAAAxXsAAMV9AADFfwAAxYEAAMWEAADFhQAAxYYAAMWHAADFiAAAxYoAAMWMAADFjQAAxY4AAMWQAADFkQAAxdAAAMXSAADF1AAAxdYAAMXZAADF2gAAxdsAAMXcAADF3QAAxd8AAMXhAADF4gAAxeMAAMXlAADF5gAAxiUAAMYnAADGKQAAxisAAMYuAADGLwAAxjAAAMYxAADGMgAAxjQAAMY2AADGNwAAxjgAAMY6AADGOwAAxnoAAMZ8AADGfgAAxoAAAMaDAADGhAAAxoUAAMaGAADGhwAAxokAAMaLAADGjAAAxo0AAMaPAADGkAAAxs8AAMbRAADG0wAAxtUAAMbYAADG2QAAxtoAAMbbAADG3AAAxt4AAMbgAADG4QAAxuIAAMbkAADG5QAAxzAAAMdTAADHcwAAx5MAAMeVAADHlwAAx5kAAMebAADHngAAx58AAMegAADHowAAx6QAAMemAADHpwAAx6kAAMesAADHrQAAx64AAMexAADHsgAAx7cAAMfEAADHyQAAx8sAAMfNAADH0gAAx9UAAMfYAADH2gAAx/8AAMgjAADISgAAyG4AAMhxAADIcwAAyHUAAMh3AADIeQAAyHsAAMh8AADIfwAAyIwAAMidAADInwAAyKEAAMijAADIpQAAyKcAAMipAADIqwAAyK0AAMi+AADIwQAAyMQAAMjHAADIygAAyM0AAMjQAADI0wAAyNYAAMjYAADJFwAAyRkAAMkbAADJHQAAySAAAMkhAADJIgAAySMAAMkkAADJJgAAySgAAMkpAADJKgAAySwAAMktAADJbAAAyW4AAMlwAADJcgAAyXUAAMl2AADJdwAAyXgAAMl5AADJewAAyX0AAMl+AADJfwAAyYEAAMmCAADJwQAAycMAAMnGAADJyAAAycsAAMnMAADJzQAAyc4AAMnPAADJ0QAAydMAAMnUAADJ1QAAydcAAMnYAADJ5QAAyeYAAMnnAADJ6QAAyigAAMoqAADKLAAAyi4AAMoxAADKMgAAyjMAAMo0AADKNQAAyjcAAMo5AADKOgAAyjsAAMo9AADKPgAAyn0AAMp/AADKgQAAyoMAAMqGAADKhwAAyogAAMqJAADKigAAyowAAMqOAADKjwAAypAAAMqSAADKkwAAytIAAMrUAADK1gAAytgAAMrbAADK3AAAyt0AAMreAADK3wAAyuEAAMrjAADK5AAAyuUAAMrnAADK6AAAyycAAMspAADLKwAAyy0AAMswAADLMQAAyzIAAMszAADLNAAAyzYAAMs4AADLOQAAyzoAAMs8AADLPQAAy3wAAMt+AADLgAAAy4IAAMuFAADLhgAAy4cAAMuIAADLiQAAy4sAAMuNAADLjgAAy48AAMuRAADLkgAAy7cAAMvbAADMAgAAzCYAAMwpAADMKwAAzC0AAMwvAADMMQAAzDMAAMw0AADMNwAAzEQAAMxTAADMVQAAzFcAAMxZAADMWwAAzF0AAMxfAADMYQAAzHAAAMxzAADMdgAAzHkAAMx8AADMfwAAzIIAAMyFAADMhwAAzMYAAMzIAADMygAAzMwAAMzPAADM0AAAzNEAAMzSAADM0wAAzNUAAMzXAADM2AAAzNkAAMzbAADM3AAAzRsAAM0dAADNHwAAzSEAAM0kAADNJQAAzSYAAM0nAADNKAAAzSoAAM0sAADNLQAAzS4AAM0wAADNMQAAzXAAAM1yAADNdAAAzXYAAM15AADNegAAzXsAAM18AADNfQAAzX8AAM2BAADNggAAzYMAAM2FAADNhgAAzcUAAM3HAADNyQAAzcsAAM3OAADNzwAAzdAAAM3RAADN0gAAzdQAAM3WAADN1wAAzdgAAM3aAADN2wAAzhoAAM4cAADOHgAAziAAAM4jAADOJAAAziUAAM4mAADOJwAAzikAAM4rAADOLAAAzi0AAM4vAADOMAAAzm8AAM5xAADOcwAAznUAAM54AADOeQAAznoAAM57AADOfAAAzn4AAM6AAADOgQAAzoIAAM6EAADOhQAAzsQAAM7GAADOyAAAzsoAAM7NAADOzgAAzs8AAM7QAADO0QAAztMAAM7VAADO1gAAztcAAM7ZAADO2gAAzyUAAM9IAADPaAAAz4gAAM+KAADPjAAAz44AAM+QAADPkwAAz5QAAM+VAADPmAAAz5kAAM+bAADPnAAAz58AAM+iAADPowAAz6QAAM+nAADPqAAAz7EAAM++AADPwwAAz8UAAM/IAADPzQAAz9AAAM/TAADP1QAAz/oAANAeAADQRQAA0GkAANBsAADQbgAA0HAAANByAADQdAAA0HYAANB3AADQegAA0IcAANCYAADQmgAA0JwAANCeAADQoAAA0KIAANCkAADQpgAA0KgAANC5AADQvAAA0L8AANDCAADQxQAA0MgAANDLAADQzgAA0NEAANDTAADREgAA0RQAANEWAADRGAAA0RsAANEcAADRHQAA0R4AANEfAADRIQAA0SMAANEkAADRJQAA0ScAANEoAADRZwAA0WkAANFrAADRbQAA0XAAANFxAADRcgAA0XMAANF0AADRdgAA0XgAANF5AADRegAA0XwAANF9AADRvAAA0b4AANHBAADRwwAA0cYAANHHAADRyAAA0ckAANHKAADRzAAA0c4AANHPAADR0AAA0dIAANHTAADR4AAA0eEAANHiAADR5AAA0iMAANIlAADSJwAA0ikAANIsAADSLQAA0i4AANIvAADSMAAA0jIAANI0AADSNQAA0jYAANI4AADSOQAA0ngAANJ6AADSfAAA0n4AANKBAADSggAA0oMAANKEAADShQAA0ocAANKJAADSigAA0osAANKNAADSjgAA0s0AANLPAADS0QAA0tMAANLWAADS1wAA0tgAANLZAADS2gAA0twAANLeAADS3wAA0uAAANLiAADS4wAA0yIAANMkAADTJgAA0ygAANMrAADTLAAA0y0AANMuAADTLwAA0zEAANMzAADTNAAA0zUAANM3AADTOAAA03cAANN5AADTewAA030AANOAAADTgQAA04IAANODAADThAAA04YAANOIAADTiQAA04oAANOMAADTjQAA07IAANPWAADT/QAA1CEAANQkAADUJwAA1CkAANQrAADULQAA1C8AANQwAADUMwAA1EAAANRPAADUUgAA1FUAANRYAADUWwAA1F4AANRhAADUZAAA1HMAANR2AADUeQAA1HwAANR/AADUggAA1IUAANSIAADUigAA1MkAANTLAADUzgAA1NAAANTTAADU1AAA1NUAANTWAADU1wAA1NkAANTcAADU3QAA1N4AANTgAADU4QAA1SAAANUiAADVJQAA1ScAANUqAADVKwAA1SwAANUtAADVLgAA1TAAANUzAADVNAAA1TUAANU3AADVOAAA1ToAANV5AADVewAA1X4AANWAAADVgwAA1YQAANWFAADVhgAA1YcAANWJAADVjAAA1Y0AANWOAADVkAAA1ZEAANXQAADV0gAA1dUAANXXAADV2gAA1dsAANXcAADV3QAA1d4AANXgAADV4wAA1eQAANXlAADV5wAA1egAANYnAADWKQAA1isAANYtAADWMAAA1jEAANYyAADWMwAA1jQAANY2AADWOQAA1joAANY7AADWPQAA1j4AANZ9AADWfwAA1oEAANaDAADWhgAA1ocAANaIAADWiQAA1ooAANaMAADWjwAA1pAAANaRAADWkwAA1pQAANbTAADW1QAA1tgAANbaAADW3QAA1t4AANbfAADW4AAA1uEAANbjAADW5gAA1ucAANboAADW6gAA1usAANc2AADXWQAA13kAANeZAADXmwAA150AANefAADXoQAA16QAANelAADXpgAA16kAANeqAADXrAAA160AANevAADXsQAA17IAANezAADXtgAA17cAANe8AADXyQAA184AANfQAADX0gAA19cAANfaAADX3QAA198AANgEAADYKAAA2E8AANhzAADYdgAA2HgAANh6AADYfAAA2H4AANiAAADYgQAA2IQAANiRAADYogAA2KQAANimAADYqAAA2KoAANisAADYrgAA2LAAANiyAADYwwAA2MYAANjJAADYzAAA2M8AANjSAADY1QAA2NgAANjbAADY3QAA2RwAANkeAADZIAAA2SIAANklAADZJgAA2ScAANkoAADZKQAA2SsAANktAADZLgAA2S8AANkxAADZMgAA2XEAANlzAADZdQAA2XcAANl6AADZewAA2XwAANl9AADZfgAA2YAAANmCAADZgwAA2YQAANmGAADZhwAA2cYAANnIAADZywAA2c0AANnQAADZ0QAA2dIAANnTAADZ1AAA2dYAANnYAADZ2QAA2doAANncAADZ3QAA2eoAANnrAADZ7AAA2e4AANotAADaLwAA2jEAANozAADaNgAA2jcAANo4AADaOQAA2joAANo8AADaPgAA2j8AANpAAADaQgAA2kMAANqCAADahAAA2oYAANqIAADaiwAA2owAANqNAADajgAA2o8AANqRAADakwAA2pQAANqVAADalwAA2pgAANrXAADa2QAA2tsAANrdAADa4AAA2uEAANriAADa4wAA2uQAANrmAADa6AAA2ukAANrqAADa7AAA2u0AANssAADbLgAA2zAAANsyAADbNQAA2zYAANs3AADbOAAA2zkAANs7AADbPQAA2z4AANs/AADbQQAA20IAANuBAADbgwAA24UAANuHAADbigAA24sAANuMAADbjQAA244AANuQAADbkgAA25MAANuUAADblgAA25cAANu8AADb4AAA3AcAANwrAADcLgAA3DAAANwyAADcNAAA3DYAANw4AADcOQAA3DwAANxJAADcWAAA3FoAANxcAADcXgAA3GAAANxiAADcZAAA3GYAANx1AADceAAA3HsAANx+AADcgQAA3IQAANyHAADcigAA3IwAANzLAADczQAA3M8AANzRAADc1AAA3NUAANzWAADc1wAA3NgAANzaAADc3AAA3N0AANzeAADc4AAA3OEAAN0gAADdIgAA3SQAAN0mAADdKQAA3SoAAN0rAADdLAAA3S0AAN0vAADdMQAA3TIAAN0zAADdNQAA3TYAAN11AADddwAA3XkAAN17AADdfgAA3X8AAN2AAADdgQAA3YIAAN2EAADdhgAA3YcAAN2IAADdigAA3YsAAN3KAADdzAAA3c4AAN3QAADd0wAA3dQAAN3VAADd1gAA3dcAAN3ZAADd2wAA3dwAAN3dAADd3wAA3eAAAN4fAADeIQAA3iMAAN4lAADeKAAA3ikAAN4qAADeKwAA3iwAAN4uAADeMAAA3jEAAN4yAADeNAAA3jUAAN50AADedgAA3ngAAN56AADefQAA3n4AAN5/AADegAAA3oEAAN6DAADehQAA3oYAAN6HAADeiQAA3ooAAN7JAADeywAA3s0AAN7PAADe0gAA3tMAAN7UAADe1QAA3tYAAN7YAADe2gAA3tsAAN7cAADe3gAA3t8AAN8qAADfTQAA320AAN+NAADfjwAA35EAAN+TAADflQAA35gAAN+ZAADfmgAA350AAN+eAADfoAAA36EAAN+jAADfpQAA36YAAN+nAADfqgAA36sAAN+0AADfwQAA38YAAN/IAADfygAA388AAN/SAADf1QAA39cAAN/8AADgIAAA4EcAAOBrAADgbgAA4HAAAOByAADgdAAA4HYAAOB4AADgeQAA4HwAAOCJAADgmgAA4JwAAOCeAADgoAAA4KIAAOCkAADgpgAA4KgAAOCqAADguwAA4L4AAODBAADgxAAA4McAAODKAADgzQAA4NAAAODTAADg1QAA4RQAAOEWAADhGAAA4RoAAOEdAADhHgAA4R8AAOEgAADhIQAA4SMAAOElAADhJgAA4ScAAOEpAADhKgAA4WkAAOFrAADhbQAA4W8AAOFyAADhcwAA4XQAAOF1AADhdgAA4XgAAOF6AADhewAA4XwAAOF+AADhfwAA4b4AAOHAAADhwwAA4cUAAOHIAADhyQAA4coAAOHLAADhzAAA4c4AAOHQAADh0QAA4dIAAOHUAADh1QAA4eIAAOHjAADh5AAA4eYAAOIlAADiJwAA4ikAAOIrAADiLgAA4i8AAOIwAADiMQAA4jIAAOI0AADiNgAA4jcAAOI4AADiOgAA4jsAAOJ6AADifAAA4n4AAOKAAADigwAA4oQAAOKFAADihgAA4ocAAOKJAADiiwAA4owAAOKNAADijwAA4pAAAOLPAADi0QAA4tMAAOLVAADi2AAA4tkAAOLaAADi2wAA4twAAOLeAADi4AAA4uEAAOLiAADi5AAA4uUAAOMkAADjJgAA4ygAAOMqAADjLQAA4y4AAOMvAADjMAAA4zEAAOMzAADjNQAA4zYAAOM3AADjOQAA4zoAAON5AADjewAA430AAON/AADjggAA44MAAOOEAADjhQAA44YAAOOIAADjigAA44sAAOOMAADjjgAA448AAOO0AADj2AAA4/8AAOQjAADkJgAA5CgAAOQqAADkLAAA5C4AAOQwAADkMQAA5DQAAORBAADkUAAA5FIAAORUAADkVgAA5FgAAORaAADkXAAA5F4AAORtAADkcAAA5HMAAOR2AADkeQAA5HwAAOR/AADkggAA5IQAAOTDAADkxQAA5McAAOTJAADkzAAA5M0AAOTOAADkzwAA5NAAAOTSAADk1AAA5NUAAOTWAADk2AAA5NkAAOUYAADlGgAA5RwAAOUeAADlIQAA5SIAAOUjAADlJAAA5SUAAOUnAADlKQAA5SoAAOUrAADlLQAA5S4AAOVtAADlbwAA5XEAAOVzAADldgAA5XcAAOV4AADleQAA5XoAAOV8AADlfgAA5X8AAOWAAADlggAA5YMAAOXCAADlxAAA5cYAAOXIAADlywAA5cwAAOXNAADlzgAA5c8AAOXRAADl0wAA5dQAAOXVAADl1wAA5dgAAOYXAADmGQAA5hsAAOYdAADmIAAA5iEAAOYiAADmIwAA5iQAAOYmAADmKAAA5ikAAOYqAADmLAAA5i0AAOZsAADmbgAA5nAAAOZyAADmdQAA5nYAAOZ3AADmeAAA5nkAAOZ7AADmfQAA5n4AAOZ/AADmgQAA5oIAAObBAADmwwAA5sUAAObHAADmygAA5ssAAObMAADmzQAA5s4AAObQAADm0gAA5tMAAObUAADm1gAA5tcAAOciAADnRQAA52UAAOeFAADnhwAA54kAAOeLAADnjQAA55AAAOeRAADnkgAA55UAAOeWAADnmAAA55kAAOebAADnngAA558AAOegAADnowAA56QAAOepAADntgAA57sAAOe9AADnvwAA58QAAOfHAADnygAA58wAAOfxAADoFQAA6DwAAOhgAADoYwAA6GUAAOhnAADoaQAA6GsAAOhtAADobgAA6HEAAOh+AADojwAA6JEAAOiTAADolQAA6JcAAOiZAADomwAA6J0AAOifAADosAAA6LMAAOi2AADouQAA6LwAAOi/AADowgAA6MUAAOjIAADoygAA6QkAAOkLAADpDQAA6Q8AAOkSAADpEwAA6RQAAOkVAADpFgAA6RgAAOkaAADpGwAA6RwAAOkeAADpHwAA6V4AAOlgAADpYgAA6WQAAOlnAADpaAAA6WkAAOlqAADpawAA6W0AAOlvAADpcAAA6XEAAOlzAADpdAAA6bMAAOm1AADpuAAA6boAAOm9AADpvgAA6b8AAOnAAADpwQAA6cMAAOnFAADpxgAA6ccAAOnJAADpygAA6dcAAOnYAADp2QAA6dsAAOoaAADqHAAA6h4AAOogAADqIwAA6iQAAOolAADqJgAA6icAAOopAADqKwAA6iwAAOotAADqLwAA6jAAAOpvAADqcQAA6nMAAOp1AADqeAAA6nkAAOp6AADqewAA6nwAAOp+AADqgAAA6oEAAOqCAADqhAAA6oUAAOrEAADqxgAA6sgAAOrKAADqzQAA6s4AAOrPAADq0AAA6tEAAOrTAADq1QAA6tYAAOrXAADq2QAA6toAAOsZAADrGwAA6x0AAOsfAADrIgAA6yMAAOskAADrJQAA6yYAAOsoAADrKgAA6ysAAOssAADrLgAA6y8AAOtuAADrcAAA63IAAOt0AADrdwAA63gAAOt5AADregAA63sAAOt9AADrfwAA64AAAOuBAADrgwAA64QAAOupAADrzQAA6/QAAOwYAADsGwAA7B0AAOwfAADsIQAA7CMAAOwlAADsJgAA7CkAAOw2AADsRQAA7EcAAOxJAADsSwAA7E0AAOxPAADsUQAA7FMAAOxiAADsZQAA7GgAAOxrAADsbgAA7HEAAOx0AADsdwAA7HkAAOy4AADsugAA7LwAAOy+AADswQAA7MIAAOzDAADsxAAA7MUAAOzHAADsyQAA7MoAAOzLAADszQAA7M4AAO0NAADtDwAA7REAAO0TAADtFgAA7RcAAO0YAADtGQAA7RoAAO0cAADtHgAA7R8AAO0gAADtIgAA7SMAAO1iAADtZAAA7WYAAO1oAADtawAA7WwAAO1tAADtbgAA7W8AAO1xAADtcwAA7XQAAO11AADtdwAA7XgAAO23AADtuQAA7bsAAO29AADtwAAA7cEAAO3CAADtwwAA7cQAAO3GAADtyAAA7ckAAO3KAADtzAAA7c0AAO4MAADuDgAA7hAAAO4SAADuFQAA7hYAAO4XAADuGAAA7hkAAO4bAADuHQAA7h4AAO4fAADuIQAA7iIAAO5hAADuYwAA7mUAAO5nAADuagAA7msAAO5sAADubQAA7m4AAO5wAADucgAA7nMAAO50AADudgAA7ncAAO62AADuuAAA7roAAO68AADuvwAA7sAAAO7BAADuwgAA7sMAAO7FAADuxwAA7sgAAO7JAADuywAA7swAAO8XAADvOgAA71oAAO96AADvfAAA734AAO+AAADvggAA74UAAO+GAADvhwAA74oAAO+LAADvjQAA744AAO+QAADvkwAA75QAAO+VAADvmAAA75kAAO+eAADvqwAA77AAAO+yAADvtAAA77kAAO+8AADvvwAA78EAAO/mAADwCgAA8DEAAPBVAADwWAAA8FoAAPBcAADwXgAA8GAAAPBiAADwYwAA8GYAAPBzAADwhAAA8IYAAPCIAADwigAA8IwAAPCOAADwkAAA8JIAAPCUAADwpQAA8KgAAPCrAADwrgAA8LEAAPC0AADwtwAA8LoAAPC9AADwvwAA8P4AAPEAAADxAgAA8QQAAPEHAADxCAAA8QkAAPEKAADxCwAA8Q0AAPEPAADxEAAA8REAAPETAADxFAAA8VMAAPFVAADxVwAA8VkAAPFcAADxXQAA8V4AAPFfAADxYAAA8WIAAPFkAADxZQAA8WYAAPFoAADxaQAA8agAAPGqAADxrQAA8a8AAPGyAADxswAA8bQAAPG1AADxtgAA8bg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AAQO5AAEDuwABA70AAQO+AAEDvwABA8EAAQPCAAEDywABA8wAAQPOAAEEDQABBA8AAQQRAAEEEwABBBYAAQQXAAEEGAABBBkAAQQaAAEEHAABBB4AAQQfAAEEIAABBCIAAQQjAAEEYgABBGQAAQRnAAEEaQABBGwAAQRtAAEEbgABBG8AAQRwAAEEcgABBHQAAQR1AAEEdgABBHgAAQR5AAEEhgABBIcAAQSIAAEEigABBMkAAQTLAAEEzQABBM8AAQTSAAEE0wABBNQAAQTVAAEE1gABBNgAAQTaAAEE2wABBNwAAQTeAAEE3wABBR4AAQUgAAEFIgABBSQAAQUnAAEFKAABBSkAAQUqAAEFKwABBS0AAQUvAAEFMAABBTEAAQUzAAEFNAABBUEAAQVYAAEFWwABBV0AAQVgAAEFYwABBWYAAQVpAAEFbAABBW8AAQVxAAEFcwABBXYAAQWNAAEFkAABBZMAAQWWAAEFmQABBZwAAQWfAAEFogABBaUAAQWoAAEFqwABBa4AAQWwAAEFvgABBcYAAQXQAAEF2gABBeMAAQXsAAEF/gABBgwAAQZXAAEGegABBpoAAQa6AAEGvAABBr4AAQbAAAEGwgABBsUAAQbGAAEGxwABBsoAAQbLAAEGzQABBs4AAQbQAAEG0wABBtQAAQbVAAEG2AABBtkAAQbeAAEG6wABBvAAAQbyAAEG9AABBvkAAQb8AAEG/wABBwEAAQcmAAEHSgABB3EAAQeVAAEHmAABB5oAAQecAAEHngABB6AAAQeiAAEHowABB6YAAQezAAEHxAABB8YAAQfIAAEHygABB8wAAQfOAAEH0AABB9IAAQfUAAEH5QABB+gAAQfrAAEH7gABB/EAAQf0AAEH9wABB/oAAQf9AAEH/wABCD4AAQhAAAEIQgABCEQAAQhHAAEISAABCEkAAQhKAAEISwABCE0AAQhPAAEIUAABCFEAAQhTAAEIVAABCJMAAQiVAAEIlwABCJkAAQicAAEInQABCJ4AAQifAAEIoAABCKIAAQikAAEIpQABCKYAAQioAAEIqQABCOgAAQjqAAEI7QABCO8AAQjyAAEI8wABCPQAAQj1AAEI9gABCPgAAQj6AAEI+wABCPwAAQj+AAEI/wABCQwAAQkNAAEJDgABCRAAAQlPAAEJUQABCVMAAQlVAAEJWAABCVkAAQlaAAEJWwABCVwAAQleAAEJYAABCWEAAQliAAEJZAABCWUAAQmkAAEJpgABCagAAQmqAAEJrQABCa4AAQmvAAEJsAABCbEAAQmzAAEJtQABCbYAAQm3AAEJuQABCboAAQn5AAEJ+wABCf0AAQn/AAEKAgABCgMAAQoEAAEKBQABCgYAAQoIAAEKCgABCgsAAQoMAAEKDgABCg8AAQpOAAEKUAABClIAAQpUAAEKVwABClgAAQpZAAEKWgABClsAAQpdAAEKXwABCmAAAQphAAEKYwABCmQAAQqjAAEKpQABCqcAAQqpAAEKrAABCq0AAQquAAEKrwABCrAAAQqyAAEKtAABCrUAAQq2AAEKuAABCrkAAQreAAELAgABCykAAQtNAAELUAABC1IAAQtUAAELVgABC1gAAQtaAAELWwABC14AAQtrAAELegABC3wAAQt+AAELgAABC4IAAQuEAAELhgABC4gAAQuXAAELmgABC50AAQugAAELowABC6YAAQupAAELrAABC64AAQvtAAEL7wABC/EAAQvzAAEL9gABC/cAAQv4AAEL+QABC/oAAQv8AAEL/gABC/8AAQwAAAEMAgABDAMAAQxCAAEMRAABDEYAAQxIAAEMSwABDEwAAQxNAAEMTgABDE8AAQxRAAEMUwABDFQAAQxVAAEMVwABDFgAAQyXAAEMmQABDJsAAQydAAEMoAABDKEAAQyiAAEMowABDKQAAQymAAEMqAABDKkAAQyqAAEMrAABDK0AAQzsAAEM7gABDPAAAQzyAAEM9QABDPYAAQz3AAEM+AABDPkAAQz7AAEM/QABDP4AAQz/AAENAQABDQIAAQ1BAAENQwABDUUAAQ1HAAENSgABDUsAAQ1MAAENTQABDU4AAQ1QAAENUgABDVMAAQ1UAAENVgABDVcAAQ2WAAENmAABDZoAAQ2cAAENnwABDaAAAQ2hAAENogABDaMAAQ2lAAENpwABDagAAQ2pAAENqwABDawAAQ3rAAEN7QABDe8AAQ3xAAEN9AABDfUAAQ32AAEN9wABDfgAAQ36AAEN/AABDf0AAQ3+AAEOAAABDgEAAQ5MAAEObwABDo8AAQ6vAAEOsQABDrMAAQ61AAEOtwABDroAAQ67AAEOvAABDr8AAQ7AAAEOwgABDsMAAQ7FAAEOxwABDsgAAQ7JAAEOzAABDs0AAQ7SAAEO3wABDuQAAQ7mAAEO6AABDu0AAQ7wAAEO8wABDvUAAQ8aAAEPPgABD2UAAQ+JAAEPjAABD44AAQ+QAAEPkgABD5QAAQ+WAAEPlwABD5oAAQ+nAAEPuAABD7oAAQ+8AAEPvgABD8AAAQ/CAAEPxAABD8YAAQ/IAAEP2QABD9wAAQ/fAAEP4gABD+UAAQ/oAAEP6wABD+4AAQ/xAAEP8wABEDIAARA0AAEQNgABEDgAARA7AAEQPAABED0AARA+AAEQPwABEEEAARBDAAEQRAABEEUAARBHAAEQSAABEIcAARCJAAEQiwABEI0AARCQAAEQkQABEJIAARCTAAEQlAABEJYAARCYAAEQmQABEJoAARCcAAEQnQABENwAARDeAAEQ4QABEOMAARDmAAEQ5wABEOgAARDpAAEQ6gABEOwAARDuAAEQ7wABEPAAARDyAAEQ8wABEQAAAREBAAERAgABEQQAARFDAAERRQABEUcAARFJAAERTAABEU0AARFOAAERTwABEVAAARFSAAERVAABEVUAARFWAAERWAABEVkAARGYAAERmgABEZwAARGeAAERoQABEaIAARGjAAERpAABEaUAARGnAAERqQABEaoAARGrAAERrQABEa4AARHtAAER7wABEfEAARHzAAER9gABEfcAARH4AAER+QABEfoAARH8AAER/gABEf8AARIAAAESAgABEgMAARJCAAESRAABEkYAARJIAAESSwABEkwAARJNAAESTgABEk8AARJRAAESUwABElQAARJVAAESVwABElgAARKXAAESmQABEpsAARKdAAESoAABEqEAARKiAAESowABEqQAARKmAAESqAABEqkAARKqAAESrAABEq0AARLSAAES9gABEx0AARNBAAETRAABE0YAARNIAAETSgABE0wAARNOAAETTwABE1IAARNfAAETbgABE3AAARNyAAETdAABE3YAARN4AAETegABE3wAAROLAAETjgABE5EAAROUAAETlwABE5oAAROdAAEToAABE6IAARPhAAET4wABE+UAARPnAAET6gABE+sAARPsAAET7QABE+4AARPwAAET8gABE/MAARP0AAET9gABE/cAARQ2AAEUOAABFDoAARQ8AAEUPwABFEAAARRBAAEUQgABFEMAARRFAAEURwABFEgAARRJAAEUSwABFEwAARSLAAEUjQABFI8AARSRAAEUlAABFJUAARSWAAEUlwABFJgAARSaAAEUnAABFJ0AARSeAAEUoAABFKEAARTgAAEU4gABFOQAARTmAAEU6QABFOoAARTrAAEU7AABFO0AARTvAAEU8QABFPIAARTzAAEU9QABFPYAARU1AAEVNwABFTkAARU7AAEVPgABFT8AARVAAAEVQQABFUIAARVEAAEVRgABFUcAARVIAAEVSgABFUsAARWKAAEVjAABFY4AARWQAAEVkwABFZQAARWVAAEVlgABFZcAARWZAAEVmwABFZwAARWdAAEVnwABFaAAARXfAAEV4QABFeMAARXlAAEV6AABFekAARXqAAEV6wABFewAARXuAAEV8AABFfEAARXyAAEV9AABFfUAARZAAAEWYwABFoMAARajAAEWpQABFqcAARapAAEWqwABFq4AARavAAEWsAABFrMAARa0AAEWtgABFrcAARa5AAEWvAABFr0AARa+AAEWwQABFsIAARbHAAEW1AABFtkAARbbAAEW3QABFuIAARblAAEW6AABFuoAARcPAAEXMwABF1oAARd+AAEXgQABF4MAAReFAAEXhwABF4kAAReLAAEXjAABF48AARecAAEXrQABF68AARexAAEXswABF7UAARe3AAEXuQABF7sAARe9AAEXzgABF9EAARfUAAEX1wABF9oAARfdAAEX4AABF+MAARfmAAEX6AABGCcAARgpAAEYKwABGC0AARgwAAEYMQABGDIAARgzAAEYNAABGDYAARg4AAEYOQABGDoAARg8AAEYPQABGHwAARh+AAEYgAABGIIAARiFAAEYhgABGIcAARiIAAEYiQABGIsAARiNAAEYjgABGI8AARiRAAEYkgABGNEAARjTAAEY1gABGNgAARjbAAEY3AABGN0AARjeAAEY3wABGOEAARjjAAEY5AABGOUAARjnAAEY6AABGPUAARj2AAEY9wABGPkAARk4AAEZOgABGTwAARk+AAEZQQABGUIAARlDAAEZRAABGUUAARlHAAEZSQABGUoAARlLAAEZTQABGU4AARmNAAEZjwABGZEAARmTAAEZlgABGZcAARmYAAEZmQABGZoAARmcAAEZngABGZ8AARmgAAEZogABGaMAARniAAEZ5AABGeYAARnoAAEZ6wABGewAARntAAEZ7gABGe8AARnxAAEZ8wABGfQAARn1AAEZ9wABGfgAARo3AAEaOQABGjsAARo9AAEaQAABGkEAARpCAAEaQwABGkQAARpGAAEaSAABGkkAARpKAAEaTAABGk0AARqMAAEajgABGpAAARqSAAEalQABGpYAARqXAAEamAABGpkAARqbAAEanQABGp4AARqfAAEaoQABGqIAARrHAAEa6wABGxIAARs2AAEbOQABGzsAARs9AAEbPwABG0EAARtDAAEbRAABG0cAARtUAAEbYwABG2UAARtnAAEbaQABG2sAARttAAEbbwABG3EAARuAAAEbgwABG4YAARuJAAEbjAABG48AARuSAAEblQABG5cAARvWAAEb2AABG9oAARvcAAEb3wABG+AAARvhAAEb4gABG+MAARvlAAEb5wABG+gAARvpAAEb6wABG+wAARwrAAEcLQABHC8AARwxAAEcNAABHDUAARw2AAEcNwABHDgAARw6AAEcPAABHD0AARw+AAEcQAABHEEAARyAAAEcggABHIQAARyGAAEciQABHIoAARyLAAEcjAABHI0AARyPAAEckQABHJIAARyTAAEclQABHJYAARzVAAEc1wABHNkAARzbAAEc3gABHN8AARzgAAEc4QABHOIAARzkAAEc5gABHOcAARzoAAEc6gABHOsAAR0qAAEdLAABHS4AAR0wAAEdMwABHTQAAR01AAEdNgABHTcAAR05AAEdOwABHTwAAR09AAEdPwABHUAAAR1/AAEdgQABHYMAAR2FAAEdiAABHYkAAR2KAAEdiwABHYwAAR2OAAEdkAABHZEAAR2SAAEdlAABHZUAAR3UAAEd1gABHdgAAR3aAAEd3QABHd4AAR3fAAEd4AABHeEAAR3jAAEd5QABHeYAAR3nAAEd6QABHeoAAR41AAEeWAABHngAAR6YAAEemgABHpwAAR6eAAEeoAABHqMAAR6kAAEepQABHqgAAR6pAAEeqwABHqwAAR6uAAEesQABHrIAAR6zAAEetgABHrcAAR68AAEeyQABHs4AAR7QAAEe0gABHtcAAR7aAAEe3QABHt8AAR8EAAEfKAABH08AAR9zAAEfdgABH3gAAR96AAEffAABH34AAR+AAAEfgQABH4QAAR+RAAEfogABH6QAAR+mAAEfqAABH6oAAR+sAAEfrgABH7AAAR+yAAEfwwABH8YAAR/JAAEfzAABH88AAR/SAAEf1QABH9gAAR/bAAEf3QABIBwAASAeAAEgIAABICIAASAlAAEgJgABICcAASAoAAEgKQABICsAASAtAAEgLgABIC8AASAxAAEgMgABIHEAASBzAAEgdQABIHcAASB6AAEgewABIHwAASB9AAEgfgABIIAAASCCAAEggwABIIQAASCGAAEghwABIMYAASDIAAEgywABIM0AASDQAAEg0QABINIAASDTAAEg1AABINYAASDYAAEg2QABINoAASDcAAEg3QABIOoAASDrAAEg7AABIO4AASEtAAEhLwABITEAASEzAAEhNgABITcAASE4AAEhOQABIToAASE8AAEhPgABIT8AASFAAAEhQgABIUMAASGCAAEhhAABIYYAASGIAAEhiwABIYwAASGNAAEhjgABIY8AASGRAAEhkwABIZQAASGVAAEhlwABIZgAASHXAAEh2QABIdsAASHdAAEh4AABIeEAASHiAAEh4wABIeQAASHmAAEh6AABIekAASHqAAEh7AABIe0AASIsAAEiLgABIjAAASIyAAEiNQABIjYAASI3AAEiOAABIjkAASI7AAEiPQABIj4AASI/AAEiQQABIkIAASKBAAEigwABIoUAASKHAAEiigABIosAASKMAAEijQABIo4AASKQAAEikgABIpMAASKUAAEilgABIpcAASK8AAEi4AABIwcAASMrAAEjLgABIzAAASMyAAEjNAABIzYAASM4AAEjOQABIzwAASNJAAEjWAABI1oAASNcAAEjXgABI2AAASNiAAEjZAABI2YAASN1AAEjeAABI3sAASN+AAEjgQABI4QAASOHAAEjigABI4wAASPLAAEjzQABI88AASPRAAEj1AABI9UAASPWAAEj1wABI9gAASPaAAEj3AABI90AASPeAAEj4AABI+EAASQgAAEkIgABJCQAASQmAAEkKQABJCoAASQrAAEkLAABJC0AASQvAAEkMQABJDIAASQzAAEkNQABJDYAASR1AAEkdwABJHkAASR7AAEkfgABJH8AASSAAAEkgQABJIIAASSEAAEkhgABJIcAASSIAAEkigABJIsAASTKAAEkzAABJM4AASTQAAEk0wABJNQAASTVAAEk1gABJNcAASTZAAEk2wABJNwAASTdAAEk3wABJOAAASUfAAElIQABJSMAASUlAAElKAABJSkAASUqAAElKwABJSwAASUuAAElMAABJTEAASUyAAElNAABJTUAASV0AAEldgABJXgAASV6AAElfQABJX4AASV/AAElgAABJYEAASWDAAElhQABJYYAASWHAAEliQABJYoAASXJAAElywABJc0AASXPAAEl0gABJdMAASXUAAEl1QABJdYAASXYAAEl2gABJdsAASXcAAEl3gABJd8AASYqAAEmTQABJm0AASaNAAEmjwABJpEAASaTAAEmlQABJpgAASaZAAEmmgABJp0AASaeAAEmoAABJqEAASajAAEmpgABJqcAASaoAAEmqwABJqwAASaxAAEmvgABJsMAASbFAAEmxwABJswAASbPAAEm0gABJtQAASb5AAEnHQABJ0QAASdoAAEnawABJ20AASdvAAEncQABJ3MAASd1AAEndgABJ3kAASeGAAEnlwABJ5kAASebAAEnnQABJ58AASehAAEnowABJ6UAASenAAEnuAABJ7sAASe+AAEnwQABJ8QAASfHAAEnygABJ80AASfQAAEn0gABKBEAASgTAAEoFQABKBcAASgaAAEoGwABKBwAASgdAAEoHgABKCAAASgiAAEoIwABKCQAASgmAAEoJwABKGYAAShoAAEoagABKGwAAShvAAEocAABKHEAAShyAAEocwABKHUAASh3AAEoeAABKHkAASh7AAEofAABKLsAASi9AAEowAABKMIAASjFAAEoxgABKMcAASjIAAEoyQABKMsAASjNAAEozgABKM8AASjRAAEo0gABKN8AASjgAAEo4QABKOMAASkiAAEpJAABKSYAASkoAAEpKwABKSwAASktAAEpLgABKS8AASkxAAEpMwABKTQAASk1AAEpNwABKTgAASl3AAEpeQABKXsAASl9AAEpgAABKYEAASmCAAEpgwABKYQAASmGAAEpiAABKYkAASmKAAEpjAABKY0AASnMAAEpzgABKdAAASnSAAEp1QABKdYAASnXAAEp2AABKdkAASnbAAEp3QABKd4AASnfAAEp4QABKeIAASohAAEqIwABKiUAASonAAEqKgABKisAASosAAEqLQABKi4AASowAAEqMgABKjMAASo0AAEqNgABKjcAASp2AAEqeAABKnoAASp8AAEqfwABKoAAASqBAAEqggABKoMAASqFAAEqhwABKogAASqJAAEqiwABKowAASqxAAEq1QABKvwAASsgAAErIwABKyUAASsnAAErKQABKysAASstAAErLgABKzEAASs+AAErTQABK08AAStRAAErUwABK1UAAStXAAErWQABK1sAAStqAAErbQABK3AAAStzAAErdgABK3kAASt8AAErfwABK4EAASvAAAErwgABK8QAASvGAAEryQABK8oAASvLAAErzAABK80AASvPAAEr0QABK9IAASvTAAEr1QABK9YAASwVAAEsFwABLBkAASwbAAEsHgABLB8AASwgAAEsIQABLCIAASwkAAEsJgABLCcAASwoAAEsKgABLCsAASxqAAEsbAABLG4AASxwAAEscwABLHQAASx1AAEsdgABLHcAASx5AAEsewABLHwAASx9AAEsfwABLIAAASy/AAEswQABLMMAASzFAAEsyAABLMkAASzKAAEsywABLMwAASzOAAEs0AABLNEAASzSAAEs1AABLNUAAS0UAAEtFgABLRgAAS0aAAEtHQABLR4AAS0fAAEtIAABLSEAAS0jAAEtJQABLSYAAS0nAAEtKQABLSoAAS1pAAEtawABLW0AAS1vAAEtcgABLXMAAS10AAEtdQABLXYAAS14AAEtegABLXsAAS18AAEtfgABLX8AAS2+AAEtwAABLcIAAS3EAAEtxwABLcgAAS3JAAEtygABLcsAAS3NAAEtzwABLdAAAS3RAAEt0wABLdQAAS4fAAEuQgABLmIAAS6CAAEuhAABLoYAAS6IAAEuigABLo0AAS6OAAEujwABLpIAAS6TAAEulQABLpYAAS6YAAEumwABLpwAAS6dAAEuoAABLqEAAS6mAAEuswABLrgAAS66AAEuvAABLsEAAS7EAAEuxwABLskAAS7uAAEvEgABLzkAAS9dAAEvYAABL2IAAS9kAAEvZgABL2gAAS9qAAEvawABL24AAS97AAEvjAABL44AAS+QAAEvkgABL5QAAS+WAAEvmAABL5oAAS+cAAEvrQABL7AAAS+zAAEvtgABL7kAAS+8AAEvvwABL8IAAS/FAAEvxwABMAYAATAIAAEwCgABMAwAATAPAAEwEAABMBEAATASAAEwEwABMBUAATAXAAEwGAABMBkAATAbAAEwHAABMFsAATBdAAEwXwABMGEAATBkAAEwZQABMGYAATBnAAEwaAABMGoAATBsAAEwbQABMG4AATBwAAEwcQABMLAAATCyAAEwtQABMLcAATC6AAEwuwABMLwAATC9AAEwvgABMMAAATDCAAEwwwABMMQAATDGAAEwxwABMNQAATDVAAEw1gABMNgAATEXAAExGQABMRsAATEdAAExIAABMSEAATEiAAExIwABMSQAATEmAAExKAABMSkAATEqAAExLAABMS0AATFsAAExbgABMXAAATFyAAExdQABMXYAATF3AAExeAABMXkAATF7AAExfQABMX4AATF/AAExgQABMYIAATHBAAExwwABMcUAATHHAAExygABMcsAATHMAAExzQABMc4AATHQAAEx0gABMdMAATHUAAEx1gABMdcAATIWAAEyGAABMhoAATIcAAEyHwABMiAAATIhAAEyIgABMiMAATIlAAEyJwABMigAATIpAAEyKwABMiwAATJrAAEybQABMm8AATJxAAEydAABMnUAATJ2AAEydwABMngAATJ6AAEyfAABMn0AATJ+AAEygAABMoEAATKmAAEyygABMvEAATMVAAEzGAABMxoAATMcAAEzHgABMyAAATMiAAEzIwABMyYAATMzAAEzQgABM0QAATNGAAEzSAABM0oAATNMAAEzTgABM1AAATNfAAEzYgABM2UAATNoAAEzawABM24AATNxAAEzdAABM3YAATO1AAEztwABM7kAATO7AAEzvgABM78AATPAAAEzwQABM8IAATPEAAEzxgABM8cAATPIAAEzygABM8sAATQKAAE0DAABNA4AATQQAAE0EwABNBQAATQVAAE0FgABNBcAATQZAAE0GwABNBwAATQdAAE0HwABNCAAATRfAAE0YQABNGMAATRlAAE0aAABNGkAATRqAAE0awABNGwAATRuAAE0cAABNHEAATRyAAE0dAABNHUAATS0AAE0tgABNLgAATS6AAE0vQABNL4AATS/AAE0wAABNMEAATTDAAE0xQABNMYAATTHAAE0yQABNMoAATUJAAE1CwABNQ0AATUPAAE1EgABNRMAATUUAAE1FQABNRYAATUYAAE1GgABNRsAATUcAAE1HgABNR8AATVeAAE1YAABNWIAATVkAAE1ZwABNWgAATVpAAE1agABNWsAATVtAAE1bwABNXAAATVxAAE1cwABNXQAATWzAAE1tQABNbcAATW5AAE1vAABNb0AATW+AAE1vwABNcAAATXCAAE1xAABNcUAATXGAAE1yAABNckAATYUAAE2NwABNlcAATZ3AAE2eQABNnsAATZ9AAE2fwABNoIAATaDAAE2hAABNocAATaIAAE2igABNosAATaNAAE2kAABNpEAATaSAAE2lQABNpYAATabAAE2qAABNq0AATavAAE2sQABNrYAATa5AAE2vAABNr4AATbjAAE3BwABNy4AATdSAAE3VQABN1cAATdZAAE3WwABN10AATdfAAE3YAABN2MAATdwAAE3gQABN4MAATeFAAE3hwABN4kAATeLAAE3jQABN48AATeRAAE3ogABN6UAATeoAAE3qwABN64AATexAAE3tAABN7cAATe6AAE3vAABN/sAATf9AAE3/wABOAEAATgEAAE4BQABOAYAATgHAAE4CAABOAoAATgMAAE4DQABOA4AATgQAAE4EQABOFAAAThSAAE4VAABOFYAAThZAAE4WgABOFsAAThcAAE4XQABOF8AAThhAAE4YgABOGMAAThlAAE4ZgABOKUAATinAAE4qgABOKwAATivAAE4sAABOLEAATiyAAE4swABOLUAATi3AAE4uAABOLkAATi7AAE4vAABOMkAATjKAAE4ywABOM0AATkMAAE5DgABORAAATkSAAE5FQABORYAATkXAAE5GAABORkAATkbAAE5HQABOR4AATkfAAE5IQABOSIAATlhAAE5YwABOWUAATlnAAE5agABOWsAATlsAAE5bQABOW4AATlwAAE5cgABOXMAATl0AAE5dgABOXcAATm2AAE5uAABOboAATm8AAE5vwABOcAAATnBAAE5wgABOcMAATnFAAE5xwABOcgAATnJAAE5ywABOcwAAToLAAE6DQABOg8AAToRAAE6FAABOhUAAToWAAE6FwABOhgAAToaAAE6HAABOh0AAToeAAE6IAABOiEAATpgAAE6YgABOmQAATpmAAE6aQABOmoAATprAAE6bAABOm0AATpvAAE6cQABOnIAATpzAAE6dQABOnYAATqbAAE6vwABOuYAATsKAAE7DQABOw8AATsRAAE7EwABOxUAATsXAAE7GAABOxsAATsoAAE7NwABOzkAATs7AAE7PQABOz8AATtBAAE7QwABO0UAATtUAAE7VwABO1oAATtdAAE7YAABO2MAATtmAAE7aQABO2sAATuqAAE7rAABO64AATuwAAE7swABO7QAATu1AAE7tgABO7cAATu5AAE7uwABO7wAATu9AAE7vwABO8AAATv/AAE8AQABPAMAATwFAAE8CAABPAkAATwKAAE8CwABPAwAATwOAAE8EAABPBEAATwSAAE8FAABPBUAATxUAAE8VgABPFgAATxaAAE8XQABPF4AATxfAAE8YAABPGEAATxjAAE8ZQABPGYAATxnAAE8aQABPGoAATypAAE8qwABPK0AATyvAAE8sgABPLMAATy0AAE8tQABPLYAATy4AAE8ugABPLsAATy8AAE8vgABPL8AATz+AAE9AAABPQIAAT0EAAE9BwABPQgAAT0JAAE9CgABPQsAAT0NAAE9DwABPRAAAT0RAAE9EwABPRQAAT1TAAE9VQABPVcAAT1ZAAE9XAABPV0AAT1eAAE9XwABPWAAAT1iAAE9ZAABPWUAAT1mAAE9aAABPWkAAT2oAAE9qgABPawAAT2uAAE9sQABPbIAAT2zAAE9tAABPbUAAT23AAE9uQABPboAAT27AAE9vQABPb4AAT4JAAE+LAABPkwAAT5sAAE+bgABPnAAAT5yAAE+dAABPncAAT54AAE+eQABPnwAAT59AAE+fwABPoAAAT6CAAE+hQABPoYAAT6HAAE+igABPosAAT6QAAE+nQABPqIAAT6kAAE+pgABPqsAAT6uAAE+sQABPrMAAT7YAAE+/AABPyMAAT9HAAE/SgABP0wAAT9OAAE/UAABP1IAAT9UAAE/VQABP1gAAT9lAAE/dgABP3gAAT96AAE/fAABP34AAT+AAAE/ggABP4QAAT+GAAE/lwABP5oAAT+dAAE/oAABP6MAAT+mAAE/qQABP6wAAT+vAAE/sQABP/AAAT/yAAE/9AABP/YAAT/5AAE/+gABP/sAAT/8AAE//QABP/8AAUABAAFAAgABQAMAAUAFAAFABgABQEUAAUBHAAFASQABQEsAAUBOAAFATwABQFAAAUBRAAFAUgABQFQAAUBWAAFAVwABQFgAAUBaAAFAWwABQJoAAUCcAAFAnwABQKEAAUCkAAFApQABQKYAAUCnAAFAqAABQKoAAUCsAAFArQABQK4AAUCwAAFAsQABQL4AAUC/AAFAwAABQMIAAUEBAAFBAwABQQUAAUEHAAFBCgABQQsAAUEMAAFBDQABQQ4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AAVGmAAFRqAABUakAAVHoAAFR6gABUewAAVHuAAFR8QABUfIAAVHzAAFR9AABUfUAAVH3AAFR+QABUfoAAVH7AAFR/QABUf4AAVI9AAFSPwABUkEAAVJDAAFSRgABUkcAAVJIAAFSSQABUkoAAVJMAAFSTgABUk8AAVJQAAFSUgABUlMAAVJ4AAFSnAABUsMAAVLnAAFS6gABUuwAAVLuAAFS8AABUvIAAVL0AAFS9QABUvgAAVMFAAFTFAABUxYAAVMYAAFTGgABUxwAAVMeAAFTIAABUyIAAVMxAAFTNAABUzcAAVM6AAFTPQABU0AAAVNDAAFTRgABU0gAAVOHAAFTiQABU4sAAVONAAFTkAABU5EAAVOSAAFTkwABU5QAAVOWAAFTmAABU5kAAVOaAAFTnAABU50AAVPcAAFT3gABU+AAAVPiAAFT5QABU+YAAVPnAAFT6AABU+kAAVPrAAFT7QABU+4AAVPvAAFT8QABU/IAAVQxAAFUMwABVDUAAVQ3AAFUOgABVDsAAVQ8AAFUPQABVD4AAVRAAAFUQgABVEMAAVREAAFURgABVEcAAVSGAAFUiAABVIoAAVSMAAFUjwABVJAAAVSRAAFUkgABVJMAAVSVAAFUlwABVJgAAVSZAAFUmwABVJwAAVTbAAFU3QABVN8AAVThAAFU5AABVOUAAVTmAAFU5wABVOgAAVTqAAFU7AABVO0AAVTuAAFU8AABVPEAAVUwAAFVMgABVTQAAVU2AAFVOQABVToAAVU7AAFVPAABVT0AAVU/AAFVQQABVUIAAVVDAAFVRQABVUYAAVWFAAFVhwABVYkAAVWLAAFVjgABVY8AAVWQAAFVkQABVZIAAVWUAAFVlgABVZcAAVWYAAFVmgABVZsAAVXmAAFWCQABVikAAVZJAAFWSwABVk0AAVZPAAFWUQABVlQAAVZVAAFWVgABVlkAAVZaAAFWXAABVl0AAVZgAAFWYwABVmQAAVZlAAFWaAABVmkAAVZuAAFWewABVoAAAVaCAAFWhQABVooAAVaNAAFWkAABVpIAAVa3AAFW2wABVwIAAVcmAAFXKQABVysAAVctAAFXLwABVzEAAVczAAFXNAABVzcAAVdEAAFXVQABV1cAAVdZAAFXWwABV10AAVdfAAFXYQABV2MAAVdlAAFXdgABV3kAAVd8AAFXfwABV4IAAVeFAAFXiAABV4sAAVeOAAFXkAABV88AAVfRAAFX0wABV9UAAVfYAAFX2QABV9oAAVfbAAFX3AABV94AAVfgAAFX4QABV+IAAVfkAAFX5QABWCQAAVgmAAFYKAABWCoAAVgtAAFYLgABWC8AAVgwAAFYMQABWDMAAVg1AAFYNgABWDcAAVg5AAFYOgABWHkAAVh7AAFYfgABWIAAAViDAAFYhAABWIUAAViGAAFYhwABWIkAAViLAAFYjAABWI0AAViPAAFYkAABWJ0AAVieAAFYnwABWKEAAVjgAAFY4gABWOQAAVjmAAFY6QABWOoAAVjrAAFY7AABWO0AAVjvAAFY8QABWPIAAVjzAAFY9QABWPYAAVk1AAFZNwABWTkAAVk7AAFZPgABWT8AAVlAAAFZQQABWUIAAVlEAAFZRgABWUcAAVlIAAFZSgABWUsAAVmKAAFZjAABWY4AAVmQAAFZkwABWZQAAVmVAAFZlgABWZcAAVmZAAFZmwABWZwAAVmdAAFZnwABWaAAAVnfAAFZ4QABWeMAAVnlAAFZ6AABWekAAVnqAAFZ6wABWewAAVnuAAFZ8AABWfEAAVnyAAFZ9AABWfUAAVo0AAFaNgABWjgAAVo6AAFaPQABWj4AAVo/AAFaQAABWkEAAVpDAAFaRQABWkYAAVpHAAFaSQABWkoAAVpvAAFakwABWroAAVreAAFa4QABWuQAAVrmAAFa6AABWuoAAVrsAAFa7QABWvAAAVr9AAFbDAABWw8AAVsSAAFbFQABWxgAAVsbAAFbHgABWyEAAVswAAFbMwABWzYAAVs5AAFbPAABWz8AAVtCAAFbRQABW0cAAVuGAAFbiAABW4sAAVuNAAFbkAABW5EAAVuSAAFbkwABW5QAAVuWAAFbmQABW5oAAVubAAFbnQABW54AAVvdAAFb3wABW+IAAVvkAAFb5wABW+gAAVvpAAFb6gABW+sAAVvtAAFb8AABW/EAAVvyAAFb9AABW/UAAVw0AAFcNgABXDkAAVw7AAFcPgABXD8AAVxAAAFcQQABXEIAAVxEAAFcRwABXEgAAVxJAAFcSwABXEwAAVyLAAFcjQABXJAAAVySAAFclQABXJYAAVyXAAFcmAABXJkAAVybAAFcngABXJ8AAVygAAFcogABXKMAAVziAAFc5AABXOYAAVzoAAFc6wABXOwAAVztAAFc7gABXO8AAVzxAAFc9AABXPUAAVz2AAFc+AABXPkAAV04AAFdOgABXTwAAV0+AAFdQQABXUIAAV1DAAFdRAABXUUAAV1HAAFdSgABXUsAAV1MAAFdTgABXU8AAV2OAAFdkAABXZMAAV2VAAFdmAABXZkAAV2aAAFdmwABXZwAAV2eAAFdoQABXaIAAV2jAAFdpQABXaYAAV2vAAFdsAABXbIAAV3xAAFd8wABXfUAAV33AAFd+gABXfsAAV38AAFd/QABXf4AAV4AAAFeAwABXgQAAV4FAAFeBwABXggAAV5HAAFeSQABXksAAV5NAAFeUAABXlEAAV5SAAFeUwABXlQAAV5WAAFeWQABXloAAV5bAAFeXQABXl4AAV6dAAFenwABXqIAAV6kAAFepwABXqgAAV6pAAFeqgABXqsAAV6tAAFesAABXrEAAV6yAAFetAABXrUAAV8AAAFfIwABX0MAAV9jAAFfZQABX2cAAV9pAAFfawABX24AAV9vAAFfcAABX3MAAV90AAFfdgABX3cAAV95AAFfewABX3wAAV99AAFfgAABX4EAAV+GAAFfkwABX5gAAV+aAAFfnAABX6EAAV+kAAFfpwABX6kAAV/OAAFf8gABYBkAAWA9AAFgQAABYEIAAWBEAAFgRgABYEgAAWBKAAFgSwABYE4AAWBbAAFgbAABYG4AAWBwAAFgcgABYHQAAWB2AAFgeAABYHoAAWB8AAFgjQABYJAAAWCTAAFglgABYJkAAWCcAAFgnwABYKIAAWClAAFgpwABYOYAAWDoAAFg6gABYOwAAWDvAAFg8AABYPEAAWDyAAFg8wABYPUAAWD3AAFg+AABYPkAAWD7AAFg/AABYTsAAWE9AAFhPwABYUEAAWFEAAFhRQABYUYAAWFHAAFhSAABYUoAAWFMAAFhTQABYU4AAWFQAAFhUQABYZAAAWGSAAFhlQABYZcAAWGaAAFhmwABYZwAAWGdAAFhngABYaAAAWGiAAFhowABYaQAAWGmAAFhpwABYbQAAWG1AAFhtgABYbgAAWH3AAFh+QABYfsAAWH9AAFiAAABYgEAAWICAAFiAwABYgQAAWIGAAFiCAABYgkAAWIKAAFiDAABYg0AAWJMAAFiTgABYlAAAWJSAAFiVQABYlYAAWJXAAFiWAABYlkAAWJbAAFiXQABYl4AAWJfAAFiYQABYmIAAWKhAAFiowABYqUAAWKnAAFiqgABYqsAAWKsAAFirQABYq4AAWKwAAFisgABYrMAAWK0AAFitgABYrcAAWL2AAFi+AABYvoAAWL8AAFi/wABYwAAAWMBAAFjAgABYwMAAWMFAAFjBwABYwgAAWMJAAFjCwABYwwAAWNLAAFjTQABY08AAWNRAAFjVAABY1UAAWNWAAFjVwABY1gAAWNaAAFjXAABY10AAWNeAAFjYAABY2EAAWOGAAFjqgABY9EAAWP1AAFj+AABY/oAAWP8AAFj/gABZAAAAWQCAAFkAwABZAYAAWQTAAFkIgABZCQAAWQmAAFkKAABZCoAAWQsAAFkLgABZDAAAWQ/AAFkQgABZEUAAWRIAAFkSwABZE4AAWRRAAFkVAABZFYAAWSVAAFklwABZJkAAWSbAAFkngABZJ8AAWSgAAFkoQABZKIAAWSkAAFkpgABZKcAAWSoAAFkqgABZKsAAWTqAAFk7AABZO4AAWTwAAFk8wABZPQAAWT1AAFk9gABZPcAAWT5AAFk+wABZPwAAWT9AAFk/wABZQAAAWU/AAFlQQABZUMAAWVFAAFlSAABZUkAAWVKAAFlSwABZUwAAWVOAAFlUAABZVEAAWVSAAFlVAABZVUAAWWUAAFllgABZZgAAWWaAAFlnQABZZ4AAWWfAAFloAABZaEAAWWjAAFlpQABZaYAAWWnAAFlqQABZaoAAWXpAAFl6wABZe0AAWXvAAFl8gABZfMAAWX0AAFl9QABZfYAAWX4AAFl+gABZfsAAWX8AAFl/gABZf8AAWY+AAFmQAABZkIAAWZEAAFmRwABZkgAAWZJAAFmSgABZksAAWZNAAFmTwABZlAAAWZRAAFmUwABZlQAAWaTAAFmlQABZpcAAWaZAAFmnAABZp0AAWaeAAFmnwABZqAAAWaiAAFmpAABZqUAAWamAAFmqAABZqkAAWb0AAFnFwABZzcAAWdXAAFnWQABZ1sAAWddAAFnXwABZ2IAAWdjAAFnZAABZ2cAAWdoAAFnagABZ2sAAWdtAAFncAABZ3EAAWdyAAFndQABZ3YAAWd/AAFnjAABZ5EAAWeTAAFnlQABZ5oAAWedAAFnoAABZ6IAAWfHAAFn6wABaBIAAWg2AAFoOQABaDsAAWg9AAFoPwABaEEAAWhDAAFoRAABaEcAAWhUAAFoZQABaGcAAWhpAAFoawABaG0AAWhvAAFocQABaHMAAWh1AAFohgABaIkAAWiMAAFojwABaJIAAWiVAAFomAABaJsAAWieAAFooAABaN8AAWjhAAFo4wABaOUAAWjoAAFo6QABaOoAAWjrAAFo7AABaO4AAWjwAAFo8QABaPIAAWj0AAFo9QABaTQAAWk2AAFpOAABaToAAWk9AAFpPgABaT8AAWlAAAFpQQABaUMAAWlFAAFpRgABaUcAAWlJAAFpSgABaYkAAWmLAAFpjgABaZAAAWmTAAFplAABaZUAAWmWAAFplwABaZkAAWmbAAFpnAABaZ0AAWmfAAFpoAABaa0AAWmuAAFprwABabEAAWnwAAFp8gABafQAAWn2AAFp+QABafoAAWn7AAFp/AABaf0AAWn/AAFqAQABagIAAWoDAAFqBQABagYAAWpFAAFqRwABakkAAWpLAAFqTgABak8AAWpQAAFqUQABalIAAWpUAAFqVgABalcAAWpYAAFqWgABalsAAWqaAAFqnAABap4AAWqgAAFqowABaqQAAWqlAAFqpgABaqcAAWqpAAFqqwABaqwAAWqtAAFqrwABarAAAWrvAAFq8QABavMAAWr1AAFq+AABavkAAWr6AAFq+wABavwAAWr+AAFrAAABawEAAWsCAAFrBAABawUAAWtEAAFrRgABa0gAAWtKAAFrTQABa04AAWtPAAFrUAABa1EAAWtTAAFrVQABa1YAAWtXAAFrWQABa1oAAWt/AAFrowABa8oAAWvuAAFr8QABa/MAAWv1AAFr9wABa/kAAWv7AAFr/AABa/8AAWwMAAFsGwABbB0AAWwfAAFsIQABbCMAAWwlAAFsJwABbCkAAWw4AAFsOwABbD4AAWxBAAFsRAABbEcAAWxKAAFsTQABbE8AAWyOAAFskAABbJIAAWyUAAFslwABbJgAAWyZAAFsmgABbJsAAWydAAFsnwABbKAAAWyhAAFsowABbKQAAWzjAAFs5QABbOcAAWzpAAFs7AABbO0AAWzuAAFs7wABbPAAAWzyAAFs9AABbPUAAWz2AAFs+AABbPkAAW04AAFtOgABbTwAAW0+AAFtQQABbUIAAW1DAAFtRAABbUUAAW1HAAFtSQABbUoAAW1LAAFtTQABbU4AAW2NAAFtjwABbZEAAW2TAAFtlgABbZcAAW2YAAFtmQABbZoAAW2cAAFtngABbZ8AAW2gAAFtogABbaMAAW3iAAFt5AABbeYAAW3oAAFt6wABbewAAW3tAAFt7gABbe8AAW3xAAFt8wABbfQAAW31AAFt9wABbfgAAW43AAFuOQABbjsAAW49AAFuQAABbkEAAW5CAAFuQwABbkQAAW5GAAFuSAABbkkAAW5KAAFuTAABbk0AAW6MAAFujgABbpAAAW6SAAFulQABbpYAAW6XAAFumAABbpkAAW6bAAFunQABbp4AAW6fAAFuoQABbqIAAW7tAAFvEAABbzAAAW9QAAFvUgABb1QAAW9WAAFvWAABb1sAAW9cAAFvXQABb2AAAW9hAAFvYwABb2QAAW9mAAFvaQABb2oAAW9rAAFvbgABb28AAW94AAFvhQABb4oAAW+MAAFvjgABb5MAAW+WAAFvmQABb5sAAW/AAAFv5AABcAsAAXAvAAFwMgABcDQAAXA2AAFwOAABcDoAAXA8AAFwPQABcEAAAXBNAAFwXgABcGAAAXBiAAFwZAABcGYAAXBoAAFwagABcGwAAXBuAAFwfwABcIIAAXCFAAFwiAABcIsAAXCOAAFwkQABcJQAAXCXAAFwmQABcNgAAXDaAAFw3AABcN4AAXDhAAFw4gABcOMAAXDkAAFw5QABcOcAAXDpAAFw6gABcOsAAXDtAAFw7gABcS0AAXEvAAFxMQABcTMAAXE2AAFxNwABcTgAAXE5AAFxOgABcTwAAXE+AAFxPwABcUAAAXFCAAFxQwABcYIAAXGEAAFxhwABcYkAAXGMAAFxjQABcY4AAXGPAAFxkAABcZIAAXGUAAFxlQABcZYAAXGYAAFxmQABcaYAAXGnAAFxqAABcaoAAXHpAAFx6wABce0AAXHvAAFx8gABcfMAAXH0AAFx9QABcfYAAXH4AAFx+gABcfsAAXH8AAFx/gABcf8AAXI+AAFyQAABckIAAXJEAAFyRwABckgAAXJJAAFySgABcksAAXJNAAFyTwABclAAAXJRAAFyUwABclQAAXKTAAFylQABcpcAAXKZAAFynAABcp0AAXKeAAFynwABcqAAAXKiAAFypAABcqUAAXKmAAFyqAABcqkAAXLoAAFy6gABcuwAAXLuAAFy8QABcvIAAXLzAAFy9AABcvUAAXL3AAFy+QABcvoAAXL7AAFy/QABcv4AAXM9AAFzPwABc0EAAXNDAAFzRgABc0cAAXNIAAFzSQABc0oAAXNMAAFzTgABc08AAXNQAAFzUgABc1MAAXN4AAFznAABc8MAAXPnAAFz6gABc+wAAXPuAAFz8AABc/IAAXP0AAFz9QABc/gAAXQFAAF0FAABdBYAAXQYAAF0GgABdBwAAXQeAAF0IAABdCIAAXQxAAF0NAABdDcAAXQ6AAF0PQABdEAAAXRDAAF0RgABdEgAAXSHAAF0iQABdIsAAXSNAAF0kAABdJEAAXSSAAF0kwABdJQAAXSWAAF0mAABdJkAAXSaAAF0nAABdJ0AAXTcAAF03gABdOAAAXTiAAF05QABdOYAAXTnAAF06AABdOkAAXTrAAF07QABdO4AAXTvAAF08QABdPIAAXUxAAF1MwABdTUAAXU3AAF1OgABdTsAAXU8AAF1PQABdT4AAXVAAAF1QgABdUMAAXVEAAF1RgABdUcAAXWGAAF1iAABdYoAAXWMAAF1jwABdZAAAXWRAAF1kgABdZMAAXWVAAF1lwABdZgAAXWZAAF1mwABdZwAAXXbAAF13QABdd8AAXXhAAF15AABdeUAAXXmAAF15wABdegAAXXqAAF17AABde0AAXXuAAF18AABdfEAAXYwAAF2MgABdjQAAXY2AAF2OQABdjoAAXY7AAF2PAABdj0AAXY/AAF2QQABdkIAAXZDAAF2RQABdkYAAXaFAAF2hwABdokAAXaLAAF2jgABdo8AAXaQAAF2kQABdpIAAXaUAAF2lgABdpcAAXaYAAF2mgABdpsAAXbmAAF3CQABdykAAXdJAAF3SwABd00AAXdPAAF3UQABd1QAAXdVAAF3VgABd1kAAXdaAAF3XAABd10AAXdfAAF3YQABd2IAAXdjAAF3ZgABd2cAAXdsAAF3eQABd34AAXeAAAF3ggABd4cAAXeKAAF3jQABd48AAXe0AAF32AABd/8AAXgjAAF4JgABeCgAAXgqAAF4LAABeC4AAXgwAAF4MQABeDQAAXhBAAF4UgABeFQAAXhWAAF4WAABeFoAAXhcAAF4XgABeGAAAXhiAAF4cwABeHYAAXh5AAF4fAABeH8AAXiCAAF4hQABeIgAAXiLAAF4jQABeMwAAXjOAAF40AABeNIAAXjVAAF41gABeNcAAXjYAAF42QABeNsAAXjdAAF43gABeN8AAXjhAAF44gABeSEAAXkjAAF5JQABeScAAXkqAAF5KwABeSwAAXktAAF5LgABeTAAAXkyAAF5MwABeTQAAXk2AAF5NwABeXYAAXl4AAF5ewABeX0AAXmAAAF5gQABeYIAAXmDAAF5hAABeYYAAXmIAAF5iQABeYoAAXmMAAF5jQABeZoAAXmbAAF5nAABeZ4AAXndAAF53wABeeEAAXnjAAF55gABeecAAXnoAAF56QABeeoAAXnsAAF57gABee8AAXnwAAF58gABefMAAXoyAAF6NAABejYAAXo4AAF6OwABejwAAXo9AAF6PgABej8AAXpBAAF6QwABekQAAXpFAAF6RwABekgAAXqHAAF6iQABeosAAXqNAAF6kAABepEAAXqSAAF6kwABepQAAXqWAAF6mAABepkAAXqaAAF6nAABep0AAXrcAAF63gABeuAAAXriAAF65QABeuYAAXrnAAF66AABeukAAXrrAAF67QABeu4AAXrvAAF68QABevIAAXsxAAF7MwABezUAAXs3AAF7OgABezsAAXs8AAF7PQABez4AAXtAAAF7QgABe0MAAXtEAAF7RgABe0cAAXtsAAF7kAABe7cAAXvbAAF73gABe+AAAXviAAF75AABe+YAAXvoAAF76QABe+wAAXv5AAF8CAABfAoAAXwMAAF8DgABfBAAAXwSAAF8FAABfBYAAXwlAAF8KAABfCsAAXwuAAF8MQABfDQAAXw3AAF8OgABfDwAAXx7AAF8fQABfH8AAXyBAAF8hAABfIUAAXyGAAF8hwABfIgAAXyKAAF8jAABfI0AAXyOAAF8kAABfJEAAXzQAAF80gABfNQAAXzWAAF82QABfNoAAXzbAAF83AABfN0AAXzfAAF84QABfOIAAXzjAAF85QABfOYAAX0lAAF9JwABfSkAAX0rAAF9LgABfS8AAX0wAAF9MQABfTIAAX00AAF9NgABfTcAAX04AAF9OgABfTsAAX16AAF9fAABfX4AAX2AAAF9gwABfYQAAX2FAAF9hgABfYcAAX2JAAF9iwABfYwAAX2NAAF9jwABfZAAAX3PAAF90QABfdMAAX3VAAF92AABfdkAAX3aAAF92wABfdwAAX3eAAF94AABfeEAAX3iAAF95AABfeUAAX4kAAF+JgABfigAAX4qAAF+LQABfi4AAX4vAAF+MAABfjEAAX4zAAF+NQABfjYAAX43AAF+OQABfjoAAX55AAF+ewABfn0AAX5/AAF+ggABfoMAAX6EAAF+hQABfoYAAX6IAAF+igABfosAAX6MAAF+jgABfo8AAX6YAAF+mQABfpsAAX7aAAF+3AABft4AAX7gAAF+4wABfuQAAX7lAAF+5gABfucAAX7pAAF+7AABfu0AAX7uAAF+8AABfvEAAX8wAAF/MgABfzQAAX82AAF/OQABfzoAAX87AAF/PAABfz0AAX8/AAF/QgABf0MAAX9EAAF/RgABf0cAAX+GAAF/iAABf4sAAX+NAAF/kAABf5EAAX+SAAF/kwABf5QAAX+WAAF/mQABf5oAAX+bAAF/nQABf54AAX/pAAGADAABgCwAAYBMAAGATgABgFAAAYBSAAGAVAABgFYAAYBXAAGAWAABgFsAAYBcAAGAXgABgF8AAYBhAAGAYwABgGQAAYBlAAGAaAABgGkAAYBuAAGAewABgIAAAYCCAAGAhAABgIkAAYCMAAGAjwABgJEAAYC2AAGA2gABgQEAAYElAAGBKAABgSoAAYEsAAGBLgABgTAAAYEyAAGBMwABgTYAAYFDAAGBVAABgVYAAYFYAAGBWgABgVwAAYFeAAGBYAABgWIAAYFkAAGBdQABgXgAAYF7AAGBfgABgYEAAYGEAAGBhwABgYoAAYGNAAGBjwABgc4AAYHQAAGB0gABgdQAAYHXAAGB2AABgdkAAYHaAAGB2wABgd0AAYHfAAGB4AABgeEAAYHjAAGB5AABgiMAAYIlAAGCJwABgikAAYIsAAGCLQABgi4AAYIvAAGCMAABgjIAAYI0AAGCNQABgjYAAYI4AAGCOQABgngAAYJ6AAGCfQABgn8AAYKCAAGCgwABgoQAAYKFAAGChgABgogAAYKKAAGCiwABgowAAYKOAAGCjwABgpwAAYKdAAGCngABgqAAAYLfAAGC4QABguMAAYLlAAGC6AABgukAAYLqAAGC6wABguwAAYLuAAGC8AABgvEAAYLyAAGC9AABgvUAAYM0AAGDNgABgzgAAYM6AAGDPQABgz4AAYM/AAGDQAABg0EAAYNDAAGDRQABg0YAAYNHAAGDSQABg0oAAYOJAAGDiwABg40AAYOPAAGDkgABg5MAAYOUAAGDlQABg5YAAYOYAAGDmgABg5sAAYOcAAGDngABg58AAYPeAAGD4AABg+IAAYPkAAGD5wABg+gAAYPpAAGD6gABg+sAAYPtAAGD7wABg/AAAYPxAAGD8wABg/QAAYQzAAGENQABhDcAAYQ5AAGEPAABhD0AAYQ+AAGEPwABhEAAAYRCAAGERAABhEUAAYRGAAGESAABhEkAAYRuAAGEkgABhLkAAYTdAAGE4AABhOIAAYTkAAGE5gABhOgAAYTqAAGE6wABhO4AAYT7AAGFCgABhQwAAYUOAAGFEAABhRIAAYUUAAGFFgABhRgAAYUnAAGFKgABhS0AAYUwAAGFMwABhTYAAYU5AAGFPAABhT4AAYV9AAGFfwABhYEAAYWDAAGFhgABhYcAAYWIAAGFiQABhYoAAYWMAAGFjgABhY8AAYWQAAGFkgABhZMAAYXSAAGF1AABhdYAAYXYAAGF2wABhdwAAYXdAAGF3gABhd8AAYXhAAGF4wABheQAAYXlAAGF5wABhegAAYYnAAGGKQABhisAAYYtAAGGMAABhjEAAYYyAAGGMwABhjQAAYY2AAGGOAABhjkAAYY6AAGGPAABhj0AAYZ8AAGGfgABhoAAAYaCAAGGhQABhoYAAYaHAAGGiAABhokAAYaLAAGGjQABho4AAYaPAAGGkQABhpIAAYbRAAGG0wABhtUAAYbXAAGG2gABhtsAAYbcAAGG3QABht4AAYbgAAGG4gABhuMAAYbkAAGG5gABhucAAYcmAAGHKAABhyoAAYcsAAGHLwABhzAAAYcxAAGHMgABhzMAAYc1AAGHNwABhzgAAYc5AAGHOwABhzwAAYd7AAGHfQABh38AAYeBAAGHhAABh4UAAYeGAAGHhwABh4gAAYeKAAGHjAABh40AAYeOAAGHkAABh5EAAYfcAAGH/wABiB8AAYg/AAGIQQABiEMAAYhFAAGIRwABiEkAAYhKAAGISwABiE4AAYhPAAGIUQABiFIAAYhUAAGIVgABiFcAAYhYAAGIWwABiFwAAYhhAAGIbgABiHMAAYh1AAGIdwABiHwAAYh/AAGIggABiIQAAYipAAGIzQABiPQAAYkYAAGJGwABiR0AAYkfAAGJIQABiSMAAYklAAGJJgABiSkAAYk2AAGJRwABiUkAAYlLAAGJTQABiU8AAYlRAAGJUwABiVUAAYlXAAGJaAABiWsAAYluAAGJcQABiXQAAYl3AAGJegABiX0AAYmAAAGJggABicEAAYnDAAGJxQABiccAAYnKAAGJywABicwAAYnNAAGJzgABidAAAYnSAAGJ0wABidQAAYnWAAGJ1wABihYAAYoYAAGKGgABihwAAYofAAGKIAABiiEAAYoiAAGKIwABiiUAAYonAAGKKAABiikAAYorAAGKLAABimsAAYptAAGKcAABinIAAYp1AAGKdgABincAAYp4AAGKeQABinsAAYp9AAGKfgABin8AAYqBAAGKggABio8AAYqQAAGKkQABipMAAYrSAAGK1AABitYAAYrYAAGK2wABitwAAYrdAAGK3gABit8AAYrhAAGK4wABiuQAAYrlAAGK5wABiugAAYsnAAGLKQABiysAAYstAAGLMAABizEAAYsyAAGLMwABizQAAYs2AAGLOAABizkAAYs6AAGLPAABiz0AAYt8AAGLfgABi4AAAYuCAAGLhQABi4YAAYuHAAGLiAABi4kAAYuLAAGLjQABi44AAYuPAAGLkQABi5IAAYvRAAGL0wABi9UAAYvXAAGL2gABi9sAAYvcAAGL3QABi94AAYvgAAGL4gABi+MAAYvkAAGL5gABi+cAAYwmAAGMKAABjCoAAYwsAAGMLwABjDAAAYwxAAGMMgABjDMAAYw1AAGMNwABjDgAAYw5AAGMOwABjDwAAYxhAAGMhQABjKwAAYzQAAGM0wABjNUAAYzXAAGM2QABjNsAAYzdAAGM3gABjOEAAYzuAAGM/QABjP8AAY0BAAGNAwABjQUAAY0HAAGNCQABjQsAAY0aAAGNHQABjSAAAY0jAAGNJgABjSkAAY0sAAGNLwABjTEAAY1wAAGNcgABjXQAAY12AAGNeQABjXoAAY17AAGNfAABjX0AAY1/AAGNgQABjYIAAY2DAAGNhQABjYYAAY3FAAGNxwABjckAAY3LAAGNzgABjc8AAY3QAAGN0QABjdIAAY3UAAGN1gABjdcAAY3YAAGN2gABjdsAAY4aAAGOHAABjh4AAY4gAAGOIwABjiQAAY4lAAGOJgABjicAAY4pAAGOKwABjiwAAY4tAAGOLwABjjAAAY5vAAGOcQABjnMAAY51AAGOeAABjnkAAY56AAGOewABjnwAAY5+AAGOgAABjoEAAY6CAAGOhAABjoUAAY7EAAGOxgABjsgAAY7KAAGOzQABjs4AAY7PAAGO0AABjtEAAY7TAAGO1QABjtYAAY7XAAGO2QABjtoAAY8ZAAGPGwABjx0AAY8fAAGPIgABjyMAAY8kAAGPJQABjyYAAY8oAAGPKgABjysAAY8sAAGPLgABjy8AAY9uAAGPcAABj3IAAY90AAGPdwABj3gAAY95AAGPegABj3sAAY99AAGPfwABj4AAAY+BAAGPgwABj4QAAY+NAAGPjgABj5AAAY/TAAGP9wABkBsAAZA+AAGQZQABkIUAAZCsAAGQ0wABkPMAAZEXAAGROwABkT0AAZFAAAGRQgABkUQAAZFGAAGRSQABkUwAAZFOAAGRUAABkVMAAZFVAAGRVwABkVoAAZFdAAGRXgABkWMAAZFwAAGRcwABkXUAAZF4AAGRewABkX0AAZGiAAGRxgABke0AAZIRAAGSFAABkhYAAZIYAAGSGgABkhwAAZIeAAGSHwABkiIAAZIvAAGSQAABkkIAAZJEAAGSRgABkkgAAZJKAAGSTAABkk4AAZJQAAGSYQABkmQAAZJnAAGSagABkm0AAZJwAAGScwABknYAAZJ5AAGSewABkroAAZK8AAGSvwABksEAAZLEAAGSxQABksYAAZLHAAGSyAABksoAAZLMAAGSzQABks4AAZLQAAGS0QABktoAAZLbAAGS3QABkxwAAZMeAAGTIAABkyIAAZMlAAGTJgABkycAAZMoAAGTKQABkysAAZMtAAGTLgABky8AAZMxAAGTMgABk3EAAZNzAAGTdQABk3cAAZN6AAGTewABk3wAAZN9AAGTfgABk4AAAZOCAAGTgwABk4QAAZOGAAGThwABk8YAAZPIAAGTywABk80AAZPQAAGT0QABk9IAAZPTAAGT1AABk9YAAZPYAAGT2QABk9oAAZPcAAGT3QABk+YAAZPnAAGT6QABlCgAAZQqAAGULAABlC4AAZQxAAGUMgABlDMAAZQ0AAGUNQABlDcAAZQ5AAGUOgABlDsAAZQ9AAGUPgABlH0AAZR/AAGUggABlIQAAZSHAAGUiAABlIkAAZSKAAGUiwABlI0AAZSPAAGUkAABlJEAAZSTAAGUlAABlKEAAZSiAAGUowABlKUAAZTkAAGU5gABlOgAAZTqAAGU7QABlO4AAZTvAAGU8AABlPEAAZTzAAGU9QABlPYAAZT3AAGU+QABlPoAAZU5AAGVOwABlT4AAZVAAAGVQwABlUQAAZVFAAGVRgABlUcAAZVJAAGVSwABlUwAAZVNAAGVTwABlVAAAZVqAAGVdwABlXoAAZV9AAGVgAABlYMAAZWFAAGVoQABlewAAZYPAAGWLwABlk8AAZZRAAGWUwABllUAAZZXAAGWWgABllsAAZZcAAGWXwABlmAAAZZiAAGWYwABlmYAAZZpAAGWagABlmsAAZZuAAGWbwABlnQAAZaBAAGWhgABlogAAZaLAAGWkAABlpMAAZaWAAGWmAABlr0AAZbhAAGXCAABlywAAZcvAAGXMQABlzMAAZc1AAGXNwABlzkAAZc6AAGXPQABl0oAAZdbAAGXXQABl18AAZdhAAGXYwABl2UAAZdnAAGXaQABl2sAAZd8AAGXfwABl4IAAZeFAAGXiAABl4sAAZeOAAGXkQABl5QAAZeWAAGX1QABl9cAAZfZAAGX2wABl94AAZffAAGX4AABl+EAAZfiAAGX5AABl+YAAZfnAAGX6AABl+oAAZfrAAGYKgABmCwAAZguAAGYMAABmDMAAZg0AAGYNQABmDYAAZg3AAGYOQABmDsAAZg8AAGYPQABmD8AAZhAAAGYfwABmIEAAZiEAAGYhgABmIkAAZiKAAGYiwABmIwAAZiNAAGYjwABmJEAAZiSAAGYkwABmJUAAZiWAAGYowABmKQAAZilAAGYpwABmOYAAZjoAAGY6gABmOwAAZjvAAGY8AABmPEAAZjyAAGY8wABmPUAAZj3AAGY+AABmPkAAZj7AAGY/AABmTsAAZk9AAGZPwABmUEAAZlEAAGZRQABmUYAAZlHAAGZSAABmUoAAZlMAAGZTQABmU4AAZlQAAGZUQABmZAAAZmSAAGZlAABmZYAAZmZAAGZmgABmZsAAZmcAAGZnQABmZ8AAZmhAAGZogABmaMAAZmlAAGZpgABmeUAAZnnAAGZ6QABmesAAZnuAAGZ7wABmfAAAZnxAAGZ8gABmfQAAZn2AAGZ9wABmfgAAZn6AAGZ+wABmjoAAZo8AAGaPgABmkAAAZpDAAGaRAABmkUAAZpGAAGaRwABmkkAAZpLAAGaTAABmk0AAZpPAAGaUAABmnUAAZqZAAGawAABmuQAAZrnAAGa6gABmuwAAZruAAGa8AABmvIAAZrzAAGa9gABmwMAAZsSAAGbFQABmxgAAZsbAAGbHgABmyEAAZskAAGbJwABmzYAAZs5AAGbPAABmz8AAZtCAAGbRQABm0gAAZtLAAGbTQABm4wAAZuOAAGbkQABm5MAAZuWAAGblwABm5gAAZuZAAGbmgABm5wAAZufAAGboAABm6EAAZujAAGbpAABm+MAAZvlAAGb6AABm+oAAZvtAAGb7gABm+8AAZvwAAGb8QABm/MAAZv2AAGb9wABm/gAAZv6AAGb+wABnDoAAZw8AAGcPwABnEEAAZxEAAGcRQABnEYAAZxHAAGcSAABnEoAAZxNAAGcTgABnE8AAZxRAAGcUgABnJEAAZyTAAGclgABnJgAAZybAAGcnAABnJ0AAZyeAAGcnwABnKEAAZykAAGcpQABnKYAAZyoAAGcqQABnOwAAZ0QAAGdNAABnVcAAZ1+AAGdngABncUAAZ3sAAGeDAABnjAAAZ5UAAGeVgABnlkAAZ5bAAGeXQABnl8AAZ5iAAGeZQABnmcAAZ5pAAGebAABnm4AAZ5wAAGecwABnnYAAZ53AAGefAABnokAAZ6MAAGejgABnpEAAZ6UAAGelgABnrsAAZ7fAAGfBgABnyoAAZ8tAAGfLwABnzEAAZ8zAAGfNQABnzcAAZ84AAGfOwABn0gAAZ9ZAAGfWwABn10AAZ9fAAGfYQABn2MAAZ9lAAGfZwABn2kAAZ96AAGffQABn4AAAZ+DAAGfhgABn4kAAZ+MAAGfjwABn5IAAZ+UAAGf0wABn9UAAZ/YAAGf2gABn90AAZ/eAAGf3wABn+AAAZ/hAAGf4wABn+UAAZ/mAAGf5wABn+kAAZ/qAAGf8wABn/QAAZ/2AAGgNQABoDcAAaA5AAGgOwABoD4AAaA/AAGgQAABoEEAAaBCAAGgRAABoEYAAaBHAAGgSAABoEoAAaBLAAGgigABoIwAAaCOAAGgkAABoJMAAaCUAAGglQABoJYAAaCXAAGgmQABoJsAAaCcAAGgnQABoJ8AAaCgAAGg3wABoOEAAaDkAAGg5gABoOkAAaDqAAGg6wABoOwAAaDtAAGg7wABoPEAAaDyAAGg8wABoPUAAaD2AAGg/wABoQAAAaECAAGhQQABoUMAAaFFAAGhRwABoUoAAaFLAAGhTAABoU0AAaFOAAGhUAABoVIAAaFTAAGhVAABoVYAAaFXAAGhlgABoZgAAaGbAAGhnQABoaAAAaGhAAGhogABoaMAAaGkAAGhpgABoagAAaGpAAGhqgABoawAAaGtAAGhugABobsAAaG8AAGhvgABof0AAaH/AAGiAQABogMAAaIGAAGiBwABoggAAaIJAAGiCgABogwAAaIOAAGiDwABohAAAaISAAGiEwABolIAAaJUAAGiVwABolkAAaJcAAGiXQABol4AAaJfAAGiYAABomIAAaJkAAGiZQABomYAAaJoAAGiaQABooUAAaKSAAGipQABoqgAAaKrAAGirgABorEAAaK0AAGitwABoroAAaK9AAGiwAABotMAAaLWAAGi2QABotwAAaLfAAGi4gABouUAAaLoAAGi6wABou4AAaLwAAGi9wABowoAAaMQAAGjKQABozwAAaNPAAGjbQABo3gAAaOOAAGj2QABo/wAAaQcAAGkPAABpD4AAaRAAAGkQgABpEQAAaRHAAGkSAABpEkAAaRMAAGkTQABpE8AAaRQAAGkUwABpFYAAaRXAAGkWAABpFsAAaRcAAGkYQABpG4AAaRzAAGkdQABpHgAAaR9AAGkgAABpIMAAaSFAAGkqgABpM4AAaT1AAGlGQABpRwAAaUeAAGlIAABpSIAAaUkAAGlJgABpScAAaUqAAGlNwABpUgAAaVKAAGlTAABpU4AAaVQAAGlUgABpVQAAaVWAAGlWAABpWkAAaVsAAGlbwABpXIAAaV1AAGleAABpXsAAaV+AAGlgQABpYMAAaXCAAGlxAABpcYAAaXIAAGlywABpcwAAaXNAAGlzgABpc8AAaXRAAGl0wABpdQAAaXVAAGl1wABpdgAAaYXAAGmGQABphsAAaYdAAGmIAABpiEAAaYiAAGmIwABpiQAAaYmAAGmKAABpikAAaYqAAGmLAABpi0AAaZsAAGmbgABpnEAAaZzAAGmdgABpncAAaZ4AAGmeQABpnoAAaZ8AAGmfgABpn8AAaaAAAGmggABpoMAAaaQAAGmkQABppIAAaaUAAGm0wABptUAAabXAAGm2QABptwAAabdAAGm3gABpt8AAabgAAGm4gABpuQAAablAAGm5gABpugAAabpAAGnKAABpyoAAacsAAGnLgABpzEAAacyAAGnMwABpzQAAac1AAGnNwABpzkAAac6AAGnOwABpz0AAac+AAGnfQABp38AAaeBAAGngwABp4YAAaeHAAGniAABp4kAAaeKAAGnjAABp44AAaePAAGnkAABp5IAAaeTAAGn0gABp9QAAafWAAGn2AABp9sAAafcAAGn3QABp94AAaffAAGn4QABp+MAAafkAAGn5QABp+cAAafoAAGoJwABqCkAAagrAAGoLQABqDAAAagxAAGoMgABqDMAAag0AAGoNgABqDgAAag5AAGoOgABqDwAAag9AAGoYgABqIYAAaitAAGo0QABqNQAAajXAAGo2QABqNsAAajdAAGo3wABqOAAAajjAAGo8AABqP8AAakCAAGpBQABqQgAAakLAAGpDgABqREAAakUAAGpIwABqSYAAakpAAGpLAABqS8AAakyAAGpNQABqTgAAak6AAGpeQABqXsAAal+AAGpgAABqYMAAamEAAGphQABqYYAAamHAAGpiQABqYwAAamNAAGpjgABqZAAAamRAAGp0AABqdIAAanVAAGp1wABqdoAAanbAAGp3AABqd0AAaneAAGp4AABqeMAAankAAGp5QABqecAAanoAAGqJwABqikAAaosAAGqLgABqjEAAaoyAAGqMwABqjQAAao1AAGqNwABqjoAAao7AAGqPAABqj4AAao/AAGqfgABqoAAAaqDAAGqhQABqogAAaqJAAGqigABqosAAaqMAAGqjgABqpEAAaqSAAGqkwABqpUAAaqWAAGq2QABqv0AAashAAGrRAABq2sAAauLAAGrsgABq9kAAav5AAGsHQABrEEAAaxDAAGsRgABrEgAAaxKAAGsTAABrE8AAaxSAAGsVAABrFYAAaxZAAGsWwABrF0AAaxgAAGsYwABrGQAAaxpAAGsdgABrHkAAax7AAGsfgABrIEAAayDAAGsqAABrMwAAazzAAGtFwABrRoAAa0cAAGtHgABrSAAAa0iAAGtJAABrSUAAa0oAAGtNQABrUYAAa1IAAGtSgABrUwAAa1OAAGtUAABrVIAAa1UAAGtVgABrWcAAa1qAAGtbQABrXAAAa1zAAGtdgABrXkAAa18AAGtfwABrYEAAa3AAAGtwgABrcUAAa3HAAGtygABrcsAAa3MAAGtzQABrc4AAa3QAAGt0gABrdMAAa3UAAGt1gABrdcAAa3gAAGt4QABreMAAa4iAAGuJAABriYAAa4oAAGuKwABriwAAa4tAAGuLgABri8AAa4xAAGuMwABrjQAAa41AAGuNwABrjgAAa53AAGueQABrnsAAa59AAGugAABroEAAa6CAAGugwABroQAAa6GAAGuiAABrokAAa6KAAGujAABro0AAa7MAAGuzgABrtEAAa7TAAGu1gABrtcAAa7YAAGu2QABrtoAAa7cAAGu3gABrt8AAa7gAAGu4gABruMAAa7sAAGu7QABru8AAa8uAAGvMAABrzIAAa80AAGvNwABrzgAAa85AAGvOgABrzsAAa89AAGvPwABr0AAAa9BAAGvQwABr0QAAa+DAAGvhQABr4gAAa+KAAGvjQABr44AAa+PAAGvkAABr5EAAa+TAAGvlQABr5YAAa+XAAGvmQABr5oAAa+nAAGvqAABr6kAAa+rAAGv6gABr+wAAa/uAAGv8AABr/MAAa/0AAGv9QABr/YAAa/3AAGv+QABr/sAAa/8AAGv/QABr/8AAbAAAAGwPwABsEEAAbBEAAGwRgABsEkAAbBKAAGwSwABsEwAAbBNAAGwTwABsFEAAbBSAAGwUwABsFUAAbBWAAGwdAABsIEAAbCGAAGwiQABsIwAAbCRAAGwlAABsJcAAbCZAAGwoAABsLwAAbEHAAGxKgABsUoAAbFqAAGxbAABsW4AAbFwAAGxcgABsXUAAbF2AAGxdwABsXoAAbF7AAGxfQABsX4AAbGAAAGxgwABsYQAAbGFAAGxiAABsYkAAbGOAAGxmwABsaAAAbGiAAGxpAABsakAAbGsAAGxrwABsbEAAbHWAAGx+gABsiEAAbJFAAGySAABskoAAbJMAAGyTgABslAAAbJSAAGyUwABslYAAbJjAAGydAABsnYAAbJ4AAGyegABsnwAAbJ+AAGygAABsoIAAbKEAAGylQABspgAAbKbAAGyngABsqEAAbKkAAGypwABsqoAAbKtAAGyrwABsu4AAbLwAAGy8gABsvQAAbL3AAGy+AABsvkAAbL6AAGy+wABsv0AAbL/AAGzAAABswEAAbMDAAGzBAABs0MAAbNFAAGzRwABs0kAAbNMAAGzTQABs04AAbNPAAGzUAABs1IAAbNUAAGzVQABs1YAAbNYAAGzWQABs5gAAbOaAAGznQABs58AAbOiAAGzowABs6QAAbOlAAGzpgABs6gAAbOqAAGzqwABs6wAAbOuAAGzrwABs7wAAbO9AAGzvgABs8AAAbP/AAG0AQABtAMAAbQFAAG0CAABtAkAAbQKAAG0CwABtAwAAbQOAAG0EAABtBEAAbQSAAG0FAABtBUAAbRUAAG0VgABtFgAAbRaAAG0XQABtF4AAbRfAAG0YAABtGEAAbRjAAG0ZQABtGYAAbRnAAG0aQABtGoAAbSpAAG0qwABtK0AAbSvAAG0sgABtLMAAbS0AAG0tQABtLYAAbS4AAG0ugABtLsAAbS8AAG0vgABtL8AAbT+AAG1AAABtQIAAbUEAAG1BwABtQgAAbUJAAG1CgABtQsAAbUNAAG1DwABtRAAAbURAAG1EwABtRQAAbVTAAG1VQABtVcAAbVZAAG1XAABtV0AAbVeAAG1XwABtWAAAbViAAG1ZAABtWUAAbVmAAG1aAABtWkAAbWOAAG1sgABtdkAAbX9AAG2AAABtgIAAbYEAAG2BgABtggAAbYKAAG2CwABtg4AAbYbAAG2KgABtiwAAbYuAAG2MAABtjIAAbY0AAG2NgABtjgAAbZHAAG2SgABtk0AAbZQAAG2UwABtlYAAbZZAAG2XAABtl4AAbadAAG2nwABtqEAAbajAAG2pgABtqcAAbaoAAG2qQABtqoAAbasAAG2rgABtq8AAbawAAG2sgABtrMAAbbyAAG29AABtvYAAbb4AAG2+wABtvwAAbb9AAG2/gABtv8AAbcBAAG3AwABtwQAAbcFAAG3BwABtwgAAbdHAAG3SQABt0wAAbdOAAG3UQABt1IAAbdTAAG3VAABt1UAAbdXAAG3WQABt1oAAbdbAAG3XQABt14AAbedAAG3nwABt6IAAbekAAG3pwABt6gAAbepAAG3qgABt6sAAbetAAG3rwABt7AAAbexAAG3swABt7QAAbe3AAG39gABt/gAAbf6AAG3/AABt/8AAbgAAAG4AQABuAIAAbgDAAG4BQABuAcAAbgIAAG4CQABuAsAAbgMAAG4SwABuE0AAbhPAAG4UQABuFQAAbhVAAG4VgABuFcAAbhYAAG4WgABuFwAAbhdAAG4XgABuGAAAbhhAAG4oAABuKIAAbikAAG4pgABuKkAAbiqAAG4qwABuKwAAbitAAG4rwABuLEAAbiyAAG4swABuLUAAbi2AAG5AQABuSQAAblEAAG5ZAABuWYAAbloAAG5agABuWwAAblvAAG5cAABuXEAAbl0AAG5dQABuXcAAbl4AAG5ewABuX4AAbl/AAG5gAABuYMAAbmEAAG5iQABuZYAAbmbAAG5nQABuaAAAbmlAAG5qAABuasAAbmtAAG50gABufYAAbodAAG6QQABukQAAbpGAAG6SAABukoAAbpMAAG6TgABuk8AAbpSAAG6XwABunAAAbpyAAG6dAABunYAAbp4AAG6egABunwAAbp+AAG6gAABupEAAbqUAAG6lwABupoAAbqdAAG6oAABuqMAAbqmAAG6qQABuqsAAbrqAAG67AABuu4AAbrwAAG68wABuvQAAbr1AAG69gABuvcAAbr5AAG6+wABuvwAAbr9AAG6/wABuwAAAbs/AAG7QQABu0MAAbtFAAG7SAABu0kAAbtKAAG7SwABu0wAAbtOAAG7UAABu1EAAbtSAAG7VAABu1UAAbuUAAG7lgABu5kAAbubAAG7ngABu58AAbugAAG7oQABu6IAAbukAAG7pgABu6cAAbuoAAG7qgABu6sAAbu4AAG7uQABu7oAAbu8AAG7+wABu/0AAbv/AAG8AQABvAQAAbwFAAG8BgABvAcAAbwIAAG8CgABvAwAAbwNAAG8DgABvBAAAbwRAAG8UAABvFIAAbxUAAG8VgABvFkAAbxaAAG8WwABvFwAAbxdAAG8XwABvGEAAbxiAAG8YwABvGUAAbxmAAG8pQABvKcAAbypAAG8qwABvK4AAbyvAAG8sAABvLEAAbyyAAG8tAABvLYAAby3AAG8uAABvLoAAby7AAG8+gABvPwAAbz+AAG9AAABvQMAAb0EAAG9BQABvQYAAb0HAAG9CQABvQsAAb0MAAG9DQABvQ8AAb0QAAG9TwABvVEAAb1TAAG9VQABvVgAAb1ZAAG9WgABvVsAAb1cAAG9XgABvWAAAb1hAAG9YgABvWQAAb1lAAG9igABva4AAb3VAAG9+QABvfwAAb3/AAG+AQABvgMAAb4FAAG+BwABvggAAb4LAAG+GAABvicAAb4qAAG+LQABvjAAAb4zAAG+NgABvjkAAb48AAG+SwABvk4AAb5RAAG+VAABvlcAAb5aAAG+XQABvmAAAb5iAAG+oQABvqMAAb6mAAG+qAABvqsAAb6sAAG+rQABvq4AAb6vAAG+sQABvrQAAb61AAG+tgABvrgAAb65AAG++AABvvoAAb79AAG+/wABvwIAAb8DAAG/BAABvwUAAb8GAAG/CAABvwsAAb8MAAG/DQABvw8AAb8QAAG/TwABv1EAAb9UAAG/VgABv1kAAb9aAAG/WwABv1wAAb9dAAG/XwABv2IAAb9jAAG/ZAABv2YAAb9nAAG/pgABv6gAAb+rAAG/rQABv7AAAb+xAAG/sgABv7MAAb+0AAG/tgABv7kAAb+6AAG/uwABv70AAb++AAG//QABv/8AAcABAAHAAwABwAYAAcAHAAHACAABwAkAAcAKAAHADAABwA8AAcAQAAHAEQABwBMAAcAUAAHAUwABwFUAAcBXAAHAWQABwFwAAcBdAAHAXgABwF8AAcBgAAHAYgABwGUAAcBmAAHAZwABwGkAAcBqAAHAqQABwKsAAcCuAAHAsAABwLMAAcC0AAHAtQABwLYAAcC3AAHAuQABwLwAAcC9AAHAvgABwMAAAcDBAAHAygABwM0AAcDQAAHA0gABwO8AAcD5AAHBAgABwQUAAcEHAAHBCgABwQ0AAcEQAAHBEwABwRgAAcFrAAHBjwABwbMAAcHTAAHB+gABwiEAAcJBAAHCaAABwowAAcKvAAHC1gABwvoAAcMeAAHDQgABw2kAAcNqAAHDbAABw24AAcNxAAHDcwABw3YAAcN4AAHDegABw30AAcN/AAHDgQABw4QAAcOHAAHDiQABw4sAAcONAAHDkAABw5MAAcOWAAHDmwABw6gAAcOrAAHDrQABw7AAAcOzAAHDtQABw9oAAcP+AAHEJQABxEkAAcRMAAHETgABxFAAAcRSAAHEVAABxFYAAcRXAAHEWgABxGcAAcR4AAHEegABxHwAAcR+AAHEgAABxIIAAcSEAAHEhgABxIgAAcSZAAHEnAABxJ8AAcSiAAHEpQABxKgAAcSrAAHErgABxLEAAcSzAAHE8gABxPQAAcT3AAHE+QABxPwAAcT9AAHE/gABxP8AAcUAAAHFAgABxQQAAcUFAAHFBgABxQgAAcUJAAHFEgABxRMAAcUVAAHFVAABxVYAAcVYAAHFWgABxV0AAcVeAAHFXwABxWAAAcVhAAHFYwABxWUAAcVmAAHFZwABxWkAAcVqAAHFqQABxasAAcWtAAHFrwABxbIAAcWzAAHFtAABxbUAAcW2AAHFuAABxboAAcW7AAHFvAABxb4AAcW/AAHF/gABxgAAAcYDAAHGBQABxggAAcYJAAHGCgABxgsAAcYMAAHGDgABxhAAAcYRAAHGEgABxhQAAcYVAAHGHgABxh8AAcYhAAHGYAABxmIAAcZkAAHGZgABxmkAAcZqAAHGawABxmwAAcZtAAHGbwABxnEAAcZyAAHGcwABxnUAAcZ2AAHGtQABxrcAAca6AAHGvAABxr8AAcbAAAHGwQABxsIAAcbDAAHGxQABxscAAcbIAAHGyQABxssAAcbMAAHG2QABxtoAAcbbAAHG3QABxxwAAcceAAHHIAABxyIAAcclAAHHJgABxycAAccoAAHHKQABxysAAcctAAHHLgABxy8AAccxAAHHMgABx3EAAcdzAAHHdgABx3gAAcd7AAHHfAABx30AAcd+AAHHfwABx4EAAceDAAHHhAABx4UAAceHAAHHiAABx6YAAcezAAHHtgABx7kAAce8AAHHvwABx8EAAcfGAAHIEQAByDQAAchUAAHIdAAByHYAAch4AAHIegAByHwAAch/AAHIgAAByIEAAciEAAHIhQAByIcAAciIAAHIigAByI0AAciOAAHIjwAByJIAAciTAAHImAAByKUAAciqAAHIrAAByK4AAcizAAHItgAByLkAAci7AAHI4AAByQQAAckrAAHJTwAByVIAAclUAAHJVgAByVgAAclaAAHJXAAByV0AAclgAAHJbQAByX4AAcmAAAHJggAByYQAAcmGAAHJiAAByYoAAcmMAAHJjgAByZ8AAcmiAAHJpQAByagAAcmrAAHJrgABybEAAcm0AAHJtwABybkAAcn4AAHJ+gAByfwAAcn+AAHKAQABygIAAcoDAAHKBAABygUAAcoHAAHKCQABygoAAcoLAAHKDQAByg4AAcpNAAHKTwABylEAAcpTAAHKVgABylcAAcpYAAHKWQAByloAAcpcAAHKXgAByl8AAcpgAAHKYgABymMAAcqiAAHKpAAByqcAAcqpAAHKrAAByq0AAcquAAHKrwAByrAAAcqyAAHKtAAByrUAAcq2AAHKuAAByrkAAcrGAAHKxwABysgAAcrKAAHLCQABywsAAcsNAAHLDwAByxIAAcsTAAHLFAAByxUAAcsWAAHLGAAByxoAAcsbAAHLHAAByx4AAcsfAAHLXgABy2AAActiAAHLZAABy2cAActoAAHLaQABy2oAActrAAHLbQABy28AActwAAHLcQABy3MAAct0AAHLswABy7UAAcu3AAHLuQABy7wAAcu9AAHLvgABy78AAcvAAAHLwgABy8QAAcvFAAHLxgABy8g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AAf/MAAH/7AAB/+4AAf/wAAH/8gAB//QAAf/3AAH/+AAB//kAAf/8AAH//QAB//8AAgAAAAIAAwACAAYAAgAHAAIACAACAAsAAgAMAAIAEQACAB4AAgAjAAIAJQACACgAAgAtAAIAMAACADMAAgA1AAIAWgACAH4AAgClAAIAyQACAMwAAgDOAAIA0AACANIAAgDUAAIA1gACANcAAgDaAAIA5wACAPgAAgD6AAIA/AACAP4AAgEAAAIBAgACAQQAAgEGAAIBCAACARkAAgEcAAIBHwACASIAAgElAAIBKAACASsAAgEuAAIBMQACATMAAgFyAAIBdAACAXYAAgF4AAIBewACAXwAAgF9AAIBfgACAX8AAgGBAAIBgwACAYQAAgGFAAIBhwACAYgAAgHHAAIByQACAcsAAgHNAAIB0AACAdEAAgHSAAIB0wACAdQAAgHWAAIB2AACAdkAAgHaAAIB3AACAd0AAgIcAAICHgACAiEAAgIjAAICJgACAicAAgIoAAICKQACAioAAgIsAAICLgACAi8AAgIwAAICMgACAjMAAgJAAAICQQACAkIAAgJEAAICgwACAoUAAgKHAAICiQACAowAAgKNAAICjgACAo8AAgKQAAICkgACApQAAgKVAAIClgACApgAAgKZAAIC2AACAtoAAgLcAAIC3gACAuEAAgLiAAIC4wACAuQAAgLlAAIC5wACAukAAgLqAAIC6wACAu0AAgLuAAIDLQACAy8AAgMxAAIDMwACAzYAAgM3AAIDOAACAzkAAgM6AAIDPAACAz4AAgM/AAIDQAACA0IAAgNDAAIDggACA4QAAgOGAAIDiAACA4sAAgOMAAIDjQACA44AAgOPAAIDkQACA5MAAgOUAAIDlQACA5cAAgOYAAID1wACA9kAAgPbAAID3QACA+AAAgPhAAID4gACA+MAAgPkAAID5gACA+gAAgPpAAID6gACA+wAAgPtAAIEEgACBDYAAgRdAAIEgQACBIQAAgSHAAIEiQACBIsAAgSNAAIEjwACBJAAAgSTAAIEoAACBK8AAgSyAAIEtQACBLgAAgS7AAIEvgACBMEAAgTEAAIE0wACBNYAAgTZAAIE3AACBN8AAgTiAAIE5QACBOgAAgTqAAIFKQACBSsAAgUuAAIFMAACBTMAAgU0AAIFNQACBTYAAgU3AAIFOQACBTwAAgU9AAIFPgACBUAAAgVBAAIFgAACBYIAAgWFAAIFhwACBYoAAgWLAAIFjAACBY0AAgWOAAIFkAACBZMAAgWUAAIFlQACBZcAAgWYAAIF1wACBdkAAgXcAAIF3gACBeEAAgXiAAIF4wACBeQAAgXlAAIF5wACBeoAAgXrAAIF7AACBe4AAgXvAAIGLgACBjAAAgYzAAIGNQACBjgAAgY5AAIGOgACBjsAAgY8AAIGPgACBkEAAgZCAAIGQwACBkUAAgZGAAIGhQACBocAAgaJAAIGiwACBo4AAgaPAAIGkAACBpEAAgaSAAIGlAACBpcAAgaYAAIGmQACBpsAAgacAAIG2wACBt0AAgbfAAIG4QACBuQAAgblAAIG5gACBucAAgboAAIG6gACBu0AAgbuAAIG7wACBvEAAgbyAAIHMQACBzMAAgc2AAIHOAACBzsAAgc8AAIHPQACBz4AAgc/AAIHQQACB0QAAgdFAAIHRgACB0gAAgdJAAIHlAACB7cAAgfXAAIH9wACB/kAAgf7AAIH/QACB/8AAggCAAIIAwACCAQAAggHAAIICAACCAoAAggLAAIIDQACCBAAAggRAAIIEgACCBUAAggWAAIIGwACCCgAAggtAAIILwACCDEAAgg2AAIIOQACCDwAAgg+AAIIYwACCIcAAgiuAAII0gACCNUAAgjXAAII2QACCNsAAgjdAAII3wACCOAAAgjjAAII8AACCQEAAgkDAAIJBQACCQcAAgkJAAIJCwACCQ0AAgkPAAIJEQACCSIAAgklAAIJKAACCSsAAgkuAAIJMQACCTQAAgk3AAIJOgACCTwAAgl7AAIJfQACCX8AAgmBAAIJhAACCYUAAgmGAAIJhwACCYgAAgmKAAIJjAACCY0AAgmOAAIJkAACCZEAAgnQAAIJ0gACCdQAAgnWAAIJ2QACCdoAAgnbAAIJ3AACCd0AAgnfAAIJ4QACCeIAAgnjAAIJ5QACCeYAAgolAAIKJwACCioAAgosAAIKLwACCjAAAgoxAAIKMgACCjMAAgo1AAIKNwACCjgAAgo5AAIKOwACCjwAAgpJAAIKSgACCksAAgpNAAIKjAACCo4AAgqQAAIKkgACCpUAAgqWAAIKlwACCpgAAgqZAAIKmwACCp0AAgqeAAIKnwACCqEAAgqiAAIK4QACCuMAAgrlAAIK5wACCuoAAgrrAAIK7AACCu0AAgruAAIK8AACCvIAAgrzAAIK9AACCvYAAgr3AAILNgACCzgAAgs6AAILPAACCz8AAgtAAAILQQACC0IAAgtDAAILRQACC0cAAgtIAAILSQACC0sAAgtMAAILiwACC40AAguPAAILkQACC5QAAguVAAILlgACC5cAAguYAAILmgACC5wAAgudAAILngACC6AAAguhAAIL4AACC+IAAgvkAAIL5gACC+kAAgvqAAIL6wACC+wAAgvtAAIL7wACC/EAAgvyAAIL8wACC/UAAgv2AAIMGwACDD8AAgxmAAIMigACDI0AAgyPAAIMkQACDJMAAgyVAAIMlwACDJgAAgybAAIMqAACDLcAAgy5AAIMuwACDL0AAgy/AAIMwQACDMMAAgzFAAIM1AACDNcAAgzaAAIM3QACDOAAAgzjAAIM5gACDOkAAgzrAAINKgACDSwAAg0vAAINMQACDTQAAg01AAINNgACDTcAAg04AAINOgACDTwAAg09AAINPgACDUAAAg1BAAINgAACDYIAAg2EAAINhgACDYkAAg2KAAINiwACDYwAAg2NAAINjwACDZEAAg2SAAINkwACDZUAAg2WAAIN1QACDdcAAg3aAAIN3AACDd8AAg3gAAIN4QACDeIAAg3jAAIN5QACDecAAg3oAAIN6QACDesAAg3sAAIOKwACDi0AAg4wAAIOMgACDjUAAg42AAIONwACDjgAAg45AAIOOwACDj0AAg4+AAIOPwACDkEAAg5CAAIOgQACDoMAAg6GAAIOiAACDosAAg6MAAIOjQACDo4AAg6PAAIOkQACDpMAAg6UAAIOlQACDpcAAg6YAAIO1wACDtkAAg7bAAIO3QACDuAAAg7hAAIO4gACDuMAAg7kAAIO5gACDugAAg7pAAIO6gACDuwAAg7tAAIPLAACDy4AAg8wAAIPMgACDzUAAg82AAIPNwACDzgAAg85AAIPOwACDz0AAg8+AAIPPwACD0EAAg9CAAIPSwACD04AAg9RAAIPUwACD1gAAg+XAAIPmQACD5sAAg+dAAIPoAACD6EAAg+iAAIPowACD6QAAg+mAAIPqQACD6oAAg+rAAIPrQACD64AAg/tAAIP7wACD/EAAg/zAAIP9gACD/cAAg/4AAIP+QACD/oAAg/8AAIP/wACEAAAAhABAAIQAwACEAQAAhBDAAIQRQACEEgAAhBKAAIQTQACEE4AAhBPAAIQUAACEFEAAhBTAAIQVgACEFcAAhBYAAIQWgACEFsAAhCmAAIQyQACEOkAAhEJAAIRCwACEQ0AAhEPAAIREQACERQAAhEVAAIRFgACERkAAhEaAAIRHAACER0AAhEfAAIRIgACESMAAhEkAAIRJwACESgAAhEtAAIROgACET8AAhFBAAIRQwACEUgAAhFLAAIRTgACEVAAAhF1AAIRmQACEcAAAhHkAAIR5wACEekAAhHrAAIR7QACEe8AAhHxAAIR8gACEfUAAhICAAISEwACEhUAAhIXAAISGQACEhsAAhIdAAISHwACEiEAAhIjAAISNAACEjcAAhI6AAISPQACEkAAAhJDAAISRgACEkkAAhJMAAISTgACEo0AAhKPAAISkQACEpMAAhKWAAISlwACEpgAAhKZAAISmgACEpwAAhKeAAISnwACEqAAAhKiAAISowACEuIAAhLkAAIS5gACEugAAhLrAAIS7AACEu0AAhLuAAIS7wACEvEAAhLzAAIS9AACEvUAAhL3AAIS+AACEzcAAhM5AAITPAACEz4AAhNBAAITQgACE0MAAhNEAAITRQACE0cAAhNJAAITSgACE0sAAhNNAAITTgACE1sAAhNcAAITXQACE18AAhOeAAIToAACE6IAAhOkAAITpwACE6gAAhOpAAITqgACE6sAAhOtAAITrwACE7AAAhOxAAITswACE7QAAhPzAAIT9QACE/cAAhP5AAIT/AACE/0AAhP+AAIT/wACFAAAAhQCAAIUBAACFAUAAhQGAAIUCAACFAkAAhRIAAIUSgACFEwAAhROAAIUUQACFFIAAhRTAAIUVAACFFUAAhRXAAIUWQACFFoAAhRbAAIUXQACFF4AAhSdAAIUnwACFKEAAhSjAAIUpgACFKcAAhSoAAIUqQACFKoAAhSsAAIUrgACFK8AAhSwAAIUsgACFLMAAhTyAAIU9AACFPYAAhT4AAIU+wACFPwAAhT9AAIU/gACFP8AAhUBAAIVAwACFQQAAhUFAAIVBwACFQgAAhUtAAIVUQACFXgAAhWcAAIVnwACFaEAAhWjAAIVpQACFacAAhWpAAIVqgACFa0AAhW6AAIVyQACFcsAAhXNAAIVzwACFdEAAhXTAAIV1QACFdcAAhXmAAIV6QACFewAAhXvAAIV8gACFfUAAhX4AAIV+wACFf0AAhY8AAIWPgACFkAAAhZCAAIWRQACFkYAAhZHAAIWSAACFkkAAhZLAAIWTQACFk4AAhZPAAIWUQACFlIAAhaRAAIWkwACFpUAAhaXAAIWmgACFpsAAhacAAIWnQACFp4AAhagAAIWogACFqMAAhakAAIWpgACFqcAAhbmAAIW6AACFuoAAhbsAAIW7wACFvAAAhbxAAIW8gACFvMAAhb1AAIW9wACFvgAAhb5AAIW+wACFvwAAhc7AAIXPQACFz8AAhdBAAIXRAACF0UAAhdGAAIXRwACF0gAAhdKAAIXTAACF00AAhdOAAIXUAACF1EAAheQAAIXkgACF5QAAheWAAIXmQACF5oAAhebAAIXnAACF50AAhefAAIXoQACF6IAAhejAAIXpQACF6YAAhflAAIX5wACF+kAAhfrAAIX7gACF+8AAhfwAAIX8QACF/IAAhf0AAIX9gACF/cAAhf4AAIX+gACF/sAAhg6AAIYPAACGD4AAhhAAAIYQwACGEQAAhhFAAIYRgACGEcAAhhJAAIYSwACGEwAAhhNAAIYTwACGFAAAhibAAIYvgACGN4AAhj+AAIZAAACGQIAAhkEAAIZBgACGQkAAhkKAAIZCwACGQ4AAhkPAAIZEQACGRIAAhkUAAIZFwACGRgAAhkZAAIZHAACGR0AAhkiAAIZLwACGTQAAhk2AAIZOAACGT0AAhlAAAIZQwACGUUAAhlqAAIZjgACGbUAAhnZAAIZ3AACGd4AAhngAAIZ4gACGeQAAhnmAAIZ5wACGeoAAhn3AAIaCAACGgoAAhoMAAIaDgACGhAAAhoSAAIaFAACGhYAAhoYAAIaKQACGiwAAhovAAIaMgACGjUAAho4AAIaOwACGj4AAhpBAAIaQwACGoIAAhqEAAIahgACGogAAhqLAAIajAACGo0AAhqOAAIajwACGpEAAhqTAAIalAACGpUAAhqXAAIamAACGtcAAhrZAAIa2wACGt0AAhrgAAIa4QACGuIAAhrjAAIa5AACGuYAAhroAAIa6QACGuoAAhrsAAIa7QACGywAAhsuAAIbMQACGzMAAhs2AAIbNwACGzgAAhs5AAIbOgACGzwAAhs+AAIbPwACG0AAAhtCAAIbQwACG1AAAhtRAAIbUgACG1QAAhuTAAIblQACG5c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AAiacAAImngACJp8AAibeAAIm4AACJuMAAiblAAIm6AACJukAAibqAAIm6wACJuwAAibuAAIm8QACJvIAAibzAAIm9QACJvYAAic1AAInNwACJzoAAic8AAInPwACJ0AAAidBAAInQgACJ0MAAidFAAInSAACJ0kAAidKAAInTAACJ00AAieQAAIntAACJ9gAAif7AAIoIgACKEIAAihpAAIokAACKLAAAijUAAIo+AACKPoAAij9AAIo/wACKQEAAikDAAIpBgACKQkAAikLAAIpDQACKRAAAikSAAIpFAACKRcAAikaAAIpGwACKSAAAiktAAIpMAACKTIAAik1AAIpOAACKToAAilfAAIpgwACKaoAAinOAAIp0QACKdMAAinVAAIp1wACKdkAAinbAAIp3AACKd8AAinsAAIp/QACKf8AAioBAAIqAwACKgUAAioHAAIqCQACKgsAAioNAAIqHgACKiEAAiokAAIqJwACKioAAiotAAIqMAACKjMAAio2AAIqOAACKncAAip5AAIqfAACKn4AAiqBAAIqggACKoMAAiqEAAIqhQACKocAAiqJAAIqigACKosAAiqNAAIqjgACKpcAAiqYAAIqmgACKtkAAirbAAIq3QACKt8AAiriAAIq4wACKuQAAirlAAIq5gACKugAAirqAAIq6wACKuwAAiruAAIq7wACKy4AAiswAAIrMgACKzQAAis3AAIrOAACKzkAAis6AAIrOwACKz0AAis/AAIrQAACK0EAAitDAAIrRAACK4MAAiuFAAIriAACK4oAAiuNAAIrjgACK48AAiuQAAIrkQACK5MAAiuVAAIrlgACK5cAAiuZAAIrmgACK6MAAiukAAIrpgACK+UAAivnAAIr6QACK+sAAivuAAIr7wACK/AAAivxAAIr8gACK/QAAiv2AAIr9wACK/gAAiv6AAIr+wACLDoAAiw8AAIsPwACLEEAAixEAAIsRQACLEYAAixHAAIsSAACLEoAAixMAAIsTQACLE4AAixQAAIsUQACLF4AAixfAAIsYAACLGIAAiyhAAIsowACLKUAAiynAAIsqgACLKsAAiysAAIsrQACLK4AAiywAAIssgACLLMAAiy0AAIstgACLLcAAiz2AAIs+AACLPsAAiz9AAItAAACLQEAAi0CAAItAwACLQQAAi0GAAItCAACLQk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AAkP7AAJD/AACQ/0AAkP/AAJEAAACRD8AAkRBAAJEQwACREUAAkRIAAJESQACREoAAkRLAAJETAACRE4AAkRQAAJEUQACRFIAAkRUAAJEVQACRJQAAkSWAAJEmAACRJoAAkSdAAJEngACRJ8AAkSgAAJEoQACRKMAAkSlAAJEpgACRKcAAkSpAAJEqgACROkAAkTrAAJE7QACRO8AAkTyAAJE8wACRPQAAkT1AAJE9gACRPgAAkT6AAJE+wACRPwAAkT+AAJE/wACRT4AAkVAAAJFQgACRUQAAkVHAAJFSAACRUkAAkVKAAJFSwACRU0AAkVPAAJFUAACRVEAAkVTAAJFVAACRZMAAkWVAAJFlwACRZkAAkWcAAJFnQACRZ4AAkWfAAJFoAACRaIAAkWkAAJFpQACRaYAAkWoAAJFqQACRbIAAkWzAAJFtQACRfQAAkX2AAJF+AACRfoAAkX9AAJF/gACRf8AAkYAAAJGAQACRgMAAkYGAAJGBwACRggAAkYKAAJGCwACRkoAAkZMAAJGTgACRlAAAkZTAAJGVAACRlUAAkZWAAJGVwACRlkAAkZcAAJGXQACRl4AAkZgAAJGYQACRqAAAkaiAAJGpQACRqcAAkaqAAJGqwACRqwAAkatAAJGrgACRrAAAkazAAJGtAACRrUAAka3AAJGuAACRwMAAkcmAAJHRgACR2YAAkdoAAJHagACR2wAAkduAAJHcQACR3IAAkdzAAJHdgACR3cAAkd5AAJHegACR3wAAkd/AAJHgAACR4EAAkeEAAJHhQACR4oAAkeXAAJHnAACR54AAkegAAJHpQACR6gAAkerAAJHrQACR9IAAkf2AAJIHQACSEEAAkhEAAJIRgACSEgAAkhKAAJITAACSE4AAkhPAAJIUgACSF8AAkhwAAJIcgACSHQAAkh2AAJIeAACSHoAAkh8AAJIfgACSIAAAkiRAAJIlAACSJcAAkiaAAJInQACSKAAAkijAAJIpgACSKkAAkirAAJI6gACSOwAAkjuAAJI8AACSPMAAkj0AAJI9QACSPYAAkj3AAJI+QACSPsAAkj8AAJI/QACSP8AAkkAAAJJPwACSUEAAklDAAJJRQACSUgAAklJAAJJSgACSUsAAklMAAJJTgACSVAAAklRAAJJUgACSVQAAklVAAJJlAACSZYAAkmZAAJJmwACSZ4AAkmfAAJJoAACSaEAAkmiAAJJpAACSaYAAkmnAAJJqAACSaoAAkmrAAJJuAACSbkAAkm6AAJJvAACSfsAAkn9AAJJ/wACSgEAAkoEAAJKBQACSgYAAkoHAAJKCAACSgoAAkoMAAJKDQACSg4AAkoQAAJKEQACSlAAAkpSAAJKVAACSlYAAkpZAAJKWgACSlsAAkpcAAJKXQACSl8AAkphAAJKYgACSmMAAkplAAJKZgACSqUAAkqnAAJKqQACSqsAAkquAAJKrwACSrAAAkqxAAJKsgACSrQAAkq2AAJKtwACSrgAAkq6AAJKuwACSvoAAkr8AAJK/gACSwAAAksDAAJLBAACSwUAAksGAAJLBwACSwkAAksLAAJLDAACSw0AAksPAAJLEAACS08AAktRAAJLUwACS1UAAktYAAJLWQACS1oAAktbAAJLXAACS14AAktgAAJLYQACS2IAAktkAAJLZQACS4oAAkuuAAJL1QACS/kAAkv8AAJL/gACTAAAAkwCAAJMBAACTAYAAkwHAAJMCgACTBcAAkwmAAJMKAACTCoAAkwsAAJMLgACTDAAAkwyAAJMNAACTEMAAkxGAAJMSQACTEwAAkxPAAJMUgACTFUAAkxYAAJMWgACTJkAAkybAAJMnQACTJ8AAkyiAAJMowACTKQAAkylAAJMpgACTKgAAkyqAAJMqwACTKwAAkyuAAJMrwACTO4AAkzwAAJM8gACTPQAAkz3AAJM+AACTPkAAkz6AAJM+wACTP0AAkz/AAJNAAACTQEAAk0DAAJNBAACTUMAAk1FAAJNRwACTUkAAk1MAAJNTQACTU4AAk1PAAJNUAACTVIAAk1UAAJNVQACTVYAAk1YAAJNWQACTZgAAk2aAAJNnAACTZ4AAk2hAAJNogACTaMAAk2kAAJNpQACTacAAk2pAAJNqgACTasAAk2tAAJNrgACTe0AAk3vAAJN8QACTfMAAk32AAJN9wACTfgAAk35AAJN+gACTfwAAk3+AAJN/wACTgAAAk4CAAJOAwACTkIAAk5EAAJORgACTkgAAk5LAAJOTAACTk0AAk5OAAJOTwACTlEAAk5TAAJOVAACTlUAAk5XAAJOWAACTpcAAk6ZAAJOmwACTp0AAk6gAAJOoQACTqIAAk6jAAJOpAACTqYAAk6oAAJOqQACTqoAAk6sAAJOrQACTvgAAk8bAAJPOwACT1sAAk9dAAJPXwACT2EAAk9jAAJPZgACT2cAAk9oAAJPawACT2wAAk9uAAJPbwACT3EAAk90AAJPdQACT3YAAk95AAJPegACT38AAk+MAAJPkQACT5MAAk+VAAJPmgACT50AAk+gAAJPogACT8cAAk/rAAJQEgACUDYAAlA5AAJQOwACUD0AAlA/AAJQQQACUEMAAlBEAAJQRwACUFQAAlBlAAJQZwACUGkAAlBrAAJQbQACUG8AAlBxAAJQcwACUHUAAlCGAAJQiQACUIwAAlCPAAJQkgACUJUAAlCYAAJQmwACUJ4AAlCgAAJQ3wACUOEAAlDjAAJQ5QACUOgAAlDpAAJQ6gACUOsAAlDsAAJQ7gACUPAAAlDxAAJQ8gACUPQAAlD1AAJRNAACUTYAAlE4AAJROgACUT0AAlE+AAJRPwACUUAAAlFBAAJRQwACUUUAAlFGAAJRRwACUUkAAlFKAAJRiQACUYsAAlGOAAJRkAACUZMAAlGUAAJRlQACUZYAAlGXAAJRmQACUZsAAlGcAAJRnQACUZ8AAlGgAAJRrQACUa4AAlGvAAJRsQACUfAAAlHyAAJR9AACUfYAAlH5AAJR+gACUfsAAlH8AAJR/QACUf8AAlIBAAJSAgACUgMAAlIFAAJSBgACUkUAAlJHAAJSSQACUksAAlJOAAJSTwACUlAAAlJRAAJSUgACUlQAAlJWAAJSVwACUlgAAlJaAAJSWwACUpoAAlKcAAJSngACUqAAAlKjAAJSpAACUqUAAlKmAAJSpwACUqkAAlKrAAJSrAACUq0AAlKvAAJSsAACUu8AAlLxAAJS8wACUvUAAlL4AAJS+QACUvoAAlL7AAJS/AACUv4AAlMAAAJTAQACUwIAAlMEAAJTBQACU0QAAlNGAAJTSAACU0oAAlNNAAJTTgACU08AAlNQAAJTUQACU1MAAlNVAAJTVgACU1cAAlNZAAJTWgACU38AAlOjAAJTygACU+4AAlPxAAJT8wACU/UAAlP3AAJT+QACU/sAAlP8AAJT/wACVAwAAlQbAAJUHQACVB8AAlQhAAJUIwACVCUAAlQnAAJUKQACVDgAAlQ7AAJUPgACVEEAAlREAAJURwACVEoAAlRNAAJUTwACVI4AAlSQAAJUkgACVJQAAlSXAAJUmAACVJkAAlSaAAJUmwACVJ0AAlSfAAJUoAACVKEAAlSjAAJUpAACVOMAAlTlAAJU5wACVOkAAlTsAAJU7QACVO4AAlTvAAJU8AACVPIAAlT0AAJU9QACVPYAAlT4AAJU+QACVTgAAlU6AAJVPAACVT4AAlVBAAJVQgACVUMAAlVEAAJVRQACVUcAAlVJAAJVSgACVUsAAlVNAAJVTgACVY0AAlWPAAJVkQACVZMAAlWWAAJVlwACVZgAAlWZAAJVmgACVZwAAlWeAAJVnwACVaAAAlWiAAJVowACVeIAAlXkAAJV5gACVegAAlXrAAJV7AACVe0AAlXuAAJV7wACVfEAAlXzAAJV9AACVfUAAlX3AAJV+AACVjcAAlY5AAJWOwACVj0AAlZAAAJWQQACVkIAAlZDAAJWRAACVkYAAlZIAAJWSQACVkoAAlZMAAJWTQACVowAAlaOAAJWkAACVpIAAlaVAAJWlgACVpcAAlaYAAJWmQACVpsAAladAAJWngACVp8AAlahAAJWogACVu0AAlcQAAJXMAACV1AAAldSAAJXVAACV1YAAldYAAJXWwACV1wAAlddAAJXYAACV2EAAldjAAJXZAACV2cAAldqAAJXawACV2wAAldvAAJXcAACV3UAAleCAAJXhwACV4kAAleMAAJXkQACV5QAAleXAAJXmQACV74AAlfiAAJYCQACWC0AAlgwAAJYMgACWDQAAlg2AAJYOAACWDoAAlg7AAJYPgACWEsAAlhcAAJYXgACWGAAAlhiAAJYZAACWGYAAlhoAAJYagACWGwAAlh9AAJYgAACWIMAAliGAAJYiQACWIwAAliPAAJYkgACWJUAAliXAAJY1gACWNgAAljaAAJY3AACWN8AAljgAAJY4QACWOIAAljjAAJY5QACWOcAAljoAAJY6QACWOsAAljsAAJZKwACWS0AAlkvAAJZMQACWTQAAlk1AAJZNgACWTcAAlk4AAJZOgACWTwAAlk9AAJZPgACWUAAAllBAAJZgAACWYIAAlmFAAJZhwACWYoAAlmLAAJZjAACWY0AAlmOAAJZkAACWZIAAlmTAAJZlAACWZYAAlmXAAJZpAACWaUAAlmmAAJZqAACWecAAlnpAAJZ6wACWe0AAlnwAAJZ8QACWfIAAlnzAAJZ9AACWfYAAln4AAJZ+QACWfoAAln8AAJZ/QACWjwAAlo+AAJaQAACWkIAAlpFAAJaRgACWkcAAlpIAAJaSQACWksAAlpNAAJaTgACWk8AAlpRAAJaUgACWpEAAlqTAAJalQACWpcAAlqaAAJamwACWpwAAlqdAAJangACWqAAAlqiAAJaowACWqQAAlqmAAJapwACWuYAAlroAAJa6gACWuwAAlrvAAJa8AACWvEAAlryAAJa8wACWvUAAlr3AAJa+AACWvkAAlr7AAJa/AACWzsAAls9AAJbPwACW0EAAltEAAJbRQACW0YAAltHAAJbSAACW0oAAltMAAJbTQACW04AAltQAAJbUQACW3YAAluaAAJbwQACW+UAAlvoAAJb6wACW+0AAlvvAAJb8QACW/MAAlv0AAJb9wACXAQAAlwTAAJcFgACXBkAAlwcAAJcHwACXCIAAlwlAAJcKAACXDcAAlw6AAJcPQACXEAAAlxDAAJcRgACXEkAAlxMAAJcTgACXI0AAlyPAAJckgACXJQAAlyXAAJcmAACXJkAAlyaAAJcmwACXJ0AAlygAAJcoQACXKIAAlykAAJcpQACXOQAAlzmAAJc6QACXOsAAlzuAAJc7wACXPAAAlzxAAJc8gACXPQAAlz3AAJc+AACXPkAAlz7AAJc/AACXTsAAl09AAJdQAACXUIAAl1FAAJdRgACXUcAAl1IAAJdSQACXUsAAl1OAAJdTwACXVAAAl1SAAJdUwACXZIAAl2UAAJdlwACXZkAAl2cAAJdnQACXZ4AAl2fAAJdoAACXaIAAl2lAAJdpgACXacAAl2pAAJdqgACXekAAl3rAAJd7QACXe8AAl3yAAJd8wACXfQAAl31AAJd9gACXfgAAl37AAJd/AACXf0AAl3/AAJeAAACXj8AAl5BAAJeQwACXkUAAl5IAAJeSQACXkoAAl5LAAJeTAACXk4AAl5RAAJeUgACXlMAAl5VAAJeVgACXpUAAl6XAAJemgACXpwAAl6fAAJeoAACXqEAAl6iAAJeowACXqUAAl6oAAJeqQACXqoAAl6sAAJerQACXvgAAl8bAAJfOwACX1sAAl9dAAJfXwACX2EAAl9jAAJfZgACX2cAAl9oAAJfawACX2wAAl9uAAJfbwACX3EAAl90AAJfdQACX3YAAl95AAJfegACX38AAl+MAAJfkQACX5MAAl+VAAJfmgACX50AAl+gAAJfogACX8cAAl/rAAJgEgACYDYAAmA5AAJgOwACYD0AAmA/AAJgQQACYEMAAmBEAAJgRwACYFQAAmBlAAJgZwACYGkAAmBrAAJgbQACYG8AAmBxAAJgcwACYHUAAmCGAAJgiQACYIwAAmCPAAJgkgACYJUAAmCYAAJgmwACYJ4AAmCgAAJg3wACYOEAAmDjAAJg5QACYOgAAmDpAAJg6gACYOsAAmDsAAJg7gACYPAAAmDxAAJg8gACYPQAAmD1AAJhNAACYTYAAmE4AAJhOgACYT0AAmE+AAJhPwACYUAAAmFBAAJhQwACYUUAAmFGAAJhRwACYUkAAmFKAAJhiQACYYsAAmGOAAJhkAACYZMAAmGUAAJhlQACYZYAAmGXAAJhmQACYZsAAmGcAAJhnQACYZ8AAmGgAAJhrQACYa4AAmGvAAJhsQACYfAAAmHyAAJh9AACYfYAAmH5AAJh+gACYfsAAmH8AAJh/QACYf8AAmIBAAJiAgACYgMAAmIFAAJiBgACYkUAAmJHAAJiSQACYksAAmJOAAJiTwACYlAAAmJRAAJiUgACYlQAAmJWAAJiVwACYlgAAmJaAAJiWwACYpoAAmKcAAJingACYqAAAmKjAAJipAACYqUAAmKmAAJipwACYqkAAmKrAAJirAACYq0AAmKvAAJisAACYu8AAmLxAAJi8wACYvUAAmL4AAJi+QACYvoAAmL7AAJi/AACYv4AAmMAAAJjAQACYwIAAmMEAAJjBQACY0QAAmNGAAJjSAACY0oAAmNNAAJjTgACY08AAmNQAAJjUQACY1MAAmNVAAJjVgACY1cAAmNZAAJjWgACY38AAmOjAAJjygACY+4AAmPxAAJj8wACY/UAAmP3AAJj+QACY/sAAmP8AAJj/wACZAwAAmQbAAJkHQACZB8AAmQhAAJkIwACZCUAAmQnAAJkKQACZDgAAmQ7AAJkPgACZEEAAmREAAJkRwACZEoAAmRNAAJkTwACZI4AAmSQAAJkkwACZJUAAmSYAAJkmQACZJoAAmSbAAJknAACZJ4AAmSgAAJkoQACZKIAAmSkAAJkpQACZOQAAmTmAAJk6AACZOoAAmTtAAJk7gACZO8AAmTwAAJk8QACZPMAAmT1AAJk9gACZPcAAmT5AAJk+gACZTkAAmU7AAJlPgACZUAAAmVDAAJlRAACZUUAAmVGAAJlRwACZUkAAmVLAAJlTAACZU0AAmVPAAJlUAACZY8AAmWRAAJllAACZZYAAmWZAAJlmgACZZsAAmWcAAJlnQACZZ8AAmWhAAJlogACZaMAAmWlAAJlpgACZeUAAmXnAAJl6QACZesAAmXuAAJl7wACZfAAAmXxAAJl8gACZfQAAmX2AAJl9wACZfgAAmX6AAJl+wACZjoAAmY8AAJmPgACZkAAAmZDAAJmRAACZkUAAmZGAAJmRwACZkkAAmZLAAJmTAACZk0AAmZPAAJmUAACZo8AAmaRAAJmkwACZpUAAmaYAAJmmQACZpoAAmabAAJmnAACZp4AAmagAAJmoQACZqIAAmakAAJmpQACZq4AAmavAAJmsQACZvAAAmbyAAJm9AACZvYAAmb5AAJm+gACZvsAAmb8AAJm/QACZv8AAmcCAAJnAwACZwQAAmcGAAJnBwACZ0YAAmdIAAJnSgACZ0wAAmdPAAJnUAACZ1EAAmdSAAJnUwACZ1UAAmdYAAJnWQACZ1oAAmdcAAJnXQACZ5wAAmeeAAJnoQACZ6MAAmemAAJnpwACZ6gAAmepAAJnqgACZ6wAAmevAAJnsAACZ7EAAmezAAJntAACZ70AAmfAAAJnwwACZ8UAAmgIAAJoLAACaFAAAmhzAAJomgACaLoAAmjhAAJpCAACaSgAAmlMAAJpcAACaXIAAml1AAJpdwACaXkAAml7AAJpfgACaYEAAmmDAAJphQACaYgAAmmKAAJpjAACaY8AAmmSAAJpkwACaZwAAmmpAAJprAACaa4AAmmxAAJptAACabYAAmnbAAJp/wACaiYAAmpKAAJqTQACak8AAmpRAAJqUwACalUAAmpXAAJqWAACalsAAmpoAAJqeQACansAAmp9AAJqfwACaoEAAmqDAAJqhQACaocAAmqJAAJqmgACap0AAmqgAAJqowACaqYAAmqpAAJqrAACaq8AAmqyAAJqtAACavMAAmr1AAJq+AACavoAAmr9AAJq/gACav8AAmsAAAJrAQACawMAAmsFAAJrBgACawcAAmsJAAJrCgACaxMAAmsUAAJrFgACa1UAAmtXAAJrWQACa1sAAmteAAJrXwACa2AAAmthAAJrYgACa2QAAmtmAAJrZwACa2gAAmtqAAJrawACa6oAAmusAAJrrgACa7AAAmuzAAJrtAACa7UAAmu2AAJrtwACa7kAAmu7AAJrvAACa70AAmu/AAJrwAACa/8AAmwBAAJsBAACbAYAAmwJAAJsCgACbAsAAmwMAAJsDQACbA8AAmwRAAJsEgACbBMAAmwVAAJsFgACbB8AAmwgAAJsIgACbGEAAmxjAAJsZQACbGcAAmxqAAJsawACbGwAAmxtAAJsbgACbHAAAmxyAAJscwACbHQAAmx2AAJsdwACbLYAAmy4AAJsuwACbL0AAmzAAAJswQACbMIAAmzDAAJsxAACbMYAAmzIAAJsyQACbMoAAmzMAAJszQACbNoAAmzbAAJs3AACbN4AAm0dAAJtHwACbSEAAm0jAAJtJgACbScAAm0oAAJtKQACbSoAAm0sAAJtLgACbS8AAm0wAAJtMgACbTMAAm1yAAJtdAACbXcAAm15AAJtfAACbX0AAm1+AAJtfwACbYAAAm2CAAJthAACbYUAAm2GAAJtiAACbYkAAm2dAAJtqgACbeEAAm3kAAJt5wACbeoAAm3tAAJt8AACbfMAAm32AAJt+QACbfwAAm3/AAJuAgACbgUAAm4IAAJuCwACbg4AAm4RAAJuFAACbhcAAm4aAAJuHQACbiAAAm4jAAJuJgACbikAAm4sAAJuLwACbmYAAm5pAAJubAACbm8AAm5yAAJudQACbngAAm57AAJufgACboEAAm6EAAJuhwACbooAAm6NAAJukAACbpMAAm6WAAJumQACbpwAAm6fAAJuogACbqUAAm6oAAJuqwACbq4AAm6xAAJutAACbrYAAm7FAAJu3AACbvQAAm8BAAJvDwACbxkAAm8xAAJvOwACb00AAm9kAAJvdgACb4sAAm+VAAJvqQACb7QAAm/LAAJv4QACb/MAAnABAAJwDwACcBkAAnA4AAJwRQACcFEAAnBkAAJwcAACcLsAAnDeAAJw/gACcR4AAnEgAAJxIgACcSQAAnEmAAJxKQACcSoAAnErAAJxLgACcS8AAnExAAJxMgACcTQAAnE3AAJxOAACcTkAAnE8AAJxPQACcUIAAnFPAAJxVAACcVYAAnFYAAJxXQACcWAAAnFjAAJxZQACcYoAAnGuAAJx1QACcfkAAnH8AAJx/gACcgAAAnICAAJyBAACcgYAAnIHAAJyCgACchcAAnIoAAJyKgACciwAAnIuAAJyMAACcjIAAnI0AAJyNgACcjgAAnJJAAJyTAACck8AAnJSAAJyVQACclgAAnJbAAJyXgACcmEAAnJjAAJyogACcqQAAnKmAAJyqAACcqsAAnKsAAJyrQACcq4AAnKvAAJysQACcrMAAnK0AAJytQACcrcAAnK4AAJy9wACcvkAAnL7AAJy/QACcwAAAnMBAAJzAgACcwMAAnMEAAJzBgACcwgAAnMJAAJzCgACcwwAAnMNAAJzTAACc04AAnNRAAJzUwACc1YAAnNXAAJzWAACc1kAAnNaAAJzXAACc14AAnNfAAJzYAACc2IAAnNjAAJzcAACc3EAAnNyAAJzdAACc7MAAnO1AAJztwACc7kAAnO8AAJzvQACc74AAnO/AAJzwAACc8IAAnPEAAJzxQACc8YAAnPIAAJzyQACdAgAAnQKAAJ0DAACdA4AAnQRAAJ0EgACdBMAAnQUAAJ0FQACdBcAAnQZAAJ0GgACdBsAAnQdAAJ0HgACdF0AAnRfAAJ0YQACdGMAAnRmAAJ0ZwACdGgAAnRpAAJ0agACdGwAAnRuAAJ0bwACdHAAAnRyAAJ0cwACdLIAAnS0AAJ0tgACdLgAAnS7AAJ0vAACdL0AAnS+AAJ0vwACdMEAAnTDAAJ0xAACdMUAAnTHAAJ0yAACdQcAAnUJAAJ1CwACdQ0AAnUQAAJ1EQACdRIAAnUTAAJ1FAACdRYAAnUYAAJ1GQACdRoAAnUcAAJ1HQACdUIAAnVmAAJ1jQACdbEAAnW0AAJ1tgACdbgAAnW6AAJ1vAACdb4AAnW/AAJ1wgACdc8AAnXeAAJ14AACdeIAAnXkAAJ15gACdegAAnXqAAJ17AACdfsAAnX+AAJ2AQACdgQAAnYHAAJ2CgACdg0AAnYQAAJ2EgACdlEAAnZTAAJ2VQACdlcAAnZaAAJ2WwACdlwAAnZdAAJ2XgACdmAAAnZiAAJ2YwACdmQAAnZmAAJ2ZwACdqYAAnaoAAJ2qgACdqwAAnavAAJ2sAACdrEAAnayAAJ2swACdrUAAna3AAJ2uAACdrkAAna7AAJ2vAACdvsAAnb9AAJ2/wACdwEAAncEAAJ3BQACdwYAAncHAAJ3CAACdwoAAncMAAJ3DQACdw4AAncQAAJ3EQACd1AAAndSAAJ3VAACd1YAAndZAAJ3WgACd1sAAndcAAJ3XQACd18AAndhAAJ3YgACd2MAAndlAAJ3ZgACd6UAAnenAAJ3qQACd6sAAneuAAJ3rwACd7AAAnexAAJ3sgACd7QAAne2AAJ3twACd7gAAne6AAJ3uwACd/oAAnf8AAJ3/gACeAAAAngDAAJ4BAACeAUAAngGAAJ4BwACeAkAAngLAAJ4DAACeA0AAngPAAJ4EAACeE8AAnhRAAJ4UwACeFUAAnhYAAJ4WQACeFoAAnhbAAJ4XAACeF4AAnhgAAJ4YQACeGIAAnhkAAJ4ZQACeLAAAnjTAAJ48wACeRMAAnkVAAJ5FwACeRkAAnkbAAJ5HgACeR8AAnkgAAJ5IwACeSQAAnkmAAJ5JwACeSkAAnksAAJ5LQACeS4AAnkxAAJ5MgACeTcAAnlEAAJ5SQACeUsAAnlNAAJ5UgACeVUAAnlYAAJ5WgACeX8AAnmjAAJ5ygACee4AAnnxAAJ58wACefUAAnn3AAJ5+QACefsAAnn8AAJ5/wACegwAAnodAAJ6HwACeiEAAnojAAJ6JQACeicAAnopAAJ6KwACei0AAno+AAJ6QQACekQAAnpHAAJ6SgACek0AAnpQAAJ6UwACelYAAnpYAAJ6lwACepkAAnqbAAJ6nQACeqAAAnqhAAJ6ogACeqMAAnqkAAJ6pgACeqgAAnqpAAJ6qgACeqwAAnqtAAJ67AACeu4AAnrwAAJ68gACevUAAnr2AAJ69wACevgAAnr5AAJ6+wACev0AAnr+AAJ6/wACewEAAnsCAAJ7QQACe0MAAntGAAJ7SAACe0sAAntMAAJ7TQACe04AAntPAAJ7UQACe1MAAntUAAJ7VQACe1cAAntYAAJ7ZQACe2YAAntnAAJ7aQACe6gAAnuqAAJ7rAACe64AAnuxAAJ7sgACe7MAAnu0AAJ7tQACe7cAAnu5AAJ7ugACe7sAAnu9AAJ7vgACe/0AAnv/AAJ8AQACfAMAAnwGAAJ8BwACfAgAAnwJAAJ8CgACfAwAAnwOAAJ8DwACfBAAAnwSAAJ8EwACfFIAAnxUAAJ8VgACfFgAAnxbAAJ8XAACfF0AAnxeAAJ8XwACfGEAAnxjAAJ8ZAACfGUAAnxnAAJ8aAACfKcAAnypAAJ8qwACfK0AAnywAAJ8sQACfLIAAnyzAAJ8tAACfLYAAny4AAJ8uQACfLoAAny8AAJ8vQACfPwAAnz+AAJ9AAACfQIAAn0FAAJ9BgACfQcAAn0IAAJ9CQACfQsAAn0NAAJ9DgACfQ8AAn0RAAJ9EgACfTcAAn1bAAJ9ggACfaYAAn2pAAJ9qwACfa0AAn2vAAJ9sQACfbMAAn20AAJ9twACfcQAAn3TAAJ91QACfdcAAn3ZAAJ92wACfd0AAn3fAAJ94QACffAAAn3zAAJ99gACffkAAn38AAJ9/wACfgIAAn4FAAJ+BwACfkYAAn5IAAJ+SgACfkwAAn5PAAJ+UAACflEAAn5SAAJ+UwACflUAAn5XAAJ+WAACflkAAn5bAAJ+XAACfpsAAn6dAAJ+nwACfqEAAn6kAAJ+pQACfqYAAn6nAAJ+qAACfqoAAn6sAAJ+rQACfq4AAn6wAAJ+sQACfvAAAn7yAAJ+9AACfvYAAn75AAJ++gACfvsAAn78AAJ+/QACfv8AAn8BAAJ/AgACfwMAAn8FAAJ/BgACf0UAAn9HAAJ/SQACf0sAAn9OAAJ/TwACf1AAAn9RAAJ/UgACf1QAAn9WAAJ/VwACf1gAAn9aAAJ/WwACf5oAAn+cAAJ/ngACf6AAAn+jAAJ/pAACf6UAAn+mAAJ/pwACf6kAAn+rAAJ/rAACf60AAn+vAAJ/sAACf+8AAn/xAAJ/8wACf/UAAn/4AAJ/+QACf/oAAn/7AAJ//AACf/4AAoAAAAKAAQACgAIAAoAEAAKABQACgEQAAoBGAAKASAACgEoAAoBNAAKATgACgE8AAoBQAAKAUQACgFMAAoBVAAKAVgACgFcAAoBZAAKAWgACgKUAAoDIAAKA6AACgQgAAoEKAAKBDAACgQ4AAoEQAAKBEwACgRQAAoEVAAKBGAACgRkAAoEbAAKBHAACgR4AAoEhAAKBIgACgSMAAoEmAAKBJwACgSwAAoE5AAKBPgACgUAAAoFCAAKBRwACgUoAAoFNAAKBTwACgXQAAoGYAAKBvwACgeMAAoHmAAKB6AACgeoAAoHsAAKB7gACgfAAAoHxAAKB9AACggEAAoISAAKCFAACghYAAoIYAAKCGgACghwAAoIeAAKCIAACgiIAAoIzAAKCNgACgjkAAoI8AAKCPwACgkIAAoJFAAKCSAACgksAAoJNAAKCjAACgo4AAoKQAAKCkgACgpUAAoKWAAKClwACgpgAAoKZAAKCmwACgp0AAoKeAAKCnwACgqEAAoKiAAKC4QACguMAAoLlAAKC5wACguoAAoLrAAKC7AACgu0AAoLuAAKC8AACgvIAAoLzAAKC9AACgvYAAoL3AAKDNgACgzgAAoM7AAKDPQACg0AAAoNBAAKDQgACg0MAAoNEAAKDRgACg0gAAoNJAAKDSgACg0wAAoNNAAKDWgACg1sAAoNcAAKDXgACg50AAoOfAAKDoQACg6MAAoOmAAKDpwACg6gAAoOpAAKDqgACg6wAAoOuAAKDrwACg7AAAoOyAAKDswACg/IAAoP0AAKD9gACg/gAAoP7AAKD/AACg/0AAoP+AAKD/wAChAEAAoQDAAKEBAAChAUAAoQHAAKECAAChEcAAoRJAAKESwAChE0AAoRQAAKEUQAChFIAAoRTAAKEVAAChFYAAoRYAAKEWQAChFoAAoRcAAKEXQAChJwAAoSeAAKEoAAChKIAAoSlAAKEpgAChKcAAoSoAAKEqQAChKsAAoStAAKErgAChK8AAoSxAAKEsgAChPEAAoTzAAKE9QAChPcAAoT6AAKE+wAChPwAAoT9AAKE/gAChQAAAoUCAAKFAwAChQQAAoUGAAKFBwAChSwAAoVQAAKFdwAChZsAAoWeAAKFoAAChaIAAoWkAAKFpgAChagAAoWpAAKFrAAChbkAAoXIAAKFygAChcwAAoXOAAKF0AAChdIAAoXUAAKF1gACheUAAoXoAAKF6wAChe4AAoXxAAKF9AAChfcAAoX6AAKF/AAChjsAAoY9AAKGPwAChkEAAoZEAAKGRQAChkYAAoZHAAKGSAAChkoAAoZMAAKGTQAChk4AAoZQAAKGUQAChpAAAoaSAAKGlAAChpYAAoaZAAKGmgAChpsAAoacAAKGnQAChp8AAoahAAKGogAChqMAAoalAAKGpgAChuUAAobnAAKG6QAChusAAobuAAKG7wAChvAAAobxAAKG8gAChvQAAob2AAKG9wAChvgAAob6AAKG+wAChzoAAoc8AAKHPwACh0EAAodEAAKHRQACh0YAAodHAAKHSAACh0oAAodMAAKHTQACh04AAodQAAKHUQACh5AAAoeSAAKHlAACh5YAAoeZAAKHmgACh5sAAoecAAKHnQACh58AAoehAAKHogACh6MAAoelAAKHpgACh+UAAofnAAKH6QACh+sAAofuAAKH7wACh/AAAofxAAKH8gACh/QAAof2AAKH9wACh/gAAof6AAKH+wACiDoAAog8AAKIPgACiEAAAohDAAKIRAACiEUAAohGAAKIRwACiEkAAohLAAKITAACiE0AAohPAAKIUAACiJsAAoi+AAKI3gACiP4AAokAAAKJAgACiQQAAokGAAKJCQACiQoAAokLAAKJDgACiQ8AAokRAAKJEgACiRQAAokXAAKJGAACiRkAAokcAAKJHQACiSIAAokvAAKJNAACiTYAAok4AAKJPQACiUAAAolDAAKJRQACiWoAAomOAAKJtQACidkAAoncAAKJ3gACieAAAoniAAKJ5AACieYAAonnAAKJ6gACifcAAooIAAKKCgACigwAAooOAAKKEAACihIAAooUAAKKFgACihgAAoopAAKKLAACii8AAooyAAKKNQACijgAAoo7AAKKPgACikEAAopDAAKKggACioQAAoqGAAKKiAACiosAAoqMAAKKjQACio4AAoqPAAKKkQACipMAAoqUAAKKlQACipcAAoqYAAKK1wACitkAAorbAAKK3QACiuAAAorhAAKK4gACiuMAAorkAAKK5gACiugAAorpAAKK6gACiuwAAortAAKLLAACiy4AAosxAAKLMwACizYAAos3AAKLOAACizkAAos6AAKLPAACiz4AAos/AAKLQAACi0IAAotDAAKLUAACi1EAAotSAAKLVAACi5MAAouVAAKLlwACi5kAAoucAAKLnQACi54AAoufAAKLoAACi6IAAoukAAKLpQACi6YAAouoAAKLqQACi+gAAovqAAKL7AACi+4AAovxAAKL8gACi/MAAov0AAKL9QACi/cAAov5AAKL+gACi/sAAov9AAKL/gACjD0AAow/AAKMQQACjEMAAoxGAAKMRwACjEgAAoxJAAKMSgACjEwAAoxOAAKMTwACjFAAAoxSAAKMUwACjJIAAoyUAAKMlgACjJgAAoybAAKMnAACjJ0AAoyeAAKMnwACjKEAAoyjAAKMpAACjKUAAoynAAKMqAACjOcAAozpAAKM6wACjO0AAozwAAKM8QACjPIAAozzAAKM9AACjPYAAoz4AAKM+QACjPoAAoz8AAKM/QACjSIAAo1GAAKNbQACjZEAAo2UAAKNlgACjZgAAo2aAAKNnAACjZ4AAo2fAAKNogACja8AAo2+AAKNwAACjcIAAo3EAAKNxgACjcgAAo3KAAKNzAACjdsAAo3eAAKN4QACjeQAAo3nAAKN6gACje0AAo3wAAKN8gACjjEAAo4zAAKONQACjjcAAo46AAKOOwACjjwAAo49AAKOPgACjkAAAo5CAAKOQwACjkQAAo5GAAKORwACjoYAAo6IAAKOigACjowAAo6PAAKOkAACjpEAAo6SAAKOkwACjpUAAo6XAAKOmAACjpkAAo6bAAKOnAACjtsAAo7dAAKO3wACjuEAAo7kAAKO5QACjuYAAo7nAAKO6AACjuoAAo7sAAKO7QACju4AAo7wAAKO8QACjzAAAo8yAAKPNQACjzcAAo86AAKPOwACjzwAAo89AAKPPgACj0AAAo9CAAKPQwACj0QAAo9GAAKPRwACj4YAAo+IAAKPigACj4wAAo+PAAKPkAACj5EAAo+SAAKPkwACj5UAAo+XAAKPmAACj5kAAo+bAAKPnAACj9sAAo/dAAKP3wACj+EAAo/kAAKP5QACj+YAAo/nAAKP6AACj+oAAo/sAAKP7QACj+4AAo/wAAKP8QACkDAAApAyAAKQNAACkDYAApA5AAKQOgACkDsAApA8AAKQPQACkD8AApBBAAKQQgACkEMAApBFAAKQRgACkJEAApC0AAKQ1AACkPQAApD2AAKQ+AACkPoAApD8AAKQ/wACkQAAApEBAAKRBAACkQUAApEHAAKRCAACkQoAApENAAKRDgACkQ8AApESAAKREwACkRgAApElAAKRKgACkSwAApEuAAKRMwACkTYAApE5AAKROwACkWAAApGEAAKRqwACkc8AApHSAAKR1AACkdYAApHYAAKR2gACkdwAApHdAAKR4AACke0AApH+AAKSAAACkgIAApIEAAKSBgACkggAApIKAAKSDAACkg4AApIfAAKSIgACkiUAApIoAAKSKwACki4AApIxAAKSNAACkjcAApI5AAKSeAACknoAApJ8AAKSfgACkoEAApKCAAKSgwACkoQAApKFAAKShwACkokAApKKAAKSiwACko0AApKOAAKSzQACks8AApLRAAKS0wACktYAApLXAAKS2AACktkAApLaAAKS3AACkt4AApLfAAKS4AACkuIAApLjAAKTIgACkyQAApMnAAKTKQACkywAApMtAAKTLgACky8AApMwAAKTMgACkzQAApM1AAKTNgACkzgAApM5AAKTRgACk0cAApNIAAKTSgACk4kAApOLAAKTjQACk48AApOSAAKTkwACk5QAApOVAAKTlgACk5gAApOaAAKTmwACk5wAApOeAAKTnwACk94AApPgAAKT4gACk+QAApPnAAKT6AACk+kAApPqAAKT6wACk+0AApPvAAKT8AACk/EAApPzAAKT9AAClDMAApQ1AAKUNwAClDkAApQ8AAKUPQAClD4AApQ/AAKUQAAClEIAApREAAKURQAClEYAApRIAAKUSQAClIgAApSKAAKUjAAClI4AApSRAAKUkgAClJMAApSUAAKUlQAClJcAApSZAAKUmgAClJsAApSdAAKUngAClN0AApTfAAKU4QAClOMAApTmAAKU5wAClOgAApTpAAKU6gAClOwAApTuAAKU7wAClPAAApTyAAKU8wAClRgAApU8AAKVYwAClYcAApWKAAKVjAAClY4AApWQAAKVkgAClZQAApWVAAKVmAAClaUAApW0AAKVtgAClbgAApW6AAKVvAAClb4AApXAAAKVwgACldEAApXUAAKV1wACldoAApXdAAKV4AACleMAApXmAAKV6AAClicAApYpAAKWKwACli0AApYwAAKWMQACljIAApYzAAKWNAACljYAApY4AAKWOQACljoAApY8AAKWPQAClnwAApZ+AAKWgAACloIAApaFAAKWhgAClocAApaIAAKWiQAClosAApaNAAKWjgAClo8AApaRAAKWkgACltEAApbTAAKW1QACltcAApbaAAKW2wACltwAApbdAAKW3gACluAAApbiAAKW4wACluQAApbmAAKW5wAClyYAApcoAAKXKgAClywAApcvAAKXMAAClzEAApcyAAKXMwAClzUAApc3AAKXOAAClzkAApc7AAKXPAACl3sAApd9AAKXfwACl4EAApeEAAKXhQACl4YAApeHAAKXiAACl4oAApeMAAKXjQACl44AApeQAAKXkQACl9AAApfSAAKX1AACl9YAApfZAAKX2gACl9sAApfcAAKX3QACl98AApfhAAKX4gACl+MAApflAAKX5gACmCUAApgnAAKYKQACmCsAApguAAKYLwACmDAAApgxAAKYMgACmDQAApg2AAKYNwACmDgAApg6AAKYOwACmIYAApipAAKYyQACmOkAApjrAAKY7QACmO8AApjxAAKY9AACmPUAApj2AAKY+QACmPoAApj8AAKY/QACmP8AApkCAAKZAwACmQQAApkHAAKZCAACmQ0AApkaAAKZHwACmSEAApkjAAKZKAACmSsAApkuAAKZMAACmVUAApl5AAKZoAACmcQAApnHAAKZyQACmcsAApnNAAKZzwACmdEAApnSAAKZ1QACmeIAApnzAAKZ9QACmfcAApn5AAKZ+wACmf0AApn/AAKaAQACmgMAApoUAAKaFwACmhoAApodAAKaIAACmiMAApomAAKaKQACmiwAApouAAKabQACmm8AAppxAAKacwACmnYAApp3AAKaeAACmnkAApp6AAKafAACmn4AApp/AAKagAACmoIAApqDAAKawgACmsQAAprGAAKayAACmssAAprMAAKazQACms4AAprPAAKa0QACmtMAAprUAAKa1QACmtcAAprYAAKbFwACmxkAApscAAKbHgACmyEAApsiAAKbIwACmyQAApslAAKbJwACmykAApsqAAKbKwACmy0AApsuAAKbOwACmzwAAps9AAKbPwACm34AApuAAAKbggACm4QAApuHAAKbiAACm4kAApuKAAKbiwACm40AApuPAAKbkAACm5EAApuTAAKblAACm9MAApvVAAKb1wACm9kAApvcAAKb3QACm94AApvfAAKb4AACm+IAApvkAAKb5QACm+YAApvoAAKb6QACnCgAApwqAAKcLAACnC4AApwxAAKcMgACnDMAApw0AAKcNQACnDcAApw5AAKcOgACnDsAApw9AAKcPgACnH0AApx/AAKcgQACnIMAApyGAAKchwACnIgAApyJAAKcigACnIwAApyOAAKcjwACnJAAApySAAKckwACnNIAApzUAAKc1gACnNgAApzbAAKc3AACnN0AApzeAAKc3wACnOEAApzjAAKc5AACnOUAApznAAKc6AACnQ0AAp0xAAKdWAACnXwAAp1/AAKdgQACnYMAAp2FAAKdhwACnYkAAp2KAAKdjQACnZoAAp2pAAKdqwACna0AAp2vAAKdsQACnbMAAp21AAKdtwACncYAAp3JAAKdzAACnc8AAp3SAAKd1QACndgAAp3bAAKd3QACnhwAAp4eAAKeIAACniIAAp4lAAKeJgACnicAAp4oAAKeKQACnisAAp4tAAKeLgACni8AAp4xAAKeMgACnnEAAp5zAAKedQACnncAAp56AAKeewACnnwAAp59AAKefgACnoAAAp6CAAKegwACnoQAAp6GAAKehwACnsYAAp7IAAKeygACnswAAp7PAAKe0AACntEAAp7SAAKe0wACntUAAp7XAAKe2AACntkAAp7bAAKe3AACnxsAAp8dAAKfHwACnyEAAp8kAAKfJQACnyYAAp8nAAKfKAACnyoAAp8sAAKfLQACny4AAp8wAAKfMQACn3AAAp9yAAKfdAACn3YAAp95AAKfegACn3sAAp98AAKffQACn38AAp+BAAKfggACn4MAAp+FAAKfhgACn8UAAp/HAAKfyQACn8sAAp/OAAKfzwACn9AAAp/RAAKf0gACn9QAAp/WAAKf1wACn9gAAp/aAAKf2wACoBoAAqAcAAKgHgACoCAAAqAjAAKgJAACoCUAAqAmAAKgJwACoCkAAqArAAKgLAACoC0AAqAvAAKgMAACoHsAAqCeAAKgvgACoN4AAqDgAAKg4gACoOQAAqDmAAKg6QACoOoAAqDrAAKg7gACoO8AAqDxAAKg8gACoPQAAqD3AAKg+AACoPkAAqD8AAKg/QACoQIAAqEPAAKhFAACoRYAAqEYAAKhHQACoSAAAqEjAAKhJQACoUoAAqFuAAKhlQACobkAAqG8AAKhvgACocAAAqHCAAKhxAACocYAAqHHAAKhygACodcAAqHoAAKh6gACoewAAqHuAAKh8AACofIAAqH0AAKh9gACofgAAqIJAAKiDAACog8AAqISAAKiFQACohgAAqIbAAKiHgACoiEAAqIjAAKiYgAComQAAqJmAAKiaAAComsAAqJsAAKibQACom4AAqJvAAKicQAConMAAqJ0AAKidQAConcAAqJ4AAKitwACorkAAqK7AAKivQACosAAAqLBAAKiwgACosMAAqLEAAKixgACosgAAqLJAAKiygACoswAAqLNAAKjDAACow4AAqMRAAKjEwACoxYAAqMXAAKjGAACoxkAAqMaAAKjHAACox4AAqMfAAKjIAACoyIAAqMjAAKjMAACozEAAqMyAAKjNAACo3MAAqN1AAKjdwACo3kAAqN8AAKjfQACo34AAqN/AAKjgAACo4IAAqOEAAKjhQACo4YAAqOIAAKjiQACo8gAAqPKAAKjzAACo84AAqPRAAKj0gACo9MAAqPUAAKj1QACo9cAAqPZAAKj2gACo9sAAqPdAAKj3gACpB0AAqQfAAKkIQACpCMAAqQmAAKkJwACpCgAAqQpAAKkKgACpCwAAqQuAAKkLwACpDAAAqQyAAKkMwACpHIAAqR0AAKkdgACpHgAAqR7AAKkfAACpH0AAqR+AAKkfwACpIEAAqSDAAKkhAACpIUAAqSHAAKkiAACpMcAAqTJAAKkywACpM0AAqTQAAKk0QACpNIAAqTTAAKk1AACpNYAAqTYAAKk2QACpNoAAqTcAAKk3QACpQIAAqUmAAKlTQACpXEAAqV0AAKldgACpXgAAqV6AAKlfAACpX4AAqV/AAKlggACpY8AAqWeAAKloAACpaIAAqWkAAKlpgACpagAAqWqAAKlrAACpbsAAqW+AAKlwQACpcQAAqXHAAKlygACpc0AAqXQAAKl0gACphEAAqYTAAKmFgACphgAAqYbAAKmHAACph0AAqYeAAKmHwACpiEAAqYjAAKmJAACpiUAAqYnAAKmKAACpmcAAqZpAAKmawACpm0AAqZwAAKmcQACpnIAAqZzAAKmdAACpnYAAqZ4AAKmeQACpnoAAqZ8AAKmfQACprwAAqa+AAKmwAACpsIAAqbFAAKmxgACpscAAqbIAAKmyQACpssAAqbNAAKmzgACps8AAqbRAAKm0gACpxEAAqcTAAKnFgACpxgAAqcbAAKnHAACpx0AAqceAAKnHwACpyEAAqcjAAKnJAACpyUAAqcnAAKnKAACpysAAqdqAAKnbAACp24AAqdwAAKncwACp3QAAqd1AAKndgACp3cAAqd5AAKnewACp3wAAqd9AAKnfwACp4AAAqe/AAKnwQACp8MAAqfFAAKnyAACp8kAAqfKAAKnywACp8wAAqfOAAKn0AACp9EAAqfSAAKn1AACp9UAAqgUAAKoFgACqBgAAqgaAAKoHQACqB4AAqgfAAKoIAACqCEAAqgjAAKoJQACqCYAAqgnAAKoKQACqCoAAqh1AAKomAACqLgAAqjYAAKo2gACqNwAAqjeAAKo4AACqOMAAqjkAAKo5QACqOgAAqjpAAKo6wACqOwAAqjuAAKo8QACqPIAAqjzAAKo9gACqPcAAqj8AAKpCQACqQ4AAqkQAAKpEgACqRcAAqkaAAKpHQACqR8AAqlEAAKpaAACqY8AAqmzAAKptgACqbgAAqm6AAKpvAACqb4AAqnAAAKpwQACqcQAAqnRAAKp4gACqeQAAqnmAAKp6AACqeoAAqnsAAKp7gACqfAAAqnyAAKqAwACqgYAAqoJAAKqDAACqg8AAqoSAAKqFQACqhgAAqobAAKqHQACqlwAAqpeAAKqYAACqmIAAqplAAKqZgACqmcAAqpoAAKqaQACqmsAAqptAAKqbgACqm8AAqpxAAKqcgACqrEAAqqzAAKqtQACqrcAAqq6AAKquwACqrwAAqq9AAKqvgACqsAAAqrCAAKqwwACqsQAAqrGAAKqxwACqwYAAqsIAAKrCwACqw0AAqsQAAKrEQACqxIAAqsTAAKrFAACqxYAAqsYAAKrGQACqxoAAqscAAKrHQACqyoAAqsrAAKrLAACqy4AAqttAAKrbwACq3EAAqtzAAKrdgACq3cAAqt4AAKreQACq3oAAqt8AAKrfgACq38AAquAAAKrggACq4MAAqvCAAKrxAACq8YAAqvIAAKrywACq8wAAqvNAAKrzgACq88AAqvRAAKr0wACq9QAAqvVAAKr1wACq9gAAqwXAAKsGQACrBsAAqwdAAKsIAACrCEAAqwiAAKsIwACrCQAAqwmAAKsKAACrCkAAqwqAAKsLAACrC0AAqxsAAKsbgACrHAAAqxyAAKsdQACrHYAAqx3AAKseAACrHkAAqx7AAKsfQACrH4AAqx/AAKsgQACrIIAAqzBAAKswwACrMUAAqzHAAKsygACrMsAAqzMAAKszQACrM4AAqzQAAKs0gACrNMAAqzUAAKs1gACrNcAAqz8AAKtIAACrUcAAq1rAAKtbgACrXAAAq1yAAKtdAACrXYAAq14AAKteQACrXwAAq2JAAKtmAACrZoAAq2cAAKtngACraAAAq2iAAKtpAACraYAAq21AAKtuAACrbsAAq2+AAKtwQACrcQAAq3HAAKtygACrcwAAq4LAAKuDQACrg8AAq4RAAKuFAACrhUAAq4WAAKuFwACrhgAAq4aAAKuHAACrh0AAq4eAAKuIAACriEAAq5gAAKuYgACrmQAAq5mAAKuaQACrmoAAq5rAAKubAACrm0AAq5vAAKucQACrnIAAq5zAAKudQACrnYAAq61AAKutwACrrkAAq67AAKuvgACrr8AAq7AAAKuwQACrsIAAq7EAAKuxgACrscAAq7IAAKuygACrssAAq8KAAKvDAACrw4AAq8QAAKvEwACrxQAAq8VAAKvFgACrxcAAq8ZAAKvGwACrxwAAq8dAAKvHwACryAAAq9fAAKvYQACr2MAAq9lAAKvaAACr2kAAq9qAAKvawACr2wAAq9uAAKvcAACr3EAAq9yAAKvdAACr3UAAq+0AAKvtgACr7gAAq+6AAKvvQACr74AAq+/AAKvwAACr8EAAq/DAAKvxQACr8YAAq/HAAKvyQACr8oAArAJAAKwCwACsA0AArAPAAKwEgACsBMAArAUAAKwFQACsBYAArAYAAKwGgACsBsAArAcAAKwHgACsB8AArBqAAKwjQACsK0AArDNAAKwzwACsNEAArDTAAKw1QACsNgAArDZAAKw2gACsN0AArDeAAKw4AACsOEAArDjAAKw5gACsOcAArDoAAKw6wACsOwAArDxAAKw/gACsQMAArEFAAKxBwACsQwAArEPAAKxEgACsRQAArE5AAKxXQACsYQAArGoAAKxqwACsa0AArGvAAKxsQACsbMAArG1AAKxtgACsbkAArHGAAKx1wACsdkAArHbAAKx3QACsd8AArHhAAKx4wACseUAArHnAAKx+AACsfsAArH+AAKyAQACsgQAArIHAAKyCgACsg0AArIQAAKyEgACslEAArJTAAKyVQACslcAArJaAAKyWwACslwAArJdAAKyXgACsmAAArJiAAKyYwACsmQAArJmAAKyZwACsqYAArKoAAKyqgACsqwAArKvAAKysAACsrEAArKyAAKyswACsrUAArK3AAKyuAACsrkAArK7AAKyvAACsvsAArL9AAKzAAACswIAArMFAAKzBgACswcAArMIAAKzCQACswsAArMNAAKzDgACsw8AArMRAAKzEgACsx8AArMgAAKzIQACsyMAArNiAAKzZAACs2YAArNoAAKzawACs2wAArNtAAKzbgACs28AArNxAAKzcwACs3QAArN1AAKzdwACs3gAArO3AAKzuQACs7sAArO9AAKzwAACs8EAArPCAAKzwwACs8QAArPGAAKzyAACs8kAArPKAAKzzAACs80AArQMAAK0DgACtBAAArQSAAK0FQACtBYAArQXAAK0GAACtBkAArQbAAK0HQACtB4AArQfAAK0IQACtCIAArRhAAK0YwACtGUAArRnAAK0agACtGsAArRsAAK0bQACtG4AArRwAAK0cgACtHMAArR0AAK0dgACtHcAArS2AAK0uAACtLoAArS8AAK0vwACtMAAArTBAAK0wgACtMMAArTFAAK0xwACtMgAArTJAAK0ywACtMwAArTxAAK1FQACtTwAArVgAAK1YwACtWUAArVnAAK1aQACtWsAArVtAAK1bgACtXEAArV+AAK1jQACtY8AArWRAAK1kwACtZUAArWXAAK1mQACtZsAArWqAAK1rQACtbAAArWzAAK1tgACtbkAArW8AAK1vwACtcEAArYAAAK2AgACtgQAArYGAAK2CQACtgoAArYLAAK2DAACtg0AArYPAAK2EQACthIAArYTAAK2FQACthYAArZVAAK2VwACtlkAArZbAAK2XgACtl8AArZgAAK2YQACtmIAArZkAAK2ZgACtmcAArZoAAK2agACtmsAAraqAAK2rAACtq4AArawAAK2swACtrQAAra1AAK2tgACtrcAAra5AAK2uwACtrwAAra9AAK2vwACtsAAArb/AAK3AQACtwMAArcFAAK3CAACtwkAArcKAAK3CwACtwwAArcOAAK3EAACtxEAArcSAAK3FAACtxUAArdUAAK3VgACt1gAArdaAAK3XQACt14AArdfAAK3YAACt2EAArdjAAK3ZQACt2YAArdnAAK3aQACt2oAArepAAK3qwACt60AArevAAK3sgACt7MAAre0AAK3tQACt7YAAre4AAK3ugACt7sAAre8AAK3vgACt78AArf+AAK4AAACuAIAArgEAAK4BwACuAgAArgJAAK4CgACuAsAArgNAAK4DwACuBAAArgRAAK4EwACuBQAArhfAAK4ggACuKIAArjCAAK4xAACuMYAArjIAAK4ygACuM0AArjOAAK4zwACuNIAArjTAAK41QACuNYAArjYAAK42wACuNwAArjdAAK44AACuOEAArjmAAK48wACuPgAArj6AAK4/AACuQEAArkEAAK5BwACuQkAArkuAAK5UgACuXkAArmdAAK5oAACuaIAArmkAAK5pgACuagAArmqAAK5qwACua4AArm7AAK5zAACuc4AArnQAAK50gACudQAArnWAAK52AACudoAArncAAK57QACufAAArnzAAK59gACufkAArn8AAK5/wACugIAAroFAAK6BwACukYAArpIAAK6SgACukwAArpPAAK6UAACulEAArpSAAK6UwACulUAArpXAAK6WAACulkAArpbAAK6XAACupsAArqdAAK6nwACuqEAArqkAAK6pQACuqYAArqnAAK6qAACuqoAArqsAAK6rQACuq4AArqwAAK6sQACuvAAArryAAK69QACuvcAArr6AAK6+wACuvwAArr9AAK6/gACuwAAArsCAAK7AwACuwQAArsGAAK7BwACuxQAArsVAAK7FgACuxgAArtXAAK7WQACu1sAArtdAAK7YAACu2EAArtiAAK7YwACu2QAArtmAAK7aAACu2kAArtqAAK7bAACu20AArusAAK7rgACu7AAAruyAAK7tQACu7YAAru3AAK7uAACu7kAAru7AAK7vQACu74AAru/AAK7wQACu8IAArwBAAK8AwACvAUAArwHAAK8CgACvAsAArwMAAK8DQACvA4AArwQAAK8EgACvBMAArwUAAK8FgACvBcAArxWAAK8WAACvFoAArxcAAK8XwACvGAAArxhAAK8YgACvGMAArxlAAK8ZwACvGgAArxpAAK8awACvGwAAryrAAK8rQACvK8AAryxAAK8tAACvLUAAry2AAK8twACvLgAAry6AAK8vAACvL0AAry+AAK8wAACvMEAArzmAAK9CgACvTEAAr1VAAK9WAACvVoAAr1cAAK9XgACvWAAAr1iAAK9YwACvWYAAr1zAAK9ggACvYQAAr2GAAK9iAACvYoAAr2MAAK9jgACvZAAAr2fAAK9ogACvaUAAr2oAAK9qwACva4AAr2xAAK9tAACvbYAAr31AAK99wACvfkAAr37AAK9/gACvf8AAr4AAAK+AQACvgIAAr4EAAK+BgACvgcAAr4IAAK+CgACvgsAAr5KAAK+TAACvk4AAr5QAAK+UwACvlQAAr5VAAK+VgACvlcAAr5ZAAK+WwACvlwAAr5dAAK+XwACvmAAAr6fAAK+oQACvqMAAr6lAAK+qAACvqkAAr6qAAK+qwACvqwAAr6uAAK+sAACvrEAAr6yAAK+tAACvrUAAr70AAK+9gACvvgAAr76AAK+/QACvv4AAr7/AAK/AAACvwEAAr8DAAK/BQACvwYAAr8HAAK/CQACvwoAAr9JAAK/SwACv00AAr9PAAK/UgACv1MAAr9UAAK/VQACv1YAAr9YAAK/WgACv1sAAr9cAAK/XgACv18AAr+eAAK/oAACv6IAAr+kAAK/pwACv6gAAr+pAAK/qgACv6sAAr+tAAK/rwACv7AAAr+xAAK/swACv7QAAr/zAAK/9QACv/cAAr/5AAK//AACv/0AAr/+AAK//wACwAAAAsACAALABAACwAUAAsAGAALACAACwAkAAsBUAALAdwACwJcAAsC3AALAuQACwLsAAsC9AALAvwACwMIAAsDDAALAxAACwMcAAsDIAALAygACwMsAAsDNAALA0AACwNEAAsDSAALA1QACwNYAAsDbAALA6AACwO0AAsDvAALA8QACwPYAAsD5AALA/AACwP4AAsEjAALBRwACwW4AAsGSAALBlQACwZcAAsGZAALBmwACwZ0AAsGfAALBoAACwaMAAsGwAALBwQACwcMAAsHFAALBxwACwckAAsHLAALBzQACwc8AAsHRAALB4gACweUAAsHoAALB6wACwe4AAsHxAALB9AACwfcAAsH6AALB/AACwjsAAsI9AALCPwACwkEAAsJEAALCRQACwkYAAsJHAALCSAACwkoAAsJMAALCTQACwk4AAsJQAALCUQACwpAAAsKSAALClAACwpYAAsKZAALCmgACwpsAAsKcAALCnQACwp8AAsKhAALCogACwqMAAsKlAALCpgACwuUAAsLnAALC6gACwuwAAsLvAALC8AACwvEAAsLyAALC8wACwvUAAsL3AALC+AACwvkAAsL7AALC/AACwwkAAsMKAALDCwACww0AAsNMAALDTgACw1AAAsNSAALDVQACw1YAAsNXAALDWAACw1kAAsNbAALDXQACw14AAsNfAALDYQACw2IAAsOhAALDowACw6UAAsOnAALDqgACw6sAAsOsAALDrQACw64AAsOwAALDsgACw7MAAsO0AALDtgACw7cAAsP2AALD+AACw/oAAsP8AALD/wACxAAAAsQBAALEAgACxAMAAsQFAALEBwACxAgAAsQJAALECwACxAwAAsRLAALETQACxE8AAsRRAALEVAACxFUAAsRWAALEVwACxFgAAsRaAALEXAACxF0AAsReAALEYAACxGEAAsSgAALEogACxKQAAsSmAALEqQACxKoAAsSrAALErAACxK0AAsSvAALEsQACxLIAAsSzAALEtQACxLYAAsTbAALE/wACxSYAAsVKAALFTQACxU8AAsVRAALFUwACxVUAAsVXAALFWAACxVsAAsVoAALFdwACxXkAAsV7AALFfQACxX8AAsWBAALFgwACxYUAAsWUAALFlwACxZoAAsWdAALFoAACxaMAAsWmAALFqQACxasAAsXqAALF7AACxe8AAsXxAALF9AACxfUAAsX2AALF9wACxfgAAsX6AALF/AACxf0AAsX+AALGAAACxgEAAsZAAALGQgACxkQAAsZGAALGSQACxkoAAsZLAALGTAACxk0AAsZPAALGUQACxlIAAsZTAALGVQACxlYAAsaVAALGlwACxpkAAsabAALGngACxp8AAsagAALGoQACxqIAAsakAALGpgACxqcAAsaoAALGqgACxqsAAsbqAALG7AACxu8AAsbxAALG9AACxvUAAsb2AALG9wACxvgAAsb6AALG/AACxv0AAsb+AALHAAACxwEAAsdAAALHQgACx0QAAsdGAALHSQACx0oAAsdLAALHTAACx00AAsdPAALHUQACx1IAAsdTAALHVQACx1YAAseVAALHlwACx5kAAsebAALHngACx58AAsegAALHoQACx6IAAsekAALHpgACx6cAAseoAALHqgACx6sAAsfqAALH7AACx+4AAsfwAALH8wACx/QAAsf1AALH9gACx/cAAsf5AALH+wACx/wAAsf9AALH/wACyAAAAshLAALIbgACyI4AAsiuAALIsAACyLIAAsi0AALItgACyLkAAsi6AALIuwACyL4AAsi/AALIwQACyMIAAsjEAALIxwACyMgAAsjJAALIzAACyM0AAsjSAALI3wACyOQAAsjmAALI6AACyO0AAsjwAALI8wACyPUAAskaAALJPgACyWUAAsmJAALJjAACyY4AAsmQAALJkgACyZQAAsmWAALJlwACyZoAAsmnAALJuAACyboAAsm8AALJvgACycAAAsnCAALJxAACycYAAsnIAALJ2QACydwAAsnfAALJ4gACyeUAAsnoAALJ6wACye4AAsnxAALJ8wACyjIAAso0AALKNgACyjgAAso7AALKPAACyj0AAso+AALKPwACykEAAspDAALKRAACykUAAspHAALKSAACyocAAsqJAALKiwACyo0AAsqQAALKkQACypIAAsqTAALKlAACypYAAsqYAALKmQACypoAAsqcAALKnQACytwAAsreAALK4QACyuMAAsrmAALK5wACyugAAsrpAALK6gACyuwAAsruAALK7wACyvAAAsryAALK8wACywAAAssBAALLAgACywQAAstDAALLRQACy0cAAstJAALLTAACy00AAstOAALLTwACy1AAAstSAALLVAACy1UAAstWAALLWAACy1kAAsuYAALLmgACy5wAAsueAALLoQACy6IAAsujAALLpAACy6UAAsunAALLqQACy6oAAsurAALLrQACy64AAsvtAALL7wACy/EAAsvzAALL9gACy/cAAsv4AALL+QACy/oAAsv8AALL/gACy/8AAswAAALMAgACzAMAAsxCAALMRAACzEYAAsxIAALMSwACzEwAAsxNAALMTgACzE8AAsxRAALMUwACzFQAAsxVAALMVwACzFgAAsyXAALMmQACzJsAAsydAALMoAACzKEAAsyiAALMowACzKQAAsymAALMqAACzKkAAsyqAALMrAACzK0AAszSAALM9gACzR0AAs1BAALNRAACzUYAAs1IAALNSgACzUwAAs1OAALNTwACzVIAAs1fAALNbgACzXAAAs1yAALNdAACzXYAAs14AALNegACzXwAAs2LAALNjgACzZEAAs2UAALNlwACzZoAAs2dAALNoAACzaIAAs3hAALN4wACzeUAAs3nAALN6gACzesAAs3sAALN7QACze4AAs3wAALN8gACzfMAAs30AALN9gACzfcAAs42AALOOAACzjoAAs48AALOPwACzkAAAs5BAALOQgACzkMAAs5FAALORwACzkgAAs5JAALOSwACzkwAAs6LAALOjQACzo8AAs6RAALOlAACzpUAAs6WAALOlwACzpgAAs6aAALOnAACzp0AAs6eAALOoAACzqEAAs7gAALO4gACzuQAAs7mAALO6QACzuoAAs7rAALO7AACzu0AAs7vAALO8QACzvIAAs7zAALO9QACzvYAAs81AALPNwACzzkAAs87AALPPgACzz8AAs9AAALPQQACz0IAAs9EAALPRgACz0cAAs9IAALPSgACz0sAAs+KAALPjAACz44AAs+QAALPkwACz5QAAs+VAALPlgACz5cAAs+ZAALPmwACz5wAAs+dAALPnwACz6AAAs/fAALP4QACz+MAAs/lAALP6AACz+kAAs/qAALP6wACz+wAAs/uAALP8AACz/EAAs/yAALP9AACz/UAAtBAAALQYwAC0IMAAtCjAALQpQAC0KcAAtCpAALQqwAC0K4AAtCvAALQsAAC0LMAAtC0AALQtgAC0LcAAtC5AALQvAAC0L0AAtC+AALQwQAC0MIAAtDHAALQ1AAC0NkAAtDbAALQ3QAC0OIAAtDlAALQ6AAC0OoAAtEPAALRMwAC0VoAAtF+AALRgQAC0YMAAtGFAALRhwAC0YkAAtGLAALRjAAC0Y8AAtGcAALRrQAC0a8AAtGxAALRswAC0bUAAtG3AALRuQAC0bsAAtG9AALRzgAC0dEAAtHUAALR1wAC0doAAtHdAALR4AAC0eMAAtHmAALR6AAC0icAAtIpAALSKwAC0i0AAtIwAALSMQAC0jIAAtIzAALSNAAC0jYAAtI4AALSOQAC0joAAtI8AALSPQAC0nwAAtJ+AALSgAAC0oIAAtKFAALShgAC0ocAAtKIAALSiQAC0osAAtKNAALSjgAC0o8AAtKRAALSkgAC0tEAAtLTAALS1gAC0tgAAtLbAALS3AAC0t0AAtLeAALS3wAC0uEAAtLjAALS5AAC0uUAAtLnAALS6AAC0vUAAtL2AALS9wAC0vkAAtM4AALTOgAC0zwAAtM+AALTQQAC00IAAtNDAALTRAAC00UAAtNHAALTSQAC00oAAtNLAALTTQAC004AAtONAALTjwAC05EAAtOTAALTlgAC05cAAtOYAALTmQAC05oAAtOcAALTngAC058AAtOgAALTogAC06MAAtPiAALT5AAC0+YAAtPoAALT6wAC0+wAAtPtAALT7gAC0+8AAtPxAALT8wAC0/QAAtP1AALT9wAC0/gAAtQ3AALUOQAC1DsAAtQ9AALUQAAC1EEAAtRCAALUQwAC1EQAAtRGAALUSAAC1EkAAtRKAALUTAAC1E0AAtSMAALUjgAC1JAAAtSSAALUlQAC1JYAAtSXAALUmAAC1JkAAtSbAALUnQAC1J4AAtSfAALUoQAC1KIAAtTHAALU6wAC1RIAAtU2AALVOQAC1TsAAtU9AALVPwAC1UEAAtVDAALVRAAC1UcAAtVUAALVYwAC1WUAAtVnAALVaQAC1WsAAtVtAALVbwAC1XEAAtWAAALVgwAC1YYAAtWJAALVjAAC1Y8AAtWSAALVlQAC1ZcAAtXWAALV2AAC1dsAAtXdAALV4AAC1eEAAtXiAALV4wAC1eQAAtXmAALV6AAC1ekAAtXqAALV7AAC1e0AAtYsAALWLgAC1jAAAtYyAALWNQAC1jYAAtY3AALWOAAC1jkAAtY7AALWPQAC1j4AAtY/AALWQQAC1kIAAtaBAALWgwAC1oUAAtaHAALWigAC1osAAtaMAALWjQAC1o4AAtaQAALWkgAC1pMAAtaUAALWlgAC1pcAAtbWAALW2AAC1tsAAtbdAALW4AAC1uEAAtbiAALW4wAC1uQAAtbmAALW6AAC1ukAAtbqAALW7AAC1u0AAtcsAALXLgAC1zAAAtcyAALXNQAC1zYAAtc3AALXOAAC1zkAAtc7AALXPQAC1z4AAtc/AALXQQAC10IAAteBAALXgwAC14UAAteHAALXigAC14sAAteMAALXjQAC144AAteQAALXkgAC15MAAteUAALXlgAC15cAAtfWAALX2AAC19oAAtfcAALX3wAC1+AAAtfhAALX4gAC1+MAAtflAALX5wAC1+gAAtfpAALX6wAC1+wAAtg3AALYWgAC2HoAAtiaAALYnAAC2J4AAtigAALYogAC2KUAAtimAALYpwAC2KoAAtirAALYrQAC2K4AAtiwAALYswAC2LQAAti1AALYuAAC2LkAAti+AALYywAC2NAAAtjSAALY1AAC2NkAAtjcAALY3wAC2OEAAtkGAALZKgAC2VEAAtl1AALZeAAC2XoAAtl8AALZfgAC2YAAAtmCAALZgwAC2YYAAtmTAALZpAAC2aYAAtmoAALZqgAC2awAAtmuAALZsAAC2bIAAtm0AALZxQAC2cgAAtnLAALZzgAC2dEAAtnUAALZ1wAC2doAAtndAALZ3wAC2h4AAtogAALaIgAC2iQAAtonAALaKAAC2ikAAtoqAALaKwAC2i0AAtovAALaMAAC2jEAAtozAALaNAAC2nMAAtp1AALadwAC2nkAAtp8AALafQAC2n4AAtp/AALagAAC2oIAAtqEAALahQAC2oYAAtqIAALaiQAC2sgAAtrKAALazQAC2s8AAtrSAALa0wAC2tQAAtrVAALa1gAC2tgAAtraAALa2wAC2twAAtreAALa3wAC2uwAAtrtAALa7gAC2vAAAtsvAALbMQAC2zMAAts1AALbOAAC2zkAAts6AALbOwAC2zwAAts+AALbQAAC20EAAttCAALbRAAC20UAAtuEAALbhgAC24gAAtuKAALbjQAC244AAtuPAALbkAAC25EAAtuTAALblQAC25YAAtuXAALbmQAC25oAAtvZAALb2wAC290AAtvfAALb4gAC2+MAAtvkAALb5QAC2+YAAtvoAALb6gAC2+sAAtvsAALb7gAC2+8AAtwuAALcMAAC3DIAAtw0AALcNwAC3DgAAtw5AALcOgAC3DsAAtw9AALcPwAC3EAAAtxBAALcQwAC3EQAAtyDAALchQAC3IcAAtyJAALcjAAC3I0AAtyOAALcjwAC3JAAAtySAALclAAC3JUAAtyWAALcmAAC3JkAAty+AALc4gAC3QkAAt0tAALdMAAC3TIAAt00AALdNgAC3TgAAt06AALdOwAC3T4AAt1LAALdWgAC3VwAAt1eAALdYAAC3WIAAt1kAALdZgAC3WgAAt13AALdegAC3X0AAt2AAALdgwAC3YYAAt2JAALdjAAC3Y4AAt3NAALdzwAC3dEAAt3TAALd1gAC3dcAAt3YAALd2QAC3doAAt3cAALd3gAC3d8AAt3gAALd4gAC3eMAAt4iAALeJAAC3iYAAt4oAALeKwAC3iwAAt4tAALeLgAC3i8AAt4xAALeMwAC3jQAAt41AALeNwAC3jgAAt53AALeeQAC3nsAAt59AALegAAC3oEAAt6CAALegwAC3oQAAt6GAALeiAAC3okAAt6KAALejAAC3o0AAt7MAALezgAC3tAAAt7SAALe1QAC3tYAAt7XAALe2AAC3tkAAt7bAALe3QAC3t4AAt7fAALe4QAC3uIAAt8hAALfIwAC3yUAAt8nAALfKgAC3ysAAt8sAALfLQAC3y4AAt8wAALfMgAC3zMAAt80AALfNgAC3zcAAt92AALfeAAC33oAAt98AALffwAC34AAAt+BAALfggAC34MAAt+FAALfhwAC34gAAt+JAALfiwAC34wAAt/LAALfzQAC388AAt/RAALf1AAC39UAAt/WAALf1wAC39gAAt/aAALf3AAC390AAt/eAALf4AAC3+EAAuAsAALgTwAC4G8AAuCPAALgkQAC4JMAAuCVAALglwAC4JoAAuCbAALgnAAC4J8AAuCgAALgogAC4KMAAuClAALgqAAC4KkAAuCqAALgrQAC4K4AAuCzAALgwAAC4MUAAuDHAALgyQAC4M4AAuDRAALg1AAC4NYAAuD7AALhHwAC4UYAAuFqAALhbQAC4W8AAuFxAALhcwAC4XUAAuF3AALheAAC4XsAAuGIAALhmQAC4ZsAAuGdAALhnwAC4aEAAuGjAALhpQAC4acAAuGpAALhugAC4b0AAuHAAALhwwAC4cYAAuHJAALhzAAC4c8AAuHSAALh1AAC4hMAAuIVAALiFwAC4hkAAuIcAALiHQAC4h4AAuIfAALiIAAC4iIAAuIkAALiJQAC4iYAAuIoAALiKQAC4mgAAuJqAALibAAC4m4AAuJxAALicgAC4nMAAuJ0AALidQAC4ncAAuJ5AALiegAC4nsAAuJ9AALifgAC4r0AAuK/AALiwgAC4sQAAuLHAALiyAAC4skAAuLKAALiywAC4s0AAuLPAALi0AAC4tEAAuLTAALi1AAC4uEAAuLiAALi4wAC4uUAAuMkAALjJgAC4ygAAuMqAALjLQAC4y4AAuMvAALjMAAC4zEAAuMzAALjNQAC4zYAAuM3AALjOQAC4zoAAuN5AALjewAC430AAuN/AALjggAC44MAAuOEAALjhQAC44YAAuOIAALjigAC44sAAuOMAALjjgAC448AAuPOAALj0AAC49IAAuPUAALj1wAC49gAAuPZAALj2gAC49sAAuPdAALj3wAC4+AAAuPhAALj4wAC4+QAAuQjAALkJQAC5CcAAuQpAALkLAAC5C0AAuQuAALkLwAC5DAAAuQyAALkNAAC5DUAAuQ2AALkOAAC5DkAAuR4AALkegAC5HwAAuR+AALkgQAC5IIAAuSDAALkhAAC5IUAAuSHAALkiQAC5IoAAuSLAALkjQAC5I4AAuSzAALk1wAC5P4AAuUiAALlJQAC5ScAAuUpAALlKwAC5S0AAuUvAALlMAAC5TMAAuVAAALlTwAC5VEAAuVTAALlVQAC5VcAAuVZAALlWwAC5V0AAuVsAALlbwAC5XIAAuV1AALleAAC5XsAAuV+AALlgQAC5YMAAuXCAALlxAAC5cYAAuXIAALlywAC5cwAAuXNAALlzgAC5c8AAuXRAALl0wAC5dQAAuXVAALl1wAC5dgAAuYXAALmGQAC5hsAAuYdAALmIAAC5iEAAuYiAALmIwAC5iQAAuYmAALmKAAC5ikAAuYqAALmLAAC5i0AAuZsAALmbgAC5nAAAuZyAALmdQAC5nYAAuZ3AALmeAAC5nkAAuZ7AALmfQAC5n4AAuZ/AALmgQAC5oIAAubBAALmwwAC5sUAAubHAALmygAC5ssAAubMAALmzQAC5s4AAubQAALm0gAC5tMAAubUAALm1gAC5tcAAucWAALnGAAC5xoAAuccAALnHwAC5yAAAuchAALnIgAC5yMAAuclAALnJwAC5ygAAucpAALnKwAC5ywAAudrAALnbQAC528AAudxAALndAAC53UAAud2AALndwAC53gAAud6AALnfAAC530AAud+AALngAAC54EAAufAAALnwgAC58QAAufGAALnyQAC58oAAufLAALnzAAC580AAufPAALn0QAC59IAAufTAALn1QAC59YAAughAALoRAAC6GQAAuiEAALohgAC6IgAAuiKAALojAAC6I8AAuiQAALokQAC6JQAAuiVAALolwAC6JgAAuiaAALonQAC6J4AAuifAALoogAC6KMAAuisAALouQAC6L4AAujAAALowgAC6McAAujKAALozQAC6M8AAuj0AALpGAAC6T8AAuljAALpZgAC6WgAAulqAALpbAAC6W4AAulwAALpcQAC6XQAAumBAALpkgAC6ZQAAumWAALpmAAC6ZoAAumcAALpngAC6aAAAumiAALpswAC6bYAAum5AALpvAAC6b8AAunCAALpxQAC6cgAAunLAALpzQAC6gwAAuoOAALqEAAC6hIAAuoVAALqFgAC6hcAAuoYAALqGQAC6hsAAuodAALqHgAC6h8AAuohAALqIgAC6mEAAupjAALqZQAC6mcAAupqAALqawAC6mwAAuptAALqbgAC6nAAAupyAALqcwAC6nQAAup2AALqdwAC6rYAAuq4AALquwAC6r0AAurAAALqwQAC6sIAAurDAALqxAAC6sYAAurIAALqyQAC6soAAurMAALqzQAC6toAAurbAALq3AAC6t4AAusdAALrHwAC6yEAAusjAALrJgAC6ycAAusoAALrKQAC6yoAAussAALrLgAC6y8AAuswAALrMgAC6zMAAutyAALrdAAC63YAAut4AALrewAC63wAAut9AALrfgAC638AAuuBAALrgwAC64QAAuuFAALrhwAC64gAAuvHAALryQAC68sAAuvNAALr0AAC69EAAuvSAALr0wAC69QAAuvWAALr2AAC69kAAuvaAALr3AAC690AAuwcAALsHgAC7CAAAuwiAALsJQAC7CYAAuwnAALsKAAC7CkAAuwrAALsLQAC7C4AAuwvAALsMQAC7DIAAuxxAALscwAC7HUAAux3AALsegAC7HsAAux8AALsfQAC7H4AAuyAAALsggAC7IMAAuyEAALshgAC7IcAAuysAALs0AAC7PcAAu0bAALtHgAC7SAAAu0iAALtJAAC7SYAAu0oAALtKQAC7SwAAu05AALtSAAC7UoAAu1MAALtTgAC7VAAAu1SAALtVAAC7VYAAu1lAALtaAAC7WsAAu1uAALtcQAC7XQAAu13AALtegAC7XwAAu27AALtvQAC7b8AAu3BAALtxAAC7cUAAu3GAALtxwAC7cgAAu3KAALtzAAC7c0AAu3OAALt0AAC7dEAAu4QAALuEgAC7hQAAu4WAALuGQAC7hoAAu4bAALuHAAC7h0AAu4fAALuIQAC7iIAAu4jAALuJQAC7iYAAu5lAALuZwAC7mkAAu5rAALubgAC7m8AAu5wAALucQAC7nIAAu50AALudgAC7ncAAu54AALuegAC7nsAAu66AALuvAAC7r4AAu7AAALuwwAC7sQAAu7FAALuxgAC7scAAu7JAALuywAC7swAAu7NAALuzwAC7tAAAu8PAALvEQAC7xMAAu8VAALvGAAC7xkAAu8aAALvGwAC7xwAAu8eAALvIAAC7yEAAu8iAALvJAAC7yUAAu9kAALvZgAC72gAAu9qAALvbQAC724AAu9vAALvcAAC73EAAu9zAALvdQAC73YAAu93AALveQAC73oAAu+5AALvuwAC770AAu+/AALvwgAC78MAAu/EAALvxQAC78YAAu/IAALvygAC78sAAu/MAALvzgAC788AAvAaAALwPQAC8F0AAvB9AALwfwAC8IEAAvCDAALwhQAC8IgAAvCJAALwigAC8I0AAvCOAALwkAAC8JEAAvCTAALwlgAC8JcAAvCYAALwmwAC8JwAAvChAALwrgAC8LMAAvC1AALwtwAC8LwAAvC/AALwwgAC8MQAAvDpAALxDQAC8TQAAvFYAALxWwAC8V0AAvFfAALxYQAC8WMAAvFlAALxZgAC8WkAAvF2AALxhwAC8YkAAvGLAALxjQAC8Y8AAvGRAALxkwAC8ZUAAvGXAALxqAAC8asAAvGuAALxsQAC8bQAAvG3AALxugAC8b0AAvHAAALxwgAC8gEAAvIDAALyBQAC8gcAAvIKAALyCwAC8gwAAvINAALyDgAC8hAAAvISAALyEwAC8hQAAvIWAALyFwAC8lYAAvJYAALyWgAC8lwAAvJfAALyYAAC8mEAAvJiAALyYwAC8mUAAvJnAALyaAAC8mkAAvJrAALybAAC8qsAAvKtAALysAAC8rI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AAwNZAAMDXAADA10AAwNeAAMDXwADA2AAAwNiAAMDZAADA2UAAwNmAAMDaAADA2kAAwOoAAMDqgADA6wAAwOuAAMDsQADA7IAAwOzAAMDtAADA7UAAwO3AAMDuQADA7oAAwO7AAMDvQADA74AAwP9AAMD/wADBAEAAwQDAAMEBgADBAcAAwQIAAMECQADBAoAAwQMAAMEDgADBA8AAwQQAAMEEgADBBMAAwRSAAMEVAADBFYAAwRYAAMEWwADBFwAAwRdAAMEXgADBF8AAwRhAAMEYwADBGQAAwRlAAMEZwADBGgAAwSNAAMEsQADBNgAAwT8AAME/wADBQEAAwUDAAMFBQADBQcAAwUJAAMFCgADBQ0AAwUaAAMFKQADBSsAAwUtAAMFLwADBTEAAwUzAAMFNQADBTcAAwVGAAMFSQADBUwAAwVPAAMFUgADBVUAAwVYAAMFWwADBV0AAwWcAAMFngADBaEAAwWjAAMFpgADBacAAwWoAAMFqQADBaoAAwWsAAMFrgADBa8AAwWwAAMFsgADBbMAAwXyAAMF9AADBfYAAwX4AAMF+wADBfwAAwX9AAMF/gADBf8AAwYBAAMGAwADBgQAAwYFAAMGBwADBggAAwZHAAMGSQADBksAAwZNAAMGUAADBlEAAwZSAAMGUwADBlQAAwZWAAMGWAADBlkAAwZaAAMGXAADBl0AAwacAAMGngADBqEAAwajAAMGpgADBqcAAwaoAAMGqQADBqoAAwasAAMGrgADBq8AAwawAAMGsgADBrMAAwbyAAMG9AADBvYAAwb4AAMG+wADBvwAAwb9AAMG/gADBv8AAwcBAAMHAwADBwQAAwcFAAMHBwADBwgAAwdHAAMHSQADB0sAAwdNAAMHUAADB1EAAwdSAAMHUwADB1QAAwdWAAMHWAADB1kAAwdaAAMHXAADB10AAwecAAMHngADB6AAAweiAAMHpQADB6YAAwenAAMHqAADB6kAAwerAAMHrQADB64AAwevAAMHsQADB7IAAwf9AAMIIAADCEAAAwhgAAMIYgADCGQAAwhmAAMIaAADCGsAAwhsAAMIbQADCHAAAwhxAAMIcwADCHQAAwh2AAMIeQADCHoAAwh7AAMIfgADCH8AAwiEAAMIkQADCJYAAwiYAAMImgADCJ8AAwiiAAMIpQADCKcAAwjMAAMI8AADCRcAAwk7AAMJPgADCUAAAwlCAAMJRAADCUYAAwlIAAMJSQADCUwAAwlZAAMJagADCWwAAwluAAMJcAADCXIAAwl0AAMJdgADCXgAAwl6AAMJiwADCY4AAwmRAAMJlAADCZcAAwmaAAMJnQADCaAAAwmjAAMJpQADCeQAAwnmAAMJ6AADCeoAAwntAAMJ7gADCe8AAwnwAAMJ8QADCfMAAwn1AAMJ9gADCfcAAwn5AAMJ+gADCjkAAwo7AAMKPQADCj8AAwpCAAMKQwADCkQAAwpFAAMKRgADCkgAAwpKAAMKSwADCkwAAwpOAAMKTwADCo4AAwqQAAMKkwADCpUAAwqYAAMKmQADCpoAAwqbAAMKnAADCp4AAwqgAAMKoQADCqIAAwqkAAMKpQADCrIAAwqzAAMKtAADCrYAAwr1AAMK9wADCvkAAwr7AAMK/gADCv8AAwsAAAMLAQADCwIAAwsEAAMLBgADCwcAAwsIAAMLCgADCwsAAwtKAAMLTAADC04AAwtQAAMLUwADC1QAAwtVAAMLVgADC1cAAwtZAAMLWwADC1wAAwtdAAMLXwADC2AAAwufAAMLoQADC6MAAwulAAMLqAADC6kAAwuqAAMLqwADC6wAAwuuAAMLsAADC7EAAwuyAAMLtAADC7UAAwv0AAML9gADC/gAAwv6AAML/QADC/4AAwv/AAMMAAADDAEAAwwDAAMMBQADDAYAAwwHAAMMCQADDAoAAwxJAAMMSwADDE0AAwxPAAMMUgADDFMAAwxUAAMMVQADDFYAAwxYAAMMWgADDFsAAwxcAAMMXgADDF8AAwyEAAMMqAADDM8AAwzzAAMM9gADDPgAAwz6AAMM/AADDP4AAw0AAAMNAQADDQQAAw0RAAMNIAADDSIAAw0kAAMNJgADDSgAAw0qAAMNLAADDS4AAw09AAMNQAADDUMAAw1GAAMNSQADDUwAAw1PAAMNUgADDVQAAw2TAAMNlQADDZcAAw2ZAAMNnAADDZ0AAw2eAAMNnwADDaAAAw2iAAMNpAADDaUAAw2mAAMNqAADDakAAw3oAAMN6gADDewAAw3uAAMN8QADDfIAAw3zAAMN9AADDfUAAw33AAMN+QADDfoAAw37AAMN/QADDf4AAw49AAMOPwADDkEAAw5DAAMORgADDkcAAw5IAAMOSQADDkoAAw5MAAMOTgADDk8AAw5QAAMOUgADDlMAAw6SAAMOlAADDpYAAw6YAAMOmwADDpwAAw6dAAMOngADDp8AAw6hAAMOowADDqQAAw6lAAMOpwADDqgAAw7nAAMO6QADDusAAw7tAAMO8AADDvEAAw7yAAMO8wADDvQAAw72AAMO+AADDvkAAw76AAMO/AADDv0AAw88AAMPPgADD0AAAw9CAAMPRQADD0YAAw9HAAMPSAADD0kAAw9LAAMPTQADD04AAw9PAAMPUQADD1IAAw+RAAMPkwADD5UAAw+XAAMPmgADD5sAAw+cAAMPnQADD54AAw+gAAMPogADD6MAAw+kAAMPpgADD6cAAw/yAAMQFQADEDUAAxBVAAMQVwADEFkAAxBbAAMQXQADEGAAAxBhAAMQYgADEGUAAxBmAAMQaAADEGkAAxBrAAMQbgADEG8AAxBwAAMQcwADEHQAAxB9AAMQigADEI8AAxCRAAMQkwADEJgAAxCbAAMQngADEKAAAxDFAAMQ6QADERAAAxE0AAMRNwADETkAAxE7AAMRPQADET8AAxFBAAMRQgADEUUAAxFSAAMRYwADEWUAAxFnAAMRaQADEWsAAxFtAAMRbwADEXEAAxFzAAMRhAADEYcAAxGKAAMRjQADEZAAAxGTAAMRlgADEZkAAxGcAAMRngADEd0AAxHfAAMR4QADEeMAAxHmAAMR5wADEegAAxHpAAMR6gADEewAAxHuAAMR7wADEfAAAxHyAAMR8wADEjIAAxI0AAMSNgADEjgAAxI7AAMSPAADEj0AAxI+AAMSPwADEkEAAxJDAAMSRAADEkUAAxJHAAMSSAADEocAAxKJAAMSjAADEo4AAxKRAAMSkgADEpMAAxKUAAMSlQADEpcAAxKZAAMSmgADEpsAAxKdAAMSngADEqsAAxKsAAMSrQADEq8AAxLuAAMS8AADEvIAAxL0AAMS9wADEvgAAxL5AAMS+gADEvsAAxL9AAMS/wADEwAAAxMBAAMTAwADEwQAAxNDAAMTRQADE0cAAxNJAAMTTAADE00AAxNOAAMTTwADE1AAAxNSAAMTVAADE1UAAxNWAAMTWAADE1kAAxOYAAMTmgADE5wAAxOeAAMToQADE6IAAxOjAAMTpAADE6UAAxOnAAMTqQADE6oAAxOrAAMTrQADE64AAxPtAAMT7wADE/EAAxPzAAMT9gADE/cAAxP4AAMT+QADE/oAAxP8AAMT/gADE/8AAxQAAAMUAgADFAMAAxRCAAMURAADFEYAAxRIAAMUSwADFEwAAxRNAAMUTgADFE8AAxRRAAMUUwADFFQAAxRVAAMUVwADFFgAAxR9AAMUoQADFMgAAxTsAAMU7wADFPEAAxTzAAMU9QADFPcAAxT5AAMU+gADFP0AAxUKAAMVGQADFRsAAxUdAAMVHwADFSEAAxUjAAMVJQADFScAAxU2AAMVOQADFTwAAxU/AAMVQgADFUUAAxVIAAMVSwADFU0AAxWMAAMVjgADFZAAAxWSAAMVlQADFZYAAxWXAAMVmAADFZkAAxWbAAMVnQADFZ4AAxWfAAMVoQADFaIAAxXhAAMV4wADFeUAAxXnAAMV6gADFesAAxXsAAMV7QADFe4AAxXwAAMV8gADFfMAAxX0AAMV9gADFfcAAxY2AAMWOAADFjoAAxY8AAMWPwADFkAAAxZBAAMWQgADFkMAAxZFAAMWRwADFkgAAxZJAAMWSwADFkwAAxaLAAMWjQADFo8AAxaRAAMWlAADFpUAAxaWAAMWlwADFpgAAxaaAAMWnAADFp0AAxaeAAMWoAADFqEAAxbgAAMW4gADFuQAAxbmAAMW6QADFuoAAxbrAAMW7AADFu0AAxbvAAMW8QADFvIAAxbzAAMW9QADFvYAAxc1AAMXNwADFzkAAxc7AAMXPgADFz8AAxdAAAMXQQADF0IAAxdEAAMXRgADF0cAAxdIAAMXSgADF0sAAxeKAAMXjAADF44AAxeQAAMXkwADF5QAAxeVAAMXlgADF5cAAxeZAAMXmwADF5wAAxedAAMXnwADF6AAAxfrAAMYDgADGC4AAxhOAAMYUAADGFIAAxhUAAMYVgADGFkAAxhaAAMYWwADGF4AAxhfAAMYYQADGGIAAxhkAAMYZwADGGgAAxhpAAMYbAADGG0AAxhyAAMYfwADGIQAAxiGAAMYiAADGI0AAxiQAAMYkwADGJUAAxi6AAMY3gADGQUAAxkpAAMZLAADGS4AAxkwAAMZMgADGTQAAxk2AAMZNwADGToAAxlHAAMZWAADGVoAAxlcAAMZXgADGWAAAxliAAMZZAADGWYAAxloAAMZeQADGXwAAxl/AAMZggADGYUAAxmIAAMZiwADGY4AAxmRAAMZkwADGdIAAxnUAAMZ1gADGdgAAxnbAAMZ3AADGd0AAxneAAMZ3wADGeEAAxnjAAMZ5AADGeUAAxnnAAMZ6AADGicAAxopAAMaKwADGi0AAxowAAMaMQADGjIAAxozAAMaNAADGjYAAxo4AAMaOQADGjoAAxo8AAMaPQADGnwAAxp+AAMagQADGoMAAxqGAAMahwADGogAAxqJAAMaigADGowAAxqOAAMajwADGpAAAxqSAAMakwADGqAAAxqhAAMaogADGqQAAxrjAAMa5QADGucAAxrpAAMa7AADGu0AAxruAAMa7wADGvAAAxryAAMa9AADGvUAAxr2AAMa+AADGvkAAxs4AAMbOgADGzwAAxs+AAMbQQADG0IAAxtDAAMbRAADG0UAAxtHAAMbSQADG0oAAxtLAAMbTQADG04AAxuNAAMbjwADG5EAAxuTAAMblgADG5cAAxuYAAMbmQADG5oAAxucAAMbngADG58AAxugAAMbogADG6MAAxviAAMb5AADG+YAAxvoAAMb6wADG+wAAxvtAAMb7gADG+8AAxvxAAMb8wADG/QAAxv1AAMb9wADG/gAAxw3AAMcOQADHDsAAxw9AAMcQAADHEEAAxxCAAMcQwADHEQAAxxGAAMcSAADHEkAAxxKAAMcTAADHE0AAxxyAAMclgADHL0AAxzhAAMc5AADHOYAAxzoAAMc6gADHOwAAxzuAAMc7wADHPIAAxz/AAMdDgADHRAAAx0SAAMdFAADHRYAAx0YAAMdGgADHRwAAx0rAAMdLgADHTEAAx00AAMdNwADHToAAx09AAMdQAADHUIAAx2BAAMdgwADHYYAAx2IAAMdiwADHYwAAx2NAAMdjgADHY8AAx2RAAMdkwADHZQAAx2VAAMdlwADHZgAAx3XAAMd2QADHdsAAx3dAAMd4AADHeEAAx3iAAMd4wADHeQAAx3mAAMd6AADHekAAx3qAAMd7AADHe0AAx4sAAMeLgADHjAAAx4yAAMeNQADHjYAAx43AAMeOAADHjkAAx47AAMePQADHj4AAx4/AAMeQQADHkIAAx6BAAMegwADHoYAAx6IAAMeiwADHowAAx6NAAMejgADHo8AAx6RAAMekwADHpQAAx6VAAMelwADHpgAAx7XAAMe2QADHtsAAx7dAAMe4AADHuEAAx7iAAMe4wADHuQAAx7mAAMe6AADHukAAx7qAAMe7AADHu0AAx8sAAMfLgADHzAAAx8yAAMfNQADHzYAAx83AAMfOAADHzkAAx87AAMfPQADHz4AAx8/AAMfQQADH0IAAx+BAAMfgwADH4UAAx+HAAMfigADH4sAAx+MAAMfjQADH44AAx+QAAMfkgADH5MAAx+UAAMflgADH5cAAx/iAAMgBQADICUAAyBFAAMgRwADIEkAAyBLAAMgTQADIFAAAyBRAAMgUgADIFUAAyBWAAMgWAADIFkAAyBbAAMgXgADIF8AAyBgAAMgYwADIGQAAyBpAAMgdgADIHsAAyB9AAMgfwADIIQAAyCHAAMgigADIIwAAyCxAAMg1QADIPwAAyEgAAMhIwADISUAAyEnAAMhKQADISsAAyEtAAMhLgADITEAAyE+AAMhTwADIVEAAyFTAAMhVQADIVcAAyFZAAMhWwADIV0AAyFfAAMhcAADIXMAAyF2AAMheQADIXwAAyF/AAMhggADIYUAAyGIAAMhigADIckAAyHLAAMhzQADIc8AAyHSAAMh0wADIdQAAyHVAAMh1gADIdgAAyHaAAMh2wADIdwAAyHeAAMh3wADIh4AAyIgAAMiIgADIiQAAyInAAMiKAADIikAAyIqAAMiKwADIi0AAyIvAAMiMAADIjEAAyIzAAMiNAADInMAAyJ1AAMieAADInoAAyJ9AAMifgADIn8AAyKAAAMigQADIoMAAyKFAAMihgADIocAAyKJAAMiigADIpcAAyKYAAMimQADIpsAAyLaAAMi3AADIt4AAyLgAAMi4wADIuQAAyLlAAMi5gADIucAAyLpAAMi6wADIuwAAyLtAAMi7wADIvAAAyMvAAMjMQADIzMAAyM1AAMjOAADIzkAAyM6AAMjOwADIzwAAyM+AAMjQAADI0EAAyNCAAMjRAADI0UAAyOEAAMjhgADI4gAAyOKAAMjjQADI44AAyOPAAMjkAADI5EAAyOTAAMjlQADI5YAAyOXAAMjmQADI5oAAyPZAAMj2wADI90AAyPfAAMj4gADI+MAAyPkAAMj5QADI+YAAyPoAAMj6gADI+sAAyPsAAMj7gADI+8AAyQuAAMkMAADJDIAAyQ0AAMkNwADJDgAAyQ5AAMkOgADJDsAAyQ9AAMkPwADJEAAAyRBAAMkQwADJEQAAyRpAAMkjQADJLQAAyTYAAMk2wADJN0AAyTfAAMk4QADJOMAAyTlAAMk5gADJOkAAyT2AAMlBQADJQcAAyUJAAMlCwADJQ0AAyUPAAMlEQADJRMAAyUiAAMlJQADJSgAAyUrAAMlLgADJTEAAyU0AAMlNwADJTkAAyV4AAMlegADJXwAAyV+AAMlgQADJYIAAyWDAAMlhAADJYUAAyWHAAMliQADJYoAAyWLAAMljQADJY4AAyXNAAMlzwADJdEAAyXTAAMl1gADJdcAAyXYAAMl2QADJdoAAyXcAAMl3gADJd8AAyXgAAMl4gADJeMAAyYiAAMmJAADJiYAAyYoAAMmKwADJiwAAyYtAAMmLgADJi8AAyYxAAMmMwADJjQAAyY1AAMmNwADJjgAAyZ3AAMmeQADJnsAAyZ9AAMmgAADJoEAAyaCAAMmgwADJoQAAyaGAAMmiAADJokAAyaKAAMmjAADJo0AAybMAAMmzgADJtAAAybSAAMm1QADJtYAAybXAAMm2AADJtkAAybbAAMm3QADJt4AAybfAAMm4QADJuIAAychAAMnIwADJyUAAycnAAMnKgADJysAAycsAAMnLQADJy4AAycwAAMnMgADJzMAAyc0AAMnNgADJzcAAyd2AAMneAADJ3oAAyd8AAMnfwADJ4AAAyeBAAMnggADJ4MAAyeFAAMnhwADJ4gAAyeJAAMniwADJ4wAAyfXAAMn+gADKBoAAyg6AAMoPAADKD4AAyhAAAMoQgADKEUAAyhGAAMoRwADKEoAAyhLAAMoTQADKE4AAyhQAAMoUwADKFQAAyhVAAMoWAADKFkAAyheAAMoawADKHAAAyhyAAModAADKHkAAyh8AAMofwADKIEAAyimAAMoygADKPEAAykVAAMpGAADKRoAAykcAAMpHgADKSAAAykiAAMpIwADKSYAAykzAAMpRAADKUYAAylIAAMpSgADKUwAAylOAAMpUAADKVIAAylUAAMpZQADKWgAAylrAAMpbgADKXEAAyl0AAMpdwADKXoAAyl9AAMpfwADKb4AAynAAAMpwgADKcQAAynHAAMpyAADKckAAynKAAMpywADKc0AAynPAAMp0AADKdEAAynTAAMp1AADKhMAAyoVAAMqFwADKhkAAyocAAMqHQADKh4AAyofAAMqIAADKiIAAyokAAMqJQADKiYAAyooAAMqKQADKmgAAypqAAMqbQADKm8AAypyAAMqcwADKnQAAyp1AAMqdgADKngAAyp6AAMqewADKnwAAyp+AAMqfwADKowAAyqNAAMqjgADKpAAAyrPAAMq0QADKtMAAyrVAAMq2AADKtkAAyraAAMq2wADKtwAAyreAAMq4AADKuEAAyriAAMq5AADKuUAAyskAAMrJgADKygAAysqAAMrLQADKy4AAysvAAMrMAADKzEAAyszAAMrNQADKzYAAys3AAMrOQADKzoAAyt5AAMrewADK30AAyt/AAMrggADK4MAAyuEAAMrhQADK4YAAyuIAAMrigADK4sAAyuMAAMrjgADK48AAyvOAAMr0AADK9IAAyvUAAMr1wADK9gAAyvZAAMr2gADK9sAAyvdAAMr3wADK+AAAyvhAAMr4wADK+QAAywjAAMsJQADLCcAAywpAAMsLAADLC0AAywuAAMsLwADLDAAAywyAAMsNAADLDUAAyw2AAMsOAADLDkAAyxeAAMsggADLKkAAyzNAAMs0AADLNIAAyzUAAMs1gADLNgAAyzaAAMs2wADLN4AAyzrAAMs+gADLPwAAyz+AAMtAAADLQIAAy0EAAMtBgADLQgAAy0XAAMtGgADLR0AAy0gAAMtIwADLSYAAy0pAAMtLAADLS4AAy1tAAMtbwADLXEAAy1zAAMtdgADLXcAAy14AAMteQADLXoAAy18AAMtfgADLX8AAy2AAAMtggADLYMAAy3CAAMtxAADLcYAAy3IAAMtywADLcwAAy3NAAMtzgADLc8AAy3RAAMt0wADLdQAAy3VAAMt1wADLdgAAy4XAAMuGQADLhsAAy4dAAMuIAADLiEAAy4iAAMuIwADLiQAAy4mAAMuKAADLikAAy4qAAMuLAADLi0AAy5sAAMubgADLnAAAy5yAAMudQADLnYAAy53AAMueAADLnkAAy57AAMufQADLn4AAy5/AAMugQADLoIAAy7BAAMuwwADLsUAAy7HAAMuygADLssAAy7MAAMuzQADLs4AAy7QAAMu0gADLtMAAy7UAAMu1gADLtcAAy8WAAMvGAADLxoAAy8cAAMvHwADLyAAAy8hAAMvIgADLyMAAy8lAAMvJwADLygAAy8pAAMvKwADLywAAy9rAAMvbQADL28AAy9xAAMvdAADL3UAAy92AAMvdwADL3gAAy96AAMvfAADL30AAy9+AAMvgAADL4EAAy/MAAMv7wADMA8AAzAvAAMwMQADMDMAAzA1AAMwNwADMDoAAzA7AAMwPAADMD8AAzBAAAMwQgADMEMAAzBFAAMwSAADMEkAAzBKAAMwTQADME4AAzBTAAMwYAADMGUAAzBnAAMwaQADMG4AAzBxAAMwdAADMHYAAzCbAAMwvwADMOYAAzEKAAMxDQADMQ8AAzERAAMxEwADMRUAAzEXAAMxGAADMRsAAzEoAAMxOQADMTsAAzE9AAMxPwADMUEAAzFDAAMxRQADMUcAAzFJAAMxWgADMV0AAzFgAAMxYwADMWYAAzFpAAMxbAADMW8AAzFyAAMxdAADMbMAAzG1AAMxtwADMbkAAzG8AAMxvQADMb4AAzG/AAMxwAADMcIAAzHEAAMxxQADMcYAAzHIAAMxyQADMggAAzIKAAMyDAADMg4AAzIRAAMyEgADMhMAAzIUAAMyFQADMhcAAzIZAAMyGgADMhsAAzIdAAMyHgADMl0AAzJfAAMyYgADMmQAAzJnAAMyaAADMmkAAzJqAAMyawADMm0AAzJvAAMycAADMnEAAzJzAAMydAADMoEAAzKCAAMygwADMoUAAzLEAAMyxgADMsgAAzLKAAMyzQADMs4AAzLPAAMy0AADMtEAAzLTAAMy1QADMtYAAzLXAAMy2QADMtoAAzMZAAMzGwADMx0AAzMfAAMzIgADMyMAAzMkAAMzJQADMyYAAzMoAAMzKgADMysAAzMsAAMzLgADMy8AAzNuAAMzcAADM3IAAzN0AAMzdwADM3gAAzN5AAMzegADM3sAAzN9AAMzfwADM4AAAzOBAAMzgwADM4QAAzPDAAMzxQADM8cAAzPJAAMzzAADM80AAzPOAAMzzwADM9AAAzPSAAMz1AADM9UAAzPWAAMz2AADM9kAAzQYAAM0GgADNBwAAzQeAAM0IQADNCIAAzQjAAM0JAADNCUAAzQnAAM0KQADNCoAAzQrAAM0LQADNC4AAzRTAAM0dwADNJ4AAzTCAAM0xQADNMcAAzTJAAM0ywADNM0AAzTPAAM00AADNNMAAzTgAAM07wADNPEAAzTzAAM09QADNPcAAzT5AAM0+wADNP0AAzUMAAM1DwADNRIAAzUVAAM1GAADNRsAAzUeAAM1IQADNSMAAzViAAM1ZAADNWcAAzVpAAM1bAADNW0AAzVuAAM1bwADNXAAAzVyAAM1dAADNXUAAzV2AAM1eAADNXkAAzW4AAM1ugADNbwAAzW+AAM1wQADNcIAAzXDAAM1xAADNcUAAzXHAAM1yQADNcoAAzXLAAM1zQADNc4AAzYNAAM2DwADNhEAAzYTAAM2FgADNhcAAzYYAAM2GQADNhoAAzYcAAM2HgADNh8AAzYgAAM2IgADNiMAAzZiAAM2ZAADNmcAAzZpAAM2bAADNm0AAzZuAAM2bwADNnAAAzZyAAM2dAADNnUAAzZ2AAM2eAADNnkAAza4AAM2ugADNrwAAza+AAM2wQADNsIAAzbDAAM2xAADNsUAAzbHAAM2yQADNsoAAzbLAAM2zQADNs4AAzcNAAM3DwADNxEAAzcTAAM3FgADNxcAAzcYAAM3GQADNxoAAzccAAM3HgADNx8AAzcgAAM3IgADNyMAAzdiAAM3ZAADN2YAAzdoAAM3awADN2wAAzdtAAM3bgADN28AAzdxAAM3cwADN3QAAzd1AAM3dwADN3gAAzfDAAM35gADOAYAAzgmAAM4KAADOCoAAzgsAAM4LgADODEAAzgyAAM4MwADODYAAzg3AAM4OQADODoAAzg8AAM4PwADOEAAAzhBAAM4RAADOEUAAzhKAAM4VwADOFwAAzheAAM4YAADOGUAAzhoAAM4awADOG0AAziSAAM4tgADON0AAzkBAAM5BAADOQYAAzkIAAM5CgADOQwAAzkOAAM5DwADORIAAzkfAAM5MAADOTIAAzk0AAM5NgADOTgAAzk6AAM5PAADOT4AAzlAAAM5UQADOVQAAzlXAAM5WgADOV0AAzlgAAM5YwADOWYAAzlpAAM5awADOaoAAzmsAAM5rgADObAAAzmzAAM5tAADObUAAzm2AAM5twADObkAAzm7AAM5vAADOb0AAzm/AAM5wAADOf8AAzoBAAM6AwADOgUAAzoIAAM6CQADOgoAAzoLAAM6DAADOg4AAzoQAAM6EQADOhIAAzoUAAM6FQADOlQAAzpWAAM6WQADOlsAAzpeAAM6XwADOmAAAzphAAM6YgADOmQAAzpmAAM6ZwADOmgAAzpqAAM6awADOngAAzp5AAM6egADOnwAAzq7AAM6vQADOr8AAzrBAAM6xAADOsUAAzrGAAM6xwADOsgAAzrKAAM6zAADOs0AAzrOAAM60AADOtEAAzsQAAM7EgADOxQAAzsWAAM7GQADOxoAAzsbAAM7HAADOx0AAzsfAAM7IQADOyIAAzsjAAM7JQADOyYAAztlAAM7ZwADO2kAAztrAAM7bgADO28AAztwAAM7cQADO3IAAzt0AAM7dgADO3cAAzt4AAM7egADO3sAAzu6AAM7vAADO74AAzvAAAM7wwADO8QAAzvFAAM7xgADO8cAAzvJAAM7ywADO8wAAzvNAAM7zwADO9AAAzwPAAM8EQADPBMAAzwVAAM8GAADPBkAAzwaAAM8GwADPBwAAzweAAM8IAADPCEAAzwiAAM8JAADPCUAAzxKAAM8bgADPJUAAzy5AAM8vAADPL4AAzzAAAM8wgADPMQAAzzGAAM8xwADPMoAAzzXAAM85gADPOgAAzzqAAM87AADPO4AAzzwAAM88gADPPQAAz0DAAM9BgADPQkAAz0MAAM9DwADPRIAAz0VAAM9GAADPRoAAz1ZAAM9WwADPV0AAz1fAAM9YgADPWMAAz1kAAM9ZQADPWYAAz1oAAM9agADPWsAAz1sAAM9bgADPW8AAz2uAAM9sAADPbIAAz20AAM9twADPbgAAz25AAM9ugADPbsAAz29AAM9vwADPcAAAz3BAAM9wwADPcQAAz4DAAM+BQADPgcAAz4JAAM+DAADPg0AAz4OAAM+DwADPhAAAz4SAAM+FAADPhUAAz4WAAM+GAADPhkAAz5YAAM+WgADPlwAAz5eAAM+YQADPmIAAz5jAAM+ZAADPmUAAz5nAAM+aQADPmoAAz5rAAM+bQADPm4AAz6tAAM+rwADPrEAAz6zAAM+tgADPrcAAz64AAM+uQADProAAz68AAM+vgADPr8AAz7AAAM+wgADPsMAAz8CAAM/BAADPwYAAz8IAAM/CwADPwwAAz8NAAM/DgADPw8AAz8RAAM/EwADPxQAAz8VAAM/FwADPxgAAz9XAAM/WQADP1sAAz9dAAM/YAADP2EAAz9iAAM/YwADP2QAAz9mAAM/aAADP2kAAz9qAAM/bAADP20AAz92AAM/dwADP3kAAz+8AAM/4AADQAQAA0AnAANATgADQG4AA0CVAANAvAADQNwAA0EAAANBJAADQSYAA0EpAANBKwADQS0AA0EvAANBMgADQTUAA0E3AANBOQADQTwAA0E+AANBQAADQUMAA0FGAANBRwADQUwAA0FZAANBXAADQV4AA0FhAANBZAADQWYAA0GLAANBrwADQdYAA0H6AANB/QADQf8AA0IBAANCAwADQgUAA0IHAANCCAADQgsAA0IYAANCKQADQisAA0ItAANCLwADQjEAA0IzAANCNQADQjcAA0I5AANCSgADQk0AA0JQAANCUwADQlYAA0JZAANCXAADQl8AA0JiAANCZAADQqMAA0KlAANCqAADQqoAA0KtAANCrgADQq8AA0KwAANCsQADQrMAA0K1AANCtgADQrcAA0K5AANCugADQsMAA0LEAANCxgADQwUAA0MHAANDCQADQwsAA0MOAANDDwADQxAAA0MRAANDEgADQxQAA0MWAANDFwADQxgAA0MaAANDGwADQ1oAA0NcAANDXgADQ2AAA0NjAANDZAADQ2UAA0NmAANDZwADQ2kAA0NrAANDbAADQ20AA0NvAANDcAADQ68AA0OxAANDtAADQ7YAA0O5AANDugADQ7sAA0O8AANDvQADQ78AA0PBAANDwgADQ8MAA0PFAANDxgADQ88AA0PQAAND0gADRBEAA0QTAANEFQADRBcAA0QaAANEGwADRBwAA0QdAANEHgADRCAAA0QiAANEIwADRCQAA0QmAANEJwADRGYAA0RoAANEawADRG0AA0RwAANEcQADRHIAA0RzAANEdAADRHYAA0R4AANEeQADRHoAA0R8AANEfQADRIoAA0SLAANEjAADRI4AA0TNAANEzwADRNEAA0TTAANE1gADRNcAA0TYAANE2QADRNoAA0TcAANE3gADRN8AA0TgAANE4gADROMAA0UiAANFJAADRScAA0UpAANFLAADRS0AA0UuAANFLwADRTAAA0UyAANFNAADRTUAA0U2AANFOAADRTkAA0VFAANFUgADRVUAA0VYAANFWwADRV4AA0VgAANFZwADRbIAA0XVAANF9QADRhUAA0YXAANGGQADRhsAA0YdAANGIAADRiEAA0YiAANGJQADRiYAA0YoAANGKQADRisAA0YuAANGLwADRjAAA0YzAANGNAADRjkAA0ZGAANGSwADRk0AA0ZPAANGVAADRlcAA0ZaAANGXAADRoEAA0alAANGzAADRvAAA0bzAANG9QADRvcAA0b5AANG+wADRv0AA0b+AANHAQADRw4AA0cfAANHIQADRyMAA0clAANHJwADRykAA0crAANHLQADRy8AA0dAAANHQwADR0YAA0dJAANHTAADR08AA0dSAANHVQADR1gAA0daAANHmQADR5sAA0edAANHnwADR6IAA0ejAANHpAADR6UAA0emAANHqAADR6oAA0erAANHrAADR64AA0evAANH7gADR/AAA0fyAANH9AADR/cAA0f4AANH+QADR/oAA0f7AANH/QADR/8AA0gAAANIAQADSAMAA0gEAANIQwADSEUAA0hIAANISgADSE0AA0hOAANITwADSFAAA0hRAANIUwADSFUAA0hWAANIVwADSFkAA0haAANIZwADSGgAA0hpAANIawADSKoAA0isAANIrgADSLAAA0izAANItAADSLUAA0i2AANItwADSLkAA0i7AANIvAADSL0AA0i/AANIwAADSP8AA0kBAANJAwADSQUAA0kIAANJCQADSQoAA0kLAANJDAADSQ4AA0kQAANJEQADSRIAA0kUAANJFQADSVQAA0lWAANJWAADSVoAA0ldAANJXgADSV8AA0lgAANJYQADSWMAA0llAANJZgADSWcAA0lpAANJagADSakAA0mrAANJrQADSa8AA0myAANJswADSbQAA0m1AANJtgADSbgAA0m6AANJuwADSbwAA0m+AANJvwADSf4AA0oAAANKAgADSgQAA0oHAANKCAADSgkAA0oKAANKCwADSg0AA0oPAANKEAADShEAA0oTAANKFAADSjkAA0pdAANKhAADSqgAA0qrAANKrQADSq8AA0qxAANKswADSrUAA0q2AANKuQADSsYAA0rVAANK1wADStkAA0rbAANK3QADSt8AA0rhAANK4wADSvIAA0r1AANK+AADSvsAA0r+AANLAQADSwQAA0sHAANLCQADS0gAA0tKAANLTAADS04AA0tRAANLUgADS1MAA0tUAANLVQADS1cAA0tZAANLWgADS1sAA0tdAANLXgADS50AA0ufAANLoQADS6MAA0umAANLpwADS6gAA0upAANLqgADS6wAA0uuAANLrwADS7AAA0uyAANLswADS/IAA0v0AANL9gADS/gAA0v7AANL/AADS/0AA0v+AANL/wADTAEAA0wDAANMBAADTAUAA0wHAANMCAADTEcAA0xJAANMSwADTE0AA0xQAANMUQADTFIAA0xTAANMVAADTFYAA0xYAANMWQADTFoAA0xcAANMXQADTJwAA0yeAANMoAADTKIAA0ylAANMpgADTKcAA0yoAANMqQADTKsAA0ytAANMrgADTK8AA0yxAANMsgADTPEAA0zzAANM9QADTPcAA0z6AANM+wADTPwAA0z9AANM/gADTQAAA00CAANNAwADTQQAA00GAANNBwADTUYAA01IAANNSgADTUwAA01PAANNUAADTVEAA01SAANNUwADTVUAA01XAANNWAADTVkAA01bAANNXAADTWUAA01mAANNaAADTXUAA012AANNdwADTXkAA02GAANNhwADTYgAA02KAANNlwADTZgAA02ZAANNmwADTaQAA02zAANNwAADTc8AA03hAANN9QADTgwAA04eAANOJwADTigAA04qAANONwADTjgAA045AANOOwADTjwAA05FAANOTwADTlYAA05eAANOcAADTnUAA056AAAAAAAABAIAAAAAAAB/HwAAAAAAAAAAAAAAAAADTnw= + + APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 6.xcdatamodel + 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/WU5ZUllhWXBZf1mOWZ1ZqVm7WcpZ2VnoWfdaBloVWiRaOVo6WkJaTlpiWnFagFqPWpNaolqxWsBaz1reWupa/FsLWxpbKVs4W0dbVltlW3pbe1uDW49bo1uyW8Fb0FvUW+Nb8lwBXBBcH1wrXD1cTFxbXGpceVyIXJdcplyqXKtculzJXNhc7VzuXPZdAl0WXSVdNF1DXUddVl1lXXRdg12SXZ5dsF2/Xc5d3V3sXfteCl4ZXi5eL143XkNeV15mXnVehF6IXpdepl61XsRe017fXvFfAF8PXx5fLV88X0tfWl9vX3BfeF+EX5hfp1+2X8VfyV/YX+df9mAFYBRgIGAyYEFgUGBfYG5giGCJYI9gm2CvYL5gwWDQYN9g7mDxYQBhD2ETYSJhMWEyYTxhPWE+YT9hVGFVYV1haWF9YYxhm2GqYa5hvWHMYdth6mH5YgViF2ImYjViRGJTYmJicWKAYpVilmKeYqpivmLNYtxi62LvYv5jDWMcYytjOmNGY1hjZ2N2Y4VjlGOjY7JjwWPWY9dj32PrY/9kDmQdZCxkMGQ/ZE5kXWRsZHtkh2SZZKhkt2TGZNVk5GTzZQJlBWUUZSNlMmVHZUhlUGVcZXBlf2WOZZ1loWWwZb9lzmXdZexl+GYKZhlmKGY3ZkZmVWZkZnNmiGaJZpFmnWaxZsBmz2beZuJm8WcAZw9nHmctZzlnS2daZ2lneGeHZ5ZnpWe0Z8lnymfSZ95n8mgBaBBoH2gjaDJoQWhQaF9obmh6aIxom2iqaLloyGjXaOZo9WkKaQtpE2kfaTNpQmlRaWBpZGlzaYJpkWmgaa9pu2nNadxp62n6aglqGGonajZqOWpIaldqZmpqaoRqhWqLapdqq2q6ar1qzGrbaupq7Wr8awtrD2seay1rLmtma2draGtpa2pra2tsa21rbmtva3BrcWtya3NrdGt1a3Zrd2t4a3lremt7a3xrfWt+a39rgGuVa5Zrnmuqa75rzWvca+tr72v+bA1sHGwrbDpsRmxYbGdsdmyFbJRso2yybMFs1mzXbN9s62z/bQ5tHW0sbTBtP21ObV1tbG17bYdtmW2obbdtxm3VbeRt824CbhduGG4gbixuQG5Pbl5ubW5xboBuj26ebq1uvG7Ibtpu6W74bwdvFm8lbzRvQ29Yb1lvYW9tb4FvkG+fb65vsm/Bb9Bv32/ub/1wCXAbcCpwOXBIcFdwZnB1cIRwmXCacKJwrnDCcNFw4HDvcPNxAnERcSBxL3E+cUpxXHFrcXpxiXGYcadxtnHFcdpx23Hjce9yA3ISciFyMHI0ckNyUnJhcnByf3KLcp1yrHK7cspy2XLocvdzBnMbcxxzJHMwc0RzU3Nic3FzdXOEc5NzonOxc8BzzHPec+1z/HQLdBp0G3QqdDl0SHRddF50ZnRydIZ0lXSkdLN0t3TGdNV05HTzdQJ1DnUgdS91PnVNdVx1a3V6dYl1nnWfdad1s3XHddZ15XX0dfh2B3YWdiV2NHZDdk92YXZwdn92jnaddqx2u3bKdt924HbodvR3CHcXdyZ3NXc5d0h3V3dmd3V3hHeQd6J3sXfAd8933nftd/x4C3ggeCF4KXg1eEl4WHhneHZ4eniJeJh4p3i2eMV40XjjePJ5AXkQeR95Lnk9eUx5YXlieWp5dnmKeZl5qHm3ebt5ynnZeeh593oGehJ6JHozekJ6UXpgem96fnqNeqJ6o3qrerd6y3raeul6+Hr8ewt7Gnspezh7R3tTe2V7dHuDe5J7oXuwe797znvje+R77Hv4fAx8G3wqfDl8PXxMfFt8anx5fIh8lHymfLV8xHzTfOJ88X0AfQ99JH0lfS19OX1NfVx9a316fX59jX2cfat9un3JfdV95332fgV+FH4jfjJ+QX5QfmV+Zn5ufnp+jn6dfqx+u36/fs5+3X7sfvt/Cn8Wfyh/N39Gf1V/ZH9zf4J/kX+mf6d/r3+7f89/3n/tf/yAAIAPgB6ALYA8gEuAV4BpgHiAh4CWgKWAtIDDgNKA54DogPCA/IEQgR+BLoE9gUGBUIFfgW6BfYGMgZiBqoG5gciB14HmgfWCBIITgiiCKYIxgj2CUYJggm+CfoKCgpGCoIKvgr6CzYLZguuC+oMJgxiDJ4M2g0WDVINpg2qDcoN+g5KDoYOwg7+Dw4PSg+GD8IP/hA6EGoQshDuESoRZhGiEd4SGhJWEqoSrhLOEv4TThOKE8YUAhQSFE4UihTGFQIVPhVuFbYV8hYuFmoWphbiFx4XWheuF7IX0hgCGFIYjhjKGQYZFhlSGY4ZyhoGGkIachq6GvYbMhtuG6ob5hwiHF4cshy2HNYdBh1WHZIdzh4KHhoeVh6SHs4fCh9GH3Yfvh/6IDYgciCuIOohJiFiIbYhuiHaIgoiWiKWItIjDiMeI1ojliPSJA4kSiR6JMIk/iU6JXYlsiXuJiomZia6Jr4m3icOJ14nmifWKBIoIiheKJoo1ikSKU4pfinGKgIqPip6KrYq8isuK2orvivCK+IsEixiLJ4s2i0WLSYtYi2eLdouFi5SLoIuyi8GL0Ivfi+6L/YwMjBuMHow4jDmMP4xLjF+MboxxjICMj4yejKGMsIy/jMOM0ozhjOKM6IzpjP6M/40HjRONJ402jUWNVI1YjWeNdo2FjZSNo42vjcGN0I3fje6N/Y4MjhuOKo4tjjGONY45jkGORI5IjklVJG51bGzXAAkACgALAAwADQAOAA8AEAARABIAEwAUABMAFl8QD194ZF9yb290UGFja2FnZVYkY2xhc3NcX3hkX2NvbW1lbnRzXxAQX3hkX21vZGVsTWFuYWdlcl8QFV9jb25maWd1cmF0aW9uc0J5TmFtZV1feGRfbW9kZWxOYW1lXxAXX21vZGVsVmVyc2lvbklkZW50aWZpZXKAAoEK/IEK+YAAgQr6gACBCvveABgAGQAaABsAHAAdAB4ACgAfACAAIQAiACMAJAAlACYAJwAoACUAEwArACwALQAuAC8AJQAlABNfEBxYREJ1Y2tldEZvckNsYXNzZXN3YXNFbmNvZGVkXxAaWERCdWNrZXRGb3JQYWNrYWdlc3N0b3JhZ2VfEBxYREJ1Y2tldEZvckludGVyZmFjZXNzdG9yYWdlXxAPX3hkX293bmluZ01vZGVsXxAdWERCdWNrZXRGb3JQYWNrYWdlc3dhc0VuY29kZWRWX293bmVyXxAbWERCdWNrZXRGb3JEYXRhVHlwZXNzdG9yYWdlW192aXNpYmlsaXR5XxAZWERCdWNrZXRGb3JDbGFzc2Vzc3RvcmFnZVVfbmFtZV8QH1hEQnVja2V0Rm9ySW50ZXJmYWNlc3dhc0VuY29kZWRfEB5YREJ1Y2tldEZvckRhdGFUeXBlc3dhc0VuY29kZWRfEBBfdW5pcXVlRWxlbWVudElEgASBCveBCvWAAYAEgACBCvaBCvgQAIAFgAOABIAEgABQU1lFU9MANgA3AAoAOABFAFJXTlMua2V5c1pOUy5vYmplY3RzrAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARIAGgAeACIAJgAqAC4AMgA2ADoAPgBCAEawARgBHAEgASQBKAEsATABNAE4ATwBQAFGAEoEDP4EFt4EIRoEBOYEGDYEKyoEGhIEBrIEHh4EGU4EF3oAtW0FQQ1NjaGVkdWxlWUFQQ1Jlc3VsdF8QF0FQQ01lZFRyYWNrZXJNZWRpY2F0aW9uXxARQVBDU3RvcmVkVXNlckRhdGFfEBBBUENTY2hlZHVsZWRUYXNrXxAbQVBDTWVkVHJhY2tlclBvc3NpYmxlRG9zYWdlW0FQQ0RCU3RhdHVzXxAeQVBDTWVkVHJhY2tlclByZXNjcmlwdGlvbkNvbG9yV0FQQ1Rhc2tfEB5BUENNZWRUcmFja2VyRGFpbHlEb3NhZ2VSZWNvcmRfEBtBUENNZWRUcmFja2VySW5mbGF0YWJsZUl0ZW1fEBlBUENNZWRUcmFja2VyUHJlc2NyaXB0aW9u3xAQAGAAYQBiAGMAHQBkAGUAHwBmAGcACgAhAGgAaQAkAGoAawBsACUAJQAQAHAAcQAtACUAawB0ADkAawB3AHgAeV8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzb3JkZXJlZF8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzc3RvcmFnZV8QIFhEQnVja2V0Rm9yU3RlcmVvdHlwZXN3YXNFbmNvZGVkXxAkWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXN3YXNFbmNvZGVkXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc3N0b3JhZ2VfECRYREJ1Y2tldEZvckdlbmVyYWxpemF0aW9uc2R1cGxpY2F0ZXNfECRYREJ1Y2tldEZvckdlbmVyYWxpemF0aW9uc3dhc0VuY29kZWRfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzb3JkZXJlZF8QIVhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zb3JkZXJlZF8QIVhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zc3RvcmFnZVtfaXNBYnN0cmFjdIAUgDWABIAEgAKAFYEDJYAEgBSBAyeABoAUgQW2gBMIEup7gktXb3JkZXJlZNMANgA3AAoAfQB/AFKhAH6AFqEAgIAXgC1eWERfUFN0ZXJlb3R5cGXZAB0AIQCEAAoAJACFAB8AagCGAEYAfgBrAIoAEwAlAC0AeQCOXxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNvcmRlcmVkXxAkWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXN3YXNFbmNvZGVkXxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNzdG9yYWdlgBKAFoAUgDSAAIAECIAY0wA2ADcACgCQAJkAUqgAkQCSAJMAlACVAJYAlwCYgBmAGoAbgByAHYAegB+AIKgAmgCbAJwAnQCeAJ8AoAChgCGAJYAmgCeAKYArgC6AMoAtXxATWERQTUNvbXBvdW5kSW5kZXhlc18QEFhEX1BTS19lbGVtZW50SURfEBpYRF9QU0tfdmVyc2lvbkhhc2hNb2RpZmllcl8QGVhEX1BTS19mZXRjaFJlcXVlc3RzQXJyYXlfEBFYRF9QU0tfaXNBYnN0cmFjdF8QD1hEX1BTS191c2VySW5mb18QE1hEX1BTS19jbGFzc01hcHBpbmdfEBZYRF9QU0tfZW50aXR5Q2xhc3NOYW1l3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMAtwATAIAAeQB5AHkALQB5AL4AkQB5AHkAEwB5VV90eXBlWF9kZWZhdWx0XF9hc3NvY2lhdGlvbltfaXNSZWFkT25seVlfaXNTdGF0aWNZX2lzVW5pcXVlWl9pc0Rlcml2ZWRaX2lzT3JkZXJlZFxfaXNDb21wb3NpdGVXX2lzTGVhZoAAgCKAAIAXCAgICIAkgBkICIAACNIANwAKAMUAxqCAI9IAyADJAMoAy1okY2xhc3NuYW1lWCRjbGFzc2VzXk5TTXV0YWJsZUFycmF5owDKAMwAzVdOU0FycmF5WE5TT2JqZWN00gDIAMkAzwDQXxAQWERVTUxQcm9wZXJ0eUltcKQA0QDSANMAzV8QEFhEVU1MUHJvcGVydHlJbXBfEBRYRFVNTE5hbWVkRWxlbWVudEltcF8QD1hEVU1MRWxlbWVudEltcN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATABMAEwCAAHkAeQB5AC0AeQC+AJIAeQB5ABMAeYAAgACAAIAXCAgICIAkgBoICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATABMAEwCAAHkAeQB5AC0AeQC+AJMAeQB5ABMAeYAAgACAAIAXCAgICIAkgBsICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAPQAEwCAAHkAeQB5AC0AeQC+AJQAeQB5ABMAeYAAgCiAAIAXCAgICIAkgBwICIAACNIANwAKAQIAxqCAI98QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAQYAEwCAAHkAeQB5AC0AeQC+AJUAeQB5ABMAeYAAgCqAAIAXCAgICIAkgB0ICIAACAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwEWABMAgAB5AHkAeQAtAHkAvgCWAHkAeQATAHmAAIAsgACAFwgICAiAJIAeCAiAAAjTADYANwAKASQBJQBSoKCALdIAyADJASgBKV8QE05TTXV0YWJsZURpY3Rpb25hcnmjASgBKgDNXE5TRGljdGlvbmFyed8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAS0AEwCAAHkAeQB5AC0AeQC+AJcAeQB5ABMAeYAAgC+AAIAXCAgICIAkgB8ICIAACNYAIQAKACQAagAdAB8BOwE8ABMAeQATAC2AMIAxgAAIgABfEBRYREdlbmVyaWNSZWNvcmRDbGFzc9IAyADJAUIBQ11YRFVNTENsYXNzSW1wpgFEAUUBRgFHAUgAzV1YRFVNTENsYXNzSW1wXxASWERVTUxDbGFzc2lmaWVySW1wXxARWERVTUxOYW1lc3BhY2VJbXBfEBRYRFVNTE5hbWVkRWxlbWVudEltcF8QD1hEVU1MRWxlbWVudEltcN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAUsAEwCAAHkAeQB5AC0AeQC+AJgAeQB5ABMAeYAAgDOAAIAXCAgICIAkgCAICIAACFtBUENTY2hlZHVsZdIAyADJAVoBW18QElhEVU1MU3RlcmVvdHlwZUltcKcBXAFdAV4BXwFgAWEAzV8QElhEVU1MU3RlcmVvdHlwZUltcF1YRFVNTENsYXNzSW1wXxASWERVTUxDbGFzc2lmaWVySW1wXxARWERVTUxOYW1lc3BhY2VJbXBfEBRYRFVNTE5hbWVkRWxlbWVudEltcF8QD1hEVU1MRWxlbWVudEltcNMANgA3AAoBYwF5AFKvEBUBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXiANoA3gDiAOYA6gDuAPIA9gD6AP4BAgEGAQoBDgESARYBGgEeASIBJgEqvEBUBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY6AS4B2gI6Ap4C+gNWA7YEBBIEBG4EEuYEE0IEE54EE/oEFFYEFLIEFQ4EFWoEB4IEFcYEFiIEFn4AtXxASZWZmZWN0aXZlU3RhcnREYXRlVWRlbGF5WG1heENvdW50XnNjaGVkdWxlU3RyaW5nXnNjaGVkdWxlU291cmNlXnJlbWluZGVyT2Zmc2V0WWNyZWF0ZWRBdFZlbmRzT25ec2NoZWR1bGVkVGFza3NYc3RhcnRzT25ZdXBkYXRlZEF0XHNjaGVkdWxlVHlwZV8QD3JlbWluZGVyTWVzc2FnZVdleHBpcmVzWnRpbWVzT2ZEYXlcc2hvdWxkUmVtaW5kWGluQWN0aXZlVXRhc2tzVW5vdGVzWGludGVydmFsXxAQZWZmZWN0aXZlRW5kRGF0Zd8QEgCsAK0ArgGmAB0AsACxAacAHwCvAagAsgAKACEAswC0ACQAtQATABMAEwAlAEYAeQB5AbAALQB5AGsAeQG0AWQAeQB5AbgAeV8QIFhEQnVja2V0Rm9yU3RlcmVvdHlwZXN3YXNFbmNvZGVkXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc3N0b3JhZ2VfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzb3JkZXJlZIAAgACAAIAEgBIICIBNCIAUCIB1gDYICIBMCBLbK5bU0wA2ADcACgG8Ab8AUqIBvQG+gE6AT6IBwAHBgFCAZIAtXxASWERfUFByb3BTdGVyZW90eXBlXxASWERfUEF0dF9TdGVyZW90eXBl2QAdACEBxgAKACQBxwAfAGoByAF6Ab0AawCKABMAJQAtAHkB0F8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzb3JkZXJlZF8QJFhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzd2FzRW5jb2RlZF8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzc3RvcmFnZYBLgE6AFIA0gACABAiAUdMANgA3AAoB0gHbAFKoAdMB1AHVAdYB1wHYAdkB2oBSgFOAVIBVgFaAV4B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kXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc3N0b3JhZ2VfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfECRYREJ1Y2tldEZvckdlbmVyYWxpemF0aW9uc2R1cGxpY2F0ZXNfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzb3JkZXJlZF8QJFhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zd2FzRW5jb2RlZF8QIVhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zc3RvcmFnZV8QIFhEQnVja2V0Rm9yU3RlcmVvdHlwZXN3YXNFbmNvZGVkXxAkWERCdWNrZXRGb3JTcGVjaWFsaXphdGlvbnN3YXNFbmNvZGVkXxAhWERCdWNrZXRGb3JHZW5lcmFsaXphdGlvbnNvcmRlcmVkXxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNzdG9yYWdlXxAhWERCdWNrZXRGb3JTcGVjaWFsaXphdGlvbnNzdG9yYWdlXxAkWERCdWNrZXRGb3JTcGVjaWFsaXphdGlvbnNkdXBsaWNhdGVzCIAUgBSBBlWABIEDJYAUgAKBAyeABIAQgQZ+gQZUgASABIAUgQZkgQZ/gQMlEpegSmfTADYANwAKUPNQ9QBSoQB+gBahUPaBBlaALdkAHQAhUPkACgAkUPoAHwBqUPsAUAB+AGsAigATACUALQB5UQNfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc29yZGVyZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3N0b3JhZ2WBBlOAFoAUgDSAAIAECIEGV9MANgA3AApRBVEOAFKoAJEAkgCTAJQAlQCWAJcAmIAZgBqAG4AcgB2AHoAfgCCoUQ9REFERURJRE1EUURVRFoEGWIEGWoEGW4EGXIEGXoEGX4EGYYEGYoAt3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABNRGgATUPYAeQB5AHkALQB5AL4AkQB5AHkAEwB5gACBBlmAAIEGVggICAiAJIAZCAiAAAjSADcAClEoAMaggCPfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwATABNQ9gB5AHkAeQAtAHkAvgCSAHkAeQATAHmAAIAAgACBBlYICAgIgCSAGggIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMAEwATUPYAeQB5AHkALQB5AL4AkwB5AHkAEwB5gACAAIAAgQZWCAgICIAkgBsICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATUUoAE1D2AHkAeQB5AC0AeQC+AJQAeQB5ABMAeYAAgQZdgACBBlYICAgIgCSAHAgIgAAI0gA3AApRWADGoIAj3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMBBgATUPYAeQB5AHkALQB5AL4AlQB5AHkAEwB5gACAKoAAgQZWCAgICIAkgB0ICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATUWsAE1D2AHkAeQB5AC0AeQC+AJYAeQB5ABMAeYAAgQZggACBBlYICAgIgCSAHggIgAAI0wA2ADcAClF5UXoAUqCggC3fEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwEtABNQ9gB5AHkAeQAtAHkAvgCXAHkAeQATAHmAAIAvgACBBlYICAgIgCSAHwgIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABNRjQATUPYAeQB5AHkALQB5AL4AmAB5AHkAEwB5gACBBmOAAIEGVggICAiAJIAgCAiAAAhfEBtBUENNZWRUcmFja2VySW5mbGF0YWJsZUl0ZW3TADYANwAKUZxRngBSoVGdgQZloVGfgQZmgC1UbmFtZd8QEgCsAK0ArlGjAB0AsACxUaQAHwCvUaUAsgAKACEAswC0ACQAtQATABMAEwAlAFAAeQB5Ua0ALQB5AGsAeQG0UZ0AeQB5UbUAeV8QIFhEQnVja2V0Rm9yU3RlcmVvdHlwZXN3YXNFbmNvZGVkXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc3N0b3JhZ2VfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzb3JkZXJlZIAAgACAAIAEgQZTCAiBBmgIgBQIgHWBBmUICIEGZwgSMqu7a9MANgA3AApRuVG8AFKiAb0BvoBOgE+iUb1RvoEGaYEGdIAt2QAdACFRwQAKACRRwgAfAGpRw1GfAb0AawCKABMAJQAtAHlRy18QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzb3JkZXJlZF8QJFhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzd2FzRW5jb2RlZF8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzc3RvcmFnZYEGZoBOgBSANIAAgAQIgQZq0wA2ADcAClHNUdYAUqgB0wHUAdUB1gHXAdgB2QHagFKAU4BUgFWAVoBXgFiAWahR11HYUdlR2lHbUdxR3VHegQZrgQZsgQZtgQZvgQZwgQZxgQZygQZzgC3fEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwEGABNRvQB5AHkAeQAtAHkAvgHTAHkAeQATAHmAAIAqgACBBmkICAgIgCSAUggIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMAEwATUb0AeQB5AHkALQB5AL4B1AB5AHkAEwB5gACAAIAAgQZpCAgICIAkgFMICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATUgAAE1G9AHkAeQB5AC0AeQC+AdUAeQB5ABMAeYAAgQZugACBBmkICAgIgCSAVAgIgAAI0wA2ADcAClIOUg8AUqCggC3fEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwIgABNRvQB5AHkAeQAtAHkAvgHWAHkAeQATAHmAAIBfgACBBmkICAgIgCSAVQgIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMBBgATUb0AeQB5AHkALQB5AL4B1wB5AHkAEwB5gACAKoAAgQZpCAgICIAkgFYICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAQYAE1G9AHkAeQB5AC0AeQC+AdgAeQB5ABMAeYAAgCqAAIEGaQgICAiAJIBXCAiAAAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwATABNRvQB5AHkAeQAtAHkAvgHZAHkAeQATAHmAAIAAgACBBmkICAgIgCSAWAgIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMBBgATUb0AeQB5AHkALQB5AL4B2gB5AHkAEwB5gACAKoAAgQZpCAgICIAkgFkICIAACNkAHQAhUl0ACgAkUl4AHwBqUl9RnwG+AGsAigATACUALQB5UmdfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc29yZGVyZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3N0b3JhZ2WBBmaAT4AUgDSAAIAECIEGddMANgA3AApSaVJxAFKnAngCeQJ6AnsCfAJ9An6AZoBngGiAaYBqgGuAbKdSclJzUnRSdVJ2UndSeIEGdoEGd4EGeIEGeoEGe4EGfIEGfYAt3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMAEwATUb4AeQB5AHkALQB5AL4CeAB5AHkAEwB5gACAAIAAgQZ0CAgICIAkgGYICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAQYAE1G+AHkAeQB5AC0AeQC+AnkAeQB5ABMAeYAAgCqAAIEGdAgICAiAJIBnCAiAAAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAE1KaABNRvgB5AHkAeQAtAHkAvgJ6AHkAeQATAHmAAIEGeYAAgQZ0CAgICIAkgGgICIAACFEx3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMECAATUb4AeQB5AHkALQB5AL4CewB5AHkAEwB5gACAioAAgQZ0CAgICIAkgGkICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATABMAE1G+AHkAeQB5AC0AeQC+AnwAeQB5ABMAeYAAgACAAIEGdAgICAiAJIBqCAiAAAjfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwATABNRvgB5AHkAeQAtAHkAvgJ9AHkAeQATAHmAAIAAgACBBnQICAgIgCSAawgIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMAEwATUb4AeQB5AHkALQB5AL4CfgB5AHkAEwB5gACAAIAAgQZ0CAgICIAkgGwICIAACNIANwAKUuUAxqCAI9IANwAKUugAxqNS6VDDUuuBBoCBBlGBBoOAI9cACgAhUMYAHQAkUMcAH1DIABMASABIUvIAUAAtgQaCgACBBbeBBbeBBoGBBlMS5KAiy9IAyADJUvZS918QFlhEVU1MR2VuZXJhbGl6YXRpb25JbXCkUvhS+VL6AM1fEBZYRFVNTEdlbmVyYWxpemF0aW9uSW1wXxAUWERVTUxOYW1lZEVsZW1lbnRJbXBfEA9YRFVNTEVsZW1lbnRJbXDXAAoAIVDGAB0AJFDHAB9QyAATAE0ATVMAAFAALYEGgoAAgQaEgQaEgQdBgQZT3xAQUwNTBFMFUwYAHVMHUwgAH1MJUwoACgAhUwtTDAAkAGoAa1MOACUAJQAQUxIAcQAtACUAawB0AEAAa1MZUxoAeV8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzb3JkZXJlZF8QIVhEQnVja2V0Rm9yT3duZWRBdHRyaWJ1dGVzc3RvcmFnZV8QIFhEQnVja2V0Rm9yU3RlcmVvdHlwZXN3YXNFbmNvZGVkXxAkWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXN3YXNFbmNvZGVkXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc3N0b3JhZ2VfECRYREJ1Y2tldEZvckdlbmVyYWxpemF0aW9uc2R1cGxpY2F0ZXNfECRYREJ1Y2tldEZvckdlbmVyYWxpemF0aW9uc3dhc0VuY29kZWRfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzb3JkZXJlZF8QIVhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zb3JkZXJlZF8QIVhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zc3RvcmFnZYAUgQaVgASABIACgQaGgQMlgASAFIEDJ4ANgBSBB0CBBoUIEoYsfR/TADYANwAKUx5TIABSoQB+gBahUyGBBoeALdkAHQAhUyQACgAkUyUAHwBqUyYATQB+AGsAigATACUALQB5Uy5fECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc29yZGVyZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3N0b3JhZ2WBBoSAFoAUgDSAAIAECIEGiNM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fgACBBdgICAgIgCSBATAICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATAQYAE0qBAHkAeQB5AC0AeQC+DJoAeQB5ABMAeYAAgCqAAIEF2AgICAiAJIEBMQgIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABNMUAATSoEAeQB5AHkALQB5AL4MmwB5AHkAEwB5gACBCBOAAIEF2AgICAiAJIEBMggIgAAI0gA3AApqZwDGoVLpgQaAgCPfEBBqa2psam1qbgAdam9qcAAfanFqcgAKACFqc2p0ACQAagBranYAJQAlABBqegBxAC0AJQBrAHQAPABraoFqggB5XxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNvcmRlcmVkXxAhWERCdWNrZXRGb3JPd25lZEF0dHJpYnV0ZXNzdG9yYWdlXxAgWERCdWNrZXRGb3JTdGVyZW90eXBlc3dhc0VuY29kZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzc3RvcmFnZV8QJFhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zZHVwbGljYXRlc18QJFhEQnVja2V0Rm9yR2VuZXJhbGl6YXRpb25zd2FzRW5jb2RlZF8QHVhEQnVja2V0Rm9yU3RlcmVvdHlwZXNvcmRlcmVkXxAhWERCdWNrZXRGb3JHZW5lcmFsaXphdGlvbnNvcmRlcmVkXxAhWERCdWNrZXRGb3JHZW5lcmFsaXphdGlvbnNzdG9yYWdlgBSBCFeABIAEgAKBCEiBAyWABIAUgQMngAmAFIEKyYEIRwgTAAAAAQcoNa/TADYANwAKaoZqiABSoQB+gBahaomBCEmALdkAHQAhaowACgAkao0AHwBqao4ASQB+AGsAigATACUALQB5apZfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc29yZGVyZWRfECRYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3dhc0VuY29kZWRfECFYREJ1Y2tldEZvck93bmVkQXR0cmlidXRlc3N0b3JhZ2WBCEaAFoAUgDSAAIAECIEIStMANgA3AApqmGqhAFKoAJEAkgCTAJQAlQCWAJcAmIAZgBqAG4AcgB2AHoAfgCCoaqJqo2qkaqVqpmqnaqhqqYEIS4EITYEIToEIT4EIUYEIUoEIVIEIVYAt3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABNqrQATaokAeQB5AHkALQB5AL4AkQB5AHkAEwB5gACBCEyAAIEISQgICAiAJIAZCAiAAAjSADcACmq7AMaggCPfEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwATABNqiQB5AHkAeQAtAHkAvgCSAHkAeQATAHmAAIAAgACBCEkICAgIgCSAGggIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMAEwATaokAeQB5AHkALQB5AL4AkwB5AHkAEwB5gACAAIAAgQhJCAgICIAkgBsICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATat0AE2qJAHkAeQB5AC0AeQC+AJQAeQB5ABMAeYAAgQhQgACBCEkICAgIgCSAHAgIgAAI0gA3AApq6wDGoIAj3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABMBBgATaokAeQB5AHkALQB5AL4AlQB5AHkAEwB5gACAKoAAgQhJCAgICIAkgB0ICIAACN8QDwCsAK0ArgAdAK8AsACxAB8AsgAKACEAswC0ACQAtQATav4AE2qJAHkAeQB5AC0AeQC+AJYAeQB5ABMAeYAAgQhTgACBCEkICAgIgCSAHggIgAAI0wA2ADcACmsMaw0AUqCggC3fEA8ArACtAK4AHQCvALAAsQAfALIACgAhALMAtAAkALUAEwEtABNqiQB5AHkAeQAtAHkAvgCXAHkAeQATAHmAAIAvgACBCEkICAgIgCSAHwgIgAAI3xAPAKwArQCuAB0ArwCwALEAHwCyAAoAIQCzALQAJAC1ABNrIAATaokAeQB5AHkALQB5AL4AmAB5AHkAEwB5gACBCFaAAIEISQgICAiAJIAgCAiAAAhfEBFBUENTdG9yZWRVc2VyRGF0YdMANgA3AAprL2tKAFKvEBprMGsxazJrM2s0azVrNms3azhrOWs6aztrPGs9az5rP2tAa0FrQmtDa0RrRWtGa0drSGtJgQhYgQhZgQhagQhbgQhcgQhdgQhegQhfgQhggQhhgQhigQhjgQhkgQhlgQhmgQhngQhogQhpgQhqgQhrgQhsgQhtgQhugQhvgQhwgQhxrxAaa0trTGtNa05rT2tQa1FrUmtTa1RrVWtWa1drWGtZa1prW2tca11rXmtfa2BrYWtia2NrZIEIcoEIiYEIoIEIt4EIzoEI5YEI/IEJFIEJK4EJQoEJWYEJcIEJh4EJnoEJtYEJzIEJ44EJ+oEKEYEKKIEKP4EKVoEKbYEKhIEKm4EKsoAtXnRhc2tDb21wbGV0aW9uXxAUY29uc2VudFNpZ25hdHVyZURhdGVfEBVjb25zZW50U2lnbmF0dXJlSW1hZ2VccHJvZmlsZUltYWdlXWdsdWNvc2VMZXZlbHNZc2xlZXBUaW1lXxAVc2hhcmVkT3B0aW9uU2VsZWN0aW9uWWJpcnRoRGF0ZV8QD3NlcnZlckNvbnNlbnRlZF8QFGN1c3RvbVN1cnZleVF1ZXN0aW9uXxAPaGFzSGVhcnREaXNlYXNlXxASc2Vjb25kYXJ5SW5mb1NhdmVkWWJsb29kVHlwZV8QEW1lZGljYWxDb25kaXRpb25zWndha2VVcFRpbWVfEBRjb25zZW50U2lnbmF0dXJlTmFtZV8QE2hvbWVMb2NhdGlvbkFkZHJlc3NfEA9ob21lTG9jYXRpb25MYXRdYmlvbG9naWNhbFNleF11c2VyQ29uc2VudGVkWWV0aG5pY2l0eV8QHGRhaWx5U2NhbGVzQ29tcGxldGlvbkNvdW50ZXJcYWxsb3dDb250YWN0W3Bob25lTnVtYmVyXxAQaG9tZUxvY2F0aW9uTG9uZ1ttZWRpY2F0aW9uc98QEgCsAK0ArmuBAB0AsACxa4IAHwCva4MAsgAKACEAswC0ACQAtQATABMAEwAlAEkAeQB5a4sALQB5AGsAeQG0azAAeQB5a5MAeV8QIFhEQnVja2V0Rm9yU3RlcmVvdHlwZXN3YXNFbmNvZGVkXxAdWERCdWNrZXRGb3JTdGVyZW90eXBlc3N0b3JhZ2VfEB1YREJ1Y2tldEZvclN0ZXJlb3R5cGVzb3JkZXJlZIAAgACAAIAEgQhGCAiBCHQIgBQIgHWBCFgICIEIcwgSxtvnk9MANgA3AAprl2uaAFKiAb0BvoBOgE+ia5trnIEIdYEIgIAt2QAdACFrnwAKACRroAAfAGproWtLAb0AawC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nBAAAJwYAACcIAAAnCgAAJygAACdGAAAnWQAAJ20AACeCAAAnnwAAJ7MAACfJAAAoCAAAKAoAACgMAAAoDgAAKBAAACgRAAAoEgAAKBMAACgUAAAoFgAAKBgAACgZAAAoGgAAKBwAACgdAAAoXAAAKF4AAChgAAAoYgAAKGQAAChlAAAoZgAAKGcAAChoAAAoagAAKGwAAChtAAAobgAAKHAAAChxAAAosAAAKLIAACi0AAAotgAAKLgAACi5AAAougAAKLsAACi8AAAovgAAKMAAACjBAAAowgAAKMQAACjFAAAo0gAAKNMAACjUAAAo1gAAKRUAACkXAAApGQAAKRsAACkdAAApHgAAKR8AACkgAAApIQAAKSMAACklAAApJgAAKScAACkpAAApKgAAKSsAAClqAAApbAAAKW4AAClwAAApcgAAKXMAACl0AAApdQAAKXYAACl4AAApegAAKXsAACl8AAApfgAAKX8AACm+AAApwAAAKcIAACnEAAApxgAAKccAACnIAAApyQAAKcoAACnMAAApzgAAKc8AACnQAAAp0gAAKdMAACoSAAAqFAAAKhYAACoYAAAqGgAAKhsAACocAAAqHQAAKh4AACogAAAqIgAAKiMAACokAAAqJgAAKicAACpmAAAqaAAAKmoAACpsAAAqbgAAKm8AACpwAAAqcQAAKnIAACp0AAAqdgAAKncAACp4AAAqegAAKnsAACqgAAAqxAAAKusAACsPAAArEQAAKxMAACsVAAArFwAAKxkAACsbAAArHAAAKx4AACsrAAArOgAAKzwAACs+AAArQAAAK0IAACtEAAArRgAAK0gAACtXAAArWQAAK1sAACtdAAArXwAAK2EAACtjAAArZQAAK2cAACuHAAArsgAAK8wAACvlAAAr/wAALB8AACxCAAAsgQAALIMAACyFAAAshwAALIkAACyKAAAsiwAALIwAACyNAAAsjwAALJEAACySAAAskwAALJUAACyWAAAs1QAALNcAACzZAAAs2wAALN0AACzeAAAs3wAALOAAACzhAAAs4wAALOUAACzmAAAs5wAALOkAACzqAAAtKQAALSsAAC0tAAAtLwAALTEAAC0yAAAtMwAALTQAAC01AAAtNwAALTkAAC06AAAtOwAALT0AAC0+AAAtfQAALX8AAC2BAAAtgwAALYUAAC2GAAAthwAALYgAAC2JAAAtiwAALY0AAC2OAAAtjwAALZEAAC2SAAAtlQAALdQAAC3WAAAt2AAALdoAAC3cAAAt3QAALd4AAC3fAAAt4AAALeIAAC3kAAAt5QAALeYAAC3oAAAt6QAALigAAC4qAAAuLAAALi4AAC4wAAAuMQAALjIAAC4zAAAuNAAALjYAAC44AAAuOQAALjoAAC48AAAuPQAALnwAAC5+AAAugAAALoIAAC6EAAAuhQAALoYAAC6HAAAuiAAALooAAC6MAAAujQAALo4AAC6QAAAukQAALpoAAC6oAAAutQAALsMAAC7QAAAu4wAALvoAAC8MAAAvVwAAL3oAAC+aAAAvugAAL7wAAC++AAAvwAAAL8IAAC/EAAAvxQAAL8YAAC/IAAAvyQAAL8sAAC/MAAAvzgAAL9AAAC/RAAAv0gAAL9QAAC/VAAAv2gAAL+cAAC/sAAAv7gAAL/AAAC/1AAAv9wAAL/kAAC/7AAAwIAAAMEQAADBrAAAwjwAAMJEAADCTAAAwlQAAMJcAADCZAAAwmwAAMJwAADCeAAAwqwAAMLwAADC+AAAwwAAAMMIAADDEAAAwxgAAMMgAADDKAAAwzAAAMN0AADDfAAAw4QAAMOMAADDlAAAw5wAAMOkAADDrAAAw7QAAMO8AADEuAAAxMAAAMTIAADE0AAAxNgAAMTcAADE4AAAxOQAAMToAADE8AAAxPgAAMT8AADFAAAAxQgAAMUMAADGCAAAxhAAAMYYAADGIAAAxigAAMYsAADGMAAAxjQAAMY4AADGQAAAxkgAAMZMAADGUAAAxlgAAMZcAADHWAAAx2AAAMdoAADHcAAAx3gAAMd8AADHgAAAx4QAAMeIAADHkAAAx5gAAMecAADHoAAAx6gAAMesAADH4AAAx+QAAMfoAADH8AAAyOwAAMj0AADI/AAAyQQAAMkMAADJEAAAyRQAAMkYAADJHAAAySQAAMksAADJMAAAyTQAAMk8AADJQAAAyjwAAMpEAADKTAAAylQAAMpcAADKYAAAymQAAMpoAADKbAAAynQAAMp8AADKgAAAyoQAAMqMAADKkAAAy4wAAMuUAADLnAAAy6QAAMusAADLsAAAy7QAAMu4AADLvAAAy8QAAMvMAADL0AAAy9QAAMvcAADL4AAAzNwAAMzkAADM7AAAzPQAAMz8AADNAAAAzQQAAM0IAADNDAAAzRQAAM0cAADNIAAAzSQAAM0sAADNMAAAziwAAM40AADOPAAAzkQAAM5MAADOUAAAzlQAAM5YAADOXAAAzmQAAM5sAADOcAAAznQAAM58AADOgAAAzxQAAM+kAADQQAAA0NAAANDYAADQ4AAA0OgAANDwAADQ+AAA0QAAANEEAADRDAAA0UAAANF8AADRhAAA0YwAANGUAADRnAAA0aQAANGsAADRtAAA0fAAANH4AADSAAAA0ggAANIQAADSGAAA0iAAANIoAADSMAAA0ywAANM0AADTPAAA00QAANNMAADTUAAA01QAANNYAADTXAAA02QAANNsAADTcAAA03QAANN8AADTgAAA1HwAANSEAADUjAAA1JQAANScAADUoAAA1KQAANSoAADUrAAA1LQAANS8AADUwAAA1MQAANTMAADU0AAA1cwAANXUAADV3AAA1eQAANXsAADV8AAA1fQAANX4AADV/AAA1gQAANYMAADWEAAA1hQAANYcAADWIAAA1xwAANckAADXLAAA1zQAANc8AADXQAAA10QAANdIAADXTAAA11QAANdcAADXYAAA12QAANdsAADXcAAA13wAANh4AADYgAAA2IgAANiQAADYmAAA2JwAANigAADYpAAA2KgAANiwAADYuAAA2LwAANjAAADYyAAA2MwAANnIAADZ0AAA2dgAANngAADZ6AAA2ewAANnwAADZ9AAA2fgAANoAAADaCAAA2gwAANoQAADaGAAA2hwAANsYAADbIAAA2ygAANswAADbOAAA2zwAANtAAADbRAAA20gAANtQAADbWAAA21wAANtgAADbaAAA22wAANyYAADdJAAA3aQAAN4kAADeLAAA3jQAAN48AADeRAAA3kwAAN5QAADeVAAA3lwAAN5gAADeaAAA3mwAAN50AADefAAA3oAAAN6EAADejAAA3pAAAN6kAADe2AAA3uwAAN70AADe/AAA3xAAAN8YAADfIAAA3ygAAN+8AADgTAAA4OgAAOF4AADhgAAA4YgAAOGQAADhmAAA4aAAAOGoAADhrAAA4bQAAOHoAADiLAAA4jQAAOI8AADiRAAA4kwAAOJUAADiXAAA4mQAAOJsAADisAAA4rgAAOLAAADiyAAA4tAAAOLYAADi4AAA4ugAAOLwAADi+AAA4/QAAOP8AADkBAAA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D2QAAQ9sAAEPdAABD3wAAQ+AAAEPiAABD7wAAQ/4AAEQAAABEAgAARAQAAEQGAABECAAARAoAAEQMAABEGwAARB0AAEQfAABEIQAARCMAAEQlAABEJwAARCkAAEQrAABEagAARGwAAERuAABEcAAARHIAAERzAABEdAAARHUAAER2AABEeAAARHoAAER7AABEfAAARH4AAER/AABEvgAARMAAAETCAABExAAARMYAAETHAABEyAAARMkAAETKAABEzAAARM4AAETPAABE0AAARNIAAETTAABFEgAARRQAAEUWAABFGAAARRoAAEUbAABFHAAARR0AAEUeAABFIAAARSIAAEUjAABFJAAARSYAAEUnAABFZgAARWgAAEVqAABFbAAARW4AAEVvAABFcAAARXEAAEVyAABFdAAARXYAAEV3AABFeAAARXoAAEV7AABFugAARbwAAEW+AABFwAAARcIAAEXDAABFxAAARcUAAEXGAABFyAAARcoAAEXLAABFzAAARc4AAEXPAABGDgAARhAAAEYSAABGFAAARhYAAEYXAABGGAAARhkAAEYaAABGHAAARh4AAEYfAABGIAAARiIAAEYjAABGYgAARmQAAEZmAABGaAAARmoAAEZrAABGbAAARm0AAEZuAABGcAAARnIAAEZzAABGdAAARnYAAEZ3AABGwgAARuUAAEcFAABHJQAARycAAEcpAABHKwAARy0AAEcvAABHMAAARzEAAEczAABHNAAARzYAAEc3AABHOQAARzsAAEc8AABHPQAARz8AAEdAAABHRQAAR1IAAEdXAABHWQAAR1sAAEdgAABHYgAAR2QAAEdmAABHiwAAR68AAEfWAABH+gAAR/wAAEf+AABIAAAASAIAAEgEAABIBgAASAcAAEgJAABIFgAASCcAAEgpAABIKwAASC0AAEgvAABIMQAASDMAAEg1AABINwAASEgAAEhKAABITAAASE4AAEhQAABIUgAASFQAAEhWAABIWAAASFoAAEiZAABImwAASJ0AAEifAABIoQAASKIAAEijAABIpAAASKUAAEinAABIqQAASKoAAEirAABIrQAASK4AAEjtAABI7wAASPEAAEjzAABI9QAASPYAAEj3AABI+AAASPkAAEj7AABI/QAASP4AAEj/AABJAQAASQIAAElBAABJQwAASUUAAElHAABJSQAASUoAAElLAABJTAAASU0AAElPAABJUQAASVIAAElTAABJVQAASVYAAEljAABJZAAASWUAAElnAABJpgAASagAAEmqAABJrAAASa4AAEmvAABJsAAASbEAAEmyAABJtAAASbYAAEm3AABJuAAASboAAEm7AABJ+gAASfwAAEn+AABKAAAASgIAAEoDAABKBAAASgUAAEoGAABKCAAASgoAAEoLAABKDAAASg4AAEoPAABKTgAASlAAAEpSAABKVAAASlYAAEpXAABKWAAASlkAAEpaAABKXAAASl4AAEpfAABKYAAASmIAAEpjAABKogAASqQAAEqmAABKqAAASqoAAEqrAABKrAAASq0AAEquAABKsAAASrIAAEqzAABKtAAASrYAAEq3AABK9gAASvgAAEr6AABK/AAASv4AAEr/AABLAAAASwEAAEsCAABLBAAASwYAAEsHAABLCAAASwoAAEsLAABLMAAAS1QAAEt7AABLnwAAS6EAAEujAABLpQAAS6cAAEupAABLqwAAS6wAAEuuAABLuwAAS8oAAEvMAABLzgAAS9AAAEvSAABL1AAAS9YAAEvYAABL5wAAS+kAAEvrAABL7QAAS+8AAEvxAABL8wAAS/UAAEv3AABMNgAATDgAAEw6AABMPAAATD4AAEw/AABMQAAATEEAAExCAABMRAAATEYAAExHAABMSAAATEoAAExLAABMigAATIwAAEyOAABMkAAATJIAAEyTAABMlAAATJUAAEyWAABMmAAATJoAAEybAABMnAAATJ4AAEyfAABM3gAATOAAAEziAABM5AAATOYAAEznAABM6AAATOkAAEzqAABM7AAATO4AAEzvAABM8AAATPIAAEzzAABNMgAATTQAAE02AABNOAAATToAAE07AABNPAAATT0AAE0+AABNQAAATUIAAE1DAABNRAAATUYAAE1HAABNhgAATYgAAE2KAABNjAAATY4AAE2PAABNkAAATZEAAE2SAABNlAAATZYAAE2XAABNmAAATZoAAE2bAABN2gAATdwAAE3eAABN4AAATeIAAE3jAABN5AAATeUAAE3mAABN6AAATeoAAE3rAABN7AAATe4AAE3vAABOLgAATjAAAE4yAABONAAATjYAAE43AABOOAAATjkAAE46AABOPAAATj4AAE4/AABOQAAATkIAAE5DAABOjgAATrEAAE7RAABO8QAATvMAAE71AABO9wAATvkAAE77AABO/AAATv0AAE7/AABPAAAATwIAAE8DAABPBQAATwcAAE8IAABPCQAATwsAAE8MAABPEQAATx4AAE8jAABPJQAATycAAE8sAABPLgAATzAAAE8yAABPVwAAT3sAAE+iAABPxgAAT8gAAE/KAABPzAAAT84AAE/QAABP0gAAT9MAAE/VAABP4gAAT/MAAE/1AABP9wAAT/kAAE/7AABP/QAAT/8AAFABAABQAwAAUBQAAFAWAABQGAAAUBoAAFAcAABQHgAAUCAAAFAiAABQJAAAUCYAAFBlAABQZwAAUGkAAFBrAABQbQAAUG4AAFBvAABQcAAAUHEAAFBzAABQdQAAUHYAAFB3AABQeQAAUHoAAFC5AABQuwAAUL0AAFC/AABQwQAAUMIAAFDDAABQxAAAUMUAAFDHAABQyQAAUMoAAFDLAABQzQAAUM4AAFENAABRDwAAUREAAFETAABRFQAAURYAAFEXAABRGAAAURkAAFEbAABRHQAAUR4AAFEfAABRIQAAUSIAAFEvAABRMAAAUTEAAFEzAABRcgAAUXQAAFF2AABReAAAUXoAAFF7AABRfAAAUX0AAFF+AABRgAAAUYIAAFGDAABRhAAAUYYAAFGHAABRxgAAUcgAAFHKAABRzAAAUc4AAFHPAABR0AAAUdEAAFHSAABR1AAAUdYAAFHXAABR2AAAUdoAAFHbAABSGgAAUhwAAFIeAABSIAAAUiIAAFIjAABSJAAAUiUAAFImAABSKAAAUioAAFIrAABSLAAAUi4AAFIvAABSbgAAUnAAAFJyAABSdAAAUnYAAFJ3AABSeAAAUnkAAFJ6AABSfAAAUn4AAFJ/AABSgAAAUoIAAFKDAABSwgAAUsQAAFLGAABSyAAAUsoAAFLLAABSzAAAUs0AAFLOAABS0AAAUtIAAFLTAABS1AAAUtYAAFLXAABS/AAAUyAAAFNHAABTawAAU20AAFNvAABTcQAAU3MAAFN1AABTdwAAU3gAAFN6AABThwAAU5YAAFOYAABTmgAAU5wAAFOeAABToAAAU6IAAFOkAABTswAAU7UAAFO3AABTuQAAU7sAAFO9AABTvwAAU8EAAFPDAABUAgAAVAQAAFQGAABUCAAAVAoAAFQLAABUDAAAVA0AAFQOAABUEAAAVBIAAFQTAABUFAAAVBYAAFQXAABUVgAAVFgAAFRaAABUXAAAVF4AAFRfAABUYAAAVGEAAFRiAABUZAAAVGYAAFRnAABUaAAAVGoAAFRrAABUqgAAVKwAAFSuAABUsAAAVLIAAFSzAABUtAAAVLUAAFS2AABUuAAAVLoAAFS7AABUvAAAVL4AAFS/AABU/gAAVQAAAFUCAABVBAAAVQYAAFUHAABVCAAAVQkAAFUKAABVDAAAVQ4AAFUPAABVEAAAVRIAAFUTAABVFgAAVVUAAFVXAABVWQAAVVsAAFVdAABVXgAAVV8AAFVgAABVYQAAVWMAAFVlAABVZgAAVWcAAFVpAABVagAAVakAAFWrAABVrQAAVa8AAFWxAABVsgAAVbMAAFW0AABVtQAAVbcAAFW5AABVugAAVbsAAFW9AABVvgAAVf0AAFX/AABWAQAAVgMAAFYFAABWBgAAVgcAAFYIAABWCQAAVgsAAFYNAABWDgAAVg8AAFYRAABWEgAAVl0AAFaAAABWoAAAVsAAAFbCAABWxAAAVsYAAFbIAABWygAAVssAAFbMAABWzgAAVs8AAFbRAABW0gAAVtQAAFbWAABW1wAAVtgAAFbaAABW2wAAVuAAAFbtAABW8gAAVvQAAFb2AABW+wAAVv0AAFb/AABXAQAAVyYAAFdKAABXcQAAV5UAAFeXAABXmQAAV5sAAFedAABXnwAAV6EAAFeiAABXpAAAV7EAAFfCAABXxAAAV8YAAFfIAABXygAAV8wAAFfOAABX0AAAV9IAAFfjAABX5QAAV+cAAFfpAABX6wAAV+0AAFfvAABX8QAAV/MAAFf1AABYNAAAWDYAAFg4AABYOgAAWDwAAFg9AABYPgAAWD8AAFhAAABYQgAAWEQAAFhFAABYRgAAWEgAAFhJAABYiAAAWIoAAFiMAABYjgAAWJAAAFiRAABYkgAAWJMAAFiUAABYlgAAWJgAAFiZAABYmgAAWJwAAFidAABY3AAAWN4AAFjgAABY4gAAWOQAAFjlAABY5gAAWOcAAFjoAABY6gAAWOwAAFjtAABY7gAAWPAAAFjxAABY/gAAWP8AAFkAAABZAgAAWUEAAFlDAABZRQAAWUcAAFlJAABZSgAAWUsAAFlMAABZTQAAWU8AAFlRAABZUgAAWVMAAFlVAABZVgAAWZUAAFmXAABZmQAAWZsAAFmdAABZngAAWZ8AAFmgAABZoQAAWaMAAFmlAABZpgAAWacAAFmpAABZqgAAWekAAFnrAABZ7QAAWe8AAFnxAABZ8gAAWfMAAFn0AABZ9QAAWfcAAFn5AABZ+gAAWfsAAFn9AABZ/gAAWj0AAFo/AABaQQAAWkMAAFpFAABaRgAAWkcAAFpIAABaSQAAWksAAFpNAABaTgAAWk8AAFpRAABaUgAAWpEAAFqTAABalQAAWpcAAFqZAABamgAAWpsAAFqcAABanQAAWp8AAFqhAABaogAAWqMAAFqlAABapgAAWssAAFrvAABbFgAAWzoAAFs8AABbPgAAW0AAAFtCAABbRAAAW0YAAFtHAABbSQAAW1YAAFtlAABbZwAAW2kAAFtrAABbbQAAW28AAFtxAABbcwAAW4IAAFuEAABbhgAAW4gAAFuLAABbjgAAW5EAAFuUAABblgAAW9UAAFvXAABb2QAAW9sAAFvdAABb3gAAW98AAFvgAABb4QAAW+MAAFvlAABb5gAAW+cAAFvpAABb6gAAXCkAAFwrAABcLQAAXC8AAFwxAABcMgAAXDMAAFw0AABcNQAAXDcAAFw5AABcOgAAXDsAAFw9AABcPgAAXH0AAFx/AABcgQAAXIMAAFyFAABchgAAXIcAAFyIAABciQAAXIsAAFyNAABcjgAAXI8AAFyRAABckgAAXNEAAFzTAABc1QAAXNcAAFzZAABc2gAAXNsAAFzcAABc3QAAXN8AAFzhAABc4gAAXOMAAFzlAABc5gAAXSUAAF0nAABdKQAAXSsAAF0tAABdLgAAXS8AAF0wAABdMQAAXTMAAF01AABdNgAAXTcAAF05AABdOgAAXXkAAF17AABdfQAAXX8AAF2BAABdggAAXYMAAF2EAABdhQAAXYcAAF2JAABdigAAXYsAAF2NAABdjgAAXc0AAF3PAABd0QAAXdMAAF3VAABd1gAAXdcAAF3YAABd2QAAXdsAAF3dAABd3gAAXd8AAF3hAABd4gAAXi0AAF5QAABecAAAXpAAAF6SAABelAAAXpYAAF6YAABemgAAXpsAAF6cAABenwAAXqAAAF6iAABeowAAXqUAAF6nAABeqAAAXqkAAF6sAABerQAAXrIAAF6/AABexAAAXsYAAF7IAABezQAAXtAAAF7TAABe1QAAXvoAAF8eAABfRQAAX2kAAF9sAABfbgAAX3AAAF9yAABfdAAAX3YAAF93AABfegAAX4cAAF+YAABfmgAAX5wAAF+eAABfoAAAX6IAAF+kAABfpgAAX6gAAF+5AABfvAAAX78AAF/CAABfxQAAX8gAAF/LAABfzgAAX9EAAF/TAABgEgAAYBQAAGAWAABgGAAAYBsAAGAcAABgHQAAYB4AAGAfAABgIQAAYCMAAGAkAABgJQAAYCcAAGAoAABgZwAAYGkAAGBrAABgbQAAYHAAAGBxAABgcgAAYHMAAGB0AABgdgAAYHgAAGB5AABgegAAYHwAAGB9AABgvAAAYL4AAGDBAABgwwAAYMYAAGDHAABgyAAAYMkAAGDKAABgzAAAYM4AAGDPAABg0AAAYNIAAGDTAABg4AAAYOEAAGDiAABg5AAAYSMAAGElAABhJwAAYSkAAGEsAABhLQAAYS4AAGEvAABhMAAAYTIAAGE0AABhNQAAYTYAAGE4AABhOQAAYXgAAGF6AABhfAAAYX4AAGGBAABhggAAYYMAAGGEAABhhQAAYYcAAGGJAABhigAAYYsAAGGNAABhjgAAYc0AAGHPAABh0QAAYdMAAGHWAABh1wAAYdgAAGHZAABh2gAAYdwAAGHeAABh3wAAYeAAAGHiAABh4wAAYiIAAGIkAABiJgAAYigAAGIrAABiLAAAYi0AAGIuAABiLwAAYjEAAGIzAABiNAAAYjUAAGI3AABiOAAAYncAAGJ5AABiewAAYn0AAGKAAABigQAAYoIAAGKDAABihAAAYoYAAGKIAABiiQAAYooAAGKMAABijQAAYrIAAGLWAABi/QAAYyEAAGMkAABjJgAAYygAAGMqAABjLAAAYy4AAGMvAABjMgAAYz8AAGNOAABjUAAAY1IAAGNUAABjVgAAY1gAAGNaAABjXAAAY2sAAGNuAABjcQAAY3QAAGN3AABjegAAY30AAGOAAABjggAAY8EAAGPDAABjxQAAY8cAAGPKAABjywAAY8wAAGPNAABjzgAAY9AAAGPSAABj0wAAY9QAAGPWAABj1wAAZBYAAGQYAABkGgAAZBwAAGQfAABkIAAAZCEAAGQiAABkIwAAZCUAAGQnAABkKAAAZCkAAGQrAABkLAAAZGsAAGRtAABkbwAAZHEAAGR0AABkdQAAZHYAAGR3AABkeAAAZHoAAGR8AABkfQAAZH4AAGSAAABkgQAAZMAAAGTCAABkxAAAZMYAAGTJAABkygAAZMsAAGTMAABkzQAAZM8AAGTRAABk0gAAZNMAAGTVAABk1gAAZRUAAGUXAABlGQAAZRsAAGUeAABlHwAAZSAAAGUhAABlIgAAZSQAAGUmAABlJwAAZSgAAGUqAABlKwAAZWoAAGVsAABlbgAAZXAAAGVzAABldAAAZXUAAGV2AABldwAAZXkAAGV7AABlfAAAZX0AAGV/AABlgAAAZb8AAGXBAABlwwAAZcUAAGXIAABlyQAAZcoAAGXLAABlzAAAZc4AAGXQAABl0QAAZdIAAGXUAABl1QAAZiAAAGZDAABmYwAAZoMAAGaFAABmhwAAZokAAGaLAABmjQAAZo4AAGaPAABmkgAAZpMAAGaVAABmlgAAZpkAAGabAABmnAAAZp0AAGagAABmoQAAZqYAAGazAABmuAAAZroAAGa9AABmwgAAZsUAAGbIAABmygAAZt0AAGcCAABnJgAAZ00AAGdxAABndAAAZ3YAAGd4AABnegAAZ3wAAGd+AABnfwAAZ4IAAGePAABnoAAAZ6IAAGekAABnpgAAZ6gAAGeqAABnrAAAZ64AAGewAABnwQAAZ8QAAGfHAABnygAAZ80AAGfQAABn0wAAZ9YAAGfZAABn2wAAaBoAAGgcAABoHgAAaCAAAGgjAABoJAAAaCUAAGgmAABoJwAAaCkAAGgrAABoLAAAaC0AAGgvAABoMAAAaG8AAGhxAABocwAAaHUAAGh4AABoeQAAaHoAAGh7AABofAAAaH4AAGiAAABogQAAaIIAAGiEAABohQAAaMQAAGjGAABoyQAAaMsAAGjOAABozwAAaNAAAGjRAABo0gAAaNQAAGjWAABo1wAAaNgAAGjaAABo2wAAaOgAAGjpAABo6gAAaOwAAGkrAABpLQAAaS8AAGkxAABpNAAAaTUAAGk2AABpNwAAaTgAAGk6AABpPAAAaT0AAGk+AABpQAAAaUEAAGmAAABpggAAaYQAAGmGAABpiQAAaYoAAGmLAABpjAAAaY0AAGmPAABpkQAAaZIAAGmTAABplQAAaZYAAGnVAABp1wAAadkAAGnbAABp3gAAad8AAGngAABp4QAAaeIAAGnkAABp5gAAaecAAGnoAABp6gAAaesAAGoqAABqLAAAai4AAGowAABqMwAAajQAAGo1AABqNgAAajcAAGo5AABqOwAAajwAAGo9AABqPwAAakAAAGp/AABqgQAAaoMAAGqFAABqiAAAaokAAGqKAABqiwAAaowAAGqOAABqkAAAapEAAGqSAABqlAAAapUAAGq6AABq3gAAawUAAGspAABrLAAAay8AAGsxAABrMwAAazUAAGs3AABrOAAAazsAAGtIAABrVwAAa1oAAGtdAABrYAAAa2MAAGtmAABraQAAa2wAAGt7AABrfgAAa4EAAGuEAABrhwAAa4oAAGuNAABrkAAAa5IAAGukAABruAAAa8oAAGvfAABr8QAAbAAAAGwdAABsXAAAbF4AAGxhAABsYwAAbGYAAGxnAABsaAAAbGkAAGxqAABsbAAAbG8AAGxwAABscQAAbHMAAGx0AABsswAAbLUAAGy4AABsugAAbL0AAGy+AABsvwAAbMAAAGzBAABswwAAbMYAAGzHAABsyAAAbMoAAGzLAABszQAAbQwAAG0OAABtEQAAbRMAAG0WAABtFwAAbRgAAG0ZAABtGgAAbRwAAG0fAABtIAAAbSEAAG0jAABtJAAAbWMAAG1lAABtaAAAbWoAAG1tAABtbgAAbW8AAG1wAABtcQAAbXMAAG12AABtdwAAbXgAAG16AABtewAAbb4AAG3iAABuBgAAbikAAG5QAABucAAAbpcAAG6+AABu3gAAbwIAAG8mAABvKAAAbysAAG8tAABvLwAAbzEAAG80AABvNwAAbzkAAG87AABvPgAAb0AAAG9CAABvRQAAb0gAAG9JAABvTgAAb1sAAG9eAABvYAAAb2MAAG9mAABvaAAAb40AAG+xAABv2AAAb/wAAG//AABwAQAAcAMAAHAFAABwBwAAcAkAAHAKAABwDQAAcBoAAHArAABwLQAAcC8AAHAxAABwMwAAcDUAAHA3AABwOQAAcDsAAHBMAABwTwAAcFIAAHBVAABwWAAAcFsAAHBeAABwYQAAcGQAAHBmAABwpQAAcKcAAHCqAABwrAAAcK8AAHCwAABwsQAAcLIAAHCzAABwtQAAcLcAAHC4AABwuQAAcLsAAHC8AABwxQAAcMYAAHDIAABxBwAAcQkAAHELAABxDQAAcRAAAHERAABxEgAAcRMAAHEUAABxFgAAcRgAAHEZAABxGgAAcRwAAHEdAABxXAAAcV4AAHFgAABxYgAAcWUAAHFmAABxZwAAcWgAAHFpAABxawAAcW0AAHFuAABxbwAAcXEAAHFyAABxsQAAcbMAAHG2AABxuAAAcbsAAHG8AABxvQAAcb4AAHG/AABxwQAAccMAAHHEAABxxQAAcccAAHHIAABx0QAAcdIAAHHUAAByEwAAchUAAHIXAAByGQAAchwAAHIdAAByHgAAch8AAHIgAAByIgAAciQAAHIlAAByJgAAcigAAHIpAAByaAAAcmoAAHJtAABybwAAcnIAAHJzAABydAAAcnUAAHJ2AAByeAAAcnoAAHJ7AAByfAAAcn4AAHJ/AAByjAAAco0AAHKOAABykAAAcs8AAHLRAABy0wAActUAAHLYAABy2QAActoAAHLbAABy3AAAct4AAHLgAABy4QAAcuIAAHLkAABy5QAAcyQAAHMmAABzKQAAcysAAHMuAABzLwAAczAAAHMxAABzMgAAczQAAHM2AABzNwAAczgAAHM6AABzOwAAc04AAHNbAABzbgAAc3EAAHN0AABzdwAAc3oAAHN9AABzfwAAc4IAAHOFAABzhwAAc5oAAHOdAABzoAAAc6MAAHOmAABzqQAAc6wAAHOvAABzsgAAc7UAAHO3AABzvwAAc8MAAHPXAABz3AAAc+QAAHPqAABz9AAAdD8AAHRiAAB0ggAAdKIAAHSkAAB0pgAAdKgAAHSqAAB0rQAAdK4AAHSvAAB0sgAAdLMAAHS1AAB0tgAAdLgAAHS7AAB0vAAAdL0AAHTAAAB0wQAAdMYAAHTTAAB02AAAdNoAAHTcAAB04QAAdOQAAHTnAAB06QAAdQ4AAHUyAAB1WQAAdX0AAHWAAAB1ggAAdYQAAHWGAAB1iAAAdYoAAHWLAAB1jgAAdZsAAHWsAAB1rgAAdbAAAHWyAAB1tAAAdbYAAHW4AAB1ugAAdbwAAHXNAAB10AAAddMAAHXWAAB12QAAddwAAHXfAAB14gAAdeUAAHXnAAB2JgAAdigAAHYqAAB2LAAAdi8AAHYwAAB2MQAAdjIAAHYzAAB2NQAAdjcAAHY4AAB2OQAAdjsAAHY8AAB2ewAAdn0AAHZ/AAB2gQAAdoQAAHaFAAB2hgAAdocAAHaIAAB2igAAdowAAHaNAAB2jgAAdpAAAHaRAAB20AAAdtIAAHbVAAB21wAAdtoAAHbbAAB23AAAdt0AAHbeAAB24AAAduIAAHbjAAB25AAAduYAAHbnAAB29AAAdvUAAHb2AAB2+AAAdzcAAHc5AAB3OwAAdz0AAHdAAAB3QQAAd0IAAHdDAAB3RAAAd0YAAHdIAAB3SQAAd0oAAHdMAAB3TQAAd4wAAHeOAAB3kAAAd5IAAHeVAAB3lgAAd5cAAHeYAAB3mQAAd5sAAHedAAB3ngAAd58AAHehAAB3ogAAd+EAAHfjAAB35QAAd+cAAHfqAAB36wAAd+wAAHftAAB37gAAd/AAAHfyAAB38wAAd/QAAHf2AAB39wAAeDYAAHg4AAB4OgAAeDwAAHg/AAB4QAAAeEEAAHhCAAB4QwAAeEUAAHhHAAB4SAAAeEkAAHhLAAB4TAAAeIsAAHiNAAB4jwAAeJEAAHiUAAB4lQAAeJYAAHiXAAB4mAAAeJoAAHicAAB4nQAAeJ4AAHigAAB4oQAAeMYAAHjqAAB5EQAAeTUAAHk4AAB5OgAAeTwAAHk+AAB5QAAAeUIAAHlDAAB5RgAAeVMAAHliAAB5ZAAAeWYAAHloAAB5agAAeWwAAHluAAB5cAAAeX8AAHmCAAB5hQAAeYgAAHmLAAB5jgAAeZEAAHmUAAB5lgAAedUAAHnXAAB52QAAedsAAHneAAB53wAAeeAAAHnhAAB54gAAeeQAAHnmAAB55wAAeegAAHnqAAB56wAAeioAAHosAAB6LgAAejAAAHozAAB6NAAAejUAAHo2AAB6NwAAejkAAHo7AAB6PAAAej0AAHo/AAB6QAAAen8AAHqBAAB6gwAAeoUAAHqIAAB6iQAAeooAAHqLAAB6jAAAeo4AAHqQAAB6kQAAepIAAHqUAAB6lQAAetQAAHrWAAB62AAAetoAAHrdAAB63gAAet8AAHrgAAB64QAAeuMAAHrlAAB65gAAeucAAHrpAAB66gAAeykAAHsrAAB7LQAAey8AAHsyAAB7MwAAezQAAHs1AAB7NgAAezgAAHs6AAB7OwAAezwAAHs+AAB7PwAAe34AAHuAAAB7ggAAe4QAAHuHAAB7iAAAe4kAAHuKAAB7iwAAe40AAHuPAAB7kAAAe5EAAHuTAAB7lAAAe9MAAHvVAAB71wAAe9kAAHvcAAB73QAAe94AAHvfAAB74AAAe+IAAHvkAAB75QAAe+YAAHvoAAB76QAAfDQAAHxXAAB8dwAAfJcAAHyZAAB8mwAAfJ0AAHyfAAB8ogAAfKMAAHykAAB8pwAAfKgAAHyqAAB8qwAAfK0AAHywAAB8sQAAfLIAAHy1AAB8tgAAfLsAAHzIAAB8zQAAfM8AAHzRAAB81gAAfNkAAHzcAAB83gAAfQMAAH0nAAB9TgAAfXIAAH11AAB9dwAAfXkAAH17AAB9fQAAfX8AAH2AAAB9gwAAfZAAAH2hAAB9owAAfaUAAH2nAAB9qQAAfasAAH2tAAB9rwAAfbEAAH3CAAB9xQAAfcgAAH3LAAB9zgAAfdEAAH3UAAB91wAAfdoAAH3cAAB+GwAAfh0AAH4fAAB+IQAAfiQAAH4lAAB+JgAAficAAH4oAAB+KgAAfiwAAH4tAAB+LgAAfjAAAH4xAAB+cAAAfnIAAH50AAB+dgAAfnkAAH56AAB+ewAAfnwAAH59AAB+fwAAfoEAAH6CAAB+gwAAfoUAAH6GAAB+xQAAfscAAH7KAAB+zAAAfs8AAH7QAAB+0QAAftIAAH7TAAB+1QAAftcAAH7YAAB+2QAAftsAAH7cAAB+6QAAfuoAAH7rAAB+7QAAfywAAH8uAAB/MAAAfzIAAH81AAB/NgAAfzcAAH84AAB/OQAAfzsAAH89AAB/PgAAfz8AAH9BAAB/QgAAf4EAAH+DAAB/hQAAf4cAAH+KAAB/iwAAf4wAAH+NAAB/jgAAf5AAAH+SAAB/kwAAf5QAAH+WAAB/lwAAf9YAAH/YAAB/2gAAf9wAAH/fAAB/4AAAf+EAAH/iAAB/4wAAf+UAAH/nAAB/6AAAf+kAAH/rAAB/7AAAgCsAAIAtAACALwAAgDEAAIA0AACANQAAgDYAAIA3AACAOAAAgDoAAIA8AACAPQAAgD4AAIBAAACAQQAAgIAAAICCAACAhAAAgIYAAICJAACAigAAgIsAAICMAACAjQAAgI8AAICRAACAkgAAgJMAAICVAACAlgAAgLsAAIDfAACBBgAAgSoAAIEtAACBLwAAgTEAAIEzAACBNQAAgTcAAIE4AACBOwAAgUgAAIFXAACBWQAAgVsAAIFdAACBXwAAgWEAAIFjAACBZQAAgXQAAIF3AACBegAAgX0AAIGAAACBgwAAgYYAAIGJAACBiwAAgcoAAIHMAACBzgAAgdAAAIHTAACB1AAAgdUAAIHWAACB1wAAgdkAAIHbAACB3AAAgd0AAIHfAACB4AAAgh8AAIIhAACCIwAAgiUAAIIoAACCKQAAgioAAIIrAACCLAAAgi4AAIIwAACCMQAAgjIAAII0AACCNQAAgnQAAIJ2AACCeAAAgnoAAIJ9AACCfgAAgn8AAIKAAACCgQAAgoMAAIKFAACChgAAgocAAIKJAACCigAAgskAAILLAACCzQAAgs8AAILSAACC0wAAgtQAAILVAACC1gAAgtgAAILaAACC2wAAgtwAAILeAACC3wAAgx4AAIMgAACDIgAAgyQAAIMnAACDKAAAgykAAIMqAACDKwAAgy0AAIMvAACDMAAAgzEAAIMzAACDNAAAg3MAAIN1AACDdwAAg3kAAIN8AACDfQAAg34AAIN/AACDgAAAg4IAAIOEAACDhQAAg4YAAIOIAACDiQAAg8gAAIPKAACDzAAAg84AAIPRAACD0gAAg9MAAIPUAACD1QAAg9cAAIPZAACD2gAAg9sAAIPdAACD3gAAhCkAAIRMAACEbAAAhIwAAISOAACEkAAAhJIAAISUAACElwAAhJgAAISZAACEnAAAhJ0AAISfAACEoAAAhKMAAISmAACEpwAAhKgAAISrAACErAAAhLEAAIS+AACEwwAAhMUAAITIAACEzQAAhNAAAITTAACE1QAAhPoAAIUeAACFRQAAhWkAAIVsAACFbgAAhXAAAIVyAACFdAAAhXYAAIV3AACFegAAhYcAAIWYAACFmgAAhZwAAIWeAACFoAAAhaIAAIWkAACFpgAAhagAAIW5AACFvAAAhb8AAIXCAACFxQAAhcgAAIXLAACFzgAAhdEAAIXTAACGEgAAhhQAAIYWAACGGAAAhhsAAIYcAACGHQAAhh4AAIYfAACGIQAAhiMAAIYkAACGJQAAhicAAIYoAACGZwAAhmkAAIZrAACGbQAAhnAAAIZxAACGcgAAhnMAAIZ0AACGdgAAhngAAIZ5AACGegAAhnwAAIZ9AACGvAAAhr4AAIbBAACGwwAAhsYAAIbHAACGyAAAhskAAIbKAACGzAAAhs4AAIbPAACG0AAAhtIAAIbTAACG4AAAhuEAAIbiAACG5AAAhyMAAIclAACHJwAAhykAAIcsAACHLQAAhy4AAIcvAACHMAAAhzIAAIc0AACHNQAAhzYAAIc4AACHOQAAh3gAAId6AACHfAAAh34AAIeBAACHggAAh4MAAIeEAACHhQAAh4cAAIeJAACHigAAh4sAAIeNAACHjgAAh80AAIfPAACH0QAAh9MAAIfWAACH1wAAh9gAAIfZAACH2gAAh9wAAIfeAACH3wAAh+AAAIfiAACH4wAAiCIAAIgkAACIJgAAiCgAAIgrAACILAAAiC0AAIguAACILwAAiDEAAIgzAACINAAAiDUAAIg3AACIOAAAiHcAAIh5AACIewAAiH0AAIiAAACIgQAAiIIAAIiDAACIhAAAiIYAAIiIAACIiQAAiIoAAIiMAACIjQAAiLIAAIjWAACI/QAAiSEAAIkkAACJJwAAiSkAAIkrAACJLQAAiS8AAIkwAACJMwAAiUAAAIlPAACJUgAAiVUAAIlYAACJWwAAiV4AAIlhAACJZAAAiXMAAIl2AACJeQAAiXwAAIl/AACJggAAiYUAAImIAACJigAAickAAInLAACJzgAAidAAAInTAACJ1AAAidUAAInWAACJ1wAAidkAAIncAACJ3QAAid4AAIngAACJ4QAAiiAAAIoiAACKJQAAiicAAIoqAACKKwAAiiwAAIotAACKLgAAijAAAIozAACKNAAAijUAAIo3AACKOAAAincAAIp5AACKfAAAin4AAIqBAACKggAAioMAAIqEAACKhQAAiocAAIqKAACKiwAAiowAAIqOAACKjwAAis4AAIrQAACK0gAAitQAAIrXAACK2AAAitkAAIraAACK2wAAit0AAIrgAACK4QAAiuIAAIrkAACK5QAAiyQAAIsmAACLKAAAiyoAAIstAACLLgAAiy8AAIswAACLMQAAizMAAIs2AACLNwAAizgAAIs6AACLOwAAi3oAAIt8AACLfgAAi4AAAIuDAACLhAAAi4UAAIuGAACLhwAAi4kAAIuMAACLjQAAi44AAIuQAACLkQAAi9AAAIvSAACL1QAAi9cAAIvaAACL2wAAi9wAAIvdAACL3gAAi+AAAIvjAACL5AAAi+UAAIvnAACL6AAAi/EAAIwEAACMEQAAjCQAAIwxAACMRAAAjFsAAIxtAACMuAAAjNsAAIz7AACNGwAAjR0AAI0fAACNIQAAjSMAAI0mAACNJwAAjSgAAI0rAACNLAAAjS4AAI0vAACNMgAAjTUAAI02AACNNwAAjToAAI07AACNQAAAjU0AAI1SAACNVAAAjVcAAI1cAACNXwAAjWIAAI1kAACNiQAAja0AAI3UAACN+AAAjfsAAI39AACN/wAAjgEAAI4DAACOBQAAjgYAAI4JAACOFgAAjicAAI4pAACOKwAAji0AAI4vAACOMQAAjjMAAI41AACONwAAjkgAAI5LAACOTgAAjlEAAI5UAACOVwAAjloAAI5dAACOYAAAjmIAAI6hAACOowAAjqUAAI6nAACOqgAAjqsAAI6sAACOrQAAjq4AAI6wAACOsgAAjrMAAI60AACOtgAAjrcAAI72AACO+AAAjvoAAI78AACO/wAAjwAAAI8BAACPAgAAjwMAAI8FAACPBwAAjwgAAI8JAACPCwAAjwwAAI9LAACPTQAAj1AAAI9SAACPVQAAj1YAAI9XAACPWAAAj1kAAI9bAACPXQAAj14AAI9fAACPYQAAj2IAAI9vAACPcAAAj3EAAI9zAACPsgAAj7QAAI+2AACPuAAAj7sAAI+8AACPvQAAj74AAI+/AACPwQAAj8MAAI/EAACPxQAAj8cAAI/IAACQBwAAkAkAAJALAACQDQAAkBAAAJARAACQEgAAkBMAAJAUAACQFgAAkBgAAJAZAACQGgAAkBwAAJAdAACQXAAAkF4AAJBgAACQYgAAkGUAAJBmAACQZwAAkGgAAJBpAACQawAAkG0AAJBuAACQbwAAkHEAAJByAACQsQAAkLMAAJC1AACQtwAAkLoAAJC7AACQvAAAkL0AAJC+AACQwAAAkMIAAJDDAACQxAAAkMYAAJDHAACRBgAAkQgAAJEKAACRDAAAkQ8AAJEQAACREQAAkRIAAJETAACRFQAAkRcAAJEYAACRGQAAkRsAAJEcAACRQQAAkWUAAJGMAACRsAAAkbMAAJG2AACRuAAAkboAAJG8AACRvgAAkb8AAJHCAACRzwAAkd4AAJHhAACR5AAAkecAAJHqAACR7QAAkfAAAJHzAACSAgAAkgUAAJIIAACSCwAAkg4AAJIRAACSFAAAkhcAAJIZAACSWAAAkloAAJJdAACSXwAAkmIAAJJjAACSZAAAkmUAAJJmAACSaAAAkmsAAJJsAACSbQAAkm8AAJJwAACSrwAAkrEAAJK0AACStgAAkrkAAJK6AACSuwAAkrwAAJK9AACSvwAAksIAAJLDAACSxAAAksYAAJLHAACTBgAAkwgAAJMLAACTDQAAkxAAAJMRAACTEgAAkxMAAJMUAACTFgAAkxkAAJMaAACTGwAAkx0AAJMeAACTXQAAk18AAJNiAACTZAAAk2cAAJNoAACTaQAAk2oAAJNrAACTbQAAk3AAAJNxAACTcgAAk3QAAJN1AACTuAAAk9wAAJQAAACUIwAAlEoAAJRqAACUkQAAlLgAAJTYAACU/AAAlSAAAJUiAACVJQAAlScAAJUpAACVKwAAlS4AAJUxAACVMwAAlTUAAJU4AACVOgAAlTwAAJU/AACVQgAAlUMAAJVIAACVVQAAlVgAAJVaAACVXQAAlWAAAJViAACVhwAAlasAAJXSAACV9gAAlfkAAJX7AACV/QAAlf8AAJYBAACWAwAAlgQAAJYHAACWFAAAliUAAJYnAACWKQAAlisAAJYtAACWLwAAljEAAJYzAACWNQAAlkYAAJZJAACWTAAAlk8AAJZSAACWVQAAllgAAJZbAACWXgAAlmAAAJafAACWoQAAlqQAAJamAACWqQAAlqoAAJarAACWrAAAlq0AAJavAACWsQAAlrIAAJazAACWtQAAlrYAAJa/AACWwAAAlsIAAJcBAACXAwAAlwUAAJcHAACXCgAAlwsAAJcMAACXDQAAlw4AAJcQAACXEgAAlxMAAJcUAACXFgAAlxcAAJdWAACXWAAAl1oAAJdcAACXXwAAl2AAAJdhAACXYgAAl2MAAJdlAACXZwAAl2gAAJdpAACXawAAl2wAAJerAACXrQAAl7AAAJeyAACXtQAAl7YAAJe3AACXuAAAl7kAAJe7AACXvQAAl74AAJe/AACXwQAAl8IAAJfLAACXzAAAl84AAJgNAACYDwAAmBEAAJgTAACYFgAAmBcAAJgYAACYGQAAmBoAAJgcAACYHgAAmB8AAJggAACYIgAAmCMAAJhiAACYZAAAmGcAAJhpAACYbAAAmG0AAJhuAACYbwAAmHAAAJhyAACYdAAAmHUAAJh2AACYeAAAmHkAAJiGAACYhwAAmIgAAJiKAACYyQAAmMsAAJjNAACYzwAAmNIAAJjTAACY1AAAmNUAAJjWAACY2AAAmNoAAJjbAACY3AAAmN4AAJjfAACZHgAAmSAAAJkiAACZJAAAmScAAJkoAACZKQAAmSoAAJkrAACZLQAAmS8AAJkwAACZMQAAmTMAAJk0AACZQQAAmV4AAJlhAACZYwAAmWYAAJlpAACZbAAAmW8AAJlyAACZdQAAmXgAAJl7AACZfgAAmYEAAJmDAACZhgAAmaMAAJmmAACZqQAAmawAAJmvAACZsgAAmbUAAJm4AACZuwAAmb4AAJnBAACZxAAAmccAAJnKAACZzQAAmc8AAJnZAACZ4AAAmesAAJn9AACaEQAAmhsAAJo2AACaTAAAmlsAAJppAACacgAAmoEAAJrMAACa7wAAmw8AAJsvAACbMQAAmzMAAJs1AACbNwAAmzoAAJs7AACbPAAAmz8AAJtAAACbQgAAm0MAAJtGAACbSQAAm0oAAJtLAACbTgAAm08AAJtUAACbYQAAm2YAAJtoAACbawAAm3AAAJtzAACbdgAAm3gAAJudAACbwQAAm+gAAJwMAACcDwAAnBEAAJwTAACcFQAAnBcAAJwZAACcGgAAnB0AAJwqAACcOwAAnD0AAJw/AACcQQAAnEMAAJxFAACcRwAAnEkAAJxLAACcXAAAnF8AAJxiAACcZQAAnGgAAJxrAACcbgAAnHEAAJx0AACcdgAAnLUAAJy3AACcuQAAnLsAAJy+AACcvwAAnMAAAJzBAACcwgAAnMQAAJzGAACcxwAAnMgAAJzKAACcywAAnQoAAJ0MAACdDgAAnRAAAJ0TAACdFAAAnRUAAJ0WAACdFwAAnRkAAJ0bAACdHAAAnR0AAJ0fAACdIAAAnV8AAJ1hAACdZAAAnWYAAJ1pAACdagAAnWsAAJ1sAACdbQAAnW8AAJ1xAACdcgAAnXMAAJ11AACddgAAnYMAAJ2EAACdhQAAnYcAAJ3GAACdyAAAncoAAJ3MAACdzwAAndAAAJ3RAACd0gAAndMAAJ3VAACd1wAAndgAAJ3ZAACd2wAAndwAAJ4bAACeHQAAnh8AAJ4hAACeJAAAniUAAJ4mAACeJwAAnigAAJ4qAACeLAAAni0AAJ4uAACeMAAAnjEAAJ5wAACecgAAnnQAAJ52AACeeQAAnnoAAJ57AACefAAAnn0AAJ5/AACegQAAnoIAAJ6DAACehQAAnoYAAJ7FAACexwAAnskAAJ7LAACezgAAns8AAJ7QAACe0QAAntIAAJ7UAACe1gAAntcAAJ7YAACe2gAAntsAAJ8aAACfHAAAnx4AAJ8gAACfIwAAnyQAAJ8lAACfJgAAnycAAJ8pAACfKwAAnywAAJ8tAACfLwAAnzAAAJ9VAACfeQAAn6AAAJ/EAACfxwAAn8oAAJ/MAACfzgAAn9AAAJ/SAACf0wAAn9YAAJ/jAACf8gAAn/UAAJ/4AACf+wAAn/4AAKABAACgBAAAoAcAAKAWAACgGQAAoBwAAKAfAACgIgAAoCUAAKAoAACgKwAAoC0AAKBsAACgbgAAoHEAAKBzAACgdgAAoHcAAKB4AACgeQAAoHoAAKB8AACgfwAAoIAAAKCBAACggwAAoIQAAKDDAACgxQAAoMgAAKDKAACgzQAAoM4AAKDPAACg0AAAoNEAAKDTAACg1gAAoNcAAKDYAACg2gAAoNsAAKEaAAChHAAAoR8AAKEhAAChJAAAoSUAAKEmAAChJwAAoSgAAKEqAAChLQAAoS4AAKEvAAChMQAAoTIAAKFxAAChcwAAoXUAAKF3AAChegAAoXsAAKF8AAChfQAAoX4AAKGAAAChgwAAoYQAAKGFAAChhwAAoYgAAKHHAAChyQAAocsAAKHNAACh0AAAodEAAKHSAACh0wAAodQAAKHWAACh2QAAodoAAKHbAACh3QAAod4AAKIdAACiHwAAoiEAAKIjAACiJgAAoicAAKIoAACiKQAAoioAAKIsAACiLwAAojAAAKIxAACiMwAAojQAAKJzAACidQAAongAAKJ6AACifQAAon4AAKJ/AACigAAAooEAAKKDAACihgAAoocAAKKIAACiigAAoosAAKLWAACi+QAAoxkAAKM5AACjOwAAoz0AAKM/AACjQQAAo0MAAKNEAACjRQAAo0gAAKNJAACjSwAAo0wAAKNPAACjUQAAo1IAAKNTAACjVgAAo1cAAKNcAACjaQAAo24AAKNwAACjcwAAo3gAAKN7AACjfgAAo4AAAKOlAACjyQAAo/AAAKQUAACkFwAApBkAAKQbAACkHQAApB8AAKQhAACkIgAApCUAAKQyAACkQwAApEUAAKRHAACkSQAApEsAAKRNAACkTwAApFEAAKRTAACkZAAApGcAAKRqAACkbQAApHAAAKRzAACkdgAApHkAAKR8AACkfgAApL0AAKS/AACkwQAApMMAAKTGAACkxwAApMgAAKTJAACkygAApMwAAKTOAACkzwAApNAAAKTSAACk0wAApRIAAKUUAAClFgAApRgAAKUbAAClHAAApR0AAKUeAAClHwAApSEAAKUjAAClJAAApSUAAKUnAAClKAAApWcAAKVpAAClbAAApW4AAKVxAAClcgAApXMAAKV0AACldQAApXcAAKV5AAClegAApXsAAKV9AAClfgAApYsAAKWMAACljQAApY8AAKXOAACl0AAApdIAAKXUAACl1wAApdgAAKXZAACl2gAApdsAAKXdAACl3wAApeAAAKXhAACl4wAApeQAAKYjAACmJQAApicAAKYpAACmLAAApi0AAKYuAACmLwAApjAAAKYyAACmNAAApjUAAKY2AACmOAAApjkAAKZ4AACmegAApnwAAKZ+AACmgQAApoIAAKaDAACmhAAApoUAAKaHAACmiQAApooAAKaLAACmjQAApo4AAKbNAACmzwAAptEAAKbTAACm1gAAptcAAKbYAACm2QAAptoAAKbcAACm3gAApt8AAKbgAACm4gAApuMAAKciAACnJAAApyYAAKcoAACnKwAApywAAKctAACnLgAApy8AAKcxAACnMwAApzQAAKc1AACnNwAApzgAAKddAACngQAAp6gAAKfMAACnzwAAp9IAAKfUAACn1gAAp9gAAKfaAACn2wAAp94AAKfrAACn+gAAp/0AAKgAAACoAwAAqAYAAKgJAACoDAAAqA8AAKgeAACoIQAAqCQAAKgnAACoKgAAqC0AAKgwAACoMwAAqDUAAKh0AACodgAAqHkAAKh7AACofgAAqH8AAKiAAACogQAAqIIAAKiEAACohwAAqIgAAKiJAACoiwAAqIwAAKjLAACozQAAqNAAAKjSAACo1QAAqNYAAKjXAACo2AAAqNkAAKjbAACo3gAAqN8AAKjgAACo4gAAqOMAAKkiAACpJAAAqScAAKkpAACpLAAAqS0AAKkuAACpLwAAqTAAAKkyAACpNQAAqTYAAKk3AACpOQAAqToAAKl5AACpewAAqX4AAKmAAACpgwAAqYQAAKmFAACphgAAqYcAAKmJAACpjAAAqY0AAKmOAACpkAAAqZEAAKnQAACp0gAAqdQAAKnWAACp2QAAqdoAAKnbAACp3AAAqd0AAKnfAACp4gAAqeMAAKnkAACp5gAAqecAAKomAACqKAAAqioAAKosAACqLwAAqjAAAKoxAACqMgAAqjMAAKo1AACqOAAAqjkAAKo6AACqPAAAqj0AAKp8AACqfgAAqoEAAKqDAACqhgAAqocAAKqIAACqiQAAqooAAKqMAACqjwAAqpAAAKqRAACqkwAAqpQAAKrfAACrAgAAqyIAAKtCAACrRAAAq0YAAKtIAACrSgAAq00AAKtOAACrTwAAq1IAAKtTAACrVQAAq1YAAKtYAACrWgAAq1sAAKtcAACrXwAAq2AAAKtlAACrcgAAq3cAAKt5AACrewAAq4AAAKuDAACrhgAAq4gAAKutAACr0QAAq/gAAKwcAACsHwAArCEAAKwjAACsJQAArCcAAKwpAACsKgAArC0AAKw6AACsSwAArE0AAKxPAACsUQAArFMAAKxVAACsVwAArFkAAKxbAACsbAAArG8AAKxyAACsdQAArHgAAKx7AACsfgAArIEAAKyEAACshgAArMUAAKzHAACsyQAArMsAAKzOAACszwAArNAAAKzRAACs0gAArNQAAKzWAACs1wAArNgAAKzaAACs2wAArRoAAK0cAACtHgAArSAAAK0jAACtJAAArSUAAK0mAACtJwAArSkAAK0rAACtLAAArS0AAK0vAACtMAAArW8AAK1xAACtdAAArXYAAK15AACtegAArXsAAK18AACtfQAArX8AAK2BAACtggAArYMAAK2FAACthgAArZMAAK2UAACtlQAArZcAAK3WAACt2AAArdoAAK3cAACt3wAAreAAAK3hAACt4gAAreMAAK3lAACt5wAAregAAK3pAACt6wAArewAAK4rAACuLQAAri8AAK4xAACuNAAArjUAAK42AACuNwAArjgAAK46AACuPAAArj0AAK4+AACuQAAArkEAAK6AAACuggAAroQAAK6GAACuiQAArooAAK6LAACujAAAro0AAK6PAACukQAArpIAAK6TAACulQAArpYAAK7VAACu1wAArtkAAK7bAACu3gAArt8AAK7gAACu4QAAruIAAK7kAACu5gAArucAAK7oAACu6gAArusAAK8qAACvLAAAry4AAK8wAACvMwAArzQAAK81AACvNgAArzcAAK85AACvOwAArzwAAK89AACvPwAAr0AAAK9lAACviQAAr7AAAK/UAACv1wAAr9kAAK/bAACv3QAAr98AAK/hAACv4gAAr+UAAK/yAACwAQAAsAMAALAFAACwBwAAsAkAALALAACwDQAAsA8AALAeAACwIQAAsCQAALAnAACwKgAAsC0AALAwAACwMwAAsDUAALB0AACwdgAAsHgAALB6AACwfQAAsH4AALB/AACwgAAAsIEAALCDAACwhQAAsIYAALCHAACwiQAAsIoAALDJAACwywAAsM0AALDPAACw0gAAsNMAALDUAACw1QAAsNYAALDYAACw2gAAsNsAALDcAACw3gAAsN8AALEeAACxIAAAsSIAALEkAACxJwAAsSgAALEpAACxKgAAsSsAALEtAACxLwAAsTAAALExAACxMwAAsTQAALFzAACxdQAAsXcAALF5AACxfAAAsX0AALF+AACxfwAAsYAAALGCAACxhAAAsYUAALGGAACxiAAAsYkAALHIAACxygAAscwAALHOAACx0QAAsdIAALHTAACx1AAAsdUAALHXAACx2QAAsdoAALHbAACx3QAAsd4AALIdAACyHwAAsiEAALIjAACyJgAAsicAALIoAACyKQAAsioAALIsAACyLgAAsi8AALIwAACyMgAAsjMAALJyAACydAAAsnYAALJ4AACyewAAsnwAALJ9AACyfgAAsn8AALKBAACygwAAsoQAALKFAACyhwAAsogAALLTAACy9gAAsxYAALM2AACzOAAAszoAALM8AACzPgAAs0EAALNCAACzQwAAs0YAALNHAACzSQAAs0oAALNMAACzTwAAs1AAALNRAACzVAAAs1UAALNaAACzZwAAs2wAALNuAACzcAAAs3UAALN4AACzewAAs30AALOiAACzxgAAs+0AALQRAAC0FAAAtBYAALQYAAC0GgAAtBwAALQeAAC0HwAAtCIAALQvAAC0QAAAtEIAALREAAC0RgAAtEgAALRKAAC0TAAAtE4AALRQAAC0YQAAtGQAALRnAAC0agAAtG0AALRwAAC0cwAAtHYAALR5AAC0ewAAtLoAALS8AAC0vgAAtMAAALTDAAC0xAAAtMUAALTGAAC0xwAAtMkAALTLAAC0zAAAtM0AALTPAAC00AAAtQ8AALURAAC1EwAAtRUAALUYAAC1GQAAtRoAALUbAAC1HAAAtR4AALUgAAC1IQAAtSIAALUkAAC1JQAAtWQAALVmAAC1aQAAtWsAALVuAAC1bwAAtXAAALVxAAC1cgAAtXQAALV2AAC1dwAAtXgAALV6AAC1ewAAtYgAALWJAAC1igAAtYwAALXLAAC1zQAAtc8AALXRAAC11AAAtdUAALXWAAC11wAAtdgAALXaAAC13AAAtd0AALXeAAC14AAAteEAALYgAAC2IgAAtiQAALYmAAC2KQAAtioAALYrAAC2LAAAti0AALYvAAC2MQAAtjIAALYzAAC2NQAAtjYAALZ1AAC2dwAAtnkAALZ7AAC2fgAAtn8AALaAAAC2gQAAtoIAALaEAAC2hgAAtocAALaIAAC2igAAtosAALbKAAC2zAAAts4AALbQAAC20wAAttQAALbVAAC21gAAttcAALbZAAC22wAAttwAALbdAAC23wAAtuAAALcfAAC3IQAAtyMAALclAAC3KAAAtykAALcqAAC3KwAAtywAALcuAAC3MAAAtzEAALcyAAC3NAAAtzUAALdaAAC3fgAAt6UAALfJAAC3zAAAt84AALfQAAC30gAAt9QAALfWAAC31wAAt9oAALfnAAC39gAAt/gAALf6AAC3/AAAt/4AALgAAAC4AgAAuAQAALgTAAC4FgAAuBkAALgcAAC4HwAAuCIAALglAAC4KAAAuCoAALhpAAC4awAAuG0AALhvAAC4cgAAuHMAALh0AAC4dQAAuHYAALh4AAC4egAAuHsAALh8AAC4fgAAuH8AALi+AAC4wAAAuMIAALjEAAC4xwAAuMgAALjJAAC4ygAAuMsAALjNAAC4zwAAuNAAALjRAAC40wAAuNQAALkTAAC5FQAAuRcAALkZAAC5HAAAuR0AALkeAAC5HwAAuSAAALkiAAC5JAAAuSUAALkmAAC5KAAAuSkAALloAAC5agAAuWwAALluAAC5cQAAuXIAALlzAAC5dAAAuXUAALl3AAC5eQAAuXoAALl7AAC5fQAAuX4AALm9AAC5vwAAucEAALnDAAC5xgAAuccAALnIAAC5yQAAucoAALnMAAC5zgAAuc8AALnQAAC50gAAudMAALoSAAC6FAAAuhYAALoYAAC6GwAAuhwAALodAAC6HgAAuh8AALohAAC6IwAAuiQAALolAAC6JwAAuigAALpnAAC6aQAAumsAALptAAC6cAAAunEAALpyAAC6cwAAunQAALp2AAC6eAAAunkAALp6AAC6fAAAun0AALrIAAC66wAAuwsAALsrAAC7LQAAuy8AALsxAAC7MwAAuzYAALs3AAC7OAAAuzsAALs8AAC7PgAAuz8AALtBAAC7RAAAu0UAALtGAAC7SQAAu0oAALtPAAC7XAAAu2EAALtjAAC7ZQAAu2oAALttAAC7cAAAu3IAALuXAAC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MowAAzKUAAMynAADMqgAAzKsAAMysAADMrQAAzK4AAMywAADMsgAAzLMAAMy0AADMtgAAzLcAAMz2AADM+AAAzPoAAMz8AADM/wAAzQAAAM0BAADNAgAAzQMAAM0FAADNBwAAzQgAAM0JAADNCwAAzQwAAM1LAADNTQAAzVAAAM1SAADNVQAAzVYAAM1XAADNWAAAzVkAAM1bAADNXQAAzV4AAM1fAADNYQAAzWIAAM1vAADNcAAAzXEAAM1zAADNsgAAzbQAAM22AADNuAAAzbsAAM28AADNvQAAzb4AAM2/AADNwQAAzcMAAM3EAADNxQAAzccAAM3IAADOBwAAzgkAAM4LAADODQAAzhAAAM4RAADOEgAAzhMAAM4UAADOFgAAzhgAAM4ZAADOGgAAzhwAAM4dAADOXAAAzl4AAM5gAADOYgAAzmUAAM5mAADOZwAAzmgAAM5pAADOawAAzm0AAM5uAADObwAAznEAAM5yAADOsQAAzrMAAM61AADOtwAAzroAAM67AADOvAAAzr0AAM6+AADOwAAAzsIAAM7DAADOxAAAzsYAAM7HAADPBgAAzwgAAM8KAADPDAAAzw8AAM8QAADPEQAAzxIAAM8TAADPFQAAzxcAAM8YAADPGQAAzxsAAM8cAADPQQAAz2UAAM+MAADPsAAAz7MAAM+1AADPtwAAz7kAAM+7AADPvQAAz74AAM/BAADPzgAAz90AAM/fAADP4QAAz+MAAM/lAADP5wAAz+kAAM/rAADP+gAAz/0AANAAAADQAwAA0AYAANAJAADQDAAA0A8AANARAADQUAAA0FIAANBUAADQVgAA0FkAANBaAADQWwAA0FwAANBdAADQXwAA0GEAANBiAADQYwAA0GUAANBmAADQpQAA0KcAANCpAADQqwAA0K4AANCvAADQsAAA0LEAANCyAADQtAAA0LYAANC3AADQuAAA0LoAANC7AADQ+gAA0PwAAND+AADRAAAA0QMAANEEAADRBQAA0QYAANEHAADRCQAA0QsAANEMAADRDQAA0Q8AANEQAADRTwAA0VEAANFTAADRVQAA0VgAANFZAADRWgAA0VsAANFcAADRXgAA0WAAANFhAADRYgAA0WQAANFlAADRpAAA0aYAANGoAADRqgAA0a0AANGuAADRrwAA0bAAANGxAADRswAA0bUAANG2AADRtwAA0bkAANG6AADR+QAA0fsAANH9AADR/wAA0gIAANIDAADSBAAA0gUAANIGAADSCAAA0goAANILAADSDAAA0g4AANIPAADSTgAA0lAAANJSAADSVAAA0lcAANJYAADSWQAA0loAANJbAADSXQAA0l8AANJgAADSYQAA0mMAANJkAADSrwAA0tIAANLyAADTEgAA0xQAANMWAADTGAAA0xoAANMdAADTHgAA0x8AANMiAADTIwAA0yUAANMmAADTKAAA0ysAANMsAADTLQAA0zAAANMxAADTNgAA00MAANNIAADTSgAA00wAANNRAADTVAAA01cAANNZAADTfgAA06IAANPJAADT7QAA0/AAANPyAADT9AAA0/YAANP4AADT+gAA0/sAANP+AADUCwAA1BwAANQeAADUIAAA1CIAANQkAADUJgAA1CgAANQqAADULAAA1D0AANRAAADUQwAA1EYAANRJAADUTAAA1E8AANRSAADUVQAA1FcAANSWAADUmAAA1JoAANScAADUnwAA1KAAANShAADUogAA1KMAANSlAADUpwAA1KgAANSpAADUqwAA1KwAANTrAADU7QAA1O8AANTxAADU9AAA1PUAANT2AADU9wAA1PgAANT6AADU/AAA1P0AANT+AADVAAAA1QEAANVAAADVQgAA1UUAANVHAADVSgAA1UsAANVMAADVTQAA1U4AANVQAADVUgAA1VMAANVUAADVVgAA1VcAANVkAADVZQAA1WYAANVoAADVpwAA1akAANWrAADVrQAA1bAAANWxAADVsgAA1bMAANW0AADVtgAA1bgAANW5AADVugAA1bwAANW9AADV/AAA1f4AANYAAADWAgAA1gUAANYGAADWBwAA1ggAANYJAADWCwAA1g0AANYOAADWDwAA1hEAANYSAADWUQAA1lMAANZVAADWVwAA1loAANZbAADWXAAA1l0AANZeAADWYAAA1mIAANZjAADWZAAA1mYAANZnAADWpgAA1qgAANaqAADWrAAA1q8AANawAADWsQAA1rIAANazAADWtQAA1rcAANa4AADWuQAA1rsAANa8AADW+wAA1v0AANb/AADXAQAA1wQAANcFAADXBgAA1wcAANcIAADXCgAA1wwAANcNAADXDgAA1xAAANcRAADXNgAA11oAANeBAADXpQAA16gAANeqAADXrAAA164AANewAADXsgAA17MAANe2AADXwwAA19IAANfUAADX1gAA19gAANfaAADX3AAA194AANfgAADX7wAA1/IAANf1AADX+AAA1/sAANf+AADYAQAA2AQAANgGAADYRQAA2EcAANhJAADYSwAA2E4AANhPAADYUAAA2FEAANhSAADYVAAA2FYAANhXAADYWAAA2FoAANhbAADYmgAA2JwAANieAADYoAAA2KMAANikAADYpQAA2KYAANinAADYqQAA2KsAANisAADYrQAA2K8AANiwAADY7wAA2PEAANjzAADY9QAA2PgAANj5AADY+gAA2PsAANj8AADY/gAA2QAAANkBAADZAgAA2QQAANkFAADZRAAA2UYAANlIAADZSgAA2U0AANlOAADZTwAA2VAAANlRAADZUwAA2VUAANlWAADZVwAA2VkAANlaAADZmQAA2ZsAANmdAADZnwAA2aIAANmjAADZpAAA2aUAANmmAADZqAAA2aoAANmrAADZrAAA2a4AANmvAADZ7gAA2fAAANnyAADZ9AAA2fcAANn4AADZ+QAA2foAANn7AADZ/QAA2f8AANoAAADaAQAA2gMAANoEAADaQwAA2kUAANpHAADaSQAA2kwAANpNAADaTgAA2k8AANpQAADaUgAA2lQAANpVAADaVgAA2lgAANpZAADapAAA2scAANrnAADbBwAA2wkAANsLAADbDQAA2w8AANsSAADbEwAA2xQAANsXAADbGAAA2xoAANsbAADbHQAA2yAAANshAADbIgAA2yUAANsmAADbKwAA2zgAANs9AADbPwAA20EAANtGAADbSQAA20wAANtOAADbcwAA25cAANu+AADb4gAA2+UAANvnAADb6QAA2+sAANvtAADb7wAA2/AAANvzAADcAAAA3BEAANwTAADcFQAA3BcAANwZAADcGwAA3B0AANwfAADcIQAA3DIAANw1AADcOAAA3DsAANw+AADcQQAA3EQAANxHAADcSgAA3EwAANyLAADcjQAA3I8AANyRAADclAAA3JUAANyWAADclwAA3JgAANyaAADcnAAA3J0AANyeAADcoAAA3KEAANzgAADc4gAA3OQAANzmAADc6QAA3OoAANzrAADc7AAA3O0AANzvAADc8QAA3PIAANzzAADc9QAA3PYAAN01AADdNwAA3ToAAN08AAD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EcQABBHQAAQR1AAEEdgABBHcAAQR4AAEEegABBHwAAQR9AAEEfgABBIAAAQSBAAEEwAABBMIAAQTEAAEExgABBMkAAQTKAAEEywABBMwAAQTNAAEEzwABBNEAAQTSAAEE0wABBNUAAQTWAAEFFQABBRcAAQUaAAEFHAABBR8AAQUgAAEFIQABBSIAAQUjAAEFJQABBScAAQUoAAEFKQABBSsAAQUsAAEFOQABBToAAQU7AAEFPQABBXwAAQV+AAEFgAABBYIAAQWFAAEFhgABBYcAAQWIAAEFiQABBYsAAQWNAAEFjgABBY8AAQWRAAEFkgABBdEAAQXTAAEF1QABBdcAAQXaAAEF2wABBdwAAQXdAAEF3gABBeAAAQXiAAEF4wABBeQAAQXmAAEF5wABBiYAAQYoAAEGKgABBiwAAQYvAAEGMAABBjEAAQYyAAEGMwABBjUAAQY3AAEGOAABBjkAAQY7AAEGPAABBnsAAQZ9AAEGfwABBoEAAQaEAAEGhQABBoYAAQaHAAEGiAABBooAAQaMAAEGjQABBo4AAQaQAAEGkQABBtAAAQbSAAEG1AABBtYAAQbZAAEG2gABBtsAAQbcAAEG3QABBt8AAQbhAAEG4gABBuMAAQblAAEG5gABBwsAAQcvAAEHVgABB3oAAQd9AAEHfwABB4EAAQeDAAEHhQABB4cAAQeIAAEHiwABB5gAAQenAAEHqQABB6sAAQetAAEHrwABB7EAAQezAAEHtQABB8QAAQfHAAEHygABB80AAQfQAAEH0wABB9YAAQfZAAEH2wABCBoAAQgcAAEIHgABCCAAAQgjAAEIJAABCCUAAQgmAAEIJwABCCkAAQgrAAEILAABCC0AAQgvAAEIMAABCG8AAQhxAAEIcwABCHUAAQh4AAEIeQABCHoAAQh7AAEIfAABCH4AAQiAAAEIgQABCIIAAQiEAAEIhQABCMQAAQjGAAEIyAABCMoAAQjNAAEIzgABCM8AAQjQAAEI0QABCNMAAQjVAAEI1gABCNcAAQjZAAEI2gABCRkAAQkbAAEJHQABCR8AAQkiAAEJIwABCSQAAQklAAEJJgABCSgAAQkqAAEJKwABCSwAAQkuAAEJLwABCW4AAQlwAAEJcgABCXQAAQl3AAEJeAABCXkAAQl6AAEJewABCX0AAQl/AAEJgAABCYEAAQmDAAEJhAABCcMAAQnFAAEJxwABCckAAQnMAAEJzQABCc4AAQnPAAEJ0AABCdIAAQnUAAEJ1QABCdYAAQnYAAEJ2QABChgAAQoaAAEKHAABCh4AAQohAAEKIgABCiMAAQokAAEKJQABCicAAQopAAEKKgABCisAAQotAAEKLgABCnkAAQqcAAEKvAABCtwAAQreAAEK4AABCuIAAQrkAAEK5wABCugAAQrpAAEK7AABCu0AAQrvAAEK8AABCvIAAQr1AAEK9gABCvcAAQr6AAEK+wABCwAAAQsNAAELEgABCxQAAQsWAAELGwABCx4AAQshAAELIwABC0gAAQtsAAELkwABC7cAAQu6AAELvAABC74AAQvAAAELwgABC8QAAQvFAAELyAABC9UAAQvmAAEL6AABC+oAAQvsAAEL7gABC/AAAQvyAAEL9AABC/YAAQwHAAEMCgABDA0AAQwQAAEMEwABDBYAAQwZAAEMHAABDB8AAQwhAAEMYAABDGIAAQxkAAEMZgABDGkAAQxqAAEMawABDGwAAQxtAAEMbwABDHEAAQxyAAEMcwABDHUAAQx2AAEMtQABDLcAAQy5AAEMuwABDL4AAQy/AAEMwAABDMEAAQzCAAEMxAABDMYAAQzHAAEMyAABDMoAAQzLAAENCgABDQwAAQ0PAAENEQABDRQAAQ0VAAENFgABDRcAAQ0YAAENGgABDRwAAQ0dAAENHgABDSAAAQ0hAAENLgABDS8AAQ0wAAENMgABDXEAAQ1zAAENdQABDXcAAQ16AAENewABDXwAAQ19AAENfgABDYAAAQ2CAAENgwABDYQAAQ2GAAENhwABDcYAAQ3IAAENygABDcwAAQ3PAAEN0AABDdEAAQ3SAAEN0wABDdUAAQ3XAAEN2AABDdkAAQ3bAAEN3AABDhsAAQ4dAAEOHwABDiEAAQ4kAAEOJQABDiYAAQ4nAAEOKAABDioAAQ4sAAEOLQABDi4AAQ4wAAEOMQABDnAAAQ5yAAEOdAABDnYAAQ55AAEOegABDnsAAQ58AAEOfQABDn8AAQ6BAAEOggABDoMAAQ6FAAEOhgABDsUAAQ7HAAEOyQABDssAAQ7OAAEOzwABDtAAAQ7RAAEO0gABDtQAAQ7WAAEO1wABDtgAAQ7aAAEO2wABDwAAAQ8kAAEPSwABD28AAQ9yAAEPdAABD3YAAQ94AAEPegABD3wAAQ99AAEPgAABD40AAQ+cAAEPngABD6AAAQ+iAAEPpAABD6YAAQ+oAAEPqgABD7kAAQ+8AAEPvwABD8IAAQ/FAAEPyAABD8sAAQ/OAAEP0AABEA8AARARAAEQEwABEBUAARAYAAEQGQABEBoAARAbAAEQHAABEB4AARAgAAEQIQABECIAARAkAAEQJQABEGQAARBmAAEQaAABEGoAARBtAAEQbgABEG8AARBwAAEQcQABEHMAARB1AAEQdgABEHcAARB5AAEQegABELkAARC7AAEQvQABEL8AARDCAAEQwwABEMQAARDFAAEQxgABEMgAARDKAAEQywABEMwAARDOAAEQzwABEQ4AAREQAAEREwABERUAAREYAAERGQABERoAAREbAAERHAABER4AAREgAAERIQABESIAAREkAAERJQABESgAARFnAAERaQABEWsAARFtAAERcAABEXEAARFyAAERcwABEXQAARF2AAEReAABEXkAARF6AAERfAABEX0AARG8AAERvgABEcAAARHCAAERxQABEcYAARHHAAERyAABEckAARHLAAERzQABEc4AARHPAAER0QABEdIAARIRAAESEwABEhUAARIXAAESGgABEhsAARIcAAESHQABEh4AARIgAAESIgABEiMAARIkAAESJgABEicAARIyAAESOwABEjwAARI+AAESRwABElIAARJhAAESbAABEnoAARKPAAESowABEroAARLMAAETCwABEw0AARMPAAETEQABExQAARMVAAETFgABExcAARMYAAETGgABEx0AARMeAAETHwABEyEAARMiAAETYQABE2MAARNlAAETZwABE2oAARNrAAETbAABE20AARNuAAETcAABE3MAARN0AAETdQABE3cAARN4AAETtwABE7kAARO8AAETvgABE8EAARPCAAETwwABE8QAARPFAAETxwABE8oAARPLAAETzAABE84AARPPAAEUGgABFD0AARRdAAEUfQABFH8AARSBAAEUgwABFIUAARSIAAEUiQABFIoAARSNAAEUjgABFJAAARSRAAEUlAABFJcAARSYAAEUmQABFJwAARSdAAEUogABFK8AARS0AAEUtgABFLkAARS+AAEUwQABFMQAARTGAAEU6wABFQ8AARU2AAEVWgABFV0AARVfAAEVYQABFWMAARVlAAEVZwABFWgAARVrAAEVeAABFYkAARWLAAEVjQABFY8AARWRAAEVkwABFZUAARWXAAEVmQABFaoAARWtAAEVsAABFbMAARW2AAEVuQABFbwAARW/AAEVwgABFcQAARYDAAEWBQABFgcAARYJAAEWDAABFg0AARYOAAEWDwABFhAAARYSAAEWFAABFhUAARYWAAEWGAABFhkAARZYAAEWWgABFlwAARZeAAEWYQABFmIAARZjAAEWZAABFmUAARZnAAEWaQABFmoAARZrAAEWbQABFm4AARatAAEWrwABFrIAARa0AAEWtwABFrgAARa5AAEWugABFrsAARa9AAEWvwABFsAAARbBAAEWwwABFsQAARbRAAEW0gABFtMAARbVAAEXFAABFxYAARcYAAEXGgABFx0AARceAAEXHwABFyAAARchAAEXIwABFyUAARcmAAEXJwABFykAARcqAAEXaQABF2sAARdtAAEXbwABF3IAARdzAAEXdAABF3UAARd2AAEXeAABF3oAARd7AAEXfAABF34AARd/AAEXvgABF8AAARfCAAEXxAABF8cAARfIAAEXyQABF8oAARfLAAEXzQABF88AARfQAAEX0QABF9MAARfUAAEYEwABGBUAARgXAAEYGQABGBwAARgdAAEYHgABGB8AARggAAEYIgABGCQAARglAAEYJgABGCgAARgpAAEYaAABGGoAARhsAAEYbgABGHEAARhyAAEYcwABGHQAARh1AAEYdwABGHkAARh6AAEYewABGH0AARh+AAEYowABGMcAARjuAAEZEgABGRUAARkYAAEZGgABGRwAARkeAAEZIAABGSEAARkkAAEZMQABGUAAARlDAAEZRgABGUkAARlMAAEZTwABGVIAARlVAAEZZAABGWcAARlqAAEZbQABGXAAARlzAAEZdgABGXkAARl7AAEZugABGbwAARm/AAEZwQABGcQAARnFAAEZxgABGccAARnIAAEZygABGc0AARnOAAEZzwABGdEAARnSAAEaEQABGhMAARoWAAEaGAABGhsAARocAAEaHQABGh4AARofAAEaIQABGiQAARolAAEaJgABGigAARopAAEaaAABGmoAARptAAEabwABGnIAARpzAAEadAABGnUAARp2AAEaeAABGnsAARp8AAEafQABGn8AARqAAAEavwABGsEAARrEAAEaxgABGskAARrKAAEaywABGswAARrNAAEazwABGtIAARrTAAEa1AABGtYAARrXAAEbGgABGz4AARtiAAEbhQABG6wAARvMAAEb8wABHBoAARw6AAEcXgABHIIAARyEAAEchwABHIkAARyLAAEcjQABHJAAARyTAAEclQABHJcAARyaAAEcnAABHJ4AARyhAAEcpAABHKUAARyqAAEctwABHLoAARy8AAEcvwABHMIAARzEAAEc6QABHQ0AAR00AAEdWAABHVsAAR1dAAEdXwABHWEAAR1jAAEdZQABHWYAAR1pAAEddgABHYcAAR2JAAEdiwABHY0AAR2PAAEdkQABHZMAAR2VAAEdlwABHagAAR2rAAEdrgABHbEAAR20AAEdtwABHboAAR29AAEdwAABHcIAAR4BAAEeAwABHgYAAR4IAAEeCwABHgwAAR4NAAEeDgABHg8AAR4RAAEeEwABHhQAAR4VAAEeFwABHhgAAR4hAAEeIgABHiQAAR5jAAEeZQABHmcAAR5pAAEebAABHm0AAR5uAAEebwABHnAAAR5yAAEedAABHnUAAR52AAEeeAABHnkAAR64AAEeugABHrwAAR6+AAEewQABHsIAAR7DAAEexAABHsUAAR7HAAEeyQABHsoAAR7LAAEezQABHs4AAR8NAAEfDwABHxIAAR8UAAEfFwABHxgAAR8ZAAEfGgABHxsAAR8dAAEfHwABHyAAAR8hAAEfIwABHyQAAR8tAAEfLgABHzAAAR9vAAEfcQABH3MAAR91AAEfeAABH3kAAR96AAEfewABH3wAAR9+AAEfgAABH4EAAR+CAAEfhAABH4UAAR/EAAEfxgABH8kAAR/LAAEfzgABH88AAR/QAAEf0QABH9IAAR/UAAEf1gABH9cAAR/YAAEf2gABH9sAAR/oAAEf6QABH+oAAR/sAAEgKwABIC0AASAvAAEgMQABIDQAASA1AAEgNgABIDcAASA4AAEgOgABIDwAASA9AAEgPgABIEAAASBBAAEggAABIIIAASCEAAEghgABIIkAASCKAAEgiwABIIwAASCNAAEgjwABIJEAASCSAAEgkwABIJUAASCWAAEgowABILoAASC9AAEgwAABIMMAASDGAAEgyQABIMwAASDPAAEg0gABINQAASDWAAEg2QABIPAAASDzAAEg9gABIPkAASD8AAEg/wABIQIAASEFAAEhCAABIQsAASEOAAEhEQABIRMAASEhAAEhKQABITMAASE9AAEhRgABIU8AASFhAAEhbwABIboAASHdAAEh/QABIh0AASIfAAEiIQABIiMAASIlAAEiKAABIikAASIqAAEiLQABIi4AASIwAAEiMQABIjMAASI2AAEiNwABIjgAASI7AAEiPAABIkEAASJOAAEiUwABIlUAASJXAAEiXAABIl8AASJiAAEiZAABIokAASKtAAEi1AABIvgAASL7AAEi/QABIv8AASMBAAEjAwABIwUAASMGAAEjCQABIxYAASMnAAEjKQABIysAASMtAAEjLwABIzEAASMzAAEjNQABIzcAASNIAAEjSwABI04AASNRAAEjVAABI1cAASNaAAEjXQABI2AAASNiAAEjoQABI6MAASOlAAEjpwABI6oAASOrAAEjrAABI60AASOuAAEjsAABI7IAASOzAAEjtAABI7YAASO3AAEj9gABI/gAASP6AAEj/AABI/8AASQAAAEkAQABJAIAASQDAAEkBQABJAcAASQIAAEkCQABJAsAASQMAAEkSwABJE0AASRQAAEkUgABJFUAASRWAAEkVwABJFgAASRZAAEkWwABJF0AASReAAEkXwABJGEAASRiAAEkbwABJHAAASRxAAEkcwABJLIAASS0AAEktgABJLgAASS7AAEkvAABJL0AASS+AAEkvwABJMEAASTDAAEkxAABJMUAASTHAAEkyAABJQcAASUJAAElCwABJQ0AASUQAAElEQABJRIAASUTAAElFAABJRYAASUYAAElGQABJRoAASUcAAElHQABJVwAASVeAAElYAABJWIAASVlAAElZgABJWcAASVoAAElaQABJWsAASVtAAElbgABJW8AASVxAAElcgABJbEAASWzAAEltQABJbcAASW6AAEluwABJbwAASW9AAElvgABJcAAASXCAAElwwABJcQAASXGAAElxwABJgYAASYIAAEmCgABJgwAASYPAAEmEAABJhEAASYSAAEmEwABJhUAASYXAAEmGAABJhkAASYbAAEmHAABJkEAASZlAAEmjAABJrAAASazAAEmtQABJrcAASa5AAEmuwABJr0AASa+AAEmwQABJs4AASbdAAEm3wABJuEAASbjAAEm5QABJucAASbpAAEm6wABJvoAASb9AAEnAAABJwMAAScGAAEnCQABJwwAAScPAAEnEQABJ1AAASdSAAEnVAABJ1YAASdZAAEnWgABJ1sAASdcAAEnXQABJ18AASdhAAEnYgABJ2MAASdlAAEnZgABJ6UAASenAAEnqQABJ6sAASeuAAEnrwABJ7AAASexAAEnsgABJ7QAASe2AAEntwABJ7gAASe6AAEnuwABJ/oAASf8AAEn/gABKAAAASgDAAEoBAABKAUAASgGAAEoBwABKAkAASgLAAEoDAABKA0AASgPAAEoEAABKE8AAShRAAEoUwABKFUAAShYAAEoWQABKFoAAShbAAEoXAABKF4AAShgAAEoYQABKGIAAShkAAEoZQABKKQAASimAAEoqAABKKoAASitAAEorgABKK8AASiwAAEosQABKLMAASi1AAEotgABKLcAASi5AAEougABKPkAASj7AAEo/QABKP8AASkCAAEpAwABKQQAASkFAAEpBgABKQgAASkKAAEpCwABKQwAASkOAAEpDwABKU4AASlQAAEpUgABKVQAASlXAAEpWAABKVkAASlaAAEpWwABKV0AASlfAAEpYAABKWEAASljAAEpZAABKa8AASnSAAEp8gABKhIAASoUAAEqFgABKhgAASoaAAEqHQABKh4AASofAAEqIgABKiMAASolAAEqJgABKigAASorAAEqLAABKi0AASowAAEqMQABKjYAASpDAAEqSAABKkoAASpMAAEqUQABKlQAASpXAAEqWQABKn4AASqiAAEqyQABKu0AASrwAAEq8gABKvQAASr2AAEq+AABKvoAASr7AAEq/gABKwsAASscAAErHgABKyAAASsiAAErJAABKyYAASsoAAErKgABKywAASs9AAErQAABK0MAAStGAAErSQABK0wAAStPAAErUgABK1UAAStXAAErlgABK5gAASuaAAErnAABK58AASugAAEroQABK6IAASujAAErpQABK6cAASuoAAErqQABK6sAASusAAEr6wABK+0AASvvAAEr8QABK/QAASv1AAEr9gABK/cAASv4AAEr+gABK/wAASv9AAEr/gABLAAAASwBAAEsQAABLEIAASxFAAEsRwABLEoAASxLAAEsTAABLE0AASxOAAEsUAABLFIAASxTAAEsVAABLFYAASxXAAEsZAABLGUAASxmAAEsaAABLKcAASypAAEsqwABLK0AASywAAEssQABLLIAASyzAAEstAABLLYAASy4AAEsuQABLLoAASy8AAEsvQABLPwAASz+AAEtAAABLQIAAS0FAAEtBgABLQcAAS0IAAEtCQABLQsAAS0NAAEtDgABLQ8AAS0RAAEtEgABLVEAAS1TAAEtVQABLVcAAS1aAAEtWwABLVwAAS1dAAEtXgABLWAAAS1iAAEtYwABLWQAAS1mAAEtZwABLaYAAS2oAAEtqgABLawAAS2vAAEtsAABLbEAAS2yAAEtswABLbUAAS23AAEtuAABLbkAAS27AAEtvAABLfsAAS39AAEt/wABLgEAAS4EAAEuBQABLgYAAS4HAAEuCAABLgoAAS4MAAEuDQABLg4AAS4QAAEuEQABLjYAAS5aAAEugQABLqUAAS6oAAEuqgABLqwAAS6uAAEusAABLrIAAS6zAAEutgABLsMAAS7SAAEu1AABLtYAAS7YAAEu2gABLtwAAS7eAAEu4AABLu8AAS7yAAEu9QABLvgAAS77AAEu/gABLwEAAS8EAAEvBgABL0UAAS9HAAEvSQABL0sAAS9OAAEvTwABL1AAAS9RAAEvUgABL1QAAS9WAAEvVwABL1gAAS9aAAEvWwABL5oAAS+cAAEvngABL6AAAS+jAAEvpAABL6UAAS+mAAEvpwABL6kAAS+rAAEvrAABL60AAS+vAAEvsAABL+8AAS/xAAEv8wABL/UAAS/4AAEv+QABL/oAAS/7AAEv/AABL/4AATAAAAEwAQABMAIAATAEAAEwBQABMEQAATBGAAEwSAABMEoAATBNAAEwTgABME8AATBQAAEwUQABMFMAATBVAAEwVgABMFcAATBZAAEwWgABMJkAATCbAAEwnQABMJ8AATCiAAEwowABMKQAATClAAEwpgABMKgAATCqAAEwqwABMKwAATCuAAEwrwABMO4AATDwAAEw8gABMPQAATD3AAEw+AABMPkAATD6AAEw+wABMP0AATD/AAExAAABMQEAATEDAAExBAABMUMAATFFAAExRwABMUkAATFMAAExTQABMU4AATFPAAExUAABMVIAATFUAAExVQABMVYAATFYAAExWQABMaQAATHHAAEx5wABMgcAATIJAAEyCwABMg0AATIPAAEyEgABMhMAATIUAAEyFwABMhgAATIaAAEyGwABMh0AATIgAAEyIQABMiIAATIlAAEyJgABMi8AATI8AAEyQQABMkMAATJFAAEySgABMk0AATJQAAEyUgABMncAATKbAAEywgABMuYAATLpAAEy6wABMu0AATLvAAEy8QABMvMAATL0AAEy9wABMwQAATMVAAEzFwABMxkAATMbAAEzHQABMx8AATMhAAEzIwABMyUAATM2AAEzOQABMzwAATM/AAEzQgABM0UAATNIAAEzSwABM04AATNQAAEzjwABM5EAATOTAAEzlQABM5gAATOZAAEzmgABM5sAATOcAAEzngABM6AAATOhAAEzogABM6QAATOlAAEz5AABM+YAATPoAAEz6gABM+0AATPuAAEz7wABM/AAATPxAAEz8wABM/UAATP2AAEz9wABM/kAATP6AAE0OQABNDsAATQ+AAE0QAABNEMAATREAAE0RQABNEYAATRHAAE0SQABNEsAATRMAAE0TQABNE8AATRQAAE0XQABNF4AATRfAAE0YQABNKAAATSiAAE0pAABNKYAATSpAAE0qgABNKsAATSsAAE0rQABNK8AATSxAAE0sgABNLMAATS1AAE0tgABNPUAATT3AAE0+QABNPsAATT+AAE0/wABNQAAATUBAAE1AgABNQQAATUGAAE1BwABNQgAATUKAAE1CwABNUoAATVMAAE1TgABNVAAATVTAAE1VAABNVUAATVWAAE1VwABNVkAATVbAAE1XAABNV0AATVfAAE1YAABNZ8AATWhAAE1owABNaUAATWoAAE1qQABNaoAATWrAAE1rAABNa4AATWwAAE1sQABNbIAATW0AAE1tQABNfQAATX2AAE1+AABNfoAATX9AAE1/gABNf8AATYAAAE2AQABNgMAATYFAAE2BgABNgcAATYJAAE2CgABNi8AATZTAAE2egABNp4AATahAAE2owABNqUAATanAAE2qQABNqsAATasAAE2rwABNrwAATbLAAE2zQABNs8AATbRAAE20wABNtUAATbXAAE22QABNugAATbrAAE27gABNvEAATb0AAE29wABNvoAATb9AAE2/wABNz4AATdAAAE3QgABN0QAATdHAAE3SAABN0kAATdKAAE3SwABN00AATdPAAE3UAABN1EAATdTAAE3VAABN5MAATeVAAE3lwABN5kAATecAAE3nQABN54AATefAAE3oAABN6IAATekAAE3pQABN6YAATeoAAE3qQABN+gAATfqAAE37AABN+4AATfxAAE38gABN/MAATf0AAE39QABN/cAATf5AAE3+gABN/sAATf9AAE3/gABOD0AATg/AAE4QQABOEMAAThGAAE4RwABOEgAAThJAAE4SgABOEwAAThOAAE4TwABOFAAAThSAAE4UwABOJIAATiUAAE4lgABOJgAATibAAE4nAABOJ0AATieAAE4nwABOKEAATijAAE4pAABOKUAATinAAE4qAABOOcAATjpAAE46wABOO0AATjwAAE48QABOPIAATjzAAE49AABOPYAATj4AAE4+QABOPoAATj8AAE4/QABOTwAATk+AAE5QAABOUIAATlFAAE5RgABOUcAATlIAAE5SQABOUsAATlNAAE5TgABOU8AATlRAAE5UgABOZ0AATnAAAE54AABOgAAAToCAAE6BAABOgYAAToIAAE6CwABOgwAAToNAAE6EAABOhEAAToTAAE6FAABOhYAAToZAAE6GgABOhsAAToeAAE6HwABOiQAAToxAAE6NgABOjgAATo6AAE6PwABOkIAATpFAAE6RwABOmwAATqQAAE6twABOtsAATreAAE64AABOuIAATrkAAE65gABOugAATrpAAE67AABOvkAATsKAAE7DAABOw4AATsQAAE7EgABOxQAATsWAAE7GAABOxoAATsrAAE7LgABOzEAATs0AAE7NwABOzoAATs9AAE7QAABO0MAATtFAAE7hAABO4YAATuIAAE7igABO40AATuOAAE7jwABO5AAATuRAAE7kwABO5UAATuWAAE7lwABO5kAATuaAAE72QABO9sAATvdAAE73wABO+IAATvjAAE75AABO+UAATvmAAE76AABO+oAATvrAAE77AABO+4AATvvAAE8LgABPDAAATwzAAE8NQABPDgAATw5AAE8OgABPDsAATw8AAE8PgABPEAAATxBAAE8QgABPEQAATxFAAE8UgABPFMAATxUAAE8VgABPJUAATyXAAE8mQABPJsAATyeAAE8nwABPKAAATyhAAE8ogABPKQAATymAAE8pwABPKgAATyqAAE8qwABPOoAATzsAAE87gABPPAAATzzAAE89AABPPUAATz2AAE89wABPPkAATz7AAE8/AABPP0AATz/AAE9AAABPT8AAT1BAAE9QwABPUUAAT1IAAE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N4AABTeIAAU3kAAFN5QABTeYAAU3oAAFN6QABTg4AAU4yAAFOWQABTn0AAU6AAAFOggABToQAAU6GAAFOiAABTooAAU6LAAFOjgABTpsAAU6qAAFOrAABTq4AAU6wAAFOsgABTrQAAU62AAFOuAABTscAAU7KAAFOzQABTtAAAU7TAAFO1gABTtkAAU7cAAFO3gABTx0AAU8fAAFPIQABTyMAAU8mAAFPJwABTygAAU8pAAFPKgABTywAAU8uAAFPLwABTzAAAU8yAAFPMwABT3IAAU90AAFPdgABT3gAAU97AAFPfAABT30AAU9+AAFPfwABT4EAAU+DAAFPhAABT4UAAU+HAAFPiAABT8cAAU/JAAFPywABT80AAU/QAAFP0QABT9IAAU/TAAFP1AABT9YAAU/YAAFP2QABT9oAAU/cAAFP3QABUBwAAVAeAAFQIAABUCIAAVAlAAFQJgABUCcAAVAoAAFQKQABUCsAAVAtAAFQLgABUC8AAVAxAAFQMgABUHEAAVBzAAFQdQABUHcAAVB6AAFQewABUHwAAVB9AAFQfgABUIAAAVCCAAFQgwABUIQAAVCGAAFQhwABUMYAAVDIAAFQygABUMwAAVDPAAFQ0AABUNEAAVDSAAFQ0wABUNUAAVDXAAFQ2AABUNkAAVDbAAFQ3AABURsAAVEdAAFRHwABUSEAAVEkAAFRJQABUSYAAVEnAAFRKAABUSoAAVEsAAFRLQABUS4AAVEwAAFRMQABUXwAAVGfAAFRvwABUd8AAVHhAAFR4wABUeUAAVHnAAFR6gABUesAAVHsAAFR7wABUfAAAVHyAAFR8wABUfUAAVH4AAFR+QABUfoAAVH9AAFR/gABUgMAAVIQAAFSFQABUhcAAVIZAAFSHgABUiEAAVIkAAFSJgABUksAAVJvAAFSlgABUroAAVK9AAFSvwABUsEAAVLDAAFSxQABUscAAVLIAAFSywABUtgAAVLpAAFS6wABUu0AAVLvAAFS8QABUvMAAVL1AAFS9wABUvkAAVMKAAFTDQABUxAAAVMTAAFTFgABUxkAAVMcAAFTHwABUyIAAVMkAAFTYwABU2UAAVNnAAFTaQABU2wAAVNtAAFTbgABU28AAVNwAAFTcgABU3QAAVN1AAFTdgABU3gAAVN5AAFTuAABU7oAAVO8AAFTvgABU8EAAVPCAAFTwwABU8QAAVPFAAFTxwABU8kAAVPKAAFTywABU80AAVPOAAFUDQABVA8AAVQSAAFUFAABVBcAAVQYAAFUGQABVBoAAVQbAAFUHQABVB8AAVQgAAFUIQABVCMAAVQkAAFUMQABVDIAAVQzAAFUNQABVHQAAVR2AAFUeAABVHoAAVR9AAFUfgABVH8AAVSAAAFUgQABVIMAAVSFAAFUhgABVIcAAVSJAAFUigABVMkAAVTLAAFUzQABVM8AAVTSAAFU0wABVNQAAVTVAAFU1gABVNgAAVTaAAFU2wABVNwAAVTeAAFU3wABVR4AAVUgAAFVIgABVSQAAVUnAAFVKAABVSkAAVUqAAFVKwABVS0AAVUvAAFVMAABVTEAAVUzAAFVNAABVXMAAVV1AAFVdwABVXkAAVV8AAFVfQABVX4AAVV/AAFVgAABVYIAAVWEAAFVhQABVYYAAVWIAAFViQABVcgAAVXKAAFVzAABVc4AAVXRAAFV0gABVdMAAVXUAAFV1QABVdcAAVXZAAFV2gABVdsAAVXdAAFV3gABVgMAAVYnAAFWTgABVnIAAVZ1AAFWdwABVnkAAVZ7AAFWfQABVn8AAVaAAAFWgwABVpAAAVafAAFWoQABVqMAAValAAFWpwABVqkAAVarAAFWrQABVrwAAVa/AAFWwgABVsUAAVbIAAFWywABVs4AAVbRAAFW0wABVxIAAVcUAAFXFgABVxgAAVcbAAFXHAABVx0AAVceAAFXHwABVyEAAVcjAAFXJAABVyUAAVcnAAFXKAABV2cAAVdpAAFXawABV20AAVdwAAFXcQABV3IAAVdzAAFXdAABV3YAAVd4AAFXeQABV3oAAVd8AAFXfQABV7wAAVe+AAFXwAABV8IAAVfFAAFXxgABV8cAAVfIAAFXyQABV8sAAVfNAAFXzgABV88AAVfRAAFX0gABWBEAAVgTAAFYFgABWBgAAVgbAAFYHAABWB0AAVgeAAFYHwABWCEAAVgjAAFYJAABWCUAAVgnAAFYKAABWGcAAVhpAAFYawABWG0AAVhwAAFYcQABWHIAAVhzAAFYdAABWHYAAVh4AAFYeQABWHoAAVh8AAFYfQABWLwAAVi+AAFYwAABWMIAAVjFAAFYxgABWMcAAVjIAAFYyQABWMsAAVjNAAFYzgABWM8AAVjRAAFY0gABWREAAVkTAAFZFQABWRcAAVkaAAFZGwABWRwAAVkdAAFZHgABWSAAAVkiAAFZIwABWSQAAVkmAAFZJwABWXIAAVmVAAFZtQABWdUAAVnXAAFZ2QABWdsAAVndAAFZ4AABWeEAAVniAAFZ5QABWeYAAVnoAAFZ6QABWesAAVnuAAFZ7wABWfAAAVnzAAFZ9AABWf0AAVoKAAFaDwABWhEAAVoTAAFaGAABWhsAAVoeAAFaIAABWkUAAVppAAFakAABWrQAAVq3AAFauQABWrsAAVq9AAFavwABWsEAAVrCAAFaxQABWtIAAVrjAAFa5QABWucAAVrpAAFa6wABWu0AAVrvAAFa8QABWvMAAVsEAAFbBwABWwoAAVsNAAFbEAABWxMAAVsWAAFbGQABWxwAAVseAAFbXQABW18AAVthAAFbYwABW2YAAVtnAAFbaAABW2kAAVtqAAFbbAABW24AAVtvAAFbcAABW3IAAVtzAAFbsgABW7QAAVu2AAFbuAABW7sAAVu8AAFbvQABW74AAVu/AAFbwQABW8MAAVvEAAFbxQABW8cAAVvIAAFcBwABXAkAAVwMAAFcDgABXBEAAVwSAAFcEwABXBQAAVwVAAFcFwABXBkAAVwaAAFcGwABXB0AAVweAAFcKwABXCwAAVwtAAFcLwABXG4AAVxwAAFccgABXHQAAVx3AAFceAABXHkAAVx6AAFcewABXH0AAVx/AAFcgAABXIEAAVyDAAFchAABXMMAAVzFAAFcxwABXMkAAVzMAAFczQABXM4AAVzPAAFc0AABXNIAAVzUAAFc1QABXNYAAVzYAAFc2QABXRgAAV0aAAFdHAABXR4AAV0hAAFdIgABXSMAAV0kAAFdJQABXScAAV0pAAFdKgABXSsAAV0tAAFdLgABXW0AAV1vAAFdcQABXXMAAV12AAFddwABXXgAAV15AAFdegABXXwAAV1+AAFdfwABXYAAAV2CAAFdgwABXcIAAV3EAAFdxgABXcgAAV3LAAFdzAABXc0AAV3OAAFdzwABXdEAAV3TAAFd1AABXdUAAV3XAAFd2AABXf0AAV4hAAFeSAABXmwAAV5vAAFecQABXnMAAV51AAFedwABXnkAAV56AAFefQABXooAAV6ZAAFemwABXp0AAV6fAAFeoQABXqMAAV6lAAFepwABXrYAAV65AAFevAABXr8AAV7CAAFexQABXsgAAV7LAAFezQABXwwAAV8OAAFfEAABXxIAAV8VAAFfFgABXxcAAV8YAAFfGQABXxsAAV8dAAFfHgABXx8AAV8hAAFfIgABX2EAAV9jAAFfZQABX2cAAV9qAAFfawABX2wAAV9tAAFfbgABX3AAAV9yAAFfcwABX3QAAV92AAFfdwABX7YAAV+4AAFfugABX7wAAV+/AAFfwAABX8EAAV/CAAFfwwABX8UAAV/HAAFfyAABX8kAAV/LAAFfzAABYAsAAWANAAFgDwABYBEAAWAUAAFgFQABYBYAAWAXAAFgGAABYBoAAWAcAAFgHQABYB4AAWAgAAFgIQABYGAAAWBiAAFgZAABYGYAAWBpAAFgagABYGsAAWBsAAFgbQABYG8AAWBxAAFgcgABYHMAAWB1AAFgdgABYLUAAWC3AAFguQABYLsAAWC+AAFgvwABYMAAAWDBAAFgwgABYMQAAWDGAAFgxwABYMgAAWDKAAFgywABYQoAAWEMAAFhDgABYRAAAWETAAFhFAABYRUAAWEWAAFhFwABYRkAAWEbAAFhHAABYR0AAWEfAAFhIAABYWsAAWGOAAFhrgABYc4AAWHQAAFh0gABYdQAAWHWAAFh2QABYdoAAWHbAAFh3gABYd8AAWHhAAFh4gABYeQAAWHmAAFh5wABYegAAWHrAAFh7AABYfEAAWH+AAFiAwABYgUAAWIHAAFiDAABYg8AAWISAAFiFAABYjkAAWJdAAFihAABYqgAAWKrAAFirQABYq8AAWKxAAFiswABYrUAAWK2AAFiuQABYsYAAWLXAAFi2QABYtsAAWLdAAFi3wABYuEAAWLjAAFi5QABYucAAWL4AAFi+wABYv4AAWMBAAFjBAABYwcAAWMKAAFjDQABYxAAAWMSAAFjUQABY1MAAWNVAAFjVwABY1oAAWNbAAFjXAABY10AAWNeAAFjYAABY2IAAWNjAAFjZAABY2YAAWNnAAFjpgABY6gAAWOqAAFjrAABY68AAWOwAAFjsQABY7IAAWOzAAFjtQABY7cAAWO4AAFjuQABY7sAAWO8AAFj+wABY/0AAWQAAAFkAgABZAUAAWQGAAFkBwABZAgAAWQJAAFkCwABZA0AAWQOAAFkDwABZBEAAWQSAAFkHwABZCAAAWQhAAFkIwABZGIAAWRkAAFkZgABZGgAAWRrAAFkbAABZG0AAWRuAAFkbwABZHEAAWRzAAFkdAABZHUAAWR3AAFkeAABZLcAAWS5AAFkuwABZL0AAWTAAAFkwQABZMIAAWTDAAFkxAABZMYAAWTIAAFkyQABZMoAAWTMAAFkzQABZQwAAWUOAAFlEAABZRIAAWUVAAFlFgABZRcAAWUYAAFlGQABZRsAAWUdAAFlHgABZR8AAWUhAAFlIgABZWEAAWVjAAFlZQABZWcAAWVqAAFlawABZWwAAWVtAAFlbgABZXAAAWVyAAFlcwABZXQAAWV2AAFldwABZbYAAWW4AAFlugABZbwAAWW/AAFlwAABZcEAAWXCAAFlwwABZcUAAWXHAAFlyAABZckAAWXLAAFlzAABZfEAAWYVAAFmPAABZmAAAWZjAAFmZQABZmcAAWZpAAFmawABZm0AAWZuAAFmcQABZn4AAWaNAAFmjwABZpEAAWaTAAFmlQABZpcAAWaZAAFmmwABZqoAAWatAAFmsAABZrMAAWa2AAFmuQABZrwAAWa/AAFmwQABZwAAAWcCAAFnBAABZwYAAWcJAAFnCgABZwsAAWcMAAFnDQABZw8AAWcRAAFnEgABZxMAAWcVAAFnFgABZ1UAAWdXAAFnWQABZ1sAAWdeAAFnXwABZ2AAAWdhAAFnYgABZ2QAAWdmAAFnZwABZ2gAAWdqAAFnawABZ6oAAWesAAFnrgABZ7AAAWezAAFntAABZ7UAAWe2AAFntwABZ7kAAWe7AAFnvAABZ70AAWe/AAFnwAABZ/8AAWgBAAFoAwABaAUAAWgIAAFoCQABaAoAAWgLAAFoDAABaA4AAWgQAAFoEQABaBIAAWgUAAFoFQABaFQAAWhWAAFoWAABaFoAAWhdAAFoXgABaF8AAWhgAAFoYQABaGMAAWhlAAFoZgABaGcAAWhpAAFoagABaKkAAWirAAForQABaK8AAWiyAAFoswABaLQAAWi1AAFotgABaLgAAWi6AAFouwABaLwAAWi+AAFovwABaP4AAWkAAAFpAgABaQQAAWkHAAFpCAABaQkAAWkKAAFpCwABaQ0AAWkPAAFpEAABaREAAWkTAAFpFAABaV8AAWmCAAFpogABacIAAWnEAAFpxgABacgAAWnKAAFpzQABac4AAWnPAAFp0gABadMAAWnVAAFp1gABadgAAWnaAAFp2wABadwAAWnfAAFp4AABaeUAAWnyAAFp9wABafkAAWn7AAFqAAABagMAAWoGAAFqCAABai0AAWpRAAFqeAABapwAAWqfAAFqoQABaqMAAWqlAAFqpwABaqkAAWqqAAFqrQABaroAAWrLAAFqzQABas8AAWrRAAFq0wABatUAAWrXAAFq2QABatsAAWrsAAFq7wABavIAAWr1AAFq+AABavsAAWr+AAFrAQABawQAAWsGAAFrRQABa0cAAWtJAAFrSwABa04AAWtPAAFrUAABa1EAAWtSAAFrVAABa1YAAWtXAAFrWAABa1oAAWtbAAFrmgABa5wAAWueAAFroAABa6MAAWukAAFrpQABa6YAAWunAAFrqQABa6sAAWusAAFrrQABa68AAWuwAAFr7wABa/EAAWv0AAFr9gABa/kAAWv6AAFr+wABa/wAAWv9AAFr/wABbAEAAWwCAAFsAwABbAUAAWwGAAFsEwABbBQAAWwVAAFsFwABbFYAAWxYAAFsWgABbFwAAWxfAAFsYAABbGEAAWxiAAFsYwABbGUAAWxnAAFsaAABbGkAAWxrAAFsbAABbKsAAWytAAFsrwABbLEAAWy0AAFstQABbLYAAWy3AAFsuAABbLoAAWy8AAFsvQABbL4AAWzAAAFswQABbQAAAW0CAAFtBAABbQYAAW0JAAFtCgABbQsAAW0MAAFtDQABbQ8AAW0RAAFtEgABbRMAAW0VAAFtFgABbVUAAW1XAAFtWQABbVsAAW1eAAFtXwABbWAAAW1hAAFtYgABbWQAAW1mAAFtZwABbWgAAW1qAAFtawABbaoAAW2sAAFtrgABbbAAAW2zAAFttAABbbUAAW22AAFttwABbbkAAW27AAFtvAABbb0AAW2/AAFtwAABbeUAAW4JAAFuMAABblQAAW5XAAFuWQABblsAAW5dAAFuXwABbmEAAW5iAAFuZQABbnIAAW6BAAFugwABboUAAW6HAAFuiQABbosAAW6NAAFujwABbp4AAW6hAAFupAABbqcAAW6qAAFurQABbrAAAW6zAAFutQABbvQAAW72AAFu+AABbvoAAW79AAFu/gABbv8AAW8AAAFvAQABbwMAAW8FAAFvBgABbwcAAW8JAAFvCgABb0kAAW9LAAFvTQABb08AAW9SAAFvUwABb1QAAW9VAAFvVgABb1gAAW9aAAFvWwABb1wAAW9eAAFvXwABb54AAW+gAAFvogABb6QAAW+nAAFvqAABb6kAAW+qAAFvqwABb60AAW+vAAFvsAABb7EAAW+zAAFvtAABb/MAAW/1AAFv9wABb/kAAW/8AAFv/QABb/4AAW//AAFwAAABcAIAAXAEAAFwBQABcAYAAXAIAAFwCQABcEgAAXBKAAFwTAABcE4AAXBRAAFwUgABcFMAAXBUAAFwVQABcFcAAXBZAAFwWgABcFsAAXBdAAFwXgABcJ0AAXCfAAFwoQABcKMAAXCmAAFwpwABcKgAAXCpAAFwqgABcKwAAXCuAAFwrwABcLAAAXCyAAFwswABcPIAAXD0AAFw9gABcPgAAXD7AAFw/AABcP0AAXD+AAFw/wABcQEAAXEDAAFxBAABcQUAAXEHAAFxCAABcVMAAXF2AAFxlgABcbYAAXG4AAFxugABcbwAAXG+AAFxwQABccIAAXHDAAFxxgABcccAAXHJAAFxygABcc0AAXHQAAFx0QABcdIAAXHVAAFx1gABcdsAAXHoAAFx7QABce8AAXHyAAFx9wABcfoAAXH9AAFx/wABciQAAXJIAAFybwABcpMAAXKWAAFymAABcpoAAXKcAAFyngABcqAAAXKhAAFypAABcrEAAXLCAAFyxAABcsYAAXLIAAFyygABcswAAXLOAAFy0AABctIAAXLjAAFy5gABcukAAXLsAAFy7wABcvIAAXL1AAFy+AABcvsAAXL9AAFzPAABcz4AAXNAAAFzQgABc0UAAXNGAAFzRwABc0gAAXNJAAFzSwABc00AAXNOAAFzTwABc1EAAXNSAAFzkQABc5MAAXOVAAFzlwABc5oAAXObAAFznAABc50AAXOeAAFzoAABc6IAAXOjAAFzpAABc6YAAXOnAAFz5gABc+gAAXPrAAFz7QABc/AAAXPxAAFz8gABc/MAAXP0AAFz9gABc/gAAXP5AAFz+gABc/wAAXP9AAF0CgABdAsAAXQMAAF0DgABdE0AAXRPAAF0UQABdFMAAXRWAAF0VwABdFgAAXRZAAF0WgABdFwAAXReAAF0XwABdGAAAXRiAAF0YwABdKIAAXSkAAF0pgABdKgAAXSrAAF0rAABdK0AAXSuAAF0rwABdLEAAXSzAAF0tAABdLUAAXS3AAF0uAABdPcAAXT5AAF0+wABdP0AAXUAAAF1AQABdQIAAXUDAAF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AGAABgFcAAYBZAAGAWwABgF0AAYBgAAGAYQABgGIAAYBjAAGAZAABgGYAAYBoAAGAaQABgGoAAYBsAAGAbQABgKwAAYCuAAGAsAABgLIAAYC1AAGAtgABgLcAAYC4AAGAuQABgLsAAYC9AAGAvgABgL8AAYDBAAGAwgABgQEAAYEDAAGBBQABgQcAAYEKAAGBCwABgQwAAYENAAGBDgABgRAAAYESAAGBEwABgRQAAYEWAAGBFwABgVYAAYFYAAGBWgABgVwAAYFfAAGBYAABgWEAAYFiAAGBYwABgWUAAYFnAAGBaAABgWkAAYFrAAGBbAABgasAAYGtAAGBrwABgbEAAYG0AAGBtQABgbYAAYG3AAGBuAABgboAAYG8AAGBvQABgb4AAYHAAAGBwQABggAAAYICAAGCBAABggYAAYIJAAGCCgABggsAAYIMAAGCDQABgg8AAYIRAAGCEgABghMAAYIVAAGCFgABgmEAAYKEAAGCpAABgsQAAYLGAAGCyAABgsoAAYLMAAGCzwABgtAAAYLRAAGC1AABgtUAAYLXAAGC2AABgtoAAYLdAAGC3gABgt8AAYLiAAGC4wABgugAAYL1AAGC+gABgvwAAYL+AAGDAwABgwYAAYMJAAGDCwABgzAAAYNUAAGDewABg58AAYOiAAGDpAABg6YAAYOoAAGDqgABg6wAAYOtAAGDsAABg70AAYPOAAGD0AABg9IAAYPUAAGD1gABg9gAAYPaAAGD3AABg94AAYPvAAGD8gABg/UAAYP4AAGD+wABg/4AAYQBAAGEBAABhAcAAYQJAAGESAABhEoAAYRMAAGETgABhFEAAYRSAAGEUwABhFQAAYRVAAGEVwABhFkAAYRaAAGEWwABhF0AAYReAAGEnQABhJ8AAYShAAGEowABhKYAAYSnAAGEqAABhKkAAYSqAAGErAABhK4AAYSvAAGEsAABhLIAAYSzAAGE8gABhPQAAYT3AAGE+QABhPwAAYT9AAGE/gABhP8AAYUAAAGFAgABhQQAAYUFAAGFBgABhQgAAYUJAAGFFgABhRcAAYUYAAGFGgABhVkAAYVbAAGFXQABhV8AAYViAAGFYwABhWQAAYVlAAGFZgABhWgAAYVqAAGFawABhWwAAYVuAAGFbwABha4AAYWwAAGFsgABhbQAAYW3AAGFuAABhbkAAYW6AAGFuwABhb0AAYW/AAGFwAABhcEAAYXDAAGFxAABhgMAAYYFAAGGBwABhgkAAYYMAAGGDQABhg4AAYYPAAGGEAABhhIAAYYUAAGGFQABhhYAAYYYAAGGGQABhlgAAYZaAAGGXAABhl4AAYZhAAGGYgABhmMAAYZkAAGGZQABhmcAAYZpAAGGagABhmsAAYZtAAGGbgABhq0AAYavAAGGsQABhrMAAYa2AAGGtwABhrgAAYa5AAGGugABhrwAAYa+AAGGvwABhsAAAYbCAAGGwwABhugAAYcMAAGHMwABh1cAAYdaAAGHXAABh14AAYdgAAGHYgABh2QAAYdlAAGHaAABh3UAAYeEAAGHhgABh4gAAYeKAAGHjAABh44AAYeQAAGHkgABh6EAAYekAAGHpwABh6oAAYetAAGHsAABh7MAAYe2AAGHuAABh/cAAYf5AAGH+wABh/0AAYgAAAGIAQABiAIAAYgDAAGIBAABiAYAAYgIAAGICQABiAoAAYgMAAGIDQABiEwAAYhOAAGIUAABiFIAAYhVAAGIVgABiFcAAYhYAAGIWQABiFsAAYhdAAGIXgABiF8AAYhhAAGIYgABiKEAAYijAAGIpQABiKcAAYiqAAGIqwABiKwAAYitAAGIrgABiLAAAYiyAAGIswABiLQAAYi2AAGItwABiPYAAYj4AAGI+gABiPwAAYj/AAGJAAABiQEAAYkCAAGJAwABiQUAAYkHAAGJCAABiQkAAYkLAAGJDAABiUsAAYlNAAGJTwABiVEAAYlUAAGJVQABiVYAAYlXAAGJWAABiVoAAYlcAAGJXQABiV4AAYlgAAGJYQABiaAAAYmiAAGJpAABiaYAAYmpAAGJqgABiasAAYmsAAGJrQABia8AAYmxAAGJsgABibMAAYm1AAGJtgABifUAAYn3AAGJ+QABifsAAYn+AAGJ/wABigAAAYoBAAGKAgABigQAAYoGAAGKBwABiggAAYoKAAGKCwABilYAAYp5AAGKmQABirkAAYq7AAGKvQABir8AAYrBAAGKxAABisUAAYrGAAGKyQABisoAAYrMAAGKzQABis8AAYrSAAGK0wABitQAAYrXAAGK2AABit0AAYrqAAGK7wABivEAAYrzAAGK+AABivsAAYr+AAGLAAABiyUAAYtJAAGLcAABi5QAAYuXAAGLmQABi5sAAYudAAGLnwABi6EAAYuiAAGLpQABi7IAAYvDAAGLxQABi8cAAYvJAAGLywABi80AAYvPAAGL0QABi9MAAYvkAAGL5wABi+oAAYvtAAGL8AABi/MAAYv2AAGL+QABi/wAAYv+AAGMPQABjD8AAYxBAAGMQwABjEYAAYxHAAGMSAABjEkAAYxKAAGMTAABjE4AAYxPAAGMUAABjFIAAYxTAAGMkgABjJQAAYyWAAGMmAABjJsAAYycAAGMnQABjJ4AAYyfAAGMoQABjKMAAYykAAGMpQABjKcAAYyoAAGM5wABjOkAAYzsAAGM7gABjPEAAYzyAAGM8wABjPQAAYz1AAGM9wABjPkAAYz6AAGM+wABjP0AAYz+AAGNCwABjQwAAY0NAAGNDwABjU4AAY1QAAGNUgABjVQAAY1XAAGNWAABjVkAAY1aAAGNWwABjV0AAY1fAAGNYAABjWEAAY1jAAGNZAABjaMAAY2lAAGNpwABjakAAY2sAAGNrQABja4AAY2vAAGNsAABjbIAAY20AAGNtQABjbYAAY24AAGNuQABjfgAAY36AAGN/AABjf4AAY4BAAGOAgABjgMAAY4EAAGOBQABjgcAAY4JAAGOCgABjgsAAY4NAAGODgABjk0AAY5PAAGOUQABjlMAAY5WAAGOVwABjlgAAY5ZAAGOWgABjlwAAY5eAAGOXwABjmAAAY5iAAGOYwABjqIAAY6kAAGOpgABjqgAAY6rAAGOrAABjq0AAY6uAAGOrwABjrEAAY6zAAGOtAABjrUAAY63AAGOuAABjt0AAY8BAAGPKAABj0wAAY9PAAGPUQABj1MAAY9VAAGPVwABj1kAAY9aAAGPXQABj2oAAY95AAGPewABj30AAY9/AAGPgQABj4MAAY+FAAGPhwABj5YAAY+ZAAGPnAABj58AAY+iAAGPpQABj6gAAY+rAAGPrQABj+wAAY/uAAGP8AABj/IAAY/1AAGP9gABj/cAAY/4AAGP+QABj/sAAY/9AAGP/gABj/8AAZABAAGQAgABkEEAAZBDAAGQRQABkEcAAZBKAAGQSwABkEwAAZBNAAGQTgABkFAAAZBSAAGQUwABkFQAAZBWAAGQVwABkJYAAZCYAAGQmgABkJwAAZCfAAGQoAABkKEAAZCiAAGQowABkKUAAZCnAAGQqAABkKkAAZCrAAGQrAABkOsAAZDtAAGQ8AABkPIAAZD1AAGQ9gABkPcAAZD4AAGQ+QABkPsAAZD9AAGQ/gABkP8AAZEBAAGRAgABkUEAAZFDAAGRRQABkUcAAZFKAAGRSwABkUwAAZFNAAGRTgABkVAAAZFSAAGRUwABkVQAAZFWAAGRVwABkZYAAZGYAAGRmgABkZwAAZGfAAGRoAABkaEAAZGiAAGRowABkaUAAZGnAAGRqAABkakAAZGrAAGRrAABkesAAZHtAAGR7wABkfEAAZH0AAGR9QABkfYAAZH3AAGR+AABkfoAAZH8AAGR/QABkf4AAZIAAAGSAQABkkwAAZJvAAGSjwABkq8AAZKxAAGSswABkrUAAZK3AAGSugABkrsAAZK8AAGSvwABksAAAZLCAAGSwwABksUAAZLHAAGSyAABkskAAZLMAAGSzQABktIAAZLfAAGS5AABkuYAAZLoAAGS7QABkvAAAZLzAAGS9QABkxoAAZM+AAGTZQABk4kAAZOMAAGTjgABk5AAAZOSAAGTlAABk5YAAZOXAAGTmgABk6cAAZO4AAGTugABk7wAAZO+AAGTwAABk8IAAZPEAAGTxgABk8gAAZPZAAGT3AABk98AAZPiAAGT5QABk+gAAZPrAAGT7gABk/EAAZPzAAGUMgABlDQAAZQ2AAGUOAABlDsAAZQ8AAGUPQABlD4AAZQ/AAGUQQABlEMAAZREAAGURQABlEcAAZRIAAGUhwABlIkAAZSLAAGUjQABlJAAAZSRAAGUkgABlJMAAZSUAAGUlgABlJgAAZSZAAGUmgABlJwAAZSdAAGU3AABlN4AAZThAAGU4wABlOYAAZTnAAGU6AABlOkAAZTqAAGU7AABlO4AAZTvAAGU8AABlPIAAZTzAAGVAAABlQEAAZUCAAGVBAABlUMAAZVFAAGVRwABlUkAAZVMAAGVTQABlU4AAZVPAAGVUAABlVIAAZVUAAGVVQABlVYAAZVYAAGVWQABlZgAAZWaAAGVnAABlZ4AAZWhAAGVogABlaMAAZWkAAGVpQABlacAAZWpAAGVqgABlasAAZWtAAGVrgABle0AAZXvAAGV8QABlfMAAZX2AAGV9wABlfgAAZX5AAGV+gABlfwAAZX+AAGV/wABlgAAAZYCAAGWAwABlkIAAZZEAAGWRgABlkgAAZZLAAGWTAABlk0AAZZOAAGWTwABllEAAZZTAAGWVAABllUAAZZXAAGWWAABlpcAAZaZAAGWmwABlp0AAZagAAGWoQABlqIAAZajAAGWpAABlqYAAZaoAAGWqQABlqoAAZasAAGWrQABltIAAZb2AAGXHQABl0EAAZdEAAGXRgABl0gAAZdKAAGXTAABl04AAZdPAAGXUgABl18AAZduAAGXcAABl3IAAZd0AAGXdgABl3gAAZd6AAGXfAABl4sAAZeOAAGXkQABl5QAAZeXAAGXmgABl50AAZegAAGXogABl+EAAZfjAAGX5QABl+cAAZfqAAGX6wABl+wAAZftAAGX7gABl/AAAZfyAAGX8wABl/QAAZf2AAGX9wABmDYAAZg4AAGYOgABmDwAAZg/AAGYQAABmEEAAZhCAAGYQwABmEUAAZhHAAGYSAABmEkAAZhLAAGYTAABmIsAAZiNAAGYjwABmJEAAZiUAAGYlQABmJYAAZiXAAGYmAABmJoAAZicAAGYnQABmJ4AAZigAAGYoQABmOAAAZjiAAGY5AABmOYAAZjpAAGY6gABmOsAAZjsAAGY7QABmO8AAZjxAAGY8gABmPMAAZj1AAGY9gABmTUAAZk3AAGZOQABmTsAAZk+AAGZPwABmUAAAZlBAAGZQgABmUQAAZlGAAGZRwABmUgAAZlKAAGZSwABmYoAAZmMAAGZjgABmZAAAZmTAAGZlAABmZUAAZmWAAGZlwABmZkAAZmbAAGZnAABmZ0AAZmfAAGZoAABmd8AAZnhAAGZ4wABmeUAAZnoAAGZ6QABmeoAAZnrAAGZ7AABme4AAZnwAAGZ8QABmfIAAZn0AAGZ9QABmf4AAZn/AAGaAQABmkAAAZpCAAGaRAABmkYAAZpJAAGaSgABmksAAZpMAAGaTQABmk8AAZpSAAGaUwABmlQAAZpWAAGaVwABmpYAAZqYAAGamgABmpwAAZqfAAGaoAABmqEAAZqiAAGaowABmqUAAZqoAAGaqQABmqoAAZqsAAGarQABmuwAAZruAAGa8QABmvMAAZr2AAGa9wABmvgAAZr5AAGa+gABmvwAAZr/AAGbAAABmwEAAZsDAAGbBAABm08AAZtyAAGbkgABm7IAAZu0AAGbtgABm7gAAZu6AAGbvAABm70AAZu+AAGbwQABm8IAAZvEAAGbxQABm8cAAZvJAAGbygABm8sAAZvOAAGbzwABm9QAAZvhAAGb5gABm+gAAZvqAAGb7wABm/IAAZv1AAGb9wABnBwAAZxAAAGcZwABnIsAAZyOAAGckAABnJIAAZyUAAGclgABnJgAAZyZAAGcnAABnKkAAZy6AAGcvAABnL4AAZzAAAGcwgABnMQAAZzGAAGcyAABnMoAAZzbAAGc3gABnOEAAZzkAAGc5wABnOoAAZztAAGc8AABnPMAAZz1AAGdNAABnTYAAZ04AAGdOgABnT0AAZ0+AAGdPwABnUAAAZ1BAAGdQwABnUUAAZ1GAAGdRwABnUkAAZ1KAAGdiQABnYsAAZ2NAAGdjwABnZIAAZ2TAAGdlAABnZUAAZ2WAAGdmAABnZoAAZ2bAAGdnAABnZ4AAZ2fAAGd3gABneAAAZ3jAAGd5QABnegAAZ3pAAGd6gABnesAAZ3sAAGd7gABnfAAAZ3xAAGd8gABnfQAAZ31AAGeAgABngMAAZ4EAAGeBgABnkUAAZ5HAAGeSQABnksAAZ5OAAGeTwABnlAAAZ5RAAGeUgABnlQAAZ5WAAGeVwABnlgAAZ5aAAGeWwABnpoAAZ6cAAGengABnqAAAZ6jAAGepAABnqUAAZ6mAAGepwABnqkAAZ6rAAGerAABnq0AAZ6vAAGesAABnu8AAZ7xAAGe8wABnvUAAZ74AAGe+QABnvoAAZ77AAGe/AABnv4AAZ8AAAGfAQABnwIAAZ8EAAGfBQABn0QAAZ9GAAGfSAABn0oAAZ9NAAGfTgABn08AAZ9QAAGfUQABn1MAAZ9VAAGfVgABn1cAAZ9ZAAGfWgABn5kAAZ+bAAGfnQABn58AAZ+iAAGfowABn6QAAZ+lAAGfpgABn6gAAZ+qAAGfqwABn6wAAZ+uAAGfrwABn9QAAZ/4AAGgHwABoEMAAaBGAAGgSAABoEoAAaBMAAGgTgABoFAAAaBRAAGgVAABoGEAAaBwAAGgcgABoHQAAaB2AAGgeAABoHoAAaB8AAGgfgABoI0AAaCQAAGgkwABoJYAAaCZAAGgnAABoJ8AAaCiAAGgpAABoOMAAaDlAAGg5wABoOkAAaDsAAGg7QABoO4AAaDvAAGg8AABoPIAAaD0AAGg9QABoPYAAaD4AAGg+QABoTgAAaE6AAGhPAABoT4AAaFBAAGhQgABoUMAAaFEAAGhRQABoUcAAaFJAAGhSgABoUsAAaFNAAGhTgABoY0AAaGPAAGhkQABoZMAAaGWAAGhlwABoZgAAaGZAAGhmgABoZwAAaGeAAGhnwABoaAAAaGiAAGhowABoeIAAaHkAAGh5gABoegAAaHrAAGh7AABoe0AAaHuAAGh7wABofEAAaHzAAGh9AABofUAAaH3AAGh+AABojcAAaI5AAGiOwABoj0AAaJAAAGiQQABokIAAaJDAAGiRAABokYAAaJIAAGiSQABokoAAaJMAAGiTQABoowAAaKOAAGikAABopIAAaKVAAGilgABopcAAaKYAAGimQABopsAAaKdAAGingABop8AAaKhAAGiogABouEAAaLjAAGi5QABoucAAaLqAAGi6wABouwAAaLtAAGi7gABovAAAaLyAAGi8wABovQAAaL2AAGi9wABo0IAAaNlAAGjhQABo6UAAaOnAAGjqQABo6sAAaOtAAGjrwABo7AAAaOxAAGjtAABo7UAAaO3AAGjuAABo7oAAaO8AAGjvQABo74AAaPBAAGjwgABo8cAAaPUAAGj2QABo9sAAaPdAAGj4gABo+UAAaPoAAGj6gABpA8AAaQzAAGkWgABpH4AAaSBAAGkgwABpIUAAaSHAAGkiQABpIsAAaSMAAGkjwABpJwAAaStAAGkrwABpLEAAaSzAAGktQABpLcAAaS5AAGkuwABpL0AAaTOAAGk0QABpNQAAaTXAAGk2gABpN0AAaTgAAGk4wABpOYAAaToAAGlJwABpSkAAaUrAAGlLQABpTAAAaUxAAGlMgABpTMAAaU0AAGlNgABpTgAAaU5AAGlOgABpTwAAaU9AAGlfAABpX4AAaWAAAGlggABpYUAAaWGAAGlhwABpYgAAaWJAAGliwABpY0AAaWOAAGljwABpZEAAaWSAAGl0QABpdMAAaXWAAGl2AABpdsAAaXcAAGl3QABpd4AAaXfAAGl4QABpeMAAaXkAAGl5QABpecAAaXoAAGl9QABpfYAAaX3AAGl+QABpjgAAaY6AAGmPAABpj4AAaZBAAGmQgABpkMAAaZEAAGmRQABpkcAAaZJAAGmSgABpksAAaZNAAGmTgABpo0AAaaPAAGmkQABppMAAaaWAAGmlwABppgAAaaZAAGmmgABppwAAaaeAAGmnwABpqAAAaaiAAGmowABpuIAAabkAAGm5gABpugAAabrAAGm7AABpu0AAabuAAGm7wABpvEAAabzAAGm9AABpvUAAab3AAGm+AABpzcAAac5AAGnOwABpz0AAadAAAGnQQABp0IAAadDAAGnRAABp0YAAadIAAGnSQABp0oAAadMAAGnTQABp4wAAaeOAAGnkAABp5IAAaeVAAGnlgABp5cAAaeYAAGnmQABp5sAAaedAAGnngABp58AAaehAAGnogABp8cAAafrAAGoEgABqDYAAag5AAGoOwABqD0AAag/AAGoQQABqEMAAahEAAGoRwABqFQAAahjAAGoZQABqGcAAahpAAGoawABqG0AAahvAAGocQABqIAAAaiDAAGohgABqIkAAaiMAAGojwABqJIAAaiVAAGolwABqNYAAajYAAGo2gABqNwAAajfAAGo4AABqOEAAajiAAGo4wABqOUAAajnAAGo6AABqOkAAajrAAGo7AABqSsAAaktAAGpLwABqTEAAak0AAGpNQABqTYAAak3AAGpOAABqToAAak8AAGpPQABqT4AAalAAAGpQQABqYAAAamCAAGphAABqYYAAamJAAGpigABqYsAAamMAAGpjQABqY8AAamRAAGpkgABqZMAAamVAAGplgABqdUAAanXAAGp2QABqdsAAaneAAGp3wABqeAAAanhAAGp4gABqeQAAanmAAGp5wABqegAAanqAAGp6wABqioAAaosAAGqLgABqjAAAaozAAGqNAABqjUAAao2AAGqNwABqjkAAao7AAGqPAABqj0AAao/AAGqQAABqn8AAaqBAAGqgwABqoUAAaqIAAGqiQABqooAAaqLAAGqjAABqo4AAaqQAAGqkQABqpIAAaqUAAGqlQABqtQAAarWAAGq2AABqtoAAardAAGq3gABqt8AAargAAGq4QABquMAAarlAAGq5gABqucAAarpAAGq6gABqzUAAatYAAGreAABq5gAAauaAAGrnAABq54AAaugAAGrogABq6MAAaukAAGrpwABq6gAAauqAAGrqwABq60AAauvAAGrsAABq7EAAau0AAGrtQABq7oAAavHAAGrzAABq84AAavQAAGr1QABq9gAAavbAAGr3QABrAIAAawmAAGsTQABrHEAAax0AAGsdgABrHgAAax6AAGsfAABrH4AAax/AAGsggABrI8AAaygAAGsogABrKQAAaymAAGsqAABrKoAAaysAAGsrgABrLAAAazBAAGsxAABrMcAAazKAAGszQABrNAAAazTAAGs1gABrNkAAazbAAGtGgABrRwAAa0eAAGtIAABrSMAAa0kAAGtJQABrSYAAa0nAAGtKQABrSsAAa0sAAGtLQABrS8AAa0wAAGtbwABrXEAAa1zAAGtdQABrXgAAa15AAGtegABrXsAAa18AAGtfgABrYAAAa2BAAGtggABrYQAAa2FAAGtxAABrcYAAa3JAAGtywABrc4AAa3PAAGt0AABrdEAAa3SAAGt1AABrdYAAa3XAAGt2AABrdoAAa3bAAGt6AABrekAAa3qAAGt7AABrisAAa4tAAGuLwABrjEAAa40AAGuNQABrjYAAa43AAGuOAABrjoAAa48AAGuPQABrj4AAa5AAAGuQQABroAAAa6CAAGuhAABroYAAa6JAAGuigABrosAAa6MAAGujQABro8AAa6RAAGukgABrpMAAa6VAAGulgABrtUAAa7XAAGu2QABrtsAAa7eAAGu3wABruAAAa7hAAGu4gABruQAAa7mAAGu5wABrugAAa7qAAGu6wABryoAAa8sAAGvLgABrzAAAa8zAAGvNAABrzUAAa82AAGvNwABrzkAAa87AAGvPAABrz0AAa8/AAGvQAABr38AAa+BAAGvgwABr4UAAa+IAAGviQABr4oAAa+LAAGvjAABr44AAa+QAAGvkQABr5IAAa+UAAGvlQABr7oAAa/eAAGwBQABsCkAAbAsAAGwLgABsDAAAbAyAAGwNAABsDYAAbA3AAGwOgABsEcAAbBWAAGwWAABsFoAAbBcAAGwXgABsGAAAbBiAAGwZAABsHMAAbB2AAGweQABsHwAAbB/AAGwggABsIUAAbCIAAGwigABsMkAAbDLAAGwzQABsM8AAbDSAAGw0wABsNQAAbDVAAGw1gABsNgAAbDaAAGw2wABsNwAAbDeAAGw3wABsR4AAbEgAAGxIgABsSQAAbEnAAGxKAABsSkAAbEqAAGxKwABsS0AAbEvAAGxMAABsTEAAbEzAAGxNAABsXMAAbF1AAGxdwABsXkAAbF8AAGxfQABsX4AAbF/AAGxgAABsYIAAbGEAAGxhQABsYYAAbGIAAGxiQABscgAAbHKAAGxzAABsc4AAbHRAAGx0gABsdMAAbHUAAGx1QABsdcAAbHZAAGx2gABsdsAAbHdAAGx3gABsh0AAbIfAAGyIQABsiMAAbImAAGyJwABsigAAbIpAAGyKgABsiwAAbIuAAGyLwABsjAAAbIyAAGyMwABsnIAAbJ0AAGydgABsngAAbJ7AAGyfAABsn0AAbJ+AAGyfwABsoEAAbKDAAGyhAABsoUAAbKHAAGyiAABsscAAbLJAAGyywABss0AAbLQAAGy0QABstIAAbLTAAGy1AABstYAAbLYAAGy2QABstoAAbLcAAGy3QABsygAAbNLAAGzawABs4sAAbONAAGzjwABs5EAAbOTAAGzlQABs5YAAbOXAAGzmgABs5sAAbOdAAGzngABs6AAAbOiAAGzowABs6QAAbOnAAGzqAABs60AAbO6AAGzvwABs8EAAbPDAAGzyAABs8sAAbPOAAGz0AABs/UAAbQZAAG0QAABtGQAAbRnAAG0aQABtGsAAbRtAAG0bwABtHEAAbRyAAG0dQABtIIAAbSTAAG0lQABtJcAAbSZAAG0mwABtJ0AAbSfAAG0oQABtKMAAbS0AAG0twABtLoAAbS9AAG0wAABtMMAAbTGAAG0yQABtMwAAbTOAAG1DQABtQ8AAbURAAG1EwABtRYAAbUXAAG1GAABtRkAAbUaAAG1HAABtR4AAbUfAAG1IAABtSIAAbUjAAG1YgABtWQAAbVmAAG1aAABtWsAAbVsAAG1bQABtW4AAbVvAAG1cQABtXMAAbV0AAG1dQABtXcAAbV4AAG1twABtbkAAbW8AAG1vgABtcEAAbXCAAG1wwABtcQAAbXFAAG1xwABtckAAbXKAAG1ywABtc0AAbXOAAG12wABtdwAAbXdAAG13wABth4AAbYgAAG2IgABtiQAAbYnAAG2KAABtikAAbYqAAG2KwABti0AAbYvAAG2MAABtjEAAbYzAAG2NAABtnMAAbZ1AAG2dwABtnkAAbZ8AAG2fQABtn4AAbZ/AAG2gAABtoIAAbaEAAG2hQABtoYAAbaIAAG2iQABtsgAAbbKAAG2zAABts4AAbbRAAG20gABttMAAbbUAAG21QABttcAAbbZAAG22gABttsAAbbdAAG23gABtx0AAbcfAAG3IQABtyMAAbcmAAG3JwABtygAAbcpAAG3KgABtywAAbcuAAG3LwABtzAAAbcyAAG3MwABt3IAAbd0AAG3dgABt3gAAbd7AAG3fAABt30AAbd+AAG3fwABt4EAAbeDAAG3hAABt4UAAbeHAAG3iAABt60AAbfRAAG3+AABuBwAAbgfAAG4IQABuCMAAbglAAG4JwABuCkAAbgqAAG4LQABuDoAAbhJAAG4SwABuE0AAbhPAAG4UQABuFMAAbhVAAG4VwABuGYAAbhpAAG4bAABuG8AAbhyAAG4dQABuHgAAbh7AAG4fQABuLwAAbi+AAG4wAABuMIAAbjFAAG4xgABuMcAAbjIAAG4yQABuMsAAbjNAAG4zgABuM8AAbjRAAG40gABuREAAbkTAAG5FQABuRcAAbkaAAG5GwABuRwAAbkdAAG5HgABuSAAAbkiAAG5IwABuSQAAbkmAAG5JwABuWYAAbloAAG5agABuWwAAblvAAG5cAABuXEAAblyAAG5cwABuXUAAbl3AAG5eAABuXkAAbl7AAG5fAABubsAAbm9AAG5vwABucEAAbnEAAG5xQABucYAAbnHAAG5yAABucoAAbnMAAG5zQABuc4AAbnQAAG50QABuhAAAboSAAG6FAABuhYAAboZAAG6GgABuhsAAbocAAG6HQABuh8AAbohAAG6IgABuiMAAbolAAG6JgABumUAAbpnAAG6aQABumsAAbpuAAG6bwABunAAAbpxAAG6cgABunQAAbp2AAG6dwABungAAbp6AAG6ewABuroAAbq8AAG6vgABusAAAbrDAAG6xAABusUAAbrGAAG6xwABuskAAbrLAAG6zAABus0AAbrPAAG60AABuxsAAbs+AAG7XgABu34AAbuAAAG7ggABu4QAAbuGAAG7iAABu4kAAbuKAAG7jQABu44AAbuQAAG7kQABu5MAAbuVAAG7lgABu5cAAbuaAAG7mwABu6AAAbutAAG7sgABu7QAAbu2AAG7uwABu74AAbvBAAG7wwABu+gAAbwMAAG8MwABvFcAAbxaAAG8XAABvF4AAbxgAAG8YgABvGQAAbxlAAG8aAABvHUAAbyGAAG8iAABvIoAAbyMAAG8jgABvJAAAbySAAG8lAABvJYAAbynAAG8qgABvK0AAbywAAG8swABvLYAAby5AAG8vAABvL8AAbzBAAG9AAABvQIAAb0EAAG9BgABvQkAAb0KAAG9CwABvQwAAb0NAAG9DwABvREAAb0SAAG9EwABvRUAAb0WAAG9VQABvVcAAb1ZAAG9WwABvV4AAb1fAAG9YAABvWEAAb1iAAG9ZAABvWYAAb1nAAG9aAABvWoAAb1rAAG9qgABvawAAb2vAAG9sQABvbQAAb21AAG9tgABvbcAAb24AAG9ugABvbwAAb29AAG9vgABvcAAAb3BAAG9zgABvc8AAb3QAAG90gABvhEAAb4TAAG+FQABvhcAAb4aAAG+GwABvhwAAb4dAAG+HgABviAAAb4iAAG+IwABviQAAb4mAAG+JwABvmYAAb5oAAG+agABvmwAAb5vAAG+cAABvnEAAb5yAAG+cwABvnUAAb53AAG+eAABvnkAAb57AAG+fAABvrsAAb69AAG+vwABvsEAAb7EAAG+xQABvsYAAb7HAAG+yAABvsoAAb7MAAG+zQABvs4AAb7QAAG+0QABvxAAAb8SAAG/FAABvxYAAb8ZAAG/GgABvxsAAb8cAAG/HQABvx8AAb8hAAG/IgABvyMAAb8lAAG/JgABv2UAAb9nAAG/aQABv2sAAb9uAAG/bwABv3AAAb9xAAG/cgABv3QAAb92AAG/dwABv3gAAb96AAG/ewABv6AAAb/EAAG/6wABwA8AAcASAAHAFAABwBYAAcAYAAHAGgABwBwAAcAdAAHAIAABwC0AAcA8AAHAPgABwEAAAcBCAAHARAABwEYAAcBIAAHASgABwFkAAcBcAAHAXwABwGIAAcBlAAHAaAABwGsAAcBuAAHAcAABwK8AAcCxAAHAswABwLUAAcC4AAHAuQABwLoAAcC7AAHAvAABwL4AAcDAAAHAwQABwMIAAcDEAAHAxQABwQQAAcEGAAHBCAABwQoAAcENAAHBDgABwQ8AAcEQAAHBEQABwRMAAcEVAAHBFgABwRcAAcEZAAHBGgABwVkAAcFbAAHBXQABwV8AAcFiAAHBYwABwWQAAcFlAAHBZgABwWgAAcFqAAHBawABwWwAAcFuAAHBbwABwa4AAcGwAAHBsgABwbQAAcG3AAHBuAABwbkAAcG6AAHBuwABwb0AAcG/AAHBwAABwcEAAcHDAAHBxAABwgMAAcIFAAHCBwABwgkAAcIMAAHCDQABwg4AAcIPAAHCEAABwhIAAcIUAAHCFQABwhYAAcIYAAHCGQABwlgAAcJaAAHCXAABwl4AAcJhAAHCYgABwmMAAcJkAAHCZQABwmcAAcJpAAHCagABwmsAAcJtAAHCbgABwq0AAcKvAAHCsQABwrMAAcK2AAHCtwABwrgAAcK5AAHCugABwrwAAcK+AAHCvwABwsAAAcLCAAHCwwABww4AAcMxAAHDUQABw3EAAcNzAAHDdQABw3cAAcN5AAHDewABw3wAAcN9AAHDgAABw4EAAcODAAHDhAABw4YAAcOIAAHDiQABw4oAAcONAAHDjgABw5MAAcOgAAHDpQABw6cAAcOpAAHDrgABw7EAAcO0AAHDtgABw9sAAcP/AAHEJgABxEoAAcRNAAHETwABxFEAAcRTAAHEVQABxFcAAcRYAAHEWwABxGgAAcR5AAHEewABxH0AAcR/AAHEgQABxIMAAcSFAAHEhwABxIkAAcSaAAHEnQABxKAAAcSjAAHEpgABxKkAAcSsAAHErwABxLIAAcS0AAHE8wABxPUAAcT3AAHE+QABxPwAAcT9AAHE/gABxP8AAcUAAAHFAgABxQQAAcUFAAHFBgABxQgAAcUJAAHFSAABxUoAAcVMAAHFTgABxVEAAcVSAAHFUwABxVQAAcVVAAHFVwABxVkAAcVaAAHFWwABxV0AAcVeAAHFnQABxZ8AAcWiAAHFpAABxacAAcWoAAHFqQABxaoAAcWrAAHFrQABxa8AAcWwAAHFsQABxbMAAcW0AAHFwQABxcIAAcXDAAHFxQABxgQAAcYGAAHGCAABxgoAAcYNAAHGDgABxg8AAcYQAAHGEQABxhMAAcYVAAHGFgABxhcAAcYZAAHGGgABxlkAAcZbAAHGXQABxl8AAcZiAAHGYwABxmQAAcZlAAHGZgABxmgAAcZqAAHGawABxmwAAcZuAAHGbwABxq4AAcawAAHGsgABxrQAAca3AAHGuAABxrkAAca6AAHGuwABxr0AAca/AAHGwAABxsEAAcbDAAHGxAABxwMAAccFAAHHBwABxwkAAccMAAHHDQABxw4AAccPAAHHEAABxxIAAccUAAHHFQABxxYAAccYAAHHGQABx1gAAcdaAAHHXAABx14AAcdhAAHHYgABx2MAAcdkAAHHZQABx2cAAcdpAAHHagABx2sAAcdtAAHHbgABx5MAAce3AAHH3gAByAIAAcgFAAHIBwAByAkAAcgLAAHIDQAByA8AAcgQAAHIEwAByCAAAcgvAAHIMQAByDMAAcg1AAHINwAByDkAAcg7AAHIPQAByEwAAchPAAHIUgAByFUAAchYAAHIWwAByF4AAchhAAHIYwAByKIAAcikAAHIpgAByKgAAcirAAHIrAAByK0AAciuAAHIrwAByLEAAcizAAHItAAByLUAAci3AAHIuAAByPcAAcj5AAHI+wAByP0AAckAAAHJAQAByQIAAckDAAHJBAAByQYAAckIAAHJCQAByQoAAckMAAHJDQAByUwAAclOAAHJUAAByVIAAclVAAHJVgAByVcAAclYAAHJWQAByVsAAcldAAHJXgAByV8AAclhAAHJYgAByaEAAcmjAAHJpQAByacAAcmqAAHJqwAByawAAcmtAAHJrgABybAAAcmyAAHJswABybQAAcm2AAHJtwAByfYAAcn4AAHJ+gAByfwAAcn/AAHKAAABygEAAcoCAAHKAwABygUAAcoHAAHKCAABygkAAcoLAAHKDAAByksAAcpNAAHKTwABylEAAcpUAAHKVQABylYAAcpXAAHKWAAByloAAcpcAAHKXQAByl4AAcpgAAHKYQAByqAAAcqiAAHKpAAByqYAAcqpAAHKqgAByqsAAcqsAAHKrQAByq8AAcqxAAHKsgAByrMAAcq1AAHKtgABywEAAcskAAHLRAABy2QAActmAAHLaAABy2oAActsAAHLbgABy28AActwAAHLcwABy3QAAct2AAHLdwABy3kAAct7AAHLfAABy30AAcuAAAHLgQABy4YAAcuTAAHLmAABy5oAAcucAAHLoQABy6QAAcunAAHLqQABy84AAcvyAAHMGQABzD0AAcxAAAHMQgABzEQAAcxGAAHMSAABzEoAAcxLAAHMTgABzFsAAcxsAAHMbgABzHAAAcxyAAHMdAABzHYAAcx4AAHMegABzHwAAcyNAAHMkAABzJMAAcyWAAHMmQABzJwAAcyfAAHMogABzKUAAcynAAHM5gABzOgAAczqAAHM7AABzO8AAczwAAHM8QABzPIAAczzAAHM9QABzPcAAcz4AAHM+QABzPsAAcz8AAHNOwABzT0AAc0/AAHNQQABzUQAAc1FAAHNRgABzUcAAc1IAAHNSgABzUwAAc1NAAHNTgABzVAAAc1RAAHNkAABzZIAAc2VAAHNlwABzZoAAc2bAAHNnAABzZ0AAc2eAAHNoAABzaIAAc2jAAHNpAABzaYAAc2nAAHNtAABzbUAAc22AAHNuAABzfcAAc35AAHN+wABzf0AAc4AAAHOAQABzgIAAc4DAAHOBAABzgYAAc4IAAHOCQABzgoAAc4MAAHODQABzkwAAc5OAAHOUAABzlIAAc5VAAHOVgABzlcAAc5YAAHOWQABzlsAAc5dAAHOXgABzl8AAc5hAAHOYgABzqEAAc6jAAHOpQABzqcAAc6qAAHOqwABzqwAAc6tAAHOrgABzrAAAc6yAAHOswABzrQAAc62AAHOtwABzvYAAc74AAHO+gABzvwAAc7/AAHPAAABzwEAAc8CAAHPAwABzwUAAc8HAAHPCAABzwkAAc8LAAHPDAABz0sAAc9NAAHPTwABz1EAAc9UAAHPVQABz1YAAc9XAAHPWAABz1oAAc9cAAHPXQABz14AAc9gAAHPYQABz4YAAc+qAAHP0QABz/UAAc/4AAHP+gABz/wAAc/+AAHQAAAB0AIAAdADAAHQBgAB0BMAAdAiAAHQJAAB0CYAAdAoAAHQKgAB0CwAAdAuAAHQMAAB0D8AAdBCAAHQRQAB0EgAAdBLAAHQTgAB0FEAAdBUAAHQVgAB0JUAAdCXAAHQmQAB0JsAAdCeAAHQnwAB0KAAAdChAAHQogAB0KQAAdCmAAHQpwAB0KgAAdCqAAHQqwAB0OoAAdDsAAHQ7gAB0PAAAdDzAAHQ9AAB0PUAAdD2AAHQ9wAB0PkAAdD7AAHQ/AAB0P0AAdD/AAHRAAAB0T8AAdFBAAHRQwAB0UUAAdFIAAHRSQAB0UoAAdFLAAHRTAAB0U4AAdFQAAHRUQAB0VIAAdFUAAHRVQAB0ZQAAdGWAAHRmQAB0ZsAAdGeAAHRnwAB0aAAAdGhAAHRogAB0aQAAdGmAAHRpwAB0agAAdGqAAHRqwAB0eoAAdHsAAHR7gAB0fAAAdHzAAHR9AAB0fUAAdH2AAHR9wAB0fkAAdH7AAHR/AAB0f0AAdH/AAHSAAAB0j8AAdJBAAHSQwAB0kUAAdJIAAHSSQAB0koAAdJLAAHSTAAB0k4AAdJQAAHSUQAB0lIAAdJUAAHSVQAB0pQAAdKWAAHSmAAB0poAAdKdAAHSngAB0p8AAdKgAAHSoQAB0qMAAdKlAAHSpgAB0qcAAdKpAAHSqgAB0vUAAdMYAAHTOAAB01gAAdNaAAHTXAAB014AAdNgAAHTYgAB02MAAdNkAAHTZwAB02gAAdNqAAHTawAB020AAdNvAAHTcAAB03EAAdN0AAHTdQAB03oAAdOHAAHTjAAB044AAdOQAAH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CgAACAoMAAgKGAAICiQACAosAAgLKAAICzAACAs8AAgLRAAIC1AACAtUAAgLWAAIC1wACAtgAAgLaAAIC3AACAt0AAgLeAAIC4AACAuEAAgLqAAIC6wACAu0AAgMsAAIDLgACAzAAAgMyAAIDNQACAzYAAgM3AAIDOAACAzkAAgM7AAIDPQACAz4AAgM/AAIDQQACA0IAAgOBAAIDgwACA4UAAgOHAAIDigACA4sAAgOMAAIDjQACA44AAgOQAAIDkgACA5MAAgOUAAIDlgACA5cAAgPWAAID2AACA9sAAgPdAAID4AACA+EAAgPiAAID4wACA+QAAgPmAAID6AACA+kAAgPqAAID7AACA+0AAgP2AAID9wACA/kAAgQ4AAIEOgACBDwAAgQ+AAIEQQACBEIAAgRDAAIERAACBEUAAgRHAAIESQACBEoAAgRLAAIETQACBE4AAgSNAAIEjwACBJIAAgSUAAIElwACBJgAAgSZAAIEmgACBJsAAgSdAAIEnwACBKAAAgShAAIEowACBKQAAgSxAAIEsgACBLMAAgS1AAIE9AACBPYAAgT4AAIE+gACBP0AAgT+AAIE/wACBQAAAgUBAAIFAwACBQUAAgUGAAIFBwACBQkAAgUKAAIFSQACBUsAAgVOAAIFUAACBVMAAgVUAAIFVQACBVYAAgVXAAIFWQACBVsAAgVcAAIFXQACBV8AAgVgAAIFfAACBYkAAgWcAAIFnwACBaIAAgWlAAIFqAACBasAAgWuAAIFsQACBbQAAgW3AAIFygACBc0AAgXQAAIF0wACBdYAAgXZAAIF3AACBd8AAgXiAAIF5QACBecAAgXuAAIGAQACBgcAAgYgAAIGMwACBkYAAgZkAAIGbwACBoUAAgbQAAIG8wACBxMAAgczAAIHNQACBzcAAgc5AAIHOwACBz4AAgc/AAIHQAACB0MAAgdEAAIHRgACB0cAAgdKAAIHTQACB04AAgdPAAIHUgACB1MAAgdYAAIHZQACB2oAAgdsAAIHbwACB3QAAgd3AAIHegACB3wAAgehAAIHxQACB+wAAggQAAIIEwACCBUAAggXAAIIGQACCBsAAggdAAIIHgACCCEAAgguAAIIPwACCEEAAghDAAIIRQACCEcAAghJAAIISwACCE0AAghPAAIIYAACCGMAAghmAAIIaQACCGwAAghvAAIIcgACCHUAAgh4AAIIegACCLkAAgi7AAIIvQACCL8AAgjCAAIIwwACCMQAAgjFAAIIxgACCMgAAgjKAAIIywACCMwAAgjOAAIIzwACCQ4AAgkQAAIJEgACCRQAAgkXAAIJGAACCRkAAgkaAAIJGwACCR0AAgkfAAIJIAACCSEAAgkjAAIJJAACCWMAAgllAAIJaAACCWoAAgltAAIJbgACCW8AAglwAAIJcQACCXMAAgl1AAIJdgACCXcAAgl5AAIJegACCYcAAgmIAAIJiQACCYsAAgnKAAIJzAACCc4AAgnQAAIJ0wACCdQAAgnVAAIJ1gACCdcAAgnZAAIJ2wACCdwAAgndAAIJ3wACCeAAAgofAAIKIQACCiMAAgolAAIKKAACCikAAgoqAAIKKwACCiwAAgouAAIKMAACCjEAAgoyAAIKNAACCjUAAgp0AAIKdgACCngAAgp6AAIKfQACCn4AAgp/AAIKgAACCoEAAgqDAAIKhQACCoYAAgqHAAIKiQACCooAAgrJAAIKywACCs0AAgrPAAIK0gACCtMAAgrUAAIK1QACCtYAAgrYAAIK2gACCtsAAgrcAAIK3gACCt8AAgseAAILIAACCyIAAgskAAILJwACCygAAgspAAILKgACCysAAgstAAILLwACCzAAAgsxAAILMwACCzQAAgtZAAILfQACC6QAAgvIAAILywACC84AAgvQAAIL0gACC9QAAgvWAAIL1wACC9oAAgvnAAIL9gACC/kAAgv8AAIL/wACDAIAAgwFAAIMCAACDAsAAgwaAAIMHQACDCAAAgwjAAIMJgACDCkAAgwsAAIMLwACDDEAAgxwAAIMcgACDHUAAgx3AAIMegACDHsAAgx8AAIMfQACDH4AAgyAAAIMgwACDIQAAgyFAAIMhwACDIgAAgzHAAIMyQACDMwAAgzOAAIM0QACDNIAAgzTAAIM1AACDNUAAgzXAAIM2gACDNsAAgzcAAIM3gACDN8AAg0eAAINIAACDSMAAg0lAAINKAACDSkAAg0qAAINKwACDSwAAg0uAAINMQACDTIAAg0zAAINNQACDTYAAg11AAINdwACDXoAAg18AAINfwACDYAAAg2BAAINggACDYMAAg2FAAINiAACDYkAAg2KAAINjAACDY0AAg3QAAIN9AACDhgAAg47AAIOYgACDoIAAg6pAAIO0AACDvAAAg8UAAIPOAACDzoAAg89AAIPPwACD0EAAg9DAAIPRgACD0kAAg9LAAIPTQACD1AAAg9SAAIPVAACD1cAAg9aAAIPWwACD2AAAg9tAAIPcAACD3IAAg91AAIPeAACD3oAAg+fAAIPwwACD+oAAhAOAAIQEQACEBMAAhAVAAIQFwACEBkAAhAbAAIQHAACEB8AAhAsAAIQPQACED8AAhBBAAIQQwACEEUAAhBHAAIQSQACEEsAAhBNAAIQXgACEGEAAhBkAAIQZwACEGoAAhBtAAIQcAACEHMAAhB2AAIQeAACELcAAhC5AAIQvAACEL4AAhDBAAIQwgACEMMAAhDEAAIQxQACEMcAAhDJAAIQygACEMsAAhDNAAIQzgACENcAAhDYAAIQ2gACERkAAhEbAAIRHQACER8AAhEiAAIRIwACESQAAhElAAIRJgACESgAAhEqAAIRKwACESwAAhEuAAIRLwACEW4AAhFwAAIRcgACEXQAAhF3AAIReAACEXkAAhF6AAIRewACEX0AAhF/AAIRgAACEYEAAhGDAAIRhAACEcMAAhHFAAIRyAACEcoAAhHNAAIRzgACEc8AAhHQAAIR0QACEdMAAhHVAAIR1gACEdcAAhHZAAIR2gACEeMAAhHkAAIR5gACEiUAAhInAAISKQACEisAAhIuAAISLwACEjAAAhIxAAISMgACEjQAAhI2AAISNwACEjgAAhI6AAISOwACEnoAAhJ8AAISfwACEoEAAhKEAAIShQACEoYAAhKHAAISiAACEooAAhKMAAISjQACEo4AAhKQAAISkQACEp4AAhKfAAISoAACEqIAAhLhAAIS4wACEuUAAhLnAAIS6gACEusAAhLsAAIS7QACEu4AAhLwAAIS8gACEvMAAhL0AAIS9gACEvcAAhM2AAITOAACEzsAAhM9AAITQAACE0EAAhNCAAITQwACE0QAAhNGAAITSAACE0kAAhNKAAITTAACE00AAhNrAAITeAACE30AAhOAAAITgwACE4gAAhOLAAITjgACE5AAAhOXAAITswACE/4AAhQhAAIUQQACFGEAAhRjAAIUZQACFGcAAhRpAAIUbAACFG0AAhRuAAIUcQACFHIAAhR0AAIUdQACFHcAAhR6AAIUewACFHwAAhR/AAIUgAACFIUAAhSSAAIUlwACFJkAAhSbAAIUoAACFKMAAhSmAAIUqAACFM0AAhTxAAIVGAACFTwAAhU/AAIVQQACFUMAAhVFAAIVRwACFUkAAhVKAAIVTQACFVoAAhVrAAIVbQACFW8AAhVxAAIVcwACFXUAAhV3AAIVeQACFXsAAhWMAAIVjwACFZIAAhWVAAIVmAACFZsAAhWeAAIVoQACFaQAAhWmAAIV5QACFecAAhXpAAIV6wACFe4AAhXvAAIV8AACFfEAAhXyAAIV9AACFfYAAhX3AAIV+AACFfoAAhX7AAIWOgACFjwAAhY+AAIWQAACFkMAAhZEAAIWRQACFkYAAhZHAAIWSQACFksAAhZMAAIWTQACFk8AAhZQAAIWjwACFpEAAhaUAAIWlgACFpkAAhaaAAIWmwACFpwAAhadAAIWnwACFqEAAhaiAAIWowACFqUAAhamAAIWswACFrQAAha1AAIWtwACFvYAAhb4AAIW+gACFvwAAhb/AAIXAAACFwEAAhcCAAIXAwACFwUAAhcHAAIXCAACFwkAAhcLAAIXDAACF0sAAhdNAAIXTwACF1EAAhdUAAIXVQACF1YAAhdXAAIXWAACF1oAAhdcAAIXXQACF14AAhdgAAIXYQACF6AAAheiAAIXpAACF6YAAhepAAIXqgACF6sAAhesAAIXrQACF68AAhexAAIXsgACF7MAAhe1AAIXtgACF/UAAhf3AAIX+QACF/sAAhf+AAIX/wACGAAAAhgBAAIYAgACGAQAAhgGAAIYBwACGAgAAhgKAAIYCwACGEoAAhhMAAIYTgACGFAAAhhTAAIYVAACGFUAAhhWAAIYVwACGFkAAhhbAAIYXAACGF0AAhhfAAIYYAACGIUAAhipAAIY0AACGPQAAhj3AAIY+QACGPsAAhj9AAIY/wACGQEAAhkCAAIZBQACGRIAAhkhAAIZIwACGSUAAhknAAIZKQACGSsAAhktAAIZLwACGT4AAhlBAAIZRAACGUcAAhlKAAIZTQACGVAAAhlTAAIZVQACGZQAAhmWAAIZmAACGZoAAhmdAAIZngACGZ8AAhmgAAIZoQACGaMAAhmlAAIZpgACGacAAhmpAAIZqgACGekAAhnrAAIZ7QACGe8AAhnyAAIZ8wACGfQAAhn1AAIZ9gACGfgAAhn6AAIZ+wACGfwAAhn+AAIZ/wACGj4AAhpAAAIaQgACGkQAAhpHAAI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nPwACJ0IAAidEAAInRgACJ0gAAidKAAInTAACJ00AAidQAAInXQACJ24AAidwAAIncgACJ3QAAid2AAIneAACJ3oAAid8AAInfgACJ48AAieSAAInlQACJ5gAAiebAAInngACJ6EAAiekAAInpwACJ6kAAifoAAIn6gACJ+0AAifvAAIn8gACJ/MAAif0AAIn9QACJ/YAAif4AAIn+gACJ/sAAif8AAIn/gACJ/8AAigIAAIoCQACKAsAAihKAAIoTAACKE4AAihQAAIoUwACKFQAAihVAAIoVgACKFcAAihZAAIoWwACKFwAAihdAAIoXwACKGAAAiifAAIooQACKKMAAiilAAIoqAACKKkAAiiqAAIoqwACKKwAAiiuAAIosAACKLEAAiiyAAIotAACKLUAAij0AAIo9gACKPkAAij7AAIo/gACKP8AAikAAAIpAQACKQIAAikEAAIpBgACKQcAAikIAAIpCgACKQsAAikUAAIpFQACKRcAAilWAAIpWAACKVoAAilcAAIpXwACKWAAAilhAAIpYgACKWMAAillAAIpZwACKWgAAilpAAIpawACKWwAAimrAAIprQACKbAAAimyAAIptQACKbYAAim3AAIpuAACKbkAAim7AAIpvQACKb4AAim/AAIpwQACKcIAAinPAAIp0AACKdEAAinTAAIqEgACKhQAAioWAAIqGAACKhsAAiocAAIqHQACKh4AAiofAAIqIQACKiMAAiokAAIqJQACKicAAiooAAIqZwACKmkAAipsAAIqbgACKnEAAipyAAIqcwACKnQAAip1AAIqdwACKnkAAip6AAIqewACKn0AAip+AAIqnAACKqkAAiqsAAIqrwACKrIAAiq1AAIqtwACKrwAAisHAAIrKgACK0oAAitqAAIrbAACK24AAitwAAIrcgACK3UAAit2AAIrdwACK3oAAit7AAIrfQACK34AAiuAAAIrgwACK4QAAiuFAAIriAACK4kAAiuOAAIrmwACK6AAAiuiAAIrpAACK6kAAiusAAIrrwACK7EAAivWAAIr+gACLCEAAixFAAIsSAACLEoAAixMAAIsTgACLFAAAixSAAIsUwACLFYAAixjAAIsdAACLHYAAix4AAIsegACLHwAAix+AAIsgAACLIIAAiyEAAIslQACLJgAAiybAAIsngACLKEAAiykAAI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EcQACRHIAAkRzAAJEdAACRHYAAkR4AAJEeQACRHoAAkR8AAJEfQACRLwAAkS+AAJEwAACRMIAAkTFAAJExgACRMcAAkTIAAJEyQACRMsAAkTNAAJEzgACRM8AAkTRAAJE0gACRREAAkUTAAJFFgACRRgAAkUbAAJFHAACRR0AAkUeAAJFHwACRSEAAkUjAAJFJAACRSUAAkUnAAJFKAACRTUAAkU2AAJFNwACRTkAAkV4AAJFegACRXwAAkV+AAJFgQACRYIAAkWDAAJFhAACRYUAAkWHAAJFiQACRYoAAkWLAAJFjQACRY4AAkXNAAJFzwACRdEAAkXTAAJF1gACRdcAAkXYAAJF2QACRdoAAkXcAAJF3gACRd8AAkXgAAJF4gACReMAAkYiAAJGJAACRiYAAkYoAAJGKwACRiwAAkYtAAJGLgACRi8AAkYxAAJGMwACRjQAAkY1AAJGNwACRjgAAkZ3AAJGeQACRnsAAkZ9AAJGgAACRoEAAkaCAAJGgwACRoQAAkaGAAJGiAACRokAAkaKAAJGjAACRo0AAkbMAAJGzgACRtAAAkbSAAJG1QACRtYAAkbXAAJG2AACRtkAAkbbAAJG3QACRt4AAkbfAAJG4QACRuIAAkcHAAJHKwACR1IAAkd2AAJHeQACR3sAAkd9AAJHfwACR4EAAkeDAAJHhAACR4cAAkeUAAJHowACR6UAAkenAAJHqQACR6sAAketAAJHrwACR7EAAkfAAAJHwwACR8YAAkfJAAJHzAACR88AAkfSAAJH1QACR9cAAkgWAAJIGAACSBoAAkgcAAJIHwACSCAAAkghAAJIIgACSCMAAkglAAJIJwACSCgAAkgpAAJIKwACSCwAAkhrAAJIbQACSG8AAkhxAAJIdAACSHUAAkh2AAJIdwACSHgAAkh6AAJIfAACSH0AAkh+AAJIgAACSIEAAkjAAAJIwgACSMQAAkjGAAJIyQACSMoAAkjLAAJIzAACSM0AAkjPAAJI0QACSNIAAkjTAAJI1QACSNYAAkkVAAJJFwACSRoAAkkcAAJJHwACSSAAAkkhAAJJIgACSSMAAkklAAJJJwACSSgAAkkpAAJJKwACSSwAAkkuAAJJbQACSW8AAklxAAJJcwACSXYAAkl3AAJJeAACSXkAAkl6AAJJfAACSX4AAkl/AAJJgAACSYIAAkmDAAJJwgACScQAAknGAAJJyAACScsAAknMAAJJzQACSc4AAknPAAJJ0QACSdMAAknUAAJJ1QACSdcAAknYAAJKFwACShkAAkobAAJKHQACSiAAAkohAAJKIgACSiMAAkokAAJKJgACSigAAkopAAJKKgACSiwAAkotAAJKeAACSpsAAkq7AAJK2wACSt0AAkrfAAJK4QACSuMAAkrmAAJK5wACSugAAkrrAAJK7AACSu4AAkrvAAJK8QACSvQAAkr1AAJK9gACSvkAAkr6AAJK/wACSwwAAksRAAJLEwACSxUAAksaAAJLHQACSyAAAksiAAJLRwACS2sAAkuSAAJLtgACS7kAAku7AAJLvQACS78AAkvBAAJLwwACS8QAAkvHAAJL1AACS+UAAkvnAAJL6QACS+sAAkvtAAJL7wACS/EAAkvzAAJL9QACTAYAAkwJAAJMDAACTA8AAkwSAAJMFQACTBgAAkwbAAJMHgACTCAAAkxfAAJMYQACTGMAAkxlAAJMaAACTGkAAkxqAAJMawACTGwAAkxuAAJMcAACTHEAAkxyAAJMdAACTHUAAky0AAJMtgACTLgAAky6AAJMvQACTL4AAky/AAJMwAACTMEAAkzDAAJMxQACTMYAAkzHAAJMyQACTMoAAk0JAAJNCwACTQ4AAk0QAAJNEwACTRQAAk0VAAJNFgACTRcAAk0ZAAJNGwACTRwAAk0dAAJNHwACTSAAAk0tAAJNLgACTS8AAk0xAAJNcAACTXIAAk10AAJNdgACTXkAAk16AAJNewACTXwAAk19AAJNfwACTYEAAk2CAAJNgwACTYUAAk2GAAJNxQACTccAAk3JAAJNywACTc4AAk3PAAJN0AACTdEAAk3SAAJN1AACTdYAAk3XAAJN2AACTdoAAk3bAAJOGgACThwAAk4eAAJOIAACTiMAAk4kAAJOJQACTiYAAk4nAAJOKQACTisAAk4sAAJOLQACTi8AAk4wAAJObwACTnEAAk5zAAJOdQACTngAAk55AAJOegACTnsAAk58AAJOfgACToAAAk6BAAJOggACToQAAk6FAAJOxAACTsYAAk7IAAJOygACTs0AAk7OAAJOzwACTtAAAk7RAAJO0wACTtUAAk7WAAJO1wACTtkAAk7aAAJO/wACTyMAAk9KAAJPbgACT3EAAk9zAAJPdQACT3cAAk95AAJPewACT3wAAk9/AAJPjAACT5sAAk+dAAJPnwACT6EAAk+jAAJPpQACT6cAAk+pAAJPuAACT7sAAk++AAJPwQACT8QAAk/HAAJPygACT80AAk/PAAJQDgACUBAAAlATAAJQFQACUBgAAlAZAAJQGgACUBsAAlAcAAJQHgACUCAAAlAhAAJQIgACUCQAAlAlAAJQKAACUGcAAlBpAAJQawACUG0AAlBwAAJQcQACUHIAAlBzAAJQdAACUHYAAlB4AAJQeQACUHoAAlB8AAJQfQACULwAAlC+AAJQwAACUMIAAlDFAAJQxgACUMcAAlDIAAJQyQACUMsAAlDNAAJQzgACUM8AAlDRAAJQ0gACUREAAlETAAJRFgACURgAAlEbAAJRHAACUR0AAlEeAAJRHwACUSEAAlEjAAJRJAACUSUAAlEnAAJRKAACUWcAAlFpAAJRbAACUW4AAlFxAAJRcgACUXMAAlF0AAJRdQACUXcAAlF5AAJRegACUXsAAlF9AAJRfgACUYIAAlHBAAJRwwACUcUAAlHHAAJRygACUcsAAlHMAAJRzQACUc4AAlHQAAJR0gACUdMAAlHUAAJR1gACUdcAAlIWAAJSGAACUhoAAlIcAAJSHwACUiAAAlIhAAJSIgACUiMAAlIlAAJSJwACUigAAlIpAAJSKwACUiwAAlJ3AAJSmgACUroAAlLaAAJS3AACUt4AAlLgAAJS4gACUuUAAlLmAAJS5wACUuoAAlLrAAJS7QACUu4AAlLwAAJS8wACUvQAAlL1AAJS+AACUvkAAlL+AAJTCwACUxAAAlMSAAJTFAACUxkAAlMcAAJTHwACUyEAAlNGAAJTagACU5EAAlO1AAJTuAACU7oAAlO8AAJTvgACU8AAAlPCAAJTwwACU8YAAlPTAAJT5AACU+YAAlPoAAJT6gACU+wAAlPuAAJT8AACU/IAAlP0AAJUBQACVAgAAlQLAAJUDgACVBEAAlQUAAJUFwACVBoAAlQdAAJUHwACVF4AAlRgAAJUYgACVGQAAlRnAAJUaAACVGkAAlRqAAJUawACVG0AAlRvAAJUcAACVHEAAlRzAAJUdAACVLMAAlS1AAJUtwACVLkAAlS8AAJUvQACVL4AAlS/AAJUwAACVMIAAlTEAAJUxQACVMYAAlTIAAJUyQACVQgAAlUKAAJVDQACVQ8AAlUSAAJVEwACVRQAAlUVAAJVFgACVRgAAlUaAAJVGwACVRwAAlUeAAJVHwACVSwAAlUtAAJVLgACVTAAAlVvAAJVcQACVXMAAlV1AAJVeAACVXkAAlV6AAJVewACVXwAAlV+AAJVgAACVYEAAlWCAAJVhAACVYUAAlXEAAJVxgACVcgAAlXKAAJVzQACVc4AAlXPAAJV0AACVdEAAlXTAAJV1QACVdYAAlXXAAJV2QACVdoAAlYZAAJWGwACVh0AAlYfAAJWIgACViMAAlYkAAJWJQACViYAAlYoAAJWKgACVisAAlYsAAJWLgACVi8AAlZuAAJWcAACVnIAAlZ0AAJWdwACVngAAlZ5AAJWegACVnsAAlZ9AAJWfwACVoAAAlaBAAJWgwACVoQAAlbDAAJWxQACVscAAlbJAAJWzAACVs0AAlbOAAJWzwACVtAAAlbSAAJW1AACVtUAAlbWAAJW2AACVtkAAlb+AAJXIgACV0kAAldtAAJXcAACV3IAAld0AAJXdgACV3gAAld6AAJXewACV34AAleLAAJXmgACV5wAAleeAAJXoAACV6IAAlekAAJXpgACV6gAAle3AAJXugACV70AAlfAAAJXwwACV8YAAlfJAAJXzAACV84AAlgNAAJYDwACWBIAAlgUAAJYFwACWBgAAlgZAAJYGgACWBsAAlgdAAJYHwACWCAAAlghAAJYIwACWCQAAlhjAAJYZQACWGcAAlhpAAJYbAACWG0AAlhuAAJYbwACWHAAAlhyAAJYdAACWHUAAlh2AAJYeAACWHkAAli4AAJYugACWLwAAli+AAJYwQACWMIAAljDAAJYxAACWMUAAljHAAJYyQACWMoAAljLAAJYzQACWM4AAlkNAAJZDwACWRIAAlkUAAJZFwACWRgAAlkZAAJZGgACWRsAAlkdAAJZHwACWSAAAlkhAAJZIwACWSQAAlljAAJZZQACWWgAAllqAAJZbQACWW4AAllvAAJZcAACWXEAAllzAAJZdQACWXYAAll3AAJZeQACWXoAAlm5AAJZuwACWb0AAlm/AAJZwgACWcMAAlnEAAJZxQACWcYAAlnIAAJZygACWcsAAlnMAAJZzgACWc8AAloOAAJaEAACWhIAAloUAAJaFwACWhgAAloZAAJaGgACWhsAAlodAAJaHwACWiAAAlohAAJaIwACWiQAAlpvAAJakgACWrIAAlrSAAJa1AACWtYAAlrYAAJa2gACWt0AAlreAAJa3wACWuIAAlrjAAJa5QACWuYAAlrpAAJa7AACWu0AAlruAAJa8QACWvIAAlr3AAJbBAACWwkAAlsLAAJbDgACWxMAAlsWAAJbGQACWxsAAltAAAJbZAACW4sAAluvAAJbsgACW7QAAlu2AAJbuAACW7oAAlu8AAJbvQACW8AAAlvNAAJb3gACW+AAAlviAAJb5AACW+YAAlvoAAJb6gACW+wAAlvuAAJb/wACXAIAAlwFAAJcCAACXAsAAlwOAAJcEQACXBQAAlwXAAJcGQACXFgAAlxaAAJcXAACXF4AAlxhAAJcYgACXGMAAlxkAAJcZQACXGcAAlxpAAJcagACXGsAAlxtAAJcbgACXK0AAlyvAAJcsQACXLMAAly2AAJctwACXLgAAly5AAJcugACXLwAAly+AAJcvwACXMAAAlzCAAJcwwACXQIAAl0EAAJdBwACXQkAAl0MAAJdDQACXQ4AAl0PAAJdEAACXRIAAl0UAAJdFQACXRYAAl0YAAJdGQACXSYAAl0nAAJdKAACXSoAAl1pAAJdawACXW0AAl1vAAJdcgACXXMAAl10AAJddQACXXYAAl14AAJdegACXXsAAl18AAJdfgACXX8AAl2+AAJdwAACXcIAAl3EAAJdxwACXcgAAl3JAAJdygACXcsAAl3NAAJdzwACXdAAAl3RAAJd0wACXdQAAl4TAAJeFQACXhcAAl4ZAAJeHAACXh0AAl4eAAJeHwACXiAAAl4iAAJeJAACXiUAAl4mAAJeKAACXikAAl5oAAJeagACXmwAAl5uAAJecQACXnIAAl5zAAJedAACXnUAAl53AAJeeQACXnoAAl57AAJefQACXn4AAl69AAJevwACXsEAAl7DAAJexgACXscAAl7IAAJeyQACXsoAAl7MAAJezgACXs8AAl7QAAJe0gACXtMAAl74AAJfHAACX0MAAl9nAAJfagACX20AAl9vAAJfcQACX3MAAl91AAJfdgACX3kAAl+GAAJflQACX5gAAl+bAAJfngACX6EAAl+kAAJfpwACX6oAAl+5AAJfvAACX78AAl/CAAJfxQACX8gAAl/LAAJfzgACX9AAAmAPAAJgEQACYBQAAmAWAAJgGQACYBoAAmAbAAJgHAACYB0AAmAfAAJgIgACYCMAAmAkAAJgJgACYCcAAmBmAAJgaAACYGsAAmBtAAJgcAACYHEAAmByAAJgcwACYHQAAmB2AAJgeQACYHoAAmB7AAJgfQACYH4AAmC9AAJgvwACYMIAAmDEAAJgxwACYMgAAmDJAAJgygACYMsAAmDNAAJg0AACYNEAAmDSAAJg1AACYNUAAmEUAAJhFgACYRkAAmEbAAJhHgACYR8AAmEgAAJhIQACYSIAAmEkAAJhJwACYSgAAmEpAAJhKwACYSwAAmFrAAJhbQACYW8AAmFxAAJhdAACYXUAAmF2AAJhdwACYXgAAmF6AAJhfQACYX4AAmF/AAJhgQACYYIAAmHBAAJhwwACYcUAAmHHAAJhygACYcsAAmHMAAJhzQACYc4AAmHQAAJh0wACYdQAAmHVAAJh1wACYdgAAmIXAAJiGQACYhwAAmIeAAJiIQACYiIAAmIjAAJiJAACYiUAAmInAAJiKgACYisAAmIsAAJiLgACYi8AAmJ6AAJinQACYr0AAmLdAAJi3wACYuEAAmLjAAJi5QACYugAAmLpAAJi6gACYu0AAmLuAAJi8AACYvEAAmL0AAJi9wACYvgAAmL5AAJi/AACYv0AAmMGAAJjEwACYxgAAmMaAAJjHQACYyIAAmMlAAJjKAACYyoAAmNPAAJjcwACY5oAAmO+AAJjwQACY8MAAmPFAAJjxwACY8kAAmPLAAJjzAACY88AAmPcAAJj7QACY+8AAmPxAAJj8wACY/UAAmP3AAJj+QACY/sAAmP9AAJkDgACZBEAAmQUAAJkFwACZBoAAmQdAAJkIAACZCMAAmQmAAJkKAACZGcAAmRpAAJkawACZG0AAmRwAAJkcQACZHIAAmRzAAJkdAACZHYAAmR4AAJkeQACZHoAAmR8AAJkfQACZLwAAmS+AAJkwAACZMIAAmTFAAJkxgACZMcAAmTIAAJkyQACZMsAAmTNAAJkzgACZM8AAmTRAAJk0gACZREAAmUTAAJlFgACZRgAAmUbAAJlHAACZR0AAmUeAAJlHwACZSEAAmUjAAJlJAACZSUAAmUnAAJlKAACZTUAAmU2AAJlNwACZTkAAmV4AAJlegACZXwAAmV+AAJlgQACZYIAAmWDAAJlhAACZYUAAmWHAAJliQACZYoAAmWLAAJljQACZY4AAmXNAAJlzwACZdEAAmXTAAJl1gACZdcAAmXYAAJl2QACZdoAAmXcAAJl3gACZd8AAmXgAAJl4gACZeMAAmYiAAJmJAACZiYAAmYoAAJmKwACZiwAAmYtAAJmLgACZi8AAmYxAAJmMwACZjQAAmY1AAJmNwACZjgAAmZ3AAJmeQACZnsAAmZ9AAJmgAACZoEAAmaCAAJmgwACZoQAAmaGAAJmiAACZokAAmaKAAJmjAACZo0AAmbMAAJmzgACZtAAAmbSAAJm1QACZtYAAmbXAAJm2AACZtkAAmbbAAJm3QACZt4AAmbfAAJm4QACZuIAAmcHAAJnKwACZ1IAAmd2AAJneQACZ3wAAmd+AAJngAACZ4IAAmeEAAJnhQACZ4gAAmeVAAJnpAACZ6cAAmeqAAJnrQACZ7AAAmezAAJntgACZ7kAAmfIAAJnywACZ84AAmfRAAJn1AACZ9cAAmfaAAJn3QACZ98AAmgeAAJoIAACaCMAAmglAAJoKAACaCkAAmgqAAJoKwACaCwAAmguAAJoMQACaDIAAmgzAAJoNQACaDYAAmh1AAJodwACaHoAAmh8AAJofwACaIAAAmiBAAJoggACaIMAAmiFAAJoiAACaIkAAmiKAAJojAACaI0AAmjMAAJozgACaNEAAmjTAAJo1gACaNcAAmjYAAJo2QACaNoAAmjcAAJo3wACaOAAAmjhAAJo4wACaOQAAmkjAAJpJQACaSgAAmkqAAJpLQACaS4AAmkvAAJpMAACaTEAAmkzAAJpNgACaTcAAmk4AAJpOgACaTsAAml6AAJpfAACaX4AAmmAAAJpgwACaYQAAmmFAAJphgACaYcAAmmJAAJpjAACaY0AAmmOAAJpkAACaZEAAmnQAAJp0gACadQAAmnWAAJp2QACadoAAmnbAAJp3AACad0AAmnfAAJp4gACaeMAAmnkAAJp5gACaecAAmomAAJqKAACaisAAmotAAJqMAACajEAAmoyAAJqMwACajQAAmo2AAJqOQACajoAAmo7AAJqPQACaj4AAmqJAAJqrAACaswAAmrsAAJq7gACavAAAmryAAJq9AACavcAAmr4AAJq+QACavwAAmr9AAJq/wACawAAAmsCAAJrBQACawYAAmsHAAJrCgACawsAAmsQAAJrHQACayIAAmskAAJrJgACaysAAmsuAAJrMQACazMAAmtYAAJrfAACa6MAAmvHAAJrygACa8wAAmvOAAJr0AACa9IAAmvUAAJr1QACa9gAAmvlAAJr9gACa/gAAmv6AAJr/AACa/4AAmwAAAJsAgACbAQAAmwGAAJsFwACbBoAAmwdAAJsIAACbCMAAmwmAAJsKQACbCwAAmwvAAJsMQACbHAAAmxyAAJsdAACbHYAAmx5AAJsegACbHsAAmx8AAJsfQACbH8AAmyBAAJsggACbIMAAmyFAAJshgACbMUAAmzHAAJsyQACbMsAAmzOAAJszwACbNAAAmzRAAJs0gACbNQAAmzWAAJs1wACbNgAAmzaAAJs2wACbRoAAm0cAAJtHwACbSEAAm0kAAJtJQACbSYAAm0nAAJtKAACbSoAAm0sAAJtLQACbS4AAm0wAAJtMQACbT4AAm0/AAJtQAACbUIAAm2BAAJtgwACbYUAAm2HAAJtigACbYsAAm2MAAJtjQACbY4AAm2QAAJtkgACbZMAAm2UAAJtlgACbZcAAm3WAAJt2AACbdoAAm3cAAJt3wACbeAAAm3hAAJt4gACbeMAAm3lAAJt5wACbegAAm3pAAJt6wACbewAAm4rAAJuLQACbi8AAm4xAAJuNAACbjUAAm42AAJuNwACbjgAAm46AAJuPAACbj0AAm4+AAJuQAACbkEAAm6AAAJuggACboQAAm6GAAJuiQACbooAAm6LAAJujAACbo0AAm6PAAJukQACbpIAAm6TAAJulQACbpYAAm7VAAJu1wACbtkAAm7bAAJu3gACbt8AAm7gAAJu4QACbuIAAm7kAAJu5gACbucAAm7oAAJu6gACbusAAm8QAAJvNAACb1sAAm9/AAJvggACb4QAAm+GAAJviAACb4oAAm+MAAJvjQACb5AAAm+dAAJvrAACb64AAm+wAAJvsgACb7QAAm+2AAJvuAACb7oAAm/JAAJvzAACb88AAm/SAAJv1QACb9gAAm/bAAJv3gACb+AAAnAfAAJwIQACcCQAAnAmAAJwKQACcCoAAnArAAJwLAACcC0AAnAvAAJwMQACcDIAAnAzAAJwNQACcDYAAnB1AAJwdwACcHkAAnB7AAJwfgACcH8AAnCAAAJwgQACcIIAAnCEAAJwhgACcIcAAnCIAAJwigACcIsAAnDKAAJwzAACcM4AAnDQAAJw0wACcNQAAnDVAAJw1gACcNcAAnDZAAJw2wACcNwAAnDdAAJw3wACcOAAAnEfAAJxIQACcSQAAnEmAAJxKQACcSoAAnErAAJxLAACcS0AAnEvAAJxMQACcTIAAnEzAAJxNQACcTYAAnF1AAJxdwACcXoAAnF8AAJxfwACcYAAAnGBAAJxggACcYMAAnGFAAJxhwACcYgAAnGJAAJxiwACcYwAAnHLAAJxzQACcc8AAnHRAAJx1AACcdUAAnHWAAJx1wACcdgAAnHaAAJx3AACcd0AAnHeAAJx4AACceEAAnIgAAJyIgACciQAAnImAAJyKQACcioAAnIrAAJyLAACci0AAnIvAAJyMQACcjIAAnIzAAJyNQACcjYAAnI/AAJyQgACckUAAnJHAAJyTAACcosAAnKNAAJyjwACcpEAAnKUAAJylQACcpYAAnKXAAJymAACcpoAAnKdAAJyngACcp8AAnKhAAJyogACcuEAAnLjAAJy5QACcucAAnLqAAJy6wACcuwAAnLtAAJy7gACcvAAAnLzAAJy9AACcvUAAnL3AAJy+AACczcAAnM5AAJzPAACcz4AAnNBAAJzQgACc0MAAnNEAAJzRQACc0cAAnNKAAJzSwACc0wAAnNOAAJzTwACc5oAAnO9AAJz3QACc/0AAnP/AAJ0AQACdAMAAnQFAAJ0CAACdAkAAnQKAAJ0DQACdA4AAnQQAAJ0EQACdBMAAnQWAAJ0FwACdBgAAnQbAAJ0HAACdCEAAnQuAAJ0MwACdDUAAnQ3AAJ0PAACdD8AAnRCAAJ0RAACdGkAAnSNAAJ0tAACdNgAAnTbAAJ03QACdN8AAnThAAJ04wACdOUAAnTmAAJ06QACdPYAAnUHAAJ1CQACdQsAAnUNAAJ1DwACdREAAnUTAAJ1FQACdRcAAnUoAAJ1KwACdS4AAnUxAAJ1NAACdTcAAnU6AAJ1PQACdUAAAnVCAAJ1gQACdYMAAnWFAAJ1hwACdYoAAnWLAAJ1jAACdY0AAnWOAAJ1kAACdZIAAnWTAAJ1lAACdZYAAnWXAAJ11gACddgAAnXaAAJ13AACdd8AAnXgAAJ14QACdeIAAnXjAAJ15QACdecAAnXoAAJ16QACdesAAnXsAAJ2KwACdi0AAnYwAAJ2MgACdjUAAnY2AAJ2NwACdjgAAnY5AAJ2OwACdj0AAnY+AAJ2PwACdkEAAnZCAAJ2TwACdlAAAnZRAAJ2UwACdpIAAnaUAAJ2lgACdpgAAnabAAJ2nAACdp0AAnaeAAJ2nwACdqEAAnajAAJ2pAACdqUAAnanAAJ2qAACducAAnbpAAJ26wACdu0AAnbwAAJ28QACdvIAAnbzAAJ29AACdvYAAnb4AAJ2+QACdvoAAnb8AAJ2/QACdzwAAnc+AAJ3QAACd0IAAndFAAJ3RgACd0cAAndIAAJ3SQACd0sAAndNAAJ3TgACd08AAndRAAJ3UgACd5EAAneTAAJ3lQACd5cAAneaAAJ3mwACd5wAAnedAAJ3ngACd6AAAneiAAJ3owACd6QAAnemAAJ3pwACd+YAAnfoAAJ36gACd+wAAnfvAAJ38AACd/EAAnfyAAJ38wACd/UAAnf3AAJ3+AACd/kAAnf7AAJ3/AACeCEAAnhFAAJ4bAACeJAAAniTAAJ4lQACeJcAAniZAAJ4mwACeJ0AAnieAAJ4oQACeK4AAni9AAJ4vwACeMEAAnjDAAJ4xQACeMcAAnjJAAJ4ywACeNoAAnjdAAJ44AACeOMAAnjmAAJ46QACeOwAAnjvAAJ48QACeTAAAnkyAAJ5NAACeTYAAnk5AAJ5OgACeTsAAnk8AAJ5PQACeT8AAnlBAAJ5QgACeUMAAnlFAAJ5RgACeYUAAnmHAAJ5iQACeYsAAnmOAAJ5jwACeZAAAnmRAAJ5kgACeZQAAnmWAAJ5lwACeZgAAnmaAAJ5mwACedoAAnncAAJ53gACeeAAAnnjAAJ55AACeeUAAnnmAAJ55wACeekAAnnrAAJ57AACee0AAnnvAAJ58AACei8AAnoxAAJ6MwACejUAAno4AAJ6OQACejoAAno7AAJ6PAACej4AAnpAAAJ6QQACekIAAnpEAAJ6RQACeoQAAnqGAAJ6iAACeooAAnqNAAJ6jgACeo8AAnqQAAJ6kQACepMAAnqVAAJ6lgACepcAAnqZAAJ6mgACetkAAnrbAAJ63QACet8AAnriAAJ64wACeuQAAnrlAAJ65gACeugAAnrqAAJ66wACeuwAAnruAAJ67wACey4AAnswAAJ7MgACezQAAns3AAJ7OAACezkAAns6AAJ7OwACez0AAns/AAJ7QAACe0EAAntDAAJ7RAACe48AAnuyAAJ70gACe/IAAnv0AAJ79gACe/gAAnv6AAJ7/QACe/4AAnv/AAJ8AgACfAMAAnwFAAJ8BgACfAgAAnwLAAJ8DAACfA0AAnwQAAJ8EQACfBYAAnwjAAJ8KAACfCoAAnwsAAJ8MQACfDQAAnw3AAJ8OQACfF4AAnyCAAJ8qQACfM0AAnzQAAJ80gACfNQAAnzWAAJ82AACfNoAAnzbAAJ83gACfOsAAnz8AAJ8/gACfQAAAn0CAAJ9BAACfQYAAn0IAAJ9CgACfQwAAn0dAAJ9IAACfSMAAn0mAAJ9KQACfSwAAn0vAAJ9MgACfTUAAn03AAJ9dgACfXgAAn16AAJ9fAACfX8AAn2AAAJ9gQACfYIAAn2DAAJ9hQACfYcAAn2IAAJ9iQACfYsAAn2MAAJ9ywACfc0AAn3PAAJ90QACfdQAAn3VAAJ91gACfdcAAn3YAAJ92gACfdwAAn3dAAJ93gACfeAAAn3hAAJ+IAACfiIAAn4lAAJ+JwACfioAAn4rAAJ+LAACfi0AAn4uAAJ+MAACfjIAAn4zAAJ+NAACfjYAAn43AAJ+RAACfkUAAn5GAAJ+SAACfocAAn6JAAJ+iwACfo0AAn6QAAJ+kQACfpIAAn6TAAJ+lAACfpYAAn6YAAJ+mQACfpoAAn6cAAJ+nQACftwAAn7eAAJ+4AACfuIAAn7lAAJ+5gACfucAAn7oAAJ+6QACfusAAn7tAAJ+7gACfu8AAn7xAAJ+8gACfzEAAn8zAAJ/NQACfzcAAn86AAJ/OwACfzwAAn89AAJ/PgACf0AAAn9CAAJ/QwACf0QAAn9GAAJ/RwACf4YAAn+IAAJ/igACf4wAAn+PAAJ/kAACf5EAAn+SAAJ/kwACf5UAAn+XAAJ/mAACf5kAAn+bAAJ/nAACf9sAAn/dAAJ/3wACf+EAAn/kAAJ/5QACf+YAAn/nAAJ/6AACf+oAAn/sAAJ/7QACf+4AAn/wAAJ/8QACgBYAAoA6AAKAYQACgIUAAoCIAAKAigACgIwAAoCOAAKAkAACgJIAAoCTAAKAlgACgKMAAoCyAAKAtAACgLYAAoC4AAKAugACgLwAAoC+AAKAwAACgM8AAoDSAAKA1QACgNgAAoDbAAKA3gACgOEAAoDkAAKA5gACgSUAAoEnAAKBKQACgSsAAoEuAAKBLwACgTAAAoExAAKBMgACgTQAAoE2AAKBNwACgTgAAoE6AAKBOwACgXoAAoF8AAKBfgACgYAAAoGDAAKBhAACgYUAAoGGAAKBhwACgYkAAoGLAAKBjAACgY0AAoGPAAKBkAACgc8AAoHRAAKB0wACgdUAAoHYAAKB2QACgdoAAoHbAAKB3AACgd4AAoHgAAKB4QACgeIAAoHkAAKB5QACgiQAAoImAAKCKAACgioAAoItAAKCLgACgi8AAoIwAAKCMQACgjMAAoI1AAKCNgACgjcAAoI5AAKCOgACgnkAAoJ7AAKCfQACgn8AAoKCAAKCgwACgoQAAoKFAAKChgACgogAAoKKAAKCiwACgowAAoKOAAKCjwACgs4AAoLQAAKC0gACgtQAAoLXAAKC2AACgtkAAoLaAAKC2wACgt0AAoLfAAKC4AACguEAAoLjAAKC5AACgyMAAoMlAAKDJwACgykAAoMsAAKDLQACgy4AAoMvAAKDMAACgzIAAoM0AAKDNQACgzYAAoM4AAKDOQACg4QAAoOnAAKDxwACg+cAAoPpAAKD6wACg+0AAoPvAAKD8gACg/MAAoP0AAKD9wACg/gAAoP6AAKD+wACg/4AAoQBAAKEAgAChAMAAoQGAAKEBwAChAwAAoQZAAKEHgAChCAAAoQjAAKEKAAChCsAAoQuAAKEMAAChFUAAoR5AAKEoAAChMQAAoTHAAKEyQAChMsAAoTNAAKEzwAChNEAAoTSAAKE1QAChOIAAoTzAAKE9QAChPcAAoT5AAKE+wAChP0AAoT/AAKFAQAChQMAAoUUAAKFFwAChRoAAoUdAAKFIAAChSMAAoUmAAKFKQAChSwAAoUuAAKFbQAChW8AAoVxAAKFcwAChXYAAoV3AAKFeAAChXkAAoV6AAKFfAAChX4AAoV/AAKFgAAChYIAAoWDAAKFwgAChcQAAoXGAAKFyAAChcsAAoXMAAKFzQAChc4AAoXPAAKF0QAChdMAAoXUAAKF1QAChdcAAoXYAAKGFwAChhkAAoYcAAKGHgAChiEAAoYiAAKGIwAChiQAAoYlAAKGJwAChikAAoYqAAKGKwAChi0AAoYuAAKGOwAChjwAAoY9AAKGPwAChn4AAoaAAAKGggAChoQAAoaHAAKGiAAChokAAoaKAAKGiwACho0AAoaPAAKGkAAChpEAAoaTAAKGlAAChtMAAobVAAKG1wAChtkAAobcAAKG3QACht4AAobfAAKG4AAChuIAAobkAAKG5QAChuYAAoboAAKG6QAChygAAocqAAKHLAAChy4AAocxAAKHMgAChzMAAoc0AAKHNQAChzcAAoc5AAKHOgAChzsAAoc9AAKHPgACh30AAod/AAKHgQACh4MAAoeGAAKHhwACh4gAAoeJAAKHigACh4wAAoeOAAKHjwACh5AAAoeSAAKHkwACh9IAAofUAAKH1gACh9gAAofbAAKH3AACh90AAofeAAKH3wACh+EAAofjAAKH5AACh+UAAofnAAKH6AACiA0AAogxAAKIWAACiHwAAoh/AAKIggACiIQAAoiGAAKIiAACiIoAAoiLAAKIjgACiJsAAoiqAAKIrQACiLAAAoizAAKItgACiLkAAoi8AAKIvwACiM4AAojRAAKI1AACiNcAAojaAAKI3QACiOAAAojjAAKI5QACiSQAAokmAAKJKQACiSsAAokuAAKJLwACiTAAAokxAAKJMgACiTQAAok3AAKJOAACiTkAAok7AAKJPAACiXsAAol9AAKJgAACiYIAAomFAAKJhgACiYcAAomIAAKJiQACiYsAAomOAAKJjwACiZAAAomSAAKJkwACidIAAonUAAKJ1wACidkAAoncAAKJ3QACid4AAonfAAKJ4AACieIAAonlAAKJ5gACiecAAonpAAKJ6gACiikAAoorAAKKLgACijAAAoozAAKKNAACijUAAoo2AAKKNwACijkAAoo8AAKKPQACij4AAopAAAKKQQACioQAAoqoAAKKzAACiu8AAosWAAKLNgACi10AAouEAAKLpAACi8gAAovsAAKL7gACi/EAAovzAAKL9QACi/cAAov6AAKL/QACi/8AAowBAAKMBAACjAYAAowIAAKMCwACjA4AAowPAAKMFAACjCEAAowkAAKMJgACjCkAAowsAAKMLgACjFMAAox3AAKMngACjMIAAozFAAKMxwACjMkAAozLAAKMzQACjM8AAozQAAKM0wACjOAAAozxAAKM8wACjPUAAoz3AAKM+QACjPsAAoz9AAKM/wACjQEAAo0SAAKNFQACjRgAAo0bAAKNHgACjSEAAo0kAAKNJwACjSoAAo0sAAKNawACjW0AAo1wAAKNcgACjXUAAo12AAKNdwACjXgAAo15AAKNewACjX0AAo1+AAKNfwACjYEAAo2CAAKNiwACjYwAAo2OAAKNzQACjc8AAo3RAAKN0wACjdYAAo3XAAKN2AACjdkAAo3aAAKN3AACjd4AAo3fAAKN4AACjeIAAo3jAAKOIgACjiQAAo4mAAKOKAACjisAAo4sAAKOLQACji4AAo4vAAKOMQACjjMAAo40AAKONQACjjcAAo44AAKOdwACjnkAAo58AAKOfgACjoEAAo6CAAKOgwACjoQAAo6FAAKOhwACjokAAo6KAAKOiwACjo0AAo6OAAKOlwACjpgAAo6aAAKO2QACjtsAAo7dAAKO3wACjuIAAo7jAAKO5AACjuUAAo7mAAKO6AACjuoAAo7rAAKO7AACju4AAo7vAAKPLgACjzAAAo8zAAKPNQACjzgAAo85AAKPOgACjzsAAo88AAKPPgACj0AAAo9BAAKPQgACj0QAAo9FAAKPUgACj1MAAo9UAAKPVgACj5UAAo+XAAKPmQACj5sAAo+eAAKPnwACj6AAAo+hAAKPogACj6QAAo+mAAKPpwACj6gAAo+qAAKPqwACj+oAAo/sAAKP7wACj/EAAo/0AAKP9QACj/YAAo/3AAKP+AACj/oAAo/8AAKP/QACj/4AApAAAAKQAQACkCIAApAvAAKQNgACkDkAApA8AAKQPwACkEYAApBJAAKQTAACkE8AApBRAAKQcQACkIoAApClAAKQ8AACkRMAApEzAAKRUwACkVUAApFXAAKRWQACkVsAApFeAAKRXwACkWAAApFjAAKRZAACkWYAApFnAAKRaQACkWwAApFtAAKRbgACkXEAApFyAAKRdwACkYQAApGJAAKRiwACkY0AApGSAAKRlQACkZgAApGaAAKRvwACkeMAApIKAAKSLgACkjEAApIzAAKSNQACkjcAApI5AAKSOwACkjwAApI/AAKSTAACkl0AApJfAAKSYQACkmMAApJlAAKSZwACkmkAApJrAAKSbQACkn4AApKBAAKShAACkocAApKKAAKSjQACkpAAApKTAAKSlgACkpgAApLXAAKS2QACktsAApLdAAKS4AACkuEAApLiAAKS4wACkuQAApLmAAKS6AACkukAApLqAAKS7AACku0AApMsAAKTLgACkzAAApMyAAKTNQACkzYAApM3AAKTOAACkzkAApM7AAKTPQACkz4AApM/AAKTQQACk0IAApOBAAKTgwACk4YAApOIAAKTiwACk4wAApONAAKTjgACk48AApORAAKTkwACk5QAApOVAAKTlwACk5gAApOlAAKTpgACk6cAApOpAAKT6AACk+oAApPsAAKT7gACk/EAApPyAAKT8wACk/QAApP1AAKT9wACk/kAApP6AAKT+wACk/0AApP+AAKUPQAClD8AApRBAAKUQwAClEYAApRHAAKUSAAClEkAApRKAAKUTAAClE4AApRPAAKUUAAClFIAApRTAAKUkgAClJQAApSWAAKUmAAClJsAApScAAKUnQAClJ4AApSfAAKUoQAClKMAApSkAAKUpQAClKcAApSoAAKU5wAClOkAApTrAAKU7QAClPAAApTxAAKU8gAClPMAApT0AAKU9gAClPgAApT5AAKU+gAClPwAApT9AAKVPAAClT4AApVAAAKVQgAClUUAApVGAAKVRwAClUgAApVJAAKVSwAClU0AApVOAAKVTwAClVEAApVSAAKVdwAClZsAApXCAAKV5gAClekAApXrAAKV7QACle8AApXxAAKV8wAClfQAApX3AAKWBAAClhMAApYVAAKWFwAClhkAApYbAAKWHQAClh8AApYhAAKWMAACljMAApY2AAKWOQACljwAApY/AAKWQgAClkUAApZHAAKWhgAClogAApaKAAKWjAAClo8AApaQAAKWkQAClpIAApaTAAKWlQAClpcAApaYAAKWmQAClpsAApacAAKW2wAClt0AApbfAAKW4QACluQAApblAAKW5gAClucAApboAAKW6gACluwAApbtAAKW7gAClvAAApbxAAKXMAAClzIAApc0AAKXNgAClzkAApc6AAKXOwAClzwAApc9AAKXPwACl0EAApdCAAKXQwACl0UAApdGAAKXhQACl4cAApeKAAKXjAACl48AApeQAAKXkQACl5IAApeTAAKXlQACl5cAApeYAAKXmQACl5sAApecAAKX2wACl90AApffAAKX4QACl+QAApflAAKX5gACl+cAApfoAAKX6gACl+wAApftAAKX7gACl/AAApfxAAKYMAACmDIAApg0AAKYNgACmDkAApg6AAKYOwACmDwAApg9AAKYPwACmEEAAphCAAKYQwACmEUAAphGAAKYhQACmIcAApiJAAKYiwACmI4AApiPAAKYkAACmJEAApiSAAKYlAACmJYAApiXAAKYmAACmJoAApibAAKY5gACmQkAApkpAAKZSQACmUsAAplNAAKZTwACmVEAAplUAAKZVQACmVYAAplZAAKZWgACmVwAApldAAKZYAACmWMAAplkAAKZZQACmWgAAplpAAKZbgACmXsAApmAAAKZggACmYUAApmKAAKZjQACmZAAApmSAAKZtwACmdsAApoCAAKaJgACmikAAporAAKaLQACmi8AApoxAAKaMwACmjQAApo3AAKaRAACmlUAAppXAAKaWQACmlsAAppdAAKaXwACmmEAAppjAAKaZQACmnYAApp5AAKafAACmn8AApqCAAKahQACmogAApqLAAKajgACmpAAAprPAAKa0QACmtMAAprVAAKa2AACmtkAApraAAKa2wACmtwAApreAAKa4AACmuEAApriAAKa5AACmuUAApskAAKbJgACmygAApsqAAKbLQACmy4AApsvAAKbMAACmzEAApszAAKbNQACmzYAAps3AAKbOQACmzoAApt5AAKbewACm34AApuAAAKbgwACm4QAApuFAAKbhgACm4cAApuJAAKbiwACm4wAApuNAAKbjwACm5AAApudAAKbngACm58AApuhAAKb4AACm+IAApvkAAKb5gACm+kAApvqAAKb6wACm+wAApvtAAKb7wACm/EAApvyAAKb8wACm/UAApv2AAKcNQACnDcAApw5AAKcOwACnD4AApw/AAKcQAACnEEAApxCAAKcRAACnEYAApxHAAKcSAACnEoAApxLAAKcigACnIwAApyOAAKckAACnJMAApyUAAKclQACnJYAApyXAAKcmQACnJsAApycAAKcnQACnJ8AApygAAKc3wACnOEAApzjAAKc5QACnOgAApzpAAKc6gACnOsAApzsAAKc7gACnPAAApzxAAKc8gACnPQAApz1AAKdNAACnTYAAp04AAKdOgACnT0AAp0+AAKdPwACnUAAAp1BAAKdQwACnUUAAp1GAAKdRwACnUkAAp1KAAKdbwACnZMAAp26AAKd3gACneEAAp3kAAKd5gACnegAAp3qAAKd7AACne0AAp3wAAKd/QACngwAAp4PAAKeEgACnhUAAp4YAAKeGwACnh4AAp4hAAKeMAACnjMAAp42AAKeOQACnjwAAp4/AAKeQgACnkUAAp5HAAKehgACnogAAp6LAAKejQACnpAAAp6RAAKekgACnpMAAp6UAAKelgACnpkAAp6aAAKemwACnp0AAp6eAAKe3QACnt8AAp7iAAKe5AACnucAAp7oAAKe6QACnuoAAp7rAAKe7QACnvAAAp7xAAKe8gACnvQAAp71AAKfNAACnzYAAp85AAKfOwACnz4AAp8/AAKfQAACn0EAAp9CAAKfRAACn0cAAp9IAAKfSQACn0sAAp9MAAKfiwACn40AAp+QAAKfkgACn5UAAp+WAAKflwACn5gAAp+ZAAKfmwACn54AAp+fAAKfoAACn6IAAp+jAAKf4gACn+QAAp/mAAKf6AACn+sAAp/sAAKf7QACn+4AAp/vAAKf8QACn/QAAp/1AAKf9gACn/gAAp/5AAKgOAACoDoAAqA8AAKgPgACoEEAAqBCAAKgQwACoEQAAqBFAAKgRwACoEoAAqBLAAKgTAACoE4AAqBPAAKgjgACoJAAAqCTAAKglQACoJgAAqCZAAKgmgACoJsAAqCcAAKgngACoKEAAqCiAAKgowACoKUAAqCmAAKg8QACoRQAAqE0AAKhVAACoVYAAqFYAAKhWgACoVwAAqFfAAKhYAACoWEAAqFkAAKhZQACoWcAAqFoAAKhagACoW0AAqFuAAKhbwACoXIAAqFzAAKheAACoYUAAqGKAAKhjAACoY4AAqGTAAKhlgACoZkAAqGbAAKhwAACoeQAAqILAAKiLwACojIAAqI0AAKiNgACojgAAqI6AAKiPAACoj0AAqJAAAKiTQACol4AAqJgAAKiYgAComQAAqJmAAKiaAAComoAAqJsAAKibgACon8AAqKCAAKihQACoogAAqKLAAKijgACopEAAqKUAAKilwACopkAAqLYAAKi2gACotwAAqLeAAKi4QACouIAAqLjAAKi5AACouUAAqLnAAKi6QACouoAAqLrAAKi7QACou4AAqMtAAKjLwACozEAAqMzAAKjNgACozcAAqM4AAKjOQACozoAAqM8AAKjPgACoz8AAqNAAAKjQgACo0MAAqOCAAKjhAACo4cAAqOJAAKjjAACo40AAqOOAAKjjwACo5AAAqOSAAKjlAACo5UAAqOWAAKjmAACo5kAAqOmAAKjpwACo6gAAqOqAAKj6QACo+sAAqPtAAKj7wACo/IAAqPzAAKj9AACo/UAAqP2AAKj+AACo/oAAqP7AAKj/AACo/4AAqP/AAKkPgACpEAAAqRCAAKkRAACpEcAAqRIAAKkSQACpEoAAqRLAAKkTQACpE8AAqRQAAKkUQACpFMAAqRUAAKkkwACpJUAAqSXAAKkmQACpJwAAqSdAAKkngACpJ8AAqSgAAKkogACpKQAAqSlAAKkpgACpKgAAqSpAAKk6AACpOoAAqTsAAKk7gACpPEAAqTyAAKk8wACpPQAAqT1AAKk9wACpPkAAqT6AAKk+wACpP0AAqT+AAKlPQACpT8AAqVBAAKlQwACpUYAAqVHAAKlSAACpUkAAqVKAAKlTAACpU4AAqVPAAKlUAACpVIAAqVTAAKleAACpZwAAqXDAAKl5wACpeoAAqXsAAKl7gACpfAAAqXyAAKl9AACpfUAAqX4AAKmBQACphQAAqYWAAKmGAACphoAAqYcAAKmHgACpiAAAqYiAAKmMQACpjQAAqY3AAKmOgACpj0AAqZAAAKmQwACpkYAAqZIAAKmhwACpokAAqaLAAKmjQACppAAAqaRAAKmkgACppMAAqaUAAKmlgACppgAAqaZAAKmmgACppwAAqadAAKm3AACpt4AAqbgAAKm4gACpuUAAqbmAAKm5wACpugAAqbpAAKm6wACpu0AAqbuAAKm7wACpvEAAqbyAAKnMQACpzMAAqc1AAKnNwACpzoAAqc7AAKnPAACpz0AAqc+AAKnQAACp0IAAqdDAAKnRAACp0YAAqdHAAKnhgACp4gAAqeKAAKnjAACp48AAqeQAAKnkQACp5IAAqeTAAKnlQACp5cAAqeYAAKnmQACp5sAAqecAAKn2wACp90AAqffAAKn4QACp+QAAqflAAKn5gACp+cAAqfoAAKn6gACp+wAAqftAAKn7gACp/AAAqfxAAKoMAACqDIAAqg0AAKoNgACqDkAAqg6AAKoOwACqDwAAqg9AAKoPwACqEEAAqhCAAKoQwACqEUAAqhGAAKohQACqIcAAqiJAAKoiwACqI4AAqiPAAKokAACqJEAAqiSAAKolAACqJYAAqiXAAKomAACqJoAAqibAAKopAACqKUAAqinAAKo5gACqOgAAqjqAAKo7AACqO8AAqjwAAKo8QACqPIAAqjzAAKo9QACqPgAAqj5AAKo+gACqPwAAqj9AAKpPAACqT4AAqlAAAKpQgACqUUAAqlGAAKpRwACqUgAAqlJAAKpSwACqU4AAqlPAAKpUAACqVIAAqlTAAKpkgACqZQAAqmXAAKpmQACqZwAAqmdAAKpngACqZ8AAqmgAAKpogACqaUAAqmmAAKppwACqakAAqmqAAKp9QACqhgAAqo4AAKqWAACqloAAqpcAAKqXgACqmAAAqpjAAKqZAACqmUAAqpoAAKqaQACqmsAAqpsAAKqbgACqnEAAqpyAAKqcwACqnYAAqp3AAKqfAACqokAAqqOAAKqkAACqpIAAqqXAAKqmgACqp0AAqqfAAKqxAACqugAAqsPAAKrMwACqzYAAqs4AAKrOgACqzwAAqs+AAKrQAACq0EAAqtEAAKrUQACq2IAAqtkAAKrZgACq2gAAqtqAAKrbAACq24AAqtwAAKrcgACq4MAAquGAAKriQACq4wAAquPAAKrkgACq5UAAquYAAKrmwACq50AAqvcAAKr3gACq+AAAqviAAKr5QACq+YAAqvnAAKr6AACq+kAAqvrAAKr7QACq+4AAqvvAAKr8QACq/IAAqwxAAKsMwACrDUAAqw3AAKsOgACrDsAAqw8AAKsPQACrD4AAqxAAAKsQgACrEMAAqxEAAKsRgACrEcAAqyGAAKsiAACrIsAAqyNAAKskAACrJEAAqySAAKskwACrJQAAqyWAAKsmAACrJkAAqyaAAKsnAACrJ0AAqyqAAKsqwACrKwAAqyuAAKs7QACrO8AAqzxAAKs8wACrPYAAqz3AAKs+AACrPkAAqz6AAKs/AACrP4AAqz/AAKtAAACrQIAAq0DAAKtQgACrUQAAq1GAAKtSAACrUsAAq1MAAKtTQACrU4AAq1PAAKtUQACrVMAAq1UAAKtVQACrVcAAq1YAAKtlwACrZkAAq2bAAKtnQACraAAAq2hAAKtogACraMAAq2kAAKtpgACragAAq2pAAKtqgACrawAAq2tAAKt7AACre4AAq3wAAKt8gACrfUAAq32AAKt9wACrfgAAq35AAKt+wACrf0AAq3+AAKt/wACrgEAAq4CAAKuQQACrkMAAq5FAAKuRwACrkoAAq5LAAKuTAACrk0AAq5OAAKuUAACrlIAAq5TAAKuVAACrlYAAq5XAAKufAACrqAAAq7HAAKu6wACru4AAq7wAAKu8gACrvQAAq72AAKu+AACrvkAAq78AAKvCQACrxgAAq8aAAKvHAACrx4AAq8gAAKvIgACryQAAq8mAAKvNQACrzgAAq87AAKvPgACr0EAAq9EAAKvRwACr0oAAq9MAAKviwACr40AAq+PAAKvkQACr5QAAq+VAAKvlgACr5cAAq+YAAKvmgACr5wAAq+dAAKvngACr6AAAq+hAAKv4AACr+IAAq/kAAKv5gACr+kAAq/qAAKv6wACr+wAAq/tAAKv7wACr/EAAq/yAAKv8wACr/UAAq/2AAKwNQACsDcAArA5AAKwOwACsD4AArA/AAKwQAACsEEAArBCAAKwRAACsEYAArBHAAKwSAACsEoAArBLAAKwigACsIwAArCOAAKwkAACsJMAArCUAAKwlQACsJYAArCXAAKwmQACsJsAArCcAAKwnQACsJ8AArCgAAKw3wACsOEAArDjAAKw5QACsOgAArDpAAKw6gACsOsAArDsAAKw7gACsPAAArDxAAKw8gACsPQAArD1AAKxNAACsTYAArE4AAKxOgACsT0AArE+AAKxPwACsUAAArFBAAKxQwACsUUAArFGAAKxRwACsUkAArFKAAKxiQACsYsAArGNAAKxjwACsZIAArGTAAKxlAACsZUAArGWAAKxmAACsZoAArGbAAKxnAACsZ4AArGfAAKx6gACsg0AArItAAKyTQACsk8AArJRAAKyUwACslUAArJYAAKyWQACsloAArJdAAKyXgACsmAAArJhAAKyYwACsmYAArJnAAKyaAACsmsAArJsAAKycQACsn4AArKDAAKyhQACsocAArKMAAKyjwACspIAArKUAAKyuQACst0AArMEAAKzKAACsysAArMtAAKzLwACszEAArMzAAKzNQACszYAArM5AAKzRgACs1cAArNZAAKzWwACs10AArNfAAKzYQACs2MAArNlAAKzZwACs3gAArN7AAKzfgACs4EAArOEAAKzhwACs4oAArONAAKzkAACs5IAArPRAAKz0wACs9UAArPXAAKz2gACs9sAArPcAAKz3QACs94AArPgAAKz4gACs+MAArPkAAKz5gACs+cAArQmAAK0KAACtCoAArQsAAK0LwACtDAAArQxAAK0MgACtDMAArQ1AAK0NwACtDgAArQ5AAK0OwACtDwAArR7AAK0fQACtIAAArSCAAK0hQACtIYAArSHAAK0iAACtIkAArSLAAK0jQACtI4AArSPAAK0kQACtJIAArSfAAK0oAACtKEAArSjAAK04gACtOQAArTmAAK06AACtOsAArTsAAK07QACtO4AArTvAAK08QACtPMAArT0AAK09QACtPcAArT4AAK1NwACtTkAArU7AAK1PQACtUAAArVBAAK1QgACtUMAArVEAAK1RgACtUgAArVJAAK1SgACtUwAArVNAAK1jAACtY4AArWQAAK1kgACtZUAArWWAAK1lwACtZgAArWZAAK1mwACtZ0AArWeAAK1nwACtaEAArWiAAK14QACteMAArXlAAK15wACteoAArXrAAK17AACte0AArXuAAK18AACtfIAArXzAAK19AACtfYAArX3AAK2NgACtjgAArY6AAK2PAACtj8AArZAAAK2QQACtkIAArZDAAK2RQACtkcAArZIAAK2SQACtksAArZMAAK2cQACtpUAAra8AAK24AACtuMAArblAAK25wACtukAArbrAAK27QACtu4AArbxAAK2/gACtw0AArcPAAK3EQACtxMAArcVAAK3FwACtxkAArcbAAK3KgACty0AArcwAAK3MwACtzYAArc5AAK3PAACtz8AArdBAAK3gAACt4IAAreEAAK3hgACt4kAAreKAAK3iwACt4wAAreNAAK3jwACt5EAAreSAAK3kwACt5UAAreWAAK31QACt9cAArfZAAK32wACt94AArffAAK34AACt+EAArfiAAK35AACt+YAArfnAAK36AACt+oAArfrAAK4KgACuCwAArguAAK4MAACuDMAArg0AAK4NQACuDYAArg3AAK4OQACuDsAArg8AAK4PQACuD8AArhAAAK4fwACuIEAAriEAAK4hgACuIkAAriKAAK4iwACuIwAAriNAAK4jwACuJEAAriSAAK4kwACuJUAAriWAAK41QACuNcAArjZAAK42wACuN4AArjfAAK44AACuOEAArjiAAK45AACuOYAArjnAAK46AACuOoAArjrAAK5KgACuSwAArkuAAK5MAACuTMAArk0AAK5NQACuTYAArk3AAK5OQACuTsAArk8AAK5PQACuT8AArlAAAK5fwACuYEAArmDAAK5hQACuYgAArmJAAK5igACuYsAArmMAAK5jgACuZAAArmRAAK5kgACuZQAArmVAAK54AACugMAArojAAK6QwACukUAArpHAAK6SQACuksAArpOAAK6TwACulAAArpTAAK6VAACulYAArpXAAK6WgACul0AArpeAAK6XwACumIAArpjAAK6aAACunUAArp6AAK6fAACun8AArqEAAK6hwACuooAArqMAAK6sQACutUAArr8AAK7IAACuyMAArslAAK7JwACuykAArsrAAK7LQACuy4AArsxAAK7PgACu08AArtRAAK7UwACu1UAArtXAAK7WQACu1sAArtdAAK7XwACu3AAArtzAAK7dgACu3kAArt8AAK7fwACu4IAAruFAAK7iAACu4oAArvJAAK7ywACu80AArvPAAK70gACu9MAArvUAAK71QACu9YAArvYAAK72gACu9sAArvcAAK73gACu98AArweAAK8IAACvCIAArwkAAK8JwACvCgAArwpAAK8KgACvCsAArwtAAK8LwACvDAAArwxAAK8MwACvDQAArxzAAK8dQACvHgAArx6AAK8fQACvH4AArx/AAK8gAACvIEAAryDAAK8hQACvIYAAryHAAK8iQACvIoAAryXAAK8mAACvJkAArybAAK82gACvNwAArzeAAK84AACvOMAArzkAAK85QACvOYAArznAAK86QACvOsAArzsAAK87QACvO8AArzwAAK9LwACvTEAAr0zAAK9NQACvTgAAr05AAK9OgACvTsAAr08AAK9PgACvUAAAr1BAAK9QgACvUQAAr1FAAK9hAACvYYAAr2IAAK9igACvY0AAr2OAAK9jwACvZAAAr2RAAK9kwACvZUAAr2WAAK9lwACvZkAAr2aAAK92QACvdsAAr3dAAK93wACveIAAr3jAAK95AACveUAAr3mAAK96AACveoAAr3rAAK97AACve4AAr3vAAK+LgACvjAAAr4yAAK+NAACvjcAAr44AAK+OQACvjoAAr47AAK+PQACvj8AAr5AAAK+QQACvkMAAr5EAAK+aQACvo0AAr60AAK+2AACvtsAAr7eAAK+4AACvuIAAr7kAAK+5gACvucAAr7qAAK+9wACvwYAAr8JAAK/DAACvw8AAr8SAAK/FQACvxgAAr8bAAK/KgACvy0AAr8wAAK/MwACvzYAAr85AAK/PAACvz8AAr9BAAK/gAACv4IAAr+FAAK/hwACv4oAAr+LAAK/jAACv40AAr+OAAK/kAACv5MAAr+UAAK/lQACv5cAAr+YAAK/1wACv9kAAr/cAAK/3gACv+EAAr/iAAK/4wACv+QAAr/lAAK/5wACv+oAAr/rAAK/7AACv+4AAr/vAALALgACwDAAAsAzAALANQACwDgAAsA5AALAOgACwDsAAsA8AALAPgACwEEAAsBCAALAQwACwEUAAsBGAALAhQACwIcAAsCKAALAjAACwI8AAsCQAALAkQACwJIAAsCTAALAlQACwJgAAsCZAALAmgACwJwAAsCdAALA3AACwN4AAsDgAALA4gACwOUAAsDmAALA5wACwOgAAsDpAALA6wACwO4AAsDvAALA8AACwPIAAsDzAALBMgACwTQAAsE2AALBOAACwTsAAsE8AALBPQACwT4AAsE/AALBQQACwUQAAsFFAALBRgACwUgAAsFJAALBiAACwYoAAsGNAALBjwACwZIAAsGTAALBlAACwZUAAsGWAALBmAACwZsAAsGcAALBnQACwZ8AAsGgAALB6wACwg4AAsIuAALCTgACwlAAAsJSAALCVAACwlYAAsJZAALCWgACwlsAAsJeAALCXwACwmEAAsJiAALCZAACwmcAAsJoAALCaQACwmwAAsJtAALCcgACwn8AAsKEAALChgACwogAAsKNAALCkAACwpMAAsKVAALCugACwt4AAsMFAALDKQACwywAAsMuAALDMAACwzIAAsM0AALDNgACwzcAAsM6AALDRwACw1gAAsNaAALDXAACw14AAsNgAALDYgACw2QAAsNmAALDaAACw3kAAsN8AALDfwACw4IAAsOFAALDiAACw4sAAsOOAALDkQACw5MAAsPSAALD1AACw9YAAsPYAALD2wACw9wAAsPdAALD3gACw98AAsPhAALD4wACw+QAAsPlAALD5wACw+gAAsQnAALEKQACxCsAAsQtAALEMAACxDEAAsQyAALEMwACxDQAAsQ2AALEOAACxDkAAsQ6AALEPAACxD0AAsR8AALEfgACxIEAAsSDAALEhgACxIcAAsSIAALEiQACxIoAAsSMAALEjgACxI8AAsSQAALEkgACxJMAAsSgAALEoQACxKIAAsSkAALE4wACxOUAAsTnAALE6QACxOwAAsTtAALE7gACxO8AAsTwAALE8gACxPQAAsT1AALE9gACxPgAAsT5AALFOAACxToAAsU8AALFPgACxUEAAsVCAALFQwACxUQAAsVFAALFRwACxUkAAsVKAALFSwACxU0AAsVOAALFjQACxY8AAsWRAALFkwACxZYAAsWXAALFmAACxZkAAsWaAALFnAACxZ4AAsWfAALFoAACxaIAAsWjAALF4gACxeQAAsXmAALF6AACxesAAsXsAALF7QACxe4AAsXvAALF8QACxfMAAsX0AALF9QACxfcAAsX4AALGNwACxjkAAsY7AALGPQACxkAAAsZBAALGQgACxkMAAsZEAALGRgACxkgAAsZJAALGSgACxkwAAsZNAALGcgACxpYAAsa9AALG4QACxuQAAsbmAALG6AACxuoAAsbsAALG7gACxu8AAsbyAALG/wACxw4AAscQAALHEgACxxQAAscWAALHGAACxxoAAsccAALHKwACxy4AAscxAALHNAACxzcAAsc6AALHPQACx0AAAsdCAALHgQACx4MAAseFAALHhwACx4oAAseLAALHjAACx40AAseOAALHkAACx5IAAseTAALHlAACx5YAAseXAALH1gACx9gAAsfaAALH3AACx98AAsfgAALH4QACx+IAAsfjAALH5QACx+cAAsfoAALH6QACx+sAAsfsAALIKwACyC0AAsgvAALIMQACyDQAAsg1AALINgACyDcAAsg4AALIOgACyDwAAsg9AALIPgACyEAAAshBAALIgAACyIIAAsiFAALIhwACyIoAAsiLAALIjAACyI0AAsiOAALIkAACyJIAAsiTAALIlAACyJYAAsiXAALI1gACyNgAAsjaAALI3AACyN8AAsjgAALI4QACyOIAAsjjAALI5QACyOcAAsjoAALI6QACyOsAAsjsAALJKwACyS0AAskvAALJMQACyTQAAsk1AALJNgACyTcAAsk4AALJOgACyTwAAsk9AALJPgACyUAAAslBAALJgAACyYIAAsmEAALJhgACyYkAAsmKAALJiwACyYwAAsmNAALJjwACyZEAAsmSAALJkwACyZUAAsmWAALJnwACyaAAAsmiAALJ4QACyeMAAsnlAALJ5wACyeoAAsnrAALJ7AACye0AAsnuAALJ8AACyfMAAsn0AALJ9QACyfcAAsn4AALKNwACyjkAAso7AALKPQACykAAAspBAALKQgACykMAAspEAALKRgACykkAAspKAALKSwACyk0AAspOAALKjQACyo8AAsqSAALKlAACypcAAsqYAALKmQACypoAAsqbAALKnQACyqAAAsqhAALKogACyqQAAsqlAALKrgACyrEAAsq0AALKtgACyvkAAssdAALLQQACy2QAAsuLAALLqwACy9IAAsv5AALMGQACzD0AAsxhAALMYwACzGYAAsxoAALMagACzGwAAsxvAALMcgACzHQAAsx2AALMeQACzHsAAsx9AALMgAACzIMAAsyEAALMjQACzJoAAsydAALMnwACzKIAAsylAALMpwACzMwAAszwAALNFwACzTsAAs0+AALNQAACzUIAAs1EAALNRgACzUgAAs1JAALNTAACzVkAAs1qAALNbAACzW4AAs1wAALNcgACzXQAAs12AALNeAACzXoAAs2LAALNjgACzZEAAs2UAALNlwACzZoAAs2dAALNoAACzaMAAs2lAALN5AACzeYAAs3pAALN6wACze4AAs3vAALN8AACzfEAAs3yAALN9AACzfYAAs33AALN+AACzfoAAs37AALOBAACzgUAAs4HAALORgACzkgAAs5KAALOTAACzk8AAs5QAALOUQACzlIAAs5TAALOVQACzlcAAs5YAALOWQACzlsAAs5cAALOmwACzp0AAs6fAALOoQACzqQAAs6lAALOpgACzqcAAs6oAALOqgACzqwAAs6tAALOrgACzrAAAs6xAALO8AACzvIAAs71AALO9wACzvoAAs77AALO/AACzv0AAs7+AALPAAACzwIAAs8DAALPBAACzwYAAs8HAALPEAACzxEAAs8TAALPUgACz1QAAs9WAALPWAACz1sAAs9cAALPXQACz14AAs9fAALPYQACz2MAAs9kAALPZQACz2cAAs9oAALPpwACz6kAAs+sAALPrgACz7EAAs+yAALPswACz7QAAs+1AALPtwACz7kAAs+6AALPuwACz70AAs++AALPywACz8wAAs/NAALPzwAC0A4AAtAQAALQEgAC0BQAAtAXAALQGAAC0BkAAtAaAALQGwAC0B0AAtAfAALQIAAC0CEAAtAjAALQJAAC0GMAAtBlAALQaAAC0GoAAtBtAALQbgAC0G8AAtBwAALQcQAC0HMAAtB1AALQdgAC0HcAAtB5AALQegAC0I4AAtCbAALQ0gAC0NUAAtDYAALQ2wAC0N4AAtDhAALQ5AAC0OcAAtDqAALQ7QAC0PAAAtDzAALQ9gAC0PkAAtD8AALQ/wAC0QIAAtEFAALRCAAC0QsAAtEOAALREQAC0RQAAtEXAALRGgAC0R0AAtEgAALRVwAC0VoAAtFdAALRYAAC0WMAAtFmAALRaQAC0WwAAtFvAALRcgAC0XUAAtF4AALRewAC0X4AAtGBAALRhAAC0YcAAtGKAALRjQAC0ZAAAtGTAALRlgAC0ZkAAtGcAALRnwAC0aIAAtGlAALRpwAC0bYAAtHNAALR5QAC0fIAAtIAAALSCgAC0iIAAtIsAALSPgAC0lUAAtJnAALSfAAC0oYAAtKaAALSpQAC0rwAAtLSAALS5AAC0vIAAtMAAALTCgAC0ykAAtM2AALTQgAC01UAAtNhAALTrAAC088AAtPvAALUDwAC1BEAAtQTAALUFQAC1BcAAtQaAALUGwAC1BwAAtQfAALUIAAC1CIAAtQjAALUJQAC1CgAAtQpAALUKgAC1C0AAtQuAALUMwAC1EAAAtRFAALURwAC1EkAAtROAALUUQAC1FQAAtRWAALUewAC1J8AAtTGAALU6gAC1O0AAtTvAALU8QAC1PMAAtT1AALU9wAC1PgAAtT7AALVCAAC1RkAAtUbAALVHQAC1R8AAtUhAALVIwAC1SUAAtUnAALVKQAC1ToAAtU9AALVQAAC1UMAAtVGAALVSQAC1UwAAtVPAALVUgAC1VQAAtWTAALVlQAC1ZcAAtWZAALVnAAC1Z0AAtWeAALVnwAC1aAAAtWiAALVpAAC1aUAAtWmAALVqAAC1akAAtXoAALV6gAC1ewAAtXuAALV8QAC1fIAAtXzAALV9AAC1fUAAtX3AALV+QAC1foAAtX7AALV/QAC1f4AAtY9AALWPwAC1kIAAtZEAALWRwAC1kgAAtZJAALWSgAC1ksAAtZNAALWTwAC1lAAAtZRAALWUwAC1lQAAtZhAALWYgAC1mMAAtZlAALWpAAC1qYAAtaoAALWqgAC1q0AAtauAALWrwAC1rAAAtaxAALWswAC1rUAAta2AALWtwAC1rkAAta6AALW+QAC1vsAAtb9AALW/wAC1wIAAtcDAALXBAAC1wUAAtcGAALXCAAC1woAAtcLAALXDAAC1w4AAtcPAALXTgAC11AAAtdSAALXVAAC11cAAtdYAALXWQAC11oAAtdbAALXXQAC118AAtdgAALXYQAC12MAAtdkAALXowAC16UAAtenAALXqQAC16wAAtetAALXrgAC168AAtewAALXsgAC17QAAte1AALXtgAC17gAAte5AALX+AAC1/oAAtf8AALX/gAC2AEAAtgCAALYAwAC2AQAAtgFAALYBwAC2AkAAtgKAALYCwAC2A0AAtgOAAL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jRAAC40YAAuNHAALjSAAC40oAAuNLAALjlgAC47kAAuPZAALj+QAC4/sAAuP9AALj/wAC5AEAAuQEAALkBQAC5AYAAuQJAALkCgAC5AwAAuQNAALkDwAC5BIAAuQTAALkFAAC5BcAAuQYAALkHQAC5CoAAuQvAALkMQAC5DMAAuQ4AALkOwAC5D4AAuRAAALkZQAC5IkAAuSwAALk1AAC5NcAAuTZAALk2wAC5N0AAuTfAALk4QAC5OIAAuTlAALk8gAC5QMAAuUFAALlBwAC5QkAAuULAALlDQAC5Q8AAuURAALlEwAC5SQAAuUnAALlKgAC5S0AAuUwAALlMwAC5TYAAuU5AALlPAAC5T4AAuV9AALlfwAC5YEAAuWDAALlhgAC5YcAAuWIAALliQAC5YoAAuWMAALljgAC5Y8AAuWQAALlkgAC5ZMAAuXSAALl1AAC5dYAAuXYAALl2wAC5dwAAuXdAALl3gAC5d8AAuXhAALl4wAC5eQAAuXlAALl5wAC5egAAuYnAALmKQAC5iwAAuYuAALmMQAC5jIAAuYzAALmNAAC5jUAAuY3AALmOQAC5joAAuY7AALmPQAC5j4AAuZLAALmTAAC5k0AAuZPAALmjgAC5pAAAuaSAALmlAAC5pcAAuaYAALmmQAC5poAAuabAALmnQAC5p8AAuagAALmoQAC5qMAAuakAALm4wAC5uUAAubnAALm6QAC5uwAAubtAALm7gAC5u8AAubwAALm8gAC5vQAAub1AALm9gAC5vgAAub5AALnOAAC5zoAAuc8AALnPgAC50EAAudCAALnQwAC50QAAudFAALnRwAC50kAAudKAALnSwAC500AAudOAALnjQAC548AAueRAALnkwAC55YAAueXAALnmAAC55kAAueaAALnnAAC554AAuefAALnoAAC56IAAuejAALn4gAC5+QAAufmAALn6AAC5+sAAufsAALn7QAC5+4AAufvAALn8QAC5/MAAuf0AALn9QAC5/cAAuf4AALoHQAC6EEAAuhoAALojAAC6I8AAuiRAALokwAC6JUAAuiXAALomQAC6JoAAuidAALoqgAC6LkAAui7AALovQAC6L8AAujBAALowwAC6MUAAujHAALo1gAC6NkAAujcAALo3wAC6OIAAujlAALo6AAC6OsAAujtAALpLAAC6S4AAukwAALpMgAC6TUAAuk2AALpNwAC6TgAAuk5AALpOwAC6T0AAuk+AALpPwAC6UEAAulCAALpgQAC6YMAAumFAALphwAC6YoAAumLAALpjAAC6Y0AAumOAALpkAAC6ZIAAumTAALplAAC6ZYAAumXAALp1gAC6dgAAunaAALp3AAC6d8AAungAALp4QAC6eIAAunjAALp5QAC6ecAAunoAALp6QAC6esAAunsAALqKwAC6i0AAuowAALqMgAC6jUAAuo2AALqNwAC6jgAAuo5AALqOwAC6j0AAuo+AALqPwAC6kEAAupCAALqgQAC6oMAAuqFAALqhwAC6ooAAuqLAALqjAAC6o0AAuqOAALqkAAC6pIAAuqTAALqlAAC6pYAAuqXAALq1gAC6tgAAuraAALq3AAC6t8AAurgAALq4QAC6uIAAurjAALq5QAC6ucAAuroAALq6QAC6usAAursAALrKwAC6y0AAusvAALrMQAC6zQAAus1AALrNgAC6zcAAus4AALrOgAC6zwAAus9AALrPgAC60AAAutBAALrjAAC668AAuvPAALr7wAC6/EAAuvzAALr9QAC6/cAAuv6AALr+wAC6/wAAuv/AALsAAAC7AIAAuwDAALsBQAC7AgAAuwJAALsCgAC7A0AAuwOAALsEwAC7CAAAuwlAALsJwAC7CkAAuwuAALsMQAC7DQAAuw2AALsWwAC7H8AAuymAALsygAC7M0AAuzPAALs0QAC7NMAAuzVAALs1wAC7NgAAuzbAALs6AAC7PkAAuz7AALs/QAC7P8AAu0BAALtAwAC7QUAAu0HAALtCQAC7RoAAu0dAALtIAAC7SMAAu0mAALtKQAC7SwAAu0vAALtMgAC7TQAAu1zAALtdQAC7XcAAu15AALtfAAC7X0AAu1+AALtfwAC7YAAAu2CAALthAAC7YUAAu2GAALtiAAC7YkAAu3IAALtygAC7cwAAu3OAALt0QAC7dIAAu3TAALt1AAC7dUAAu3XAALt2QAC7doAAu3bAALt3QAC7d4AAu4dAALuHwAC7iIAAu4kAALuJwAC7igAAu4pAALuKgAC7isAAu4tAALuLwAC7jAAAu4xAALuMwAC7jQAAu5BAALuQgAC7kMAAu5FAALuhAAC7oYAAu6IAALuigAC7o0AAu6OAALujwAC7pAAAu6RAALukwAC7pUAAu6WAALulwAC7pkAAu6aAALu2QAC7tsAAu7dAALu3wAC7uIAAu7jAALu5AAC7uUAAu7mAALu6AAC7uoAAu7rAALu7AAC7u4AAu7vAALvLgAC7zAAAu8yAALvNAAC7zcAAu84AALvOQAC7zoAAu87AALvPQAC7z8AAu9AAALvQQAC70MAAu9EAALvgwAC74UAAu+HAALviQAC74wAAu+NAALvjgAC748AAu+QAALvkgAC75QAAu+VAALvlgAC75gAAu+ZAALv2AAC79oAAu/cAALv3gAC7+EAAu/iAALv4wAC7+QAAu/lAALv5wAC7+kAAu/qAALv6wAC7+0AAu/uAALwEwAC8DcAAvBeAALwggAC8IUAAvCHAALwiQAC8IsAAvCNAALwjwAC8JAAAvCTAALwoAAC8K8AAvCxAALwswAC8LUAAvC3AALwuQAC8LsAAvC9AALwzAAC8M8AAvDSAALw1QAC8NgAAvDbAALw3gAC8OEAAvDjAALxIgAC8SQAAvEmAALxKAAC8SsAAvEsAALxLQAC8S4AAvEvAALxMQAC8TMAAvE0AALxNQAC8TcAAvE4AALxdwAC8XkAAvF7AALxfQAC8YAAAvGBAALxggAC8YMAAvGEAALxhgAC8YgAAvGJAALxigAC8YwAAvGNAALxzAAC8c4AAvHQAALx0gAC8dUAAvHWAALx1wAC8dgAAvHZAALx2wAC8d0AAvHeAALx3wAC8eEAAvHiAALyIQAC8iMAAvImAALyKAAC8isAAvIsAALyLQAC8i4AAvIvAALyMQAC8jMAAvI0AALyNQAC8jcAAvI4AALydwAC8nkAAvJ7AALyfQAC8oAAAvKBAALyggAC8oMAAvKEAALyhgAC8ogAAvKJAALyigAC8owAAvKNAALyzAAC8s4AAvLQAALy0gAC8tUAAvLWAALy1wAC8tgAAvLZAALy2wAC8t0AAvLeAALy3wAC8uEAAvLiAALzIQAC8yMAAvMlAALzJwAC8yoAAvMrAALzLAAC8y0AAvMuAALzMAAC8zIAAvMzAALzNAAC8zYAAvM3AALzggAC86UAAvPFAALz5QAC8+cAAvPpAALz6wAC8+0AAvPwAALz8QAC8/IAAvP1AALz9gAC8/gAAvP5AALz+wAC8/4AAvP/AAL0AAAC9AMAAvQEAAL0CQAC9BYAAvQbAAL0HQAC9B8AAvQkAAL0JwAC9CoAAvQsAAL0UQAC9HUAAvScAAL0wAAC9MMAAvTFAAL0xwAC9MkAAvTLAAL0zQAC9M4AAvTRAAL03gAC9O8AAvTxAAL08wAC9PUAAvT3AAL0+QAC9PsAAvT9AAL0/wAC9RAAAvUTAAL1FgAC9RkAAvUcAAL1HwAC9SIAAvUlAAL1KAAC9SoAAvVpAAL1awAC9W0AAvVvAAL1cgAC9XMAAvV0AAL1dQAC9XYAAvV4AAL1egAC9XsAAvV8AAL1fgAC9X8AAvW+AAL1wAAC9cIAAvXEAAL1xwAC9cgAAvXJAAL1ygAC9csAAvXNAAL1zwAC9dAAAvXRAAL10wAC9dQAAvYTAAL2FQAC9hgAAvYaAAL2HQAC9h4AAvYfAAL2IAAC9iEAAvYjAAL2JQAC9iYAAvYnAAL2KQAC9ioAAvY3AAL2OAAC9jkAAvY7AAL2egAC9nwAAvZ+AAL2gAAC9oMAAvaEAAL2hQAC9oYAAvaHAAL2iQAC9osAAvaMAAL2jQAC9o8AAvaQAAL2zwAC9tEAAvbTAAL21QAC9tgAAvbZAAL22gAC9tsAAvbcAAL23gAC9uAAAvbhAAL24gAC9uQAAvblAAL3JAAC9yYAAvcoAAL3KgAC9y0AAvcuAAL3LwAC9zAAAvcxAAL3MwAC9zUAAvc2AAL3NwAC9zkAAvc6AAL3eQAC93sAAvd9AAL3fwAC94IAAveDAAL3hAAC94UAAveGAAL3iAAC94oAAveLAAL3jAAC944AAvePAAL3zgAC99AAAvfSAAL31AAC99cAAvfYAAL32QAC99oAAvfbAAL33QAC998AAvfgAAL34QAC9+MAAvfkAAL4CQAC+C0AAvhUAAL4eAAC+HsAAvh9AAL4fwAC+IEAAviDAAL4hQAC+IYAAviJAAL4lgAC+KUAAvinAAL4qQAC+KsAAvitAAL4rwAC+LEAAvizAAL4wgAC+MUAAvjIAAL4ywAC+M4AAvjRAAL41AAC+NcAAvjZAAL5GAAC+RoAAvkcAAL5HgAC+SEAAvkiAAL5IwAC+SQAAvklAAL5JwAC+SkAAvkqAAL5KwAC+S0AAvkuAAL5bQAC+W8AAvlxAAL5cwAC+XYAAvl3AAL5eAAC+XkAAvl6AAL5fAAC+X4AAvl/AAL5gAAC+YIAAvmDAAL5wgAC+cQAAvnGAAL5yAAC+csAAvnMAAL5zQAC+c4AAvnPAAL50QAC+dMAAvnUAAL51QAC+dcAAvnYAAL6FwAC+hkAAvobAAL6HQAC+iAAAvohAAL6IgAC+iMAAvokAAL6JgAC+igAAvopAAL6KgAC+iwAAvotAAL6bAAC+m4AAvpwAAL6cgAC+nUAAvp2AAL6dwAC+ngAAvp5AAL6ewAC+n0AAvp+AAL6fwAC+oEAAvqCAAL6wQAC+sMAAvrFAAL6xwAC+soAAvrLAAL6zAAC+s0AAvrOAAL60AAC+tIAAvrTAAL61AAC+tYAAvrXAAL7FgAC+xgAAvsaAAL7HAAC+x8AAvsgAAL7IQAC+yIAAvsjAAL7JQAC+ycAAvsoAAL7KQAC+ysAAvssAAL7dwAC+5oAAvu6AAL72gAC+9wAAvveAAL74AAC++IAAvvlAAL75gAC++cAAvvqAAL76wAC++0AAvvuAAL78AAC+/MAAvv0AAL79QAC+/gAAvv5AAL7/gAC/AsAAvwQAAL8EgAC/BQAAvwZAAL8HAAC/B8AAvwhAAL8RgAC/GoAAvyRAAL8tQAC/LgAAvy6AAL8vAAC/L4AAvzAAAL8wgAC/MMAAvzGAAL80wAC/OQAAvzmAAL86AAC/OoAAvzsAAL87gAC/PAAAvzyAAL89AAC/QUAAv0IAAL9CwAC/Q4AAv0RAAL9FAAC/RcAAv0aAAL9HQAC/R8AAv1eAAL9YAAC/WIAAv1kAAL9ZwAC/WgAAv1pAAL9agAC/WsAAv1tAAL9bwAC/XAAAv1xAAL9cwAC/XQAAv2zAAL9tQAC/bcAAv25AAL9vAAC/b0AAv2+AAL9vwAC/cAAAv3CAAL9xAAC/cUAAv3GAAL9yAAC/ckAAv4IAAL+CgAC/g0AAv4PAAL+EgAC/hMAAv4UAAL+FQAC/hYAAv4YAAL+GgAC/hsAAv4cAAL+HgAC/h8AAv4sAAL+LQAC/i4AAv4wAAL+bwAC/nEAAv5zAAL+dQAC/ngAAv55AAL+egAC/nsAAv58AAL+fgAC/oAAAv6BAAL+ggAC/oQAAv6FAAL+xAAC/sYAAv7IAAL+ygAC/s0AAv7OAAL+zwAC/tAAAv7RAAL+0wAC/tUAAv7WAAL+1wAC/tkAAv7aAAL/GQAC/xsAAv8dAAL/HwAC/yIAAv8jAAL/JAAC/yUAAv8mAAL/KAAC/yoAAv8rAAL/LAAC/y4AAv8vAAL/bgAC/3AAAv9yAAL/dAAC/3cAAv94AAL/eQAC/3oAAv97AAL/fQAC/38AAv+AAAL/gQAC/4MAAv+EAAL/wwAC/8UAAv/HAAL/yQAC/8wAAv/NAAL/zgAC/88AAv/QAAL/0gAC/9QAAv/VAAL/1gAC/9gAAv/ZAAL//gADACIAAwBJAAMAbQADAHAAAwByAAMAdAADAHYAAwB4AAMAegADAHsAAwB+AAMAiwADAJoAAwCcAAMAngADAKAAAwCiAAMApAADAKYAAwCoAAMAtwADALoAAwC9AAMAwAADAMMAAwDGAAMAyQADAMwAAwDOAAMBDQADAQ8AAwERAAMBEwADARYAAwEXAAMBGAADARkAAwEaAAMBHAADAR4AAwEfAAMBIAADASIAAwEjAAMBYgADAWQAAwFmAAMBaAADAWsAAwFsAAMBbQADAW4AAwFvAAMBcQADAXMAAwF0AAMBdQADAXcAAwF4AAMBtwADAbkAAwG7AAMBvQADAcAAAwHBAAMBwgADAcMAAwHEAAMBxgADAcgAAwHJAAMBygADAcwAAwHNAAMCDAADAg4AAwIQAAMCEgADAhUAAwIWAAMCFwADAhgAAwIZAAMCGwADAh0AAwIeAAMCHwADAiEAAwIiAAMCYQADAmMAAwJlAAMCZwADAmoAAwJrAAMCbAADAm0AAwJuAAMCcAADAnIAAwJzAAMCdAADAnYAAwJ3AAMCtgADArgAAwK6AAMCvAADAr8AAwLAAAMCwQADAsIAAwLDAAMCxQADAscAAwLIAAMCyQADAssAAwLMAAMDCwADAw0AAwMPAAMDEQADAxQAAwMVAAMDFgADAxcAAwMYAAMDGgADAxwAAwMdAAMDHgADAyAAAwMhAAMDbAADA48AAwOvAAMDzwADA9EAAwPTAAMD1QADA9cAAwPaAAMD2wADA9wAAwPfAAMD4AADA+IAAwPjAAMD5QADA+gAAwPpAAMD6gADA+0AAwPuAAMD8wADBAAAAwQFAAMEBwADBAkAAwQOAAMEEQADBBQAAwQWAAMEOwADBF8AAwSGAAMEqgADBK0AAwSvAAMEsQADBLMAAwS1AAMEtwADBLgAAwS7AAMEyAADBNkAAwTbAAME3QADBN8AAwThAAME4wADBOUAAwTnAAME6QADBPoAAwT9AAMFAAADBQMAAwUGAAMFCQADBQwAAwUPAAMFEgADBRQAAwVTAAMFVQADBVcAAwVZAAMFXAADBV0AAwVeAAMFXwADBWAAAwViAAMFZAADBWUAAwVmAAMFaAADBWkAAwWoAAMFqgADBawAAwWuAAMFsQADBbIAAwWzAAMFtAADBbUAAwW3AAMFuQADBboAAwW7AAMFvQADBb4AAwX9AAMF/wADBgIAAwYEAAMGBwADBggAAwYJAAMGCgADBgsAAwYNAAMGDwADBhAAAwYRAAMGEwADBhQAAwYhAAMGIgADBiMAAwYlAAMGZAADBmYAAwZoAAMGagADBm0AAwZuAAMGbwADBnAAAwZxAAMGcwADBnUAAwZ2AAMGdwADBnkAAwZ6AAMGuQADBrsAAwa9AAMGvwADBsIAAwbDAAMGxAADBsUAAwbGAAMGyAADBsoAAwbLAAMGzAADBs4AAwbPAAMHDgADBxAAAwcSAAMHFAADBxcAAwcYAAMHGQADBxoAAwcbAAMHHQADBx8AAwcgAAMHIQADByMAAwckAAMHYwADB2UAAwdnAAMHaQADB2wAAwdtAAMHbgADB28AAwdwAAMHcgADB3QAAwd1AAMHdgADB3gAAwd5AAMHuAADB7oAAwe8AAMHvgADB8EAAwfCAAMHwwADB8QAAwfFAAMHxwADB8kAAwfKAAMHywADB80AAwfOAAMH8wADCBcAAwg+AAMIYgADCGUAAwhnAAMIaQADCGsAAwhtAAMIbwADCHAAAwhzAAMIgAADCI8AAwiRAAMIkwADCJUAAwiXAAMImQADCJsAAwidAAMIrAADCK8AAwiyAAMItQADCLgAAwi7AAMIvgADCMEAAwjDAAMJAgADCQQAAwkGAAMJCAADCQsAAwkMAAMJDQADCQ4AAwkPAAMJEQADCRMAAwkUAAMJFQADCRcAAwkYAAMJVwADCVkAAwlbAAMJXQADCWAAAwlhAAMJYgADCWMAAwlkAAMJZgADCWgAAwlpAAMJagADCWwAAwltAAMJrAADCa4AAwmwAAMJsgADCbUAAwm2AAMJtwADCbgAAwm5AAMJuwADCb0AAwm+AAMJvwADCcEAAwnCAAMKAQADCgMAAwoGAAMKCAADCgsAAwoMAAMKDQADCg4AAwoPAAMKEQADChMAAwoUAAMKFQADChcAAwoYAAMKGwADCloAAwpcAAMKXgADCmAAAwpjAAMKZAADCmUAAwpmAAM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V6wADFe0AAxXwAAMV8gADFfUAAxX2AAMV9wADFfgAAxX5AAMV+wADFf0AAxX+AAMV/wADFgEAAxYCAAMWDwADFhAAAxYRAAMWEwADFlIAAxZUAAMWVgADFlgAAxZbAAMWXAADFl0AAxZeAAMWXwADFmEAAxZjAAMWZAADFmUAAxZnAAMWaAADFqcAAxapAAMWqwADFq0AAxawAAMWsQADFrIAAxazAAMWtAADFrYAAxa4AAMWuQADFroAAxa8AAMWvQADFvwAAxb+AAMXAAADFwIAAxcFAAMXBgADFwcAAxcIAAMXCQADFwsAAxcNAAMXDgADFw8AAxcRAAMXEgADF1EAAxdTAAMXVQADF1cAAxdaAAMXWwADF1wAAxddAAMXXgADF2AAAxdiAAMXYwADF2QAAxdmAAMXZwADF6YAAxeoAAMXqgADF6wAAxevAAMXsAADF7EAAxeyAAMXswADF7UAAxe3AAMXuAADF7kAAxe7AAMXvAADF+EAAxgFAAMYLAADGFAAAxhTAAMYVQADGFcAAxhZAAMYWwADGF0AAxheAAMYYQADGG4AAxh9AAMYfwADGIEAAxiDAAMYhQADGIcAAxiJAAMYiwADGJoAAxidAAMYoAADGKMAAximAAMYqQADGKwAAxivAAMYsQADGPAAAxjyAAMY9AADGPYAAxj5AAMY+gADGPsAAxj8AAMY/QADGP8AAxkBAAMZAgADGQMAAxkFAAMZBgADGUUAAxlHAAMZSQADGUsAAxlOAAMZTwADGVAAAxlRAAMZUgADGVQAAxlWAAMZVwADGVgAAxlaAAMZWwADGZoAAxmcAAMZngADGaAAAxmjAAMZpAADGaUAAxmmAAMZpwADGakAAxmrAAMZrAADGa0AAxmvAAMZsAADGe8AAxnxAAMZ9AADGfYAAxn5AAMZ+gADGfsAAxn8AAMZ/QADGf8AAxoBAAMaAgADGgMAAxoFAAMaBgADGkUAAxpHAAMaSQADGksAAxpOAAMaTwADGlAAAxpRAAMaUgADGlQAAxpWAAMaVwADGlgAAxpaAAMaWwADGpoAAxqcAAMangADGqAAAxqjAAMapAADGqUAAxqmAAMapwADGqkAAxqrAAMarAADGq0AAxqvAAMasAADGu8AAxrxAAMa8wADGvUAAxr4AAMa+QADGvoAAxr7AAMa/AADGv4AAxsAAAM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mUwADJpIAAyaUAAMmlgADJpgAAyabAAMmnAADJp0AAyaeAAMmnwADJqEAAyajAAMmpAADJqUAAyanAAMmqAADJucAAybpAAMm6wADJu0AAybwAAMm8QADJvIAAybzAAMm9AADJvYAAyb4AAMm+QADJvoAAyb8AAMm/QADJzwAAyc+AAMnQAADJ0IAAydFAAMnRgADJ0cAAydIAAMnSQADJ0sAAydNAAMnTgADJ08AAydRAAMnUgADJ5EAAyeTAAMnlQADJ5cAAyeaAAMnmwADJ5wAAyedAAMnngADJ6AAAyeiAAMnowADJ6QAAyemAAMnpwADJ8wAAyfwAAMoFwADKDsAAyg+AAMoQAADKEIAAyhEAAMoRgADKEgAAyhJAAMoTAADKFkAAyhoAAMoagADKGwAAyhuAAMocAADKHIAAyh0AAModgADKIUAAyiIAAMoiwADKI4AAyiRAAMolAADKJcAAyiaAAMonAADKNsAAyjdAAMo3wADKOEAAyjkAAMo5QADKOYAAyjnAAMo6AADKOoAAyjsAAMo7QADKO4AAyjwAAMo8QADKTAAAykyAAMpNAADKTYAAyk5AAMpOgADKTsAAyk8AAMpPQADKT8AAylBAAMpQgADKUMAAylFAAMpRgADKYUAAymHAAMpiQADKYsAAymOAAMpjwADKZAAAymRAAMpkgADKZQAAymWAAMplwADKZgAAymaAAMpmwADKdoAAyncAAMp3wADKeEAAynkAAMp5QADKeYAAynnAAMp6AADKeoAAynsAAMp7QADKe4AAynwAAMp8QADKjAAAyoyAAMqNAADKjYAAyo5AAMqOgADKjsAAyo8AAMqPQADKj8AAypBAAMqQgADKkMAAypFAAMqRgADKoUAAyqHAAMqiQADKosAAyqOAAMqjwADKpAAAyqRAAMqkgADKpQAAyqWAAMqlwADKpgAAyqaAAMqmwADKtoAAyrcAAMq3gADKuAAAyrjAAMq5AADKuUAAyrmAAMq5wADKukAAyrrAAMq7AADKu0AAyrvAAMq8AADKzsAAyteAAMrfgADK54AAyugAAMrogADK6QAAyumAAMrqQADK6oAAyurAAMrrgADK68AAyuxAAMrsgADK7QAAyu3AAMruAADK7kAAyu8AAMrvQADK8IAAyvPAAMr1AADK9YAAyvYAAMr3QADK+AAAyvjAAM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3LAADNy4AAzcxAAM3MgADNzMAAzc0AAM3NQADNzcAAzc5AAM3OgADNzsAAzc9AAM3PgADN30AAzd/AAM3gQADN4MAAzeGAAM3hwADN4gAAzeJAAM3igADN4wAAzeOAAM3jwADN5AAAzeSAAM3kwADN7gAAzfcAAM4AwADOCcAAzgqAAM4LAADOC4AAzgwAAM4MgADODQAAzg1AAM4OAADOEUAAzhUAAM4VgADOFgAAzhaAAM4XAADOF4AAzhgAAM4YgADOHEAAzh0AAM4dwADOHoAAzh9AAM4gAADOIMAAziGAAM4iAADOMcAAzjJAAM4ywADOM0AAzjQAAM40QADONIAAzjTAAM41AADONYAAzjYAAM42QADONoAAzjcAAM43QADORwAAzkeAAM5IAADOSIAAzklAAM5JgADOScAAzkoAAM5KQADOSsAAzktAAM5LgADOS8AAzkxAAM5MgADOXEAAzlzAAM5dQADOXcAAzl6AAM5ewADOXwAAzl9AAM5fgADOYAAAzmCAAM5gwADOYQAAzmGAAM5hwADOcYAAznIAAM5ywADOc0AAznQAAM50QADOdIAAznTAAM51AADOdYAAznYAAM52QADOdoAAzncAAM53QADOhwAAzoeAAM6IAADOiIAAzolAAM6JgADOicAAzooAAM6KQADOisAAzotAAM6LgADOi8AAzoxAAM6MgADOnEAAzpzAAM6dQADOncAAzp6AAM6ewADOnwAAzp9AAM6fgADOoAAAzqCAAM6gwADOoQAAzqGAAM6hwADOsYAAzrIAAM6ygADOswAAzrPAAM60AADOtEAAzrSAAM60wADOtUAAzrXAAM62AADOtkAAzrbAAM63AADOycAAztKAAM7agADO4oAAzuMAAM7jgADO5AAAzuSAAM7lQADO5YAAzuXAAM7mgADO5sAAzudAAM7ngADO6AAAzujAAM7pAADO6UAAzuoAAM7qQADO64AAzu7AAM7wAADO8IAAzvEAAM7yQADO8wAAzvPAAM70QADO/YAAzwaAAM8QQADPGUAAzxoAAM8agADPGwAAzxuAAM8cAADPHIAAzxzAAM8dgADPIMAAzyUAAM8lgADPJgAAzyaAAM8nAADPJ4AAzygAAM8ogADPKQAAzy1AAM8uAADPLsAAzy+AAM8wQADPMQAAzzHAAM8ygADPM0AAzzPAAM9DgADPRAAAz0SAAM9FAADPRcAAz0YAAM9GQADPRoAAz0bAAM9HQADPR8AAz0gAAM9IQADPSMAAz0kAAM9YwADPWUAAz1nAAM9aQADPWwAAz1tAAM9bgADPW8AAz1wAAM9cgADPXQAAz11AAM9dgADPXgAAz15AAM9uAADPboAAz29AAM9vwADPcIAAz3DAAM9xAADPcUAAz3GAAM9yAADPcoAAz3LAAM9zAADPc4AAz3PAAM93AADPd0AAz3eAAM94AADPh8AAz4hAAM+IwADPiUAAz4oAAM+KQADPioAAz4rAAM+LAADPi4AAz4wAAM+MQADPjIAAz40AAM+NQADPnQAAz52AAM+eAADPnoAAz59AAM+fgADPn8AAz6AAAM+gQADPoMAAz6FAAM+hgADPocAAz6JAAM+igADPskAAz7LAAM+zQADPs8AAz7SAAM+0wADPtQAAz7VAAM+1gADPtgAAz7aAAM+2wADPtwAAz7eAAM+3wADPx4AAz8gAAM/IgADPyQAAz8nAAM/KAADPykAAz8qAAM/KwADPy0AAz8vAAM/MAADPzEAAz8zAAM/NAADP3MAAz91AAM/dwADP3kAAz98AAM/fQADP34AAz9/AAM/gAADP4IAAz+EAAM/hQADP4YAAz+IAAM/iQADP64AAz/SAAM/+QADQB0AA0AgAANAIgADQCQAA0AmAANAKAADQCoAA0ArAANALgADQDsAA0BKAANATAADQE4AA0BQAANAUgADQFQAA0BWAANAWAADQGcAA0BqAANAbQADQHAAA0BzAANAdgADQHkAA0B8AANAfgADQL0AA0C/AANAwQADQMMAA0DGAANAxwADQMgAA0DJAANAygADQMwAA0DOAANAzwADQNAAA0DSAANA0wADQRIAA0EUAANBFgADQRgAA0EbAANBHAADQR0AA0EeAANBHwADQSEAA0EjAANBJAADQSUAA0EnAANBKAADQWcAA0FpAANBawADQW0AA0FwAANBcQADQXIAA0FzAANBdAADQXYAA0F4AANBeQADQXoAA0F8AANBfQADQbwAA0G+AANBwAADQcIAA0HFAANBxgADQccAA0HIAANByQADQcsAA0HNAANBzgADQc8AA0HRAANB0gADQhEAA0ITAANCFQADQhcAA0IaAANCGwADQhwAA0IdAANCHgADQiAAA0IiAANCIwADQiQAA0ImAANCJwADQmYAA0JoAANCagADQmwAA0JvAANCcAADQnEAA0JyAANCcwADQnUAA0J3AANCeAADQnkAA0J7AANCfAADQrsAA0K9AANCvwADQsEAA0LEAANCxQADQsYAA0LHAANCyAADQsoAA0LMAANCzQADQs4AA0LQAANC0QADQxwAA0M/AANDXwADQ38AA0OBAANDgwADQ4UAA0OHAANDigADQ4sAA0OMAANDjwADQ5AAA0OSAANDkwADQ5UAA0OYAANDmQADQ5oAA0OdAANDngADQ6MAA0OwAANDtQADQ7cAA0O5AANDvgADQ8EAA0PEAANDxgADQ+sAA0QPAANENgADRFoAA0RdAANEXwADRGEAA0RjAANEZQADRGcAA0RoAANEawADRHgAA0SJAANEiwADRI0AA0SPAANEkQADRJMAA0SVAANElwADRJkAA0SqAANErQADRLAAA0SzAANEtgADRLkAA0S8AANEvwADRMIAA0TEAANFAwADRQUAA0UHAANFCQADRQwAA0UNAANFDgADRQ8AA0UQAANFEgADRRQAA0UVAANFFgADRRgAA0UZAANFWAADRVoAA0VcAANFXgADRWEAA0ViAANFYwADRWQAA0VlAANFZwADRWkAA0VqAANFawADRW0AA0VuAANFrQADRa8AA0WyAANFtAADRbcAA0W4AANFuQADRboAA0W7AANFvQADRb8AA0XAAANFwQADRcMAA0XEAANF0QADRdIAA0XTAANF1QADRhQAA0YWAANGGAADRhoAA0YdAANGHgADRh8AA0YgAANGIQADRiMAA0YlAANGJgADRicAA0YpAANGKgADRmkAA0ZrAANGbQADRm8AA0ZyAANGcwADRnQAA0Z1AANGdgADRngAA0Z6AANGewADRnwAA0Z+AANGfwADRr4AA0bAAANGwgADRsQAA0bHAANGyAADRskAA0bKAANGywADRs0AA0bPAANG0AADRtEAA0bTAANG1AADRxMAA0cVAANHFwADRxkAA0ccAANHHQADRx4AA0cfAANHIAADRyIAA0ckAANHJQADRyYAA0coAANHKQADR2gAA0dqAANHbAADR24AA0dxAANHcgADR3MAA0d0AANHdQADR3cAA0d5AANHegADR3sAA0d9AANHfgADR6MAA0fHAANH7gADSBIAA0gVAANIFwADSBkAA0gbAANIHQADSB8AA0ggAANIIwADSDAAA0g/AANIQQADSEMAA0hFAANIRwADSEkAA0hLAANITQADSFwAA0hfAANIYgADSGUAA0hoAANIawADSG4AA0hxAANIcwADSLIAA0i0AANItgADSLgAA0i7AANIvAADSL0AA0i+AANIvwADSMEAA0jDAANIxAADSMUAA0jHAANIyAADSQcAA0kJAANJCwADSQ0AA0kQAANJEQADSRIAA0kTAANJFAADSRYAA0kYAANJGQADSRoAA0kcAANJHQADSVwAA0leAANJYAADSWIAA0llAANJZgADSWcAA0loAANJaQADSWsAA0ltAANJbgADSW8AA0lxAANJcgADSbEAA0mzAANJtQADSbcAA0m6AANJuwADSbwAA0m9AANJvgADScAAA0nCAANJwwADScQAA0nGAANJxwADSgYAA0oIAANKCgADSgwAA0oPAANKEAADShEAA0oSAANKEwADShUAA0oXAANKGAADShkAA0obAANKHAADSlsAA0pdAANKXwADSmEAA0pkAANKZQADSmYAA0pnAANKaAADSmoAA0psAANKbQADSm4AA0pwAANKcQADSrAAA0qyAANKtAADSrYAA0q5AANKugADSrsAA0q8AANKvQADSr8AA0rBAANKwgADSsMAA0rFAANKxgADSxEAA0s0AANLVAADS3QAA0t2AANLeAADS3oAA0t8AANLfwADS4AAA0uBAANLhAADS4UAA0uHAANLiAADS4oAA0uNAANLjgADS48AA0uSAANLkwADS5gAA0ulAANLqgADS6wAA0uuAANLswADS7YAA0u5AANLuwADS+AAA0wEAANMKwADTE8AA0xSAANMVAADTFYAA0xYAANMWgADTFwAA0xdAANMYAADTG0AA0x+AANMgAADTIIAA0yEAANMhgADTIgAA0yKAANMjAADTI4AA0yfAANMogADTKUAA0yoAANMqwADTK4AA0yxAANMtAADTLcAA0y5AANM+AADTPoAA0z8AANM/gADTQEAA00CAANNAwADTQQAA00FAANNBwADTQkAA00KAANNCwADTQ0AA00OAANNTQADTU8AA01RAANNUwADTVYAA01XAANNWAADTVkAA01aAANNXAADTV4AA01fAANNYAADTWIAA01jAANNogADTaQAA02nAANNqQADTawAA02tAANNrgADTa8AA02wAANNsgADTbQAA021AANNtgADTbgAA025AANNxgADTccAA03IAANNygADTgkAA04LAANODQADTg8AA04SAANOEwADThQAA04VAANOFgADThgAA04aAANOGwADThwAA04eAANOHwADTl4AA05gAANOYgADTmQAA05nAANOaAADTmkAA05qAANOawADTm0AA05vAANOcAADTnEAA05zAANOdAADTrMAA061AANOtwADTrkAA068AANOvQADTr4AA06/AANOwAADTsIAA07EAANOxQADTsYAA07IAANOyQADTwgAA08KAANPDAADTw4AA08RAANPEgADTxMAA08UAANPFQADTxcAA08ZAANPGgADTxsAA08dAANPHgADT10AA09fAANPYQADT2MAA09mAANPZwADT2gAA09pAANPagADT2wAA09uAANPbwADT3AAA09yAANPcwADT5gAA0+8AANP4wADUAcAA1AKAANQDAADUA4AA1AQAANQEgADUBQAA1AVAANQGAADUCUAA1A0AANQNgADUDgAA1A6AANQPAADUD4AA1BAAANQQgADUFEAA1BUAANQVwADUFoAA1BdAANQYAADUGMAA1BmAANQaAADUKcAA1CpAANQqwADUK0AA1CwAANQsQADULIAA1CzAANQtAADULYAA1C4AANQuQADULoAA1C8AANQvQADUPwAA1D+AANRAAADUQIAA1EFAANRBgADUQcAA1EIAANRCQADUQsAA1ENAANRDgADUQ8AA1ERAANREgADUVEAA1FTAANRVQADUVcAA1FaAANRWwADUVwAA1FdAANRXgADUWAAA1FiAANRYwADUWQAA1FmAANRZwADUaYAA1GoAANRqgADUawAA1GvAANRsAADUbEAA1GyAANRswADUbUAA1G3AANRuAADUbkAA1G7AANRvAADUfsAA1H9AANR/wADUgEAA1IEAANSBQADUgYAA1IHAANSCAADUgoAA1IMAANSDQADUg4AA1IQAANSEQADUlAAA1JSAANSVAADUlYAA1JZAANSWgADUlsAA1JcAANSXQADUl8AA1JhAANSYgADUmMAA1JlAANSZgADUqUAA1KnAANSqQADUqsAA1KuAANSrwADUrAAA1KxAANSsgADUrQAA1K2AANStwADUrgAA1K6AANSuwADUwYAA1MpAANTSQADU2kAA1NrAANTbQADU28AA1NxAANTdAADU3UAA1N2AANTeQADU3oAA1N8AANTfQADU38AA1OCAANTgwADU4QAA1OHAANTiAADU40AA1OaAANTnwADU6EAA1OjAANTqAADU6sAA1OuAANTsAADU9UAA1P5AANUIAADVEQAA1RHAANUSQADVEsAA1RNAANUTwADVFEAA1RSAANUVQADVGIAA1RzAANUdQADVHcAA1R5AANUewADVH0AA1R/AANUgQADVIMAA1SUAANUlwADVJoAA1SdAANUoAADVKMAA1SmAANUqQADVKwAA1SuAANU7QADVO8AA1TxAANU8wADVPYAA1T3AANU+AADVPkAA1T6AANU/AADVP4AA1T/AANVAAADVQIAA1UDAANVQgADVUQAA1VGAANVSAADVUsAA1VMAANVTQADVU4AA1VPAANVUQADVVMAA1VUAANVVQADVVcAA1VYAANVlwADVZkAA1WcAANVngADVaEAA1WiAANVowADVaQAA1WlAANVpwADVakAA1WqAANVqwADVa0AA1WuAANVuwADVbwAA1W9AANVvwADVf4AA1YAAANWAgADVgQAA1YHAANWCAADVgkAA1YKAANWCwADVg0AA1YPAANWEAADVhEAA1YTAANWFAADVlMAA1ZVAANWVwADVlkAA1ZcAANWXQADVl4AA1ZfAANWYAADVmIAA1ZkAANWZQADVmYAA1ZoAANWaQADVqgAA1aqAANWrAADVq4AA1axAANWsgADVrMAA1a0AANWtQADVrcAA1a5AANWugADVrsAA1a9AANWvgADVv0AA1b/AANXAQADVwMAA1cGAANXBwADVwgAA1cJAANXCgADVwwAA1cOAANXDwADVxAAA1cSAANXEwADV1IAA1dUAANXVgADV1gAA1dbAANXXAADV10AA1deAANXXwADV2EAA1djAANXZAADV2UAA1dnAANXaAADV40AA1exAANX2AADV/wAA1f/AANYAQADWAMAA1gFAANYBwADWAkAA1gKAANYDQADWBoAA1gpAANYKwADWC0AA1gvAANYMQADWDMAA1g1AANYNwADWEYAA1hJAANYTAADWE8AA1hSAANYVQADWFgAA1hbAANYXQADWJwAA1ieAANYoAADWKIAA1ilAANYpgADWKcAA1ioAANYqQADWKsAA1itAANYrgADWK8AA1ixAANYsgADWPEAA1jzAANY9QADWPcAA1j6AANY+wADWPwAA1j9AANY/gADWQAAA1kCAANZAwADWQQAA1kGAANZBwADWUYAA1lIAANZSgADWUwAA1lPAANZUAADWVEAA1lSAANZUwADWVUAA1lXAANZWAADWVkAA1lbAANZXAADWZsAA1mdAANZnwADWaEAA1mkAANZpQADWaYAA1mnAANZqAADWaoAA1msAANZrQADWa4AA1mwAANZsQADWfAAA1nyAANZ9AADWfYAA1n5AANZ+gADWfsAA1n8AANZ/QADWf8AA1oBAANaAgADWgMAA1oFAANaBgADWkUAA1pHAANaSQADWksAA1pOAANaTwADWlAAA1pRAANaUgADWlQAA1pWAANaVwADWlgAA1paAANaWwADWpoAA1qcAANangADWqAAA1qjAANapAADWqUAA1qmAANapwADWqkAA1qrAANarAADWq0AA1qvAANasAADWvsAA1seAANbPgADW14AA1tgAANbYgADW2QAA1tmAANbaQADW2oAA1trAANbbgADW28AA1txAANbcgADW3QAA1t3AANbeAADW3kAA1t8AANbfQADW4IAA1uPAANblAADW5YAA1uYAANbnQADW6AAA1ujAANbpQADW8oAA1vuAANcFQADXDkAA1w8AANcPgADXEAAA1xCAANcRAADXEYAA1xHAANcSgADXFcAA1xoAANcagADXGwAA1xuAANccAADXHIAA1x0AANcdgADXHgAA1yJAANcjAADXI8AA1ySAANclQADXJgAA1ybAANcngADXKEAA1yjAANc4gADXOQAA1zmAANc6AADXOsAA1zsAANc7QADXO4AA1zvAANc8QADXPMAA1z0AANc9QADXPcAA1z4AANdNwADXTkAA107AANdPQADXUAAA11BAANdQgADXUMAA11EAANdRgADXUgAA11JAANdSgADXUwAA11NAANdjAADXY4AA12RAANdkwADXZYAA12XAANdmAADXZkAA12aAANdnAADXZ4AA12fAANdoAADXaIAA12jAANdsAADXbEAA12yAANdtAADXfMAA131AANd9wADXfkAA138AANd/QADXf4AA13/AANeAAADXgIAA14EAANeBQADXgYAA14IAANeCQADXkgAA15KAANeTAADXk4AA15RAANeUgADXlMAA15UAANeVQADXlcAA15ZAANeWgADXlsAA15dAANeXgADXp0AA16fAANeoQADXqMAA16mAANepwADXqgAA16pAANeqgADXqwAA16uAANerwADXrAAA16yAANeswADXvIAA170AANe9gADXvgAA177AANe/AADXv0AA17+AANe/wADXwEAA18DAANfBAADXwUAA18HAANfCAADX0cAA19JAANfSwADX00AA19QAANfUQADX1IAA19TAANfVAADX1YAA19YAANfWQADX1oAA19cAANfXQADX4IAA1+mAANfzQADX/EAA1/0AANf9gADX/gAA1/6AANf/AADX/4AA1//AANgAgADYA8AA2AeAANgIAADYCIAA2AkAANgJgADYCgAA2AqAANgLAADYDsAA2A+AANgQQADYEQAA2BHAANgSgADYE0AA2BQAANgUgADYJEAA2CTAANglQADYJcAA2CaAANgmwADYJwAA2CdAANgngADYKAAA2CiAANgowADYKQAA2CmAANgpwADYOYAA2DoAANg6gADYOwAA2DvAANg8AADYPEAA2DyAANg8wADYPUAA2D3AANg+AADYPkAA2D7AANg/AADYTsAA2E9AANhPwADYUEAA2FEAANhRQADYUYAA2FHAANhSAADYUoAA2FMAANhTQADYU4AA2FQAANhUQADYZAAA2GSAANhlQADYZcAA2GaAANhmwADYZwAA2GdAANhngADYaAAA2GiAANhowADYaQAA2GmAANhpwADYeYAA2HoAANh6gADYewAA2HvAANh8AADYfEAA2HyAANh8wADYfUAA2H3AANh+AADYfkAA2H7AANh/AADYjsAA2I9AANiPwADYkEAA2JEAANiRQADYkYAA2JHAANiSAADYkoAA2JMAANiTQADYk4AA2JQAANiUQADYpAAA2KSAANilAADYpYAA2KZAANimgADYpsAA2KcAANinQADYp8AA2KhAANiogADYqMAA2KlAANipgADYvEAA2MUAANjNAADY1QAA2NWAANjWAADY1oAA2NcAANjXwADY2AAA2NhAANjZAADY2UAA2NnAANjaAADY2oAA2NtAANjbgADY28AA2NyAANjcwADY3gAA2OFAANjigADY4wAA2OOAANjkwADY5YAA2OZAANjmwADY8AAA2PkAANkCwADZC8AA2QyAANkNAADZDYAA2Q4AANkOgADZDwAA2Q9AANkQAADZE0AA2ReAANkYAADZGIAA2RkAANkZgADZGgAA2RqAANkbAADZG4AA2R/AANkggADZIUAA2SIAANkiwADZI4AA2SRAANklAADZJcAA2SZAANk2AADZNoAA2TcAANk3gADZOEAA2TiAANk4wADZOQAA2TlAANk5wADZOkAA2TqAANk6wADZO0AA2TuAANlLQADZS8AA2UxAANlMwADZTYAA2U3AANlOAADZTkAA2U6AANlPAADZT4AA2U/AANlQAADZUIAA2VDAANlggADZYQAA2WHAANliQADZYwAA2WNAANljgADZY8AA2WQAANlkgADZZQAA2WVAANllgADZZgAA2WZAANlpgADZacAA2WoAANlqgADZekAA2XrAANl7QADZe8AA2XyAANl8wADZfQAA2X1AANl9gADZfgAA2X6AANl+wADZfwAA2X+AANl/wADZj4AA2ZAAANmQgADZkQAA2ZHAANmSAADZkkAA2ZKAANmSwADZk0AA2ZPAANmUAADZlEAA2ZTAANmVAADZpMAA2aVAANmlwADZpkAA2acAANmnQADZp4AA2afAANmoAADZqIAA2akAANmpQADZqYAA2aoAANmqQADZugAA2bqAANm7AADZu4AA2bxAANm8gADZvMAA2b0AANm9QADZvcAA2b5AANm+gADZvsAA2b9AANm/gADZz0AA2c/AANnQQADZ0MAA2dGAANnRwADZ0gAA2dJAANnSgADZ0wAA2dOAANnTwADZ1AAA2dSAANnUwADZ3gAA2ecAANnwwADZ+cAA2fqAANn7AADZ+4AA2fwAANn8gADZ/QAA2f1AANn+AADaAUAA2gUAANoFgADaBgAA2gaAANoHAADaB4AA2ggAANoIgADaDEAA2g0AANoNwADaDoAA2g9AANoQAADaEMAA2hGAANoSAADaIcAA2iJAANoiwADaI0AA2iQAANokQADaJIAA2iTAANolAADaJYAA2iYAANomQADaJoAA2icAANonQADaNwAA2jeAANo4AADaOIAA2jlAANo5gADaOcAA2joAANo6QADaOsAA2jtAANo7gADaO8AA2jxAANo8gADaTEAA2kzAANpNQADaTcAA2k6AANpOwADaTwAA2k9AANpPgADaUAAA2lCAANpQwADaUQAA2lGAANpRwADaYYAA2mIAANpiwADaY0AA2mQAANpkQADaZIAA2mTAANplAADaZYAA2mYAANpmQADaZoAA2mcAANpnQADadwAA2neAANp4AADaeIAA2nlAANp5gADaecAA2noAANp6QADaesAA2ntAANp7gADae8AA2nxAANp8gADajEAA2ozAANqNQADajcAA2o6AANqOwADajwAA2o9AANqPgADakAAA2pCAANqQwADakQAA2pGAANqRwADaoYAA2qIAANqigADaowAA2qPAANqkAADapEAA2qSAANqkwADapUAA2qXAANqmAADapkAA2qbAANqnAADaucAA2sKAANrKgADa0oAA2tMAANrTgADa1AAA2tSAANrVQADa1YAA2tXAANrWgADa1sAA2tdAANrXgADa2AAA2tjAANrZAADa2UAA2toAANraQADa24AA2t7AANrgAADa4IAA2uEAANriQADa4wAA2uPAANrkQADa7YAA2vaAANsAQADbCUAA2woAANsKgADbCwAA2wuAANsMAADbDIAA2wzAANsNgADbEMAA2xUAANsVgADbFgAA2xaAANsXAADbF4AA2xgAANsYgADbGQAA2x1AANseAADbHsAA2x+AANsgQADbIQAA2yHAANsigADbI0AA2yPAANszgADbNAAA2zSAANs1AADbNcAA2zYAANs2QADbNoAA2zbAANs3QADbN8AA2zgAANs4QADbOMAA2zkAANtIwADbSUAA20nAANtKQADbSwAA20tAANtLgADbS8AA20wAANtMgADbTQAA201AANtNgADbTgAA205AANteAADbXoAA219AANtfwADbYIAA22DAANthAADbYUAA22GAANtiAADbYoAA22LAANtjAADbY4AA22PAANtnAADbZ0AA22eAANtoAADbd8AA23hAANt4wADbeUAA23oAANt6QADbeoAA23rAANt7AADbe4AA23wAANt8QADbfIAA230AANt9QADbjQAA242AANuOAADbjoAA249AANuPgADbj8AA25AAANuQQADbkMAA25FAANuRgADbkcAA25JAANuSgADbokAA26LAANujQADbo8AA26SAANukwADbpQAA26VAANulgADbpgAA26aAANumwADbpwAA26eAANunwADbt4AA27gAANu4gADbuQAA27nAANu6AADbukAA27qAANu6wADbu0AA27vAANu8AADbvEAA27zAANu9AADbzMAA281AANvNwADbzkAA288AANvPQADbz4AA28/AANvQAADb0IAA29EAANvRQADb0YAA29IAANvSQADb24AA2+SAANvuQADb90AA2/gAANv4gADb+QAA2/mAANv6AADb+oAA2/rAANv7gADb/sAA3AKAANwDAADcA4AA3AQAANwEgADcBQAA3AWAANwGAADcCcAA3AqAANwLQADcDAAA3AzAANwNgADcDkAA3A8AANwPgADcH0AA3B/AANwgQADcIMAA3CGAANwhwADcIgAA3CJAANwigADcIwAA3COAANwjwADcJAAA3CSAANwkwADcNIAA3DUAANw1gADcNgAA3DbAANw3AADcN0AA3DeAANw3wADcOEAA3DjAANw5AADcOUAA3DnAANw6AADcScAA3EpAANxKwADcS0AA3EwAANxMQADcTIAA3EzAANxNAADcTYAA3E4AANxOQADcToAA3E8AANxPQADcXwAA3F+AANxgQADcYMAA3GGAANxhwADcYgAA3GJAANxigADcYwAA3GOAANxjwADcZAAA3GSAANxkwADcdIAA3HUAANx1gADcdgAA3HbAANx3AADcd0AA3HeAANx3wADceEAA3HjAANx5AADceUAA3HnAANx6AADcicAA3IpAANyKwADci0AA3IwAANyMQADcjIAA3IzAANyNAADcjYAA3I4AANyOQADcjoAA3I8AANyPQADcnwAA3J+AANygAADcoIAA3KFAANyhgADcocAA3KIAANyiQADcosAA3KNAANyjgADco8AA3KRAANykgADct0AA3MAAANzIAADc0AAA3NCAANzRAADc0YAA3NIAANzSwADc0wAA3NNAANzUAADc1EAA3NTAANzVAADc1YAA3NZAANzWgADc1sAA3NeAANzXwADc2QAA3NxAANzdgADc3gAA3N6AANzfwADc4IAA3OFAANzhwADc6wAA3PQAANz9wADdBsAA3QeAAN0IAADdCIAA3QkAAN0JgADdCgAA3QpAAN0LAADdDkAA3RKAAN0TAADdE4AA3RQAAN0UgADdFQAA3RWAAN0WAADdFoAA3RrAAN0bgADdHEAA3R0AAN0dwADdHoAA3R9AAN0gAADdIMAA3SFAAN0xAADdMYAA3TIAAN0ygADdM0AA3TOAAN0zwADdNAAA3TRAAN00wADdNUAA3TWAAN01wADdNkAA3TaAAN1GQADdRsAA3UdAAN1HwADdSIAA3UjAAN1JAADdSUAA3UmAAN1KAADdSoAA3UrAAN1LAADdS4AA3UvAAN1bgADdXAAA3VzAAN1dQADdXgAA3V5AAN1egADdXsAA3V8AAN1fgADdYAAA3WBAAN1ggADdYQAA3WFAAN1kgADdZMAA3WUAAN1lgADddUAA3XXAAN12QADddsAA3XeAAN13wADdeAAA3XhAAN14gADdeQAA3XmAAN15wADdegAA3XqAAN16wADdioAA3YsAAN2LgADdjAAA3YzAAN2NAADdjUAA3Y2AAN2NwADdjkAA3Y7AAN2PAADdj0AA3Y/AAN2QAADdn8AA3aBAAN2gwADdoUAA3aIAAN2iQADdooAA3aLAAN2jAADdo4AA3aQAAN2kQADdpIAA3aUAAN2lQADdtQAA3bWAAN22AADdtoAA3bdAAN23gADdt8AA3bgAAN24QADduMAA3blAAN25gADducAA3bpAAN26gADdykAA3crAAN3LQADdy8AA3cyAAN3MwADdzQAA3c1AAN3NgADdzgAA3c6AAN3OwADdzwAA3c+AAN3PwADd2QAA3eIAAN3rwADd9MAA3fWAAN32AADd9oAA3fcAAN33gADd+AAA3fhAAN35AADd/EAA3gAAAN4AgADeAQAA3gGAAN4CAADeAoAA3gMAAN4DgADeB0AA3ggAAN4IwADeCYAA3gpAAN4LAADeC8AA3gyAAN4NAADeHMAA3h1AAN4dwADeHkAA3h8AAN4fQADeH4AA3h/AAN4gAADeIIAA3iEAAN4hQADeIYAA3iIAAN4iQADeMgAA3jKAAN4zAADeM4AA3jRAAN40gADeNMAA3jUAAN41QADeNcAA3jZAAN42gADeNsAA3jdAAN43gADeR0AA3kfAAN5IQADeSMAA3kmAAN5JwADeSgAA3kpAAN5KgADeSwAA3kuAAN5LwADeTAAA3kyAAN5MwADeXIAA3l0AAN5dgADeXgAA3l7AAN5fAADeX0AA3l+AAN5fwADeYEAA3mDAAN5hAADeYUAA3mHAAN5iAADeccAA3nJAAN5ywADec0AA3nQAAN50QADedIAA3nTAAN51AADedYAA3nYAAN52QADedoAA3ncAAN53QADehwAA3oeAAN6IAADeiIAA3olAAN6JgADeicAA3ooAAN6KQADeisAA3otAAN6LgADei8AA3oxAAN6MgADenEAA3pzAAN6dQADencAA3p6AAN6ewADenwAA3p9AAN6fgADeoAAA3qCAAN6gwADeoQAA3qGAAN6hwADetIAA3r1AAN7FQADezUAA3s3AAN7OQADezsAA3s9AAN7QAADe0EAA3tCAAN7RQADe0YAA3tIAAN7SQADe0sAA3tOAAN7TwADe1AAA3tTAAN7VAADe10AA3tqAAN7bwADe3EAA3tzAAN7eAADe3sAA3t+AAN7gAADe6UAA3vJAAN78AADfBQAA3wXAAN8GQADfBsAA3wdAAN8HwADfCEAA3wiAAN8JQADfDIAA3xDAAN8RQADfEcAA3xJAAN8SwADfE0AA3xPAAN8UQADfFMAA3xkAAN8ZwADfGoAA3xtAAN8cAADfHMAA3x2AAN8eQADfHwAA3x+AAN8vQADfL8AA3zBAAN8wwADfMYAA3zHAAN8yAADfMkAA3zKAAN8zAADfM4AA3zPAAN80AADfNIAA3zTAAN9EgADfRQAA30WAAN9GAADfRsAA30cAAN9HQADfR4AA30fAAN9IQADfSMAA30kAAN9JQADfScAA30oAAN9ZwADfWkAA31sAAN9bgADfXEAA31yAAN9cwADfXQAA311AAN9dwADfXkAA316AAN9ewADfX0AA31+AAN9iwADfYwAA32NAAN9jwADfc4AA33QAAN90gADfdQAA33XAAN92AADfdkAA33aAAN92wADfd0AA33fAAN94AADfeEAA33jAAN95AADfiMAA34lAAN+JwADfikAA34sAAN+LQADfi4AA34vAAN+MAADfjIAA340AAN+NQADfjYAA344AAN+OQADfngAA356AAN+fAADfn4AA36BAAN+ggADfoMAA36EAAN+hQADfocAA36JAAN+igADfosAA36NAAN+jgADfs0AA37PAAN+0QADftMAA37WAAN+1wADftgAA37ZAAN+2gADftwAA37eAAN+3wADfuAAA37iAAN+4wADfyIAA38kAAN/JgADfygAA38rAAN/LAADfy0AA38uAAN/LwADfzEAA38zAAN/NAADfzUAA383AAN/OAADf10AA3+BAAN/qAADf8wAA3/PAAN/0QADf9MAA3/VAAN/1wADf9kAA3/aAAN/3QADf+oAA3/5AAN/+wADf/0AA3//AAOAAQADgAMAA4AFAAOABwADgBYAA4AZAAOAHAADgB8AA4AiAAOAJQADgCgAA4ArAAOALQADgGwAA4BuAAOAcAADgHIAA4B1AAOAdgADgHcAA4B4AAOAeQADgHsAA4B9AAOAfgADgH8AA4CBAAOAggADgMEAA4DDAAOAxQADgMcAA4DKAAOAywADgMwAA4DNAAOAzgADgNAAA4DSAAOA0wADgNQAA4DWAAOA1wADgRYAA4EYAAOBGgADgRwAA4EfAAOBIAADgSEAA4EiAAOBIwADgSUAA4EnAAOBKAADgSkAA4ErAAOBLAADgWsAA4FtAAOBcAADgXIAA4F1AAOBdgADgXcAA4F4AAOBeQADgXsAA4F9AAOBfgADgX8AA4GBAAOBggADgcEAA4HDAAOBxQADgccAA4HKAAOBywADgcwAA4HNAAOBzgADgdAAA4HSAAOB0wADgdQAA4HWAAOB1wADghYAA4IYAAOCGgADghwAA4IfAAOCIAADgiEAA4IiAAOCIwADgiUAA4InAAOCKAADgikAA4IrAAOCLAADgmsAA4JtAAOCbwADgnEAA4J0AAOCdQADgnYAA4J3AAOCeAADgnoAA4J8AAOCfQADgn4AA4KAAAOCgQADgswAA4LvAAODDwADgy8AA4MxAAODMwADgzUAA4M3AAODOgADgzsAA4M8AAODPwADg0AAA4NCAAODQwADg0UAA4NIAAODSQADg0oAA4NNAAODTgADg1MAA4NgAAODZQADg2cAA4NpAAODbgADg3EAA4N0AAODdgADg5sAA4O/AAOD5gADhAoAA4QNAAOEDwADhBEAA4QTAAOEFQADhBcAA4QYAAOEGwADhCgAA4Q5AAOEOwADhD0AA4Q/AAOEQQADhEMAA4RFAAOERwADhEkAA4RaAAOEXQADhGAAA4RjAAOEZgADhGkAA4RsAAOEbwADhHIAA4R0AAOEswADhLUAA4S3AAOEuQADhLwAA4S9AAOEvgADhL8AA4TAAAOEwgADhMQAA4TFAAOExgADhMgAA4TJAAOFCAADhQoAA4UMAAOFDgADhREAA4USAAOFEwADhRQAA4UVAAOFFwADhRkAA4UaAAOFGwADhR0AA4UeAAOFXQADhV8AA4ViAAOFZAADhWcAA4VoAAOFaQADhWoAA4VrAAOFbQADhW8AA4VwAAOFcQADhXMAA4V0AAOFgQADhYIAA4WDAAOFhQADhcQAA4XGAAOFyAADhcoAA4XNAAOFzgADhc8AA4XQAAOF0QADhdMAA4XVAAOF1gADhdcAA4XZAAOF2gADhhkAA4YbAAOGHQADhh8AA4YiAAOGIwADhiQAA4YlAAOGJgADhigAA4YqAAOGKwADhiwAA4YuAAOGLwADhm4AA4ZwAAOGcgADhnQAA4Z3AAOGeAADhnkAA4Z6AAOGewADhn0AA4Z/AAOGgAADhoEAA4aDAAOGhAADhsMAA4bFAAOGxwADhskAA4bMAAOGzQADhs4AA4bPAAOG0AADhtIAA4bUAAOG1QADhtYAA4bYAAOG2QADhxgAA4caAAOHHAADhx4AA4chAAOHIgADhyMAA4ckAAOHJQADhycAA4cpAAOHKgADhysAA4ctAAOHLgADh1MAA4d3AAOHngADh8IAA4fFAAOHxwADh8kAA4fLAAOHzQADh88AA4fQAAOH0wADh+AAA4fvAAOH8QADh/MAA4f1AAOH9wADh/kAA4f7AAOH/QADiAwAA4gPAAOIEgADiBUAA4gYAAOIGwADiB4AA4ghAAOIIwADiGIAA4hkAAOIZgADiGgAA4hrAAOIbAADiG0AA4huAAOIbwADiHEAA4hzAAOIdAADiHUAA4h3AAOIeAADiLcAA4i5AAOIuwADiL0AA4jAAAOIwQADiMIAA4jDAAOIxAADiMYAA4jIAAOIyQADiMoAA4jMAAOIzQADiQwAA4kOAAOJEAADiRIAA4kVAAOJFgADiRcAA4kYAAOJGQADiRsAA4kdAAOJHgADiR8AA4khAAOJIgADiWEAA4ljAAOJZgADiWgAA4lrAAOJbAADiW0AA4luAAOJbwADiXEAA4lzAAOJdAADiXUAA4l3AAOJeAADibcAA4m5AAOJuwADib0AA4nAAAOJwQADicIAA4nDAAOJxAADicYAA4nIAAOJyQADicoAA4nMAAOJzQADigwAA4oOAAOKEAADihIAA4oVAAOKFgADihcAA4oYAAOKGQADihsAA4odAAOKHgADih8AA4ohAAOKIgADimEAA4pjAAOKZQADimcAA4pqAAOKawADimwAA4ptAAOKbgADinAAA4pyAAOKcwADinQAA4p2AAOKdwADisIAA4rlAAOLBQADiyUAA4snAAOLKQADiysAA4stAAOLMAADizEAA4syAAOLNQADizYAA4s4AAOLOQADizsAA4s+AAOLPwADi0AAA4tDAAOLRAADi0kAA4tWAAOLWwADi10AA4tfAAOLZAADi2cAA4tqAAOLbAADi5EAA4u1AAOL3AADjAAAA4wDAAOMBQADjAcAA4wJAAOMCwADjA0AA4wOAAOMEQADjB4AA4wvAAOMMQADjDMAA4w1AAOMNwADjDkAA4w7AAOMPQADjD8AA4xQAAOMUwADjFYAA4xZAAOMXAADjF8AA4xiAAOMZQADjGgAA4xqAAOMqQADjKsAA4ytAAOMrwADjLIAA4yzAAOMtAADjLUAA4y2AAOMuAADjLoAA4y7AAOMvAADjL4AA4y/AAOM/gADjQAAA40CAAONBAADjQcAA40IAAONCQADjQoAA40LAAONDQADjQ8AA40QAAONEQADjRMAA40UAAONUwADjVUAA41YAAONWgADjV0AA41eAAONXwADjWAAA41hAAONYwADjWUAA41mAAONZwADjWkAA41qAAONdwADjXgAA415AAONewADjboAA428AAONvgADjcAAA43DAAONxAADjcUAA43GAAONxwADjckAA43LAAONzAADjc0AA43PAAON0AADjg8AA44RAAOOEwADjhUAA44YAAOOGQADjhoAA44bAAOOHAADjh4AA44gAAOOIQADjiIAA44kAAOOJQADjmQAA45mAAOOaAADjmoAA45tAAOObgADjm8AA45wAAOOcQADjnMAA451AAOOdgADjncAA455AAOOegADjrkAA467AAOOvQADjr8AA47CAAOOwwADjsQAA47FAAOOxgADjsgAA47KAAOOywADjswAA47OAAOOzwADjw4AA48QAAOPEgADjxQAA48XAAOPGAADjxkAA48aAAOPGwADjx0AA48fAAOPIAADjyEAA48jAAOPJAADj0kAA49tAAOPlAADj7gAA4+7AAOPvQADj78AA4/BAAOPwwADj8UAA4/GAAOPyQADj9YAA4/lAAOP5wADj+kAA4/rAAOP7QADj+8AA4/xAAOP8wADkAIAA5AFAAOQCAADkAsAA5AOAAOQEQADkBQAA5AXAAOQGQADkFgAA5BaAAOQXAADkF4AA5BhAAOQYgADkGMAA5BkAAOQZQADkGcAA5BpAAOQagADkGsAA5BtAAOQbgADkK0AA5CvAAOQsQADkLMAA5C2AAOQtwADkLgAA5C5AAOQugADkLwAA5C+AAOQvwADkMAAA5DCAAOQwwADkQIAA5EEAAORBgADkQgAA5ELAAORDAADkQ0AA5EOAAORDwADkREAA5ETAAORFAADkRUAA5EXAAORGAADkVcAA5FZAAORWwADkV0AA5FgAAORYQADkWIAA5FjAAORZAADkWYAA5FoAAORaQADkWoAA5FsAAORbQADkawAA5GuAAORsAADkbIAA5G1AAORtgADkbcAA5G4AAORuQADkbsAA5G9AAORvgADkb8AA5HBAAORwgADkgEAA5IDAAOSBQADkgcAA5IKAAOSCwADkgwAA5INAAOSDgADkhAAA5ISAAOSEwADkhQAA5IWAAOSFwADklYAA5JYAAOSWgADklwAA5JfAAOSYAADkmEAA5JiAAOSYwADkmUAA5JnAAOSaAADkmkAA5JrAAOSbAADkrcAA5LaAAOS+gADkxoAA5McAAOTHgADkyAAA5MiAAOTJQADkyYAA5MnAAOTKgADkysAA5MtAAOTLgADkzAAA5MzAAOTNAADkzUAA5M4AAOTOQADkz4AA5NLAAOTUAADk1IAA5NUAAOTWQADk1wAA5NfAAOTYQADk4YAA5OqAAOT0QADk/UAA5P4AAOT+gADk/wAA5P+AAOUAAADlAIAA5QDAAOUBgADlBMAA5QkAAOUJgADlCgAA5QqAAOULAADlC4AA5QwAAOUMgADlDQAA5RFAAOUSAADlEsAA5ROAAOUUQADlFQAA5RXAAOUWgADlF0AA5RfAAOUngADlKAAA5SiAAOUpAADlKcAA5SoAAOUqQADlKoAA5SrAAOUrQADlK8AA5SwAAOUsQADlLMAA5S0AAOU8wADlPUAA5T3AAOU+QADlPwAA5T9AAOU/gADlP8AA5UAAAOVAgADlQQAA5UFAAOVBgADlQgAA5UJAAOVSAADlUoAA5VNAAOVTwADlVIAA5VTAAOVVAADlVUAA5VWAAOVWAADlVoAA5VbAAOVXAADlV4AA5VfAAOVbAADlW0AA5VuAAOVcAADla8AA5WxAAOVswADlbUAA5W4AAOVuQADlboAA5W7AAOVvAADlb4AA5XAAAOVwQADlcIAA5XEAAOVxQADlgQAA5YGAAOWCAADlgoAA5YNAAOWDgADlg8AA5YQAAOWEQADlhMAA5YVAAOWFgADlhcAA5YZAAOWGgADllkAA5ZbAAOWXQADll8AA5ZiAAOWYwADlmQAA5ZlAAOWZgADlmgAA5ZqAAOWawADlmwAA5ZuAAOWbwADlq4AA5awAAOWsgADlrQAA5a3AAOWuAADlrkAA5a6AAOWuwADlr0AA5a/AAOWwAADlsEAA5bDAAOWxAADlwMAA5cFAAOXBwADlwkAA5cMAAOXDQADlw4AA5cPAAOXEAADlxIAA5cUAAOXFQADlxYAA5cYAAOXGQADlz4AA5diAAOXiQADl60AA5ewAAOXsgADl7QAA5e2AAOXuAADl7oAA5e7AAOXvgADl8sAA5faAAOX3AADl94AA5fgAAOX4gADl+QAA5fmAAOX6AADl/cAA5f6AAOX/QADmAAAA5gDAAOYBgADmAkAA5gMAAOYDgADmE0AA5hPAAOYUQADmFMAA5hWAAOYVwADmFgAA5hZAAOYWgADmFwAA5heAAOYXwADmGAAA5hiAAOYYwADmKIAA5ikAAOYpgADmKgAA5irAAOYrAADmK0AA5iuAAOYrwADmLEAA5izAAOYtAADmLUAA5i3AAOYuAADmPcAA5j5AAOY+wADmP0AA5kAAAOZAQADmQIAA5kDAAOZBAADmQYAA5kIAAOZCQADmQoAA5kMAAOZDQADmUwAA5lOAAOZUQADmVMAA5lWAAOZVwADmVgAA5lZAAOZWgADmVwAA5leAAOZXwADmWAAA5liAAOZYwADmaIAA5mkAAOZpgADmagAA5mrAAOZrAADma0AA5muAAOZrwADmbEAA5mzAAOZtAADmbUAA5m3AAOZuAADmfcAA5n5AAOZ+wADmf0AA5oAAAOaAQADmgIAA5oDAAOaBAADmgYAA5oIAAOaCQADmgoAA5oMAAOaDQADmkwAA5pOAAOaUAADmlIAA5pVAAOaVgADmlcAA5pYAAOaWQADmlsAA5pdAAOaXgADml8AA5phAAOaYgADmq0AA5rQAAOa8AADmxAAA5sSAAObFAADmxYAA5sYAAObGwADmxwAA5sdAAObIAADmyEAA5sjAAObJAADmyYAA5spAAObKgADmysAA5suAAObLwADmzQAA5tBAAObRgADm0gAA5tKAAObTwADm1IAA5tVAAObVwADm3wAA5ugAAObxwADm+sAA5vuAAOb8AADm/IAA5v0AAOb9gADm/gAA5v5AAOb/AADnAkAA5waAAOcHAADnB4AA5wgAAOcIgADnCQAA5wmAAOcKAADnCoAA5w7AAOcPgADnEEAA5xEAAOcRwADnEoAA5xNAAOcUAADnFMAA5xVAAOclAADnJYAA5yYAAOcmgADnJ0AA5yeAAOcnwADnKAAA5yhAAOcowADnKUAA5ymAAOcpwADnKkAA5yqAAOc6QADnOsAA5ztAAOc7wADnPIAA5zzAAOc9AADnPUAA5z2AAOc+AADnPoAA5z7AAOc/AADnP4AA5z/AAOdPgADnUAAA51DAAOdRQADnUgAA51JAAOdSgADnUsAA51MAAOdTgADnVAAA51RAAOdUgADnVQAA51VAAOdYgADnWMAA51kAAOdZgADnaUAA52nAAOdqQADnasAA52uAAOdrwADnbAAA52xAAOdsgADnbQAA522AAOdtwADnbgAA526AAOduwADnfoAA538AAOd/gADngAAA54DAAOeBAADngUAA54GAAOeBwADngkAA54LAAOeDAADng0AA54PAAOeEAADnk8AA55RAAOeUwADnlUAA55YAAOeWQADnloAA55bAAOeXAADnl4AA55gAAOeYQADnmIAA55kAAOeZQADnqQAA56mAAOeqAADnqoAA56tAAOergADnq8AA56wAAOesQADnrMAA561AAOetgADnrcAA565AAOeugADnvkAA577AAOe/QADnv8AA58CAAOfAwADnwQAA58FAAOfBgADnwgAA58KAAOfCwADnwwAA58OAAOfDwADnzQAA59YAAOffwADn6MAA5+mAAOfqAADn6oAA5+sAAOfrgADn7AAA5+xAAOftAADn8EAA5/QAAOf0gADn9QAA5/WAAOf2AADn9oAA5/cAAOf3gADn+0AA5/wAAOf8wADn/YAA5/5AAOf/AADn/8AA6ACAAOgBAADoEMAA6BFAAOgRwADoEkAA6BMAAOgTQADoE4AA6BPAAOgUAADoFIAA6BUAAOgVQADoFYAA6BYAAOgWQADoJgAA6CaAAOgnAADoJ4AA6ChAAOgogADoKMAA6CkAAOgpQADoKcAA6CpAAOgqgADoKsAA6CtAAOgrgADoO0AA6DvAAOg8QADoPMAA6D2AAOg9wADoPgAA6D5AAOg+gADoPwAA6D+AAOg/wADoQAAA6ECAAOhAwADoUIAA6FEAAOhRgADoUgAA6FLAAOhTAADoU0AA6FOAAOhTwADoVEAA6FTAAOhVAADoVUAA6FXAAOhWAADoZcAA6GZAAOhmwADoZ0AA6GgAAOhoQADoaIAA6GjAAOhpAADoaYAA6GoAAOhqQADoaoAA6GsAAOhrQADoewAA6HuAAOh8AADofIAA6H1AAOh9gADofcAA6H4AAOh+QADofsAA6H9AAOh/gADof8AA6IBAAOiAgADokEAA6JDAAOiRQADokcAA6JKAAOiSwADokwAA6JNAAOiTgADolAAA6JSAAOiUwADolQAA6JWAAOiVwADomAAA6JhAAOiYwADoqYAA6LKAAOi7gADoxEAA6M4AAOjWAADo38AA6OmAAOjxgADo+oAA6QOAAOkEAADpBMAA6QVAAOkFwADpBkAA6QcAAOkHwADpCEAA6QjAAOkJgADpCgAA6QqAAOkLQADpDAAA6QxAAOkNgADpEMAA6RGAAOkSAADpEsAA6ROAAOkUAADpHUAA6SZAAOkwAADpOQAA6TnAAOk6QADpOsAA6TtAAOk7wADpPEAA6TyAAOk9QADpQIAA6UTAAOlFQADpRcAA6UZAAOlGwADpR0AA6UfAAOlIQADpSMAA6U0AAOlNwADpToAA6U9AAOlQAADpUMAA6VGAAOlSQADpUwAA6VOAAOljQADpY8AA6WSAAOllAADpZcAA6WYAAOlmQADpZoAA6WbAAOlnQADpZ8AA6WgAAOloQADpaMAA6WkAAOlrQADpa4AA6WwAAOl7wADpfEAA6XzAAOl9QADpfgAA6X5AAOl+gADpfsAA6X8AAOl/gADpgAAA6YBAAOmAgADpgQAA6YFAAOmRAADpkYAA6ZIAAOmSgADpk0AA6ZOAAOmTwADplAAA6ZRAAOmUwADplUAA6ZWAAOmVwADplkAA6ZaAAOmmQADppsAA6aeAAOmoAADpqMAA6akAAOmpQADpqYAA6anAAOmqQADpqsAA6asAAOmrQADpq8AA6awAAOmuQADproAA6a8AAOm+wADpv0AA6b/AAOnAQADpwQAA6cFAAOnBgADpwcAA6cIAAOnCgADpwwAA6cNAAOnDgADpxAAA6cRAAOnUAADp1IAA6dVAAOnVwADp1oAA6dbAAOnXAADp10AA6deAAOnYAADp2IAA6djAAOnZAADp2YAA6dnAAOndAADp3UAA6d2AAOneAADp7cAA6e5AAOnuwADp70AA6fAAAOnwQADp8IAA6fDAAOnxAADp8YAA6fIAAOnyQADp8oAA6fMAAOnzQADqAwAA6gOAAOoEQADqBMAA6gWAAOoFwADqBgAA6gZAAOoGgADqBwAA6geAAOoHwADqCAAA6giAAOoIwADqC8AA6g8AAOoPwADqEIAA6hFAAOoSAADqEoAA6hRAAOonAADqL8AA6jfAAOo/wADqQEAA6kDAAOpBQADqQcAA6kKAAOpCwADqQwAA6kPAAOpEAADqRIAA6kTAAOpFQADqRgAA6kZAAOpGgADqR0AA6keAAOpJwADqTQAA6k5AAOpOwADqT0AA6lCAAOpRQADqUgAA6lKAAOpbwADqZMAA6m6AAOp3gADqeEAA6njAAOp5QADqecAA6npAAOp6wADqewAA6nvAAOp/AADqg0AA6oPAAOqEQADqhMAA6oVAAOqFwADqhkAA6obAAOqHQADqi4AA6oxAAOqNAADqjcAA6o6AAOqPQADqkAAA6pDAAOqRgADqkgAA6qHAAOqiQADqosAA6qNAAOqkAADqpEAA6qSAAOqkwADqpQAA6qWAAOqmAADqpkAA6qaAAOqnAADqp0AA6rcAAOq3gADquAAA6riAAOq5QADquYAA6rnAAOq6AADqukAA6rrAAOq7QADqu4AA6rvAAOq8QADqvIAA6sxAAOrMwADqzYAA6s4AAOrOwADqzwAA6s9AAOrPgADqz8AA6tBAAOrQwADq0QAA6tFAAOrRwADq0gAA6tVAAOrVgADq1cAA6tZAAOrmAADq5oAA6ucAAOrngADq6EAA6uiAAOrowADq6QAA6ulAAOrpwADq6kAA6uqAAOrqwADq60AA6uuAAOr7QADq+8AA6vxAAOr8wADq/YAA6v3AAOr+AADq/kAA6v6AAOr/AADq/4AA6v/AAOsAAADrAIAA6wDAAOsQgADrEQAA6xGAAOsSAADrEsAA6xMAAOsTQADrE4AA6xPAAOsUQADrFMAA6xUAAOsVQADrFcAA6xYAAOslwADrJkAA6ybAAOsnQADrKAAA6yhAAOsogADrKMAA6ykAAOspgADrKgAA6ypAAOsqgADrKwAA6ytAAOs7AADrO4AA6zwAAOs8gADrPUAA6z2AAOs9wADrPgAA6z5AAOs+wADrP0AA6z+AAOs/wADrQEAA60CAAOtJwADrUsAA61yAAOtlgADrZkAA62bAAOtnQADrZ8AA62hAAOtowADraQAA62nAAOttAADrcMAA63FAAOtxwADrckAA63LAAOtzQADrc8AA63RAAOt4AADreMAA63mAAOt6QADrewAA63vAAOt8gADrfUAA633AAOuNgADrjgAA646AAOuPAADrj8AA65AAAOuQQADrkIAA65DAAOuRQADrkcAA65IAAOuSQADrksAA65MAAOuiwADro0AA66PAAOukQADrpQAA66VAAOulgADrpcAA66YAAOumgADrpwAA66dAAOungADrqAAA66hAAOu4AADruIAA67kAAOu5gADrukAA67qAAOu6wADruwAA67tAAOu7wADrvEAA67yAAOu8wADrvUAA672AAOvNQADrzcAA685AAOvOwADrz4AA68/AAOvQAADr0EAA69CAAOvRAADr0YAA69HAAOvSAADr0oAA69LAAOvigADr4wAA6+OAAOvkAADr5MAA6+UAAOvlQADr5YAA6+XAAOvmQADr5sAA6+cAAOvnQADr58AA6+gAAOv3wADr+EAA6/jAAOv5QADr+gAA6/pAAOv6gADr+sAA6/sAAOv7gADr/AAA6/xAAOv8gADr/QAA6/1AAOwNAADsDYAA7A4AAOwOgADsD0AA7A+AAOwPwADsEAAA7BBAAOwQwADsEUAA7BGAAOwRwADsEkAA7BKAAOwUwADsFQAA7BWAAOwYwADsGQAA7BlAAOwZwADsHQAA7B1AAOwdgADsHgAA7CFAAOwhgADsIcAA7CJAAOwkgADsKEAA7CuAAOwvQADsM8AA7DjAAOw+gADsQwAA7EVAAOxFgADsRgAA7ElAAOxJgADsScAA7EpAAOxKgADsTMAA7E9AAOxRAADsUwAA7FeAAOxYwADsWgAAAAAAAAEAgAAAAAAAI5RAAAAAAAAAAAAAAAAAAOxag== + + + + + taskRunID + + + + taskHRef + + + + userConsented + + + + taskClassName + + + + phoneNumber + + + + 1 + results + + + + wakeUpTime + + + + APCMedTrackerMedication + Undefined + 4 + APCMedTrackerMedication + 1 + + + + + + 1 + color + + + + APCMedTrackerDailyDosageRecord + Undefined + 12 + APCMedTrackerDailyDosageRecord + 1 + + + + + \ No newline at end of file diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/.xccurrentversion b/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/.xccurrentversion index 0363cbb9..7955b3e1 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/.xccurrentversion +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ _XCCurrentVersionName - APCModel 4.xcdatamodel + APCModel 6.xcdatamodel diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 5.xcdatamodel/contents b/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 5.xcdatamodel/contents new file mode 100644 index 00000000..ffe3c128 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 5.xcdatamodel/contents @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 6.xcdatamodel/contents b/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 6.xcdatamodel/contents new file mode 100644 index 00000000..3a4fa088 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCModel.xcdatamodeld/APCModel 6.xcdatamodel/contents @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.h new file mode 100644 index 00000000..5bbb20af --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.h @@ -0,0 +1,48 @@ +// +// APCPotentialTask.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +@class APCSchedule; +@class APCTask; + +@interface APCPotentialTask : NSObject + +@property (nonatomic, strong) APCSchedule *schedule; +@property (nonatomic, strong) APCTask *task; +@property (nonatomic, strong) NSDate *scheduledAppearanceDate; + +- (instancetype) initWithTask: (APCTask *) task + onSchedule: (APCSchedule *) schedule + appearingAtDateAndTime: (NSDate *) scheduledAppearanceDate; + +@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.m new file mode 100644 index 00000000..b5bceaf6 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCPotentialScheduledTask.m @@ -0,0 +1,95 @@ +// +// APCPotentialTask.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCPotentialScheduledTask.h" + +@interface APCPotentialTask () +- (instancetype) init NS_DESIGNATED_INITIALIZER; +@end + +@implementation APCPotentialTask + +- (instancetype) init +{ + self = [super init]; + + if (self) + { + _schedule = nil; + _task = nil; + _scheduledAppearanceDate = nil; + } + + return self; +} + +- (instancetype) initWithTask: (APCTask *) task + onSchedule: (APCSchedule *) schedule + appearingAtDateAndTime: (NSDate *) scheduledAppearanceDate +{ + self = [self init]; + + if (self) + { + _schedule = schedule; + _task = task; + _scheduledAppearanceDate = scheduledAppearanceDate; + } + + return self; +} + + +@end + + + + + + + + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCResult+Bridge.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCResult+Bridge.m index 12fefec2..0f31a738 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCResult+Bridge.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCResult+Bridge.m @@ -35,10 +35,8 @@ #import "APCAppDelegate.h" #import "APCLog.h" #import "NSManagedObject+APCHelper.h" - #import - @implementation APCResult (Bridge) - (BOOL) serverDisabled diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.h index 9900bf17..4d929df2 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.h @@ -34,16 +34,80 @@ #import "APCSchedule.h" #import "APCScheduleExpression.h" + +@class APCTopLevelScheduleEnumerator; +@class APCTask; +@class APCDateRange; + + + +/** + We enumerate the dates in a schedule differently based on + this style. + */ +typedef enum : NSUInteger { + + /** The schedule specifies a single occurrence. */ + APCScheduleRecurrenceStyleExactlyOnce, + + /** The schedule recurs according to the rules of + a Unix-style cron expression. */ + APCScheduleRecurrenceStyleCronExpression, + + /** The schedule recurs according to a (human-readable) + ISO8601 time interval, like "every 90 days," and + an optional list of times in a given day. */ + APCScheduleRecurrenceStyleInterval, + +} APCScheduleRecurrenceStyle; + + +/** + Used in the very occasional place we need to know one + specific value of the scheduleType field outside this + category. For the most part, we can get more and + better information from schedule.recurrenceStyle. + */ +FOUNDATION_EXPORT NSString * const kAPCScheduleTypeValueOneTimeSchedule; + + + @interface APCSchedule (AddOn) -//Synchronous Method Call -+ (void) createSchedulesFromJSON: (NSArray*) schedulesArray inContext: (NSManagedObjectContext*) context; -+ (void) updateSchedulesFromJSON: (NSArray *)schedulesArray inContext:(NSManagedObjectContext *)context; -- (BOOL) isOneTimeSchedule; + +// --------------------------------------------------------- +#pragma mark - version 1, where we schedule tasks into the future +// --------------------------------------------------------- + @property (nonatomic, readonly) APCScheduleExpression * scheduleExpression; -- (NSTimeInterval) expiresInterval; + (APCSchedule*) cannedScheduleForTaskID: (NSString*) taskID inContext:(NSManagedObjectContext *)context; + + +// --------------------------------------------------------- +#pragma mark - version 2, where we only generate tasks if the user touches them +// --------------------------------------------------------- + + +@property (readonly) APCScheduleRecurrenceStyle recurrenceStyle; +@property (readonly) NSString *firstTaskTitle; +@property (readonly) NSString *firstTaskId; + +/** Quick accessors for the different types of recurrenceStyle. + Mostly for debugging, so we can test for these easy-to-read + items in the "Edit Breakpoints" window. :-) */ +@property (readonly) BOOL isOneTimeSchedule; +@property (readonly) BOOL isRecurringCronSchedule; +@property (readonly) BOOL isRecurringIntervalSchedule; + +- (APCTopLevelScheduleEnumerator *) enumeratorFromDate: (NSDate *) startDate + toDate: (NSDate *) endDate; + +- (APCTopLevelScheduleEnumerator *) enumeratorOverDateRange: (APCDateRange *) dateRange; + +- (NSComparisonResult) compareWithSchedule: (APCSchedule *) otherSchedule; + @end + diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.m index 70b5cc8e..a4c0426a 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+AddOn.m @@ -35,72 +35,29 @@ #import "APCModel.h" #import "APCLog.h" #import "NSDate+Helper.h" +#import "APCTopLevelScheduleEnumerator.h" +#import "APCTask+AddOn.h" +#import "APCDateRange.h" +#import "APCConstants.h" -static NSString * const kScheduleShouldRemindKey = @"shouldRemind"; -static NSString * const kScheduleReminderOffsetKey = @"reminderOffset"; + +static NSString * const kScheduleShouldRemindKey = @"shouldRemind"; +static NSString * const kScheduleReminderOffsetKey = @"reminderOffset"; static NSString * const kScheduleReminderMessageKey = @"reminderMessage"; -static NSString * const kTaskIDKey = @"taskID"; -static NSString * const kScheduleStringKey = @"scheduleString"; -static NSString * const kScheduleTypeKey = @"scheduleType"; -static NSString * const kRemoteUpdatable = @"remoteUpdatable"; -static NSString * const kExpires = @"expires"; +static NSString * const kTaskIDKey = @"taskID"; +static NSString * const kScheduleStringKey = @"scheduleString"; +static NSString * const kScheduleTypeKey = @"scheduleType"; -static NSString * const kOneTimeSchedule = @"once"; +static NSString * const kExpires = @"expires"; +static NSString * const kScheduleDelayKey = @"delay"; +static NSString * const kScheduleNotesKey = @"notes"; -@implementation APCSchedule (AddOn) +NSString * const kAPCScheduleTypeValueOneTimeSchedule = @"once"; -+(void)createSchedulesFromJSON:(NSArray *)schedulesArray inContext:(NSManagedObjectContext *)context -{ - [context performBlockAndWait:^{ - for(NSDictionary *scheduleDict in schedulesArray) { - - APCSchedule * schedule = [APCSchedule newObjectForContext:context]; - - schedule.scheduleType = [scheduleDict objectForKey:kScheduleTypeKey]; - schedule.scheduleString = [scheduleDict objectForKey:kScheduleStringKey]; - schedule.taskID = scheduleDict[kTaskIDKey]; - schedule.remoteUpdatable = scheduleDict[kRemoteUpdatable]; - schedule.expires = scheduleDict[kExpires]; - - schedule.shouldRemind = [scheduleDict objectForKey:kScheduleShouldRemindKey]; - schedule.reminderOffset = [scheduleDict objectForKey:kScheduleReminderOffsetKey]; - schedule.reminderMessage = [scheduleDict objectForKey:kScheduleReminderMessageKey]; - - NSError * error; - [schedule saveToPersistentStore:&error]; - APCLogError2(error); - } - }]; -} -+ (void) updateSchedulesFromJSON: (NSArray *)schedulesArray inContext:(NSManagedObjectContext *)context -{ - [context performBlockAndWait:^{ - for(NSDictionary *scheduleDict in schedulesArray) { - - APCSchedule * schedule = [APCSchedule cannedScheduleForTaskID:scheduleDict[kTaskIDKey] inContext:context]; - if (schedule == nil) { - schedule = [APCSchedule newObjectForContext:context]; - schedule.taskID = scheduleDict[kTaskIDKey]; - } - - schedule.scheduleType = [scheduleDict objectForKey:kScheduleTypeKey]; - schedule.scheduleString = [scheduleDict objectForKey:kScheduleStringKey]; - schedule.taskID = scheduleDict[kTaskIDKey]; - schedule.remoteUpdatable = scheduleDict[kRemoteUpdatable]; - schedule.expires = scheduleDict[kExpires]; - - schedule.shouldRemind = [scheduleDict objectForKey:kScheduleShouldRemindKey]; - schedule.reminderOffset = [scheduleDict objectForKey:kScheduleReminderOffsetKey]; - schedule.reminderMessage = [scheduleDict objectForKey:kScheduleReminderMessageKey]; - - NSError * error; - [schedule saveToPersistentStore:&error]; - APCLogError2(error); - } - }]; -} + +@implementation APCSchedule (AddOn) //Returns only local canned schedule + (APCSchedule*) cannedScheduleForTaskID: (NSString*) taskID inContext:(NSManagedObjectContext *)context @@ -108,31 +65,75 @@ + (APCSchedule*) cannedScheduleForTaskID: (NSString*) taskID inContext:(NSManage __block APCSchedule * retSchedule; [context performBlockAndWait:^{ NSFetchRequest * request = [APCSchedule request]; - request.predicate = [NSPredicate predicateWithFormat:@"taskID == %@ && (remoteUpdatable == %@ || remoteUpdatable == nil)",taskID, @NO]; + + request.predicate = [NSPredicate predicateWithFormat: @"%K == %@ && (%K == %@ || %K == nil)", + NSStringFromSelector(@selector(taskID)), + taskID, + NSStringFromSelector(@selector(scheduleSource)), + NSStringFromSelector(@selector(scheduleSource)), + @(APCScheduleSourceLocalDisk) + ]; + NSError * error; retSchedule = [[context executeFetchRequest:request error:&error]firstObject]; }]; return retSchedule; } -- (BOOL)isOneTimeSchedule -{ - return [self.scheduleType isEqualToString:kOneTimeSchedule]; -} - - (APCScheduleExpression *)scheduleExpression { //TODO: Schedule interval is 0 return [[APCScheduleExpression alloc] initWithExpression:self.scheduleString timeZero:0]; } -- (NSTimeInterval) expiresInterval { - return [NSDate parseISO8601DurationString:self.expires]; + + +// --------------------------------------------------------- +#pragma mark - Data Validation +// --------------------------------------------------------- + ++ (NSString *) safeScheduleIdFromDictionaryValue: (id) dictionaryValue +{ + NSString *result = nil; + + result = [self safeStringFromDictionaryValue: dictionaryValue + allowNil: YES // for now? schedule IDs are optional -- we're phasing them in. + trimWhitespace: YES]; + + return result; } -/*********************************************************************************/ ++ (NSString *) safeStringFromDictionaryValue: (id) dictionaryValue + allowNil: (BOOL) shouldAllowNil + trimWhitespace: (BOOL) shouldTrimWhitespace +{ + NSString *result = nil; + + if ([dictionaryValue isKindOfClass: [NSString class]]) + { + result = dictionaryValue; + + if (result == nil && ! shouldAllowNil) + { + result = @""; + } + + if (shouldTrimWhitespace) + { + result = [result stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + } + + return result; +} + + + + +// --------------------------------------------------------- #pragma mark - Life Cycle Methods -/*********************************************************************************/ +// --------------------------------------------------------- + - (void)awakeFromInsert { [super awakeFromInsert]; @@ -144,4 +145,139 @@ - (void)willSave [self setPrimitiveValue:[NSDate date] forKey:@"updatedAt"]; } + + +// --------------------------------------------------------- +#pragma mark - version 2, where we only generate tasks if the user touches them +// --------------------------------------------------------- + +- (APCTopLevelScheduleEnumerator *) enumeratorFromDate: (NSDate *) startDate + toDate: (NSDate *) endDate +{ + APCTopLevelScheduleEnumerator *enumerator = [[APCTopLevelScheduleEnumerator alloc] initWithSchedule: self + fromDate: startDate + toDate: endDate]; + return enumerator; +} + +- (APCTopLevelScheduleEnumerator *) enumeratorOverDateRange: (APCDateRange *) dateRange +{ + return [self enumeratorFromDate: dateRange.startDate + toDate: dateRange.endDate]; +} + +- (APCScheduleRecurrenceStyle) recurrenceStyle +{ + APCScheduleRecurrenceStyle style = APCScheduleRecurrenceStyleExactlyOnce; + + if ([self.scheduleType isEqualToString: kAPCScheduleTypeValueOneTimeSchedule]) + { + style = APCScheduleRecurrenceStyleExactlyOnce; + } + + else if (self.interval.length > 0) + { + style = APCScheduleRecurrenceStyleInterval; + } + + else if (self.scheduleString.length > 0) + { + style = APCScheduleRecurrenceStyleCronExpression; + } + + else + { + style = APCScheduleRecurrenceStyleExactlyOnce; + } + + return style; +} + +- (BOOL) isOneTimeSchedule +{ + return self.recurrenceStyle == APCScheduleRecurrenceStyleExactlyOnce; +} + +- (BOOL)isRecurringCronSchedule +{ + return self.recurrenceStyle == APCScheduleRecurrenceStyleCronExpression; +} + +- (BOOL) isRecurringIntervalSchedule +{ + return self.recurrenceStyle == APCScheduleRecurrenceStyleInterval; +} + +- (NSString *) firstTaskTitle +{ + NSString *result = nil; + + if (self.tasks.count) + { + APCTask *firstTask = self.tasks.anyObject; + result = firstTask.taskTitle; + } + + return result; +} + +- (NSString *) firstTaskId +{ + NSString *result = nil; + + if (self.tasks.count) + { + APCTask *firstTask = self.tasks.anyObject; + result = firstTask.taskID; + } + + return result; +} + +- (NSComparisonResult) compareWithSchedule: (APCSchedule *) otherSchedule +{ + NSComparisonResult result = NSOrderedSame; + APCTask *oneOfMyTasks = self.tasks.anyObject; + APCTask *oneOfOtherTasks = otherSchedule.tasks.anyObject; + + if (oneOfMyTasks == nil && oneOfOtherTasks == nil) + { + result = NSOrderedSame; + } + else if (oneOfOtherTasks == nil) + { + result = NSOrderedDescending; + } + else if (oneOfMyTasks == nil) + { + result = NSOrderedAscending; + } + else + { + NSArray *plainTasks = @[oneOfMyTasks, oneOfOtherTasks]; + NSArray *sortedTasks = [plainTasks sortedArrayUsingDescriptors: [APCTask defaultSortDescriptors]]; + result = sortedTasks.firstObject == oneOfMyTasks ? NSOrderedAscending : NSOrderedDescending; + } + + return result; +} + @end + + + + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.h index 3af4df8e..ce4d733b 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.h @@ -32,7 +32,3 @@ // #import "APCSchedule.h" - -@interface APCSchedule (Bridge) -+ (void) updateSchedulesOnCompletion: (void (^)(NSError * error)) completionBlock; -@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.m index bbfb2bc7..a83f39db 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule+Bridge.m @@ -31,116 +31,3 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -#import "APCSchedule+Bridge.h" -#import "APCAppDelegate.h" -#import "APCTask+AddOn.h" -#import "APCLog.h" -#import "NSManagedObject+APCHelper.h" -#import "SBBGuidCreatedOnVersionHolder+APCAdditions.h" - - -NSString *const kSurveyTaskViewController = @"APCGenericSurveyTaskViewController"; - -@implementation APCSchedule (Bridge) - -+ (BOOL) serverDisabled -{ -#if DEVELOPMENT - return YES; -#else - return ((APCAppDelegate*)[UIApplication sharedApplication].delegate).dataSubstrate.parameters.bypassServer; -#endif -} - -+ (void) updateSchedulesOnCompletion: (void (^)(NSError * error)) completionBlock -{ - if (![self serverDisabled]) { - [SBBComponent(SBBScheduleManager) getSchedulesWithCompletion:^(id schedulesList, NSError *error) { - APCLogError2 (error); - if (!error) { - SBBResourceList *list = (SBBResourceList *)schedulesList; - NSArray * schedules = list.items; - NSManagedObjectContext * context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; - context.parentContext = ((APCAppDelegate*)[UIApplication sharedApplication].delegate).dataSubstrate.persistentContext; - [self clearAllRemoteUpdatableSchedules:context]; - [context performBlockAndWait:^{ - [schedules enumerateObjectsUsingBlock:^(SBBSchedule* schedule, NSUInteger __unused idx, BOOL * __unused stop) { - APCSchedule * apcSchedule = [APCSchedule newObjectForContext:context]; - [self mapSBBSchedule:schedule APCSchedule:apcSchedule]; - NSError * error; - [apcSchedule saveToPersistentStore:&error]; - APCLogError2 (error); - }]; - }]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - if (!error) { - APCLogEventWithData(kNetworkEvent, @{@"event_detail":@"schedule updated"}); - } - if (completionBlock) { - completionBlock(error); - } - }); - }]; - } - else - { - dispatch_async(dispatch_get_main_queue(), ^{ - if (completionBlock) { - completionBlock(nil); - } - }); - } -} - -+ (void) clearAllRemoteUpdatableSchedules: (NSManagedObjectContext*) context -{ - [context performBlockAndWait:^{ - NSFetchRequest * request = [APCSchedule request]; - request.predicate = [NSPredicate predicateWithFormat:@"remoteUpdatable == %@", @(YES)]; - NSError * error; - NSMutableArray * mutableArray = [[context executeFetchRequest:request error:&error] mutableCopy]; - APCLogError2 (error); - APCSchedule * handle = [mutableArray lastObject]; - while (mutableArray.count) { - APCSchedule * schedule = [mutableArray lastObject]; - [mutableArray removeLastObject]; - [context deleteObject:schedule]; - } - [handle saveToPersistentStore:&error]; - APCLogError2 (error); - }]; -} - -+ (void) mapSBBSchedule:(SBBSchedule*) sbbSchedule APCSchedule: (APCSchedule*) apcSchedule -{ - apcSchedule.remoteUpdatable = @(YES); - apcSchedule.scheduleType = sbbSchedule.scheduleType; - apcSchedule.scheduleString = sbbSchedule.cronTrigger; - apcSchedule.expires = sbbSchedule.expires; - apcSchedule.startsOn = sbbSchedule.startsOn; - apcSchedule.endsOn = sbbSchedule.endsOn; - apcSchedule.reminderMessage = sbbSchedule.label; - - SBBActivity * activity = [sbbSchedule.activities firstObject]; - if(activity != nil) { - //APCTask - if ([activity.activityType isEqualToString:@"survey"]) { - APCTask * task = [APCTask taskWithTaskID:activity.survey.uniqueID inContext:apcSchedule.managedObjectContext]; - if (!task) { - task = [APCTask newObjectForContext:apcSchedule.managedObjectContext]; - task.taskID = activity.survey.uniqueID; - task.taskHRef = activity.ref; - task.taskClassName = kSurveyTaskViewController; - } - apcSchedule.taskID = activity.survey.uniqueID; - } - else - { - APCLogError(@"Unknown Activity Type: %@", activity.activityType); - } - } - - -} -@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.h index 9269b301..525cf539 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.h @@ -1,57 +1,64 @@ -// -// APCSchedule.h -// APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - +// +// APCSchedule.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + #import #import -@class APCScheduledTask; +@class APCScheduledTask, APCTask; @interface APCSchedule : NSManagedObject @property (nonatomic, retain) NSDate * createdAt; +@property (nonatomic, retain) NSString * delay; +@property (nonatomic, retain) NSDate * effectiveEndDate; +@property (nonatomic, retain) NSDate * effectiveStartDate; @property (nonatomic, retain) NSDate * endsOn; @property (nonatomic, retain) NSString * expires; @property (nonatomic, retain) NSNumber * inActive; +@property (nonatomic, retain) NSString * notes; @property (nonatomic, retain) NSString * reminderMessage; @property (nonatomic, retain) NSNumber * reminderOffset; -@property (nonatomic, retain) NSNumber * remoteUpdatable; +@property (nonatomic, retain) NSNumber * scheduleSource; @property (nonatomic, retain) NSString * scheduleString; @property (nonatomic, retain) NSString * scheduleType; @property (nonatomic, retain) NSNumber * shouldRemind; @property (nonatomic, retain) NSDate * startsOn; -@property (nonatomic, retain) NSString * taskID; @property (nonatomic, retain) NSDate * updatedAt; +@property (nonatomic, retain) NSString * interval; +@property (nonatomic, retain) NSString * timesOfDay; +@property (nonatomic, retain) NSNumber * maxCount; @property (nonatomic, retain) NSSet *scheduledTasks; +@property (nonatomic, retain) NSSet *tasks; @end @interface APCSchedule (CoreDataGeneratedAccessors) @@ -61,4 +68,9 @@ - (void)addScheduledTasks:(NSSet *)values; - (void)removeScheduledTasks:(NSSet *)values; +- (void)addTasksObject:(APCTask *)value; +- (void)removeTasksObject:(APCTask *)value; +- (void)addTasks:(NSSet *)values; +- (void)removeTasks:(NSSet *)values; + @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.m index c9577c58..bc45f9c0 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSchedule.m @@ -1,55 +1,63 @@ -// -// APCSchedule.m -// APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - +// +// APCSchedule.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + #import "APCSchedule.h" #import "APCScheduledTask.h" +#import "APCTask.h" @implementation APCSchedule @dynamic createdAt; +@dynamic delay; +@dynamic effectiveEndDate; +@dynamic effectiveStartDate; @dynamic endsOn; @dynamic expires; @dynamic inActive; +@dynamic notes; @dynamic reminderMessage; @dynamic reminderOffset; -@dynamic remoteUpdatable; +@dynamic scheduleSource; @dynamic scheduleString; @dynamic scheduleType; @dynamic shouldRemind; @dynamic startsOn; -@dynamic taskID; @dynamic updatedAt; +@dynamic interval; +@dynamic timesOfDay; +@dynamic maxCount; @dynamic scheduledTasks; +@dynamic tasks; @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.h index 6579f2e2..eafc4921 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.h @@ -42,18 +42,8 @@ - (BOOL)removeScheduledTask:(NSError **)taskError; @property (nonatomic, readonly) APCResult* lastResult; - @property (nonatomic, readonly) NSString * completeByDateString; -+ (NSDictionary*) APCActivityVCScheduledTasksInContext: (NSManagedObjectContext*) context; -+ (instancetype) scheduledTaskForStartOnDate: (NSDate *) startOn schedule: (APCSchedule*) schedule inContext: (NSManagedObjectContext*) context; - -+ (NSArray *)allScheduledTasksForDateRange: (APCDateRange*) dateRange completed: (NSNumber*) completed inContext: (NSManagedObjectContext*) context; -/*********************************************************************************/ -#pragma mark - Counts -/*********************************************************************************/ -+ (NSUInteger)countOfAllScheduledTasksTodayInContext: (NSManagedObjectContext*) context; -+ (NSUInteger)countOfAllCompletedTasksTodayInContext: (NSManagedObjectContext*) context; /*********************************************************************************/ #pragma mark - Reminder diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.m index 7795a70d..25ec2785 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask+AddOn.m @@ -45,12 +45,6 @@ @implementation APCScheduledTask (AddOn) - (void)completeScheduledTask { self.completed = @(YES); - - //Turn off one time schedule - if ([self.generatedSchedule isOneTimeSchedule]) - { - self.generatedSchedule.inActive = @(YES); - } NSError * saveError; [self saveToPersistentStore:&saveError]; APCLogError2 (saveError); @@ -93,6 +87,7 @@ - (NSString *)completeByDateString - (APCResult *)lastResult { APCResult * retValue = nil; + @synchronized(self){ if (self.results.count == 1) { retValue = [self.results anyObject]; } @@ -101,150 +96,9 @@ - (APCResult *)lastResult NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"endDate" ascending:NO]; NSArray * sortedArray = [self.results sortedArrayUsingDescriptors:@[sortDescriptor]]; retValue = [sortedArray firstObject]; - } - return retValue; -} - -+ (NSDictionary*) APCActivityVCScheduledTasksInContext: (NSManagedObjectContext*) context -{ - NSArray * array1 = [self getTodaysTaskInContext:context]; - NSArray * array2 = [self getYesterdaysIncompleteTaskInContext:context]; - - NSMutableDictionary * finalDict = [NSMutableDictionary dictionary]; - if (array1.count) { - finalDict[@"today"] = array1; - } - if (array2.count) { - finalDict[@"yesterday"] = array2; - } - return finalDict.count ? finalDict : nil; -} - -+ (NSArray *) getTodaysTaskInContext: (NSManagedObjectContext*) context { - NSArray * array = [self allScheduledTasksForDateRange:[APCDateRange todayRange] completed:nil inContext:context]; - //If there are no today's activities, generate them - if (array.count == 0) { - [((APCAppDelegate*) [UIApplication sharedApplication].delegate).dataMonitor.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeToday]; - array = [self allScheduledTasksForDateRange:[APCDateRange todayRange] completed:nil inContext:context]; - } - return array.count ? array : nil; - -} - -+ (NSArray*) getYesterdaysIncompleteTaskInContext: (NSManagedObjectContext*) context { - NSArray * array = [self allScheduledTasksForDateRange:[APCDateRange yesterdayRange] completed:@NO inContext:context]; - //If there are no yesterday's activities and there are completed activities in the past, generate yesterday's activities - if (array.count == 0) { - if ([self userHasCompletedActivitiesInThePastInContext:context]) { - [((APCAppDelegate*) [UIApplication sharedApplication].delegate).dataMonitor.scheduler updateScheduledTasksIfNotUpdatingWithRange:kAPCSchedulerDateRangeYesterday]; - array = [self allScheduledTasksForDateRange:[APCDateRange yesterdayRange] completed:@NO inContext:context]; - } - } - NSArray * filteredArray = [self filterYesterdayIncompleteScheduledTasksByEndDate:array]; - return filteredArray.count ? filteredArray : nil; -} - -+ (NSArray*) filterYesterdayIncompleteScheduledTasksByEndDate: (NSArray*) scheduledTasksArray { - - NSMutableArray * filteredArray = [NSMutableArray array]; - NSDate * yesterdaysEndDate = [NSDate endOfDay:[NSDate yesterdayAtMidnight]]; - for (APCScheduledTask * scheduledTask in scheduledTasksArray) { - if (scheduledTask.endOn <= yesterdaysEndDate) { - [filteredArray addObject:scheduledTask]; - } - } - return filteredArray.count ? filteredArray : nil; -} - -//If completed is nil then no filtering on completion, else the result will be filtered by completed value -+ (NSArray *)allScheduledTasksForDateRange: (APCDateRange*) dateRange completed: (NSNumber*) completed inContext: (NSManagedObjectContext*) context -{ - NSFetchRequest * request = [APCScheduledTask request]; - - NSPredicate * datePredicate = [NSPredicate predicateWithFormat:@"endOn > %@", dateRange.startDate]; - NSPredicate * completionPrediate = nil; - if (completed != nil) { - completionPrediate = [completed isEqualToNumber:@YES] ? [NSPredicate predicateWithFormat:@"completed == %@", completed] :[NSPredicate predicateWithFormat:@"completed == nil || completed == %@", completed] ; - } - - NSPredicate * finalPredicate = completionPrediate ? [NSCompoundPredicate andPredicateWithSubpredicates:@[datePredicate, completionPrediate]] : datePredicate; - request.predicate = finalPredicate; - - NSSortDescriptor *titleSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"task.taskTitle" ascending:YES]; - request.sortDescriptors = @[titleSortDescriptor]; - - NSError * error; - NSArray * array = [context executeFetchRequest:request error:&error]; - APCLogError2 (error); - - - NSMutableArray * filteredArray = [NSMutableArray array]; - - for (APCScheduledTask * scheduledTask in array) { - if ([scheduledTask.dateRange compare:dateRange] != kAPCDateRangeComparisonOutOfRange) { - [filteredArray addObject:scheduledTask]; } } - - NSArray * finalArray = filteredArray; - //Filtering multiday tasks that were completed yesterday or older - if (completed == nil) { - finalArray = [self filterTasksCompletedYesterdayOrOlder:filteredArray]; - } - - return finalArray.count ? finalArray : nil; -} - -+ (BOOL) userHasCompletedActivitiesInThePastInContext: (NSManagedObjectContext*) context { - - NSFetchRequest * request = [APCScheduledTask request]; - request.predicate = [NSPredicate predicateWithFormat:@"completed == %@ && endOn < %@", @YES, [NSDate yesterdayAtMidnight]]; - NSError * error; - NSUInteger count = [context countForFetchRequest:request error:&error]; - APCLogError2 (error); - return (count > 0) ? YES : NO; -} - -+ (instancetype) scheduledTaskForStartOnDate: (NSDate *) startOn schedule: (APCSchedule*) schedule inContext: (NSManagedObjectContext*) context -{ - NSFetchRequest * request = [APCScheduledTask request]; - request.predicate = [NSPredicate predicateWithFormat:@"startOn == %@ && generatedSchedule == %@", startOn, schedule]; - NSError * error; - NSArray * array = [context executeFetchRequest:request error:&error]; - APCLogError2 (error); - return array.count ? [array firstObject] : nil; -} - -+ (NSArray*) filterTasksCompletedYesterdayOrOlder: (NSArray*) scheduledTasksArray -{ - NSMutableArray * filteredArray = [NSMutableArray array]; - NSDate * todayAtMidnight = [NSDate todayAtMidnight]; - [scheduledTasksArray enumerateObjectsUsingBlock:^(APCScheduledTask * obj, NSUInteger __unused idx, BOOL * __unused stop) { - - if ([obj.completed isEqualToNumber:@YES]) { - if (obj.lastResult.endDate.timeIntervalSinceReferenceDate >= todayAtMidnight.timeIntervalSinceReferenceDate) { - [filteredArray addObject:obj]; - } - } - else - { - [filteredArray addObject:obj]; - } - }]; - return filteredArray; -} - -/*********************************************************************************/ -#pragma mark - Counts -/*********************************************************************************/ -+ (NSUInteger)countOfAllScheduledTasksTodayInContext: (NSManagedObjectContext*) context { - NSArray * array = [self allScheduledTasksForDateRange:[APCDateRange todayRange] completed:nil inContext:context]; - return array.count; -} - -+ (NSUInteger)countOfAllCompletedTasksTodayInContext: (NSManagedObjectContext*) context { - NSArray * array = [self allScheduledTasksForDateRange:[APCDateRange todayRange] completed:@YES inContext:context]; - return array.count; + return retValue; } @@ -344,4 +198,21 @@ - (void)setDateRange:(APCDateRange *)dateRange { self.endOn = dateRange.endDate; } + + + +// --------------------------------------------------------- +#pragma mark - v2 stuff, where all tasks are virtual until touched +// --------------------------------------------------------- + ++ (instancetype) newObjectForContext: (NSManagedObjectContext *) context +{ + APCLogDebug (@"HEY HEY HEY HEY HEY! Somebody's creating a scheduledTask!"); + + id thingy = [super newObjectForContext: context]; + + return thingy; +} + + @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.h index 2fd9bcb5..b67e1081 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.h @@ -1,37 +1,38 @@ -// -// APCScheduledTask.h -// APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - -#import "NSManagedObject+APCHelper.h" +// +// APCScheduledTask.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +#import @class APCResult, APCSchedule, APCTask; @@ -42,8 +43,8 @@ @property (nonatomic, retain) NSDate * createdAt; @property (nonatomic, retain) NSDate * endOn; @property (nonatomic, retain) NSDate * startOn; -@property (nonatomic, retain) NSDate * updatedAt; @property (nonatomic, retain) NSString * uid; +@property (nonatomic, retain) NSDate * updatedAt; @property (nonatomic, retain) APCSchedule *generatedSchedule; @property (nonatomic, retain) NSSet *results; @property (nonatomic, retain) APCTask *task; diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.m index 599a399c..082a988d 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCScheduledTask.m @@ -1,36 +1,36 @@ -// -// APCScheduledTask.m -// APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - +// +// APCScheduledTask.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + #import "APCScheduledTask.h" #import "APCResult.h" #import "APCSchedule.h" @@ -43,8 +43,8 @@ @implementation APCScheduledTask @dynamic createdAt; @dynamic endOn; @dynamic startOn; -@dynamic updatedAt; @dynamic uid; +@dynamic updatedAt; @dynamic generatedSchedule; @dynamic results; @dynamic task; diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSmartSurveyTask.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSmartSurveyTask.m index 06431604..431e13b1 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCSmartSurveyTask.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCSmartSurveyTask.m @@ -570,6 +570,7 @@ - (ORKAnswerFormat *)rkNumericAnswerFormat:(NSDictionary *)objectDictionary NSInteger newStepValue = (NSInteger)((double)[integerConstraint.maxValue integerValue] - (double)[integerConstraint.minValue integerValue]) / 10.0; stepValue = MAX(newStepValue, stepValue); retValue = [ORKScaleAnswerFormat scaleAnswerFormatWithMaxValue:[integerConstraint.maxValue integerValue] minValue:[integerConstraint.minValue integerValue] step:stepValue defaultValue:0]; + } else { ORKNumericAnswerFormat * format = (integerConstraint.unit.length > 0) ? [ORKNumericAnswerFormat integerAnswerFormatWithUnit:integerConstraint.unit] : [ORKNumericAnswerFormat integerAnswerFormatWithUnit:nil]; diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.h index d39a2361..2985fa8e 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.h @@ -36,13 +36,26 @@ @protocol ORKTask; @interface APCTask (AddOn) -//Synchronous Method Call -+ (void) createTasksFromJSON: (NSArray*) tasksArray inContext: (NSManagedObjectContext*) context; -+ (void) updateTasksFromJSON: (NSArray*) tasksArray inContext:(NSManagedObjectContext *)context; - -+ (APCTask*) taskWithTaskID: (NSString*) taskID inContext: (NSManagedObjectContext*) context; +/** + Runs a CoreData query in the specified context retrieving a task with + the specified ID. Returns nil if there was an error, or if there was + no task with such an ID. + + If we need the error from this method, we'll have to make an overload + of the method which returns an error parameter; several parts of our + world are already using this method as-is. + */ ++ (APCTask *) taskWithTaskID: (NSString *) taskID + inContext: (NSManagedObjectContext *) context; +/** + Stores and retrieves the binary, encoded content of the + survey itself represented by this task. + + The data is stored in CoreData as an NSData blob. + */ @property (nonatomic, strong) id rkTask; ++ (NSArray *) defaultSortDescriptors; @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.m index 5d6b19d7..30c11467 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+AddOn.m @@ -35,6 +35,8 @@ #import "APCAppCore.h" #import +static NSArray *defaultSortDescriptorsInternal = nil; + static NSString * const kTaskIDKey = @"taskID"; static NSString * const kTaskTitleKey = @"taskTitle"; static NSString * const kTaskClassNameKey = @"taskClassName"; @@ -43,71 +45,67 @@ @implementation APCTask (AddOn) -+ (void)createTasksFromJSON:(NSArray *)tasksArray inContext:(NSManagedObjectContext *)context +/** + Sets global, static values the first time anyone calls this category. + + By definition, this method is called once per category, in a thread-safe + way, the first time the category is sent a message -- basically, the first + time we refer to any method declared in that category. + + Documentation: the key sentence is actually in the documentation for + +initialize: "initialize is invoked only once per class. If you want + to perform independent initialization for the class and for categories + of the class, you should implement +load methods." + + I learned that from: + http://stackoverflow.com/q/13326435 + + The official +load documentation: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/load + + The official +initialize documentation, with that key sentence: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/initialize + */ ++ (void) load { - [context performBlockAndWait:^{ - for (NSDictionary * taskDict in tasksArray) { - APCTask * task = [APCTask newObjectForContext:context]; - task.taskID = taskDict[kTaskIDKey]; - task.taskTitle = taskDict[kTaskTitleKey]; - task.taskClassName = taskDict[kTaskClassNameKey]; - task.taskCompletionTimeString = taskDict[kTaskCompletionTimeStringKey]; - - if (taskDict[kTaskFileNameKey]) { - NSString *resource = [[NSBundle mainBundle] pathForResource:taskDict[kTaskFileNameKey] ofType:@"json"]; - NSData *jsonData = [NSData dataWithContentsOfFile:resource]; - NSError * error; - NSDictionary * dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; - id manager = SBBComponent(SBBSurveyManager); - SBBSurvey * survey = [[manager objectManager] objectFromBridgeJSON:dictionary]; - task.rkTask = [APCTask rkTaskFromSBBSurvey:survey]; - } - NSError * error; - [task saveToPersistentStore:&error]; - APCLogError2 (error); - } - }]; + defaultSortDescriptorsInternal = @[[NSSortDescriptor sortDescriptorWithKey: @"sortString" ascending: YES], + [NSSortDescriptor sortDescriptorWithKey: @"taskTitle" ascending: YES], + [NSSortDescriptor sortDescriptorWithKey: @"updatedAt" ascending: NO]]; } -+ (void) updateTasksFromJSON: (NSArray*) tasksArray inContext:(NSManagedObjectContext *)context ++ (NSArray *) defaultSortDescriptors { - [context performBlockAndWait:^{ - for (NSDictionary * taskDict in tasksArray) { - APCTask * task = [APCTask taskWithTaskID:taskDict[kTaskIDKey] inContext:context]; - if (task == nil) { - task = [APCTask newObjectForContext:context]; - task.taskID = taskDict[kTaskIDKey]; - } - task.taskTitle = taskDict[kTaskTitleKey]; - task.taskClassName = taskDict[kTaskClassNameKey]; - task.taskCompletionTimeString = taskDict[kTaskCompletionTimeStringKey]; - - if (taskDict[kTaskFileNameKey]) { - NSString *resource = [[NSBundle mainBundle] pathForResource:taskDict[kTaskFileNameKey] ofType:@"json"]; - NSData *jsonData = [NSData dataWithContentsOfFile:resource]; - NSError * error; - NSDictionary * dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; - id manager = SBBComponent(SBBSurveyManager); - SBBSurvey * survey = [[manager objectManager] objectFromBridgeJSON:dictionary]; - task.rkTask = [APCTask rkTaskFromSBBSurvey:survey]; - } - NSError * error; - [task saveToPersistentStore:&error]; - APCLogError2 (error); - } - }]; + return defaultSortDescriptorsInternal; } -+ (APCTask*) taskWithTaskID: (NSString*) taskID inContext:(NSManagedObjectContext *)context ++ (APCTask *) taskWithTaskID: (NSString *) taskID + inContext: (NSManagedObjectContext *) context { - __block APCTask * retTask; - [context performBlockAndWait:^{ - NSFetchRequest * request = [APCTask request]; - request.predicate = [NSPredicate predicateWithFormat:@"taskID == %@",taskID]; - NSError * error; - retTask = [[context executeFetchRequest:request error:&error]firstObject]; + __block APCTask *taskToReturn = nil; + + [context performBlockAndWait: ^{ + + NSFetchRequest *request = [APCTask request]; + request.predicate = [NSPredicate predicateWithFormat: @"%K == %@", + NSStringFromSelector (@selector (taskID)), + taskID]; + + NSError * errorRetrievingTasks = nil; + NSArray *possibleTasks = [context executeFetchRequest: request + error: & errorRetrievingTasks]; + + if (possibleTasks == nil) + { + APCLogError2 (errorRetrievingTasks); + } + + else + { + taskToReturn = possibleTasks.firstObject; + } }]; - return retTask; + + return taskToReturn; } - (id)rkTask diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+Bridge.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+Bridge.m index 795ab7a2..e9f96b46 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+Bridge.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask+Bridge.m @@ -35,10 +35,8 @@ #import "APCSmartSurveyTask.h" #import "APCAppDelegate.h" #import "APCLog.h" - #import "APCTask+AddOn.h" #import "NSManagedObject+APCHelper.h" - #import #import #import diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.h index 44cb1c0f..60bbdbba 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.h @@ -1,59 +1,69 @@ -// -// APCTask.h -// APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - +// +// APCTask.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + #import #import -@class APCScheduledTask; +@class APCSchedule, APCScheduledTask; @interface APCTask : NSManagedObject @property (nonatomic, retain) NSDate * createdAt; +@property (nonatomic, retain) NSString * sortString; @property (nonatomic, retain) NSString * taskClassName; @property (nonatomic, retain) NSString * taskCompletionTimeString; +@property (nonatomic, retain) NSString * taskContentFileName; @property (nonatomic, retain) NSData * taskDescription; @property (nonatomic, retain) NSString * taskHRef; @property (nonatomic, retain) NSString * taskID; +@property (nonatomic, retain) NSNumber * taskIsOptional; @property (nonatomic, retain) NSString * taskTitle; +@property (nonatomic, retain) NSNumber * taskVersionNumber; @property (nonatomic, retain) NSDate * updatedAt; -@property (nonatomic, retain) NSSet *scheduledTasks_unused; +@property (nonatomic, retain) NSSet *scheduledTasks; +@property (nonatomic, retain) NSSet *schedules; @end @interface APCTask (CoreDataGeneratedAccessors) -- (void)addScheduledTasks_unusedObject:(APCScheduledTask *)value; -- (void)removeScheduledTasks_unusedObject:(APCScheduledTask *)value; -- (void)addScheduledTasks_unused:(NSSet *)values; -- (void)removeScheduledTasks_unused:(NSSet *)values; +- (void)addScheduledTasksObject:(APCScheduledTask *)value; +- (void)removeScheduledTasksObject:(APCScheduledTask *)value; +- (void)addScheduledTasks:(NSSet *)values; +- (void)removeScheduledTasks:(NSSet *)values; + +- (void)addSchedulesObject:(APCSchedule *)value; +- (void)removeSchedulesObject:(APCSchedule *)value; +- (void)addSchedules:(NSSet *)values; +- (void)removeSchedules:(NSSet *)values; @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.m index d16f7d32..c6ce2b04 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTask.m @@ -1,49 +1,55 @@ -// -// APCTask.m -// APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - -#import "APCTask.h" +// +// APCTask.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#import "APCTask.h" +#import "APCSchedule.h" +#import "APCScheduledTask.h" @implementation APCTask @dynamic createdAt; +@dynamic sortString; @dynamic taskClassName; @dynamic taskCompletionTimeString; +@dynamic taskContentFileName; @dynamic taskDescription; @dynamic taskHRef; @dynamic taskID; +@dynamic taskIsOptional; @dynamic taskTitle; +@dynamic taskVersionNumber; @dynamic updatedAt; -@dynamic scheduledTasks_unused; +@dynamic scheduledTasks; +@dynamic schedules; @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.h new file mode 100644 index 00000000..e1edc6f9 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.h @@ -0,0 +1,156 @@ +// +// APCTaskGroup.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +@class APCTask; +@class APCPotentialTask; +@class APCScheduledTask; + + +/** + A bunch of tasks with the same ID, grouped by some ways + we typically need to group them. The tasks in each group + are NOT subclasses of the of the same superclass: some + are memory-only objects, some are CoreData objects, and + there may be further subdivisions of types. + */ +@interface APCTaskGroup : NSObject + +/** The task mentioned by all tasks in this group. */ +@property (nonatomic, strong) APCTask *task; + +/** + An array of PotentialTask objects representing both + the number of remaining required tasks for this user, + and the times of day, if any, that those tasks should + be done. + */ +@property (nonatomic, strong) NSArray *requiredRemainingTasks; + +/** + An array of ScheduledTask objects that have been marked + as "completed," which match the times required by the + attached Schedule. + */ +@property (nonatomic, strong) NSArray *requiredCompletedTasks; + +/** + An array of ScheduledTask objects that have been marked + as "completed," which the user did without being required + to do so, within the specified time range. + */ +@property (nonatomic, strong) NSArray *gratuitousCompletedTasks; + +/** + Returns the combination of -requiredCompletedTasks and + -gratuitousCompletedTasks, sorted by date completed, such + that the most recent completed task is the last object + in the array. + + @see latestCompletedTask + @see requiredCompletedTasks + @see gratuitousCompletedTasks + */ +@property (readonly) NSArray *allCompletedTasks; + +/** + Returns the most recent task completed by the user on + this date, regardless of whether it was required or + gratuitous. I.e., it returns the last object in the + -allCompletedTasks array. + + @see allCompletedTasks + */ +@property (readonly) APCScheduledTask *latestCompletedTask; + +/** + YES if there are any completed tasks in this TaskGroup + (i.e., for this date), whether required or gratuitous. + NO otherwise. + */ +@property (readonly) BOOL hasAnyCompletedTasks; + +/** + A sample PotentialTask you can use to create new + ScheduledTasks, and open the matching ViewController. + Use this if there are no more requiredRemainingTasks, + but the user still needs/wants to do one. + */ +@property (nonatomic, strong) APCPotentialTask *samplePotentialTask; + +/** + An integer reporting how many instances of this task were + required for this date range. This number will report the + total number that should have occurred, while the + -completedTasks and -requiredRemainingTasks will contain a + continuously-variable number of tasks, based on what has + in fact been accomplished. + */ +@property (nonatomic, assign) NSUInteger totalRequiredTasksForThisTimeRange; + +/** + Former name for totalRequiredTasksForThisTimeRange. + Please use -totalRequiredTasksForThisTimeRange instead. + */ +@property (readonly) NSUInteger countOfRequiredTasksForThisTimeRange __attribute__((deprecated("Please use -totalRequiredTasksForThisTimeRange instead."))); + +/** + The day whose midnight-to-midnight is represented by the + contents of this group. + */ +@property (nonatomic, strong) NSDate *date; + +/** + Returns YES if -requiredCompletedTasks.count is greater + than -countOfRequiredTasksForThisTimeRange. + */ +@property (readonly) BOOL isFullyCompleted; + +/** + Returns the date this group was fully completed -- the + latest "date updated" in the list of + requiredCompletedTasks. + */ +@property (readonly) NSDate *dateFullyCompleted; + +- (NSComparisonResult) compareWithTaskGroup: (APCTaskGroup *) otherTaskGroup; + +- (instancetype) initWithTask: (APCTask *) task + requiredRemainingPotentialTasks: (NSArray *) requiredRemainingTasks + requiredCompletedTasks: (NSArray *) requiredCompletedTasks + gratuitousCompletedTasks: (NSArray *) gratuitousCompletedTasks + samplePotentialTask: (APCPotentialTask *) samplePotentialTask + totalRequiredTasks: (NSUInteger) countOfRequiredTasks + forDate: (NSDate *) date; + +@end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.m new file mode 100644 index 00000000..c776c433 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCTaskGroup.m @@ -0,0 +1,258 @@ +// +// APCTaskGroup.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCTaskGroup.h" +#import "APCTask+AddOn.h" +#import "APCSchedule+AddOn.h" +#import "APCConstants.h" +#import "APCScheduledTask+AddOn.h" +#import "NSDate+Helper.h" + + +/** + We always sort -allCompletedTasks by the same set of + sort descriptors, so we might as well make it common. + This is thread-safe: it's created during +initialize, + and never changes. + */ +static NSArray *sortDescriptorsForSortingScheduledTasksByCompletionDate = nil; + +/** The date format we use when debug-printing the taskGroup. */ +static NSString * const kAPCDebugDateFormat = @"EEE yyyy-MM-dd HH:mm zzz"; + +/** A date formatter we use when debug-printing the taskGroup. */ +static NSDateFormatter *debugDateFormatter = nil; + + +@implementation APCTaskGroup + +/** + Set global, static values the first time anyone calls this class. + + By definition, this method is called once per class, in a thread-safe + way, the first time the class is sent a message -- basically, the first + time we refer to the class. That means we can use this to set up stuff + that applies to all objects (instances) of this class. + + Documentation: See +initialize in the NSObject Class Reference. Currently, that's here: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/initialize + */ ++ (void) initialize +{ + sortDescriptorsForSortingScheduledTasksByCompletionDate = @[[NSSortDescriptor sortDescriptorWithKey: NSStringFromSelector (@selector (updatedAt)) + ascending: YES]]; + + debugDateFormatter = [NSDateFormatter new]; + debugDateFormatter.dateFormat = kAPCDebugDateFormat; + debugDateFormatter.timeZone = [NSTimeZone localTimeZone]; +} + +- (instancetype) init +{ + self = [super init]; + + if (self) + { + _task = nil; + _samplePotentialTask = nil; + _requiredRemainingTasks = nil; + _requiredCompletedTasks = nil; + _gratuitousCompletedTasks = nil; + _totalRequiredTasksForThisTimeRange = 0; + _date = nil; + } + + return self; +} + +- (instancetype) initWithTask: (APCTask *) task + requiredRemainingPotentialTasks: (NSArray *) requiredRemainingTasks + requiredCompletedTasks: (NSArray *) requiredCompletedTasks + gratuitousCompletedTasks: (NSArray *) gratuitousCompletedTasks + samplePotentialTask: (APCPotentialTask *) samplePotentialTask + totalRequiredTasks: (NSUInteger) countOfRequiredTasks + forDate: (NSDate *) date +{ + self = [self init]; + + if (self) + { + _task = task; + _samplePotentialTask = samplePotentialTask; + _requiredRemainingTasks = requiredRemainingTasks; + _requiredCompletedTasks = requiredCompletedTasks; + _gratuitousCompletedTasks = gratuitousCompletedTasks; + _totalRequiredTasksForThisTimeRange = countOfRequiredTasks; + _date = date; + } + + return self; +} + +- (BOOL) hasAnyCompletedTasks +{ + return self.requiredCompletedTasks.count + self.gratuitousCompletedTasks.count > 0; +} + +- (BOOL) isFullyCompleted +{ + return self.requiredCompletedTasks.count >= self.totalRequiredTasksForThisTimeRange; +} + +- (NSArray *) allCompletedTasks +{ + NSMutableArray *result = [NSMutableArray new]; + + if (self.requiredCompletedTasks.count) + { + [result addObjectsFromArray: self.requiredCompletedTasks]; + } + + if (self.gratuitousCompletedTasks.count) + { + [result addObjectsFromArray: self.gratuitousCompletedTasks]; + } + + [result sortUsingDescriptors: sortDescriptorsForSortingScheduledTasksByCompletionDate]; + + return result; +} + +- (APCScheduledTask *) latestCompletedTask +{ + return self.allCompletedTasks.lastObject; +} + +- (NSDate *) dateFullyCompleted +{ + NSDate *latestCompletionDate = nil; + + for (APCScheduledTask *completedTask in self.requiredCompletedTasks) + { + if (latestCompletionDate == nil || [completedTask.updatedAt isLaterThanDate: latestCompletionDate]) + { + latestCompletionDate = completedTask.updatedAt; + } + } + + return latestCompletionDate; +} + +- (NSString *) description +{ + NSString *result = nil; + + NSMutableString *dates = [NSMutableString stringWithString: @"dates completed: "]; + + if (! self.hasAnyCompletedTasks) + { + [dates appendString: @"(none)"]; + } + else for (APCScheduledTask *scheduledTask in self.allCompletedTasks) + { + [dates appendFormat: @"%@, ", scheduledTask.updatedAt]; + } + + result = [NSString stringWithFormat: @"TaskGroup: %@ | %@ | %@ | vcToShow: %@ | %@ | tasks: %@ required, %@ completed, %@ remaining, %@ gratuitous completed, most recent completed on %@", + NSStringShortFromAPCScheduleSourceAsNumber ([self.task.schedules.anyObject scheduleSource]), + self.task.taskTitle, + self.task.taskID, + self.task.taskClassName, + dates, + @(self.totalRequiredTasksForThisTimeRange), + @(self.requiredCompletedTasks.count), + @(self.requiredRemainingTasks.count), + @(self.gratuitousCompletedTasks.count), + [self debugStringFromDate: self.latestCompletedTask.updatedAt] + ]; + + return result; +} + +- (NSComparisonResult) compareWithTaskGroup: (APCTaskGroup *) otherTaskGroup +{ + NSComparisonResult result = NSOrderedSame; + + if (self.task == nil && otherTaskGroup.task == nil) + { + result = NSOrderedSame; + } + else if (otherTaskGroup.task == nil) + { + result = NSOrderedDescending; + } + else if (self.task == nil) + { + result = NSOrderedAscending; + } + else + { + NSArray *plainTasks = @[self.task, otherTaskGroup.task]; + NSArray *sortedTasks = [plainTasks sortedArrayUsingDescriptors: [APCTask defaultSortDescriptors]]; + result = sortedTasks.firstObject == self.task ? NSOrderedAscending : NSOrderedDescending; + } + + return result; +} + +/** + Deprecated method name. Replaced by + -totalRequiredTasksForThisTimeRange. + */ +- (NSUInteger) countOfRequiredTasksForThisTimeRange +{ + return self.totalRequiredTasksForThisTimeRange; +} + +- (NSString *) debugStringFromDate: (NSDate *) date +{ + NSString *result = @"(null)"; + + if (date != nil) + { + result = [debugDateFormatter stringFromDate: date]; + } + + return result; +} + +@end + + + + + + + + + diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.h b/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.h index 7b875327..0fdf99dc 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.h +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.h @@ -42,7 +42,6 @@ typedef NS_ENUM(NSInteger, APCUserConsentSharingScope) { APCUserConsentSharingScopeAll, }; - @interface APCUser : NSObject /*********************************************************************************/ @@ -118,4 +117,23 @@ typedef NS_ENUM(NSInteger, APCUserConsentSharingScope) { - (BOOL) isLoggedOut; +/** + Returns our best approximation of the user's "date of + consent" -- the date they agreed to start the study. + + These days, we track the date the user signs up. In + earlier versions of the apps, we didn't. This method + represents a set of nest-best-guesses about that date. + */ +@property (readonly) NSDate *estimatedConsentDate; + +/** + Returns the best approximation we have for a user-consent + date if we don't yet have any user data. This is a + static method so that it can be used during database + migration, for attaching start dates to new schedules, + as well as during normal operation. + */ ++ (NSDate *) proxyForConsentDate; + @end diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.m b/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.m index 2c77f57c..5e2ac2e6 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.m +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/APCUser.m @@ -32,14 +32,14 @@ // #import "APCUser.h" -#import "APCStoredUserData.h" +#import #import "APCAppDelegate.h" -#import "APCDataSubstrate.h" #import "APCKeychainStore.h" #import "APCLog.h" - -#import "NSManagedObject+APCHelper.h" +#import "APCStoredUserData.h" +#import "APCUtilities.h" #import "HKHealthStore+APCExtensions.h" +#import "NSManagedObject+APCHelper.h" static NSString *const kNamePropertytName = @"name"; @@ -84,11 +84,13 @@ @interface APCUser () { - NSDate *_birthDate; + NSDate * _birthDate; HKBiologicalSex _biologicalSex; HKBloodType _bloodType; } + @property (nonatomic, readonly) HKHealthStore *healthStore; + @end @@ -131,7 +133,7 @@ - (NSString *)description ", self.name, self.email, self.birthDate, (int) self.biologicalSex, @(self.isSignedUp), @(self.isUserConsented), @(self.isSignedIn), @(self.isConsented), self.medicalConditions, self.medications, (int) self.bloodType, self.height, self.weight, self.wakeUpTime, self.sleepTime, self.homeLocationAddress, self.homeLocationLat, self.homeLocationLong]; } -- (void)loadStoredUserData:(NSManagedObjectContext *)context +- (void)loadStoredUserData:(NSManagedObjectContext*)context { [context performBlockAndWait:^{ APCStoredUserData * storedUserData = [self loadStoredUserDataInContext:context]; @@ -139,7 +141,7 @@ - (void)loadStoredUserData:(NSManagedObjectContext *)context }]; } -- (APCStoredUserData *)loadStoredUserDataInContext:(NSManagedObjectContext *)context +- (APCStoredUserData*)loadStoredUserDataInContext:(NSManagedObjectContext*)context { NSFetchRequest *request = [APCStoredUserData request]; NSError *error; @@ -276,6 +278,35 @@ - (NSString*) hashIfNeeded: (NSString*) password return password; } +- (NSDate *) estimatedConsentDate +{ + NSDate *consentDate = self.consentSignatureDate; + + if (! consentDate) + { + consentDate = [[self class] proxyForConsentDate]; + } + + return consentDate; +} + ++ (NSDate *) proxyForConsentDate +{ + NSDate *bestGuessConsentDate = [APCKeychainStore modifiedDateForKey: kEmailPropertyName]; + + if (! bestGuessConsentDate) + { + bestGuessConsentDate = [APCUtilities firstKnownFileAccessDate]; + } + + if (! bestGuessConsentDate) + { + bestGuessConsentDate = [NSDate date]; + } + + return bestGuessConsentDate; +} + /*********************************************************************************/ #pragma mark - Setters for Properties in Core Data diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_MIGRATION_README.txt b/APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_MIGRATION_README.txt new file mode 100644 index 00000000..4090e7c1 --- /dev/null +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_MIGRATION_README.txt @@ -0,0 +1,211 @@ +MODEL_MIGRATION_README: Notes on how to upgrade your CoreData model + + +---------- +Copyright (c) 2015, Apple Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of the copyright holder(s) nor the names of any contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. No license is granted to the trademarks of +the copyright holders even if such marks are included in this software. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +---------- + + + +We use CoreData "versioning." This means we can change the data model at development time, and the CoreData infrastructure will try to upgrade the data on the user's device at run time. + +This works "automatically" if your changes are very simple: you add entities, or you add optional attributes to existing entities. + +If you want to do anything more complex, you may need: +- a "mapping model", telling CoreData what attributes to copy from the old entities to the new ones; and +- a "migration policy," a class which computes the values of properties that can't be copied. + +Here's how to do both the automatic and mapping-model-based conversions. + + +-------------- +A. Add a new data model +-------------- + +For simple stuff, this is all you'll need. For more complex stuff, you'll also need the stuff in section B. + +(...as long as YOU care about the things it's complaining about. For example, it once "complained" that it couldn't generate unique values for a certain string. It was right: I had made that string "required." But that actually made me realize I wanted that string to be "optional." I made that attribute optional, and presto, automatic conversion worked great!) + + +Let's say we're on model version 4, and you're creating model version 5. + +1. Create the model file: + a. Click the model file for version 4 (APCModel 4.xcdatamodel) + b. Choose "Add Model Version" from Xcode's "Product" menu + c. Give the new model file an appropriate name, or accept the default (like "APCModel 5.xcdatamodel") + +2. Make it the "current" model: + a. Click the model container (APCModel.xcdatamodeld) in the Project view at left + b. In the File Inspector, set the "Model Version" to your new file ("APCModel 5") + +3. Start editing your model: + a. Click on your new model file ("APCModel 5.xcdatamodel") + +4. WATCH OUT FOR THIS XCODE BUG: + + Make sure you click on some file OTHER than the file you just created, and then click BACK to your new file, before editing it. + + Reason: Xcode seems to have a bug. When you create the new model file, Xcode highlights it in the Project view, but DOES NOT CHANGE THE CONTENTS OF THE EDITOR WINDOW. This makes it very easy to THINK you're editing your new file when you're actually changing the OLD file -- which really trashes everything about your data. + + + + +-------------- +B. Add a custom migration for your data model +-------------- + +If you try to run the app with your new model, and you see some sort of "we can't upgrade your database" warning, your data probably requires a "migration policy." + +For example, when I went from version 4 to version 5 (above), I created a new attribute called "uniqueId," and made it a "required" attribute. When CoreData tried to migrate the old data, it didn't know how to generate that new uniqueId field. (I wanted a UUID.) So my migration failed. The console log told me which fields it couldn't migrate. + +So here's how I fixed it. I learned this mostly from: + + http://9elements.com/io/index.php/customizing-core-data-migrations/ + https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmMappingOverview.html + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSMigrationManager_class/ + + +- - - - - - - - +Summary of what we're about to do +- - - - - - - - + +1. Create a Mapping Model which specifies how attributes from a version 4 file will be converted to (or invented for) a version 5 file (or whatever versions you're playing with). + +2. Create a class to do the calculations needed for that conversion. + +3. In that class, write one method for every attribute or relationship you need to create or convert. + +4. Tell the Mapping Model to use your new class. + +5. Tell the Mapping Model to use your new conversion method. + +6. Repeat steps 1-5 for every version of the model you might encounter. For example, if your customers are using versions 1, 2, and 3 of your data model -- if you've released all those versions to the App Store -- you'll need to write Mapping Models converting EACH of those versions to version 5. + + +- - - - - - - - +Details +- - - - - - - - + +1. Create a new Mapping Model: + a. Create a new Mapping Model file: File > New > CoreData > MappingModel. + b. When it asks, tell it the version you're migrating from: version 4. + c. When it asks, tell it the version you're migrating to: version 5. + d. Save that file. Name it after the versions you're mapping: perhaps "APCMappingModel4ToModel5". Use the default extension, ".xcmappingmodel". + +2. Inspect that file. Here's what you'll see: + + a. The file contains every entity and every attribute from version 4, and, by default, says to copy that data over to the same field in version 5. THAT'S GREAT, and that's what we want. The catch will be: for NEW attributes, it won't know what values to give them. And for attributes that have changed, its assumptions will be wrong. So we'll write methods to generate, or fix, JUST THOSE ATTRIBUTES. Leave everything else the way it is. + + b. You might ask: why can't I delete the entities and attributes that I *don't* want it to convert? In theory, you can. In practice, if any OTHER attributes relate to those, the automatic conversions may not do what you expect, or may not happen at all. It's probably easier to just leave the file the way it is. + +3. Create a class to perform the "hard parts" of the migration: + a. Create a new class + b. Make it a subclass of NSEntityMigrationPolicy + c. Give it an appropriate name. I called mine: + + APCDataMigrationPolicy_from_APCMedTrackerPrescription_v4_to_APCMedTrackerPrescription_v5 + + (meaning: "a bunch of methods for converting Prescription v4 objects to Prescription v5") + +4. In that class, write a method to generate the new attribute (or relationship) from the old one, or from the old object. Presume you'll receive a pointer to the old object, and will return the value of the new attribute/relationship. I'll show you how to send those values in a moment. For example, if you're generating a new Color field, you might make a method called + + - (UIColor *) generateNewColorFromOldPrescription: (id) prescriptionFromModel4 + { + // read the properties of the old object + // generate the new color + // return the new color + } + +5. Tell the mapping model to use your new class: + a. Click the Mapping Model file. + b. In the list of entities, click the entity you're about to convert. + c. In the data inspector (command-option-3), enter your new class as the "custom policy." + +6. Tell the mapping model to use your new method: + + a. Click the attribute or relationship you need to edit. + + b. In its "value" field, you WANT to call the conversion method you wrote in step 4. That method is a method of your Policy subclass, so the migration manager will execute a line of code like this: + + newColor = [yourMigrationPolicyObject getColorFromPrescription: myPrescription + usingDate: myPrescription.startDate + andColor: myPrescription.color]; + + To make it do that, enter an expression like this in the "value" field: + + FUNCTION ($entityPolicy, "getColorFromPrescription:usingDate:andColor:", $source, $source.startDate, $source.color) + + From left to right, those two lines contain the same pieces: + + yourMigrationPolicyObject = $entityPolicy + = method name, wrapped in C-style quotation marks + myPrescription = $source + myPrescription.startDate = $source.startDate + myPrescription.color = $source.color + + Those magic variables are: + + $entityPolicy a magically-created instance of your converter class from step 3 + $source a pointer to the object being converted (for me, a Prescription) + $source. a named attribute of $source, or a method call (i.e., a keypath) + + Here are some other magic variables: + + $destination the object that $source is being converted into + $manager the object doing the conversion. This is a gem: it lets you + access the ManagedObjectContexts being used to read the old + objects and generate the new ones, which means you can run + FetchRequests to inspect and generate data on either side + of the conversion. + + +7. Repeat steps 4 and 6 for every field or relationship you need to create or convert. + +8. Repeat steps 1-7 for EVERY VERSION of your data that you're likely to encounter. + + + +For more information, I used these sources: + http://9elements.com/io/index.php/customizing-core-data-migrations/ + https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmMappingOverview.html + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSMigrationManager_class/ + + +Have fun, and good luck! + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_README b/APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_README.txt similarity index 50% rename from APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_README rename to APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_README.txt index 7e5d270e..29b8be7e 100644 --- a/APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_README +++ b/APCAppCore/APCAppCore/DataSubstrate/Model/MODEL_README.txt @@ -1,3 +1,37 @@ +MODEL_README: Notes on how to use our CoreData infrastructure + + +---------- +Copyright (c) 2015, Apple Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of the copyright holder(s) nor the names of any contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. No license is granted to the trademarks of +the copyright holders even if such marks are included in this software. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +---------- + + CORE DATA NOTES --------------- diff --git a/APCAppCore/APCAppCore/Library/APCMotionHistoryReporter.m b/APCAppCore/APCAppCore/Library/APCMotionHistoryReporter.m index efb1599a..f56968bf 100644 --- a/APCAppCore/APCAppCore/Library/APCMotionHistoryReporter.m +++ b/APCAppCore/APCAppCore/Library/APCMotionHistoryReporter.m @@ -150,6 +150,8 @@ -(void)getMotionCoProcessorDataFrom:(NSDate *)startDate andEndDate:(NSDate *)end NSMutableArray *motionDayValues = [NSMutableArray new]; + BOOL activityRangeTimeFound = NO; + for(CMMotionActivity *activity in activities) { @@ -173,6 +175,8 @@ -(void)getMotionCoProcessorDataFrom:(NSDate *)startDate andEndDate:(NSDate *)end removeThis = [midnight timeIntervalSinceDate:lastActivity_started]; activityLengthTime = activityLengthTime - removeThis; + + activityRangeTimeFound = YES; } //Look for walking moderate and high confidence @@ -205,7 +209,7 @@ -(void)getMotionCoProcessorDataFrom:(NSDate *)startDate andEndDate:(NSDate *)end if(activity.confidence == CMMotionActivityConfidenceMedium || activity.confidence == CMMotionActivityConfidenceHigh) // 45 seconds { - totalModerateTime += fabs(activityLength); + totalModerateTime += fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); } @@ -256,37 +260,42 @@ -(void)getMotionCoProcessorDataFrom:(NSDate *)startDate andEndDate:(NSDate *)end } else if(lastMotionActivityType == MotionActivityUnknown) { - NSTimeInterval lastActivityDuration = fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); - if (activity.stationary) { - totalSedentaryTime += lastActivityDuration; + totalSedentaryTime += fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); + + lastMotionActivityType = MotionActivityStationary; lastActivity_started = activity.startDate; } else if (activity.walking && activity.confidence == CMMotionActivityConfidenceLow) { - totalLightActivityTime += lastActivityDuration; + totalLightActivityTime += fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); + lastMotionActivityType = MotionActivityWalking; lastActivity_started = activity.startDate; } else if (activity.walking) { - totalModerateTime += lastActivityDuration; + totalModerateTime += fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); + lastMotionActivityType = MotionActivityWalking; lastActivity_started = activity.startDate; } else if (activity.running) { - totalRunningTime += lastActivityDuration; + totalRunningTime += fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); + lastMotionActivityType = MotionActivityRunning; lastActivity_started = activity.startDate; } else if (activity.cycling) { - totalRunningTime += lastActivityDuration; + totalRunningTime += fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); + lastMotionActivityType = MotionActivityCycling; lastActivity_started = activity.startDate; } else if (activity.automotive) { - totalSedentaryTime += lastActivityDuration; + totalSedentaryTime += fabs([lastActivity_started timeIntervalSinceDate:activity.startDate]); + lastMotionActivityType = MotionActivityAutomotive; lastActivity_started = activity.startDate; } @@ -308,6 +317,13 @@ -(void)getMotionCoProcessorDataFrom:(NSDate *)startDate andEndDate:(NSDate *)end } + else if (activity.walking && activity.confidence == CMMotionActivityConfidenceLow) + { + lastMotionActivityType = MotionActivityWalking; + lastActivity_started = activity.startDate; + + } + else if (activity.running){ lastMotionActivityType = MotionActivityRunning; diff --git a/APCAppCore/APCAppCore/Library/AppearanceHelpers/APCAppearanceInfo.m b/APCAppCore/APCAppCore/Library/AppearanceHelpers/APCAppearanceInfo.m index ebd8f317..26a90222 100644 --- a/APCAppCore/APCAppCore/Library/AppearanceHelpers/APCAppearanceInfo.m +++ b/APCAppCore/APCAppCore/Library/AppearanceHelpers/APCAppearanceInfo.m @@ -35,48 +35,64 @@ #import "UIColor+APCAppearance.h" #import "APCConstants.h" -static NSDictionary * localAppearanceDictionary; + + +static NSDictionary * localAppearanceDictionary = nil; +static NSDictionary * defaultAppearanceDictionary = nil; + + @implementation APCAppearanceInfo -+ (void) setAppearanceDictionary: (NSDictionary*) appearanceDictionary +/** + Set global, static values the first time anyone calls this class. + + By definition, this method is called once per class, in a thread-safe + way, the first time the class is sent a message -- basically, the first + time we refer to the class. That means we can use this to set up stuff + that applies to all objects (instances) of this class. + + Documentation: See +initialize in the NSObject Class Reference. Currently, that's here: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/initialize + */ ++ (void) initialize { - localAppearanceDictionary = appearanceDictionary; + defaultAppearanceDictionary = @{ + // Fonts + kRegularFontNameKey : @"HelveticaNeue", + kMediumFontNameKey : @"HelveticaNeue-Medium", + kLightFontNameKey : @"HelveticaNeue-Light", + + // Colors + kPrimaryAppColorKey : [UIColor colorWithRed: 0.176 green: 0.706 blue: 0.980 alpha: 1.000], // #2db4fa + + kSecondaryColor1Key : [UIColor blackColor], // #000000 + kSecondaryColor2Key : [UIColor colorWithWhite: 0.392 alpha: 1.000], // #646464 + kSecondaryColor3Key : [UIColor colorWithRed: 0.557 green: 0.557 blue: 0.573 alpha: 1.000], // #8e8e93 + kSecondaryColor4Key : [UIColor colorWithWhite: 0.973 alpha: 1.000], // #f8f8f8 + + kTertiaryColor1Key : [UIColor colorWithRed: 0.267 green: 0.824 blue: 0.306 alpha:1.000], // #44d24e + kTertiaryColor2Key : [UIColor blackColor], // #000000 + + kTertiaryGreenColorKey : [UIColor colorWithRed: 0.195 green: 0.830 blue: 0.443 alpha: 1.000], + kTertiaryBlueColorKey : [UIColor colorWithRed: 0.132 green: 0.684 blue: 0.959 alpha: 1.000], + kTertiaryRedColorKey : [UIColor colorWithRed: 0.919 green: 0.226 blue: 0.342 alpha: 1.000], + kTertiaryYellowColorKey : [UIColor colorWithRed: 0.994 green: 0.709 blue: 0.278 alpha: 1.000], + kTertiaryPurpleColorKey : [UIColor colorWithRed: 0.574 green: 0.252 blue: 0.829 alpha: 1.000], + kTertiaryGrayColorKey : [UIColor colorWithRed: 157/255.0f green: 157/255.0f blue: 157/255.0f alpha: 1.000], + + kBorderLineColor : [UIColor colorWithWhite: 0.749 alpha: 1.000] + }; } -// This is per Parkinson's App -+ (NSDictionary *)defaultAppearanceDictionary ++ (void) setAppearanceDictionary: (NSDictionary*) appearanceDictionary { - return @{ - //Fonts - kRegularFontNameKey : @"HelveticaNeue", - kMediumFontNameKey : @"HelveticaNeue-Medium", - kLightFontNameKey : @"HelveticaNeue-Light", - - //Colors - kPrimaryAppColorKey : [UIColor colorWithRed:0.176 green:0.706 blue:0.980 alpha:1.000], //#2db4fa - - kSecondaryColor1Key : [UIColor blackColor], //#000000 - kSecondaryColor2Key : [UIColor colorWithWhite:0.392 alpha:1.000], //#646464 - kSecondaryColor3Key : [UIColor colorWithRed:0.557 green:0.557 blue:0.573 alpha:1.000], //#8e8e93 - kSecondaryColor4Key : [UIColor colorWithWhite:0.973 alpha:1.000], //#f8f8f8 - - kTertiaryColor1Key : [UIColor colorWithRed:0.267 green:0.824 blue:0.306 alpha:1.000], //#44d24e - kTertiaryColor2Key : [UIColor blackColor], //#ff0000 - - kTertiaryGreenColorKey : [UIColor colorWithRed:0.195 green:0.830 blue:0.443 alpha:1.000], - kTertiaryBlueColorKey : [UIColor colorWithRed:0.132 green:0.684 blue:0.959 alpha:1.000], - kTertiaryRedColorKey : [UIColor colorWithRed:0.919 green:0.226 blue:0.342 alpha:1.000], - kTertiaryYellowColorKey : [UIColor colorWithRed:0.994 green:0.709 blue:0.278 alpha:1.000], - kTertiaryPurpleColorKey : [UIColor colorWithRed:0.574 green:0.252 blue:0.829 alpha:1.000], - kTertiaryGrayColorKey : [UIColor colorWithRed:157/255.0f green:157/255.0f blue:157/255.0f alpha:1.000], - kBorderLineColor: [UIColor colorWithWhite:0.749 alpha:1.000] - }; + localAppearanceDictionary = appearanceDictionary; } -+ (id)valueForAppearanceKey:(NSString *)key ++ (id) valueForAppearanceKey: (NSString *) key { - return localAppearanceDictionary[key] ?: [self defaultAppearanceDictionary][key]; + return localAppearanceDictionary [key] ?: defaultAppearanceDictionary [key]; } @end diff --git a/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.h b/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.h index 9d3dae43..f008fedc 100644 --- a/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.h +++ b/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.h @@ -36,6 +36,7 @@ @interface CLLocation (APCAdditions) - (double)bearingToLocation:(CLLocation*)destinationLocation; +- (double)calculateMagnitudeToLocation:(CLLocation*)destinationLocation; - (double)calculateDirectionFromLocation:(CLLocation*)destinationLocation; @end diff --git a/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.m b/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.m index 9769143c..e51af854 100644 --- a/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.m +++ b/APCAppCore/APCAppCore/Library/Categories/CLLocation+APCAdditions.m @@ -52,6 +52,19 @@ - (double)bearingToLocation:(CLLocation*)destinationLocation return RadiansToDegrees(radiansBearing); } +- (double)calculateMagnitudeToLocation:(CLLocation*)destinationLocation +{ + double lat1 = DegreesToRadians(self.coordinate.latitude); + double lon1 = DegreesToRadians(self.coordinate.longitude); + double lat2 = DegreesToRadians(destinationLocation.coordinate.latitude); + double lon2 = DegreesToRadians(destinationLocation.coordinate.longitude); + double latDeltaSquared = pow(lat2 - lat1, 2); + double lonDeltaSquared = pow(lon2 - lon1, 2); + double latLonSummed = latDeltaSquared + lonDeltaSquared; + + return sqrt(latLonSummed); +} + - (double)calculateDirectionFromLocation:(CLLocation*)destinationLocation { double lat1 = DegreesToRadians(self.coordinate.latitude); diff --git a/APCAppCore/APCAppCore/Library/Categories/CMMotionActivity+Helper.m b/APCAppCore/APCAppCore/Library/Categories/CMMotionActivity+Helper.m index 2e23100f..9a04d42e 100644 --- a/APCAppCore/APCAppCore/Library/Categories/CMMotionActivity+Helper.m +++ b/APCAppCore/APCAppCore/Library/Categories/CMMotionActivity+Helper.m @@ -46,6 +46,15 @@ @implementation CMMotionActivity (Helper) +- (NSString *) confidenceName +{ + NSString *name = (self.confidence == CMMotionActivityConfidenceHigh ? @"high" : + self.confidence == CMMotionActivityConfidenceMedium ? @"medium" : + @"low"); + + return name; +} + - (APCCMMotionActivityType) activityType { APCCMMotionActivityType type = (self.stationary ? APCCMMotionActivityTypeStationary : diff --git a/APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.h b/APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.h new file mode 100644 index 00000000..e48ea033 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.h @@ -0,0 +1,91 @@ +// +// NSArray+APCHelper.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@interface NSArray (APCHelper) + +/** + Because, sometimes, the second object in an array has + real, meaningful value, such as the 2nd day in a month, + the 2nd item in a start-and-stop-value array, etc. In + those cases, having this -secondObject property avoids + having "magic numbers" in the code: hard-coding a "1" + to access that second array element. + */ +@property (readonly) id secondObject; + +/** + Creates a new array containing the contents of the specified arrays. + Does not remove duplicates. + + Usage: + + @code + NSArray *myArray = [NSArray arrayWithObjectsFromArrays: someArray, someOtherArray, someThirdArray]; + @endcode + */ ++ (instancetype) arrayWithObjectsFromArrays: (NSArray *) firstArray, ...; + +// /** +// Creates a new array containing the elements of self which are +// NOT in otherArray. Never returns nil (unless self is nil). +// */ +// - (NSArray *) arrayBySubtractingObjectsInArray: (NSArray *) otherArray; + +// /** +// Creates a new array containing the elements of self which are +// also in otherArray. +// */ +// - (NSArray *) arrayByInsersectingArray: (NSArray *) otherArray +// usingComparisonSelector: (SEL) comparisonSelector; + +// /** +// Creates a new array containing the elements of self which are +// NOT in any of the specified arrays. Never returns nil (unless +// self is nil). +// +// Usage: +// +// @code +// NSArray *stuffIWantToKeep = [self getStuffToKeep]; +// NSArray *someStuffIDontWant = [self getGarbage]; +// NSArray *moreStuffIDontWant = [self getMoreGarbage]; +// NSArray *lotsOfStuffIDontWant = [self getYetMoreGarbage]; +// +// NSArray *finalList = [stuffIWantToKeep arrayBySubtractingObjectsInArrays: someStuffIDontWant, moreStuffIDontWant, lotsOfStuffIDontWant]; +// @endcode +// */ +// - (NSArray *) arrayBySubtractingObjectsInArrays: (NSArray *) firstArray, ... ; + +@end diff --git a/APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.m b/APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.m new file mode 100644 index 00000000..53a87839 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Categories/NSArray+APCHelper.m @@ -0,0 +1,194 @@ +// +// NSArray+APCHelper.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "NSArray+APCHelper.h" +#import "APCUtilities.h" + +@implementation NSArray (APCHelper) + ++ (instancetype) arrayWithObjectsFromArrays: (NSArray *) firstArray, ... +{ + NSArray *inboundArrays = NSArrayFromVariadicArguments (firstArray); + NSMutableArray *result = nil; + + /* + I found a tantalizing suggestion of a built-in Objective-C + way of doing this: a call to -valueForKeyPath which runs a + "collection" operation on the thing you pass it. There are + several such operations having to do with the "unions" of + arrays. However, they had specific limitations: "raises + an exception if such-and-such is nil." I prefer to write + stuff so that it never crashes, or appears to crash. + + For your information, though, I found it here: + http://stackoverflow.com/a/17091443 + + ...which pointed to this official documentation: + https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html + */ + if (inboundArrays.count) + { + result = [NSMutableArray new]; + + for (id thingy in inboundArrays) + { + if ([thingy isKindOfClass: [NSArray class]]) + { + [result addObjectsFromArray: thingy]; + } + } + } + + return result; +} + +// - (NSArray *) arrayBySubtractingObjectsInArray: (NSArray *) otherArray +// { +// NSArray *result = nil; +// +// if (self.count == 0) +// { +// result = [NSArray new]; +// } +// else if (otherArray.count == 0) +// { +// result = [NSArray arrayWithArray: self]; +// } +// else +// { +// NSMutableArray *workZone = [NSMutableArray new]; +// +// for (id item in self) +// { +// /* +// Note that -contains uses -isEqual, which might be expensive, +// depending on the objects we're comparing. This is always +// true with doing array operations; it's still worth noting. +// */ +// if (! [otherArray containsObject: item]) +// { +// [workZone addObject: item]; +// } +// } +// +// result = [NSArray arrayWithArray: workZone]; +// } +// +// return result; +// } + +// - (NSArray *) arrayBySubtractingObjectsInArrays: (NSArray *) firstArray, ... +// { +// NSArray *inboundArrays = NSArrayFromVariadicArguments (firstArray); +// NSArray *result = nil; +// +// if (self.count == 0) +// { +// result = [NSArray new]; +// } +// +// else +// { +// NSMutableArray *workZone = [NSMutableArray new]; +// +// for (id maybeArray in inboundArrays) +// { +// if ([maybeArray isKindOfClass: [NSArray class]]) +// { +// [workZone addObjectsFromArray: maybeArray]; +// } +// } +// +// result = [NSArray arrayWithArray: workZone]; +// } +// +// return result; +// } + +// - (NSArray *) arrayByInsersectingArray: (NSArray *) otherArray +// usingComparisonSelector: (SEL) comparisonSelector +// { +// NSArray *intersection = nil; +// +// if (self.count == 0 || otherArray.count == 0) +// { +// intersection = [NSArray new]; +// } +// else +// { +// NSMutableArray *temp = [NSMutableArray new]; +// +// for (id item in self) +// { +// for (id ) +// } +// +// +// +// +// +// /* +// Thanks to http://stackoverflow.com/a/12174070 . +// */ +// NSMutableSet *mySet = [NSMutableSet setWithArray: self]; +// NSSet *otherSet = [NSSet setWithArray: otherArray]; +// [mySet intersectSet: otherSet]; +// intersection = mySet.allObjects; +// } +// +// return intersection; +// } + +- (id) secondObject +{ + id result = nil; + + if (self.count >= 2) + { + result = self [1]; + } + + return result; +} + +@end + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.h b/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.h index b0bb7505..e011d83c 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.h +++ b/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.h @@ -53,6 +53,20 @@ extern NSString * const NSDateDefaultDateFormat; */ - (NSString *) toStringInISO8601Format; +/** + Tries to interpret the specified string with any of + several legal ISO8601 formats. + + To add formats, modify the +initialize method in this + category. + + @return An NSDate, if one could be created from the + specified string. Returns nil if the conversion failed. + To change the list of possible input formats, change the + +initialize method in this category. + */ ++ (NSDate *) dateWithISO8601String: (NSString *) iso8601string; + - (NSString *) friendlyDescription; - (NSDate *) dateByAddingDays:(NSInteger)inDays; @@ -64,6 +78,9 @@ extern NSString * const NSDateDefaultDateFormat; - (instancetype) startOfDay; - (instancetype) endOfDay; +- (instancetype) dayBefore; +- (instancetype) dayAfter; + +(instancetype) todayAtMidnight; +(instancetype) tomorrowAtMidnight; +(instancetype) yesterdayAtMidnight; @@ -77,6 +94,137 @@ extern NSString * const NSDateDefaultDateFormat; - (BOOL) isInThePast; - (BOOL) isInTheFuture; -+ (NSTimeInterval) parseISO8601DurationString: (NSString*) duration ; +/** Returns YES if self and otherDate are on the same + human-perceived day -- if they're both between midnight + and midnight on the same date. + */ +- (BOOL) isSameDayAsDate: (NSDate *) otherDate; + + +/** + Adds the specified duration string to the specified + date. Duration strings follow the ISO8601 standard. + Some examples: + + @code + P3D 3 days ("P" == "period") + P1W 1 week + P2D5H10S 2 days, 5 hours, and 10 seconds + P36H 36 hours, i.e., a day and a half + P1.5D a day and a half, i.e., 36 hours + @endcode + + If you want to include minutes, you'll need a (T)ime + indicator somewhere to the left of it, to distinguish it + from months. Like this: + + @code + P3DT5M 3 days + 5 minutes + @endcode + + You can use any time interval from (S)econds through + (Y)ears, except fortnights. Time will be measured in + terms of the interval: 1.5D and 36H both give you a + day and a half, but 1M or 1Y will give you different + numbers of days, depending on the months and leap years + as measured from startDate. If you specify a startDate + of nil, you'll get 30 days per month and 365 days per + year. + + @param duration An ISO8601 duration string, as described + above. + + @param date A date from which to start counting. Mostly + matters for durations involving months: "P1M" (1 month) + means different things if you start on January 1 or + February 1, and if months or years go far enough, we have + to account for leap years. So: if you specify nil, the + calculation will use 30 days per month (every month) and + 365 days per year. If you specify a real date, the + calculations will account for the actual number of days + per month during the elapsed months, and will account for + leap years. + + @see +timeIntervalBySubtractingISO8601Duration:fromDate + @see http://en.wikipedia.org/wiki/ISO_8601#Durations + */ ++ (NSTimeInterval) timeIntervalByAddingISO8601Duration: (NSString *) duration + toDate: (NSDate *) date; + +/** + Just like +timeIntervalByAddingISO8601Duration:toDate:, + but subtracts the specified duration from the specified + date. + + @see +timeIntervalByAddingISO8601Duration:toDate: + */ ++ (NSTimeInterval) timeIntervalBySubtractingISO8601Duration: (NSString *) duration + fromDate: (NSDate *) date; + +/** + Just like +timeIntervalByAddingISO8601Duration:toDate:, + operating on self instead of a passed-in date parameter. + + @see +timeIntervalByAddingISO8601Duration:toDate: + */ +- (NSTimeInterval) timeIntervalByAddingISO8601Duration: (NSString *) duration; + +/** + Just like +timeIntervalByAddingISO8601Duration:toDate:, + but subtracts the specified duration from the specified + self instead of adding to a passed-in parameter. + + @see +timeIntervalByAddingISO8601Duration:toDate: + */ +- (NSTimeInterval) timeIntervalBySubtractingISO8601Duration: (NSString *) duration; + +/** + Adds the specified duration string to the specified + date. Duration strings follow the ISO8601 standard. + Some examples: + + @code + P3D 3 days ("P" == "period") + P1W 1 week + P2D5H10S 2 days, 5 hours, and 10 seconds + P36H 36 hours, i.e., a day and a half + P1.5D a day and a half, i.e., 36 hours + @endcode + + If you want to include minutes, you'll need a (T)ime + indicator somewhere to the left of it, to distinguish it + from months. Like this: + + @code + P3DT5M 3 days + 5 minutes + @endcode + + You can use any time interval from (S)econds through + (Y)ears, except fortnights. Time will be measured in + terms of the interval: 1.5D and 36H both give you a + day and a half, but 1M or 1Y will give you different + numbers of days, depending on the months and leap years + as measured from startDate. + + This method calls + +timeIntervalByAddingISO8601Duration:toDate. + + @param durationString An ISO8601 duration string, as + described above. + + @see -dateBySubtractingISO8601Duration: + @see +timeIntervalByAddingISO8601Duration:toDate: + @see http://en.wikipedia.org/wiki/ISO_8601#Durations + */ +- (NSDate *) dateByAddingISO8601Duration: (NSString *) durationString; + +/** + Just like -dateByAddingISO8601Duration:, but subtracts + the specified duration from self. See + -dateByAddingISO8601Duration: for details. + + @see -dateByAddingISO8601Duration: + */ +- (NSDate *) dateBySubtractingISO8601Duration: (NSString *) durationString; @end diff --git a/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.m b/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.m index 378859eb..26135b3d 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.m +++ b/APCAppCore/APCAppCore/Library/Categories/NSDate+Helper.m @@ -32,12 +32,21 @@ // #import "NSDate+Helper.h" +#import "NSDateComponents+Helper.h" -NSString * const NSDateDefaultDateFormat = @"MMM dd, yyyy"; + +NSString * const NSDateDefaultDateFormat = @"MMM dd, yyyy"; + + +/** + For formatting dates we send to the server, and + interpreting inbound date strings. + */ +static NSString * const kAPCDateFormatLocaleEN_US_POSIX = @"en_US_POSIX"; /** - Sage requires our dates to be in "ISO-8601" format, + Sage requires our dates to be in "ISO 8601" format, like this: 2015-02-25T16:42:11+00:00 @@ -47,10 +56,45 @@ */ static NSString * const kDateFormatISO8601 = @"yyyy-MM-dd'T'HH:mm:ssZZZZZ"; +/** + The possible ways we might receive an ISO8601 date. + Filled in during +initialize. + */ +static NSArray * kAPCDateFormatISO8601InputOptions = nil; + + + +/** + Makes some of the method calls below more explicit. + */ +typedef enum : NSUInteger { + APCDateDirectionForwards, + APCDateDirectionBackwards, +} APCDateDirection; + @implementation NSDate (Helper) ++ (void) initialize +{ + /* + For more options, see http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns + */ + kAPCDateFormatISO8601InputOptions = @[@"yyyy-MM-dd", + @"yyyy-MM-dd'T'HH:mm", + @"yyyy-MM-dd'T'HH:mmZZZZZ", + @"yyyy-MM-dd'T'HH:mm:ssZZZZZ", + @"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ", + ]; +} + + + +// --------------------------------------------------------- +#pragma mark - Strings and Printouts +// --------------------------------------------------------- + - (NSString *) toStringWithFormat:(NSString *)format { if (!format) { format = NSDateDefaultDateFormat; @@ -128,12 +172,43 @@ - (NSString *) toStringInISO8601Format locale ("en_US_POSIX"), instead of the simpler "en-US", see: http://blog.gregfiumara.com/archives/245 */ - [formatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier: @"en_US_POSIX"]]; + [formatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier: kAPCDateFormatLocaleEN_US_POSIX]]; NSString *result = [formatter stringFromDate: self]; return result; } ++ (NSDate *) dateWithISO8601String: (NSString *) iso8601string +{ + NSDate *result = nil; + + if (iso8601string.length) + { + NSDateFormatter *formatter = [NSDateFormatter new]; + [formatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier: kAPCDateFormatLocaleEN_US_POSIX]]; + + for (NSUInteger formatIndex = 0; formatIndex < kAPCDateFormatISO8601InputOptions.count; formatIndex ++) + { + NSString *dateFormat = kAPCDateFormatISO8601InputOptions [formatIndex]; + [formatter setDateFormat: dateFormat]; + result = [formatter dateFromString: iso8601string]; + + if (result) + { + break; + } + } + } + + return result; +} + + + +// --------------------------------------------------------- +#pragma mark - General (Uncategorized) utility functions and "properties" +// --------------------------------------------------------- + + (NSUInteger)ageFromDateOfBirth:(NSDate *)dateOfBirth { NSUInteger answer = 0; @@ -174,6 +249,16 @@ - (instancetype) endOfDay return [cal dateFromComponents:components]; } +- (instancetype) dayBefore +{ + return [self dateByAddingDays: -1]; +} + +- (instancetype) dayAfter +{ + return [self dateByAddingDays: 1]; +} + + (instancetype) startOfTomorrow: (NSDate*) date { NSCalendar *cal = [NSCalendar currentCalendar]; @@ -259,60 +344,223 @@ - (BOOL) isInTheFuture return result; } -+ (NSTimeInterval) parseISO8601DurationString: (NSString*) duration { - - float i = 0, years = 0, months = 0, weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0; +- (BOOL) isSameDayAsDate: (NSDate *) otherDate +{ + BOOL result = ([self isLaterThanOrEqualToDate: otherDate.startOfDay] && + [self isEarlierOrEqualToDate: otherDate.endOfDay]); + + return result; +} + + + +// --------------------------------------------------------- +#pragma mark - ISO 8601 conversion +// --------------------------------------------------------- + ++ (NSTimeInterval) timeIntervalByAddingISO8601Duration: (NSString *) duration + toDate: (NSDate *) startDate + addInDirection: (APCDateDirection) dateDirection +{ + float characterIndex = 0, years = 0, months = 0, weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0; BOOL timeStarted = NO; - while(i < duration.length) + while (characterIndex < duration.length) { - NSString *str = [duration substringWithRange:NSMakeRange(i, duration.length-i)]; - - i++; + NSString *substring = [duration substringWithRange: NSMakeRange (characterIndex, duration.length - characterIndex)]; + + characterIndex++; - if([str hasPrefix:@"P"]) continue; + if ([substring hasPrefix: @"P"]) + { + // Expected prefix to everything. Keep going. + } - if ([str hasPrefix:@"T"]) { + else if ([substring hasPrefix: @"T"]) + { timeStarted = YES; - continue; } - - - NSScanner *sc = [NSScanner scannerWithString:str]; - float value = 0; - - if ([sc scanFloat:&value]) + + else { - i += [sc scanLocation]-1; - - str = [duration substringWithRange:NSMakeRange(i, duration.length-i)]; - - i++; - - if([str hasPrefix:@"Y"]) - years = value; - else if([str hasPrefix:@"M"] && !timeStarted) - months = value; - else if([str hasPrefix:@"W"]) - weeks = value; - else if([str hasPrefix:@"D"]) - days = value; - else if([str hasPrefix:@"H"]) - hours = value; - else if([str hasPrefix:@"M"] && timeStarted) - minutes = value; - else if([str hasPrefix:@"S"]) - seconds = value; + NSScanner *scanner = [NSScanner scannerWithString: substring]; + float value = 0; + + if ([scanner scanFloat: & value]) + { + characterIndex += [scanner scanLocation] - 1; + substring = [duration substringWithRange: NSMakeRange (characterIndex, duration.length - characterIndex)]; + characterIndex ++; + + if ([substring hasPrefix: @"Y"]) { years = value; } + else if ([substring hasPrefix: @"M"] && ! timeStarted) { months = value; } + else if ([substring hasPrefix: @"W"]) { weeks = value; } + else if ([substring hasPrefix: @"D"]) { days = value; } + else if ([substring hasPrefix: @"H"]) { hours = value; } + else if ([substring hasPrefix: @"M"] && timeStarted) { minutes = value; } + else if ([substring hasPrefix: @"S"]) { seconds = value; } + + else + { + // TODO: handle this. + } + } + else + { + // TODO: handle this. + } } } - -// NSLog(@"%@", [NSString stringWithFormat:@"%0.2f years, %0.2f months, %0.2f weeks, %0.2f days, %0.2f hours, %0.2f mins, %0.2f seconds", years, months, weeks, days, hours, minutes, seconds]); - NSTimeInterval interval = 0; - interval = years * 365 + months * 30 + weeks * 7 + days; //Days - interval = (interval * 24) + hours; //Hours - interval = (interval * 60) + minutes; //Minutes - interval = (interval * 60) + seconds; //Seconds - return interval; + + if (dateDirection == APCDateDirectionForwards) + { + // Actually, that's the default. + } + else + { + seconds = - seconds; + minutes = - minutes; + hours = - hours; + days = - days; + weeks = - weeks; + months = - months; + years = - years; + } + + NSTimeInterval elapsedTimeInterval = 0; + + if ((months != 0 || years != 0) && startDate != nil) + { + NSDateComponents *components = [NSDateComponents components: @[ @(NSCalendarUnitDay), @(NSCalendarUnitMonth), @(NSCalendarUnitYear) ] + inGregorianLocalFromDate: startDate]; + + components.month += months; + components.year += years; + components.day += days; + components.hour += hours; + components.minute += minutes; + components.second += seconds; + NSDate *newDate = components.date; + elapsedTimeInterval = [newDate timeIntervalSinceDate: startDate]; + } + else + { + /* + If we get here, either we don't have a startDate -- + so we don't know where to start counting, which means + we'll use 30 days for "days per month" and 365 for + "days per year" -- or the user didn't specify months + and/or years, which means those will zero out. + */ + elapsedTimeInterval = years * 365 + months * 30 + weeks * 7 + days; + elapsedTimeInterval = (elapsedTimeInterval * 24) + hours; + elapsedTimeInterval = (elapsedTimeInterval * 60) + minutes; + elapsedTimeInterval = (elapsedTimeInterval * 60) + seconds; + } + + return elapsedTimeInterval; +} + ++ (NSTimeInterval) timeIntervalByAddingISO8601Duration: (NSString *) duration + toDate: (NSDate *) date +{ + NSTimeInterval result = [self timeIntervalByAddingISO8601Duration: duration + toDate: date + addInDirection: APCDateDirectionForwards]; + return result; +} + ++ (NSTimeInterval) timeIntervalBySubtractingISO8601Duration: (NSString *) duration + fromDate: (NSDate *) date +{ + NSTimeInterval result = [self timeIntervalByAddingISO8601Duration: duration + toDate: date + addInDirection: APCDateDirectionBackwards]; + return result; +} + +- (NSTimeInterval) timeIntervalByAddingISO8601Duration: (NSString *) duration +{ + NSTimeInterval time = [[self class] timeIntervalByAddingISO8601Duration: duration toDate: self]; + + return time; +} + +- (NSTimeInterval) timeIntervalBySubtractingISO8601Duration: (NSString *) duration +{ + NSTimeInterval time = [[self class] timeIntervalBySubtractingISO8601Duration: duration fromDate: self]; + + return time; +} + ++ (NSDate *) dateByAddingISO8601Duration: (NSString *) duration + toDate: (NSDate *) date + addInDirection: (APCDateDirection) dateDirection +{ + NSTimeInterval timeToAdd = [self timeIntervalByAddingISO8601Duration: duration + toDate: date + addInDirection: dateDirection]; + + if (date == nil) + { + date = [NSDate date]; + } + + NSDate *result = [date dateByAddingTimeInterval: timeToAdd]; + + return result; +} + ++ (NSDate *) dateByAddingISO8601Duration: (NSString *) duration + toDate: (NSDate *) date +{ + NSDate *result = [self dateByAddingISO8601Duration: duration + toDate: date + addInDirection: APCDateDirectionForwards]; + return result; } ++ (NSDate *) dateBySubtractingISO8601Duration: (NSString *) duration + fromDate: (NSDate *) date +{ + NSDate *result = [self dateByAddingISO8601Duration: duration + toDate: date + addInDirection: APCDateDirectionBackwards]; + return result; +} + +- (NSDate *) dateByAddingISO8601Duration: (NSString *) durationString +{ + NSDate *result = [[self class] dateByAddingISO8601Duration: durationString toDate: self]; + + return result; +} + +- (NSDate *) dateBySubtractingISO8601Duration: (NSString *) durationString +{ + NSDate *result = [[self class] dateBySubtractingISO8601Duration: durationString fromDate: self]; + + return result; +} + + @end + + + + + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/Library/Categories/NSDateComponents+Helper.m b/APCAppCore/APCAppCore/Library/Categories/NSDateComponents+Helper.m index 48703a58..c664ddd2 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSDateComponents+Helper.m +++ b/APCAppCore/APCAppCore/Library/Categories/NSDateComponents+Helper.m @@ -43,8 +43,15 @@ @implementation NSDateComponents (Helper) + (NSCalendar *) gregorianCalendar { + /* + Please leave the debugging statements in this method. + */ + // NSLog (@"+gregorianCalendar: accessed. isMainThread = %@", @([NSThread isMainThread])); + if (_gregorianCalendar == nil) { + // NSLog (@"+gregorianCalendar: creating (!). isMainThread = %@", @([NSThread isMainThread])); + _gregorianCalendar = [NSCalendar calendarWithIdentifier: NSCalendarIdentifierGregorian]; } diff --git a/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.h b/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.h index 38764131..264cfaef 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.h +++ b/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.h @@ -39,4 +39,30 @@ + (instancetype) dictionaryWithJSONString: (NSString *) string; - (NSString *)formatNumbersAndDays; + +/** + Loads the specified file from disk, attempts to interpret it + as a JSON dictionary, and returns the resulting NSDictionary. + If it encounters a problem, stops, returns nil, and optionally + returns an error in the specified error object. + + @param filename The normal-looking name of a file in the + specified bundle, like "temp.json". + + @param bundle The application bundle in which to search for this + file. Pass nil to use the "main" bundle [NSBundle mainBundle]. + + @param errorToReturn Will contain the error results, if any, or + will be nil if there was no error. Pass nil if you want to + ignore this value. You can still check the result value for nil + to see if there was a problem. + + @return an NSDictionary containing the contents of the specified + file, or nil if there was a problem. + */ ++ (NSDictionary *) dictionaryWithContentsOfJSONFileWithName: (NSString *) filename + inBundle: (NSBundle *) bundle + returningError: (NSError * __autoreleasing *) errorToReturn; + + @end diff --git a/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.m b/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.m index 705ed236..4623f342 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.m +++ b/APCAppCore/APCAppCore/Library/Categories/NSDictionary+APCAdditions.m @@ -34,9 +34,17 @@ #import "NSDictionary+APCAdditions.h" #import "APCAppCore.h" -static NSString *daysOfWeekNames[] = { @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday" }; -static NSUInteger numberOfDaysOfWeek = (sizeof(daysOfWeekNames) / sizeof(NSString *)); -static NSString *oneThroughFiveNames[] = { @"Once", @"Two times", @"Three times", @"Four times", @"Five times" }; +static NSString *daysOfWeekNames[] = { @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday" }; +static NSUInteger numberOfDaysOfWeek = (sizeof(daysOfWeekNames) / sizeof(NSString *)); +static NSString *oneThroughFiveNames[] = { @"Once", @"Two times", @"Three times", @"Four times", @"Five times" }; + +static NSString * const APCErrorDomainLoadingDictionary = @"APCErrorDomainLoadingDictionary"; +static NSInteger const APCErrorLoadingJsonNoFileCode = 1; +static NSString * const APCErrorLoadingJsonNoFileReason = @"Can't Find JSON File"; +static NSString * const APCErrorLoadingJsonNoFileSuggestion = @"We were unable to find a file with the specified filename."; +static NSInteger const APCErrorLoadingJsonNoDictionaryCode = 2; +static NSString * const APCErrorLoadingJsonNoDictionaryReason = @"Can't Understand JSON File"; +static NSString * const APCErrorLoadingJsonNoDictionarySuggestion = @"We were unable to find a dictionary at the top level of the JSON file at the specified path."; @implementation NSDictionary (APCAdditions) @@ -110,4 +118,81 @@ - (NSString *)formatNumbersAndDays } return result; } + ++ (NSDictionary *) dictionaryWithContentsOfJSONFileWithName: (NSString *) filename + inBundle: (NSBundle *) bundle + returningError: (NSError * __autoreleasing *) errorToReturn +{ + if (bundle == nil) + { + bundle = [NSBundle mainBundle]; + } + + NSError *localError = nil; + NSDictionary *jsonDictionary = nil; + NSString *extension = filename.pathExtension; + NSString *basename = [filename substringToIndex: filename.length - extension.length - 1]; + + NSString *pathToJSONFile = [bundle pathForResource: basename + ofType: extension]; + + if (! pathToJSONFile) + { + localError = [NSError errorWithCode: APCErrorLoadingJsonNoFileCode + domain: APCErrorDomainLoadingDictionary + failureReason: APCErrorLoadingJsonNoFileReason + recoverySuggestion: APCErrorLoadingJsonNoFileSuggestion + relatedFilePath: filename]; + } + else + { + NSError *errorReadingFile = nil; + NSData *maybeJsonData = [NSData dataWithContentsOfFile: pathToJSONFile + options: 0 + error: & errorReadingFile]; + + if (! maybeJsonData) + { + localError = errorReadingFile; + } + else + { + NSError *errorConvertingToJSON = nil; + id maybeJsonDictionary = [NSJSONSerialization JSONObjectWithData: maybeJsonData + options: NSJSONReadingMutableContainers + error: & errorConvertingToJSON]; + + if (! maybeJsonDictionary) + { + localError = errorConvertingToJSON; + } + + else if (! [maybeJsonDictionary isKindOfClass: [NSDictionary class]]) + { + localError = [NSError errorWithCode: APCErrorLoadingJsonNoDictionaryCode + domain: APCErrorDomainLoadingDictionary + failureReason: APCErrorLoadingJsonNoDictionaryReason + recoverySuggestion: APCErrorLoadingJsonNoDictionarySuggestion + relatedFilePath: pathToJSONFile]; + } + + else + { + // Done! + jsonDictionary = maybeJsonDictionary; + } + } + } + + if (errorToReturn != nil) + { + * errorToReturn = localError; + } + + return jsonDictionary; +} + + + + @end diff --git a/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.h b/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.h index 12c5b0ad..cba1523e 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.h +++ b/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.h @@ -1,35 +1,35 @@ // // NSError+APCAdditions.h // APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// +// +// Copyright (c) 2015 Apple, Inc. All rights reserved. +// // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: -// +// // 1. Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// #import @@ -59,15 +59,15 @@ FOUNDATION_EXPORT NSString * const kAPCInvalidEmailAddressOrPasswordErrorMessage /*********************************************************************************/ /** - Shortcut for creating an NSError with the specified fields. - Code and domain are required. The other fields are optional. + Creates an NSError with the specified domain, error code, reason, + and suggestion, using Apple's standard keys to store the reason + and suggestion in the error's userInfo dictionary. These convenience methods all call the same, master convenience method behind the scenes. Please add any more such methods you need. @param code An error code. Any integer you like. - @param domain A string representing the category of error. */ + (NSError *) errorWithCode: (NSInteger) code @@ -76,8 +76,9 @@ FOUNDATION_EXPORT NSString * const kAPCInvalidEmailAddressOrPasswordErrorMessage recoverySuggestion: (NSString *) localizedRecoverySuggestion; /** - Shortcut for creating an NSError with the specified fields. - Code and domain are required. The other fields are optional. + Creates an NSError with the specified domain, error code, reason, + suggestion, and originating error, using Apple's standard keys to + store the latter three items in the error's userInfo dictionary. These convenience methods all call the same, master convenience method behind the scenes. Please add any more such methods @@ -102,8 +103,9 @@ FOUNDATION_EXPORT NSString * const kAPCInvalidEmailAddressOrPasswordErrorMessage nestedError: (NSError *) rootCause; /** - Shortcut for creating an NSError with the specified fields. - Code and domain are required. The other fields are optional. + Creates an NSError with the specified domain, error code, reason, + suggestion, and a related file path, using Apple's standard keys to + store the latter three items in the error's userInfo dictionary. These convenience methods all call the same, master convenience method behind the scenes. Please add any more such methods @@ -120,8 +122,9 @@ FOUNDATION_EXPORT NSString * const kAPCInvalidEmailAddressOrPasswordErrorMessage relatedFilePath: (NSString *) someFilePath; /** - Shortcut for creating an NSError with the specified fields. - Code and domain are required. The other fields are optional. + Creates an NSError with the specified domain, error code, reason, + suggestion, and a related URL, using Apple's standard keys to + store the latter three items in the error's userInfo dictionary. These convenience methods all call the same, master convenience method behind the scenes. Please add any more such methods @@ -138,8 +141,10 @@ FOUNDATION_EXPORT NSString * const kAPCInvalidEmailAddressOrPasswordErrorMessage relatedURL: (NSURL *) someURL; /** - Shortcut for creating an NSError with the specified fields. - Code and domain are required. The other fields are optional. + Creates an NSError with the specified domain, error code, reason, + suggestion, a related file path, a related URL, and an originating + error. Uses Apple's standard keys to store those latter five items + in the error's userInfo dictionary. These convenience methods all call the same, master convenience method behind the scenes. Please add any more such methods @@ -166,8 +171,13 @@ FOUNDATION_EXPORT NSString * const kAPCInvalidEmailAddressOrPasswordErrorMessage nestedError: (NSError *) rootCause; /** - Shortcut for creating an NSError with the specified fields. - Code and domain are required. The other fields are optional. + Creates an NSError with the specified domain, error code, reason, + suggestion, a related file path, a related URL, an originating + error, and a dictionary of arbitrary other data. Uses Apple's + standard keys to store the reason, suggestion, file path, URL, + and originating error in the error's user-info dictionary, and + adds any items with non-conflicting keys from your otherUserInfo + into that same dictionary. These convenience methods all call the same, master convenience method behind the scenes. Please add any more such methods @@ -212,3 +222,23 @@ FOUNDATION_EXPORT NSString * const kAPCInvalidEmailAddressOrPasswordErrorMessage - (NSString *) friendlyFormattedString; @end + + + + + + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.m b/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.m index 5fcfc351..bc994f50 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.m +++ b/APCAppCore/APCAppCore/Library/Categories/NSError+APCAdditions.m @@ -1,36 +1,36 @@ -// -// NSError+APCAdditions.m -// APCAppCore -// -// Copyright (c) 2015, Apple Inc. All rights reserved. -// +// +// NSError+APCAdditions.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: -// +// // 1. Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + #import "NSError+APCAdditions.h" #import "APCLog.h" @@ -110,7 +110,7 @@ - (NSString *)message message = [self performSelector:@selector(bridgeErrorMessage)]; } #pragma clang diagnostic pop - + return [NSString stringWithFormat:@"\n%@\n\nError code: %@", [self checkMessageForNonUserTerms:message], @(self.code)]; } @@ -211,19 +211,19 @@ + (NSError *) errorWithCode: (NSInteger) code otherUserInfo: (NSDictionary *) otherUserInfo { NSMutableDictionary *userInfo = [NSMutableDictionary new]; - + [userInfo addEntriesFromDictionary: otherUserInfo]; - + if (localizedFailureReason) { [userInfo setValue: localizedFailureReason forKey: NSLocalizedFailureReasonErrorKey ]; } if (localizedRecoverySuggestion) { [userInfo setValue: localizedRecoverySuggestion forKey: NSLocalizedRecoverySuggestionErrorKey ]; } if (someFilePath) { [userInfo setValue: someFilePath forKey: NSFilePathErrorKey ]; } if (someURL) { [userInfo setValue: someURL forKey: NSURLErrorKey ]; } if (rootCause) { [userInfo setValue: rootCause forKey: NSUnderlyingErrorKey ]; } - + NSError *error = [NSError errorWithDomain: domain code: code userInfo: userInfo]; - + return error; } @@ -244,18 +244,18 @@ - (NSString *)friendlyFormattedStringAtLevel:(NSUInteger)tabLevel NSString *tab = [@"" stringByPaddingToLength: tabLevel * oneTab.length withString: oneTab startingAtIndex: 0]; - + NSString *tabForNestedObjects = [NSString stringWithFormat: @"\n%@", tab]; NSString *domain = self.domain.length > 0 ? self.domain : @"(none)"; - + [output appendFormat: @"%@Code: %@\n", tab, @(self.code)]; [output appendFormat: @"%@Domain: %@\n", tab, domain]; - + if (self.userInfo.count > 0) { for (NSString *key in [self.userInfo.allKeys sortedArrayUsingSelector: @selector (compare:)]) { id value = self.userInfo [key]; NSString *valueString = nil; - + if ([value isKindOfClass: [NSError class]]) { valueString = [value friendlyFormattedStringAtLevel: tabLevel + 1]; [output appendFormat: @"%@%@:\n%@", tab, key, valueString]; @@ -269,17 +269,17 @@ - (NSString *)friendlyFormattedStringAtLevel:(NSUInteger)tabLevel } } } - + if (tabLevel == 0) { [output insertString: @"An error occurred. Available info:\n----- ERROR INFO -----\n" atIndex: 0]; - + if ([output characterAtIndex: output.length - 1] != '\n') { [output appendString: @"\n"]; } - + [output appendString: @"----------------------"]; } - + /* Ship it. */ diff --git a/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.h b/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.h index 9573dc7e..3fe9a2dd 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.h +++ b/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.h @@ -34,15 +34,28 @@ #import @interface NSManagedObject (APCHelper) -/*********************************************************************************/ + + + +// --------------------------------------------------------- #pragma mark - Class Methods -/*********************************************************************************/ -+ (instancetype)newObjectForContext:(NSManagedObjectContext*)context; -+ (NSFetchRequest*)request; +// --------------------------------------------------------- + ++ (instancetype) newObjectForContext: (NSManagedObjectContext*) context; + ++ (NSFetchRequest*) request; -/*********************************************************************************/ ++ (NSFetchRequest*) requestWithPredicate: (NSPredicate *) predicate; + ++ (NSFetchRequest*) requestWithPredicate: (NSPredicate *) predicate + sortDescriptors: (NSArray *) sortDescriptors; + + + +// --------------------------------------------------------- #pragma mark - Instance Methods -/*********************************************************************************/ +// --------------------------------------------------------- + - (BOOL)saveToPersistentStore:(NSError *__autoreleasing *)error; @end diff --git a/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.m b/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.m index 64dadcac..2c591b63 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.m +++ b/APCAppCore/APCAppCore/Library/Categories/NSManagedObject+APCHelper.m @@ -41,9 +41,24 @@ + (instancetype)newObjectForContext:(NSManagedObjectContext*)context } -+ (NSFetchRequest *)request ++ (NSFetchRequest *) request { - return [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([self class])]; + return [NSFetchRequest fetchRequestWithEntityName: NSStringFromClass ([self class])]; +} + ++ (NSFetchRequest *) requestWithPredicate: (NSPredicate *) predicate +{ + NSFetchRequest *request = [self request]; + request.predicate = predicate; + return request; +} + ++ (NSFetchRequest *) requestWithPredicate: (NSPredicate *) predicate + sortDescriptors: (NSArray *) sortDescriptors +{ + NSFetchRequest *request = [self requestWithPredicate: predicate]; + request.sortDescriptors = sortDescriptors; + return request; } - (BOOL)saveToPersistentStore:(NSError *__autoreleasing *)error diff --git a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.h b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.h index 5b53e440..5fba9d31 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.h +++ b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.h @@ -41,5 +41,6 @@ - (void)stopCollecting; @property (nonatomic, strong) NSDate* terminationDate; +@property (nonatomic, strong) NSMutableArray* dataSinkList; @end diff --git a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.m b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.m index 9dc61f15..1a82d07a 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.m +++ b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/APCPassiveDataCollector.m @@ -40,8 +40,6 @@ @interface APCPassiveDataCollector () -@property (nonatomic, strong) NSMutableArray* dataSinkList; - @end @@ -67,7 +65,7 @@ - (void)addDataSink:(APCDataCollector*)dataSync - (void)stopCollecting { NSArray* sinkListCopy = [self.dataSinkList copy]; - + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ { [sinkListCopy enumerateObjectsUsingBlock:^(APCDataCollector* collector, NSUInteger __unused idx, BOOL* __unused stop) @@ -80,7 +78,7 @@ - (void)stopCollecting - (void)startCollecting { NSArray* sinkListCopy = [self.dataSinkList copy]; - + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ { [sinkListCopy enumerateObjectsUsingBlock:^(APCDataCollector* collector, NSUInteger __unused idx, BOOL* __unused stop) diff --git a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.h b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.h new file mode 100644 index 00000000..004c96a9 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.h @@ -0,0 +1,52 @@ +// +// APCHealthKitDataBridge.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +#import + +#import "APCCollectorProtocol.h" + +@interface APCHealthKitDataBridge : NSObject + +@property (strong, nonatomic) HKHealthStore* healthStore; +@property (strong, nonatomic) HKUnit* unit; +@property (strong, nonatomic) NSString* identifier; +@property (nonatomic) id delegate; +@property (strong, nonatomic) HKSampleType* sampleType; + + +- (instancetype) initWithIdentifier: (NSString *) identifier andSampleType: (HKSampleType *) sampleType; + +- (void) sampleQueryWithType: (HKSampleType *) sampleType andLimit: (NSUInteger) limit; + +@end diff --git a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.m b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.m new file mode 100644 index 00000000..d0e6e802 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Collectors/APCHealthKitDataBridge.m @@ -0,0 +1,99 @@ +// +// APCHealthKitDataBridge.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCHealthKitDataBridge.h" +#import "APCAppCore.h" +#import + +@implementation APCHealthKitDataBridge + +- (instancetype) initWithIdentifier:(NSString *)identifier andSampleType: (HKSampleType *) sampleType { + + self = [self init]; + + if( self ) + { + NSParameterAssert(identifier != nil); + + _sampleType = sampleType; + _identifier = identifier; + _healthStore = [HKHealthStore new]; + } + + return self; + +} + + + +- (void) sampleQueryWithType: (HKSampleType *)sampleType andLimit:(NSUInteger) limit{ + + __weak __typeof(self) weakSelf = self; + + NSSortDescriptor *sortByLatest = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO]; + HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:sampleType + predicate:nil + limit:limit + sortDescriptors:@[sortByLatest] + resultsHandler:^(HKSampleQuery __unused *query, NSArray *results, NSError *error) + { + __typeof(self) strongSelf = weakSelf; + + [strongSelf notifyListenersWithResults:results withError:error]; + + }]; + + [self.healthStore executeQuery:sampleQuery]; + +} + +- (void) notifyListenersWithResults: (NSArray *) results withError: (NSError *) error { + + if (results) + { + [[NSNotificationCenter defaultCenter] postNotificationName:APCHealthKitObserverQueryUpdateForSampleTypeNotification + object:results]; + + if ([self.delegate respondsToSelector:@selector(didRecieveUpdatedValueFromCollector:)]) + { + [self.delegate didRecieveUpdatedValueFromCollector:results]; + } + } + else + { + APCLogError2(error); + } +} + + +@end diff --git a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Data Sink/APCPassiveDataSink.m b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Data Sink/APCPassiveDataSink.m index 30e70017..442d91f8 100644 --- a/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Data Sink/APCPassiveDataSink.m +++ b/APCAppCore/APCAppCore/Library/Categories/NewDataCollector/Data Sink/APCPassiveDataSink.m @@ -366,7 +366,7 @@ - (BOOL)uploadWithDataArchiverAndUploader NSString* csvFilePath = [self.folder stringByAppendingPathComponent:kCSVFilename]; BOOL success = [APCDataArchiverAndUploader uploadFileAtPath:csvFilePath - withTaskIdentifier:kItemIdentifier + withTaskIdentifier:self.identifier andTaskRunUuid:nil returningError:&error]; diff --git a/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.h b/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.h index 950c0dd8..043c9fad 100644 --- a/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.h +++ b/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.h @@ -33,8 +33,8 @@ #import -@interface SBBGuidCreatedOnVersionHolder (APCAdditions) - -- (NSString*) uniqueID; - -@end +// @interface SBBGuidCreatedOnVersionHolder (APCAdditions) +// +// - (NSString*) uniqueID; +// +// @end diff --git a/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.m b/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.m index af0c0848..80467306 100644 --- a/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.m +++ b/APCAppCore/APCAppCore/Library/Categories/SBBGuidCreatedOnVersionHolder+APCAdditions.m @@ -33,23 +33,23 @@ #import "SBBGuidCreatedOnVersionHolder+APCAdditions.h" -@implementation SBBGuidCreatedOnVersionHolder (APCAdditions) - -- (NSString*) uniqueID -{ - NSString * retValue; - if (self.version != nil) { - retValue = [NSString stringWithFormat:@"%@-%@-%@", self.guid, self.createdOn, self.version]; - } - else if (self.versionValue > 0) - { - retValue = [NSString stringWithFormat:@"%@-%@-%lld", self.guid, self.createdOn, self.versionValue]; - } - else - { - retValue = [NSString stringWithFormat:@"%@-%@", self.guid, self.createdOn]; - } - return retValue; -} - -@end +// @implementation SBBGuidCreatedOnVersionHolder (APCAdditions) +// +// - (NSString*) uniqueID +// { +// NSString * retValue; +// if (self.version != nil) { +// retValue = [NSString stringWithFormat:@"%@-%@-%@", self.guid, self.createdOn, self.version]; +// } +// else if (self.versionValue > 0) +// { +// retValue = [NSString stringWithFormat:@"%@-%@-%lld", self.guid, self.createdOn, self.versionValue]; +// } +// else +// { +// retValue = [NSString stringWithFormat:@"%@-%@", self.guid, self.createdOn]; +// } +// return retValue; +// } +// +// @end diff --git a/APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.h b/APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.h new file mode 100644 index 00000000..5f72fde8 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.h @@ -0,0 +1,45 @@ +// +// SBBSchedule+APCHelper.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@interface SBBSchedule (APCHelper) + +/** + As of this writing, the SBBSchedule class doesn't seem + to have a -description method. Keep an eye on that; when + and if they do grow one, we can likely remove this method. + */ +- (NSString *) description; + +@end diff --git a/APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.m b/APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.m new file mode 100644 index 00000000..1538a13d --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Categories/SBBSchedule+APCHelper.m @@ -0,0 +1,53 @@ +// +// SBBSchedule+APCHelper.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "SBBSchedule+APCHelper.h" + +@implementation SBBSchedule (APCHelper) + +- (NSString *) description +{ + NSString *result = [NSString stringWithFormat: @"SBBSchedule 0x%x { type: %@, cronTrigger: %@, startsOn: %@, endsOn: %@, label: %@, expires: %@ }", + (unsigned int) self, + self.scheduleType, + self.cronTrigger, + self.startsOn, + self.endsOn, + self.label, + self.expires + ]; + + return result; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.h new file mode 100644 index 00000000..1f6fbe97 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.h @@ -0,0 +1,82 @@ +// +// APCDataArchiver.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +#import +#import "APCDataVerificationServerAccessControl.h" + +@class ORKTaskResult; + +@interface APCDataArchiver : NSObject + +- (instancetype) initWithTaskResult: (ORKTaskResult*) taskResult; +- (instancetype)initWithResults: (NSArray*) results itemIdentifier: (NSString*) itemIdentifier runUUID: (NSUUID*) runUUID; +- (NSString*) writeToOutputDirectory: (NSString*) outputDirectory; + ++ (BOOL) encryptZipFile: (NSString*) unencryptedPath encryptedPath:(NSString*) encryptedPath; + + +/** + Simply calls the method with the same-ish name in APCJSONSerializer. + Please see that method for information. + + (As soon as all the apps are converted to call that method, + not this one, I'll remove this method from the header file.) + */ +- (NSDictionary *) generateSerializableDataFromSourceDictionary: (NSDictionary *) sourceDictionary; + + +/* + Make sure crackers (Bad Guys) don't know these features + exist, and (also) cannot use them, even by accident. + */ +#ifdef USE_DATA_VERIFICATION_SERVER + + /** + Should we save the unencrypted .zip file? Specifically + so we can retrieve it with -unencryptedFilePath? + */ + @property (nonatomic) BOOL preserveUnencryptedFile; + + /** + The path where the unencrypted .zip file was generated. + If you set -preserveUnencryptedFile to YES, the file will + exist at this path after the -init process has finished + creating the .zip file. + */ + @property (nonatomic, strong) NSString *unencryptedFilePath; + +#endif + + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.m new file mode 100644 index 00000000..c85abfcf --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataArchiver.m @@ -0,0 +1,787 @@ +// +// APCDataArchiver.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCDataArchiver.h" +#import "APCAppCore.h" +#import "zipzap.h" +#import +#import "APCUtilities.h" +#import "ORKAnswerFormat+Helper.h" +#import "APCCMS.h" +#import "NSDate+Helper.h" +#import "APCJSONSerializer.h" +#import "NSError+APCAdditions.h" + + + // + // ORK Result Base Class property keys + // +static NSString * const kIdentifierKey = @"identifier"; +static NSString * const kStartDateKey = @"startDate"; +static NSString * const kEndDateKey = @"endDate"; +static NSString * const kUserInfoKey = @"userInfo"; + // + // other important data item keys + // +static NSString * const kQuestionTypeKey = @"questionType"; +static NSString * const kQuestionTypeNameKey = @"questionTypeName"; +static NSString * const kTaskRunKey = @"taskRun"; +static NSString * const kItemKey = @"item"; +static NSString * const kAppNameKey = @"appName"; +static NSString * const kAppVersionKey = @"appVersion"; +static NSString * const kPhoneInfoKey = @"phoneInfo"; +static NSString * const kUploadTimeKey = @"uploadTime"; +static NSString * const kFilesKey = @"files"; +static NSString * const kFileInfoNameKey = @"filename"; +static NSString * const kFileInfoTimeStampKey = @"timestamp"; +static NSString * const kFileInfoContentTypeKey = @"contentType"; + + // + // Interval Tapping Dictionary Keys + // +static NSString *const kTappingViewSizeKey = @"TappingViewSize"; +static NSString *const kButtonRectLeftKey = @"ButtonRectLeft"; +static NSString *const kButtonRectRightKey = @"ButtonRectRight"; +static NSString *const kTappingSamplesKey = @"TappingSamples"; +static NSString *const kTappedButtonIdKey = @"TappedButtonId"; +static NSString *const kTappedButtonNoneKey = @"TappedButtonNone"; +static NSString *const kTappedButtonLeftKey = @"TappedButtonLeft"; +static NSString *const kTappedButtonRightKey = @"TappedButtonRight"; +static NSString *const kTapTimeStampKey = @"TapTimeStamp"; +static NSString *const kTapCoordinateKey = @"TapCoordinate"; +static NSString *const kAPCTappingResultsFileName = @"tapping_results"; + + // + // Spatial Span Memory Dictionary Keys — Summary + // +static NSString *const kSpatialSpanMemorySummaryNumberOfGamesKey = @"MemoryGameNumberOfGames"; +static NSString *const kSpatialSpanMemorySummaryNumberOfFailuresKey = @"MemoryGameNumberOfFailures"; +static NSString *const kSpatialSpanMemorySummaryOverallScoreKey = @"MemoryGameOverallScore"; +static NSString *const kSpatialSpanMemorySummaryGameRecordsKey = @"MemoryGameGameRecords"; +static NSString *const kSpatialSpanMemorySummaryFilenameKey = @"MemoryGameResults"; + // + // Spatial Span Memory Dictionary Keys — Touch Samples + // +static NSString *const kSpatialSpanMemoryTouchSampleTimeStampKey = @"MemoryGameTouchSampleTimestamp"; +static NSString *const kSpatialSpanMemoryTouchSampleTargetIndexKey = @"MemoryGameTouchSampleTargetIndex"; +static NSString *const kSpatialSpanMemoryTouchSampleLocationKey = @"MemoryGameTouchSampleLocation"; +static NSString *const kSpatialSpanMemoryTouchSampleIsCorrectKey = @"MemoryGameTouchSampleIsCorrect"; + // + // Spatial Span Memory Dictionary Keys — Game Status + // +static NSString *const kSpatialSpanMemoryGameStatusKey = @"MemoryGameStatus"; +static NSString *const kSpatialSpanMemoryGameStatusUnknownKey = @"MemoryGameStatusUnknown"; +static NSString *const kSpatialSpanMemoryGameStatusSuccessKey = @"MemoryGameStatusSuccess"; +static NSString *const kSpatialSpanMemoryGameStatusFailureKey = @"MemoryGameStatusFailure"; +static NSString *const kSpatialSpanMemoryGameStatusTimeoutKey = @"MemoryGameStatusTimeout"; + // + // Spatial Span Memory Dictionary Keys — Game Records + // +static NSString *const kSpatialSpanMemoryGameRecordSeedKey = @"MemoryGameRecordSeed"; +static NSString *const kSpatialSpanMemoryGameRecordSequenceKey = @"MemoryGameRecordSequence"; +static NSString *const kSpatialSpanMemoryGameRecordGameSizeKey = @"MemoryGameRecordGameSize"; +static NSString *const kSpatialSpanMemoryGameRecordTargetRectsKey = @"MemoryGameRecordTargetRects"; +static NSString *const kSpatialSpanMemoryGameRecordTouchSamplesKey = @"MemoryGameRecordTouchSamples"; +static NSString *const kSpatialSpanMemoryGameRecordGameScoreKey = @"MemoryGameRecordGameScore"; + + +/** + We'll eventually use something that makes more sense, here. + At the moment, this is pretty common, so I don't want to break + anything that's using this. + */ +static NSString * const kAPCFilenameIfCouldntIdentifyFileName = @"NoName"; +static NSString * const kAPCFilenameExtensionJSON = @"json"; +static NSArray * kAPCKnownJSONFilenamePrefixes = nil; + + +@interface APCDataArchiver () + +@property (nonatomic, strong) ZZArchive * zipArchive; +@property (nonatomic, strong) NSMutableDictionary * infoDict; +@property (nonatomic, strong) NSMutableArray * filesList; +@property (nonatomic, strong) NSMutableArray * zipEntries; +@property (nonatomic, strong) NSString * tempOutputDirectory; +@property (nonatomic, readonly) NSString * tempUnencryptedZipFilePath; +@property (nonatomic, readonly) NSString * tempEncryptedZipFilePath; + +@end + +@implementation APCDataArchiver + + + +/*********************************************************************************/ +#pragma mark - Initialization +/*********************************************************************************/ + +/** + Set global, static values the first time anyone calls this class. + + By definition, this method is called once per class, in a thread-safe + way, the first time the class is sent a message -- basically, the first + time we refer to the class. That means we can use this to set up stuff + that applies to all objects (instances) of this class. + + Documentation: See +initialize in the NSObject Class Reference. Currently, that's here: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/initialize + */ ++ (void) initialize +{ + /** + Specific known filenames, generated by ResearchKit, which + we just happen to know are actually JSON files -- and so we can + .zip them as such. + + ...um. Some of these are several megabytes. So -- do we + *want* to suggest that they're "readable"? + */ + kAPCKnownJSONFilenamePrefixes = @[ + @"accel_walking", + @"deviceMotion_walking", + @"pedometer_walking", + @"accel_tapping", + @"accel_fitness", + ]; +} + +/** + Designated initializer. + The other -init methods all end up calling this one. + */ +- (instancetype) init +{ + self = [super init]; + + if (self) + { + _infoDict = [NSMutableDictionary dictionary]; + _filesList = [NSMutableArray array]; + _zipEntries = [NSMutableArray array]; + _tempOutputDirectory = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSUUID UUID].UUIDString]; + [self createTempDirectoryIfDoesntExist]; + NSError * error; + _zipArchive = [[ZZArchive alloc] initWithURL:[NSURL fileURLWithPath:[self.tempOutputDirectory stringByAppendingPathComponent:@"unencrypted.zip"]] + options:@{ZZOpenOptionsCreateIfMissingKey : @YES} + error:&error]; + APCLogError2(error); + + /* + Make sure crackers (Bad Guys) don't know these features + exist, and (also) cannot use them, even by accident. + */ + #ifdef USE_DATA_VERIFICATION_SERVER + + _preserveUnencryptedFile = NO; + _unencryptedFilePath = nil; + + #endif + } + + return self; +} + +- (instancetype) initWithResults: (NSArray*) results + itemIdentifier: (NSString*) itemIdentifier + runUUID: (NSUUID*) runUUID +{ + self = [self init]; + + if (self) + { + // Set up info Dictionary + _infoDict [kTaskRunKey] = runUUID.UUIDString; + _infoDict [kItemKey] = itemIdentifier; + + /* + These items are cached in APCUtilities after the + first time we call them. They will always return + a safe, non-zero-length string (even if we had to + say, "I couldn't detect the requested info"). + */ + _infoDict [kAppNameKey] = [APCUtilities appName]; + _infoDict [kAppVersionKey] = [APCUtilities appVersion]; + _infoDict [kPhoneInfoKey] = [APCUtilities phoneInfo]; + + [self processResults: results]; + } + return self; +} + +- (instancetype) initWithTaskResult: (ORKTaskResult*) taskResult +{ + return [self initWithResults:taskResult.results itemIdentifier:taskResult.identifier runUUID:taskResult.taskRunUUID]; +} + + + +/*********************************************************************************/ +#pragma mark - Where are our .zip files? +/*********************************************************************************/ + +-(NSString *)tempUnencryptedZipFilePath { + return [self.tempOutputDirectory stringByAppendingPathComponent:@"unencrypted.zip"]; +} + +-(NSString *)tempEncryptedZipFilePath { + return [self.tempOutputDirectory stringByAppendingPathComponent:@"encrypted.zip"]; +} + +- (void)createTempDirectoryIfDoesntExist { + + if (![[NSFileManager defaultManager] fileExistsAtPath:_tempOutputDirectory]) { + NSError * fileError; + [[NSFileManager defaultManager] createDirectoryAtPath:_tempOutputDirectory + withIntermediateDirectories:YES + attributes:@{ + NSFileProtectionKey : + NSFileProtectionCompleteUntilFirstUserAuthentication + } + error:&fileError]; + APCLogError2 (fileError); + } +} + + + +/*********************************************************************************/ +#pragma mark - Task Results +/*********************************************************************************/ + +- (void) processResults: (NSArray*) results +{ + [results enumerateObjectsUsingBlock:^(ORKStepResult *stepResult, NSUInteger __unused idx, BOOL * __unused stop) { + [stepResult.results enumerateObjectsUsingBlock:^(ORKResult *result, NSUInteger __unused idx, BOOL *__unused stop) { + //Update date if needed + if (!result.startDate) { + result.startDate = stepResult.startDate; + result.endDate = stepResult.endDate; + } + + if ([result isKindOfClass:[APCDataResult class]]) + { + APCDataResult * dataResult = (APCDataResult*) result; + NSString *fileName = dataResult.identifier?:(stepResult.identifier?:[NSUUID UUID].UUIDString); + [self addDataToArchive:dataResult.data fileName:[fileName stringByAppendingString:@"_data"] contentType:@"data" timeStamp:dataResult.endDate]; + } + + else if ([result isKindOfClass:[ORKFileResult class]]) + { + ORKFileResult * fileResult = (ORKFileResult*) result; + + NSString *betterFilename = [self friendlyFilenameForFile: fileResult]; + + if ([betterFilename hasSuffix: kAPCFilenameExtensionJSON]) + { + [self addJSONFileToArchive: fileResult usingFileName: betterFilename]; + } + else + { + [self addGenericDataFileToArchive: fileResult]; + } + } + + else if ([result isKindOfClass:[ORKTappingIntervalResult class]]) + { + ORKTappingIntervalResult *tappingResult = (ORKTappingIntervalResult *)result; + [self addTappingResultsToArchive:tappingResult]; + } + + else if ([result isKindOfClass:[ORKSpatialSpanMemoryResult class]]) + { + ORKSpatialSpanMemoryResult *spatialSpanMemoryResult = (ORKSpatialSpanMemoryResult *)result; + [self addSpatialSpanMemoryResultsToArchive:spatialSpanMemoryResult]; + } + + else if ([result isKindOfClass:[ORKQuestionResult class]]) + { + [self addResultToArchive:result]; + } + + else + { + APCLogError(@"Result not processed for : %@", result.identifier); + } + }]; + }]; + + [self finalizeZipFile]; +} + +- (void) addDataToArchive: (NSData*) data fileName: (NSString*) fileName contentType:(NSString*) contentType timeStamp: (NSDate*) date +{ + [self writeDataToArchive:data fileName:fileName]; + [self addFileInfoEntryWithFileName:fileName timeStamp: date.toStringInISO8601Format contentType:contentType]; +} + +- (void) addJSONFileToArchive: (ORKFileResult *) file usingFileName: (NSString *) fileName +{ + [self addFileToArchiveFromURL: file.fileURL + usingFileName: fileName + contentType: @"application/json" + timeStamp: file.endDate]; +} + +- (void) addGenericDataFileToArchive: (ORKFileResult *) file +{ + [self addFileToArchiveFromURL: file.fileURL + usingFileName: file.fileURL.lastPathComponent + contentType: @"data" // Not sure why we're using this particular string. At the moment, it's historical. + timeStamp: file.endDate]; +} + +- (void) addFileToArchiveFromURL: (NSURL*) fileURL + usingFileName: (NSString *) fileName + contentType: (NSString*) contentType + timeStamp: (NSDate*) date +{ + [self writeURLToArchive: fileURL + usingFileName: fileName]; + + [self addFileInfoEntryWithFileName: fileName + timeStamp: date.toStringInISO8601Format + contentType: contentType]; +} + +/** + A catchall for any rules, tricks, or whatever that we + can use to make outbound "black box" data files readable. + */ +- (NSString *) friendlyFilenameForFile: (ORKFileResult *) file +{ + BOOL isKnownJSONFilename = NO; + NSString *defaultFileName = file.fileURL.lastPathComponent; + NSString *currentFileName = defaultFileName; + + /* + Is it JSON? + + If we happen to know this filename is JSON, + set a flag before we mangle (or unmangle) + the name. + */ + for (NSString *filenamePrefix in kAPCKnownJSONFilenamePrefixes) + { + if ([defaultFileName hasPrefix: filenamePrefix]) + { + isKnownJSONFilename = YES; + break; + } + } + + /* + Strip trailing timestamps. + + Some of our filenames have timestamps, like: + + "blah_blah_blah-20150131050505" + + --meaning January 31, 2015, at 5:05:05 AM. If we find one, + strip off the timestamp. + + The timestamp is 14 characters, which is where the "14" in + this next line of code comes from: I'm searching for strings + whose last 14 characters are digits ("\d"). + */ + NSString *timestampPattern = @"-\\d{14}"; + NSRange timestampRange = [currentFileName rangeOfString: timestampPattern + options: NSRegularExpressionSearch]; + + if (timestampRange.location == currentFileName.length - timestampRange.length) + { + currentFileName = [currentFileName substringToIndex: timestampRange.location]; + } + + /* + Replace spaces, hyphens, dots, underscores, + or sequences of more than one of those things, + with a single "_". + */ + currentFileName = [currentFileName stringByReplacingOccurrencesOfString: @"[_ .\\-]+" + withString: @"_" + options: NSRegularExpressionSearch + range: NSMakeRange (0, currentFileName.length)]; + + /* + Now that we've unmangled it, append the ".json", if + appropriate. + */ + if (isKnownJSONFilename) + { + currentFileName = [currentFileName stringByAppendingPathExtension: kAPCFilenameExtensionJSON]; + } + + return currentFileName; +} + +/*********************************************************************************/ +#pragma mark - Add Task-Specific Results — Interval Tapping +/*********************************************************************************/ + +- (void)addTappingResultsToArchive:(ORKTappingIntervalResult *)result +{ + NSMutableDictionary *rawTappingResults = [NSMutableDictionary dictionary]; + + NSString *tappingViewSize = NSStringFromCGSize(result.stepViewSize); + rawTappingResults[kTappingViewSizeKey] = tappingViewSize; + + rawTappingResults[kStartDateKey] = result.startDate; + rawTappingResults[kEndDateKey] = result.endDate; + + NSString *leftButtonRect = NSStringFromCGRect(result.buttonRect1); + rawTappingResults[kButtonRectLeftKey] = leftButtonRect; + + NSString *rightButtonRect = NSStringFromCGRect(result.buttonRect2); + rawTappingResults[kButtonRectRightKey] = rightButtonRect; + + NSArray *samples = result.samples; + NSMutableArray *sampleResults = [NSMutableArray array]; + for (ORKTappingSample *sample in samples) { + NSMutableDictionary *aSampleDictionary = [NSMutableDictionary dictionary]; + + aSampleDictionary[kTapTimeStampKey] = @(sample.timestamp); + + aSampleDictionary[kTapCoordinateKey] = NSStringFromCGPoint(sample.location); + + if (sample.buttonIdentifier == ORKTappingButtonIdentifierNone) { + aSampleDictionary[kTappedButtonIdKey] = kTappedButtonNoneKey; + } else if (sample.buttonIdentifier == ORKTappingButtonIdentifierLeft) { + aSampleDictionary[kTappedButtonIdKey] = kTappedButtonLeftKey; + } else if (sample.buttonIdentifier == ORKTappingButtonIdentifierRight) { + aSampleDictionary[kTappedButtonIdKey] = kTappedButtonRightKey; + } + [sampleResults addObject:aSampleDictionary]; + } + rawTappingResults[kTappingSamplesKey] = sampleResults; + rawTappingResults[kItemKey] = kAPCTappingResultsFileName; + + NSDictionary *serializableData = [APCJSONSerializer serializableDictionaryFromSourceDictionary: rawTappingResults]; + [self writeResultDictionaryToArchive: serializableData]; + [self addFileInfoEntryWithDictionary: serializableData]; +} + +/*********************************************************************************/ +#pragma mark - Add Task-Specific Results — Spatial Span Memory +/*********************************************************************************/ + +- (NSArray *)makeTouchSampleRecords:(NSArray *)touchSamples +{ + NSMutableArray *samples = [NSMutableArray array]; + + for (ORKSpatialSpanMemoryGameTouchSample *sample in touchSamples) { + + NSMutableDictionary *aTouchSample = [NSMutableDictionary dictionary]; + + aTouchSample[kSpatialSpanMemoryTouchSampleTimeStampKey] = @(sample.timestamp); + aTouchSample[kSpatialSpanMemoryTouchSampleTargetIndexKey] = @(sample.targetIndex); + aTouchSample[kSpatialSpanMemoryTouchSampleLocationKey] = NSStringFromCGPoint(sample.location); + aTouchSample[kSpatialSpanMemoryTouchSampleIsCorrectKey] = @(sample.isCorrect); + + [samples addObject:aTouchSample]; + } + return samples; +} + +- (NSArray *)makeTargetRectangleRecords:(NSArray *)targetRectangles +{ + NSMutableArray *rectangles = [NSMutableArray array]; + + for (NSValue *value in targetRectangles) { + CGRect rectangle = [value CGRectValue]; + NSString *stringified = NSStringFromCGRect(rectangle); + [rectangles addObject:stringified]; + } + return rectangles; +} + +- (void)addSpatialSpanMemoryResultsToArchive:(ORKSpatialSpanMemoryResult *)result +{ + + NSString *gameStatusKeys[] = { kSpatialSpanMemoryGameStatusUnknownKey, kSpatialSpanMemoryGameStatusSuccessKey, kSpatialSpanMemoryGameStatusFailureKey, kSpatialSpanMemoryGameStatusTimeoutKey }; + + NSMutableDictionary *memoryGameResults = [NSMutableDictionary dictionary]; + + // + // ORK Result + // + memoryGameResults[kIdentifierKey] = result.identifier; + memoryGameResults[kStartDateKey] = result.startDate; + memoryGameResults[kEndDateKey] = result.endDate; + // + // ORK ORKSpatialSpanMemoryResult + // + memoryGameResults[kSpatialSpanMemorySummaryNumberOfGamesKey] = @(result.numberOfGames); + memoryGameResults[kSpatialSpanMemorySummaryNumberOfFailuresKey] = @(result.numberOfFailures); + memoryGameResults[kSpatialSpanMemorySummaryOverallScoreKey] = @(result.score); + + memoryGameResults[kItemKey] = kSpatialSpanMemorySummaryFilenameKey; + + // + // Memory Game Records + // + NSMutableArray *gameRecords = [NSMutableArray arrayWithCapacity:[result.gameRecords count]]; + + for (ORKSpatialSpanMemoryGameRecord *aRecord in result.gameRecords) { + + NSMutableDictionary *aGameRecord = [NSMutableDictionary dictionary]; + + aGameRecord[kSpatialSpanMemoryGameRecordSeedKey] = @(aRecord.seed); + aGameRecord[kSpatialSpanMemoryGameRecordGameSizeKey] = @(aRecord.gameSize); + aGameRecord[kSpatialSpanMemoryGameRecordGameScoreKey] = @(aRecord.score); + aGameRecord[kSpatialSpanMemoryGameRecordSequenceKey] = aRecord.sequence; + aGameRecord[kSpatialSpanMemoryGameStatusKey] = gameStatusKeys[aRecord.gameStatus]; + + NSArray *touchSamples = [self makeTouchSampleRecords:aRecord.touchSamples]; + aGameRecord[kSpatialSpanMemoryGameRecordTouchSamplesKey] = touchSamples; + + NSArray *rectangles = [self makeTargetRectangleRecords:aRecord.targetRects]; + aGameRecord[kSpatialSpanMemoryGameRecordTargetRectsKey] = rectangles; + + [gameRecords addObject:aGameRecord]; + } + memoryGameResults[kSpatialSpanMemorySummaryGameRecordsKey] = gameRecords; + + NSDictionary *serializableData = [self generateSerializableDataFromSourceDictionary: memoryGameResults]; + [self writeResultDictionaryToArchive: serializableData]; + [self addFileInfoEntryWithDictionary: serializableData]; +} + +/*********************************************************************************/ +#pragma mark - Add Result Archive +/*********************************************************************************/ + +- (void) addResultToArchive: (ORKResult*) result +{ + NSMutableArray * propertyNames = [NSMutableArray array]; + + /* + Get the names of all properties of our result's class + and all its superclasses. Stop when we hit ORKResult. + */ + Class klass = result.class; + BOOL done = NO; + NSArray *propertyNamesForOneClass = nil; + + while (klass != nil && ! done) + { + propertyNamesForOneClass = [self classPropsFor: klass]; + + [propertyNames addObjectsFromArray: propertyNamesForOneClass]; + + if (klass == [ORKResult class]) + { + done = YES; + } + else + { + klass = [klass superclass]; + } + } + + NSDictionary *propertiesToSave = [result dictionaryWithValuesForKeys: propertyNames]; + NSDictionary *serializableData = [APCJSONSerializer serializableDictionaryFromSourceDictionary: propertiesToSave]; + + APCLogDebug(@"%@", serializableData); + + [self writeResultDictionaryToArchive: serializableData]; + [self addFileInfoEntryWithDictionary: serializableData]; +} + +- (void) writeResultDictionaryToArchive: (NSDictionary*) dictionary +{ + NSString * fileName = dictionary[kItemKey]?:kAPCFilenameIfCouldntIdentifyFileName; + [self writeDictionaryToArchive:dictionary fileName:fileName]; +} + +- (void) writeDictionaryToArchive: (NSDictionary*) dictionary fileName: (NSString*) fileName +{ + NSError * error; + NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error]; + if (jsonData !=nil) { + NSString * fullFileName = [fileName stringByAppendingPathExtension: kAPCFilenameExtensionJSON]; + + APCLogFilenameBeingArchived (fullFileName); + + [self.zipEntries addObject: [ZZArchiveEntry archiveEntryWithFileName: fullFileName + compress:YES + dataBlock:^(NSError** __unused error){ return jsonData;}]]; + } + else { + APCLogError2(error); + } +} + +- (void) writeDataToArchive: (NSData*) data fileName: (NSString*) fileName +{ + APCLogFilenameBeingArchived (fileName); + + [self.zipEntries addObject: [ZZArchiveEntry archiveEntryWithFileName: fileName + compress:YES + dataBlock:^(NSError** __unused error){ return data;}]]; +} + +- (void) writeURLToArchive: (NSURL*) url usingFileName: (NSString *) fileName +{ + APCLogFilenameBeingArchived (fileName); + + [self.zipEntries addObject: [ZZArchiveEntry archiveEntryWithFileName: fileName + compress:YES + dataBlock:^(NSError** __unused error){ return [NSData dataWithContentsOfURL:url];}]]; +} + +- (void) addFileInfoEntryWithDictionary: (NSDictionary*) dictionary +{ + NSString * fileName = dictionary[kItemKey]?:kAPCFilenameIfCouldntIdentifyFileName; + NSString * fullFileName = [fileName stringByAppendingPathExtension: kAPCFilenameExtensionJSON]; + [self addFileInfoEntryWithFileName:fullFileName timeStamp:dictionary[kEndDateKey] contentType:@"application/json"]; +} + +- (void) addFileInfoEntryWithFileName: (NSString*) fileName timeStamp: (NSString*) dateString contentType: (NSString*) contentType +{ + NSMutableDictionary * fileInfoEntry = [NSMutableDictionary dictionary]; + fileInfoEntry[kFileInfoNameKey] = fileName; + fileInfoEntry[kFileInfoTimeStampKey] = dateString; + fileInfoEntry[kFileInfoContentTypeKey] = contentType; + [self.filesList addObject:fileInfoEntry]; +} + +- (void) finalizeZipFile { + + if (self.filesList.count) { + self.infoDict[kFilesKey] = self.filesList; + } + [self writeDictionaryToArchive:self.infoDict fileName:@"info"]; + + NSError * error; + [self.zipArchive updateEntries:self.zipEntries error:&error]; + APCLogError2(error); +} + + +/*********************************************************************************/ +#pragma mark - Write Output File +/*********************************************************************************/ +- (NSString*)writeToOutputDirectory:(NSString *)outputDirectory { + + NSAssert([[NSFileManager defaultManager] fileExistsAtPath:outputDirectory], @"Output Directory does not exist"); + + [APCDataArchiver encryptZipFile:self.tempUnencryptedZipFilePath encryptedPath:self.tempEncryptedZipFilePath]; + + NSString * newEncryptedPath = [outputDirectory stringByAppendingPathComponent:@"encrypted.zip"]; + + NSError * moveError; + if (![[NSFileManager defaultManager] moveItemAtPath:self.tempEncryptedZipFilePath toPath:newEncryptedPath error:&moveError]) { + APCLogError2(moveError); + } + + /* + Make sure crackers (Bad Guys) don't know these features + exist, and (also) cannot use them, even by accident. + */ +#ifdef USE_DATA_VERIFICATION_SERVER + + NSString * newUnEncryptedPath = [outputDirectory stringByAppendingPathComponent:@"unencrypted.zip"]; + + if (self.preserveUnencryptedFile) + { + self.unencryptedFilePath = newUnEncryptedPath; + + if (![[NSFileManager defaultManager] moveItemAtPath:self.tempUnencryptedZipFilePath toPath:newUnEncryptedPath error:&moveError]) { + APCLogError2(moveError); + } + } + else + +#endif + + { + if (![[NSFileManager defaultManager] removeItemAtPath:self.tempUnencryptedZipFilePath error:&moveError]) { + APCLogError2(moveError); + } + + } + return ([[NSFileManager defaultManager] fileExistsAtPath:newEncryptedPath])? @"encrypted.zip" : nil; +} + ++ (BOOL) encryptZipFile: (NSString*) unencryptedPath encryptedPath:(NSString*) encryptedPath +{ + NSData * unencryptedZipData = [NSData dataWithContentsOfFile:unencryptedPath]; + + NSError * encryptionError; + NSData * encryptedZipData = cmsEncrypt(unencryptedZipData, [APCDataArchiver pemPath], &encryptionError); + APCLogError2(encryptionError); + + return [encryptedZipData writeToFile:encryptedPath options:NSDataWritingAtomic error:nil]; +} + +/*********************************************************************************/ +#pragma mark - Helpers +/*********************************************************************************/ ++ (NSString*) pemPath +{ + APCAppDelegate * appDelegate = (APCAppDelegate*)[UIApplication sharedApplication].delegate; + NSString * path = [[NSBundle mainBundle] pathForResource:appDelegate.certificateFileName ofType:@"pem"]; + return path; +} + +- (NSArray *)classPropsFor:(Class)klass +{ + if (klass == NULL) { + return nil; + } + + NSMutableArray *results = [NSMutableArray array]; + + unsigned int outCount, i; + objc_property_t *properties = class_copyPropertyList(klass, &outCount); + for (i = 0; i < outCount; i++) { + objc_property_t property = properties[i]; + const char *propName = property_getName(property); + if(propName) { + NSString *propertyName = [NSString stringWithUTF8String:propName]; + [results addObject:propertyName]; + } + } + free(properties); + + return [NSArray arrayWithArray:results]; +} + +- (NSDictionary *) generateSerializableDataFromSourceDictionary: (NSDictionary *) sourceDictionary +{ + NSDictionary *result = [APCJSONSerializer serializableDictionaryFromSourceDictionary: sourceDictionary]; + + return result; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.h new file mode 100644 index 00000000..512aa59b --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.h @@ -0,0 +1,71 @@ +// +// APCDataUploader.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@interface APCDataUploader : NSObject + +/** + Designated Initializer + + @param ref Reference to be included in the upload to identify the payload + */ +- (id)initWithUploadReference: (NSString *)ref; + + +/** + Inserts json data into the zip archive to be included in the upload. + + @param jsonData json data to be inserted into the zip archive + + @param filename Filename for the json data to be included without path extension + */ +- (void)insertJSONDataIntoZipArchive:(NSData *)jsonData filename:(NSString *)filename; + +/** + Inserts a dictionary to be converted into a json file and included in the upload. + + @param dictionary Dictionary to be inserted into the zip archive + + @param filename Filename for the dictionary to be included + */ +- (void)insertIntoZipArchive:(NSDictionary *)dictionary filename: (NSString *)filename; + +/** + After inserting as many files as required into the dictionary under the reference header, call upload with completion. + + @param completion A completion block to be executed upon successful upload. + */ +- (void)uploadWithCompletion: (void(^)(void)) completion; + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.m new file mode 100644 index 00000000..acaa90b2 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCDataUploader.m @@ -0,0 +1,283 @@ +// +// APCDataUploader.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCDataUploader.h" +#import "zipzap.h" +#import "APCLog.h" +#import "APCDataArchiver.h" +#import "APCUtilities.h" +#import "NSError+APCAdditions.h" +#import +#import "APCConstants.h" + +static NSString * kFileInfoNameKey = @"filename"; +static NSString * kEncryptedDataFilename = @"encrypted.dat"; +static NSString * kUnencryptedArchiveFilename = @"unencrypted.zip"; +static NSString * kFileInfoTimeStampKey = @"timestamp"; +static NSString * kFileInfoContentTypeKey = @"contentType"; +static NSString * kTaskRunKey = @"taskRun"; +static NSString * kFilesKey = @"files"; +static NSString * kAppNameKey = @"appName"; +static NSString * kAppVersionKey = @"appVersion"; +static NSString * kPhoneInfoKey = @"phoneInfo"; +static NSString * kItemKey = @"item"; + +@interface APCDataUploader () + +@property (nonatomic, strong) NSString *uploadReference; +@property (nonatomic, strong) ZZArchive * zipArchive; +@property (nonatomic, strong) NSMutableArray * zipEntries; +@property (nonatomic, strong) NSString *encryptedArchiveFilename; +@property (nonatomic, strong) NSMutableArray * filesList; +@property (nonatomic, strong) NSMutableDictionary * infoDict; + +@end + +@implementation APCDataUploader + +//designated initializer +- (id)initWithUploadReference: (NSString *)ref +{ + self = [super init]; + if (self) { + self.uploadReference = ref; + [self createZipArchive]; + } + + return self; +} + +#pragma mark - Zip + +//create a new zip archive as a container for this upload +- (void)createZipArchive{ + + NSURL *zipArchiveURL = [NSURL fileURLWithPath:[[self workingDirectoryPath] stringByAppendingPathComponent:kUnencryptedArchiveFilename]]; + + self.zipEntries = [NSMutableArray array]; + self.filesList = [NSMutableArray array]; + self.infoDict = [NSMutableDictionary dictionary]; + NSError * error; + + self.zipArchive = [[ZZArchive alloc] initWithURL:zipArchiveURL + options:@{ZZOpenOptionsCreateIfMissingKey : @YES} + error:&error]; + if (!self.zipArchive) { + APCLogError2(error); + } +} + +- (void)insertJSONDataIntoZipArchive:(NSData *)jsonData filename:(NSString *)filename +{ + + if (jsonData !=nil) { + NSString * fullFileName = [filename stringByAppendingPathExtension:@"json"]; + + APCLogFilenameBeingArchived (fullFileName); + + id objectToInsert = [ZZArchiveEntry archiveEntryWithFileName: fullFileName + compress:YES + dataBlock:^(NSError** __unused error){ return jsonData;}]; + + [self.zipEntries addObject: objectToInsert]; + + if (objectToInsert) { + [self.zipEntries addObject: objectToInsert]; + NSMutableDictionary * fileInfoEntry = [NSMutableDictionary dictionary]; + fileInfoEntry[kFileInfoNameKey] = fullFileName; + fileInfoEntry[kFileInfoTimeStampKey] = [NSDate new]; + fileInfoEntry[kFileInfoContentTypeKey] = @"application/json"; + [self.filesList addObject:fileInfoEntry]; + }else{ + APCLogDebug(@"failed to insert %@ into archive", filename); + } + } +} + +// Converts the dictionary into json and inserts into the archive using the given filename +- (void)insertIntoZipArchive:(NSDictionary *)dictionary filename: (NSString *)filename{ + + NSError * serializationError; + NSData * jsonData; + if ([NSJSONSerialization isValidJSONObject:dictionary]) { + + jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&serializationError]; + if (!jsonData) { + APCLogDebug(@"serialization error: %@", serializationError.message); + } + + }else{ + APCLogDebug(@"%@ is not a valid JSON object, attempting to fix...", filename); + APCDataArchiver *archiver = [[APCDataArchiver alloc]init]; + NSDictionary *newDictionary = [archiver generateSerializableDataFromSourceDictionary:dictionary]; + if ([NSJSONSerialization isValidJSONObject:newDictionary]) { + [self insertIntoZipArchive:newDictionary filename:filename]; + } + } + + if (jsonData !=nil) { + + [self insertJSONDataIntoZipArchive:jsonData filename:filename]; + } + +} + +//Compiles the final info.json file and inserts it into the zip archive. +- (BOOL)completeZip{ + + BOOL success = NO; + + if (self.filesList.count) { + [self.infoDict setObject:self.filesList forKey:kFilesKey]; + [self.infoDict setObject:[APCUtilities appName] forKey:kAppNameKey]; + [self.infoDict setObject:[APCUtilities appVersion] forKey:kAppVersionKey]; + [self.infoDict setObject:[APCUtilities phoneInfo] forKey:kPhoneInfoKey]; + [self.infoDict setObject:[NSUUID new].UUIDString forKey:kTaskRunKey]; + [self.infoDict setObject:self.uploadReference forKey:kItemKey]; + + [self insertIntoZipArchive:self.infoDict filename:@"info"]; + + NSError * error; + if (![self.zipArchive updateEntries:self.zipEntries error:&error]) { + APCLogError2(error); + }else{ + success = YES; + APCLogDebug(@"Outputting infoDict to console\n%@", self.infoDict); + } + } + + return success; +} + +#pragma mark - Encryption + +//Calls the APCDataArchiver to encrypt the zip file. +- (BOOL)encryptZip{ + + self.encryptedArchiveFilename = [[self workingDirectoryPath] stringByAppendingPathComponent:kEncryptedDataFilename]; + + BOOL success = NO; + + NSError *reachableError; + if (![self.zipArchive.URL checkResourceIsReachableAndReturnError:&reachableError]) { + APCLogDebug(@"resource is unreachable: %@", reachableError.message); + }else{ + if ([APCDataArchiver encryptZipFile:[self.zipArchive.URL relativePath] encryptedPath:self.encryptedArchiveFilename]){ + success = YES; + }else{ + APCLogDebug(@"Encryption of zip file failed, won't upload"); + } + } + + return success; +} + +#pragma mark - Upload + +//sequentially and conditionally proceed through the encryption and upload process +- (void)uploadWithCompletion: (void(^)(void)) completion +{ + + if ([self completeZip]) + { + if ([self encryptZip]) { + [self uploadEncryptedZipWithCompletion:completion]; + + }else{ + APCLogDebug(@"Failed to encrypt zip"); + } + + }else{ + APCLogDebug(@"Failed to complete zip"); + } + +} + +//Wrapper around SBBUploadManager which calls the completion block on success. +- (void)uploadEncryptedZipWithCompletion: (void(^)(void)) completion{ + + NSURL *encryptedZipURL = [NSURL fileURLWithPath:self.encryptedArchiveFilename]; + + NSError *reachableError; + if (![encryptedZipURL checkResourceIsReachableAndReturnError:&reachableError]) { + APCLogDebug(@"resource is unreachable: %@", reachableError.message); + }else{ + APCLogFilenameBeingUploaded (encryptedZipURL.absoluteString); + + __weak typeof(self) weakSelf = self; + + [SBBComponent(SBBUploadManager) uploadFileToBridge:encryptedZipURL contentType:@"application/zip" completion:^(NSError *error) { + if (!error) { + APCLogEventWithData(kNetworkEvent, (@{@"event_detail":[NSString stringWithFormat:@"APCDataUploader uploaded file: %@", self.encryptedArchiveFilename.lastPathComponent]})); + + if (completion){ + completion(); + } + + }else{ + APCLogDebug(@"%@", error.message); + } + + [weakSelf cleanUp]; + + }]; + } +} + +#pragma mark - File Management + +//A sandbox in the temporary directory for this uploader to be cleaned up on completion. +- (NSString *)workingDirectoryPath { + + NSString *workingDirectoryPath = [NSTemporaryDirectory() stringByAppendingPathComponent:self.uploadReference]; + + if (![[NSFileManager defaultManager] fileExistsAtPath:workingDirectoryPath]) { + NSError * fileError; + BOOL created = [[NSFileManager defaultManager] createDirectoryAtPath:workingDirectoryPath withIntermediateDirectories:YES attributes:@{ NSFileProtectionKey : NSFileProtectionCompleteUntilFirstUserAuthentication } error:&fileError]; + if (!created) { + APCLogError2 (fileError); + } + } + + return workingDirectoryPath; +} + +//delete the workingDirectoryPath +-(void)cleanUp{ + NSError *err; + if (![[NSFileManager defaultManager] removeItemAtPath:[self workingDirectoryPath] error:&err]) { + APCLogError2(err); + } +} + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.h new file mode 100644 index 00000000..fb57384a --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.h @@ -0,0 +1,47 @@ +// +// APCPassiveDataCollector.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +#import "APCDataTracker.h" + +@interface APCPassiveDataCollector : NSObject + +-(void) addTracker: (APCDataTracker*) tracker; + +- (void) flush:(APCDataTracker*) tracker; //Packages the data collected so far as encrypted zip. + ++ (void) createOrAppendString: (NSString*) string toFile: (NSString*) path; ++ (void) createOrReplaceString: (NSString*) string toFile: (NSString*) path; +- (void) checkIfDataNeedsToBeFlushed:(APCDataTracker*) tracker; + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.m new file mode 100644 index 00000000..f13e4e49 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/APCPassiveDataCollector.m @@ -0,0 +1,335 @@ +// +// APCPassiveDataCollector.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCPassiveDataCollector.h" +#import "APCAppCore.h" +#import "zipzap.h" +#import "APCDataVerificationClient.h" +#import "APCDataVerificationServerAccessControl.h" +#import "CMMotionActivity+Helper.h" + +static NSString *const kCollectorFolder = @"collector"; +static NSString *const kUploadFolder = @"upload"; + +static NSString *const kIdentifierKey = @"identifier"; +static NSString *const kStartDateKey = @"startDate"; +static NSString *const kEndDateKey = @"endDate"; + +static NSString *const kInfoFilename = @"info.json"; +static NSString *const kCSVFilename = @"data.csv"; + +@interface APCPassiveDataCollector () +@property (nonatomic, strong) NSMutableDictionary * registeredTrackers; +@property (nonatomic, strong) NSString * collectorsPath; +@property (nonatomic, readonly) NSString *collectorsUploadPath; +@end + +@implementation APCPassiveDataCollector + +/*********************************************************************************/ +#pragma mark - Initializers & related methods +/*********************************************************************************/ + +- (instancetype)init +{ + self = [super init]; + if (self) { + _registeredTrackers = [NSMutableDictionary dictionary]; + NSString * documentsDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + _collectorsPath = [documentsDir stringByAppendingPathComponent:kCollectorFolder]; + [APCPassiveDataCollector createFolderIfDoesntExist:_collectorsPath]; + [APCPassiveDataCollector createFolderIfDoesntExist:[_collectorsPath stringByAppendingPathComponent:kUploadFolder]]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appBecameActive) name:UIApplicationDidBecomeActiveNotification object:[UIApplication sharedApplication]]; + } + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void) appBecameActive +{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + [self.registeredTrackers enumerateKeysAndObjectsUsingBlock:^(id __unused key, APCDataTracker * obj, BOOL * __unused stop) { + [obj updateTracking]; + }]; + }); +} + +- (NSString *)collectorsUploadPath +{ + return [self.collectorsPath stringByAppendingPathComponent:kUploadFolder]; +} + +/*********************************************************************************/ +#pragma mark - Adding tracker +/*********************************************************************************/ + +- (void) addTracker: (APCDataTracker *) tracker +{ + NSString *identifier = tracker.identifier; + APCDataTracker *existingTracker = self.registeredTrackers [identifier]; + + if (existingTracker) + { + NSString *message = [NSString stringWithFormat: @"Trying to install a [%@]. Found an existing one the same name, [%@]. We'll use that older one, instead of the new one. Calling this an 'error' because we want to track when this happens, in case it leads to problems.", NSStringFromClass ([existingTracker class]), identifier]; + + NSError *errorKindaSorta = [NSError errorWithDomain: @"PassiveDataCollector" + code: 1 + userInfo: @{ NSLocalizedFailureReasonErrorKey: @"Duplicate Passive Data Collector", + NSLocalizedRecoverySuggestionErrorKey: message }]; + + APCLogError2 (errorKindaSorta); + + tracker = existingTracker; + } + + self.registeredTrackers [identifier] = tracker; + tracker.delegate = self; + [self loadOrCreateDataFiles:tracker]; + [tracker startTracking]; +} + +- (void) loadOrCreateDataFiles: (APCDataTracker*) tracker +{ + tracker.folder = [self.collectorsPath stringByAppendingPathComponent:tracker.identifier]; + //Create log files + if (![[NSFileManager defaultManager] fileExistsAtPath:tracker.folder]) { + NSError * folderCreationError; + if (![[NSFileManager defaultManager] createDirectoryAtPath:tracker.folder + withIntermediateDirectories:YES + attributes:@{ + NSFileProtectionKey : + NSFileProtectionCompleteUntilFirstUserAuthentication + } + error:&folderCreationError]) { + APCLogError2(folderCreationError); + } + else + { + [self resetDataFilesForTracker:tracker]; + } + } + + tracker.infoDictionary = @{kIdentifierKey : tracker.identifier, kStartDateKey : [[NSDate date] toStringInISO8601Format]}; +} + +/*********************************************************************************/ +#pragma mark - Flush and zip creation +/*********************************************************************************/ + +- (void)flush:(APCDataTracker*) tracker +{ + NSString *dataFilePath = [tracker.folder stringByAppendingPathComponent:kCSVFilename]; + + NSError *flushError = nil; + + BOOL successfullyMoved = [APCDataArchiverAndUploader uploadFileAtPath:dataFilePath + withTaskIdentifier:tracker.identifier + andTaskRunUuid:[NSUUID UUID] + returningError:&flushError]; + + if (!successfullyMoved) { + APCLogError2(flushError); + } else { + [self resetDataFilesForTracker:tracker]; + } +} + +/*********************************************************************************/ +#pragma mark - APC Tracker Delegate +/*********************************************************************************/ +- (void) APCDataTracker:(APCDataTracker *)tracker hasNewData:(NSArray *)dataArray +{ + [dataArray enumerateObjectsUsingBlock: ^(id obj, NSUInteger __unused idx, BOOL * __unused stop) { + + NSString * rowString = nil; + NSString * csvFilePath = nil; + NSArray * arrayOfStuffToPrint = nil; + + if ([obj isKindOfClass: [CMMotionActivity class]]) + { + /* + This csvColumnValues property comes from our CMMotionActivity+Helper + category. These values will be in the same order as the matching + csvColumnNames. Those names will be shoved into the outbound .csv + file because they're returned by the -columnNames method of the + incoming Tracker. + */ + arrayOfStuffToPrint = @[];//((CMMotionActivity *) obj).csvColumnValues; + } + + else if ([obj isKindOfClass: [NSArray class]]) + { + arrayOfStuffToPrint = obj; + } + + else + { + // Should literally never happen. Ahem. + APCLogDebug (@"Got report for dataTracker object [%@], but I don't know how to handle a [%@].", + obj, + NSStringFromClass ([obj class])); + } + + if (arrayOfStuffToPrint.count > 0) + { + rowString = [[arrayOfStuffToPrint componentsJoinedByString: @","] stringByAppendingString: @"\n"]; + csvFilePath = [tracker.folder stringByAppendingPathComponent: kCSVFilename]; + + [APCPassiveDataCollector createOrAppendString: rowString toFile: csvFilePath]; + } + }]; + + [self checkIfDataNeedsToBeFlushed:tracker]; +} + +- (void) checkIfDataNeedsToBeFlushed:(APCDataTracker*) tracker +{ + //Check for size + NSString *csvFilePath = [tracker.folder stringByAppendingPathComponent:kCSVFilename]; + NSError *flushError = nil; + NSDictionary *fileDictionary = [[NSFileManager defaultManager] attributesOfItemAtPath:csvFilePath error:&flushError]; + NSDate *startDate = [self datefromDateString:tracker.infoDictionary[kStartDateKey]]; + + if (!fileDictionary) { + APCLogError2(flushError); + } else { + if (!startDate) { + startDate = [NSDate date]; + } + + unsigned long long filesize = [fileDictionary fileSize]; + BOOL hasReachedFileSizeLimit = (filesize >= tracker.sizeThreshold); + BOOL hasReachedStalenessInterval = ([[NSDate date] timeIntervalSinceDate:startDate] >= tracker.stalenessInterval); + + if (hasReachedFileSizeLimit || hasReachedStalenessInterval) { + if (hasReachedFileSizeLimit || hasReachedStalenessInterval) { + [self flush:tracker]; + } + } + } +} + +/*********************************************************************************/ +#pragma mark - Helpers +/*********************************************************************************/ + +- (void) resetDataFilesForTracker: (APCDataTracker*) tracker +{ + APCLogEventWithData(kPassiveCollectorEvent, (@{@"Tracker":tracker.identifier, @"Status" : @"Reset"})); + NSString * csvFilePath = [tracker.folder stringByAppendingPathComponent:kCSVFilename]; + NSString * infoFilePath = [tracker.folder stringByAppendingPathComponent:kInfoFilename]; + + [APCPassiveDataCollector deleteFileIfExists:csvFilePath]; + [APCPassiveDataCollector deleteFileIfExists:infoFilePath]; + + //Create data csv file + NSString * rowString = [[[tracker columnNames] componentsJoinedByString:@","] stringByAppendingString:@"\n"]; + [APCPassiveDataCollector createOrAppendString:rowString toFile:csvFilePath]; +} + ++ (void) createOrAppendString: (NSString*) string toFile: (NSString*) path +{ + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + [[string dataUsingEncoding:NSUTF8StringEncoding] writeToFile:path atomically:YES]; + } + else + { + NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:path]; + [fileHandler seekToEndOfFile]; + [fileHandler writeData:[string dataUsingEncoding:NSUTF8StringEncoding]]; + [fileHandler closeFile]; + } +} + ++ (void) createOrReplaceString: (NSString*) string toFile: (NSString*) path +{ + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSError * error; + if (![string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error]) { + APCLogError2(error); + } + } + else + { + NSError * error; + if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) { + APCLogError2(error); + } + else + { + NSError * writeError; + if (![string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error]) { + APCLogError2(writeError); + } + } + } +} + ++ (void) createFolderIfDoesntExist: (NSString*) path +{ + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSError * folderCreationError; + if (![[NSFileManager defaultManager] createDirectoryAtPath:path + withIntermediateDirectories:YES + attributes:@{ + NSFileProtectionKey : + NSFileProtectionCompleteUntilFirstUserAuthentication + } + error:&folderCreationError]) { + APCLogError2(folderCreationError); + } + } +} + ++ (void) deleteFileIfExists: (NSString*) path +{ + if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSError * error; + if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) { + APCLogError2(error); + } + } +} + +- (NSDate*) datefromDateString: (NSString*) string +{ + NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; + [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]; + return [dateFormat dateFromString:string]; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.h new file mode 100644 index 00000000..79b2373a --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.h @@ -0,0 +1,43 @@ +// +// APCCoreLocationTracker.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +#import +#import "APCDataTracker.h" + +@interface APCCoreLocationTracker : APCDataTracker + +- (instancetype)initWithIdentifier: (NSString*) identifier deferredUpdatesTimeout:(NSTimeInterval)anUpdateTimeout andHomeLocationStatus:(NSInteger)aHomeLocationStatus; + +@end + diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.m new file mode 100644 index 00000000..21f552b3 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreLocationTracker.m @@ -0,0 +1,361 @@ +// +// APCCoreLocationTracker.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCAppCore.h" +#import "APCCoreLocationTracker.h" + + +static NSString *kLocationTimeStamp = @"timestamp"; +static NSString *kLocationDistanceFromHomeLocation = @"distanceFromHomeLocation"; +static NSString *kLocationDistanceFromPreviousLocation = @"distanceFromPreviousLocation"; +static NSString *kLocationVerticalAccuracy = @"verticalAccuracy"; +static NSString *kLocationHorizontalAccuracy = @"horizontalAccuracy"; +static NSString *kLocationDistanceUnit = @"distanceUnit"; //Always meters + +static NSString *kBaseTrackingFileName = @"baseTrackingLocation"; +static NSString *kRecentLocationFileName = @"recentLocation"; + +static NSString *kLat = @"lat"; +static NSString *kLon = @"lon"; + +@interface APCCoreLocationTracker () +{ + CLLocation * _baseTrackingLocation; + CLLocation * _mostRecentUpdatedLocation; +} + +@property (strong, nonatomic) CLLocationManager *locationManager; + + // + // determines whether there is a user's home location + // APCPassiveLocationTrackingHomeLocationAvailable or + // APCPassiveLocationTrackingHomeLocationUnavailable + // +@property (nonatomic, assign) APCPassiveLocationTrackingHomeLocation homeLocationStatus; + + // + // when there is a user's home location, baseTrackingLocation + // maintains the position of the user's home location + // + // when there is not a user's home location, baseTrackingLocation + // maintains the position of the most recent but one recorded location + // +@property (nonatomic, strong) CLLocation *baseTrackingLocation; + + // + // used in the case where there is not a user's home location, + // this records the most recent location update + // +@property (nonatomic, strong) CLLocation *mostRecentUpdatedLocation; + +@property (nonatomic, assign) BOOL deferringUpdates; +@end + + +@implementation APCCoreLocationTracker + +- (instancetype)initWithIdentifier:(NSString*)identifier + deferredUpdatesTimeout:(NSTimeInterval) __unused anUpdateTimeout + andHomeLocationStatus:(APCPassiveLocationTrackingHomeLocation)aHomeLocationStatus +{ + APCLogDebug(@"Initalizing location tracker"); + self = [super initWithIdentifier:identifier]; + if (self != nil) + { + _homeLocationStatus = aHomeLocationStatus; + _deferringUpdates = NO; + [self setupInitialLocationParameters]; + } + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)setupInitialLocationParameters +{ + if (_homeLocationStatus == APCPassiveLocationTrackingHomeLocationAvailable) + { + APCUser *user = ((APCAppDelegate *)[UIApplication sharedApplication].delegate).dataSubstrate.currentUser; + CLLocationDegrees homeLocationLatitude = [user.homeLocationLat doubleValue]; + CLLocationDegrees homeLocationLongitude = [user.homeLocationLong doubleValue]; + _baseTrackingLocation = [[CLLocation alloc] initWithLatitude:homeLocationLatitude longitude:homeLocationLongitude]; + } + else + { + _baseTrackingLocation = [[CLLocation alloc] initWithLatitude:0.0 longitude:0.0]; + _mostRecentUpdatedLocation = [[CLLocation alloc] initWithLatitude:0.0 longitude:0.0]; + } +} + +- (void)startTracking +{ + if ([CLLocationManager locationServicesEnabled] == YES) + { + APCLogDebug(@"Start location tracking"); + self.locationManager = [[CLLocationManager alloc] init]; + self.locationManager.delegate = self; + + if ([CLLocationManager significantLocationChangeMonitoringAvailable] == YES && + [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways) + { + APCLogDebug(@"Significant Location Change Monitoring is Available"); + [self.locationManager startMonitoringSignificantLocationChanges]; + } + } +} + +- (void)stopTracking +{ + if ([CLLocationManager locationServicesEnabled] == YES) + { + if ([CLLocationManager significantLocationChangeMonitoringAvailable] == YES) + { + [self.locationManager stopMonitoringSignificantLocationChanges]; + } + } +} + +- (NSArray*)columnNames +{ + NSArray* retValue; + if (self.homeLocationStatus == APCPassiveLocationTrackingHomeLocationAvailable) + { + retValue = @[kLocationTimeStamp, kLocationDistanceFromHomeLocation, kLocationDistanceUnit, kLocationHorizontalAccuracy, kLocationVerticalAccuracy]; + } + else + { + retValue = @[kLocationTimeStamp, kLocationDistanceFromPreviousLocation, kLocationDistanceUnit, kLocationHorizontalAccuracy, kLocationVerticalAccuracy]; + } + return retValue; +} + +/*********************************************************************************/ +#pragma mark - Private Methods +/*********************************************************************************/ + +- (NSArray*)locationDictionaryWithLocationManager:(CLLocationManager*)manager + andDistanceFromReferencePoint:(CLLocationDistance)distanceFromReferencePoint +{ + + NSString* timestamp = manager.location.timestamp.description; + NSString* distance = [NSString stringWithFormat:@"%f", distanceFromReferencePoint]; + NSString* unit = @"meters"; //Hardcoded as Core Locations uses only meters + NSString* horizontalAccuracy = [NSString stringWithFormat:@"%f", manager.location.horizontalAccuracy]; + NSString* verticalAccuracy = [NSString stringWithFormat:@"%f", manager.location.verticalAccuracy]; + + return @[timestamp, distance, unit, horizontalAccuracy, verticalAccuracy]; +} + +- (void)updateArchiveDataWithLocationManager:(CLLocationManager *)manager withUpdateLocations:(NSArray *)locations +{ + NSArray *result = nil; + + if (self.homeLocationStatus == APCPassiveLocationTrackingHomeLocationAvailable) + { + CLLocationDistance distanceFromReferencePoint = [self.baseTrackingLocation distanceFromLocation:manager.location]; + result = [self locationDictionaryWithLocationManager:manager andDistanceFromReferencePoint:distanceFromReferencePoint]; + } + else + { + if ((self.baseTrackingLocation.coordinate.latitude == 0.0) && (self.baseTrackingLocation.coordinate.longitude == 0.0)) + { + self.baseTrackingLocation = [locations firstObject]; + self.mostRecentUpdatedLocation = self.baseTrackingLocation; + if ([locations count] >= 1) + { + CLLocationDistance distanceFromReferencePoint = [self.baseTrackingLocation distanceFromLocation:manager.location]; + result = [self locationDictionaryWithLocationManager:manager andDistanceFromReferencePoint:distanceFromReferencePoint]; + } + } + else + { + self.baseTrackingLocation = self.mostRecentUpdatedLocation; + self.mostRecentUpdatedLocation = manager.location; + CLLocationDistance distanceFromReferencePoint = [self.baseTrackingLocation distanceFromLocation:manager.location]; + result = [self locationDictionaryWithLocationManager:manager andDistanceFromReferencePoint:distanceFromReferencePoint]; + } + } + + //Send to delegate + if (result) + { + [self.delegate APCDataTracker:self hasNewData:@[result]]; + } +} + +/*********************************************************************************/ +#pragma mark -CLLocationManagerDelegate +/*********************************************************************************/ + +- (void)locationManager:(CLLocationManager*)manager didFailWithError:(NSError*)error +{ + APCLogError2(error); + + switch(error.code) + { + case kCLErrorNetwork: + { + // Possible network connection issue (eg, in airplane mode) + break; + } + + case kCLErrorDenied: + { + // The user has denied use of location + [manager stopUpdatingLocation]; + // The app delegate should be notified so that other components (eg, Profile) could + // better reflect the state of location services. + break; + } + + default: + { + // Unknown issue + break; + } + } +} + +- (void) locationManager:(CLLocationManager*) __unused manager + didFinishDeferredUpdatesWithError:(NSError*) error +{ + if (error != nil) + { + APCLogError2(error); + } +} + +#pragma mark TODO After pausing there may be some work to do here + +- (void)locationManagerDidResumeLocationUpdates:(CLLocationManager*) __unused manager +{ +} + +- (void)locationManagerDidPauseLocationUpdates:(CLLocationManager*) __unused manager +{ + APCLogDebug(@"locationManagerDidPauseLocationUpdates"); +} + + +- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations +{ + APCLogDebug(@"locationManager didUpdateLocations at %@", [NSDate date]); + [self updateArchiveDataWithLocationManager:manager withUpdateLocations:locations]; +} + +/*********************************************************************************/ +#pragma mark - Base Tracking Location & Recent Updated Location +/*********************************************************************************/ +- (NSString*)baseTrackingFilePath +{ + return [self.folder stringByAppendingPathComponent:kBaseTrackingFileName]; +} + +- (NSString*)recentLocationFilePath +{ + return [self.folder stringByAppendingPathComponent:kRecentLocationFileName]; +} + +- (void)setBaseTrackingLocation:(CLLocation *)baseTrackingLocation +{ + _baseTrackingLocation = baseTrackingLocation; + NSDictionary * dict = @{kLat : @(baseTrackingLocation.coordinate.latitude), kLon : @(baseTrackingLocation.coordinate.longitude)}; + [self writeDictionary:dict toPath:[self baseTrackingFilePath]]; +} + +- (CLLocation*)baseTrackingLocation +{ + if (!_baseTrackingLocation) + { + if (self.folder) + { + if ([[NSFileManager defaultManager] fileExistsAtPath:[self baseTrackingFilePath]]) + { + NSError* error; + NSString* jsonString = [NSString stringWithContentsOfFile:[self baseTrackingFilePath] encoding:NSUTF8StringEncoding error:&error]; + APCLogError2(error); + NSDictionary* dict; + + if (jsonString) + { + dict = [NSDictionary dictionaryWithJSONString:jsonString]; + _baseTrackingLocation = [[CLLocation alloc] initWithLatitude:[dict[kLat] doubleValue] longitude:[dict[kLon] doubleValue]]; + } + } + } + } + return _baseTrackingLocation; +} + +- (void)setMostRecentUpdatedLocation:(CLLocation *)mostRecentUpdatedLocation +{ + _mostRecentUpdatedLocation = mostRecentUpdatedLocation; + NSDictionary * dict = @{kLat : @(mostRecentUpdatedLocation.coordinate.latitude), kLon : @(mostRecentUpdatedLocation.coordinate.longitude)}; + [self writeDictionary:dict toPath:[self recentLocationFilePath]]; +} + +- (CLLocation*)mostRecentUpdatedLocation +{ + if (!_mostRecentUpdatedLocation) + { + if (self.folder) + { + if ([[NSFileManager defaultManager] fileExistsAtPath:[self recentLocationFilePath]]) + { + NSError* error; + NSString* jsonString = [NSString stringWithContentsOfFile:[self recentLocationFilePath] encoding:NSUTF8StringEncoding error:&error]; + APCLogError2(error); + NSDictionary * dict; + if (jsonString) + { + dict = [NSDictionary dictionaryWithJSONString:jsonString]; + _mostRecentUpdatedLocation = [[CLLocation alloc] initWithLatitude:[dict[kLat] doubleValue] longitude:[dict[kLon] doubleValue]]; + } + } + } + } + + return _mostRecentUpdatedLocation; +} + +- (void)writeDictionary:(NSDictionary*)dict toPath:(NSString*)path +{ + NSString* dataString = [dict JSONString]; + [APCPassiveDataCollector createOrReplaceString:dataString toFile:path]; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.h new file mode 100644 index 00000000..40bbb6a3 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.h @@ -0,0 +1,42 @@ +// +// APCCoreMotionTracker.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCDataTracker.h" +#import + +@interface APCCoreMotionTracker : APCDataTracker + +@property (nonatomic, strong) CMMotionActivityManager *motionActivityManager; + +@end + diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.m new file mode 100644 index 00000000..dc14f414 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCCoreMotionTracker.m @@ -0,0 +1,87 @@ +// +// APCCoreMotionTracker.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCCoreMotionTracker.h" +#import "CMMotionActivity+Helper.h" + + +static NSString *const kLastUsedTimeKey = @"APCPassiveCoreMotionLastTrackedEndDate"; +static NSInteger const kNumberOfDaysBack = 8; +@implementation APCCoreMotionTracker + +- (void) startTracking + +{ + self.motionActivityManager = [[CMMotionActivityManager alloc] init]; + +} + + +- (void) updateTracking +{ + NSDate *lastTrackedEndDate = [[NSUserDefaults standardUserDefaults] objectForKey:kLastUsedTimeKey]; + + if (!lastTrackedEndDate) { + lastTrackedEndDate = [self maximumNumberOfDaysBack]; + + } + + [self.motionActivityManager queryActivityStartingFromDate:lastTrackedEndDate + toDate:[NSDate date] + toQueue:[NSOperationQueue new] + withHandler:^(NSArray *activities, NSError * __unused error) { + + + [self.delegate APCDataTracker:self hasNewData:activities]; + + [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:kLastUsedTimeKey]; + }]; +} + + +#pragma mark - Helper methods + + - (NSDate *) maximumNumberOfDaysBack { + NSInteger numberOfDaysBack = kNumberOfDaysBack * -1; + NSDateComponents *components = [[NSDateComponents alloc] init]; + + [components setDay:numberOfDaysBack]; + + NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:components + toDate:[NSDate date] + options:0]; + + return date; + } + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.h new file mode 100644 index 00000000..a5af4538 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.h @@ -0,0 +1,62 @@ +// +// APCDataTracker.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@class APCDataTracker; +@protocol APCDataTrackerDelegate +- (void) APCDataTracker: (APCDataTracker*) tracker hasNewData: (NSArray*) dataArray; //Array of Arrays. Individual array should have the same number of items as the columnNames array. +@end + +@interface APCDataTracker : NSObject + +@property (nonatomic, readonly) NSString * identifier; + +//Meant only for APCPassiveDataCollector +@property (nonatomic, strong) NSDictionary * infoDictionary; +@property (nonatomic, strong) NSString * folder; +@property (nonatomic, weak) id delegate; + +- (void) startTracking; +- (void) updateTracking; +- (void) stopTracking; + +@property (nonatomic) unsigned long long sizeThreshold; +@property (nonatomic) NSTimeInterval stalenessInterval; + +- (instancetype) initWithIdentifier:(NSString *)identifier; + +- (NSArray*) columnNames; + + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.m new file mode 100644 index 00000000..4106178d --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCDataTracker.m @@ -0,0 +1,101 @@ +// +// APCDataTracker.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCDataTracker.h" + +long long kKBPerMB = 1024; +long long kBytesPerKB = 1024; + +NSUInteger kSecsPerMin = 60; +NSUInteger kMinsPerHour = 60; +NSUInteger kHoursPerDay = 24; +NSUInteger kDaysPerWeek = 7; + +@interface APCDataTracker () +@property (nonatomic, strong) NSString * identifier; +@end + +@implementation APCDataTracker + +-(instancetype)initWithIdentifier:(NSString *)identifier +{ + self = [super init]; + if (self) { + NSAssert(identifier.length > 0, @"Valid identifier missing"); + _identifier = identifier; + } + return self; +} + +/*********************************************************************************/ +#pragma mark - Abstract Implementations +/*********************************************************************************/ + +- (unsigned long long)sizeThreshold +{ + if (_sizeThreshold == 0) { + _sizeThreshold = 50 * kBytesPerKB; + } + return _sizeThreshold; +} + +- (NSTimeInterval)stalenessInterval +{ + if (_stalenessInterval == 0) { + _stalenessInterval = 1 * kHoursPerDay * kMinsPerHour * kSecsPerMin; + } + return _stalenessInterval; +} + +- (NSArray*) columnNames +{ + NSAssert(NO, @"Column names missing"); + return nil; +} + +- (void) startTracking +{ + //Abstract implementation +} + +- (void) stopTracking +{ + //Abstract implementation +} + +- (void) updateTracking +{ + //Abstract implementation +} + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.h new file mode 100644 index 00000000..909904cf --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.h @@ -0,0 +1,44 @@ +// +// APCHKCumulativeQuantityTracker.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +#import +#import "APCDataTracker.h" + +@interface APCHKCumulativeQuantityTracker : APCDataTracker + +@property (nonatomic, strong) HKUnit* unitForTracker; + +- (instancetype) initWithIdentifier:(NSString *)identifier quantityTypeIdentifier: (NSString*) QuantityTypeIdentifier interval: (NSDateComponents*) interval; + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.m new file mode 100644 index 00000000..d89ce624 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKCumulativeQuantityTracker.m @@ -0,0 +1,184 @@ +// +// APCHKCumulativeQuantityTracker.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCHKCumulativeQuantityTracker.h" +#import "APCAppCore.h" + +static NSString *const kAnchorDateFilename = @"anchorDate"; + +@interface APCHKCumulativeQuantityTracker () +{ + NSDate * _anchorDate; +} + +@property (nonatomic, strong) NSDateComponents * interval; +@property (nonatomic, strong) HKQuantityType * quantityType; +@property (nonatomic, strong) NSDate * anchorDate; + +@property (nonatomic, readonly) HKHealthStore * healthStore; + +@property (nonatomic, readonly) NSString* anchorDateFilePath; +@property (nonatomic) BOOL queryStarted; + +@end + +@implementation APCHKCumulativeQuantityTracker + +- (instancetype) initWithIdentifier:(NSString *)identifier quantityTypeIdentifier: (NSString*) quantityTypeIdentifier interval: (NSDateComponents*) interval +{ + self = [super initWithIdentifier:identifier]; + if (self) { + _quantityType = [HKObjectType quantityTypeForIdentifier:quantityTypeIdentifier]; + _interval = interval; + + } + return self; +} + +- (HKHealthStore *)healthStore +{ + return ((APCAppDelegate *)[UIApplication sharedApplication].delegate).dataSubstrate.healthStore; +} + +- (NSArray *)columnNames +{ + return @[@"startDate", @"endDate", @"dataType", @"data", @"unit"]; +} + +- (void)startTracking +{ + [self updateTracking]; +} + +- (void)updateTracking +{ + if ([HKHealthStore isHealthDataAvailable]) { + + [self mainDataQuery]; + } +} + +- (void) mainDataQuery +{ + if (!self.queryStarted) { + if (self.anchorDate < [NSDate todayAtMidnight]) { + NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:self.anchorDate endDate:[NSDate todayAtMidnight] options:HKQueryOptionNone]; + HKStatisticsCollectionQuery * collectionQuery = [[HKStatisticsCollectionQuery alloc] initWithQuantityType:self.quantityType + quantitySamplePredicate:predicate + options:HKStatisticsOptionCumulativeSum + anchorDate:self.anchorDate + intervalComponents:self.interval]; + + __weak APCHKCumulativeQuantityTracker * weakSelf = self; + + collectionQuery.initialResultsHandler = ^(HKStatisticsCollectionQuery * __unused query, + HKStatisticsCollection *results, + NSError *error) + { + weakSelf.queryStarted = NO; + if (!error) { + [weakSelf processStatisticsCollection:results]; + } + }; + + self.queryStarted = YES; + [self.healthStore executeQuery:collectionQuery]; + } + } +} + +- (void) processStatisticsCollection: (HKStatisticsCollection*) collection +{ + NSMutableArray * results = [NSMutableArray array]; + + [collection.statistics enumerateObjectsUsingBlock: ^(HKStatistics * obj, + NSUInteger __unused idx, + BOOL * __unused stop) + { + if (!self.unitForTracker) { + NSAssert(NO, @"unitForTracker missing"); + } + HKUnit * unit = self.unitForTracker; + + NSArray * result = @[obj.startDate.description?:@"No start date", obj.endDate.description?:@"No end date", self.quantityType.identifier?:@"No identifier", @([[obj sumQuantity] doubleValueForUnit:unit])?:@0,unit.unitString?:@"no unit"]; + [results addObject:result]; + + }]; + + [self.delegate APCDataTracker:self hasNewData:results]; + self.anchorDate = [NSDate todayAtMidnight]; +} + +/*********************************************************************************/ +#pragma mark - Anchor Date +/*********************************************************************************/ +- (NSString *)anchorDateFilePath +{ + return [self.folder stringByAppendingPathComponent:kAnchorDateFilename]; +} + +- (void)setAnchorDate:(NSDate *)anchorDate +{ + _anchorDate = anchorDate; + [self writeAnchorDate:anchorDate]; +} + +- (NSDate *)anchorDate +{ + if (!_anchorDate) { + if (self.folder) { + if ([[NSFileManager defaultManager] fileExistsAtPath:self.anchorDateFilePath]) { + NSError * error; + NSString * anchorDateString = [NSString stringWithContentsOfFile:self.anchorDateFilePath encoding:NSUTF8StringEncoding error:&error]; + APCLogError2(error); + _anchorDate = [NSDate dateWithTimeIntervalSinceReferenceDate:[anchorDateString doubleValue]]; + } + else + { + _anchorDate = [NSDate todayAtMidnight]; + [self writeAnchorDate:_anchorDate]; + } + } + + } + return _anchorDate; +} + +- (void) writeAnchorDate: (NSDate*) date +{ + NSString * anchorDateString = [NSString stringWithFormat:@"%0.0f",[date timeIntervalSinceReferenceDate]]; + [APCPassiveDataCollector createOrReplaceString:anchorDateString toFile:self.anchorDateFilePath]; +} + + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.h b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.h new file mode 100644 index 00000000..fa86d782 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.h @@ -0,0 +1,44 @@ +// +// APCHKDiscreteQuantityTracker.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +#import +#import "APCDataTracker.h" + +@interface APCHKDiscreteQuantityTracker : APCDataTracker + +@property (nonatomic, strong) HKUnit* unitForTracker; + +- (instancetype) initWithIdentifier:(NSString *)identifier sampleType: (HKSampleType*) sampleType; + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.m b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.m new file mode 100644 index 00000000..a41b79a7 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndCollector/Trackers/APCHKDiscreteQuantityTracker.m @@ -0,0 +1,173 @@ +// +// APCHKDiscreteQuantityTracker.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCHKDiscreteQuantityTracker.h" +#import "APCAppCore.h" + +static NSString *const kAnchorDataFilename = @"anchorData"; + +@interface APCHKDiscreteQuantityTracker () +{ + NSNumber * _anchorData; +} + +@property (nonatomic, strong) NSDateComponents * interval; +@property (nonatomic, strong) HKSampleType * sampleType; +@property (nonatomic, strong) NSNumber * anchorData; + +@property (nonatomic, readonly) HKHealthStore * healthStore; + +@property (nonatomic, readonly) NSString* anchorDataFilePath; +@property (nonatomic) BOOL queryStarted; + +@end + +@implementation APCHKDiscreteQuantityTracker + +- (instancetype) initWithIdentifier:(NSString *)identifier sampleType: (HKSampleType*) sampleType +{ + self = [super initWithIdentifier:identifier]; + if (self) { + _sampleType = sampleType; + } + return self; +} + +- (HKHealthStore *)healthStore +{ + return ((APCAppDelegate *)[UIApplication sharedApplication].delegate).dataSubstrate.healthStore; +} + +- (NSArray *)columnNames +{ + return @[@"startDate", @"endDate", @"dataType", @"data", @"unit"]; +} + +- (void)startTracking +{ + [self updateTracking]; +} + +- (void)updateTracking +{ + if ([HKHealthStore isHealthDataAvailable]) { + + [self mainDataQuery]; + } +} + +- (void) mainDataQuery +{ + if (!self.queryStarted) { + NSPredicate *predicate; + if (!self.anchorData || [self.anchorData integerValue] == 0) { + predicate = [HKQuery predicateForSamplesWithStartDate:[NSDate todayAtMidnight] endDate:nil options:HKQueryOptionNone]; + } + + __weak APCHKDiscreteQuantityTracker * weakSelf = self; + HKAnchoredObjectQuery * anchorQuery = [[HKAnchoredObjectQuery alloc] initWithType:self.sampleType + predicate:predicate + anchor:[self.anchorData integerValue] + limit:HKObjectQueryNoLimit + completionHandler: + ^(HKAnchoredObjectQuery * __unused query, NSArray *results, NSUInteger newAnchor, NSError *error) { + weakSelf.queryStarted = NO; + if (!error) { + self.anchorData = @(newAnchor); + [weakSelf processResults:results]; + } + }]; + self.queryStarted = YES; + [self.healthStore executeQuery:anchorQuery]; + } +} + +- (void) processResults: (NSArray*) anchorResults +{ + NSMutableArray * results = [NSMutableArray array]; + + [anchorResults enumerateObjectsUsingBlock:^(HKSample * sample, NSUInteger __unused idx, BOOL * __unused stop) { + + HKUnit * unit = self.unitForTracker; + //NOTE: Currently only HKQuantitySample is supported. Other types may require a separate tracker. + if ([sample isKindOfClass:[HKQuantitySample class]]) { + HKQuantitySample * quantitySample = (HKQuantitySample*) sample; + NSArray * result = @[quantitySample.startDate.description?:@"No start date", quantitySample.endDate.description?:@"No end date", self.sampleType.identifier?:@"No identifier", @([quantitySample.quantity doubleValueForUnit:unit])?:@0,unit.unitString?:@"no unit"]; + [results addObject:result]; + } + }]; + [self.delegate APCDataTracker:self hasNewData:results]; +} + +/*********************************************************************************/ +#pragma mark - Anchor Data +/*********************************************************************************/ +- (NSString *)anchorDataFilePath +{ + return [self.folder stringByAppendingPathComponent:kAnchorDataFilename]; +} + +- (void)setAnchorData:(NSNumber*)anchorData +{ + _anchorData = anchorData; + [self writeAnchorData:anchorData]; +} + +- (NSNumber*)anchorData +{ + if (!_anchorData) { + if (self.folder) { + if ([[NSFileManager defaultManager] fileExistsAtPath:self.anchorDataFilePath]) { + NSError * error; + NSString * anchorDataString = [NSString stringWithContentsOfFile:self.anchorDataFilePath encoding:NSUTF8StringEncoding error:&error]; + APCLogError2(error); + _anchorData = @([anchorDataString integerValue]); + } + else + { + _anchorData = @0; + [self writeAnchorData:_anchorData]; + } + } + + } + return _anchorData; +} + +- (void) writeAnchorData: (NSNumber*) data +{ + NSString * anchorDataString = [NSString stringWithFormat:@"%@",data]; + [APCPassiveDataCollector createOrReplaceString:anchorDataString toFile:self.anchorDataFilePath]; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/DataArchiverAndUploader/APCDataArchiverAndUploader.m b/APCAppCore/APCAppCore/Library/DataArchiverAndUploader/APCDataArchiverAndUploader.m index fee01c59..f90b656a 100644 --- a/APCAppCore/APCAppCore/Library/DataArchiverAndUploader/APCDataArchiverAndUploader.m +++ b/APCAppCore/APCAppCore/Library/DataArchiverAndUploader/APCDataArchiverAndUploader.m @@ -36,6 +36,7 @@ #import "APCAppDelegate.h" #import "APCCMS.h" #import "APCDataVerificationClient.h" +#import "APCDataVerificationServerAccessControl.h" #import "APCJSONSerializer.h" #import "APCLog.h" #import "APCUtilities.h" @@ -262,6 +263,8 @@ @implementation APCDataArchiverAndUploader // --------------------------------------------------------- /** + Set global, static values the first time anyone calls this class. + By definition, this method is called once per class, in a thread-safe way, the first time the class is sent a message -- basically, the first time we refer to the class. That means we can use this to set up stuff @@ -1765,7 +1768,7 @@ - (void) beginTheUpload to Bad Guys in production. Even if the code isn't called, if it's in RAM at all, it can be exploited. */ - #ifdef USE_DATA_VERIFICATION_CLIENT + #ifdef USE_DATA_VERIFICATION_SERVER [APCDataVerificationClient uploadDataFromFileAtPath: self.unencryptedZipPath]; diff --git a/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.h b/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.h index cbece9ef..01183118 100644 --- a/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.h +++ b/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.h @@ -29,27 +29,42 @@ // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - +// + + /* Only allow this file to exist in the compiled code if we're diagnosting stuff, in-house. + see: + + https://ymedialabs.atlassian.net/wiki/display/APPLE/How+to+see+the+data+we+send+to+Sage */ + // --------------------------------------------------------- -#ifdef USE_DATA_VERIFICATION_CLIENT +#import "APCDataVerificationServerAccessControl.h" + +#ifdef USE_DATA_VERIFICATION_SERVER // --------------------------------------------------------- +/* + Normal #imports go here. + */ #import + + /* Uploads files and text to a matching DataVerificationServer, written in Ruby, running on a specific machine. (We're still evolving how to specify the IP address.) + + For documentation, please see + https://ymedialabs.atlassian.net/wiki/display/APPLE/How+to+see+the+data+we+send+to+Sage */ @interface APCDataVerificationClient : NSObject @@ -85,7 +100,7 @@ // --------------------------------------------------------- -#endif // USE_DATA_VERIFICATION_CLIENT +#endif // USE_DATA_VERIFICATION_SERVER // --------------------------------------------------------- diff --git a/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.m b/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.m index 4d1b489e..89fe3587 100644 --- a/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.m +++ b/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationClient.m @@ -36,11 +36,15 @@ Only allow this file to exist in the compiled code if we're diagnosing stuff, in-house. For documentation, see: + + https://ymedialabs.atlassian.net/wiki/display/APPLE/How+to+see+the+data+we+send+to+Sage */ // --------------------------------------------------------- -#ifdef USE_DATA_VERIFICATION_CLIENT +#import "APCDataVerificationServerAccessControl.h" + +#ifdef USE_DATA_VERIFICATION_SERVER // --------------------------------------------------------- @@ -92,6 +96,8 @@ The user (programmer) will enter this value into @implementation APCDataVerificationClient /** + Set global, static values the first time anyone calls this class. + By definition, this method is called once per class, in a thread-safe way, the first time the class is sent a message -- basically, the first time we refer to the class. That means we can use this to set up stuff @@ -282,7 +288,7 @@ + (NSData *) createFormBodyPartWithBoundary: (NSString *) boundary // --------------------------------------------------------- -#endif // USE_DATA_VERIFICATION_CLIENT +#endif // USE_DATA_VERIFICATION_SERVER // --------------------------------------------------------- diff --git a/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationServerAccessControl.h b/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationServerAccessControl.h new file mode 100644 index 00000000..c9c6c340 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataVerificationClient/APCDataVerificationServerAccessControl.h @@ -0,0 +1,49 @@ +// +// APCDataVerificationServerAccessControl.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + + + +/* + Uncomment this line in order to use the data-verification server. + + If you do that: do NOT push that change to Git! It allows + the app to broadcast its unencrypted content to a local IP address. + */ + +#if DEBUG + + #define USE_DATA_VERIFICATION_SERVER + +#endif + + diff --git a/APCAppCore/APCAppCore/Library/DataVerificationClient/ReadMe.txt b/APCAppCore/APCAppCore/Library/DataVerificationClient/ReadMe.txt new file mode 100644 index 00000000..c2f6b189 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/DataVerificationClient/ReadMe.txt @@ -0,0 +1,5 @@ +For documentation, please see + + https://ymedialabs.atlassian.net/wiki/display/APPLE/How+to+see+the+data+we+send+to+Sage + +--ron \ No newline at end of file diff --git a/APCAppCore/APCAppCore/Library/Insights/APCInsights.m b/APCAppCore/APCAppCore/Library/Insights/APCInsights.m index 94c9e12d..5c62a379 100644 --- a/APCAppCore/APCAppCore/Library/Insights/APCInsights.m +++ b/APCAppCore/APCAppCore/Library/Insights/APCInsights.m @@ -361,7 +361,7 @@ - (void)dataPointsAreAvailableFromHealthKit:(NSArray *)insightPoints APCLogDebug(@"Insights: %@", insightPoints); NSString *caption = NSLocalizedString(@"Not enough data", @"Not enough data"); - NSNumber *pointValue = nil; + NSNumber *pointValue = @(0); NSArray *goodPoints = [insightPoints filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(%K == %@) AND (%K <> %@)", kInsightDatasetIsGoodDayKey, @(YES), diff --git a/APCAppCore/APCAppCore/Library/Logging/APCLog.m b/APCAppCore/APCAppCore/Library/Logging/APCLog.m index 114c2d5e..2c68e243 100644 --- a/APCAppCore/APCAppCore/Library/Logging/APCLog.m +++ b/APCAppCore/APCAppCore/Library/Logging/APCLog.m @@ -75,6 +75,17 @@ @implementation APCLog #pragma mark - Setup // --------------------------------------------------------- +/** + Set global, static values the first time anyone calls this class. + + By definition, this method is called once per class, in a thread-safe + way, the first time the class is sent a message -- basically, the first + time we refer to the class. That means we can use this to set up stuff + that applies to all objects (instances) of this class. + + Documentation: See +initialize in the NSObject Class Reference. Currently, that's here: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/initialize + */ + (void) initialize { if (dateFormatter == nil) @@ -108,6 +119,7 @@ + (void) methodInfo: (NSString *) apcLogMethodData { if (error != nil) { + // Note: this is expensive. NSString *description = error.friendlyFormattedString; [self logInternal_tag: APCLogTagError diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.h b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.h index b5d97039..b7e3f648 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.h +++ b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.h @@ -36,6 +36,10 @@ +extern NSString *const kAPCMedicationTrackerResourceNameMedication; +extern NSString *const kAPCMedicationTrackerResourceNameDosages; +extern NSString *const kAPCMedicationTrackerResourceNameColors; + /** I need an asynchronous callback for one of the methods in this file. This fits the bill. @@ -43,7 +47,6 @@ typedef void (^APCMedTrackerGenericCallback) (void); - @interface APCMedTrackerDataStorageManager : NSObject /** @@ -55,6 +58,26 @@ typedef void (^APCMedTrackerGenericCallback) (void); andThenUseThisQueue: (NSOperationQueue *) queue toDoThis: (APCMedTrackerGenericCallback) callbackBlock; +/** + * @brief Use this to initialize the storage manager with custom medication + * data. Optionally, pass a block and a queue to do something immediately afterward. + * + * @param bundle The bundle that will be used for loading the files. + * + * @param resourceNames A dictionary of resource names that will be used for loading information. + * + * @param queue A queue that will be used to do something immediately afterwards, can be nil. + * + * @param callbackBlock A block to do something afterwards on the queue that is provided, can be NULL. + * + * @note In order to execute the callback block, a queue must be provided. + * Otherwise the block will not be executed. + */ ++ (void) startupWithCustomDataInBundle: (NSBundle *) bundle + withResourceNames: (NSDictionary *) resourceNames + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThis: (APCMedTrackerGenericCallback) callbackBlock; + /** Get our singleton data-storage manager. */ diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.m b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.m index c526068a..ffe4b2ae 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.m +++ b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerDataStorageManager.m @@ -43,6 +43,10 @@ static APCMedTrackerDataStorageManager *_defaultManager = nil; +NSString *const kAPCMedicationTrackerResourceNameMedication = @"medications"; +NSString *const kAPCMedicationTrackerResourceNameDosages = @"dosages"; +NSString *const kAPCMedicationTrackerResourceNameColors = @"colors"; + static NSString * const FILE_WITH_PREDEFINED_MEDICATIONS = @"APCMedTrackerPredefinedMedications.plist"; static NSString * const FILE_WITH_PREDEFINED_POSSIBLE_DOSAGES = @"APCMedTrackerPredefinedPossibleDosages.plist"; static NSString * const FILE_WITH_PREDEFINED_PRESCRIPTION_COLORS = @"APCMedTrackerPredefinedPrescriptionColors.plist"; @@ -50,7 +54,6 @@ static dispatch_once_t _startupComplete = 0; - @interface APCMedTrackerDataStorageManager () @property (nonatomic, strong) NSOperationQueue *masterQueue; @@ -64,27 +67,61 @@ @implementation APCMedTrackerDataStorageManager + (void) startupReloadingDefaults: (BOOL) shouldReloadPlistFiles andThenUseThisQueue: (NSOperationQueue *) queue toDoThis: (APCMedTrackerGenericCallback) callbackBlock +{ + [self sharedStartupWithDefaults: shouldReloadPlistFiles + inBundle: nil + withResourceNames: nil + andThenUseThisQueue: queue + toDoThis: callbackBlock]; +} + ++ (void) startupWithCustomDataInBundle: (NSBundle *) bundle + withResourceNames: (NSDictionary *) resourceNames + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThis: (APCMedTrackerGenericCallback) callbackBlock +{ + [self sharedStartupWithDefaults: NO + inBundle: bundle + withResourceNames: resourceNames + andThenUseThisQueue: queue + toDoThis: callbackBlock]; +} + ++ (void) sharedStartupWithDefaults: (BOOL) shouldReloadPlistFiles + inBundle: (NSBundle *) bundle + withResourceNames: (NSDictionary *) resourceNames + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThis: (APCMedTrackerGenericCallback) callbackBlock { if (! _defaultManager) { dispatch_once (& _startupComplete, ^{ - + APCMedTrackerDataStorageManager *__block manager = [APCMedTrackerDataStorageManager new]; _defaultManager = manager; - + manager.masterQueue = [NSOperationQueue sequentialOperationQueueWithName: QUEUE_NAME]; [manager.masterQueue addOperationWithBlock:^{ - + manager.masterContext = [manager newContextOnCurrentQueue]; - + APCLogDebug (@"MedTracker defaultManager has been created."); if (shouldReloadPlistFiles) { - [self reloadStaticContentFromPlistFiles]; + [self reloadStaticContentFromPlistFilesUsingBundle:nil withResourceNames:nil]; } - + else if (bundle && resourceNames) + { + // load the data using the bundle that is provided. + [self reloadStaticContentFromPlistFilesUsingBundle:bundle withResourceNames:resourceNames]; + } + else + { + APCLogError(@"We are here because neither the default nor custom resources were asked to be loaded."); + } + [self doThis: callbackBlock onThisQueue: queue]; }]; }); @@ -115,7 +152,8 @@ + (void) doThis: (APCMedTrackerGenericCallback) callbackBlock This is called from within a block on our special queue. */ -+ (void) reloadStaticContentFromPlistFiles ++ (void) reloadStaticContentFromPlistFilesUsingBundle: (NSBundle *) bundle + withResourceNames: (NSDictionary *) resourceNames { APCMedTrackerDataStorageManager *manager = [self defaultManager]; NSManagedObjectContext *context = manager.masterContext; @@ -127,10 +165,55 @@ + (void) reloadStaticContentFromPlistFiles because I designed them to be called from this method. */ - [allInflatedObjects addObjectsFromArray: [APCMedTrackerMedication reloadAllObjectsFromPlistFileNamed: FILE_WITH_PREDEFINED_MEDICATIONS usingContext: context]]; - [allInflatedObjects addObjectsFromArray: [APCMedTrackerPossibleDosage reloadAllObjectsFromPlistFileNamed: FILE_WITH_PREDEFINED_POSSIBLE_DOSAGES usingContext: context]]; - [allInflatedObjects addObjectsFromArray: [APCMedTrackerPrescriptionColor reloadAllObjectsFromPlistFileNamed: FILE_WITH_PREDEFINED_PRESCRIPTION_COLORS usingContext: context]]; - + + NSString *medResourceName = nil; + NSString *doseResourceName = nil; + NSString *colorResourceName = nil; + + if (resourceNames[kAPCMedicationTrackerResourceNameMedication]) + { + medResourceName = resourceNames[kAPCMedicationTrackerResourceNameMedication]; + } + else + { + medResourceName = FILE_WITH_PREDEFINED_MEDICATIONS; + // The default files are in the AppCore bundle, that why we need to set it to nil + bundle = nil; + } + + [allInflatedObjects addObjectsFromArray: [APCMedTrackerMedication reloadAllObjectsFromPlistFileNamed: medResourceName + usingContext: context + inBundle: bundle]]; + + if (resourceNames[kAPCMedicationTrackerResourceNameDosages]) + { + doseResourceName = resourceNames[kAPCMedicationTrackerResourceNameDosages]; + } + else + { + doseResourceName = FILE_WITH_PREDEFINED_POSSIBLE_DOSAGES; + // The default files are in the AppCore bundle, that why we need to set it to nil + bundle = nil; + } + + [allInflatedObjects addObjectsFromArray: [APCMedTrackerPossibleDosage reloadAllObjectsFromPlistFileNamed: doseResourceName + usingContext: context + inBundle: bundle]]; + + if (resourceNames[kAPCMedicationTrackerResourceNameColors]) + { + colorResourceName = resourceNames[kAPCMedicationTrackerResourceNameColors]; + } + else + { + colorResourceName = FILE_WITH_PREDEFINED_PRESCRIPTION_COLORS; + // The default files are in the AppCore bundle, that why we need to set it to nil + bundle = nil; + } + + [allInflatedObjects addObjectsFromArray: [APCMedTrackerPrescriptionColor reloadAllObjectsFromPlistFileNamed: colorResourceName + usingContext: context + inBundle: bundle]]; /* Save to CoreData. diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.h b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.h index e473d085..5c5906df 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.h +++ b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.h @@ -75,7 +75,8 @@ typedef void (^APCMedTrackerQueryCallback) (NSArray *arrayOfGeneratedObjects, code. */ + (NSArray *) reloadAllObjectsFromPlistFileNamed: (NSString *) fileName - usingContext: (NSManagedObjectContext *) context; + usingContext: (NSManagedObjectContext *) context + inBundle: (NSBundle *) bundle; /** Runs a query which loads all objects of this class in CoreData. diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.m b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.m index 7f3d9ab0..070fe3c8 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.m +++ b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedTrackerInflatableItem+Helper.m @@ -67,9 +67,18 @@ + (void) fetchAllFromCoreDataAndUseThisQueue: (NSOperationQueue *) someQueue + (NSArray *) reloadAllObjectsFromPlistFileNamed: (NSString *) fileName usingContext: (NSManagedObjectContext *) context + inBundle: (NSBundle *) bundle { NSMutableArray *inflatedObjects = [NSMutableArray new]; - NSURL *fileUrl = [self urlForBundleFileWithName: fileName]; + NSURL *fileUrl = nil; + + if (bundle) { + fileUrl = [bundle URLForResource:fileName + withExtension:@"plist"]; + } else { + fileUrl = [self urlForBundleFileWithName: fileName]; + } + NSArray *rawData = [NSArray arrayWithContentsOfURL: fileUrl]; for (id probablyDictionary in rawData) @@ -109,12 +118,13 @@ + (NSArray *) reloadAllObjectsFromPlistFileNamed: (NSString *) fileName [generatedObject setValue: value forKey: key]; } } - + + APCMedTrackerInflatableItem *itemToSave = generatedObject; APCMedTrackerInflatableItem *existingObjectWithThisName = [self itemWithSameNameAs: generatedObject inContext: context]; if (existingObjectWithThisName) { - APCMedTrackerInflatableItem *itemToSave = existingObjectWithThisName; + itemToSave = existingObjectWithThisName; for (NSString *key in incomingData.allKeys) { diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedicationLozenge.h b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedicationLozenge.h index c7175f04..e0697b19 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedicationLozenge.h +++ b/APCAppCore/APCAppCore/Library/MedicationTrackerStorageClasses/APCMedicationLozenge.h @@ -39,8 +39,8 @@ @interface APCMedicationLozenge : NSObject @property (nonatomic, strong) APCMedicationWeeklySchedule *schedule; -@property (nonatomic, assign) NSNumber *dosesTakenSoFar; -@property (nonatomic, assign) NSNumber *maxNumberOfDoses; +@property (nonatomic, strong) NSNumber *dosesTakenSoFar; +@property (nonatomic, strong) NSNumber *maxNumberOfDoses; @property (nonatomic, strong) NSNumber *zeroBasedDayOfTheWeek; @property (readonly) BOOL isComplete; diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.h b/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.h index c35dfbf1..0f656f18 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.h +++ b/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.h @@ -37,4 +37,7 @@ @interface APCMedicationTrackerCalendarViewController : ORKStepViewController +@property (nonatomic, strong) NSBundle *resourceBundle; +@property (nonatomic, strong) NSDictionary *resourceNames; + @end diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.m b/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.m index e2d0ddd4..f9ad4cf2 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.m +++ b/APCAppCore/APCAppCore/Library/MedicationTrackingAppComponent/APCMedicationTrackerCalendarViewController.m @@ -461,7 +461,10 @@ - (void)doneButtonWasTapped:(id)__unused sender - (void)addMedicationWasTapped:(id)__unused sender { - APCMedicationTrackerSetupViewController *controller = [[APCMedicationTrackerSetupViewController alloc] initWithNibName:nil bundle:[NSBundle appleCoreBundle]]; + APCMedicationTrackerSetupViewController *controller = [[APCMedicationTrackerSetupViewController alloc] initWithNibName:nil + bundle:[NSBundle appleCoreBundle] + withResourceBundle:self.resourceBundle + andResourceNames:self.resourceNames]; [self.navigationController pushViewController:controller animated:YES]; } @@ -584,7 +587,14 @@ - (void)viewDidLoad self.exScrolliburScrolledByUser = NO; - [APCMedTrackerDataStorageManager startupReloadingDefaults:YES andThenUseThisQueue:nil toDoThis:NULL]; + if (self.resourceBundle && self.resourceNames) { + [APCMedTrackerDataStorageManager startupWithCustomDataInBundle:self.resourceBundle + withResourceNames:self.resourceNames + andThenUseThisQueue:nil + toDoThis:NULL]; + } else { + [APCMedTrackerDataStorageManager startupReloadingDefaults:YES andThenUseThisQueue:nil toDoThis:NULL]; + } self.navigationItem.title = viewControllerTitle; diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationLabel/APCMedicationColorViewController.m b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationLabel/APCMedicationColorViewController.m index 3fa41cc2..d4cdfbfe 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationLabel/APCMedicationColorViewController.m +++ b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationLabel/APCMedicationColorViewController.m @@ -79,7 +79,7 @@ - (IBAction)doneButtonTapped:(UIBarButtonItem *) __unused sender if (self.delegate != nil) { if ([self.delegate respondsToSelector:@selector(colorController:didSelectColorLabelName:)]) { APCMedTrackerPrescriptionColor *schedulColor = self.colorsList[self.selectedIndex.row]; - [self.delegate colorController:self didSelectColorLabelName:schedulColor]; + [self.delegate performSelector:@selector(colorController:didSelectColorLabelName:) withObject:self withObject:schedulColor]; } } } @@ -144,7 +144,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath if (self.delegate != nil) { if ([self.delegate respondsToSelector:@selector(colorController:didSelectColorLabelName:)]) { APCMedTrackerPrescriptionColor *schedulColor = self.colorsList[indexPath.row]; - [self.delegate colorController:self didSelectColorLabelName:schedulColor]; + [self.delegate performSelector:@selector(colorController:didSelectColorLabelName:) withObject:self withObject:schedulColor]; } } } diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationName/APCMedicationNameViewController.m b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationName/APCMedicationNameViewController.m index 2cf1a4af..5e8032b4 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationName/APCMedicationNameViewController.m +++ b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationName/APCMedicationNameViewController.m @@ -265,7 +265,9 @@ - (void)viewDidLoad if (error != nil) { APCLogError2(error); } else { - NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; + NSSortDescriptor *nameSorter = [NSSortDescriptor sortDescriptorWithKey:@"name" + ascending:YES + selector:@selector(caseInsensitiveCompare:)]; NSArray *descriptors = @[ nameSorter ]; NSArray *sorted = [arrayOfGeneratedObjects sortedArrayUsingDescriptors:descriptors]; diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.h b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.h index d4f1722f..26ce64a1 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.h +++ b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.h @@ -35,5 +35,11 @@ @interface APCMedicationTrackerSetupViewController : UIViewController +- (instancetype)initWithNibName:(NSString *)nibNameOrNil + bundle:(NSBundle *)nibBundleOrNil + withResourceBundle:(NSBundle *)resourceBundle + andResourceNames:(NSDictionary *)resourceNames; + + @end diff --git a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.m b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.m index c0a11928..32040234 100644 --- a/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.m +++ b/APCAppCore/APCAppCore/Library/MedicationTrackingSetup/MedicationSetup/APCMedicationTrackerSetupViewController.m @@ -112,10 +112,28 @@ @interface APCMedicationTrackerSetupViewController ( ) + + +// --------------------------------------------------------- +#pragma mark - Enums +// --------------------------------------------------------- + + typedef NS_ENUM(NSUInteger, APCSignUpPermissionsType) { kAPCSignUpPermissionsTypeNone = 0, kAPCSignUpPermissionsTypeHealthKit, @@ -54,29 +61,106 @@ typedef NS_ENUM(NSUInteger, APCDashboardGraphType) { kAPCDashboardGraphTypeDiscrete, }; -FOUNDATION_EXPORT NSString *const APCUserSignedUpNotification; -FOUNDATION_EXPORT NSString *const APCUserSignedInNotification; -FOUNDATION_EXPORT NSString *const APCUserLogOutNotification; -FOUNDATION_EXPORT NSString *const APCUserWithdrawStudyNotification; -FOUNDATION_EXPORT NSString *const APCUserDidConsentNotification; +/** + Indicates where we're getting each batch of schedules and + tasks: from the server, from disk, or from various + application-specific areas. + + Please feel free to add your own sources, here. If you + do, please respect the following: + - Make them bitmask-friendly, using the examples below. + - Do NOT change the values of the existing items. + Those are values in our users' current databases. + - Add your enum name to the switch() statement in the + function NSStringFromAPCScheduleSource(), in this .m + file. + + @details + A key point: as of this writing, EVERY IMPORT of schedules + and tasks from a given source will SUPPLANT all schedules + and tasks from that same source. Details are managed by + the Scheduler class. + + Here's an example. Let's say you get 2 schedules from + the server, and one from disk: + + 1) server: take out the trash every day at 5pm + 2) do push-ups every morning at 10am + 3) disk: fill in your monthly survey on the first of each month + + One day, you do a pull-to-refresh, and you get only ONE + schedule from the server: + + 4) server: take out the trash twice a week at 9pm + + In this case: schedule #4 will replace BOTH schedule #1 + and #2, but won't touch schedule #3. And by "replace," + we mean specifically: those older schedules will get an + end date of midnight on the day before the pull-to-refresh + happened. This means that the user will be able to see + the old schedule if she walks back into the past, and see + the new schedule if she walks forward. + */ +typedef enum : NSUInteger { + APCScheduleSourceAll = 0, + APCScheduleSourceLocalDisk = 1 << 0, // 0000 0000 0000 0001 + APCScheduleSourceServer = 1 << 1, // 0000 0000 0000 0010 + APCScheduleSourceGlucoseLog = 1 << 2, // 0000 0000 0000 0100 + APCScheduleSourceMedicationTracker = 1 << 3, // 0000 0000 0000 1000 +} APCScheduleSource; -FOUNDATION_EXPORT NSString *const APCScheduleUpdatedNotification; -FOUNDATION_EXPORT NSString *const APCUpdateActivityNotification; -FOUNDATION_EXPORT NSString *const APCDayChangedNotification; -FOUNDATION_EXPORT NSString *const APCAppDidRegisterUserNotification; -FOUNDATION_EXPORT NSString *const APCAppDidFailToRegisterForRemoteNotification; +// --------------------------------------------------------- +#pragma mark - Enum Translation Functions +// --------------------------------------------------------- + +/** + Converts an APCScheduleSource object to a string. + + @see APCScheduleSource + */ +NSString *NSStringFromAPCScheduleSource (APCScheduleSource scheduleSource); +NSString *NSStringFromAPCScheduleSourceAsNumber (NSNumber *scheduleSourceAsNumber); +NSString *NSStringShortFromAPCScheduleSource (APCScheduleSource scheduleSource); +NSString *NSStringShortFromAPCScheduleSourceAsNumber (NSNumber *scheduleSourceAsNumber); + + + +// --------------------------------------------------------- +#pragma mark - Notifications +// --------------------------------------------------------- + +/* + Please keep alphabetized. + */ + +FOUNDATION_EXPORT NSString *const APCActivityCompletionNotification; +FOUNDATION_EXPORT NSString *const APCAppDidFailToRegisterForRemoteNotification; +FOUNDATION_EXPORT NSString *const APCAppDidRegisterUserNotification; +FOUNDATION_EXPORT NSString *const APCConsentCompletedWithDisagreeNotification; +FOUNDATION_EXPORT NSString *const APCDayChangedNotification; +FOUNDATION_EXPORT NSString *const APCHealthKitObserverQueryUpdateForSampleTypeNotification; +FOUNDATION_EXPORT NSString *const APCMotionHistoryReporterDoneNotification; +FOUNDATION_EXPORT NSString *const APCScheduleUpdatedNotification; +FOUNDATION_EXPORT NSString *const APCSchedulerUpdatedScheduledTasksNotification; FOUNDATION_EXPORT NSString *const APCScoringHealthKitDataIsAvailableNotification; FOUNDATION_EXPORT NSString *const APCTaskResultsProcessedNotification; +FOUNDATION_EXPORT NSString *const APCUpdateActivityNotification; +FOUNDATION_EXPORT NSString *const APCUpdateChartsNotification; FOUNDATION_EXPORT NSString *const APCUpdateTasksReminderNotification; +FOUNDATION_EXPORT NSString *const APCUserDidConsentNotification; +FOUNDATION_EXPORT NSString *const APCUserLogOutNotification; +FOUNDATION_EXPORT NSString *const APCUserSignedInNotification; +FOUNDATION_EXPORT NSString *const APCUserSignedUpNotification; +FOUNDATION_EXPORT NSString *const APCUserWithdrawStudyNotification; -FOUNDATION_EXPORT NSString *const APCConsentCompletedWithDisagreeNotification; -FOUNDATION_EXPORT NSString *const APCMotionHistoryReporterDoneNotification; - -FOUNDATION_EXPORT NSString *const APCHealthKitObserverQueryUpdateForSampleTypeNotification; +// --------------------------------------------------------- +#pragma mark - Uncategorized Constants +// --------------------------------------------------------- +FOUNDATION_EXPORT NSString *const kAnonDemographicDataUploadedKey; FOUNDATION_EXPORT NSString *const kStudyIdentifierKey; FOUNDATION_EXPORT NSString *const kAppPrefixKey; FOUNDATION_EXPORT NSString *const kBridgeEnvironmentKey; @@ -106,7 +190,7 @@ FOUNDATION_EXPORT NSString *const kHKWorkoutTypeKey; FOUNDATION_EXPORT NSString * const kPasswordKey; FOUNDATION_EXPORT NSString * const kNumberOfMinutesForPasscodeKey; -FOUNDATION_EXPORT NSUInteger const kIndexOfActivitesTab; +FOUNDATION_EXPORT NSUInteger const kAPCActivitiesTabIndex; FOUNDATION_EXPORT NSInteger const kAPCSigninErrorCode_NotSignedIn; FOUNDATION_EXPORT NSUInteger const kAPCSigninNumRetriesBeforePause; FOUNDATION_EXPORT NSTimeInterval const kAPCSigninNumSecondsBetweenRetries; @@ -157,11 +241,33 @@ FOUNDATION_EXPORT NSString *const kAllSetDashboardTextAdditional; FOUNDATION_EXPORT NSString *const kActivitiesSectionKeepGoing; FOUNDATION_EXPORT NSString *const kActivitiesSectionYesterday; FOUNDATION_EXPORT NSString *const kActivitiesSectionToday; +FOUNDATION_EXPORT NSString *const kActivitiesQueryKeyToday; +FOUNDATION_EXPORT NSString *const kActivitiesQueryKeyYesterday; FOUNDATION_EXPORT NSString *const kActivitiesRequiresMotionSensor; +// --------------------------------------------------------- +#pragma mark - Known Times and Dates +// --------------------------------------------------------- + +FOUNDATION_EXPORT NSTimeInterval const kAPCTimeOneHour; +FOUNDATION_EXPORT NSTimeInterval const kAPCTimeOneMinute; +FOUNDATION_EXPORT NSUInteger const kAPCTimeFirstLegalISO8601HourOfDay; +FOUNDATION_EXPORT NSUInteger const kAPCTimeLastLegalISO8601HourOfDay; + + + +// --------------------------------------------------------- +#pragma mark - Fonts and Font Sizes +// --------------------------------------------------------- + +FOUNDATION_EXPORT float const kAPCActivitiesNormalFontSize; +FOUNDATION_EXPORT float const kAPCActivitiesSmallFontSize; + + + // --------------------------------------------------------- #pragma mark - Events // --------------------------------------------------------- diff --git a/APCAppCore/APCAppCore/Library/Objects/APCConstants.m b/APCAppCore/APCAppCore/Library/Objects/APCConstants.m index 53b92dd9..7260bfa0 100644 --- a/APCAppCore/APCAppCore/Library/Objects/APCConstants.m +++ b/APCAppCore/APCAppCore/Library/Objects/APCConstants.m @@ -36,33 +36,80 @@ // --------------------------------------------------------- -#pragma mark - Constants +#pragma mark - Enum Translation Functions // --------------------------------------------------------- -NSString *const APCUserSignedUpNotification = @"APCUserSignedUpNotification"; -NSString *const APCUserSignedInNotification = @"APCUserSignedInNotification"; -NSString *const APCUserLogOutNotification = @"APCUserLogOutNotification"; -NSString *const APCUserWithdrawStudyNotification = @"APCUserWithdrawStudyNotification"; -NSString *const APCUserDidConsentNotification = @"APCUserDidConsentNotification"; +NSString *NSStringFromAPCScheduleSource (APCScheduleSource scheduleSource) +{ + NSString *result = nil; -NSString *const APCScheduleUpdatedNotification = @"APCScheduleUpdatedNotification"; -NSString *const APCUpdateActivityNotification = @"APCUpdateActivityNotification"; -NSString *const APCDayChangedNotification = @"APCDayChangedNotification"; + switch (scheduleSource) + { + case APCScheduleSourceAll: result = @"APCScheduleSourceAll"; break; + case APCScheduleSourceLocalDisk: result = @"APCScheduleSourceLocalDisk"; break; + case APCScheduleSourceServer: result = @"APCScheduleSourceServer"; break; + case APCScheduleSourceGlucoseLog: result = @"APCScheduleSourceGlucoseLog"; break; + case APCScheduleSourceMedicationTracker: result = @"APCScheduleSourceMedicationTracker"; break; -NSString *const APCAppDidRegisterUserNotification = @"APCAppDidRegisterUserNotification"; -NSString *const APCAppDidFailToRegisterForRemoteNotification = @"APCAppDidFailToRegisterForRemoteNotifications"; + default: result = @"Unknown"; break; + } -NSString *const APCScoringHealthKitDataIsAvailableNotification = @"APCScoringHealthKitDataIsAvailableNotification"; -NSString *const APCTaskResultsProcessedNotification = @"APCTaskResultsProcessedNotification"; + return result; +} -NSString *const APCUpdateTasksReminderNotification = @"APCUpdateTasksReminderNotification"; +NSString *NSStringFromAPCScheduleSourceAsNumber (NSNumber *scheduleSourceAsNumber) +{ + return NSStringFromAPCScheduleSource (scheduleSourceAsNumber.integerValue); +} -NSString *const APCConsentCompletedWithDisagreeNotification = @"goToSignInJoinScreen"; +NSString *NSStringShortFromAPCScheduleSource (APCScheduleSource scheduleSource) +{ + NSString *result = NSStringFromAPCScheduleSource (scheduleSource); + result = [result substringFromIndex: @"APCScheduleSource".length]; + return result; +} -NSString *const APCMotionHistoryReporterDoneNotification = @"APCMotionHistoryReporterDoneNotification"; +NSString *NSStringShortFromAPCScheduleSourceAsNumber (NSNumber *scheduleSourceAsNumber) +{ + return NSStringShortFromAPCScheduleSource (scheduleSourceAsNumber.integerValue); +} -NSString *const APCHealthKitObserverQueryUpdateForSampleTypeNotification = @"APCHealthKitObserverQueryUpdateForSampleTypeNotification"; + +// --------------------------------------------------------- +#pragma mark - Notifications +// --------------------------------------------------------- + +/* + Please keep alphabetized. + */ + +NSString *const APCActivityCompletionNotification = @"APCActivityCompletionNotification"; +NSString *const APCAppDidFailToRegisterForRemoteNotification = @"APCAppDidFailToRegisterForRemoteNotifications"; +NSString *const APCAppDidRegisterUserNotification = @"APCAppDidRegisterUserNotification"; +NSString *const APCConsentCompletedWithDisagreeNotification = @"goToSignInJoinScreen"; +NSString *const APCDayChangedNotification = @"APCDayChangedNotification"; +NSString *const APCMotionHistoryReporterDoneNotification = @"APCMotionHistoryReporterDoneNotification"; +NSString *const APCScheduleUpdatedNotification = @"APCScheduleUpdatedNotification"; +NSString *const APCSchedulerUpdatedScheduledTasksNotification = @"APCSchedulerUpdatedScheduledTasksNotification"; +NSString *const APCScoringHealthKitDataIsAvailableNotification = @"APCScoringHealthKitDataIsAvailableNotification"; +NSString *const APCTaskResultsProcessedNotification = @"APCTaskResultsProcessedNotification"; +NSString *const APCUpdateActivityNotification = @"APCUpdateActivityNotification"; +NSString *const APCUpdateChartsNotification = @"APCUpdateChartsNotification"; +NSString *const APCUpdateTasksReminderNotification = @"APCUpdateTasksReminderNotification"; +NSString *const APCUserDidConsentNotification = @"APCUserDidConsentNotification"; +NSString *const APCUserLogOutNotification = @"APCUserLogOutNotification"; +NSString *const APCUserSignedInNotification = @"APCUserSignedInNotification"; +NSString *const APCUserSignedUpNotification = @"APCUserSignedUpNotification"; +NSString *const APCUserWithdrawStudyNotification = @"APCUserWithdrawStudyNotification"; + + + +// --------------------------------------------------------- +#pragma mark - Uncategorized Constants +// --------------------------------------------------------- + +NSString *const kAnonDemographicDataUploadedKey = @"kAnonDemographicDataUploadedKey"; NSString *const kStudyIdentifierKey = @"StudyIdentifierKey"; NSString *const kAppPrefixKey = @"AppPrefixKey"; NSString *const kBridgeEnvironmentKey = @"BridgeEnvironmentKey"; @@ -85,15 +132,14 @@ NSString *const kHKQuantityTypeKey = @"HKQuantityType"; NSString *const kHKCategoryTypeKey = @"HKCategoryType"; +NSString *const kHKWorkoutTypeKey = @"HKWorkoutType"; NSString *const kHKCharacteristicTypeKey = @"HKCharacteristicType"; NSString *const kHKCorrelationTypeKey = @"HKCorrelationType"; -NSString *const kHKWorkoutTypeKey = @"HKWorkoutType"; - NSString * const kPasswordKey = @"Password"; NSString * const kNumberOfMinutesForPasscodeKey = @"NumberOfMinutesForPasscodeKey"; -NSUInteger const kIndexOfActivitesTab = 0; +NSUInteger const kAPCActivitiesTabIndex = 0; NSInteger const kAPCSigninErrorCode_NotSignedIn = 404; NSUInteger const kAPCSigninNumRetriesBeforePause = 10; NSTimeInterval const kAPCSigninNumSecondsBetweenRetries = 10; @@ -143,11 +189,33 @@ NSString *const kActivitiesSectionKeepGoing = @"activitiesSectionKeepGoing"; NSString *const kActivitiesSectionYesterday = @"activitiesSectionYesterday"; NSString *const kActivitiesSectionToday = @"activitiesSectionToday"; +NSString *const kActivitiesQueryKeyToday = @"today"; +NSString *const kActivitiesQueryKeyYesterday = @"yesterday"; NSString *const kActivitiesRequiresMotionSensor = @"activitiesRequireMotionSensor"; +// --------------------------------------------------------- +#pragma mark - Known Times and Dates +// --------------------------------------------------------- + +NSTimeInterval const kAPCTimeOneHour = 60 * 60; // seconds * minutes = 1 hour. +NSTimeInterval const kAPCTimeOneMinute = 60; // seconds per minute. +NSUInteger const kAPCTimeFirstLegalISO8601HourOfDay = 0; // midnight on a given morning. +NSUInteger const kAPCTimeLastLegalISO8601HourOfDay = 24; // midnight on a given evening. + + + +// --------------------------------------------------------- +#pragma mark - Fonts and Font Sizes +// --------------------------------------------------------- + +float const kAPCActivitiesNormalFontSize = 16.0; +float const kAPCActivitiesSmallFontSize = 14.0; + + + // --------------------------------------------------------- #pragma mark - Events // --------------------------------------------------------- diff --git a/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.h b/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.h index ae7397c9..7850427a 100644 --- a/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.h +++ b/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.h @@ -39,5 +39,6 @@ + (BOOL)setString:(NSString *)value forKey:(NSString *)key; + (void)removeValueForKey:(NSString *)key; + (void)resetKeyChain; ++ (NSDate *)modifiedDateForKey:(NSString *)key; //kSecAttrModificationDate @end diff --git a/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.m b/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.m index 558c9fe0..02f40038 100644 --- a/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.m +++ b/APCAppCore/APCAppCore/Library/Objects/APCKeychainStore.m @@ -63,6 +63,15 @@ +(void)resetKeyChain [self removeAllItemsForService:[self defaultService] accessGroup:nil]; } ++ (NSDate *)modifiedDateForKey:(NSString *)key +{ + NSDictionary *keyAttrs = [self _itemAttributesAndDataForKey:key forService:[self defaultService] inAccessGroup:nil]; + + NSDate *keyModifiedDate = keyAttrs[(__bridge id)kSecAttrModificationDate]; + + return keyModifiedDate; +} + /*********************************************************************************/ #pragma mark - Private Methods /*********************************************************************************/ @@ -76,6 +85,67 @@ + (NSString *)defaultService return _defaultService; } ++ (NSMutableDictionary *)_baseQueryDictionaryForKey: (NSString *)key + forService: (NSString *)service + inAccessGroup: (NSString *) __unused accessGroup +{ + // Create dictionary that will be the basis for all queries against the keychain. + NSMutableDictionary *baseQueryDictionary = [[NSMutableDictionary alloc] + initWithCapacity: 4]; + + [baseQueryDictionary setObject: (__bridge id)kSecClassGenericPassword + forKey: (__bridge id)kSecClass]; + + [baseQueryDictionary setObject: key + forKey: (__bridge id)kSecAttrAccount]; + + [baseQueryDictionary setObject: service + forKey: (__bridge id)kSecAttrService]; + +#if TARGET_IPHONE_SIMULATOR + // Note: If we are running in the Simulator we cannot set the access group. Apps running in the Simulator are not signed so there is no access group for them to check. All apps running in the simulator can see all the keychain items. If you need to test apps that share access groups you will need to install the apps on a device. +#else + if ([accessGroup length] > 0) + { + [baseQueryDictionary setObject: accessGroup + forKey: (__bridge id)kSecAttrAccessGroup]; + } +#endif + + return baseQueryDictionary; +} + ++ (NSDictionary *)_itemAttributesAndDataForKey: (NSString *)key + forService: (NSString *)service + inAccessGroup: (NSString *)accessGroup +{ + // Load the item from the keychain that matches the key, service and access group. + NSMutableDictionary *queryDictionary = [self _baseQueryDictionaryForKey: key + forService: service + inAccessGroup: accessGroup]; + + [queryDictionary setObject: (__bridge id)kSecMatchLimitOne + forKey: (__bridge id)kSecMatchLimit]; + [queryDictionary setObject: (id)kCFBooleanTrue + forKey: (__bridge id)kSecReturnAttributes]; + [queryDictionary setObject: (id)kCFBooleanTrue + forKey: (__bridge id)kSecReturnData]; + + CFTypeRef itemAttributesAndDataTypeRef = nil; + + OSStatus resultCode = SecItemCopyMatching((__bridge CFDictionaryRef)queryDictionary, &itemAttributesAndDataTypeRef); + + NSDictionary *itemAttributesAndData = nil; + + if (resultCode != errSecSuccess) + { + APCLogDebug(@"Error getting data from keychain: %lii", resultCode); + } else { + itemAttributesAndData = (__bridge_transfer NSDictionary *)itemAttributesAndDataTypeRef; + } + + return itemAttributesAndData; +} + (NSData *) dataForKey: (NSString *) key service: (NSString *) service @@ -125,7 +195,6 @@ + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)servic NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; [query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; [query setObject:service forKey:(__bridge id)kSecAttrService]; - [query setObject:key forKey:(__bridge id)kSecAttrGeneric]; [query setObject:key forKey:(__bridge id)kSecAttrAccount]; #if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) if (accessGroup) { @@ -150,7 +219,6 @@ + (BOOL)setData:(NSData *)data forKey:(NSString *)key service:(NSString *)servic NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init]; [attributes setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; [attributes setObject:service forKey:(__bridge id)kSecAttrService]; - [attributes setObject:key forKey:(__bridge id)kSecAttrGeneric]; [attributes setObject:key forKey:(__bridge id)kSecAttrAccount]; #if TARGET_OS_IPHONE || (defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) [attributes setObject:(__bridge id)kSecAttrAccessibleAfterFirstUnlock forKey:(__bridge id)kSecAttrAccessible]; @@ -191,7 +259,6 @@ + (BOOL) removeItemForKey: (NSString *) key NSMutableDictionary *itemToDelete = [[NSMutableDictionary alloc] init]; [itemToDelete setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; [itemToDelete setObject:service forKey:(__bridge id)kSecAttrService]; - [itemToDelete setObject:key forKey:(__bridge id)kSecAttrGeneric]; [itemToDelete setObject:key forKey:(__bridge id)kSecAttrAccount]; #if !TARGET_IPHONE_SIMULATOR && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) if (accessGroup) { diff --git a/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.h b/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.h index 19d13ea2..c0f926a3 100644 --- a/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.h +++ b/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.h @@ -42,4 +42,4 @@ - (void)manageTaskReminder:(APCTaskReminder *)reminder; + (NSArray*) reminderTimesArray; + (NSSet *) taskReminderCategories; -@end +@end \ No newline at end of file diff --git a/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.m b/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.m index c2068a06..7d831578 100644 --- a/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.m +++ b/APCAppCore/APCAppCore/Library/Objects/APCTasksReminderManager.m @@ -509,4 +509,4 @@ + (NSArray *)scheduledTasksForTaskID:(NSString *)taskID completed:(NSNumber *)co } -@end +@end \ No newline at end of file diff --git a/APCAppCore/APCAppCore/Library/Objects/APCUtilities.h b/APCAppCore/APCAppCore/Library/Objects/APCUtilities.h index 445213cb..6b202b83 100644 --- a/APCAppCore/APCAppCore/Library/Objects/APCUtilities.h +++ b/APCAppCore/APCAppCore/Library/Objects/APCUtilities.h @@ -73,6 +73,14 @@ */ + (NSString *) phoneInfo; +/** + Returns YES if the current build is a "DEBUG" build -- + i.e., if the DEBUG preprocessor flag is defined. Lets + us use debug-only logic in normal "if" statements, + instead of having to use #if statements. + */ ++ (BOOL) isInDebuggingMode; + /** Trims whitespace from someString and returns it. If the trimmed string has length 0, returns nil. @@ -100,10 +108,31 @@ + (NSString *) pathToTemporaryDirectoryAddingUuid: (BOOL) shouldAddUuid; +/** + Returns the file-creation date on our database file. + */ ++ (NSDate *) firstKnownFileAccessDate; + + @end +// --------------------------------------------------------- +#pragma mark - Other Macros +// --------------------------------------------------------- + +/** + Returns valueToTest clamped to minValue and maxValue. + I.e., returns minValue if valueToTest is less than + minValue, maxValue if valueToTest if greater than + maxValue, and valueToTest itself if it's between those + two values. + */ +#define CLAMP( minValue, valueToTest, maxValue ) (MIN (MAX (valueToTest, minValue), maxValue)) + + + // --------------------------------------------------------- #pragma mark - Macro: converting varArgs into a string // --------------------------------------------------------- @@ -134,7 +163,7 @@ - (void) printMyStuff: (NSString *) messageFormat, ... { - NSString extractedString = stringFromVariadicArgumentsAndFormat( messageFormat ); + NSString extractedString = NSStringFromVariadicArgumentsAndFormat ( messageFormat ); // // now use the extractedString. For example: @@ -191,6 +220,89 @@ +/** + Macro NSArrayFromVariadicArguments() + + This macro converts a bunch of "..." arguments into an NSArray, + including the parameter to the left of the "...". Each argument + must be an "id" type, or a subclass of NSObject. + + @details + To use it: + + First, create a method that ENDS with a "...", like this: + + @code + - (void) collectMyStuff: (NSNumber *) myAge, ... + { + } + @endcode + + The data type of that parameter doesn't matter for the purpose + of this macro. It only matters that there IS a parameter to the + left of the ", ..." (the comma-space-dot-dot-dot). + + Inside that method, call this macro, passing it the name of the + parameter to the left of the "...". Using the above method as + an example, you might write: + + @code + - (void) collectMyStuff: (NSNumber *) myAge, ... + { + NSArray myStuff = NSArrayFromVariadicArguments( myAge ); + + // + // now use myStuff. For example: + // + NSLog (@"All my stuff is: %@", myStuff); + } + @endcode + + You might use it like this: + + @code + NSString *name = @"Joe"; + UIColor *favoriteColor = [UIColor blueColor]; + NSNumber *age = "50"; + + [self collectMyStuff: name, favoriteColor, age]; + @endcode + + Behind the scenes, this macro adds that first parameter to + a mutable array. Then it walks through all the remaining "..." + parameters (if any), adding each of them to the same mutable + array. Finally, it slurps the contents of the mutable array + into a normal NSArray and returns that. + + Note that this macro requires ARC. (To use it without ARC, + you'll need to edit the macro to release and autorelease + things appropriately.) + + This macro was created with the same research as for + NSStringFromVariadicArgumentsAndFormat(), with some additional + help regarding this command for accessing individual parameters + in the "..." list: + + http://www.cplusplus.com/reference/cstdarg/va_arg/ + + For more information, see NSStringFromVariadicArgumentsAndFormat (). + + Other keywords to find this chunk of code: va_args, varargs, + vaargs, variadic arguments, variadic macro, dotdotdot, ellipsis, + three dots +*/ +#define NSArrayFromVariadicArguments( firstArgumentName ) \ + ({ \ + NSMutableArray *incomingObjects = [NSMutableArray new]; \ + [incomingObjects addObject: firstArgumentName]; \ + va_list arguments; \ + va_start (arguments, firstArgumentName); \ + [incomingObjects addObject: va_arg (arguments, id)]; \ + va_end (arguments); \ + NSArray *returnValue = [NSArray arrayWithArray: incomingObjects]; \ + returnValue; \ + }) + diff --git a/APCAppCore/APCAppCore/Library/Objects/APCUtilities.m b/APCAppCore/APCAppCore/Library/Objects/APCUtilities.m index b9088dbb..4413f88d 100644 --- a/APCAppCore/APCAppCore/Library/Objects/APCUtilities.m +++ b/APCAppCore/APCAppCore/Library/Objects/APCUtilities.m @@ -33,6 +33,7 @@ #import "APCUtilities.h" #import "APCDeviceHardware.h" +#import "APCLog.h" /** These are fixed per launch of the app. They're also @@ -139,6 +140,17 @@ works like this (here's line 2 as an example): return _appName; } ++ (BOOL) isInDebuggingMode +{ + BOOL result = NO; + + #if DEBUG + result = YES; + #endif + + return result; +} + /** Trims whitespace from someString and returns it. If the trimmed string has length 0, returns nil. @@ -177,4 +189,30 @@ + (NSString *) pathToTemporaryDirectoryAddingUuid: (BOOL) shouldAddUuid return tempDirectory; } ++ (NSDate *) firstKnownFileAccessDate +{ + NSDate *result = nil; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *applicationDocumentsDirectory = ([paths count] > 0) ? paths[0] : nil; + NSFileManager* fileManager = [NSFileManager defaultManager]; + NSString* filePath = [applicationDocumentsDirectory stringByAppendingPathComponent:@"db.sqlite"]; + + if ([fileManager fileExistsAtPath:filePath]) + { + NSError* error = nil; + NSDictionary* attributes = [fileManager attributesOfItemAtPath:filePath error:&error]; + + if (error) + { + APCLogError2(error); + } + else + { + result = [attributes fileCreationDate]; + } + } + + return result; +} + @end diff --git a/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.h b/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.h index 468f637e..1c9f2e73 100644 --- a/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.h +++ b/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.h @@ -32,6 +32,7 @@ // #import +#import "APCAppCore.h" #import "APCConstants.h" typedef void(^APCPermissionsBlock)(BOOL granted, NSError *error); diff --git a/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.m b/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.m index ab06003e..afc1d8fa 100644 --- a/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.m +++ b/APCAppCore/APCAppCore/Library/Permissions/APCPermissionsManager.m @@ -483,6 +483,7 @@ - (void)locationManager:(CLLocationManager *) __unused manager didChangeAuthoriz - (void)appDidRegisterForRemoteNotifications: (NSNotification *)notification { + UIUserNotificationSettings *settings = (UIUserNotificationSettings *)notification.object; if (settings.types != 0) { diff --git a/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.h b/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.h index 19f2004e..6e89ebc0 100644 --- a/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.h +++ b/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.h @@ -33,6 +33,8 @@ #import +@class APCScheduleEnumerator; + /** @@ -105,7 +107,7 @@ * * @return An enumerator; returns NSDate(s) that satisfies `self` */ -- (NSEnumerator*)enumeratorBeginningAtTime:(NSDate*)start; +- (APCScheduleEnumerator*)enumeratorBeginningAtTime:(NSDate*)start; /** * An enumerator that provides a finite sequence of NSDates from `start` to `end` that satifisies `self` @@ -115,6 +117,6 @@ * * @return An enumerator, returns NSDate(s) that satisfies `self` */ -- (NSEnumerator*)enumeratorBeginningAtTime:(NSDate*)start endingAtTime:(NSDate*)end; +- (APCScheduleEnumerator*)enumeratorBeginningAtTime:(NSDate*)start endingAtTime:(NSDate*)end; @end diff --git a/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.m b/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.m index e5e8ef14..e0bd564d 100644 --- a/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.m +++ b/APCAppCore/APCAppCore/Library/ScheduleExpression/APCScheduleExpression.m @@ -85,7 +85,7 @@ - (instancetype)initWithExpression:(NSString*)expression timeZero:(NSTimeInterva return self; } -- (NSEnumerator*)enumeratorBeginningAtTime:(NSDate*)start +- (APCScheduleEnumerator*)enumeratorBeginningAtTime:(NSDate*)start { NSParameterAssert(start != nil); @@ -98,11 +98,11 @@ - (NSEnumerator*)enumeratorBeginningAtTime:(NSDate*)start originalCronExpression:self.originalCronExpression]; } -- (NSEnumerator*)enumeratorBeginningAtTime:(NSDate*)start endingAtTime:(NSDate*)end +- (APCScheduleEnumerator*)enumeratorBeginningAtTime:(NSDate*)start endingAtTime:(NSDate*)end { NSParameterAssert(start != nil); NSParameterAssert(end != nil); - + return [[APCScheduleEnumerator alloc] initWithBeginningTime:start endingTime:end minuteSelector:self.minuteSelector diff --git a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCPointSelector.m b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCPointSelector.m index 80a5e48c..be3c6ea3 100644 --- a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCPointSelector.m +++ b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCPointSelector.m @@ -223,7 +223,7 @@ - (void) setUnitType: (UnitType) unitType // Based on the unit tests, if this is not a wildcard or has a step defined, end should be nil. if (self.isWildcard || self.step) { - self.end = self.defaultEnd; + self.end = self.defaultEnd; } } else if (self.end.integerValue > self.end.integerValue) diff --git a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.h b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.h index 886ab6e9..1f1e1b04 100644 --- a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.h +++ b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.h @@ -1,5 +1,5 @@ // -// APCScheduleEnumerator.h +// APCScheduleEnumerator.h // APCAppCore // // Copyright (c) 2015, Apple Inc. All rights reserved. @@ -55,4 +55,11 @@ yearSelector:(APCTimeSelector *) yearSelector originalCronExpression: (NSString *) originalExpression; +/** Simply calls -nextScheduledDate. Provided for the ability to enumerate using fast enumeration (i.e., inside a for loop). */ +- (id) nextObject; + +/** The next date being emitted by this enumerator. If this is the first time being called, returns the first date. */ +@property (readonly) NSDate *nextScheduledDate; + + @end diff --git a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.m b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.m index ca6d79aa..3ad5a987 100644 --- a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.m +++ b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleEnumerator.m @@ -1,5 +1,5 @@ // -// APCScheduleEnumerator.m +// APCScheduleEnumerator.m // APCAppCore // // Copyright (c) 2015, Apple Inc. All rights reserved. @@ -141,7 +141,12 @@ - (instancetype)initWithBeginningTime: (NSDate *) begin return self; } -- (NSDate*) nextObject +- (id) nextObject +{ + return self.nextScheduledDate; +} + +- (NSDate *) nextScheduledDate { NSDate* result = nil; @@ -173,7 +178,7 @@ - (NSDate*) firstDate NSNumber* minute = self.minuteSelector.initialValue; NSNumber* hour = self.hourSelector.initialValue; NSNumber* month = self.monthSelector.initialValue; - NSNumber* year = self.yearSelector.initialValue; + NSNumber* year = self.yearSelector.initialValue; // TODO. This may be wrong and irrelevant -- it was computed based on "this year." It needs to reflect the passed-in start and end years. ...back in -init; we're too late, here. [self.daySelector recomputeDaysBasedOnMonth:month year:year]; NSNumber* day = self.daySelector.initialValue; @@ -222,7 +227,9 @@ - (NSDate*) firstDate month-and-year combination, so that the day-of-the-week rules are applied correctly (e.g., getting the right date for "the first Friday of the month") and so that we have - the right number of days per month (28, 31, etc.). + the right number of days per month (28, 31, etc.). We thus + also have to check whether the new month has ANY legal days + in it at all, and move to the next month if not. This method is also used when determining the first legal date for this enumerator. See -firstDate. @@ -295,7 +302,7 @@ - (NSDate*) nextDate DateField dateFieldIndex = DateFieldMinute; while (dateFieldIndex <= DateFieldYear && shouldInspectNextField) - { + { APCTimeSelector* dateFieldSelector = self.selectors [dateFieldIndex]; NSNumber* prevFieldValue = self.dateComponents [dateFieldIndex]; NSNumber* newFieldValue = [dateFieldSelector nextMomentAfter: prevFieldValue]; @@ -306,24 +313,25 @@ - (NSDate*) nextDate self.dateComponents [dateFieldIndex] = firstFieldValue; shouldInspectNextField = YES; } + else if (dateFieldIndex < DateFieldMonth) - { + { self.dateComponents [dateFieldIndex] = newFieldValue; shouldInspectNextField = NO; - } + } else // dateFieldIndex == Month or Year { // Record the fact that we looked at this month or year. self.dateComponents [dateFieldIndex] = newFieldValue; - // Recompute the days in this new month. + // Recompute the days in this new month. NSNumber* month = self.dateComponents [DateFieldMonth]; NSNumber* year = self.dateComponents [DateFieldYear]; [self.daySelector recomputeDaysBasedOnMonth: month year: year]; - + if (self.daySelector.hasAnyLegalDays) { NSNumber *firstDayValue = self.daySelector.initialValue; @@ -331,12 +339,12 @@ - (NSDate*) nextDate shouldInspectNextField = NO; } else - { + { // Go to the next month. I.e., keep cycling on the current "date field." dateFieldIndex = DateFieldMonth - (DateField) 1; shouldInspectNextField = YES; } - } + } // Move to the next field. dateFieldIndex ++; @@ -349,7 +357,7 @@ - (NSDate*) nextDate else { result = [self componentsAsDate]; - + if ([result isLaterThanDate: self.endingMoment]) { result = nil; diff --git a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionParser.m b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionParser.m index 30892c10..f108bc6c 100644 --- a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionParser.m +++ b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionParser.m @@ -422,7 +422,7 @@ - (void) coerceSelector: (APCListSelector *) list default: // No changes for the rest of them, yet. break; - } + } } } diff --git a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionTokenizer.m b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionTokenizer.m index b39d7a53..38ee71a7 100644 --- a/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionTokenizer.m +++ b/APCAppCore/APCAppCore/Library/ScheduleExpression/Internals/APCScheduleExpressionTokenizer.m @@ -52,8 +52,15 @@ @implementation APCScheduleExpressionTokenizer /** - This method runs exactly once, in a thread-safe way, - the first time the class is referenced in the code. + Set global, static values the first time anyone calls this class. + + By definition, this method is called once per class, in a thread-safe + way, the first time the class is sent a message -- basically, the first + time we refer to the class. That means we can use this to set up stuff + that applies to all objects (instances) of this class. + + Documentation: See +initialize in the NSObject Class Reference. Currently, that's here: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/initialize */ + (void) initialize { diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.h b/APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.h new file mode 100644 index 00000000..29cc50e1 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.h @@ -0,0 +1,40 @@ +// +// APCActivitiesDateState.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@interface APCActivitiesDateState : NSObject + +- (NSDictionary *)activitiesStateForDate:(NSDate *)date; + +@end diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.m b/APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.m new file mode 100644 index 00000000..4ced08ac --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCActivitiesDateState.m @@ -0,0 +1,147 @@ +// +// APCActivitiesDateState.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCActivitiesDateState.h" +#import "APCTopLevelScheduleEnumerator.h" +#import "APCScheduler.h" +#import +#import "APCSchedule+AddOn.h" +#import "APCAppDelegate.h" +#import "APCTask.h" +#import "APCScheduledTask.h" +#import "APCLog.h" +#import "NSManagedObject+APCHelper.h" + +@implementation APCActivitiesDateState + +-(NSDictionary *)activitiesStateForDate:(NSDate *)date +{ + + NSMutableDictionary *activitiesState = [NSMutableDictionary new]; + + //incomplete Activity State + for (APCSchedule *schedule in [self activitiesSchedulesForDate:date]) + { + NSArray *scheduledTimes = [self scheduledTimesForSchedule:schedule forDate:date]; + + NSMutableDictionary *times = [NSMutableDictionary new]; + for (NSDate *date in scheduledTimes) { + APCLogDebug(@"scheduled time for task: %@ is %@", [(APCTask *)schedule.tasks.anyObject taskID], date); + [times setObject:[NSNumber numberWithBool:NO] forKey:date]; + } + [activitiesState setValue:times forKey:[(APCTask *)schedule.tasks.anyObject taskID]]; + } + + //Complete Activity State. Update the completed boolean on the dictionary + NSArray *completedTasks = [self completedScheduledTasksForDate:date]; + for (APCScheduledTask *scheduledTask in completedTasks) { + APCLogDebug(@"scheduled time for task: %@ is %@ and completed = %@", scheduledTask.task.taskID, date, scheduledTask.completed); + //get the existing time object for task + + NSMutableDictionary *taskTimes = [activitiesState objectForKey:scheduledTask.task.taskID] ?: [NSMutableDictionary new]; + if ([taskTimes objectForKey:scheduledTask.startOn]) { + [taskTimes setObject:@YES forKey:scheduledTask.startOn]; + } + + [activitiesState setValue:taskTimes forKey:scheduledTask.task.taskID]; + } + + return activitiesState; +} + +- (NSArray *)scheduledTimesForSchedule:(APCSchedule *)schedule forDate:(NSDate *)date +{ + + APCTopLevelScheduleEnumerator *enumerator = [schedule enumeratorFromDate: date.startOfDay + toDate: date.endOfDay]; + + NSMutableArray *appearanceDates = [NSMutableArray new]; + + for (NSDate *nextAppearance in enumerator) + { + if ([nextAppearance isLaterThanOrEqualToDate: schedule.effectiveStartDate.startOfDay] + && [nextAppearance isEarlierOrEqualToDate: schedule.effectiveEndDate.endOfDay]) + { + [appearanceDates addObject: nextAppearance]; + } + } + + return appearanceDates; +} + +- (NSArray *)activitiesSchedulesForDate: (NSDate *)date +{ + /* + get ALL of the schedules active on the date + endDate >= date.endOfDay //this value will often be null - need to programatically check results + effectiveEndDate >= date.endOfDay //this value will often be null - need to programatically check results + effectiveStartDate <= date + startsOn <= date + */ + + NSArray *dailySchedules = nil; + NSFetchRequest *request = [APCSchedule request]; + NSDate *startDate = date.startOfDay; + + NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(%K >= %@ OR %K == null) AND %K <= %@ AND %K <= %@", + NSStringFromSelector (@selector (effectiveEndDate)), date.endOfDay, + NSStringFromSelector (@selector (effectiveEndDate)), + NSStringFromSelector (@selector (effectiveStartDate)), startDate, + NSStringFromSelector (@selector (startsOn)), startDate + ]; + + request.predicate = predicate; + NSError *error = nil; + dailySchedules = [[APCAppDelegate sharedAppDelegate].dataSubstrate.mainContext executeFetchRequest:request error:&error]; + + return dailySchedules; +} + +- (NSArray *)completedScheduledTasksForDate: (NSDate *)date +{ + NSFetchRequest *request = [APCScheduledTask request]; + request.predicate = [NSPredicate predicateWithFormat:@"%K >= %@ AND %K <= %@ AND %K == %@", + NSStringFromSelector (@selector (startOn)), + date.startOfDay, + NSStringFromSelector (@selector (startOn)), + date.endOfDay, + NSStringFromSelector (@selector (completed)), + @YES]; + + NSError *error = nil; + NSArray *dailyScheduledTasks = [[APCAppDelegate sharedAppDelegate].dataSubstrate.mainContext executeFetchRequest:request error:&error]; + + return dailyScheduledTasks; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.h b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.h new file mode 100644 index 00000000..9c56df81 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.h @@ -0,0 +1,52 @@ +// +// APCScheduleDebugPrinter.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +/** + Utility class that lets us create printouts for Schedules + and Tasks in a consistent format across classes, so we + get consistent column spacing, date formatting (including + time zones), etc. + */ +@interface APCScheduleDebugPrinter : NSObject + +- (void) printArrayOfSchedules: (NSArray *) schedules + withLabel: (NSString *) label + intoMutableString: (NSMutableString *) printout; + ++ (NSString *) stringFromDate: (NSDate *) date; +- (NSString *) stringFromDate: (NSDate *) date; +- (NSString *) stringsFromArrayOfDates: (NSArray *) arrayOfDates; + +@end diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.m b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.m new file mode 100644 index 00000000..eb2a256b --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleDebugPrinter.m @@ -0,0 +1,269 @@ +// +// APCScheduleDebugPrinter.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCScheduleDebugPrinter.h" +#import "APCSchedule+AddOn.h" +#import "APCConstants.h" +#import "APCTask+AddOn.h" + +/** The date format we use when debug-printing the schedules. */ +static NSString * const kAPCDebugDateFormat = @"EEE yyyy-MM-dd HH:mm zzz"; + +/** A date formatter we use when debug-printing the schedules. */ +static NSDateFormatter *debugDateFormatter = nil; + +@implementation APCScheduleDebugPrinter + +/** + Set global, static values the first time anyone calls this class. + + By definition, this method is called once per class, in a thread-safe + way, the first time the class is sent a message -- basically, the first + time we refer to the class. That means we can use this to set up stuff + that applies to all objects (instances) of this class. + + Documentation: See +initialize in the NSObject Class Reference. Currently, that's here: + https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/clm/NSObject/initialize + */ ++ (void) initialize +{ + debugDateFormatter = [NSDateFormatter new]; + debugDateFormatter.dateFormat = kAPCDebugDateFormat; + debugDateFormatter.timeZone = [NSTimeZone localTimeZone]; +} + +- (void) printArrayOfSchedules: (NSArray *) schedules + withLabel: (NSString *) label + intoMutableString: (NSMutableString *) printout +{ + [printout appendFormat: @"%@ (%d schedule%@):\n", label, (int) schedules.count, schedules.count == 1 ? @"" : @"s"]; + + NSUInteger patternWidth = 0; + NSUInteger delayWidth = 0; + NSUInteger expirationWidth = 0; + NSUInteger sourceWidth = 0; + NSUInteger startDateWidth = 0; + NSUInteger endDateWidth = 0; + NSUInteger effectiveStartDateWidth = 0; + NSUInteger effectiveEndDateWidth = 0; + NSUInteger titleWidth = 0; + NSUInteger intervalWidth = 0; + NSUInteger timeListWidth = 0; + NSUInteger longestTitleIllPrint = 35; + NSUInteger taskIdWidth = 0; + NSUInteger oneTimeStringWidth = 0; + + if (schedules.count == 0) + { + [printout appendString: @"- (none)\n"]; + } + + else + { + for (APCSchedule *schedule in schedules) + { + NSString *source = [NSStringFromAPCScheduleSourceAsNumber (schedule.scheduleSource) substringFromIndex: @"APCScheduleSource".length]; + + /* + We don't seem to be able to get to Objective-C categories during + a database migration. These methods let us work around that. + */ + NSString *title = [self firstTaskTitleForSchedule: schedule]; + NSString *taskId = [self firstTaskIdForSchedule: schedule]; + NSString *isOneTimeScheduleString = [self isOneTimeScheduleStringForSchedule: schedule]; + + patternWidth = MAX (patternWidth, schedule.scheduleString.length); + delayWidth = MAX (delayWidth, schedule.delay.length); + expirationWidth = MAX (expirationWidth, schedule.expires.length); + sourceWidth = MAX (sourceWidth, source.length); + startDateWidth = MAX (startDateWidth, [self stringFromDate: schedule.startsOn].length); + endDateWidth = MAX (endDateWidth, [self stringFromDate: schedule.endsOn].length); + effectiveStartDateWidth = MAX (startDateWidth, [self stringFromDate: schedule.effectiveStartDate].length); + effectiveEndDateWidth = MAX (endDateWidth, [self stringFromDate: schedule.effectiveEndDate].length); + titleWidth = MAX (titleWidth, title.length); + intervalWidth = MAX (intervalWidth, schedule.interval.length); + timeListWidth = MAX (timeListWidth, schedule.timesOfDay.length); + taskIdWidth = MAX (taskIdWidth, taskId.length); + oneTimeStringWidth = MAX (oneTimeStringWidth, isOneTimeScheduleString.length); + } + + titleWidth = MIN (titleWidth, longestTitleIllPrint); + + for (APCSchedule *schedule in schedules) + { + NSString *source = [NSStringFromAPCScheduleSourceAsNumber (schedule.scheduleSource) substringFromIndex: @"APCScheduleSource".length]; + + /* + We don't seem to be able to get to Objective-C categories during + a database migration. These methods let us work around that. + */ + NSString *title = [self firstTaskTitleForSchedule: schedule]; + NSString *taskId = [self firstTaskIdForSchedule: schedule]; + NSString *isOneTimeScheduleString = [self isOneTimeScheduleStringForSchedule: schedule]; + + if (title.length > longestTitleIllPrint) + { + title = [NSString stringWithFormat: @"%@...", [title substringToIndex: longestTitleIllPrint - 3]]; + } + + [printout appendFormat: @"- %-*s | real: %-*s to %-*s | effective: %-*s to %-*s | once: %-*s | cron: %-*s | intvl: %-*s @ %-*s | delay: %-*s expire: %-*s | %-*s | %-*s\n", + (int) sourceWidth, [self safePrintableString: source], + (int) startDateWidth, [self safePrintableString: [self stringFromDate: schedule.startsOn]], + (int) endDateWidth, [self safePrintableString: [self stringFromDate: schedule.endsOn]], + (int) effectiveStartDateWidth, [self safePrintableString: [self stringFromDate: schedule.effectiveStartDate]], + (int) effectiveEndDateWidth, [self safePrintableString: [self stringFromDate: schedule.effectiveEndDate]], + (int) oneTimeStringWidth, [self safePrintableString: isOneTimeScheduleString], + (int) patternWidth, [self safePrintableString: schedule.scheduleString], + (int) intervalWidth, [self safePrintableString: schedule.interval], + (int) timeListWidth, [self safePrintableString: schedule.timesOfDay], + (int) delayWidth, [self safePrintableString: schedule.delay], + (int) expirationWidth, [self safePrintableString: schedule.expires], + (int) taskIdWidth, [self safePrintableString: taskId], + (int) titleWidth, [self safePrintableString: title] + ]; + } + } + + [printout appendString: @"\n"]; +} + + + +// --------------------------------------------------------- +#pragma mark - Handling the fact that Categories are missing during CoreData migration +// --------------------------------------------------------- + +/* + For some reason, I can't get to the APCSchedule+AddOn + category during a database migration. These methods let + us work around that fact. They depend on + + - [schedule respondsToSelector: @selector (firstTaskTitle)] + + because that's reliable symptom of the problem: during + migration, we can't get to that category method, but + during normal operation of the app, we can. + */ + +- (BOOL) weCanAccessCategoryMethodsForThisSchedule: (APCSchedule *) schedule +{ + BOOL result = [schedule respondsToSelector: @selector (firstTaskTitle)]; + return result; +} + +- (NSString *) firstTaskTitleForSchedule: (APCSchedule *) schedule +{ + NSString * result = ([self weCanAccessCategoryMethodsForThisSchedule: schedule] ? + [schedule firstTaskTitle] : + ((APCTask *) schedule.tasks.anyObject).taskTitle); + return result; +} + +- (NSString *) firstTaskIdForSchedule: (APCSchedule *) schedule +{ + NSString * result = ([self weCanAccessCategoryMethodsForThisSchedule: schedule] ? + [schedule firstTaskId] : + ((APCTask *) schedule.tasks.anyObject).taskID); + return result; +} + +- (NSString *) isOneTimeScheduleStringForSchedule: (APCSchedule *) schedule +{ + BOOL isOneTimeSchedule = ([self weCanAccessCategoryMethodsForThisSchedule: schedule] ? + schedule.isOneTimeSchedule : + [schedule.scheduleType isEqualToString: kAPCScheduleTypeValueOneTimeSchedule]); + + NSString *result = isOneTimeSchedule ? @"YES" : @"NO"; + return result; +} + + + +// --------------------------------------------------------- +#pragma mark - Utilities +// --------------------------------------------------------- + +- (NSString *) stringFromDate: (NSDate *) date +{ + return [[self class] stringFromDate: date]; +} + ++ (NSString *) stringFromDate: (NSDate *) date +{ + NSString *result = @"(null)"; + + if (date != nil) + { + result = [debugDateFormatter stringFromDate: date]; + } + + return result; +} + +- (NSString *) stringsFromArrayOfDates: (NSArray *) arrayOfDates +{ + NSMutableString *result = [NSMutableString new]; + + for (id maybeDate in arrayOfDates) + { + if (result.length > 0) + { + [result appendString: @" | "]; + } + + if ([maybeDate isKindOfClass: [NSDate class]]) + { + [result appendString: [debugDateFormatter stringFromDate: maybeDate]]; + } + else + { + [result appendString: [NSString stringWithFormat: @"%@", maybeDate]]; + } + } + + return result; +} + +- (const char *) safePrintableString: (NSString *) inputString +{ + NSString *result = @"---"; + + if (inputString.length) + { + result = inputString; + } + + return result.UTF8String; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.h b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.h new file mode 100644 index 00000000..33db8f48 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.h @@ -0,0 +1,50 @@ +// +// APCScheduleIntervalEnumerator.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import +@class APCSchedule; + +@interface APCScheduleIntervalEnumerator : NSEnumerator + +- (instancetype) initWithSchedule: (APCSchedule *) schedule + startDate: (NSDate *) startDate + endDate: (NSDate *) endDate; + +/** + Calls nextScheduledDate. We don't have to + declare this; I just wanted to make that fact explicit. + */ +- (NSDate *) nextObject; +- (NSDate *) nextScheduledDate; + +@end diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.m b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.m new file mode 100644 index 00000000..20875498 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduleIntervalEnumerator.m @@ -0,0 +1,270 @@ +// +// APCScheduleIntervalEnumerator.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCScheduleIntervalEnumerator.h" +#import "APCSchedule+AddOn.h" +#import "NSDate+Helper.h" + + +@interface APCScheduleIntervalEnumerator () +- (instancetype) init NS_DESIGNATED_INITIALIZER; +@property (readonly) BOOL hasTimesOfDay; +@property (readonly) BOOL hasEndDate; +@property (readonly) BOOL hasPassedEndDate; +@property (nonatomic, strong) APCSchedule *schedule; +@property (nonatomic, assign) BOOL hasBeenCalledOnce; +@property (nonatomic, strong) NSDate *startDate; +@property (nonatomic, strong) NSDate *endDate; +@property (nonatomic, strong) NSString *iso8601TimeInterval; +@property (nonatomic, strong) NSString *timesOfDayOriginalString; +@property (nonatomic, strong) NSArray *timesOfDayInSeconds; +@property (nonatomic, assign) NSInteger previousTimeOfDayIndex; +@property (nonatomic, strong) NSDate *previousEnumeratedDate; +@end + +@implementation APCScheduleIntervalEnumerator + +- (instancetype) init +{ + self = [super init]; + + if (self) + { + _schedule = nil; + _startDate = nil; + _endDate = nil; + _iso8601TimeInterval = nil; + _timesOfDayOriginalString = nil; + _timesOfDayInSeconds = nil; + _hasBeenCalledOnce = NO; + _previousEnumeratedDate = nil; + _previousTimeOfDayIndex = 0; + } + + return self; +} + +- (instancetype) initWithSchedule: (APCSchedule *) schedule + startDate: (NSDate *) startDate + endDate: (NSDate *) endDate +{ + self = [self init]; + + if (self) + { + _schedule = schedule; + _iso8601TimeInterval = schedule.interval; + _startDate = startDate; + _endDate = endDate; + _timesOfDayOriginalString = schedule.timesOfDay; + _timesOfDayInSeconds = [self deserializedArrayOfDurationsSinceMidnightFromISO8601TimesOfDayString: _timesOfDayOriginalString]; + } + + return self; +} + +- (BOOL) hasTimesOfDay +{ + return self.timesOfDayInSeconds.count > 0; +} + +- (BOOL) hasEndDate +{ + return self.endDate != nil; +} + +- (BOOL) hasPassedEndDate +{ + BOOL result = (self.previousEnumeratedDate != nil && + self.endDate != nil && + [self.previousEnumeratedDate isLaterThanDate: self.endDate] ); + + return result; +} + +- (NSDate *) nextObject +{ + NSDate *result = [self nextScheduledDate]; + + return result; +} + +- (NSDate *) nextScheduledDate +{ + NSDate *computedDate = nil; + NSUInteger computedIndexOfTimeOfDay = 0; + NSNumber *selectedTimeAsNumber = nil; + NSTimeInterval selectedTime = 0; + + if (self.hasPassedEndDate) + { + computedDate = nil; + } + + else if (self.hasBeenCalledOnce == NO) + { + computedDate = self.startDate.startOfDay; + self.previousEnumeratedDate = computedDate; + + if (self.hasTimesOfDay == NO) + { + // Done with this computation. + } + else + { + computedIndexOfTimeOfDay = 0; + self.previousTimeOfDayIndex = computedIndexOfTimeOfDay; + + selectedTimeAsNumber = self.timesOfDayInSeconds [computedIndexOfTimeOfDay]; + selectedTime = selectedTimeAsNumber.integerValue; + computedDate = [computedDate dateByAddingTimeInterval: selectedTime]; + } + + self.hasBeenCalledOnce = YES; + } + + else + { + if (self.hasTimesOfDay == NO) + { + computedDate = [self.previousEnumeratedDate dateByAddingISO8601Duration: self.iso8601TimeInterval]; + self.previousEnumeratedDate = computedDate; + } + else + { + computedIndexOfTimeOfDay = self.previousTimeOfDayIndex; + + if (computedIndexOfTimeOfDay < self.timesOfDayInSeconds.count - 1) + { + computedIndexOfTimeOfDay ++; + self.previousTimeOfDayIndex = computedIndexOfTimeOfDay; + + selectedTimeAsNumber = self.timesOfDayInSeconds [computedIndexOfTimeOfDay]; + selectedTime = selectedTimeAsNumber.integerValue; + + computedDate = self.previousEnumeratedDate; + computedDate = [computedDate dateByAddingTimeInterval: selectedTime]; + } + else + { + computedDate = [self.previousEnumeratedDate dateByAddingISO8601Duration: self.iso8601TimeInterval]; + self.previousEnumeratedDate = computedDate; + + computedIndexOfTimeOfDay = 0; + self.previousTimeOfDayIndex = computedIndexOfTimeOfDay; + + selectedTimeAsNumber = self.timesOfDayInSeconds [computedIndexOfTimeOfDay]; + selectedTime = selectedTimeAsNumber.integerValue; + + computedDate = [computedDate dateByAddingTimeInterval: selectedTime]; + } + } + } + + // See if the calculations we just did pushed us past the end date. + if (self.hasPassedEndDate) + { + computedDate = nil; + } + + return computedDate; +} + +- (NSArray *) deserializedArrayOfDurationsSinceMidnightFromISO8601TimesOfDayString: (NSString *) serializedTimesOfDayString +{ + NSMutableArray *result = nil; + + if (serializedTimesOfDayString.length > 0) + { + NSDateFormatter *formatter = [NSDateFormatter new]; + formatter.locale = [NSLocale localeWithLocaleIdentifier: @"en_US_POSIX"]; + + NSArray *legalFormats = @[@"H", + @"HH", + @"HH:mm", + @"HH:mm:SS", + @"HH:mm:SS.sss" + ]; + + result = [NSMutableArray new]; + + NSArray *iso8601TimeStrings = [serializedTimesOfDayString componentsSeparatedByString: @"|"]; + + for (NSString *iso8601TimeString in iso8601TimeStrings) + { + NSDate *date = nil; + + for (NSString *format in legalFormats) + { + formatter.dateFormat = format; + date = [formatter dateFromString: iso8601TimeString]; + + if (date != nil) + { + break; + } + } + + if (date != nil) + { + NSDate *midnightOnThatDate = date.startOfDay; + NSTimeInterval secondsSinceMidnight = [date timeIntervalSinceDate: midnightOnThatDate]; + [result addObject: @(secondsSinceMidnight)]; + } + } + } + + if (result.count == 0) + { + result = nil; + } + + else + { + // The result array is a bunch of NSNumbers. + // Sort them from midnight-before to midnight-after + // using the -[NSNumber compare:]. + [result sortUsingSelector: @selector (compare:)]; + } + + return result; +} + +@end + + + + + + + diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.h b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.h index 02552229..97f695f3 100644 --- a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.h +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.h @@ -33,11 +33,14 @@ #import #import +#import "APCConstants.h" @class APCDataSubstrate; @class APCSchedule; @class APCDateRange; @class APCTask; +@class APCScheduledTask; +@class APCPotentialTask; typedef NS_ENUM(NSUInteger, APCSchedulerDateRange) { kAPCSchedulerDateRangeYesterday, @@ -45,18 +48,134 @@ typedef NS_ENUM(NSUInteger, APCSchedulerDateRange) { kAPCSchedulerDateRangeTomorrow }; +typedef enum : NSUInteger { + APCDateGroupInstants, + APCDateGroupHours, + APCDateGroupDays, +} APCDateGroup; + + +typedef void (^APCSchedulerCallbackForTaskGroupQueries) (NSDictionary *taskGroups, NSError *queryError); +typedef void (^APCSchedulerCallbackForFetchAndLoadOperations) (NSError *errorFetchingOrLoading); +typedef void (^APCSchedulerCallbackForFetchingCount) (NSUInteger count, NSError *errorFetchingOrLoading); + + +/** + Manages tasks and schedules. + + Specifically, manages the processes of downloading + tasks and schedules, merging them with existing ones, + figuring out which ones are "active" or "current," + figuring out which to display on a given day in + the future or past. Maintains a cache of the query + results for each type of query, because each query + is actually time-consuming: we not only pull + stuff from CoreData, but do a fair amount of math + to figure out how to project schedules onto a + human calendar. + + Please note. As of this writing, this class contains + a bunch of code that should be distributed across + other classes. It was easier to develop the logic + for all those pieces if I could physically see them on + one screen. Having done that, we should be able to + fairly easily redistribute the pieces to other, + appropriate classes. Before this, all these pieces + had evolved in place, and it showed. + */ @interface APCScheduler : NSObject - (instancetype) initWithDataSubstrate: (APCDataSubstrate*) dataSubstrate; -- (void)updateScheduledTasksIfNotUpdating: (BOOL) today; -- (void)updateScheduledTasksIfNotUpdatingWithRange: (APCSchedulerDateRange) range; -- (void) updateScheduledTasksForSchedule: (APCSchedule*) schedule; - @property (nonatomic, strong) APCDateRange * referenceRange; -- (void) findOrCreateOneTimeScheduledTask:(APCSchedule *) schedule task: (APCTask*) task andStartDateReference: (NSDate *)startOn; + ++ (APCScheduler *) defaultScheduler; + +/* + This is not as generic as it looks: it groups the tasks + for each day into specific subtypes, and within a given day, + does not sort (or group) by date. If needed, we'll add such + overrides later. + */ +- (void) fetchTaskGroupsFromDate: (NSDate *) startDate + toDate: (NSDate *) endDate + usingQueue: (NSOperationQueue *) queue + toReportResults: (APCSchedulerCallbackForTaskGroupQueries) callbackBlock; + +- (void) fetchTaskGroupsFromDate: (NSDate *) startDate + toDate: (NSDate *) endDate + forTasksMatchingFilter: (NSPredicate *) taskFilter + usingQueue: (NSOperationQueue *) queue + toReportResults: (APCSchedulerCallbackForTaskGroupQueries) callbackBlock; + + +/** Exposes an internal property. Not at all sure I should. */ +- (NSManagedObjectContext *) managedObjectContext; + +- (void) fetchTasksAndSchedulesFromServerAndThenUseThisQueue: (NSOperationQueue *) queue + toDoThisWhenDone: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock; + +- (void) loadTasksAndSchedulesFromDiskAndThenUseThisQueue: (NSOperationQueue *) queue + toDoThisWhenDone: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock; + +- (void) importScheduleFromDictionary: (NSDictionary *) scheduleContainingTasks + assigningSource: (APCScheduleSource) scheduleSource + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThisWhenDone: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock; + +- (APCScheduledTask *) createScheduledTaskFromPotentialTask: (APCPotentialTask *) potentialTask; + +/** + Used, for example, when deleting a task that the user cancelled. + In the new version of the world, we only save ScheduledTasks when + the user actually does something with them. Ideally, we wouldn't + even create them until the user did something permanent-ish. + */ +- (void) deleteScheduledTask: (APCScheduledTask *) scheduledTask; + +/** + Used for debugging and testing. Inside this class, everything that + wants to access the system date uses this property. This allows you + to create schedules as if they had arrived at a specific date in the + future or the past, and then change your view independently. + + Call -clearFakeSystemDate to make it use the actual system date + (or set this property to nil). + + In a release build, this feature is disabled, and always returns + the system date. + */ +@property (nonatomic, strong) NSDate *fakeSystemDate; + +/** + Sets the -fakeSystemDate property to nil, making the scheduler + use the underlying system date for all calculations. See + -fakeSystemDate for more information. + */ +- (void) clearFakeSystemDate; @end + + + + + + + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.m b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.m index a4881aeb..bceb878b 100644 --- a/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.m +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCScheduler.m @@ -2,440 +2,3171 @@ // APCScheduler.m // APCAppCore // -// Copyright (c) 2015, Apple Inc. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder(s) nor the names of any contributors -// may be used to endorse or promote products derived from this software without -// specific prior written permission. No license is granted to the trademarks of -// the copyright holders even if such marks are included in this software. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// #import "APCScheduler.h" -#import "APCAppCore.h" + +#import "APCAppDelegate.h" +#import "APCDataSubstrate.h" #import "APCDateRange.h" +#import "APCGenericSurveyTaskViewController.h" +#import "APCPotentialScheduledTask.h" +#import "APCSchedule+AddOn.h" +#import "APCScheduleDebugPrinter.h" +#import "APCTask+AddOn.h" +#import "APCTaskGroup.h" +#import "APCTaskGroupCacheEntry.h" +#import "APCTopLevelScheduleEnumerator.h" +#import "APCUser.h" +#import "APCUtilities.h" +#import "NSArray+APCHelper.h" +#import "NSDate+Helper.h" +#import "NSDictionary+APCAdditions.h" +#import "NSOperationQueue+Helper.h" +#import "SBBSchedule+APCHelper.h" -static NSString * const kOneTimeSchedule = @"once"; -@interface APCScheduler() -@property (weak, nonatomic) APCDataSubstrate *dataSubstrate; -@property (strong, nonatomic) NSManagedObjectContext *scheduleMOC; -@property (nonatomic) BOOL isUpdating; +/** + Controls whether we compute and show (very) detailed debugging + printouts. This will always be NO in a release build. + */ +static BOOL const kAPCShowDebugPrintouts = YES; + +/** If we import multiple tasks with an ID of "null," + this value will appear in the list of duplicate IDs. */ +static NSString * const kAPCNullTaskIdString = @"(this task ID was null)"; + + +/** + Location of the static tasks-and-schedules file on disk, + and dictionary keys in that file. + */ +static NSString * const kAPCStaticJSONTasksAndSchedulesFileName = @"APHTasksAndSchedules.json"; +static NSString * const kAPCStaticJSONTasksAndSchedulesSchedulesKey = @"schedules"; +static NSString * const kAPCStaticJSONTasksAndSchedulesTasksKey = @"tasks"; // Deprecated. + + +/** + Error codes and messages generated by this class. + Please alphabetize. + */ +typedef enum : NSUInteger { + APCErrorCouldntFetchActiveSchedulesForDateCode, + APCErrorCouldntFetchVisibleSchedulesForDateCode, + APCErrorCouldntFindSurveyFileCode, + APCErrorDeletingTaskCode, + APCErrorInboundListOfSchedulesAndTasksIssuesCode, + APCErrorJSONTasksAndScheduleIsNotAnArrayCode, + APCErrorJSONTasksAndSchedulesIsEmptyCode, + APCErrorJSONTasksAndSchedulesNilValueForKeyCode, + APCErrorLoadingJsonFromDiskCode, + APCErrorLoadingJsonNoDictionaryCode, + APCErrorLoadingNativeBridgeSurveyObjectCode, + APCErrorLoadingSurveyFileCode, + APCErrorMoreThanOneScheduleWithSameTaskIDCode, + APCErrorMoreThanOneTaskWithIdAndVersionCode, + APCErrorParsingSurveyContentCode, + APCErrorSavingEverythingCode, + APCErrorSavingToPeristentStoreCode, + APCErrorSearchingForTaskWithIDCode, + APCErrorServerDisabledCode, + APCErrorTooManyTasksWithSameIDCode +} APCError; + +static NSString * const APCErrorDomainLoadingTasksAndSchedules = @"kAPCErrorDomainLoadingTasksAndSchedules"; + +static NSString * const APCErrorCouldntFetchActiveSchedulesForDateReason = @"Couldn't fetch active schedules for given date"; +static NSString * const APCErrorCouldntFetchActiveSchedulesForDateSuggestion = @"There was an error executing a fetch request for active APCSchedules with this date."; +static NSString * const APCErrorCouldntFetchVisibleSchedulesForDateReason = @"Couldn't fetch visible schedules for given date"; +static NSString * const APCErrorCouldntFetchVisibleSchedulesForDateSuggestion = @"There was an error executing a fetch request for visible APCSchedules with this date."; +static NSString * const APCErrorCouldntFindSurveyFileReason = @"Can't Find Survey File"; +static NSString * const APCErrorCouldntFindSurveyFileSuggestion = @"We couldn't find the specified survey file on the phone. Did you misspell the filename, perhaps?"; +static NSString * const APCErrorDeletingTaskReason = @"Error attempting to delete task."; +static NSString * const APCErrorDeletingTaskSuggestion = @"Error attempting to delete task. This may give the user unexpected results."; +static NSString * const APCErrorInboundListOfSchedulesAndTasksIssuesReason = @"Inbound list of schedules and task have issues"; +static NSString * const APCErrorInboundListOfSchedulesAndTasksIssuesSuggestion = @"Inbound list of schedules and task ID's or versions conflict."; +static NSString * const APCErrorJSONTasksAndScheduleIsNotAnArrayReason = @"The JSON tasks and schedules key is returning an incorrect type"; +static NSString * const APCErrorJSONTasksAndScheduleIsNotAnArraySuggestion = @"The expected type from the JSON tasks and schedules key is an array."; +static NSString * const APCErrorJSONTasksAndSchedulesIsEmptyReason = @"The JSON tasks and schedules key is returning an empty array"; +static NSString * const APCErrorJSONTasksAndSchedulesIsEmptySuggestion = @"The JSON tasks and schedules may be incomplete because the array count is zero."; +static NSString * const APCErrorJSONTasksAndSchedulesNilValueForKeyReason = @"The JSON tasks and schedules key returns nil"; +static NSString * const APCErrorJSONTasksAndSchedulesNilValueForKeySuggestion = @"The JSON tasks and schedules key returns nil. The key may be incorrect or the file is empty."; +static NSString * const APCErrorLoadingJsonFromDiskReason = @"Can't Open JSON File"; +static NSString * const APCErrorLoadingJsonFromDiskSuggestion = @"We were unable to open the specified file as JSON."; +static NSString * const APCErrorLoadingJsonNoDictionaryReason = @"Can't Understand JSON File"; +static NSString * const APCErrorLoadingJsonNoDictionarySuggestion = @"We were unable to find a dictionary at the top level of the JSON file at the specified path."; +static NSString * const APCErrorLoadingNativeBridgeSurveyObjectReason = @"Can't Find Survey File"; +static NSString * const APCErrorLoadingNativeBridgeSurveyObjectSuggestion = @"We couldn't find the specified survey file on the phone. Did you misspell the filename, perhaps?"; +static NSString * const APCErrorLoadingSurveyFileReason = @"There was an error serializing the contents of a survey file"; +static NSString * const APCErrorLoadingSurveyFileSuggestion = @"There was an error serializing the contents of a survey file. "; +static NSString * const APCErrorMoreThanOneScheduleWithSameTaskIDReason = @"More than one schedule with this ID"; +static NSString * const APCErrorMoreThanOneScheduleWithSameTaskIDSuggestion = @"We found more than one schedule managing a task with this ID. This will give the user unexpected results."; +static NSString * const APCErrorMoreThanOneTaskWithIdAndVersionReason = @"More than one task with this ID"; +static NSString * const APCErrorMoreThanOneTaskWithIdAndVersionSuggestion = @"We found more than one task with the specified ID, and we're not sure how to choose just one."; +static NSString * const APCErrorParsingSurveyContentReason = @"There was an error parsing the contents of a survey file"; +static NSString * const APCErrorParsingSurveyContentSuggestion = @"There was an error parsing the contents of a survey file."; +static NSString * const APCErrorSavingEverythingReason = @"Error Saving New Schedules"; +static NSString * const APCErrorSavingEverythingSuggestion = @"There was an error attempting to save the new schedules."; +static NSString * const APCErrorSavingToPeristentStoreReason = @"Error attempting to save new APCScheduledTask"; +static NSString * const APCErrorSavingToPeristentStoreSuggestion = @"Error attempting to save new APCScheduledTask. This may give the user unexpected results."; +static NSString * const APCErrorSearchingForTaskWithIDReason = @"Couldn't fetch APCTask with ID"; +static NSString * const APCErrorSearchingForTasksWithIDSuggestion = @"There was an error executing a fetch request for APCTasks with ID."; +static NSString * const APCErrorServerDisabledReason = @"Server disabled"; +static NSString * const APCErrorServerDisabledSuggestion = @"The server is disabled."; +static NSString * const APCErrorTooManyTasksWithSameIDReason = @"More than one task with this ID"; +static NSString * const APCErrorTooManyTasksWithSameIDSuggestion = @"We found more than one task with this ID. This will give the user unexpected results."; + +/** + Keys in the user-info dictionary for our custom NSErrors. + */ +static NSString * const kAPCErrorUserInfoKeyListOfDuplicatedTaskIDs = @"ListOfDuplicatedTaskIDs"; -@property (nonatomic, strong) NSDateFormatter * dateFormatter; -//Properties that need to be cleaned after every upate -@property (nonatomic, strong) NSMutableArray * allScheduledTasksForReferenceDate; -@property (nonatomic, strong) NSMutableArray * validatedScheduledTasksForReferenceDate; +/** + Keys and special values in the JSON dictionaries representing + tasks and schedules. Please alphabetize. + */ +static NSString * const kScheduleDelayKey = @"delay"; +static NSString * const kScheduleEndDateKey = @"endOn"; +static NSString * const kScheduleExpiresKey = @"expires"; +static NSString * const kScheduleIDValueLocallyGeneratedPrefix = @"autogenerated"; +static NSString * const kScheduleIntervalKey = @"interval"; +static NSString * const kScheduleListOfTasksKey = @"tasks"; +static NSString * const kScheduleMaxCountKey = @"maxCount"; +static NSString * const kScheduleNotesKey = @"notes"; +static NSString * const kScheduleReminderMessageKey = @"reminderMessage"; +static NSString * const kScheduleReminderOffsetKey = @"reminderOffset"; +static NSString * const kScheduleShouldRemindKey = @"shouldRemind"; +static NSString * const kScheduleStartDateKey = @"startOn"; +static NSString * const kScheduleStringKey = @"scheduleString"; +static NSString * const kScheduleTimesOfDayKey = @"times"; +static NSString * const kScheduleTypeKey = @"scheduleType"; +static NSString * const kScheduleTypeValueOnce = @"once"; +static NSString * const kTaskClassNameKey = @"taskClassName"; +static NSString * const kTaskCompletionTimeStringKey = @"taskCompletionTimeString"; +static NSString * const kTaskFileNameKey = @"taskFileName"; +static NSString * const kTaskIDKey = @"taskID"; +static NSString * const kTaskIsOptionalKey = @"optional"; +static NSString * const kTaskSortStringKey = @"sortString"; +static NSString * const kTaskTitleKey = @"taskTitle"; +static NSString * const kTaskTypeKey = @"taskType"; +static NSString * const kTaskTypeValueSurvey = @"survey"; +static NSString * const kTaskUrlKey = @"taskUrl"; +static NSString * const kTaskVersionNumberKey = @"version"; + +/** + The name of the queue where this class does all (or most) of its work -- + at least, its version-2 work, where we're consolidating all task-and-schedule + math into this file from around the application suite. + */ +static NSString * const kQueueName = @"APCScheduler CoreData query queue"; + + +@interface APCScheduler() +@property (nonatomic, weak) APCDataSubstrate *dataSubstrate; +@property (nonatomic, strong) NSManagedObjectContext *scheduleMOC; +@property (nonatomic, strong) NSOperationQueue *queryQueue; +@property (nonatomic, assign) BOOL isUpdating; +@property (nonatomic, strong) NSDateFormatter *dateFormatter; +@property (nonatomic, strong) NSMutableArray *taskGroupCache; +@property (nonatomic, strong) NSObject *taskGroupCacheMutex; +@property (readonly) APCAppDelegate *appDelegate; +@property (readonly) NSDate *systemDate; // See -systemDate, below, for documentation. @end @implementation APCScheduler -- (NSDateFormatter *)dateFormatter { - if (_dateFormatter == nil) { - _dateFormatter = [NSDateFormatter new]; - [_dateFormatter setDateStyle:NSDateFormatterMediumStyle]; - [_dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; - } - return _dateFormatter; + + +// ========================================================= +#pragma mark - I. SETUP - +// ========================================================= + ++ (APCScheduler *) defaultScheduler +{ + APCAppDelegate *app = [APCAppDelegate sharedAppDelegate]; + APCScheduler *scheduler = app.scheduler; + return scheduler; } -- (instancetype)initWithDataSubstrate: (APCDataSubstrate*) dataSubstrate +- (instancetype) initWithDataSubstrate: (APCDataSubstrate *) dataSubstrate { self = [super init]; - if (self) { - self.dataSubstrate = dataSubstrate; - self.scheduleMOC = self.dataSubstrate.persistentContext; + + if (self) + { + _dataSubstrate = dataSubstrate; + _scheduleMOC = _dataSubstrate.persistentContext; + _queryQueue = [NSOperationQueue sequentialOperationQueueWithName: kQueueName]; + _isUpdating = NO; + _dateFormatter = [NSDateFormatter new]; + _dateFormatter.dateStyle = NSDateFormatterMediumStyle; + _dateFormatter.timeStyle = NSDateFormatterMediumStyle; + _fakeSystemDate = nil; + _taskGroupCache = [NSMutableArray new]; + _taskGroupCacheMutex = [NSObject new]; } + return self; } -- (void)updateScheduledTasksIfNotUpdating: (BOOL) today -{ - [self updateScheduledTasksIfNotUpdatingWithRange:today? kAPCSchedulerDateRangeToday : kAPCSchedulerDateRangeTomorrow]; -} --(void)updateScheduledTasksIfNotUpdatingWithRange:(APCSchedulerDateRange)range + +// ========================================================= +#pragma mark - II. QUERYING - +// ========================================================= + + + +// --------------------------------------------------------- +#pragma mark - Fetching tasks for all days in a range +// --------------------------------------------------------- + +- (void) fetchTaskGroupsFromDate: (NSDate *) startDate + toDate: (NSDate *) endDate + usingQueue: (NSOperationQueue *) queue + toReportResults: (APCSchedulerCallbackForTaskGroupQueries) callbackBlock { - if (!self.isUpdating) { - self.isUpdating = YES; - switch (range) { - case kAPCSchedulerDateRangeYesterday: - self.referenceRange = [APCDateRange yesterdayRange]; - break; - case kAPCSchedulerDateRangeToday: - self.referenceRange = [APCDateRange todayRange]; - break; - - case kAPCSchedulerDateRangeTomorrow: - self.referenceRange = [APCDateRange tomorrowRange]; - break; - } - [self updateScheduledTasks]; - } + [self fetchTaskGroupsFromDate: startDate + toDate: endDate + forTasksMatchingFilter: nil + usingQueue: queue + toReportResults: callbackBlock]; } -- (void) updateScheduledTasks +- (void) fetchTaskGroupsFromDate: (NSDate *) startDate + toDate: (NSDate *) endDate + forTasksMatchingFilter: (NSPredicate *) taskFilter + usingQueue: (NSOperationQueue *) queue + toReportResults: (APCSchedulerCallbackForTaskGroupQueries) callbackBlock { - [self.scheduleMOC performBlockAndWait:^{ - - //STEP 1: Update inActive property of schedules based on endOn date. - [self updateSchedulesAsInactiveIfNecessary]; - - //STEP 2: Disable one time tasks if they are already completed - [self disableOneTimeTasksIfAlreadyCompleted]; - - //STEP 3: Get all the current scheduled tasks relevant to reference daterange - [self filterAllScheduledTasksInReferenceDate]; - - //STEP 4: Update scheduled tasks - [self updateScheduledTasksBasedOnActiveSchedules]; - - //STEP 5: Validate all completed tasks - [self validateAllCompletedTasks]; - - //STEP 6: Delete non-validated schedules - [self deleteAllNonvalidatedScheduledTasks]; - - //STEP 7: Issue notifications that we've completed a survey - [[NSNotificationCenter defaultCenter]postNotificationName:APCUpdateTasksReminderNotification object:nil]; - - self.isUpdating = NO; - APCLogEventWithData(kSchedulerEvent, (@{@"event_detail":[NSString stringWithFormat:@"Updated Schedule For %@", self.referenceRange.startDate]})); - }]; -} + [self.queryQueue addOperationWithBlock: ^{ -/*********************************************************************************/ -#pragma mark - Methods Inside MOC -/*********************************************************************************/ -- (void) updateSchedulesAsInactiveIfNecessary -{ - NSFetchRequest * request = [APCSchedule request]; - NSDate * lastEndOnDate = [NSDate yesterdayAtMidnight]; - NSDate * earliestStartOnDate = [NSDate endOfDay:[NSDate tomorrowAtMidnight]]; - request.predicate = [NSPredicate predicateWithFormat:@"(endsOn <= %@) || (startsOn > %@)", lastEndOnDate, earliestStartOnDate]; - NSError * error; - NSArray * array = [self.scheduleMOC executeFetchRequest:request error:&error]; - APCLogError2 (error); - [array enumerateObjectsUsingBlock:^(APCSchedule * schedule, NSUInteger __unused idx, BOOL * __unused stop) { - schedule.inActive = @(YES); - NSError * saveError; - [schedule saveToPersistentStore:&saveError]; - APCLogError2 (saveError); - }]; -} + NSMutableDictionary *results = [NSMutableDictionary new]; + NSDate *dayAfterEndDate = endDate.dayAfter.startOfDay; + NSDate *date = startDate.startOfDay; -- (void) disableOneTimeTasksIfAlreadyCompleted -{ - //List remoteupdatable, one time tasks - NSFetchRequest * request = [APCSchedule request]; - request.predicate = [NSPredicate predicateWithFormat:@"remoteUpdatable == %@ && scheduleType == %@", @(YES), kOneTimeSchedule]; - NSError * error; - NSArray * scheduleArray = [self.scheduleMOC executeFetchRequest:request error:&error]; - APCLogError2 (error); - - //Get completed scheduled tasks with that one time task. If they exist make the schedule inactive - [scheduleArray enumerateObjectsUsingBlock:^(APCSchedule * obj, NSUInteger __unused idx, BOOL * __unused stop) { - NSFetchRequest * request = [APCScheduledTask request]; - request.predicate = [NSPredicate predicateWithFormat:@"completed == %@ && task.taskID == %@", @(YES), obj.taskID]; - NSError * error; - NSArray * scheduledTaskArray = [self.scheduleMOC executeFetchRequest:request error:&error]; - if (scheduledTaskArray.count > 0) { obj.inActive = @(YES);} - APCLogError2 (error); - }]; - - APCSchedule * lastSchedule = [scheduleArray lastObject]; - NSError * saveError; - [lastSchedule saveToPersistentStore:&saveError]; - APCLogError2 (saveError); -} - -- (void) filterAllScheduledTasksInReferenceDate { - NSFetchRequest * request = [APCScheduledTask request]; - NSDate * startOfDay = [NSDate startOfDay:self.referenceRange.startDate]; - request.predicate = [NSPredicate predicateWithFormat:@"endOn > %@", startOfDay]; - NSError * error; - NSArray * array = [self.scheduleMOC executeFetchRequest:request error:&error]; - APCLogError2 (error); - NSMutableArray * filteredArray = [NSMutableArray array]; - - for (APCScheduledTask * scheduledTask in array) { - if ([scheduledTask.dateRange compare:self.referenceRange] != kAPCDateRangeComparisonOutOfRange) { - [filteredArray addObject:scheduledTask]; + for (date = startDate.startOfDay; [date isEarlierThanDate: dayAfterEndDate]; date = [date dateByAddingDays: 1]) + { + NSArray *taskGroups = [self taskGroupsForDayOfDate: date + forTasksMatchingFilter: taskFilter]; + + if (taskGroups.count > 0) { + results [date] = taskGroups; + } } - } - self.allScheduledTasksForReferenceDate = filteredArray; -} -- (void) updateScheduledTasksBasedOnActiveSchedules -{ - NSArray * activeSchedules = [self readActiveSchedules]; - [activeSchedules enumerateObjectsUsingBlock:^(APCSchedule * schedule, NSUInteger __unused idx, BOOL * __unused stop) { - [self updateScheduledTasksForSchedule:schedule]; + if (queue != nil && callbackBlock != nil) + { + [queue addOperationWithBlock:^{ + callbackBlock (results, nil); + }]; + } }]; } -- (NSArray*) readActiveSchedules +/** + We're having a real performance problem: we're spending + many literal seconds in this method, at various times + throughout the app's lifetime. Among other things, this + is hanging the UI, but it also spends lots of time on + background threads. + + The catch: we're almost always querying for the same + stuff. + + The solution: we'll cache the taskGroups for a given start + date, end date, and predicate, and clear the cache when we + get new schedules. + + The caching mechanism is thread-safe. + */ +- (NSArray *) taskGroupsForDayOfDate: (NSDate *) date + forTasksMatchingFilter: (NSPredicate *) taskFilter { - NSFetchRequest * request = [APCSchedule request]; - NSDate * lastStartOnDate = [NSDate startOfTomorrow:self.referenceRange.startDate]; - request.predicate = [NSPredicate predicateWithFormat:@"(inActive == nil || inActive == %@) && (startsOn == nil || startsOn < %@)", @(NO), lastStartOnDate]; - NSError * error; - NSArray * array = [self.scheduleMOC executeFetchRequest:request error:&error]; - APCLogError2 (error); - return array.count ? array : nil; -} + NSArray *taskGroupsToReport = nil; --(NSArray *) allScheduledTasks{ - __block NSArray * scheduledTaskArray; - NSFetchRequest * request = [APCScheduledTask request]; - [request setShouldRefreshRefetchedObjects:YES]; - NSError * error; - scheduledTaskArray = [self.scheduleMOC executeFetchRequest:request error:&error]; - if (scheduledTaskArray.count == 0) { - APCLogError2 (error); + NSArray *cachedTaskGroups = [self cachedTaskGroupsForDayOfDate: date + forTasksMatchingFilter: taskFilter]; + + if (cachedTaskGroups) + { + taskGroupsToReport = cachedTaskGroups; + } + + else + { + taskGroupsToReport = [self uncachedTaskGroupsForDayOfDate: date + forTasksMatchingFilter: taskFilter]; + + + /* + Lastly: cache these results, because of the performance problem + mentioned at the top of this method. + + Note that another thread might have come through here and + cache this same list of stuff while we were working. That's + fine. The cachcing mechanism is thread-safe, and stores the + first set of results matching this date range and filter, so + even if a bunch of threads try to do this simultaneously, + only one will win, and every subsequent request will use + that cached value. + */ + [self cacheTaskGroups: taskGroupsToReport + forDate: date + andFilter: taskFilter]; } - return scheduledTaskArray; + return taskGroupsToReport; } +/** + Retrieves all tasks scheduled for the specified day, + whether completed, not-yet-completed, missed, or any other + status. "The specified day" means, specifically, + midnight to midnight on that date in the user's time zone. + + This method does not manage any threading: it expects + to be called from a background thread -- in particular, + a private queue managed by self. However, it works fine + if called from the main thread, or any other thread. -- (void) updateScheduledTasksForSchedule: (APCSchedule*) schedule + The query turns out to be a little tricky, because of how + we want to think about dates. We want schedules that are + "active on this day." That means we want schedules whose + start date is earlier than midnight on the specified date, + and whose end date is later than midnight on that date. + + Here's the pseudocode. The leading "."s are to preserve + the indentation. + + . - theSpecifiedDate = the date passed to this method. + . + . - get schedules active between morning-midnight and + . evening-midnight on theSpecifiedDate. This may be + . a long list, including schedules that start today, + . schedules that end today, and schedules with either + . of those values set to nil. + . + . - for each of those schedules: + . + . - get the times of day the schedule wants to + . appear on this date. + . + . - if none (if the schedule doesn't want to appear + . today): + . + . - get the times of day the schedule wants to + . appear on the next closest previous day for + . that schedule. Example: if the schedule + . says "every monday and wednesday at noon + . and 3pm," and today is Tuesday, we'll get + . "noon and 3pm" for Monday. + . + . - if we got anything: remove dates and times + . that specify an expired task (its grace period + . has run over). We'll keep + . this list of times if either (a) the + . schedule's expiration period is nil, or + . (b) if the expiration period + those dates + . means tasks with those dates will + . last through theScheduledDate. + . + . - now we have a list of times of day that tasks + . should happen, either on theSpecifiedDate or + . the next-closest previous date specified by + . this schedule. + . + . - if the list is non-empty: + . + . - for each task managed by this schedule: + . create a TaskGroup containing all the + . related objects. Specifically: + . + . - for each of the found time slots: + . + . - gather any completed items for this + . time slot (should be at most one, + . but we'll take 'em all just in case) + . + . - if no completed items for this time + . slot, create a Potential item for + . this slot + . + . - gather any completed gratuitious items + . for the scheduled date of the times in + . this list + . + . - create a sample Potential gratuitous + . item for that scheduled date + . + . - package all that up into a TaskGroup, + . and add it to the list of results. + . + . - but wait! if the task has been "fully + . completed," and the current system date + . is later than the date on which it + . reached Fully Completed status, we have + . to remove the taskGroup from the list. + . This real-life situation is: you keep a + . reminder on your fridge until you've + . remembered to do that thing; then you + . take it off the fridge. The catch is: + . we're creating the ability for user to + . scroll backward or forward in time and + . see what sticky notes *were* or *should + . be* on the fridge on a given date. + . Algorithm: + . + . - if the taskGroup's + . dateFullyCompleted is set, and the + . current system date is greater than + . midnight on the evening of that + . date, remove the taskGroup from the + . list of results. + . + . - (repeat for every schedule overlapping + . theSpecifiedDate.) + + Here we go. + */ +- (NSArray *) uncachedTaskGroupsForDayOfDate: (NSDate *) theSpecifiedDate + forTasksMatchingFilter: (NSPredicate *) taskFilter { - APCTask * task = [APCTask taskWithTaskID:schedule.taskID inContext:self.scheduleMOC]; - NSAssert(task,@"Task is nil"); - if (schedule.isOneTimeSchedule) { - [self findOrCreateOneTimeScheduledTask:schedule task:task]; + NSMutableString *printout = nil; + APCScheduleDebugPrinter *printer = nil; + +#if DEBUG + if (kAPCShowDebugPrintouts) + { + printout = [NSMutableString new]; + printer = [APCScheduleDebugPrinter new]; + } +#endif + + [printout appendFormat: @"\n\n-------------- Fetching uncached task groups for %@ using filter [%@]. --------------\n", + [printer stringFromDate: theSpecifiedDate], + taskFilter]; + + NSDate *theSpecifiedMorningAtMidnight = theSpecifiedDate.startOfDay; + NSDate *theSpecifiedNightAtMidnight = theSpecifiedDate.endOfDay; + NSMutableArray *resultingTaskGroups = [NSMutableArray new]; + NSManagedObjectContext *context = self.scheduleMOC; + NSError *errorFetchingSchedules = nil; + NSArray *activeSchedules = [self schedulesVisibleOnDayOfDate: theSpecifiedDate + usingContext: context + returningError: & errorFetchingSchedules]; + + if (activeSchedules == nil) // checking for errors, not an empty list. + { + [printout appendFormat: @"Whoops! Failed to load schedules. Error:\n%@\n", errorFetchingSchedules.friendlyFormattedString]; } + else { - APCScheduleExpression * scheduleExpression = schedule.scheduleExpression; - NSDate * beginningTime = (schedule.expires !=nil) ? [self.referenceRange.startDate dateByAddingTimeInterval:(-1*schedule.expiresInterval)] : self.referenceRange.startDate; - - NSEnumerator* enumerator = [scheduleExpression enumeratorBeginningAtTime:beginningTime endingAtTime:self.referenceRange.endDate]; - NSDate * startOnDate; - while ((startOnDate = enumerator.nextObject)) - { - APCDateRange * range; - BOOL doFindOrCreate = NO; - if (schedule.expires != nil) { - range = [[APCDateRange alloc] initWithStartDate:startOnDate durationInterval:schedule.expiresInterval]; - if ([range compare:self.referenceRange] != kAPCDateRangeComparisonOutOfRange) { - doFindOrCreate = YES; - } - else { - APCLogDebug(@"Created out of range dateRange: %@ for %@", range, task.taskTitle); + activeSchedules = [activeSchedules sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + + [printer printArrayOfSchedules: activeSchedules + withLabel: [NSString stringWithFormat: + @"\nSchedules POTENTIALLY visible between %@ and %@", + [printer stringFromDate: theSpecifiedMorningAtMidnight], + [printer stringFromDate: theSpecifiedNightAtMidnight]] + intoMutableString: printout]; + + for (APCSchedule *schedule in activeSchedules) + { + NSArray *timestamps = [self visibleTimesOfDayForSchedule: schedule + onDayOfDate: theSpecifiedDate + addingDiagnosticsToPrintout: printout + usingPrinter: printer]; + + /* + While the specified schedule may be active on this + day, it may not actually emit any date values for + this day. + */ + if (timestamps.count) + { + NSSet *filteredTasks = [self filterTasksFromSchedule: schedule + withTaskFilter: taskFilter + addingDiagnosticsToPrintout: printout + usingPrinter: printer]; + + for (APCTask *task in filteredTasks) + { + APCTaskGroup *taskGroup = [self computeAndGenerateTaskGroupForTask: task + andSchedule: schedule + atTheseTimes: timestamps + onThisDate: theSpecifiedDate + addingDiagnosticsToPrintout: printout + usingPrinter: printer]; + + if (taskGroup != nil) + { + /* + Spelling out the criteria that tell us whether or not + to include a task in the "today" list (whatever day + "today" is): + */ + BOOL isCompleted = taskGroup.isFullyCompleted; + NSDate *dateCompleted = taskGroup.dateFullyCompleted; + BOOL __unused wasCompletedInThePast = (isCompleted && [dateCompleted isEarlierThanDate: theSpecifiedMorningAtMidnight]); + BOOL wasCompletedOnThisDate = (isCompleted && [dateCompleted isLaterThanOrEqualToDate: theSpecifiedMorningAtMidnight] && [dateCompleted isEarlierOrEqualToDate: theSpecifiedNightAtMidnight]); + BOOL wasCompletedInTheFuture = (isCompleted && [dateCompleted isLaterThanDate: theSpecifiedNightAtMidnight]); + BOOL shouldShowThisTaskToday = (! isCompleted) || wasCompletedOnThisDate || wasCompletedInTheFuture; + + if (shouldShowThisTaskToday) + { + [resultingTaskGroups addObject: taskGroup]; + } + } } } - else { - range = [[APCDateRange alloc] initWithStartDate:startOnDate endDate:self.referenceRange.endDate]; - doFindOrCreate = YES; - } - if (doFindOrCreate) { - [self findOrCreateRecurringScheduledTask:schedule task:task dateRange:range]; - } } } + + + NSArray *sortedGroups = [resultingTaskGroups sortedArrayUsingSelector: @selector(compareWithTaskGroup:)]; + + [printout appendString: @"\n----------\nTotal list of taskGroups found:\n----------\n"]; + + for (APCTaskGroup *taskGroup in sortedGroups) + { + [printout appendFormat: @"- %@\n", taskGroup]; + } + + [printout appendFormat: @"\n-------------- Done fetching uncached task groups for %@ using filter %@. --------------\n\n", + [printer stringFromDate: theSpecifiedDate], + taskFilter + ]; + + APCLogDebug (@"%@", printout); + + + return sortedGroups; } -- (void) validateAllCompletedTasks +/** + Returns the times of day that the specified schedule + says a task should appear on the given date. This happens + in one of exactly two situations: the schedule says stuff + should appear on exactly that date; or the schedule says + stuff should appear on a previous date, and those items + haven't "expired" yet, according to the schedule's + expiration rule. + */ +- (NSArray *) visibleTimesOfDayForSchedule: (APCSchedule *) schedule + onDayOfDate: (NSDate *) theSpecifiedDate + addingDiagnosticsToPrintout: (NSMutableString *) printout + usingPrinter: (APCScheduleDebugPrinter *) printer { - NSArray * filteredArray = [self.allScheduledTasksForReferenceDate filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"completed == %@", @YES]]; - - [self.validatedScheduledTasksForReferenceDate addObjectsFromArray:filteredArray]; - [self.allScheduledTasksForReferenceDate removeObjectsInArray:filteredArray]; -} + [printer printArrayOfSchedules: @[schedule] + withLabel: @"\nAnalyzing schedule" + intoMutableString: printout]; -/*********************************************************************************/ -#pragma mark - One Time Task Find Or Create -/*********************************************************************************/ -- (void) findOrCreateOneTimeScheduledTask:(APCSchedule *) schedule task: (APCTask*) task { + NSDate *theSpecifiedMorningAtMidnight = theSpecifiedDate.startOfDay; + NSDate *theSpecifiedEveningAtMidnight = theSpecifiedDate.endOfDay; + NSMutableArray *timesOfDayForThisDay = [NSMutableArray new]; + NSMutableArray *timesOfDayForDayBeforeThisDay = [NSMutableArray new]; + NSDate *startDate = schedule.effectiveStartDate; - NSArray * scheduledTasksArray = [[self allScheduledTasks] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"task.taskID == %@", task.taskID]]; - - if (scheduledTasksArray.count > 0){ - APCLogDebug(@"task already scheduled: %@", task); - APCScheduledTask * validatedTask = scheduledTasksArray.firstObject; - [self validateScheduledTask:validatedTask]; - }else{ - //One time not created, create it - NSDate *startOnDate = [self.referenceRange.startDate startOfDay]; - - NSDate * endDate = (schedule.expires !=nil) ? [startOnDate dateByAddingTimeInterval:schedule.expiresInterval] : [startOnDate dateByAddingTimeInterval:[NSDate parseISO8601DurationString:@"P2Y"]]; - endDate = [NSDate endOfDay:endDate]; - [self createScheduledTask:schedule task:task dateRange:[[APCDateRange alloc] initWithStartDate:startOnDate endDate:endDate]]; + if (startDate == nil) + { + startDate = [APCUtilities firstKnownFileAccessDate]; + + if (startDate == nil) + { + startDate = [NSDate date]; + } } -} -- (void) findOrCreateOneTimeScheduledTask:(APCSchedule *) schedule task: (APCTask*) task andStartDateReference: (NSDate *)startOn { - - NSArray * scheduledTasksArray = [[self allScheduledTasks] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"task.taskID == %@", task.taskID]]; - - if (scheduledTasksArray.count > 0){ - APCLogDebug(@"task already scheduled: %@", task); - APCScheduledTask * validatedTask = scheduledTasksArray.firstObject; - [self validateScheduledTask:validatedTask]; - }else{ - //One time not created, create it - NSDate *startOnDate = [startOn startOfDay]; - - NSDate * endDate = (schedule.expires !=nil) ? [startOnDate dateByAddingTimeInterval:schedule.expiresInterval] : [startOnDate dateByAddingTimeInterval:[NSDate parseISO8601DurationString:@"P2Y"]]; - endDate = [NSDate endOfDay:endDate]; - [self createScheduledTask:schedule task:task dateRange:[[APCDateRange alloc] initWithStartDate:startOnDate endDate:endDate]]; + APCTopLevelScheduleEnumerator *enumerator = [schedule enumeratorFromDate: startDate.startOfDay + toDate: theSpecifiedEveningAtMidnight]; + + /* + We really want to get "today" and "the day before + today" from the Schedule. However, our Schedules + don't currently allow that sort of math. So we'll + walk forward through all dates generated by this + schedule until we hit "today" and "the day before + today" (which could be, like a month ago). If we find + "today," we'll keep it. If not, we'll use the day- + before-today. This will tell us the list of times + that tasks SHOULD appear.... if the schedule's + expiration ("grace period") rules allow it. We'll + address expiration in a moment. + */ + for (NSDate *nextAppearance in enumerator) + { + if ([nextAppearance isLaterThanOrEqualToDate: theSpecifiedMorningAtMidnight]) + { + [timesOfDayForThisDay addObject: nextAppearance]; + } + else + { + if (timesOfDayForDayBeforeThisDay.count) + { + NSDate *maybeSometimeOnPreviousDay = timesOfDayForDayBeforeThisDay.firstObject; + + if ([nextAppearance.startOfDay isLaterThanDate: maybeSometimeOnPreviousDay.endOfDay]) + { + [timesOfDayForDayBeforeThisDay removeAllObjects]; + } + } + + [timesOfDayForDayBeforeThisDay addObject: nextAppearance]; + } } - -} -/*********************************************************************************/ -#pragma mark - Recurring Task Find or Create -/*********************************************************************************/ -- (void) findOrCreateRecurringScheduledTask: (APCSchedule*) schedule task: (APCTask*) task dateRange: (APCDateRange*) range { - - NSArray * scheduledTasksArray = [self.allScheduledTasksForReferenceDate filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"task == %@", task]]; - - NSMutableArray * filteredArray = [NSMutableArray array]; - [scheduledTasksArray enumerateObjectsUsingBlock:^(APCScheduledTask * scheduledTask, NSUInteger __unused idx, BOOL * __unused stop) { - if ([scheduledTask.dateRange compare:range] == kAPCDateRangeComparisonSameRange) { - [filteredArray addObject:scheduledTask]; + [printout appendFormat: @" Found times of day for that date : %@\n", [printer stringsFromArrayOfDates: timesOfDayForThisDay]]; + [printout appendFormat: @" Found times of day for preceding legal date : %@\n", [printer stringsFromArrayOfDates: timesOfDayForDayBeforeThisDay]]; + + if (timesOfDayForThisDay.count) + { + /* + Today turns out to be on the schedule. Our rules + say: only one copy of a scheduled item appears on + a schedule at a time. Therefore we don't need any + enumerated dates from the previous day. + */ + timesOfDayForDayBeforeThisDay = nil; + } + + else if (timesOfDayForDayBeforeThisDay.count) + { + if (schedule.expires == nil) + { + // The times from the previous date are allowed. + } + else + { + NSDate *sometimeOnPrevousDate = timesOfDayForDayBeforeThisDay.firstObject; + NSDate *expirationTimeForThatDate = [sometimeOnPrevousDate dateByAddingISO8601Duration: schedule.expires]; + NSDate *expirationDateAtMidnight = expirationTimeForThatDate.endOfDay.dayBefore; + + // Expiration items should be at least one day long. + if ([expirationDateAtMidnight isLaterThanDate: theSpecifiedEveningAtMidnight]) + { + expirationDateAtMidnight = theSpecifiedEveningAtMidnight; + } + + if ([expirationDateAtMidnight isLaterThanOrEqualToDate: theSpecifiedMorningAtMidnight]) + { + // We're within the expiration period. This date is legal. Leave it. + } + else + { + // These dates are too far in the past: they've expired. Trash 'em. + timesOfDayForDayBeforeThisDay = nil; + [printout appendFormat: @" Stuff on the previous day has expired. Ignoring.\n"]; + } } - }]; - - if (filteredArray.count == 0) { - //Schedule not created, create it - [self createScheduledTask:schedule task:task dateRange:range]; } - else if (filteredArray.count == 1) { - APCScheduledTask * validatedTask = filteredArray.firstObject; - [self validateScheduledTask:validatedTask]; + + else + { + // We have no schedule items for this date or + // any previous date -- meaning, this date is + // before the schedule says it's allowed to run. + // No problem. } - else { - APCLogError(@"Many recurring scheduled tasks %@ present with the exact same range: %@", task.taskTitle, range); + + // What'd we get? + NSArray *chosenTimestamps = (timesOfDayForThisDay.count > 0 ? + timesOfDayForThisDay : + timesOfDayForDayBeforeThisDay); + + + [printout appendFormat: @" Chosen array of times : %@\n", [printer stringsFromArrayOfDates: chosenTimestamps]]; + + if (chosenTimestamps.count == 0) + { + [printout appendFormat: @" ...which has no times of day in it. Not getting tasks for this schedule. Moving to next schedule.\n"]; + + chosenTimestamps = nil; } + + return chosenTimestamps; } -/*********************************************************************************/ -#pragma mark - Helpers -/*********************************************************************************/ -- (void) createScheduledTask:(APCSchedule*) schedule task: (APCTask*) task dateRange: (APCDateRange*) dateRange +- (NSSet *) filterTasksFromSchedule: (APCSchedule *) schedule + withTaskFilter: (NSPredicate *) taskFilter + addingDiagnosticsToPrintout: (NSMutableString *) printout + usingPrinter: (APCScheduleDebugPrinter *) __unused printer { - APCAppDelegate * appDelegate = (APCAppDelegate*)[UIApplication sharedApplication].delegate; - - NSArray *offsetsForTask = [appDelegate offsetForTaskSchedules]; - - - - APCScheduledTask * createdScheduledTask = [APCScheduledTask newObjectForContext:self.scheduleMOC]; - - NSDate *taskStartDate = dateRange.startDate; - NSDate *taskEndDate = dateRange.endDate; + NSSet *result = nil; - - NSPredicate *predicate = nil; - NSArray *matchedTasks = nil; - NSNumber *daysToOffset = nil; - NSString *currentTaskID = nil; - NSDate *offsetStartDate = nil; - NSDate *todaysDate = [NSDate todayAtMidnight]; - - if (offsetsForTask) { - predicate = [NSPredicate predicateWithFormat:@"%K == %@", kScheduleOffsetTaskIdKey, task.taskID]; - matchedTasks = [offsetsForTask filteredArrayUsingPredicate:predicate]; - daysToOffset = nil; - - if (matchedTasks.count > 0) { - daysToOffset = [[matchedTasks firstObject] valueForKey:kScheduleOffsetOffsetKey]; - currentTaskID = [[matchedTasks firstObject] valueForKey:kScheduleOffsetTaskIdKey]; - } - + if (schedule == nil) + { + // This call turned out to be meaningless. Return nil. + result = nil; } - - if (daysToOffset) { - NSDateComponents *components = [[NSDateComponents alloc] init]; - [components setDay:[daysToOffset integerValue]]; - - offsetStartDate = [[NSCalendar currentCalendar] dateByAddingComponents:components - toDate:task.createdAt - options:0]; - - offsetStartDate = [offsetStartDate startOfDay]; - - APCLogDebug(@"Task %@ scheduled offset by %lu days. New start date is %@", task.taskTitle, [daysToOffset integerValue], taskStartDate); + + else + { + NSSet *unfilteredTasks = schedule.tasks; + + if (unfilteredTasks.count == 0) + { + // No tasks. Return nil. + result = nil; + } + + else + { + [printout appendString: @"\n Schedule has this set of tasks:\n"]; + + for (APCTask *task in unfilteredTasks) + { + [printout appendFormat: @" - title: %@, optional: %@\n", task.taskTitle, task.taskIsOptional]; + } + + if (taskFilter == nil) + { + result = unfilteredTasks; + } + else + { + NSSet *filteredTasks = [unfilteredTasks filteredSetUsingPredicate: taskFilter]; + + if (filteredTasks.count == unfilteredTasks.count) + { + // Nothing happened. + result = unfilteredTasks; + } + else + { + result = filteredTasks; + + [printout appendString: @"\n Filtering down to this list of tasks:\n"]; + + for (APCTask *task in filteredTasks) + { + [printout appendFormat: @" - title: %@, optional: %@\n", task.taskTitle, task.taskIsOptional]; + } + } + } + } } - if (([task.taskID isEqualToString:currentTaskID] && currentTaskID != nil) - && (([offsetStartDate isEqualToDate:todaysDate]) || - ([[todaysDate laterDate:offsetStartDate] isEqualToDate:todaysDate]))) + return result; +} + +- (APCTaskGroup *) computeAndGenerateTaskGroupForTask: (APCTask *) task + andSchedule: (APCSchedule *) schedule + atTheseTimes: (NSArray *) timestamps + onThisDate: (NSDate *) theSpecifiedDate + addingDiagnosticsToPrintout: (NSMutableString *) printout + usingPrinter: (APCScheduleDebugPrinter *) printer +{ + APCTaskGroup *taskGroup = nil; + + if (timestamps.count) { + [printout appendFormat: @"\n ------------\n Analyzing task: title: %@, optional: %@\n ------------\n", + task.taskTitle, + task.taskIsOptional + ]; - createdScheduledTask.startOn = taskStartDate; - createdScheduledTask.endOn = taskEndDate; - createdScheduledTask.generatedSchedule = schedule; - createdScheduledTask.task = task; - - NSError * saveError = nil; - BOOL saveSuccess = [createdScheduledTask saveToPersistentStore:&saveError]; - - if (!saveSuccess) { - APCLogError2 (saveError); + NSArray *completedTasks = [self completedOrPartlyCompletedTasksForTask: task + asOfThisDate: theSpecifiedDate + scheduledForOneOfTheseTimes: timestamps + addingDiagnosticsToPrintout: printout + usingPrinter: printer]; + + NSArray *remainingTasks = [self generatePotentialTasksForTask: task + andSchedule: schedule + givenThesePotentialTimes: timestamps + andTheseCompletedTasks: completedTasks + addingDiagnosticsToPrintout: printout + usingPrinter: printer]; + + NSDate *generalGratuitousTaskTimestamp = [timestamps.firstObject startOfDay]; + + APCPotentialTask *sampleGratuitousPotentialTask = [[APCPotentialTask alloc] initWithTask: task + onSchedule: schedule + appearingAtDateAndTime: generalGratuitousTaskTimestamp]; + + NSArray *completedGratuitousTasks = [self completedGratuitousTasksForTask: task + withGratuitousTaskTimestamp: generalGratuitousTaskTimestamp + addingDiagnosticsToPrintout: printout + usingPrinter: printer]; + + if (completedTasks.count == 0) { completedTasks = nil; } + if (remainingTasks.count == 0) { remainingTasks = nil; } + if (completedGratuitousTasks.count == 0) { completedGratuitousTasks = nil; } + + NSUInteger totalCountOfRequiredTasks = timestamps.count; + + taskGroup = [[APCTaskGroup alloc] initWithTask: task + requiredRemainingPotentialTasks: remainingTasks + requiredCompletedTasks: completedTasks + gratuitousCompletedTasks: completedGratuitousTasks + samplePotentialTask: sampleGratuitousPotentialTask + totalRequiredTasks: totalCountOfRequiredTasks + forDate: theSpecifiedDate]; + + + [printout appendFormat: @"\n Resulting taskGroup: %@\n", taskGroup]; + + if (taskGroup.isFullyCompleted && [theSpecifiedDate isLaterThanDate: taskGroup.dateFullyCompleted.endOfDay]) + { + [printout appendFormat: @"\n Group was fully completed on [%@]. Current system date is [%@], which is past that date. Omitting this group.\n", taskGroup.dateFullyCompleted, self.systemDate]; } - - //Validate the task - [self.validatedScheduledTasksForReferenceDate addObject:createdScheduledTask]; - - } else if (daysToOffset == nil || daysToOffset <= 0) { - createdScheduledTask.startOn = taskStartDate; - createdScheduledTask.endOn = taskEndDate; - createdScheduledTask.generatedSchedule = schedule; - createdScheduledTask.task = task; - - NSError * saveError = nil; - BOOL saveSuccess = [createdScheduledTask saveToPersistentStore:&saveError]; - - if (!saveSuccess) { - APCLogError2 (saveError); + else + { + // Ship it! } - - //Validate the task - [self.validatedScheduledTasksForReferenceDate addObject:createdScheduledTask]; - } else { - APCLogDebug(@"Nothing should be happening here!"); } + + return taskGroup; +} + +- (NSArray *) completedOrPartlyCompletedTasksForTask: (APCTask *) task + asOfThisDate: (NSDate *) theSpecifiedDate + scheduledForOneOfTheseTimes: (NSArray *) timestamps + addingDiagnosticsToPrintout: (NSMutableString *) printout + usingPrinter: (APCScheduleDebugPrinter *) printer +{ + NSPredicate *filterForCompletedTasks = [NSPredicate predicateWithFormat: @"%K in %@ && %K <= %@", + NSStringFromSelector (@selector (startOn)), + timestamps, + NSStringFromSelector (@selector (updatedAt)), + theSpecifiedDate.endOfDay + ]; + + NSSet *scheduledTasks = [task.scheduledTasks filteredSetUsingPredicate: filterForCompletedTasks]; + + NSArray *scheduledTasksSortedByTimeScheduled = [scheduledTasks.allObjects sortedArrayUsingComparator: + ^NSComparisonResult (APCScheduledTask *scheduledTask1, + APCScheduledTask *scheduledTask2) + { + return [scheduledTask1.startOn compare: scheduledTask2.startOn]; + }]; + + + [printout appendString: @" Found these probably-completed tasks:\n"]; + + for (APCScheduledTask *completedTask in scheduledTasksSortedByTimeScheduled) + { + [printout appendFormat: @" - scheduled for: %@ completedOn: %@\n", [printer stringFromDate: completedTask.startOn], [printer stringFromDate: completedTask.updatedAt]]; + } + + return scheduledTasksSortedByTimeScheduled; } -- (void) validateScheduledTask: (APCScheduledTask*) scheduledTask { - [self.validatedScheduledTasksForReferenceDate addObject:scheduledTask]; - [self.allScheduledTasksForReferenceDate removeObject:scheduledTask]; +- (NSArray *) completedGratuitousTasksForTask: (APCTask *) task + withGratuitousTaskTimestamp: (NSDate *) timestamp + addingDiagnosticsToPrintout: (NSMutableString *) printout + usingPrinter: (APCScheduleDebugPrinter *) printer +{ + NSSet *gratuitousTasks = [task.scheduledTasks filteredSetUsingPredicate: [NSPredicate predicateWithFormat: @"%K == %@", + NSStringFromSelector (@selector (startOn)), + timestamp]]; + + NSArray *sortedTasks = [gratuitousTasks.allObjects sortedArrayUsingComparator: + ^NSComparisonResult (APCScheduledTask *scheduledTask1, + APCScheduledTask *scheduledTask2) + { + return [scheduledTask1.updatedAt compare: scheduledTask2.updatedAt]; + }]; + + [printout appendString: @"\n Found these gratuitous completed tasks:\n"]; + + for (APCScheduledTask *gratuitousTask in sortedTasks) + { + [printout appendFormat: @" - completedOn: %@\n", [printer stringFromDate: gratuitousTask.updatedAt]]; + } + + return sortedTasks; } -- (void) deleteAllNonvalidatedScheduledTasks { - while (self.allScheduledTasksForReferenceDate.count) { - APCScheduledTask * task = [self.allScheduledTasksForReferenceDate lastObject]; - [self.allScheduledTasksForReferenceDate removeLastObject]; - [task deleteScheduledTask]; +- (NSArray *) generatePotentialTasksForTask: (APCTask *) task + andSchedule: (APCSchedule *) schedule + givenThesePotentialTimes: (NSArray *) timestamps + andTheseCompletedTasks: (NSArray *) completedTasks + addingDiagnosticsToPrintout: (NSMutableString *) printout + usingPrinter: (APCScheduleDebugPrinter *) printer +{ + NSMutableArray *result = nil; + + if (timestamps.count) + { + result = [NSMutableArray new]; + + [printout appendString: @"\n Generating these potentialTasks:\n"]; + + for (NSDate *time in timestamps) + { + NSArray *completedTasksForThisTime = [completedTasks filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"%K == %@", + NSStringFromSelector (@selector (startOn)), + time]]; + + if (completedTasksForThisTime.count == 0) + { + APCPotentialTask *potentialTask = [[APCPotentialTask alloc] initWithTask: task + onSchedule: schedule + appearingAtDateAndTime: time]; + [result addObject: potentialTask]; + [printout appendFormat: @" - scheduled for: %@\n", [printer stringFromDate: time]]; + } + } } + + return result; } -@end +/** + Returns the schedules that are, or were, in their + "started" state on the specified date. This is NOT the + schedules VISIBLE on that date; rather, this is schedules + whose "start dates" are equal to or later than this date. + + This is used when importing new schedules, in + - processSchedulesAndTasks. + + You might note that this method looks nearly identical + to -schedulesVisibleOnDayOfDate:. They are indeed very + similar. I tried parameterizing them, to make sure we + ran the same query and same type of query in both + cases... and it took nearly as much code to do that as + it took to have two separate methods. And the separate + methods are much more readable, because the code does + exactly what it says it does. (In the parameterized + version, the code was so abstract I found it hard to + visually verify that the query was doing what it needed + to do.) So two methods it is. + + @see -schedulesVisibleOnDayOfDate: + */ +- (NSArray *) schedulesActiveOnDayOfDate: (NSDate *) dateWhenThingsShouldBeActive + fromSource: (APCScheduleSource) scheduleSource + inContext: (NSManagedObjectContext *) context + returningError: (NSError * __autoreleasing *) errorToReturn +{ + NSDate * midnightThisMorning = dateWhenThingsShouldBeActive.startOfDay; + NSDate * __unused midnightThisEvening = dateWhenThingsShouldBeActive.endOfDay; // for debugging + + NSPredicate *filter = [NSPredicate predicateWithFormat: + @"%K == %@ && (%K == nil || %K <= %@) && (%K == nil || %K >= %@)", + NSStringFromSelector (@selector (scheduleSource)), + @(scheduleSource), + NSStringFromSelector (@selector (startsOn)), // -[APCSchedule startsOn] + NSStringFromSelector (@selector (startsOn)), // -[APCSchedule startsOn] + midnightThisEvening, + NSStringFromSelector (@selector (effectiveEndDate)), // -[APCSchedule effectiveEndDate] + NSStringFromSelector (@selector (effectiveEndDate)), // -[APCSchedule effectiveEndDate] + midnightThisMorning + ]; + + NSFetchRequest *request = [APCSchedule requestWithPredicate: filter]; + NSError *errorFetchingSchedules = nil; + NSArray *schedules = [context executeFetchRequest: request error: & errorFetchingSchedules]; + + if (errorToReturn != nil) + { + * errorToReturn = [NSError errorWithCode: APCErrorCouldntFetchActiveSchedulesForDateCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorCouldntFetchActiveSchedulesForDateReason + recoverySuggestion: APCErrorCouldntFetchActiveSchedulesForDateSuggestion + nestedError: errorFetchingSchedules]; + } + + return schedules; +} + + +/** + Returns the schedules that are, or were, actually visible + on the user's screen on the specified date. This is + a subset of the schedules that were ACTIVE on that date: + a schedule can be active-but-not-visible if it has a + non-nil "delay" value. + + This is used when fetching CoreData items to show + on the screen, during -uncachedTaskGroups. + + You might note that this method looks nearly identical + to -schedulesActiveOnDayOfDate:. They are indeed very + similar. I tried parameterizing them, to make sure we + ran the same query and same type of query in both + cases... and it took nearly as much code to do that as + it took to have two separate methods. And the separate + methods are much more readable, because the code does + exactly what it says it does. (In the parameterized + version, the code was so abstract I found it hard to + visually verify that the query was doing what it needed + to do.) So two methods it is. + + @param scheduleSource Pass APCScheduleSourceAll for all schedules. + + @see -schedulesActiveOnDayOfDate: + */ +- (NSArray *) schedulesVisibleOnDayOfDate: (NSDate *) dateWhenThingsShouldBeVisible + usingContext: (NSManagedObjectContext *) context + returningError: (NSError * __autoreleasing *) errorToReturn +{ + NSDate *midnightThisMorning = dateWhenThingsShouldBeVisible.startOfDay; + NSDate *midnightThisEvening = dateWhenThingsShouldBeVisible.endOfDay; + + NSPredicate *filterForThisDay = [NSPredicate predicateWithFormat: + @"(%K == nil || %K <= %@) && (%K == nil || %K >= %@)", + NSStringFromSelector (@selector (effectiveStartDate)), // -[APCSchedule effectiveStartDate] + NSStringFromSelector (@selector (effectiveStartDate)), // -[APCSchedule effectiveStartDate] + midnightThisEvening, + NSStringFromSelector (@selector (effectiveEndDate)), // -[APCSchedule effectiveEndDate] + NSStringFromSelector (@selector (effectiveEndDate)), // -[APCSchedule effectiveEndDate] + midnightThisMorning + ]; + + NSFetchRequest *scheduleQuery = [APCSchedule requestWithPredicate: filterForThisDay]; + NSError *errorFetchingSchedules = nil; + NSArray *schedules = [context executeFetchRequest: scheduleQuery + error: & errorFetchingSchedules]; + + if (errorToReturn != nil) + { + * errorToReturn = [NSError errorWithCode: APCErrorCouldntFetchVisibleSchedulesForDateCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorCouldntFetchVisibleSchedulesForDateReason + recoverySuggestion: APCErrorCouldntFetchVisibleSchedulesForDateSuggestion + nestedError: errorFetchingSchedules]; + } + + return schedules; +} + + + + +// ========================================================= +#pragma mark - III. IMPORTING - +// ========================================================= + + + +// --------------------------------------------------------- +#pragma mark - Downloading tasks and schedules from the server +// --------------------------------------------------------- + +/** + This method and -loadTasksAndSchedulesFromDisk do + analogous things: get a list of schedules-and-tasks from a + source (server or disk). Then they call a central method + to delete old versions, add the new versions, and save + everything to disk. + + This method (-fetch) differs from -load because it has to + extract Sage's data into an array of data with the + key-value pairs we need. + + Both methods put the specified work onto a (private, + serial) operation queue, and so can return to the calling + method immediately. + + Both methods are immediately followed by methods for + handling errors and success specific to that download + type. Both "success" methods call the same internal + method for processing schedules. + */ +- (void) fetchTasksAndSchedulesFromServerAndThenUseThisQueue: (NSOperationQueue *) queue + toDoThisWhenDone: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + /* + Get off whatever thread we were called on. For this outer "if" + statement, we'll only be here for an instant, but for consistency + in all our data-handling, we'll do everything on the same thread. + */ + [self.queryQueue addOperationWithBlock:^{ + + if (self.isServerDisabled) + { + NSError *errorFetchingSchedules = [NSError errorWithCode: APCErrorServerDisabledCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorServerDisabledReason + recoverySuggestion: APCErrorServerDisabledSuggestion]; + + [self handleErrorFetchingTasksAndSchedulesFromServer: errorFetchingSchedules + andThenUseThisQueue: queue + toDoThis: callbackBlock]; + } + else + { + /* + Bounce over to the Sage SDK's thread, call the server, and then come + back to our thread a while later. + + TODO: Not yet using the return variable, because the code I inherited + didn't, and I (therefore) don't yet have a use case for keeping it. + The use case, in principle, is to be able to cancel the "fetch," + such as when the app goes to the background. This might also help + us give appropriate user feedback, like stopping the UIActivityIndicator. + + NSURLSessionDataTask *session = ... + */ + [SBBComponent (SBBScheduleManager) getSchedulesWithCompletion: ^(SBBResourceList *schedulesList, + NSError *errorFetchingSchedules) + { + /* + Immediately get off the Sage queue and back onto ours, + so we know and can control what's happening and what + resources are being used. + */ + [self.queryQueue addOperationWithBlock: ^{ + + [self handleSuccessfullyFetchedTasksAndSchedulesFromServer: schedulesList + givenThisPossibleErrorFromTheDownloadProcess: errorFetchingSchedules + andThenUseThisQueue: queue + toDoThis: callbackBlock]; + }]; + }]; + } + }]; +} + +/** + Convert inbound Sage server data to an NSDictionary of + keys we know how to look for. + + This lets us use the same method to process data + downloaded from the server as we do data pulled from a + local JSON file. + */ +- (NSDictionary *) extractJsonDataFromIncomingSageSchedule: (SBBSchedule *) sageSchedule +{ + NSNull *null = [NSNull null]; + NSMutableDictionary *scheduleData = [NSMutableDictionary new]; + NSMutableArray *activities = [NSMutableArray new]; + + scheduleData [kScheduleReminderMessageKey] = [self nullIfNil: sageSchedule.label]; + scheduleData [kScheduleTypeKey] = [self nullIfNil: sageSchedule.scheduleType]; + scheduleData [kScheduleStartDateKey] = [self nullIfNil: sageSchedule.startsOn]; + scheduleData [kScheduleStringKey] = [self nullIfNil: sageSchedule.cronTrigger]; + scheduleData [kScheduleExpiresKey] = [self nullIfNil: sageSchedule.expires]; + scheduleData [kScheduleEndDateKey] = [self nullIfNil: sageSchedule.endsOn]; + scheduleData [kScheduleListOfTasksKey] = activities; + + // As a reminder to get these when Sage has a chance to add them. + scheduleData [kScheduleIntervalKey] = null; // [self nullIfNil: sageSchedule.interval]; + scheduleData [kScheduleTimesOfDayKey] = null; // [self nullIfNil: sageSchedule.times]; + scheduleData [kScheduleMaxCountKey] = null; // [self nullIfNil: sageSchedule.maxCount]; + + + for (SBBActivity *activity in sageSchedule.activities) + { + NSMutableDictionary *activityData = [NSMutableDictionary new]; + + activityData [kTaskTitleKey] = [self nullIfNil: activity.label]; + activityData [kTaskTypeKey] = [self nullIfNil: activity.activityType]; + activityData [kTaskIDKey] = [self nullIfNil: activity.survey.guid]; + activityData [kTaskVersionNumberKey] = [self nullIfNil: activity.survey.version]; + activityData [kTaskUrlKey] = [self nullIfNil: activity.ref]; + activityData [kTaskClassNameKey] = NSStringFromClass ([APCGenericSurveyTaskViewController class]); + + // When we start getting these from Sage, we'll use them. + // In the mean time, noting them here, because we're using + // them from our local disk files. + activityData [kTaskCompletionTimeStringKey] = null; + activityData [kTaskFileNameKey] = null; + activityData [kTaskSortStringKey] = null; + + [activities addObject: activityData]; + } + + return scheduleData; +} + +/** + By the time we get here, we're safely on our private thread + (a private serial queue). + */ +- (void) handleErrorFetchingTasksAndSchedulesFromServer: (NSError *) errorFetchingSchedules + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThis: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + APCLogError2 (errorFetchingSchedules); + + [self performFetchAndLoadCallback: callbackBlock + onQueue: queue + sendingError: errorFetchingSchedules]; +} + +/** + By the time we get here, we're safely on our private thread + (a private serial queue). + */ +- (void) handleSuccessfullyFetchedTasksAndSchedulesFromServer: (SBBResourceList *) schedulesAndTasks + givenThisPossibleErrorFromTheDownloadProcess: (NSError *) errorFetchingSchedules + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThis: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + + if (errorFetchingSchedules) + { + [self handleErrorFetchingTasksAndSchedulesFromServer: errorFetchingSchedules + andThenUseThisQueue: queue + toDoThis: callbackBlock]; + } + else + { + NSMutableArray *jsonCopyOfSageSchdulesAndTasks = nil; + + if (! errorFetchingSchedules) + { + jsonCopyOfSageSchdulesAndTasks = [NSMutableArray new]; + NSArray *sageSchedules = schedulesAndTasks.items; + + for (SBBSchedule *sageSchedule in sageSchedules) + { + NSDictionary *sageScheduleData = [self extractJsonDataFromIncomingSageSchedule: sageSchedule]; + + [jsonCopyOfSageSchdulesAndTasks addObject: sageScheduleData]; + } + } + + /* + Loop through the incoming items and save/udpate everything. + Both -fetch and -load boil down to this one call. + */ + [self processSchedulesAndTasks: jsonCopyOfSageSchdulesAndTasks + fromSource: APCScheduleSourceServer + andThenUseThisQueue: queue + toDoThisWhenDone: callbackBlock]; + } +} + + + +// --------------------------------------------------------- +#pragma mark - Loading tasks and schedules from disk +// --------------------------------------------------------- + +/** + This method and -fetchSchedulesFromServer do the same thing: + get a list of schedules-and-tasks from a source (server or disk). + Then they call a central method to delete old versions, add the + new versions, and save everything to disk. + + This method (-load) differs from -fetch because it has to + extract the appropriate array from a loaded JSON file. + + Both methods put the specified work onto a (private, serial) + dispatch queue, and so can return to the calling method immediately. + + Both methods are immediately followed by methods for handling + errors and success specific to that download type. Both "success" + methods call the same internal method for processing schedules. + */ +- (void) loadTasksAndSchedulesFromDiskAndThenUseThisQueue: (NSOperationQueue *) queue + toDoThisWhenDone: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + [self.queryQueue addOperationWithBlock: ^{ + + // Was: + // [self.appDelegate.dataSubstrate loadStaticTasksAndSchedules: jsonDictionary]; + + NSArray *schedulesArray = nil; + NSError *errorToReport = nil; + NSError *errorLoadingTasksAndSchedulesFile = nil; + NSDictionary *jsonDictionary = [NSDictionary dictionaryWithContentsOfJSONFileWithName: kAPCStaticJSONTasksAndSchedulesFileName + inBundle: nil + returningError: & errorLoadingTasksAndSchedulesFile]; + if (! jsonDictionary) + { + errorToReport = [NSError errorWithCode: APCErrorLoadingJsonFromDiskCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorLoadingJsonFromDiskReason + recoverySuggestion: APCErrorLoadingJsonFromDiskSuggestion + relatedFilePath: kAPCStaticJSONTasksAndSchedulesFileName + relatedURL: nil + nestedError: errorLoadingTasksAndSchedulesFile]; + } + else + { + id maybeSchedulesArray = jsonDictionary [kAPCStaticJSONTasksAndSchedulesSchedulesKey]; + + /* To Test each condition use or do one of these below: + + 1. maybeSchedulesArray = nil; + + 2. Set the check for whether the object isKindOf: NSArray + + 3. [maybeSchedulesArray removeAllObjects] + */ + + if (maybeSchedulesArray == nil) + { + errorToReport = [NSError errorWithCode: APCErrorJSONTasksAndSchedulesNilValueForKeyCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorJSONTasksAndSchedulesNilValueForKeyReason + recoverySuggestion: APCErrorJSONTasksAndSchedulesNilValueForKeySuggestion]; + } + + else if (! [maybeSchedulesArray isKindOfClass: [NSArray class]]) + { + errorToReport = [NSError errorWithCode: APCErrorJSONTasksAndScheduleIsNotAnArrayCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorJSONTasksAndScheduleIsNotAnArrayReason + recoverySuggestion: APCErrorJSONTasksAndScheduleIsNotAnArraySuggestion]; + } + + else + { + schedulesArray = maybeSchedulesArray; + + if (schedulesArray.count == 0) + { + // This may not be an error, but it probably is. + errorToReport = [NSError errorWithCode: APCErrorJSONTasksAndSchedulesIsEmptyCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorJSONTasksAndSchedulesIsEmptyReason + recoverySuggestion: APCErrorJSONTasksAndSchedulesIsEmptySuggestion]; + } + else + { + // Whew. Looks like we got real data. Ready to process. + } + } + } + + if (errorToReport != nil) + { + [self handleErrorLoadingTasksAndSchedulesFromDisk: errorToReport + andThenUseThisQueue: queue + toDoThis: callbackBlock]; + } + + else + { + [self handleSuccessfullyLoadedTasksAndSchedulesFromDisk: schedulesArray + andThenUseThisQueue: queue + toDoThis: callbackBlock]; + } + }]; +} + +- (void) handleErrorLoadingTasksAndSchedulesFromDisk: (NSError *) errorLoadingFromDisk + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThis: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + APCLogError2 (errorLoadingFromDisk); + + +#if DEBUG + + /* + In debug mode, if this happens, the developer/QA + person probably made a typo in the JSON file, like + forgetting to add a comma after copying-and-pasting. + So, in this non-production situation, let them (us) + know very clearly. + */ + + NSString *errorMessage = [NSString stringWithFormat: + @"\n\n" + "============ error: couldn't open JSON file =============\n" + "We had trouble loading the JSON file. Maybe there's a copy-and-paste error? Here's the original error message:\n\n" + "%@\n" + "=========================================================\n", + errorLoadingFromDisk.friendlyFormattedString]; + + /* + If the app crashes here, we couldn't read the JSON + file. See console for details. + */ + APCLogDebug (errorMessage); + NSAssert (NO, errorMessage); + +#endif + + + [self performFetchAndLoadCallback: callbackBlock + onQueue: queue + sendingError: errorLoadingFromDisk]; +} + +- (void) handleSuccessfullyLoadedTasksAndSchedulesFromDisk: (NSArray *) taskAndSchduleData + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThis: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + /* + Loop through the incoming items and save/udpate everything. + Both -fetch and -load boil down to this one call. + */ + [self processSchedulesAndTasks: taskAndSchduleData + fromSource: APCScheduleSourceLocalDisk + andThenUseThisQueue: queue + toDoThisWhenDone: callbackBlock]; +} + + + +// --------------------------------------------------------- +#pragma mark - Loading tasks and schedules from dictionaries +// --------------------------------------------------------- + +- (void) importScheduleFromDictionary: (NSDictionary *) scheduleContainingTasks + assigningSource: (APCScheduleSource) scheduleSource + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThisWhenDone: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + [self.queryQueue addOperationWithBlock:^{ + [self processSchedulesAndTasks: @[scheduleContainingTasks] + fromSource: scheduleSource + andThenUseThisQueue: queue + toDoThisWhenDone: callbackBlock]; + }]; +} + + + +// --------------------------------------------------------- +#pragma mark - The core import process +// --------------------------------------------------------- + +/** + This method is the core of our effort when loading + schedules, where we: + - unify the processing for schedules and tasks from Sage + and local disk, and + - compute the "effective start" and "effective end" dates + + Here's how the process of creating schedules and tasks + works, and why. + + We have 2 types of schedules: downloaded and local. As a + business requirement, both types COMPLETELY REPLACE any + existing schedules of that type. To expire a schedule, + the authors simply don't mention it in the download; and + to expire a task, the authors simply don't make a schedule + for it. + + The catch is: we need to see what was SUPPOSED to happen + in the past. So we have to track schedules that were once + visible to the user, but no longer, and show them to the + user under certain circumstances. We need to show the + users what the researchers EXPECTED them to do, while also + making that thing undoable. If they miss a task in the + past, we need to dim it. + + Schedules are downloaded every time the user does a + pull-to- refresh or launches the app. It can happen as + often as every few seconds, or as seldom as every few + weeks. Schedules are also loaded from disk every time the + app loads. + + Tasks show up on a calendar (a view, any view) for 2 + reasons: + - because a schedule says the user *could* do the + task on a certain date + - because the task was actually done on a certain date + + Example: A researcher schedules a "please enter your + weight" task for every Monday. On Tuesday, March 5, the + researcher changes that schedule to be "every Tuesday and + Thursday": she wants the user to measure his weight every + Tuesday and Thursday. The user didn't do the task + yesterday, Monday, March 5. So if the user looks at + YESTERDAY's calendar: what does he see? Nothing, because + the new schedule for that task says "Tuesday and + Thursday"? Or one missed task, because the schedule AT + THAT TIME said "every Monday"? The answer: we show the + user whatever was true FOR HIM, yesterday. Downloading a + schedule shouldn't "rewrite the past." It should simply + tell the user what can happen from this day *forward*. + + There are 2 parts to getting this to happen: + - Downloading tasks and schedules, and then adding, + updating, or deleting them in the system. + - Showing tasks appropriately when the user looks + at a calendar. + + We'll keep those two issues utterly separate. This class + does the first one: download and update. Here's how it + works: + + 1. The user downloads (from the server) or loads (from + disk) some schedules and tasks, either by launching + the app or by pull-to-refresh. We look at the existing + schedules, and: + + a. We delete any schedules with "effective" start dates + of today or later. + + b. If any schedules have effective start AND end dates + before midnight tonight, we leave them alone. + + c. If any schedules have effective START dates before + midnight tonight, but an END date of today or later, + we give them an end date of this morning at midnight. + + + Then we add our new schedules into the system. + + Note: the "effective start date" and "effective end date" + of a schedule are the dates and times the schedule + *actually* begins and ends, after accounting for its start + delay and expiration period. + + + 2. Each loaded Schedule includes one or more tasks. For + each schedule, look at each contained task, and: + + a. If the schedule links to a task whose ID/version + aren't already here: Simply create the new task. + + b. If a schedule links to a task whose ID and version IS + already here: see if the *contents* of that task have + changed. If no change, link to the existing task. If + changed, create a new task with a different locally- + created ID and version. + + + 3. A really common "edge case": the user does + pull-to-refresh five times between 9am and 10am the same + day -- say, a minute apart. At the same time, out in + the real world, our friendly researcher is busily + playing with tasks and schedules. So each time the + user gets a download, he gets not only new schedules, + but new tasks. In this case: when we're about to + delete the schedules that were downloaded earlier today + (case 1a, above), we see if the tasks owned by those + schedules are owned by any other schedules. If not -- + if the only schedules owning those tasks are the + schedules we're about to delete -- delete those tasks, + too. + */ +- (void) processSchedulesAndTasks: (NSArray *) arrayOfSchedulesAndTasks + fromSource: (APCScheduleSource) scheduleSource + andThenUseThisQueue: (NSOperationQueue *) queue + toDoThisWhenDone: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock +{ + // The original code did this. Not yet sure it's necessary. + // APCLogEventWithData (kNetworkEvent, @{@"event_detail": @"schedule updated"}); + + NSMutableString *printout = nil; + APCScheduleDebugPrinter *printer = nil; + + #if DEBUG + if (kAPCShowDebugPrintouts) + { + printout = [NSMutableString new]; + printer = [APCScheduleDebugPrinter new]; + } + #endif + + NSManagedObjectContext *context = self.scheduleMOC; + NSError *finalErrorFromThisMethod = nil; + NSDate *today = self.systemDate; + NSDate *morningMidnight = today.startOfDay; + NSDate *eveningMidnight = today.endOfDay; + + + /* + The import-and-merge algorithm, v4: + - compare all incoming schedules to all active schedules, including comparing their tasks + - for each one found: update its tasks with new data, if needed + - for each one NOT found: create it, and create or update its tasks + - for each active schedule therefore NOT found: disable it + */ + NSError *errorFetchingCurrentSchedules = nil; + NSArray *currentSchedules = [self schedulesActiveOnDayOfDate: today + fromSource: scheduleSource + inContext: context + returningError: & errorFetchingCurrentSchedules]; + + if (! currentSchedules) + { + finalErrorFromThisMethod = errorFetchingCurrentSchedules; + } + + else + { + NSArray *rawIncomingSchedules = [self createSchedulesAndUpdateTasksFromIncomingData: arrayOfSchedulesAndTasks + forSource: scheduleSource + inContext: context]; + NSArray *uniquifiedIncomingSchedules = nil; + NSArray *schedulesWithDuplicateTaskIDs = nil; + NSArray *duplicateTaskIds = nil; + + [self findDuplicateTaskIdsInIncomingSchedules: rawIncomingSchedules + returningTheUniquifiedSchedules: & uniquifiedIncomingSchedules + theDuplicatedTaskIDs: & duplicateTaskIds + andTheSchedulesWeWillIgnore: & schedulesWithDuplicateTaskIDs]; + + if (duplicateTaskIds.count) + { + /* + If the app crashes inside this method call, it + means your JSON file contains one or more + schedules with the same task ID. See the + console for which task IDs are duplicated. + */ + [self reportLoudlyAboutDuplicateTaskIds: duplicateTaskIds + andTheSchedulesContainingThem: schedulesWithDuplicateTaskIDs + fromSource: scheduleSource]; + } + + + /* + Take various unions and intersections of the + current schedules and the incoming schedules. + This is the CORE OF THE BUSINESS LOGIC in this + method. + */ + NSArray *schedulesThatAreAlreadyPerfect = [self arrayByFindingCommonElementsInScheduleArray: currentSchedules + andScheduleArray: uniquifiedIncomingSchedules + comparingObjectsUsingFields: YES]; + + NSArray *oldSchedulesToKillOrDelete = [self arrayByRemovingElementsInScheduleArray: uniquifiedIncomingSchedules + fromScheduleArray: currentSchedules + comparingObjectsUsingFields: YES]; + + NSArray *schedulesFromThisMorningToDelete = [oldSchedulesToKillOrDelete filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"%K >= %@ && %K <= %@", + NSStringFromSelector (@selector (createdAt)), + morningMidnight, + NSStringFromSelector (@selector (createdAt)), + eveningMidnight]]; + + NSArray *oldSchedulesToTerminate = [self arrayByRemovingElementsInScheduleArray: schedulesFromThisMorningToDelete + fromScheduleArray: oldSchedulesToKillOrDelete + comparingObjectsUsingFields: NO]; + + NSArray *newSchedulesToKeep = [self arrayByRemovingElementsInScheduleArray: schedulesThatAreAlreadyPerfect + fromScheduleArray: uniquifiedIncomingSchedules + comparingObjectsUsingFields: YES]; + + NSArray *unnecessaryImportedSchedulesToDelete = [self arrayByRemovingElementsInScheduleArray: newSchedulesToKeep + fromScheduleArray: uniquifiedIncomingSchedules + comparingObjectsUsingFields: NO]; + + + // + // For debugging: sort them by title, so we can see what's going on. + // The incoming schedules, unique and duplicated, are already sorted + // by the method we used to search for duplicates. + // + currentSchedules = [currentSchedules sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + schedulesThatAreAlreadyPerfect = [schedulesThatAreAlreadyPerfect sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + oldSchedulesToTerminate = [oldSchedulesToTerminate sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + newSchedulesToKeep = [newSchedulesToKeep sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + unnecessaryImportedSchedulesToDelete = [unnecessaryImportedSchedulesToDelete sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + schedulesFromThisMorningToDelete = [schedulesFromThisMorningToDelete sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + + + [printout appendFormat: + @"\n\n======================= new batch of schedules from %@ =======================\n", + NSStringFromAPCScheduleSource (scheduleSource)]; + + [printer printArrayOfSchedules: currentSchedules withLabel: @"Current Schedules" intoMutableString: printout]; + [printer printArrayOfSchedules: uniquifiedIncomingSchedules withLabel: @"Incoming Schedules with unique task IDs (we'll analyze these)" intoMutableString: printout]; + [printer printArrayOfSchedules: schedulesWithDuplicateTaskIDs withLabel: @"Incoming Schedules with DUPLICATE task IDs (we'll delete these)" intoMutableString: printout]; + [printer printArrayOfSchedules: schedulesThatAreAlreadyPerfect withLabel: @"Current Schedules that are Already Perfect" intoMutableString: printout]; + [printer printArrayOfSchedules: newSchedulesToKeep withLabel: @"Incoming Schedules to Keep" intoMutableString: printout]; + [printer printArrayOfSchedules: schedulesFromThisMorningToDelete withLabel: @"Schedules imported earlier today to delete" intoMutableString: printout]; + [printer printArrayOfSchedules: oldSchedulesToTerminate withLabel: @"Current Schedules to Terminate" intoMutableString: printout]; + [printer printArrayOfSchedules: unnecessaryImportedSchedulesToDelete withLabel: @"Unneded Incoming Schedules to Delete" intoMutableString: printout]; + + + // + // ok, back to business logic + // + + [self disableSchedules: oldSchedulesToTerminate]; + + [self deleteSchedulesButNotTasks: schedulesFromThisMorningToDelete + inContext: context]; + + [self deleteSchedulesButNotTasks: unnecessaryImportedSchedulesToDelete + inContext: context]; + + [self deleteSchedulesButNotTasks: schedulesWithDuplicateTaskIDs + inContext: context]; + + + // + // All that being said, there may still be nothing to save. + // + + if (! context.hasChanges) + { + [printout appendString: @"\n...which means, all told, there's nothing to save. We're done.\n\n"]; + } + else + { + NSManagedObject *anySaveableObject = uniquifiedIncomingSchedules.firstObject; + NSError *errorSavingEverything = nil; + BOOL saved = [anySaveableObject saveToPersistentStore: & errorSavingEverything]; + + if (! saved) + { + finalErrorFromThisMethod = [NSError errorWithCode: APCErrorSavingEverythingCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorSavingEverythingReason + recoverySuggestion: APCErrorSavingEverythingSuggestion + nestedError: errorSavingEverything]; + } + } + + + // + // Ok, what happened? + // + + NSArray *currentSchedulesAfterImport = [self schedulesActiveOnDayOfDate: today + fromSource: scheduleSource + inContext: context + returningError: & errorFetchingCurrentSchedules]; + + currentSchedulesAfterImport = [currentSchedulesAfterImport sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + + [printout appendString: @"--------\nResults\n--------\n"]; + + [printer printArrayOfSchedules: currentSchedulesAfterImport withLabel: @"Current schedules after import" intoMutableString: printout]; + + [printer printArrayOfSchedules: oldSchedulesToTerminate withLabel: @"Terminated schedules" intoMutableString: printout]; + + + // + // And, finally, print it. + // + + [printout appendFormat: + @"======================= end batch of schedules from %@ =======================\n\n", + NSStringFromAPCScheduleSource (scheduleSource)]; + + NSLog (@"%@", printout); + } + + if (finalErrorFromThisMethod) + { + APCLogError2 (finalErrorFromThisMethod); + } + + + /* + Lastly: clear the performance cache. + */ + [self clearTaskGroupCache]; + + + [self performFetchAndLoadCallback: callbackBlock + onQueue: queue + sendingError: finalErrorFromThisMethod]; +} + +- (NSArray *) createSchedulesAndUpdateTasksFromIncomingData: (NSArray *) incomingSchedulesAndTasks + forSource: (APCScheduleSource) scheduleSource + inContext: (NSManagedObjectContext *) context +{ + NSMutableArray *schedules = [NSMutableArray new]; + + for (NSDictionary *scheduleData in incomingSchedulesAndTasks) + { + APCSchedule *schedule = [self createOneScheduleAndItsTasksFromJsonData: scheduleData + fromSource: scheduleSource + usingContext: context]; + + [schedules addObject: schedule]; + } + + return schedules; +} + +- (void) findDuplicateTaskIdsInIncomingSchedules: (NSArray *) incomingSchedulesAndTasks + returningTheUniquifiedSchedules: (NSArray * __autoreleasing * ) uniquifiedSchedulesToReturn + theDuplicatedTaskIDs: (NSArray * __autoreleasing * ) duplicateTaskIdsToReturn + andTheSchedulesWeWillIgnore: (NSArray * __autoreleasing * ) duplicateSchedulesToReturn +{ + NSMutableArray *uniqueTaskIds = [NSMutableArray new]; + NSMutableArray *duplicateTaskIds = [NSMutableArray new]; + NSMutableArray *uniquifiedSchedules = [NSMutableArray new]; + NSMutableArray *duplicateSchedules = [NSMutableArray new]; + + for (APCSchedule *schedule in incomingSchedulesAndTasks) + { + BOOL thisScheduleContainsSomeoneElsesTaskId = NO; + + for (APCTask *task in schedule.tasks) + { + NSString *taskId = task.taskID; + + if (taskId == nil) + { + taskId = kAPCNullTaskIdString; + } + + if ([uniqueTaskIds containsObject: taskId]) + { + thisScheduleContainsSomeoneElsesTaskId = YES; + [duplicateTaskIds addObject: taskId]; + break; + } + else + { + [uniqueTaskIds addObject: taskId]; + } + } + + if (thisScheduleContainsSomeoneElsesTaskId) + { + [duplicateSchedules addObject: schedule]; + } + else + { + [uniquifiedSchedules addObject: schedule]; + } + } + + /* + These results are intended to be human-readable, + so sort them. The task IDs are strings, so we can + sort by their -compare: method. We'll sort the + schedules by a comparator we use to sort all lists of + schedules when we print them. + */ + [duplicateTaskIds sortUsingSelector: @selector (compare:)]; + [uniquifiedSchedules sortUsingSelector: @selector (compareWithSchedule:)]; + [duplicateSchedules sortUsingSelector: @selector (compareWithSchedule:)]; + + // Ship 'em. + if (uniquifiedSchedulesToReturn != nil) { * uniquifiedSchedulesToReturn = uniquifiedSchedules; } + if (duplicateTaskIdsToReturn != nil) { * duplicateTaskIdsToReturn = duplicateTaskIds; } + if (duplicateSchedulesToReturn != nil) { * duplicateSchedulesToReturn = duplicateSchedules; } +} + +- (void) reportLoudlyAboutDuplicateTaskIds: (NSArray *) duplicateTaskIds + andTheSchedulesContainingThem: (NSArray *) schedulesContainingThoseIDs + fromSource: (APCScheduleSource) scheduleSource +{ + if (duplicateTaskIds.count) + { + NSString *errorMessage = nil; + + if (scheduleSource == APCScheduleSourceServer) + { + errorMessage = APCErrorMoreThanOneScheduleWithSameTaskIDSuggestion; + } + else + { + APCScheduleDebugPrinter *printer = [APCScheduleDebugPrinter new]; + + NSMutableString *message = [NSMutableString stringWithFormat: + @"\n\n============ error: duplicate task IDs =============\nMore than one schedule in the imported JSON data is referring to the same task ID. (Copy-and-paste error?)\n\nHere are the duplicate task IDs:\n"]; + + for (NSString *taskId in duplicateTaskIds) + { + [message appendFormat: @"- %@\n", taskId]; + } + + [printer printArrayOfSchedules: schedulesContainingThoseIDs + withLabel: @"\nHere are the schedules containing those IDs" + intoMutableString: message]; + + [message appendString: @"====================================================\n"]; + + errorMessage = message; + } + + NSError *errorForDuplicateTaskIds = [NSError errorWithCode: APCErrorMoreThanOneScheduleWithSameTaskIDCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorMoreThanOneScheduleWithSameTaskIDReason + recoverySuggestion: errorMessage + relatedFilePath: nil + relatedURL: nil + nestedError: nil + otherUserInfo: @{ kAPCErrorUserInfoKeyListOfDuplicatedTaskIDs : duplicateTaskIds }]; + + APCLogError2 (errorForDuplicateTaskIds); + +#if DEBUG + // If the app crashes here, you have duplicate + // task IDs in your JSON file. See console for + // details. + NSAssert (NO, errorMessage); +#endif + + } +} + +- (BOOL) updateTasksInSchedules: (NSArray *) schedulesThatAreAlreadyPerfect + fromIncomingData: (NSArray *) incomingScheduleAndTaskData +{ + BOOL result = NO; + + for (APCSchedule *schedule in schedulesThatAreAlreadyPerfect) + { + for (APCTask *task in schedule.tasks) + { + NSString *taskId = task.taskID; + NSNumber *taskVersion = task.taskVersionNumber; + NSDictionary *taskData = [self extractTaskDataFromIncomingListOfSchedulesAndTasks: incomingScheduleAndTaskData + withThisTaskId: taskId + andThisVersion: taskVersion]; + [self updateTask: task + withData: taskData]; + } + } + + return result; +} + +/** + Crawls through the dictionaries and arrays in the incoming + data until it finds a task dictionary containing the + specified id and version. + + Currently unexpected edge case: if more than one schedule + specifies a task with the same ID and version. Our world + is truly undefined if that happens; as a business rule, + it's not supposed to. So this method currently ignores + that situation -- it returns the first task data matching + the specified task and ID. + */ +- (NSDictionary *) extractTaskDataFromIncomingListOfSchedulesAndTasks: (NSArray *) incomingScheduleAndTaskData + withThisTaskId: (NSString *) taskId + andThisVersion: (NSNumber *) taskVersion +{ + NSDictionary *foundTaskData = nil; + NSMutableArray *taskDataWithSameIdAndVersion = [NSMutableArray new]; + + for (NSDictionary *scheduleData in incomingScheduleAndTaskData) + { + NSArray *tasksForThisSchedule = scheduleData [kScheduleListOfTasksKey]; + + for (NSDictionary *taskData in tasksForThisSchedule) + { + NSString *taskIdFromData = [self nilIfNull: taskData [kTaskIDKey]]; + NSNumber *taskVersionFromData = [self nilIfNull: taskData [kTaskVersionNumberKey]]; + + if ([self object1: taskId equalsObject2: taskIdFromData] && + [self object1: taskVersion equalsObject2: taskVersionFromData] ) + { + [taskDataWithSameIdAndVersion addObject: taskData]; + } + } + } + + if (taskDataWithSameIdAndVersion.count == 0) + { + // Truly should never happen, since we got the taskID + // and version from a previous pass through the data. + } + + else if (taskDataWithSameIdAndVersion.count == 1) + { + // This is what we were expecting. + foundTaskData = taskDataWithSameIdAndVersion.firstObject; + } + + else // .count > 1 + { + NSError *tooManyTasksWithSameIdAndVersion = [NSError errorWithCode: APCErrorInboundListOfSchedulesAndTasksIssuesCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorInboundListOfSchedulesAndTasksIssuesReason + recoverySuggestion: APCErrorInboundListOfSchedulesAndTasksIssuesSuggestion + relatedFilePath: nil + relatedURL: nil + nestedError: nil + otherUserInfo: @{ kTaskIDKey : [self nullIfNil: taskId], + kTaskVersionNumberKey : [self nullIfNil: taskVersion] }]; + APCLogError2 (tooManyTasksWithSameIdAndVersion); + + // Therefore, this is kinda undefined: + foundTaskData = taskDataWithSameIdAndVersion.firstObject; + } + + return foundTaskData; +} + + +/** + For future consideration: consider whether we'll ever need + to UNDO this operation. If so, we may want to add two + properties to the Schedule: something like + forcedTerminationDate and scheduleForcingTermination. And + change all our queries based on "effectiveEndDate" to use + that in addition or instead. Then, if we wanted to roll + back, we could simply nil out those two fields, and the + schedule would pop back into existence. + */ +- (void) disableSchedules: (NSArray *) schedulesToTerminate +{ + NSDate *endOfDayYesterday = self.systemDate.dayBefore.endOfDay; // 23:59:59 + + for (APCSchedule *schedule in schedulesToTerminate) + { + schedule.effectiveEndDate = endOfDayYesterday; + } +} + +- (void) deleteSchedulesButNotTasks: (NSArray *) schedulesToDelete + inContext: (NSManagedObjectContext *) context +{ + for (APCSchedule *schedule in schedulesToDelete) + { + [context deleteObject: schedule]; + } +} + +- (APCSchedule *) createOneScheduleAndItsTasksFromJsonData: (NSDictionary *) inboundScheduleData + fromSource: (APCScheduleSource) scheduleSource + usingContext: (NSManagedObjectContext *) context +{ + APCSchedule *schedule = [APCSchedule newObjectForContext: context]; + schedule.scheduleSource = @(scheduleSource); + + NSMutableDictionary *scheduleData = inboundScheduleData.mutableCopy; + + + // + // Pre-import data validation. + // + + id requestedStartDate = [self nilIfNull: scheduleData [kScheduleStartDateKey]]; + id requestedEndDate = [self nilIfNull: scheduleData [kScheduleEndDateKey]]; + id timesOfDay = [self nilIfNull: scheduleData [kScheduleTimesOfDayKey] ]; + + if ([requestedStartDate isKindOfClass: [NSString class]]) + { + requestedStartDate = [NSDate dateWithISO8601String: requestedStartDate]; + } + + if ([requestedEndDate isKindOfClass: [NSString class]]) + { + requestedEndDate = [NSDate dateWithISO8601String: requestedEndDate]; + } + + if ([timesOfDay isKindOfClass: [NSArray class]]) + { + timesOfDay = [self serializedTimesOfDayStringFromISO8601TimesOfDayInArray: timesOfDay]; + } + + scheduleData [kScheduleStartDateKey] = [self nullIfNil: requestedStartDate]; + scheduleData [kScheduleEndDateKey] = [self nullIfNil: requestedEndDate]; + scheduleData [kScheduleTimesOfDayKey] = [self nullIfNil: timesOfDay]; + + + + // + // Copy the data into our local object. Please alphabetize. + // + + schedule.delay = [self nilIfNull: scheduleData [kScheduleDelayKey]]; + schedule.endsOn = [self nilIfNull: scheduleData [kScheduleEndDateKey]]; + schedule.expires = [self nilIfNull: scheduleData [kScheduleExpiresKey]]; + schedule.interval = [self nilIfNull: scheduleData [kScheduleIntervalKey]]; + schedule.maxCount = [self nilIfNull: scheduleData [kScheduleMaxCountKey]]; + schedule.notes = [self nilIfNull: scheduleData [kScheduleNotesKey]]; + schedule.reminderMessage = [self nilIfNull: scheduleData [kScheduleReminderMessageKey]]; // if from Sage: "label" + schedule.reminderOffset = [self nilIfNull: scheduleData [kScheduleReminderOffsetKey]]; + schedule.scheduleString = [self nilIfNull: scheduleData [kScheduleStringKey]]; + schedule.scheduleType = [self nilIfNull: scheduleData [kScheduleTypeKey]]; + schedule.shouldRemind = [self nilIfNull: scheduleData [kScheduleShouldRemindKey]]; + schedule.startsOn = [self nilIfNull: scheduleData [kScheduleStartDateKey]]; + schedule.timesOfDay = [self nilIfNull: scheduleData [kScheduleTimesOfDayKey]]; + + + // + // Add data validation, defaults, and calculations. + // + + /* + Start date: this morning, at midnight, whenever "this + morning" is. NOT the app-installation time; that might + be months ago, which would not reflect the user's + experience of this schedule -- it didn't exist back + then. + */ + NSDate *beginningOfTime = self.systemDate.startOfDay; + + if (schedule.startsOn == nil) + { + schedule.startsOn = beginningOfTime; + } + + + /* + Effective start date = start date + delay. Then round + to midnight that morning. + */ + schedule.effectiveStartDate = schedule.startsOn; + + if (schedule.delay.length) + { + schedule.effectiveStartDate = [schedule.effectiveStartDate dateByAddingISO8601Duration: schedule.delay]; + schedule.effectiveStartDate = schedule.effectiveStartDate.dayBefore; + } + + schedule.effectiveStartDate = schedule.effectiveStartDate.startOfDay; + + + /* + Effective end date: if needed, iterate through this + schedule, finding its actual last moment. Then add + the expiration period ("grace period"), if needed -- + the amount of time before the last item expires. + The result is the last date of the schedule. + */ + NSDate *effectiveEndDate = schedule.endsOn; + + if (schedule.expires.length) + { + effectiveEndDate = [effectiveEndDate dateByAddingISO8601Duration: schedule.expires]; + } + + effectiveEndDate = effectiveEndDate.endOfDay; + schedule.effectiveEndDate = effectiveEndDate; + + + // + // Creating Tasks + // + NSArray *tasks = scheduleData [kScheduleListOfTasksKey]; + + for (NSDictionary *taskData in tasks) + { + APCTask *task = [self createOrUpdateTaskFromJsonData: taskData + inContext: context]; + if (task) + { + /* + This next method has a funky name because it's auto-generated + by Xcode's "Editor > Create Managed Object Subclass" command, + which (completely reasonably) doesn't seem to understand + English plurals. This should have been named -addOneTaskObject. + Instead, its name means, "add one object to the "tasks" + relationship." + */ + [schedule addTasksObject: task]; + } + } + + + // + // Done! + // + return schedule; +} + +/** + When we get data from a file or from the server, we first + convert it to a set of dictionaries. Each dictionary + contains one Schedule. That Schedule contains a list of + the Tasks the schedule should manage. Then we loop + through those Schedules, creating each one. Within that + "create schedule" method, we then loop through all the + Tasks it's supposed to manage, and create each of THOSE. + This method does that part: creates a single Task, when + we're looping through the list of tasks attached to + inbound schedule data. + */ +- (APCTask *) createOrUpdateTaskFromJsonData: (NSDictionary *) taskData + inContext: (NSManagedObjectContext *) context +{ + APCTask *task = nil; + NSString *taskId = [self nilIfNull: taskData [kTaskIDKey]]; + NSNumber *taskVersionNumber = [self nilIfNull: taskData [kTaskVersionNumberKey]]; + + NSError *errorFindingExistingTask = nil; + + task = [self taskWithId: taskId + versionNumber: taskVersionNumber + inContext: context + returningError: & errorFindingExistingTask]; + + if (task == nil) + { + task = [APCTask newObjectForContext: context]; + task.taskID = taskId; + task.taskVersionNumber = taskVersionNumber; + } + + [self updateTask: task + withData: taskData]; + + return task; +} + +- (void) updateTask: (APCTask *) task + withData: (NSDictionary *) taskData +{ + // + // Update the task with potentially new data + // (or add it for the first time, if we're creating a task). + // + task.taskHRef = [self nilIfNull: taskData [kTaskUrlKey]]; // Sage-only? + task.taskTitle = [self nilIfNull: taskData [kTaskTitleKey]]; // sage and us + task.sortString = [self nilIfNull: taskData [kTaskSortStringKey]]; // us-only, for now + task.taskClassName = [self nilIfNull: taskData [kTaskClassNameKey]]; // sage and us, because we add to sage + task.taskCompletionTimeString = [self nilIfNull: taskData [kTaskCompletionTimeStringKey]]; // us-only? + task.taskContentFileName = [self nilIfNull: taskData [kTaskFileNameKey]]; // us-only? + task.taskIsOptional = [self nilIfNull: taskData [kTaskIsOptionalKey]]; // us for now, Sage eventually? + + + if ([task.taskTitle stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]].length == 0) + { + APCLogDebug (@"\n-------------\nWARNING! About to create a Task with an empty title! taskData and task are: \n%@\n%@\n----------------", taskData, task); + NSLog (@""); + } + + if (task.taskContentFileName) + { + // This method spews errors as needed. + id survey = [self surveyFromFileBaseName: task.taskContentFileName]; + + if (survey) + { + task.rkTask = survey; + } + } +} + +- (APCTask *) taskWithId: (NSString *) taskId + versionNumber: (NSNumber *) versionNumber + inContext: (NSManagedObjectContext *) context + returningError: (NSError * __autoreleasing *) errorToReturn +{ + APCTask *task = nil; + NSError *localError = nil; + NSFetchRequest *searchForThisExactTask = [APCTask requestWithPredicate: [NSPredicate predicateWithFormat: @"%K == %@ && %K == %@", + NSStringFromSelector (@selector (taskID)), + taskId, + NSStringFromSelector (@selector (taskVersionNumber)), + versionNumber + ]]; + + NSError *errorSearchingForTasks = nil; + NSArray *possibleCopiesOfThisTask = [context executeFetchRequest: searchForThisExactTask + error: & errorSearchingForTasks]; + + /* + To test this check change the condition to check for non-nil + */ + if (! possibleCopiesOfThisTask) + { + localError = [NSError errorWithCode: APCErrorSearchingForTaskWithIDCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorSearchingForTaskWithIDReason + recoverySuggestion: APCErrorSearchingForTasksWithIDSuggestion + nestedError: errorSearchingForTasks]; + } + else if (possibleCopiesOfThisTask.count == 0) + { + // It actually doesn't exist. No problem. + } + else if (possibleCopiesOfThisTask.count == 1) + { + // Whew. Perfect. + task = possibleCopiesOfThisTask.firstObject; + } + else // more than one task with this ID and version + { + /* + This should literally never happen, because of this "if" block. + What do we we if it does? For now, yelp and continue. + */ + NSString *nameOfTaskIDField = NSStringFromSelector (@selector (taskID)); + NSString *nameOfTaskVersionField = NSStringFromSelector (@selector (taskVersionNumber)); + + NSError *whoopsTooManyTasksWithThisID = [NSError errorWithCode: APCErrorMoreThanOneTaskWithIdAndVersionCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorMoreThanOneTaskWithIdAndVersionReason + recoverySuggestion: APCErrorMoreThanOneTaskWithIdAndVersionSuggestion + relatedFilePath: nil + relatedURL: nil + nestedError: nil + otherUserInfo: @{ nameOfTaskIDField : [self nullIfNil: taskId], + nameOfTaskVersionField : [self nullIfNil: versionNumber] + }]; + + APCLogError2 (whoopsTooManyTasksWithThisID); + + // ...so this is undefined, kinda: + task = possibleCopiesOfThisTask.firstObject; + + // ...and we're about to return an error when we're also + // returning a valid object, which means the calling + // method won't expect this. In progress. + localError = whoopsTooManyTasksWithThisID; + } + + if (errorToReturn != nil) + { + * errorToReturn = localError; + } + + return task; +} + +- (id ) surveyFromFileBaseName: (NSString *) surveyContentFileBaseName +{ + id rkSurvey = nil; + + NSString *surveyFilePath = [[NSBundle mainBundle] pathForResource: surveyContentFileBaseName + ofType: kAPCFileExtension_JSON]; + + if (! surveyFilePath) + { + NSString *fullFileName = [NSString stringWithFormat: @"%@.%@", surveyContentFileBaseName, kAPCFileExtension_JSON]; + + NSError *errorFindingSurveyFile = [NSError errorWithCode: APCErrorCouldntFindSurveyFileCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorCouldntFindSurveyFileReason + recoverySuggestion: APCErrorCouldntFindSurveyFileSuggestion + relatedFilePath: fullFileName + relatedURL: nil + nestedError: nil]; + + APCLogError2 (errorFindingSurveyFile); + } + + else + { + NSError *errorLoadingSurveyFile = nil; + NSData *jsonData = [NSData dataWithContentsOfFile: surveyFilePath + options: 0 + error: & errorLoadingSurveyFile]; + + if (! jsonData) + { + NSError *error = [NSError errorWithCode: APCErrorLoadingSurveyFileCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorLoadingSurveyFileReason + recoverySuggestion: APCErrorLoadingSurveyFileSuggestion + nestedError: errorLoadingSurveyFile]; + + APCLogError2 (error); + } + + else + { + NSError *errorParsingSurveyContent = nil; + NSDictionary *surveyContent = [NSJSONSerialization JSONObjectWithData: jsonData + options: 0 + error: & errorParsingSurveyContent]; + if (! surveyContent) + { + NSError *error = [NSError errorWithCode: APCErrorParsingSurveyContentCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorParsingSurveyContentReason + recoverySuggestion: APCErrorParsingSurveyContentSuggestion + nestedError: errorParsingSurveyContent]; + + APCLogError2 (error); + } + + else + { + @try + { + id manager = SBBComponent(SBBSurveyManager); + SBBSurvey *survey = [[manager objectManager] objectFromBridgeJSON: surveyContent]; + rkSurvey = [APCTask rkTaskFromSBBSurvey: survey]; + } + @catch (NSException *exception) + { + NSError *error = [NSError errorWithCode: APCErrorLoadingNativeBridgeSurveyObjectCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorLoadingNativeBridgeSurveyObjectReason + recoverySuggestion: APCErrorLoadingNativeBridgeSurveyObjectSuggestion + relatedFilePath: surveyFilePath + relatedURL: nil + nestedError: nil + otherUserInfo: @{ @"exception": exception, + @"stackTrace": exception.callStackSymbols }]; + + APCLogError2 (error); + } + @finally + { + + } + } + } + } + + return rkSurvey; +} + + + + +// ========================================================= +#pragma mark - IV. MANAGING POTENTIAL AND SCHEDULED TASKS - +// ========================================================= + +/** + Generates a new Scheduled Task, when the user is about to + view it for the first time. + + Not yet sure what threads this is going to run on. + Ideally, all CoreData operations will happen in the + background on well-known queues. Unfortunately, a vast + chunk of the infrastructure of this project does stuff on + the main thread. and I'm trying to disturb as little as + possible as I make vast changes to the way it schedules + tasks. + */ +- (APCScheduledTask *) createScheduledTaskFromPotentialTask: (APCPotentialTask *) potentialTask +{ + APCSchedule *schedule = potentialTask.schedule; + NSDate *startDate = potentialTask.scheduledAppearanceDate; + NSString *expirationPeriod = schedule.expires; + NSDate *endDate = nil; + + if (expirationPeriod.length) + { + endDate = [startDate dateByAddingISO8601Duration: expirationPeriod]; + } + + APCScheduledTask *scheduledTask = [APCScheduledTask newObjectForContext: self.scheduleMOC]; + scheduledTask.generatedSchedule = potentialTask.schedule; + scheduledTask.task = potentialTask.task; + scheduledTask.startOn = startDate; + scheduledTask.endOn = endDate; + + NSError *errorSavingTask = nil; + BOOL savedSuccessfully = [scheduledTask saveToPersistentStore: & errorSavingTask]; + + if (! savedSuccessfully) + { + NSError *error = [NSError errorWithCode: APCErrorSavingToPeristentStoreCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorSavingToPeristentStoreReason + recoverySuggestion: APCErrorSavingToPeristentStoreSuggestion + nestedError: errorSavingTask]; + + APCLogError2 (error); + + [self deleteScheduledTask: scheduledTask]; + + scheduledTask = nil; + } + + + /* + Clear the taskGroup cache, so UIs (and anything else + depending on the cached taskGroups) draw correctly. + This operation is thread-safe. + */ + [self clearTaskGroupCache]; + + + return scheduledTask; +} + +/** + Not yet sure what threads this is going to run on. + Ideally, all CoreData operations will happen in the + background on well-known queues. Unfortunately, a vast + chunk of the infrastructure of this project does stuff on + the main thread, and I'm trying to disturb as little as + possible as I make vast changes to the way it schedules + tasks. + */ +- (void) deleteScheduledTask: (APCScheduledTask *) scheduledTask +{ + NSError *errorDeleting = nil; + [self.scheduleMOC deleteObject: scheduledTask]; + + BOOL deletedSuccessfully = [scheduledTask saveToPersistentStore: & errorDeleting]; + + if (! deletedSuccessfully) + { + NSError* error = [NSError errorWithCode: APCErrorDeletingTaskCode + domain: APCErrorDomainLoadingTasksAndSchedules + failureReason: APCErrorDeletingTaskReason + recoverySuggestion: APCErrorDeletingTaskSuggestion + nestedError: errorDeleting]; + + APCLogError2 (error); + } + + /* + Clear the taskGroup cache, so UIs (and anything else + depending on the cached taskGroups) draw correctly. + This operation is thread-safe. + */ + [self clearTaskGroupCache]; +} + + + + +// ========================================================= +#pragma mark - V. UTILITIES - +// ========================================================= + + + + +// --------------------------------------------------------- +#pragma mark - Replying to the method who called me +// --------------------------------------------------------- + +/** + A local utility function, which checks for nil in both the + callbackBlock and the queue before queueing that block on + that queue, solely so I don't have to repeat those "if" + clauses everywhere I do this. + */ +- (void) performFetchAndLoadCallback: (APCSchedulerCallbackForFetchAndLoadOperations) callbackBlock + onQueue: (NSOperationQueue *) queue + sendingError: (NSError *) error +{ + if (queue != nil && callbackBlock != nil) + { + [queue addOperationWithBlock: ^{ + callbackBlock (error); + }]; + } +} + + + +// --------------------------------------------------------- +#pragma mark - Wrapper around system date +// --------------------------------------------------------- + +/** + Internal method that returns the fakeSystemDate, if it's + been set and if we're in debug mode, or the real system + date otherwise. + */ +- (NSDate *) systemDate +{ + NSDate *date = nil; + + if ([APCUtilities isInDebuggingMode] && self.fakeSystemDate != nil) + { + date = self.fakeSystemDate; + } + else + { + date = [NSDate date]; + } + + return date; +} + +- (void) clearFakeSystemDate +{ + /* + queue this along with all other operations on our + internal queue. + */ + [self.queryQueue addOperationWithBlock:^{ + + self.fakeSystemDate = nil; + + }]; +} + + + +// --------------------------------------------------------- +#pragma mark - Default Values +// --------------------------------------------------------- + +/** + I'm hard-coding this because it serves a purpose: this + *is* the list of constants. + + I'd prefer to get these from a file. However, the JSON + parser we're using can't handle comments in a JSON file, + and, to me, those comments are crucial to our + understanding why we've chosen the settings we did. So + I'll put 'em here, where we can comment them cleanly. + */ +- (NSDictionary *) defaultScheduleValues +{ + NSNull *null = [NSNull null]; + + return @{ + kScheduleTypeKey : kScheduleTypeValueOnce, + kScheduleStringKey : null, + kTaskIDKey : null, + kScheduleExpiresKey : null, + kScheduleDelayKey : null, + kScheduleStartDateKey : null, + kScheduleEndDateKey : null, + }; +} + +- (NSDictionary *) defaultTaskValues +{ + return @{}; +} + + + +// --------------------------------------------------------- +#pragma mark - Are we talkin' to the server? +// --------------------------------------------------------- + +- (BOOL) isServerDisabled +{ + APCAppDelegate *app = [APCAppDelegate sharedAppDelegate]; + BOOL result = app.dataSubstrate.parameters.bypassServer; + +#if DEVELOPMENT + result = YES; +#endif + + return result; +} + + + +// --------------------------------------------------------- +#pragma mark - The TaskGroup Cache +// --------------------------------------------------------- + +/* + The three methods in this section use the "@synchronized" + keyword. This means precisely the following: + + - They read and change the same array. + + - They are called by a couple of methods from at least + 2 threads, and are frequently called at the same time. + + - Each change to that array takes several steps. + Those steps have to happen together if we want the + array and its contents to be make sense. + + - The app has SOME sort of architectural design flaw. + + If we designed things correctly, we should never need to + use @synchronized. The fact that we need it reveals an + architectural design problem. It's not a bug -- the app + works -- but it's something we should look at. This cache + exists because some of our CoreData accessor methods are + called frequently, and from the main thread. This + shouldn't happen. Instead, they should be redesigned to + request information from CoreData and EXPECT that call to + take forever. They should go about their business, and + only later, when a response comes back from CoreData, + should they repaint the screen (or do whatever else they + had to do) with the newly retrieved information. + Unfortunately, as I write this, that's not a set of bugs I + have to fix to solve the problems I'm currently working on + (centralizing all the math for doing Scheduling + calculations). So the @synchronized keyword lets me make + the main and background threads "play nice" together. + + A brief tutorial on how to use @synchronized: + + Here's a real-world analogy of when we'd use the + "@sychronized" keyword: Taking out the trash, at home, + in your kitchen. + + Let's say your normal procedure for taking out the trash + includes (a) pulling the old trash bag out of the trash + can, and (b) putting a new trash bag into the trash can. + There are a bunch of other steps, like realizing the bag + is full beforehand, and walking it down to the Dumpster + afterwards. But steps (a) and (b) show a crucial point. + Before you pull the old bag out (step a), or after you put + the new bag in (step b), anyone can put stuff in the trash + can. But if someone were to pop into the kitchen and put + something into the trash can during those crucial few + seconds between when you'd taken the old bag out and put + in the new bag, then the trash can would get smelly and + messy. So, in real life, if you're in the middle of that + process, and someone comes in to put throw something away, + you might tell 'em: "Hey, wait a sec, lemme put the new + bag in there, first." The @synchronized keyword does that: + it tells other threads to "hang on a sec" while you finish + a couple of things that *have* to happen at the same time. + + For that same reason, the stuff you do inside the + @synchronized block needs to be as short and fast as + possible. We wouldn't want to take out the trash bag, tie + it off, and traipse down to the end of the apartment + complex to throw it away, stopping to talk to the friendly + neighbors, BEFORE putting the new trash bag in -- if other + people in your family might need to use the trash can + during those couple of minutes. Likewise, stuff in the + @synchronized block should be as short and uncomplicated + as possible. It shouldn't call other methods, or have + dependencies on anything else in the system. + */ + +- (NSArray *) cachedTaskGroupsForDayOfDate: (NSDate *) date + forTasksMatchingFilter: (NSPredicate *) taskFilter +{ + APCTaskGroupCacheEntry *foundCacheEntry = nil; + + @synchronized (self.taskGroupCacheMutex) + { + for (APCTaskGroupCacheEntry *cacheEntry in self.taskGroupCache) + { + BOOL bothTaskFiltersAreNil = taskFilter == nil && cacheEntry.taskFilter == nil; + BOOL taskFiltersHaveSameDescription = [taskFilter.description isEqualToString: cacheEntry.taskFilter.description]; + + if ([date.startOfDay isEqualToDate: cacheEntry.date.startOfDay] && + (bothTaskFiltersAreNil || taskFiltersHaveSameDescription)) + { + foundCacheEntry = cacheEntry; + break; + } + } + } + + return foundCacheEntry.taskGroups; +} + +- (void) cacheTaskGroups: (NSArray *) taskGroups + forDate: (NSDate *) date + andFilter: (NSPredicate *) taskFilter +{ + @synchronized (self.taskGroupCacheMutex) + { + NSArray *cachedTaskGroups = [self cachedTaskGroupsForDayOfDate: date + forTasksMatchingFilter: taskFilter]; + + if (cachedTaskGroups == nil) + { + APCTaskGroupCacheEntry *cacheEntry = [[APCTaskGroupCacheEntry alloc] initWithDate: date + taskFilter: taskFilter + taskGroups: taskGroups]; + + APCLogDebug (@"Caching task groups: %@", cacheEntry); + + [self.taskGroupCache addObject: cacheEntry]; + } + } +} + +- (void) clearTaskGroupCache +{ + @synchronized (self.taskGroupCacheMutex) + { + APCLogDebug (@"Clearing the task-group cache."); + + self.taskGroupCache = [NSMutableArray new]; + } +} + + + +// --------------------------------------------------------- +#pragma mark - Utility Methods +// --------------------------------------------------------- + +- (APCAppDelegate *) appDelegate +{ + return [APCAppDelegate sharedAppDelegate]; +} + +- (NSManagedObjectContext *) managedObjectContext +{ + return self.scheduleMOC; +} + +/** + Performs a "practical" version of "isEqual", returning YES if + - both objects are nil, or + - [object1 isEqual: object2] + */ +- (BOOL) object1: (id) object1 + equalsObject2: (id) object2 +{ + return ((object1 == nil && object2 == nil) || [object1 isEqual: object2]); +} + +/** + Returns nil if the specified value is [NSNull null]. + Otherwise, returns the value itself. + + Used to extract values from an NSDictionary and treat them + as "nil" when that was the actual intent. + */ +- (id) nilIfNull: (id) someInputValue +{ + id outputValue = someInputValue; + + if (outputValue == [NSNull null]) + { + outputValue = nil; + } + + return outputValue; +} + +/** + Returns [NSNull null] if the specified value is + [NSNull null], so that we can insert the specified item + into a dictionary. Otherwise, returns the value itself. + */ +- (id) nullIfNil: (id) someInputValue +{ + id outputValue = someInputValue; + + if (outputValue == nil) + { + outputValue = [NSNull null]; + } + + return outputValue; +} + +- (NSArray *) arrayByFindingCommonElementsInScheduleArray: (NSArray *) scheduleList1 + andScheduleArray: (NSArray *) scheduleList2 + comparingObjectsUsingFields: (BOOL) shouldComparePointersNotFields +{ + // + // For debugging: sort them by title, so I can see what's going on. + // + scheduleList1 = [scheduleList1 sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + scheduleList2 = [scheduleList2 sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + + NSMutableArray *result = [NSMutableArray new]; + NSMutableArray *shorterCopyOfList2 = [NSArray arrayWithArray: scheduleList2].mutableCopy; + + for (APCSchedule *schedule1 in scheduleList1) + { + for (APCSchedule *schedule2 in shorterCopyOfList2) + { + BOOL theyreTheSame = [self schedule: schedule1 + isEquivalentToSchedule: schedule2 + comparingObjectsUsingFields: shouldComparePointersNotFields]; + + if (theyreTheSame) + { + [result addObject: schedule1]; + [shorterCopyOfList2 removeObject: schedule2]; + break; + } + } + } + + return result; +} + +- (NSArray *) arrayByRemovingElementsInScheduleArray: (NSArray *) stuffToRemove + fromScheduleArray: (NSArray *) stuffToKeep + comparingObjectsUsingFields: (BOOL) shouldCompareFieldsNotPointers +{ + + // + // For debugging: sort them by title, so I can see what's going on. + // + stuffToRemove = [stuffToRemove sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + stuffToKeep = [stuffToKeep sortedArrayUsingSelector: @selector (compareWithSchedule:)]; + + NSMutableArray *result = [NSMutableArray new]; + + for (APCSchedule *scheduleToKeep in stuffToKeep) + { + BOOL found = NO; + + for (APCSchedule *scheduleToRemove in stuffToRemove) + { + BOOL theyreTheSame = [self schedule: scheduleToKeep + isEquivalentToSchedule: scheduleToRemove + comparingObjectsUsingFields: shouldCompareFieldsNotPointers]; + + if (theyreTheSame) + { + found = YES; + break; + } + } + + if (! found) + { + [result addObject: scheduleToKeep]; + } + } + + return result; +} + +- (NSArray *) arrayByRemovingElementsInArray: (NSArray *) stuffToRemove + fromArray: (NSArray *) stuffToKeep + comparingObjectsUsingIsEqual: (BOOL) shouldCompareEqualityNotPointers +{ + NSMutableArray *result = [NSMutableArray new]; + + for (NSObject *thingyToKeep in stuffToKeep) + { + BOOL found = NO; + + for (NSObject *thingyToRemove in stuffToRemove) + { + BOOL theyreTheSame = (shouldCompareEqualityNotPointers ? + [thingyToKeep isEqual: thingyToRemove] : + thingyToKeep == thingyToRemove); + + if (theyreTheSame) + { + found = YES; + break; + } + } + + if (! found) + { + [result addObject: thingyToKeep]; + } + } + + return result; +} + +- (BOOL) schedule: (APCSchedule *) schedule1 + isEquivalentToSchedule: (APCSchedule *) schedule2 + comparingObjectsUsingFields: (BOOL) shouldCompareFieldsNotPointers +{ + BOOL schedulesAreEquivalent = NO; + + if (! shouldCompareFieldsNotPointers) + { + schedulesAreEquivalent = (schedule1 == schedule2); + } + else + { + BOOL propertiesAreEqual = ( + [self object1: schedule1.scheduleSource equalsObject2: schedule2.scheduleSource] && // server, disk, glucose log, etc. + [self object1: schedule1.scheduleType equalsObject2: schedule2.scheduleType] && // one-time, cron-based, interval-based + [self object1: schedule1.effectiveEndDate equalsObject2: schedule2.effectiveEndDate] && + [self object1: schedule1.delay equalsObject2: schedule2.delay] && // delay before first instance shows up on calendar + [self object1: schedule1.expires equalsObject2: schedule2.expires] && // delay before each instance vanishes from calendar + [self object1: schedule1.maxCount equalsObject2: schedule2.maxCount] && // max number of occurrences on calendar + [self object1: schedule1.notes equalsObject2: schedule2.notes] && + [self object1: schedule1.scheduleString equalsObject2: schedule2.scheduleString] && // the cron expression + [self object1: schedule1.shouldRemind equalsObject2: schedule2.shouldRemind] && + [self object1: schedule1.reminderMessage equalsObject2: schedule2.reminderMessage] && + [self object1: schedule1.reminderOffset equalsObject2: schedule2.reminderOffset] && + [self object1: schedule1.interval equalsObject2: schedule2.interval] && // time between appearances, like "3 months" + [self object1: schedule1.timesOfDay equalsObject2: schedule2.timesOfDay] && // list of times of day, if using intervals + + true // leave this at the end, to make it easier to rearrange the lines above + ); + + if (propertiesAreEqual && + (schedule1.tasks.count == schedule2.tasks.count) && + (schedule1.tasks.count > 0)) + { + /* + Up to here, they're identical. Past this point, we'll + look for something NOT different, and set this to NO + if found: + */ + schedulesAreEquivalent = YES; + + /* + We have the same number of tasks. Let's sort both lists of tasks + by ID and version, and then walk through them in order. If we find + any differences, one of the tasks is different from the other, which + is all we need to know. + + Sort them using an array of sort descriptors I declared at the top + of this file. We might call this method hundreds of times for a given + schedule download. We won't do that OFTEN, but there's no reason to + keep reallocating those sort descriptors every time that happens. + */ + NSArray *myTasks = [schedule1.tasks.allObjects sortedArrayUsingDescriptors: [APCTask defaultSortDescriptors]]; + NSArray *otherTasks = [schedule2.tasks.allObjects sortedArrayUsingDescriptors: [APCTask defaultSortDescriptors]]; + + for (NSUInteger taskIndex = 0; taskIndex < myTasks.count; taskIndex ++) + { + APCTask *myTask = myTasks [taskIndex]; + APCTask *otherTask = otherTasks [taskIndex]; + + if (! [self object1: myTask.taskID equalsObject2: otherTask.taskID] || + ! [self object1: myTask.taskVersionNumber equalsObject2: otherTask.taskVersionNumber]) + { + schedulesAreEquivalent = NO; + break; + } + } + } + } + + return schedulesAreEquivalent; +} + +- (NSString *) serializedTimesOfDayStringFromISO8601TimesOfDayInArray: (NSArray *) timesOfDay +{ + NSDateFormatter *formatter = [NSDateFormatter new]; + formatter.locale = [NSLocale localeWithLocaleIdentifier: @"en_US_POSIX"]; + + NSArray *legalFormats = @[@"H", + @"HH", + @"HH:mm", + @"HH:mm:SS", + @"HH:mm:SS.sss" + ]; + + NSString *result = nil; + NSMutableArray *arrayOfValidStrings = [NSMutableArray new]; + + if (timesOfDay != nil && [timesOfDay isKindOfClass: [NSArray class]]) + { + for (id thingy in timesOfDay) + { + NSString *inboundTimeString = nil; + + /* + Allow integers as times of day (3 = 3am, 14 = + 2pm, etc.) The spec only requests ISO8601 + strings, but I think this will make life + easier and equally practical, and it doesn't + cost us much. + */ + if ([thingy isKindOfClass: [NSNumber class]]) + { + NSNumber *value = thingy; + NSUInteger intValue = value.integerValue; + float floatValue = value.floatValue; + if (floatValue == (float) intValue && + intValue >= kAPCTimeFirstLegalISO8601HourOfDay && + intValue <= kAPCTimeLastLegalISO8601HourOfDay) + { + inboundTimeString = value.stringValue; + } + } + + else if ([thingy isKindOfClass: [NSString class]]) + { + inboundTimeString = thingy; + } + + else + { + // Ignore all other data types. + } + + if (inboundTimeString != nil) + { + NSDate *date = nil; + + for (NSString *format in legalFormats) + { + formatter.dateFormat = format; + date = [formatter dateFromString: inboundTimeString]; + + if (date != nil) + { + break; + } + } + + if (date != nil) + { + [arrayOfValidStrings addObject: inboundTimeString]; + } + } + } + } + + result = [arrayOfValidStrings componentsJoinedByString: @"|"]; + + if (result.length == 0) + { + result = nil; + } + + return result; +} + +- (NSArray *) deserializedArrayOfDurationsSinceMidnightFromISO8601TimesOfDayString: (NSString *) serializedTimesOfDayString +{ + NSDateFormatter *formatter = [NSDateFormatter new]; + formatter.locale = [NSLocale localeWithLocaleIdentifier: @"en_US_POSIX"]; + + NSArray *legalFormats = @[@"H", + @"HH", + @"HH:mm", + @"HH:mm:SS", + @"HH:mm:SS.sss" + ]; + + NSMutableArray *result = [NSMutableArray new]; + + NSArray *iso8601TimeStrings = [serializedTimesOfDayString componentsSeparatedByString: @"|"]; + + for (NSString *iso8601TimeString in iso8601TimeStrings) + { + NSDate *date = nil; + + for (NSString *format in legalFormats) + { + formatter.dateFormat = format; + date = [formatter dateFromString: iso8601TimeString]; + + if (date != nil) + { + break; + } + } + + if (date != nil) + { + NSDate *midnightOnThatDate = date.startOfDay; + NSTimeInterval secondsSinceMidnight = [date timeIntervalSinceDate: midnightOnThatDate]; + [result addObject: @(secondsSinceMidnight)]; + } + } + + if (result.count == 0) + { + result = nil; + } + + return result; +} + + +@end + + + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.h b/APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.h new file mode 100644 index 00000000..35743f72 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.h @@ -0,0 +1,64 @@ +// +// APCTaskGroupCacheEntry.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + + + +/** + Caches the taskGroups retrieved from CoreData for a + specific date range and filter. + + We need this because our main way of delivering lists of + tasks to the UI involves walking through the list of + active Schedules, and asking each schedule for the dates + and times its tasks should appear. At the lowest levels + of these calls, some operations are invoked tens of + thousands of times. This cache means we only need to + perform those operations a dozen times or so. The cache + is cleared when new schedules are retrieved from the + server, loaded from disk, computed, or otherwise + generated, as long as the call goes through our central + -processSchedulesAndTasks method. + */ +@interface APCTaskGroupCacheEntry : NSObject + +@property (nonatomic, strong) NSDate *date; +@property (nonatomic, strong) NSPredicate *taskFilter; +@property (nonatomic, strong) NSArray *taskGroups; + +- (instancetype) initWithDate: (NSDate *) date + taskFilter: (NSPredicate *) taskFilter + taskGroups: (NSArray *) taskGroups; + +@end diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.m b/APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.m new file mode 100644 index 00000000..c489a811 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCTaskGroupCacheEntry.m @@ -0,0 +1,65 @@ +// +// APCTaskGroupCacheEntry.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCTaskGroupCacheEntry.h" + +@implementation APCTaskGroupCacheEntry + +- (instancetype) initWithDate: (NSDate *) date + taskFilter: (NSPredicate *) taskFilter + taskGroups: (NSArray *) taskGroups +{ + self = [super init]; + + if (self) + { + _date = date; + _taskFilter = taskFilter; + _taskGroups = taskGroups; + } + + return self; +} + +- (NSString *) description +{ + NSString *result = [NSString stringWithFormat: @"CacheEntry with date %@, filter \"%@\", and %@ taskGroups.", + self.date, + self.taskFilter, + @(self.taskGroups.count) + ]; + + return result; +} + +@end diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.h b/APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.h new file mode 100644 index 00000000..a1c52ebb --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.h @@ -0,0 +1,80 @@ +// +// APCTopLevelScheduleEnumerator.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@class APCSchedule; +@class APCDateRange; + + + +/** + Enumerates over all dates in a Schedule, returning + DateRanges representing the amount of time each + scheduled item would appear on a calendar. + + This is a "top level" enumerator because of evolution. + We had a previous "schedule enumerator" which was as + appropriately generalized as we knew how to make it. + However, we now realize better and more appropriate + ways to generalize this. Soon, we'll rename all the + classes appropriately. In the meantime, this naming + convention doesn't lie, and helps us get there. + */ +@interface APCTopLevelScheduleEnumerator : NSEnumerator + +- (instancetype) initWithSchedule: (APCSchedule *) schedule + fromDate: (NSDate *) startDate + toDate: (NSDate *) endDate; + +/** + Returns -nextScheduledAppearance. + + This is the normal NSEnumerator interface for getting the + next thingy being enumerated. In this class, we return + date ranges. See -nextScheduledAppearance. + */ +- (NSDate *) nextObject; + +/** + This is the method called by -nextObject in this + enumerator. Returns the next "scheduled appearance" of + something on this Schedule -- the date and time where that + object would appear. + */ +- (NSDate *) nextScheduledAppearance; + +@end + + + diff --git a/APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.m b/APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.m new file mode 100644 index 00000000..5aac0601 --- /dev/null +++ b/APCAppCore/APCAppCore/Library/Scheduler/APCTopLevelScheduleEnumerator.m @@ -0,0 +1,205 @@ +// +// APCTopLevelScheduleEnumerator.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCTopLevelScheduleEnumerator.h" +#import "APCDateRange.h" +#import "APCSchedule+AddOn.h" +#import "APCScheduleEnumerator.h" +#import "APCScheduleIntervalEnumerator.h" +#import "NSDate+Helper.h" + + +@interface APCTopLevelScheduleEnumerator () + +- (instancetype) init NS_DESIGNATED_INITIALIZER; + +// The basics +@property (nonatomic, strong) APCSchedule *schedule; +@property (nonatomic, strong) NSDate *startDate; +@property (nonatomic, strong) NSDate *endDate; +@property (nonatomic, assign) APCScheduleRecurrenceStyle recurrenceStyle; + +// enumeration style #1: using cron expressions +@property (nonatomic, strong) NSString *originalCronExpression; +@property (nonatomic, strong) APCScheduleExpression *apcCronExpression; +@property (nonatomic, strong) APCScheduleEnumerator *apcCronExpressionEnumerator; + +// enumeration style #2: ISO 8601 (human-readable) time intervals +@property (nonatomic, strong) APCScheduleIntervalEnumerator *intervalEnumerator; + +/* + Optional max count of iterations. This is an NSNumber + to allow us to use "nil" to mean "not set." + */ +@property (nonatomic, strong) NSNumber *maxCount; +@property (nonatomic, assign) NSUInteger countOfTimesCalledSoFar; + +@end + + +@implementation APCTopLevelScheduleEnumerator + +- (instancetype) init +{ + self = [super init]; + + if (self) + { + _apcCronExpression = nil; + _apcCronExpressionEnumerator = nil; + _countOfTimesCalledSoFar = 0; + _endDate = nil; + _intervalEnumerator = nil; + _maxCount = nil; + _originalCronExpression = nil; + _recurrenceStyle = APCScheduleRecurrenceStyleExactlyOnce; + _schedule = nil; + _startDate = nil; + } + + return self; +} + +- (instancetype) initWithSchedule: (APCSchedule *) schedule + fromDate: (NSDate *) startDate + toDate: (NSDate *) endDate +{ + self = [self init]; + + if (self) + { + _endDate = endDate; + _maxCount = schedule.maxCount; + _originalCronExpression = schedule.scheduleString; + _schedule = schedule; + _startDate = startDate; + + // This is a computed property. + _recurrenceStyle = schedule.recurrenceStyle; + + switch (schedule.recurrenceStyle) + { + default: + case APCScheduleRecurrenceStyleExactlyOnce: + { + _maxCount = @(1); + break; + } + + case APCScheduleRecurrenceStyleCronExpression: + { + if (_originalCronExpression.length) + { + _apcCronExpression = schedule.scheduleExpression; + + _apcCronExpressionEnumerator = [_apcCronExpression enumeratorBeginningAtTime: startDate + endingAtTime: endDate]; + } + break; + } + + case APCScheduleRecurrenceStyleInterval: + { + _intervalEnumerator = [[APCScheduleIntervalEnumerator alloc] initWithSchedule: schedule + startDate: startDate + endDate: endDate]; + break; + } + } + } + + return self; +} + +- (NSDate *) nextObject +{ + return [self nextScheduledAppearance]; +} + +- (NSDate *) nextScheduledAppearance +{ + NSDate *appearanceDate = nil; + NSUInteger maxCount = self.maxCount.integerValue; + + if (self.schedule.recurrenceStyle == APCScheduleRecurrenceStyleExactlyOnce) + { + maxCount = 1; + } + + BOOL weNeedToWatchForMaxCount = maxCount > 0; + BOOL weHaveReachedMaxCount = (self.countOfTimesCalledSoFar >= maxCount); + + + if (weNeedToWatchForMaxCount && weHaveReachedMaxCount) + { + // We're done enumerating. Return nil. + appearanceDate = nil; + } + else + { + switch (self.recurrenceStyle) + { + default: + case APCScheduleRecurrenceStyleExactlyOnce: + appearanceDate = self.startDate; + break; + + case APCScheduleRecurrenceStyleCronExpression: + appearanceDate = self.apcCronExpressionEnumerator.nextScheduledDate; + break; + + case APCScheduleRecurrenceStyleInterval: + appearanceDate = self.intervalEnumerator.nextScheduledDate; + break; + } + } + + self.countOfTimesCalledSoFar = self.countOfTimesCalledSoFar + 1; + return appearanceDate; +} + +@end + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/Library/Scoring/APCScoring.h b/APCAppCore/APCAppCore/Library/Scoring/APCScoring.h index 57f6875a..bed64464 100644 --- a/APCAppCore/APCAppCore/Library/Scoring/APCScoring.h +++ b/APCAppCore/APCAppCore/Library/Scoring/APCScoring.h @@ -37,6 +37,7 @@ extern NSString *const kDatasetDateKey; extern NSString *const kDatasetValueKey; +extern NSString *const kDatasetRawDataKey; typedef NS_ENUM(NSUInteger, APHTimelineGroups) { diff --git a/APCAppCore/APCAppCore/Library/Scoring/APCScoring.m b/APCAppCore/APCAppCore/Library/Scoring/APCScoring.m index 268c5b37..6ca81f2f 100644 --- a/APCAppCore/APCAppCore/Library/Scoring/APCScoring.m +++ b/APCAppCore/APCAppCore/Library/Scoring/APCScoring.m @@ -47,11 +47,11 @@ static NSString *const kDatasetGroupByMonth = @"datasetGroupByMonth"; static NSString *const kDatasetGroupByYear = @"datasetGroupByYear"; -static NSInteger const kNumberOfDaysInWeek = 7; -static NSInteger const kNumberOfDaysInMonth = 30; -static NSInteger const kNumberOfDaysIn3Months = 90; -static NSInteger const kNumberOfDaysIn6Months = 180; -static NSInteger const kNumberOfDaysInYear = 365; +static NSInteger const kNumberOfDaysInWeek = 7; +static NSInteger const kNumberOfDaysInMonth = 30; +static NSInteger const kNumberOfDaysIn3Months = 90; +static NSInteger const __unused kNumberOfDaysIn6Months = 180; +static NSInteger const kNumberOfDaysInYear = 365; @interface APCScoring() @property (nonatomic, strong) APCScoring *correlatedScoring; @@ -321,7 +321,7 @@ - (void)updatePeriodForDays:(NSInteger)numberOfDays _numberOfDays = numberOfDays; __weak typeof(self) weakSelf = self; - + // Update the generated dataset to be inline with the timeline. self.dataPoints = [self dataPointsArrayForDays:_numberOfDays groupBy:_groupBy]; @@ -348,7 +348,7 @@ - (void)updatePeriodForDays:(NSInteger)numberOfDays latestOnly:self.latestOnly groupBy:groupBy completion:^{ - [weakSelf updateCharts]; + [weakSelf updateCharts]; }]; } @@ -356,7 +356,7 @@ - (void)updatePeriodForDays:(NSInteger)numberOfDays if (self.correlatedScoring) { [self.correlatedScoring updatePeriodForDays:numberOfDays groupBy:groupBy]; } - + } //should only be called by parent self of correlated data source @@ -369,7 +369,6 @@ - (void)correlateDataSources{ [self indexDataSeries:self.correlatedScoring.dataPoints]; } -//Called when user selects a new date range - (void)updateCharts{ dispatch_async(dispatch_get_main_queue(), ^{ @@ -379,11 +378,7 @@ - (void)updateCharts{ [self.weakParentScoring correlateDataSources]; } - //tell the APCGraphViewController to update its chart - if ([self.scoringDelegate respondsToSelector:@selector(graphViewControllerShouldUpdateChartWithScoring:)]) - { - [self.scoringDelegate graphViewControllerShouldUpdateChartWithScoring:self]; - } + [[NSNotificationCenter defaultCenter]postNotificationName:APCUpdateChartsNotification object:self]; }); } @@ -392,17 +387,16 @@ - (void)updateCharts{ /** @brief Add a series to correlate with an initialized APCScoring object's TaskId data series */ -- (void)correlateWithScoringObject:(APCScoring *)scoring +-(void)correlateWithScoringObject:(APCScoring *)scoring { self.correlatedScoring = scoring; self.correlatedScoring.weakParentScoring = self; [self correlateDataSources]; } -- (void)discardIncongruentArrayElements -{ +-(void)discardIncongruentArrayElements{ //arrays are NOT guaranteed to be the same length if queried with the same date range when one or more series is data from HealthKit - + //find the shortest array and difference in their counts NSMutableArray *shortestArray = self.dataPoints.count <= self.correlatedScoring.dataPoints.count ? self.dataPoints : self.correlatedScoring.dataPoints; NSMutableArray *longestArray = self.dataPoints.count >= self.correlatedScoring.dataPoints.count ? self.dataPoints : self.correlatedScoring.dataPoints; @@ -434,7 +428,7 @@ - (void)discardIncongruentArrayElements return NO; } }]; - + NSUInteger correlatedDataPointsIndex = [self.correlatedScoring.dataPoints indexOfObjectPassingTest:^BOOL(id obj, NSUInteger __unused idx, BOOL *stop) { if (![[(NSDictionary *)obj objectForKey:kDatasetValueKey] isEqualToNumber: @(NSNotFound)]) { *stop = YES; @@ -443,7 +437,7 @@ - (void)discardIncongruentArrayElements return NO; } }]; - + NSUInteger highestIndex = 0; if (dataPointsIndex >= correlatedDataPointsIndex) { highestIndex = dataPointsIndex; @@ -465,8 +459,7 @@ - (void)discardIncongruentArrayElements } } -- (void)indexDataSeries:(NSMutableArray *)series -{ +-(void)indexDataSeries:(NSMutableArray *)series{ NSDictionary *basePointObject; NSNumber *basePointValue = @0; @@ -483,13 +476,11 @@ - (void)indexDataSeries:(NSMutableArray *)series //loop over all elements calculating the point index NSNumber *index; for (NSUInteger i = 0; i < series.count; i++) { - - NSNumber *dataPoint = [(NSDictionary *)[series objectAtIndex:i] valueForKey:kDatasetValueKey]; + NSMutableDictionary *dictionary = [[series objectAtIndex:i] mutableCopy]; + NSNumber *dataPoint = [dictionary valueForKey:kDatasetValueKey]; float ind = dataPoint.floatValue / basePointValue.floatValue * 100; index = [NSNumber numberWithFloat:ind]; - if (![dataPoint isEqual: @(NSNotFound)]) { - NSMutableDictionary *dictionary = [[series objectAtIndex:i] mutableCopy]; [dictionary setValue:index forKey:kDatasetValueKey]; APCRangePoint *point = [[APCRangePoint alloc]initWithMinimumValue:ind maximumValue:ind]; [dictionary setValue:point forKey:kDatasetRangeValueKey]; @@ -499,8 +490,7 @@ - (void)indexDataSeries:(NSMutableArray *)series } //Notification added in correlateWithScoringObject() -- (void)dealloc -{ +-(void)dealloc{ [[NSNotificationCenter defaultCenter]removeObserver:self]; } @@ -813,13 +803,13 @@ - (NSDictionary *)summarizeDataset:(NSDictionary *)dataset period:(APHTimelineGr if (filteredDataPoints.count != 0) { dayAverage = itemSum / filteredDataPoints.count; } - + if (dayAverage == 0) { dayAverage = NSNotFound; } - + APCRangePoint *rangePoint = [APCRangePoint new]; - + if (dayAverage != NSNotFound) { NSNumber *minValue = [filteredDataPoints valueForKeyPath:@"@min.datasetValueKey"]; NSNumber *maxValue = [filteredDataPoints valueForKeyPath:@"@max.datasetValueKey"]; @@ -844,7 +834,6 @@ - (NSDictionary *)summarizeDataset:(NSDictionary *)dataset period:(APHTimelineGr - (NSDictionary *)groupByKeyPath:(NSString *)key dataset:(NSArray *)dataset { NSMutableDictionary *groups = [NSMutableDictionary new]; - //I'm not quite sure I follow why we're using integer values for specific keypaths for this, when we could much more easily use the timestamp on the object (which I hope exists) directly. Was this an attempt at a performance fix? for (id object in dataset) { id value = [object valueForKeyPath:key]; @@ -1142,7 +1131,7 @@ - (NSNumber *)minimumDataPoint - (NSNumber *)maximumDataPointInSeries:(NSArray *)series { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K <> %@", kDatasetValueKey, @(NSNotFound)]; - + NSArray *filteredArray = [series filteredArrayUsingPredicate:predicate]; NSArray *rangeArray = [filteredArray valueForKey:kDatasetRangeValueKey]; NSPredicate *rangePredicate = [NSPredicate predicateWithFormat:@"SELF <> %@", [NSNull null]]; @@ -1197,7 +1186,7 @@ - (id)nextObject self.current = 0; nextPoint = [self.dataPoints objectAtIndex:self.current++]; } - + return nextPoint; } @@ -1220,8 +1209,7 @@ - (NSNumber *)numberOfDataPoints #pragma mark - Common Graph Datasource /*********************************************************************************/ -- (NSInteger)numberOfPointsInPlot:(NSInteger)plotIndex -{ +- (NSInteger)numberOfPointsInPlot:(NSInteger)plotIndex{ NSInteger numberOfPoints = 0; if (plotIndex == 0) { @@ -1234,8 +1222,7 @@ - (NSInteger)numberOfPointsInPlot:(NSInteger)plotIndex return numberOfPoints; } -- (NSInteger)numberOfDivisionsInXAxis -{ +- (NSInteger)numberOfDivisionsInXAxis{ NSInteger numberOfDivs = [self.dataPoints count]; if (self.numberOfDays == -(kNumberOfDaysIn3Months - 1)) { @@ -1247,8 +1234,7 @@ - (NSInteger)numberOfDivisionsInXAxis return numberOfDivs; } -- (NSInteger)numberOfPlotsInGraph -{ +- (NSInteger)numberOfPlotsInGraph{ NSUInteger numberOfPlots = 1; if (self.correlatedScoring.dataPoints.count > 0) { @@ -1367,7 +1353,7 @@ - (NSInteger)numberOfDivisionsInXAxisForLineGraph:(APCLineGraphView *)__unused g #pragma mark APCDiscreteGraphViewDataSource /*********************************************************************************/ -- (NSInteger)numberOfPlotsInDiscreteGraph:(APCDiscreteGraphView *)__unused graphView +-(NSInteger)numberOfPlotsInDiscreteGraph:(APCDiscreteGraphView *)__unused graphView { return [self numberOfPlotsInGraph]; } @@ -1380,7 +1366,7 @@ - (NSInteger)discreteGraph:(APCDiscreteGraphView *) __unused graphView numberOfP - (APCRangePoint *)discreteGraph:(APCDiscreteGraphView *) __unused graphView plot:(NSInteger) plotIndex valueForPointAtIndex:(NSInteger) __unused pointIndex { - APCRangePoint *value; + APCRangePoint *value = nil; NSDictionary *point = [NSDictionary new]; if (plotIndex == 0) { diff --git a/APCAppCore/APCAppCore/Resources/get_debug_ip_address.sh b/APCAppCore/APCAppCore/Resources/get_debug_ip_address.sh index 1c33884e..70bc0d26 100755 --- a/APCAppCore/APCAppCore/Resources/get_debug_ip_address.sh +++ b/APCAppCore/APCAppCore/Resources/get_debug_ip_address.sh @@ -1,9 +1,38 @@ #!/bin/sh # -# get_debug_ip_address.sh -# AppCore +# get_debug_ip_address.sh +# AppCore # -# Copyright (c) 2015 Apple, Inc. All rights reserved. +# Copyright (c) 2015, Apple Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation and/or +# other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder(s) nor the names of any contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. No license is granted to the trademarks of +# the copyright holders even if such marks are included in this software. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + # # Extracts the IP address of the build machine and saves # it to a pseudo-environment variable which is loaded at @@ -28,11 +57,11 @@ # for the "[", above.) # -if [ "$CONFIGURATION" == "DebugAndSendToDataVerificationServer" ] +if [ "$CONFIGURATION" == "Debug" ] then # - # A little shell script to extract the build machine's IP address + # A little shell script to extract the build machine's IP address. # # Here's what each component of the line below does. Mentally split # it into pieces at each "|" ("pipe") character: diff --git a/APCAppCore/APCAppCore/Startup/APCAppDelegate.h b/APCAppCore/APCAppCore/Startup/APCAppDelegate.h index 919e2063..c277a8c0 100644 --- a/APCAppCore/APCAppCore/Startup/APCAppDelegate.h +++ b/APCAppCore/APCAppCore/Startup/APCAppDelegate.h @@ -44,8 +44,13 @@ extern NSUInteger const kTheEntireDataModelOfTheApp; @interface APCAppDelegate : UIResponder +/** + Casts the main application's app delegate as this type. + */ ++ (instancetype) sharedAppDelegate; + @property (nonatomic, strong) APCFitnessAllocation *sevenDayFitnessAllocationData; -@property (strong, nonatomic) UITabBarController *tabster; +@property (strong, nonatomic) UITabBarController *tabBarController; //APC Related Properties & Methods @property (strong, nonatomic) APCDataSubstrate * dataSubstrate; @@ -65,7 +70,6 @@ extern NSUInteger const kTheEntireDataModelOfTheApp; @property (nonatomic, strong) NSArray *storyboardIdInfo; -- (void)loadStaticTasksAndSchedulesIfNecessary; //For resetting app - (void) updateDBVersionStatus; - (void) clearNSUserDefaults; //For resetting app @@ -79,7 +83,7 @@ extern NSUInteger const kTheEntireDataModelOfTheApp; - (void) showNeedsEmailVerification; - (void) setUpRootViewController: (UIViewController*) viewController; - (void) setUpTasksReminder; -- (NSDictionary *) tasksAndSchedulesWillBeLoaded; + - (void)performMigrationFrom:(NSInteger)previousVersion currentVersion:(NSInteger)currentVersion; - (void)performMigrationAfterDataSubstrateFrom:(NSInteger)previousVersion currentVersion:(NSInteger)currentVersion; - (NSString *) applicationDocumentsDirectory; @@ -90,16 +94,13 @@ extern NSUInteger const kTheEntireDataModelOfTheApp; - (void) setUpAppAppearance; - (void) registerCatastrophicStartupError: (NSError *) error; -//For User in Subclasses - (void) signedInNotification:(NSNotification *)notification; - (void) signedUpNotification: (NSNotification*) notification; - (void) logOutNotification:(NSNotification *)notification; - -- (NSArray *)offsetForTaskSchedules; - (void)afterOnBoardProcessIsFinished; - (NSArray *)reviewConsentActions; - (NSArray *)allSetTextBlocks; -- (NSDictionary *)configureTasksForActivities; +- (BOOL)hideEmailOnWelcomeScreen; //To be called from Datasubstrate - (void) setUpCollectors; diff --git a/APCAppCore/APCAppCore/Startup/APCAppDelegate.m b/APCAppCore/APCAppCore/Startup/APCAppDelegate.m index c725569e..5bede9bc 100644 --- a/APCAppCore/APCAppCore/Startup/APCAppDelegate.m +++ b/APCAppCore/APCAppCore/Startup/APCAppDelegate.m @@ -1,4 +1,4 @@ -// +// // APCAppDelegate.m // APCAppCore // @@ -45,10 +45,8 @@ #import "APCDemographicUploader.h" #import "APCConstants.h" -/* - Be sure to set the CORRECT current version before releasing to production - */ -NSUInteger const kTheEntireDataModelOfTheApp = 3; +#warning Be sure to set the CORRECT current version before releasing to production +NSUInteger const kTheEntireDataModelOfTheApp = 4; /*********************************************************************************/ #pragma mark - Initializations Option Defaults @@ -71,26 +69,28 @@ /*********************************************************************************/ #pragma mark - User Defaults Keys /*********************************************************************************/ - -static NSString* const kDemographicDataWasUploadedKey = @"kDemographicDataWasUploadedKey"; static NSString* const kLastUsedTimeKey = @"APHLastUsedTime"; static NSString* const kAppWillEnterForegroundTimeKey = @"APCWillEnterForegroundTime"; -static NSUInteger const kIndexOfProfileTab = 3; - @interface APCAppDelegate ( ) @property (nonatomic) BOOL isPasscodeShowing; @property (nonatomic, strong) UIView *secureView; @property (nonatomic, strong) NSError *catastrophicStartupError; - @property (nonatomic, strong) NSOperationQueue *healthKitCollectorQueue; @property (nonatomic, strong) APCDemographicUploader *demographicUploader; -@end - +@end @implementation APCAppDelegate + ++ (instancetype) sharedAppDelegate +{ + APCAppDelegate *appDelegate = (APCAppDelegate *) [[UIApplication sharedApplication] delegate]; + return appDelegate; +} + + /*********************************************************************************/ #pragma mark - App Delegate Methods /*********************************************************************************/ @@ -108,7 +108,10 @@ - (BOOL) application: (UIApplication *) __unused application [self doGeneralInitialization]; [self initializeBridgeServerConnection]; [self initializeAppleCoreStack]; - [self loadStaticTasksAndSchedulesIfNecessary]; + + [self.scheduler loadTasksAndSchedulesFromDiskAndThenUseThisQueue: nil + toDoThisWhenDone: nil]; + [self registerNotifications]; [self setUpHKPermissions]; [self setUpAppAppearance]; @@ -116,7 +119,6 @@ - (BOOL) application: (UIApplication *) __unused application [self performDemographicUploadIfRequired]; [self showAppropriateVC]; - [self.dataMonitor appFinishedLaunching]; return YES; } @@ -142,13 +144,11 @@ - (void)performDemographicUploadIfRequired // APCUser *user = self.dataSubstrate.currentUser; if (user.isConsented) { - BOOL demographicDataWasUploaded = [defaults boolForKey:kDemographicDataWasUploadedKey]; + BOOL demographicDataWasUploaded = [defaults boolForKey:kAnonDemographicDataUploadedKey]; if (demographicDataWasUploaded == NO) { self.demographicUploader = [[APCDemographicUploader alloc] initWithUser:user]; - [defaults setBool:YES forKey:kDemographicDataWasUploadedKey]; - [defaults synchronize]; [self.demographicUploader uploadNonIdentifiableDemographicData]; -} + } } } @@ -169,6 +169,7 @@ - (void)performMigrationAfterDataSubstrateFrom:(NSInteger) __unused previousVers - (BOOL)application:(UIApplication *) __unused application didFinishLaunchingWithOptions:(NSDictionary *) __unused launchOptions { + [self.dataMonitor appFinishedLaunching]; return YES; } @@ -256,7 +257,6 @@ - (void) doGeneralInitialization if (fileSecurityPermissionsResetSuccessful == NO) { - APCLogDebug(@"Incomplete reset of file system security permissions"); APCLogError2(error); } @@ -307,7 +307,7 @@ - (BOOL)application:(UIApplication *) __unused application shouldSaveApplication - (BOOL)application:(UIApplication *) __unused application shouldRestoreApplicationState:(NSCoder *) __unused coder { - return self.dataSubstrate.currentUser.isSignedIn; + return NO; } - (UIViewController *)application:(UIApplication *) __unused application viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *) __unused coder @@ -317,12 +317,12 @@ - (UIViewController *)application:(UIApplication *) __unused application viewCon } else if ([identifierComponents.lastObject isEqualToString:@"ActivitiesNavController"]) { - return self.tabster.viewControllers[kIndexOfActivitesTab]; + return self.tabBarController.viewControllers[kAPCActivitiesTabIndex]; } else if ([identifierComponents.lastObject isEqualToString:@"APCActivityVC"]) { - if ( [self.tabster.viewControllers[kIndexOfActivitesTab] respondsToSelector:@selector(topViewController)]) { - return [(UINavigationController*) self.tabster.viewControllers[kIndexOfActivitesTab] topViewController]; + if ( [self.tabBarController.viewControllers[kAPCActivitiesTabIndex] respondsToSelector:@selector(topViewController)]) { + return [(UINavigationController*) self.tabBarController.viewControllers[kAPCActivitiesTabIndex] topViewController]; } } @@ -361,64 +361,15 @@ - (void) initializeAppleCoreStack self.scheduler = [[APCScheduler alloc] initWithDataSubstrate:self.dataSubstrate]; self.dataMonitor = [[APCDataMonitor alloc] initWithDataSubstrate:self.dataSubstrate scheduler:self.scheduler]; - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ - self.passiveDataCollector = [[APCPassiveDataCollector alloc] init]; - }); - //Setup AuthDelegate for SageSDK SBBAuthManager * manager = (SBBAuthManager*) SBBComponent(SBBAuthManager); manager.authDelegate = self.dataSubstrate.currentUser; } -- (void)loadStaticTasksAndSchedulesIfNecessary -{ - if (![APCDBStatus isSeedLoadedWithContext:self.dataSubstrate.persistentContext]) { - [APCDBStatus setSeedLoaded:self.initializationOptions[kDBStatusVersionKey] WithContext:self.dataSubstrate.persistentContext]; - NSString *resource = [[NSBundle mainBundle] pathForResource:self.initializationOptions[kTasksAndSchedulesJSONFileNameKey] ofType:@"json"]; - NSData *jsonData = [NSData dataWithContentsOfFile:resource]; - NSError * error; - NSDictionary * dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; - APCLogError2 (error); - - NSDictionary *manipulatedDictionary = [(APCAppDelegate*)[UIApplication sharedApplication].delegate tasksAndSchedulesWillBeLoaded]; - - if (manipulatedDictionary != nil) { - dictionary = manipulatedDictionary; - } - - [self.dataSubstrate loadStaticTasksAndSchedules:dictionary]; - [APCKeychainStore resetKeyChain]; - } - else - { - NSString * dbVersionStr = [APCDBStatus dbStatusVersionwithContext:self.dataSubstrate.persistentContext]; - if (![dbVersionStr isEqualToString:self.initializationOptions[kDBStatusVersionKey]]) { - [self updateDBVersionStatus]; - } - } -} - //This method is overridable from each app - (void) updateDBVersionStatus { - NSString *resource = [[NSBundle mainBundle] pathForResource:self.initializationOptions[kTasksAndSchedulesJSONFileNameKey] ofType:@"json"]; - NSData *jsonData = [NSData dataWithContentsOfFile:resource]; - NSError * error; - NSDictionary * dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; - APCLogError2 (error); - - //Deeper investigation needed for enabling tasksAndSchedulesWillBeLoaded - /*NSDictionary *manipulatedDictionary = [(APCAppDelegate*)[UIApplication sharedApplication].delegate tasksAndSchedulesWillBeLoaded]; - - if (manipulatedDictionary != nil) { - dictionary = manipulatedDictionary; - }*/ - - //Enabling refreshing of tasks JSON only. Schedules might be tricky as Apps could manipulate schedules after creation. - //More investigation needed - [APCTask updateTasksFromJSON:dictionary[@"tasks"] inContext:self.dataSubstrate.persistentContext]; - //[APCSchedule updateSchedulesFromJSON:dictionary[@"schedules"] inContext:self.dataSubstrate.persistentContext]; [APCDBStatus updateSeedLoaded:self.initializationOptions[kDBStatusVersionKey] WithContext:self.dataSubstrate.persistentContext]; } @@ -592,7 +543,7 @@ - (NSMutableArray*)consentSectionsAndHtmlContent:(NSString**)htmlContent NSURL* url = [[NSBundle mainBundle] URLForResource:nameWithScaleFactor withExtension:@"m4v"]; NSError* error = nil; - NSAssert([url checkResourceIsReachableAndReturnError:&error], @"Animation file--%@--not reachable: %@", animationUrl, error); + NSAssert([url checkResourceIsReachableAndReturnError:&error] == YES, @"Animation file--%@--not reachable: %@", animationUrl, error); section.customAnimationURL = url; } @@ -617,9 +568,8 @@ -(void)application:(UIApplication *)__unused application handleActionWithIdentif [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } completionHandler(); - } - - +} + - (NSArray *)offsetForTaskSchedules { //TODO: Number of days should be zero based. If I want something to show up on day 2 then the offset is 1 @@ -657,9 +607,11 @@ - (NSArray *)allSetTextBlocks return nil; } +// Ron: moving this to Schedule/Scheduler... +/* - (NSDictionary *)configureTasksForActivities { - /* Abstract implementation. Subclass to override. + / * Abstract implementation. Subclass to override. * * Use this to properly group your tasks into the three groups * that are now shown on the Activities tab. @@ -669,9 +621,19 @@ - (NSDictionary *)configureTasksForActivities * 3. Yesterday's incomplete tasks * * Note: This needs to be refactored - */ + * / return nil; } +*/ + +- (BOOL)hideEmailOnWelcomeScreen +{ + /* Abstract implementation. Subclass to override. + * + * To hide the email consent button on the Welcome screen return YES. + */ + return NO; +} /*********************************************************************************/ #pragma mark - Catastrophic startup errors @@ -774,10 +736,6 @@ - (void) setUpCollectors {/*Abstract Implementation*/} return nil; } -- (NSDictionary *) tasksAndSchedulesWillBeLoaded { - return nil; -} - /*********************************************************************************/ #pragma mark - Public Helpers /*********************************************************************************/ @@ -811,118 +769,106 @@ - (void) clearNSUserDefaults /*********************************************************************************/ #pragma mark - Tab Bar Stuff /*********************************************************************************/ -- (NSArray *)storyboardIdInfo -{ - if (!_storyboardIdInfo) { - _storyboardIdInfo = @[ - @{@"name": kActivitiesStoryBoardKey, @"bundle" : [NSBundle appleCoreBundle]}, - @{@"name": kDashBoardStoryBoardKey, @"bundle" : [NSBundle mainBundle]}, - @{@"name": kLearnStoryBoardKey, @"bundle" : [NSBundle appleCoreBundle]}, - @{@"name": kHealthProfileStoryBoardKey, @"bundle" : [NSBundle appleCoreBundle]} - ]; - } - return _storyboardIdInfo; -} - (void)showTabBar { - UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"TabBar" bundle:[NSBundle appleCoreBundle]]; + APCTabBarViewController *tabBarController = [[APCTabBarViewController alloc] init]; + + NSUInteger selectedItemIndex = kAPCActivitiesTabIndex; - UITabBarController *tabBarController = (UITabBarController *)[storyBoard instantiateInitialViewController]; - self.window.rootViewController = tabBarController; - tabBarController.delegate = self; + NSMutableArray *tabBarItems = [NSMutableArray new]; + NSMutableArray *viewControllers = [NSMutableArray new]; + + { + //Activities Tab + UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Activities", nil) image:[UIImage imageNamed:@"tab_activities"] selectedImage:[UIImage imageNamed:@"tab_activities_selected"]]; + [tabBarItems addObject:item]; + + UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"APCActivities" bundle:[NSBundle appleCoreBundle]]; + UIViewController *viewController = [storyboard instantiateInitialViewController]; + [viewControllers addObject:viewController]; + } - NSArray *items = tabBarController.tabBar.items; + { + //Dashboard Tab + UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Dashboard", nil) image:[UIImage imageNamed:@"tab_dashboard"] selectedImage:[UIImage imageNamed:@"tab_dashboard_selected"]]; + [tabBarItems addObject:item]; + + UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"APHDashboard" bundle:[NSBundle mainBundle]]; + UIViewController *viewController = [storyboard instantiateInitialViewController]; + [viewControllers addObject:viewController]; + } - NSUInteger selectedItemIndex = kIndexOfActivitesTab; + { + //Learn Tab + UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Learn", nil) image:[UIImage imageNamed:@"tab_learn"] selectedImage:[UIImage imageNamed:@"tab_learn_selected"]]; + [tabBarItems addObject:item]; + + UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"APCLearn" bundle:[NSBundle appleCoreBundle]]; + UIViewController *viewController = [storyboard instantiateInitialViewController]; + [viewControllers addObject:viewController]; + } - NSArray *deselectedImageNames = @[ @"tab_activities", @"tab_dashboard", @"tab_learn", @"tab_profile" ]; - NSArray *selectedImageNames = @[ @"tab_activities_selected", @"tab_dashboard_selected", @"tab_learn_selected", @"tab_profile_selected" ]; - NSArray *tabBarTitles = @[ @"Activities", @"Dashboard", @"Learn", @"Profile"]; + { + //Profile Tab + UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Profile", nil) image:[UIImage imageNamed:@"tab_profile"] selectedImage:[UIImage imageNamed:@"tab_profile_selected"]]; + [tabBarItems addObject:item]; + + UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"APCProfile" bundle:[NSBundle appleCoreBundle]]; + UIViewController *viewController = [storyboard instantiateInitialViewController]; + [viewControllers addObject:viewController]; + } + + [tabBarController setViewControllers:[NSArray arrayWithArray:viewControllers]]; + + NSArray *items = tabBarController.tabBar.items; for (NSUInteger i=0; i @property (nonatomic) BOOL isPasscodeShowing; @@ -66,6 +67,8 @@ - (void)passcodeViewControllerDidSucceed:(APCPasscodeViewController *)viewContro self.isPasscodeShowing = NO; self.showPasscodeScreen = NO; [viewController dismissViewControllerAnimated:YES completion:nil]; + [[NSUserDefaults standardUserDefaults] setObject: [NSDate date] forKey:kLastUsedTimeKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; if ([self.passcodeDelegate respondsToSelector:@selector(passcodeViewControllerDidSucceed:)]) { [self.passcodeDelegate passcodeViewControllerDidSucceed: viewController]; } diff --git a/APCAppCore/APCAppCore/Startup/Migration/APCTasksAndSchedulesMigrationUtility.m b/APCAppCore/APCAppCore/Startup/Migration/APCTasksAndSchedulesMigrationUtility.m index 9bcede15..94040ff8 100644 --- a/APCAppCore/APCAppCore/Startup/Migration/APCTasksAndSchedulesMigrationUtility.m +++ b/APCAppCore/APCAppCore/Startup/Migration/APCTasksAndSchedulesMigrationUtility.m @@ -82,35 +82,8 @@ - (NSDictionary *)sharedInit:(NSString *)tasksAndSchedulesFileName { return taskAndSchedules; } -- (void)migrateScheduleAndTasks { - //TODO check for tasks that are in the datasubstrate - /* Compare schedule expression if they exist */ - /* Delete if they exist in the datasubstrate and if they are no longer in the JSON */ - - - //TODO check for tasks in the dictionary that are not in the datasubstrate - /* Create if they are in the JSON and do not exist in the datasubstrate */ - - // jsonDictionary[@"tasks"] - // jsonDictionary[@"schedules"] - - if (self.needsMigration) { - [self.dataSubstrate loadStaticTasksAndSchedules:@{@"BLAH" : @"BLAH"}]; - } +- (void) migrateScheduleAndTasks +{ } -// This will eventually become code -//- (void)modifyTask:(NSString *)taskIdentifier scheduleExpression:(NSString *)expression { -// -//} -// -//- (void)deleteScheduledTask:(NSString *)taskIdentifier { -// -//} -// -//- (void)createTaskAndSchedule:(NSDictionary *)taskAndSchedule { -// -//} - - @end diff --git a/APCAppCore/APCAppCore/UI/Components/GraphCharts/APCCubicCurveAlgorithm.m b/APCAppCore/APCAppCore/UI/Components/GraphCharts/APCCubicCurveAlgorithm.m index e491fc5b..abe09e2f 100644 --- a/APCAppCore/APCAppCore/UI/Components/GraphCharts/APCCubicCurveAlgorithm.m +++ b/APCAppCore/APCAppCore/UI/Components/GraphCharts/APCCubicCurveAlgorithm.m @@ -57,7 +57,7 @@ - (NSArray *)emptyArrayTillLength:(NSUInteger)length { NSMutableArray *emptyArray = [NSMutableArray new]; - for (int i=0; i - + - + @@ -218,17 +218,34 @@ - + - + + + + + @@ -241,10 +258,11 @@ - + - + + @@ -264,54 +282,38 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - - - - - - - - - - - - - + + + + + + + - - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.h b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.h index b84e7bf9..43021a3b 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.h +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.h @@ -32,11 +32,10 @@ // #import -#import "APCGroupedScheduledTask.h" #import "APCActivitiesBasicTableViewCell.h" #import "APCActivitiesTintedTableViewCell.h" #import "APCActivitiesSectionHeaderView.h" -@interface APCActivitiesViewController : UITableViewController +@interface APCActivitiesViewController : UIViewController @end diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.m index 440a66c8..f0d31c0e 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.m +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewController.m @@ -1,4 +1,4 @@ -// +// // APCActivitiesViewController.m // APCAppCore // @@ -33,200 +33,203 @@ #import "APCActivitiesViewController.h" #import "APCAppCore.h" -#import "APCActivitiesViewWithNoTask.h" #import "APCCircularProgressView.h" #import "UIColor+APCAppearance.h" +#import "APCConstants.h" +#import "APCTaskGroup.h" +#import "APCActivitiesViewSection.h" +#import "APCUtilities.h" -static CGFloat kTintedCellHeight = 65; +static CGFloat kTintedCellHeight = 65; static CGFloat kTableViewSectionHeaderHeight = 77; +static NSString * const kAPCSampleGlucoseLogTaskAndScheduleFileName = @"APHSampleGlucoseLogTaskAndSchedule.json"; +static NSString * const kAPCListOfTimesMarker = @"LIST_OF_TIMES"; +static NSString * const kAPCListOfWeekdaysMarker = @"LIST_OF_WEEKDAYS"; +static NSString * const kAPCScheduleStringKey = @"scheduleString"; -typedef NS_ENUM(NSUInteger, APCActivitiesSections) -{ - APCActivitiesSectionToday = 0, - APCActivitiesSectionYesterday, - APCActivitiesSectionsTotalNumberOfSections -}; @interface APCActivitiesViewController () -@property (nonatomic) BOOL taskSelectionDisabled; +@property (nonatomic, strong) IBOutlet UITableView *tableView; +@property (nonatomic, weak) IBOutlet UILabel *noTasksLabel; -@property (strong, nonatomic) NSMutableArray *sectionsArray; -@property (strong, nonatomic) NSMutableArray *scheduledTasksArray; - -@property (strong, nonatomic) APCActivitiesViewWithNoTask *noTasksView; +@property (readonly) APCAppDelegate *appDelegate; +@property (readonly) APCActivitiesViewSection *todaySection; +@property (readonly) NSUInteger countOfRequiredTasksToday; +@property (readonly) NSUInteger countOfCompletedTasksToday; +@property (readonly) NSUInteger countOfRemainingTasksToday; +@property (readonly) UITabBarItem *myTabBarItem; @property (strong, nonatomic) NSDateFormatter *dateFormatter; +@property (nonatomic, strong) NSDate *lastKnownSystemDate; // to check for a change when we reappear +@property (nonatomic, strong) NSArray *sections; +@property (nonatomic, assign) BOOL isFetchingFromCoreDataRightNow; +@property (nonatomic, strong) UIRefreshControl *refreshControl; -// The below, tasksBySection and keepGoingTasks, are used only -// for filtering the tasks that should not appear in the 'Yesterday' -// section. Needless to say, we do need to refactor this bit of -// logic so that it is more flexible. -@property (strong, nonatomic) NSDictionary *tasksBySection; -@property (strong, nonatomic) NSMutableArray *keepGoingTasks; +@property (readonly) NSDate *dateWeAreUsingForToday; @end -@implementation APCActivitiesViewController -#pragma mark - Lazy Loading -- (NSMutableArray*) scheduledTasksArray -{ - if (!_scheduledTasksArray) { - _scheduledTasksArray = [NSMutableArray array]; - } - return _scheduledTasksArray; -} - -- (NSMutableArray *)sectionsArray -{ - if (!_sectionsArray) { - _sectionsArray = [NSMutableArray array]; - } - return _sectionsArray; -} +@implementation APCActivitiesViewController #pragma mark - Lifecycle -- (void)viewDidLoad +- (void) viewDidLoad { [super viewDidLoad]; - [self setupNotifications]; - + self.navigationItem.title = NSLocalizedString(@"Activities", @"Activities"); + self.tableView.backgroundColor = [UIColor appSecondaryColor4]; - - [self.tableView registerNib:[UINib nibWithNibName:@"APCActivitiesSectionHeaderView" bundle:[NSBundle appleCoreBundle]] forHeaderFooterViewReuseIdentifier:kAPCActivitiesSectionHeaderViewIdentifier]; - + + NSString *headerViewNibName = NSStringFromClass ([APCActivitiesSectionHeaderView class]); + + UINib *nib = [UINib nibWithNibName: headerViewNibName + bundle: [NSBundle appleCoreBundle]]; + + [self.tableView registerNib: nib forHeaderFooterViewReuseIdentifier: headerViewNibName]; + self.dateFormatter = [NSDateFormatter new]; - - self.keepGoingTasks = [NSMutableArray new]; - - APCAppDelegate * appDelegate = (APCAppDelegate*)[UIApplication sharedApplication].delegate; - self.tasksBySection = [appDelegate configureTasksForActivities]; + + [self configureRefreshControl]; + + // Set this to nil to trigger a refresh at the first opportunity. + self.lastKnownSystemDate = nil; } -- (void)viewWillAppear:(BOOL)animated +- (void) viewWillAppear: (BOOL) animated { - [super viewWillAppear:animated]; - + [super viewWillAppear: animated]; + + [self setupNotifications]; [self setUpNavigationBarAppearance]; - [self reloadData]; + + [self reloadTasksFromCoreData]; + [self checkForAndMaybeRespondToSystemDateChange]; + APCLogViewControllerAppeared(); } --(void) setupNotifications{ - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(reloadData) - name:APCUpdateActivityNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(updateActivities:) - name:APCDayChangedNotification object:nil]; -} +- (void) viewDidDisappear: (BOOL) animated +{ + [super viewDidDisappear: animated]; --(void)setUpNavigationBarAppearance{ - [self.navigationController.navigationBar setBarTintColor:[UIColor whiteColor]]; - self.navigationController.navigationBar.translucent = NO; + [self cancelNotifications]; } -- (void) viewDidAppear:(BOOL)animated +- (void) setupNotifications { - [super viewDidAppear:animated]; + // Fires when one day rolls over to the next. + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector (checkForAndMaybeRespondToSystemDateChange) + name: APCDayChangedNotification + object: nil]; + + // ...but that only happens every minute or so. This lets us respond much faster. + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector (checkForAndMaybeRespondToSystemDateChange) + name: UIApplicationWillEnterForegroundNotification + object: nil]; + + // ...but that only happens every minute or so. This lets us respond much faster. + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector (checkForAndMaybeRespondToSystemDateChange) + name: UIApplicationDidBecomeActiveNotification + object: nil]; } -- (void)viewDidDisappear:(BOOL)animated +- (void) cancelNotifications { - [super viewDidDisappear:animated]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; + [[NSNotificationCenter defaultCenter] removeObserver: self]; } -#pragma mark - UITableViewDataSource Methods - -- (NSInteger)numberOfSectionsInTableView:(UITableView *) __unused tableView +/** + Sets up the pull-to-refresh control at the top of the TableView. + If/when we go back to being a subclass of UITableViewController, + we can remove this. + */ +- (void) configureRefreshControl { - return self.sectionsArray.count; + self.refreshControl = [UIRefreshControl new]; + + [self.refreshControl addTarget: self + action: @selector (fetchNewestSurveysAndTasksFromServer:) + forControlEvents: UIControlEventValueChanged]; + + [self.tableView addSubview: self.refreshControl]; } -- (NSInteger)tableView:(UITableView *) __unused tableView numberOfRowsInSection:(NSInteger)section +- (void) setUpNavigationBarAppearance { - return ((NSArray*)self.scheduledTasksArray[section]).count; + [self.navigationController.navigationBar setBarTintColor: [UIColor whiteColor]]; + + self.navigationController.navigationBar.translucent = NO; } -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath + + +// --------------------------------------------------------- +#pragma mark - Responding to changes in system state +// --------------------------------------------------------- + +- (void) checkForAndMaybeRespondToSystemDateChange { - static NSString *medicationTrackerTaskId = @"a-APHMedicationTracker-20EF8ED2-E461-4C20-9024-F43FCAAAF4C3"; - - id task = ((NSArray*)self.scheduledTasksArray[indexPath.section])[indexPath.row]; - - APCGroupedScheduledTask *groupedScheduledTask; - APCScheduledTask *scheduledTask; - NSString * taskCompletionTimeString; - - if ([task isKindOfClass:[APCGroupedScheduledTask class]]) - { - groupedScheduledTask = (APCGroupedScheduledTask *)task; - taskCompletionTimeString = groupedScheduledTask.taskCompletionTimeString; - } - else if ([task isKindOfClass:[APCScheduledTask class]]) - { - scheduledTask = (APCScheduledTask *)task; - taskCompletionTimeString = scheduledTask.task.taskCompletionTimeString; - } - - APCActivitiesTintedTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: kAPCActivitiesTintedTableViewCellIdentifier]; - - if (taskCompletionTimeString) { - cell.subTitleLabel.text = taskCompletionTimeString; - cell.hidesSubTitle = NO; - } else { - cell.hidesSubTitle = YES; - } + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - if ([task isKindOfClass:[APCGroupedScheduledTask class]]) - { - cell.titleLabel.text = groupedScheduledTask.taskTitle; - NSUInteger tasksCount = groupedScheduledTask.scheduledTasks.count; - NSUInteger completedTasksCount = groupedScheduledTask.completedTasksCount; - - if (tasksCount == completedTasksCount) { - cell.countLabel.text = nil; - cell.countLabel.hidden = YES; - } else { - NSUInteger remaining = tasksCount - completedTasksCount; - cell.countLabel.text = [NSString stringWithFormat:@"%lu", (unsigned long)remaining]; - cell.countLabel.hidden = NO; - } - - - cell.confirmationView.completed = groupedScheduledTask.complete; - - APCScheduledTask *firstTask = groupedScheduledTask.scheduledTasks.firstObject; - cell.tintColor = [UIColor colorForTaskId:firstTask.task.taskID]; - } - else if ([task isKindOfClass:[APCScheduledTask class]]) - { - cell.titleLabel.text = scheduledTask.task.taskTitle; - if ([scheduledTask.task.taskID isEqualToString:medicationTrackerTaskId] == NO) { - cell.confirmationView.completed = scheduledTask.completed.boolValue; + NSDate *now = self.dateWeAreUsingForToday; + + if (self.lastKnownSystemDate == nil || ! [now isSameDayAsDate: self.lastKnownSystemDate]) + { + APCLogDebug (@"Handling date changes (Activities): Last-known date has changed. Resetting dates, refreshing server content, and refreshing UI."); + + self.lastKnownSystemDate = now; + + // First, get the current stuff from CoreData. + // Then we'll also check with the server. + [self reloadTasksFromCoreData]; + + // And now go grab the newest copy of data from the world. + [self fetchNewestSurveysAndTasksFromServer: nil]; } - cell.countLabel.text = nil; - cell.countLabel.hidden = YES; - cell.tintColor = [UIColor colorForTaskId:scheduledTask.task.taskID]; - } - - if (indexPath.section == APCActivitiesSectionYesterday) { - [cell setupIncompleteAppearance]; - } else { - [cell setupAppearance]; - } - - return cell; + }]; +} + + + +// --------------------------------------------------------- +#pragma mark - Displaying the table cells +// --------------------------------------------------------- + +- (NSInteger) numberOfSectionsInTableView: (UITableView *) __unused tableView +{ + return self.sections.count; } -#pragma mark - UITableViewDelegate Methods +- (NSInteger) tableView: (UITableView *) __unused tableView + numberOfRowsInSection: (NSInteger) sectionNumber +{ + APCActivitiesViewSection *section = [self sectionForSectionNumber: sectionNumber]; + NSInteger count = section.taskGroups.count; + return count; +} + +- (UITableViewCell *) tableView: (UITableView *) tableView + cellForRowAtIndexPath: (NSIndexPath *) indexPath +{ + APCActivitiesViewSection *section = [self sectionForCellAtIndexPath: indexPath]; + APCTaskGroup *taskGroupForThisRow = [self taskGroupForCellAtIndexPath: indexPath]; + APCActivitiesTintedTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: kAPCActivitiesTintedTableViewCellIdentifier]; + + [cell configureWithTaskGroup: taskGroupForThisRow + isTodayCell: section.isTodaySection + showDebuggingInfo: NO + ]; + + return cell; +} - (CGFloat) tableView: (UITableView *) __unused tableView heightForRowAtIndexPath: (NSIndexPath *) __unused indexPath @@ -237,370 +240,450 @@ - (CGFloat) tableView: (UITableView *) __unused tableView - (CGFloat) tableView: (UITableView *) __unused tableView heightForHeaderInSection: (NSInteger) __unused section { - CGFloat height = kTableViewSectionHeaderHeight; - - if (section == APCActivitiesSectionToday) { - height -= 15; - } - return height; + return kTableViewSectionHeaderHeight; } -- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section +- (UIView *) tableView: (UITableView *) tableView + viewForHeaderInSection: (NSInteger) sectionNumber { - APCActivitiesSectionHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:kAPCActivitiesSectionHeaderViewIdentifier]; - - - switch (section) { - case APCActivitiesSectionToday: - { - [self.dateFormatter setDateFormat:@"MMMM d"]; - headerView.titleLabel.text = [NSString stringWithFormat:@"%@, %@", NSLocalizedString(@"Today", @""), [self.dateFormatter stringFromDate:[NSDate date]] ]; - headerView.subTitleLabel.text = NSLocalizedString(@"To start an activity, select from the list below.", @""); - } - break; - case APCActivitiesSectionYesterday: - { - headerView.titleLabel.text = NSLocalizedString(@"Yesterday", @""); - headerView.subTitleLabel.text = NSLocalizedString(@"Below are your incomplete tasks from yesterday. These are for reference only.", @""); - } - break; + NSString *headerViewIdentifier = NSStringFromClass ([APCActivitiesSectionHeaderView class]); + APCActivitiesSectionHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier: headerViewIdentifier]; + APCActivitiesViewSection *section = [self sectionForSectionNumber: sectionNumber]; - - default: // Keep going - { - headerView.titleLabel.text = NSLocalizedString(@"Keep Going!", @"Keep going"); - headerView.subTitleLabel.text = NSLocalizedString(@"Try one of these extra activities, to enchance your experience in your study.", - @"Try one of these extra activities, to enchance your experience in your study."); - } - break; - } + headerView.titleLabel.text = section.title; + headerView.subTitleLabel.text = section.subtitle; - return headerView; } - (BOOL) tableView: (UITableView *) __unused tableView shouldHighlightRowAtIndexPath: (NSIndexPath *) indexPath { - return indexPath.section != 1; + return [self allowSelectionAtIndexPath: indexPath]; } -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +- (BOOL) allowSelectionAtIndexPath: (NSIndexPath *) indexPath { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - - if (indexPath.section != APCActivitiesSectionYesterday) { - if (!self.taskSelectionDisabled) { - - id task = ((NSArray*)self.scheduledTasksArray[indexPath.section])[indexPath.row]; - - if ([task isKindOfClass:[APCGroupedScheduledTask class]]) { - - APCGroupedScheduledTask *groupedScheduledTask = (APCGroupedScheduledTask *)task; - - NSString *taskClass = groupedScheduledTask.taskClassName; - - Class class = [NSClassFromString(taskClass) class]; - - if (class != [NSNull class]) - { - NSInteger taskIndex = -1; - - for (NSUInteger i =0; i 0) { - [self.sectionsArray addObject:[self formattedTodaySection]]; - - NSArray *todaysTaskList = [self removeTaskWhenHardwareNotAvailble:scheduledTasksDict[@"today"]]; - - NSArray * groupedArray = [self generateGroupsForTask:todaysTaskList]; - - NSArray *sortedTasks = [self sortTasksInArray:groupedArray]; - - [self.scheduledTasksArray addObject:sortedTasks]; + APCActivitiesViewSection *section = nil; + + if (self.sections.count > sectionNumber) + { + section = self.sections [sectionNumber]; } - - if (((NSArray*)scheduledTasksDict[@"yesterday"]).count > 0) { - NSArray *yesterdaysTaskList = [self removeTasksFromTaskList:scheduledTasksDict[@"yesterday"]]; - - if (yesterdaysTaskList.count > 0) { - [self.sectionsArray addObject:@"Yesterday - Incomplete Tasks"]; - - NSArray * groupedArray = [self generateGroupsForTask:yesterdaysTaskList]; - - NSArray *sortedTasks = [self sortTasksInArray:groupedArray]; - - [self.scheduledTasksArray addObject:sortedTasks]; + + return section; } + +- (APCTaskGroup *) taskGroupForCellAtIndexPath: (NSIndexPath *) indexPath +{ + APCTaskGroup *taskGroup = nil; + NSUInteger indexOfTaskGroupWeWant = indexPath.row; + NSUInteger indexOfSectionWeWant = indexPath.section; + APCActivitiesViewSection *section = [self sectionForSectionNumber: indexOfSectionWeWant]; + + if (section.taskGroups.count > indexOfTaskGroupWeWant) + { + taskGroup = section.taskGroups [indexOfTaskGroupWeWant]; } + + return taskGroup; } -- (NSArray *)sortTasksInArray:(NSArray *)unsortedTasks +- (NSUInteger) countOfRequiredTasksToday { - //NOTE: The task identifiers (taskID) start with a sort field. If you want to change the sort order change the identifiers within the file(s) currently named APHTasksAndSchedules.json and APHTasksAndSchedules_NoM7.json. - NSSortDescriptor* descriptorForSorting = [[NSSortDescriptor alloc]initWithKey:@"task.taskID" ascending:YES]; - NSArray* sortDescriptors = @[descriptorForSorting]; - NSArray* sortedArray = [unsortedTasks sortedArrayUsingDescriptors:sortDescriptors]; - - return sortedArray; + NSUInteger result = 0; + APCActivitiesViewSection *section = self.todaySection; + + for (APCTaskGroup *group in section.taskGroups) + { + result += group.totalRequiredTasksForThisTimeRange; + } + + return result; } -- (NSString*) formattedTodaySection +- (NSUInteger) countOfCompletedTasksToday { - [self.dateFormatter setDateFormat:@"MMMM d"]; - - return [NSString stringWithFormat:@"Today, %@", [self.dateFormatter stringFromDate:[NSDate date]]]; + NSUInteger result = 0; + APCActivitiesViewSection *section = self.todaySection; + + for (APCTaskGroup *group in section.taskGroups) + { + result += group.requiredCompletedTasks.count; + } + + return result; } -- (NSArray*)generateGroupsForTask:(NSArray *)ungroupedScheduledTasks +- (NSUInteger) countOfRemainingTasksToday { - NSMutableArray *taskTypesArray = [[NSMutableArray alloc] init]; - - /* Get the list of task Ids to group */ - for (APCScheduledTask *scheduledTask in ungroupedScheduledTasks) { - NSString *taskId = scheduledTask.task.taskID; - - if (taskId) { - if (![taskTypesArray containsObject:taskId]) { - [taskTypesArray addObject:taskId]; - } - } + NSUInteger result = 0; + APCActivitiesViewSection *section = self.todaySection; + + for (APCTaskGroup *group in section.taskGroups) + { + result += group.requiredRemainingTasks.count; } - - NSMutableArray * returnArray = [NSMutableArray array]; - /* group tasks by task Id */ - for (NSString *taskId in taskTypesArray) { - - NSPredicate *predicate = [NSPredicate predicateWithFormat:@"task.taskID == %@", taskId]; - - NSArray *filteredTasksArray = [ungroupedScheduledTasks filteredArrayUsingPredicate:predicate]; - - //if there is more than 1 task for the taskID, create an APCGroupedScheduledTask - if (filteredTasksArray.count > 1) { - APCScheduledTask *scheduledTask = filteredTasksArray.firstObject; - APCGroupedScheduledTask *groupedTask = [[APCGroupedScheduledTask alloc] init]; - - groupedTask.scheduledTasks = [NSMutableArray arrayWithArray:filteredTasksArray]; - groupedTask.taskTitle = scheduledTask.task.taskTitle; - groupedTask.taskClassName = scheduledTask.task.taskClassName; - groupedTask.taskCompletionTimeString = scheduledTask.task.taskCompletionTimeString; - - [returnArray addObject:groupedTask]; - } - else if(filteredTasksArray.count == 1) + + return result; +} + + + +// --------------------------------------------------------- +#pragma mark - Outbound messages +// --------------------------------------------------------- + +/* + This view does a query that other people need. + One thing they need is the number of required and + completed tasks for "today." Update them. + */ +- (void) reportNewTaskTotals +{ + NSUInteger requiredTasks = self.countOfRequiredTasksToday; + NSUInteger completedTasks = self.countOfCompletedTasksToday; + + [self.appDelegate.dataSubstrate updateCountOfTotalRequiredTasksForToday: requiredTasks + andTotalCompletedTasksToday: completedTasks]; +} + + + +// --------------------------------------------------------- +#pragma mark - Reloading data from Sage +// --------------------------------------------------------- + +/** + The method called by this method sends a notification + which has us update the screen. + */ +- (void) fetchNewestSurveysAndTasksFromServer: (id) __unused sender +{ + __weak APCActivitiesViewController * weakSelf = self; + + [self.appDelegate.dataMonitor refreshFromBridgeOnCompletion: ^(NSError *error) { + + if (error != nil) { - [returnArray addObject:filteredTasksArray.firstObject]; + // TODO: handle this error alert more intelligently. + UIAlertController * alert = [UIAlertController simpleAlertWithTitle: @"Error" + message: error.localizedDescription]; + + [weakSelf presentViewController: alert + animated: YES + completion: NULL]; } - } - return returnArray; + + [weakSelf reloadTasksFromCoreData]; + }]; } -/** @brief Removes the tasks (provide via the self.tasksBySection property) from the provided task list. - * - * @param taskList - Array of APCScheduledTask. This list will be filtered - * - * @return A filtered array of APCScheduledTask; otherwise the original array is returned. - * - * @note This needs to be refactored. - */ -- (NSArray *)removeTasksFromTaskList:(NSArray *)taskList + + +// --------------------------------------------------------- +#pragma mark - Repainting the UI +// --------------------------------------------------------- + +/** + This is just the "reload the UI" bit. It gets called when + the view loads (or will soon) and after each server load. + It does NOT do a server call itself (or, by the time I'm + done with it, a database call). + */ +- (void) updateWholeUI { - NSArray *keepGoingTasks = self.tasksBySection[kActivitiesSectionKeepGoing]; - NSMutableArray *filteredList = [taskList mutableCopy]; + [self.refreshControl endRefreshing]; + [self performSelector:@selector(dismiss) withObject:self afterDelay:0.5]; + [self configureNoTasksView]; + [self updateBadge]; - for (APCScheduledTask *scheduledTask in taskList) { - if (keepGoingTasks) { - if ([keepGoingTasks containsObject:scheduledTask.task.taskID]) { - [filteredList removeObject:scheduledTask]; - [self.keepGoingTasks addObject:scheduledTask]; - } - } - } + [self.tableView reloadData]; - return filteredList; } -/** @brief When the hardware that is required by task that is not present on the device - * the task will be removed from the provided task list. - * - * @param taskList - Array of APCScheduledTask. This list will be filtered - * - * @return A filtered array of APCScheduledTask; otherwise the original array is returned. - * - * @note This needs to be refactored. - */ -- (NSArray *)removeTaskWhenHardwareNotAvailble:(NSArray *)taskList +- (void)dismiss { - NSMutableArray *filteredList = [taskList mutableCopy]; + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void) updateBadge +{ + NSString *badgeValue = nil; + NSUInteger remainingTasks = self.countOfRemainingTasksToday; + + if (remainingTasks > 0) + { + badgeValue = @(remainingTasks).stringValue; + } + + self.myTabBarItem.badgeValue = badgeValue; +} + + + +// --------------------------------------------------------- +#pragma mark - The "no tasks at this time" view. +// --------------------------------------------------------- + +- (void) configureNoTasksView +{ + //only add the noTasksView if there are no activities to show + if (self.sections.count == 0 && ! self.isFetchingFromCoreDataRightNow) { + [self.view bringSubviewToFront:self.noTasksLabel]; + [self.noTasksLabel setHidden:NO]; + }else{ + [self.noTasksLabel setHidden:YES]; + } - if ([APCDeviceHardware isMotionActivityAvailable] == NO) { - NSArray *hardwareDependentTasks = self.tasksBySection[kActivitiesRequiresMotionSensor]; - - for (APCScheduledTask *scheduledTask in taskList) { - if (hardwareDependentTasks) { - if ([hardwareDependentTasks containsObject:scheduledTask.task.taskID]) { - [filteredList removeObject:scheduledTask]; - } - } +} + +// --------------------------------------------------------- +#pragma mark - Fetching current tasks from CoreData (NOT from server) +// --------------------------------------------------------- + +- (void) reloadTasksFromCoreData +{ + self.isFetchingFromCoreDataRightNow = YES; + APCSpinnerViewController *spinnerController = [[APCSpinnerViewController alloc] init]; + [self presentViewController:spinnerController animated:YES completion:nil]; + + NSPredicate *filterForOptionalTasks = [NSPredicate predicateWithFormat: @"%K == %@", + NSStringFromSelector(@selector(taskIsOptional)), + @(YES)]; + + NSPredicate *filterForRequiredTasks = [NSPredicate predicateWithFormat: @"%K == nil || %K == %@", + NSStringFromSelector(@selector(taskIsOptional)), + NSStringFromSelector(@selector(taskIsOptional)), + @(NO)]; + + NSDate *today = self.dateWeAreUsingForToday; + NSDate *yesterday = today.dayBefore; + NSDate *midnightThisMorning = today.startOfDay; + BOOL sortNewestToOldest = YES; + + __weak typeof(self) weakSelf = self; + + [[APCScheduler defaultScheduler] fetchTaskGroupsFromDate: yesterday + toDate: today + forTasksMatchingFilter: filterForRequiredTasks + usingQueue: [NSOperationQueue mainQueue] + toReportResults: ^(NSDictionary *taskGroups, NSError * __unused queryError) + { + + APCActivitiesViewSection *todaySection = nil; + NSUInteger indexOfTodaySection = NSNotFound; + + NSMutableArray *sections = [NSMutableArray new]; + + NSArray *sortedDates = [taskGroups.allKeys sortedArrayUsingComparator: ^NSComparisonResult (NSDate *date1, NSDate *date2) { + + NSComparisonResult result = (sortNewestToOldest ? + [date2 compare: date1] : + [date1 compare: date2] ); + return result; + }]; + + for (NSUInteger dateIndex = 0; dateIndex < sortedDates.count; dateIndex ++) + { + NSDate *date = sortedDates [dateIndex]; + NSArray *taskGroupsForThisDate = taskGroups [date]; + APCActivitiesViewSection *section = [[APCActivitiesViewSection alloc] initWithDate: date + tasks: taskGroupsForThisDate + usingDateForSystemDate: today]; + + if (section.isTodaySection) + { + todaySection = section; + } + else if (section.isYesterdaySection) + { + [section removeFullyCompletedTasks]; + } + + if (section.taskGroups.count) + { + [sections addObject: section]; + } + + if ([date isEqualToDate: midnightThisMorning]) + { + indexOfTodaySection = dateIndex; + } + } + + /* + Now that we've gotten all tasks for all the dates we care about, + get the "optional" tasks for "today" (or the date we formally + believe is "today"), and insert them between "today" and + "yesterday" (if available, or at the bottom of the list of + sections, if not). + */ + [[APCScheduler defaultScheduler] fetchTaskGroupsFromDate: today + toDate: today + forTasksMatchingFilter: filterForOptionalTasks + usingQueue: [NSOperationQueue mainQueue] + toReportResults: ^(NSDictionary *taskGroups, NSError * __unused queryError) + { + /* + There should be exactly one date in the list + of groups, and thus one list of values. + */ + NSArray *optionalTaskGroups = taskGroups.allValues.firstObject; + + if (optionalTaskGroups.count) + { + APCActivitiesViewSection *section = [[APCActivitiesViewSection alloc] initAsKeepGoingSectionWithTasks: optionalTaskGroups]; + + if (indexOfTodaySection == NSNotFound) + { + [sections addObject: section]; + } + else + { + [sections insertObject: section atIndex: indexOfTodaySection + 1]; + } + } + + + // + // Regardless of whether we got any optional + // groups, show everything, now. + // + weakSelf.sections = sections; + + + // + // Update central data points, so other screens + // can draw their graphics and whatnot. + // + [weakSelf reportNewTaskTotals]; + + //we always fetch optional tasks. When this second fetch is complete, updateWholeUI + weakSelf.isFetchingFromCoreDataRightNow = NO; + [weakSelf updateWholeUI]; + + }]; // second fetch: optional tasks + }]; // first fetch: required tasks, for a range of dates +} // method reloadFromCoreData + + + +// --------------------------------------------------------- +#pragma mark - Utilities +// --------------------------------------------------------- + +- (APCAppDelegate *) appDelegate +{ + return [APCAppDelegate sharedAppDelegate]; +} + +- (NSDate *) dateWeAreUsingForToday +{ + return [NSDate date]; +} + +- (UITabBarItem *) myTabBarItem +{ + UITabBarItem *activitiesTab = nil; + UITabBar *tabBar = self.appDelegate.tabBarController.tabBar; + + for (UITabBarItem *item in tabBar.items) + { + if (item.tag == (NSInteger) kAPCActivitiesTabIndex) + { + activitiesTab = item; + break; } } - - return filteredList; + + return activitiesTab; } @end diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.h b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.h new file mode 100644 index 00000000..2f4eeeaa --- /dev/null +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.h @@ -0,0 +1,62 @@ +// +// APCActivitiesViewSection.h +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import + +@interface APCActivitiesViewSection : NSObject + +@property (nonatomic, strong) NSDate *date; +@property (nonatomic, assign) BOOL isKeepGoingSection; +@property (nonatomic, strong) NSDate *presumedSystemDate; +@property (nonatomic, strong) NSArray *taskGroups; +@property (readonly) BOOL isTodaySection; +@property (readonly) BOOL isYesterdaySection; +@property (readonly) BOOL isEmpty; +@property (readonly) NSString *title; +@property (readonly) NSString *subtitle; + +- (instancetype) initWithDate: (NSDate *) date + tasks: (NSArray *) arrayOfTaskGroupObjects + usingDateForSystemDate: (NSDate *) potentiallyFakeSystemDate; + +- (instancetype) initAsKeepGoingSectionWithTasks: (NSArray *) arrayOfTaskGroupObjects; + +/** + Used after fetching the tasks for a specific day -- + the "yesterday," as perceived by the user -- and + converting resulting section to a "here's the stuff + you didn't finish" section. + */ +- (void) removeFullyCompletedTasks; + +@end diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.m new file mode 100644 index 00000000..0addc098 --- /dev/null +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Activities/APCActivitiesViewSection.m @@ -0,0 +1,210 @@ +// +// APCActivitiesViewSection.m +// APCAppCore +// +// Copyright (c) 2015, Apple Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder(s) nor the names of any contributors +// may be used to endorse or promote products derived from this software without +// specific prior written permission. No license is granted to the trademarks of +// the copyright holders even if such marks are included in this software. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#import "APCActivitiesViewSection.h" +#import "NSDate+Helper.h" +#import "APCTaskGroup.h" + +static NSDateFormatter *headerViewDateFormatterDebugging = nil; +static NSDateFormatter *headerViewDateFormatterToday = nil; + +static NSString * const kAPCSectionTitleToday = @"Today"; +static NSString * const kAPCSectionTitleYesterday = @"Yesterday"; +static NSString * const kAPCSectionTitleTomorrow = @"Tomorrow"; +static NSString * const kAPCSectionTitleKeepGoing = @"Keep Going!"; +static NSString * const kAPCSectionSubtitleKeepGoing = @"Try one of these extra activities\nto enhance your experience in your study."; +static NSString * const kAPCSectionSubtitleToday = @"To start an activity, select from the list below."; +static NSString * const kAPCSectionSubtitleYesterday = @"Below are your incomplete tasks from yesterday. These are for reference only."; +static NSString * const kAPCSectionHeaderDateFormatDebugging = @"eeee, MMMM d, yyyy"; +static NSString * const kAPCSectionHeaderDateFormatToday = @"eeee, MMMM d"; + + +@interface APCActivitiesViewSection () + +- (instancetype) init NS_DESIGNATED_INITIALIZER; + +@property (readonly) NSDate *yesterday; +@property (readonly) NSDate *today; +@property (readonly) NSDate *tomorrow; +@property (readonly) NSDate *myDateRoundedToMidnight; +@end + + +@implementation APCActivitiesViewSection + ++ (void) initialize +{ + if (headerViewDateFormatterDebugging == nil) + { + headerViewDateFormatterDebugging = [NSDateFormatter new]; + headerViewDateFormatterDebugging.timeZone = [NSTimeZone localTimeZone]; + headerViewDateFormatterDebugging.dateFormat = kAPCSectionHeaderDateFormatDebugging; + + headerViewDateFormatterToday = [NSDateFormatter new]; + headerViewDateFormatterToday.timeZone = [NSTimeZone localTimeZone]; + headerViewDateFormatterToday.dateFormat = kAPCSectionHeaderDateFormatToday; + } +} + +- (instancetype) init +{ + self = [super init]; + + if (self) + { + _date = nil; + _isKeepGoingSection = NO; + _presumedSystemDate = nil; + _taskGroups = nil; + } + + return self; +} + +- (instancetype) initWithDate: (NSDate *) date + tasks: (NSArray *) arrayOfTaskGroupObjects + usingDateForSystemDate: (NSDate *) potentiallyFakeSystemDate +{ + self = [self init]; + + if (self) + { + _date = date; + _taskGroups = arrayOfTaskGroupObjects; + _presumedSystemDate = potentiallyFakeSystemDate; + } + + return self; +} + +- (instancetype) initAsKeepGoingSectionWithTasks: (NSArray *) arrayOfTaskGroupObjects +{ + self = [self init]; + + if (self) + { + _isKeepGoingSection = YES; + _taskGroups = arrayOfTaskGroupObjects; + } + + return self; +} + +- (NSDate *) today +{ + return self.presumedSystemDate.startOfDay; +} + +- (NSDate *) tomorrow +{ + return self.presumedSystemDate.dayAfter.startOfDay; +} + +- (NSDate *) yesterday +{ + return self.presumedSystemDate.dayBefore.startOfDay; +} + +- (NSDate *) myDateRoundedToMidnight +{ + return self.date.startOfDay; +} + +- (BOOL) isTodaySection +{ + BOOL isToday = [self.myDateRoundedToMidnight isEqualToDate: self.today]; + return isToday; +} + +- (BOOL) isYesterdaySection +{ + BOOL isYesterday = [self.myDateRoundedToMidnight isEqualToDate: self.yesterday]; + return isYesterday; +} + +- (BOOL) isEmpty +{ + return self.taskGroups.count == 0; +} + +- (NSString *) title +{ + NSString *todayTitle = [NSString stringWithFormat: @"%@, %@", kAPCSectionTitleToday, [headerViewDateFormatterToday stringFromDate: self.myDateRoundedToMidnight]]; + + NSString *result = (self.isKeepGoingSection ? kAPCSectionTitleKeepGoing : + [self.myDateRoundedToMidnight isEqualToDate: self.today] ? todayTitle : + [self.myDateRoundedToMidnight isEqualToDate: self.yesterday] ? kAPCSectionTitleYesterday : + [self.myDateRoundedToMidnight isEqualToDate: self.tomorrow] ? kAPCSectionTitleTomorrow : + [headerViewDateFormatterDebugging stringFromDate: self.myDateRoundedToMidnight] + ); + + return result; +} + +- (NSString *) subtitle +{ + NSString *result = (self.isKeepGoingSection ? kAPCSectionSubtitleKeepGoing : + [self.myDateRoundedToMidnight isEqualToDate: self.today] ? kAPCSectionSubtitleToday : + [self.myDateRoundedToMidnight isEqualToDate: self.yesterday] ? kAPCSectionSubtitleYesterday : + nil + ); + + return result; +} + +- (void) removeFullyCompletedTasks +{ + /* + I gotta say, this is pretty cool: using a "predicate" + to run a method on every object in the array, based + on which we can remove elements from the array, using + a syntax that looks like SQL, kinda, and trusting + Objective-C to do this efficiently. Purrrrrrty! + + The method we're running on every object in the array + is -isFullyCompleted. The objects in the array are + APCTaskGroups. Objective-C converts the @(YES) in the + predicate into the Boolean that's actually returned + by -isFullyCompleted. + */ + NSPredicate *filterToRemoveCompletedTasks = [NSPredicate predicateWithFormat: @"%K != %@", + NSStringFromSelector (@selector (isFullyCompleted)), + @(YES)]; + + NSArray *newListOfTaskGroups = [self.taskGroups filteredArrayUsingPredicate: filterToRemoveCompletedTasks]; + + self.taskGroups = newListOfTaskGroups; +} + + +@end diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardEditViewController.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardEditViewController.m index 41ac5c8d..2d6f0c74 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardEditViewController.m +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardEditViewController.m @@ -103,7 +103,7 @@ - (void) tableView: (UITableView *) __unused tableView [self.rowItemsOrder removeObjectAtIndex:sourceIndexPath.row]; [self.rowItemsOrder insertObject:rowTypeNumber atIndex:destinationIndexPath.row]; - // update the items array to reflect the updated item order. + // Update the order of the items array to match the updated row order. APCTableViewDashboardItem *selectedItem = [self.items objectAtIndex:sourceIndexPath.row]; [self.items removeObjectAtIndex:sourceIndexPath.row]; diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardViewController.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardViewController.m index c990367b..33fdce6b 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardViewController.m +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCDashboardViewController.m @@ -304,7 +304,7 @@ - (void)tableView:(UITableView *)__unused tableView willDisplayCell:(UITableView [graphView setNeedsLayout]; [graphView layoutIfNeeded]; [graphView refreshGraph]; -} + } } #pragma mark - APCBaseGraphViewDelegate methods diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.h b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.h index ea686162..8908a056 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.h +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.h @@ -67,4 +67,4 @@ @property (weak, nonatomic) IBOutlet UIImageView *averageImageView; -@end +@end \ No newline at end of file diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.m index 71ee09da..0ae14f75 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.m +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Dashboard/APCGraphViewController.m @@ -240,4 +240,4 @@ -(void)graphViewControllerShouldUpdateChartWithScoring:(APCScoring *)__unused sc [self reloadCharts]; } -@end +@end \ No newline at end of file diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearn.storyboard b/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearn.storyboard index d516c924..f2fde79d 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearn.storyboard +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearn.storyboard @@ -1,7 +1,7 @@ - + - + @@ -81,14 +81,14 @@ - + - - + + @@ -105,14 +105,14 @@ - + + - + - - + @@ -189,7 +189,7 @@ - + diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearnMasterViewController.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearnMasterViewController.m index 26fd2591..1b318aee 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearnMasterViewController.m +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Learn/APCLearnMasterViewController.m @@ -1,4 +1,4 @@ -// +// // APCLearnMasterViewController.m // APCAppCore // @@ -144,6 +144,9 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath } break; case kAPCTableViewLearnItemTypeReviewConsent: + { + [self showConsent]; + } break; case kAPCTableViewLearnItemTypeOtherDetails: @@ -182,6 +185,17 @@ - (CGFloat) tableView: (UITableView *) __unused tableView return height; } +#pragma mark - Consent + +- (void)showConsent +{ + self.consentVC = [((APCAppDelegate *)[UIApplication sharedApplication].delegate) consentViewController]; + + self.consentVC.delegate = self; + [self presentViewController:self.consentVC animated:YES completion:nil]; + +} + #pragma mark - TaskViewController Delegate methods //If the TaskViewController has claimed the task delegate, we will be returned control here diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCDemographicUploader.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCDemographicUploader.m index db2bf161..1b24cc41 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCDemographicUploader.m +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCDemographicUploader.m @@ -32,11 +32,10 @@ // #import "APCDemographicUploader.h" - #import "APCAppCore.h" #import "APCAllSetTableViewCell.h" -#import "APCDataArchiverAndUploader.h" #import "NSDate+Helper.h" +#import "APCDataUploader.h" static NSString *kTaskIdentifierKey = @"NonIdentifiableDemographicsTask"; @@ -49,6 +48,7 @@ static NSString *kPatientWeightPoundsKey = @"patientWeightPounds"; static NSString *kPatientWakeUpTimeKey = @"patientWakeUpTime"; static NSString *kPatientGoSleepTimeKey = @"patientGoSleepTime"; +static NSString *kuploadRef = @"Demographic Data"; @interface APCDemographicUploader ( ) @@ -109,10 +109,20 @@ - (void)uploadNonIdentifiableDemographicData demographics[kPatientWeightPoundsKey] = @(weightInPounds); } - [APCDataArchiverAndUploader uploadDictionary:demographics - withTaskIdentifier:kTaskIdentifierKey - andTaskRunUuid:nil]; - + //Upload + APCDataUploader *uploader = [[APCDataUploader alloc]initWithUploadReference:kuploadRef]; + + dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ + + [uploader insertIntoZipArchive:demographics filename:kNonIdentifiableDemographicsKey]; + + [uploader uploadWithCompletion:^{ + + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kAnonDemographicDataUploadedKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + }]; + }); } @end diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfile.storyboard b/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfile.storyboard index e16048a7..b430eea2 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfile.storyboard +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfile.storyboard @@ -1,7 +1,7 @@ - + - + @@ -151,7 +151,6 @@ - @@ -160,13 +159,14 @@ + - + @@ -176,7 +176,6 @@ - @@ -205,7 +204,7 @@ - + @@ -215,42 +214,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -277,7 +240,7 @@ - + @@ -288,6 +251,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfileViewController.m b/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfileViewController.m index 8b44d1e0..ac69b253 100644 --- a/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfileViewController.m +++ b/APCAppCore/APCAppCore/UI/TabBarControllers/Profile/APCProfileViewController.m @@ -60,7 +60,9 @@ #import "UIFont+APCAppearance.h" #import "NSDate+Helper.h" #import "NSBundle+Helper.h" +#import "APCWithdrawCompleteViewController.h" #import "NSError+APCAdditions.h" +#import "APCSettingsViewController.h" #import "APCUser+UserData.h" #import "APCUser+Bridge.h" #import "UIAlertController+Helper.h" @@ -173,9 +175,11 @@ - (void)viewWillDisappear:(BOOL)animated - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { NSInteger count = self.items.count; + NSInteger profileExtenderSections = 0; - if ([self.delegate respondsToSelector:@selector(numberOfSectionsInTableView:)] && count != 0) { + if ([self.delegate respondsToSelector:@selector(numberOfSectionsInTableView:)] && count != 0) + { profileExtenderSections = [self.delegate numberOfSectionsInTableView:tableView]; } @@ -188,24 +192,29 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView - (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + NSInteger count = 0; - if ( (NSUInteger)section >= self.items.count ) { + if ( (NSUInteger)section >= self.items.count ) + { - if ([self.delegate respondsToSelector:@selector(tableView:numberOfRowsInAdjustedSection:)]) { + if ([self.delegate respondsToSelector:@selector(tableView:numberOfRowsInAdjustedSection:)]) + { NSInteger adjustedSectionForExtender = section - self.items.count; count = [self.delegate tableView:tableView numberOfRowsInAdjustedSection:adjustedSectionForExtender]; } } - else { + else + { APCTableViewSection *itemsSection = self.items[section]; count = itemsSection.rows.count; - if (self.isPickerShowing && self.pickerIndexPath.section == section) { + if (self.isPickerShowing && self.pickerIndexPath.section == section) + { count ++; } } @@ -272,6 +281,7 @@ - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:( } } else { + APCTableViewItem *field = [self itemForIndexPath:indexPath]; if ([field.caption isEqualToString:@"What time do you generally go to sleep?"]) { @@ -279,6 +289,7 @@ - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:( } if (field) { + cell = [tableView dequeueReusableCellWithIdentifier:field.identifier]; cell.selectionStyle = field.selectionStyle; @@ -390,12 +401,15 @@ - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:( cell = [[UITableViewCell alloc] initWithStyle:field.style reuseIdentifier:field.identifier]; cell.textLabel.frame = CGRectMake(12.0, cell.textLabel.frame.origin.y, cell.textLabel.frame.size.width, cell.textLabel.frame.size.height); + } [self setupBasicCellAppearance:cell]; } } } } + + return cell; } @@ -412,6 +426,7 @@ - (NSArray *)prepareContent NSMutableArray *rowItems = [NSMutableArray new]; for (NSNumber *type in profileElementsList) { + APCUserInfoItemType itemType = type.integerValue; switch (itemType) { @@ -432,6 +447,7 @@ - (NSArray *)prepareContent } break; + case kAPCUserInfoItemTypeDateOfBirth: { APCTableViewItem *field = [APCTableViewItem new]; @@ -446,6 +462,7 @@ - (NSArray *)prepareContent row.item = field; row.itemType = kAPCUserInfoItemTypeDateOfBirth; [rowItems addObject:row]; + } break; @@ -468,6 +485,7 @@ - (NSArray *)prepareContent row.item = field; row.itemType = kAPCUserInfoItemTypeCustomSurvey; [rowItems addObject:row]; + } break; @@ -493,6 +511,7 @@ - (NSArray *)prepareContent row.itemType = kAPCUserInfoItemTypeMedicalCondition; [rowItems addObject:row]; } + break; case kAPCUserInfoItemTypeMedication: @@ -533,7 +552,7 @@ - (NSArray *)prepareContent NSInteger defaultIndexOfMyHeightInFeet = 5; NSInteger defaultIndexOfMyHeightInInches = 0; - + double usersHeight = [APCUser heightInInches:self.user.height]; if (usersHeight) { @@ -547,11 +566,13 @@ - (NSArray *)prepareContent NSInteger indexOfMyHeightInFeet = [allPossibleHeightsInFeet indexOfObject: feet]; NSInteger indexOfMyHeightInInches = [allPossibleHeightsInInches indexOfObject: inches]; - if (indexOfMyHeightInFeet == NSNotFound) { + if (indexOfMyHeightInFeet == NSNotFound) + { indexOfMyHeightInFeet = defaultIndexOfMyHeightInFeet; } - if (indexOfMyHeightInInches == NSNotFound) { + if (indexOfMyHeightInInches == NSNotFound) + { indexOfMyHeightInInches = defaultIndexOfMyHeightInInches; } @@ -565,7 +586,7 @@ - (NSArray *)prepareContent [rowItems addObject:row]; } break; - + case kAPCUserInfoItemTypeWeight: { APCTableViewTextFieldItem *field = [APCTableViewTextFieldItem new]; @@ -590,7 +611,7 @@ - (NSArray *)prepareContent [rowItems addObject:row]; } break; - + case kAPCUserInfoItemTypeWakeUpTime: { APCTableViewDatePickerItem *field = [APCTableViewDatePickerItem new]; @@ -694,12 +715,15 @@ - (NSArray *)prepareContent [rowItems addObject:row]; } - APCTableViewSection *section = [APCTableViewSection new]; + APCTableViewSection *section = [APCTableViewSection new]; + - section.rows = [NSArray arrayWithArray:rowItems]; - [items addObject:section]; + section.rows = [NSArray arrayWithArray:rowItems]; + [items addObject:section]; } + + { NSMutableArray *rowItems = [NSMutableArray new]; @@ -716,7 +740,8 @@ - (NSArray *)prepareContent NSNumber *numberOfMinutes = [[NSUserDefaults standardUserDefaults] objectForKey:kNumberOfMinutesForPasscodeKey]; - if ( numberOfMinutes != nil) { + if ( numberOfMinutes != nil) + { NSInteger index = [[APCProfileViewController autoLockValues] indexOfObject:numberOfMinutes]; field.selectedRowIndices = @[@(index)]; } @@ -741,9 +766,9 @@ - (NSArray *)prepareContent [rowItems addObject:row]; } - if (APCUserConsentSharingScopeNone != self.user.sharingScope) { + if (self.user.sharedOptionSelection != [NSNumber numberWithInteger:SBBConsentShareScopeNone]) // Instead of prevent the row from being added to the table, a better option would be to - // disable the row (grey it out and don't respond to taps) + { APCTableViewItem *field = [APCTableViewItem new]; field.caption = NSLocalizedString(@"Sharing Options", @""); field.identifier = kAPCDefaultTableViewCellIdentifier; @@ -764,6 +789,7 @@ - (NSArray *)prepareContent { NSMutableArray *rowItems = [NSMutableArray new]; + { APCTableViewItem *field = [APCTableViewItem new]; field.caption = NSLocalizedString(@"Permissions", @""); @@ -800,6 +826,7 @@ - (NSArray *)prepareContent { NSMutableArray *rowItems = [NSMutableArray new]; + { APCTableViewItem *field = [APCTableViewItem new]; field.caption = NSLocalizedString(@"Privacy Policy", @""); @@ -836,7 +863,8 @@ - (NSArray *)prepareContent } NSArray *newArray = nil; - if ([self.delegate respondsToSelector:@selector(preparedContent:)]) { + if ([self.delegate respondsToSelector:@selector(preparedContent:)]) + { newArray = [self.delegate preparedContent:[NSArray arrayWithArray:items]]; } @@ -870,6 +898,7 @@ - (APCUser *)user if (!_user) { _user = ((APCAppDelegate *)[UIApplication sharedApplication].delegate).dataSubstrate.currentUser; } + return _user; } @@ -940,7 +969,11 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPa CGFloat height = tableView.rowHeight; if ((NSUInteger)indexPath.section >= self.items.count) { - if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtAdjustedIndexPath:)]) { + + + + if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtAdjustedIndexPath:)]) + { NSInteger adjustedSectionForExtender = indexPath.section - self.items.count; NSIndexPath *newIndex = [NSIndexPath indexPathForRow:indexPath.row inSection:adjustedSectionForExtender]; height = [self.delegate tableView:tableView heightForRowAtAdjustedIndexPath:newIndex]; @@ -951,6 +984,7 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPa height = kPickerCellHeight; } } + return height; } @@ -958,8 +992,12 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPa - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if ((NSUInteger)indexPath.section >= self.items.count) { - if ([self.delegate respondsToSelector:@selector(navigationController:didSelectRowAtIndexPath:)]) { + + if ([self.delegate respondsToSelector:@selector(navigationController:didSelectRowAtIndexPath:)]) + { NSInteger adjustedSectionForExtender = indexPath.section - self.items.count; NSIndexPath *newIndex = [NSIndexPath indexPathForRow:indexPath.row inSection:adjustedSectionForExtender]; @@ -991,6 +1029,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath else { [tableView deselectRowAtIndexPath:indexPath animated:YES]; } + } break; @@ -1014,6 +1053,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [tableView deselectRowAtIndexPath:indexPath animated:YES]; } + break; case kAPCSettingsItemTypeReminderOnOff: @@ -1073,7 +1113,8 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath } } -- (CGFloat)tableView: (UITableView *) __unused tableView heightForHeaderInSection: (NSInteger) section +- (CGFloat) tableView: (UITableView *) __unused tableView + heightForHeaderInSection: (NSInteger) section { CGFloat height; @@ -1083,6 +1124,7 @@ - (CGFloat)tableView: (UITableView *) __unused tableView heightForHeaderInSectio else { height = kSectionHeaderHeight; } + return height; } @@ -1090,15 +1132,23 @@ - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger { UITableViewHeaderFooterView *headerView; - if ((NSUInteger)section >= self.items.count ) { - if ([self.delegate respondsToSelector:@selector(tableView:numberOfRowsInSection:)]) { + if ((NSUInteger)section >= self.items.count ) + { + + if ([self.delegate respondsToSelector:@selector(tableView:numberOfRowsInSection:)]) + { headerView = [[UITableViewHeaderFooterView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(tableView.frame), kSectionHeaderHeight)]; headerView.contentView.backgroundColor = [UIColor appSecondaryColor4]; } + } - else { + else + { + APCTableViewSection *sectionItem = self.items[section]; + if (sectionItem.sectionTitle.length > 0) { + headerView = [[UITableViewHeaderFooterView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(tableView.frame), kSectionHeaderHeight)]; headerView.contentView.backgroundColor = [UIColor appSecondaryColor4]; @@ -1183,18 +1233,23 @@ - (void) imagePickerControllerDidCancel:(UIImagePickerController *)picker - (void)taskViewController:(ORKTaskViewController *) __unused taskViewController didFinishWithReason:(ORKTaskViewControllerFinishReason)reason error:(nullable NSError *)error { - if (reason == ORKTaskViewControllerFinishReasonCompleted) { + if (reason == ORKTaskViewControllerFinishReasonCompleted) + { [self dismissViewControllerAnimated:YES completion:nil]; } - else if (reason == ORKTaskViewControllerFinishReasonDiscarded) { + else if (reason == ORKTaskViewControllerFinishReasonDiscarded) + { [self dismissViewControllerAnimated:YES completion:nil]; } - else if (reason == ORKTaskViewControllerFinishReasonSaved) { + else if (reason == ORKTaskViewControllerFinishReasonSaved) + { [self dismissViewControllerAnimated:YES completion:nil]; } - else if (reason == ORKTaskViewControllerFinishReasonFailed) { + else if (reason == ORKTaskViewControllerFinishReasonFailed) + { APCLogError2(error); } + } #pragma mark - Public methods @@ -1208,9 +1263,11 @@ - (void)loadProfileValuesInModel } for (NSUInteger j=0; j -FOUNDATION_EXPORT NSString * const kAPCActivitiesSectionHeaderViewIdentifier; @interface APCActivitiesSectionHeaderView : UITableViewHeaderFooterView @property (weak, nonatomic) IBOutlet UILabel *titleLabel; - @property (weak, nonatomic) IBOutlet UILabel *subTitleLabel; @end diff --git a/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.m b/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.m index f76feb88..0ad84be4 100644 --- a/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.m +++ b/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.m @@ -35,14 +35,11 @@ #import "UIColor+APCAppearance.h" #import "UIFont+APCAppearance.h" -NSString * const kAPCActivitiesSectionHeaderViewIdentifier = @"APCActivitiesSectionHeaderView"; - @implementation APCActivitiesSectionHeaderView -- (void)awakeFromNib +- (void) awakeFromNib { [super awakeFromNib]; - [self setupAppearance]; } diff --git a/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.xib b/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.xib index 2175a64b..33ce580c 100644 --- a/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.xib +++ b/APCAppCore/APCAppCore/UI/TableViewCells/ActivitiesCells/APCActivitiesSectionHeaderView.xib @@ -1,7 +1,7 @@ - + - + @@ -10,19 +10,20 @@ -