From bc7e2b9b94995ea850bfb03d11c6046e82978c49 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 11 May 2015 17:47:18 -0700 Subject: [PATCH 01/15] Set correct strata for background render Fixes #1478 --- src/mbgl/renderer/painter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index b70f91906..e2a3df625 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -277,6 +277,7 @@ void Painter::render(const Style& style, TransformState state_, TimePoint time) } } else { const gl::group group("background"); + setStrata(i * strata_thickness); renderBackground(item.layer); } } From 0a1e89a9ca821963bbf03e70021ffd0342c16de6 Mon Sep 17 00:00:00 2001 From: Brad Leege Date: Tue, 12 May 2015 11:04:14 -0500 Subject: [PATCH 02/15] Merge pull request #1520 from mapbox/1516-opt-out-checking Explicit Opt Out Checking --- include/mbgl/ios/MGLAccountManager.h | 1 + ios/app/MBXAppDelegate.m | 3 +++ platform/ios/MGLAccountManager.m | 10 ++++++++++ platform/ios/MGLMapboxEvents.m | 16 ++++++++++------ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/mbgl/ios/MGLAccountManager.h b/include/mbgl/ios/MGLAccountManager.h index c1b7406b9..f856f16cc 100644 --- a/include/mbgl/ios/MGLAccountManager.h +++ b/include/mbgl/ios/MGLAccountManager.h @@ -1,5 +1,6 @@ @interface MGLAccountManager : NSObject ++ (void) setMapboxMetricsEnabledSettingShownInApp:(BOOL)showsOptOut; + (void) setAccessToken:(NSString *) accessToken; + (NSString *) accessToken; diff --git a/ios/app/MBXAppDelegate.m b/ios/app/MBXAppDelegate.m index 90c552aba..d4af1f59d 100644 --- a/ios/app/MBXAppDelegate.m +++ b/ios/app/MBXAppDelegate.m @@ -21,6 +21,9 @@ } if ( ! accessToken) NSLog(@"No access token set. Mapbox vector tiles won't work."); + // Signal To SDK That Opt Out Is In App UI +// [MGLAccountManager setShowsOptOutInApp:YES]; + // Start Mapbox GL SDK [MGLAccountManager setAccessToken:accessToken]; diff --git a/platform/ios/MGLAccountManager.m b/platform/ios/MGLAccountManager.m index b1a80fd6a..09bfb3db2 100644 --- a/platform/ios/MGLAccountManager.m +++ b/platform/ios/MGLAccountManager.m @@ -6,6 +6,7 @@ @interface MGLAccountManager() +@property (atomic) BOOL showsOptOutInApp; @property (atomic) NSString *accessToken; @end @@ -23,6 +24,7 @@ static MGLAccountManager *_sharedManager; if ( ! NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent) { void (^setupBlock)() = ^{ _sharedManager = [[self alloc] init]; + _sharedManager.showsOptOutInApp = NO; }; if ( ! [[NSThread currentThread] isMainThread]) { dispatch_sync(dispatch_get_main_queue(), ^{ @@ -37,6 +39,14 @@ static MGLAccountManager *_sharedManager; return _sharedManager; } ++ (void) setMapboxMetricsEnabledSettingShownInApp:(BOOL)showsOptOut { + [MGLAccountManager sharedInstance].showsOptOutInApp = showsOptOut; +} + ++ (BOOL) mapboxMetricsEnabledSettingShownInApp { + return [MGLAccountManager sharedInstance].showsOptOutInApp; +} + + (void) setAccessToken:(NSString *) accessToken { [[MGLAccountManager sharedInstance] setAccessToken:accessToken]; diff --git a/platform/ios/MGLMapboxEvents.m b/platform/ios/MGLMapboxEvents.m index 3a6559b76..244928f95 100644 --- a/platform/ios/MGLMapboxEvents.m +++ b/platform/ios/MGLMapboxEvents.m @@ -9,6 +9,7 @@ #import "NSProcessInfo+MGLAdditions.h" #import "NSBundle+MGLAdditions.h" #import "NSException+MGLAdditions.h" +#import "MGLAccountManager.m" #include @@ -117,11 +118,13 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; self = [super init]; if (self) { - // Put Settings bundle into memory - NSString *appSettingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; - if(!appSettingsBundle) { - NSLog(@"Could not find Settings.bundle"); - } else { + if (! [MGLAccountManager mapboxMetricsEnabledSettingShownInApp]) { + // Opt Out is not configured in UI, so check for Settings.bundle + // Put Settings bundle into memory + NSString *appSettingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; + + NSAssert(appSettingsBundle, @"End users must be able to opt out of Metrics in your app, either via the Settings.bundle or in the app itself which must be noted via setting +[MGLAccountManager setShowsOptOutInApp:YES]"); + // Dynamic Settings.bundle loading based on: // http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you-dont-open-the NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[appSettingsBundle stringByAppendingPathComponent:@"Root.plist"]]; @@ -133,9 +136,10 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; } } - + [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; } + _appBundleId = [[NSBundle mainBundle] bundleIdentifier]; NSString *uniqueID = [[NSProcessInfo processInfo] globallyUniqueString]; _serialQueue = dispatch_queue_create([[NSString stringWithFormat:@"%@.%@.events.serial", _appBundleId, uniqueID] UTF8String], DISPATCH_QUEUE_SERIAL); From f140733414ac60aa8a593f880907eefe9465fadc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguy=E1=BB=85n?= Date: Tue, 12 May 2015 10:16:46 -0700 Subject: [PATCH 03/15] Merge pull request #1528 from mapbox/1516-getter Adding Getter Method --- include/mbgl/ios/MGLAccountManager.h | 1 + ios/app/MBXAppDelegate.m | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/mbgl/ios/MGLAccountManager.h b/include/mbgl/ios/MGLAccountManager.h index f856f16cc..f8bb2bf9a 100644 --- a/include/mbgl/ios/MGLAccountManager.h +++ b/include/mbgl/ios/MGLAccountManager.h @@ -1,6 +1,7 @@ @interface MGLAccountManager : NSObject + (void) setMapboxMetricsEnabledSettingShownInApp:(BOOL)showsOptOut; ++ (BOOL) mapboxMetricsEnabledSettingShownInApp; + (void) setAccessToken:(NSString *) accessToken; + (NSString *) accessToken; diff --git a/ios/app/MBXAppDelegate.m b/ios/app/MBXAppDelegate.m index d4af1f59d..ce699ce69 100644 --- a/ios/app/MBXAppDelegate.m +++ b/ios/app/MBXAppDelegate.m @@ -22,7 +22,7 @@ if ( ! accessToken) NSLog(@"No access token set. Mapbox vector tiles won't work."); // Signal To SDK That Opt Out Is In App UI -// [MGLAccountManager setShowsOptOutInApp:YES]; +// [MGLAccountManager setMapboxMetricsEnabledSettingShownInApp:YES]; // Start Mapbox GL SDK [MGLAccountManager setAccessToken:accessToken]; From 523239c0e643db77587c57a8afb268d844d9ce69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguy=E1=BB=85n?= Date: Tue, 12 May 2015 13:46:58 -0700 Subject: [PATCH 04/15] Merge pull request #1530 from mapbox/1ec5-metrics-assert Corrected Settings.bundle assertion message --- platform/ios/MGLMapboxEvents.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/ios/MGLMapboxEvents.m b/platform/ios/MGLMapboxEvents.m index 244928f95..cb4cdce60 100644 --- a/platform/ios/MGLMapboxEvents.m +++ b/platform/ios/MGLMapboxEvents.m @@ -123,7 +123,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // Put Settings bundle into memory NSString *appSettingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; - NSAssert(appSettingsBundle, @"End users must be able to opt out of Metrics in your app, either via the Settings.bundle or in the app itself which must be noted via setting +[MGLAccountManager setShowsOptOutInApp:YES]"); + NSAssert(appSettingsBundle, @"End users must be able to opt out of Metrics in your app, either inside Settings (via Settings.bundle) or inside this app. If you implement the opt-out control inside this app, disable this assertion by setting [MGLAccountManager setMapboxMetricsEnabledSettingShownInApp:YES] before the app initializes any Mapbox GL classes."); // Dynamic Settings.bundle loading based on: // http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you-dont-open-the From 13405479b7fc1ce43ae262e30be3eacb7c707c92 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Tue, 12 May 2015 13:54:39 -0700 Subject: [PATCH 05/15] Merge pull request #1517 from mapbox/metrics-tests refs #1491: iOS metrics testing --- test/ios/MGLTAppDelegate.m | 3 + test/ios/MetricsTests.m | 288 ++++ .../NSNotificationCenter+OCMAdditions.h | 26 + test/ios/OCMock/OCMock/OCMArg.h | 53 + test/ios/OCMock/OCMock/OCMConstraint.h | 71 + test/ios/OCMock/OCMock/OCMLocation.h | 36 + test/ios/OCMock/OCMock/OCMMacroState.h | 45 + test/ios/OCMock/OCMock/OCMRecorder.h | 39 + test/ios/OCMock/OCMock/OCMStubRecorder.h | 56 + test/ios/OCMock/OCMock/OCMock.h | 84 ++ test/ios/OCMock/OCMock/OCMockObject.h | 74 + test/ios/OCMock/libOCMock.a | Bin 0 -> 2071640 bytes test/ios/OHHTTPStubs/.gitignore | 15 + test/ios/OHHTTPStubs/.travis.yml | 14 + test/ios/OHHTTPStubs/CHANGELOG.md | 226 +++ .../Examples/ObjC/MainViewController.h | 13 + .../Examples/ObjC/MainViewController.m | 169 +++ .../Examples/ObjC/MainViewController.xib | 158 ++ .../OHHTTPStubsDemo.xcodeproj/project.pbxproj | 382 +++++ .../contents.xcworkspacedata | 7 + .../xcschemes/OHHTTPStubs iOS Demo.xcscheme | 113 ++ .../contents.xcworkspacedata | 10 + test/ios/OHHTTPStubs/Examples/ObjC/Podfile | 6 + .../OHHTTPStubs/Examples/ObjC/Podfile.lock | 14 + .../Headers/Private/OHHTTPStubs/OHHTTPStubs.h | 1 + .../OHHTTPStubsResponse+HTTPMessage.h | 1 + .../OHHTTPStubs/OHHTTPStubsResponse+JSON.h | 1 + .../Private/OHHTTPStubs/OHHTTPStubsResponse.h | 1 + .../Private/OHHTTPStubs/OHPathHelpers.h | 1 + .../Headers/Public/OHHTTPStubs/OHHTTPStubs.h | 1 + .../OHHTTPStubsResponse+HTTPMessage.h | 1 + .../OHHTTPStubs/OHHTTPStubsResponse+JSON.h | 1 + .../Public/OHHTTPStubs/OHHTTPStubsResponse.h | 1 + .../Public/OHHTTPStubs/OHPathHelpers.h | 1 + .../Local Podspecs/OHHTTPStubs.podspec.json | 26 + .../Examples/ObjC/Pods/Manifest.lock | 14 + .../ObjC/Pods/Pods.xcodeproj/project.pbxproj | 488 ++++++ .../Pods-OHHTTPStubs-Private.xcconfig | 6 + .../Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m | 5 + .../Pods-OHHTTPStubs-prefix.pch | 5 + .../Pods-OHHTTPStubs.xcconfig | 1 + .../Pods/Pods-acknowledgements.markdown | 15 + .../Pods/Pods-acknowledgements.plist | 45 + .../Target Support Files/Pods/Pods-dummy.m | 5 + .../Pods/Pods-environment.h | 14 + .../Pods/Pods-resources.sh | 93 ++ .../Pods/Pods.debug.xcconfig | 6 + .../Pods/Pods.release.xcconfig | 6 + .../OHHTTPStubs/Examples/ObjC/Stubs/stub.jpg | Bin 0 -> 46859 bytes .../OHHTTPStubs/Examples/ObjC/Stubs/stub.txt | 3 + .../ObjC/Supporting Files/Default-568h@2x.png | Bin 0 -> 18594 bytes .../OHHTTPStubsDemo-Info.plist | 40 + .../OHHTTPStubsDemo-Prefix.pch | 14 + .../Examples/ObjC/Supporting Files/main.m | 17 + .../Examples/Swift/AppDelegate.swift | 21 + .../Examples/Swift/Main.storyboard | 196 +++ .../Examples/Swift/MainViewController.swift | 145 ++ .../OHHTTPStubsDemo.xcodeproj/project.pbxproj | 378 +++++ .../contents.xcworkspacedata | 7 + .../xcschemes/OHHTTPStubsDemo.xcscheme | 112 ++ .../contents.xcworkspacedata | 10 + test/ios/OHHTTPStubs/Examples/Swift/Podfile | 7 + .../OHHTTPStubs/Examples/Swift/Podfile.lock | 14 + .../Headers/Private/OHHTTPStubs/OHHTTPStubs.h | 1 + .../OHHTTPStubsResponse+HTTPMessage.h | 1 + .../OHHTTPStubs/OHHTTPStubsResponse+JSON.h | 1 + .../Private/OHHTTPStubs/OHHTTPStubsResponse.h | 1 + .../Private/OHHTTPStubs/OHPathHelpers.h | 1 + .../Headers/Public/OHHTTPStubs/OHHTTPStubs.h | 1 + .../OHHTTPStubsResponse+HTTPMessage.h | 1 + .../OHHTTPStubs/OHHTTPStubsResponse+JSON.h | 1 + .../Public/OHHTTPStubs/OHHTTPStubsResponse.h | 1 + .../Public/OHHTTPStubs/OHPathHelpers.h | 1 + .../Local Podspecs/OHHTTPStubs.podspec.json | 26 + .../Examples/Swift/Pods/Manifest.lock | 14 + .../Swift/Pods/Pods.xcodeproj/project.pbxproj | 562 +++++++ .../Pods-OHHTTPStubs/Info.plist | 26 + .../Pods-OHHTTPStubs-Private.xcconfig | 9 + .../Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m | 5 + .../Pods-OHHTTPStubs-prefix.pch | 5 + .../Pods-OHHTTPStubs-umbrella.h | 11 + .../Pods-OHHTTPStubs.modulemap | 6 + .../Pods-OHHTTPStubs.xcconfig | 1 + .../Pods/Target Support Files/Pods/Info.plist | 26 + .../Pods/Pods-acknowledgements.markdown | 15 + .../Pods/Pods-acknowledgements.plist | 45 + .../Target Support Files/Pods/Pods-dummy.m | 5 + .../Pods/Pods-environment.h | 14 + .../Pods/Pods-frameworks.sh | 55 + .../Pods/Pods-resources.sh | 93 ++ .../Target Support Files/Pods/Pods-umbrella.h | 6 + .../Pods/Pods.debug.xcconfig | 8 + .../Target Support Files/Pods/Pods.modulemap | 6 + .../Pods/Pods.release.xcconfig | 8 + .../OHHTTPStubs/Examples/Swift/Stubs/stub.jpg | Bin 0 -> 46859 bytes .../OHHTTPStubs/Examples/Swift/Stubs/stub.txt | 3 + .../Supporting Files/Default-568h@2x.png | Bin 0 -> 18594 bytes .../AppIcon.appiconset/Contents.json | 68 + .../Swift/Supporting Files/Info.plist | 45 + .../Swift/Supporting Files/LaunchScreen.xib | 41 + test/ios/OHHTTPStubs/LICENSE | 9 + test/ios/OHHTTPStubs/OHHTTPStubs.podspec | 37 + .../OHHTTPStubs.xcodeproj/project.pbxproj | 1021 +++++++++++++ .../contents.xcworkspacedata | 7 + .../OHHTTPStubs Mac Framework.xcscheme | 92 ++ .../OHHTTPStubs iOS Framework.xcscheme | 86 ++ .../OHHTTPStubs iOS StaticLib.xcscheme | 92 ++ .../contents.xcworkspacedata | 10 + test/ios/OHHTTPStubs/OHHTTPStubs/Podfile | 14 + test/ios/OHHTTPStubs/OHHTTPStubs/Podfile.lock | 30 + .../AFNetworking/AFHTTPRequestOperation.h | 67 + .../AFNetworking/AFHTTPRequestOperation.m | 206 +++ .../AFHTTPRequestOperationManager.h | 308 ++++ .../AFHTTPRequestOperationManager.m | 253 ++++ .../AFNetworking/AFHTTPSessionManager.h | 240 +++ .../AFNetworking/AFHTTPSessionManager.m | 321 ++++ .../AFNetworkReachabilityManager.h | 193 +++ .../AFNetworkReachabilityManager.m | 259 ++++ .../AFNetworking/AFNetworking/AFNetworking.h | 44 + .../AFNetworking/AFSecurityPolicy.h | 143 ++ .../AFNetworking/AFSecurityPolicy.m | 335 +++++ .../AFNetworking/AFURLConnectionOperation.h | 328 ++++ .../AFNetworking/AFURLConnectionOperation.m | 789 ++++++++++ .../AFNetworking/AFURLRequestSerialization.h | 463 ++++++ .../AFNetworking/AFURLRequestSerialization.m | 1339 +++++++++++++++++ .../AFNetworking/AFURLResponseSerialization.h | 310 ++++ .../AFNetworking/AFURLResponseSerialization.m | 793 ++++++++++ .../AFNetworking/AFURLSessionManager.h | 531 +++++++ .../AFNetworking/AFURLSessionManager.m | 1079 +++++++++++++ .../OHHTTPStubs/Pods/AFNetworking/LICENSE | 19 + .../OHHTTPStubs/Pods/AFNetworking/README.md | 383 +++++ .../AFNetworkActivityIndicatorManager.h | 76 + .../AFNetworkActivityIndicatorManager.m | 171 +++ .../UIActivityIndicatorView+AFNetworking.h | 64 + .../UIActivityIndicatorView+AFNetworking.m | 97 ++ .../UIAlertView+AFNetworking.h | 96 ++ .../UIAlertView+AFNetworking.m | 111 ++ .../UIButton+AFNetworking.h | 181 +++ .../UIButton+AFNetworking.m | 293 ++++ .../UIImageView+AFNetworking.h | 143 ++ .../UIImageView+AFNetworking.m | 216 +++ .../UIKit+AFNetworking/UIKit+AFNetworking.h | 38 + .../UIProgressView+AFNetworking.h | 88 ++ .../UIProgressView+AFNetworking.m | 183 +++ .../UIRefreshControl+AFNetworking.h | 64 + .../UIRefreshControl+AFNetworking.m | 93 ++ .../UIWebView+AFNetworking.h | 83 + .../UIWebView+AFNetworking.m | 151 ++ .../AFNetworking/AFHTTPRequestOperation.h | 1 + .../AFHTTPRequestOperationManager.h | 1 + .../AFNetworking/AFHTTPSessionManager.h | 1 + .../AFNetworkActivityIndicatorManager.h | 1 + .../AFNetworkReachabilityManager.h | 1 + .../Private/AFNetworking/AFNetworking.h | 1 + .../Private/AFNetworking/AFSecurityPolicy.h | 1 + .../AFNetworking/AFURLConnectionOperation.h | 1 + .../AFNetworking/AFURLRequestSerialization.h | 1 + .../AFNetworking/AFURLResponseSerialization.h | 1 + .../AFNetworking/AFURLSessionManager.h | 1 + .../UIActivityIndicatorView+AFNetworking.h | 1 + .../AFNetworking/UIAlertView+AFNetworking.h | 1 + .../AFNetworking/UIButton+AFNetworking.h | 1 + .../AFNetworking/UIImageView+AFNetworking.h | 1 + .../Private/AFNetworking/UIKit+AFNetworking.h | 1 + .../UIProgressView+AFNetworking.h | 1 + .../UIRefreshControl+AFNetworking.h | 1 + .../AFNetworking/UIWebView+AFNetworking.h | 1 + .../AFNetworking/AFHTTPRequestOperation.h | 1 + .../AFHTTPRequestOperationManager.h | 1 + .../AFNetworking/AFHTTPSessionManager.h | 1 + .../AFNetworkActivityIndicatorManager.h | 1 + .../AFNetworkReachabilityManager.h | 1 + .../Public/AFNetworking/AFNetworking.h | 1 + .../Public/AFNetworking/AFSecurityPolicy.h | 1 + .../AFNetworking/AFURLConnectionOperation.h | 1 + .../AFNetworking/AFURLRequestSerialization.h | 1 + .../AFNetworking/AFURLResponseSerialization.h | 1 + .../Public/AFNetworking/AFURLSessionManager.h | 1 + .../UIActivityIndicatorView+AFNetworking.h | 1 + .../AFNetworking/UIAlertView+AFNetworking.h | 1 + .../AFNetworking/UIButton+AFNetworking.h | 1 + .../AFNetworking/UIImageView+AFNetworking.h | 1 + .../Public/AFNetworking/UIKit+AFNetworking.h | 1 + .../UIProgressView+AFNetworking.h | 1 + .../UIRefreshControl+AFNetworking.h | 1 + .../AFNetworking/UIWebView+AFNetworking.h | 1 + .../OHHTTPStubs/Pods/Manifest.lock | 30 + .../Pods/Pods.xcodeproj/project.pbxproj | 906 +++++++++++ ...bs Mac Tests-AFNetworking-Private.xcconfig | 6 + ...OHHTTPStubs Mac Tests-AFNetworking-dummy.m | 5 + ...TTPStubs Mac Tests-AFNetworking-prefix.pch | 5 + ...HHTTPStubs Mac Tests-AFNetworking.xcconfig | 1 + ...PStubs Mac Tests-acknowledgements.markdown | 26 + ...HTTPStubs Mac Tests-acknowledgements.plist | 56 + .../Pods-OHHTTPStubs Mac Tests-dummy.m | 5 + .../Pods-OHHTTPStubs Mac Tests-environment.h | 44 + .../Pods-OHHTTPStubs Mac Tests-resources.sh | 93 ++ .../Pods-OHHTTPStubs Mac Tests.debug.xcconfig | 6 + ...ods-OHHTTPStubs Mac Tests.release.xcconfig | 6 + ...bs iOS Tests-AFNetworking-Private.xcconfig | 6 + ...OHHTTPStubs iOS Tests-AFNetworking-dummy.m | 5 + ...TTPStubs iOS Tests-AFNetworking-prefix.pch | 5 + ...HHTTPStubs iOS Tests-AFNetworking.xcconfig | 1 + ...PStubs iOS Tests-acknowledgements.markdown | 26 + ...HTTPStubs iOS Tests-acknowledgements.plist | 56 + .../Pods-OHHTTPStubs iOS Tests-dummy.m | 5 + .../Pods-OHHTTPStubs iOS Tests-environment.h | 50 + .../Pods-OHHTTPStubs iOS Tests-resources.sh | 93 ++ .../Pods-OHHTTPStubs iOS Tests.debug.xcconfig | 6 + ...ods-OHHTTPStubs iOS Tests.release.xcconfig | 6 + .../OHHTTPStubs+NSURLSessionConfiguration.m | 71 + .../OHHTTPStubs/Sources/OHHTTPStubs.h | 195 +++ .../OHHTTPStubs/Sources/OHHTTPStubs.m | 530 +++++++ .../Sources/OHHTTPStubsResponse+HTTPMessage.h | 62 + .../Sources/OHHTTPStubsResponse+HTTPMessage.m | 54 + .../Sources/OHHTTPStubsResponse+JSON.h | 47 + .../Sources/OHHTTPStubsResponse+JSON.m | 31 + .../OHHTTPStubs/Sources/OHHTTPStubsResponse.h | 271 ++++ .../OHHTTPStubs/Sources/OHHTTPStubsResponse.m | 187 +++ .../OHHTTPStubs/Sources/OHPathHelpers.h | 77 + .../OHHTTPStubs/Sources/OHPathHelpers.m | 35 + .../OHHTTPStubs Mac-Info.plist | 30 + .../OHHTTPStubs iOS-Info.plist | 26 + .../UnitTests/Fixtures/emptyfile.json | 0 .../UnitTests/Test Suites/AFNetworkingTests.m | 226 +++ .../NSURLConnectionDelegateTests.m | 394 +++++ .../Test Suites/NSURLConnectionTests.m | 187 +++ .../UnitTests/Test Suites/NSURLSessionTests.m | 228 +++ .../UnitTests/Test Suites/NilValuesTests.m | 213 +++ .../UnitTests/Test Suites/TimingTests.m | 162 ++ .../Test Suites/WithContentsOfURLTests.m | 116 ++ .../UnitTests/UnitTests-Info.plist | 22 + .../UnitTests/UnitTests-Prefix.pch | 7 + test/ios/OHHTTPStubs/README.md | 113 ++ test/ios/OHHTTPStubs/Rakefile | 55 + test/ios/ios-tests.xcodeproj/project.pbxproj | 95 ++ 236 files changed, 21587 insertions(+) create mode 100644 test/ios/MetricsTests.m create mode 100644 test/ios/OCMock/OCMock/NSNotificationCenter+OCMAdditions.h create mode 100644 test/ios/OCMock/OCMock/OCMArg.h create mode 100644 test/ios/OCMock/OCMock/OCMConstraint.h create mode 100644 test/ios/OCMock/OCMock/OCMLocation.h create mode 100644 test/ios/OCMock/OCMock/OCMMacroState.h create mode 100644 test/ios/OCMock/OCMock/OCMRecorder.h create mode 100644 test/ios/OCMock/OCMock/OCMStubRecorder.h create mode 100644 test/ios/OCMock/OCMock/OCMock.h create mode 100644 test/ios/OCMock/OCMock/OCMockObject.h create mode 100644 test/ios/OCMock/libOCMock.a create mode 100644 test/ios/OHHTTPStubs/.gitignore create mode 100644 test/ios/OHHTTPStubs/.travis.yml create mode 100644 test/ios/OHHTTPStubs/CHANGELOG.md create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.h create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.m create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.xib create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.pbxproj create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Demo.xcscheme create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Podfile create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Podfile.lock create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h create mode 120000 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Local Podspecs/OHHTTPStubs.podspec.json create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Manifest.lock create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.plist create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-dummy.m create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-environment.h create mode 100755 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-resources.sh create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.debug.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.release.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Stubs/stub.jpg create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Stubs/stub.txt create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/Default-568h@2x.png create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Info.plist create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Prefix.pch create mode 100644 test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/main.m create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/AppDelegate.swift create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Main.storyboard create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/MainViewController.swift create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.pbxproj create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubsDemo.xcscheme create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Podfile create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Podfile.lock create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h create mode 120000 test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Local Podspecs/OHHTTPStubs.podspec.json create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Manifest.lock create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Info.plist create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-umbrella.h create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.modulemap create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Info.plist create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.plist create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-dummy.m create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-environment.h create mode 100755 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-frameworks.sh create mode 100755 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-resources.sh create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-umbrella.h create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.debug.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.modulemap create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.release.xcconfig create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Stubs/stub.jpg create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Stubs/stub.txt create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Default-568h@2x.png create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Info.plist create mode 100644 test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/LaunchScreen.xib create mode 100644 test/ios/OHHTTPStubs/LICENSE create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs.podspec create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.pbxproj create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs Mac Framework.xcscheme create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Framework.xcscheme create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS StaticLib.xcscheme create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcworkspace/contents.xcworkspacedata create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Podfile create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Podfile.lock create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/LICENSE create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/README.md create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h create mode 120000 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Manifest.lock create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.markdown create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.plist create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-dummy.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-environment.h create mode 100755 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-resources.sh create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.debug.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.release.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.markdown create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.plist create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-dummy.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-environment.h create mode 100755 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-resources.sh create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.debug.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.release.xcconfig create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs+NSURLSessionConfiguration.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.h create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs Mac-Info.plist create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs iOS-Info.plist create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Fixtures/emptyfile.json create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/AFNetworkingTests.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionDelegateTests.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionTests.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLSessionTests.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NilValuesTests.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/TimingTests.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/WithContentsOfURLTests.m create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Info.plist create mode 100644 test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Prefix.pch create mode 100644 test/ios/OHHTTPStubs/README.md create mode 100644 test/ios/OHHTTPStubs/Rakefile diff --git a/test/ios/MGLTAppDelegate.m b/test/ios/MGLTAppDelegate.m index 4bd6b6488..bbd67821f 100644 --- a/test/ios/MGLTAppDelegate.m +++ b/test/ios/MGLTAppDelegate.m @@ -1,5 +1,6 @@ #import "MGLTAppDelegate.h" #import "MGLTViewController.h" +#import "MapboxGL.h" @implementation MGLTAppDelegate @@ -12,6 +13,8 @@ wrapper.toolbarHidden = YES; [self.window makeKeyAndVisible]; + [MGLAccountManager setMapboxMetricsEnabledSettingShownInApp:YES]; // a lie, but a convenient one + return YES; } diff --git a/test/ios/MetricsTests.m b/test/ios/MetricsTests.m new file mode 100644 index 000000000..179e7a1ac --- /dev/null +++ b/test/ios/MetricsTests.m @@ -0,0 +1,288 @@ +#import "MGLMapboxEvents.h" + +#import "KIFTestActor+MapboxGL.h" + +#import +#import + +#import "MapboxGL.h" +#import "OHHTTPStubs.h" + +@interface MGLMapboxEvents (Testing) + ++ (instancetype)sharedManager; +- (NSString *)appBundleId; +- (NSString *)token; +- (BOOL)isPaused; +- (NSURLSession *)session; +- (void)pushEvent:(NSString *)event withAttributes:(NSDictionary *)attributeDictionary; +- (NSMutableArray *)eventQueue; +- (void)postEvents:(NSArray *)events; +- (NSTimer *)timer; +- (NSUInteger)flushAt; +- (NSTimeInterval)flushAfter; +- (void)setFlushAfter:(NSTimeInterval)newFlushAfter; +- (void)flush; +- (void)startTimer; + +@end + +@interface MetricsTests : KIFTestCase + +@property (nonatomic) NSTimeInterval defaultFlushAfter; + +@end + +@implementation MetricsTests + +- (void)beforeAll { + [tester acknowledgeSystemAlert]; + self.defaultFlushAfter = [[MGLMapboxEvents sharedManager] flushAfter]; +} + +- (void)beforeEach { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"MGLMapboxMetricsEnabled"]; + [MGLMapboxEvents resumeMetricsCollection]; + + [MGLAccountManager setAccessToken:@"pk.eyJ1IjoianVzdGluIiwiYSI6IlpDbUJLSUEifQ.4mG8vhelFMju6HpIY-Hi5A"]; + + [[MGLMapboxEvents sharedManager] setFlushAfter:self.defaultFlushAfter]; +} + +- (void)afterEach { + [MGLMapboxEvents pauseMetricsCollection]; +} + +- (void)pushFakeEvent { + [MGLMapboxEvents pushEvent:@"test_event" withAttributes:@{ @"foo" : @"one", @"bar" : @(2) }]; +} + +- (void)testAppBundleID { + XCTAssertEqualObjects([[MGLMapboxEvents sharedManager] appBundleId], @"com.mapbox.Mapbox-GL-Tests"); +} + +- (void)testTokenSetViaMapView { + [tester.mapView setAccessToken:@"test_token"]; + + XCTAssertEqualObjects([[MGLMapboxEvents sharedManager] token], @"test_token"); +} + +- (void)testResumeMetricsCollection { + [MGLMapboxEvents resumeMetricsCollection]; + + XCTAssertFalse([[MGLMapboxEvents sharedManager] isPaused]); + XCTAssertNotNil([[MGLMapboxEvents sharedManager] session]); +} + +- (void)testPauseMetricsCollection { + [MGLMapboxEvents pauseMetricsCollection]; + + XCTAssertTrue([[MGLMapboxEvents sharedManager] isPaused]); + XCTAssertNil([[MGLMapboxEvents sharedManager] session]); +} + +- (void)testFlushAtThreshold { + NSUInteger startCount = [[[MGLMapboxEvents sharedManager] eventQueue] count]; + NSUInteger flushAt = [[MGLMapboxEvents sharedManager] flushAt]; + + XCTestExpectation *queueItemsExpectation = [self expectationWithDescription:@"queue should contain events"]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + while (true) { + if ([[[MGLMapboxEvents sharedManager] eventQueue] count] > 0) { + [queueItemsExpectation fulfill]; + break; + } + } + }); + + for (NSUInteger i = 0; i < (flushAt - startCount - 1); i++) { + [self pushFakeEvent]; + } + + [self waitForExpectationsWithTimeout:1.0 handler:nil]; + + XCTestExpectation *emptyQueueExpectation = [self expectationWithDescription:@"queue should be empty"]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + while (true) { + if ([[[MGLMapboxEvents sharedManager] eventQueue] count] == 0) { + [emptyQueueExpectation fulfill]; + break; + } + } + }); + + [self pushFakeEvent]; + + [self waitForExpectationsWithTimeout:1.0 handler:nil]; +} + +- (void)testTimerDestroyedAfterFlush { + XCTestExpectation *emptyQueueExpectation = [self expectationWithDescription:@"queue should be empty"]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + while (true) { + if ([[[MGLMapboxEvents sharedManager] eventQueue] count] == 0) { + [emptyQueueExpectation fulfill]; + break; + } + } + }); + + [[MGLMapboxEvents sharedManager] flush]; + + [self waitForExpectationsWithTimeout:1.0 handler:nil]; + + XCTAssertNil([[MGLMapboxEvents sharedManager] timer]); +} + +- (void)testTimerCreatedAfterEventPushed { + XCTestExpectation *emptyQueueExpectation = [self expectationWithDescription:@"queue should be empty"]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + while (true) { + if ([[[MGLMapboxEvents sharedManager] eventQueue] count] == 0) { + [emptyQueueExpectation fulfill]; + break; + } + } + }); + + [[MGLMapboxEvents sharedManager] flush]; + + [self waitForExpectationsWithTimeout:1.0 handler:nil]; + + [[MGLMapboxEvents sharedManager] setFlushAfter:5]; + + id eventsMock = [OCMockObject partialMockForObject:[MGLMapboxEvents sharedManager]]; + [[[eventsMock expect] andForwardToRealObject] startTimer]; + [self pushFakeEvent]; + [eventsMock verifyWithDelay:0.1]; + + XCTAssertEqual([[[MGLMapboxEvents sharedManager] eventQueue] count], 1); + XCTAssertNotNil([[MGLMapboxEvents sharedManager] timer]); + XCTAssertEqual([[MGLMapboxEvents sharedManager] flushAfter], [[[MGLMapboxEvents sharedManager] timer] timeInterval]); +} + +- (void)testTimerFiresFlush { + XCTestExpectation *emptyQueueExpectation = [self expectationWithDescription:@"queue should be empty"]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + while (true) { + if ([[[MGLMapboxEvents sharedManager] eventQueue] count] == 0) { + [emptyQueueExpectation fulfill]; + break; + } + } + }); + + [[MGLMapboxEvents sharedManager] flush]; + + [self waitForExpectationsWithTimeout:1.0 handler:nil]; + + [[MGLMapboxEvents sharedManager] setFlushAfter:5]; + [self pushFakeEvent]; + id eventsMock = [OCMockObject partialMockForObject:[MGLMapboxEvents sharedManager]]; + [[eventsMock expect] flush]; + [eventsMock verifyWithDelay:[[MGLMapboxEvents sharedManager] flushAfter]]; +} + +- (void)testFlushPostsEvents { + NSArray *events = [NSArray arrayWithArray:[[MGLMapboxEvents sharedManager] eventQueue]]; + + id eventsMock = [OCMockObject partialMockForObject:[MGLMapboxEvents sharedManager]]; + [[eventsMock expect] postEvents:events]; + [[MGLMapboxEvents sharedManager] flush]; + [eventsMock verifyWithDelay:1.0]; + + XCTAssertTrue([[[MGLMapboxEvents sharedManager] eventQueue] count] == 0); +} + +- (void)testPostEventsNetworkRequest { + XCTestExpectation *requestExpectation = [self expectationWithDescription:@"posting events generates network request"]; + XCTestExpectation *contentTypeExpectation = [self expectationWithDescription:@"events are posted as JSON"]; + XCTestExpectation *userAgentExpectation = [self expectationWithDescription:@"events are posted with proper user agent"]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return [request.URL.path hasPrefix:@"/events/v1"]; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + if ([request.URL.absoluteString isEqualToString:[@"https://api.tiles.mapbox.com/events/v1?access_token=" stringByAppendingString:[MGLAccountManager accessToken]]]) { + [requestExpectation fulfill]; + } + + if ([request.allHTTPHeaderFields[@"Content-Type"] isEqualToString:@"application/json"]) { + [contentTypeExpectation fulfill]; + } + + if ([request.allHTTPHeaderFields[@"User-Agent"] isEqualToString:[NSString stringWithFormat:@"%@/1.0/1.0 MapboxEventsiOS/1.0", [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]]]) { + [userAgentExpectation fulfill]; + } + + return nil; + }]; + + [self pushFakeEvent]; + [MGLMapboxEvents flush]; + + [self waitForExpectationsWithTimeout:1.0 handler:nil]; +} + +- (void)testPushEventAddsToEventQueue { + XCTestExpectation *queueSizeIncreaseExpectation = [self expectationWithDescription:@"event queue size increase"]; + + NSUInteger beforeCount = [[[MGLMapboxEvents sharedManager] eventQueue] count]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + while (true) { + if ([[[MGLMapboxEvents sharedManager] eventQueue] count] == (beforeCount + 1)) { + [queueSizeIncreaseExpectation fulfill]; + break; + } + } + }); + + [self pushFakeEvent]; + + [self waitForExpectationsWithTimeout:1.0 handler:nil]; +} + +- (void)testOptOutUpfrontDisablesMetrics { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"MGLMapboxMetricsEnabled"]; + + NSUInteger startingCount = [[[MGLMapboxEvents sharedManager] eventQueue] count]; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + while (true) { + if ([[[MGLMapboxEvents sharedManager] eventQueue] count] > startingCount) { + XCTFail(@"queue should not receive events when opted-out"); + break; + } + } + }); + + [self pushFakeEvent]; + + [tester waitForTimeInterval:1.0]; +} + +- (void)testOptOutAtRuntimeDisablesMetrics { + XCTAssertTrue([[NSUserDefaults standardUserDefaults] boolForKey:@"MGLMapboxMetricsEnabled"]); + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return [request.URL.path hasPrefix:@"/events/v1"]; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + XCTFail(@"opt-out should not post events"); + return nil; + }]; + + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"MGLMapboxMetricsEnabled"]; + + [self pushFakeEvent]; + + [[MGLMapboxEvents sharedManager] flush]; + + [tester waitForTimeInterval:1.0]; +} + +@end diff --git a/test/ios/OCMock/OCMock/NSNotificationCenter+OCMAdditions.h b/test/ios/OCMock/OCMock/NSNotificationCenter+OCMAdditions.h new file mode 100644 index 000000000..c20a9c2b2 --- /dev/null +++ b/test/ios/OCMock/OCMock/NSNotificationCenter+OCMAdditions.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2009-2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import + +@class OCObserverMockObject; + + +@interface NSNotificationCenter(OCMAdditions) + +- (void)addMockObserver:(OCObserverMockObject *)notificationObserver name:(NSString *)notificationName object:(id)notificationSender; + +@end diff --git a/test/ios/OCMock/OCMock/OCMArg.h b/test/ios/OCMock/OCMock/OCMArg.h new file mode 100644 index 000000000..d53437cb7 --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMArg.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2009-2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import + +@interface OCMArg : NSObject + +// constraining arguments + ++ (id)any; ++ (SEL)anySelector; ++ (void *)anyPointer; ++ (id __autoreleasing *)anyObjectRef; ++ (id)isNil; ++ (id)isNotNil; ++ (id)isEqual:(id)value; ++ (id)isNotEqual:(id)value; ++ (id)isKindOfClass:(Class)cls; ++ (id)checkWithSelector:(SEL)selector onObject:(id)anObject; ++ (id)checkWithBlock:(BOOL (^)(id obj))block; + +// manipulating arguments + ++ (id *)setTo:(id)value; ++ (void *)setToValue:(NSValue *)value; + +// internal use only + ++ (id)resolveSpecialValues:(NSValue *)value; + +@end + +#define OCMOCK_ANY [OCMArg any] + +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) + #define OCMOCK_VALUE(variable) \ + ({ __typeof__(variable) __v = (variable); [NSValue value:&__v withObjCType:@encode(__typeof__(__v))]; }) +#else + #define OCMOCK_VALUE(variable) [NSValue value:&variable withObjCType:@encode(__typeof__(variable))] +#endif diff --git a/test/ios/OCMock/OCMock/OCMConstraint.h b/test/ios/OCMock/OCMock/OCMConstraint.h new file mode 100644 index 000000000..777966ab7 --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMConstraint.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2007-2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import + + +@interface OCMConstraint : NSObject + ++ (instancetype)constraint; +- (BOOL)evaluate:(id)value; + +// if you are looking for any, isNil, etc, they have moved to OCMArg + +// try to use [OCMArg checkWith...] instead of the constraintWith... methods below + ++ (instancetype)constraintWithSelector:(SEL)aSelector onObject:(id)anObject; ++ (instancetype)constraintWithSelector:(SEL)aSelector onObject:(id)anObject withValue:(id)aValue; + + +@end + +@interface OCMAnyConstraint : OCMConstraint +@end + +@interface OCMIsNilConstraint : OCMConstraint +@end + +@interface OCMIsNotNilConstraint : OCMConstraint +@end + +@interface OCMIsNotEqualConstraint : OCMConstraint +{ + @public + id testValue; +} + +@end + +@interface OCMInvocationConstraint : OCMConstraint +{ + @public + NSInvocation *invocation; +} + +@end + +@interface OCMBlockConstraint : OCMConstraint +{ + BOOL (^block)(id); +} + +- (instancetype)initWithConstraintBlock:(BOOL (^)(id))block; + +@end + + +#define CONSTRAINT(aSelector) [OCMConstraint constraintWithSelector:aSelector onObject:self] +#define CONSTRAINTV(aSelector, aValue) [OCMConstraint constraintWithSelector:aSelector onObject:self withValue:(aValue)] diff --git a/test/ios/OCMock/OCMock/OCMLocation.h b/test/ios/OCMock/OCMock/OCMLocation.h new file mode 100644 index 000000000..e510db7aa --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMLocation.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import + +@interface OCMLocation : NSObject +{ + id testCase; + NSString *file; + NSUInteger line; +} + ++ (instancetype)locationWithTestCase:(id)aTestCase file:(NSString *)aFile line:(NSUInteger)aLine; + +- (instancetype)initWithTestCase:(id)aTestCase file:(NSString *)aFile line:(NSUInteger)aLine; + +- (id)testCase; +- (NSString *)file; +- (NSUInteger)line; + +@end + +extern OCMLocation *OCMMakeLocation(id testCase, const char *file, int line); diff --git a/test/ios/OCMock/OCMock/OCMMacroState.h b/test/ios/OCMock/OCMock/OCMMacroState.h new file mode 100644 index 000000000..4b2d63508 --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMMacroState.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import + +@class OCMLocation; +@class OCMRecorder; +@class OCMStubRecorder; +@class OCMockObject; + + +@interface OCMMacroState : NSObject +{ + OCMRecorder *recorder; +} + ++ (void)beginStubMacro; ++ (OCMStubRecorder *)endStubMacro; + ++ (void)beginExpectMacro; ++ (OCMStubRecorder *)endExpectMacro; + ++ (void)beginVerifyMacroAtLocation:(OCMLocation *)aLocation; ++ (void)endVerifyMacro; + ++ (OCMMacroState *)globalState; + +- (OCMRecorder *)recorder; + +- (void)switchToClassMethod; + +@end diff --git a/test/ios/OCMock/OCMock/OCMRecorder.h b/test/ios/OCMock/OCMock/OCMRecorder.h new file mode 100644 index 000000000..f56d2ca4c --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMRecorder.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import + +@class OCMockObject; +@class OCMInvocationMatcher; + + +@interface OCMRecorder : NSProxy +{ + OCMockObject *mockObject; + OCMInvocationMatcher *invocationMatcher; +} + +- (instancetype)init; +- (instancetype)initWithMockObject:(OCMockObject *)aMockObject; + +- (void)setMockObject:(OCMockObject *)aMockObject; + +- (OCMInvocationMatcher *)invocationMatcher; + +- (id)classMethod; +- (id)ignoringNonObjectArgs; + +@end diff --git a/test/ios/OCMock/OCMock/OCMStubRecorder.h b/test/ios/OCMock/OCMock/OCMStubRecorder.h new file mode 100644 index 000000000..890c9ef3b --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMStubRecorder.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2004-2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import "OCMRecorder.h" + + +@interface OCMStubRecorder : OCMRecorder + +- (id)andReturn:(id)anObject; +- (id)andReturnValue:(NSValue *)aValue; +- (id)andThrow:(NSException *)anException; +- (id)andPost:(NSNotification *)aNotification; +- (id)andCall:(SEL)selector onObject:(id)anObject; +- (id)andDo:(void (^)(NSInvocation *invocation))block; +- (id)andForwardToRealObject; + +@end + + +@interface OCMStubRecorder (Properties) + +#define andReturn(aValue) _andReturn(({ __typeof__(aValue) _v = (aValue); [NSValue value:&_v withObjCType:@encode(__typeof__(_v))]; })) +@property (nonatomic, readonly) OCMStubRecorder *(^ _andReturn)(NSValue *); + +#define andThrow(anException) _andThrow(anException) +@property (nonatomic, readonly) OCMStubRecorder *(^ _andThrow)(NSException *); + +#define andPost(aNotification) _andPost(aNotification) +@property (nonatomic, readonly) OCMStubRecorder *(^ _andPost)(NSNotification *); + +#define andCall(anObject, aSelector) _andCall(anObject, aSelector) +@property (nonatomic, readonly) OCMStubRecorder *(^ _andCall)(id, SEL); + +#define andDo(aBlock) _andDo(aBlock) +@property (nonatomic, readonly) OCMStubRecorder *(^ _andDo)(void (^)(NSInvocation *)); + +#define andForwardToRealObject() _andForwardToRealObject() +@property (nonatomic, readonly) OCMStubRecorder *(^ _andForwardToRealObject)(void); + +@end + + + diff --git a/test/ios/OCMock/OCMock/OCMock.h b/test/ios/OCMock/OCMock/OCMock.h new file mode 100644 index 000000000..f0083b350 --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMock.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2004-2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import +#import +#import +#import +#import +#import +#import +#import + + +#define OCMClassMock(cls) [OCMockObject niceMockForClass:cls] + +#define OCMStrictClassMock(cls) [OCMockObject mockForClass:cls] + +#define OCMProtocolMock(protocol) [OCMockObject niceMockForProtocol:protocol] + +#define OCMStrictProtocolMock(protocol) [OCMockObject mockForProtocol:protocol] + +#define OCMPartialMock(obj) [OCMockObject partialMockForObject:obj] + +#define OCMObserverMock() [OCMockObject observerMock] + + +#define OCMStub(invocation) \ +({ \ + _OCMSilenceWarnings( \ + [OCMMacroState beginStubMacro]; \ + invocation; \ + [OCMMacroState endStubMacro]; \ + ); \ +}) + +#define OCMExpect(invocation) \ +({ \ + _OCMSilenceWarnings( \ + [OCMMacroState beginExpectMacro]; \ + invocation; \ + [OCMMacroState endExpectMacro]; \ + ); \ +}) + +#define ClassMethod(invocation) \ + _OCMSilenceWarnings( \ + [[OCMMacroState globalState] switchToClassMethod]; \ + invocation; \ + ); + + +#define OCMVerifyAll(mock) [mock verifyAtLocation:OCMMakeLocation(self, __FILE__, __LINE__)] + +#define OCMVerifyAllWithDelay(mock, delay) [mock verifyWithDelay:delay atLocation:OCMMakeLocation(self, __FILE__, __LINE__)] + +#define OCMVerify(invocation) \ +({ \ + _OCMSilenceWarnings( \ + [OCMMacroState beginVerifyMacroAtLocation:OCMMakeLocation(self, __FILE__, __LINE__)]; \ + invocation; \ + [OCMMacroState endVerifyMacro]; \ + ); \ +}) + +#define _OCMSilenceWarnings(macro) \ +({ \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wunused-value\"") \ + macro \ + _Pragma("clang diagnostic pop") \ +}) diff --git a/test/ios/OCMock/OCMock/OCMockObject.h b/test/ios/OCMock/OCMock/OCMockObject.h new file mode 100644 index 000000000..63f2bae2b --- /dev/null +++ b/test/ios/OCMock/OCMock/OCMockObject.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2004-2014 Erik Doernenburg and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use these files except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#import + +@class OCMLocation; +@class OCMInvocationStub; +@class OCMStubRecorder; +@class OCMInvocationMatcher; +@class OCMInvocationExpectation; + + +@interface OCMockObject : NSProxy +{ + BOOL isNice; + BOOL expectationOrderMatters; + NSMutableArray *stubs; + NSMutableArray *expectations; + NSMutableArray *exceptions; + NSMutableArray *invocations; +} + ++ (id)mockForClass:(Class)aClass; ++ (id)mockForProtocol:(Protocol *)aProtocol; ++ (id)partialMockForObject:(NSObject *)anObject; + ++ (id)niceMockForClass:(Class)aClass; ++ (id)niceMockForProtocol:(Protocol *)aProtocol; + ++ (id)observerMock; + +- (instancetype)init; + +- (void)setExpectationOrderMatters:(BOOL)flag; + +- (id)stub; +- (id)expect; +- (id)reject; + +- (id)verify; +- (id)verifyAtLocation:(OCMLocation *)location; + +- (void)verifyWithDelay:(NSTimeInterval)delay; +- (void)verifyWithDelay:(NSTimeInterval)delay atLocation:(OCMLocation *)location; + +- (void)stopMocking; + +// internal use only + +- (void)addStub:(OCMInvocationStub *)aStub; +- (void)addExpectation:(OCMInvocationExpectation *)anExpectation; + +- (BOOL)handleInvocation:(NSInvocation *)anInvocation; +- (void)handleUnRecordedInvocation:(NSInvocation *)anInvocation; +- (BOOL)handleSelector:(SEL)sel; + +- (void)verifyInvocation:(OCMInvocationMatcher *)matcher; +- (void)verifyInvocation:(OCMInvocationMatcher *)matcher atLocation:(OCMLocation *)location; + +@end + diff --git a/test/ios/OCMock/libOCMock.a b/test/ios/OCMock/libOCMock.a new file mode 100644 index 0000000000000000000000000000000000000000..9bb38e21a3b12ae932680ed8919b61f143087b6e GIT binary patch literal 2071640 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≪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
    e|=N+W(t^mS4-BeC^PS_RD7dkgmF;@4EW;Be#C` z&waMuJ^h<)ORrkjc*o}|>sJq-swI&|d^?_*k+aX-1>A(+hTnzXhd+epT%*qFM6@8p z8O_Le{4{(cz8${;zZ&0#--O?W--X|YKZMsVfoxvX;z#1$$|BdV^)tDDg-5|74&!`= z;kAalMN}_d5UFpN}eB06=vGTa}N8+QFJ~$%~N!DMj@rTztfOJZVy(Q<|A}*m& z-gCwu-oGyz9`ctN9+o$Jh9pit*E96jX%*iXN}Sfs)c5FKs{Xd()h;A^8D4p+9J*HB zf90Wa>)wR-+s}`rS^4Ri40%e4XCEWkcOZr`7V|t8(NFYBE(oY8X|g4L&ak^ON=_fb zd zE-iM7q?J$O(z3lsTJbmWT5naxTEm2-4JM1xGOd`kaBCv9tS6Gz_-cW;yw+)hX!jew zk1}mk>m4u%zjN==qk5kvZ7dU1+$j8O#OXbf88;2mOL^iJ68BZ&+*l*D>kLgY@5gV+ zlizycUd$7>jks5dQ``5;qVn&>KS$g}z+{|f=U8>7>$opRyvmdye*9059zEBOC#<+J z#LXe@tQ>JOh-)YAUczK+s_*c~nUBWG^+1}&{~3N7^w@OBLjc&vrLju+n#4ZckL9*=)J_+pQL zlkst8tZTQ&x7z5eW_L-qE0n+7=nJ9m^Z0KvIyTL^c6oH2dsBJX9P5%&hUEMwPspi8 zXEUp7r$?_edLi^J9-VIjB(GEHe}b1>&JiZ%J^}4pM*lkWP_F1-G5Y7AhjK;#lqXmC zea3gUC--t_*h+NyH9_BI!Vl91 zbY0pf6@0?rL!2$%YU!3kyUpnI>&ff?E0rtTQ%W}xdRR`;c^**j^_>OBkKLG?`vwYsLs&(&5B) z3jcA?MaO<(^i!JCk8)ZP~X!K{YHb=8C2U6z0}}#5aAlD3x3Gp0|u`*sIOG; zAM0(f)Zn+NGts|gko)NH4;wts;BbRg1~ukTy442NrwadPgW6jaKHp$y!_daevDrpf zA1=OW2FDw$H&|y-d&B%Yn?r&F4UZe7J-hfrR=$G<_Zr+|aEHO|1~(hrWU$NNI)iGv z%1`f2LA7JS#Ri)VHX58}aEiftgJTS8Y^(G`4C);xoObOX&C5Z6gM)z7xw8S5V2CL` zXwF903BYpjcL3u+9$#mpi#espdM?YAAJ2u$Pq5bTgh9y{UF8szd_nSbP=bU@zM#q{ z2uRWy2Rr;U@>4qDN~h~mIzi>jD9YJ#I~_jdHyEh=1eH$l;#a%`GCy|Lq3hod&KNtk z&G@z&z5yut>w%2lV_iU%Z=KQC8hwq?R~!9dqu+1zl}2A-^kqh0YV^fMZ#Vivqqi8n z+31Z%pJViyMxSByX-1!7^hrjaX!P+$uQ&P_qmMHBNTb&oeW=lg7`@i$38N1(`aq*s z8@%q5sxZYcvJ$w}S zdJi87zQ)6O?z>icIM09AVh4?hIH#={SSuk`Q(;EO$cKX|i; z?*pIV;d{X+diWmjQ69bO@t_T06hj)SR^6+)w z&wBV;@Xver8t}(Gd^Nbvh=lSFaeuYuC_HwuTPN$%dZh4u2{$kA(pshPZQ!fnA8mLS z_+oIaapF2xg3kosOGhTW1zgY1M#HCot9_G3u5%=~+S~6P8tJSC*Zu#p;W}ra`qw%u zu5&lI>gOKAw}3wkKGX1Z;O*cS8@>X32Kc##H-nD>cXL$a>0CzwJcy2T)`1TMIR#&f zr!Bel;gf-<;!oo`W!FS*q=hBx3JWWrITltK?y#`RC!4fNtFnL8!n&>v7S=Uu9ZEc^ zj~`iBbydv$sX!A(awMT_j-?G`OuEQNLN zcPY$EYaJK=TMKKwS>Fs4U2FA26dpvMN*(ngU1b&XdUz5R)|&q|!l6x$3tgBC!4Y&` z;U~TD%U<|0FMOXDp6i8w?S4*Alexp`pEz}PLEOGrcVfDWn}R8Y%a*Xm zj;#g`e&nc$Rty@r!lw?fx@_6y&)^Q#UD$JE-!PYb5?@4$+euGaSIN1rdroTSH=pGU z>|wAgIG4>qS;UwcoIlGjGSP$S30G?0DnptDhU9iUdxM_NKx(Hjop@DG+6zf}Ze!d_ z9Bz@Pk%IliG*YbV9nero-NAhf+1@GN5j zxgE%0{YWmW94HRCh|F_`dyrAjeHp`hJi}$l$aijekk#c<#t0eCli_;Jyys&jL*p#T zP@*x6<*lhCMcVtKO{Q;hoqZmU44O!!%VaD?hTYrb)tQXEXP+k`V*)bPXIxA2LWm2? zk?-vD!^lvE2dx|{D2K|$Ezc|m+H%SJl6HQ2on4DI@cg_HlXO;&yyu0xkfEmG7D1A! z(&dFR!UNEmXKXhiV-0DmtsGrkOY$O2rdOvq&m2$UIbpaM*?f+Dw0cHPAEey zUJ;ox>Ul`VLtj^;SoW}xVTrS3ya@H?s%{s9$8B{ zSo4zeWORRC_y{$p{k)mH6MRQKuMn=TvZu4Yao$Po@HHbt8Sh|zp?3q_d^5l~(UnDv zIje5gHsDSgfL;Yt@N&Ah@^oj8uDtWPBjl01NRNp#r|WeY4}fdyTB~j9-A(@zB4B601lZ8MJe?$>Wvrj(a7wBUaM!;5lNp zV~K4N`QC#a_x_N}TQ%WO$Gsy=_yZFTD$i?SNFA+A9Uz_@?^woHE|D0$XKQ=!j>%Of z^5~Rucal{a!@*@U;l`y7E#3(hOyCQiP_Tb=o&et2*0e*5uR_q)yrai-KI|vLIJ8*w z2L<|TU0$cGiq);@rC%b!@$d2zDc#0T2VUnc(n8ykbtc`TFPokWP@X?ibneO8%MAxR`L{}PjnT(@zQzxei!eg zu1F%>#eS_|C9x7#^diOk`T3pj-||zom!D|KVScO5<;K?*m!&SXdNA$a!}#L3Xrx4Vm9(r9MI~MdM?m=tzNj)ElK>8Vox^i)}Rda76I0F-~GDf0+b_9-P6dcspmm6@lKs#2$t+_9xT$%9F3 zTxitMFLj)%I{T1PjenS{e{f=HKs0&cghA zG_>Emp!K%4Ve_UmFPPsnb>3}@AT4NpyG32p);et7{JAZQ8k>gAwqXs6Wd1DKovjKN zjglv-d=5KC#lp+DYZlFKpLbhRz;@--$ym)<&^Q&dqYdqgT1Dn*mig8@76jKBP&BR! zlFVMjsen+qkGMfVoO|5q{H6k+OA&fMH zd6Sf5knm(3muiOx1JB7zH^V|mZFdU}vz5X<(i}sgdy*K|u!(j8xjOH{+z}RguG1cV z_x*YIAlXkXbHPlf`LfnB)OI;{vTzBfV1h#^;VsB+)j94;(Do3n^@z#%Yw*|O)y-tI zi3kG~r{^0^Yc=oBPgHAe5kjqd7r$Ab7hd;vUHLmJE(H#IyAq# za7$hM?)opjRkCo$Id?pJ{VAg+R_-l2e9{7q@E7A(;@9BU<2U2~!bR!29>vT34DaJ^ zS^@1vMdF?}{@MVIJOLDch!;{A;URx`9iqu+UI(N|!Cy-s8w%9)L)Rf$Do-vMkh5f{ zF2a0DiPut9c<&`Im!7xkO7nD$rF4rlLX(`nK3d7p`&*BU`NFz?ed*7cy59Sc_n&z5^Du3Iej#2XX-%p$hgph8XV85s z`Afi8@cItsAMtVO@&x=j__27+eE5%O9%LHN8f=TCVYaPW=*1_}JiL)K+Z0JtPfMt= zyGR<&+r3k?6{p#iNSb^Zm*!F;X<}tux|Jen5@tDSsv(kQFjg+j z%)s278Pd4aMQG|MW=$k5z2+z)Y1(2LYmOn3rX5Doc@&W}d$U{;;38?dY9vi#Mbh-v zN~{@=NSgkbtd#C|sy$`uc(ZKc#^Sqwcl4sc%48G=#qerLt@urWgHJq9F zD~LbGk0<;b%|iVRu5$}NpT@&q^bxw4wMKsrvu2XcDK9l(he-%#^#=c|llLoDih@EHnaDyz`IR2GE z)yG;4S6?MLGYqQUgi~GzCmI}OaHPSZ28S4=4jjMw0;P``1UOu`nKC$?HTnRjv&Q8) zoi#y~Pw{b};+3BMf+*K_2vr{v69Mn|1Qj8uc)|ODlC#3#G9dj;tP$7;I0q;`wFBzW zeSb8(Ud8Kr6+a#*dOc8dwJXv6dJw(N=qkVR0l0FKUss)O6!%Z-wsXJ}9!~yURUS_L zci9Gt8F72^>FIFtHsi5O?NN&uT%*5wYItk{8bO%4gS1`?*iZG;XA=U z=HWZQKj`7x!SD3&ZQwV0_*U?DdH5Fa3p{)?c&&$T0`KGD8^Qmo7lW051Nd(|d_DMX z5AOp1hKH{M|AL3F1%JZB*MQ&e;d8*BQf}ne%#ExEcYO-@MDPT-B5|EVz*W^sPCYoC z6+q;-7FN0v8jEyUB=anVxi*c_v}dTW#%8x$SmTw)EUYohHxy?7Ol#3R_mN5(y2f#k zBb8*lj&Qxv>j*axR-9Z1J`6AR!s@?5Jre3V88&^0lq!Q8qiaadE^jdM%cH&FSaR!G zcryNn^exP>LdMH zy0=%}j0|NsWk4`DTuV9p^tu}VT5{P5UyKa3hfF&FzMN1-zJ34I$XJMsrIbVIq#La| z^_|JctJ9%F7mSf22TaBxWW;>|giVGPhjQu;3`GX7kOBrhkFq0&fdrtZK# zWYj~K?Q^-M$gsp&GVh8K2E(z)wHY$hRqLM1^`w6woue7>H6lZWUz-ThGWTf) zbxw3u`R+tu^J3S@gdu7@WeQ$SdCH4d_ci-<1<~A=MDQ*S@ero#AKW0@+so%sKB*w^ zbFkx!-=Vi#exPbqJEoJz)b6h%5>PW}(CYU?0x*YF_6|b7GucPC~B*NCWYO$l^+gRR%~rQxnue3#wNSbXi#)a*e7j<+X9x~oY}GbcL77k>3NKD7_KapzHggqV08+37_xRj0w zdz}?(&_$E8nkMIYYN< zQ8l+OyiX6n_(f@D)OSoc_`tHqX&f$JZec4?_iSBsoQwEa7(s!qa}n(op^VYsE1$1? z=K1B@%H36+!y8k&JexuVbB2*}g6ZZ=pDr^g(4+#@j zOp9I70a_TF1X}ca@`xVy@BGdddPL~)Px8ykOr+Qy0X?CBq7-W}DLP1d^O2I*_=ygS z9u!cv8VN?H>s=pDW-YVS$(%n+RLo^HOj&(fsPt8$4t)kRQu-HuMk1_WY}pV%akN*U zA5qk=s=UAG(k$t%HM=-QYRg9%sp47!P54+190ifyS1OFn+KLMaT#YxIwUs(ws)e&E z9q8kFg{3FWsReN@gc&xE%8C+6bqW|2 zp9OWPoB~G0mqOGjU{q`cRSDuw0i$9DK^fVN2MQQfvO3cHW_}VSC0+>+lCy4e2?`j; z16>#e3>|>cEh<3)V@yaN5Use1uu53s6fj&a-xeAuV3ckqT!}BPDk~5z!(Vs34^U!&f zGLDy`1}qwD>IP8p$$c6OzJ- z%Q($p(K@&)P-#I!0Ue6K{G^+o@?)wlC;{YnLY!_uo=eN2X3(AP$p2-EA%VV0&&nZx zCtZ->&gib9;1MdiOr3XEQ(&j|vPC!Z<#da3_irqpO-V&WY4x6Ew&}HcYi_2gl1E;(EB$a2i~qqR7#rTK0Tw3If@+`tfO>zSik z&%_ieZlLie2#2~NS`U#A-!>{zF5MdG&wTs0_r3D`2RF3!yXLJUQ{bC}Ux;6Z*St_^ zYw>b!rU!i7VXPGb{rHO+fC~@f!}5qGpIIJAkxQOByKyK`Iv}c3<&`Tv@#4|i-o z@8i;qk?lj-Ow@JkMApyof5Mk?J%jMl#JCJU9p8+<8~-4_6E9_w7w|f0Aw7OofF?i+ zYUx}PGgJ%$bIOunsT(wV?=P3K{M?Cr=1c?4)=!ZPIR%%55 z3iN{>{qsg&3;lpcXTQ9w%`4v>#&-+!{T|;eqhDcAdOG{O_~Aw$3|)IbI9Gn|W7nOY zeCv;5>tW#1VoE1?wn07X!e8S42!79SU6=6Z3~C8V_~#93!AiLLB|)u*3EpRLxxu>) z-f3`w!CMW^HK@fkrJrJOlEEntuyweOfTQ9`$9yV+H{ZPXJkdaOnh< zPEhS%Q0WDgUQm6gpyUVwl8`>r+3KRtbaa|o`Ap)G;q;ln)AV>)g>`y7k`rFfNcct9 zb&0P0m9Ez0==z9v`bxw*eWgCer+idC#j606L&esQgW{V+d)OtRv=8mUOa$NN;p4$K zd3Zf|mxm7luR@U0?}NSre4@24?SpIww{K}Xy_Id?gT45z;FTV}1^fsFmOQ234E`$* z-vs`uhi?Rb-orP5Z}jl>;2-nwF7OX}_&V@AJ$x;Aqld2nzuLoBgJ0s|4}+iO;rD|N z^zeFc*DrECTe!{yIM*iExfWcHrm9m_pf(oAYu`jws@2~Lyqw;33QN`~o<-^GXzcSI z3u~;j&cYi1=ml7DLU3mMInq}mP~)D9Ev$yr2U+|(Cm4ngc;T}>9(yJo|Ggg1LdO%N zCd;Ip)gE25?0_Q@`8SUzFh3l`=-nRb1ZC;zOjta(X`#;3uw^xS+&i5?mWKK5fsqn7 zHN*l-Q)|=wxqR3;m$8++L)dKYBdCHSAW^%=qQ>Tr+a@>U3z5-Masm3`2D4~IqyiF`+^~Cg{LItN|(uW#8eE7K| z9Os;}uxXyf{TkcYIM1Ch3(TM7)Pq_n{iH?IV=;f69m=^}0jP%QH3^E!7ddQesL zHA*kHBf%V2fw!RtrSwzT(B7m;25#-(p#LLCOyH6_OgG)s+QgtJbMJpH`ODrFr#>@X zwv0S_P(P*f9YX4R)FI<)Pe~RaOGZ9Ds8YLzCrw5m$^B-@$fpM-8P~xb${0yGf*vxv zKJw{7-NZ{|CW(rJcWYz}GR_PNlU0sF%}0?j`opeGem7WX3>5+t5+8j>iuY)F_#`xHScxZ*3HP0 zjQeYoGLv`P)7g=V3FS)vcDp{Hyq~n&GwQ=HlgY@d(^bwrRXg3tL#lKeC4apK zgY}-awp@BpBay*)FtR&*&7cdSW2orXbC@M36B2rJh$PT!imQ zhe^6zy8eX;emo~#qOhIxq{Flm88hH-PXv{?<@7)%U1W18QWpiAGoH+)M-K6TwLsKZ zdA(ETFM(%0VKi>Z@m$Xj|uQe%4H-e1w-NrC23 zN8S6+&m3>P1z&)_x0oKJei^z@#`+DrpIrbn6DH`2d;R@9smdalJGM8khEXrCo|zk*Q3X zTG8E#ytl7QtEpso(Q~1%_)&YGj>&sN(ilj;sq_e^DedHa9i?ML{H->KlK-{QCQYeZd6ic&2LDNqupwxVae zi{JYo;mS0dtR|{pRIlF?EH5M+?XBP5%B&(%Dcuv+(<1JJ$yIL>iuBpX&#BOz4pFZ& z3H8+z6Ro_EU=_ZXK9t>8OPJAKSMb~KW`1Ht)2pgA>~YEZX)!NWR9;oB6=acWE+Qa9 zCPmDp`;AaEicbBNnI@~I=u{^Cq@noei7w}|eEBX(vhp88Vyg0=1}k!385pf>4h#LbDr)o=eq}1QRP$h+@hqvJK}5%h?T4_HK1tv$ zd`Vx?FS&rH{xc8FF@iGk)jhrw@ zYO1lKvWEfF@daZCTme9JY%QSQLVjY!W$&r3iHH(#$dKIx8$~IVJ zTBz5H1m2+w9B@BmY~@J93|%ZO!W0z@_$8pEV1VknC^q1D_yAhtFNqD9E-XG^iLm&9 z#{sd}fF}jwWh%l;3Rd4a zgyFu?nllOO3QGI)ScLQe(f(HwRvRgGifa9@1>J}*4HVT<&8H~R>sjb0MgPQab@YNh zp8_hOZh4>2fvEiYqI#b%CXslw&ofE3@@W6Xpl0io2l*m=hndB%l6Jw-OL zmZbFBr1ch0q10FS!Sga-ldV^vc2-`4;@Ig-ulP2*)Wj-yy+%^HX`wD!A72-ZH)&zT z7}E61P;#qI>A%%v8x!iEsRB13rA#+4rHbck_8k|fwK)|w*%~@QbLv4UgF`2t2L6sf z5ALL-X`|qq>u%slBftd;Z~nwfJ!R-zcN5XJ&p#C3{yvItN!6M3wWDrz&D?TRrYWHD z^X6*VsiAdAXa#6|LwiFQcKQz?5-iV#*yMDzjDXzg+Zp1Cb8Vy$J+gvRYT^UFR!~=S zOTiia;-9~!@UHlb`11J01rv^sx4k=F6JP#P*_J!roc#Lo?|!&&(T2j_uNK5jrR)Lv zJE@L64Ad(+Q;qE3X@z_`T%#5@f^bS=Vatqs%*9?C;v)$x4}{DKY2PKF)P<3$k3=Ox zgCB>49KTZlqNhTplIR^zY2v+rdK?rElX&sviq~GWUviBRw0n)ZS&S%&@-)wsTBC&w zQouDe%;W2DeA97F5%>>0SuE60;w=k@th>S4cJ;5|@1x3=dyVthmDtX@A(Sx0UnM;Q zyF4s=vq2EF!*?!dy_2Qyrd9$|%`#ArR+OBk87ng>J3?1Xp5j)|gGF~OpO16v|87qr z`OIPOhIXFUM9`H}Qx6qsCNFAlKts-><-MjR><~4z@?H7hqS~&Q?=l{}sEze|cYc>^ z%3U8A;_0zIJQGUEPavbnbf>$lDV@i`(txk+RUEUB&|!jt|7S0NboR5ZkvK>ae515yS91W+~&!P+S>KmfyJa5 zjSIWm6vUFjg1Ou+tYqo@sGh1ol`wcVMk^=!AG$3bn9(r$Pw~{yoR{CLMbHgwo4T-R z?!1PU%ttY>W9BlUrHrPy?N>SZ(o}RAq*~Bir-GZFA^Bu?qmg5|ZCVRI6F&^E^J`P_ z+Kc}e{3r06@Xz4=PCPQ}(%@s~qcNN{+a^x#(QKXKe&e*S~@CAUA{`}Vd+ zhV?u0g+I?Et_8moe?NXL{uTE!O{!r-{5ccw9Pnqu`l@-;5CPOHL?TYayAmP`>h%%arfy5^9k=f!Erp9J4mcn);@) zXsSK7>D;=l)>S1>dk~T%CmDj0!GfIITM&K{VcFbDoN(Zw#0?k!dCuflpRX#vV^e5j zOL~T1n0?d8P|vWv_?e>b9lX9uwz!H{oPO?UlYjc0^b@6%DBVQqDSqzF`+7+?@$sMD zUMU-2V`2|}Sh|U_=_TF7C-45=UsPuoFMRX-SN6_03%#)(^$<0|*YU3l@zM;Ojc>(k zsbLMC@0hxiK05a$ZN&e?_o1R{@%rZKyYM&S`A%zOIsQ@nXYgC_lCAroIknw?EhLDf z6%iw8;XouUbQno%I3l?P9Ux9?4kBsE#JIFzA(B==jHC&gNGd(cmU3F86G@AAM$+1b zNIy>{)EbCLS`aZ=T0apF z0f?kU0h6UALXorxW~4VkMUvW!$!ak1Zs~+5oYwior6m(fsMSl6eu_7eRtLEzw`vHf znXtuZ2}jIYcd7;Aw45Q57B?(otxSrfwMwfHtt^V9#V$*zH6oF;>|rD=&x!Of&`4T4 z5=pCGM$*$PlGZ&U%Tw zKDDhh2LHkRM~~hC%#8mlX;>5~`jf$32BrTb`lANlZ*acB8w_5B-lmR!v!qszq`y1gTto;?KY-la?*?BYU*Rtpe9mB~hpP7+@0ct*bClJk)4N9TI=U-4lTEIA72(=u5IoP| z*#^%rIM|>Ty0*BK-<^3;qjRDFfk9WV5C#e2FQ1?er{feOS5mZ7!EtUu>KS6+lLxJp?I=xus zn*e9oGEM&%S!r^^@{1nIC7F{mgZ4Wn=-fKj@jUQ+bPe_JDd2-Vd=j`*zU8?Qzn-Hb z_8bWx3BJbowZ~rvzQV&B=}+$0#gkrp?{mPHcsMVLuA4o42KZDDp9Ws<;ZwlR_Hg!S zx{mkoiQwAQ4f7ihen^8Z%fBA{ryf2A`~?pm1-{9{M}l{HIPcxA2R&Td(LK z#nXtpKI`E;&s`t!@WZ-)9)1Y?b`L)YKFh-ofWOgw;K(snMUg@lFK|TTbu93W$1dY*iSqJoIj@;9=1m=zRJ= zg*6A7qww*VDImX7NDrHHf?;@+7rx31FLB|3OYfMFKj@bNtkdJ!>V<F$mj zJ8i<{S6y@6>_8zm)Zh(EJ3IK?W~eWlBV9hul;-Z+|6bwn3x}U~zUl39=}u*xGobU^ zyV2L3rWa8nczzD>qRiz+oz5H)K0&d_pJ1!9q90&=0QZ9cn& zN-xKKtuyM@!}moz)srj9G!Wy{E;ulox5CrEo~O(0FY|yTX2Umc6L*aeEPb-qC@AM9l4IaS8g{l1_!~ca?mNb zm`t6$3+c!A7O`ePf1ly9WaQJ=JuY~MMpkLjCEa;4f=-4NU8x|_Uea}3CF4P^B~wOH z0CIcMaa~V6FvijcZ`?$C|Hxpj$>r&_=bXvNYh&*)G8iXBnoY*a^Gw$?6aWl$OY`ac zR`EVm6InJmD96MLg0(G3UOBqgUmk>vxg@wB8NN%ekM3JWdGsaTX!w)m7D9^i!o$q z?$T~Db|ORlF)mX^UftsaGSnSEjEoHD$>?79cnC7;xrj9;BR)FN5l3F~*7T%%tmj1Y z*4<|WrI>gT&zgb_nRdnpYHKWWXNRNVUw|$a`1|g z^JH|dd;GyugE8`3X9o$xU+Q^{6r4m@d#GCL7 zKv}-6de)84BWw6p2hzW=_)p?SXLeP2?fw%ScieG#AC9~sF#gxEd=>Ahj*j7;{9o0Q z8U@?s=ZR>R5T!V~QxPxRb9B+TjxRo-WXt=ia4;X}nBc4%eg=+?jthhAu}S!6xF|@b z$;JD`w){gb=ZnKk%wprME|ZSsW1)9UuBKv~B}Q42oZ^yAa1pZbn2fl1tiR0s@mCtN--#5LwBTUb&=1q#KpAP06j67_x4NYNZf#nIi0;G3Z(?F6K>8Hv9l5+4aIeVTw$+ebpn z9wq!DzUXm&dOgEWwBU99o)C3F8BY~HeG9)aW$p@vSf@89bO zEH<_x3Mh^i^aVr{QL#iNatS^n_68plo|4D{u@<IEfI^q`(Rc<4K+?Dg_0`TcaGjmVB zRG0Y(WzMArd5=)uYmr#_Ddp|Zf)6bW@){ZB^?BtrKDb@VXS~bnR({=;)(5R4*X{O5^%C^)%5p=LR4{XNh^nt z#etB8)f-gfOZ5~Kd}u*B7Aerd(CB^9GTn0tf1k@>ZgfCXJP2F?MXY^RgWTf~6uj3Z z5fr?&%^k4u^Td(6v-|erb>*&_i+*N!jT?_o^3tZ zg=oaXQS>z7`1fI}Eh$TNtOLIRoBD&2{(S~sN32>)$#Kzvw-QzcB`1^*Y$dFRx@1s! z=>vpyQ%anH+|tz{>I~$Tehk#5at3ls*N3PxkXtJC{Zblki8GK}dNJq;LIVT2MKj4F zemTTMafw$#sSsw#d7D2Wy6a}me=fS-y%N)|m{sZTfnp(rv)%`8^b`>$ZDAV*IrDx}E0 z?pC;WHNjU1#ZRhuRv>!3F3%;ch?IqCiq2Dtk$Q599^to0!J>)!nW-Oj%5VR$LDI-A zB}*MOU^rhC91SSWHgH>#Qt-F08B5pReOcH(YAk$I*$5^KcG`e~hsOnY&lFaqO!M~k zk0Vs1&H_|=Y?Q`6VazKo?F>Tdgo6$|^h=@i5Gh1wBWf}Z1_TCkb00Vun0;*FxZrrf z@xf7q6T;6Pd#4a`n$}fA3!P386-1Ws`;QX_f1eWu{}+As*jsGR{ncZS!5PNYG7kq5 zXf19lAoI*auz8bIt_)8!q`nUuP|{80@=zm>zMPL9A1WAAQ+ECEve)DD_y98BJzn(g zf^q%gFLI(``Pc3#i~mRb$$}C63eJ(y+`{sYm#rx5bxzqOg}t5*e&Th7y$a6e+sStj zPx>bdOP}^Wq|E1(^&#c>;DQtE2*kU|*FRjK@$@wTExD+q!SLb?J`GuK^roqIwGiVwq{56C2_c`{EzD4wQjyt5KOt>{ux6hRI zN$7D-e>dFgl45P@F$m1|r0_)39T*tpU;*a`WI`0ixr$=sPA8asc9m!WqlF7}GH zE9bRzAHSge7+9Rer0(P-zmDDwQ}B^B8OU%qjlI-)?W&hllJFRZQ$uIT(bsQh0TW8{ z8_~08zjM+2xl%jV4qQ@&JsI!L8H5`DWYr#dyISwun2Zve!6)g+r^=kj^)0*9MS6Dx zfoXS3%`)Q#87bqQL^vX1ryqhOXw~1osKL9jk$K4*U@G{@9z4hSg|uq<|LObPnI@Xu zlazMe=x_7^Z`EM3vQoE^b4y{v^o{~0?_OYY*?r7A`S?ffq7#t4GIa)C`rOZYBz3H) z!JdED-2|T`PvxFF^_|J*KGF~zRzY7PX%;-+lN7O&BH?Gpy#p5wi#YLNUnNHryY=1` zWVWHSBNpk_ol^}@1LlR?xvkg8nU{{o|AH zwfH*x1$gO#Y4N)S-+_M=|4IBdyey5pj=zM3=Bx3te$s|tj9-S|bsWP1eCX=m5r$H5 z#|f;uc|3~YV6}5TeGIgb8S)nA;9Cc6W(MD$9DFepH&$fu)tfShpKmj?4HM!LKlZn67=@~HcbnRVx2*z)i4%8{9Wd5-%jS(*1r)21;0b;xce|GT@%UvjIg zZ>jbA)Xe;AyUAbeeI@yHz@sUe`s+stYibs@Ax+7`a;>Lao$!1No_zJ9{2sRQZ1Kvq z-}=Rgz=ilV_^o*LgNl<&;KOro+GAI~swX*JmwyIO>wk1#PB&M3^*XC2UR1f9KJMUg zGyn69ahIL?)w`a$>%uK{@qd5rv!DCyqo?0K;-8=T{Vivmvf-k>GgiO9;<~%ff8m8A z=YD#{i<8g1;Rjd!_=>Mw{mP2+clDik=cB)S+xaWtMaMML?Yek#qZUz%YKZ@oQ~ct`E5CSMrtS z!}uTKPa`NMlTi;Pspuqt;> zWaIii;k^kzwrnedFK&Tr~$r_Oci8x^WM)uYaL>inn9c>49Mv!(imMR=Z6 z=R;NJI{&FNq`D6}W2*C|2`+3jUVFfE@NM{e@gK!+!0UX{cksW!AIA5h&AbCY9IyA( zwRjoMlA)xB@t?$h8LzKD?7_c**MU9cbIb5^DQJT-uSb9JTu+lD2~S0dd;5 z6G_{8#-%nY(j2_W3Y(?2R*V$3Ol`TCEN$i}q4pb1mUhHM()O5fJ!>TG?iiQ!0K}!9 z%C1p+NFr(5$w*<_)~-%iIdF)p9dF|QXob+8sBwi4jdp^Jq+K*66g2UJtX$fvvT~)) zP`VKOa^Z83d6se@aT?0h|M2M1Nn#AYp)vm6LdA{3FCBo8B?RXgas2?3Y`f`qV$=-;6op`+`ec6iJf!{@(-i4WQdXK%3Cyp)O$kW8t z`{}q&l{Z1$kBNJ~ALo^~p7@LR96fqtp7=S$-$lIYBw3~j_r~s{NvO=ri2pqCXZ!Jl zUoVV&LgNlx=WFo3fMds;lsdh zv2-_(?trBeeX7yNL*L-hFY@vgUmxT9E8kMtZ+shRy=uWK_phMu^XPkx{tf7RJo=V` z$R{)oRJoO2{gu)$gKw|#&4+d;d>XHcPxw&d>*LA0i@N13XHuT<0^|D~XRRK#^rG(v z-)i!O?**4GrsNC%A$YaNFS`mV7iUDfc6;f*ZuF<1@AByDqv_>XXMFd=r?XFCKG%DE z_d(>0oy%t|eBs$v(JwOk5a`=2z32&}S3%$A(aXRGTKUDNHm~ykmRGyb#rG}fVSR}H0(e*-!oOyGpM$=|%l8vTe-!#=kIr-6B|UeX%UAt^@@a&=$@peL zyUgh4L*Hn0y~FE_PUn_vm!fOvEjfLmulM*hP~nneHtveO7<7=aZy0=)_N#cO=K)+~ z`0WPk4C>>x;`gMS1O{(FOW8q~X7^iqRG2EV{{i2iwl z=NTMsu*%@QCcoa&Nx4Mnh8m=OIDDW%sp;?^)BP9JkKjR*cfjBtgS!oGH@MB-xP!O2FDm2YH)}_-CFTi8{{@R9N^$2An%CS zM1$iE)*F;u#g8&L(qNrI<)?V%Cs=DRVQ`Q^l|%6=hhUY#a)WV$Dxcy30Y8Q3B_AsX zqUl&32a?9!mx~p&_`~ok{t!^{2MrzoD*Zl--)rn*;^;@25m3zYoTK*@jD==TGaex=1P11f$gP~~52upOxMEf(Kw^hTi4 z&jBia22kmz0hNA=!ATZB-s0)d?KcPg+41b1nAlu zkTS#u0%;1dYKxaSTE$CaTJ*TlV@B76M)V`}3zByjDE{3*<-_~c<-f_G-m#)fwNCtc z--=%bRg^#PT_)mYe4>Z% z0UzbzyTONeIQ7=0b8=yN>aQ#A;XA+&CsOg-!S{RkHt^jZz7>3k<#= zJ=1lThx5Ma8tCDS2fAcXMfpoUjj`(wwJH1v<@t$+9|qsy;fKJ#>fr~$KkeZMz#sAO z{ou{C29=;d+dJo?Nez}M51|R9+YL6#-xY}cdhpRpQ<&@O*xc2Db+lc?3hi?Uc z&cnBWulMj3)Q`rBxX#+sSeR2K`vDz7Yii>_;#Z(&`h z7KKDt9emlss-GWOSam10Y4NCDhgev3u5}@O{6TxFtrlL#p#LKl*1qc3EUbN{pIcaa ztA)iuTJ5QxX<_XPO}DW2RTo=W`>CB4*1pcm7S^7sbevTN?WLYn5`?ucBaMAmHo|vW zSo^4-vat3}zHedepY)0c{MuJN&%)YIooiw3b$r;u+V6PL!rEW`orRkT4=4@fXb)n% zg|!dSrZDn!Ch*(TWo0?_cU)k9OJVInyvqGkSo_uYT3GuNHQW!;wQsS(!rHr-Wnt}Q z%n^STXZo4TA>M^Ge;;mP&Cx$^`DzdQO-rl&;+aO*9`Oe8lb80*4;o#2*&i@|?L*6M zhV;48!he7d)H&J33uVsm!e;y9ihmk= zO<>?5mjcTNHyM&|Upe5yF2&fuLWMI( zk*mBJ22GIX?StEi=KP--ymG4dRlsBXPGVRfe}~#ikx^d1Bw3$WOllRTS4ajqLt?t( zS9(e=Jy&#wgiKAbEE%~OvZZ7ym*oI>S1DFj+so$4XmYu4OBPdipNhP4 zDh6ON?fcHw1-FHIN15MobV_ITRYzxWW<)m%nWk`=Y8$@dsMEIeqS91~-oBdW+fR{F zZ2Es$F*Nw%=KrYzrhPLr=m)}YS?27UjI%bw%uaeImG={zsdkVuz?18vo7sHnMazy) zJ%M5I(|e9&xpQTglQliZoGjUyW_C5*W}AmOJ>xt~IkV2}oO;SV4}Vqx^6=#;LuSX< zb18aG!3+M1v6oGnFjW?$a(0}SOOCSVk)EUUxwK!qFa5ElNH2XiY0^ud*{fSovJ0Mv zv37Q@#@;h?T5&VkeREimQ-%*4IWm!Q!$*#&yWreW=Z_qbNSs%9E)jJua(G?c`C>f( z+>xUK?m1=L$mB@HQyvXJcWf52g7M$WZ~gYK4AZro=Ej7ATNv|45&=F<;T*26H+m7o z2`arjDs;{ri=C{&a4NlAygJCARhwmwz)xu7DxaM!rDty}@|MX+AOlp+KuShFJ6Ruv zQ#M6!XYP>UvSsA4lhs9qB}lxKMJ%~G%3)*cEE)OiWNlNWsz9OU>(NJT*+C*M(+*Ms8Laz64qJ-NltbmhC95Qqp;n@ZOc{%j zF$VgSK8mF;LWU*Il9A6I(_3fpBj$8T%0CvWIO9LzN4O32v=NB_L%;N4AtScGGwT|TYrX(re-@K164B9ZPOh=#z^S9kf93L zkMfux`kT!F=Y+H5;uLt)&8+QDz7VD3IYo4w$}2Bky;m}yIY>!&*z!mcEP#!mbmK|C zrf?k?Z;8qp(90lgh*u8e?=CQ9vSlSSGug6H!TwRlFj(Q~Y=%V&Z-MYT$Az&GEd{;AkqFM{5oS0QQ5eT$NE(jFNVWe9Vn5B)p#MK$BYy&gz^GNVGSGwk&?Fv%dkuQ z7X-d2uJc_)=@!C=@MX{P)9Y9KL`!$_djbN=zDJ;3wz4C=l}@oPL&sd!2wHlCpZAMb zSJdlvexhaN{FZ!*nvfBMWSJ@+hWr^t_3u+LgxGiDF@jL>ZlKDF5rhhzA=Q;*1R;I{ z;Su6-MiAm!?{ug$f)KwI)TMGp5IAUSs562P|7TEbv;{^G;<8IFJw7vnP^NXYlKv19 z7(qyta2;f+i(&+!Lf_hQ;l9y|R|%gidjDv}fsj5R8keCK6)7-+;Bq-vXkY}P@_541 zFf6L7`U0RNR(2YcK4~$T{I4@I(CrK+x7mSQa~)@Ypr;9uWBTuyCeSD&FmRCHNWtp` z{b(alk2C-64lj3G`Si|o z*bG~pSKl4Z-xT&8gD%Ib`Hbcxq0@XoUQTIO<9l+Nn`v(4yY=ANP2rB@@xgt@pCD0q zPJ)+<8wILta=I4(98%=^mdAV#)kRQDp6*cbT%WDUq!sU>RnDt2>$twkft%c#?nfg=`^kuO}9dMX*?eC=xm41 zZ0PJppT|G2G(4lBb09jyp|c+P=9l}<7uU06`*|OC-}vHuh|YHGN7i5P+SfiAFFmEp z@#y_VZo@CbKZ5@>{;T*M_@ChafG^^vXaGgf4GWnf$Z0SolEzn7-5R!vq%ka$4mpj* zL=v=w8Xb$I0jQBQpc6@>JCmhxu}B)w8kdHHB57o4Bn?AF(wNk8w9nJHZ`RsL1&z_g z^+miT3~zQLB;&I0+c+~ZCQBnvCDdTl%B4}INE&DwN%I4dG=Z>$Z|AJTzCRp2I+&zM zJ$-^~q3f(q5!28v%>{9tnv)I3lU3|&gKBfazZsOu=_$e&n*?1$R6Qq(9|@E`U>%Tl zmDCs26^I|z0>N_41xtWx$7JjH6tDh3@i8EBU5R*n9TXq(yPAVOq*LnwPV;N+>DqoJ+qG{Cyt21N>GG-wr;*!?%G? z@bInRBRrg$UDrt-z8SpS!#9EdnF-w6J?hi?G?u7|G&-|FEBaF?3$58{SMwCea2 zZkC==xfu$RMt$pp7FJ)p-NNc$-%^-`Ud{DCNE+!Ws9%Nb!s?SLyTbuauU>I-=i+cDr43EGg5sV7g6_+6rMG)X&s-v-IG|1q8pDUt}<>YhA{Pb29l=fEc@c6row zoI95Nk27iFN-wvXPVf{3-p2li(!WI?{6Rg$IOz>pQK1Gd+(XH?|4~clIvhDGf_@@Q zCYUWF&;G}B1{Vnud`TS&ZV%-^q+FJaeET1ZG(f?9&twFc`^}P(Z~sFwUV%H5v9FtQ zNMZ}$1-GG$Y5-*$>{D{^6h_o)$Ye}_HNHD!}SMw_Z_w% zV+aZLT|`x)?1ETRNs6Xo>`8(-{)9?3|;>|lR+@cSvm6V zDcz3@RLCO-dcKyq`Sz4HAY%hEG~m&-tmRrV#D(>dcQ0oK@9)8+)xL-Ca@1+wy_}^Q zl#zIkm189Oqj~Oa-o2b<$WWc`%_s*X@4j^ZZH<-4*iHiNd&rHU98{59@^X6G%bCJJ zb36$)GJus^iwsMgB_rQn&T3@TlJ=0vaDsxLEE)OsayBF5&s5?-8}e_U92!^SJQ>~Z z9!`+$R9kc2l1KaGy*l4~15B+!*h;SN(HGtgz$3Cxeu6Cz~%>Y^Brh zxcBQ}^ivtpoi6%I0X3#iUpxe5`L^;|vv0WZ`9D#8K@Dc^N8QI2*?!c&DL5dS95K%m z9(+RJN3^_q@a`#&?FG2~9X=sY^b3&(C=r`dMQ=Dvkp&;BjubD0%&FN($vp((f8{4q z`UXEA#RnT!A174yCO^?$Zg_rDG^%{RF3R+;@mrY8TTgLX-jQAxD7#amQL$^(5}p3L zv?N0^lN9x%8ltCu&=s(Xx&6lpm9t^i`&}Yoxx3;n0=k@F!>mG^Zn~br{%)JBQeo|% zRp>hAg4q69aSLG?U@g%l6-&xv!Zh_SyPuzE3Fl2BB@gjasgr88#bv2ns}ht;=dX+V z_o>|QHfW=Iw=2wFRF}IT_1+~MyqZn+$DPd zXq8U5Ii3O03N5LqghkFSxXb0sLW3=_K3asi3LmTLdl{f4R`MA@zt8j2SIRfV(drr{ z@BbV>MUerY0K|&=NDt*ze973p{{bkD_IVvp%N4~>>f2u+TBB=o$>=kC-V(c_U+zsY zdbM;r-|2?7i^DChl3Ao4iB|JXSDU$=4A-IO=? zzFBuE{`OmA{V}{fso)f>Y=5n@EM9HKwkO5E&)>-fahkB2bu->KIjtAamJFKSFlWH+ z^ZniS+q$d7W4AXQSWwQtXpuBv9Ij%FX7?>TYLLD2=H`g}*!EhF($nn*sk$bUg=uqBwpv=zrnS~r@={}obzJ6J-&vJ!83Rp+Mmtd5c+>? z|LmUlaZ?Lr0bjMG@sR4gKibZXq{2t(8h0g3$U7-(;)A>z{G9$cRBn1Wj8De zrFDki;t%1E;Pp{^txXTYYyJ|)_t4th$XNr}a5}5`el906qnOAk1T+_yQ=UzP)h~^O z-a=UYk!0~6j%fX1D*g`W!d0e~;4|@yJsRZXd`n@KVHe&x_(EqEQ|m{K#$u|OIZf?! z*2`9dyD#ET;KO}G%>(5_k?LIi{myXzPvz5mZ~cJwm+$=H(}l9JSoozg2HpFe>t|~} zRQ<8$m@DyX#E0LEmt7#qti{WPR>Hah)Xk3-AL4Fy0RDZ8cM}}KVS3Gb#2?0o*CCpG zuIqT;mItN`B~J4O-6zRXez{~o&XS=z2=mcUOg?NAl9##9s{5%lii_b@Z(5&Hn-g75 zb9$PH!&PS8O6{X+|5SUe+B4N2YiLJLd#<6)JzbCXVP$(yd$O{Xw}o(&Ba&t`#+5Q3m%QhhHse_8aO;t^ZyY_U=RLWP z>e)*h1Nk=Mr}^<_4^8Q3;ya1I&5yVA+81VRrl>Dx=a&Tyyz?daw975}5t{Q-kNzfK ztN@;yQ(Y2rqfugsz1i-%?MW z_@;a1U|J`8$jSVKztiN&117&eCYI9K!eEse;&EgHIWJ(%^Xp zhZ|%e$MLTZ?s9CX;X@2^O)g%~w&cbP0vxUufeg1-P5y4Ln&;N-RSQbK;`N*>Ug;^m zy8@nfp>9uH`9OTzwoBHLPV(0nTn(fza<+w7vx~KZOYTA-`8(SzqR%n9+L-85fV#d( zK*dkA`0+-sH~JW(k23m5qt_Xovbg*K?z$SeKlNmQ>(n~#9Pm01C;zU5htB}7^6+Wk zDqxtNa&{d=PKa}#x|UkJ)_8Y=e_VwiKdrUy0`Ktfo#2Z-d2OPU+Upo z!H0VI7VzUdd^32lhi?LZQ!fWA&qnaQ9=-wmTOPh1{AmyG0{>SJUkAS0!{>l&41wz$ z#Eq*5cl{0c5z3JOS0t`;54e)5cy-+Da8G}sg_TbItLT#XvcfQHOn2168q1C3SrJ`h zj@vA(mzAEO3iiXawtOq;D{0^w_mMPG$-Pj&a=wMt7p*ZKjUitoEIv8mw&#?s zY~X7>q`2LL&Q6b~pDeetAa*gx@?@-`v=qo6_Z0&T# zl@NQMWUhG#j-DlOJ?Sg7!~%VVD*BfUmn|cYzQV^CoF_;;Hh9lOR!|O#CYL26pT5G^ zks;S$G6Kx~X35B>uOJy(&<|zY-%UC4=_`Dey3{-SN_G0U)!o!-K7EDPkujG0@H<<(ahf{Y;~+<^>byp3zIrjisF>Ip1b*wiXbfz0!o zQ;EWRN_|SvlMuf3Eu2XEIir4DGGwsgJxm5BrhPpPcVUhVOFJM_!!= zjUO}~=(2K*ryR+OFrnUk$$5Tt4KmJ#cTC3qe6DinLwqgs+S)VQ$980>eY7CMwXyv5 zkyqzo2Qt(y7iN?LQu2~QeT97IS9c*}I|&w>4B7Fbn&pz06Uxw2qlnD&t7{o^jfY;Z zn}ZuVD494*Mn0W~y~wB~?Fy6O1O-1?GV#29qylauRBhU|?=CeD-5z0SkMypyy( z@>4xDo}->u2vv96lg`6LWGsg705X*E%oBrWj^SrBsB@w#i`B%z9+|^SO!nH~$h2`!{J-D)zU941^{I2}oKvUPTeogi-F^6RI=+dYAe>&i z&kN$!)7@+DyH!YS~mwF}eWnFW`iH~Xe!!mk!9(C~@m(wlwbr^7#nj7&qq z`S7Lu20z}oPGN2S3qavk-MG%Z{i^|)HF3#Z{G1BgNqS0eC*ekTQn<*$>pk0&%?0IA zQeje;-^0U6!w&wg3jy%1|7Cy_&bE2ulPswXpin9vk8BB?{)<0^pC928e!x%S0sOcL z+{2r~1MAW{VhM#wyni^z+_cdVODKK|$m7O4VhP2&@YD2;SVHju{NqT+5{l2@??t~} zLh+SB^%4p$fK^g@2}K+j6{?p|@Cf0ll+{ZpZU%D>QCUK9FYpxF67XROMaaUlKw1hvSJ=8 zy}e?Bx5uqfG~WLXN74RkD=S*bq+ht8B346a9fckA^VUz;61vQy=EPcIXk{uaYPCd( zHR0oM!0r?mmMpAX!>Uk4ft<-Eh629Lb-eQ_tu0(gM9VYSywceDZiv zUb$@A)>L84k^SsW_;cO=Pv2PWjK&b!zRK`i7;}NfxsmqPR}>U3$g3)@9FI@IV!2Hj zrVH(Y8P!I~#+FlwT?b(Z=R(eh%Y|D6$9I3+^XL^LTdzmBaUz_9X)|TOIfT|Ok};HV z8sXvdJuk*{2mI`X?t=dw_}TkV7xi*pWEvl2FFW1CIK3p-zH*A0GAuTR`2o2;f@>qV-<)e8xc8jvA-H~mYa~W{8*b#fiO!$B|N0qaUk@|i z8sypvuB%{re$JYSE0Ep>xXo}J_P+r4F5KVYSlPHP{RB9(+(3=P5rpdi9Jz|%WF};v zkoagS>l8S+Cl|;2QlNYQA&E~TGUcd``9^gPlPbYNE?On(`M?DR^=J$dADASBk8EV- z^P8yT6CFu>$dicqC`l5ZD}{?sh$QiGQAm8^Ac+qlBFG07lKAK*F^&OF5}#g$#HU)4 z_*^BrSe;1XGoxe(pNUA~1Cpr!1?w+1e9`vz=r}L_Ccn8R)w$dYKh3<)&CT9s$+53d)Uw+$$nSI@eW@-WT*;79CUTp?Jy1bf6Tx ze-wD9z}p3$CUCGown_58q)YEVT368p@|Y^*>;G2QRWO|WIm5kxFkhtr^Mpjz`UCbU zAgVJ12+2T5IYNm21q2z{u~(}m7_V>|$%^%HAY0H_a~6V64snDq|C5r0#$6+Q>}JPSwNZkl4@ zS-?kIct7B~1m}G5JHY!R;f#;-wr>DG!oqh0_geTXz`vr=!oLgnUo3nF@Ru#T8Td8} z-wyoO7LNN{)AbhqDDbN+d@FFXUW4}C2i&aJAif2-S+7C73IArj2Jub6&3X;u8-bhk z8pJmMH|sTsuLo|{YY@)`{tyz2Yx5T5Lk4h;LvU?g4Lkr`VZavwhlrZ=Pe3KWWSF{! ziJx+_#ZR5r&<`1o@$MBrZ*n}Wj&zP!;?bVy=a^*#{b;D1*B%UcuD9TL1ng?P#a{Tc zh0by0-S9Jv*9th}f64MAy&*dKHuyEy*OotKy@fq0l1J2tabnD>iCBTw7fZCs_w(0C zggI?xG7i>;g;x&Pi!Ri=$e&zBVJnpX~{ zj0bQ7kGf*g($@Ni@lqZqcaPGbN9c+u@3-50-#-C5I4~Fh9ifP$)LHMy)eKSe`MZ;# z;}B%hqwKKti4IKbw0_n?2FjG=wQ5!q9X%3Brhx-`KTKBW()XuMd#^O z=wLhD03G(#N}jg4hT=)+K)2)E@iTO^b#BCN=)m~M*(Pbp3WOfDLS|X@qt!JO)hNiR z;9hh@NJM$sN=s{ND0V{!%VisMD7oHkmP?y!DBge$mdo}iJ3z9^rTudw_CUu7wEZ2T zgWqIi9^(on=cm?Cq@v%L0)g*)DmiBhbck?_j<(iNe~*V2pj`;%)ZvY-QFbY}!~FyhsHblt}@ z(;}eiBAwZ_4`J+P_V&ed1&H7Yt)XChp+mQ-=5eCiKFFc#9q1un^o2DP(MuABqkB`! z98N`BFv}cz!e+J1;bs!K%wae^;o}^>N5>vs=Ae#q=+(m5)EN<(ew-r_ylEn2g13Ew z2%t9!(!Tn6Sk{o5*0K%a!G_Oth+61ym!f=#F?YQ;rDjJjb$CPMk`Jg>db4{5Z~L59 z*WEw`v(o%Z{c@;>fn4NqzEZZ%Qh%1Btb+Prwy)ls*m?{X1gH9fHOJG4%>6jjJowaU z)UjNz#pnPX^*f0LGyPng@ekCnU~nW^rXE1tN%fVm0V_pM+%FR zRG9WDs4xwAHxVJ94_sSwEjf@yFDd@BqxhfD{Jn!U(->k(4w`O9NXqYEmp;8?t2^?? z$}a~uul%O+)0KxSKMvN+U<9wej<$h+T+wS`mV+j1VVdae&7lk){^-}I%;!MxDL6&< z7Qoj`4C`PV&vRt!@494vP>Gb_w?jyTePM)1+?!D2_8$ceJOqRXO1S;Y6qf3E{zVmo zT$if4kTLt|2zC8hS2rj^-5^mH*OSTzaVdo7x}Hw_P%0ema&{2Q70`b$IQv-m!uDn{ zx=<210!iSS5O+A|IUV1*_~qdpp0OQs0pi{GO99+7wNfhN0Nc&xXXe97e;uK88L&hT zIve*)8u}5@D&wtjqvI9I?2C<-`n9df9E^k;WDKT zdc97{*YH0C=jY;$E_dO_^>ZOmGWS$?<2!|Qc4b*G>*722?#d-iv?o5fOIId@*%qJD z+wt?9`Q&fG>5V(vlI4svzf2i7&2@Z5@O(iQf5#6161*wPKPdi2Yw`kkM%$~*oS9y3?H6>uc&rNmecVO zQK#5bJCeeucF588WFL_@1UIkbs8c)SY4aeAKk5HAc3im2~kv51`(mD5HfKuhnBIpE8*E!EHva7mLg!vNd zLGf<|WGzQTA*B|tkGv8dGQ@;Ubi1`KVPRF~KF) z+xXc%=@KzKp#Od<^weDiv^yyRd zTxU$o=Dhk*qGfFP!m7nskN^!o^)&!B!&hKO`yVZUQFFRFf1IL%U$`D7Iz6G)EbXm- zX|IH^aHfQZpR~slDiNo(tal=p*R+|zPT|rrEC4DjK$c^Xj+!@Be)XIleHKT1_L%cK z+T#h^tfrvawn|FE@H=XD1a;w@qLPB?3&wMg#we$7NnUXkzCtkytCp~KseEz8tWuoi zQdyc`T0F|+3Kp1DAVjJ3aeYGL7WTAg5&udRd77-lIu$DhI9lh5k3 zo%1!kn1)sGvtMUAxJURw_qlRXTz}gvS$&mCAg7Zh5{Lq&b@&{XN8Lh3QF?kh01ZHiBnI|y! z3EIrHA!bbop|P8OUYvrb?OY?mH8m%Xi~s%UcYk)<)NgCfIGFNbpJCnqv~TCQ8M~jj zd+5%B6`9HZUh~(u4dC4Z$GMGNaPPpiz#W3~A<~|3JU?SLBBKqQ&*AmF;2lWBr5=(1 z?^2llrU8RYIG2SJH+L@ejAr4NB9P&8_=D?q;WzqP1UKR8u@HR59+Phrr;E-vkeq9d z{QQ&wfP9W&J)$h_VH~v6=(cqsC`K3a+VG$nsd*ezck#@G_~S8e6NkFQnV)d|qMW%H zKg){cOd9PqVO+~YTe)V3Yj@0fCtT;lH9ThR4%hf_eGk|D?122+aG$~b0LSr6UpT&V zoeVb*jw2PmYvmf2EpU7Q0&vvRkZJ`gYe?ebjjTiA6BylMzYHfHJ$whcA-&OeZ8h#F4}&I#K_SkoW*8Tzs%3*X#HZE z{vBZc2uT1E(K%ZmLrwRQGfrAk~%L+fmgpn>Mc{mof@?GJO_sj-z<&iteGQgA(pL+;67)$T zPkM=^kN9Na8wL6V;iLJ3f%6>@uFb^z!7-j*pz|FSE=5NZ2&IpFMMyLLy@di(1+uRo z{SojGJ}9t2V6H&KtHMtah*>^``#c){L+~#IGT*3=vq^++2;40Y`KRd53w%uALjvy+ z_-lbT3cOBWy}*?MR|w=}7UR2E-~xd;0@+p>K1(3y*NA5b94(Od3euUsggphazaZ`v z2%zv0favkn_gx6n1*ab3)I-RAh%g`!<)(1zC!P8UnZJa*HxT*+GG5{U3Q`|twbh!j zF1TG$4`kI@JcQK4aLO~Bf~Y1`%X^p7Lr4#XIfkCp1e|j0g9tYOLf*R^5OqtPwL?29 zf#W{rT?EK{DUk47K!(o~`W&G%-$~CB`V^s068Z$8X9#_?&_@V;sL<1e&h*hP0F|Eg zXa{Dk7T<+60zXJ5vEfbX;L)xh7d@LJ$IEW8>xw~QKjq`#@j!j}SHZ{f&~rdkUx z172z2{eW{0pZfTotr_?LeZShw_XFF3%l8cwz72T175*sjuTdbBC;wL9doBDv;ICTv z7T`}>coXouEqoL3^%lMn_|+D^0eFdpGk-6z@J8U1ES&l{*2cB@0PL;?-UStd_-^32 zz}d&(+PoEb2Jl%5bv8Ew4*=Jwv$+g7RRgH8JNop{da^9>Qx^9KMW^0p#LqanJ~eQMu-b>CGdL!u4 zUx9)z$-q_eGOV0 zT;X+P(|_WWo-n8VOe&F?K+HOh=X?Efe8{h|6+_IFqa5h7u&~lR14kb56N%Xe{zRwa z|0Q!vYS~4EU|Q|AGlIx;d75Jt#nX*w*=QPMN-ZJ(0f5`m?saTl8ZZo-4uq%_&AA1Y>oyu?{Z& zM3q&}kAt-A?y6A#6{DlAb#Ny@2d`t(HMD+XbhNb&jyk^fhIPEtjvZ~SgFA8nwt>W9 zd~lk!U@vq$uDvmKw6zY-H^gxUV!+~@Zl$6P9c`_H8+HcnL68|ZQ42O+Ap@3(vMnyc zF15Vk5t=7@y;T-;uzF2`4$d=}3t1Gpa&i{t=jZ58q2*NO&5zbG2Rbsqodq4tfUU42 zlo6su)=H^a$=1%!*&sR^MMpDq=;4h4p>=R=o+b1SbOd4eZpjacI>HvS4z8{Bcm?D1 zoYlN@bQ&@+FhfysZb!_a9qq4S8!#U80?5oX4nnQV&J*ZZU@wG=K0AkbxfimNrt5Oq zy+WUXYN<2p0^3~Un0}V7AN{go%fslA{AhD+;Uwtj2j&dXvGqz_UyMAV$(e69aR55ljp4HL6cgC_IjVkeraQWhRYC`bMouww*jHqpDjlpJt**zr8ag&Xc-c?u zX!C5Pv`Oec5oxb;b)FtVS}wBzR_imL z&`mGWs#vz|uM2z>_j%qX@0)KVG(=g|(uaNoI?75hGA%5x&|x__lc#1)pCOMcmqY z3+?cgr_>e(T@KRKtQYJyAInSajQHT5#0>>R)$Y4D?UkZ=&c&h3ouOh((tYZ#PAJ6teYS*LypOXw`mHJhi&? z>+>KKX5UA2-8QltX2ba+gQ^Y~^hw3J-R2C2ZP|!W!`Y}fo5}eu7MRxWj$T`7t&gpH zZ9HPZH`Hz$$i#6`EY?a+qlUUa>L5cLsfcey64Mm%-AG~zi1jO4f_3q<0gFxRhETa$ zv#X9n`x+geWt1x6IcuvIqM1e(?VR9LKbFY`xAtcYsY8O**PjVZY`|QLiuJp9DpgX3 zp(+uQ`-c4l<>p4oU1G~=1FqF^RX+)t)kz*@No@PY_u+bsgwlq$&^wq?KL*-@4e^Y_ z>K76e^)D9RKhfugYj#BYh2CdJP|KAT|MTDvHatLzrT0Nat+V)UjnEs)hKsQLH`s82 z#aO9Cb1ceyB`O(Mv%ja#3$}pj{$yi5C#AiBw(sC-IaRUuRQZA?bM<~q)Tx)P&PDZ) z731w+a0OB_99;D)7ZF7Tz{mK$8P0@!hYreQ*=HC8)UR9$mXz7eDJNxafLk4`y9T`y z>SO)NH%~ieB z3T7qDkf5@iLIH$N9QkAU18Xz4A|z>T=4t?6a3#&wtV|48L+1V+w@_uSQWw-2R~Jt+ zGi#N|)65xuLhxCz)*N!Hih^|>)Q|ei>fmjOWJFultGionr#78ob;+j8Mu*GnDuzqb zu7E$-&{cE!CFL}_?(qy9j`e`bJ!JwT&jj~MtQvoUZlE${npzmYfbzH1u~MNaczdG6O$97M5Yu*@mA2ZTPMfX}lEN35fYYfLdG9?g z*r4)Q_xGW8aWo@ZtIApK1RY5U=d`L%$mX{qY_6rvf5r2GW%I*8VTbArp0rxbHqskD z1BE*W!i}Kib`|if#k!W1wW|GfJbmhcs!mt$U^`V?8CvEc5ThNtt^Xs%kNa!&0(5Nu zNa?~HWjUy3?}wbzG8!^9J3`IAX8&l_PvmGpRD;Y{Qf9xnAZ6e)DRsLb04&yP@Oz;iv6D2Wu@GW+=-r?)a5-C< zYF4Kp0J}+6vQmv7`E~j8(OsYFy;S>Qs|;E3&#Bsqs_Q?Gm$*FXHNEOF)V=N!a!Tv(1PbeA zDQGBAQ+-$g4@^PO0kg40#~N7?e8F{Jl1cR^!HyVS+V{wH!|*a4&4b<1y2no=AG5pt z8{`$#hw`ty+?0Lr_U|A&_;5_Ap95A^>f12-QijXDV>kjHa&aphan{IxmA~*a%iNWi ztJV*G(a!(ml*gaBdPlejp2rMWWD#5x#Mgv5oH&TajjYzK37zo+V1*eyf^~sC$U9jX`s_0I+ChO#;Ho5Aaiq!id(Fa+zqCzWj$B9p?pJ{_XOTTUiG zP%5A)xcg9vbPKLmH*L26Dm*_7Bd@*>>K0tj9v%Cx)_sir&hEeeig^*cfLERSEc4MD*uv3Un(+^EI|E_J z?YV5|&qWt{+hd%LVnALkB-dCo5xV zzhAo(vDNP!d>B33RiU1(W-NN{HtYH&5HWSVS~Yg0_5u*Gaqx6j@|U73In5xW6o+*~ zOAAF`b-jKf2&$V)=lVl--}Wh{o=o31paoUWxqwx<`xL83Y=O1r_>X&SGV@1Zzexhor1-CGmw|&HgZBr~+P1J;BvFq$i3# zRqyCTHG4-FF1C2?hbF0G>hSO>5USZRz>IIyWcXS*Y=`wXKJ z^)#AG;f9MTv33^x?N`cVYRjzU)5Y2Bk?^G1@C64rcm{2FRw>bsw@Z|teQ2=ZUFBz| zzqa97GOwMd{0}St9OeI`^2>9zdH`KpcL!-J3lOfKY1LprKi1M}=Fu|D!?4Elu@;?G zHQO0(r;*Pq=Yy$wh2N=6s%;KFO?_2eK0k+k#+@?ZX_^!2q|_bq1c;!3{3s}NRWys$ zNcS}Gp}nY<0}H;#{LRGEt7=oOIUiin?Tb08`NiVUfN=-pbWW~3Rzj^6TKm;I zSlW6NcMZ6oNH#A7Fn5Q`?_lmpT~+vXJ@k5Rr5E3pjTdQ+1q-?_ah}>ArZY}& zcM6TrN~qv!rDOnp!%7y#D0z`eMhr7bPN&eBS_u{GQc5n3P_jHmiAw#MCiUJ6DKuUy zp@I~YhMWC(gp$S>B`P`NL&@RlZ+Eg*LIrBUbT+qHhLh72ql60w-N`qAU**ZIRFb8Y zP=PwAFgpXjuo4z{M8-N^b;RKumug&!%tN`l*<2*9#1#FN7%|@lFeJHm;J0VOQU1>H ztPR+DoP07UHvviL1=N$wHT?=bMxhq~-NMjg70MOv3O!DtL4yVqdXqtW6LnJh0{6xx z`u%@EN{2&BT#w%Vt{^J^5xtXH=U6atos@uYH2f)CO|QNoZ~-vTT|d{a*8<@;1X4Z# zqCRC{gymBP30HyRJ!a`is`e(V1I|6w9sFIs0>H-xHiL2|w8xL_GK9eO-49AiDI@e< z>hIhPj1f913l%BZ-#KIh)^aNwd|2e`c@T)3@4C$Tui)J5Z}1z={=G5T?|p$H#V%9s zQpDq>*eUo8i?O9e7PjXjie2iuWFMtOaw9}ILlq$sKY*3&($l5Qc)q8CC9X^1a;0E% zgo0i%3dT{vlAejM5iQr#ixyw$x)ffc6nq$=AU#GwF%?|NN~9D_qJkRNrSNr1LEktS z&HhT&RnK+4a5pyr+OY7IBK5juP~=l3HWy;y%;F}Kh?G0tWfW`BViXw*0XO@)2(jW= zu||sBpv5S1g%aBpAyyqLb~nZTM~hM99wl}-LTr7k*zYKIn--(U!j3d@SiGIKy$}oM z$rfN;?_s9imVsi;Mu~QNo#-Yu#nf-0&~HuH*Yr9O{ao)U6;aFB*CBkeuRRXp&)GC zdBD0V4ewIJH9)m>?<(t54u8Ph+Xa_;L?`Sqg6qx~*zO)4*>*4JsQk+r>t|B05bIYe z=Gn-&BSLK^!tAaasN%Etq3u1Y=4m5;gG=2ap6+*$;fsy1>Pr=e{p;e=+|=%V$Ekvv)N$fD`U~$Yi$ap{}C2jP%{EjQA5o z+(u5tLn8G{a6Sdjo=W8~C5}Z2$3Sz+pU_59lkvHpX~1~DN!|tuiy~Pa|B?KHL3^m% zV#-~>{hc9DW(3xQ!p7fOzVCAt@T4SgnEO@oa9F`qCux=0qB2RTOuodRN2nNlkI}A4 zAf_eaOFBl0|7<9kfznRImvml&pEf4qOFDbt=NL2*U()#qe%6RYd`ag=_+O-7e@Q0} z3Kgoqq>~I(N$D@?9BEMfC7m>&UsG0pN#|auibKUr)L+u^%|=klHV^|H@g<#*g}f(l zXwVT~(kV86d`V|1{M#VX5ns}2Fm!xLXEXdXsiXdq4r6(VsQ!|U?`imZJ&T_%^$3Y~ zk2#ji$GwH0I4AHZXx_Ml7GU4O>z4Zd4sWOZ^e6lXZwAuP>9{UK0DSJTOpOvvc6#pz z$sO&wF00QC-B^WALh8aTVhAf#o!&js`?#4vi%T6hvbm>NeT^V=&#UO5MC$_;6OJJ(yu?H|*8$aXjnehKdssP!wM8VAtQ7Lu_b3=sncH+fY(!s=qUHMbX(k z{>KOJv~{>n9M8>}+-+!*2Nt7)3>~5aG{HV=$EQ!i>1a;7NwiP9>158wNs2vpr*rt+ zon$Q&K6fW2>f9ZF?D0BX!e{(+wai1S?KU)IEegLAa;GasQr*K;514v{WpJA|iAAFj zwz$b?u}4bo#GRNFdGydxA`LDoJ31^xwATp^rH@HL=^yL5^dHw7q(LaU0L|{y=}dTg zhqVvENl9JZjKl)4_6h4oyX@rhMv$g+91Txr=qFb}{)A8_#VNeiqlMU4nCna2AwAA4 z)TjSFTIj!Xw9p`)Ln9w-t{5~YzqFumAXd8$!p5IU9D`CZXhPwV!s1eVxpq)iabBf5 z>taw*)}qpq!kI;jt3WC(ANUJRt*R&=R8*2*TvbpwC`T5eVy{tnugHJ)?J8_OS}LEY z;`(KM5K@F*`9{^)^71@koHp}key}R?GgZ(U{-Tu}pn>?%h$BK~R#we#g`BAlKFQ-p zwL+m&O7ktkw3!odx(EW%5}+}3nzSS!b7_8InTUe}+_9hNV%(8(7;oTSgdstin|LP9 zXz~o~b_ot|@|@M(`t6bEJJWM2DERG>xc&AaV4c!4(bxAW9PZ>frJJXJH_w1>_$F5$ z-|fD0)Zf>&iD&*f(Ud8pA$U;Qhi^0E=*nc zgYPBZAm9C-@u|K~JViZxi#+$bsekkIP4!$um`h81AJ0wnJ^jfio|FC9eSdDZb2?n^ z>w1^(ejYF7dvR`}XHcqVcIq3xO}aiA2^_(Pj}DU?tk+A6Bdj~^_<#mrRS7X1TOJB z$~6gps&Vre0SeqrEf;JH=%EkXHu%K53NY|tZ}>J)T=(e8+;#MIe1lvr3(i8 zPW2t_D_NE3Ie}@N*|S69z7A!c(XJ<>r|-iKNxmmNqq}*sx_Nq_n`4PozSkJ^j`>=C;s_>oVOs|*g?6@ zxIyAzuyhPbPvx-G$s*v4Ne8E@`l|KtJZunp;-TMlW)d(;#l$$*8-$)a;GmR%wkReO zDOHQ)p)1X-3plvTLSGXgc8=1JWk}o}cQ}&7#N4hEgaCbUUgcqovFt>W_6nTq6cTjM z!MT-y^>82)tP`@WNoZ3H?P-Xw0H6N7MhPz<5XMD>oP7yj#Qp{cgF;4fdgT(70gb#A zkmW%?KRL{47u$I99>8b?`NJJG`XX@@h&WHqkk$jeS&_0H26$3?P3UxJJr53rYeyp>nlv8xd$#z`0bD2k>j7^P|1E%= z&S*^sYL&6Xs6`#3rWJ73;dNBdj0p!Sc?OWv6t+T!?^hx-j6#xnVnm6g^+tMY;Nazl zSH?rwO7JX@3RGy8k)`@K@EFS|-UQ?$tsNclAcmf#H2_{Oej{(ftyoAJ4K^!Le8xQ% z&z8`F==EjMP!3_*n@aRNL*i5I=@_ZffYE>)wb}+U{1!MXwz}@m zdo(pjJ~B9{a&g(9()`5;8#p+9=&+H4W|mf!=NAfaPQJh%E(Q3}kfOZeqRR^}j1HoT ziKXTGIJB6f^3?V*{P6pZIMOakt;m|a;y7t9ilHp8obhr%h&ZMzJ+WLRMfruoV$6ur zV{x<{S7vI2uK&G56ogIQ2G zziQzGOV6~KY9x!(<7igwL5BL=JT+RJ&Touh{HgXpRba$dfdlFEXEfCy7uHOz!cNoT zLXBFY6*zxSMv)cx(&7>se^zk38A_!-G%*liCVzWoa4B#s?8%;$gnT5Oq$(kjo2MX=BLvqD#?&Wo?khR+_kt04 z9WKhOsAF=gm2U<`)rg#u!lf+pN_8$|Sl5N2vl7EJ`IzcV9P^o1Syf)>lvFLAUsyhU z0gjVYCwNvk3;xR=WUW-$$WPCzOl;-Lv$AUv-+HZ7JB4$2N~tzK2U}$;anJ_N-efR+ zJPorV{2^U+lxY<eBMUX{9B)LsH5j9#755k42%@ zKURI|S@i*7^=!TROv|w)_@u4w)hlMA1FBe1R9F!C$ZNIO==QG5Kf6SpN(;g<#8$V0 zQgxs!Sr?Yz2Gn-N%VG1jy3YzI3*We`?*K1G_kb#{?-fp-?yZFwx;;2~#_NPUt=^9C zabW4^t-FlqwkSr)C?|ZMaTuvN@wA-1mNGbWbgStwojjHEQQagWw)421PSROWoVU=a z2=|Qeqa=0DhZdy@Qg={}23Akz;Lrwji*YIoD=Nq5RTMf4ii+`dXVgoUxasm(Jxxup z?84nebcXvrBoJMoQ&3uk`w=SetfIw*lev8thpEOeTOAk7E-VuUtIo(VtL3pFwrsd= zJMHy%$ZOMTr7_`a%_tcuS4X+^BnMv9Vaqft7sjnFAADP9&)Axf(%%c?48>W>zM#wCIyJ6YL7Sz3m(EsB;p zZ(~H=2Se!jaC{*YzOG1p;H(cWuN`yvmhDc5p+_U2KipI}H&YM*oT~}f2afMKoa^Ao zsxH^b?q&S{In3vQzz*)7=C(7oaxxB3UOKiyR~>%Ex}q|#1Y=e8N$}A9%D&q=IAN)x za1<)&;=IaH4$8MQU-b!WJf_2{!hIQalr7PG%`e=$7>bEh`ZbY_>U$7%q$FyPR&2h7 zjy}g|GMd>>8JctgmQ0qq7-mTMq4s*hH$H>PA=AG5wL_99QywKwT z{J06WcK2gR>rr}aVVeHD)xmPi4FC<9BWt_3+wME%G0*CqZQGT(d{*OG>FS2u=7XEV zb9=Ze`#ZQ}v1fY#+z`02a8u!O;7Z|Ez^#V+AGq7#?t*&&?g_Y8;og9I7j8e?Kj4nR zO5>B@2Em;UcQ)KSxXa+Kg}V#xF}Od$eE|0(T$c>U!JPni8r(#Eb{{ET9eyOej)n1E^=n01Bd2D2q-(GaV0u zN-ilZ4{-c9hJ&?G*XN0#zj( zV5*0j0@OSGs0dGqDn~O|2pnJLNTWxIbX2{-eC10-f?zGLT?uI8UeX zVE}v&fZqb>JHioP27Dt(a+ZWX3n0Gy5um9L1QftGM14e{0ACasX2|;U0-|Wt2=ifq zun)>b7ihusM|WPiOHe!k{opM5?2ufu;BJoNLmUiYz@ zhp+Qagr9W2#$!KEKVRRC27M#^d~Jsym6yy{ov z`O@X@!p}D$6Em=o6?DGD;C+el@}>S=7n53C=j2Lk>S*8SviM0eQxGf950WY&yb@ z0#9ejOBb}Ep!JTTjR0*VXer?HfCtHTMuRpcik1P|lqlK+&}K)`Ag*+5?VmlLJlpczwiQJkdfm3X!(Wc-R=YX-#M&_*)&F{H?|b789as9v z^p~EVIP~^kFYx4j{>hQM+`IPte*VHG*In3eW7pC3FKoT;;xn(i_>z|SkDqgS%I{wO z{HlIyIz4^bno}-$|J9}Uc764YXY(4$2ER9L+(%DOdozAk@&iM@Pp_!k@z4jK4!`c> z*>$fUwez8ecZ_~u=9p8ztT>SH#L&99Z)*QKAHUwX z=U)e|djI}CeXs1|o%Yu~2lL0oU-``@57yekHN)+O+Y5I94sVkjKU@GV9WDbd3oaL~ z46Yik5pEOQR=8%k-Ee#14#2UZ_~8O@>2MivS#Y^ZYx|f+-|tNa0lQVG!#Ev04^Oa11<|L7p@Gh8mjSH_9!3bb$5&Cx!EI{Q#5iQmE>T=k&Sdq3mAb+h0{Ll>{@sK5;8D_UObME(_x zI%-P_{4YyGnwIcsV(SM%US0wW1ioDua0{$hU zUu`S^z7lf0E*JSZ8g=?gdM1nh7Xhi-oN3!r@~5B3tHr?x?;`0{TLpld{8XFg7%ui@ ziGGuQwWJr}w}`yjaRWR_>>VQfCcSS+{3btc1us>n!SPZX(*TcW9mb{hK>+R)ds{@_ zq-UhyCO@u`_)LCnlKeF3Q#;t8Z=UE^yXk=MmGr6YRlxtsHh@d*v;o{F>3K`^ne<*N z@tO2KBIRN7Yo^#|>{nX=q0iJuwl_xoH>rPxB5(4eqv$vJaS*)ZH}$cHgq!rJ9UKTZ z_5WxIH|c2<+@wcs2?D>V|7x8#a8v);M=(CqUcMFkOn#~DQV2KoU+q}{ZtDN(5T?AT z-`n6PZtAPrTmjtFceUvZxT(LNi@hd)T&d5d{+jy}b<#;SRDRx{cx^ao(}e>7xdAZ% z$h>9z%tMwFZDV=tg=0Q5FPUF#1GIy6m-U@x%yhDDF+Z4x%s1Lbdsqiq&dht(Z`M(! zi+REN$2>Ll# z9|_#thxr|%%g@OLn0D(Kx6c~DZx-Ui{-Tm^nvyj&%a2$(rr`p|cY@4sbu^jlZ*?5%0k#Gax_-UaTaD{MJ z!CepcYq)K2FT?!>?khMiGU5oh{%~i&Wx?gcErF|tdk=cSrnY`!qL{m#WxjYJ$Ou$- zLJZt^aSJC&T-h&N87OO#xWPh5+*3mmSHz1T_r#FIMgKx774_WqDI{((AQyKW2;x^MXKwR9OLK63?h@km26qnr#i91lq#hnzQi@QmfA>5?_ z5;uHH$j6|P`F=S0juf{pki-@HqLLegNaEfJ6R~h{JDlj^T7PnJ;lFTkLjy_N-5@09 zAW7U{ASAX~k~RQ}5!@?85;qPB7xx&D#0>{R>MMfWY%C;hyd@X+;!3u0bA}Rx5klhb z8!9c$-H0&N|Cw(^W!8CD z!6t^2{%SknOA#LTo3`aQAp8u3p9L6-+tR-c3_7;lqbdYekmdNGU_u4YsVrOS|?X{G&$>A6{b1T4kFAdq+Nc_;BYo!`3zdtF?%d!g~j7=*3vBQV&1N6?`clfYr7gii)h@$~K9Dj$>XW7Vc%C*}L zA5Lw?fr(1d=4t4Rjs+f2jowjsSKy9?#{>6U_;;yJ zQ@`{LHr5fyC3uemfpL8@3#0>3EyJSo5h|M%>B#(ZtNjGL-@`F{SDDa`Y@sQ z2R$J9LV9nZcL&|rNqQpi4dUFbg0O?i_3ZI^Jl6Mw%;xSWVT3&(gi3T#C921(~rxEo(9^vghZBtFtF6?(S7 zOoaEc!cPxxXEwI zUk2RdH}MkSCclZF=XdVloE`I@GOcbZx1s(9dwgFq^ETb=MQlo z!cDq~e}rc_%I!{anhuG+deC+WeLLs}E&Ag^zZZ1VkC6X1p2FA16UBF#@XZx? zj=&M%+a&GaTMUT%1Aj&0C7vdHet|B+O+9D$p-xWIcInrM{{=%_rt2<&YXvR=pQ%^m znz6ye7?|U2poa% zSHxb1rwhF|=({ZX5kf!Q5#I^4^c@7wZ}705QT|ild#&)j!1q}A+rXPG{I!nZc1!u2 z;h3Hk;Cn~-%0bH)`b2?vH`laW!k@&TlLv-St~cmS7X4_U89;gJ`5MW6wpn(BOfMyLiZEmpTeLCX>POwhMj^kG8p54x%M-+0j<2|X2bQ}0RV zydmxNfNttN>EC;iPO+ExU*O31N6?Ml+dz9o=-WXzdP#p===Xwd^pf5L{87zc9!NNzC-vP>k#f&NqKAZK|6f3FwCGO@{eFwT0W{8& zlK*DVR|`MsON4$g=q4S*Kr0YB=3AR;g`f0kLLUdZ$uH7J1K%R)Abzay;oymo-oL>7 zB%yzgrc^C@N&g0p_I(Dr(M$S1;7y{J_)g(_5_Ds49cYgVy$STCqL=jBgnqrHm-IEj zH;G>2rNVas=vfnia6E~hY~W?0kN8yJW_(W^O)fOPCr*`2$0?u}TXH7?Uu5CEg%6MA zO$8Pm!|o=2V-J^#pZhzJW#0V)?-zKFzyg7}0*@1Tw7__bXDIIxxCi%t;_nE2MBsx0 z?-h8LK#oVqpCfRLz|#fB33LVi4fkjAeHQP#kJR@Ef!7PPgDN#G`d>jVY`)(N~u z;H3f=3mhP@pTK|Oenoq}68JlTyoZv$N??t^EP+!59x1T9z;|$upxhe*d4d@68w8#w zaE8FX0*@28AN?))TLdolXuL=u`X?1WM4-Gv@ctb_l)F#h7J&-|<_qj2ko^Jvz3-!9 z6aHCXk-$QMg9W1fC_X&iDwrqs{YBFKuE3WC^7JR_{jI=91pY=K&x2z427x?wig>NS zYJp_}iv?aNkf&LZ|7?L11#-MX`VfH_w*U294Bz7z;uBa=P12t0*?{M@eSkaCNM?d zVQE)9HIm_<3;dfvj&DfcBk&D@T(d*^ivph)_?SSRJIV0P0(q<@@dkky&nWx~fjmN! z;R^)L7kIwFY=IL5W(XW9@HByZ=Sn^O1Rf{wXo0B${Q?sNb`ba-gem`xz%K=UE^wc~ zy#jX&d_~|6fz1N934Bywbbqx$=<5a63al1bCa_rGJb^sQ760Bz0w)L@Dv z>?JTspikf->E8|t+$V6az}*605x8C8Hi26NHVIrWuu)*Oz~usq1uhaeN8l`h69i@m zOcyvnV4A>yK+`{CxS`VP6$qekL&t5r)$q|6?|drr)9W$r0nYV$Nh1Ky1RM%@Dj@B^ zd$AnI1kMteC2)$sNdhMb%n&$Q;0S?31*QueAh4gnG=Twuy#)3Ym@3dO zFiD_KpjRM(Du;IfF(&rz284}Cy993*e4F4~1>Yk0Cc!rd-YEEL!K(#dDtMXTiv-UV ze2(B*f=?1WL+}xTrwiUs@PObw1@{Z?6C6OLhxvt9cV6Zb%0kuKOhD!nA>|lOIfgTT zMgjsjc=bY5LB0bf-xPs--h>V>`(r#~sQ#GsIt@5pg?M`ko&7QC?2k$3^CtNnq4S+J z=?4Hw-w#Os7NPGE`a42@L+HDN&i+`nC!w2uc&mi7KW6wAK>T}~guY4W8->n(n(?!r zCV!*Q*9d*J(Cz-4{L6*DRQM}}zf9=GLSH2G0-@&$eV)+S-!tA>LeCQV6roQN`UIh8 z2z|8BM+kkW(9?xJK{6`}7E`VOHt3w^uLw+a1Gp>GxXeL~+N^d_Ni z68c7=ZxH%&K-Tl6fUMsIfJ{#=Ak#Sykm;Nw^jSjB68aROPZIhBp=Stvw9rQgeW=jW zg+4&&{e+$-^nlQN3B9M#VWYCgFZ3j#`-Bdl+Arsy0_PHQHuHPmShv*VxA67AWh0FW zZv=jTi4y)b!1r4CYT&yqycT$~g;xXLYT?U)Z?f>Ez#A>R5_q+RmjN%c@M7S(7QP60 zmW3Ap&#>@Z;OQ1V4|u@B=K%LxIQq9H$HKFKADA9aKl;68E_W~ZU@Sec^7M=>+ zv2Z`|1JlCkPXfNz!hOJZTeuf^vxPgrw_5o3n5Wxh;fH`XTKGZW)fRpLc$tOo2cB!; zEx@xZd>`-(3*QSo-NN?(4_Np+!2K5f25`s1cLP5#HJtuefbX^NUBGu+_zvLB7Tyee ztA%d|zRAM30dKVMM}b#c_*UR$7JeV_Tnpa30t%6)dk_sw=3_J7=iM|>A>_D7$3HNFM-UX&mA z?%~?J8u$+2YXmO_&h}LRz#w*%jWfd}yd;2VK+O*-)jz?TE(-bvzVz~=#f zU7^lqFYwX8mkGWP?JfXZqsR~7Lx4<#I|~lO0f$`$yFcCncpGF_kq$Q)ZUWq7xO3pR zk0V*f>u}DGe#Y~d_-Vsi;-`IhPpWum`>`kw@-toI#m_WfB!1=x%aACEFD;%ENjJ+h*+Y<>_w%k3o0hm)UWnkjyk_gwL_E^scLJgg_H#n1R}7eDLQGva66 z`%wI>m&us_r!4Diy7*b2FBCuP`nBR`JGfW;Y%{OYk98_+PkV*Vw&ua0jXK#5PZmGh zD8F+;I@>SSK`1}lHr7fw$vsf^D8T2$&wa3bM?yOH5hv1C__?2Qu=u&BaxVSHAYV}z z3dFw~?dU_qlY%(8*YXyWWeRNJd)z+a=R3+u@$)@yv-r6d3!;jj?-yr@pYKS25S{bj zKNsakK3)};AN>>PI-~_l^{~eZWwdFT^sb~%&&z7&x5pRzveBg`W8b4+1%$Z1~eUye66AlWWM3s}1Gkzk@lgBw0 zC360gI_+gf;R2i{fzx!NWT%f;!Pco2IwOqk>Eq4mMeVVK&k)ro*Th6J-8$W~RhGyd z`Z4k`kx$K>H8yNxOt1+u$9v}Fl;V{7oWjLrmCJJS^Kd>;Y!ox?GqIv`VQOahP?*rc zS&>ZBX3F_m(d23Bu*BF1&*MRtMLdI0Rp+qH=18PyIuAdJVn*eknwMW*s?Rox7LZd9 zBJ8qrE|fj2T{s-BB(HdK3C>HYz~LIGEI3n4>a3&dAI_)cIf?4XM=MO3pE+sP`B|B& zrdmOg@%W?x4qt;fvVTdsgIbCTntw@7{-R5A7FOZ-9!8+eoQPvs%ppujERTLGD=n{_ zs82S5Xm-hEMI{9}GYTtUN2Dqqf8yw(o?p1Is02lg)0KpR!;+$KIV`KRg!#lH{)KaK z#lo53j>KkGArV8OkIxMsyA*S>?qVEDg43DwVM}d=n%0Gb6r&E*ZS@qV7_OL8o!aAQ zJF@VhWij&hflx8Wj57H#L^;^375e`kT#HH;djO|C_9lEJR!q)CGvxh$=-}G3#*fb_ zRQ*hjIy`yEu-4BqwGQ}-$)C2)SBqh6=LEMH-ZoDWi{Xqt`0hfd*zSvGOph9;nBcS= z-Rq-Mo-}>J%!sj!;R$!x?WmcIBR%5F3V0lgEymk{K0c<|KV;Zn|T9 ze5UF89p*y^XDd_1GjIi z154HDPyf93-QRyqfEPnVHKHV(h35e$pz-|-Y~{+zz%woQ2+2Z+#{+fc#c} z8AZ=gIJ@x>ipLsW7;)>%=*XKtzr1h>?TFNIBsNsOj(F?)7>N*!)lr^TvJi)nM(g+t z=W7NaHaAVn1~8|>q~MCtu{bYZB_~=(VlORlx#-ZC`i;?{&Z9+8YdU5kGmVaZ?byN7 zHhD$sxG;dduZZ#0ek#~WhYrc{7&~y{nPQ68aYSF7e}l4Fb+XoB{l@5!ERC__%u}?~ z1E*Qi+H2`hqe*qDG=pHr*jZ!4{29=}WNd{F3gzOt71b@`l7UeLM-@1KwIW)_BIrPt zI`4>%P0%4_>o2ME5u27*2I}YI(Zh9G z_zd11a+q$2wnH7i)>>KugLFM@6dhUTh4Q0S9ZXDgyUlQXjSMhR8k_y+> zwJ0~#zeKQP*MB^7_IWk?d$o|96U_A0XSM`a%|$m^pSeGH`|r@#)z3@wuFY(z_olUU zgX#4aB#{vYA7+STz}IN) z!QhjiL>cm~3izGHx=T@>)oQiDFyvuS+c)GCEunIxmfSF8B_j-;WNE)xX&+2_WR9Gx z0#377$0*83Qmh;~iK^Spk){DkLK*V!k=hW45e7FgL~`Ts05ci03n9Vaouo&W(1R-A28;DpMY)+2 z%aB!69g{J3r{3Sa$-mS98bN#L8hKiII5kw_AxGueqgJy`c|{yM>43BkH*&Eu^{YiJ_5VUs0Q z-z%-90aU9qLC2M*dJIJA3pT7lX#Lc^FJ$gRU-s+^nJQ>)!-c?L!`g<9tmsn@)Mp+H z){T|8)@JTymvx$ot~-fRd;6-W(k=>jP9}9Ll7bidf^|EYGk@g!d)z1jnZarydC2^crUNj8vsIDeVR1E$%5!OP=EIdEs*@$Kn2>_Dk}oz%3J`;-98Ul6vx-Sl2+1j78Sq&G`(wVK}Z5Y%3JyIJY&6q(+`Lz&*c zo)}K=-$7|Ny}!}Sq4aK70>2==R~vzL)0?ZfT21c)1htpm@oWTAzDLvAaQUV{G}!Rv z3E}kqaH^GFRHRf>!2V!%5^v*6P{zNbz^t^SP%FS4eTNcEMe|yKYhcQ8wQMlDzP4N5 zS1ZAvs^7VatM&9FsJ-;(vjLj)({d~Q5Jmcr2T|(x4;W*&Ti(xU=1_URq6B_Hd0%G) z+AZ%g#nozhmmsLU^xnWaE$Ka()`ru297KZ+httC8?X2PnwP&9xZeMUR3i@qwLcBgH zt>q&ONo#h%qF-3Po0Z&8m2b7tJ}bpMiC~EjEv=*hklzu`DifknmpTCl1f%6mLh62MWNk*GC$({3SAB69Ynhjb>gWj@h1EPya|?t z0Z_OH$(!PKKHK=ax}DF1e@euSHJ75uc&+c6Z&GNOqpmgHRcnM)n~DMJ7f zyz#}L_%Fpz3b!!EyIs0c93N|jX-?|(pn2nxZw9uL!DCZ+=w!SbcQ+`X(t95~9eGNm zoBTAqgWwX5OX&^ZbGtIVN>#EG|0ev2cjCv}@lt;$uBCuUu9J9+A|+dCz7Z6rxg(0l z!#r{a>nhHw$0BpH``~6Du6}6fk=3vJ?@-^}!7L2Vb$-Y5A(af*N~qv}l#+!JO7K({ zrG#f_xWlhPBT`D@!0w)*l~6$+D$TwxLJ6lKA{s(>bpY%ccN!%$+#Ro#PyzShyV+bl z6iyDCXQYw^K1$6?5=+jclF3>L6=0DYlnnFQO4v(8Dq%%-C$lOeIXZ_X>l{jTJo!{H zU8|%zo}=Jq*GH&a6QlA@+BJPKCKyx>tx!T*2^FZ#lG)t48BW}$XeCY$b!PBIu1of( z;M{B%8p9%wMvHWRgYjO(UP8r-Lm(Wt*rgpV74XmuH=A2k!%B8VD>=f~5nLq{a^lPJ z+tcMDlvH=B?_bczR=^7C`vJ)B5$x&fb$xN*(1_3V`GIJ*Bsb|OAUnb4PWALf6-!~u ziSx#DpKee0ECl+X_(Z@jl`beA7edg(r*L6Rg7-+S5pzp)7BU$RP-XT}U6idGPyyU8 zVeiqZYL>8S?g83sB)IN^3wve*TMKtg1trUMB`%A^An6=?KO@`<&iCNl>?`7NMg=G zb=T;WQ~Fm*gHCzP^v(!86Y{z})#&z=B<6FI`pb%a6q;<5`7^@i?*`9Tif=ynwD}8^ z`DZZlwc31g%w^NhUX9`cL}`z_6Hp!upLuhT8rnBNH2 zrxZIoizxHCm`ifM8KEC2zTT+++Wg0r`L{9h|Iy}?<7~E%?6dG2Hvgs8&A&yPud41X z+I&jaC=ELIZ#ga*>Tu$QqkD~8bgz-r9fvzP?k&=zNLlc}?5C9QPW(nC<{wsK5c+}Q z`vSi@G5;5P?*kuIarKSgO*UbZY?6h9KLY9kQKLl?Fd!gGfS_Olq$Vg#8ik4PXs?=h&<@f#0J#%;V?%sfX zo~O_6ec#S!XJ^itGiT1sojZ5_oSDf)y|dDI#;ETB$qd3SWGd4O@gL7jUr?r~N)OqY zIfc*oA;}ElU8gwMnR#eAGcyG7d;W!J6@|Sb`%PF3+_x0@GW@&5A5Z!0H(@hEf2ruc zjelGGih5{#^p!5f_*TyK^zqH~n(_+X6qx-~m3K*&oa=4CP#p5c{LNgs8mUp`7ms zDi{JL9qmot37|*|UJbB=U|)h(b^x$Hm>tS}4Z`!#vS62zohGu0qfODVRzJ@6MfMFjnx4#l)paxG=Ae#X8Fmq2* zV7UfQR^Sv3h7~wNg98X!nQx;&GI^&!=2E8pM+EyrS%!SS1BU&s5ESz>A12KgP(=&7 zpK8!#0K+2aK6F5Cw)PJjklP*pv(SWhKWjiP&-b{5{^0|1c?OvBj~Ebi;ub@o^q>>{ zbOkyb&QKsfCwv#Xe~zG)iNo!z?7raU?-4ZQ(fz3&P}a?4$1AgrgkK_IL5@MF6EDae zkQ+rPc^Bk$cLXoUA7EwPi?{>pP@VhuT7vpZ>1%-mzM%eA67>6m`fEur;0x;SB|-UO za*r6nkT2*ASO7vRJu?GA1J6S`A*7=}oTNoM`qN1e=?ntZg~AExlo%i%6Tf1aHDq^- z5_?Hp>?Mg}12n}3Xo?Nc6dRx^Hb9EKjp=Mu>D(4i=eERj0GjClG}8fSrUTGS2O!fa zLOU>Un@ZoYR7n3x)yJ!&jc&P=Gcs!%EMaTu>HFV_W3_5HzEgHMt-i zVrS;VgWg*KSmdBdz}c6KGBSG@fUE)lWB9(=!A#?AcE@u1BbH4Qv?DOcM&vGD>az~q z2qwh6Lvkp~Gd02(s}+Iic{xlhbgD|cJEjY)9zGuhDHs4$3Bn3VmXmWHyf`<8+CY!_0$ID%!?KL!yQjJRm>m%B+)y=JvaafLS!m>Ct`r1oo)VDT7 zhG2EM1iIHyosG7aRN%ta=2mETlvFj>MR9xJy!Mi&s>arqNOjY^4xn1whRl}`gSfil z^GS3ghYTIk-f&e(M|)cdZbWVFXo!@kHSGTlA*!#1Zt%R4O8XwhlJj}*`!%g?SGAX% z-`ddvofs6z5Oo_ou_cotbq!o#{@)PQEU#KwYg~ZVn?Z!+v5SDvLV^H0;9U~HPVI$}tq~QtQxZ=SS8Zy{)Yd4})$JN@ z`RZPoe8d=5B#(vup}@uur&Ra8^50Y!?dCv*=y5p@&%&Vhtmf4N;@+@J1`*qlN-{C zd^&KoEAV|Y@a}}bOVi)HA+6Mj`9MP8fb>_)n2(u(Z>9h2hP2ak#I!zWK-jd*gH5wK z&`YvS3!GbEP26(8`Jgs&oPJv8!f`fbXt7OhoC;`i z;W)Uz+lAu@{--w1;m6TBkFPWNacq7my5J^`qwSS09Ea3Dv~dnU4xjhA=r~yBk$WaT z4u5ZU;W(=Op^c041H8{g#}Vyhbe0nM0lwCS<1mv)4ua0%$06lz7aa$Xqwp~^`Ef`% z$A#l4@E#lI@Z*SYyNixrvPihH^5QAZt-2$Il!l9;H`a2+nIlR|hm;N(KH~In@f_TT z-Vny6yNdR#A;a4jw481o-v_hA-3raKO6IpUEx?wRV=%DQ!A&J%T>Hvx2TkpD7Teoe zrQl|J0po&StEnMHtah}gv#bf~5_#R?<8o?T3fvGe?vJ+YYmlAG<1PEj^J#PS&X;zp zL#{rDAW?h-rpp!Rmip{fMp~|jHVT)EBGHbvmKtgj);HF*C18cHR*J!@<(!O*@$4mT}P87qEvF=ke2~Ra#NdM530y>een32dbV}X^E~D(uykm)mrkX zgOE^lgyN)Pj2%h#MdlIi_A#=n5|Zy)!pF}k#&PYcd~MM!`}X0ftu6NVNij?K#L1Ts z8D7w8e_6(<&rZ92qdn44A4j<61+Ix-Q`U?WPaD@k+l8<9TO`yVCscg}y+~>r+i>~3 z==;0lSGBfBy}~Boj^)uh+g?N!tzIG6HpDy4Yg#Xg)HT~>mr4k9DqUBfr=Tjvt{?P5 zqqxla^l+_{?^)2);|o+<%bTmITkh1p+S>CwTI#EyWKAV@d(Td58y>OL&gNEJ$(`^D zR5x8mP1!k6?!L;5qEXoQ6=|z$uDv4Cf<15bAT1ku=4GxH!AnqK%PMjeQ>kyAe{F4J zq#2o#AY0C8TdNy?>@?I9W?7V#9xrjCJjag3dcqXW8g-nspEUtiw&P7e(SFthDq0o$ zvyUx5C_gLnly$wfc6iybQ%e;!F?n5m(UY~B?RHu3Gqltmj|!>ZB+$DdIrOt%I(%ZL zHq}Sua`5C$!~CMOo1p~i^)}ylqt>2yJ$5`mw|{sQbf2B1W>bTXge*zy$UEnObclKxemWi0X9vE$TDl6|ciKO$+y}w@v2Wm#Nk9 zVSrVSYKCp5^;g-=>bQmmvsYACHbbNoQ5_?@0woqz=~ zD`>psWJb|UT6N>uv=B=1%&p{h5R{XhPl~%l&4$K`w}@7>F=8h(B&i{rfHp@ril{Pd zYBZ?ZI9=6R+iI_AiZ-&9YG`Vo-`XB;8Fe!_l-ai*29sA$0}X_oswNtyL}S?{1)ZgW zSW-zrWma8$^Qh?y=zh7gcK^A-4Od z8cUcv9ChXF!2Cy~8TBn<)ioHsFZ=sHTE!>5SwG@feA5;*VP0W0q}Tb4hcaX8Nsdlg zH5wZDe(}xGJ%qSdi)Xwey8e3B&D53BdGF966RxZiW`#2zK4h^UH9XF9sc2Qysj9ri zy**dMUIV)bHU|4u*iEohw%!N(A#COl3`=1bz~;mDgrWjV&OJ)VDAo%BC->y3lQ`I9Rr|5Fwc8Bc&i)ntfH?J35=DRN}XTnd09SA!J z_B7ZrcTE{P^S*CB`n_p)ee0Jce|UD(vUQ98(eH&Xo?r3mg7p4hUsO2#TStC!*Rz4A zvL1Z(t&awLaQVlpA1Wz&q&_xq=$5l{77TywzPoqqKHB`m>gwrdPaXf}Q@8GT|91~P z_^0bvd|}YSeV4p<_r33Y@8)s6#_oP@&h)Wu`}Ssj`A5%u@pDtw4EWWYr(QfV=b3w7 zy=r>;_LEK=bNY;*{^H8~?@qhp{KCiPZkfIOk;okfpS|H{U)zj~Z-?Ctdl=S_%ooBI z!Ir^Rz}CPvz(!%0!rlqn3A+V$2kai${ji5&{doTiVT)kPU@Ks2U>jhguuEa@gzbdg z0=olt5A1%}!?1q5_l2+{VJE@fin;)?tbXv*sI_^xf9FGip;`=|8t+G#iU*bp`rpFd zjqnTE@WE_=C66Lln)^U!!s|dwcpe`(%=;34JLIAHj=(Ey&{FDO@N1cr&Jf^_H~|M! zk9g$QA~LU+JZM-cvLRgae_r@kN_vY#p6}Sz(fWtP|D5nw8li}<O zl&22Yci!v#Q;&nJufX4_knt^8-XC%`;tiBKB=?p$WuR2;5J$_b+Z7b0YClr7E4(9p zLB=Pa@ZRx}pqmNH2}`EUXT|bko+&rWTFXoQkPv8!U{}CWZayp4AC>{@A?p@pVVQTu zOUudUPve%;yvLnw+^Mj-kAb96Z!)opk%4sf3@qEmKf?YUHWvjIhCK_G_c`F~M5`J0M%X)GAAsEo`!m?z!BQ)g?O|`& zGhok!t%9wGr6Mmxv3?DgWeRf#V4|oWS)?%5^Kgi2f|c9IsUS=gRfGBQf}!doQPhl- zh*S(BidsU#o;s97{R~vXiz>-PQ5i^hQDKBAYL5sNRm_Qc8&-Hx&zdNHaRen7xL8z$ z79pt9L@Me)2^E!Vh@z&Apr|866cvU9^&UW?sA(;7QEi$iYElb(zE(t0-AF`bp%AqL zR(MgQIks|e$j8EsB$Y*RAV6(by@^<7$8yH z79bI+ghJG+I2CI;QB-OYs$WS&>MlthsZ~NMs+b6S>bDU^jW>ztc?~tl;zqYc?tARn z_o7|#?9rnwBzN7(%|6-~*q0H0f*B4!=R(y!yPX=DgL3{z=Dv^UQ&S&kU;x*GH z{2}h6)p8Ji6_)9;pGx;yaU-BB6ge&iu3YeC!0YmO7me=_!JiDgBM0yWfJ?O;fS~}} z$pv{O2VmTH8eA`pKOkks|_JmEbFY*K+&=os9DYUjn?AgZM#=FLDs> z3z&)ql!I_OU|k-B55Q86AB%gtxHsY6*`UbL0o-iC*8s2O$OUey;Ku^5By4k>gD)p9h(*%Ek zxaT1Jh!GC$Kb2k{@H#)w;|m`U{Kx)yeu#e;Fwe80{Dk)drpk$ie-2pZhvARHGC%hL ze^}D30q$GzX|w52HkAHJa>udl8)nj(iH>0Pv~AkTQE@Y zy@1#GBc8gPz-#%5e?ssN048PJ_mR$2k{w#e+TE89}qc+e+!oR{0;D04&r|WxJ=|A{4=3@8h9-S@w~r{@mB+{ z2>yG(YdMI26mXHqLHHq|`x@|C4&oO9=GjFs z8yDd3G6T*7JRO$uOcwWCgzIz|j>9lI!;%hRdPyG!UccAGW6r>7F9_G*8;v6HSBX1V z++uNa#O)^T3;33j{wLyoL)`ns{gSxXh+8S{BysUQR`D~%-H&e~`Rx;To4CBMp7 z7WYYUsQ^g)SH!(q+H3IUDDK^;GsLsb(j6|YEED)S zM@9UFLQmCC!rY=o_bzd{ql@s(;&LY#VVUIcb7vW0?vtl`vAE}p%l3`I6!2S|UVxRb=K5Vu@h%1Ju# zP;QyHrQ!}2m-3U2^3e^8+h1JDNj&pK7cwdre&teL;wd0qILc*wwB0J7c!yLzA%n{2 z2)K-Y7F@Fac9D1IdC2#A8rlY9&qv9RBolXJXV7E3USND z#XUm`&v_1pmx;^oC*i^37K@8}fz)&B1GhWE3*j<@Qg(IPmvGOAAt*$ z|1ezQ4+;LD;139Xzu@-?ey`wP75p~1ERU^lng33>!8Ztgw%}(9eum&{1YafiO2JPOe1+i41wTgcBL!b3 z_)@`#;4M1VK(v{%!k>3GhnP2bZ#=>4S?4h@Or?j40s*jMFxzyw9aM&UJH1p z0j~mFX}~K0k1^n-fCn4!V!-_kcoE>B0WSpnDL;mipD5si20S0IoN24_+YES@5#9)R zn*lcf=22Uk-)z9^4R|KtRR%l*@FD}Q0o-iBRe)z2a3$bM1D*tUi~&~w9&EtnfcqQp z7{EaT9trqURz}Hx8Q_BkTnc!v0S^Ye%Ycgk^QbKyzXifqTywFJVO=rxwF`SH-P?RzHA8R*{16O2Mu@~;E&IVhu;bKZ3A8l z_*VwZ`nKJGS>L{Gz^rfg81Q1i%MExD;HUvF1YBppQNU9Tcs^jBoT=q!eJeI#*0-Jp z%=(sQz_S6rk8>t<{F#9F8t@FjFBotQ;3o{Y3h*}!nDuR~0kghcZ@{c?JQ!1_R}T0R z10Dmo!hlBt9%{g4fKM{uQouO|%=&gjO%mJBllAQ_17>}D$$-OvpEltBfHxU%AHa7T za3SDZ3^)Y1-GGCDXB#l)O*%K=L(Tk-DaTo}fT?psI1G3bU_F282fP+A^|4?!9>Bp^ zQNYySA-oIl48YXsA-oyz7{Geo^G?8Fz+59|_(H&bz|;>SJQFZho;tZXh;TXJU4Zp` zWf9=bfT<_O@BrXD0ds6c_#iI&#@_T!>Ld}~4H)wj&OGB5z~z9cbH?y>fQtZAzlrc7 zzyZJ;1fC7}Aj(V64^{x)4Ve0Cq%Q`%1@JzMi3kS)uLDe-D#C}*VO$7U&&TZs%=-JJ z-wxjbnDt5Y>NfJ;az0diON8BpJ%>rNY3{CqdZh@bCmyZHG|b1s5$=OgaRg6F&cp7_}=WFfsg zbd;#CtnR9Ve|8D(cN6>y_&Fy+8tPa+DSql$z9W9>>-9z2yoZiwT0=w&>o!W)`DF1^ zKN|0b3Iob|9F}x6ufuA8i9y49rtvuj{#wI7&Y)Ri_+K_?e5i8(mHE1X-)i`|)~N4L zn_~Fu4gV82;q@s1i0W*tej>uP{;9wWXlYmtUD1A>{b_E-&qh>zk5k zvM}~u1*Lzjb;gs4#`b48dZ}c5+KY6ZRlRkBgyFYNvX5 zDo*jeVxlna5ShiVH@T#IFwPznJ2Za5o(>q2ymiHs)YwK-i`%_$FhYG>BpOj$NK{7D z?Ov1Hr>U(VYKuy3tqR}`UMP~V3j&FtWVDP`biSWO&l~1<37+Ys>_y(SL>OFqk zS@>VuwfA?omOUzjUiYW< zkVM;{@9Q!K57l+^yg#iFJcJmDMtQa| z?)p;OpWSyCm4gR{;MN9LUYv{|Ov~YQe_9kgnBX3fV+-VE!rY}{;669D99$f4BROHx$yf~R)1Q?@C zdEyq}#QUJi&~Eev-JN-g-1$pUrYbL~?k%I<9?NhucracKGKOkP~x4Vc7!gkbzeEgO)=`ivDqjaJAZ!ln#8Y-_!83Q%n`!BL2oZ#6CEOE(PLj5aS0IA z4O4hOXSk*j!U4${?ez3wBp$k+$@c3_*lyS0FYpTftgM~*i@~PhkXEbPTKKYe;m@b; zfAF2?^D(8zh?)Lv{HHsq;i*^&saa{1-#5q>l2ORpH+_FXwBn>_LEmu13#1o>atFaf zLGm~UN3qlGJ16o_1pm11VGhxlc+xP-(cHvmNpLgN@Z3nd_7r|#btIZW%&AP?U z{y46K+uSS?@053kF5pp?Nk_XWY>Fr9oGoHc+wrtCIa^0{OB0SulS6bQc|4C|G`^+@ zq7UFU>?g4gtIj~doF@)z!_hkSVJDiC>pT=&Rxo0pb0TadEcOGaeok_AV~b<&fn_5} z!~R_=!~O`rfin@#z84Moa*qS+-Bs{UgrD_|yvUdRP2wwoXMOg=($EbkpPk+g(9q~T z(DcU-qgddaG@%ZuKp4w}CJd|h{1Qbg{U((@_w#aJF3<|5pK|aUK5AQOptASq@|S;j z=!S!%k8B)&$?8!0h!3xCMA$;u6|n51J`B4RR&)ogyWpq6TDjs`WP_Ia?7^>L^@Rca zf`sd}8V$b198(tVP3GQW?kS#+@FlR6=bNzGU|)pgx0~|tLoWLx`N<<{ z8vc60g<+0};-6531;uZuQ1RP}pT&VmT-JM-jX%KOgRr2__$t->8ud}tLW%5fG)%7u7XQGOT}Fb7ef+%1KjR#XTv2OpCih_Uj>(PSHflZ zBnht&e7WFRFBos6;L8MGDtM%+(t)GoM0%Zt0YcE}Ksz`auo7Beq~CcMcpW|i@O}eE z{p;Lgz>u?ZhXJG9JFA3$5!`0Lmu1=fI2LOJOg(?{Cro*U8}Mwv0}Yt+~_(Vd-bQ-f-zB&$H-90rFeO zzA^p$2HqroekZ;oets)>WHc^Q^klvVVe0w(V-sII?xM-###c_P=G?rS zJU+#4Wy1^_S~9E@v*y|iEgM#P_E{rGlwme~cliMP5+cEcEw-6mm#w&vy ztoG>ly5(s1S}QmL9;oitdf~AMJWyR|+&nzz=syJyzA77phl=g`Gs`s99DM)`$YT?D zm?lMe@Qm`5^Xr9Rz`ozsWApHw=dT2hgWz#U^0E}=5jF*a-^@#@Ir@=!Us&-t|#&EnxhY+-C#Z4Av}!yB=PW?qptvu>zNnf(F{4nYw+lLj{X^x9J*Up zgdKjvpq!Tya?nD^fEn%hSoG?d^YNqNt zn|L+>($vG3Y*vAflSv~uagP4-*sQ|X^?hQuoB>&4Yo5cuo=3kELdVwpl$b?Dp_Ma> za4UNV7j*|TLAxUOg%PC=m?b;iw_vVOWKnAb>p_rmjo?{uQELP!N0l>NS09Ki-kchJuYop71Er3Y zkznjcThQ{x)^IoxyQ`V?^VhAwp~oRdZ4HA%q0Em_h>HEY5YX@0A5RgNzhzueRYBLP#bgy`FvzN6dZlif1bd+*v;HZyNP6{`^X+QI?Mdrbe^UZmuXCL zG^*bFhWIFlkMnP}^h`e|AzD>(G@P7Z;ek?MAEPW#(b^KCH6%qVc!p%>*ahcf9QLqr z{U|Gf?;Og$5H{liR-bd;#y^+FSPy*X{7pe2E9W(MvS2g!;V<|J12b_jhSl>B{<>E) z#MgZWoDBc};9`<iTxLIaIxOi6sb+=Mf zqS)6EVN5DlGm(S7jw9h78RIG?=b8>Rs5gYN^^qMB^*UNg@zflcLz+1G<)F2cqG0df zDWw}nVP>&PPpP{qqA9KBu8XPb1x78nRd+s%rLGc5I4hJo&?t1=TLN`!XaQ2b3HFO& z-z~*kqpTuy{7e(V_{VK#qvOpv02-TD7o}*`8CNxQwW4{fQqbkB1h>><#Y72SYu2vm zHRq4C^D^49$|2kNuybJ9X>NzT4wgObr(oG!vuij2`pfwpR6d$~+ia*EEG=$kFqNU*&o#SJ-A&O%s%FVcJTqti5{A^Sn zf&X*xvoU#G{A@(F!aodnHXcj^%TyNU5=cJ^cs6y+Cxv6Ya}1mxe#XDRz>$>n7+fer zc~`*F>=KuL{rto5>$OEz6};6o|{d%d7idjf99FjT$A1e`ln%Ef_)2?9cu1{ zJPDTXO9d>o!uV|1QHEo&*DTLaj`dL^ADIr}5QdwICJ{LRAc~_=i5Oq@cFNsr-MjGp zqet1Uc&&TSM0kfs_)Op*LwJoDZmf$h0{$(8yVu400KX1)pGVjhguRv`tUvI(VP8hr zY`AWje~Mzj(niLk*eiaRl@9BUOM&~Q;PKvd9y0J>20X@qR|Do8w2n8=XWh^Cknk1Y zaWP=2>>H~9j|I$jmEofRQzwDxV;!^epy2sR@J4akEy@Z_-&Uy&1f1$Xn?}Qt~W&I_Ld@HwH+%e*^U1WH%xU9c~*{0F;iwj4= zd@*|f-yd#IG>@bQtR|&pS@RI~zA^2jr%vTZI5L{T59`d5n3&4fn z4@c=^Y(+iY&I*cp%Q=1IyOa9=8r}?eg8^>>yw-pp2E5pSI|0u(;0=Ih8!*bPv&w+i z0WLS-I{}v(@LIrO16~CsZ% z`Q{if<(p=}YXOfjV9Iy80aLzS2D}t7XQ;J2ivb^kTpHd3cmXO1;SH!Dd_L^M5?%_J z^09wQxDoJT!2FgI=AN4h*Dd#KnqXKe#^jGn-U*8Aq8u7E?A1!|NpJ$7oeQ2J4 zkk=P|Rme3T=}~`${pmsUvy4D9PW*h)!Cv9n&fiKu=s8ZSr5}MTM?8N;2giEX@V{jE z*+(KT8b3VxEQcP3KS|$3k5Y#?<1hD)eTPDg%RNKYh>cnp31i`Z-_qtD>@QL>omDf*fE;lf=VIKj-`4L35w*up#xI#6z_p z2y*YEBM+YIt$Fn6LXKvS{jc-!5Uap@hW(AQ!r*~smL^FKOgpInw;bESV;QI)79NVo z{!8NFrJuw59%#uy2s@Tu4DY5W0^J74!FXJ&=Uffu zZt&Hzjj6+tO2=m}c<}M=5FT6O&&A+TkK)8Ep2IV7zvn*in2xZWuJTCCOZ{AviCYh3 zB_12Iq`JWAf2Fy!OA&29E~BnFJn;w;OWU zvt#6B8{y%(w|NJ66oZsHJ}PYt;&e0M;^C>|!|^JL)!K6$d1=Ps0jczJIF{tI-6wLC zLk@ZOjc2RssplSA_Gc*jewQ3T89chy&td;)1|l339+Myk<$`e@&9U@zW`f5UM5riK z@vKJhkjP0qy!3O{fkzRdFBTp)C-tAi!%IJB8+d$-LhKYC3n2$obZ877UF+w34`Tr~ zKlif3YZ#RCQi7a&t*xEkipl;+Tf0qATRVA5)wGLhYzXfwc(4pNxp=Uy^8KMXmX6O( z@E8fY&EP@d8`0mTi$~rFM;XF+1*{ba;{%_BkLY3KA2iNBT*^yJT7GBQ26>r<;3LmI zfh1AK=d#%Kq1ci~@B&cThMFT^gRIcBS;9NnG;TR@(6Z@(8;gC{4smo%nuuNUgr+Ym zI&cXvOSk7QU5u1tOMYmCoJ-m#e?-h8qz9g-0<&y;^fUz{Za-4Qer%)x5h++20^S)K zTk;D8#bQs8EGzcq=K!sK{0x-R%4ks#>MypA3>Z^ERpsudHZPUCr-0OYF>_FiEJ>7; zdRgN;d2a+x^kN>O_XJKvqnW@z^djI(=QQaP3`)B_;6E9_lLTO`j1i4dAfckn>^S#4>StUHo7t;--fM94K#_TZFYll5Q>@H> z!8~5R!5n1v4`x$uhZ9kmLCBDvjq@;VFjs+`s#3A?6gX0Y`3jr>kcu0bAq7%5;8KF! z30gsp&9Yu#x*6RJ39EtO5Hcg*mq(R6;4^yp^6u04-oEVb!cPe^vYb?? z0+NxfQptY<{x(>DC=`Ly%^!RZPWKP-7rF<3nZ6zcj9%CcqGeb;e*(WhBmV?IY;d}b z3%#qTa(Mk?ci14$@b8s@KdU#N(0KTel+S)F`4<7Kg$`T`wa0gFI!MUS_R` z(STMPH=%O#a9J=7mDcY7XlybPl{7NTKuE2U$pvW$?UuYH*;GPt?Lf|UZ&A*1lu&G) zmRzlil9#M?l5c9AgyLE!-EFmz9&B(6e7?!ZP2m7*azP2+&7LI7$vF?+URt}Qx4Gpy zrLqa%H*LO$B2BYm`2UZx$^3tdvPlV5E1K%-qD|<+mCUGbZHNp(_oD=74@M&`(e{#x z$bv|7>-k@!)g$5ebt{rs&YK3!{uw8T@iI2JG- zyVcS$Z%(9b+T3w%S9Hu{)waA8Y38=!^qR^@%N5Z^;bI>(TEo+M>Kk$7kj>l13SsU1 zHtckW;`pAnNPDDhL8JjHDN$=`wX6DBbvk`S$2ND+@yO0dLs)ShKW$p26$MQs>ec~r zcG=e|0hv%#4Vr4nK-Fyv$3V6yu5Bt<@kfS@ysA{Bf~z>Uuvfxf2fGY*E$r7}Y3xGfVWTO|`wQ3CwS-$+ny(GdiG(}aQMA`UUnV@i zt}WVB*BqwA?Ti|(=TI+fKg{+aHfM~x(dp(GoPz_8YKgbk?)b6uN5iplD#ONrv=4xv zteGk@wkx{d&bTW);wxhL<5-$wVbiP!ykO`sTXzQmvVLiW;nz9}XwlfJaf)3T%A<8u z=%0U6x9?{hIk}Z%mr1ayGYq!~mL>oq(rH-pwfUsxn{&%m8G{jr-C(b{2uhNP`VpEx zyBM^(j5!W->sByd#Ir0pX5x4aF;N^gNQxYI5XBLLp!gvqiali!;tD}=SR%aGuO=0{+L9uB%tWyhEhv@_ zQS7h_Dz4X|dD*!9FB1HC;I|ui&fPHmGI5I$zRd^^3m)%IC+9U`R6d8og97)TDQ-yIb@l`Dj}w@q zSkkdkqh-wWszOJYaMo7_%PC*zy z^1xoPO+Fw&i{#OBNnCu6vtv&X)1xhQ&68WW%e4t-@3+)nYh()y$2B+AwWGr|t*z;b zCXnjhAiACGN!6m$I$7nrK4N#!ti*NY&oW$)1=@Hi>C+NY6_m4@J9%n#&A6!(Ce|7Y zx?M!D3#%*6#-gk~FJYv;(5n8Ad0xVZQNwI$NWXIdt5n;obV0-G1n3bdz~_tjk`9M8k;iXS(j@WlT9>^?1kYw8m1vT9 zc&*El$FD)Hc}(g;4zG3DR(z0FBmLi_U8AW24>XT7Npg6t%YF(T{{S`50d|=r9$xFR zALBbh)6~;;jemoOTJQ2)yZaP8iV?9HJQ!&=@*>sEVJGW7lX%R;IYn?7bhbK({gy7o3Ix=n3qcQh8eF9xePdFFv1 z^^o4|wbM}P2e87E76 zZC9lc0gYEzZTw8$zjk7+? z`a#Qgj(A!xb3oE?hbOKNn`blhLMx}vX7~j?@v|BJfG-KpX5fOWS~12s&D2nd-S!bN z{=6>FV7Lb~>I{bKNX+94uy(tWEO}1z5Al^yXE59#%;lWsc_4_N!C)MpP#fzA#g?Bb z)GM)|e6A8@sKNbnoLi9eqwJRqcihciF1g^gAH#VOD zR-2Wi{1h+U-f_w5<$tmxtB{y|n)HwDz|pIhf1DinfE{?^>g8EzrciKZ%oQpy+Ap?z zB4Wn;>9N}e*eR=2n-H9Sp9)$&j`*2~jVBVD7-GgQM6h1vjxC=|4!6x>F=WNQIvmjI z@4vuEi3{e>R}`s+$>k`(6Ht{{^H9gtht+$Hyidy0uDP7sgxD&w|7JK>!m6_) z?xv^Dj}WL%yKaG}n~y6cJX<<&JMlap;yrjsBxg%!zXiWK0b(~ikHG4+^2g!-J#6My z{HeuoUk)Z~)E=eGUGU`o9e-9Hv1z&mKB!td#r^2MdJGhv+jWVP5RZ6 ze%9R@R7?6<_XAY1)RKPIw>7Ai^t0H;{1(<;($5+T??Hn0l78kX@MllKpIXv)B;*qQ zEx=+)zXvrbl)s0sM=t!FQNogb5AHTp_};#(5%5z&dr4oV@(4kDNx$HB_&)+mf2fe- z{cirudx7am$qP@yU#72DZ$|I)1pYFt6DGs)XB6y&b3JUgafMgI$@CTILiP$)}elCP5Z75OUpnIaiL62m`fC5u7pfIi&Am>T+Lgxb~T`I+ZK3Xy0gt%fr zN)-UUTH5>){xpk~_dhBCpK)FNUp#N(|5qvi$@3##Dgeop|6?iudeghDD1aAP)z@?= zDJ30Q9~hW+cCWzgY1j1(YzVxPe$CBk=ZSj2Ow@4mER9)!H@k5B&b){=hiU}7;qt{W zRSFnxD-T=@pE5*!lg*S>Ef@=zL0dx*CO;43_6Xa_?siYy@@%?Cr4YVL6_qnYeI1WPp}LTmi&Zn84%!0>U=?Fo)*DzL2N@eI z)VJV#)TM$WJQuJYR}*dq%<(P_;rW2I{Di5q%yF>CD~;AMQD1}ePN@tYxk_gf%S!46 z%kU2P*-?co73(S|nV<4-4FfL@;U)1y{p59}K2-=L0Bf*UsTz z9}JfxMLu`(raY;50G-5xdDrQL5KhbIMMHjWJrd$rR;+W3>ozQJ;yB;SdPbQw4RuJU z8$vx1>W%RH4(f?ee}sA_)F+`H3H42wFY1_3--PFTP_N_wczpt!hrAAeErY!P_KUDx z>5_bm@E|H2hd1!5@taKNa;QTTM?dmdIKCu`gH23C(Qwd2)KhRJVkTgsI8qc8M_xp6 z7$&?pfCZ#R`JmzeRERlzBQZx$g5t1|D2^c|VGhxW+660mBplNd#j(CbJK8=4MyoQXl zUW%L>f+aR}4#m)S5uXC-aM4@IhJ2VF%t#X#IzyeDXNTGNH2(GhK8&_T!>^mJkx-YerKft&j75?xFCHE z;K4?C72y5`jB@FGSYWOZ?FW1a0x&(U)$9ZOx&iM6{8Iyd74Y{Bcn{!C1Kthzb_3o8 z_yz;s3HT}l-T`=q0dEIx%lua5;Wzr0rb>|<`C|3t_Dx}k{AGc?$rWHP)nhVB2wf>&cA z1Tc(-=f`PXr*8t*_!|xXTZZ3O7PYCKHSl*Cer{3IJTEo;R~UX#d5YgXlVX%T#2oJ= z>N9zC|2-70l863@+~V3%$5OVMT5Tvw{R{eE@syNCeqD1@1GM(lHU)#R9>kvC);ce) zdWAesZl9)xYHHLevg)yCZM3ni^%|EVR)ShqH7|J><~{9^IR2FLI#N8Be{Fsw(siGLFVW0WDj!`2=j5PGZ>>;??gmqD*zO}7E-&vpPyp9zZ z?^~T3=4a3gWBlLxA!C-EX7FTZ zER0skHpkKnJ3G@p%kVY3pQNMFP3GaD7uJZ3hY=x&_K>C$azHeiBpzORVXC|lVX*K} zvF*Pk9$tE3=7ef3K{WU6iSpUf6~B*j$h2@}BVMDlcAo zVb4oBT;pyiECt zRmRZ!p_&SGG!pfG4uc2#!0TLjaWaB1Er*w0SQS$154yu5$9~Ac_btQz)WhfS@YLyI zpN)Cpc`{79f7q#~?z|`-%#1rP^FhgM6oQ9oQsl)`mx|}5tw7|#B1cgeeFc*l{6?8_ zPB5uVL+BsjXKgtSIlOeKiok&7u~Xz&ANDK{PhF~F@Cbm%E|(lY8D)yiuFa8JrNe{( zw;og}GlB+VkMQUWJCU7Y)p}4~x>Tij*Cv6@o)ho~Q#8PNQIdElIa1tLzYsi%5VyZ> z#1$v?m&Ah)r5!=;ysQTg-V#zSJjx))Fq@CTqibENucE_>X2?1R-vra3oR<>ExC?<~ zf4d5nhH}u7midy;6@1CYkNB*UZsXRa!W}IW55$(gf%ir!QjJG#TRCyRp-VLv(o>h} z%Wz|TV*Zn2x1CQS(Tf^S^zzGriQRUgfj@)zDf=~9KXUP(l%RKYfWp}q(u7D2r6QlY zi6?$34s@rW1odr7$HPFNJM~f_Q+kXTTLLHval*wquoWTXAG*BOeV@b(&f4A5zb9Kr%?PCVfYub!hE1_04 z9$2l|^fF4E4+lk0iSXu*r2}&#ta*G#AD>KSKo$l~Ct>dd0rQNU(7TUZ7Z%isbH$`w1DSfhefkQts&9`<1*8P~$k9d(&EBfwTo z;sMe{8QJl)a(T3P7}$(n-E%p`$gE_X;LH6Z{Co--{erpg!OybJ=pPJb!BvVsN;N4M z(x6gJ3UZ^MiltPOf;@{vfl4(gSOV}(*bH^rNRXrBzY;W6lfDaN*x${NkO!Z0655~d z%blzJJ$$)s@KZI(-^-V~LgRb;f?tE568hC?BPtcDCi!jEq&!YIUj~x&Q2tanqM8)q zoOnKG)Nv6_4@NJrRg((81Dro2kJHU>FnC=4%Ze)FRbVn;GhfGF*582i<-G^*=V7~@ zoPREyfUgJht5`utDU(nAX(0SrSBG+xsvb`z$^O1VfA)3lBG~5Yc?a_B(Mu z9tm3p-}Gu=Wf7I%JCqZEN7eAV5Hf+X3=b%sWYe&uQ>v1^!BdVFmt9g98X!nS7x$Hv{?KsaK}Yb%|?~ z@f;S^B=hiw$x@hCt+Ul;gqbHD6 zM?2=&Gzn-U7n*~;gVbg*wOXCI;qb#j7WTxS!^)XGQt5*?6G}oF$s~r^-zIz_sMzf-V>LC{)2yi?N0b_lszkG_2^<*XcozHd zT5a~EU_-o~iMEkbY5xyA-p0{=QYGX-)e|eN{~?7iU5w+}Rr$&uWgMQ<+7_AG+F}>B zIxZ*St(12fidgzBA6Ku=%Ys@{hdSd&z2-dY$JTJN!2}+B4=o&iQ{OnQrQxE8T^rh~ z@wnUPHsK7Q1Y)Clc-NN}9L&`wv++g*{X&Ov*v>U|ZAO*B8B7h4_WHIarIVJV8P^b* z({V+GK_IP-al#J{{h8WSAF+(8I*oJHC?IvTW;-(3ZiW&N9k_O*_}ZCWr|~iZbV(yv z=YynXBSttycEO}6YG_v)B3i1XtmN`Y)Tgxevgcx$0~mU{4d=%=cd1fqgYq7(cM~-? zGexNIsjN89dUVR<8ybw9j21a9&Pjd@>qA=IU<+VRg&hS;<52)=h|3WuEe+=bQyH#7 zqTj31;anXJ)1jZO_hj+2)n>ZAfoE$?!??6G~lNG=ZHovTem3d(ml~Zm#lsL;0G)JGV$Gi=1(2}=2O@F zdiloFHoVll7&L2PH^6R&-444Ob|35^*fC(nw2EM9J}>YJ8?@BO3I37nrNgKp5!_aR zFA;hj&OrF|f(H~H@uSo7EUxAU8ve~??h``sUA4~EOZ6n;up#%G#39g`1&QkJ8p zVHtD!QP&M-#jOL!vesoBfIkbC@%S9L1jDL=IVClxwsq^zdj@9TJXW8PL_M}24?LXx z;)jc;>vNU#SxVG%V}911zG2p<#eaX5dUDj4qpsY|bF0$Utw{GhjK6u7a(H<PKCR8SnS6UFHaEU3|Nwuq=ESW!;n2%jiJ$BeTy zL~+z7yf~64io<$Aak_;lPQwU$P6rUhi2y-y-hn7X_l?sYM4bXE;l%+jQ5^jWigk!6 zjygqD4ta^<_*bYnHu4)il1=+XIekKQmzOLD>0low$b1-$J0bBfP^57oEQ^KydKS z7zf?A#t;dtjUVCf9Kl0Z&e7o^z6kIGd=Z82B%#CoZ=DTB{4~J&{u#!54VLLVkEPw& zLiZ?e&j|i|z-wJ0;=c-*bM-JAZ^s|=!1%24bY~%ahVa1zFwe7ebdLysLFgs|Ut`dX zHu#c`YY^lY2ENLm!&;UjKj{|PmDayd+{xlj6!&h>peX!b5qG$_L&YU)hF>7`;IzawQ zx@?##2}Tj0>CA_V&#clhqr5W!qs{i$2>&X$#8(P_lHe-@UoLo-2jv+l_%gwl3La^x zbl|9bEW&dNV{Hj$BiG9o0uC848Q%+JLb=s`GLKMmyB`c>@jt9%;Z>3h6w>fUywK*~5TQ zsGUa(?ffvkPa)4i13m)yHwJtd@N))y2=L%OImU?{Q;8d@@Jq^+2y{*QIO+0fym z?C*}Xsl;h#l6ZLOv7N!j6XqV_VMFRaiHDaS8+kklYRzLy7jk&%vAu=1bOXv`dLLVY zZQxOAdz0kw(qmhOkHQmvj8;UarmMVo>9L)IZx2QI)=75kF+cNPI~IG)qqDa z;_Ltq3O^G(P+b#@)*tiIW8)cIO!uJhSPvd39vXa^Y-8wLrPO0v3?3W}9+JH1cus)= zq2=(>V=F^p)PSxtZ0DsDa!fo3Sd81*BiPTqF(Z6+W_>7ayYs?KVR@KAY4b^n#W zpIuL*;K6b%D)X$To;rB}@L(A(bjbmfQOCO0$qRwUObD=8cnpRdgY8UEEM<*Spp zw&(WlVnbvYl=D)8cz=(nlQ%YOKbJ>cJn;Eb@!^0+q)`@T2m(&jrJWQ;K2T4$f(M1) zHo~5&p$uiUM5+92GLgMAKAW~%C~oN^?#Vh?h}Q%#nfiDRRxbweQq9@EZNaV zYv0{;a1&ywsF$u>Js&f(vFU->O|zNovSxxj#w`Dm?fIuqTnD=%cGFX2xU7+3{tKvWt51ycX&9G)QTh>x5uDh`D{#blpcFZ3G)32b0p8`ET+5s2f*M=HH|!p z3}!8kEx(&ZJ#lGlc@v|k6YdsM+BC+JLOf^Up^luJcCfH7uf1&6vj<+ri;CxFKeW}0 z-$6xE&%{RDIwi#Cuy_Q}D}re%a48Y>(YTfBo3usEoISy*&n379Y0 zQFyt2%1aIgRZN`A2UX4IKpnfS&5olEhN}jB?6wvIGfrXF7?=`ZsAKvvWAkLWTNxO2 z9`ONg4Wn*nP-W0nCu58IlbrGeSsMZ<25!t3aaEc5bgPi2hlEDi=hZ?LNV=G9va>}9D=4;>?`dV!3mlzQO0_W%J z>>QE!G-Af4gjBVbOaC?jwRC&ORTIvcb+GNHu~`RVOTJ2etOVyVPwJ6BSxX$Euri>y z7EpxeY=k=JFhb6;C8Vk-Dnu0ytzL4C{Xl|t6_Dq0=$*cfXw2ox8ySZ(N^R-~PP*uC z!so^Q#9}@VCazd~Js?pmet_P7amC_$3EPUrz0$#jk_ZRxJJ{ zd{*Gc_#&PLvu#PLyImIX=j`7dAK^oP1~0LVC!0gN+i17TwNnH3<& z<&A@W|AnDEj>>{EOhZl~^oS^xM zdt`79%Y+QlSWdnP_ERB)p$wir3ck1$-*Gbuav9M#aVrZp`xA1w(C1^!S{3`6gxEiJ z$F{Qjg1|S;=Og(;tXtEmgB(xrBSeWmQ$Fv)a*|COi^`mHHDcWd5G@coUfgZwtL9VX z1GaMh4wyT?a=PP>o}i+*loT}C6-<1N&&Py6g!N574N>BWbE-12%->)VbI1TiRaD%ys)oSBbUnM#{DM2&F;+S_Zo7utJiLRoaOK_GKK$^7{92Xf+M`Fv)4Vu9QN`G16;&nuAEJ^wxU`=J&E@&{O% zVR&-?28=%|XvEbS&%!KsW(8?xf`14b8{%S228KNCjSZoT05Z88wF@Cc)d?0|j=c-v ze^CcIwH9(t4o>^*0Re;Yb1+%jKI&8R9?rLK#Aqfjt}vaStRIc7^t{}Y)FZQpfxNq^ zFx?}rFkO(S@?01P@eb$srsJjQ6&E87U<$2hb*L0>uH{9XeYLuEzhj)Y$@ftkuGObm zW%&P(*7U#UyiF)@rI;u`US(xdADHt-Q2oWTOUW`>2YG7s)YfRzT)FR4D-~BXDRsuW zwz#IU7ErH|I10v_M@^W#ZUHny9LIN05p&)5K2& zA@+Dc%lSrSNK1tZpLNk6;4qqTvL>k`b__KlVifjKZgk-m1GZnR4u_7th*Gqvrey3J zT<*g0;g8|h!TPMKO>o#u<1SHtu+D%5RuirT_|-%dzwIBunlkVM z-2)ARSqj9RfCk>DlsFW_F#y-VrlF@y_sc4{S|_Ga;L@yd|1NcIU0ID~r_ZL$oyg4veEfp~ARz)&4|K8UPm5(&3UQ2wZ(#vZJr^q)X^&2z zruE#W=7^=%Cc#M8604<)$^ez{7HFu;U9+Yvqpdm&;q-!6?R+h7i-9Mg#D zJJYPgY=YZxt%hrYN4VsCKiA<5^=9>QE+L4%}6} zOv;WtbkJU{gF zQIF?l2mE|&<2fOp4{6WA|2z2kaP~I*d*NRMKhG0o_%QYv{EW+oFrHV+@ZpN*@z3z{ zVTm?f$matQ^NL^?ki%;-++V@x!Lsn1wIA*a@Ss|q+jYSFkYw{H&+~4+X|dcprR+ICW2OZ;DjMk1h-G1~;L(gwN`|ttU z8SeAUxDB^Glyl0V0c##;+Og@*zuoxexWjPA z;Ajsw3$7m==lA8qsew4?o(?~c{x|^;b?z4YJWeVx4c+qSEI3<3=N!Sy1oKgw@kSSkx!AAdb(P#9lfk4O`{g1-W_@+J{7X2nY)3zu>XWpeW)~KYMI& zKZJ4Ij%|>-SRbr2=7V{qKIW12%DQ3tCQo)6h!T|s8>f+JkMPcLrf*?2v5hCT%yI0=B^(`Ggeg6+!-@>&l zT=(++BjbO?}M(t!eK7{58f;MTf|{|?heO+NkE6Alo;vZ@je_`9Btzz zje{?~WR=6oN)L{1lEnc}Ryq!jXp+TtEV?-QP8P@JL{~aO$>MOMNO6dhEPm(^DgE~8 zU|*o16o>FB#ZmoiP#heFB#UE`qKjV+$l_-NVR1Z`ERN!edVV7yYXSa*#UV$sIQ}RR z`I&(%euNMf2VTi44W-DYM;1qHrE)?`L?V0;(}!t8@z#s1`Jk9W7A?OZz?etd6K>qYt_tbsW)Ye~i~O=@&EBr@(ixH~^=YwH9W42PFttKpU+Ox-R_ zTnXC*x)@q;~C`=0z+Z=7GC#cK0Va&GYoVQQek=SJ!LPRX4+@|CG~>-j_-v^cS~J1@ zpn0~)6LV1)c7D+v(j6Y^S$OX-SdO$^m9@s%QnubRzMB%R^l^%8zM z_!EWyDmsAn1F@BM4(T4uH?OkvxBtXa7n58{iMI_`86YTljI2dkB1! z{&Mi{NpK!nCvwF2EEsGbmB6_FHII?{od$dboH}npdm}tw;(vrp;d!T7_HkWLoGx;1 z=r!$?{D0xvqn^KEy~-FX{u{!7Sm;uru<71B%97(X%=murb1gpBodwIoba20G9_fb% z^+o&|9OFF;{&0!60lX)HO}>e5$MQW>FMQWnEb-iAm#H9=?F=G6#y}xy-61eoi9{wu`S2rUs>By@_<$wEg7%@sOC=wPA!g!U22Ce3p3S%VbatfC-_dWCv~MuumDkH;Rh z4zULw8L1EVTxDyYl;@M-jL&e!NB2UtVe1el0)wg62a=8vJW6P;(BVQ^F3Pc7q&Y(S z31#`nXZ}e2Lis#E%zTov+@#DWDV(CrFER5=3Zf|G@G$759CUaocQPmia6OaFYdFlN zKc@D1nIFVe`5v z_FA|P@EWNP&Vy%p)BU z4#)o}zq$v;mVh}nNL&Yu{-IgMDb`O0K7#lhQ)KuMVAdbU8;LW4S-wSrkNGiH3_Mft ze&7Yb9K*!1emn3~;5QU>);9y^0{=wtGGP2rWOb~c4S*_hSlpg)z2LIpI48^xcP;c{ z_KrGk5AR`Qx}4{mgr=_*pKNoqU#=V^8#xw?X`@E4(8pKI@U@ z8@P7`zn|oYpWjWc5kJR6Zx=tuM4zJ{g&O0>J2CRdeJuEmW4lIAme?k6V5|Uz`0cdRqK6)REyI zviN_q^!K!6IBsd=FSGoSdt;anMAm2T&}WT^C9^SP&41xR-_b-96hoM+Yc63*6E2d%Fx%OvYGf4Qdt69 z3Qj0n~Wb3EhW_@V2}2c3W3&_RA4TxUM9xTdbWxWelAs@O5(h_%jq zp9cYc-DlU)ALAx~MEMvBju%IQZ2+{=pU%I4LDB1NuyV@NlA)L?wvs+_5p;u{nC zd4NUuSBF{O9dDgE@z|4(VqX6OA-lN1S!$ z@8HGBj|hL@ACALU=z4=UN=LkP=HEgGk1za+*nd$v;;l2Mjv=T_qvPmt^1(?KJR1j7I^wM}pMI7ex1Tat zN8fj)yzGSKV^&E?kv5iCgk5qY+t@tlVDxJIG2vs-5zK((%31>)bB*{$=%CG{X32*{ z3)3SyFeeF{5!b3Z9Wi-?kwhEskLNAGBj@Y%y;te){HW$MBPBZGu9;smK*w1%MC-_( zg6|6^vQU$ccx&ccpo7=i7SXXBI?(iaMCK#zI`i$KW2@-U(Zl~GA92^a?}UyFL}?Kn ztC0`X1rIA9$6u?y4?1YaW)F1Ohkbsr-hHN?u%ji=PQ%X2#DPcrpsa}>5BA3bel z@Iwb5je^`r9n%L%JH0^H?XIh}u3!YE1G9WeisG(!p9dYRk80?!kMOc+9VRo8`B)Ae zSt!e5=wQ49$OnoScF1|*7Tht{yKgwhaS9M)-SDtzvD$jv_3p=@gKg|6bTA(k*TipQ zbBbq`v2Two3olx>?QbIT0hZN1j=$dB107s8;#>%aqYnANZHh;*TEB0-dp@q$YD5^7 z%V_v6IxQGEN=Ll)?pvWF8*w-1QbX7gr6b;Y_x;ep?>~EUb$pmhj!~B5uQOkTc9D-1 zmyOb8C@s=|MeuCC_I%vFO^>i&086LUby*@4Q z@Tcgj)q-nm@zN1_4czfLIl;xLYPIE2RD=;~gecXU@};299*gz+K&dSUOj=OR~T_D2A)pg zg+~HQlc+B5Xkclfgs#X_D{4nUAhaostqLnsx4i`6z{<;+q4r#)iZ!Lr;PMNsOx0Sv zE0$iC1I1DiTz>pH!b1vMS-W}@of_(rEp)7vx<%OhhI)$;4~wiH{!ffWtZ4j#*`-#l zaz~}FLFnR^`jb~Qx=eZ!a?dv6!EdJ)w|-pPLvES#BZGpNvy`bByh(x zO5XP_aG-PG*N-s<7C$RlE_+wYw9}aLRzGF#c#;yb@HG`2Q~4_zdqm{s2rj6_Ep>m2 z&doqb9-MFdGM|PGj+*MR z1Jkb=39%b{(ZhAXAq_4j-*|?o<*q}Y;?{|?H7wA0mc`uzZs3jq!RUygf``EP-Yzhzx)Dm zu|}TdV3q!3C}6|Q%n*b&1>DI2@A)R5dl1-^x0xJC=_Cp^T+j6LHX0pYQb(YkOex^Y zjHp)SE8nYuhWRQ=Gn4!k1KI9iNg$BdOf7-D%{-xvRHXIt1hD-p)e9}vvxBOYFK=Cd zxo#Ku<*g731eQ?LGEs09#gPcoy^vm{8^~J+qE?*;>NhhLA5&>)QdwL_(au3pW)Hb! z40S;sz!R3qqF!wN6*++wRu*3Y2g}c)_;vbr(D$5@>P@KyD7thUQtmqtxT4{G)l&DY zX!uNd_O597r}FGu(a@3IPTu|%4W}y4ffWsBD^Kf+h6|PFaG>Fz&>aZeiT@Rad#vk! z2a3%1(bjyG1s5Ap;U>0>jFSStyp4^ce#?%$tq^%>M_vnvv*MSFao1_8-@f9PE2zGH zXH(v;riHr$4L_m!`Yr5e><0J+?#Tf*F&e$_G;FWX7B8LxJN(+ZCQ$DUG*tD4_;Yvn zfofUjzX_5IwFoyM_e#ib5yFZb2;8(oI?uiYum$kTUqaW4hUZwla%y=R ze}rJwdp7(gA|zLZ)D2zn+u()I1v@eWqcc@|9iANw$yBP|(f;+i0c^QMXd^H+;>f28;CpSm7N^mg->C4sO%b{qd&|!FgG_>I}q&$rNP$FJ#FH zeiD8d(pd67Qf^v^?)X$>NOeg~AF$I=W*?Mgl19dQncb=K!Bhskw<_k6_v+6H;B-TN zWiHbRuhr`y6j(V50j3|iT15*i9YY?kU^I$6@{qerNxx-NfciF07s@tB(q)@7V;>9o!IGyTwMtQqJjt41)XKJqE_`xw{cngC!di54T; z)gaQxaLG5|&+{(+oc6!LUjR<6=1*P)Ux(l0&y{kJ|7W;dOzB(t3m?OOVlcG~ps>`O z1P>B&ovl6$xfn%Ft0_DX77eW-B3d%PZh5c9AMJE>%w}$3cp!BcJeQL@-sN})(gQmk zKIZpAifB6>?KoxUEI5_*v@79*xRaRHX#|<>gc%^NK`!+*jrl1iE}Vz|P*L#c8JQ>M zB4sgUhq_#hGaaYMRk$fE-e#68SmDcnI*(?J4`l`?0;cB^UcghfpYTe;;e`JJbW&(C z#5LCCqH<+ezOWN~p^WuLcqoBRKu*eAj8lk}@Q_@A4%Jo26~Li5*M-Fy0@Rt)M_q+i zp;b&#D!!(QsV*0zzoJwu3sZ43!oyB&QX*T_)NS}@LrUojaaXC!#mHB+qjJuS4&`AR z6om497f||n)KJcf`4i#AgmW_5W1b9Rrq3X(JQI+r(`yN97|Jh=>B|Xg8On9h>5mZB z5tb4%SFZUK<}!rzHwbTh)q|B7gdY*!MB#@Cj}qRJ5BL;FTwU+hxd%|l7f5M8RL5}oU zgb%S=za~_tvzZm6=KIfK=%WHv z)Y;m_Y{A3^=0mvN2R9qmQaYZFhRE*E_XarZwZvMAw*}bW9ujP-N`g!8S;OtscB($+ zO+jVI#PQw(oSA%bTF31s!fD`q1(2*Zjr5&opxQLj$Mcbl93`twBYoE!s5XuC-E5#A zX(#xa4Ah%Odbou9x2PLl0ZCnZq$Yu>{3rDY_S;E%@5?lPzZ!_}b|X6VCUGV6 zEyBy0;cn0MX&t)*v6PPYM~and-5Dl>!#jfq*J6lGFf{Oh=3HcI}j!B2m2ET&btRUyf?=p5jf-hM%ph_uiAgs zH`qY6|E%vq6HDzs>lBhr!#cob4-{|Jkg^-q@cOp~+Vw?DS?ZvRt?Nx`L`+^;UJ!WC89( zxC_wj@?~4liu?3O(OhCVcBJ~;zV#-#h3BbwjWad8kOo(|;g6fP;r&}lS4TSL$>ol-O zDxWTte^8H9#`zVZbULR;>SypX+nvtsk=hPa`OoX&3&!n(no0BpqxV%XsNqZnS&(w* z?{pTSll(06vmZ=%XRnnXb7^)?MW$e>sCR05QetXayHip>yv6&MTT=K8lMu3OG&X$@ zSe;$D9ZJ*DXVSjV*!00(S`u;x0a8i|SsqFNY-hHUP4+o7E9BAUkI)s`+sSq?+sUSc z610=^Mi@=%7&4la8f`Sm7ilyp%{H3UDP%OMvz1qrBR$+eQbu%MFcu$*GT4h7SP0@t zL)%%(Gp6K4X$X{qr z5^gM_Gg*TTIm_pi=`xHj2u`U31J{UcnnZKZ`>D$-@l<8O>a6sH^RVfy=fd^a@Yd7A z^W|J_e4E>)!`3HZoN8UduyoIlj$WQ{N%}(1or&!|4}tmmmkDR2doG{r`Es$|9oKU; z#NgNVtv>dQgT7t~ebXOKII9b`)P0N_==Mz4;Nb?(^9eIE64MjPT#0jbcJTB_7?$zc zV+r%Scv?MA-M=gG^P4@lb$Bb`lFl6-O1#&V&=0xHe>kB}7tfcEt-n0soD9!vu&Z^U z=gy@aJiQ*iJYi6}XSMbXN%w3U>uFfh;YWicD8q9U=DA>S%Y(jx{Rf8}V6O?c8GUdt z;u|=d$B_oEueEu6)1Mx}<6Hc1H81Ub&|auj#7R3HlpFHV&jn4>#jjJut4JuG*NW$5 zJds8Js1HllW663f*?#wJ0|QIY zl29Hm7bq?le`L62G|WV?(&yN~b{#XAW4`WRhT91>j|06z{F6Y{TZv_*%#!s`R>Fh2 zPQqQG2OP>r@^`pIr+)J-^z_Dq46;JPv_BjwfMlSsN$IRp#4&_c9UN>A953jNN`|IjRi6&urFib+X}b(` zy!cJF8GaEQvfUm*6tz-e=#470fP@d}$T^8y31Z5cKJvhtqeDp~#R?O=61<8#kJEq}TVsAq%2V&MKd94ZK1;T%06i)m$mW{Tg$ zX7~d-wqeZ!)Cz;G>EC6+F8Zc9#~DyvgQ;tEWdrKwR1c^snFBjP{Rid@K5yuNf~xwO zk}@I6Zd+7*HE)}ioF-^PQ75u1d9;!+Q+2U||9dReMQg4pE3VKv*YmQYC9pkuSxudK z1{qshP+!f7@nxlA`z>0$wyvt0&nhsx6<1?vDIX)^s?g@83M<8KS@_1;CR>$ohSq^f#;(d@E{>arRM z0uxri>T0SY`LUD5r2G16i01IR#urwC8a?~U`2u}Lm6E{<<#fg|)Tr;bz z&e9$hKWzRuq?%l@=XGVO$*&C-eXrnY3*)P3`VAD#pg>vKzWKmF6#*U0mZ_ zGGRh~T%%*PYJ2qK?ip__wK=i9)7dSQm8$E&sj4ZTRgOg^XkNvdGhw8nY-zd?!j_!5 zvhai-)nb+1I;-2THdL?Tyw5OOg~gSkGiaAC_BH9K#-ab!#AM{57Hd+hYmz4I)Wzo% zlOUIBFF@-Wb2!zrs5A*P`b8V7n=o@k%`8~dtE{VaX4VwXDa+RuGPU$1wBwq} z$@8nr9CdbVt_T)MFYBN|DI;vgx*{quEIl+WT5t4LiNj_i#CMRjWK za}gVc&Mar%s#sVtq!-PUl_KM{PSBF4%3pnXW!;dXI=rTYT4t~=M%3zasq*DOH4Oia zuaa}1l!d(#nY|O)E0m~3KqHiuUs|S&cykith%vi1r?}F}%L#R8PHp`Reah#|$92U{ zL|3Mx+K@g8j+-QM%jvIsSJNX@;S?6pE^JW|t!UPQ23t;1(dhchl8IPLp!(aAn(}IN znmB{fvMQ=7XZeGt94Ff;D8I4H8HxVdL_|NsZrZ>i>A*v&7u|rnI(zui^4jVu*u*p< z73Ek`R$Ngu5La3)Tcy6@#^a(OQWTdBVQf>KC9qcsdz2;D>C0wBX(=*Ziz*5R6wIG9 zqYBEc_iCt)cdu}YE6R&&3(VzV&Xj2j(pm8&>e<55DVNodr5aFJuk5g^b3`b3o*`mV z2$LS>{E+*EQ5$ON5z5N(4pEJ#{~O`>)zKVn4?eNTNj!tF9o{L`K@SG=oF1UAZumP( z0`PqLXlF+k&582>6YPOi6Q#jSWj*u+FTBuGPSAv`UNyiz9Ys=RK4%x#PQ>bta@gq9 z3r?^=kl}10!*t&~%(M_>ptu~3%)ZSSd!xZV+w|7qJ(S^w>NM0<9;eZ;zq+oB`O(h@ zFeDnhd#O74-g7lm_c@_-hnXlR&}t-dEXiRwH(Xh2p5IWPrs@5_))u327uVDj&u6K1 zZxplzi<4DQKU1A7xrfwh37kAx=P8eqwPP!Fo2jow?l0jZVPuYjch9h_&#bTD!}dts zA6gFxQN@jZ9@Nca7-~(LR%K~LS*TX@GqZgraOOk7`dkN_yeXLJ?6`3CI8WWYs<@`< zDY)0+-htZ>*RCHv3B#QX*AMP|xF5kyhpT|AgIfr9H{5@~JpuPR+&;L&a9&K@><%{; zZYJEVaF4^i2=@-$0l1@ZnV4NU9PTnWPEel@*9dnX+<(G74aa?2?PJk7Hqw5scj1~S ze{_)I#CT5Y(>u2>I{xtmlZ$7~!lOvgqepH1rB!9xTx_j=GxFm#gexX1=KFayp?&!4 zR7}5WiePY06Ww-7q!+GVk>M}s}IE7=KB4s`G;+$TChYfMYSD89dHR4AL zhHYIw8~A%y>k~mcwp^QalAIUfqrey@PzP}vFh)&+*puTpxfUJ^j9Z5~C_fSSatp5o z#<*56{1IS&^5H@G7l2REP~rE0aSKrg!#@Y+y@m&I0v1ZyxGON&>R|Y3z!<>{;vNw= z8yI)2VE91bQw1|$92HZuX27SS7;RI<=lnG~9$XU^>+ph^3imv&6Ry|d!Rz)Z_#cP= zx8OemznbhOehxkJdT#-r!@<1PDL)-~;dT8w{2Xt62lDiDpp|_BWjJWcYkd#=9Czb2 z{U`W2c*X1eFYt3Xiq|{+9CTuTKs_8TVtH6MTsO#T{;%M(E-}if4nO|0wO5sy`?T^X zg`7EHtXEs@b>?c*zQ)k6=JyJ>@T+9eSbK@A76OCTesyozQ}-Rz?}sxsP<`-o8HE>) z2lGuEs60%b*)CGxDAN%x4UTQA3tU$?evCXBj^~|i;H&)Nzdiq>s>>gLYULW*`CWFV z`;9e^Z1DL{ulm)@&C?sxzC3x_^gk~9u4M8B7k>5Rv5(&z{^51k)edX;xZ6(G1CgL_`z z?$eywrQ64!d674#>)x!%C_pJ(9ULbPa_&wu+-A7#aC_hmz#WBiqktK3*>K#~W)$3H zIL>FQgIf%@8m<{`Gu(E#J#Yu$j>2&wbp~8E++a90p%3N19$`FgL>oae4(vCoL(Ou7 z4|WRGak?6}cAR@Pbksa6_)nG#UCm1b{*Fp;a4r(P(*!e5^!`=!9hCH*l=#NJZ-wBy zB;4p%^9K=M&A|gz6RJQ>d^N`rxWAOAT=Hx1R?%nlPm^$y-!CM;rmd?kbb2ATS47HstOlJq%)iieu22g;8cJk;DgP!rBcQPgMjtLbsT=KOqu zX3ubQ{@8wqP5#nwArPDTGS?7!bg{0Xyup8LLf7E%6Gtj2^Um@x53C33W___vnJ#rR zzswWQ6YJKT4?8_Xk4ld=iH(f8u1(*{CK74em^>t-u6Ev=c)wyibA2-|uW#PhczyH! z!fTxNi;bP*BYis$cz(gT|9GkA(GIkQOq<3mGi@UO;>*Sq+CHA&^q;HmKlt;3#{Mzw zBGX=S&Z1>0$NGG?_w;cezSQOGcF)pQ@~2<7)vf8fZrc7`=O6S;zwKh$R4(z~vmmwq ztDDyS>^I*|MO{_F-3E6L+y=Pk;C=_kk9EARlTnAXoqaZ3E?fZ|uRTsoz0+H^AKv_Y*iyaK=wf?_<5-;H)^ZIN>Q>an!_TvN)+r zq&UHfEPk#L7AF;v#aT(&IwGgQk;OT3qKotJ$l|0tVQ~sJS=sm#7TXqCoP#F@i$4Y= zs~pZ`LRv4UhYD*1L@0G7{v;EephgyFtBHC}q9Thkszm+Oz+`dGxXG7fg5T6ceK+Vr z)vAf`U~z7kgmBV3@epob#u-!!>7Wv zf2FPM3eaGD3Fkd~0o*WztLIh|A3Vlg19vXM+CYPGEj!Lzz|MHJt?j`$;d{Zq1L1eY z2xr>gz`1tBwm+SLIyx0$cd_x9d|7EzrR&Ct`I8*i0#EXTOCg??=1p=hgU63BR&CX5 zZEd4~-Ho5OwZ+iEr3b5DZ)+P1**Sde?a&UEBqDVZvub0#s9hR?*)IN zeuh@*EC*g}$t?!v8hn$Fn}K&(;WeUXtkCliK2^eB!=>6s_+7wXX7OoXj^+8LeJFj( ze-3QYC;k}Nq)+@lut}fz4{+4;gwUTNJX_M42HsDE-vquXC;7Jkn{06_gdjk5_+k}d1Sk#=VIY=5;61FUg)22!4Pj3dY{lcgf|=`FGIY&jg+CPh3X7jD{0#7CTl@~f|2yo_=Susdp3mTzkN3gPvG{)!KIXnR`z`+S zz?qib%_8?Rq4x<5KyI%kw@~=kgHL-qY~M`(I^aE)94DqTKf{IgMtHS^{}J~J*wt^Q zO&7)|?g-4AqQPG$!OrAGA^Zuj(NFmgar2}8SHUl}^tJ%+w(zfk)2wtJ2X-v{DDV-E z7f3$V0`Iplb`osfZQ5@@-_#HDd#&&%3%yL}MUb0r<(GE*SuVb( zk$Qz<#(A)RpuT_LPS5ZUg}x>9RX6O+Tl(-s&^+0~Pl_DvUNSz`#xzf~!ufzgeuL0* zq1Qq#-;%ph`1wL}5kAHW=b|3!!P=$fQ5K)iG32KUJqG*t<~n4#xWtIz*#0+o{gM9; zv_lOmb_*Rj-9&+ZoYY*Oa!iO!;V82iP)xsYK{$SBd{z&0t zGIMi|#iw0S=Jz!4`&s-hz_bI!cE$LA#XXdA`(Y2?D}371e;e4y5$_PW=fLk{$?+YH z@qa4xK7?mm;Q`^-!LGjPx2W$b$gPw1$#z!?&c_)_4V7QRsQ;60{!l@*WsyfA&( z?{D^7@*Rc$1?XF4AN@3O+*0gw7%_q2JDmCg&mcK)6Lw)6Ld#KV37 z&DB;szL!zo67Z*6{9AxcKgWFBAaYm^8LX#C;9V^I0g#_4@%gO`>o9})A?_}6oxwNl zmVDaTHTfj|97Sh-KEO~;nw0xF@ZJJ8=bQMqBKIQrrd^P~PWX3$?~(X?mv2N9H|Ll5 zR*|cRoZFJC5a zp$mo17kZY^GlU+%^-lTyLPrX{SZEKSrwaWR*9_&q5=tAr#P0}g61qg_3uuQ7$91FV z%|dS!dV$dMh4Ou!@`*zK1AzDup_M{^EL7ee-8g?r?x#W@7K+vUiqED)Jsi&<9VPiY zN$P=%{>aA~7ezV1PJBeleOPE@ef>fB+=qqo=;syXnnL2IgmNh$F*k=K<=RKmLSgtA{J=9*MeF8U=M)dG-;~Pc0v<`a@?Qce;3O80Wp^glkOAB)x^XyuIPS6@Y6zh zA7D7|1EgHqOu9-a$C`*23g!3{@ob@`LODJ~K9^OKa?FZU+jn-{9LFM-@me>>wurfA zn>0x%jT8`bJdsq!qurkg#(hBX|16YC!0~f)?2Pnvp)U#L`f>6f7y5Id=DK`H@V!F0 z!W=*MZ9;Dr%D$fb>x6O)j~M;FqGN>eeVzQ_LWcZEp(UA?Lu3GZV|d!XtU6DLe~ggEp)liWkTl(trN;|0OoVH(CI>PKT!P1 zLMIB%6*^pKKcRhua*TlbGKAu?Rv1K4uTZ=eDI6J|gZsz0izw}^-*A?;b&6MZH_JuJ za*?hQ%JLDje58woE)u#xD9g=omYcL%D9caG@{^Vdoi3F1K>ie=tPf(=2Wh_0F+xWP z%@xXeqTCRngN34;ir-IYAEDVo{X(;ZW(v&^nkLjM)Fad_6h!H#K70#P`>J5PNbMKW z7nFLCrrKA9;f&94#_tUZ!tZH>iZZ=k;4`2nDCPYk-$Ue)mY3g2Ix!w7UZ1?*K#uqb zC~>Rc{et%j-Ys~i;1fqCxj z-wn#}U7!r#Dg5oiZxQ}h;cpTCX5nuV{zl<%5Pq}p*9m{E@Ye``weVL7f4T6N34gKh z7YToX@aGA?PWaWruMqxh;g<@3y6~q8e~R!Y3xA^U^MyY~_@jiMEBxWYA0qt0!p{+Y z8fXUU4@9-^iFhs_em;@2p0-N!f%{n)_krdt3*&y!?6q(%@G)FKCO+;H&4(?F`$h9U z3l9d~W#Js)trqSFywSpafY(|$8+f^e{lE(>oCREA;Y{GE7R~_9w=mjc^Kc9EJ*A(8 zaa}iOSs3lL*=u1m?&f2BxRv@lhJO68g}(vbXW^s3yDWSJc&mjE18=l&EAUzi9{^r% z;r+l1EW8i6!oqujr&_oV@H{zxv@47Iee=Q#bpC1Ibu#deEzI_Dm4(?pMp>BcW1xlE zK2EbR+eeCp**?A*7D|up<1ZFw`*_2`Y#%RJShWuevwhreVYZK@7H0dXurS-l)fQ&^ z7;Ry;k8>={_TjfM+eb$WvweKWmqVO?)*su)Cl+S=pfN`i&i3)5h1otHw=mnsgBE7{ zSY~0ik9rHUeax^h+s6b8?*|@k;lUW6;CvY7XZwZtz6#8_GQ=Bzzd?REkA`>|@Lpif zu_2xfyakx^Z-~bLuLb6uBI16)3xGM#h}a8^c|Ogwe@^@bI;SbXW*oB>cqH)E^4#-B z;7s6G@J>Ma4Zz2cf6fCUUJkqunC}Y26~J48rwh&pUJJ~*MGWr;ya<@{j)>EMrvrbh zptGK)Q*(hI7rYzT53HfHeiJa>?bTeIGeKF5esGv#r1nqeumRs^(QP`sq}b=Os@Xi) zgR5*+!IA_4IZ$1Z(m+8My)>NHer?*@CnZHruXWnOtpXH*p z8OpQFT*pa2>*GD~v#vN6NEg9bYGYo)3;wa9^M4cvyLZezXamw*w->bNZe5 zdA`#ThkDo+^2E<}!q4jDvkh$$Kik()@w4rnh4`smaBfg&TBV_%^C)i;Kj&Wkr}#Pl z>K*z~VXIK7ABn#OmCN%0+Y@U3C6ZM82660Xg77!OkM@X5P#^Mcq`(N&i`l1VvgQ8= zLXG@~mS5g$R9y5qL75GfOuglQ){=SC@?T{6aV-S({MgDvqve0V@^gNK$+LbBh5{U) zTYN|P6erKK@<#FD`{Y*1%^i+_(Le}*M9#PV}KhS5LM@-MRdYb^iIE&sEY zf2ZZ&XZb&~{E_=7MXi47Z_RxU-`FSCG)FCAZ}1aeDzxE{nxZ`}IHMi&Z87T3wi_gcyfKrno|uQ7rlLzW7W>brEvO=@x4*q^f%BzDR#lc@ zrf`{B=b|SEV;d!P3b0xdtJ07GoQSzOI5F1lO0or$ITxdAs^+Ma9H=a)tHFF~vdqMG z9uPm<%t-6T2Ui617gpQq1sB4M4 z{y6sP$#~+{>dAN_W`Rz;@Z+qlh!^FA)*($}tNQO<(j2`E4y)pwOGl2h_ROg$8_I-Z zu73XC<9dqAa(qS=+K(ff0T}R`;1XXF{F)-smIAjynV*@qAnjnvST{y9F#(bc%$-x)tE{M z`vhGzV$x_G0slARo#r2CM4w8;U_gxeh_}yJJ6+ z#j1~L=-?&0Uvw<+2TzEVkK^wVHV-;57Vfkjw?2-)N7yQ<4>l6^SIa~B0MbWMkt`$U zKm?A+^RiCLlE#K+9n#Je$F2{a+(;c8pab2XlNq5S#<|6kSG{3bWE*RNj!n>!109UF z)*qZW4x|sOjd6i_R9UJ~`y6B0e**caz*BVvtN}#kV{;D(KJw8aqif`0om+Ly zmB-s7Y!f8eKK#%TaacNzzem^>NDe{5eMHA(CmhG*~Y^A!s*b#@s!=7!`)Mlb3u!xL8!ZXAQ!b-Q6fW z*MUJMxW5kEjhPf}0%u94gf&N8@oxaDNHeBB=qn4>Vp& zW>&kft+#@E6JY}oPhjOq5Rq-Nu4SB+r;u@PidKisvM$g*y`2R%EXsydto=l$V2_G{ zU$5BmPvj`DW+(rl-<|2(HlfY8?Ii4mp*DiBb_+R((ZVGy^&Lky>_}+%SK`gTAJ}rJ zdtls=z^%I(yQzg`n=D&BU;~JsL*8ucfEsBy>}h31VXLmRK%pnFXaZxo6V%QS5MKgu z-?o;9?H;v>MZ@7tBksZGBY{O(Mm=hcJ273Zvg5m_#rHHKWlnqf8eH1C$ze<$M`-hi zg+QE_f$&G^?H1ZRVl1)VJfa^?Iq&K!vYYc5*;%N~BgT;3jZ6H3n@4<#V7+<7pWt)a z{~mt)?IvONFqaQm@URW{J&a?*pPNDS5)JL-&D z7NHO4KXqA1@0s1 zW{&VO<4G{qz0&w$tos4@Sz$>q*1gH_VXXUQ_%W*!Q`C|DMBgsJF@$2Qn-k$ObMe>d z7YJ$R>UJ`PPhp>yyhv&h=DM~!fLVR9-w9nOQ#m1cOZ?33}OQ=isErxQDM&@hwQY z`}bPc<`rX(X*f*@&KYbG|7%_Q-(p>x7A2xbUH)r!t@Vg>(CCde_{?W<_;5LC!`W5_lKajuRYOqn-~`bb_i2J!v*`B#qf&&3xK*yQn_*FVSK2d}%8v(7#*C#Qc- z|8vjl>+dt8xE97=5Uga+>3?qR+{(Vr_gF6-pz9qZM*aRk8>msu#&1UVjc$x=(sG-6 z9aFFC+6#$LQRh6ZPY!%F^ zP#7wkQ9o-`eDj)?Nz4f}M+(D+FmwkCcmHG7G)*a;peI)I44SPnQp0H9Y$m>n%_-IG z3J~oI1^^54@||KMrcLl2=e)xPrioZp4ZD`*wUf%OuP?8Gou_gb`O+rHU;;p^uxn1g zQLE;y1NqrQSs|n;tr(|~rU@g@PRL3dAFTN*@;MxP8tZ7rtCM|$P2$H6@eKJQ9+{8R_amnDAYqZN)vKggLQWT!|B z6bS>ihf1^+qTHZQ*&{Nw*;Ai$>hZ%FyCoRjR(43_TZ76U?UvBC2@eD-oRj>pV&=U) zpP|hd+KQn)7}|QFO&HpXG4^GcciM}g9U0n>p-q@h58k$bHfU&ThPGm8ALan`{T+_o z=ZaG39>Oq-O0^3DAYxJTf&!u=lZ&v0MCd63al;5a8~1RP(@z;-woAhtsIibxjU z7g=l^9EBmP9Ih)I4)%d$-2f*M`L<1#dI1N;!52WXIR3y>frBFrWO3L*)bkCLEWVQp ziz6pw@ikOZk$^mfGEX3iMU@PvXu*qBOR2=MUZ47uAvHunSL;yeU!9A5jH%;7DguG z4u>0x@Nu9)I~`)fV+vS5M%V&7%!)e?{8te^zz&C>dRN1}gRpZW!pcxC^p{D6m{&Sm z_m%7O!8=#@r(>Nf`&u09*+#iGmGWO>9%!lXn-O>fxX!|Ffk(Ng(0omN%58)kzq8<2 zPrMwCatpxcHyj-63-MP2Jl(<-!2H%^!e_$6c-L6^8E=S%aXaB!3nkYJ@%haRhgz44 z@$6=P%QN_8eb(J(9cYDMv+nKZC^vp?v(ED}!J~!#42l^3Q=zP9;(IVwguz7vtMoTNoUQC@`$gia88u}}^rQl5P$X&<3%1H^Lwbh`zED85&yM`&bt zHu#9E)(e5E^+KINsSo|4S}(+K#%DO=qs&yxew0vAGT@XPDFa9uZZJ*@ylQ=mT2BN$ zDjZj%w;6nXg8sJe8n9rv;*3a&OdpE-Q>`I&uJQes}1u^d)I2V}D zyg1gU0sDa!V*R7sV5xf)2l_MN_`Po<^l|Pu58jaJr;hK$PyKuzNJagykDWz7!kCY{ z#m_vlk4r@we6RUf{CuD3ggYMjd}huSKcAbgryt)5`OR<;(x43?zWYFx;{#>?UMPIN zJADK{!+880&iGL$L4P8chR^$o@xN%v+-LcRD;X`N`(Ew8*5cn}`T2Fj%)OQ=w!wL{ z=5anWQ(30cngEFqn%HatLNP=nG(9XE^IYSKg*4e3{s(7Aj|;as93!{Ko8W9`QonE? zZ+2?6461M+h=`#S2Rl&cS!SHPsxxK3(}xAqM0>oEq^NgenZp@9o@2c;$Cc6J2XV%w z;tcg1FHV0olo2Olbgh_~xY3!9F=7#CzG76|_!Ac6ipHL?cp~CqQx>Bmn3;+>xcA}c zHE_V7A^y-YaPXj<^UoP_-rzxg|G7EmARtEt4$R3pZ}4Ehf8e?HJVk3i4~&js4MENE z<|!`2xP{}_{fVFc7)M$faBi=m4C(s8kMITon5luYMXdQ9pDW2<9Rpq>+?_sMCph(Pq7d>czi25G*bUjI^xY!q>cjIV~mas$H_;$d5RqCxdSQY^M;9I6Ld`0 z-l%-Uo2Pg_>XP%|HDdCJkn~#A!*syh9y%Xs19e%@ zbn#T64@^ndqn|-MId6(oJXyz}gJoF<9rh6;A93dxdT?>#(Zks&`PhwoAP+pOe5g8A zI%3Vs%YqI*Q?;BxKH|;G8w?%CpkuG(;~V6oH*;YfQm1j}pyr&Sr>N}dsq55#4#sk< z`1D%mHs;*EDbO(na>t;fphOVZX$+{p=z(osaUPL2$ftA{>v7;+Q6HGsN+ZKF~wC z$ivL-QwBbqYXb|@0@FN!rT3zH!i>6rJ29|wCAtVRt8Jhk!~RR}B8T(VhG(~S2WN3h zeP_h6xb2nP0~Y7+CF{RLNHhN7;F zDS>He4BynGbPWt_xre$I==pkQK-ZJ5p?m9cnzFK6I{+_uj{%68v7ak;Oy3B z@Q1$YTitRfVIZds2JXm0PJP?FDMNSqmfW9+QZ;6ad>}8a3Hi7lQ37{x;xg*Qqs}UF zd=0pZTYQVT2sY4|2_;Q=`*`l}7);50lo)Z(Wj6Bm2ksbRG5v~pUC~&hJnL38Rx8gQo|bW~i-vog zy0e?6W_tp8d)YbydHY$!N$6z)5xH^Ey6x{KNL4D+#bj~99Xmf84N7kYV__v44$Jv-cF-r zvsThWi7#S#>JUC|v&rsiM#(#HD6y&jfRb5E8Mapx?FOT-ekY)+%!XdE0ej zTbP&xj#7cX#S_q1jl5vm5#RD{|7vSHI1W&$UuLP#6!n(wB(1wLkhjTF`d8dgn!aV_ zNSRIU-(mn8C344({;uAa1l$R{)>VHf^f zXS-aCeh>YHH{(B~Vi-_TP({L>-gc9z;p`8<=k(0ve=*V^7qN>99;2u5W&DSfj0Xx+ z;&?sI#D)?F{ zVe1SjnH#CZ=}-xQl;7dcopf26cLhA04At=oc%Fqz8t-ya_!YsOcy3zio$wGO>Z!** zO09$Iuo-`8_u$Xvc?JKRlW`cHqt$T_1$cIf-YBb6=5Jmp(3}a%tPGyCU&80|%!M}@ z&eOg9w_tc&=`6C+pNblU-!)n{aGp42aj>u%+|bE;1*wHDw1tAJYey^IUXkXD8qg2dA^d|r@7hy zy_nV=Y}lzUfy0vOY2B%B0y6U*y5jsLq_V0MJc-chupcTN_ z`f_G5EV3r1atiR+bi$-y7)EN^Sz&<5{asr04DZ-=ZJ??ovocqH%O z10QWYG{0BP_w{ChJ*2}RNOWAZ*yXg|k~%h>SvbVmz^NV8L}X$uh+vqTm^dC zac2ykIO%%YafX?8+$A*axT{VVSAbTj)n$ezG_%0nLJ$qa%x^v=#Z`#FEVpZH`W$a! zs+uK@hI48kWG)MD6sM)T4&Pz|QdF_{!PeZY)Wi!w)xJr2Ou(s2a5mu7{_o6XY!qI{ zQTG9(%I20;RAJfbfPzt%*A6J3IJ>H{te|{OJp`(1hV&oUzqa(c0R{7G>&oT~$SR$sI7JtQfNrYn=fjFjKa?L&oYp838?Q6$lM!d_ly=62lH9q&Y>hgEbJkib%cC6f<*b z9yPiHWCa~Y4>fgqm*;9v4^RE#4j$%YL zwr55|Yp zGr^~)_c=ErhxUYP=6D{Q%ejhPbIgaw9^zkG+Nap_Bo-lb5_U>C3U5VH~92jptRM_ z*xmd)Cg#WNO$JogU~Imw?0cs7t8bOj3jDCj6Y4tTTVHIkNo6HfnDt#6wzqWr7-rMy zF!5B3D%e=fSJ*4?)CP@kQ!B>J-5ym--%16r2@~dGxq(Qf-Y2 zRtfNIIKibBYVCpCad5K&}2W*NZFhfPlRY6t( zzsm;^Ki>x>LJL7gR?Vp{t|^C+G1}g$sKexY-L^x?1X*G2*TGEr$Tk`CPKv4f_I1UX z{IVXQxY9}lQn4>9XJ$q5ETtqm!C_%j?IUZFNjcHArY<}+$=|8O;std{=tl`FJLREL z*UWONVQB$%4By=1iuy7x8>v$>R5`3zB0Zw%4oy$F0AUP&5AFaQJ6v|A=3w}CE8KL> zk#f9u@x~Cz=hKY(j?*5r2CFl$)(Kma*N&WBTr;t%91nOk$g#3ohhVl^18W6i6~x>s z{cvc{?g(BCa^X{wZKdz|u7kl&p7&DcIXz;lBORm4|m+z^J%xR+UWnNr@m#PE;WtFaHF9{%*RS!v zEGujIeC^HqH;?Yz`^{^&J$f*&(~gt{PbI(m?w-b%C#B9iqtBCE_tLj5z2M};JC~+B zc*@4p`iy?~v}fLY{o2zWaPNnnBXF!_j$ZlUxMm_3ZX(=txN5jXaI4_f!EJ(Tf!htY zOGkBPQ3nn+LJazaLTKYC48+v(1+usdfjFB0$3nqPEHn-^k_T$=qww4EFNwZgWa8k{ zGrb!W!ho0PVauhZ4vX@SuGfIKM)< zcf!2~_c@#koj?X0m(UM`ZL&Z5 z1HdB1F?zDPgi<`t;u~|%h`08p`h&K%o1iVYw#HgNGaT&SAY66FX8&FAa9dFGOI|}5 z{lT~rRtNe@oOr7c_A+LYfE5lpidhTy)>wt<1 z>Xq;kbjG;-BwZ@BpHM&cfXvkQn)S<3r7%ySsf&XRUw}E$B7zSLL_gT0Fc)x{z4Sd+bj{~<_ z7~fNx4_J6D@KFn6ZhrF~3*Qd>jfHOoK4Rf{zQoc*NU)O}+gJ_@}_896teGZs7*tayaUp2E7|ZFYjYl3IB5Nn=Sqb z;hzisI*ZS~gL-;_zt-ZT3WNEh-U3`-EZzj6AELbzf5iMwOM0!)D~0Mo zSI2#sV1DYQ+(klp?qi%lOCzj=;?gs_mCzQ{u3}@d=iZ6PKE)rTTv_fd9(CI>_ z2&LsF{M_S&@>?$PFroa^OMHeD!=Sbb=4-O>CxSBFd{FYo2!E9DbA>-#_(Oz0Sok@@PXlFrWP`%5*6iXnpF=u)&Ngdy z)gH49XM19}8x%5LkRZkTmU|!WI}0%55XXAX*WL?UVc|W%Q!Tt3IN!p%fQMUnCvZOt zZwJn@a0{^4!drolWrfn;0({uQn}PRPcoXn03vUG8YT*sQ8!g-nyw<|&fR|gi5AYVr z&vMZHz?b-SemLiQAMgMRvwpHH%=&3>Vb;&r-9zzNKOb3`^|RZ;te@vC+yeY_3vUI! z&%&&q#TI7$TyJ64&$Sk2{akKg*3S?NvwnJ8cpY$O3$F!kLp|VF&-z#ceAvQ=fjN%G z@Too2I81X#!NY->pRZN0v)&K98hD3bH}E`Qj@#i_-|E+EY41_cS-%T77vbui4&j@C z@k5r?v3?Z*ADQ?X!Bfi9$gHI#U`)XU4-P&z&`%wu;-~(*#Lu)}5gu z=ZT-soDflbKA-abO?i$Jdf{gn4|%>&epZO#KWq7aZ}|^dez9)=4knx_ojSID#?k&V z#aANSpB?%&AMXJ{znY_HQr0{51lQq4e+k4UMNwakPCQch@cH-0i#04BxtWk2`48t} z+?tbzf+2N~-qpKw48DUVY$lY`Lkdt7z$ z1;^C*5BriUyPJfXknCF$U5#eNaLi@ECnRn!1CAd-FMf}o4QsV9p4Vi(uwD`DSI76Q z7aoM=!h@A0_ca+ey1uf6)7WZ{w@%neM!)6Pec~GZX+w8p*8ifRxMx6)l;U)m5`H4< zgx^8G&GYPsIat z38aVW=NA)=G+IZTb;65KXgmWsYxOBIZ8*ob;28@;L`)j2W7pv&)}y_aj#(wxJ#St~S#@1eUGa>_y(Y3S(8B0L@W)7- zp(7Ys>p~qKe|_#m=+WoHO}$w%C^wb{_Y z_5e$Sk%yHJy&hGqX;nJI_nPPj9a$*+7|}5b`8Zu`3s#9))5_UP42o>)W6sgvc}j=r zh}M6Uj(BTpD@4b#6VMTFZS5-P;5Vm@qNDDLSbgE~_q_1noE}E|$i7IQmr(`k7QnHB z*`{1YMaN&CdlYp!55j4=CWfXsSBvRGJ3$@Fw2@jJR#Y^0+{6i!CToOi4fm4_fMvOc zqbYAgnZjb_(!T|<*qn2(LMG9Okk{b)TwZH*7%Na~+k1e?W8)NHVQF<&x`)I||OCX{`vAi=4<$2PDg^Y{e zgwTqmqpUF27ek&wNMLDaT%m!L&*nht-WljMto<*LhHBWL><66IwTQ_j!b`iVNZSxe zt%B66MJa|;>9p2UY)4?}OAMFAdd1)cR=%n^8C(;|MSy`ktPakON@uXj;ghcVQ&ud! z(#km|PB7=IUp$oXq)V--%`(f1xrR4QRoIk3y=VN2Eq&0N`?igCjgG9aZD?|=Fz!*3 zc5RVbVyx=BpF}V8tXOvNEXF<=rQ=Q=$e^n1rr$Na-Fh?PH+|Ri#U)U(uW8zm6_>O% z6&~Q0C=0#5ZQY}yw2othFD`}n{uP(DHRZJi3Xe2=cg8K9m%QOy!Za7Z=Ue^qLH4l? z-}R{*)bQQ4_1V6sU-muyIv4eFh?~n4WrgPWwzjrqFCXMUcf)r#`Ih_)3PQrqfbDzw zrG{^A+OiMS~vb`_s_8 zBQ=%2ZDVv`-Uo+@0}Bspg>1ME6_d8|VrqIdFs&6Usaexufgj-p*7sk1{||fb0v<(? z^^JFDCdrTt$>c%^h&o8rfEY=*7!Wlf1VOn(LKGDVAqfx(2__RR-arFFc0_PRVZ8ww zU3Afxby>w5f}oh9`Or}kmd^HNOesP(U^iBarf5M+1Q`S~uSAWMJCA@KctN8642mL5x8{nEd7 zn*OT~q>lVc+pDhE+ulzd`EUQYgMDB3mv;1hW$4$bOZ`;H{a)Bfu~__bWQNl;pDToa z`i=RsaUUj)`%B9;D;AieQnw|ZSNe%>DwdL7X)jmZ`Qx!;z(+@`)LBr~_NvvQp*2cl z$}3+y(R##e>BV)c=YpXA@;^x3wzG9tf7PeI_zTm1927ntT*Xz%&n2LLGW~6&x4qJF z0Ko5m7F`}y$@G`H0X!(CdqwN?eu`)<{6?egQ>@#_DvP{dp$@bF6k8XgDsRWVN;Q|z zKE@cXmcYe^46sVR&03z%@)+tW3fbs~r5nb)Zl8#}{CA&Xkgj(N@`t4Zw>zBHo6eV>BwU#Uhyx>v});G@xq~hV*#(~p)TH-J5DEuwUk)( zBhuWYq1xZ!X5~*lZ``4l4^xWG6fF8iA7*%T~Qf-@+BldxjhX=K6BXpfZEnAcGTHnL|CqFO4a zl@qO;R4#c+(KVJL>->Q~oBSxlI|Ud3f~Q2gV_fBLar5Z9*A;m=(rW>et)|q;aSnTm|Q41Rz(A719r!qFL=Nk?zS=<*9LlC#W%W*mUr3?w+1~&M6Kd@f9sD{ z1FI^2hvzF)vC!WdFIDu9VOhKQ@7zH)AI?bY3ujvOvQMd;k!_F_ZBZ)q7*e(N4skuP zn2x$tD_{_5QjFFXP}+UPs(O~qh~^%z%9^?)3uCtbH$9Q!f9@2kkjk+D&N9wX$C+Tm zC{y8Ym7b(7)K}T5-ALk%r}Ye5Er|cN?y(;0tl{KwFi=bE19#g@o~F;I;fCXH?MG2L z!RjufF19D3WXX1%E#LM2)`@5@|8sdPpud3Za`$F8Y*UP>OXjl@ijz0EKvCJPX0Sk5 z)gLS+h?j!sAIA;4JSZMY`H3o}DnSPnf4&I{akE+SI*Ka#aEG#bT1SRbiF{PWRq55~ z|AEgX(E28dsH%;jo-!+1d-9y4ylctPI-VHH8PvD~bY2lbUH?H&f1Fj{OlU!ivH%!U zm9oGU!Qyt@thiN6-8qCZim{*7)9kIxz9{6`c!gusiq>ILq6AeUCFxg^9JcRNlEJOW zFrImM(mHyme1g2C*V>DCMVp~P6)8mT!ICTn? zY!UNAqev6VMO6o?eM>7!wjT2F>V=cb7qSZpaI_%MbPwtG;}7?Btbf}c@8D~j<2+!_ zZ}{iD*b{#xB3K=4CcJ}48>!<>!}$gy*f=clDMXqPWaBW`O^CmYVCFem0lGZPxN9~3 zI}jY6qz?eFf!I-i#}Q0(N4z7O***y@`Dy$m^+IXky`VRMRkHo@j$U9<{tPV2SMd%n zDDDdIm}i(}1PGRKrdiRouZwhMz$2xAXdXq;35=8rh@O+(#d?2Ad6(z_rjAEQoeo7A zh^U-$J=X$N7qH>F3Q?l*#Yvp_PcYNw0hs422MeZYrmJkvSJ}E(GHI<8jdlwjJbs~Q z?=!cxwy5ulag@@7`aVV>Zf=WBJyh>=6#-Tfbyx!^AjSEAd;D!h}UB4BM|A&$T&o}U@vnrBD6SB zO~FENa4;uYt*WZG93`-lpF`3IOfJ`wzhg3L! zWu4VB8Avual3a_-yZ2D&GmwOjjFgj!J;r8Rh{TjLiT;Ybw*fV>cd-b+!8xF=O-f() z0p$73vr2)htJ3}(O01)V`}dUCDy5*rQ&uUI)K*H-m4VS?ANh95c_hy_iqGtNF4gbc zg6h4h6n;U*-6jd9Nv64Y6UGTwe7i~J@|B)N6np*e_;=iKs4?YYqHnNXw4F6v{5sYR zeC7_vE=0Q|GVbod|F=Xp^%kHT*t*}M?z0h6E~m10*>Q`2X50eCzaylU0weMWg88;q za(Z~jkv*9DKSc9U@9!+#Q>pAjwkMqyb*)w?+mDV44L3W8`KfAe)1*i@^coaN@qJ3Z zh2TrShGL)c0!>j0|3-ytsKL>WnDcZ*y*VK;sfKY*hIyFq}t_ zZ+2o&Py7f}MhVb^12afeJJTi7x>%uVXSzh5#b&T3s-5W)-?LG*GhO0eZPcqW`=^as zJJUJYxts|}o&*>essSM(t9QcncD#GR`1$ucRz z{YudOith;dlySNv2@KAgz?=im5b3RQIDaGkyEn4dh%mrOEx(MJO(y? zfi^ODu|0=y^3#xpQwb_vgH)y^fyDHTbVT+eSWG2b?yMt%iTk}B1eM44(QJ9oiG;h zC&1?JYbH!WoQ>x0XC_`_^PGgXjZ18{ldPfV2B5rQxvin+R-n8r+}6;u9_U|*T0_rM zHmZgm!<7Y`r^TIert4*}-4EP6$MHI%xpyFL^nD6{9|GlRHPrK!>z_cMKw`=%Nsj@< zJNxnRr2t_r0)~U&BS{sc;gAP?XCj0=r?~ndT7+n7e$u%B@lMAOP_Pjv9s$zM&>H4R zq_Sbs@_Q%nLRImC-U-_f-vRElfxQ#nLHtw32lr0+haDf%J24=ei&8rh1LA!Z8qmOv zVjYP;L68lWb{0{?@e0fHDhSSWw^kl|=uC&HiGyS8S-b%I{~O%L5{=VBoW#V-q=CF^>%E_Oco%>yx2wFNwbZ+D6oJi4)Ts4n4h$$+*x>*D`UCaaitY zoMG;1;GoTRPm>Voo+dHeJx!?d8{0)qQqT)dvgNJDt$WY8&~5wA!6l`6*}*lG5_CvI z|1_y5oB0{^-7`7)3N(%<-pE&udeXwxd6AkPRE6fSo!Mj#5*h5}nV*57E|>!z*@7Z$ zlkA{cy^KAAWVWDPc;?wNsErCv63+ND-9bKFwUSM|Xmz+plQi}Wz$xEV}MHG@q3jSCJXlr(0aVOvqhoE{U6v5qDwQOxHPa zx!qm89oJ&oChqEtxV%h9s%vtb3vVlI5#Dp*7l+R^>PW{w?k8xja*F^XQbhQL(=;a9 zqzyuXo5bgzMg%h0^7_I02m(k1ltN2T$kKT^!BPZdHJQ+=Z<$?u7SIwZqmX+0G|C8; zAwU&DSQ}-4q~2_UK99PAbg~i%XlBM&C{j5=m5K(=IIF?=2dygPpjRfXUy!3Al#3Hf z52#yau#@?KUyq<|v%CW6y^3_1T~)qv{|W&up+2yX&IzL5TC_lyqh`iA!<5^rYllFfYT8VgmRIzE|iP253eHVl^cmiY`(OkXM6;}7hNqYPA`0`lw5WO z+JiF%U|a!U$y~-4|EEG_IIobR7|RG2BOt@Mgv%}RN&wCpkZdbpoHGosAuw(?K3~(` zROJhF#1&w9NaYzIQSzlw(tn#@F8xk>qW-vW>zP=K8=~6#NZBKo!N{v_0bIX??2E1L zr}SuKZH;}Rn_S0IUs7(_#wm|YV6tx4su00@^Ch(l>D4IWo-On-;0<@nRb2Sd>H9Xm|JyiODzi3QjHCkS)is`xU?y6nXatw zNP!Xh7_{9+}sFPJHFZ)wh9uh(_ob$ zMxtg|{eR(B+ExV`o9brPHK=Y^WmieT;K`RJkEo<{z!*&+sW^G{0mg{_L)8;&=QcL^ zMpf0-w=~s~aGX9dhAy2@Vq5~_s%F=!$3+7Mv&y@tQ7I3Qe0Jo6WVC0<61a%MX5F<7 z&2_%Ic~MzZZ-iH{Idl(N+)#7*tU4d|f5K9n{<*mA5k9$Vy;Pbw{oNVvFaZWRhzTUsH5iY8PsX;fi^z?kw0 zV{zIV@*`5p7tWd9SRX-#@4vB)&CLs=7p#0%-3;HwW6C4M?0gC$QqX#AlnDCeaJJPr zzqzC=zhH1=>Gae{oqFoPPBjneG<85kD(X=%prGL5$fh4xRXw46V&j~uh6o|FeEyK= z)Dd+vOW`grmeANbpRc|)Hpjrox+AlJ1)ZuLSkQ^u2_r5psVpuppHMQUc+!{&;~5`w z(Rd?*KCyIC@tE5c&}zT)eE+zmeLfcZK$F9J*y=wlp;q*VJ&P z03%x%s9R1?9=C-eR_-0Sk20!W5OwR zb!|;$Bw>7`&s){tRV{{vaaIGK=bgbjkN5N<-si2yj3`f<#SM)pWA_=|#g%uWu2Z$bJ$|ll^FdWFCC~nRGU0 za4dHX@V^IqfQBc+6sWs~p9&l{GwPuHrNHq5 z6u_?no~Ge*faC0j92m+%r_%U9USCn*aY8?sz;MS?&QO2<^Dg69df2` zR$$zd2bwW*;|XYL;?tL|3D3+}8aT`dJ_*oGr}d5lhn7`!&9%d32oJ76s|cf-8s~_+ z%)k|6twofx!ZK=JJBQUZjKT#qtjfn{qG7cQ;2;yv?8;&0+{T8QW;!jkI^!_y(wl*& zPihK`3rMscNXLZen;(`N#=mA?RYP?x{OmSUzpg%T4O24*iec73Hq0K#q}Dh~T>CQ_ z!G~}?!h;A~5MD%h9bq5BL4@xR`k|v-fKY-k8sRF0n-T6u*p9FY=e`a7X*1wn1Rh?5 za36N|{0Qc@@B)u11qH2s!@kVX1P1iSx&o#kaF*}zHz!S9K6~bCkDuyzEcu-q9$`}GL->R0OOpJhY0~a33-UpELPCTqBF~i`8Zyw5~2CyHdgm~D# z7WZ1Hp$w1^=X4kkW#a?*x~&i8!q51ai8yG8#H?w|(?xXB{)|!jv!R!`X$arRMXd~U zkao53(w+`K`fyUmL(oHh^(ULrVXIY>N*2oAe%h5Q>u5=Cb-oLi*`m0^jZn?1F zlb@>TcX4RV(c1jgNowwgbUyJm!X!}>}_OFCz&tEsGKm9NM`N8q`k4A;B zLTEs^8DTZTFA?Y;=^cc>Asj*IinjJ53`7`(a0Nm=!XgCvVt5!~E5aKHA0m8(;6&xS zBlJVy#4qQGs}X2f1(gO(emJv^gN8{Y(Mm~3FA9mD(S<}~19H*wK)e~+ehyd%Io~uX zA{Xt8M3B}CP-oDR0bUkqKam9#M=x-a`Dp}^??9BKHU#0KF#<`nQ4kVs8%Uzvgpg>f zKoZRtL>Fy2NTOkfl!azuB+;x)NHpdmiH2iB`m0oeRy0yoWp)8B+6YLFw3ncuvep5_ zK^p^-Xn!GvpcM{Dw964enl6w;I|j*7+4g}%n?2#8Ni4ZmBZw|qnUYk7KjC^=xS9cl zL`w~F(QHH1zad;ScM#GyLOL%Lq21=|1%T=L8lr{P-PC3Z7HrpBA_-3BGIa zjDlmsd$^YF0?w5eHog*gu9n^=a`QkxWId}WxhmlM@GN7?T_t=IKtHO{FB1BBpdZ%g z1;BH(eEI=}d2v4uDespU6e#yM&^?;|H-PJUc7*A9E=-Am%T(9>s;cF3CjdZ*Yxm z`q4!ACe`}Ezknao@DB7z)^k7T2Q~VOLjO&o@gNr`u%A2*+TB9GNu&1xZGq6Mpyz<} zThcEF{)y-%J^?t_OH&{5QNZnXBR(8~5G8d?%b}NSS9Kp{L_&xd$ z<-Qa6s6f6uk$$VdTLjh#tQ8pUWA|kUQErF8tpfS%MY_B@{`5ST8Iiw2qhG5it!Adquu#5)AqKDFN! zT;{u+uM56Y;EMvoud9cJzCqwG1l}d^c7Z<=*eY<5zy$*Nj)k97<}jR9f?pv}tszDF z@q9(+34cF78*nu{Yra(*W8V}WlAd{f|Vfx86$R^YD%J|^%H zfolZbDeyLd%LOhJ*dnl2V3k0c+_7Ba1@c{<_%MO|%tQQ4f%Z6+DL5``l@6d_jzF(K zzLQekmgC$paXfY_7%q=nXS+|Hi^k$UxDkAquW+sh?2X5ewSun_ob_b-VnC)Z03<$F z@L7US6MVAZWrB|uyh!ju!BGySFIRA{;MszE1a}Dzp!kWS&U{?rYByGw^OF`$d>_t7;Xq=>2Kv={2Y9ZA?*&e88Fu;};4Tf{4g4@~aw5MAc!!2>2Tqq6cKY+c zpV#oMz&C367T{|&d^7On8omkm0uA2?e3pi{1D~wn>w%Bf@cV!lYWP~m-HGB~8UuyUO;Hx#fKk%D1JQsL_hUWmk zO2fUt#V_0jmIrgP?Sr-SY~ZJ9cqZ^v4fg;)IyhJ#jBoAq;DbZy!#LOeo`ySt@6>Qy zA99c7Uh=XzF{ojjN666bk%UOi_af@7$PtEh367Jpmgd0&h39ozOr?NHC7mY!2JSvoqisAyA- zK3|LX&}4UM{QMSW%kur+&P(34R6)U1I+O|jM1N;s-rPAsjOT&PuWWo2c_DCMBMs=;TO7w+TBZDSVN$=DSFRhjRQCZ|{@*&@iVq5;NyHI=YkLE%I5r}>LfS=CfM z2!=d0jdQT)GkZ(rOcWCD{fzmmrd1g7dMGiJhJPDTZy_Q3BG^-$TzGEbPkf zchIvs7CXXdNtv_TKEOFB|Nh87e!?xsz!0g%Z$i2^FuWGdH8#&l z6kZPMI0kN8$G4r7gO;K^!gW-lEgt~=%`}y49EA=%!tjVF2YRte2-oo=ba1|Q4j)`X zj|d&oq!H!#lbnw+d;knRG#%+z(@ucD)^M2@He;5lL0ij^BiphW(a9ka( z;}ht}1?MEuaRXl3rH=(P*}k(mdeM7!xDGeYDIOb)8$`$R&>{UpnwDj^1|=A+HqcTy z+^4w*I&OxJ#bNEC*UK(PEFa#hp@SJZ@jy+vT_^|3g-am39BN38R+o0EOQz`fBx+qc z_pQDWI?hJE+0daMp>^rpxB5P*%V_A}c*T8nbb0EP_E2?UqlUL>2XyegWpbzGQ0Ij= zX`iJtw2wJc@y>??pR~tOlq2jE+2xpnb4y$Fh;#cqbl@^G`twCfJM{YKb*aalD!h;F zhYp_0vCu)eO?Y97(Z^!?RzCn8?Av8wQkuaKu458( zj6;sH_op$^8_iFA=YG*QWLUO`X}G`X2ikcFaa?=Iw{ySfzk&{)+mpg{@RngWNM&W` zKHfJ&$8F&ELI-7hy{&VNxx86G)j>K>+jgX}5AQw=eG(TJcmlrFd8=h$c{oHf9_!cw zJ-jx<5BU1Mtb@cW;9&S?6(0Yu--fE?nFE&m!I$K3`y-H7oG#OHNvs$r!_%>U@nc9x z-R87B9&7Zwb-L#5wbDP%Lr20b9sXtQ;Gvh+W&Lr{E1$FUND9ZKa2uMAwpqRt4#1Zz zMWOu5eBfP-51am#3#fUuGliIMwtv}h3d4))vJ!~UW$yw1vH_$)8NICT#2t@*ga--D zU+Q57n?UxjEVPK3%Kz=MxfTYes|VfvGQQwiY9CBS>k;Hm=we50GFcWC56cEJajuC4yP;I{t%-Sh!F{2^UZ-*AkL8U@AXQ3=23sr)AZi{H&^2wVCxa$%59KkUJ1&cFMzDE3dgw%iI&%;?MGc^vvUAf6x4jc{! za!k7)iTvc3kd>B3lX7O4(8El-2=U=4Yr;wHw5t(kLnZWbyRkL0k;^#Ty%`SoA{*_h z(B-yNibC(S(Nu*#0CYZOJqo3*Y8%lsqDE>v@UDIE=Z#O)O87WR7!S7iR5R_5c0Aoo zHQA?=~2J@kSQsw4CuNrNFL4H1%Rcx{pW9$Y!(itV6MBwRK88P#@W@MZ_}$F*A|Q zB%Vbq@l@9)0GFA`Mo{`wjMRG&@0y1{XP0X|$&VwV)O9^Wky5mV@PfjI=;A?cnBIr( zH1qV7jCeZZJ4ASnQvBY)$thm`(amncN zybSsxz_Cf-v7I#Dy)_>U3f)7xG4KMX0ma zS-utm+*e0>GU+6Kr?-O?aM43AG?-IH5qQO_x#+pE< z4=lyBC!w2-7ED&pY^beKtG36NS8yJCCN}7t(S#QEsO_5fC1I@YLE zC1g%MHQ7_idZ$OZ_s)QR-K1;UoJ$Sfp(ZvW6Y?pnh7NhUIcsXCvPtd_U(gZ zu-651ohHjk$OE@jH7CNkjgI~g%`g_9eA?@ee(H%od}`y#x1GM`fwZT}|91WCbr|RnJ(cH~WuboNY3tSXfE>||Y&V;y3)1n@ z5a?G>tJ>OuR&}bG9IH;8cj7t0YlPCrQ%pTP|6B)qsBii?T+?c=g_$LDAHZl>;L>Pv^*Da6@zI(BbIQW7_5?{?YWrc&UdnEBSSV(;D zBZ)78vY?Zb6(ns$kn_)XSd#ccE9yBJKoTbpgv57olK5gSB);>J#J4~p@l};1zW7NY z_b=rCeh7YVdtm%Eh-&a`A;!NSuNoX_XR0#F~U5i8BF`Bj*xG;v9pJ zIQKx(Ui?W>`Swf_U!_HTaJ?Vs!M+r}29$G!oRS=H@YpeqMS=B%#kV?`R)}x`(ijh< zAxeA_!muc5)HfGl2-4mG49LkE#ZysK*cip*{I&BN0FDi_@P|IuzFxz>0*!nhgMObz ze_!ao2YszZ-wB-atT>duXMyuuhmAjmF3NG!#@7Sq*lOde5Mh2dLXO{AY`PCPzyH{H znWpDr5Ya{fJq5rqT^`7X*D|ihKss?=OK1YM6%XNd!Jij6UtqJqe1T^R^ay<4>OsyG zg0~60PT)L&GX+))EEhOI;DrJ?qsQ``CGbpvJlCZ2enjXL2%vEGI5fMH=N-^Zemp<8 z$&a$SSze}dtYSLlF;=Nt2__4ODtlBCa5@wpArlChZbO^~H}ycLqN8oyn}Ab)yTJ8; zpgWfUq72T(fRw)h5M!mX8z#M8=PXT28CId2klBAajeXP(&3w@-}i-bO0=;#kh z&mf@>5IWm|f`)Gf{+Nbu0=`DWHv(Ux;qAb$)$sMer)v0p zz%SA8wZIECoacwnX*f3IWa3*F@DYN$fDZ@WPw<1Nrx&<|8XNWk2aB@3MBh~YOH$DJ zc<|oIIAv+S$2j$J9S7sgb1LJ|!DsR|iL39J66bRt*QJn$&wiZ2OgS0PSisRwj8t5B ze9jxfI6D6U#GzWnIVP?Y9=-$2LITrx`~$&`V|)$7`)WKRwRoZye_!Lb)^=E$)+!z= zE{0fRE-Ri0yQo-C-+5sV|CX87@r3lZhfu?=Souh4#=)PQZ9H}y)~IaiElOR3{T?8s;@OnDyIn#1~_{hzQSqx_)+*iK+v<57c$ znC?~-qo8#h&yH*o#=)r=hK5^Xye&o;sUwCR*^|g0#W(K3ILo6~|A26Wj#zeN?@JwC z5*?N%^&g=lmK_;&(0#qFqd&?aBW$FO7Zpef7odLF<%ng^HVZmf|1#0B2|A>IgqI_xZC<_Tm?S#%{O!1uBc}bL%#mJJO8f>xgLswi!Cu0BfZ#ThJbT^#UQT*Cm?$)@Jl^w&_~0bzY9< z#ctC%RWoa86C2(?wm=8Z<$cf*c4+6NbNj95p<@~vuw8UG&$0R(^aYyLwwvNr!+gT+ zrg~xUt^wWIhpC7U2na{$h-JUE7&>wwJ4fY#5#6C5Bb86@V(lXC1G&$ zuS>vXfc@2-w0L?L#r3aDB1Ja1zmt@wQ%K?N@Zh-_6t!(T*KFB>^-3@uZ2pQv*c{o~ zavj{|zB12%n_lW^Jlc9f8_{Lq#kdO^7JTDq%_ZfqUtdU;&wgSmEgr-3#*5p z+#xJmNIgQgHQ!FHQiJgjXx*i4YaS^2op>SiuWQvxaGFxSj1(!lM^XHwj5}l# zf9M4iCTsVC40}0{?XBcH4j{?D%n!|Wt$t6+%9YgM3!a*-qy{xUs+dZVSxBwq%q+ea z$*=Mx7+3E^PqN8NC}okfJ?1O@S7XO-7q= zmBC~|ohfaHv`%t4dWlD6I@N!p%YW;`kn%ed{kPAdxU|$~7&-j6rb5Zk!j=T9v~4#Y z^543FOr_uYZ@pGBTY>G!(L0}oK5?>@Aw(3rJ43YT=_Ez1uApQ)3+1s%Upvx1CJARJ;M7mOOcj@kl-w8}UC*D=Od+$Kz@v=|u_sr%f{?sPp zcHxu$3<}o4s!hgSeGvHy1cxX26S6xU=YW#99)D^B;6ULxt8gEa)GnL}#Wt#T;Y^^P zhbNe-cHvCmX9$I=T{sikY}BhNw%SIm4S-#A(#bjdgyLj=&qy#GzX3>`gFm&y?<;tkJm(46tE>A=)l*4~bph^Ea3*+}PAa6M3U(p1NH`GMYnL|h1~ z5be^+xN8HVe?-iEYVvCUE;EJIR(Yft8KsDur<$k=EJhK`iZ?*Xd<{4MDY%{$z1#1B z)e?ghZWgagvp1dR7~N|reY&YU=}=mwRnSpRPy@ycBSb^C;yP0amErmacVa6Pxl=Pe z@w{wRl``(6?z6FjGbmT19A-srh~C_Ay;jN2Y2fX$`)?^d&?*_Fl~a|9UxsKH9vaDU>U*n&v03n^A+va_2MQJ)wqR@-7q-EHAwJ>U-x zQXFDYawB6pm0WI`6h4KTD&7rIumy~nfu67)n9==u%2b-vVN!;ctk|m;)mPY z(qu-)T@;&Xnq*firz?s=L_UZR>3IuC9OQf2o!rq3k;Jc{$?d^F#9m}w3VzbdP;^h4 zK0uuh3L7ZR8lXl2<(Qsk4N#W=eQ=Q%&53R9mVrilp zeM{YNTUC8m-Edpg#4uac7+dN_8mcA-t!3So&1zRnY+xqc9D}=ds%^9C3EHft**2@` zy3J}v&^A}M%*_m#^P(NP1rWS&gl?f5ln%A*&DJb`zNuR|PW7kzH+0}bs(glZU!P_UpwQfU_E7P@Z-Avav z^OBx_GU+qdy0~~T=Ut5pRJY0H;{k64I*qsXDHwHi8gJIOgwc36<^!6}$Ghs7FdA=} zQ^IJxA3hUC<1OxFHEsm$gGuB13~b+sQmKP?v_Te|%ck*`RUJnAZ?g~9I>m__1<$N+ zoL>16M463d9zcBT+}Pd{#4V_i$getcauwiL3=ag~MY zhzS$MVuPQ+BL4|ZHMLE!?X6(Fztxq~PFV#ewgBt}kYgVdi-$bnp0rOR5FA6(g z+a6Xk4z-LWJ2NW&U*q8ty1=joz7sbd#)xGPQ?xY=c4*_Qt3q(E@{_?KPw`wGkq$o? zS}J7q;W2_+X|u-4*!nt6R~pm+x=?8-_SwTLtk%N|kHTrJk?GnsDc^L1EddkVIv>69 z*bQY{>T4`D@R|d62$8bVmzyF}nz3C^^{h#a+G)Gm2yJA|q*`xXi%V-9o;eFuemU%N za;Gz$tCJQps_e!)-rirRrOJeP+P5!eq%|+D^{@srssd$_mNKGL-yYKWeaSvlvnqu~ zRSR}GgK<9hC5z0#ZfKSz&<|;*ZdZ)EEYU6>z|vutM132Q>n5!I6{05iUfy6yZvQnFv0F>k&8??MIlTwGrEDIVbJI4jRI-E%}rlaxEM4EW7I> z3y3{7%&&_AhS)`?LBc+1r{T2=Iua4qAa8!};=!^lMVwC(j|iPl5Kjx8PY$mjej9lB z#PG53@JZn-;Zg75kl~~R0}p0wd7t6!Pgdc^@ z#{=p`_6ENfl4m_2*p)5-1?}ev<~>N-vR-RbyH9$-Z`(=pn+ViJ*iwU}@?#!&KULp; z_>Iwn!0#sM2rLtArJr=4dE~Y~*R`a4-K%=CtYdjxM{lanJobe?DdF z@OeAF+~P@{-1_3d#+n;@ZhNWw(B}uZe*LT8Y#;jR{Ik#99@qNvUs4J$e=~p9J(vD2 z@7@Pq{we$GXWg6ub)(X~5V(G7IKo&2KHb$L+<1tk9Pry@03?VHHiUyoA6%?$n;df4~YDD;a4*e zNbif6SsuR?eYZ)vnppvTp~$NVFW`3mYWfT~cfsMICU5|`H4l$xB|kg;J}Hk~zIMUw z{OLw~5`q$iu*X&%?s4 zhI#t)GY|9!jT4sahpZ3VfO)WNY=7!w8CW*fkLS#;m!1c8hv&h*Y4dbNdQSxV`ef5a z+b;`Q8Y~^JCCc-=Ap1T0dp87LE2QHRQ)>cf^Z((8A5G(W0NVU>FD$Mb;J#K@&PqLl zYXi1!{arV%72rAo?s>&E1ka5>?B?14t`*=K1GWX%5^${m_uMj)H+;`MwYZ+3KN{^q zgoy~8NMC?Jf9ek){2E~w0+*J5h2X@A>yFS5;d})4_iGStL|BFJ5W-UkoVDGL@FfB# z(z_vW4j3v7P6&$`{wF|5>Vv-=KpdPMBZ*UGVqC*Xcak^*FQnnXNxBbzY%?6|g~aa^ z!o@EI_!<0cAS6z*k;EA{A@PF?Nu0(N5@)3GQhyv&~52=LjL$ zZX7vzCxRSp$ilDB+lCliPMG5cs>FIIh`%?{FFpye!UQ8e$gO_pErcWNpq4o zT`q#`{v`36l{7m)?2yFSL*e3FK1rO|movd{E+p|YjF33HND`+S?Lr9GPLPGflTR+r z;)`I|Qis5G628`<7sMExA00c!duI5$1m13jBP>MvKs{adjG7GEs!n7VAU*!$=zBJ; zMp`P;HtTw2Jp}XJg0K$hyfy>nLX>HH5$-{nY5{w%DbQG#g9vvZ?P|b)oakk`8*TM_ zq}S-_vVRwK^ZHExYxI0aBdsgaU_KJmjp$Wq`W~n%yl}J+R|PgU6oEF%VLZrtJPw7! z?@R#a`kD-pb3(3A_~;WKYyI14k3>1*9l&XCVdEcz#{Av`eUQcn?*IY)lzUXeIUaDl zpxheB4G=lfR|1L?T10_7lH0o*PJzrJ0d;pYKAUBmA{ThU(y^YaMA#n$eX ze3{OD0Ga+ztb6HYT^bum?-2UCp!e7Ke<$>9mah+vO(xPc&i5LIm|7z7>J;n?TPIy&FJl$ImV|aeVX+;Jp9cEOIRZ zrz71yFHD~zbbQMS)PwYkgpR>2P!G}v3mx`hfqIbMN9ZV8pdO^-nX{ethd9)JFGDcE zp^2RI7fk37c+46Aoo@(yRp8GA-YT$M-~@ra1ZE4|>$LRl5qQ7AUkJQP;N=1x0=aOL z<=G+d1%U-9IG#V$x*n$UIhyzdl8*DH2C<+>?U!ZH$skagzW;?3tT1eHi0(? zTp)0kz#4&*1mb)teMJI?3+yj2S0KkZ=9?)H)m1ovf^I;ZGqtV=&q;2k;QzU+J^>x&$$~o^W6oAFJB?&gXxNALRqM;D>-8)bNAA z_i1l;Ds8# z9eA#WKMy=x!?yx=Y4{f4htUCXsP@N>Y43^qO8X-k?gdWML*~!)UceV?IPX7mG&~ddl^PB!opzcV+VXfNY9FNGF5ta2 z+zC8I!_isV>4(*pKZ^2yq~Yu@zt?c~m*+H`{bi$uv%lP>;p{KhYdHJMEDb*Zyh6j- zUq)y+`^z~R&i>L%!`WZDXgK@Jzj_7h!~XJD4QGGZtKnl&f6n9J*pTbRd<1aL@ep?d zXZv#ghxox$)w=z5&J7XY1DxgIJQMNFz}dez2St1}@U_4>KSkUJ{088hyCP1z@F~Di zMuiswF9NQf-;v%6xEHue1x~wqb}bg4U6}s%Q!HKT9h7m(&J{ZK{#@eB^GS)bJb#fm z%X&=WtOw_0sE2jDP~xorWQntFnk3G4!}F(+f&r0pgilMH^J{#EC0z~t;A5O~U$l2- zobz838ApX^J6wXYreeV7To|&alP)!Nm>^Z^$}3 zeeyRV%V;zA5ln%pb}J>gER4?Ei9i<19|^?j7*T=71)%F@_;hBeO#j4IV} zy!Cze;i2F{i3pxxEixTa$n>oX3Zv z!@|^mgpOG2`>2Ea5!yNqcTx^~GE~aL%hAAb0q925o2v0b>KP02-gu%0Il|#xL9lRmY_qA z2HzCiYbiG^SG~vZ8xmT|I`lPQ(R{1#fezj?+eODA=#c&qRYx?R=6j)oU1TG4=tq>g zusx!#iTg8j(8}?*$JY^aP254~V1J;GdFFi>b-`sAa@g%r<>QJtwT>*re}6Xm1>570 z=*Y#SNsRW0>C?Oybhx17+pxNTq_t`1YvOXCV>JZ$e8^(}%0Znt0?m57HE~;^V=@F* z;hB@iT7ePlM__Cpch4-FiK@79AfU1LZG@DU~G`9Czzz#t0 z1lF^$4W%6wwBsO090MR9Xece!Ue7j#$_*?za`~U0hyJUUX<;!@ca$}Cn`6mW9rw3>@0ov*|F)GhN;khh_R&^egI}E6`u!z~+^ye_ zX*p|a7ZT2B{eG+ugiBjewz3vqblb{?{350G`|_5=t*qo1arxW*<1$mXrM+6Zg*oQG z)_P?6qV(1yqZggs`qH-6BXLdFf8K<8w!Uk&`tvKff`SFgE-Ssyv}F~n5nm$e?b zgkob-myQGn$f^hzwjLSlOKClFX-hgtsu2AVQN`%fdZavcX_m#U3X`^#_sq{{GH`Kpu8=A+z@;Ww>ESdTmZ%qD`{G5-qOxCJBG~Iqsmu&Z?wC(%+Gc-Qs4mp*}f{L5~It`+0H3am(jx)sbsGXFV}Q@2%o^*KNB zS*IX%+0BUKG&~`v!B+B(u7uMYwvwM&O1}BLkVmwO;6H*UAT zVvqmnCz)XdByIlvI)8)4zu&*+F*1LHwnXnrT{=UPI;cw(2BlWs!_qxnaqx4@s|51c zs&gj=xW7*Ily3E}d=?^Kr>5bgfBtXnyzSD3-o<5XHNZCz+T~yQ6okI9gkI8wI&`7+ z0U`gm4*!}5Ao4}7UGD=r=RA$`fPc*+;8e+za-3gWV@vGSB}Qrzd;Jyf_@91)LX&db ziVN#AzsR=*|EUWm2L)HsjwSWQiht_MRKK8_(oO!Aw^)TxD_!41TwT*W@{c{kujs8m zG%Y&g)zZy;qY2VL~b10_}BW1$s8B8zGVzOl=}0XLtjt5Z-*~#`5XDK zE%~4&Z)oY})Squ3dL(t-OCauDvc2Ub?pc77=`Y>FMT!2>O#iwN zE3dkGXDbR>ZBa4huH|leLx)Gg@Mf z0Hb0W1R=BHLQowGq2oHDBZ=JvOun{2p|Xi7xd*9EZsll}oR9x_wOe}`_fdQlBJoc# zpm&3wbOR!BcQhy6tzc79qk`8aC8LyacQhoupz!*n zPZXS$)TUrf(pL&jOWLg9l%$^&EKA}S)VMoFC;d^ukx8!uI_}uID3DQjhT$297a+VK z;ROmWSa<=$3mRVF@Pda|Afh66jqpUmZDRh6R*WllzXgEBhaUr&{Y|x3rs*tZWA|q# zNl8h#h{(W2Kny|hNwSf1uhEbKWq2fP=iREM3|*ihgQsZ7`KvW#_zDdfQmr9{*J{Wx z_9VLmgDQw%aN}&G=hvv4(|Lv`?JM>KENe~Y&4DF$4mHy`Ny;)hhneXU5vQp0JTtu- zaTdxs+)Q7JICFNMZ>Dp?lofPdV5V2?^YW-3RMEVhRG zB%~ym?vVg4)6E&-_&E1GfW$cW?Zlk!hln}d&srEh+7tVZn9JP*B}{a=X&vBny4jzgp%G`ezD*~~IISeT}>kRXdSG?I_t z|11Po&+ZNAgeK!oSI_LXDUr?Rw7Bde_;+M;>l0`8Y50%Nrnyc+_E`KUW>3YxE1R2T zbjiL2|4G@a@t>Ui82;Va{Px>5`z`#ZWPgVL)a)Pe@5xR_J|3e7&v+k%M4y?;F6F)$ zNSv9u5@opq(NwOr?AD5y+0%%%E-==LxX9fyxS0hP>&0tp&DVAs&%c%dUD8D}-H6^0qItp+xO8k13& zQ~@792thI>UomhrAC$MD)?xML^F4+r@|2+Z)MO*gd%e?xk zfs=|OxCT&vC3oOd#2I(85B%@izyD{~{*^DpE~j(O8Cy5Ksj6w=Iiu*de|}@r?B;Vy zV4yz=&gbDe3X{HhGwhUeM%Pwh8BsHa`Dk;)$Jtp!%_iGR`0%YGe4CAOwV|xVP%>%+ z)(0StOTT2)_?9`-Yq=;87_MH`bsaAmW|Hen$9R`FZf?3`aNI9UbDX0xuE>nb$%-rW z#0}4m8`9O$C9cqn8{ml>k`kBKGj4F2uLe> zBBW)xTH;_!YOURWM_mdn?hgU^fQY4X?(Tp^66d4S%MyPBkjvJ|!-Cp}Wqesqa18=B z-rz$QHJe7ctr$^TFQT?+4kDa8(>Cki9dwye6X0SYrXhfffaP%*Et?jxKz&glh1e>8 z4&s9daWG~ed>+ARq%B^26Jwl&WeOpmYm=EG2VOg@<546s6Nnu;02QX8U<2#2s zY%$}%XF*?#zIo!CeTafw{liCJFZP%ivCvoBJPb3)C6lmEAl45>thj@S)mcY1HmUx8 zoTY)bE<-KalZ+K&N!!Z^&TDr(d;wqOGct4LPd znBLe}AE*!aAF&Y2FDbVpu{ENKdU9a95`2=V3slqEwIs0ka(uaUHo5M`it)tb+;aG0 z)R=9LPTa=3Fp`u%B$76;Ad)s@P$+E_s~*m%h~b><8lkf4+=r4-xKIMyK9UkiRau5I zj#MWhlvXloOhZlWf>2`M9E6ffE{dXbT$Lp(iUNba62(R`h*n$xW=n>KQ!pJOmG`4U$@o<`*b+k0q19Zh!ry9mv1;4@3@!Cj)as;lKy9wcT z1g=ke3gK0R0|;Lt(AiuTLLR~hgsBLP2t4#59Q%_D;XWl(=M^^f%P&v{khqT;RnWoj zTs-*Aj0eA2g&dgc<9tlv{crtuJ1)L<%|(BB>Wh9y z|M2SDAC-YV4Ph?A5`-C0LjD{C9v>qR{|6Bqe0!s=7ZLW6fa75VUB)gG`50oAso>h) zN2~Ar^uj{$j7Cs1KY(`LUMP*Gmoy&XdRad^Z>C{JIIwO4&o|JOfaikH{YEH*Ckyq$ z!LJ(p@W9U${0IlTS=DB2ZtqD4S90wT*8)9${kuQBd+16J*9>{DI{$mFIeOuS!9NVW zXYNT{Pc-V`f4uc%<@7;s9+-UAy&qkh$~q2Mygd2PIr~$53ESd5?s;3dj)?1%xW>rd zlZ5phh%gF)e!%Jx79ntI;$Z~Z$iIQ`DZ*idWHjz62>A#j5iUo#27wtS zkc5l#FeGtyN=TfdBZ-qmBFGsPk~nW7Bu@X3#K|Ek7pHbe;yjP&3a%W=L;{akYlhZi z9Sk38H3lhL|FJ^H+)aDCM#n5vJ8cDUD8Bx}*8}v`8a*EP z^BVp=*3Rg1-=N)5<@f`j>vEVIZ{MQHy&5J*8-L0@5hnKt@J*WB{b6!zL~co#Tr==p zn%t}~x#=RuHA8wiF95zWKfo4uttN+SDn#x}Tmh`#e$e&v@D%X%njEHeL*yP4xiw*O3x$4_z)O&R zo2I8!=tDtYuF)}ehv@gBqAVA#!*<%?;854azYu{6=hp&15-6j9THC<%T|yr$P<=-M zo%bfDuSa_k7UGX^kifG9o+uvJ%KL^+#ztQ zz%2qF7szi&)O(M>y9F*2*ecK`kk26GuM=1+aH_y71(pk(Adt@vlp85@Di;s61NA=*tnm_k*0Fe$9o*x=bEq&`@y70^R@@{dJ-+{nz)A8A8` z_G@3Q;izx>5)Cf`?$dD8w_QD4L7w(QsCWAzNhi*=41HKQq|>ek-%#5<8qT#0KhmIG z(qW6;{&x+>r;heNYB<+2?9y<24Q>CmhT|l)KcL}9Q69gB9|pca!@mVytKo-$Pt@>( zz%SJB4&ePY{1f0kH2eVYV?BfQ*$>=aOT+r_1O6v1{T<-1X!u^>ztQkLz}IW|Zs4>q z!J*o77x3#ed^_-&8vZ=+NgD12PGKAyrr|s|5#h7$cm#eU=W!iE3OdI@j8j`AP9rCd zNhzSwE-DXk+fJThBC2em?0AvJ6R{VJyu*eXqTBOKmGA z=#IPZFCw(LC>CL8rPu%W*>AI33%a}dobQO z09aI*U`#@JjAs&z`BHE0zsUOY$(Z$hUCQ$*vS59BB7ed|c6p^<`viV1^~=S;$a+o_ z_)BEN`g(COustfJem4rdSKuV6Z@bj@6qK9wJtFnxWyX4z3apg+W})1y=Ur0IX9XS< zm;rg#f2hDK1@@KpC>OXwU>xef_L(p3^R~3h1SvoLs<2JbcuXuS`*|ifFAK*2}^Q8~r>-G+UUGXmyFM zX-w3!5UwstRb#4a^hG-xTGtEgDR{!&`UE62{rG%ThsB=0*y^>D7@Ie5Zs?_UVnTuM zK~c~D@r$O_1KkU*fGyvOWsNYfurK;xNg`SD8Z@cs=O|K0__VwyOmD7jnpfLo-@k+- zm~%LTy}Y(Y*B(9paM8%zgRWr1htxnyUhRVFTIK$>IihSjQ*^Jjov95-bf&m2;G(uu zF3Xv2?A)4__uQymB~XdT=83XiIqZUs!l9kqGI)g@v2bGTjPhDK@r`J|u=G6nRI0WH z4a+EuHL|Q@ZReojjbJC_&8Vxl_Z$98tDMi_B% ziLAC&OTZ_>TPr@qW7NPG`T14!a2#D{Y(}ktPh{kY!h>rlaG#Hrdw?PAK|sqr_UiGl zlNXyYsLj4uV?VJ)a^zLl!axGHU18@f3TJH$x6;R##0cNW(`4roTDQooq%gsnl~pzQ z>hQD}exU_AVFUxtkKIe6o}LJS$UK`GeT~(Pon;!qA&N&`Obd1Gj?WX6s=aD?%Gw~wIIq6i@|Nk<^p~wj>amkn8O_D;;yfQ#Jrm|u zUE5L%!@`zopT&cjuHxqA#_Bo<*H9}mSNSLn(Ne8ew3Ej)SE=Y2bfyJj4%EI-DIxeV)r>lP@Hs3|3u-J~$gg+17)s=E4?CXTQ0-rZ?^ zqor!~MY3IA)`^BGu$H+L5BF-j1G`%VFHh|(YvU9O!jU^#FVeX3BKOrkp2VCgxZW;q zz^fK-0+LPWn9^y9w1R8i6T(XyOtLSM7`K@qqXEAQvOlsl+ju;`3xf)V77kFX^t%we zmZCae!1TzQNB;2>rh80G!Kpc6!U34aF}w&kXos;I46%;G)2);;%HXhZiZEarS{*0k zlL4GJa}Em!^l$jw6W)HdzRNIo$ivo`eVp>u$MEfN(V3Q>VVM?ObB+bQ(AREN zIBNMYN1+(Q%Xjm6mV7hj8hN}`VnOXcs=io0AHE$WlG6AiCs=qa|br|}FSd@@|+wTMK;n93pc=+KN2dA8QOuNd0_J54}#`I@#vgoru zB^t(@6Vq4Cc_`)?Uf)8|H%$t%9Qs)Gjms?iI=h@UwCfwo&&68w4<0fs8y#0$`a0SI z<4f52Q2jZk&x`e8`VK)~*b%0$bN?3`Mc*E|J`Rh%Lnz-AOL534Ii4>J-<6gSzBj95 z*K`Z+z0K-3z@qAlnjM1mlyJ|CYN!4p1StrvZ_OMgBj`VOId!!4a* z`a1V@F`&{C+AaDP<3eY2@9oyNUJQ$~ERLXZ-U5qO!QU|8fM3AQ5Z_5Se3n@(#`S;< zJP2i|R``kjRg7-?wD|Jk%Ze+CCzY3t_78po1J`J7Pz-y_x5u>Y0%C6I#VyBjkmoz zw(V<_Q8Gr+k&9J^*28g4lZ#Wg4ayn4;(V6sSvI|uwsd>T`9dAr_L-ugmic3* zb@08HSKj)W zcCl^F&JSpu9cA$MZ`nI~O=ip9BeO2zhjt(Ei}jYhC2J>ZP}t^lm`iOD74@Jvc-~NE}6I=G4y=HRD-qNf~yBjtk>!S0G2c{`F z1q-Rt+ydUN0#e__uD(Htfmw>%Kj3W6mc8d>t>dg#B)R8A=CF@>7v2v)>e#L8jd#t$ zoZf=xY^9gBJjej2`EW>H5RxjFnYKQ`!?TVO$n+35(?rBj@fB`x;kT}Slh;?)U)K6N zDBNQderlp7xynmhA2pSNMtPrU6ot=+2pwVkUm2mdnD=8J{L}2(No$6+?1hbw$J{FU zstl#uIAdE#l{7(H+l+0<^$;leXi>}FimXd-L`}EsEzerl=B9htO}8Z^-B?qK8C#I> zGsJ%I9+JR+g^|2sId(lnILj^aZbW9?Z6e)5&N79Zl(i0n=1hGG1j;www8EzL8p7{c zt!;(ljrLA#2p@d@PZ)gIJ7>+1mc7%Pn-O`4iJY-1B;PAdvKgBYTZPz<(Ddf7S=F+4 zZq~YAv%F8No5!O_Z(HH3rGSlBFeF4pxlv(4Au|+O+@fEDL@j$Oo0lMTt4TTI=OM{@ zy9Is*F)%Um^A9qhwWa-}M?VJpnJbK*$aDrg*A9hn+YENAn-Tdz zx+#8PvnzOSh~VcuZf!H}h2&Y3yxNsK$(7t5BDuqr+z!bZlx%P%`?!)gLA=a=W+V#_ zM+}UXJo>>#G?s;%u7rF74#XqCBZc&z65?MQ;%6MUTNL&JFucER`M5`E>$jz?b9SOk zt8uH2s|A}=$-b8numS<-3_!|Se-A#01#Nwkk+$=0`7R;rq8E_@(VfkHzCyl3ujW-#-w3@ z@~ji~lx>{xU1{5SP+EAWtF5fH9haomHxY6RwQkIP2f3lEnbP`RS?lYi=+I4ZDXp{!oJwjTat-Hz!?+Q10GWShaVI()) z_PVO1tcP%>jfQzATuRpQ9szRKAe)bHg*kgoPRri$Yx?4v(tH-eH!?f}eR^{}*dkLH zw2IF^TF$kJ85hRFd@6fbr)^K9d7hbv zoVM38&Ceit7$k9VP2rK+n43p1mw8^|_YFWQmbo6%A1p;1f`2LfHLm}+^v`hpb@Z3H z{?+u4bN%PhU*P(u(?7uV8$CT;ztP{x_2*K?=lTcJ|2MQ_i z8;|XAA^kf;{I7@j8OLq6@JrxB(DN;}JotxTE5b$|x=jiRs|fL1nb`_k3^Z+JW@Ty1 z$JwQ=JiCsa$hw`eyR`KYd$V!g?$UMpvM##9t={V=p+_?JWU%Zr4=r~$&Yjz^k4XGq zh{L6m2cl%(O9)tp05^8c4+N+`w-A+ zzG+KI=SU4xyGbi`duZyzoHC_t>7}hx_GF#Xo;7%K2ezHq=--ZQE4EG8)@BV}$15sI z`&9|EyuvVBjaheZBwzdBnfP~_d$xS-JF6>-@fvGmW73y|tVxf2)El)~&6;Q{oMjG0 z?$?MaXtxI=z4X{Adz#biHD}IayII@zFkbL6?(b3KJ9QMw+A>k{-EPVES85cVS7hWm zhJ|;#3SFjIbG+2-KzXnmlDp5;Ywl@o>7Hj!$4=SZoPmltplXhoZdPtQt{K+Dvt70^l??ZjY>qdJs(5GDPbz`km2s%ZY0cl zc*@^Vj5o{?%zY@nj-1#!ZlsQTjEURF?VQu9f`4ZTprZX>gq^~ujAq4V%A3mbnw23 z6*9?H@)sQK?Y@`?_v|nwUK2})k}tA;Fqw^PAIrKicWVqK=r;zrO?7yfo(_9(9zy|M zTiO9FzlE09#^Mn$_bez{W7tfxOeI3+fPo3*=$K#!sGrYz!!en6@%OF?J;9zM2wlsJm59!vzItT8`@zAYX zDxCAYE?{@fP0(G2Y`lhj*L}4P%l)P~tDl(s!qA~ZQKE6bHhWii3+roR?o()Z?7m;& z{fg-mI+`ZQGecUlM2N`amTw^tyNaI(|gJ5 z{IAWnZ+hHUK|#Z77ozm8;Wc=igj-0v`)(sJfNqNmj&CNOE1blpWGtwMmn0@W@vIcb zsm%iGhdBSaV7{KOAogz1q&`Y{vC#iR#vjs@TBBWW*uwLV#;}usdvDJq>S@Pig3aQm7F>Lm4*+=o{Fb!KuU>oalluJhBvY5Kd2z3Nxc zmV__YjKhR;<03>Mk${?^LiVkTy2>A5`H|IxOt1@J?bP` zIUa$a{!4hQ6E}Z)zMGv#o#YjWa0AD7M;Q_}PYP#F(wowhjN?M*#y1>hO1w!W@F>1o zlN`Tu4a#q>Fty#G5_r@}-U=aCXX$lD1}61POYo?ZbgFdGh!&kIuyBAW!_Ot}Q74HX z($f7dOunkj=>L`EJ?bQJb~@cqp{xJ=Ax8gN$$QjEvT~<|$*&q=Q&C&|j$lg};Bgc8UnY@QI#Q0$Bgu%F}6$~*lKp3D(!?^*rv|5H$!gL67v z3t#pi1o;wpBKmIf(WZ{CRA=`^Xv1{AnKa25Jj;)QQ1C3L(Ru%BB=P-%oliP^{+0mf zHl7+Yc4v0kZW|FDBM zQ|>h^hylb!>kYm&Z*=r{Kp9WETspfjOAIwjwGsupGNuvhSQ z6ug^PaNmqzvAaRWE%tjX_GnPI1@30AlCW9L*D@#J2h8XbHzS+DS?Sy_gwGs|rWUNB z3!yET)lFVjpD-&Q5~Ur>8v1mdIaSb`C(uHH?^{>9)tZxGwO<^j{X{4TYF`TG?#Q>) zeuJm|pRV?f^PTR`P`lsfs<&!qdg|W`Q~z<8`YcHGFo)OgqyFLGJy)~z$v(GlZHk~y zcN(elWhgtF%}>1SW}vYI>*^eY2lwV@UUnHKyGOk2GJU+9By3i89(B4GGrO+J&Svw5 zm)+xG*`?tnY%sf{!Q8#;YO<>U?|C2huA9&8msUnlr~6sVu9vd2+4Mm|I^WC@NFCg} zpM+({?{(bldYSCr^s+n5$8JAiv$FH3)BSE{*I(J$Z0fx1t`Ey@5IV5n-tn^^H@p5O zyJg@#zvJEw^zo{cuz5uUb-Lp#EC&`*-KJu*x!KE(UoHjrj^7CdvwPLcZivb5pI&xD zeeBP?>^$mpKN20YZ=|xb*?i(B)h<5A{dcJ*NH-i0oe7puRyKw4s zuVr>)m7UF|0OfR#-KSyMy%?6=UN5_`Cc8tCg{%KKA8#AH>^$mpr@0E>BxPr_S?Ogr zmuH&SJJmu-aPKY#bN6nN$?g_rw~2dqypLCKW*1JK?tf-><;u=xbHA6}AH%ZyA}qUZ zoo#mICcDw#J?~<6Q+>Pv;CUBLo$k3froJj=XS4C6n%v49%M;t%y9=Q(xOX>s*;SeB zb}+j?GrO5S-r^=~o)>H5Y&L^Yw{CTvfkq#! zuGE~+@(%%X%U^G@n-A{lKf||~#}Q8iJ&(iT^)2yTWBBeU?sWf_1!z(MY{qt4mv83B zVFmbQSOK2#3eaQ<@EHqG#|&5c+{cu~5!C5477edUAuhm0DQO{hL%h@CeO5}h&RxHT z|2FJ?N>5+cbX{}vWg1#)X_ldt zq)eM_=qt$X64K73PNzS!g!l~BDNaraDPb!@c)ymM-r1$dB>F8&DZro z8{XZQ%jK+D!sJvhm+7QwZZ4DHKZG~wfqNmC>^rmy)Jl1ntFYP)8#8f1X3r3RDiu21S$#sz^MQfY!M-$(-frcawGhKw9Js)eufZMaT+Wi zbUG68vi1v6aCJ=XMZ?oW0+4SN$Jqm1-HY= z>Ao4@DV~vDH1|Nzns90otoXWSiss> z8J^A^El#WD$*sLfDl;aPd#VVeNOp*8$@oy#HST=4554?PT;NeU%Z$0Wx^3%6LSJx z0?p4Sp4pU`4I9mg4S~-SJ8w!{8aVNb2NKioOFZkohaR~5;rm@o%t_el^QFBS825*S zlAMJ6+=QcYew6krTn~Pg7I;6QU)R8rGhYrImoPBry|jeBxd{Wi1~w-Q&Ixo)yF9Qc zpTedNRBY~vCzdDr@F@(|=QCksPt~)%D8P;oGIm6b;v$*Eb*%!nJ`clo@zIR2?PjKSU*%zS*szQfN zXWvUA$i8~4!u6XDLH4bpefx(XH!k>Z%lTUcp&mb!_tRidlFFGSgcNKl8J8anvM=Um z1cU4=`5S^kcAx(q46^Uj2W#Jd<&9v_XYzLP4o{VR`CAwavPW!w zFz6zA+k!#%E%05zAp4^C&0vsQn&7`Z)W1@Y&zWw$!6rG^9v;5GqVqX(Z7m0z_parCCYp~-I2(tTZhZPWHTZ0`rK#;8w+XN64+*{XY zU!Tv$Z7m(TO6zU&f-0@IJ01||5}cJ4W8^q5lb1i^os;UZ6a)mC}=%teRR z&gTufuAcHLt8_^)Xtlid6*&^R$%6l9O40eA?uuZf>$^ZvUw9&Ot#^c%*KF&x#Xu{I zRK!OXwGR(Pbf*c?f3B6+8wQB(QmyW*JVjNH$@_dT z=tX%y3I=^5Z?FVawgdyb5>y=_Z&5I4jJ$mIqr(BPMV=oFvPHi*7_>p&%Ys2$sYi?abC+@X$v!z5At;FA3;k+!)xAo|n85 zM%@%yk>7bDRd&GUyT96JJbo+lDjVOC_JClXa0D^l%=Ot;=9FQ~$L*Lp!w#jzt~?Vd0%1Eb~OBTW^aORAIfFyr8J!*b%y&o=8-2tjKRYk*MNWkvlw*>DK#%7gS-r zFL*&w#jzuJUF{fGblb5a|Mav(6~~Gg>xpjLvEFn~afS8v@PeX>V@LRAc_LA@V?|0l zk*MNWkujdgbnBhw1yxwD9p;O1akEj^c&Va_V?}=Gi9{90imdTOrd#jjUQmVg+F`&L z#j#O;@lr(<$BI1Ti9{90iagceNK3)ky8g(*wU@#s<2*;Dbd9^GB%GNcp_0Hv?9lOB2g7)MUL@A zrdw~h7gS-r^Sz*`3j0qjjTXH>*_oGI89+I2( z2m7(#lk+=8=(|tjq7T)3?EB} zK6!bA+vR(VOZHWpB2je{mZ+_9s<{rQ8FO{2VXDRGfsHOi8;#hNMsFENcil`4!9sj# zty#s>O^g5(IpFKe=USqu z4?~tVH`QQaOS8Tx>&T@h%AS`dAGY~C^A{HE5!2CWl}yK+S8hQ}64t*f5c6sndgL3u z+NYJeMrQ#Q1Lnaq!_!V}@Dds0zgSukY;1IU=~0qca`CPqZk2|sh2UW&L~cGya*@j7U?g}J%0TycA2cfUi{ZjIajI`Mm0Cw?Dlqbgu^%yty9D$mBb zMIP=x8#tqd6NGl`UDN|RWN63X?4X++akFD-b|B45D32XXv}12}V9*YCM#|ffMmywY z+!=MU)w*(rJ_GVISc){R-Xya5In$8fz>^sweee@u;g z(>})S2Wc=eV$I}`HBND&g{}ZxDK#-$KfMA}Ub zyIQ!{5!Nj(V48GAO#`i*PFU^s&0~yG^|IcvguSo2Wwo$OYK|o?Rpvm( zI(uA6t1EtI9_LBKtZE%gZ*#~oixrO^I##evcCh`mO?S|pv`xt49;-l0_R}?orj3_A zerFuF17?=-d)@!jy{v6yv34GL!D``z)p(DA<^->8C-sdmg1lUQG|66L{NavinPVsnWV$CwFp@7#<%W9X@<=I{= zk5fMLju_B*#8799Gs&@+sbF{>Q#CfPpxI-f6b~pK(B~EeQ z0mXftvGC@FwAbUDQzutCQ>Qsc3|Mf4GoaQPu(%#uvol}`{7Zmmf}aUo=nN=d=nNWA zJlGkq!s$Dpv9D8XPbCxjZyXGM?HlU)gcA58uc<|zRAhS1wTc^mp!8lsc_Q^| zI+74wPQw zcj4>CPcZAo7dgelM`Hc>qB9FdImHU_*xu>qd?ilF;dBzBU8z&bV+j38AhhjSnTOPIn z*al-e8rw-{r5*X`)eAOWy?18)trs+Gd#%e|6R!FD1BdQ={<>Xxd9_`4UeSAZ@0z)J zM?T>kGGu7diYKaeUD>%j=k1B#oKy7b`o5Q*KKzQAFQQPCn7k{#I#)T*U>5k1mc+gPUyZ@>5oE{^dyYiFvvY&nO z`8odM=G5JE^}I#TwbAOpKd^DV#$MR4WTP_{TRFDb*p^^B7uyDGS7W;s+XL91#`Ze4 zkFos&TLvn$7q%hT#$qeSHXGX#Z0BOzfbD8*w_8Xd4xrwz(dEdf1-GS<}U`& z_!w{XFGV={O(+N5&sCl=nse1p@+YWMHXj~C?qrW`}0?EtN%hB z4_iORIs?+zs(#Hk`QYcPKFw$4;I{m8&@Pz&AZ&CWVhb%#yYjQ;c~|xQuG&vOv?s+^|CYGD$0{4eyX1iqFGC#I?mXl>+duJW;xUg-o zet1mSE_tkNdzkPa%E#6N>yl2*$EyeS(N>029N0H^r63$mF~}tYlhD_@CkDfKN}>1; zcGrY*(hAdd!Djn>>acx&FZl1Dx;JC;Hx0*qaOUb8_6+VatSR}SqzBI}{5J2^X21Kd@-u?RTrK+xcB<>TgJUt^!17#pP#>W zefn+Zy!h>&VXtTM*ri<6J}f(9<(>1Uy!2S!Y2&`muDJWEtKK>@YeC)>=WhMQQ(sqM z#}{Ec8{0-~Te1BH+wZZxf{pERAGR)NBwT~J2-`{6=3+Y&+eO%}#C8id+IZcG?Hz1? z$HvcOdSM%eZ34C#*cM|u2OI6+;AiaPbOXY1-Zz8z5iu`|aI}xZAbvb7DSj@^Abu#V zAWnZ~5RI28XoC{cC`Ern!SNGnO7W{|1@Vh!2GKBwf@r*lK{V~7LeM}FgZSyX)bn#^ z2GM|s67rL22GN9xg81DzgZL4;bkTGWgZM3ug8l-^pxdxXJwFp?P;GFB__a5K`02M2 z(p(aQeu#4An3LGy2NVpV*%lRoA8#{=1}qfxCMbjM#ik&h)(qko{Zh|Qv>C+jwH3q( z{|ut-4JG8K7Wj=T$;|#?!o*I=C$^+)NZy$AUw(Hq zfb!+ow!7l{PRBtp&dOIr%byE@wUQsplF?cDDdF-g@U7S?B)=t6{`eMC7RtSVZII;X zH_qxkp~cTN5GeN#Mo8{hBZNOICr&xqp4tT)w{$$t##y=27HD(zl|yd3_(Y zzU6z!ZGha0?;&?5t-1`rAf6F5EO%5K9A&}cCxf3JhCI*i$ zmPmKDNp64jcP`}CO76-?edWRSd?Vy$Np4o8oZ9meocic*a_fM&dgh)6JP(gMCj)US zkjvh+&2h%DyJ0-L>Gg>B0h#U_bP5dr0!aD40RIc|4+5F)ZpE|LX$5B|!gS{<{7fLz z)c`5aHO{GzYo1eXr1$_KO*K$1S3DEQ^nZge%=`llV`7 zl;axhl)F&ji-7p$&J(W!Qf?BEa^n=<7l>c(q2k#<$}x~~UxTEB{~1WRm&Kn3;+IQX zRg}9+;XegZ?lST9K>Tu7;g51>Dtso8a?`{o0rATni9gC6t?({D%B71_2*2Dt8Lr$1 zK$h$`dft80x9<+Amz?d`02tqia$m16BK@|_)uX#Aj^>@o&<#6 zao?r7dcOiPem9W$y{+(P#2*pQ5vB;g#ig6&`c(Li@MYms!iR;w5&lAWmGDv_O)*m6 zxj>d<36S+sC!DKzT9u>RNMRr0-*A(_@b`t!3hx2_5Xb2k;y(jI|F|o~&vf~e#p0F1 zi9+6nu^fHHvxWb}eG0?>E_@ou{2vwG4`jXGqWBvW{v#m!w~NGSIg9B|2eMoX#Q%o- z5QhI1NIkEKKP!A(;lCEYN%&KRUo3u(@Jxlz6|WFZQh0&*AYm_s!~Tsa$0vUGxO4!y z->(2!zGs2B9~wu~n=I$O3jekE&%{>>mn)p_U6}rOVUfc7it_=A@qfcLgnHiwlJlJo zs;Kwx#2-@pP2v{`&r|p!@zaDA3LhulSJ*@0N#bwd8qECuB>V%=?4S6p!fS+^g%=3V z22y^J_-VoufmkEz=mK#*PcfeiVG@w(KF2)|!?`jJ4ngk+#P0$!{#x-GU>nYt>Eg!& z*Fpbr3g-g?kJk{z_XYBJagieGfi)&)1LSG+8CBk!_m-D{e-1=d^zHy|1b-3uL*Va# zEY|}-WYK#pkm(DB{e?Y%)W>(CjOXUo31Rr%#Iqe!4!5HQf3ETz-qq#Zg&9J>@M}CMGaXIr5nmG01Rwctgf!4czDc-V zc%HCXc)E}_11W!kaJ+D&kTwPx-&sftgyet4iz(uJ!qO-K`yO3NIIK5c0W)^7TS~ct%d+tHh&( z{e(S)*}^0tt-n(KZ6U40l0Ph@?O5`wh5Uk$oX%td=PYP-InDRdt(lRnRpKpk?n@pT1oF$whoGj!=@RXzBW@2|CpKr*& z)OC(#pUM9u&tJUPR8Av=r*h|<|m@1^1 zY|6c->#MO23;w(~#|ap(v6SR{#cvbR>Nevq5nd=97ee*!U;m! zg<<$G;Ss`K!mh$pA&s6;{_nca`K$09;cG&BpTzk*lz&jDH~Pu9h+i+{^Bv_b719I? zxmkV$Xz#P?6+TxuQ+Se)&w)%=B+M5M5cU?*mM!Jdg!^*+o+_L!JYIO5aD4L zT%o;>PZ0k`_q(48-xu;7Hq*Z#d{X#`@NVJl!W)EF2{jgPR9NO-sKD&b|qi-q>N zr&gTL^-MoqSSCD9I7)bwu%8g!yh#TzxLepE+$G#8a@ z9PgU}+ytxwt_M~E*8)!lt^%SiGgkmn*38AgX~22FslZvlDZmO~Ij|IX60jI}BCrUE zW008-#6D&Y0-gZO10E0T0h|oX22KJ7fD?fZZ~|~I_OArE2UrZ;4IB^b0Ag%0a~E(7 za3`<`xC4k|oY@Y&c1z!AW0z~R8HzyjbFU_NjYa2Rksa42vs@Mz#F;1J*n zAlgjkV&IX$dBDNIS-?TS3g8jIQs6*fF>nB|2-qKpJRG#OOvpNYfqB3_z#c&OGqZt* z0RzC^Kmf;yjeH9*5Bvfk<<|l!e<6_a7Xbmz`9QuuJQG+9#5t0g4_pCcKS`bqTn^;R zGx9wNjT-2^TF4OuK?D7&l9fz&I2zN&j-!{&lArEo(k@W z??Jtt0^R{M`2%Nyw~KEFqVF*6h4Guf@ovSm4|3G4GZr`xNL~TN_k!m5ljnmU1I$x= zHt=w8fRSfCtpewq74&79tgi;(AmE`u)>|{M2ax9}>+cX?K;f)Mp0|6kKbV`Dxd%x3 z-9Vnl9YD01%v}oK3FLXb1K1tduJC(-JkPfSy8*W;d@B(9WcrC*;3kEy2TlWD3&blU z(@!wp72s2Wi-9@7c|eBG0!{%|0J{K76 zfb6F>0n>o%6}}cY349eW6}Up-i-8lt=K%x2SqiTJmVlQ6Q-H-lyt6a?#7ba3I1Z^f z?^(_~@MXXrKsa;WHvys3X#_HGHE=iT0mq?A=zmvS=8T{w?A{|K;LB|0Z#ve}lNtzg}GEzerr@Un?&3pDQl(uM!vfo5Y3w72-nw5^i3|Nb#D)H@;zED6xX_;=F7yY)g?_)d(C>%~ z{r^Dya{q+>z2ZXum*PVI9&w@nV{xH>x46*%uDHWiGn z>(F*_BCZwYeueRC!Fk=OP&^SuHrE-(=Yhjza#m|5HtU`zM?vnL>V~|k_$?CP+&0GF zr}$pt4~q8}e_Q-$@pr{Xkwd37!p-Mr@{3Sdx*Nr<&0Rjfn|SOzT^Afza%*3d4(=~?`61%n z#0$uA{MvOqMk{`(;w!|*igP{+^-ULFD}K887V*{M+r=*t=X+A7|EYL~`0e6*#UB#S z4!H6!i4PM0M7&r$88?A+v&0V*Um-q5e7*Qd;#%RK|2@@zz2e&ye}Uptrn&ofiQ=DB{Pp7RiF5Tx>PwaU zW8zujv`WqR&f**|;QoG8=IZBn5ai#8b6ysC;6yjRw|IZ?Lh<3^Q^d=~>%?ot&l5ja z{0i}_#W{Y${C*?;JMrhl-w^*u{BPnJcxa%@WG9KR{^A_xA)h2(EIv>CRPl?%8^nJm z&UtlAe~t}WvEqLf zFBab`K2bb@7deETAf6$9l6W`qY2ta}mEyEx%=D*-b6zL;Y2wF;&lN8fpD%tgIqK_* za<_gtp33x#6i+k8t|o`RUrQh7tMXy3x8k1?A0Ym&BNCHWEvPeQM2)sGnJG2K;~;!OT@!7-l`N|*Spws9w1P?>ADbBJ5D^??~2`5gho>*Q|Sy|m53PVa!T|M#m ziOZKk*|H`#A7kG1Egt>nMS3I6CAVw zyMKeIv5gnbamuTQHp1T5evPT_$AXMiP$)&Cgasqy8CkG@-7!tg9Kg7%HB1u2g3bX_ z#x=KefOK(;F&!XP98-G-NM(&2#j(J5fYhd(~b%0uqYu4%j>Eao^IzY1hn#4LlTJ$IXH<*Pjcl+llldDRrXO^5?J+)-YMEr=a#`@myjM;FBoF367)J~B>t9Q6gGW6KYZQ`+GyZj7B9&b~cXc$|EP$H{j@ zoP0;b$#+DYd`HB|cSM|gM-Go&{*iI&b0n`}G4^+49Q}oH_Ny??eig>quR`t@FUEy& zG8)B!eiL9jE8k%JaH=Fm^hViOq@nr6sOS^#i{(FIQbUE$+sv@ zzN6#hJ33CjqvPZ|I!?Z$W5RkD-uuNhVK>Z6VNP2U=AEbo=1g_NygWvEDMrOP(F>08 z3VDo|r8y&ws^B^3KEUkn!W84YtU9$K#&yhu78J$l%L-zg$4W86S>pDV{i`RIR82l% z+R3L@mrbp#Dw#TQay2iL(z^jFX#$J4$nVkMA4{`!}IbA^G6^e-$deU9W`=fUS84YA~zs!URsn5 z^`k;dHFP=kKl{xm-{BRj53jw=b2Bj??=+n}Y;YJuiLwo7BJ{T&?guMtRZaA{uDZHv@~kS$f>^4DcdKs~3V?AKys&oG2BoO4wr+m&qU!o(3(bC1 zS5G>n1!k8c_4UTML8x0QeIa2n^(}!V zeaghscZ5<|eLD_NKAI$srEd}&102Vb==hxn-A?Gkd?&h?2+L}g;+086d$#(1BOQ_Y!U_kOYWKYp z%zZZ0Eo?N$qok@NSb)W9Z>0*l7lV;(lI<7-Wz)vt$6LdotFB&vs)Ko51x1!`yY%(3 zNz6%RNyN?~82T25D#Y;!D_@876-z}v^s$Ktdby}z5469=*e~}uQXk**(&;ceE1-}2 zI|%yJgd+CW91o+92PATT2T7kjEmj?Hf4$>N+ptl`m*3UUv45mn_xzX@pfAEj91mClUs6}iV}a((@`d%!9n!Z$O7f*|OK^X~PLb+rS09fGlSJy~0bxE-4f_pqo+J`j?WKm8GrUmbMk1f|k3_oEW98PwZye(sk`kMOk+{ zEql*t&WFS}NR+n~nyA({OZL5lFs@-*x-s`hgw`h*w(hyCE80IwC}=;eWbT~DOctk< z%q*EvQdL=Dax!K&kn}t3PI=qWR9CX^#j@7lBkVbZl~VVMrLB*EzfHa|w-V|L+RIzN zVnkcv3qdIqaZ>rlar{DUa>2Vuif9h&mAAg_Dly3rxWxp1!<_a#?#gXM5c%lG8-8Ej zx~H_|@xW;%vrFcb%q^*QOO6t^6|Q7%Z8%h@pXb4sk+(ik+Pcf6n6t0r5*#qMK?F>T z$>wZl<1WTOzb1BF!mmhs_%0+Uj1y&z^UXX7n79`acVaW~i8GOQC^p|H#QB%fcgPKh zS_7KYNP5%+{5#1T@%II`gz+h#5PS)H0lr~AD)QMp_#rZ#Z{|Jt59W0}nU~itu%zp$ zyr2pHfxE!z(v{l(Amc{RIzS&2l*)mlG>#?(l1|J{=k%zAevU7L_jQy?!a!6St(^rD z3$r`%D+7LckT?oL2~H-h3yj8=dJ_J!hT_kcJRAQt*!-PRrU6m{3C#>I@^R;Vb~o&O zqi^O95ggo|S!CYsoCD^hZo_}}ZTL(1IsTG;slNrJ{Str0$tfXa{wG3M=Hx72Mi%zd z_`CQr4uzkYCwKE@46)(eeVxX`e+ahZRP0S+r&4$+nw&=Jbne2q9Nw5EIbBZ%_>(e^ z0n}ql<#!}m=A-oFDe&@h^^{Jz7Xq?V(mJgMGWV2pR%Rz#nJF0w{Q^EGmC@a9!(Sk& zz?YrQLqIuHPiNnN%$%ge%BdCk7IIT7Z zHI?KfW|rlQ%t%0AggJYzR9OybQjl`jow6J^7NzPB!Q;}?aWVwbk!2TTk(vbo)M^fL zN>68A@2x?6dM^YQr45HSW9>ygXZIRp$Jmb;+o_Yup4^qmbhAO#iagc6aIbhn+hJ*v~8jvuZe4U44YK9vTn)p6?F~6DwfnVapjf9Vf7V@vC>Cn{nBOxEpHgQ zLNOu2m6J}2k}DcoFtoAujA6}<4a4e}Em+cATQ|&He*ZfPQMtOYscz}8^7{D=H4UqW z9p8ZainEqCoY6S!cq}~8G> zk0EU0$ym{02lQ67vpghnotvulfGz!~XFpa=CtOaYmv%R27`J%u+2w_cBd-F2FOI2kR z*zP;V%Bi?BFzyI1mAyewfcX-`_|2^>d?=yy+8*7<&kn+!&GSM9Bkw2VeJvPd71$m* zMhWfJ<7=f#z_X9_+vGle?iB8<#&N3Q7;EfW5nfQ}Vr0%Uur9B>eCCwAm1tsk!IL*? zXnx)xJbEl!bo8kF{Gs_n3r7vk8#EtF@YLoZ+Q^O=TG+U9* zh3uyNi)*MJICE&8$O1IZF>44#pP$ho;dSA}uM4ghwlH+*JG1=J0Tw-6YWg0xGWWmU zp;=#$9Z|Ji@x$Q)hVJ8pd1-;Q(cFHY(?d)LgS~Mvyy8tF_ZV=0-6aCW>mAB^^%S-s zBWn&z_TjBs$gBg$5Qu5i&V1x z)O>i6-4pZw)PH?rUZdOg^BPU#&%dd`-NI+z~cMXtC z=$lx_TQ@?BMKl~KkNeDqE6x81mxoeV`_g>I;QrO2&F!3` zYsS;=Hf?ZoUueIZHo9rQo3^!Scbhi2hrj#X0^0F@9O+)h_93=^V#`KG{jkv%RT(xu zNiD~AA+{^9@j2)V$N~5*D!-$klc_9+Pm>DbBMPPX{HY*2VUQ0SIVPRMx}+2zrxe78 zIR^34t%Q8|V-Oz=CB?@(2JsO`QhYLF5FgWYJH!VZ2JvY}3Hf}>ppDoh#YZLv@hM6c ztNGZ-Anw1Uykiw<-{wa_(>G_=te#t9@?<1W2O(Dxcew}cfkgtpw z&evc>zT+Ua2>FCgK2ON!cXBo$Vxe%bu#YfV_?`5AA^b?#A>1W=P{>KlqU+r)+b8^wkGt>Qxe z)#5_`7IC5fa&e)5leo~o3LIVHTq2KCsW_3xCr_LRm)XicL|FHPxb4UIxW)M1lHmgr z=e^r;uVV3bG)B5p$Z_E9xYJz4)4mrSukTFXA-+NK&maxm<%)k_@w`S*{%_)siKj^Z zHF4Tcru#yCs5tGYaNfQh7owdN>Km~@ox|3&c&c&KPlZOkglZOos z_dE{2A&lp?_IG27nFh{sT&vCfJg@(B-*^7Zcj#y6tiFz;jeQ$FAgnbJ`a9748LMZN zxzm8{6ZLb8hk3Ww%E?t|^~IY%vr_xVduY15adQyiV(T;SAEM{a@H;@dd>5RguCAvC z0+dBeeevec@VmiKS15fUVKMc^n?Gaq9f5wH&g#oMK>6a$pXp`pj9}Zx@9LY4n-jW0 z&{ySpW0nsuHB4;e`1Vg#|I;+c`>Jhdt}gz^)ThG{HU9pA%43rc?qhu(M(8syyOzeA zKV$XrzJM-LUzjq)A87u}Jf4Vf>s@fR_I01HcMLb*>2s_*TTuq2uYP5XSASviU3N>K zO*E*Vt1nbXs9*XpP*EfO;qzzqN?(N%6-i&k2=|#jR2Thrf15GX6KnoVsU{WJu4ldU zZGt{ksV%xuEq!MGOe}pB(q|KGlD;j_r(5Bfq~^zq&Q{3Fhr zqsue@_(Q+SQ)OGQd^W~l=>Eoh_#G=nHkxrwc ziERCSJjms%@Zc>)G4;irFO=t|x6P!2H|XImrat!te{}gq=DCS4R;niHTaWS`=|)B9 z+y8u__P%bS4joKZ8jtU;W8CXG9-|h!5<%s7JaN_+;a-9`7V9x2n|C(ee4zq_bMs@v zVc`3mgLa(EQ`)*WIIE|!qOA2Lclr?LG?llFqt23jFJqd_F$lmsoATDr$u(IfIJKs< z&0Ne%Tf3%cu1#sn$32WLH==E9BD8#s{j#%?=IlnIcB6Lk9>o0xaits2+r68aVlGaP z(_Bqfb=%k!NIe0mIr|1s#*|?d1Sp-D@S)Xk;5&6M%Pwz2&#YH#9vtD_MYI`L=#dFvCXQLj4fY^8l2kWWH9B30;h z?OE$KVIQc_)KD4bEVYeWZq94hwC3HXus&mrs+(M z=<5(&*7~x0Xzv7Z3j$u=`i*1>nM_Tkm9>pchCsPd`YJTK$~a$ZUxzo&3D}I&9W`cN@nu2cg*Xkpc>l#<>u`emd{s`;8Hi8z@m91)YWM7vYd|@# zCy)nS1=v!1f+hsG;N!=nhmbm{J>U-{rDdmWM}lXtC3WkQmV!Xz@7^cy0Kz!lp2X=y z2~N`U;Hi9b8t|W(o$@(6%qHzscn*h{A9J=+|HSBo!fY>bf;(p`offQ~LS#};crx1I z^O<>FU%;2xDf2BrN+5~vwNtOgUw+CVA$xKZLTU6ptya-$J_)Ho@Nbn``JWj30Um$R1cFG?a$XQaU9DWD{GDG(K zG=y-^0~kU{`V5{_+9&GKDJLisxF5l^`r9ejWWO6;7QIt9L-`zLXm?YZB)*qQeGPv_ z>1jbFY0n_V^9W7v);VpelBD%g}p3f5NochH@B& zPQhQ2lT(B+e^NRZRpN}sBwCm5x(GgZL7=suC@hW%+gdu;tK3Mj%izga1D~%G*92sR zW*naRJ3zqKnY(QC!)B?mK7F`*I@;5)6x!*0Ghc;d@O0#x{6z0`Tmsf@D^5<|;XLy$ zWs2@Ik-#_5=d&tKWhk6)<^V|gy))Z4BlNuPVblzy8sBuMyRoEwl+R}q-{9(ilGC9i zSe{)750;1TaGiuU7NEe#^V(;qSN_i z(gu3Gop2JKVA|t+Y+ybw4YiuI1JOwb%YIf^-W=0&65eLQ$!>a|(y@$mzL^Wd((epQ zpNs?RB&48pzNtPQY*c|s=2S5T&NuVtVd-g=JGk!+VBLHW@J;1;m4dBjI%y@9Re(C( zhf{kEdSPk&nb0?rV>rP*YlL)A^UYx0xWt*ShF!zcMpYG6E%N!S3j2x%{ePIM1jq$d zu?4w>T*N|_fSJZ6Gh$0 zsojG!T0`fv_6U)}PWKE>Vdae0xbr~m5n`2xx_&qi3C@!^vi~~|^dKjr{)_WK|2w9v zhR&O<)^lFyD`YeG)J})PWKlE+!}dSpw4!18s@3k)Qa;D<}D)6B#=grFCjT3OQ2 zP$R+6TooJfn%z|x`clc?L zoRRxQVCs8FbZSEXT+D-=9WoD=@51RYU(G}n6VwH#84^uS)B>%3GmtoJ%ED5``u)mffMR0(fT z)E%D44Ea2;BER)SqO{nHFmK!GP=VIV*&}o@CimJ@AG;C|iBfE@&S|>JLb3G@^Ma!G z+otN}i9{*3m+i@($PDY{^ddTxm`@FKlhsmV?1WXs(P}#EgjLWO46=%NUoI&=PS8CY z4Ej>ueZinS<;-t4=%Bt#UVDEKquOktCU}abTki%hXs#_(aPQ{2nFRlDm9#BvjFZO} zgTvc&I7HU_6E7%Au}yV`ClYmttVoR~GTnNw^n#*}y}i}h;fX{wXe;uvClZyn6$xsY zZoQv)siGABXXbf_cFjwj??0(KBwb$pvihbun7P}yprPJ1G*{nPW4>yrHt+MDe`n@( z)P&%vmF5!U@KY7{isRHbPOV>nchnP>FJIzJm^Q84sau6fwN2)$jA5t=BZp+`mq+lZP%q<}de++B=}GJA{<=EL?mQi$U*%WJ)6bo}y$N*%DMeZ#j` zXTe5eu%@FVYM0kFPF>!_>RYr7HXuV(@sxJII4~aukVaIcQxmK?NQTxUx&l*iPRQQ6 z2Q+f`B2SCZ{c&n+d7NNFi{2@xW?66-ow&P%)7R`#SUDR|clb!gD{sh=T2B{a6d=Stt<3omCf@_wM|=S(ok*Visj2{8>^Pv`WO>d zu_#WJIhEa#d7Tkb*3>uFjX{+yt!Wx#Dj@P0Mzz;Chbcz2$FJ$7!LHH0i2qOc52z4f zgMR;kf(HO zud#W-VjEYt3Ztcs=*;q(7T4vmZt+o-J1Nnh-5C8M; zmt1l4n(QOXpZsj_D_M7ba^>b5-p=1UZvK?U)+e@aKDY6qfBgQPJ4a2O@Xmva`<>W+ z_N(ud{Jkjk`F}un1`5O{x*^!cVk^fs8`~0W=VIG{?P_edVtWAF)7W0e_A$19V9UV4 z?uCut&GVag&d)V(f}wjNUYyctZAs@O^Uf1v)O?|e@F8wBI9fx}xrY@3X9n4TJU{6; z9!B{ml>R&*xsAVH-0FW!9ACd1cdK|ZkZyyx%};B9dgV25q9NC!^yaNRI0p~t%v*M# zEf0s~SRNa1UJ!%Z{WHS~;5PqU?f+ZSZ{AHK-txbwd^UgcW*+f&e{9=gp4?)!tsgAT z8aM=TN1#sG23c3!UzUOO#Imyd)Hx9w^J4zC%%OQ8X;dC;vsMOgVof{kNnrb z7|yaHOVj3gZgUDY+c|YHEx(Zp%)4+r%l>HJFVmj=V(komA2oc{sm|74JoWYDZyJu{ zw^H7>Q}~W*&)_cRo2e~>x6bK!`j`*+ebv`1etbT^pW-)Fd!d&@qlaPR1Nl=bFmG=b}Tjy=J7$f2^&Wt@iXc4=7~eJ4C0V3Pg^+F zJcBsss}Gkr=*XbY@Fyt_UowbenF`_?90qaRRzVy*V-N>tlp{yO7{mdx{y;d6doqY4 zp-T7#D1$hfr-VF98N~5HNpZNBL98fAarBr$&tsF68JPj)0Gy;a5KAeJ&8iSrD~JQc zO2}bSN^#6oK^*2|5Qjpfi^GBp;uxXo>n%_Q@uLQ*=O`nCIOM1xF!N1`!2^B&W#2D) z-*uT(uC7V&+wZ@|E8LSiz9s3u{Ff#&&n4J4vC+b@{TgS#6BDJ}<=7UxV*5^1xTkM& z3--Xxm&5nPk~8xZ7!gC?y9n+fx&7svfePC5ohz76U36BTzDr~IMnZ1K0p!?+%!b@n z$@OF9(^-8dwxn!G-e~HE!PL6}GAkq>wcn~o>b(N+9QSef zy$Zy>=dv-PU(4m-%_w}&M!Pj5@EOc+fQ69bSUIkvx$A+H<9fiu5x)#bJ#1|ZA0ebk z5b}WVTa=BQ{Q>bgAk#f1{y32OdETO}9KFqrpK`6@*9cd-;p3Kz&jYfYr@G-&DivM| zWcgUX$Y%;W6z1DW;a{L~7`_|G@Hc>ze?rJM#Q3`ue~ZGm0FOiYIKa(x7XfjPk-Hj5 z`9_5=22$TNAj^m8>PEgF5OU*siI2lI8%0Vk6n>6t2Kk4=Ey7L0S;7h-M(~WhU9bCf zzsp|`UM;*_I9sS|YI1k+EFp(vng8QLl+`Vtkk2`ce+kExxIpPn6IKX09?STng&eLW zPZM%5m;8O@^QQ0xp)JR+#W`|JdCqAda=k0!IYN#zlXHDEB1fr-g~FqSeT9bzvxF(a zkF{U#3SSZaN%(u=LqeV(%;%TFt->urb&d$bIlqFO=MnKEVTW*+ z@IfKZBg*kSB3>`NQpod(;Y~tb6Ue6v%Y-=hOgQ=|g9rMKbS>n1;}l&5gsfS=6jPQn zd4Bc;&I9%U&H{D^RseAUHQy29Ss}9+9QRV@yU!dT`~NP$K|u7InR!5*6Xv_mEFjMh z+=rR(J~M!zJnxM@OwBcV#saBl43K(=c|Zu8^o$RH7nvY;eP>X!o-@NS6le5~mOT0r z!;b~>xDNxi1CIjU3p@|A1 z;T_;S9=m|((#$%x4Br9H^0oufWteqr8NMAHb#2zM#i^UQ6}&%i3y{ZQ6A-6}S;v;; zTnos2f2ZPw=KE{LZ&&=SiWmB~i3|NViVOYh5AyNgL*)6*eu13G^Lm~* zF#yirq2V1%jCVU znak&LXRA2MYTRSuOi%Zg_^B>+_KM#ip2JKL)-FC${7>S%4x4KmWa#*ON^S?MuNAlB zzK@98vDgpEQL*+rFSFC&f5k~h*PWFB{!j6tOV>R5%C)FSHzc!e)Jb_|Tmr`R^ounc@d3{+HsT#UGP=DsD39UL!~Oi}c;0k0%N8tCW0Ca+J5L zXSn^2?^(&`seW6))wJPr zoNFUEUo(Wpe-aU|`#&Z%t|3CcB7!GIaO&n}-CTG=c|!z``reWGQM^iib2!{&h@t9g3}U;ZYwi*VaaO*Iy`r7@e%#s)2puZ%zLYPC zA8TXmgamyuSGROU)9UI4HJF?hvBKQ6iKd{zSL+e+|H>kHSpLB)qAf`HaJ4%-BRVW% zEHHAUIebVrGWP$+L*p^6D8#m{5XXjsx1NXFf=-?mevZV}7014UXI>$ExvXeY3T6qD zf;c5IYYE0Mrf^`Z4&mAUw=Rgqm0M!h-3V{Z9=FEbUSA$SHI@Ib^iM`5&$h+dw@ zNXJ-W%MFiS6vz#ab3jMLS=%SZDm+Hd$T&;>n8kTw9O)QKc)5DK#@au6&6&_1Gv;X# zV*xN%YjkUN!$$>;ba=Koa1kjhnNU8tl8f5d3yBkARU-`!>(mS{$_u&!+SSM(J$$4Q zH+D6Gqnni&rT46B#I~=oHh_y?9yT~$&U=u@aix08zg04p;~t&&=_WmseqZ|v+Qiw-@D87BTh3v#+s9`dls0D}9y&W9o}%U&HEqN2xr0dHXM4Jo_4r zs{fyA=W=kbO&7>>?fAhPvwZRFYjna(5xOlpzPI6CHNwTz7tg-NP3Fx?P{U+B7X?Ei z%ZE9I3##MVo3QI;R7gQ7^s%VB^J34F(9Kn2JbM#+RX%$vZjru0eZ1p=r<Z9x%@Z}WUPh4=eM(l4`CkhTXn12rVCeqFvR|=E`t0%Of#*2Z-=Mzx zZGUm?SFDZDXP*mg`G67a1tyXAv)+we7tPk+AU$X1qkMSGr3*VG2eMz$t^-@{rgi4& zIeI7bNl{FF@$6UND?8)*OW&>1CrXH^FP{C1eCZpmR6C`wqpv$w8?A5u_A3_SB{^M( z`Nuhn>#jLJP+(p!(cLaqlmTYTCSQSg?vt?>;x}^MCqq00+^C1I6?i{zu+CTrz)yDF-c&K%UG1jL zT)InJ{pqevhHP)u8)g%2&tfo=TB{Pqp2a-31hi+7OSK2IXYmyh?9ZMBOet7H6NS%1 z*3AtjB?ig}LaDK=k^3++ZYyjDl(&B7N^SRf3-|0nMZ3*`qa8ef#uMPq#^zH?fz0)! zxjr6HbvIbu1cXl34$7eGuh>j{;#BxJA;s5^BK|Y+_cFGmmH1133V%+@1NgfHTY~xS z`%?GnRntp(aY#~GB2ZZDU$jX{(Sv>KAUDIL*aZg_uxO6 zmT!-OX&(hkTVaZ8c5%9s&%^9S71@X;D_liO54m2{5aW?(} z{>#wG;O}GfL zSAev_oJR9K_)<>m$JupBc8)y}6%k3x31^;+Fy=hFA2{4^F-=)SurfYDKyF`1n6hPa z1_zb)RTA0%#h4_O&4lcIh7_9#mw?XTyrtqkX`Yg-r=VmAlIb(3U)C8CrOyyM>sfy-%7u-nUH;@A(hR9Y+Ackv6Rh(>>CZKY$jxX6XY(&RW=i{ z$ANr?q}WV22L6m9Fu8G%Tg%vm&Ks$>S+*~h@o z9O{jOR4N?zmW_i_Ho-rj3xECiRXo)mIEcc7{{w$1RxTHsJ1Necpjfpj{|Qg15k5Qo z7`&Y55*pd>djxwB%c3G?St-AQKVuA~oeRU6Y>hmNu*e5d>+f4>Zq|T%tIWB?9QEd3 z!W}XT#QVlyyqy-kcpEG9Wp5(fH!=bX(KEe8>shgD(lMaSsNTLpVgHi!e%_Mw{=Ovf z;*%4*I(~p&w9ft+%k$O#Lxatt^;~b!dcvjU<{CuwDEA5~J;~aE|9>wn|3A01JTQuK zqzlY_E5-TJh!x#vJ~2z!z{WN1Upl5aN4i8DgGYh<#jYG5U}Nd`@i|EaIS=Vo;}_{w z||Hy|m+w=DcvY4}*98g&Wyh*7Rcm5-~u=62udiYzkTyIodgqFC3sA~A~1 zv%sUSNKE#O$kVP!jFwj==v`N2k?|gj9+oc7`ehUA11$lOs)ORqbz@Z-1*Q*)v*y?+ zddpRGw(*+Sw#9E!QSM*1WH!){KIOvM=-6tVV$5bmYV-tuvMf`5z6r#O{st2WtX<(- z`BzfMeZbB7zkp<;yJAd>Ve=yWJS1+E8 zm(PaU<`qr#UaH84Z>4VA|Dv_B?f=^r$HtsncB^_rCVjqQIz_Wi5_?Ulm7iuQXT0`= zrI)(NSTUzKdR1oBMf#5=)Ur;!+BCSD6IouME}&@^7C_>2Y`d=w#>w)U+STnjnq`VXB96EK6`- zDy~q#6OLLF#JZNH4Qef%S=$!5`nkVteSXLNDF;Tjyu5BipF0j5ym#QG?>>C*?Uz?S za{KuoZ9}{rICkOKjbks4eK-!_;OGW#w|O|`pu(63whg*Up}(X_>wKYqCN$rDDL<5d zaO;KszR+sK0emB`1`a?Q`J3VQr>90Yz%%Ko_j%AppQ$&-;SsDiu&ht={<3#GkZbg`aIdVLYjAIdXH zEw0hxS}d-;;vQC9qs9Dk9TwMRnYCM7pT)IYT;Ij@USSM;MUh4IgYuRbyjBy-%VHc0ULoj7>#u?1ArL+RqJnvY?Bx| zAHnOM;eP~@&xS?*bHaZ@`1cEc2XGA5-*DuS^2{r)p@CgM>e(p#bwKJ_Bv>l^Q-P41 zak9__KwNtRj{{OK>xFuG4O8!KILUae}Wwj^WZDrQRy^Hw0%0772z0?@iM2 zg6l7uL@$RGskcn9L~x4W1VOHE!Y`Ghl0^Oy*z8bq}L}tnUag4>%GCKl@&_?t$Tqk53@%4!O^q z!lA%o&^RwDKKe@)ALmEK$9+-F(?@@*^gxHwgYOQ@UYLQ;2`A&y~3p%Yr3p#nAQJ-qwKG0!3q6}&tJy6Y~C;fuvt9kUK z_Xz!*$P21@^bFrE;g3tWpwlC?pjxLu`3E&$&7&v1OXzz&0? z__s*7ptD_QLA8$=<-e}^&Nc}bbZ!t@P~{(=hL`n#@8JAWjx>?&iuFpG$o5n!G!ac# zwR?s~K*MF7L?#a7&Jem$80=3N{(YgZ6?%`*TqnlxSB2&}P44q`AS?`KA_IP0%yff< z#t61@CkdS{^cgzr&Tyf#ISQ{Xzb3qSoNV}FDzPcDOe*%~ReNu}YHnNXtE!&tY^F2EzG23l3>~dCFq1h- zhu8}-Qz#P8kB)xF5|!Tc%(0l@tzW|91jS7;-e{C>I&^dqBLBScw0QZ588TUFranf` z3XaZX{Q0f%xe4a_CfL9&c1EU}*P38D>QT=xKB5V@hbgm~DjHK}#Z5S2Il**WZ+p7H zMCRD(wp#yGbC%*yhdq*>|#t$JlM#iMVh|R;*~`0CD?a=Dp731eFL5ICPoTUOWILa%SJj8peS$ zG)W%p=je`f-m4kwH~MxCQ1@g0ZBUBj&&*S8Y+l(yR&d`Pqh~PgLv#;I{`Nqhump6t z(U)jnxlWP(qZYS*j)%p7i?1)iyw{buAJG+Pu%5)dh^`m;llwqieTnA1-YELC7R&lj z^cfl$S6`xeuSOqd5YQQY`wo-8MDt!B;(!j^C@I_sygbnDhdy~tkDI?l^Ird3+T?nP zb*kK_wN~{XS6`xeujd5L=MUw%A+f#|e8Q}zVYj&RN{v4Aycg6Ll{qAGxOt^LlD}NZ zPz298JmuSQfe}%?Q91U{V~jU%bFb)=(_j_LbCal#ZY*FPZl2{EqR*(AYdoSbL3tC- z13e)6DkT0ADeo?nH(qyS%3IsPS(~aqh}w6oRIZ1R=-VOs_CcRC$$0gbaNcG`K;Oz#g!W=+>!%UJx>Ps|lGlZ9Wy0IFp z2GJ)ZA#VN>&D$I=`hF>u|9R0@fcy>DN(1^1J#Q0RKPbodF}eoyE4(hk7(}2VB-cQ` zapdt@iXfb?QN6$o$P2S&+8nD;s!?H7h7fin&fVE*QAt&0#k{U3%esDA*7btkcd~9& z_&H?Gb~BvxpCkv{QrUP&Bm*Qh@)|QOIs2Wsomt{|R<0j+9)aofP^xyi}5+x2hTfc}422skGlY2jx8 z*rbUA_L%sF4EMn%O&q${W#Eu>s1G)2GIh}J6@=Y~qYv_${Wv^-#*vyCeuKPF3e~34 z3|lCKO|9HmoH58)q50VP=>R-y!ASWlJpDfdpOwQp>Ia`nR#nUqOosDsI)WwJGEog3 zs}nt=EP6s5C#1c3IWCby?zv(n)1{gDa%v1BLr*@-G?UNN#wzLQr$Sq{e|B5go88tg zc4l0Ev$;x+e`a37*=wemqn@H1tzlswG5r5~_S(N@_8KN69PXtg?ldxgBs~v|&t350 z+%1^BV0n9e8*J=)ORW)t>mly`Ccf!sW|g?shzY&Wrd=|&2Mc{6v?}Q&-wZGe_$r4P zV8&bNvW!m{9*lBDsyt@24>ujg(IB3-JpbGA@exe@&@D>0u4#NInud0V zNm`iH6i-21X0%r8P+DPZ95Znay`4gJp78z#ig)WR+bdjEtYnh+Kk)2ma14%|S&r0iXyQ5l=hMR`s2 z&8s>ZP=}QrZ7>}lCBUIhOgvM?)2D#j7u0rkv@EP&)3Uby^tP5YdWd71%=Phi8Pizn zCJWO{^+cV}L!XzZ=I$f>4aQnKxj>9B(+o3Kq3dT$bVUCY7lBqYzkwYW4?e@vF-^{I zF#abiUN~jrR~}eY3x$l(Pd9ZRo$`kzBTAsoyz=WcMW2Iq8eE(h)H za&AY@ZFf%Q+zofm25j%rHZSLQ>_Ob$;P?bNAS*;$6&)H=0`CFv;bV?SbMHe5{$$Alou=qSn z79VlV>!N!ugYzoJLy+%#y>i0L&BmR#5U{^`3S{xfIB>Ec697Gf^90DB3Pif8g@Swu zC*5CXJypKTr2b9#?+Lyo*ekeK@FBr_1-~nJv*4En`7*?GIs}^pYXy1hWcaCqQv~r% zTk%~UphG@h#Z@>^g_CAD>F0n0Kntqx!lZX=zOr9O`f;IqL|#yR7iRc_ z6242q1)Y0@7F6GbDZf+X?~rgo^<9|ZJ0$!T2^Vy>3oWR=3se5); z_dD)H(EJW-TqkK%xEbH;7J3aL(Xm}H{0gD(Bb|Y_W1(4Z4F8tU>{qfdc45ZPJ|c~? zWyZf|@??X~MI5@dqzB?$%6LaMc)si@zn_l&ju`lS7xzi#r1Rskqn~9C^Mn-FMo7$u z9Brv4KHL3x<^PTpS8eR~EdANY{q!=sq-yRN3l^RmYt|%QIkkx%_e+WQ1;~U?=?n`x}if~j#r9qxP0X#EIe zZIb-;=Yk!qVF|E z-&j5@!5Muuhsj@}?=^ps`cId_{a$YF4bX@C0A1YtCHh{IfwpijL)B(zgv^i@c7>SI+NKzZX`PUd?}B0D8Z zqVG5fUwBx3>iST2UgFt3*(~}@dtL{9EN^7YA=`7p?`K;B`Zfge2i4L7O!*G|{cM}) zGoA5f(U*t(iK3_~JlyxQZPMSBO8sr-OA6c$=o3Y8^|9@>x7OAL=OgrrzOh=3wMX;` zNrLOxVL$u8cJ=N3MV_&WS!+*0+q4t@mefTZm0l);FBgFn0PPxwE|woL-> zfTk03CvHNggXbl538=K+Az6FWSMh%nW2EoLU(#TE1TtmYMi0OG(bnd=?1K&3(Uv_TAiHol+Oo$&c)0?{(Uv_j`34wDhFKF9 zmqR_t`h%py$4l0_GHa5;0iaB-5D2B7>7^CsM@VW*oo`$Hc=}Gok&@Y;>!SOFa_Rsm zo^6{VnP*{pF+Uk5D%yY@s36wKqpXI3_5&azNdv=K#W>?EW7r5J4bB~Ow+JV(M9H~q z6q#QKFE@Q~IE&UdRIS_sbzcRMuD*U|a}x0)2&L<Z{ z`Kd;QMij{vNs1gr(&|Th-VY*1=(PSn0N?}d7;rM*AuH{|aMl!1khHB#4pW8FvV7-> zwaxRC7KT-k^BCx0|K#vLxBM-Eh|vMT$k3n?Pq);IB9{&6m(Z zD4CAyDsxc3Fm1{(O6Cwd%uP<%C^Ls;gx`Xn*Ip(p!lWXchPX4eMVL%OYKt&~K&n{U zBFrd5YKt)ALH>$ywMCf!gxYsViba?b`g_2fnbF6W!{y+xDl)R|aEI~tx5FFYzZp?7 z2HD{o4IdU^z5_pVn9&!No1D#5?je~*(n`4v{=wX)uK)E2Nwsr_P+md5HdiKh%7{A9e)RV@ywm=us|$bD3nZ ziU0fi`@iP!T3~TKzoMzOgRA1( z^BXG~TAJ%C8`pG#)zUWMQ)acZy)D17xvr^mMSXs?Jjmj^nLDPXKKT0?-nV;vX*J*Y z=atK@>xcNXufH4WulZsfT@!q%aTU2+of=KP83D+KF*$5P=SAvCW%b}Ob8}C__s@6QNO%%)tvhFy0*qvt|h=n`---fb?eps=L^J+P5b=DIt*dW zYH4Y*W-VAyo^aLyx5_rt42)@+z)S+Yk+!OUcIc_ASIM?x;=@|07tS*9%`Wf)%z~tU zo1Vc=;tjQJRwrhQ6j#%rkGJw9!FKkIu{+;K+axiS>+3iz(^9Q!*XO&af+lBTTYj`P z8Gj@6`htJ3&u3RAPJY~CtX2ECd$l&L*1JG3cgII~ML(*Xnqh2zy-^YS%RD(qAFZQ) zJVF1{T?8peA0Ia@JOHY3bqt3jlw)2aIQ|~z+I{gGc|qlx?rpT!XsgtI=x)IHId8z8q8$95bXbm+mc2S+cC{W#QE4v=kv?kQBLX(OaR6#7SU66%2T z8k%DRq_JVfP!#Pi?pL{x$qII4-UrTCw6|u!sm0fOqx784&8Ge5N)z>{txZC za1M~!mz#TSb8ZmrxcvI&`TxPWLYxOQ19O7h`9YW)#Cb&A&ztjxXb*{9z9GBs^9tTHReu#sUfqso+KaON%d=QS~aZJa-eb4w3&UI(pi=%;*T8l&GC-H@yEWX1_zBmp?76;`dB1dM(;xLV{I4(vOhsq=(2i3^p z2%AW8l!q)1o=EOF5=RzC=!C_QJF+>KFD|oBmHw0%0772z059o88x?kvhg1;90x!^N`j|$!<$PsI%yGig8 z!CJv{1?LN%E_k9K>PE#62?7+&dOtiG^4|og^JT?D|<$zz!`@$zMRGC`C zs}Oysl0(0!=7}K)YghZjqJPcm0gb#UJ1uA*QTADI-j#g~Bo<|#1^1Aw4T#5ltpg%SWp{(}4WOCN z8X%mq&qDbM5X>*qU|;W+ll6`^uk5D)mHiab)JvMz25CWMKZSIwg!4KiE$A?P(t^$k zp#_~9p#_!w71Xz~zXEjFHQ^I+m7v3q7Ni9o7M8T2^9l5k7IY2>EvWWkWjL=tpxTF( z^nRh=7I{HupU{G8A6Cl0F7mw+E~xflW%$byzE{EpmHilozaZgzBwSF<6J+>v624o) z1=T!3hCeRhJrXXc<_R+VK?&a_;eu+OAj9vG@SPGa=xhg#^R5lh>r_{hMh9T#9Vq)OpjV6h*F?To>f?UW z=wQru=lf7Cw8vuR;k1DsiH^q119@J;3nV|spnmal-5=re(_;ek`~Y1Nh<|>7=Da7r zzApvhqfd+qr>tLI?g!wCOSH9RVtX#`cx3E|M#3#M*SKSxGS$;F4`T**CU`G3I#1YG z6GJ!{`R!OQvqkYj>v4j6XBs{6jk5$o_4LiCtwGJyq{Q}N@OtLGX`69|SmQKi>u(_G_o|FH&L{4;1Ji=M5W!)Egk zHdqqbhKXnPgjQD;%uzf09lA#1>|Ci0vP|@*;>I_o64YCT1r1N@vMGy5kh`F`evUsltv4LQmnTMOm4vW!K zrk>33OvsKCu3#mmL1-`TJf1W964_xno)rQ2fpoU#vZIf7@%1H`*L#f26DtrM^N-b@ zNQ2v-$JLi;UhjO-XR>se=rc4huD(R`dX2slc@p4^zP!Wa4V-ZksDVEJ{aS*}%_-qL;eDd7LL%hO(c@4J&=)dF zd}!w3CYmQ)JWUImxDBFjhnGKj;?Z)xd8BdY3C|RLWyxB;75e-xs`3zE@|S3y@K(Mk z!yV9I^_-#0yA%0iQ^LDfy!<7c*SlFRdJ}0^sn#dzV?gq!=B37)cf3vX)kw_UqHjm5 zJCjw7%WYC#T$vOOL<);?0ZRD*8^4SUu3^cd_Nw^Mp+% zgXQfJecL57`=O8CUgU3?U$OXo?K$qe=$g4&5Y0`wtqa5>kSKqg2Oe)8^B&P>t~X9r zW&ZY{%FQYAr(o(YkzJv^0evCSxA)Nc63&b64d@F)U%-X^w3)}O<{cv-*x&CHefv^$ ztX$F8i~R8&3ofb(jXs`b1_t%*k@oRA1L+oPXvK@QqrGwUC7Ks~Pq~gXR)h7r=o69< zS6`xe(R)STT4{fwbF`+d$e(nL0ey#_7hNIs6_)zjaGq{2HJ`QAu7c@$_}tAdmFMDE za*1Vq8@S_Yw5@(>?9QDR-3~qv*4ITiCgAwA&NnYwwoL3=+KU;;!%;{~Rpzdcjp(|) z+0osq0Oehrr(Cp{L0zwy-5mGoS;))u3}kQj$D%2aGeT<1$A@tHgL-cHI9jXUw~twe zg52{ZdPQmXhz}U3lf<5leY8y1BZ&6ibcAdfI2`?AVGr`4Od1_(Q%Em6ssyDQrzcw- zVQ9LWn!G}&{EhJP_gR(Dr7`)#CX=wfB$LC>?4CTS@Sw`xncdST`M8?*lrxFNb9ct% z^l-`0^JQIsEAQ&Wr0|s6ikXwSsQ;p|I@P_p#N9>1{h7p0mW7ZBgIC^-8dCW$IrtKI zj*`RtbP@+oQIo_=yB;OYs`ciFs|o5fCWR^L>&m(gN|wvIQ;~x`<=w|p?OEN^$3f4J zsHgiRa%fpfZ47!o6Y4Iy1wqQ%RME}w@jNiGpKt2PzUqDSgJ*RQhk_XswD3g`k!CRU zvFuIUlYl7{eyB@%RgXF!qm-hjwBT9YlgE{J>6%r!>H3=%?s|-*RF8THE$ec!kpaaj z>w0oQ_tZ%UyLwqB#4jh-7w*l>Ab9vXLTanJ+c$sWbDv*k=37s-`PiHn-+&ZpFSgKo{DzNHr z^x6nzzU)1;e&ljt4?cEPvTdkV?(DDfYyy6VBB||K)FKYG zz3qoI{kG-eNLlyV2nRuRaOuX!^1#Vc95i5dI4W}X$W7Ft;#XEEvvC(k9`@pOU!12X z-Hoa!?x|8H=gPWXVs|H(BCap#5YXM7Sl;Db!943B-&xn;`l7`}WzL4`WZX0JIHlw) zJyGiR_q@e?>ttUAmUsQ39PP!seiY-w((Xlja79I@9JdTFq6`o7`OGwlc~>3mJO#bo zEl5TZF7M7Wm%i%iit-q?C9@yeXkiZuP~P?XvaY@Q)FFrcR1Oc8cm2tn<&Iz_Kx#E! zXmLa1IY5VU@OhkPl?MdvMG!lgu1CS{F8Y}vc{}x0<-uN_5wp5S-^6fFM2y=I!+-13 zn>*v?nzCpjQtg_1078E$Vks`&uT#Zxp@1f*Pk^CRR|QnN=Z5K?mN>BMMQ_m&Z*?Z# zaKxLzc!=JB97&&{HPv>oG5=Ve)SQ?AE(pL3&tOLgz;5AQGPs=MAiQ*U>r&LzsGdCi*^L# z-*klWFVgWFg7K@5F#c~T*Ikqsj6X6q{#=X~>IZdxG36kGyhz90!+V&05oDAgh0oz1 zoGfblA?~J=@Sv{3lOF_CObU(Ba-Iie4_k_$a~UIL1O8sck$M&W`urS!R_ICmeFX>B zvS7N=H{k304F2r2*ZGfaxlMXEf~K<PZkt7>Q+Q-`wf{CY+L!iBw zpAo(Iy!5^JYDs=77nP;c`cTL@Gn_F89%e7I5FXAoa^~AsdLDzZ8+R5F3%Ou-K*4+T|Ajyp+S21)n((nH@k_{QD zm{Ugbc9M-0ZXikf(Ds@ifb3>wbA}-^c8hJBtnXC!9q<+p*hA5l2Ow(S1zD#RL;Q9N z^Y}W+4n;0P@KD4V2xV6Pb>y|NtyX~7|4NeWB-=p_`iAJfU2yQ{7=Gzy^&D#D)-fw4 zeKQVWFMbnc95MpMv2R2??R$UM7blf6j$e^`-CQe;vsF zmyz7Y)E@z9rP-)I`xe_a8o%#qo{6eUczq`2Gu|Ectq`(JoIP&bOThN3?scT(<*E-F z&d^=V#vQCH`)n(fr#zhxpfgkY_y=C93PN6%}zn4PlLkL)522$Np{j4s_)V2joMOIeLm#9qWvIB{V%9q-Q#*x zXMVPo#O}g=LMt;$YFuTPL@E0uO4&$U)=oCh{1el0d!7Z-O1hrvUeoG~n(eN-XQR}y z8}X|BYbyS;jQ?95-^A;6HE#UwsQ70_#b2Z1U(Wa+O8F(;b~paBQSrA%#pji6CEd^XA4~ZqUauQJ z9X_x8FGj`xi18!uF+P@yskUb#Mp!j)_Tus=1;cUjyb3rClogr4Mw=oEOvD;j!Imfm z%cB%rr4+28f;3TJB5rpT{3J@jjwl7sDh0PvLAEF`5qn()oEGHO!Mjlk`tcq!%DxfJ zY-UI&CX`HRyuS&~V1HCIYWI)?rAkNzckKq*{}n zH5TM25Dlp{=~-tOQmskPsxo8*X(we>8&a=HPyZ{`V%dCVFFX-s3d`m*-!}fiquj?c zSvH?)@N6Mqv2+cPrVl2zSZ#C**C#^Iee+bskgv8nz^^f@P7<5Kh{d+ zxk~MU|5&!f0=p&aHOR9xc8hA4`#?@aqa_)#v-bPQ3_I&%pK#dDN`a24BAjby^&pf_ zc#Ipdv)m_eka*G$^FEm3q@Ich$DV?i5v1N9$j5t0eVC6#>Jg9|ML&{b`!QrL+7q*# z%F)F1y$Hz*ALl!%p9hCcIb1j@^Lpc-I4W}+{JFR}geQ&4ybFHjH(WF-^C{z>GAhfB zn};e%&T^w4uSi$J35sM1Si|8HNg`8Fp8icRL;W&*`7swlKTN_*ErHB&Ls(PcztcQG zz#6`>7Lb~4mF3_%HrD82jgcnwi_<3J{P#6>@6)`6_49bc8Q!x0%-B`_Fb+x8 zG`+9YC$yIDH!aYAGGZ}KSq>kTeI@}+POv1wE8OG^WfUOYUIgJm>2^Q6KhEu7PYF&c z3u7X$K;eg^pbm6IyePP-;mi!vRs)7-W(5MX8V z?1i1p9gS=1VFv*3bjDV>u?i5^SO8Co5m&3EwX|+BP^qmPpq0tmXA>OElGsJ?CdF#O zYFW<<3hftKJpq|Dix6m!3Q>DQDt23RdFGn6)mr)d$~ld7Jb5^)nuDGV1=lWlD7Hx$ z5PIp(_Z~`n@afP?Ytzb;P8pb1{^PUi@GYd5yp^oHrufOrYT@QqA3gv|MrG>8AcwW*e z1464`O*$bb^l;j|NonPwtB}3pk-cZNpLFstBvPI<9o!@TL&soh0N?bLgFyx3t#nz& zCkzk9xgu2_GunrHmvXR{V7!Z5R?HNdb0nzF6)Ebl1Uy6vygB?2`&BQ(@v6f*H zwA>ZBK&R;ao7i4LF(=2w_C#W|aKmG|%iV-xW`c19mCn-=BVuZGlUw17jQ1+MlF`Mf z2NUZGH&&JLzUH!G3T0wl=8Bwcyk1%{Bua|taN&XkER7_1zlOQkFG85}1H&#rYwMx)6 zu1HKnxI}_}DVSufjcLv%`tym^d{Kga?usl8*2P^C^dna!CLuFi|DG$d$aqI#NQEv= z7h_@_aAQ?*Scxvrja4;Myc|TLL#sPqylXs`4)gwv?)|RrvyJy0H`cP1;@#n~JQd=T zATL(TIX0gK9(A?E-208l)2>L&eaj5O|H&1J(PBj2bwy&dnBnvh7^I=Ym90JAzY!Vh zio|F+QG%wqA~9NwNQo;Fqs0uDpW}+eXfYxjwW5o2JBt-L+ep_Wj%9*4!lf0*q-{ht zxFRtn*e*f$xgs%Ij7X0w5~HP8fI;EKd(*)Bo%xgs%Ij7X0w5~Jl`Wxp->-u&sTxCLS>TW;qx zb~GqH%%BB!XXDE~7trD*o;#9pWoS^tihAtT)>5aJlg0+RM$}>~yUB)VM`p_{UdkM< zs$Zd!jGuaYM@uUQu3$kvzCas{%eA!CV_c*55Nfcy8V3|mJMnVS+E(9M+g7jQpWf1@ zYd~35bd#>GE}DFFQLC4uYFAftarA2Lmr&Qzy1u%hz6lGNB?wHIuIp%P3G(A5h&9ih zt;pm>wQU%niq36ieG|@dOIw0s#w;K>ON+*sSx_}Ths@%UBAjmBG6RKhG< zZAWJtqxdq_+_`3XecOVSC2gxZ*U*}$r3T!}^|pFC>Oz#St+{G_YrUmx!TGr&Sl!x& zbz2>%Oq_h~tEsmagh9UO#N(c8wm4nhLo}BN3@p9#Tu=d7{) ztj6XQ3s$NW6I3&nQ{nuqfnJQjb+pvAG{qOpgHb%CuDuM~EY`Cc)!60nk;eAX@+S;*x#nDEeuiDd5r921i=cpoT!<0uA)f=ch zy6CkXwMP|EnU7`6BQlVQW<;x)K6{o?8*u(JOkw)&0#-{~=3sXEkJ-RgGJHDWtd*feIWHWjSmqi1Zl zI-4m}|4%fA$(vD~>NZN$*ts%I>XlO!|FAbjtEHnsZ)t3`cP>|5rqx`3k$2+OtVj3H z`;_jN_1V!?XbH;|DVtYe@mRBdPUo66>&x7mjtF{pA>JC=W93w2)&I|G!mhLBjaZyI zLEm~!vu{B~SM%wpx_V_(Eh@U&yMa_!pWfMASJ6QcpS*j6sl@%ynvGkx5u2m$*oLf@ zd$||4`XW4&@n*lG5qFGs-uiWRni@Om+iIJt3$41QcD58CZa4GsL5h^ZdW#DY(FAMT zVY{{yceyg$9`OCe>qD$MJhWAIpsf0qiM`;E+ji8A8&J7^&GHtcF~8FNXo3`u;Q7JA z{l2!n(llb3m^SZELGT9yZnXgjLx1=OV-?`b1= z=|Pjp9`?>PUY~Vem5#1iUg^PmHlC9G_hf7#9CQ1%YR#S4ay>D9QNo)l5^!(F%J1D^ z6{+rd%ICicDu%hODMH_foytuKM<}W>q!QI@?jJ zv-nQKT(o!8HrI&=s@Z)jF;^riy|%Hvej19PPC-L$^NOZ=uR^D>L-K?h^;=T3UiW^B z1pJ~p?e>NG>h?X5qrxlYj$|IXgU<}6pQdSW|KkUGvPADMal4Ut{f4i*lwR@wgTCM& zer5jeQdl6_#j?nMiSy5$$UAoC@p31UD;ZZ%m3mN&YSD*kdlJ!q;WW0ZtMG^}!Xvq$ z=2u#a%J8XmElg0KRxqY`THzFHeoKT`2W^iD!`T*R zx*^wnz%r_3yvR&1HA1i(`?`*ZNYR$V*1?AawEy|c7{ z&r5Z}WwbHYEYTIWRwLjV+xP6ZVdo&mK0a9LU4dVPd0sI^mUgw3Q7-li?9T?_V86~q z>@W#&@EBl3{G)+m#m~1BhSQw@{{$RtbCYmP#&I&~7ws2cc<||lmtXkP_w$Zq?bV?OEq&U?3KHU8o!-yB`HdDW?-U))`>@p@#*-yNv^<9m%CU%u(TUg=kH-t6(eo!0Ng-6!5Uv@HGRcXO8Df^ERTb%?aRzYPbM zdhWup8^>N8`*0k<5yAzUiz5$5F%Fv9UxK3n$2uIFacsk}1II2LyK(Hru@A=q93i~u z<>JW0QH-M$#}XV|rL_*nW*pma?7*=L$8H>ZaqPo!00);p<>JW0QH-M$#}XV3IM(6V zjAI*)9XNL3*o|W^4z(^3=ac5`>9*sB#CwvN0H#&|gT9nZIJIgJ=+41G-WfCsy6AS` z#!s5}G&;4c3%E}n2-NC4(1kL6f$M-M-zc9-)skD#m!MARUdO@kTS<jEVK6xdf9= zExQ8lkj_&rqXNB8Xtk;dw9&s;;@>Iht2IXme@oJTP4aK1=>3<-UnugAOMZ=fgV1@B z-lHOK%BL1ZLH~C}|2&arJ<)L~5X;j`0&X43P5NWhD;-y@kZutDoFPHloS%b27fOA7 z&E!YYQ>z&vZ}Q)O^UV0B{wgHD=KOD!_@@3cp@;J3e5hq|piO?%;#<&MnoRdg$&Wc- zY85#6ranVxC)8)^OD%r~-HU@REcr9%hwHZ}Z`$A2CBLTqsrAhWKTYaOEiwlEjL@&6 zGh}>|znkG#=>zHB7JXdjMW<;CT`c_LcA#e2EC-Ua} zZVJMZ%NYj1?`eKWoC1JHNL7PjmRbwG#(dzOir5!@;`m#lbpb zy|b;bJUoZ22cB!D&pKo~W!qqVGtX=nEGw^9o+F;;9XR&kU>SKGu`H(jk46T0zxgzA zOc_}wx?mZ3-!U?r`po;4c^>C!Wj$asQQYrPnQ*Kp6bT%)Zd;9|F@$<~52QYG4;%=Z z_d)La!aC%hF5JK6(b4ax-TvM+>D=#y`@nGj7PBu5_kZEOF5D01lf1v|d9ObDmEV20aJqBtm$(Ov*&Bv?#SHu~_5K;yBZhm%l%l}2FW!vf3LH1! zxDChsIDU+y7YD5pq@qAWaE!;neP$QpsK>#+p&Q3HaNLdKaU3t<_&p8>6~jGmPrxw) zM+J^L99%gJl@{lpjRnH7sgT8GUb0sS*BFw;1&2A5!3|zmT*)RZt_!3T7Y+)GtKi7u zLU&dx+|O~4brlX#&-Ha=)p$}|9!M6~3W_eS=_ZQ{yd|r&MnM*rHi~*K(o-zx5-F}b zCyT?bqKoS~$>QoeVR79fSzH7uEH20-i;F*n^(siRxYSHiqzmM zR|%3ua{&^Oi|@$dN<4|k1#4t+^_rx}MVdH)$`%PCasi>l=i+Y)bE&1UXsm-QE@>4O zO?8mP<$aPDF4H56YxX1+ngAh-OFD(MNLaKWA}sGZJKX*>X5~O|e;Vds4i2+F&1vu} zXZDeqyAgG#bJ_&l%8L^&MsAiTcLU^T<&4gK$2Iz>436nOh-0P}J6J&`ossjU`#RXU zA~!<``Q&DAbgo4XsgL9G`~Ri|uMEnSZA`h=xh{D;_*}uTTjVb0siZUM&fD1M^Ql{u zEZJt<#r|wX`9jNH7w+>l2kdY-qfcln^ziwbY44T%%><7w^pr4+-ZNtN`Qc7T+eOSB zhcoiNa`739HsR<_)at$bO1-mO87NDI7CZQOQ0~m=a#4Odglf%ffj7^X?^@}F1 zoyo6|l)C|Prha)ZP%e(#gOJ-U=i#J7$Z>n^bs~4D_QV~fDn#y3=}v}R-Vw-Mz?Ls^ zeE(K1PB}I~Ztq`pMa~p4w>|mJ;~kLOc?5DVKyLF9$bAC2nj?@K>!7zf0=aU?g^xh4 z19JO5IedA)4!NEqkb4|*+m1l)ZOFAAM()SxO3_yjd<=LqZmkareJ?N!{&#^L=+CzZ zeYxf6ht%M^YxkaD!Z!F+rGq}=a;l>4#p9|NlV z34Je6brU41c)8^0T5Wf}3{5A@Ifu`rp7J9nS zCjv2MK9B|^7=I{m9pYyL@vJc;1Y|isLPz*{@P7q_t+A6H0R9K?yFljan?T0D5!i`* zeI9rV!Z!eK0(Jnu0c-?*4Ok{P1IThr0y5u&f!70*1z*Rr(^k;W3f=+yBIw(I-voXY zxE*)}kon-40`t)*bdAtw3tb9ic}s*pMffKP|2W|f6Mlc;rwiW_{-1G;QqO)M)1$Sd z^~eXeFJ%2a1H1)zACUR_K9F+U1d;X0KI0aI-vDIzwLpen17vs;@J56$0Dc+g;ZzCd zJ_~5tBSrwxWJd6P{0j)*4`jXn4#@Z~0;%t(LO%{;9Ww0OORtg4BsNi{gFst z4CMJ<1Eju{K%U3*fjqB#p8q*q|N zX9`XgKHqI_MtvSD{GmX$Pd;<-Jp3BZDAd14@G&6e`HVyU-I|`aL+Eb;zlD5k6Po*U z@p@hkWI4|TvRw0lEXQmh(>oE!czm#?-oZe|R&#sitpF~aBb1M_L) z{(vl|a;X8aM{t**yr89CB=o6*Qw0Bt#?5#i2tFjp{+aws1=$aiW&4O?WZwNEijTECYU40=O*$k!8fFz__g4F2|gpp zwVsrxy+`8L1!>ohbeG^2f-41=304Z8B{)-%#w8h_wvvck0ZdF2q+K1-zm1o`|#`Wu2Yn@XC` zNkm#zB`y&({q$U+IR?t`iGmy#CC%p}BF9RJe8(qp{FL~S^xuCJd{dA{T^atEAPo(W z-YLlEBhtb9!)Jw0gR%@iN09q^lb$2Uu@ll9rzg_z0x?U_+*dvZlYEX76KPAA$mb;D zy@GcN-YiHBBRbLOk0jY!a*$JXesbOk#Fvk!SDivUxVkZ zQs8_%iWLL50m<(I<^eYYBS0K#Uu1?;&(%Nx_cmA94rKYuf%|}G0egXG0`~&TfO~+Y zz}>(zfIYy|fxCcnfIES+fjfXD!0o`9K%{Bm-mmsWJ_WcLG@b>sHUK9A*8vNGt-u0c z127+01DpU{0z3&=0UQr31)d0;2|NK<3_Ko)xcp|M$~_Jk0eu`W7dRFe295!SfTMu` zYZQ?BF9uTor9kSx1UM6TIgt9V08;;zK%`-90!DyW0jd8oAoXtmQvYXx0Ba+#)rNgz zU=8pFUs(hpiKu-onfTY8~V}SrgM}V_Hvz!?co(|lAex?Pu4#@V? z3akS*07n9Afb~H3Yt2CRYsUcj{7L>y;2K~ta0IYG_<6u4&=KHpV6O1Pz}28bKwLXn zmhd@e;WME31BU`RkAeDofsMeuz#+gr!ru*S0Nn#bnX+~XpZ(t|(Cq&P1Gfu*8*nA) zt-wLR&BEURTmiZUxExpktOk|>=K&+Y8elH478nM00xjVm!1=8Ly&u>C>;(=4vL9Rq z+yh(++zlK6>;YZ?+y$Hf+zCYAk;V7M^MTue=K;3?@gA486}Skv8OZBr0}x}xS?h$~ z3d{%H0K_?0?Gt@f))LT5fEB=OU@7oy;7lN|*J25KTd~ zf0lO}Xx8giAgWsRH|bT$hu=xh>N(AglgpmT}Pg3daj1)UC|1)a&bE^%L|5_AfL z7Ifx79`~6lL1(7Wg3ffI1)XA{1)a%43pxct3p(S47IgB27Iel6E$Bpq7IcOSE$HM5 zE$9poTF?m#E$CzjE$D=V7IYk;1szLhLFW_H7wbpRIUuy4^S;o6&VHcAxN96OvUfg6z6LUfD6q?BAh0Q_}`J7NAG?DjpKIbq#aR6vO&yXha zKE4nAA8BHL&^X8fbJ2R$mhAQ z2u(}_y;*2t2sDlMeF?WhUJn z(ygGG^->^dB2;EYgeJme?W7U}825tEc;-; zdQE7vD@K@=4tZm*szhjGd5YuH4Ci<@-4#L`n^NBu+E|DBiO{7XE&pesYlNnObL!hJ zbhFUCLUWvs;gP;N{u@Hq2u;3T3&=J%b-Sa}%2%W*k$n=Fioir|}{j;?^ zzemHsv1Rs&-XQecX*&GNLa!2AoN2*&k}l%(B}#L3!&SDJ}C6(gibj{>$_R#0Ycv|^jM)eub1i175eu= zFA+M47dyf)6nZFWl(#QlLg~f`oh|fup~nkdBy_3JrwV<(&>UB%zB-{RguX^-&I@Jw zmq_{-O8D&({#gmXLBhWv;deK7%y!+bi-l5`Mpg zuP2TA2+h*@{kDWZA>j{8{P!jPOCrBR`iB(WEK$EVOMMO_jr3AyXnm7OBY#hczIhVf zU&2=kJxb`yg+5W}Z9-2M`fj1ignmZoDxrTPbgj^z2;C<1K(s~X?^2;BkVg57=ji-i zDs+M5_W{y);4%9;KOywav$gy^xT$8NPuPb+BRZ(EvQbB7-}+jiw@Ux_g2;!ZKUxPG z-LLEB!{?{BgYeVUxT*W;O}J0`>8b$T7@$8Nh(99`-Wdp&@pw0XSpoUu0`g`Zfr;=+ zApAg}ynJr*=l|A#d{2Nb2*iIoP+va@(0p$4>;FO^d}n}84(R9nYJYqg4@WHR_6GFJ z_XHDceI-y|*9PPtfTUl4PN2Li1M*)Dl{pm_=H26_uT^wl>kKUNGy-+0|u>OBPm-t&UjrYNN^sEew4Jgx70Pltip?wzgo!6pt30Q4OX>YfUZKK zY>W9rXntpIb6v{{tYL=XmI8y+l2#NGod_o1$yf z7P5{L!I)Y#tUka#g`9@DrB&xv%*9FdTe_*PR*8%4 z!)jy{R+W&$D6VUq2Q^$mqc=Ds3&aGKmo2x(RArj7YA$RC!r+jYz+kz`nql7u7Ocup zOR(gGZ6})R)_Vqcq|RauM@U&_mzPvl#%rGvK5uSS$>C(Ya5ge+(E}w{mqh)V){gb4 z&AJ9tdq&zca<;(Pr{grzz($8Qc%}-zuzqEI8%h%!QCXY`6kvX(NmyNWUMjx2P$B*j z&977&P{b{(zbpZj%I;lE`o`o=OaQLK7@lW_CniW6@4AAtSyLZs*t8!JTqr;ZTdxy+;nF=!-T#bFTQ%8U7h#>Fs<~jF~9i_v%eW@ zs0%yiSZB?>Dcf@BL5q&qP| zx)T$mJ264J6BDF6F+sYM5~Mqc>9SHMncAI1&5A=+^h{=4CnUbK2rc6N|;+(Q6#gey^6KFm;L7q=ekkH8qD&gb=B`Qvk zZgGNii`{hfb*C?=Cbw+z^!sTp$Ku#5s~3it8dKb2)>xdHERHRplAp@6A4h&_Y{9ks z#29(akF5~RpBy8v>SU^0QEum>s<#BpKot?r2 zwO^R9kA%gXxb2}ZVeeTOdj@oo6ZNZw6Jt+-j*+OxEu5IBc-t9{$52`wBe`srWZ`5Qikak-HiFCy;YH?If|ID8X!ZHFjE z;P1dV&DbyB$qWsh{BFu`%*s_)chs-z5CTwLT{U+}l}8&N=l{}CABOC#eFbWsAc+m+ z8%L|e%R5(L8v&RBhO4fgb56;^(@n5t^qB97qwzh2ZudkrUyELh*m=(At6jdlt$uB+ zzE|))jP6@9sPLbja!}uY ziaxCc-vLCQp@DJrHNoCCWfJL|EU}Efg2Utwc2HH4L49xHdkG!a3DLcX$pm!8(AS~8 zar4LLJ-VR26;i&hvXQ`5;oCsK#nmULBSzof*wB6M-O)ZmdjtB^sD*mDgYDRMj1(sl6qm?`==Z-=g6j7IYxl{qj)UweHM zbEoPrDt{Y>>6kU5pmnUyUv9CQH^Dg#f&A6sRB((_yI}r$Mc?rfz6bjJE;fI4EBy+C z^%owlV@HgVV|9P94*3h}q6h~kn%ku%DLVRm6o@`^y+uUdX6TbH$E2iC>QC9ICnK1@ z8qrrFu_~aCdbUHKbcGV4LG-Ei!V?^GJFqVF@J z5{ym=$EB7P^L%RNq)w-@C-NwcE<{pD@Km~T*Dc%&A0>ncy{E5-LXNg~kx z)b-Z5rgl|5JHVj6+0|SE zK=jR&So=g@1@b3p1oYK6$X*UA$zb~{miE>ovGOM9^V^E=y-W(9Y8zBU`J-4ajt!{X z1;EzX@Z(~DoV#l%r!w%MEI%9f$MI?1qSCH6O1o!#fbPDuyQmqx*3yG2s|?t+YVH_& z>0<$J>6RHUQto$5OX5GI<4=f=55;%rfPsO4u02|9WkqS%^AOvj#ok4)eo)=XO1tqf zoO$Y7+BG~>y7BSQ`8r0);>yyEZx`rj%XG9KAzFEN5hIiwe9=Vhnz#F@xqHBS^r^Wo zFszjJgaBRh_Ilpl(ypcZQ1ou-DBZGXcWKvCN=MO^WN2dJ;|1rJEYsd$Q(6jNtvd(3Q@*&FQiFZ9#deyHwPA|RUW47PUA!uLobe>;?oV2g5 z$KD!O+VzT3ScdxRo-sopPlp=|3}zABcPs?Gku}Gco*otZesSLzHU->m6evX z7s2*uoAd2#6DeQoKu$k6ROA#EFX<0dFwQ=k3QWYA;L+KOImgl~D&I+>(oeqt;W>fVE&KS)i;xh;Lg1+hwtG>@uDrp?!7wY&Xo_=-)e=*m!d-1;) z75~3f{Ar9oMaMVsE@lXvy*Lf$Dp8GQJb^%a3TuXSXC=*}s#CNoqvB46z}brzLE6g- z4LW#5;WP-X?i8xK5M(Az=Gim;iiTn()lu^-t=VWi2|PM`@%N%M(^Q|QnH7*R3cZj$ z>sL_q4kKkrmqM_=YO9wZqW0ZH75$X`%2pBF=tfxYMtGEBN&k%yyG)ncNPXRv zz75h|jlO{xUb(rDEazkV*=4G^o}J@3Bv=Z2p_RmiDfWD=*=T&#)oer7(|jV+aWAF$ zpfYH0#h(8Os^~(HR?;z4SE(;8qvkjk0nT2`S?HcR-Y-0Lzot6Xk}8=uyzoO^KGiMJ zm$^~1+EsT`l)5rfZtiF(Myp$L5qhxel)AZ8w^SF_s4*i2_TqP=)X_49r|vwo8Le(9 z)x8XIz!pf@)n5b2)#L*=OTO61=mu^ThS}sihA~K;m(TFLBwb%K@RoplbTBnO7D!^i z7np_RY+2_c3vh$&4#D|_G%xAaeU=FVA@6^7MXeT@&o& ztZC_|q>sxe%b5sPe|u)y3JhT-r&!5ZWjT{Gc%Gd>R#{Fm25M5W;eoy!#7f5#c%Muq zRh%{vL?{QubPPB3b>m`eEG-+=m97;qAzUpCrnfAI$}=asBs$)B`N4!uFN)4lcq}5F zn$A4*V-$bZvEspGJjaWdguD#!l48mO(@`t^Q4527e25LsvERNtgC%4x-@F`&qx7&iB5&tHPMYV{NFwwjL_O_+<-(Vjo2erpUoh$0|)jRS3L?$ZNW3t(r z{PM=-ZMALd^G|QX%l<_zZL8b!PjBgL#@G%jWP;j|klg&z`dVxui_riXAYa2uX67d} z@Qj)HTbdG?2Fk#Xy2Nl6_AKl`Fj%tJ83^D}PoIWR#zu z_Jz=lmo7@%o7C1n?X2VnE)Tt!c4p{~v@?^Rwq93a+mlWinCAUG^ImfLm7y8QYeO%F z@?Q#VOisr`U=o%fBYo}A?39bM`MQL-FVS%}JU36a(-Lc$DM4o)USy#wQYAhY%;V|` zS7ebJCLSZQ+7*e>Vjf!8yCP>BuXzZy-LV8$zX|GgW5uLxM84pP#H4LRHn}2a8}IEd zt5SR}m?zjrU6GiyjmXokNKD#BDdW0@QbQnv_o z8N}uwrZP;#{}(05lqZfBK5o=U z%F7qei>$@{6gSz(lnDiqJbe6UUUkxxf`SPJ6N;uBAIV!@+g`sSf?y>(X+lx^+UDb} zBYUdJcW=`9viMtgCu$07l%aYdADMGNlg^=(U| zmD@88^|G5jca(1O#RJ{a5oFE1u(Ot1p8I39bj0EMx6)jS z?+z0u`=Uez%1mF`Q_{CbdxDw0*b}m&tz~_6LwysT4JEdhAxxOBTg~~{rqI(`nsv4K zv+YW$Wd{BbY;;-G62n-`9ozj}OpcGryPjK; zuEa`=H7iKT$)ndjWh6|V(GF1a{8y&{9$m%OTINIZg`>WWsYkr%2R^F<^`!Deei=2X z7~Ufx)c8*X_C9Ps>|V@hb2ynOe0|$m?4y0S{g|6tnpZ{Kjj|c}pRz+Ut`N&TqoxkM z^X_d2TPsb$lh)_oTF#wPQ5=Q-t)&giYzMun9y@_I)^R^nG!qTFaq!xj&2=|WUfX6K zwYeQ>Y(r5SGFz?s683trqxSh40k)gQWQV}1b=N4k?*mfq+D@(uXu<~8$hI38|MGD+ zXAPED%Ap$@+q&+&uyjcz|DG1Ft^w256JOggXEe?UihnAOy3#*I#9GrRs~T!M=5fhX zeS3-Ta_7cvrxnaB4yxRZK@`7}&%Z7!&-Eqn$dgur(4%JSTh{+$?_J=dD$f4#J;`RX zxhI4`P}G%+Mv?o)h#=u6K>5?&Dy0^+TuqLmc2*xHs>t=QU1TWzt`N?U5< zoxW{4fUxl8S8=i39XZul_9l4;lox5r)GIB4X}7Z>-loA28aPbI~q zkTnAJPnZ0|gkd$nX2Q1AWqS%s90-eprvG=j1O&N#oH(4vd%&rcvD|JyE4~5pwGxA{ zCVz~jnR)sOAa{l64y=O5a&t4M-wR0fku$#gk^6r#ZT#qg^EVcK{hp)Fp7g0-CH{C@ z|J&}W`0TOV>+kqaJ^JMCS&#qdCkL)Re93^@OE;FRdGV+J*sx^KKT1D&-wQSO-QMTI z9lzT6+ffhR{lKh#zZ$Uj)tqI2;=X|WPB?il_a3adW5|KiX1z9|{p)X6v|m2wvDH_c zv32pdhfFT=k9AH@lFhwleZ{kKW*4e*QM zTj8&UzX|>h_?JRj(>*efl6;CT@ZhT zXfx>s`Z|=8&df9dIl)HPrt&-a-x2NNuK*ue-6w;Yeg*wACWd2OGTzZ8D$lP~{yCyu zdAcE-{H{DtDE%-XotaYup0D(7?YpZ#Ge?DZcfMxk74#Acg_{oKp_8{$@?TN>-J%_T zRJ1FvyNAe5A9fGD-%$D}M}k|Cma37wmaIS40ow&--wDq=Sq`2n%g;PmZq|jne*XNB zJR?8ela8kV@!jBgkJ7P<{QI+!*M+lhA%6)x%g8w1g_}_f?zmrOL-fedmYoF8cKE$8qm9x6c~)SL0r7FG3dEdJfL93cd#ZWOz;j zH^K8>y%zp}b)$fy}3e=$Mdoj`ED9JvPeuE0BCY75$*_ejxd_i~bsrd|Pbz^cxjU{UL_a zp7>OhpU?Dq;A9}ryB5fN4igp#-$8vM-4X1k(bkW67I+%+dlJZe9|bbq13=2Z8F(tf zd2dqg4T`^3@yivyMBxh*K1boW7DnC_g+u++)b}VL>$?g_xi~g_`9S7-Q=aLvV%G^* z3I9ttTX?!~f^f8OsPH&pN7Tx5`;*)#x=lDiI9m8R+7YTO_Nwsn!W)I0=x6*Q;bz; zM&Wwl8sSC4g+l7_P|i5viNX_v{e-=Q6~dVCeRsWuuL^_h<%bHtPxy7=mxP}aQZI?+ z;huU#sx1*`38~aXdXVrK;o-tcVO&VHDf0hb?TT7eq#qJe=Zf@gLMp$ImOZK%-!Vy3 z0gXtlF5+AvmA*(17Y-28z9++}Zbtlz+Uf6woC#q#)!B%53aJH0n*An``f?Zi-)QxNv~5 zTu2>R{9^ym{qlF=FNJ)+XZ-!bZwc97GW#lodR_KS>1-)eAxu&Wl{%=XqcWfsu=6hp{7nG?4SikYV;IAUzW_zGaNv_Y;71piczy zIfyzjcHi;LF?Qe42O7KYWx#60j{x#|4+rvkBQs<79q)L??)y;SK9r*bxEF{rmv#UL z1NQ(?Mq~GV5O5c0)=xVS&oX28o#ojMdLVEc5Er#{E0Ez^fVlR??mN09WB0uea6Q70 z2d)F63o!O(8Quc=IN$;xZcStNy#_cF^s&HtU=FYjcnlDA6zLB{nc0p^J@*49K%=dh z>w`m6-;^H*!FB;K?Tz({>)0TSP7^JR){7Pzd)4HhWW$ZUYSO$OKx40(^cc~+KBR@l zUNz|viXWnQp|MxZ_!AUgqj;gQSIzi-icctBXzW!pzPI9e{YeXry=v0k6<@A+p|MxZ z_+rJ!6)!aQsu>?uJS&~F(AcXc{T}KUXzW#!-Y@zMiw#0!ubT1u6#r+%3yr;M#_v`9 z%Ze99J46eOy=wBmXv2-YYSMc|qb<=cbc4{uqaQHwKx5CE^fTZiz1w1gF#4ouVRV;h zVe}Ev!f3l_VRWZxVRVORVf0?n!svF_z!W6WQOiizY@v^E??(WdE{KG?7KF7fpmn(~pop z0UEB9sv)I_aBhTXv=!r~itZdoDJOB?E5_fVcxbSYh?Q4oZ{V>bV_dxQ`5`7eD@bjTfcdX(UD4u)PlmAlDXNkT> zGzXj*|5ef4hn4hwqN##U`T^1Rlg5L67aj_9yA}V0;`fSvTC{0YNdF7b)of(AG2D9C z0i^N5;MTK_Ck_6W#DBKpf28xfSn+>Se4FBTDgJiFzomG7Ur_!}75`Jk=i=pt?vJ7i zM0>m`kbgJPy+|Yd^GZKd@rNs(`}s2dWyLos{#eCds`$St{zk=5RQ%Tz{}07KsQB56 ze_rtgcnP9=P4VX_zJND1@~=|-(WFuS3lx76XvjEFNu#c6`&;?nLE9}u zN9EQ(?-IRH<-@JQ`#kB`&i(Y)0`YSK@oNM0p91`Y1Mx)x`cna##YRxl72&?}(-#Kf zKNg@H0`#r`y+4p2W&7o`U-Z-Ic36$sPw5EJlBzX)R@$d`jroq;w^mpnoB8e3mJ zN#?{m6VqATOehvjxD={gu!;%2uYlP~O~@zh8~JRH(yB^;+v$u$;RO}Es4>&nXu7e_ zGpq($QiBWn96lAWly*mYpiR|@GFnm|bUglps%HnUd*+mVpklUY)zXzvjcKIS$wRa; znLMpdRFZr(mE^K2Ilh>GO%*NFxDiYq(Pmn><)e||!Oj+1Ry$MS$+FsT%92es>q^;d zD8W*aEEw5aOqRw>a}PcDf8J`H&A?c0$~aeJekvo>@P?STGu*?o*myE#@6s)lS^g}x zt&DZNF#ar-t&9=9bbedTEOxDiXI^nro)KBBS{ajk>GCaqmh&Bv#gf{HEaz(s{DsNS za=syU0Bw1)obQM%=WFZ+rsr$wZKThRnr$K}BWk7@s(q$9Q-2$EX0wLiSq!^b!-gbM zt}DA)Ck>j};|dso@)XE{07;QNBE0w0fbJ0K6Qm~{F=v4oSC z&3@LYc<-khqL-o1;$t=7!sTVLpS2e6<#fEJbdQ;nguw)qPg#V@%Vs}|^9p|VrsVm; zLgi(%pXKCzL#dp+eO;6 zBLrNiylnQfejB)+!!W2BZ~=MdeJHDarM;3jQ$lJXk44>q?+kaV_~q;UYBe`Dpv5bk zZ<@WUT3t_g*;fj;$0d1_Rfx@j^G!Qh@VN42v&Xej@)DA_N9E(- zHg6p?&#>|>T?++hy5RY43!LwMC(m$a{;7OMpE%S$mE`gJ&NvJL`dyauT|`Z1@&(J+ z?#kyXAM$v86FA?r6ICX@>k(@2YL^*-wzh?sq#A>gewVF$TtyIOpK71vx%N^Ac`V;n zl+P8}FJI-$YM*LIe2|rP+RmO-Hv3c@9HiT2Au?0)wxN8wb<$4R$>UweB*Fe* zm*h>7ylQnSaf|~HvJ^;JjoMD2$h%3KGhJ(J4vb5OI|g~r#u4kI=4@? zQvKa#6{sC!9K61@nC#;74MQX?iZVdq%(4aX9O|e!8e?z>1YdGZX?GmcQw}dj;E{rm zuAMVqwBgU?v>McQWe1Ee9fg~vzHKtiHZA7i^;dT6rKoyX{@FD0Yy_o@0m+V3TeQfU z@hMMQa-ton>iV{KA`qKFie+*}DuLP$!*s8}7;4Xppk{2oGHj+I&6Uu11vn;?;$muxB zeHIe9%FzhQeF5-3slJGda)G4RV-5aKWumvEh#}%$d`gli_Tp!Pux#aC{5%j(7`AFy zz^Isr!@Ov0H=xXG!+&{vDgIgKM(Wi`0vEYr6{!4pj8oxx`8c`1;viOxgMtnmd9j{2 zG#j1Q#tKuX+N}?Q?}d-`sOa`JAZ=*GdU@R*!!cV$?C|1lPvQ7nhW9Qm;mSi67^3?| za!Y>Y$Pz>T!KErSk1U@~4WJ%GZ2q{49{_T^N>{nw(UsK8piW!-sER^@SH;sa67Zz? z*UW(UtZASt%yU*jV%921zOxDv_ge)ia8^MIQ>H!q);fwZjcpXCjBQ|dLYg5-8P_OH z8P_m|Im(juHP9CMsH#X=2I-b*YopR{h@`tUyiw(OG-}f0Xqe#`jBdLpB@`8%!XEqt zcvLZ5Jk2J@gC;EVkJ>9aR&W19n;eH`804R{$?^Y%`4GPilSaLmVEETR24GBtxIx~e zVGuuutbt&NcH)_9mbWgwsM)g3m~FSsnvG4knp)SaVleJtZkM%o#Ug8(#DwsT%_eDF zgLR#?jkGWlWt;RF6{+%IHl$Bw{I(w!?u@UAKex7U+8bMQa(t#hYSfBD*0j6!t@o%% zh&cwwqPJME%yNgLlY-~FL-$w>$;(A8N~W6Q4*5br7qX(B;HN-5z2e#nd->@!<9PGk(Ze8SWwTa{+RSaYqkyuaN`Fi*a z5o!Bur3r6oTE2K$bE*|*uGL#J8@isj&Tv9-HGnTZ-5JiiNC(w-0 zGvV7%{vgC;W#P9b9tZz6mw+UeEt_Lr?wpAF+|I_{Ww={i%%#R|&9ZNmaoxBO2?>O` zb!z+ur`K49DLdDxx%Fv8zOk{~{G2^$=aBg2b>Dd>f8~>d);@Sn-`e`Jj=cRxt!P2q zI{1z7Tj00B?|^?7mBISB1D@`;@P68S-zZOPzcYrUVPmf z#ZAhA%1v@z-@fCz4d&WDuIc02zDwJ_b`#h2bv$|EA6e!d^Q1r?7U znGE6=r(}VmbM2+8b$#v)EV%=z zbAMu}`iReh#?;2Z>w##eRaXJgW~+GNF;qAGVufD-B>zO=7{w1){Bc0aNr(ook@Ff5 zH4^)y@IK+)!m+}ULiUH`-)L(xHWdVE4&)G3>9He4bD<~0IqpN;r}TS;PYF4u#Q3iZ zza;#ekRwoxZxyl*NjC|p=SX^n@KoUdVP9cf2r&HhK=c_#-y3t3M&BFH9HZ||OduW? z&ggkFp6Po60c>Xm(RPeJIOZu0ANp&23Kzz3+_20LHMxSH!+flcr zTS4R67`=8>vC(UXkka)C$MrXQ?Kn@PUy6RPv<2bJcL5O2=(VGL7`=A%Z>C%*bF!R^ z!G!WQ2%`%`3!~?W7DnfZ7DgLH3!^hd3!^olQGTNb4K#Yts4t@j4K#Ytq@MvF>D?BM z9yIAEMGK7{H2HUl{}IItqwS)FMh}|&J8ihpgC@O0^u6L28a-&nZ&&$OZGTaz$UX}eq8F<}1;X=iiOa2DXIEAFUJ3xOSK%>p4@iVPI zeY)PG+kf7CSZPmsY0jmz9?b_9zsI0!Vc*NM==m8IB~NL97^Ov@jDL@2UdD%T=4XZ7 zOg8PC_>jJqLv^kEClac26|NYSx#ObMLkj0k>Wlf+u(GPwbXlY<+bd?|ZB&J_XbNRf z6dF3jsicK&tmv=&jOh1efrkN5s`q0!!tTkO*)IK)63yj@i-dK zP(DXZdL}(sJ)6{aCuqujLzamDBKVWk+;;pcA$L9B2->BJ)>(SPvRoS;+Ya~q4Kin8990R zsy`=hZx`jure|~mUJB`+P$>p!o_rtVjj>Uo<;$jLbT*!GbgNXpx4T=~_a7=Ro1W1V zf%>`-&$xgK$g|IwZ2RgtdEb?gpu99;;OSD22hU(SzQ@qj;Kt;s?>^eRZ*#0d946Yy zGkP~+dP}>-?QZRrl2_d)+5Q6ZI^U;nkGLCc_K|h$ID9Vid^_K#uMY1ZbP4m1u?xuK zeVah}g0jfcm7dW8$uoTk6X0Xd?}9R&yli?#>m_fOgd`x3*JB9Er>5=~@5+}|FRfnp z!%U^xD|zc6&s`(GK$VXJwxN1UTO<$PsK(X01JT*eH=Ewl4#{(6nFo11-yJBQ`l~>D zG51GSy`}bmyaj>sL3BV~Q>Xjt?UKCBI=>dlYfsf*+9`LXw=_>99CeaMeMsZ_Cfi@A zyli?)TO_Za#MCAmq5_g)E$zyeO>b$ZPC+;d>sg@6;ubBdTVaT|rfpiYYg*g?)VDo|;H%qP z`+)C#JVmCp{mpD5#}d40=vOTLYAZtioaC6+_L|j?LfR_C{CASq2ERHP#dr#VD15t0 zG;LD?oExnSmc}S*Z6(w7B`nv__GxXut>1KI`}DSbQ`??51vYOk^_wE~Cr{qJrmX(@ z<~`?*KX3f`b{Dq2tT9)~+)?f)+$OK>rD<(%nyB&jd)KtLj;OzWBpKaCZ`ZW1sZ-T@Arrva#meMY5--P6hi2>ByTq1u?nzfV>^v zgyw!1U`(rxLR|DIhWF$r^b;WSjP09V&pk=iI;=wJDEEyBk`EJfnfQp#58`#Qz_ z3Qz?pU8%xMHLRkP8dh;Y>nc+%%jtrZSzWMlr}b6gl)}3CmBK1BHM5*D7P`Vn537;Y z(`jT?r!=y9F$^pxz_ZR#*U70rQtnRYvESw58stPCK#~tPOFG0IoBj_dW@Q^h>1rdV zuz?r1vD1WXLjPsOu5@*->>Eb)@CtL6#xKb2^=wZ6%J_}($~`$X-CvLQiGM0SBloPF z$zJXW@iBid{Cm7#&M{TbrS1QO5qaaFh~*Bc1x@Eg=G%kJf8KO-P=@-3J&Jr=h@hu* z_)IG36&?OH74)7Cp-yZZ5{}m)pOJJ3nxjMa07sCG%lvoa22j6phb|80nz?g?87em6*!U%-$Q4lKo0z^+3iP$0OJ(P7~6|ISd&51SKxC(_y*vdIsm`JKf zCKfkiOc(p0B#!OB`q;$6HLa4d)P@X-)M49=%;E;uik~f(&hA07uurX#C;iVljuqJ# z?n9S=agFrBz(W`DZ%^UVIhv!;P!WZCtdc$)~9LGxdw%7vCw;aCK@I8jZACJTT687AP$2#uG7ziL^x2wAdZ@7kd~kQ4B|+DxcJh=AP$a57KauX#8CLB6( ztyw`FpOP$&h>(lts)TGe4C26&ikfT#LA^k>v)=F>yx?%|r7o$*H+@6?b+PO7Zis#o z<+oW(18%qM2NpAs&guQhK0B}DkxxDJRZ zhOy^}o-Q0C91Mi~vAhQ##XR93RDZt~{@m54aJz7u@K)hxgr5*z zCA>tqLdbT@{LT~35>6GKA{-^;G!*%H*Adyb5&;J5fapJs{w3Op(Z58WYV;o`$)gX*gE@@$Ol4xPH zPPEYIS3-`_uLK%>N!-^BPl69<^d(8}68(t924S>aw9x2FlAre_)9+Bc(AbS-JnvV= zZ&$p~*o|fUU5ekPcwzJo(Zc9f(L$py$@I6_@aPuB3yr=c<8M;@X2lDm*NGMyeN@!v z{Fw+xJ2TgXbOJP7=}rd1JI7}wY1e<(=72_n9L5&_xbdP#h(3)p8mQBkSRncZTzooC zEHIw)W^^}*J|OxlqT}T@ey8XWqJJ*>6w$AWo*|k8yDXp6U*N0|^J`K(Cxxh=>GTIi zl17}H|6d~h72^LWY1{~I{{1tezpVM`yOn;I&i{9!%_0k&LPZqmapSr9*o#n?W#D!C zmV3cN+UX0N3EEfv$@e~68`#qek^cBT0sbC=_@M!MV}Sp$0KGgwGcSLB=LF>8o==Nk zAE2Qq(YU&`Y0-s^i&`#hT(YKV71okjRh!jIW;ZVfW$bvR)H!`0cuDQHRlc!^Mzi#_ zY1z`nZc*Iib&Hx;wqpC>^vo`3!iKHLeAS|hU@;IMM#dZ@zf4z;$CjLzEM30jjFn9n zuW6p$x@yfLEUimd8=WybP42`~jV;Kg<*i^xQZrftQ;N;2nwKwXR@$IeX_gV25N@|N zI3y~|Xp1yPGA%_~rA({V+IazdoFTOyu{x|-MEr+`sjOARq0Z7_HdBOIls3bIGmYC> zqjBNfnOdoaJ5$j#o1Ul*XQtT=JPsY{GCw#~+AJ5t38A&SMrffn+PpK%YIIjKxJ@Xm zI%aCLQs5brX7ldJI<%)$_5_?gy{z0RRoF-&9PRAYCQ`0Teb`~6WN2?ep}S`WpmgIG zFJ8(nV6`-1!}MSe#opcy=?6Lcc-uwiqkp5vGuOC-)q~}GF`bjgkC&qvaEN-aPR{3~ zzuF(qHo7>JcJv6s6EWqw(t};blY#q)%C}R`VH;}x!{uesgZ)$7rmT~I(JIttluv>} z@@JwBj(cbVi#JRwwGHa%D;Z=O;)d0SCFRYABsY~f57w1;&SUdri~*1= zatz+^eCOeO1Gl!}aM!n~mDct$>#qhMb#!qHk#&-{74pKKG zrCAEC&fWFbkEP7L`~$tCe#2M}XGYc>U%zSWJ9sic+4Eg=DD|7nU3K8+pkF85_Bf8Y z1qIbjo1yc0CDdET?zSnO2gkHcBaP7O=d^#1?Q#5pXQ#G33LX=>Y2**d)AlC>*F$l$ zJLLXca?Sm>@!?meBkVTA^~$uicgVPDZ_R*%l(3Y_?Y+vh2G*x13j+ln3hD z9-7wnM-w!5f@NEc7-tvo@vC2GEvnzNW{0VPR|}Gd^|Cg&si6Mk=~PWzBDg<`WkbdKfdw&hq)=BZS8T>ccg3(egyUEC2xeBuafNP z{e!?7r(38aZ|(w6xl~|T0Ph`9kn0|5QI3w@1u=#-`VRotmwHo?ATNjEJxRX?(%8ZC z`re1YoEz)%do%JdMvjJ$pG30HkMSQrn}_{4brE07!~PX$?FCVKR7?;T-sE_?#Vv*Dv9Jz1vwc=bmaJKFQy)p763 z-rU#7m%JcXkxE{WC~7kAM%K`1X19Rk7DI9&&SyautU);4lfwKsV!SbAe~Ix4t8hBf8dv7dz1M@t&Zs?mk;8je zgNWu8QlGQ|K4)Cd83eDW15mjFfAQEPUp+5G2i*HK!}z z#$P=DnDXv_#DTdwTfo^3^^t#)SM?yAIBqke2Q1q8v@7hc$`;78xy>K`E_2^cpOh;_;|01yRo0f;|X5XCvZHA#}mD( zn{hmk$CJFOZ{nDDL;hs1Y6p%R8ICjJQ;27mKgFwh8OPk9I)CcX5u>*p&oA&*#8pVn zO_1`7aq`?r{z#r+&rJx9c|GrCtk;v1UwJt_jnZ&VPu6u_v}YLv=SO=U1IUZ_Ji`L_ zZ_1DN*Nw#vY$3q~_WNSS!r!Ts|qO**|Um>&{ z5}yY08XJjwk_395qV-@bq=nhOJUF3fGoV{f{CNkV6P>QaoJ&<_YZWpF?^sdlMNh39 zQOqsUafZ32v==$GlB7>7nymRLC27XSQzYuE2)fzbQ20W>j&zY#XfCdTk;r3<(N*Rd z1!OZ1Qs%Ut%bk{Ug_f1}RS|D#9yHbxN<>uO{Bh zDoh{d6s8a7M}6;<*7Om_fIiZiyF4msF_X1~@G9RIUDCRI8zuc81vxD19KTQ*CCGBxq@J($Ym7Lu*=fDNIMAubMG?Qd4V_J2pC3 zj)6y>(m8@l_jg`c=kHS&(~Ke9Y^=&lz-B zd|d76-->UDk1LE1iTAnt+?{9t{6|}J3ec8ZJ97gfK3(N+Dh>+159!do2!-hUIziKu zsT!8*@S~|9C-c5kkdyu6RFKPt)6R6zi|wn!<5NMW=n$Q}<2qA^?mgwuG@4!Eyhx)f zlzF!`C1|vnr2fsP14vh*+{oG;?o5+hKhx1m!VqO;S605q(cubQqeH4)D9F9&d?6Kd zn-0H`3UaSOkEVj$o0IEULiCqi3Dzf5HMkPE_b*hWE5SEYTrRtm>;_xl)W4JMUi6?q z?y_-tgy?v?R4bEto#_r;YBWJ7z@1`9tK`HW-JxYqwHG>9!)y==O68T&AhwCcv4&jh z4@R9jTgP><7E1@5>m=0p=Kzj_+~hub&1%d^8cQoUvG7WP?b0qQ#b?a4$<-88YA-P-dV2Gv#{Mb>H%+Bb zwS2~ksTZwW)=b-^#ujm8d2{pP)pkY|#)|EgyQxQ%^!g4^xJ6$#`t)>T{VcAP- zgUv-|kP|d*#quSosB|h3${ohzq?z0)i22!0ZO&RHXM4>L#oX*cH0nr`y~~ zeye?hq~g5EAl0H4nPnmA86uy|4mENxm$9=t_-Eq$-F{^LxM3sehK#NqO=GfFi@Wd8 zQFRD4W5mf9(0?YQew`096C-F6FCIVIRfg~l0FJZ{d3x_O&tE` zPbSVC`}TtA&pupUy!Kvarwug1YC_LvM{ekoSvy=akcyZS3k}haWTjHxE&7 zox1AOS*QN`H(tNCi2CX`|K{Sd;>}gJj)~sznWsKI=G)X+zx(oEyvsTpyYlr>Pj}24 z(1J?19R3FQ+u`qp59+7W76|Rza`bl^Jau-d$9oMtN94W%&n3)1g?}0TEqLm?^@BeV z{xo=wrmckE0RLI|ufgwx=O`hvGz-!D0pU2j#UPIQD2QWR4B|kRf;hCrAP&VTh@*@Q z>HuO=fR3YL4C0`kxHzQ7AdVd>h(iSo;!vI@Xbym6&{6nP5J%q_#KA=+x9kvt$AN6i_;A#{o7h&6-S@u!3whi4FH7!-5@Xq=N7|3(m}5fsBgMly3`Pba|v zHwJO|O}R*8I>N6todicN$;Ht^CFHOjPFxev*I6hS+t<)dbk*5d}%0*12T% zXy7JbZy@b=;{G4V+ChIXkmrxN?y;O^!KB>4!9Yye4rKf51O5MAK=dh9-GJz0s@OhB z|BvuhAj4k<;tCz{3xz)_{63I!?h$>Pa0`(9SK0Wnmn*y#NO{eQ=ejQD$GJ?%8Oy07 z(i4E>V;>AT7h&3y>j?(34@OasU|+}c(ruBnN8Ac##K)EibqmJWzc74+@C4!S5XkTs zguk=$V=o9fY{2;c7S01=6fwq$NrrRmftV1oUuXPbl0VzFnHc9e$Tvh-BRoRLITXgf zqja>eLHZRT=U_-bBBb6h>3f7<6Mj+1IUUAdE?g~a5iSr;7LFAT6CN)-O4w6aEaZ$5 z<^K_X#NP;?75+r{u#mGm_{BJ%MC2zr@mAqygdAvL_*KFs!baf)A=@*4F}7o3Phqhz zDtuelg>#VPdsg@p;lsio2)7Hj32zmCM)(QgRl-YzD};-Me4k-{vxIEdqz4H(LQNWN z*dTiy(tO?%0S5V8ck3E(Y}OT^o5U@G$sAxk5bp)0bwJ!N|MEHt-iIiQk;i;_{~qHBqV?+z1wW5X55u%0BA)2-iSq>ZKSd*f|mtvTO8^baSXqRY=NG;KrIKE->lrzpeyV2(D7HYVm|3Ls-QI_A>D>rMVV3K2bYbWb65(Vf^61GdhJ5^*y z+#ZMhxAO%Nu8wKo9L=#HdUdnt4_ceowUWcSpq{e}=Qs(SlNYJQ*a-s;ab1R!a~}%< zcS*6u9VgjwCs26uq+D0)GX9KbE*-~+=uXh{%Tne)Twa!S8B0_iz6a9Xspr$i(aHWk zR9?1q8K09pD=iXvPVyWL43(E{U51lK%`rMBZ*v#r%VwYaIy~d)wqOv0?nyj@>9#=L zOnVqwK0ItpY*5d+pX&c946x8G#$Z9fh04peF5@*ebe|jA*GJgHfIR!i%x0h5$-6=A zB`7aV801UO9#7`*bqecsBW+c&+A$KuTcsKw_N)q21KyHSPV%za!%krEg>HxnvY@|} zw*&HU%VjvX4j|h)kD1b|*JX`tKGw=xH_jpi2Flm@x|SBnTcna~gFL^>tiR6fo$r>s zIteMSVV45C$|#?jq+h(d9!u9YCEH)xx{>muEW113nUJThD@~3g{Ph>MZlp%?HYq_1 z^bNZv{bdHvwzWnDK?ldyt1bicJ6XU}&#>TjyQpgMN#dCkh^RblIb z;(T$1i(81)54Q65k5Bf0f%am~*Ss}yB}#DJQn}>0wmVbuA`|R$2-$?m%eoGwK2W}m zkQZo+qI^SaP(WVi>rl3wU=!6S)t-^Iy|hfW&vSeN zw^)vpaNe7>r((W^I34#oz8k^ko;Q&>IHt$vV&npNJ>qe6@Q&+HX3xahjn(L&{p(0B zByHA_Y#O=59@n?+F$TNOKhVKsL)*`Pn25wPz;ONnbipZG;cj6|_0+bfVUr!}Kz@Tq z9C(ih@3c(=$vghQFR&B?VMj8o?Eq|(BZx-JuX$n31gwSmE|VAo?&h|ok#bmS$C`}2 zOg^=(9cllBp=nq*&qW706!ev__C9BqR*-BOdxg#PDKfSFQqnh#eALjeVvdz7zkrY* zI@%O~YQz-ZJ2tItA5OX2x3+|5Jbo@s&6iJWo4glk+mKf4X}FSwCf8NkF}a9dg=o9z zWu?jFaS|K$=U#Fw>f{%Aj3wEzykul=@?2js2gM%R?#{w5Zn$BXv-f-Kt=&QyUYGK7 z$IrJHWV@#ebIs4nZgLk1$DeV>u6)saHb1mu!8S^)kM?#QL22 zwktbO7pwZRJf>z}!5vV4{goZ&YFk_O4a~RgEmt$RBgh>svTZX}2g#DVb2ZoENThak zc0R6MUY^ZtAI_-Il=8~GHZxvy*SuZzqqe4$*S9^3_J0pv%k7=afjIWfc#asi7XMzd zYsmQ`$sQi>ZM{k9dw>CRPse{QmFd6W;&a~ybuFZOC>b8@7vV3@+k^jjZuj!o$8bR9 z_elQJ49Xc<9{)ZLm^^0`B66_!1IIsxk8Zda{j>o!@ai%=4%88uE5^hpMol4 zDNHH7IYr4bcn!s7S<2xJD7-fdTG+sR_~^J&50K;KaA49)c!t4=oCSe&-dqlw`bDQs z5B*xCxHqcSOKj%pLOACfPNcYAW>~pw0FEQ&Jim1~GN)}$D#uJl^tYAj@}gl9I&bb) z9HlCCDZ)~@ej8N9Y0S0%Y~=bb$p%C61Sq51`6O!|h}peOyWN`$azJm8oGPjOBdW|82Vpi_PDq&=-^yAIyO@)7F>^Sl>CLi&oPd{;g81Y!g1(YX z&@3nD4-_=t3UUJWB?WQF(+K){HbL{9AnJ5`7g|A104;^tQ@a#`OpShvf~dWas!=Y# zsW5HzLJFhVpGeLi{Cn%HI49;x#=v=VcR6vaR*x&-QsTG>&NlsZ6qj@3g6^N^1-XK^ zP|l5w=~N_VHgmexo6pwaa(E`0(=Y^^f}406+Dqkh7O08`DEr!vgY7bqk?0~E<$3uy zF3%lP9%CoK<{#%-k}LNVbFW7?;ke4<7<9t>XgT+Y<)Rp}meUZ@^M;6fCvAAybCN`8-u>QfQRrj*~ytET1)Gsr)@xSFaZ z>=E*N7soHdF|Sj;*$*TBF-MyHFyfy8X;PW}Fyfzaq}dN6z7^zB$}#(4#E%DgIZ3-8 zM)YA8V*~>0V)?!jK8+Ig16!=jtNyb)?&ekR$MIl>_wcGqk;?G&^x{Y3m?eyvm0>2A zIlUi2OOM{nlexA^xk|DMBNr0cyg0_(v1 z3%{avp;lhzMi#Nua;yBnO00NrtyO_r(pBgdZxtmo!RtHLcqUhufh_T_6e~^brcvhB zgJIWHE={W~9ER_L3SVMe-)^bJXIzU`nIbXbk|MZlttzl)t4A4Xt7rIHu%D08;H5KLRxEFxz4W3r2wJgf&>r`;!uToJM`KU?=-h&53-{#osf^$D!@?iL z*TkP&3*l90=U^ z3er&$oFIPm(4ja^&|@})K~B)CsURIC!3p9Q2ptwnxx?dBFClB3T&iZ92&v9=ht#{H z!vZFIkoy0u4&M-lY#HIAj!jCLol0+y+zUTHTIfP9mSdTcWNElUhc~5y++zLvQbAT? z>fZ@+sZl$rNPCpYa%Paly-@Qdn=YipjwP04$!I%{B_(B+J9MwuA%a~L)sL08JETU2 z4a%rvmx>=mmL;P&?q%D&@Pj8LZ^v?b*HWklY%`kW4)0F}&3A|H9XBK|7uAtWHOC#& zR)LkBah@&}l@KjU#(BE;;(4mCPK*sp9~U)0xbEc~JO{yP z2Kn)ar8SYIi=mB?mWQuwOf%ap9bB>e43h)`4mHIkkYiR{A+0If_~n=Sisw5C6FYVF zjHSyuk6+Px5G=;@X=ieh&(=_+a~LDyU^tWI0n%6ds9aSIR^Vp{e>%xU=-X+Z}7 zA<2bUT`klyi{;$1HDuL#$V<0yDFY>zMN<|oRc7qKVHRJxU3LPozAFNOX;+J{Hh~MI zpujbWV2Pua@Yy6-8g}uTCf|j{f-d)RqjhA-*PoC@c>jUjZJ^$izJ@>2v}y^Kn&M3o z>-nI-fwgnNoo&p`gBj%13fV@pJTQW*+-hcm8?lIRc@uW0fi~45yqHoBR^}nvNQ433 z)ybukcGcz@Tg_Ftqj3Tfw)Yhk~ z?yQ%^c4_uW{o((IHSmAD2IefkaK$Cd6Rvkp^slpfSuI_jNcDSzBB{1wt{Q{;Ssmjdgu(ce6&}xmc+RHE#s|nh`Q*;_yk>Z^ zD@o5O_|j2_CCFHm9I3M_lCe0s4hxd&MhwwXWl)HUOt5R0!5v`;Qp~?x52~?OGB8rt z$NyC9 zcnMAbQ4y}or8Bx9Kt~(Z1JGYlqj*&O+rF^UV|ap}xFKImjQl`qrM8GR;TjiF#30r{|8j@CNi$dwF)Gddy@sdLt|yB6-;$x9b@?v96Xe5Q3LBOK-V_sn#4L}b-7p7lwZ z_Z!pmnZWct;c0t>c1LJ$g!M*yBivV$b?54pc1LKRg!Sv}ozT7s_uX{+ZL+>;mxT3C znM9vj6a#Opn4pGs5U1qcg?6WATBDukc+A? z3ZfzcgQ$X_guIvxqRNiA*q#_fwH*byCPcLa1yON^T-1{22ZW)sPLm8Doc=y`V$JGN(zIhpCVaQ&tMQWI@}3?W)Rg=6yzE(RVh?@ zsvnZ;WAKvYZUgFCh|6g6frE-Fl0{`DCZy_;xTq4sAnJ#xsL6I6wDZAuF8%0WLxwvM z$HuvRJtu5nQ#W!Z0e4uo198KIKgTDU@|MAG7GF1o2l-Aw_)YLF;_C?V1?-DZ?j!KE z;=e7(KV?Jo29%V1e}*qVh;nvECGCCRGV=a4F64a1fUo@^_;^Qb5#KSL$h!`FE5)}Y z$TxL^v68~`xEFl&;yWwI=R4mQ!Iu!9o25?H_vF;|WBoM%DGkar+}2RSoB=s zI3UuEtra~Gcs}Ho+VJT)3V#ddI-mIgna@2ymgB2H^53TL&jIo7Q?*&~9|v9l`5y&h zvcHP&7fiQMcovZ9PXn?X6BXW5;Z)KkKks7VE5Z&S)mZQ+H&MMCbw$auZK#GXg}lcp^z;$|VA9i*vpORNxn3Iu6q59LVF+W#>2 zFv`vN9|*?^v5don^ZXe9aml+<-?S-J|TQq zxJ|fKD4R~P>qTEByiC|Ar1~lIA0y;+FzH@GD#DU}Q|HC|h_rUGj=dn7_Y=c+2=5kh zUY_Bf5K@Dc^b#Spcu7wZ@>x&%Xra4K?<0`mZwg-(I(tHUMDv{;zZkVCh}63#2Cwf5 zg)b3K6HXGIB&1#ie$afhNZS;obA|8fx_1cm?2kPq`cWaZ*qM$B=)}(nKPkLgc!ls{ z;ZorYA@47yA0X^2OP8NU~J7O(@j0Lbe-0k})??Z76`JAh2T z9e4_GE0F280GXcs>tZ0k^G*V;Q~XL`6X+Ho(=Pyy0?q_7eLaxr>wwL`THpv^jp7r) zCeYPDrY{E$14e*MzaQt#^!tE|fO~;MfO~+9-wkB?T|lO92Mz*m2Qq#ekm6<^ML;aoCzdfJ+L3JR`ElCOjjdJ04qS31DQS!Wd4B2 zLWQGkn(!8dBM;La@P206!7?Dz!Vf-e2VJ@NE26;6Tv49|i!~{_}ur|Kw-;C;t$|@5A*w4)k8&k-%L* zh%9Xf)&O?^j|FZAB8h3Il(Q8y<*Wqu1-1a0z8;9GE3E_e0pgq^M+1idaq6c1C4lgz z->C+|nRav(Fb;zK3j^l@nU09EMCJh#z;l31cP_9Tcs7vfpfP3Au^qn*x+gwNgwYPs z!sv^lh0#5th0$k33!}S53(Y>^l>ej+kM2^uF#3pSVYFSe(Cib=^gC^Mbcf=FW}k4z z->dlTiWi!F!Wn;;;HRj`*vTUOhUk6b7aBWRjQ_LZ_bOf(eOa{7v^Vm1i2p^!3r%}t{2s-# zoskxr_C|WQ;-6H!(6l$k?^66DiWi#p#`t!{?^L|dv^U1@P&}W@4d}v%#khaipO7Z9 zAKoFF$o_Y;Xd?Sh_ABHk#zEJKCbEC47ENUT#d;+_k^K|TgETP;dW&cx`;C>Ni72A! zXUJa<8X`@54beZq zLxrxGjS%Jkxzck$jQl@V{20=xpPGbWk2Hy1C;A$te_!cuRr+5lJ?;2VejG2?bWbV% z_lo~LX~=I+nCM6eZxYb^MGqv6^BE=n35u^f+VU?Iy;1Z{qPK~@U+JeP{gaB{r})2% zuI*#x_2Es6{O5_DLK^v>qx9z~eyid)iry=Fhv;};E3bnz&cBDwe?Mu+TPb-Zh+}>; z#ecHsEut?X4S$rG|&x8UE%7f9|Kp@lp5lawj=UtgTJ&2=U$6B2N^E&9Rr)cckv<{*2GYoH zi}*K?2CuVg(LV=$1!T7Ow)xT0H)+1~(H-wudZprji7>`HJ3dR5z8oK+#wq=F(cf15 z0@3#}eL2#rKE{i7c5N;eU9EVI$1%Sx%72RF*Qk8kRla(~^PxfhJ<5;c6QuVl{#nr* z70>Yv#@C82L;etvbOQqP*@*PV%N}o%U*j7|n$HzK|LOpJYJeuMpMPtBjx-u=+l!pZ zM577Rv~1~Or%yR~-J<4|+`Wt1t=R7YJA0hEYQ;rPeN$!$r_LRJrZo*0roA-CryXfc z`1$x(b3==Ct>r-}z2>yy8H0<%GO`RPMh&tmmFb2Nv*}eOEeeizmK8ha^l|yLvt%Wx z`J$Drmo}QsW-`n*`s%Trg=SJ1~3%)k_Wc&4pdn{k#)Fg(+Ut>r(_m7!nb)EToI#?P2Ixe>*w zKV#Btn&|bFW0}97%U(`j4G*t%!ZS}W{UIUQ;bjPAO>gk&EUGboNlwaMlHjAJ)3Rh? zPA^T6DYHByhICq<;1jE>B4y#vC{>V81>^Nj-F+jHZQWOaBa#g|^HSn;GhWi%>4jg> z&=lc?$kQ*U{`TQaneBa_!Jd0ow|K5|&dMMydD4ldKoQ#aROl+TuSvb#;Y20`&D!`S#X z>pOJth!KgD>&h|!UsGJK2EX0BSXb}2R~m8EQC0{8Sge|aB6O&&gf&G#X( z4grw_JRFAy_h4)+o7;!)e!2xr1LtUx^q31a?qKa@V~)W%CvPSM;8U7|yz5Pb{+xa5 zrOPi^!Jwc$WhaOF1$39Fd<&dBiM6pzzqonfnk9`*3m2|xUYjZJ^OD2yXu7vCUKMcS zu%StLS?p!s!-|F*Vj)t2@gcgED4((jm6y$4HWl~$ZoK6A!b0U`vzP7UalVnx$y?V& z`Lfx|{+`-UUn?%s%gnq*BI~=j9(*&U3trzBC6D_r(T$NjOPT-B^UY>2`})B3{0qjC z0xlrWjF%Yuy60`@rUFF*@dF2@U<0apW`U|@~B`>SJ z>;)KWq?>6W(k^-2X9PpP8BX%Jkp)i|bJafzRNZxO0S6t_t)t>U6fV|p3`Ec3+d7ax+?vT8Bs;@f9 zi=%u|8r#9mOg5&!xKB+awtlrBdkoq`Zc_4LJ6Ca9cr`QjK{daZnzuEYIJ7_#B!gj8mnt zJQqP!9goh)5RuWSs+=}4C5DF`aWly`~ZeAI;G~_mi&=o9u z&4u^$3Ze*O39XexlglY2t(C-b&YU~~_PmmcZv*n*m!JF2*!Z zZqh0tZh~l%z+HiDP5mYcW1034^HcT^;{kh!1wng=h0Y#gku|Sa?93vTI1`81EGuQ= zuq@N~V7cE$VnxbEVmE7)u#yuo-K}N9DrcFn2ib~>PT|de0z9e-E^Zdbm_z)z7fMGv zVny( zLB`?>LkHJ4H{t7Lb>x4MWx`HBv%+l^hJBD3qlFlP>r|X!`d923@`ZJfF`3wvWy4Ce zW!JvD=^(_o*#~9^tkZfqc*|gB0;MxqiI%42iF3D!ah!>(X0P}sVCafIv8_L zJ}YWL%TNC~J5Qa~J(@b(eT}?Y{yznLw@ltcStRhilm35`%WQsYQ+7iF1xreT} zq=(9baXfeb`tHa%%f67e|ELwU2(O1X@3lbIHQgK}aCJ}G$+dFA<=(vd+pGAv=DTgS zw3HPr6IYNq`R*EYCnFrc8T{*J8OHA~zQObT->yDO|L4#WL-_i@&kznpI1a9h<+@q7 zF1F(4tFGWWSgwKP8e6WDf4R)gbd=_AilQf_xd|{O=zUniG@95&<8!m(R;;bNkGBBtEUMoTQ zvdti#nF_(r2?p_VL|6z(;E?wwpO~{@|7+C!kP6NQQ%AvXro4- z9de9bE81n+KGAq9H~Q}wGAd1gA6Xf_ceG2R_l`DdM$2$t7>ol)fDc1JW?yHZ+1Hu$ z5E~xleTr9s2BFbkMqL?wd0?~y@uY=DU!L@fHr(hhlinlx8Sx8^{xaitEB;Bv3yuCV z<98|k5ycCm?V^Q7U!MFsZMe~2CcQ)Sz2X-}w~H1UeR=ZVCH`%S7e*7HagFB_;Y$1R zV!%5$k2EfX8wce2cC)Xs#_?_^jSJz%&F&|StKr7Io)SOxBI)vZ5z(NkA(QST(ir1# z;~uOx>YHs;{1nk{oR7C2L?#`N{q&^)`lbN=!vL-Jj8Hi{Wt`II3VHV#|DZL zKQ-^?nI=;ZB%4z0=J5a+v`oZftafm@`0V?Fd!HExL>Bju9wQ(5M_2IFBv*H7j9 zDEgLw3zwH=zH2sLpx}mBhrAx|t~aLpQn^LyLmz1mL(7+KzUzRlXRWU98ScB>%Hn^hylnGbCkE>4 zT0BbvE+Ef*-e#Ros+GK%60%X_@6^{;Riuemm%BRKewrI4&!ycXdHWzwRjL}bV!N83 z+AMijsuUf8^G!Qh@VN42+rPHlyg8XQnnvORyo>VE>__?751@I5l`rf5tM!uS5^a$@ zBRu3!<;yz%I8XAV?jG5ucV#Ck%lR(KHvhOz@@iE1yHvg*Xw2#oooIu;>k&G?x0U0t zaQ!Vr_9b7aZ9um2Q9(Lvztmll=h{m(I$~arT_|5C?Ir8{-tK_BgzMN1m~;wNZu}`uaP|NmY={9as*Y_k;`;W`*z-ysS6e8a18i=qs$ zu&j~=3A3&^vc3;=1n^AbH~LI?Iu?nZk2>78<{KYyNX~3o>2}7P+V+#F+&S~gJ=jX} zztH1g-%4y@Ir0@AUVr7Dy%cTtt$Yzd*x@vD-%7hb<+QdDxpoUn>@}L)8#8To!E8SX)wV(U~4S zi2~bf_{edVnAW!6>;r2GdZ42k*TuG#;N0f5km{S;{1(Zc-p2{dk8Y_2%x|8Kqg>9R z-3f2vb2|VW?C|;`F8X^O^6Hh4218M_-t z1+U}JD=cB+qdd=L{~d(Vd2>0kkt)Wcq>{zpz)Ym@M5gWUc`l8674zougD{nrV-l&f z4WOcxs3))gT{yf1K2qd;5m1de+2Un5U@1#3!vW9H&dHW=T9@aT+rv!JmU8ZtQ?w;K zwQE3ViZ<^C9P^{ooMqlEIQjx9es>mJhd(by(|oae@K-tjSFAQxn98**fr8C|k73sJ zhrm~Pj9J%T0$G|EW?fxTV!ew?euMDm$YW+*OZGa_%(|Am=2Dqi*OK=fX=YtZXff>{ zOl$V0E4dYiWe9>Pp1!!nW3)(E`VIWm<>mWII0Pa0!slVul}2OCF=kya#4!g~@-XZA zF&Ey`E4c~BEMcD6o6h7y-KIRvy8Z~q4e-&DiV1-Hcz)GPN=n zLSuHWRGZBqPyZBYftx`s4Bx-4D09NLI5lBg5}cqd4b0$vfHSb}zC!a$bG%SF#sJ`l zGqC@^n}O}@gFk!%wzCu;%p7YE?EN;xZ1{Hf^MyO@j&EE)Yv9jHbgGV$t~ z|8Yr{1{V}Wy*A+iI?El7OQvdchwic0NnUzCgrGCsVRKT@{9v|D;F=`M9Cvt6GH7Mcpc9IG9YO(uEg`TW$+P%p!`1b2@`?+Kk^#9nD{C{XB-ri9E zfq!08Y`Vk!pECB|!R|nz8xJkTVwek?yJ!xX7do>A{tM?5S6bJ%cF}av7ybM66!4n* zZ*vJq!uwcO$GqIRhB5i$$(K3o5|%1^m^MYht|z0hDT>?0#HZ6xM>B2dE&(c5~q{^XKhem|Es>T~ZquJ^}(c1|Pp9$FB$4t^v27V^RG zfd3%`x@!qCVm?HH?s3HN6UIB*d~AZ|=N{d+;Qi_Oc}?2IyYpZeeb{+?WasrWPe2?$ zK3V@Y@XRkv27)tWunt^4Wr(NmPDVJ&3+hv_eK6eB8S9v1rg3;zpPa_zSdF7G(h#Ap z1a%~+PvP_$o>Rr$dIrT26Yw;q|^L%I|y9%D;m?y)}fNz3tg})Y_ zAITiEZ-@Um{2$=?T?jCrm>NdqmoI*$)V3be)0xzOOVP zW{`qh{H|6)e(o}e-@fAFS0;mA1&WJhWe~>$6vSZ;264pJBIFsx>i=ACd1oA%~YppCtT$?7azKRn^rtd~Uc&E>jX93@X-(palm= zfM7t-Ac8>?3=jqf3?T_53Q5d>fD)uL6T+JQP$tf**fi*2nqRh)5X zi!)B;f1bUceeN8veZTkp|NrZTljp3p*Is)#`|PvNKI^WXFFaJp#VGv$)_!a6Qh9C_ zUMsvp*dpXLqW((ZDZ(kjNy5X01BDy|m=0i&?TazX*tcNm*!Xw+4sbB|#4r&3GsYhz z)^f2bV*J7z#2T+jhcP9_E(UoSI~t5VCOtAW_Awa8O}ZfYC=5PL7{9If0sdd-_p%Y~(GPY$L|#AkN76)Ix3Fj;g7K5;UPQ@gq!11_?s3c}eLo`+ zeos0Fe${aC8TODyhj-sAdoxqe>u~WI_=6JCH;A4f`Zm$0ioRR)*`j|bdX?xcqT5L$ zZ}+|Me$pt9``*WuT;}&%$(x%E9oT)p>%*H5^ahoGC~3&QEBQ%^|Apeu(9OEp^kC1s zR`Op-{$9yHD)}cBAC&y7ihoS;pOZ#;b3_m4O^XZUz89@Qn`Pt1ci*Q6l7=q#y_NR? z=`!hmK=N}{p7%lHlK6phhiIDfiD(-4NDR%m==fMaTh5V{d3E)DZy7%+5lgBLUSWs& z?;!E!R~;qt-;oo{mO4n4+%#+N39Kp5AUF-vi@UxICmLHt44R^(_qwLg;Y+;yDRofF ze{W49sku`Jxh2?JC3jC_xQR{+3_H=?fc3zTT($3Kfo=^Vjz4@SIkD_~KhJ%#H~ZEV z%}*@6H8_j+Zeh6ji4H+*!z4PDu=1liHeCDm#Z7EIo00DWB(C`qo7Kn<_uYd;S=7b2 zg6ODd5d%5d#|NoE=*#KM+n2_q|}a zsI$dg&}Sx@amy7>Un)Nk^xMne?BZy{8yE1zj09g_3cI+gxM+ZoXTck;=TI1vSUoqA z>Pux8_Z#VxI&YrzIU1N$Un;ver;o3l3{KzRy_7GNUEDqDAJwW{skx}AKlI_T&5*Qw zsqEr<;MvYlr0e_Bf732*YTWhwkPr0O5LZ6)>`rMHH(UD3q+>Vqv8c3TOLjXsyR%ew zaqFeer7gxw2=&npOHGQ|P$WdzVI}w5Abn>mNtqTBoQ9ang6Yba$}VoO`kU*|&Q7cl z<>UQ^?wPE7DedCiywufqx9aQ47mq5Rv5RY}ncp1mM`Nza=k)RAj_pUk)g827N;|t+ z>2u8%g1+dGqWx0Z*)4bFQ(?j?Un9yF({Rcp>iQ?O z*M75c)0+O=ar>pTv)de}Z>|ObS3Y1&wVhpDDmy!82e?%VYNc;C%7@nyhL|cleY}eq z8Elp`PPwtvYWz7BzT%SB35Ui?xSZMH!%SHu0t~d~pNUAMAN6kN|SNogMED z9@N9)>A8!ueGkUYZYB-jawfO^1txZ|t4qHEgBJ|lcEW6p?}sq4+p&`>t%=a$r|C=P{~HZdLafQpZ@;9c(kBRo%TjU2}e-RUHc0_EqufaT_SGx`5>? zSzW*)jo$)UsBF>Fn9P6@xQr2}z zIu~S)#bK(Iu?%NsZ>Ugu*NC?4)4=9RczX8%*=vAouJo)P+1KFw9rCjWcp1OIN!AMd z2?bA#N;?;v=Wqm3q?{c%S&E}m_Z}<+%*s9hWc>(#LK)qnQr!p+Q)OhK#Sh0x`hKWx zCmb2y!Jp2bf)&W%?x$HJ&{GOK!&;AZX63WTf=!#Z&al>d2sjlIonfu_0?t|V&al?o zf%7WzVXgNr&d2fGTI=m{q_x)j!lkm-dO-*pCDvMxrg`;DYpwNefbepXvex@8=&ZZ& zrziw#J->t{;IMijSnHkP&S9-be=J8Jc?i~e%N-xqdROC|B@9_>J?3%@No%c_k&pA9 zqwuH4xri|yQ9$%Q5r1HtcL#X%hyv=*IPG$5kKY4eo9CJ|Fd%0sBKggu>p?vZ1i(y> zl`Py$0a81o!8Z z>CuWD@A$eZx{84h8Owp~M6{UJIb_>c3XgLQ)zj-1)K|8&Hq|&C5jPr^!}%c2&|5op zma^U0@jdL!_}bG(MVaso)_u@{S)H2)CNXt$H<8{5@FEYd z(&LitGs$;lJjnjrLKvD@wp4+6xjGWHT#!n9ul%BjH=tz3bO*;ip%0GH7Y60*#JC2) zLu)do4zv?vz(d!!`=b3<5cJI4`q3B6f9VU_)vftxKo8o~UG&(?TWS%v1ji~I*Wp-? zV-pU(Y`AL%(z^pkG|lhoq;F#+f_Xay?jV71pyGEJ%Ja;dFV3C3s|R)PNLG*H&zr{{ zfjGXc@;VI0!Sp+DFhuJh9j}9RcQX8J!KLk73L;P++p7~^c!F4Mp{(QcdrJrhm&Uo| zz&Kua+Rf2kj{b&dA4j`6+R@QYj<$8QpBo#zd|mhVUU`;wbK@F69!0x4+T76>5$m(B zwse=H&bQ$B8IC7$yolp(ICyb;;W!kBvpM6Nm)1|Y5m$l_9gSX{>-i*M3O$nHcIR|(W0 zd_@?r;u?!7k>i~OTxXs55$t~k!!@i7>G5+-s~8VFXi_N>X{Fuo(aOSiXWl)AwcR0 zi|!4io)3X&v5a?x%%Ai3SVA4mJO!Qd0aKwN%f z7sq&}ryU!B>%9iiMZdK@9nDEDj912f4*lHN&(Yql9eiBh82dR~ zi>&3~qo2gs&!JFRwcum?%bE*BF!pokC&qpb#XulYHJJQ9FL;p4Xl5`j}LRKc3I9wPddX^ZoMBgI%V$$ev zMd&;XcacWNaDKEli~cz}4a4)I9}@j{(awI3KK7XYcZ%;X`bE(rNax_AiRp1zbSI7c z-FLnw$$udE|00c!@4nl$i@sXr-6Z)m>7yk!<$tJnW3LDOTNTeA9Di;lv& zg0Z5D=KUKh2T5(-5_KoHM@!E2&CX)&sS>Tl{vA`deKKj=*Lp-O<@_QWQ?G>jS%a~} zz2mGUTVf5Ze6qcRn31+>+vie#8%wzugR~?${Cjq2`NQ*$8f6U8j2+s^^UMNC)3lnZ zhNkE}iIUl&Z3|%#2;)G&(B##UP7(4jSzy>D8AtP-hzI5{ChV&n+8B(l3{GD-?0MfM z<6GLHIX!fC!EhKRUktMc*!MJ?DksB+9YV+Z5sgo`a_+au`5NCX*ZfVcFNGaishJtV zzCjAc>3P8Y!UL9dLaUo8hSsP7hN9E=_ z?$*hJJ{2`ittF%Eijvxm6{~!^mAWvld@+TC%--zAiZDlFSYpB0*|2^ zDec;}$LZS|S3Z3;3lIlxk*S1Rf9#nr>;`ANrKf~knb!^v0J6VRE7QDiP?ESV4`gqUa zaa^k?160l-EsTf#P;w5#1;aC!kL@zj2pF2o!TT0!{B?Gm?sG_OfOatYM~ng53t+(7 zjRt6ZqwLTC?dKF&UGR5|($NNJ1#f`?tFtI;w6>xRu z%8j2fzI=KaO!OwV?I~G(B-`Pn)nkXDEX#~CbT1mi{n?u6%_pzzbJD8|Dh;uxxb4N_ zwnxEQvALyIX{R8{Pc%L{(GiJ>MkvvM=tQ~Ei9W|<3C{QYoZe5%-)ueDoj!g}#ND2C zk_V@L@RJ9lzB;HtG5^TK);7Rv6wF;Fu4pf8SuD%yaQ~K900wLvsm%jI#iNV{8Uav76`zX5Nn2NCw9C%+H_|TGIo#f`MaL z_|Hjp_sJu1=5-Dn2X0QNS5B8sI7x${U)Kkqk_8G`E5~lMQ4Dn|$mvS|eq4I$WUU;# zbCZLgfR}X`PO{r^7RV~VX*aG%g)+KEbms6nu{ATg56EG!VR=vaw3=WlNWYJi(OoC^ zO2acCdM7iyy<|lE<;D8s%Z%P(EEL&ctaG9#y)F??dR^l^>2-_qq}ScK^TW?^Cu0db z+d1ybN!;YDhuaOUXSAz7?+7$78U-PC?=sgXO;psMaS%@PzCzRf$0YB6#w3q+F9~ZO z#u6@KaOQp~Yt7I8`)uM8@--H57-(#lLBHq}4p>9BrCr+7@_LTDfdNYxYLzB zi)+&{!KIofZU>5&`y$g~RDf{Lq^o_A8SZq8&q~PKrMkrzaRnA5qWBSCBq4A2n0nb4 znc+_POkxOl74{_Z*QNTqSg7|wl0M8&RbH;siU`Z;bPum24d!&e;On01PF?CG4)>hG zd;Pp-@L9p|W`w1|${VO2i0(sEe+D;XB{64oy7?`g0flzD`P>of6`k@|2x7VH_!9`R zT;GqBpggez2^Z3pV7;$ChF7d~BY0c57vX6Wu~%;Lb2fe~Jtg|NlHIo=|FT+oohQCsdhZ>0llI zP783Y2g^JEYaxuB^;}3=2EGxxzD~pf&A%0VnCwj+4 z%sr2bku2)a($f|#3~=^~c)v31Y;JnUy3&5p*)0M;-y>IsyAG(=vbN!Fo8|(Yg?opo?wo zWN600BbR~*?03<2rsN?z!)H1dg5dFb@me_^*GgG#+MBYhv@3Of8fk}0`%-6HO8ZmV zp3*LrHmO^X?s**V;rIqe4(c-y2km=kdq+Qa4LDfGbvQWx;sOJ}<7$HpBiS@$?Z6+g zxB@~JmqU615xA;D7FUY2PRwNnvbYu|7FROJ;sS|SyFru1WZDSzOU1lt-?jZ(ZYNopFfn>J(oc{GSWrD0wI?&$?qxbBIICCK36`8FAHTAonh8+ z!GBczUkEn{e3%Srr{;9%g!V`qY3P%c$5DpM>*_P@5i9f{8gzpQv zG)(?h;b!5_h4%<=75+fzt^?np@jqjsuv&PEkn7U;pAmn(xETid?0>{vx*mMik$y$U z1$5F62)X=D`dZ-?!WQ8|VWp4@`;mC+OM99h~6Nd|BqE8fqKQv){o9IVHGk*q7JQ(j5qrSsT zbI^xnpTQ4D+-KO?_Z&?cH*6jbhDybk;bvu6BHH;cy+U-W;_ncBo@oC5pZaeV&GDY} zk41kV+WG&a_X);3zdqdGl=QQbA1V5I(Iuka7F{iRm+13E2T^B+YeaV!eK%>eg|mNo zgf!~z>{s3;je*SBpX?F6Ts_KSA*~E51VXU82t+jq_Ey9=9v~ z;Y$CoKSv@ES7-cRF~uCR%8l4TIPo3!si)hw2Yit(|!pr*yG zyC^4Tft}>TOmeI5_yWc0abIto#ap7EQ?zmU=D@moC=D><-Gv%sYUljZHm}}H9%Fh=lVWh zhYrl=Mt~Zr5q9x`g0Mp} zj^^4A56pE<*jM}dv+=BCaQe34#d8QBDBse)-sw3&&#|d0NWTlQ)@O1s%U1RbfA?lz zf7w7QYD|A{y6{LpsXM_;B@%pnDeUVT@N&VBXTdvpm_6Bgk^lTmsxOs&{ms%Rb>4;2 z=V)M3eW~p0oxZ!FVYD!$zBFN(3SH+%Dt zUJ#Zm)lQYK4Ej`NS9Bv0Wq+O2{(qJ9tyX`jEtg_JOyhwkefZu;udJkxA74H`lBVCu z_I$0b$L`s-{kEZe!x4pPZCv>}wufI|X7vri{G4IcsTSSe#PU_mk2bK6FW)w_7sFIOU)49|?=jZSu!4D#Z>)&zFEPqMNMFj|J8YIdRoiQqzM?D5x{BH?;Ub9Xoi$>m-H=%J~cs3v{IEXVum4dwKu@{?P1noZ=|FI;2w6|L*A z{Zjs(pg2z7VCahrao3~c-xHKcUpp4f81kgA80A}TIPuR9tB+TO(eZwAcU9U%n=E+S zG*2kL-oF+xm)QM2A=U2**3Yww21(zlg*u5qQhlj@Pw+eGyFuf@-O@K37y1?e#7Eq32BijmK22iO?S^?}wx8M$dbYygNOw9nVHS&fGnVuIBMz zpFy#>F7&N~`8`1ytku850|W--L5!=#tIcF+4~*D*e?7&pzag|e3D(NZEt$slea>S@ z^^8en>QuZs2kBp?;F|8O82)4Oe>pGpbb_ZIYxPn~6?Y2u$)bSC($G_K;W zfMI_V5R(8ti`jNh1k(b=ZQJC2m{*I_5$IXWWRa^?aEDRD%e1=SOnY8zycdT~gUevQ z^-u)q?S$mx@~pBUNDy;1W?K!hKmLHcXXU>r;g2lfrnq2O3c=?w=|c22Uoazu;07!B zV_)zUoF)8l1XYRo=?Q#0o1dSk`;F~{yzWNA=t@M#t##_7ndc^B&KI+7&JHxyPR#Z2 zLmIk`o`Hyn+vsSo(8X)g+i_#sYozuqUOhGwi3TH4)Ljr8*)?h8s@zPg$^P|!XtQRL zY0(Q#imheAGhm>-{2OPHrDHmiucXW>86B@=Rh*K+Nt8@S?<-iqh^TH?;S$nOw%^qt zI0X^;e~hX-e6`#2RqTTi`&-i{wJ&n;03$w#$7zKJ+pWzAp5PwueK8Q}A0%M2pv~Gx2NIlz}gr2ft8b^~lD2o; zFMW0gTF*ceEj!*c7{~LH)%UPXOWOY7UoB`tK5rv3|Bp<|kzyOiKo0Jc+ctxImgJh= zAK_lj-;4^Cw0*JXPw%cV6)m`dYW+M{Lf$+plvB%66yOUy&!A?Rk^Bd>!fW|EC94nF zX(LWSgvqzj>cS{Vp)E)=9~}N>1zDJckAim`cqq;#D$W-uQEA%_DtOp-ohQsifPP+! zlUAR12y_1gW0V>OPps2Xta&!~HxME1Pdee}!OQ=nDbp65MzzJ`B-ivlG^Q=$az-cZ zV|BlSVa#Yb#%d{Pd(V)sa(FXOPv_FTbMeuo+gf`TU$kW>3Vqsm|9500&9f49m9lX>{(CE&mQ_{_NDyd^ig(?iCghwv(J#>N7*^)e;IFi+fe_*piRH9 zi@GsN+Wr~UOsLBA<51Ss1s_1e_&v{=%QEf+%iCeKPTYnFUeUJC%x~D9LrxR7;!o+e zkFrmH)Rf_)?AcG@q;wm~mOdM$IA=AK9&6g+)#BAC`6XNWMXDW{B0#DQQu$A%7&Nw{ zmc?yr%*~9cM4N6ejp&G)xNV6o z5<+J(7fqwUiK}yW@JYV9;3=rKI#z7XUdf5tvpUx9JL-NKXGwlmreTg7emrtv$1SA6tD z+aKA$kqh&f-yhwN8~=$ua;z=TE)31Ku=y`>URa2zK{o0+M8*8*@poY07T_-++c0q~ z*kb5cF(Mk4eQ?D7l+ryXwxUFn+n$Rm>$kng&vQsjdXe|o^0Q3%8D-=mhbQKL=3nG6 zFY=z)i#&E0Dv`-r;vVmf5_+p1-56N$RO_h8d!Cp)`md3T%)x(VLII-lZM_Op<;0PJ z^-g*v_^VqCn79%JYoOSwTCusc7Z@wRFb|;@E!#|(irbz=4KMj3&{~FGVk^R{kj`>X zULDLp?w4=~;|v17UR7EMjAOz1Th%8b>fU84=#w6+&&(~O9`3u1%sP9Y^5JeDgCb9hR6dA~7Fb#nus>n`WsZ{Yqr>=mVm&`n;l`sZvk z{5ttih(2aSb!Ap;*3Ff@;&V1M=Dmo-xzkL^3O0a;a)LLx?Qs?8R`BxwNU_xgmz#KVcdssZ zp@_o4L3j-uigAg3d!5y79@r(Tjn>k(cWv4)t!}@Che-c>hL0CPWT1{Z79F+Vk5T-B zH8wGFU{A9O?=<OYN7U1`ZB#xvRG0vCICM^yZ4{!yF2u5`Vi<$DeSX%HkyH zow`(QkL5pQu6&!xO|#BC^nurqaAH1&56c^!mtxj=#BMxEO4{CbE!cAGec+`F6=mVwUyqm=-;6t-pR zUw_9P$_Lz+#jDTXR@%0+wCy#dik(}SJ$oYW9j1hs*L;nK)j2E_-p?Y%U}`fmep2Yl zTkuol=Zb@wtbN)~ZhI6><~LIg)Vwwh+rqQgFEOREMcQ53_Hk@^#_xHfq-_x88l&ZO zC1R#UaYeuAgWb3QZR@)6Ex^1nB^y-7-N~Y_E_i^&_6Jnl@Vp1V#kkt`ux|eAQLkhj z7;RP3_OTt~vR8bDqN%Hz@!gCsk(Z|8)oaXvGdg5?F;z!DP^YXOgx72HQs+Mj$A(ag z-y!pow%2XztX{*auXw7ZI|jft?f<7n1VR^BIx;J!lII-P%ds7czbg=7%@} zLoy!&gxyRQ+ zI=Y^=m7T!K{@tkK?-K%(tvaV>gRgEpWV-rSE-<63U$#Jbw@x7@H9r)Y>IJz$RG`c% zatc21713>Iq?$cYn@G86BIgD98XlM(FzQ^opRtGtfthq`Y|@+fSuyF?FnuNs^STFa z!QZ^h{d2NT1(O{mI}e=qKxFm@nU>8TTp02|L(=T}YsP-ZkhID+=DhEKZ1z}Qx%93kLFQVV=VUPzcI3+9R^s3X zdc23^+d-Hexn2XojlulH+88Y3PmnObt{7tae#RT1`RjsC-FtqBG}yZ9Q*h`qA>-Jd zM*-3TnSmfOtY?Oyvvaa?K`}!wXTD)&MU`PLI4nabC*Y-R01>DP1YG-1L+|4S&ear@-*G|UW!i(C=Y47eZ^uw z@&-G7B?ctaDzGIGaLF&T>T#h%IE!@p>7@LoY6F#S6m6lRKaw;pw}ma2*BPe4Bk(8i z1Y;NA%u8cW2t0?I0E34tGa_ z4KBge;BZXpZarq@TmZUXH%PeILG~zAhE34Tsw|hvZboJHnU3sha>)FcUHbIs@f6Nk#xDB>dc1^l&P=-;(5=VoIA<5?(!X2wH#pDax!Hj;I|zk_ zG&^u+cL!-wnH@N@`#I9=z?nS|WIofH9XPY^gsKT7?GBuo>rjlGUxHcGIWww+r+~u= zNayT8kF(r)&p?lJaQ+#RbnX-AvBvTH2D006&LVX-J8+s@LL}`DoS9!C$pQRDQ%_nz zWCZ#jNa63~;!nDF(EZ>A(=!eQ^#x7?4Vj1Iw9ETE&tOkK7Io-)P|tioC~zQaW0Gch z;rGD`j12?=u0Oru_p1hoMf%ku@FV@|N1$wn9&0)@oh5qVz8F;k6QRs0xv2-cD3~+p z&_ALq8~li}*`W3_qt3(tuh`{G)o(nN%?jA5ms8~IP6IQ$|rN5_I1$NS_jTmv_WR%mHCSFN^kGJT;JpYV^jG(d&CCI$q#(lQ~2NxY_Ce*T$K2 z6?ib8O@W+DcJ55xG?_mFH)jiO>~MB;r~fH9>|xoq(?0-`<9W92^pAjKU&*$eKI89D z62j1w)3s*+5DaDV{>t1#-A{tiuSeggH-fvs;ZWXVKi)FgKL^PtNss;Q9aMn&=A4eY z5AJzrRR7Ebheha_KcGi9cRqYTk6t+6j3hlr4CpZg=Wp`7U_g)K-1(>h*?!u=$f8rW zpL~cReGP{hayk;S>OBu9>1967^7IEY)T>)mdEA7(7k(|3$(em7ooNotK*dAB{6J0? zUpAltv6;9?Ieie(FE=+Qi>+e#97_+$>XqIpD<|WCtk*8=_SS`6d*D*0MI6hec1;(N ziFG~~@1!o;7hR@x92auV;W|e!8(S==B#DyJx zN5qsAFYGcL_05TMVb>$kQ(e!9f4p8J{k+iQyP|b^qBZaf>KVA@`$QtsK=u`xPEUCK z)EMdC?H1b@`>FJhVxs*ciAWxBsPUuMAD7L;p4HU!odIACL&*QS5kKgP{21e3+xr&3Tw9_oZfS;T{R776)gHIw zo0=*mIA!`iZg?BJ%`LP>cEptj9^{AnH6~_yOY6KO?1{!@lWB54wxq#c1IxhHpm2wT zbKD8g=x+m|3QRP1@wj4EB6=fHKMnJaO^4Zuy%%xAbs7}tQj(UR+njb}Ke#bGy0`zQ z56-?z^1FSyl-zSVq{j5?a?3sNcbGOr|5tX|9=a!VlKJ=iRb5K1?otw3iDOlllAH6o zl;-=odLuQ}eA*>#L@ss$PMeo|0~{oN99obzHaGN8r*lFrojSLq9owfHbXsZdJ89EQvd}GWza2Uvv?8sj*GZk0{pF6dgZmk6qjJ+O%ndD08`&#uO7GC~ zp|iR?9coV--0QO!x}*(8T(3}T+N9p0+AhBf^$HbqT6XuRp^rnuP)L*`^g`Nsy&*j^ zH|@|~S9fYk8x-i2v-M+et_buE9n+~U)U#8+mQe4|xU_-2ndFe%v<1CxOdHti^8z&rdPF%Nh9dbE({q3X=FGtW&aOsTDhsi+mBM z&t>T^!Z-UOQ{CxxK5M!=-QcsP`WkfNq8{-@W~35%!WT&>j?=Qq7n$l#U-4Pf-RZ|Z zE1@_pDyVCcq}iPaJxDMlX=5kyjg^4NRCju?pK7{0b&KzilDrQt>Nr2u40lS07Ys@K zgt}Dp_hUs88qA5z^+gi$cHaV;eUTaNl#YX};_3Dz^4FzW=8Gic?L@BhMH2FM3-u5B zB8k01QNQs;5;Ahj_4GZ$fQ#u)H)_C3(t0jcwl9*P*sVYR#uu64PRCNKYe}fL6RGt@612G0O@BSA_-dDdh@*0B5qN+%@>*BPXF$+rn}QOu{yxe$y>bZd`BFK zi9AEVo8wNWh-Ks)@jyh*EfHUUcVQ*9Cy~FdV0ZhaC^rlGkeH!TU^uMM>7od0u}-gw zu-qc|uOh5J==7Bc%N2g4U(Ry3+I>cZ<%<4tgyq(^KaH^5QukE9g5@i9>Xx{Z4Cb!R zm-=;{>P}tbp+$F}@5&M5tdWHRdq?(lgMAE=udw3mG1OYvC_Q7#nYsr z*4I?&PF*Gxi|DmyPW!KY?Ni<9rP73CMe)g81Dqxq81d+At}x)ubEi@Hm$`HIVIf|z z=ed|`eMJfPz5AT-jW068o&FO`Jq+kF%P+8}k-sioP(tXULv&gZVJ*_>$_UGSSGYIA zav5b|34;N;dh67EUr2HXxDvR%zc6~bQE9@48Pb@ zUF9x|ux$AwfB&HgW#5Mr|y$T5|7+2RZ*nL+;@}HA}puCeIrTIicZnR zeyXX7sS;*Ft&(=4NgCSa`MR$-;j!dI-t|Swv#>0~FkXlfPt)m{5tjQ>ySj3`wq!Q}mdhs{ARP{yD;OI(zww z%AL+35!NuBx^F^BYU{H5m9KlMJ9T*^xkOIkd_S)l?(|WgHQk-o=snO32j_~oHJa&& zhp=XvqFr2;Ykd9X@98uwRj3}nATUghuw3p7BP>^jizBRSbb3#O^|(&mmcCH`j#z#C za+cFNi{a7;>uR0yLn#9ix{5s(VZEkP_uVYX#c_4M#;@~Kcj{_oh8$NPr!wg{^qk7> z>X2kaaYb=Xypp^vIuY*Jq`Fv>Sv;9;v-07cvR>I7{rMk!$Dc`PB_l+n?30uqf0uT%9`UsZXjRNUsPD*vTUUyral^|DF^3Q=E|ky~p|(gZHM zP0G%^`#Hj;M?o)3czScyxF%duGP5+ixTdKYOOfGGL-WFe;ozWt!I7i#@`mOOEf_T< zJa`_w&R2&KZDdCbEofd`Kg1i>vZ!%bL)9WI`3}v`8#!w9u;~r0O;t4x?5gcB3-Zvj z@B1wrep+4}m^oms`A%Cl;wKv!Z84cbhYxyXAN&TM&1Tx~kbZyG?8I$piU;(x{m@<93 z-F(w*%6oj2vMJNesytlxvux43N!Wc0%p&;7+~OFk=x`v@>@{QEx*7Wbw3;l;Qa$vS zw!#U_!Wv6PC2hw32lNrcuNPij{bH@6H*?k8ucY1I+b838-iYS=t&q@8mDSZ;QAg_< zuWXS-h=^LxPmFJ_X^D!Du4)q5mWDOr`FA1nu0yP z#eITEESF8l4J?kYSy;Jr?*f&3RTlYtl1f{YL`UlIMe3Z&rfM`$KpGYpSt(g5d7pJsbDA%X8iYn~@y86lul;HY4WUx5ugjGiVFZ8V}P&7MDWm=d?5FohK?PgGMl&z0kw%@AZu>OplwQ_Yly zdOKhlWw^N`>D&ewb^hHyzRHdVF=D)X?N%b=>#L`k8w8`$bPPbv^XpLU7~!ZpHvWFM z*MCO6zO7Y93X<5}svFFHIuu<{kLOS7j#t6kJ8Ix;hO)?Wix)%t&@966fG%zy6<(zs zti|-74ql}@_572hPb05V&FV!xWTZQa!r*`_V{e_P=cBu4&;;toOMT1vjjyi8fYe-rC%lW8zI4&N zhK0?zlp3g}O!vQUt5A^~u~$&!`h@Ref@P6D}GX^8VqRN&r9&V_HDl-Ukv~o{~R!oF2 zC~)ZG1BFqM;oNatrh1SlZQNjwtYcH+mW|z241>JW2ZJ;0m*=ia)VwG8q$O%* z($QQc`n}hSOh;nh*YKE2`F@7t#mzdBO*eR@?Q2ou#dHtQq;Dq)Ph8x{e3gm5+^HW{ zdZUhd97exeqUd~$j*3nBru@G?7XGIIi7jy0VPQM%z+#Ji>7!HnFeVh(S+eEma7%5C z<9F~73D-57WOa+MTE|T~p>5vMaP(W((D3B>;iV0&;pUneXhi~lK_y(*LIn%!&Z=3s z6mgX;MzFG}CfwSL9&HMNhg3^l6@=zBVY(N_$Zi$`8|H^G8N%2f#v3=2HKFVcoU6Ms zVPKhGw*ara)nRN{fT65~nKXnKHdKOx;cY=fQ(aAScz#pEqHs(u;0_HRUuV>YanGOu zm=JfkDbbM_aweca^=H*Ih57PuZ0ustAw^?QN4sgJYr}IY)le9v&Z?;%6F#KKque1y z@uJP)b8654ycitP;)Dm6vjy?L5=CypEI7<3YIuHS-9psVwjuMfFSXU-b82hq+02zy zE!fx+4bV`9XGu-<&><#!`|M{a;tDv_M7Lt0A+{b-Me5SoMULsL+H@$7T#V8QmG!I~ z$B$uF!!Y|=<=X1IhZKD`Jg=sz5)*#3L%6xMs@BETEU9a5LG|j*m0;a@c{$e^iuY*L zkK%lH`mcke8Pt`dK$oRMLL@iZJs&nf(oIu(Sg5uj}G)J z6CL8?_2tMHiI4xTA7fAAx+ zy%^4y9E5&2Tw5B(|40Auw&k_{cds|wgU5fue_G(*X@M{jyRj;jp14O%f>=lKv_kFZ zzWwivXFhoerTfj2vC>%%Q7>i>Zj$?4#a{Gink9v=1 zzgCfb#k^Y&+wb+v&jwxm-Y;KBd;2##AKP?(U8nvxo!9BF`}bOL%Z%@?IQEUU+cyrl zD}DDt4R4?P^uv=z-hBJ~w95D2-fwH*j+Y;qw_x#=a|Ykgb8Op_8?QX`m@CgbYv;UQ zoU|9?=zd7&Pi~-}Wz2KhgYoB=Q z-dV+8cAnk;!m80LuRCw_u$P|T{?4cV>XL&`{Z-2~U;f~ndFe}cE&lMqskas$ z{g12ua_&dB-|+J1yDog?o|gw+&?7kI)t5i1IyU2i&)U=Me!rW6+i>i_u?q)(Sd@b! zj3W<65soq(b8$4{SdL>Yj&>Xyacsu14aW`~yKrz3EeA&!M;?wM9A!A>;%LON9LHK5 z?Kn2#*o6CzICkLJg@ZRG zeQtztqZ(sszlo`ejLk)V0;Du9}<13(tpew0l_$40N$?h7|$`F zKT&y~mHy=_U#-&9>i~oCumb#A`e~R>QD@n z*F?Y(YCq#)2K0IAFLVGxc~{>?<>%^qpW4H<*EE&SmEXA6LVDL9jc*pvx9WOSE4^!v zko3Fu_yn@d-}T4dig)!fu0{~=`v3llclEhKw5yNtfdhHh|Bc50(60Yqq3h}Hm)$C# zYp*KByZ&!nV<5fj|HeBR=;bUl0)NiMQ`cYLM>~^t{oS}|0`27{- zd$0}JZY&$i!#>FC%(iF$W*=p}*cR-6Y*W{7qRWk9B$S)aKqo_ELOw6~EM-8Gqplgi zbTo%GU?mU5@=y%(3?`SiB%i}H{^GOPJ%{-WJ^%-w!`y#<;+IXwaR2#TLwXK-{p0)Y z=l=7*Irx(mOt^V)y>+b`(mt{%rlIIh9* zV;sCUpTV&M$HzD_a2@Eej(bvbpK9)1U4!F799QAE9mggdbUgQ093SG~eyM$N9EM{Y zjxrqVql^jU^TkG>ArS_pK1MizZRNQ#a-$fCimSoG3D z7G1U|;fJ8fdIJdu0TJkUg)DlGkQ5!Kkwq_RV$o9tS#(<=79F;cMV}TV(3Z)39Pkx%8K zLmIN^okj`isDdndtq_a;^vI&`KC$S|!$_g1Qcr&_WbyV9i*8!T8XIA`doi$Vnip7- z6Ugb78CnY&rr>?GgEufj9nMV{pOtfI+Jx>I$6bQlt=#dzO;&8rL?eVhPHw^_!OKQf5UIT!H=a-*`{s75ZqM~NX9zthhAXe`3(DUB4eJ%nYixp(i@Oe# z{~hF)NWNe%<)!@BkS~_}tyX)a9pbJB<&VIK>c)`=_d))2$kSgj!=Lt2o<$hQ?}uH; zB;e2R$R7dxmFJZn1jLx$`%9Rf;NI)~F_83Mh1D%YbaBfk5gB0jc+GC?WkPAoV>WyifRJAlvZ= zqE`c{_hQj!08ymg(?w4bju9Rz>?sTYuSb3#W1wd}w*#++{%3*IyA=qL-Va)O+e!l{;o^+Cja*S&e{{rAT@Ed__ zr{jSek!~#Tm%x$2!+|XSK|t#3C%Uufe`30G74&=p`~}jz45a)vAmtwy{fOwF0C{~@ z1DWqK#m`s#B+=tU9}Z-F(!_rYQ#I;+5y*Po1EiiM;&UB?@n-;8-&vx|fGBcrx-Vn- z#)@Ac{s17$6#!BneKg(+`V}Di!C!#X`-Jd5Aoc%5^ld=uUuXHH7l~gf`ZUpWy2<(+ zC_X<>QSYaifb)861v38|fGp?LK*n?Zi1Z@S)j$-r_YtBG0W$x7qI-x=2QnSspRa-b z4}mN<{kl@`UxC!~7ty!d_|h9hUkPNpoDF2TYQ&!@EEP@yGXGbbkf1oZH3!9gzL%aUk{G38cPT6@R&q@50p6EL;erzEed{7d-*UdXKhP z%C$YF+aE~1y+qR^B>A7=SzyWsWV#nb{}D+2k6V7}&&9u0^yQ+PMAwO)CAtX6>wk#& zAL5zDd|n0e`rHd-eq6sJ{}v$gyBf&$Utr@)&rtkC;aJNbS0I{m0jBRJOjG<&UrmGgtQ9R%AsehvQM+-+Peh85H^cTM;kmcwqItXMwUtr$Ac6t%We10!{97y?J zi~c2$^0xr_Jp7*c=L0FXSoBO`iTD#m4;Jjnw}J<~=OOpM*~VssA^k zIWMBzO`R#;n5KLeVVdwRjK}2PDy$OHlLYx+VtgciB)nhv z6X7c1a^X2b`f+Bua$$+Ezc5$$2aIo&ds29%uuV8sI9b?3*je~2#x16&vt8mkAzj## zo+6wigx^fV{|4g^;~x_KOt?aLp73}f$1@|3`-({CN5u1ld?zJ6LU_3FO)$xSSx8q? zq}K>136Bwej(*7ae+ZWf&lZjr<_p<>DNhee#0@Y_^Ob8aLIp2_%q?1!dry=^)uz@YM0n7JWDuNNY}iK zA15pj9wt0k*jGr$zLft24MzMx_?nP@g30Im1o0Qbp9p^>TqRsCY!%WAG1E;Go+vz4 zc$BcekiT`Od}krwH%Nb$ZIR1$q~8$IUp8sFz$Ma~Ht|N`I^hywqp(VNnvm}&Oh-rG z#3O}=2=^EE6vCIRk>g4y+m_xzWOW;UHmuVYV<+__fCAPlWsqK|OSfPJBZ6YvKJu`eA4MTHz|;`NCG= znZkL(SwepIVEW^QTtX#1K)9bUOPC>~e{IUqNj!18aGUUPA^p)a{#M}+gjWc^Cp=Hs zBCHeAy*<-U64LoS>48Ez&?n7@ByqQ%XMYpYvkCc63x6a0rI3C`7=N4a2H{1*rNVk4 z-@hn-l8`$LkRB`y3wsN>!vN!V>A7i~Y=eG9w7yqnJRtf$;g5y-KAN#Y^m)Rwg>^!{ z$1$Io!jps(goQ%7_@^AbM{Cpr+{BA;h2*~(C&;P#(-x9tk{G;%f!h40c3HiRr{I3*p`wP&-wo3GuA9+aw3~Z!}M#+cxs~eo1^?_`J}~gSLo%NcdAB-#3|# z@0r9)h35+SzDfRkA)U#Q=KCh`B;hf_QNqK8+)RLS++%>4Bm7kJrN0UJzR7s*J43uz z$X#hjUnb-?V$yuyBvuM%3f;VHf@toFL%Fb!Zum&MdD^F%f4wJsUHH8455oI|cL{G4 za(^J|TPEZlM5O7xka)6iq)_%H89hXEDwZ-_c!jZ!Lggu0O4>jcw{z=GhzvR;qC~>{;Mj`jqB7d2%NjOW$J_e8KL#?N8-R0xKLXAM-U%!N-U4L4w*iZQ zcL161dLZ+?88{et7cdO`36SNu8_06p4h#WdGlf~5=V7fNYZV%^61W_AI&cZ_6ksC| zYXe!ez?s0gz;fVh;B;Uaa2l`}h-;ly1VkCL3V|mB^MF%;ypE;7Ft7y3>v$57*Aaaq zD+ENHvOM4kz}+a%Ybu07m3aTo(4KBItO?vXixMmAg*E7 z5?~)-Bar%Qfy;n%fxUsVflGm9z~h0%z+7Mva0##wcn&ZRh-X07VBmaU7|8pxAFwAd z2gv${fQx}1um^BA`ZM{vfUUrtK=ie&9pY~X7J%Lc%m!{1e>1QJ^d=xWmAT)lf$Kpx z1KWY!f!6_>fNOzg16KjN0ha?=-zC6CU?Z?AuvYxJzCVrHD9o-*(k0E>ZWdUKzXUkLh0U>*=fHTN&| zgh3w;><2_J_c7}k0#OAdllL!eOwbR@g~97Y3xn5)76#Xf76va9Eex&_Eex&@EetLf zEevw~k@*XQOGFEUT$g0LFxV(s7+fe?7_1d73|5O42Iq))2FpYX zgC(Mc!D7+E;PIk`!6MPZ;8@YZV4-MXaHMEqFi*5Fc!X$SaIk1$aFA$WFf3Xa>@Qjv z>?c|n%oQyR=7<&syNMPCL!yPjplD&x6Du1L867huxMehzi45wpJ-t)SF|vg zBU%{jCR!K_i53QfqJ=?Ev@rNJ+L!Gq4DJ>!G<%XW{u9d&?ozxk_UYCz{B45Fb*ECvyJ7-vW^)a^BM}nuu~|T_l=_cgd_q z(L~OBP6OVDSC2683g{u?e#+X7hZ|`ko>5s_MH4yCX%|g2^Bd8e-*H}3ESkvq4CiUo zN8~(a7seUVM9yEfiY9X2(k_~q1A2*QVm9b9(L~Nq28$+gUc&K<`ib2@Z^v~fP3#JK zqi7=MAFD(YIq#S&niv9ID4NK51^XZM5jmgW^(IZkrODbXnusPf^9;sc2O3Ra<`bkF zL8FLf-axt-G*o7VfuxBDS^QqeZ{99kD;jeY6MimwgXq7A{#f+aqFH{1@34?Kcbm&_ zos9Gk6n}>34WiE#{ekGUqJM_MGprZwwhG@O+HJq`is%MZp5YtOmx&(2Mucv+QOZQo zZc7tm--39z?a0}R=QhAduG(3gcQohQ0o z^c>M#Z)f-~(Y`l#(azsF*Ny2ie(Pi_zeDlP<#rnMGC$|FiW&^uFT(C zG2VF^<~lgP<*Yi<%5!H;(wB>VR`gw>caqM=bt<#+|4{tz6`#RQkMu8#ro9&F*F_hI z{!nzO=x;>Vh|WIA>OWufL856VMtw($zDIPS=*LA*7EL=e%1;sfDQOHeyHBN*B@!W%ebe-rL(dUakU-Sym>qP&TXxiN|{SBfY7k#T}eg|Uw zGon8g{eozIKVtbhO|#|W4>c(Ns^W)=eqS{00vZ3M=rc$o{ozW#K=Iv5tUm4Rc z{fuaS7i9Xsh`vblTcWQQ{h8?dM2AXkeSa%@kmxr>A13-6(fOkLbhr797d?zL%KMZn zui{Tt{4~*Li9U-oz=ZfYI1eCv`)W*{;miq2hJYD~h z-YEJHq8}9fg6PLZzd;(u_e-rles|8ogSOvHOY^%l<8M>^VA6OnAENkUL?0=7mgqv! zjY@y7(zl6zT=cD?pBK&V@XYT6(SIh5{3b}>-$?g?eZA-&s4MCAS+=|*NhAFiN?%GE z=}(e8_XA*j+7v5)q3E8Xuao>t$^TUGLlytD=rN+-5PhuZuSHK1-J6pRaJlS5)d8AREJdN*kWtoKuZS8y;&))}--gu^^`JE~oyv;K#{aXOr zWTWV5qOTKuo9OkTcZuF4I$!i!(JMr^i{|$+=C@Ncx(nxNe)ubhXnJcL{Wa1@$M;70 zqvpv;3ezTBSbbjvl>Mp^sIDIv7={c{BPJdV&Jt?mI=f=g$e$HiwA8f?x zqi!B9^ofi2D&RJ=s$x;|g6Z(c=vB~F9DEzsS1z1f507olaPL)9Uj>)ARo3agS8?)j zCr+rCJahcCia{08UX+G9m;WgRtamZEkArXT=p6u3tF%rHQ^!YXZ0?|BzK6Sxgdz?r zAr;*y(_66_@^G)B0!~8V*SMmp_NORMC~DudmwC6*KD3sjIK9m{!va@2INb#NzT($|j=qqx~j>us(?= z!F`@{1ZpoQ{8ZOfJGZm(7ji<$`03M)u80>(ouXVbTQj3%IJ4Q)J_jb6U-O zc*%pu)3~%JPcYFDXQc`8&ckd+B9VPHI6yQd~Rua81l&dbFeH_zILxjCi^By-CLkxeFYpdCK%DW(R>d zHu~R8?*32*&%5z@oZH%XJ{{D?2}4b3WmQwdbmM~U5WWeJa$xa_UPp7{1kcQGZQoS!4Mc# zP&jl<&QGC#cnbZ)Q|KRFkX--p!sPrB`QF0lfqdG@aTB=|$y^(bNRi)&qmm~anU{i} zqCO*2=pUI%e~NZ2NYRc3De^5~zU(9gDH?86ii(UHp1gviMoQtR6g^;6ijp72lCva7 zr6}rADHI-+LSbQw5*D(ANxE!d3jKv_85V4Gil!KyqQIk5T+`7huIcC$70J&_aZ&U0 zQskVUmm=%@ycBuo=cUTr-1)42e#(12KUHq|%+01vrQY25M#S9e_AHe?b9Wn&5xf@m zjF;J-xvrN#BE_Z5AK~|MJDKfhP)%|Rn^zEI7u$ObH-BW}MN&kHewaTp)zurBqKD?E z8YS{aCRSLPALYiqK^3;j9H&n{etOJXtdogMWA|}<%pd7Ds6YNI<5U;CAjMsjpJeE= zstQsyV5&hazaUiun&B??>X|N(Uy#^|*vyj*vPzMv z>zLs;wt`BL>Yhq6PAf%X%~h&YHBU0MTUAHpxgIvCVlp<98b4*i#EPUHG5+4NIhtof zvRWOLs%xZrh~yuY*fmtfR1K8sxs!iXss=i$FiCYWhnqb9xRQx+cizNeyU$#n=gzR$ zIWT|N@WOB;iCq8xZXYFQvj2OnZJ1>j_0k#F+CVYEL6?UCuV~Ust!O_sk@9xH*9{Cj& zE!Z58XEsz+luw*p?x+aba@u719$PDRE4!`{2V z*Hx73!)qmbr@OiLk~Z9TFF?69>6KDin$S{G3?(#asR~WgG;JbjQj)Y3EfOheW4TmC zETB*>M^I6!pjHJfg3u!!nRjO9Tu{AWt_${@oSQHXPxC8`HPh6*+vow)i4n`7RoR*eVC`D`T97EcSGKz)|oMX zc*`)MVR>dFWQ1^DnP%2xi%I_(<>_*yqZduw--(N9S*%B7LBZjQ0y@U-r*yjIC`x8mKBSH3K0FKX#lpycrgl@1)E ziTtJBZ>uG*QH^a|sJtnKg-DmbmUiYYy}Y}o+H~($c}lBndE>}m8T_C=k|}@Yh>T3- zT?b`pnkw^;J_ruh-%iL=9b}cq0*A}HUGm&*vd;;Y{4C|=(7)-m!q;QB3a0={L*m#Hcz+Qt_kf52}#diGj0tGp(v5CydO*6Lkb@A6I+nhdg!-@fM>GW&@M{RbF#_+c9|(mbYVuWp?eEi(^=S+aOO# zWW2sjJ(QN-{&t4s#UyY0!1CHwHLYx6hZ@e`u8_Ra#G}QPGL%1@<<;KO$hL>u1NE8u z{Mapdi`Ac&OWqFTug*$Lxx|f)Rvvp928ZQUs-d|1ZS^@;NL8!7E}$~XGx=NH)Et(# zTk^(QFmmsm<*_kmD(^dz=k&W~NZwN9PgxDgYiZT-x+ckRdtR*i+7h)n+Jbp# z(_S#YjHXB(K}b#*3Wpw~x2xT(qwwNrGgX*x=i^89&GkpdlD7$VIP9UCg*AOIRWGWq z+3;FvP2c7HHJhRf(6iR`owcWC)0BJBDb`$bdH)_tt?7HXX4A|$=r<7ZS%lPXGJSCM z{%7EE6U4PmR}<;{f}g0?R2jx!S(p8It};-MB}?UE8<6rtf?E zpQ`Qae{c1L)k~@yGpF=(mNhk{Zi?D8z;eX^2gU z^=(pmw-xPDve&_uY5pOkl%Jl`y~bhUf+-A^*uYU z@6V{In;1J$vPW>W&bH~TbLrh`6F|vo``$8TU1NQW`x3Zo`+ltpwg=56#*21Q_RDrW zV<(bi19{$fO^E`GPz*S*Os+EN?~3TdJx~!@y!|NHLz7Zcc@(L9kYYAXxfLNMm21hO zc6WP{`xdxs`~IjR?XyKnX@$Jw%4_=GuIamIH|~l5#3vGNx_$`1l5(!Oe7C*ng4?Bb z)8t%)o=nM`W}17b?-$kkpM~GzAT`n(9x2D&=2|?{8Ru@gzO!~ccGhmh{oZ3|J#R#C zTOp+!IQP`_UA`A$PhduDEh9g>Oo1PqNNzUD4Udd_Z{nt^udC^MV_x515bY<1Tv5f!UCiHt3?LU?|T0t{DC4c|a{4Zc`LivBWGX1h9@{hqbqEXgmHs2AeYmaiZ736?*`Ge$F%eKf(Vo!6niQg2rFO zXoG{q{Dp&qr2Gai%DDMoLBjF;VWkE8Kv8_*mGI#?8Tn-(bG-ajaF@rx!9^5?j8OP)M~<}d-voCoXG&=yb8|jrOf>9ME=e2tcnau%3&NnJl7*q;uoFg z+(Z4M_riS{{YUskmpK2Ce&JPcGfR=dK`NU_=9^TCxrN9au;dn%Oau&yML!6i(hc}4 zX@^IiKV&GQ591z~QE&LC;TMS(e;yQfpUj(8@?AiVANeMH_P`na4ji%P;PQ)~gmXOX zpkqqn^!10byhaq(Sp6FA{M+e2_>$6sKf!@4`Ck4_#;Z7~%+zyanFr(YcVk zv0PL|pDo zRQ3?FvV@&Z5m>#PCzzFXpLz40m|08&#$U88MI09qCdAc)8p(Z_{SLk6#9coKv=d?zwj^+6Ts%5n=_`|_eyw6Mk7&f z2378J>!VT#J`Tux+X$`*2s}&AUb@@iXn2V3|( zAdlc4OEmWh(>>g3uv^7(FB*h<;b@lH|0NQ( zt|$s=_cQkU#rQ@LVOkJj9NBUnLx}$&d(|8lx2~e`7p(wyq7iUwt;AL90A;V*26NR8 z+e=X!Y@Im~+>P0avURrM-U-;2 zkS&Lwg8q%RgpTW(fcr$WtV9X9d@pegxp>c(@Mc>=R*-+QEujCs4$YZ|EMtrk*aXMcY)XbG3oX3pO_=~u)uPx-Hz_kc271vx_P?LfPuLf+~ z`_IdHjd}bxTU^J*YewTQIxIiAxSv6cL~*|h$`;e20-IU^5 zgbJqd7rhOh#0C8Zsi4VncYa&K`)mn&S;G5tQ%Xd8Aj+2Tz6p4d_W#VJ?On(-?r1(5 zFm_^i(H1ElxMp+6(d?V<^RYy8M-YL_{A>hnaEX3=J<3sDGQ6~a2NKwqnAP+u9$8wj zS6+p@#m_>IP<$9TatfD#;Tt3mC+X#LZ^2k$ereH8I7T6$aKxyh7oB_LsNj9Ju)su! z9tWQMpD|X!IZ5wIPs4}rN(J-r>V6J+&PPg>MTaM4h5H)v&9>-Bla&%j9%abmLGq2f z=x9Tp;>cqRIo*+QL!RZxQ6#-6-|M4aM46+HGVP}k94j51l)uN}!}ruuY$gzWg*<1V zV#f_RE{TWxL$V5nOc+)4N9Ue6s)&=`ToX8C(x{^0h;<{~Q$`h?;@ne56$Wv~Aw#)^ zLG%+08Av$MkbFwEBF95cBI!ln4}tlEAT2huFeyLo{c|W52S@p$8oh&ztz;Zlki_T` zA67J~s0pEzJ*;?0knv$9qrB)Z5O>sk+-~FijzaeW;CCPgexZ8>AQ|%u-Ae$;Lch?x z29VT?z?tlkL6-Z4!Iu}vI5K)Rf<~Q$bmB9{unl1Qf%TvtmH1Rt41;teCp zhj8=;it9Gn-jK-lhSY3>OwKmQxHR)WJNawoLbU-Gj12Q=s zkjd$QOil+R)8S&rQJ**I+?+_~=G1gRCZ_{3IUSJ6>3~d52PD(^5z~3Xq;ppyox4)g z0hyc*$mDcDCZ_{3IUSHpXDT|nQ90=7#`*Up(z!1+9gxZCfJ{yYWO6znlhXl-bUc5E ze{AuvXl`+7-VwzwTv7Pa6$L}!oipCgEuLO*dcpC9^M*}?*HFJIfB7(U;88EPc;2wd zg*oV%A|t$c!*X$jqa|?Q`*9dz6`;Go5i{hPmOl|hY#0b08Z$VEi*n^#UZ(LfS7H|& z2@y6zp^eQT>rvE;@7_IEKqCEKH4C?G(xmZiI~FONQNWZ-k25*pT3K(X?=x4!M!~BB zVZ+H*P;dsEWy}gA&l|>qj7StWxv(QA2VCg?hxspFQAhzc(ZdpP5>N_sLZ?rNBrIilJ)@#mg$ zj&{fog&cDTrSHFuHLyMm!q^@vdRDEj=xpXPm+=!SCr>@CqP}xYS96O4Xfh$ltEk3Y zYa7;zVd+D6#p349e`!nutZ>0cST!WYiCDG zecP%v@apUuzgi(l%=L5LmBu%1{Dkq{%P+22)7@3k*3sO)W_e46nUwvX$VB~RScbT& zqPA^WS5wzz6?3~V+k9zf*Tvlxb34~`Kp6!UGJb{gt*B{fT8^bg|Ks)5s9EB$BHAim z^!fF6rP}ybwjx8##>%XowpA_8>s)BDbS|%NTiManv!;vQ_`Kx`&9$Aj5m+By78|8; zO_Z@A zxMgcLcDTq&c2QINnxGuPvO<@{oVI3ONnB#*GrzM3YuJ(tiyqD1bhveLNBQ}+IVTLu znKbOd{Mvo_vEe!A!j&0XbLxi0#<;*Ay6GcwJ<}68|pN+<+x5hmM7tA=2O~J0}P9tXHFRx^Y&Y z8z83|C+M^w)&l4347`>&C(pK`$nPUC*o;HlcB$KEXM>aX$iRzUN>$FDbDGJaD8s#oN8RG+Js=| zOvFknw;RLV8N^EK;T_8p0ZUqr-N5difF(_e8_li8a2ZX8s&On+1D3Re+(0g;1F}eQ zEEfeV4bFLS;8o|G!H97BL%|LH@<8q^X*m|2zF=9>a_mNgxe=UYNvj$+4D910BoRjBK*tF}MGZ;!vuNpUMToc4fE0klY4Or50?1qwC1C}%? zZv2?r)Y_xQru8>HOBL7_Oh}}4Or3=azor^Rs&)(^jL0WdR-tT zEg{FUK43{p$PHI-30Tsk@I$;MUR%59+&DHA=*CA&eCqhh_&Df&cdR^RYGvj4%JEaC zo)90mtf{+Yc^tupchdMN-D^8e@DA>Kzasn*waTkl-PN`h+jJa2fL->Vy!a_@x0h(^ zZu0oK*k}~gtrK)hbC1`yJVUH*d=6gZ&2De%?hZa!y{?w#PVC>aJn?bqalJ*-m#T*? zahA1oowvemJJap8cXq6dufc{wD?3mj_)LYoh1_dsC3Yw=pYF9S9V>fUC2BznzIZzt zxMZNYwW%w`SB#CS3$L-OrMsnTZOd}ciVb}>dre&{v3m~2Mb05nAiA@wWj=ODGFQb2OZh<8cRY&f1_7$gM{~E=jG++Ls`<1B zYIhb(rpRE!$Z)ZnI+ojNcl%tVG@u~Ve8XpBX=v^0yfj;2U1xVswy@dQ=w!Mpb~dIt zo!LULJItlnlBuC{0d`EWb*H^0QVNl2*Nju%8@kWNVRILZq4l)2be|A!49a~G79;Tf zX>454-h^x1m}qy6jdRy@G}mFx7T43+ty$2Pf_7Qo_I@sXS%y_&7bi0~FYJiZ($&=7 zxU!`KoAxw=b@GIR&X&ZoL0rsKnmbot*4Wz8jv^??=BlTwGwgrhG|cs6$tPDHEOTmp z4jhZEf+1p`GNqle(~O4j?8; z4f;0M+acJEFOoI+o`#q<(|@l(cf4x3$27g*rkxI_@*4Qr4h&mlaxjt|{%rG{nO|=` zz-N0gL=A>0J+qpytECAWSb1ykxS7WVxby21LzZ4Mni=-VYQETZqSecnC#gHF+FI+I-ssSMZLOYil- zne_Ay)o616=Oy|-ucx)eCNn;*Bb$vr$8~{dGVE#`>H0X=)H=HwFKz2-WiPe7t$TH6 zccN!>-QWZk-(CzRZ>|P92%D;7!j60hW8I|%O)^2OskETUUQ=RsJX3jTEK@v_P(!B` zkflz;*}or%&^$CQc@T^r|LJq;on#CQc3lW+7y45))_} z5jd-|YP8-0MnhEK6FjX`e3QFU20$nTFg+J_){M1PvnVq0tQ~y@IH!Rzx#Mc6nsxGm zljoc~-+1bA_xI_-crOoVG-Km<{$#)=v4^tv5chYk&LKuc=>n>ijc*_29=I`R&i|`rL0W-+2C*b^RB-e&c6f z{o0k)BWCS-blJjLUH#AJeeydGz2~HJuO0Q&vIn2sx9p+M?!I_o?vA66nsLJ7AN=Tj zC0{-76LW`uWySqVKl+81PrUZ<2Oqzg6O21xcfr01%k#H}!;XcW3_Az50d_fT5A0R2 z*Tdckdq3T{17eNe%9Sh5|edoY7z%GaFfxQa$de}Q*?}vQ^_G#D`Vc&$M zI^S?uo)1|AdnqmevgIv=o2C~RhV&Td8`0bge_pF2aj~em*bn|EalyWVhtpN!*@|$+ z;q|7u8hpw0hrv(!SYB+H=N0}9F(Vw!URq=t_<*5;QV0@kpLt_?s0Npf@&IAwW z2;`FA$-iInTa{j$@?#X(!AIq4^4pcTSONt%X_p_f0tR%R>c}j`NaFvp;-9I>jE8ZZ z7@ub@)4U+srEj#r;lF?lAI4~01OFh}s7-^e)(e1HL;%|5*Q_c5?b0)P^Pt_(>{gX; zkmP+@`O8uMjLJUv-Ssdl3qW6sdZIZ;{I0x4UmE_ql^>%J58BCpMd`Wlt*UQVek$hk z(s8zd=jGfB`L`fWFXYv$4e?wU)|sn=^}2>G&#qrVRT`zSO#RA!n6=Tj-`>9chh@{i z$NAtNAuXoOYs>m$nVD~<Mg>^oVESFD~g(jR& z=F#!6pF0+oeI*T&LmlJ+qh7?b6~po(Y12=#`Y8{(i$-CN>VnKS<*=WmY;HHjy=snz z9Su7M_VqvP?_r(%7Wmfc8$P(V;`!pr-i-zCjQi8>{wGfT%~^lyI^#E&Tz1FQ`yPCI zM&#O06}|GGKc2bzjj6GvSI*jU!q$tPe4}?^*&p)0Rk*qAvwKe%S}}3myS?|cmK=9k z-{-G?aQ&3GZ~V;{CY*58#)9TgzBKCvkY$fb$*hR2yuWWUxM8STY!o^8g>Hg99U||A`2eXWrtbS zL^ch2QJq{~)NP~}m0jia7)W}pg_ReVB+`qk6vqN#xJZg#Tv8=3u0^F6dmKLTV5Z7z zIsE0t)rjPx+PA#8UXor^v*)FU;d(B5adnq6K{axEQKwuHsW472YLCl{3jFk{PN7tcsM*9Fjviv%Q#8u9d^ zdb}dW5rJM$Cd6}jFunG{Dk62#=|u%~MdZ>{dU271QhXgGz0SvZZ2Mi`6!0+)%*n8nu~~fYqbE&5Uf$KwYa`b|CJp&N1H1GP z_@4lOE@NC8m;ZA%47xh+nxF*C|ApY+D*gk>XFXmG z{?+1dp==r_f9?h&n|$|!uSR^VQ)3+8yaeC#;ERi|Im~y~22<0N7eSlY_h(zKE5dw9 z>2kI1F7b^F^NFUs2Jqc2J~h%rIg5CiS0vMY0(_MRkw3l{ z#||QYN1}%M-?8;FQ2yqCZ@c&g%3nM9Hj8hd`nw){t>PP~{vH5d)j{Ns@ABmbk-x$S zdhoYxc?ZfLd+43w8z_Glf^Vz%nsuFm_MFuIt^(gW@eNde_kgeNAoBM#_{JSX{&@DK zcM$m-iznpnKiPUwKb)~W*Me`G_y(%K9`J1xU$*+Y6%WSMI2LgOuoKAVa5r96nt*uP zl+6{MX8mVQ6g>ubEMAGYc6BUpKb~5b;OO+<0x9n)Amx1-NO^YxDeoh~%dG#*F44`v zIOHq_;#>NtSwPCG08-vCAmzP|r#0nq`5)yyD*UGPpZQhMcL4FedDIplzR{1m0!VqC zK+3BJQr>tV<&6bWUY_tR)E)e1{tih0UjcDVj^gslGT?WCly@(X@;(Wqybd7cEeA5* zT;XZff96EdV}L^-ryN)c+>bUwdA|ix-cvxz<99CQeGW)@HwZ7c{xjE#ZU%OMpR4`J zzd-&K!qL`$<`JTK4;CU_ABgvuqxRt5W%`c*nGU}(SpIFIc@FBupl=5DAe~Rh|D!;} zFIyz~9N`(lDZ=qUyf~DN22$=3@_z$;B-7)&8gaLf?=__PKFxR!02z<(*!1W71@Tg0 zi||6>LLlSK12W#3@-G$gS;Y9i$Fqz0n(!qc=1J64btxtax9EA6>^Dj zVO02MwSS(U&G6@hPYNFsJ|N^KBjj`U5%(Y=y;jKWOi1&6fcP$9rI6dD(7#B?T~iHbJ^X8<<>PY3n_vDJ9-Iw0~^yc&2K z5VAbHI~6Yl&H*k4&IZ;2Cjo1K6Mo?)8W4}v;!0pOa2$}=FAhXq7MBC30!x8az!(sZpkfa=3%C#U z%=WVvh(|*49w6R%iu-|VPrHHWs*864rvY~Y*}irF(Pb8Im;W{(+uPm1T;NvuZvnF1 zZ3d#sO#7sqUeIiZ>ww6LX`jqzD`>W(r9c?dKIvZvg6*js$a1qh?*g(s#{((kIAA}* z&jIcRjs`N{qkzocJRtLjZv>OSBZ0l3YkjISs-HuPbR`Mj$U4!&NRMb?WVL8vq+PTy(kfaQSuR=_St?o>xlpt) zvRJe*(jZzGsS_=X)QT2HYD5bob3_XxRicHF8KQ-eX`+RZ$)bgkO3}i|$)bgkaiWEh zv7&{MxM*SINYTPbxoBZzxM*RdRJ1UHdxY(|K^UnNEi~=taD-ovctF#BNN*N>wMEl@ z7`{=o(6k@&UnTxtg$qslVfcE5uT!|tv>%4|D15cTg{J*5yj|g~3KyF8!|>$_U#f7S zX+I3VP~nReE;Q|j;SCC}Q@GHyABNW|yhh#;e`qpMq;9c zk%(wvWE~z7OYkGIKduu^WWPL4G;u8ZOVLC=Uw7kS!uUk?+uKAFM}gibns^N8rJ{*^ z4)gt<@rmr;OGOje&vRUm;Y5_Pc!y{rpVwPN6U}o#G~e6Nj~3U6CYFJYizW^Sy$=sJ z$|v%9u}d_O&yBl96H7t&iYD^;zgRSp&lSFhP#%%b7ru9pCKiD1NBxr~@;za@XyRbd zn?)02pqGj!^7+qpX5<6;-1kHiaY@W`li|D2Z=edz^OE#d&?vHbPLf^?8d);WNz!~? zLWFrvl8%FhDgF$Z5a7)HqTA)cxhRJBihf1(E24{-D8hNa(wr#TZT2u%^f<($xmfgV zqCYI!Z3u9$Xt$34r=s0*`~9NbD*4k{3AnKCyq$W|$jc5OO`GU`(N~IoL-ZF#yVd3| zlZL!qc$qSWmCo`5X*ixvdaLM3qVE&U?`(#Tz{R8a6luugOB)Tx^BG>HaDLa5UMia3 z`=s51>3lW<&~9Dx9MX_iDS1m2&c;K-aR>5qT!V(=5u_)H{)T9`82GoOA#bVV4Q3+* z{|@nw65TI)hUhm$cZ+t5Y#$&Ed7CBg8HGC?t=C1nwX%bG6X3=x$IB?qNu&!gN5O$T zm}=2$L@yTo0nweJdqsal^mU>?EBa>99G|89ZK8iD`ccs@iGEQu$HU0~N6}@xi9zS% z<(K9Z(&#AMd0ADYQ66{R)e6!>P#@DR|9ZtAruf$@e2c<44o&$-EBq1B<3&F&8b|FK z^QP!((S_`Eklr1VH5xj^bFA_l1BaSJk`pd zMH=b#DZL9wqds;@K6e~t`1K0^sOVcn-zxep(ccigP4ttZzaje9q)|Uh)qanMY?kLt zNFRZ3>bbUl z9s`u%8o2ZJUJ_lU_B|T?GH(CCTm~YUz9U3)ek(bg?@h@xb=;C^jb8=w2Zh4<97*OM z1I}a`-{>jy@=$)cg?=)BUx@#v5WOu#cZF!qrzOiP3xzW*IoxZ+f}`ffRoyG=Td*dI z#}i_~S+bvJ&pw{V6Y0nD3}LrGaeQKFwp+fKl{IN8Wn<&~dTiv^jCJHKW*MPba)nf| zi(B`3W;vi)rr6kM0+<)95NyQCe5@JABDNIYU}c>-D%Ku%Y%-a$axyr*xq4uZq)=B# zBxow5W!37Q%Nm=Tu(zBlB#Ak(?19OqhuejcW;K^vftJp6X6L#VEi5|#XRu7;pyVbm z-{4v?Y(rq{Bc%Y#+pya~&p`<^7l4b+GD%7-OV{$VfGKg(^jNe2)WbR~YI7(2CSRDK z>eCkf#_i?~>Hb_Qm}wb&VyWJMp>~~J78bikHcKEYG}}^rR#9RFYZd|j<179DmKFF~ zshYIn75jVQj>)_c#oU(z4K=1dYfl&L7X1SsZZ=|BTt4d|LX363Od` z<8HAoSIYmjOZ~HDcWUPB;!yN#*~PKwX?IIncG*x5I=hBBb#Z-`?Ba}bgfyq^(l8}^ z?cyNy183LnLeMzrui1tmTUN8w?9}Wvi(}UhoYf3Va7{)3eKs}7QWzYap0VDiX0LY~ z$&9PE#KY~Ns?MB0pCy^}>>BQgr)B1!l%+Z*WhvgIiCN^NUmTO}q%74j zDZRQae^5=RlbS}pHJX~5bZT0v396k}-wshR zN_k@@R7{)}PnZdlCsv+1Y1-7u6XWqIm6H%qX#yuyR!*HfIUYZ?a;n&u<|CCleAb+K z*@Bi8^({SkGauhcnKV!S>A$#)lS`(|_ZqPhV>@0P76xO@p4-pPc!d5o;ya(Fj&Wcd z4Vh->jq{E)jg37m>w2u)(y8ajyO6KS;pFYcm>E9RIjGyKAOn1DTDE3oBhTEXNBA6S zC#P2*p*a{2qN&2*H-`3TG}3AbC$DMQvaXi3>GCFu`xlnoyAopsA(L5N7dEiNo;Bh8 z4PiyYn2QUfo+r&}(cI*RFBpJtov1{zzvp26p5_{;C_Q6ESwHk=4m-9ORixgn<&>DhXy2-^lCcz(`li ziteyH>gCb6xa%aZ3i4D1sz%GF;RNm@Xm(l(pMzd0c@r$V*BdHtN@2kxdDzI0xl1o^ ztK`KcZ@cnWgZ%N*<8o!nA2weMu5U{HZ48xnx2r$N4}?kwF(d zydHP3y_D1yU^9lEnK2*0zi)%!%DIE&2>((7tT7h|b*%9P2v`AY!gDVKTuf>VxFX$j zjbLnZ7essE`W0;6hw(S)S^Rl1-VHax@`NNW?-sZQKY>3#|7HFk<@+wZ+d$L!iyp>* zZjkPEq=Iz6PnI02Josa5zFoYpG6cq7LAilq_Ac&0XY|Cxgl0|BZ(?C7m&Z ziyd`mIpx{2oCdkGoMOpmISqDaIprr#KT1BssDMJvDMq--3e%4*DoUL4gky)u%EOfG zDNiMdBaO@vM_Erba#z4yhNQpaQ7JjzpLuQmUq01{yGn*XIx-y7lYz^eY=hPj+<3WV ze*W&9(Zgc5KA8Ui&XIX`Ee?(;LiM;>8z)DG4XhoD>&7!25aL*%#bOLjn{ZCe6{3+Y zaZYywW=P8gH3xzgI_Ir{SG`;TxL9ifmWCiqj(^(b*y$JSkoLz8MK`l3i9HoB!sez2 z+$=jRVmWpn#wUd)HNv55x#4KqcG|`_L;DN%Y+S@>)44^pwm7w~-fqWg?oqA1OqG22 zg8Ut6vkxVvD6!Qwwl}sLPP$Y>ds5nR9c0=u@ulBjHh?z|?;CgTi2aa(?-aR*94mW- zIDI|Ccja%Cf?ymV&ZKaf|_{&s7zKb_g~&S5xi93F139z1N!dzRkaOrE({4_A>h z9?L*CdojLjoc2Ivtajw|s%O5n_k*uZ-*?-Y7hF@CJN1prTM@Pnb|dT-*t=o3!@eH^ zDC168ni|pLEa}|=WVoZvLmqTLEDfL14DTlaV_qPDfjsTYMjqO5IpF1e?B$yloebnV z0PCG;F@8TRjjIdBrwPko`5lj|FMRGBLwU)28#^Wydm;(kM` z5xxQT2H4NTJ^=e9?6a`U4_~UZHHwz#m{&2r*21tv$M358sPn zegzB4ya0)d-Uq+WitFx!eG;iIg3qwfei>{>sOzIxKZipd z>lz^5tjn$h;+?tbD}dymEu@+n!zU^H1R&+aMdLHg$oV}G6_WQ~!mkOx zB%CRnBINx_{(Srqe<+%-s-(Xlyj}QdAzy46-XmlkkZuybTPQu4yt$%J5{?nZga8x2 z28d5Rv+f6dnOXNU63Dhrj01Cl%s0as9~a)dA)pQnqHUP<75EY{d}!;24{g|lM}T_~ z57(-=A6Nq14TLPS&I7W|IuBf*;;rzp>ZL&#;dMei zHV7lFqJl>dulUbV_`?e4I!Vgkt8ng_MtP4b{4Rx8 ziRSuDHX1j+Fb{dAUYr}xF|`g0)~Z6$@Dag*bx>WCeb z-dN}@alCzRN}hH$np+{Z%sN7unVd$GJ95;G?xiblCFX0XjC7vegx<{Oha{)HEN5go zsMldlGuceKY2r|FZbmJ2?liM+FqxLh9L$)ddQWjek|r?SOj)8f4k=sd(~xFH*CiCB zZ+x@NO{UM?8tw^|E^nD*`5LNFmculmf|v&`gjSWIGSkMnwV=FUvt#Sb*E zH(|o$sg~c&>(#o0Yddk@&}5p=>*c*2XQ-Xer>v=jpUF# zGYF7%KCfT$>XfNo$YWFNAC>qXP0nxfd{n0Syh>e9Rhzd<^5Ua|3+sZ6*aOYyRY~3_ zm5KgPc~c4to&(M2?UuY6$yC^)Z2FX}IzoKd-x%bRI_kn@2w!Sz7LZsd&__mCKXiQu zo*#7cfmf@%yCiQT@`vwGnv_d&p!vZE@KHchXTiIWlVC85#|DBj%F8xCScs1)8bmkd z9?26)$S5z{{9vWzUGB;&d96r5w{l3{!1IIK)PHi^h^7t`%e=nj$J*y5y4zM0pg#)d zy|fYGCj)E7VGnscBiSvxI*Y?i%SY33Lck#zGe3Ai^`h#A`g8jpo!9qdP2W>Bn`V}w zyTOFr*8#PgkOe$g_CF1eFVVm6v6{Z;YWvxfRmFHoibaQ(WBZ{Xm#JSHGO;M_5G!0 z(@~G0BSXD@-@ud`ke2GTrtf>G#B-Y;Ll!>DEcE@Nw(oZ}eGjG7=4ogvw!MWXMSDw*<$>~T1lF-=(JbJFcO*k}&83!a3_&mRKkU+6aij>6x;WsY)r*I@d^ zqUR(sR-6YPCLNvcdnHTYI0iOSR9XZW6w8?d@DI0@=PK=KCIRCw+KA9xR-UQcQKW*( zV@z9lhqK@-Nt((#oCW7*MYi$|XX-D*dP6$#k7;1vCBPksX#7S04Ob!|ib*82fUO|s zBaC~3&!l`8j|tKEiza|)Xpm8V;m{zPm_p9Eg^|YlWH*0|Qx(MJ=GocfewC3X`7DI* z;+!AE{ro_2hjC=ZKiyWY?;^R+2!Bz8jmAHnMOp(nky`xur;kO;{0_-UCN_7`90cp- z^9+Du1VoR9qk#8@A3Xui;oOj~l&j$L{L+ia5c&JgXxoYGy!2V1&lW&^W6E+ zcMe?tGX-N>RLNHTI$6Nn);_^R6_$Y2zo1?_Pd!Mg3)1lDDd&wryEgQ`cn`bGx9Jb!lhU#oZNi zan3Eidytp$=G;PRTtX-4;vm*y=iC)|Es-k#C$K+YS?HXc;-m4o4O*&kvCLE5u%y+7dv3G@ zQWiSrrvtAg&gr_X49&#}S{B4=a87i&#`s>Hb2@|yu7EH zf0`Oe&>=&2PkzO5?3Cb6X^j3K@)zP z(>s>zi)n-N+p=VQTLScB#KK$C@sCffXtwvRH(Q)gl1hW{8gPBt8NC^XYCpVx;H z>F>xJhb;5bkwqrMTwP~kIh1h9iDwe>SNc(w)1Tq+GcCU7jp6m7{tONEWcW(Oyt1xI zbFPNtv~<(pjor8z|LiXgTK|Q@Wov%+hbzB+_3szXp>ERGUp&8M^d-OVIsV+`ZC6bh z^2D)^->`nv`sd%d<)P2-`cm0V>mNY8Ct#n4eGT> ztpJ{TVw$fx&>zwJpZP)q{XNmofSLSkcQkVp|0nc>F<-DiN1HE8(46z8`3!7Ie93d^ zb6kMoj^BI%g64M}jrqz2I@){#(qG~3T2KaUrfcz^x6l9V$q3^h1+Nav!t|ME%4OP_ zX~@8`4`&s*d9Zq%cqeihGb zkiyTbuZQgw|2dXBqdwT32wN;Z_YD%{L-8o@30QZ2)=P{0Z)SdSw4_* z_9H!fCY3R-kazCuK>Gg*$aoI`Dd#JqzW^lPZ9wwf0HoZjft0&J{_B90dzR=5;juvG z`)JXe&SAcH+g6jueG`$jyqkre6gCPk5RMTZA^a60G2YLF()-No5}i$dZl}UIV8!@6 z%ZgYcQ?X z2 z@(O|AVLLZ^g!w?ekK(<;$boDl7ta`j;4SV&W---Nyc&2IkoPqLi>rX>FU|hnxOdEc zo}+VqhCq?t)MAy3lL4w=vm?cVD|ZDxqIP{q>Y{>%4+m1Sqt7(;#PT3* z8dD$S1COakdd5LBeWceQjNC6;7-7B`E{xnGS{S)ov@pUxp8UedR?))9XG9AlEFbxW zk?TbZBb!AFBUg(SMmCBT8of@`r_t*Kn*5c6X8wRCf25f|(pxPy2u=PN&ipZai^7E_ ze+*~-7|wi=7MlE#X8st?e32GLt`aSb^okam{f3Xh>qHzE7k#;DSEToWkL_s}kTfv@ zn&l!*Wc%qAO=P>N6HSCjbDtRbpka!SqbIC03q`y4gkI54i-99P~FoI?>&tSBieWXzm}#_*aU) zfi%*tLgzulxfq6jOyLia#tq~2Af6?S{5m}bo?T1&ZpG*Gi~JXfo=h6@z94zE3U5*P za)sZg@b#j%i{=@Nl($O!_mD<)Abf*pp1Z>Mt5x4;l1Ba> zRC@0rjSkPvyMF?8LcQ63bSgAw!InT)rQ|h>o+f&XXs6e54{5}YN&bgO;~Kkh#2SF;hIhL68kl}A*u1f$cfdt&A?$s;K=eJRw~<*{Tey{Mdr0wz|GPdH<)N62y|O zs~m8Ile9{}!A3!;Wz4W$nB~v1>C%KOl`xGRGqV?XRaYOJxl05=ffQ8zDCogI(2EI|D0hPP`kI$->L`QtA2iK3>_nkqdA^J zi>}_7gVlrnx%i#DI0Tr1heO=g$jRx(^ONR-cp0bJ4teqtSpNg*L7$K39?jwE{Qny- z`yrEAUKTy*i}4(!skGn~==n!|KqZk;UN$}GneS@4ln|r*chUBFPLm~&#Gj{uh)hI*bhTAdByHR;;+ITnD zooE@7^;$FORqs-HRgGppEjIDJkf%!&lGki!b(DU1pOxK`w@~5S|0>y}m$!LEvOrwl zlzojV@y^bCI);zYWD~B# z!EhbCaq7zTbw&YtN)HmK-NeyeYUEb$e|BEqqtMW8fw!fh1--|FZkn>#dKyjMXTem* zxP5;_q^oxHybm5{TMwthJcWlp1o1z-qvsg#oD@U?ahzfJg_Zc~@lYH-nLcitq*Aa@ z=db3PBIa|#jzBVxtw8>;Pg4y0G*J;7gDaS+Lp9pV6f@T`v8U1%2;~^CH92>YJd6`_ z*0|Rjf6>|S$mLtf!*H1JTuvtKB-M$(2xkcV!=8tek)nJd@{c$L|HH|h=l?hUV^kBq z0S=?88)F4h^LOx5aNJ98yH!#CcDR2DTfpJn!e{a47hH+|{2$|QBIFf3!+^0&vfu?c zV=Iu*w7mR;^rG1a{2*-Jh#^J&K#uU|9p)GP8E$4P?});pVL+B3@5sWz91$Nx|3YLg zcQ7Xg3|VAIo?mKW6&sSn>V_;a`(H5A+}57v1UnNBV=m0XMT09UP>>`W{FO!U z=Z)YMIu9-+<=e|r%&C+mu(4xGI9e6+hq4NcbaX=g5dYZXVbR>;(!3*zU$~<1r7H@C zP<%oK)v2E@$16*2pr(q4S|qfI)MO~RQr~snupERQK=n4HX*)Q)Ayh*3)@t%%;Ye=r z3_N9v(sgZ%lXY!N61ujfR$X=o-z|swK2>Ljje-Vk1#ZUSWGg5*1I{w1(>o$rr#GvT zt-IGCG{t-kwVLB?!vFs%+5U5sZ2u?pf!B0*RkU?9x35{=QqicVF^1eSeNbms`_06e zT?6=BY<$_dydFoZH1(|MqGB)}s`Kj;Cz@CvzFb+Q;l?#kDVx^V1IoPTBq2yyQv) z_r?uvW0zc05Uar@_u+(>OYUn4FPGfo2`{>U5YMHFt<2;T zz&}kdG*gQ?cok7Ic$z^(ycMUfw6`Q$(gF2DGdFWDP0ql&lO2f^J$|kvwQjFt&8lTB zUFWT+?pnEK6*c;yrrEJFzNUj`3$-lAW)D4R{0rwn-G3zxt}$x&wJjYhds-#R9+1<( zono6?u|=*;!1{`@adj6~$M#?=*{+uEmaere%b^xYv7uYdYjT-DbZj#QzQ!{p^HsPgqkHTcbf|wi74#n5;309`lLU$O4!<*u#k%9Y!9w5Nsr)yxm?WFuCv|koq))HUSjfQY3bV=i@o4R`1 zn%d(mUpJ%1o2k$ow->#8d~yzVYP`w$HOP^rO`}V&I%wlugufE`O+;A(nHU0T|CP+z ziIb%xo1UvUyqta=-ge9vi-tc;S)G0*%f0$TgT4{ncTDFr#(^~-Ew{kW#F8w2KGBQcQh48{ z;a3a2_+=+9ejCzjC#<~q{X#E(%qSE5&Y>4SeUu4)uF>lSSc&IH4ZZlCBQAbM(Th#f zJ;_NXu6I~3kz5$M2=o$vPG%aXXE=95^xDXExzE81eCIv}=d%U zB|pnWtQNX_v$LlEaYEFMp?Qtz&-;!DFjxh|7>dy=!u@FUuW)}F{VOmP#}SVE*615W zfUFPP%SPV_Rf0=p>e$Wm~J{ZpO;2N6r9Aa#&cryHvA9J2N(46N^y3+cm=@adSKiWlu zF!Ho$VPuzRVdM$X!pKh1!pI|{g^?Yig^>qD3nSY_3yr=O^K-xTH~Lznw~4+-{K7-l zhl(Tq5R7LKVTw7LRSfG47l#$2VYvC0b)rY$BGFtY`WVrl6U}iung>Ns7X7s7Iig<` zeV*uCHYPL#H{X#@8tK1B;YNQ5bgSs;3`fIq^AG2eE=72uP5=Fh-zol2kVeCBc(5)d0lNQ+d7)s-3u<>r1`qni1+Y$IBlY- zqq)VtMS9pWj-Lo!V4l~(DH|O0(9+R-S#U6?R9_OxElDAbjkD)sK`{mP*rh+_t$9Jq zik2=2amR}$^c-~Ps(Yu_`)ihSHTB-D>6P@2?_8F$yqAXcX(aAYzVX6Z7)HO~UrSkq zhka$qQM!VP)p0qr?ej8x4rfU(U8}_Cb7auwpdyIQM9U;z>M{2Ex^4V2G5&3O9@yt@ z+T=Km^gJ+X)Uk*gcjH@dZ5!66XV>$H^Tjp}3xh7i+s=nn7Bfw6ZB?4YaWtO6M$d!K zZ<>SE^LS33fRnclN}(rEz#-~+I5{)W57Hd2eso7%FAw%}#f0(iKzbe{`0@`kN%>o3 zp4iq;|LB1eCXkm!&tsl>gGuOl^sxhl*&7e~!Hn{<>3Lixc}58SzA1T*24<9(P0z#0 zquwcvleaHEaQ?FCdDN+W93y#~IRQvB%B%~aD`WoH1JH!^Jlu2f9mTqLxM55F%P23K zp2x+Z>-j~#Sf`qhJPx%sW}UZREqQg4u?_Or6zfK3{>ImXAnX2bJ0vf-74b4fd7B|m zO%hN4gh|o^;M6nfFZH~nos#zzMTtRPvPmf{0$l#GonO_f_U6jFL;2f+{Nc5S@8Fs8 zmvw)-U6SX@TZ)cIw{mhe1Gn;L-UKq~web8a8Yiz@^7dq{zk&5y`Xz6T73)zSE!m{k z-@tk;OI15tC1fk);d{l~tNKfpO?Ps6GwHSP<(S4b<0^b?B%Ad7nf9Djucch_?0huV z%RwHmN7b0ng;gR+?T?cqY3(nr`#&!JrS3r?I$Qqurk6<%rAqSL^`(9X^S1-}8{q!P zs)te&lD9FGKZp*s=YjQ5>LhQc%C}kab|Qc7m0dvw4y1=tu0fAEinJJm05s#q1|4Zi z6*_s@^iVF8JVZC82{1o7{ah`Wo#C*dCdMJ3c;2IUvPDTUuiU8Na8>5F3KCkO8 zbgnh_ysit;PlV3vIv-wt{drwSAa=@@c++iS+!Ak)O>EB|<{vsG?z}GTZ-)cL=Jo9d z->(rx+u0et7w#1JGb83PZV)I*L<{A~(`i&hP2DuwHaM{__06 z@a4H-gKh;$C63tZaF9#qh7EoRZnF*FE;zQsI%S-P;Qj?{^ilj3Z~(~9|0({tR5SV< z9EBVV@QN6ZLXC=uVK%D?{bMp6lQtBQbAw`BhiHjnd>@ood?q;jV}1WNQZVif++V~o z>qJ~O&O}_U*NS}0MExxOAB8R1gKGCr8j1RU2c(z(3H*NwHu`D&6>!wskKT^|!9N3| zQ6h4cRQedaXTcXrM5W7t&(nRFU-}^+D-TLUrCf^pI{l9^6`lmQf;#-Q!53L=^i5$hTmv5>adpoCV0Ul!&6F2Xk4kQ6dU*_$+exZ}5c@QE48~ zxQF_sL*b@GC=r#8bN(a!7>B``C96baQu%k1R*7iHHn^!a6e$||8^EAg^a1z`h@avw>W!Qah(w3{8n7OA(5#_r0XhBlk{d0Hl%dGEIlB&~Gnyz~^Bw6=p zXhQdBnAJTRj!q2|IY#$rgws75nb1ATs%7MEBScRzyg)hLjrjjREu;U1T1M%^IoY&~ z(mDTOT1IYNpVdV|Ux3zWP439FGYFx4G+{(+O-@@`Y;EqkoY8*Hj3gZ-ysjCOVT(J3 z1QU7#>{5tlyrlfAok@6`a`x3AhYOvPTmR7bUZZs+{#~qZ$_qvRm7K36ytvl~&EbKd zhVgPvNqEhZvo7JaT+X!#FPE8*CA@Btlh10J4E2AT4KdTrmgW3=<;4fN^-5EudRr_m z8yVEG{)xI)>G#bc>sqCWfZ|eH5BEPaBe4fmw1QfY8?_B<7@2v2Ak>ZN+WqyQr{to! zfOzT(*i0O0>RZ?*FeSGGt87RRoxu_AQ)(; zKdVO-=$@u1(-{@JmUYc7tGNL#oA!JRH%^CYS$Aj0bm(Yx&BJNv=CDw!5!c!TZM2pZ zZR_aQlhhEYYnFU-WY9TFz90TU^$-imJ!{=+F7=u_S6}9>TGP|C44XpIoxz0l z*4`cB35Q1y5RRAl6cdh*p^_964tHZES^6RKrORiydyc0FI|PDbIN`h=Li9A&IDGU3 zN(-Y0({gQqm@>#mhC?(N&PPpBsjEtn76;|@(m0(%TL??TJX0@?ie{wwX61Cxc&$GC z^{bb0AHwp5H9pTtrLNt_-(UJ_E5g>nZiL+edp9fx3*rz+nQy?-Yz@(O!H?nN7zop$ za7W)Qx`IqF=IbBmXjcvf(}v3dFYk$+Q*JpK$gvLAJ7qIJnPk8_O$N*F(&2TYb<;qU z7uMrrJ@LL^y}G(fM$TE1X4__dsVd>Zsh>wZKI-RDPmj8L)Z?SB9(DMr>qk94>h)3Q zk7aZF0?vfa-yX=~`%N**Itq3&?AfsIfn5d5QH`5m!@7K2$5)7p&98JgJ$|^41;X$P zkY48F-1vC>T&EYm;Kju;5_)mKL}Rl2@TV6CM>KuQu_1ar0V^+#9?*+J36jNkH&ABq z3S1mS5i^G%$jlJ{d2x`5UL0|f9-lTjGaFMXFTW5M+oU40IWQsz!W5B18}#C6hw{P^ z2zqfiLb5m_MlX&@$SY_M2h#Jq0C9|QdVYs^t}NSeJFGib_B3XMCLu3nf5K-Fejm{XMEDNENppml zI7P@lg7oKX^U0I8X&y%!>HmW8KZLwK^ykM8@r%Mcgj1^<5F;lSNM^gU+Zyd!~kgFXVd6&MF@ z2BPU1z0$*gy`am1>wu_llb?~mR?sZZQXq`cH%0$w^i9$BO?jCP16g0ofr$54p99>W z_(F3oG3C`+f1_`Te4731fRPvBkMcGMBmJU^DVBfCWljeaWQKW+Vuek$o*qMs1I z(CDW!e5b-6QMfR&L$uK7r;`5x>u>Z^NpBZ@zxahlKb7Iz6n>Awg%Msyh6~NP$(Vvn zIX9Vf4fuE+<3Q3xnBou66V{nKMPDEf_Ad;-P4w?b;{xwSW2HHQjiwM&0p^Nh4Y}wa zimnm;v}h{9lmB_qe19PQqUdWxzbX1o(xuRQN8_jYqQax19~SNQSL161`KQCuyr}RA z;(tfsRSJ*lrk^9aSoA#6ob6%$W+;9IY0jCe{AZFzeK!9pvOGSglW9I* zlWDq>=~Vq(x1*iWAz9VEvc9DQtK>ra+a-MlyJ4yE$zSx;@txOwp82je!wOK}wTicM zyE<1Tw0+I0*QWNie6iZxrfKu0jiiO71&2~g z;U&8!@BI3teEt>6#X(9^@=eQG+TdbV#=mMXFpJ`9S~fB(&}Q}xcBBh-PcvG)S(JMN z-QHC0bk$rVguCDkpg^1@X|wYkqh;84&T1GlIm6%*FnhhxXJVFoPYg0{wSJ8pr#YNx zaS3JMgRIku=_R*H$zj!QyY*c926!eT6VtZ~H2jkeaI|-Z+d1<^o|InIHh}}~g_kLb zgj%%s*X(~cq4KoKX>l5(7j1|4%;8-NTADk%2GonLjG+^Z!@}U*%?po-nE?Im#mf^- z9pk__nqv&Kc!x6PVD+M%-m#Nc71vnDA?igtIp%N!qr7Z-(Vx-#nUnFFYq-uMt^Uj-IICXtR>`YV{JoIJs@#F{>Q+fehD(pt zta{OVCC|mJ!i{Mz&FG-Lq?8~@FEyiH^geOFSGlO+jhhDD(EfJVrw$v;oz57W zrW68<$CTe0X;9#O_ME=RBzwkox!qLGoUkn|+L}#>78!Jr@vDaBa^Kq!^Fu_g-NZps zNP7kzkHF(wd?rCbmOg#EAxe>OT6S<;ci%-U2}c4{l26hZl*H|T2jMvP8~gE@bgbI0 z*`^PEZS?E=qqgIt*0R|N@8P%c2(#Dz;1qCqUG)^jPI4>?jLy)mf~>b-O?d8EaJ>N0 zJ{lRuvM#~j3$RhV-*|aH#h*9mQT%-j)+)zd2UqL|`15mK@_Ehqz-Q^;u*Lz?5az5E}7j^`u7 z2`<7d@EL|inr|X_`F)_vW8i3W9EZWdA?cVE$NkZ-thb2hmHH5gVzfTo>lTQ zK#m`I1wNdBi2fFTu|L4mFJ^DWL(T>rQ!<0T{!o_Jh=THMIj{P6=s)<9(t?vfnFgBw zb>mf>RAx?K~$Uj;q)pUURv-@;1#1+$;i@z zQ{XUn$)^x@C5V#4%w6&akZ+PaoTQh34d_@=ereHCIF=xwXvCha|HCEJVis?Wt=Xlfc|9=|P z|LZiUGY$M?(4fwE8oS+HBG8Ak+Rg{R7vulO-kZQzRh<3f_lBErNgxTUps1Hk;|2*3 z44Wphm}o#G3E~<;5=d$wF$;oQQKWK3lv-_RYg=mVTiR-+t!;5@Q*lA7Ev;H{En2I% zwYa|2jsN#M^PO|g-2l72zu)iw&L=0|d1jt@W<7Jxo%75yT;}%dx6P{StZ%|*eCcGD zwYS%;uma=Qsye$CTAsLIUoD&jyJBud%&x*h`|_AP*hjO=>z*iY(aYoy*~};@(3eeo z93C&22CbutcV)&g{lib;B>JbbEB9n?%ox#sP4;^T7~4N12X~oc#XGif`%vy4;jvW9 z=Ye~G-Q=;8!2SZbX2IF&txO0rA!mX|86;8C8G)5Yw; ze@wACRbPHa#pVgsMzpI3S^d*7 z=@iw4kmgRGZoaRG0n<`}4{D}CEIOfIcpK+x{6KL-<;8Rjg5*I;;)4L7B&r6>j zOuPB@l&L?v3(wwHa48uI;#X;@XXCG8)zO5y-$PqHiPt$Dde?KZO~?jT3#f=y~FI z@#lzk@!vxlzxOWJ@`K5P%@>A+XpVgFi1a+e$ zXdM0kn~Cd8TrIe$yUOjx-^H~B*KcsWfa`5sTn;%1*U`A9;+li29vAhOxXg7EF0Qul z%zJKW-i3?H2S^&=4|T57!f`c#L0mmh5G6B+%TR;J0|B@g#C1Pu8Z!?D@prfqa=C>; zTzgRv*TfjawKB=#nhk@vTB9H?L@|h~QcB46A_j2@X(SM?Lq+9!gt$0h$i;O4m5VDz z4B{e^60*7s;v$6-a;cC(Tv}9+)4As2or1WoL@o{>$>O>cgSe`p(sN0PL0n`~!Uf{u z`iQu=bV#md{1X=!I2rUuTnc&-UIsPcQbI29Fo;V&;^NvFgSe2Ua(QEYfBM^QDb~}s zuCR7mDQ7yaExZBX+`Z%RA&!oGEx4Tib}<9#oc{K-RiSIuUN<1P$%@;{G{!kT<;(B6 z&>I~{oj!chn93d@{dX|q-kbUk5PGA>y#{3X3qahb13A}`{x2ZYaYc>vY9KysOkF5? zzK}m8ph7nAWFYxV6+RY7{sJKL!DkR7hxKPZUq@X~q^vIqYlUYBe*iwl-z?;kJ!!TJ zF<*GH_!-FXJqmwbs9P-SF3~>`YJSaP{h01b;U&U4;hDnOLat7d{}|y2A?G=U0}Pe} z(QZa>7@yFL9xpyc8ogo6p}7&nhk&dH%Z z=2?>-nVWQ&dkqc*ZiigVx#oOr%)dq-7)_SD5#h+&oTE*->p^4K8@*s8&Rq#Q54aqN zdKtZ7hBtv`z6*eGadv2#FUA(1Atry8pY4hIR0~6tM_L%_6fHD*t&DH8;USK1(!vn) zCoK#$h!%zxh!z^XVYGwM8wQ4kqB0nl)xywV(ZUez5;I;H;`~Bd80sxr7~-cP#tTE# z|0gXBvGGU?Lm#7jq=lh9qJ^RNL<>W^MGHf3iWY`;i542YXv%-thKF`4UTE~98ULK( zcPL(H^r9L6gyOd=UTEz0GX7D;Z&SR`*zINf{fh5aywK=HGyWdMZvghgf;o}nvQ0FR zd*fpP!stec z{zNpNU5wA(u48I42@3Lj*EK1P7mfQqPMAjZ-YjYc&-~hKaG1R zj-H)B^FH$Pk4>QYobkt(CeV!Y$EViwP15X@>RfD{!2O=BHA@`nRf3h!_e(q8v~8N- zXDPLHeZLXC-_S|Y;(k%@S7{g7#}=M^@}&hFQ{Eg2Wo5J2nj!{5;&M&94#pqL`&ifT z{czp~*FUm4l2W(VS6#0;6E#b%Dr?HnWUWuboJL31Q;|Jj-Ci>WB*+iYt6*VC|#k2zzqEi+BM#rZ&S)kr`K96c@h`sk~~KPQ_4%H*XrcmrBqJd?){W6 zonGtT@Jyw@67#!&M1nl?AWN&)N_(hub1VclKpyX{`H&Y@m>-dHX!adbi}Ql#oKqs~p;GsITjDMHx_knD$Gh$J?g+LAOa@v*u|hBe{HLJg3#; zT_br^)}q@6c^uE1QNGb8B>tao{H4_6T_3Uh}wC$csQ;f=d{G`_|*#C3)wlVg-^{fbtz{1;E@{H&XI;NuEeTN_pw@cpsHKDgx5=KF;C>luvmi$lJFbFE@+R?b3WzI>z?z zmZ^3H5s&94%VGahIPdkQ6Y$#%STYTJNijJ17@vcS4pWo4_(+17_z4B{fjFPNUuf|{ zbvN^R%&gFT-33k7lZP7J*PXj4$!PITeU3rU?*+u^*A8X4RjrkA+Gr>TYQ48w{!D;X z#C;cURLP9d9Wd{k@2TWMsW>0Sfeqly9=14pkm)uiU3ckjTO9Dm^mof@%Bri%FMpF! z712+S&J-EC!OYx(MDJ1;I@yPA?J*G8bs%rop~6n)^rCPq4Ym#;PQY>C&d9t>V6K<}=M zep(rQ-HNK%`(VYy7up}T;*|gec!?EX=P!Ui>#i@y6?<**R6XL#yxV?{8 zMsMS16U5z)kyRdD9X3?)7fnX@GEU|68gKH9?OpxKFTbDRv_yQa)nqno969CdGJl9l z+kQ}{YX(ReTXeZKb36{Y=rnLocYIDo^izzH^`_{>FAm|D;y{)L_%;NXp~6GWKZ+62 ztzP}6WFcyYiF$@=<7OP`=y7R@7e9>XqCX_$Z3hf=*DIn(^^wN1l+(Y36l&~MdxBk! z$nHIp$BgaBE(&kuS~DLQBhgP*MDJI^Wr!-<`y`ke3_n!OpR|^x4ZUvQH&9g=XX$pG7Cq~_!rt;Ssy)zTjUj>Ne+UWtux!zHK*MZzSNYzp zl@tHm{wRbWYZ%$DChy9%1>pW37PmZm;(K8wyut`s&tO>%XESaCUB0eQFSL45H|}RP z-mK`Jis;j`qJOrPbxl~d_s{V)xsqw4&%|@>9mSUJmF1pQTmT^oDdAU!kpn1ii^bQ3f2FstlWgvsGQk@+UutjGZ{9_mAumva~yoJhBKLa zwPRfd+(A*3*-pXJ0~s$;&@|hFPRMhfu#4h^{TRHlUU(H$&Q=PWQOet-7vH6Vrv!s8 zIaihGg7bb2pTBA`A=%{VbvRR=77V%+C8iUZk~^kiwJ~+`YQwMP{ZC{)PJ0Li_zTGF zo+uC9QIcSODGa)RrL5v$pv8?qHotMw^%qz6ri1{S;!LKPtEgTTEabvq&=qdESICWE zi50Solvl_Np!&avf5C;6b~ni@S>}aJC_soZdR<1zp9=<^M7PWnocAGRc>{G8xMPyP z466UPDC%>IQT=z|8+04V7LL*a1P!{~BWu}12L(SyPLZrZu~D7>1B7r`Weuikem=jg ze}$yke~|y4Bklf!zUvWX_IsSzkGcsN!OWWw(uYkS?s-9eE;BTfM4#tPP;M-zyr&St zlJ&$_uFUCR3_XW`qfx`m7vTv<*hrag!rSK@c-z9mVu|yoA>>%pAv}WO^D7)V(vVdk zk7Mj8llkBwWIcEy{$&RanUBa&X66h~efmLqK6V*-cXj@wh-LF>mr-U5*?O=%;hY#- z9($1e7w$7G?-lsjdEwl?d2hl09V7|o4GUy$V%iT767JR8m)2FhS1v04D0$9?{0MeO z#fnjm5X!W>qw-G&$?S5>R;GOF@v!M~>{h10KWBOVGwzy5y;UJQ2ZiXzGR2I><0kiS zvFMYq#UeMh#Ud}+w0wTzu8Xv`=HoX>4DgZJSeD5N*5FY&C|0TrkSTUj4CdP15NoUc zU}vlTkOQz)@9s_{k8@Nd$q0yQTQe^VJ zh1pfJTRWQNg2N8t1?g&g5t$rvc9rcCCa zi{#1PbSawJu`Kaek{ZdqsPVhMq&V*mFX%iQ7yIv0UFWeR33jh;G{8!iqVDb;&An-% z2F}}vN1shqo_p)|ZEQlJAbne}3ALXXi zSh`@~bmw)igE))8dEJ{~Mqrs+ShLCS{|ZTPMGJasZyrmY%HzbOU~xsIMkHN|k>FTP z^H`EP%(3wO!Ad#Zc^7#>RnEKI3p(Ah$NoD(+{#TC49s=jW-sVG=Zy)PYuRJ}UDP#R zsv74#3hzF2Xy?z#drd6J#>M_SK|k>XRd>t#Y%J(~d53s{s-0}C+!>c*FgV#!PtfVk z+u)^2x`FN%_a0#eeuX>#C!VCLSQV@x~$W^N~F(csqbaQJH7xfJ=n9BK9N1%!vCHFURz@G*5hxG zKJ|r5_GzF_qHK$JwRWBcf35+3q2f)! zO@i*c2$U@L!kAD@Zi8~o;$9sCb~p%p-HuUi-$MhPjUAoSxCv=db4z2us6jxG8y|sv z4FhbhT8h11I*`I&_(_2}KN)C-;3e3N<(}5=Ip`jCM`rvqRd+!8ar5rvLYih5t#( z{1ixs&j-eZg}4XJc1WwQ78q4JDPm_0Jd^zQWaPrS4hBS8t!i7tq{ygJut$iglXOHb zY;13gOElVK(6uym7IC6gJ_m`m9;II9qLXYvChABeriYqaoJ))^P;AOa0OI)bi9C)^ z?4KFfA5wMu%xV8$Ob|h(^dly1^^$(N`Z$@^jcs4B=k>>vFXF}gV;*n6rnhgikoz}J zDw^Qm!nthRScZ~$?D)V*fzsjeJGO_%WzI6WJ%=0{R4wd{i;i{o@9*TVVLsHbl4$CU zbw)Fu@NwKYE+szmhe6N1)boRpxj!2FG53A$>Qgx6tUFf?|NC1nevN0=6x=y$(-q$= zJmifr8@?8OX!94}x#-DL-^+Vx__Mnnyy*O03xA$_-YsuD{OHTU>xVVJ^xn!I*FQbu z;0<5@{h!8s4B6ZV!o4KN;+lf164yDnT5w&0>l$1);kp&qJ-8ml^&GA@aea)7XR8dw zbu6waxGHg(uQh<1>4)P_Xt0{|Qb^x}P9*J?Bl?PV_u^R5H0^|UW011g9&96)gJq>WmXYnswqgFRO#VEOBqtRRjTes=;}fFGf- z4~&kVt{K#XOWMNxhRvX5xU|vqJ|*P$tdR(Yp9c_zjCe{Hi7K{GQ4nevOfM zep6x)KQM`lAGH|tIHJVG&q561HzINID-(nG$w@){>dYX1f>sbew=swx=_HHaml^au z{8JFWM>FVJ{8K`HWMUA%I4OwV)fmK&YzpGgV-P>csc~XsWPkfn-FmLKe>BZ`LQ<21 z{zh*87c!w2o*n-U0bAZ8J%#zSKzB#LUUX!&h^V-mL9G0eEZUQc_?0fq#kk0X2 z%JAI}e~I|qds!;JH^E1JF1kaNJ{2GL>g|FS7##KUO#t2>z)9Mdtvg@(+l2#eq~Rpq!_Kj{+(00U*=eVR6=v6#pH?Uk987 zKH4W>`nf>zpDKD3a0VVx+(ylEy$>YcOTrz($AB!yy+Ee_xx#;_@UPqOSvM-2=W9@2 zlW2Y_rrg;=noXk|+Erk90g&k!aISC|Gwy(gx3Qp zf34^%ft257!)G-s{5;@9q@N9BJCy-h?g_w?(Jq64<&eXDg_WRt0Ga>$=>HtxUx1{a z2C^L6fz0<|h2IOL{2$ryS)6ytf0^jTz*8W%QsLtiK16gDkm;YsU}HIc24p#I1yatp zfh@;mK=NIn@WsLfK-Rkk$nrskNe4AoQ_kZ>7Xrz51d#H1zfwM*Yn1;c`T<4BdRchA zkSi1nUnD$FSRY!K=lChH*4JCK;^+1^A=+*y3q zk!Jf5`wCw{JxISG{DJUhA?`I3Uo7OjMt+V5A{7~k)b=1w7xF$PT_~h-2 zU&bM_sGULjkHX&yw+inTZWK}}hx~dc%<2+-mXJC>jOTYKq8k_eMdt|lvc&j3YX8LX z@`%Fqx{>t@(YFh45pq7DoG%KaLcQZ=QPYX>XA8L>m~^?YR9GxLPS{UKEi3Z>4gZL* z3i&&M^!>s+g;exn_?Lxzt03JW)LT#%-`5yUyC=knLh7iI9wf{a?(bZ;=QW=B{>$`_ z2=5bqPxvk24Z>@LoL88R%7w()!kNNjgd>DuA;9o+oq*}weU%u`c?olmvA0kGCoj~^64j`shV;_TZwt>bN%JnU`|dB1KDP2_#b`^oa?wPHH1ikbML@&l^1YnTHs>xDeZ2y{Ci+*R?-K1) zi(U}z^ojbh5Rm8Aq)J6Q%^lh=Vm#M@=q?lORB5Og!}tNiP@Oi=Pf`4tqRT~JAi7F)ROzo(`s)?nsQ4d< zUMc!M(N~FnM)WPB-x2*&(b*h?C_ne8(G4e!@^&k~V-)|q;-`_u#P0UF&LfTfa{E*- zCp`e`B@rVo@DLGdMu|EAL4A2HE^pDTWj;(x372NnN{;?Gh%jW|&LPCS(9 z#)Lt$Zbuk0a0JFS?aa7+>8Bw$FAwV+Apadm@~3yU^;`!3l@Pxof##a2Km9cc@pvbUizlz2 zKeZhkd}*$)O=H}~eKz+g6vaOFTC+42^UCJdj>Nf_DR`X@NNsIxM<=v4YU`WMuU*^) zyS6Gyqx*p0x|GIuX_gne&V9^_>YAbT5pSv|MMi1WR`6+dZev?(d*@6D>T1W?Otf(h zrJbd9Efq_-bG*5uvvFzt3g5YwCO2z*C3U@0n#V~lmDrpl@9ax$GvC)Kn{k$i(IC@i zPD4>U>y~y}wPs@gd2Zt(d>dX`k4hyJIa#+Pp2O3ON(`QDlok@?#U1+TEY_4IRV$6g zRLmYwatlTNl^SAc^52IBL|VGR9ExE8b7& zQrYwB#t*_kgt6A1*L>1x+#LRZgWD+{N8|O9zZX54|=^UB0KBOT@8CrhAkE^IY3 zAQV_haL(DwYF@g?R3-6TKqsdo$ENrT-gW6p=i6_c@amVI3C5exzU_G}=L;U(cD>Zi z*L$-KHUCq~OJmQg{2-gMPyz~uSO>y0|Lu&)(Qjjo&t#Ht_K&)>F9H6O>Y3I(uW+NZv@vYdKY( z7^IY!&feH&$)mms-FnF@Mfo(fCdk{jy|HqQ->~ErV8M*uNVEAa6u@gplgUW`D10!k z^3UO13g8Yr=B~j9LcXrd!9}+~7vLNpdcTa>U#5eMfgKur zx*B0HZX~-!Ym3{-L+d-R*Th45`@D@QzC1c>CwLc;7l-tMc^AuqptED_euHGir&_U| zu_$*sFAL_K0=%~PSg<*JTj#Kcf(yN$UVFe16qeUd2WhyVBJJ1*+qfbcyO%B~=1w04=NNx)Vi$;ea z>UtaXoA{{CIvCh`iUnR<++;Z(R_;%GCZ;-pm*=qxR=7RhFlhP@@okXa^U_38<8%JPGzd0_U6EVqFL_L@$4C}ieej1*dSddQS{ z1_n)WwJFD?+g;zm=G-~fs9D^|gheaZCaa8g@igc)HaRO=W0UJ#>$SzRNc%dX2s~v7 zi!;uJuwuimCRk|D(b(JX;)1b{QwB*TEe&o@ZQV0O#dyIX_as)#xhc03Ck_U_ba z6>G;IZmSs^j?vXrsHBlBFBZh%F!@yxwGD|}H{#t+GGLr+FIwVxgkI0k=tEW_%!oz* zWW2CE=De&E?o;qpMqk2sQRc;SObF~~(JBX$|3Rk{%;AHZxEuI1}R=ifvN5SKB z8f@fxIbmoFGQw@aP@2lw+}~qbjBulhgfsbfvtI@@mp@-Xq4TQs_kN47k)x()vkaNk3#JFO2A9LI7tnWJW{M8Vcn zMlW5DDh)I_84;efK#m?~@NW%7rZV_v#$I)mF`DMW zg}>BB{yaYNM~u|?fq6XihBuVf7C!=B%q8`vQRAn$+ijGY$6_~K=LBSbgN<5(RF%h8`w2*cyh*{s9!CX-drtin{VTd9QJ{f|Ml&GltP^nqEc-|9NLeC>?wWJfFB0c9I+ zF8Ryd=+Bt z!Y+uFef6^}iFS<&5kLSmjjj%7C8V~zB=#-{y4+Aj2( zMWS00MgN8p*7bQ4Hv~oR@kHNcMZ-Fw8-ks=amEt)+@A_2bR?Kehnpu>tRO|*F-xfF z3iK?qaUIIKPO=3$JE=fL$py-Z<;v15K9;f$<>0`)h)#8ng|)>WBg)Q|rmx?3qx*Xwuq7tH3^2_6{? zy8L#4rVGy7ivK;le6J(r<@*3xGFYwPalr_|r8^h|U2qd_~^4A3*2 zK^5=d*dUuF=n6%Cy5PKx@b&d77p&>)RSgCcvsjeuC{s=h23?}w>agIv=MfXD*=SN; z@~xmkGuR^&S=#wX)bCW1li5tylB^*)g(TJK1KC^P3swY!E(0pr&;{qsgfEs6ZP>&z zI+U|y_Onb|6AZdELm3JeoOeZBS}Kai(%u9rMBR~K&3|JU{l$nf-}cW52Azl#JyDOv zi8>_Y7j*)tPzJ~1Ip>A3*$HGIdo&UR8-hV6;%;O`7o0bkk`Iu)m*fgEzfSV^ zBrjS7lDl{My+rb2G8dA3m*nT)1X%?#(Eoha=<;CD)#N3H!Ug9I=z(enFMk`X!DR>y zeaFzO!L1~}XUMgPW}1Oa)bEE3yOJYdF!Jg5Gm@)GP6jz>yJSBvJm_A=U-wJ9Mn9N) zFM_)jSAYa`!Flayy&)H}6z3t#`fgzC;NLPqp%~Bh5^%4IWqX8S*{_i8%fX=I=s>P? z!FlYMSf_DuFxF`mpllt#%sPG-WWQrriVYdMKK&-$fL6 zJ15dAwr0jj6!&vG^Exr7Gb6a*JPw~pw~c< z8M(JP(%5zk zTM?4Oi7OnwAiwvoK!FpFo-<8QuJ6fIg%CcO!qA`2`VN{S^G$FM#xTix8=hX-@CCCz zro1N*8_7ef9fqc-yxjW`!fNK3Rtx0Z26}KVINXCT_d+CRPvzQnT?GcVTCQo=+^;&) z+RV(V2WJjvoRZ$zF(G}fh7jtO_8!!?57qT3q4$trpP}&c4WsuVz58(JacuP-+B^4H zhST30rRT%roR%kY8rnd_!_x-9)l4$v{>n{5g9NSenz*SHiC$ zgsqs97wmJZ^Y;t(*#bZ3ft*3XKEHM02L*Fqgr6nM>E-3JoMg7mh115+HvG$f7>rrL zLk}bK;aB2cW+3t&!a|vOuAhQcd7M|4qTqcF&tCut2M=Qv41aDQ?^p1jg(k~CHj6V( zui5Yi^PXfH__9i}o`H9mc~u+E|HIjiBLZ0*Hd*{EHu8(;m%`xXxdVY_KE52~4CWpJ zvI&z$5M(%*JHkiy4(5*bG3N(!OF*`Yd2le7Pa{5ym^Kp3^`4&~3xa`s)-f}b)rkZn zmm*~Zxz7OdrHDz8`)nVH+^ay|Df!5*)<;6sIE%&3+KTv`5PSuFkMQ;0ufQ9D;J!t} z`tVK0_{R?Gb3ejoV~XiJZdjjZ;AeUJ77y$5uJcbAmg}W0Fg@udKgy7vgrg0~8nA`? z9z!yaRR!TWk0CJJueYx}?w;&Nz2JY&j;zn{Dh5WTGb@{w7pUlu>B(AuMgG>XYf1K4 zl&DvK+%%j^vs0Uu%}KBs+dF16wokIn*xW>$v3a%-lX4~_uY4MFJs~HDt?ai;+b`ZW zZ2#nvVAo8na^rhvpnA@(tTTIiP)rEsC5jlELxZ@b*$t>XtkG5Uw+Ro9Ny@+wIi!E^ z&CmDlk(-mlLca2O6mIAdroj%)L+>4C4bmR&4AMqo25E;43|90%5=}Rp!f_XIWqxF= zy+Gl2mHP>0_UwZ+&OHDf?XZ9|dcf>*3x0&g48kFfBV$bGlD09e^-Ey4W^_^E_z4ro zRJC@s*Ec$_CT#*^Xt_>SP&>xVuWxN=9F1={W1x))t;x=gG1D8DHMX?k{HHNYg#Q~yT_QMCeUp-aY8HZN?4 zxz{l>+hO4A!q)clJI2gx?OKX2(9l#Jy~u@*DQ~QUajlO3k)rzBt5%YZW;#rNIO|1=8FymL( z2`yclA2oHC#mwlU1hrkT_*PQOJTbIUiWq~=>a?Yai{Y`AHn_cOX=n2iN=F@hTCE6x zaKE`W8-n=^jMnuyG?*PO%oy1p26n?;4?mrK&%@!Tmce-M2?Mh$AIq+MBx3^X^s_?9g<^etWXLJR7ED0~lMyg2zZo4g`Wng%D_@qDG+~cp8gvSanD2TlHO~7-FDR)vF4e6bOHy&%%FMeSOO1RUI2M{Op-WLIw+b@eW2reqUT$8p zscPEgT@eeqUfyrUf*zOmP<>dx{$#NsnEsLbEC+iBuZRj>twJQ{tl@#O(wK5ju z3Uzxd$QA0DSdc3eEe=Uma-ovi+Z8I-Ql~rbEKg8U7tqQE9d|s?1p`&CM47rJ5oF_H z|Gy&cUwWzL#3HTFHQ!;Llp5!ywFbHrf?X9 zQscZdz+_V;-3%_(RxefcPI-NnoN29s&aGJOBYU0-L5F+Md1KipHLDX??3FO7zZ}b0 zk0og!IF^`{)1B8XjHMXUE^3}9xW;*J!RxlIM6LD2{<~B(078eR_@TJnl2wYV+Olk`yjK(z)XH z2rS!inGK5lcUka64Z0Lr(clA}lM@UiW%XmRJm{4s>0TS748HDVl*HnC<98lQjr0Bj zZ{>8sKvI*tR5X2LS*o3PfR`$%7hEd-F1D#ocivcDNkhpA3NsQscb+@oP4XV3+DcFIBbk4);1bxX%Rn4Vmx?jhF{vz*tv7kK39OTJPnnRrIRxj1*&KoOatt;db zPf${?UMc~xROh)==XY3%=MMRA>jE=6;> zRpuQYOO5l6#fphdRXbkZQ({3jF81FE`ot4dohR-=UaIONVPCEY*(td$FLq<$X97WQ!X6 z?*ws`kq&PI&ie~5=)C*n<&J&Jl{7pq5KAmoQdR#`7VwidnJfv6X={f{c4y;$);x^K z_oVd3{ynWYpXSV|@81-DvXD4a_o<@)g_iD<#kV)swb+-ZKbS9DZ$ zwQ^y{DX1semicF6^o9ju4`Z1 z$YycUKhws_aQK?45f*6VPe*Pqv>Xg)AUAfz+>HIPJ8R}6@liC z+0FH6@YqQM>2`H@U|{X%^Z{Se4%jWPZ*1d=T?bAKa4SkYnIN`86-#N>aC*U#277b{NHYQgRWm9BbxZA# z_D(xUb2kReu(1El{v4E{0~_XjcO$LYo7*l>NAM0Sh;>bXyA6CxZL(8;+M=@d#W1Fi zHQj(&)~vJ#Y*_BO7{TpJt5>u&2I`yY+9kt=im_IcYyd;a*g+CqnX27HoAfAnN5DG+#FS6Vgcw@B zipy|8Ls^IIOVbVkh;D6foZYHEFv8-N54Eu98#!g>6fiS>V&YA6?_*L!FUObz2Q(7} zI=U9xE?=?&cNC`&+n9C?*{%sF$YZIPH7CH!3-IQKL{2Y)>~72}qqw*wE9?OEw_B^3 zg-r;@MF;ZpF;y&S(;zts)5`gkFtQLBZRb@t7qp@aYxyj#t>q~k9YAm7)Yi`IT3SB` z+wROvTi@Q?hUpTcStF~e`J%?aG|bD64f6@7V@K9%qK@TNdm$d-oXH!SJK9=tf`(&h zX@)U~x|Z4^+*chOgZBQK%>z9^8EmxYd!#)UcbuGOc#d%~ zL9;*C-X!T}O&Xx!RBXm756$2Na-er$>_x|$oiWnTj+BVnnnO04>N@6NhhsC&>F^#k zjOXB)WGCrKZt$Q0JfI`)dE?F;@h0!oQz+{buoHZL+Pk9|eJVIp|e`EJ(z zcH<&D`NZ;_YWFJ&Z_EKWI9U^ zlMc&)&XYA7y-{{lEVW~%s{^G!iEo98CH5X`aYbL$)x!7fX?9}ty(uJBH~E#&4iE4A z7W+hrwTh+vJ%OH&Mcckkdi!wmAkFLS>lx*4tN+FSBU_;KGnOjFi)q2A(xdR~n_X31 zw|Ft$y*!V78IClxHrgXJrRH+d< zZKhtT4@gdHOUrSK+8Y}q3)`C;P?#i#EF4iX3D#p~x4K3#O%lNbhXZ~1n=~@2Ev|yjbYP`TQxp$}q)!Y}lD!fv%M44=|9L zM!5&b`@d`l-U1P@CXNYzYJL`U_jD=z<^ITjz>jm0bV5>KnT}HOj#jc!BNC2OvZ0*S z5W}pFJ#ymRK7$4399`=eFOm#(T? zdQQtHhjn~$$!|6dcr?^8=JlVQ_T?W|TvU8D&uSWeLDuVq9bdSA_R%NwE*!LDXf-O( zfU6VNmAG!ebqlULaNUpV30yDZdJk6!6&!$TB(CwersJx{)qsn3U9ZG-1Fl1;PZ-i@~H@ZoTh-?((PkeA!d*NS>zRHhE;_RX1L*qa6|@`UUH_SVQ=nb>XoHpU zuD#qn#4ui|?x7juACFS^le-f*PqXZ-$4*>q2g+u9u}zsTWwX32lj$dv$@PanKO|4e z54(rGGo_5iDtHEv5spJH@k}X(v8gy*!npVj!!j~$UtD}Xn!0cJd)YjLiswnO&OD3ihwomMvm*Na8@~G54~pEGQ#^-?XH*rgT$A&0!G}AJ znDyd)13$>Ri)T~4{=wc(o?W%!sEz0DeDwI&!V9iAu|9I+CAp&?+`RF7zxjJL+KOZ7 zB3$cmZN&9cTo2-U8W+!0+lz~~Uq|68!F4Jw+Je3S*IHcP#PwrbyqBNC^*XLkaOI;h zM&O!&i#C$Z!9^96D{xT{3V&v&2&ih&vg` z#cd6e#gE<$qUyb5od=ph+}tQGZZ}~Nw_->Z_l%(Z%q~s@aT9@JxL=dZt8qyr_4^sb z?E|Vkx0f)8drg!JcP%i88?7XZ+WQQmD!;fMQ;DffuOMz%AQyKpC`X-F64(ft%8|Qz z$i-biO32M84B}1{1yN;(LEQSIAgY`&h+8xyi(85q#MLozEs!kk&JY(E+5#L9HzC}K@EhmOkD9^R-sac>bmw-RWSH>J@tqXoy8*#8NZ+`3ywk#LIR~KS+__y>B=Y;}?LW6`L?WMP z=HCE$?%b|RI40>_eG<+qbH8_j7tN`h8wf7X@A>r*xbyRS_YALxobe!7_Z_OwkqDy; zKcoOB_vGYyaUR+zwi25xR*q?_Lf4|FD0=|PNRtnA-m<8ZtA1j=rhspbW!sBQE!H`{ z6z7q(fIlLBPuUb20iDK#l3cuabv%VwxCedF6;@xxL)e2t;tVg;PK)ja@{2Z_Y z@@4@cZ`ScZ=69Irexh?kb8(vT{*H=~?{7fL+XbY&r-78mEj^U?3n2M6i~cT<>A$J) z8-Pr|4#@PE0hzuPcp30C;7Z^LK*}oyQXY3vU4?LNu3~sUh4&D0cQeAL?golH&QKX8NOq1Axqj=S)z3P~q?OuzYU;DgPzW zJAh_<0nPXVG93+{P%h8yTaEU)Mf5j-YY@-5tsQtFkmIlo*a>Hp5K$oDhm^JmdJEIsRYqIm}A7a;#vqVE9W9d=+;;VTv1rSMwO)j*ba z8j$ii$1>j{Aj>-p$nu)^NrdkS+W5DD91pJmS^npN?EgP1{@22v*!ZbG6#Z>r1M>MA zkm;|r@v~L|nf?+W^Y2pp=M-P3__Gv$n!;x){6vKp0~=XxU>(Xm2*~pByBpzM?lAc@i(Uw1`gx+c9?A5RL?12W z`T*oj<$E3TIScnOikQU>xWs`%-ruBozY=d3>NjZC0?~Q_%lZYzGx=^5t`jy0&k>di zc@7KtpTl?~QqP;n^CF2ELXIoa?tHjT(R{`-oWC)Mg~H!~ApMY#`!h&iEqovKCjFN1 zXTsZrQ-#Gs^o`-4uJTMrqcJ@gntk|B&3xB^4%i5 zN%%!!RCt+?HV(*twvbj5NS6o;g`-(kd`?Z&i4}{?FSHV67qe8 z^a|kx!bL)w0%1JgSBR5^5h2ZwFr2FS#P@}-3u&^1;XHST_$%QZLRvUs_!osy;blVo zLd-f_G>xf{zeHFlOq{=X?hyHCQGocEkQO;e|3JvK9@2atA<_&Cu|cS{wJe^a#Bdss zAs!~=dkJa2mk?=lhPX@f+)m+>!pDR^5&l55YM0$_rFTQ7xrllU@Bf|THzYyLo8^Y`C`+?>VuM}_wbzc2i@@XNw$g&jhz^=2&)JzqFg=*|N@TJ&(?K|-Dv z%=|+_?%X5I_YdN0!WV>m|6urUgjjB{pgf|PnBD_wBcQM1?BCHdhDLg?qLCEz<%I9JX z5z~@EfI)t%V7Pm(CdL;cehJ=pO29M=uP}wcN+7IL@VsMl{^Th@{tmAI!hTBNWFXhB zX96jF25=ALOb4?5(}1jh8E_}C6u1L81-KnJ9=HuS4%iJG3)})M0&WJPOy>N_F~E(W zM*}wij{~j;9t&IpJO;QDcr4D@Hvs{G^BIo&q?|Nx1#ma|;Y8q0AnENujFsGO z(VKyI*D~jpGJZYi$-tG0Zv*1p)tpnx_&J~_0!tNN2t?h?cwl@!=;MI_#qUPBFeXiZ zGk!a0ywl}&14(ZN4hL=&y&gCW^h(ifzzFCCqUQh)2VE+<5O^r)i0FJE#=dC}%4hgV zK(<>SAme)j`8(!Z;4a|Vz@5O^z%9UYfSZ9F$DB9nfE$4L{b1T>9&iol(ZH2JtQqDm z2c89N19JQ}0g;z!H-^s#jk22d%LA5!J`-39R7c4WLT#I;h=!Vue+v@kSYv@ldCS{OQ3v@pc}V0vL_ zq-bG?{ls`-XsBpmXs~Euh-<#&7l!gh3q!p{3qxVi!ca)GFcc6i41J7trF>zCWv;Tpn|4Fm|NweQc3r+u%&R0D9owU&OKWX+q(DXlP_CIO%J87Zmf6^bL zof*%5CoMGnPn!MDc=kJKq3M6p?0?3y-$@Hi|C46_Gk&Myg{J=*|D57?VbZ9@CrBda z(QeU1&Yv4Z6Z1j0i6(NsEEP@UJULi2k@Na))SvQ+oZlZ7P0RtkMKrM&=y~f(~FN@#X_buA(=4AS+ujZ z_?~FD@$(pV5<1wO>r*Crk;*flG+wYGc*&u=O!1c~o?md8ew}E3X(oMx=&hpf68((m z2SvX_8Uxs!JM(wN|5ovRQ4hwi$4e32!K5L7r{c#d{_BdLEczDF(?$P9^eoYDik?Rr z^4^fVrJ`wppY98y2Z-kP8S+O&|6Fu|=--Mi68(zklSO|j`Yh4hnM`^0qDPCqO!Q3A z>qVa@dZXxNqPs-R^|I3v%vzlvTcItycy?O#%2<9U`Y z=@Uc`7JatpVWKY-eYEJSMUNBxP0>?C|3vf*(kOqI@;_JccPW06=zB%eCLqhxEqb}q zuT%Qwxv|6|2(QvAcB9~J$g=-s0KF8Wi^{ZLkxw-;W@>5d_d^88lvixq#I z;%AGVEPAnM9#2BIQuMi^zbg83qPech^P1hcMO=5~{prpf`kVMK5Pz7H`5^qp(fxav z=nm1xlSZ1$#Xm>!7c0J5^eWL;h`v_z*Oh*q(%+%@uPXjA(YJ_xMf9zr_mW2WH{wSV z-En*vp}fCP{7lk_-!sL=FC%>@exuE>^h(h?W?GuhzdVGwbHGL*nCC^ibGPnN{9xVx z%Rpt)zn*nmB*W(ThS$m?md zsv0}XIyzeGn_(%Tfnu?j!fOATf@6C_Ew&m-mj8%uo#%}WB-2pX&c-UYYqi$w->Ai| z^!T0nfm*w3!^A9UYiZ=RW1amSi{a*}891T40eeoc@0Vwq)nbF3_CazB3ye_KWAjF% z*?npEYos_k+}{#zqm;U0VI#JA*Vfl{);B4nacP62YipKX*bH)RV+UGG9W|reoU%F+ zx%*nL)?{95H-Xfmpx9K5{V;K%-o8_`QyF)7vU#7`#R{{j#4z%XFK9NuKD8*KbIlOq$AAT zP)=aBrU$%Jl6|L|r;ABdO?G{KEpBLR$HyJkxuSMi;enbHNo_OYvlt9XEg?2>q&3lj zZOZ@e82$JcTm4AhK@N+#fs?0A^PRWa(m0VLw?37DkpHz1;ydY?d*ry)HMVaRv)^3L zxCso4q&%oRb!d@0$=XglI&D08c1kHS-6`Rzvr2R3ck)@?=8Wwkp2^Mg(^Ct>uROW!ht~{C20n2Nt#hR(T%Z*Y3_}QX@~2 zfmAI}lw46Gr^w6}@hNP?*yI*a1iL&wg{f;1jvY*lP>STSp$M@qK#J#9uUc}|;NmGWgWO~w;ah(RtDWhYh6NG)haxiuhE7;wHK{4UFe8&Nc7 zY)K^MipGyEJbqlsgz;k|5ggEoh(Z&Ikvd`g_(%jzJKpjy$j19`duwNFeXH-WHoDdR zGW^|#Z+(iT%OHNPn%{%O2-ea95nOQiRurIaRXSHN*v6DH4VH#u_P2&X(IHG#&s5UErzMHMW!Z+=i56u)Ptlu2kT$P4Y&Ke z;KwiEm~-;#7A|aWT*mTEKcj4}7H7creXM8GeO~2z&3wVMVfvq1UVGir#jvQ8D6fEx z16ODv(1ed4baPNXWsy?elDc|R&g>XSp>TBHMX#H$@MM3 z+A&?k{KvX2KJv1@VU&-zAa0*j<%4lcuYcp(uUzt6eb-2y#3zBuXVx52wci}cbA?zh zc?Bq+>guA5Z2UCB(Bt}zb&2h_K=K5EjgaSe$?aFa$S*LdeEM2b}NaM&oAEf zhp8_+II(;iCC}X!JNH{YGoE2q2xqJ_kXE^3h~j{?~>ckmXB*`EilQJSiZvkHnkfsZIH+Dw+H3h$NkZ~q;7E|C)7lF zB?J#PNFL`J#<3fkY6N8lUtRc7L^6ip5?lYk)ki5+( z-w`$_L0)5%j3=7d#PL#kkWIA9LSSXY_U}#zQz){1yaQbWzw@&%GOLv;0 z>qy(m==dJ?NO~OTex5xI*E{WYN>9rg{WZ?~eS?D57T-@;H?R+6;q=_tQM%p%*ErPo zW1Zq&^z5l?r%WmT@2#I;6J*{E-K##z$ou*BArG&5G3Yx!xvPKq-mR-X>T%g0in`sY z&^Ro2>J>J_vjHwRmYuJR<=%kYpQWFptIvG@O$f2OmWTMQK z`1d-ltkw9}^9B41gnx&BU&WPyGt>fE--NH%pBm|vd=JX3I)b8ru0G|$0hkw%k6=inX> ze_vdtba^MkHxU=k!95ayb8va)NU$LISAr|y8<0U4oOc6)`(^}>&b=HZ;;yhD4_^!B zUgIN!L0@H_M6y_AsIMGqXJrbwg{}-_Kl2Un=vg597lL`fR~UT^xBlC`-u=GHfa4Z0 z0L6Y6X>$IAf2El?B+#q;&#NG7oMiOJE31c7!rBjF$NLplJrzL_H8i7o2w!cw?P< zA;M$r!0&2yK#k{sx|fOa9!G)^xNy?sp@58FMgagv3Y!d^VE2ZdB_ymVSFKD}E4MznJ{Rkn!{4DND z$UGha)8NUP0#7d9 z10|=L2Q&tjGeYkUD8RAyW3Gx7t0kN>5&@&ilPxc#> zho(8mp6oZ+o$NOxcCw#2BG8-{h=Lyye_r6w5zPB?=v z?r1)1z40_-g%FImvl9;FOHnGr7I!2bW(?lt#`PGCbL9r$Ji2>vVBMJTW7*+@a8z8) zch`k~jDQny@ZCV)sd0FtG7cv=Iqx(ts7k&hz-y&(Db8YYyl#aEXHz)u3@_Drj?1BY z_n7Cg)VL^zj-|z8@%^B(VeY+v>Ogd;l=I$iLlAV1d>*(|e50X5rS7r5!1KZs^>nGO z_E=7L-dJ8q^>mNp54}`L^>i$scq~cvOlCRVal6NHiW0jhDx%V*VEK<7_L1sV`%I^O zBngN(Ytin8!MDi+IPfD`j?d)oxdE%p;jHNeTC8pTme!?E;j`70A_Wztsf1`nrTt+N};KT2dj_OulYx>T2NRtfq z)7x5?HXxa=O1}1lC2p)*Pfve@gzxZ&(|F_tO!z||2G-sGZRbX~`UN~sst18*m)UVm zq5<#p=R!C(YkqzoJ&w~JJbUqNIKiR0V{YRGUCr$<@Y@V4*4D;0w!T>r{+6>#4`x}& zMpAFV*xRSA=oB4DBm9ZI6Ej2Z=1Dj6@imvuO*NK^{dfFsuG=4fEakt$$9o@xge#VQ z^X}g96S5|5?RxLq_HfcPf-xvcTr zU!Qd9H?He(@%2C4{_}_WXqVos5P`l${6i$) zrGE?IOz+|!R=msadC^Y3Yd5ChmDp|w3S9lbw3m+sa)E(klzCA;%S5@UWFb097Teh6 z$Ip0N%GUC(SvzGv^*|0GuEN5x3D`ejTnu5^`rx7*zG5%>^6)!pE0Z=dX$zA!FKG{x zwlZl;)7jQ!`Drhcwlir9v+vihxP-PhX=9T%GHDz0Wyt$)T-m78p|}chO~W-0S2M0l za9xM%W?WolqJ5f|aJ`Q!jDjA5Yc#GhTwG2-aDWS1GM~t04F++ILo4{NgJjT!xb)?N zON(^#I+O^f~zS=YnDpE#U&CkbB&VBAK;QmuKO^EYfK8_niqq(Vx)w9m2fmrL0r%z z7ngaIkPB7};)<4nxLU^`{;*fQKzZY6e|90=Zy(Q|-pMgLg3}?#*@Y~oP&#Mt&r-Az z!2R`}UC362dwePE7~TY)1st?+gA@5hvnu!FDzR*Pz0ar#`D4Y4_6BBgoZ?;>$O#R< zA&+|pI21$oRUqS^1~UE+K&;IS{3#Ik?Q!dYX=}^0?VR z@{bd;{`gdK+z24~Ss&b+0~76iI6EF+usxVnkMiO#OZz3V?nFA$KNe0EvfUZZ=Pq%) z(tiYkG)Fjbhj6>_0U;M!@t4K>l&Jj;S=6^6%~e|BIl^jTg^&x@_{%y%c$l!iFr7UP z{=Q|pCxv$j`BRwTUlCp>>=be=F}_ZCrtk#e1R=jKk&kx)k#iyuV6a?RDl8H5Sxr9n z6VbJ6s`S0FwTS637LA>W;lKjW!+;TBCXneF&-4g03lfJ4QAV>bAJ1UJhdJKxf!FY% zu!cTN^x;6t>nR#z%GfKw*f(|xFfSN81sGqsJHdxK7&`<90k?z3xXkSahJagu1A&`? zc&5bJA3&R#eYO37>k*G3W$X`N+~=+Y&GIe>qJ7MMTa?MzAHaQ(y8z*E#{K{*VeAiJ z+?#r`T#RJBZvdiP)xr?-AuSADBU%_*BU%``QnWC%QnWC1iD+Sn<)wUKh~tU0Fw`bm zX!gqwMtlLnfuWs1e0r}In*G+KpR?g+zdh+4qMs1IFtlB?F!ZQsVQ8CZVd#F*!cezp zVdx&w!q67c!q6R}g`v%&g`rzT3qzYk3q!Yv7KS#87KUyTEevfCEp+uckM#+mzm@Jh zA|6g=+@QVAYXi;kRSqOg|@i&kjfPIK6&qa#=i{ihi_>UCNeSGBa0hx5a7XRDge_HX(lkRQBXYxf5t`|E6 z>4zwO7-{+?e-3GsZ;1Gt#6ME}E5*N3{5;z|7dLh(ZYsK)adGdj)5pSG6Uf8e@AQiv zQ2czAw+elQKhGVUK);C?e|$$myzEMO>5CHLdnVBH6Xa1gFXvXn~2c=``lCT z_4YLFgDtj)E4HB!>M~|s=-;w^%huQXxRGMRnL8FXRXu!#OtXfVwEm(^P)WTO@vY0G z<*`d+UTNbOTho*vx!15Tn}#>Vn%cQe?>T;#OH%oh6t=C_y4?$qIx>y+cd{n85#_0` zACOY~0hTX~E_>?oCU0D@D(30b+tbu9h2FoFldRirwc(Q+#PaV)v;6>@Al<$IYyfDn zW8SAYAE)u2oPkqxFU0%YKceSeGO;kG=RPa8OG{_p?n}>oWf+rZ1Q#6MT?2zjr*U)e zV~uX3cpQy)V58^G^mGTR=iZLz6rGc|dyKJ@$Cs3qCPM$59&|cAcPD2dUh?Vs;U$+Y zJl0cC#2Z1(IeF>y+@IhA58S1C=ydA2YD3Nc)bi5kxzjE#9lF=JxAoj!gYqehl=9N) zxnC}M5*HYTcZUR*QeHYecPH<7yqC~9dF%I6zI1x-Tg)#Dyib{5c(8Aw_mB;ccZ1C$ zW%<(Sxv%953*37eFUR0VSb|F_FP)zI=kan&$Mp!h!$(-e)+?hg2`WLJd61^n(_W8v zExN%L0)->Zd$p)!@aY9p6&3eOyk77o$$L%Zqkgg9#T5<_l80|msrAw~;72Z9xA~8C znj>ua_NczNZS>}68TP05JzwpQS5o8lK%U>FDPLN>^d`wGkdQFu84krQCEj<1gz}mG zNUQg~Uh*_-jQ;C^lrNp$_a@2fcKxC9?L_%T`31|b{z$toqA6k-=ZHUil&x=gl3g!W zum`^Jl2VU+OT@CyR*LzM=Xd++k5qc(;bAtldlYO^`N~l~H9@NWNUKMlpCE5@Livze zg1mj}kwZz#xScA@7Rj4~@FP$EFr{uLL)qrEIqy;FS?wJI6`_?1hsX^PO_FFmHj=zmlY)9bn(&Q_v znG89%(T>9M(Z?*c`ENo!S zfSz%>=U0c~>BRW*wNrW`ubzfwQc>LuPw|4fJQS`y|HM`@gVlt~?yRCY&q&!-)9gT;KI*_nD z`jpxuy0v`uvz>$4PA2?M3ZJ+Y`tfgM6m{qQyt{m@>A1@1yU^iBK<}K1+wxX-V|XFi zP$a8dTg-x%uf248+1@`Q@Ng@uJbEAKE4%Zq{E}fdO^c@L0hSP0$Q+%q1=Oc_x|K&C zG6BCXkIve*Ik@WYJ@T$O*QVp?a^T#AzP|_FG9EmH?2NpXQ+fnCk3rs)^Gn25MqhH3 zd#K!+u`=xl<@?pEFuJ{7VL1-H!H9kViI90k^Z{0)JSrN^T^aowg|Eeu>+Jj3w5ZVQO)-UuoF8Y={iy!Ua4 zL6i0~As?U-_dbq{`&F=1EKDy%y!IW_0#nbm$!waa$2{M1zKWNcy|`%}sEq!9?7a(o zRK@u>eol6?S#sHggg_9`1qlY^l7x$hB8d=8BtRqqQGpPXg`|cAb3yP@P|yiQBko{FO^#BFScHwTE%J=FO~oIJM+xh&Dq_6{l9PfzMuCupFR7X zXXcq_E@#f1%RKYUicS<_Kn(8UjjS_@IPr1eezRo5-`dVaAd*bHAAu}_x^KRJHVRRC zd88|gTb5TZ_{Zvbd_#G@7b^sY0D1oDBV=Dv-tQO=~qm|#!&k< zsM^f#EbZ`<>wVU=oNGqjR9&Kkg+E{A@@5$??%$Ul&#=YY+H-VXxhnE?Iq{cvwGUU} z>O495ckH3?_KVBJf|DI#LSONlBD&E6=cP_yLjLiuU??h1cFn$AF%M=N_@Mn*)Z6o3W zhQiqkuEl?%Bg&qi=m@f_ylV53F`t3uSLF76gFm~_W`J!(Y+?+Yz2Hyyk0;7XVm)X~ zD`A>{G{H{bx(oX_+cpwzP;w}VbFuLx=|UaHGJM1YzU35iqRq)>+lbiih@!o)a8r#W z<N6g($pM_%$ygf@ zE*@9$?8cGQzi;ZrK(A%50lAfAUy@dzS3xH?N@+@Bwz(LikxipIU#C##}g!?bGW|`f%f>j3WH`ixA_p`(~0ks|tUK zRzGfg;7tthEBepi?b85H_K)DR`ty`s1QLa{^?3?x0?GSJpUv>3-wU6e^b>e}IQ&QX z`7PgXXR^vlegNA_z;DmgJ>Q(UNf1nDFL({H;ZD|!@Ng&lDJbs`cs+e%6U!#(hNQ~kFA68%H$BnZmE zVjQQ3r*Vf4R#7j;NuweTOP$;wCo&=J6GILlY4zy`k$(1qM3`poYv%^C5Aq3y_IU9HugS;q+x$ zkrI;nTV+{VGz!5*94Douq@a7HBOE0TFUU{}G*Sj5cye+fI8xWaKIGoD$e!hTe=UO2 z(o}IsYaUp)q;zyty~qQXfnGz>7xS%Frd~smW!8}N3$G!`*7@QR&?2?C0pay138-OC zn8Z2NOIBd(RoA90i%V7pdF`^S6{((pTIPaw9-N1G#teyGiJ}xfa2nwJO7Tc}@n^cX zp$(45iA=DzBFXs67#fS0-*MBMp-0}-)*7+gr9ui6 zwdQ5)w=8OVYsl6RfYm>`w&QC7K;unJd(&X~zxg6%*UndOj|46cb6_&)j=KoE?m~8(n|23Y}&1*d8 z`ZE(I2Rwb+{L4S}_uH3{o8^DkKjgf3-}86A>wo^Ev-}$pj_&7KJ5nvt!dddDZNsZ<jQMHeODb)1i+TFW-fAP^Ixch6{l%!CF=HqWJ$Ri2RI~x&?;qAL9Q!%x1jvaHSbG z<6kUcy_9~wQ`D+u;$0CA`mT6y3kN+X-Z#QQ2~xL0r;b(g#JfBkbd7kqjF%24qEozg zhJzj#@5|w!x5P`OK1rA?^&jB0LzOZ4KO!7-oOp}FLEK=BZbLZeYVq=+n-1lovM8N7 zLkN0Rg3Q@KkZF02adZfxo(COY`REXIym*VkK~>^4H*Iif_VB;yTnn96KFxSdq0ntA z+@)feDV90;3=0d^z8Vp0&TotkLM2|hzd0qSFkVvvkF{$1T6Ymtpt}qzP|FMde5ECdCKWqmBwpQq3qk%z9aFb z|ENIIb4*!Ppefi6wd-*JKUpoon4Ag$i_} zi09w61Tf}P$G2Gm7%d3S-@YWVMvRzF6D^gG=yv2vfNq;3tDJw_+U}LJ;ar&ZPsxzaGKH5Jy5#GNb?L~Za9YDjL~j> zb65CW?hfAw9&UQ`;AEbb&iIz;zmPkpJAJ(J;-i6fW^z{4PtlT%p_+PDm@KPcY^@l5 zv@W!IiWLzqVa2U_44#6{0&UOLYk(!^w%0T=U>5can7d5%p(!YNYjfkOQ02-HwpD0c zz^>9d#R{>{V55X7y7O2ob^TQ|vs0caF&E!T=Vc@>Q;3MVnBrYE<~r_q(K7j=E+dmN z;%bO-5yiUv-97mKQo6`0ojzL)&n@4o2C=?7Pynx^JUK}JtB!N(<{JA~W&EFzE{Ho`EKwax&v`{bwRpg;)HpD$Fm+pECJmXoupU*D_0lBNhWkED0Nb1dJ`t<7?*qgaZI#wAajKtw>%LH^ z>%$wr+kOAc%-mO(Jo?jpC4HYsx$xek*I$3-dr!^_tUf01mt03Y@?ciw5uR%SCx(5R zJQ{JFo8dLUx>G*OK)KADb+jIgZD1yn^FB z99)BxhQbDMaN2ez4n8nFDChnyRKlxjqh`Xvt!A|P1K~I!#vsm~Ne~;JL7d!@rNy0~ z8N_*N)*X%$o($qFoFwE7CWAPsIh;I}^#W)Hak^U)a*~=s-T0G)oW^Ak=X8aO)7uQ< zw6}0^I+{VOq;PTSltG*{6)sNmGl(<)Qiv`Q&)GoX;v_A(IAbey}?h5?z6~7s&8EK<4wJ zgmY;y=MpkQA?ui)1hy(s@< zK`L30{;eQ&Fi77ic#Gf<1g{djMDTpU6@t|HVER(QBEj*3#|j=P*k3S3kSZihzgNy% zx8M#z+ID9AHo>ieHws=a*dcha;4;A_f|Y`^1d9YG3yu-Y6+A*PQ&4V|zJt=AJ{9~x z@GZeV2>w>^X+e%htjB$VoNFQ7Dai4N^p%3VgOTPsU1GD~a=}G{Rf1)LoarGyHK2%N z1&aggDo1*xq>nsektTktawq^bWzd|B{$!7jn=g7*kgeF{I{<${+8 z8oLzDLRSe=rw>10fgqpXNT&*V1wWVZ;3L781fLW9jUW{tnf^zD93M%4PmubRr0WD1 z338ldIPMt=In7RblHedgK0YzrF9=Zd0YN^CGM?i&v0HGbV3#1(3K_pmaI0Xa;6}l9 zf~y5r3f2oQ6)Y7j5}YiUFPI~kA?OzbsB*A8Lvf2`d4j;LK-?1ooxmf3TYz|$QT8S9 z9H#6`piKhn5Pk%3H4rLh%1!|C3b1?wfJ=dRa#Z#uvVj$#agR~<1JIU%BG7nOS9Uq@ z45aLGpp42cM>;Twc-;4uJqo;wDtj8ZpD8;Vc&|Vd6t;lmn+inUd_Puv#X#1x2ne86 z^}tp%`b6LsAnr8*zH1Hx)&s`_mjWjM7Xool3Y1EC5ik$*WFYRdfjnR#FbEt2%mL!Q zsqA^+ohM*{&IcYqzT<%Vfw+YP_5#NOyMe6t9w3HnW$$A&a3^TW>jGk^RCYfYz76!T zz^yQg8khlOydO9n2yk#R=r=&)yeqpKKxKD>^d24VeMRC0 zmE8@-@0R#o5-;f8DYT%nyFvaP!rvwFg39g&;~$au?Gi7j>~1jreu>{E@q)_k2IKFR z_^lEz=)Fy7L2swfg32xl`oFSE0`z`>_#DuJ-n~K#dfygW(AzDvpt57a^lVq4YERO8 zgl0RE7F6v?n(YZxc1%dKJxT8renHiqjNc*gT@o*-+LQ5YPp024@q(&78PE1)Jlm19 zplVOjY){5-m3Tqbo{VREGQLyd1--l;kE7iYAg?oCcch8DzV?HkG?CX8>qVOA1>Gq$ zk=M~`p^3bHDugCNr0VBP9|R2-NFfsrKO^)*Lcb>TZlT{4 z`aPjP6`HoyDDR&__h+Mm=K38v?lwU>S?HNU4-%TskBmQ7=v6{b75XZn=L`Kaq0bfi zQK8oe{d=J=5&A=+uMyhEPJsMw7n;w_q<<;&B%vP^dXCULgkC1}Z-xG@(0>-1&-Ik| zzR*7>osMsqay}j>oq_Wq^asNKsqpi?f_7)N2UYV~N05d*4{o+}g%bZ{P?6TD5m_{%G>tzMT?acXSexiEd*>gA2r+WvRb3|jXWF?JtrEqNsHdn#hO6G zPLZ?ATGf8(W-b?%m_FORb2==tC?=~KHUMf@tQ1o_m`n|u<530IMohSWyPj^<#WJCg z%sKt2Kxk7#E+(bhqT?!{3UKn8d7))c0l+M_i(yXX9A%4Jg2TIra!2*(_K(4)^qHxw zBCELLo8#$4psAoEjD~2Uvk&&1P1g2mVzb58&4`=A^s647A})8FS?Rd^J@lR8RLzti zJc}JyoXl>U9{253aU9D#+>CcZv<(?!pC{J-tFi6h#Ia8^F*bLc?SG?<=x8H1@r>of z$+XwKt7BCuPQGeq>lplMqw84VacWx_r@Do4@{POibsYKQqb(JwcAF4wd`O2!@1U#0 z;Za2PB96X9WA}|1yI?DmMsc{K`+(w(yJvQE9W}pWLdw}A zSXF0Yyt+rXxt0^>oW|IDTk%hd)3+x@pCipb-ZXH8<)!eJ#fQWHw zLv3*!BV(};rTa$wP7uQ`RDLk*4z>Sr;l$&PpQPBi|MBdZ?M=09*cPC*H+xW<@l0j~ zalqlx%rblQssPttK0dn8ZDSfZLzCozcVguZ*B;dO`e=S5uY0E03;LG!pp2aUsaoD~ zc&4OVH%oo@pcijuVRtBdP&eTt0iDqhpDoX~I#m6~mKVn!R2p7>>59}pHdvGAh64&275j{u9*q7pt>U zBVzFu8Fmr&jAGiqS}5|U?Lg;0QKR{fuCG!4j&1+yz(k#LiwM{{RhMf!%7^dN{FdY@ zpJTd7r9gk~u`lyxzNo1y7DI#2aFM*owIeZPL8-hK7J zVtn)QY2By_VPw1W$i%_w55@6qons$~mVPR@&+ftJ%eB>;^haB5Y-Rf}yHI(@=X)u- z6sA$$6RSAJs1OVe!8Xo@A2M2}G%*amgu$DpzJkdTn1i_#mkqYtU53%3e3Ket3!W`0 z=qf(=YFWoKVEdJ3TL!j=c%{Njj*5f5mx*T}u)O0v&>*TnsHEi`2Vs1ttmAQpqjcF( zWhhR+{%IIDf~gjNgsB!)@dYpnbyzj-*yC&`9BCIRr>x^2kRS~52Qcvm;r zL0CxYYJa=*%IODTf@rs}mRx?3Rh<6l=Z0PJmK}VGynmT}W&6S6^L|% zA**BqHXMF(A2k~hlh;;=|0V6iiqju>2FETMRJs>&X!!Du5BJW8;?Kq>_uZnoFG#=i zbowHAsf7Z1$NB>oY`+N2{A)}BS?M$ObS&Og4g*GL(~dWFk!btpb0J{P=ur%FI0*+O za);2mbCh?yTh_6o^wQ7LuYbJk_*zjCDwgF(p6cS6ao z^bJ=aj5eh@M#31C1VSnmC4R%1{<- z`cY}e)27hon$^2!yRVeej^m6$GqGf*(`hrB5c~$7Cm=Y&dKs^i%F>HJ@cUUL_8Y5g zQxdKLyspC3H0p zhfBNKP|T@!q6|(kgFTDc#C)zydk`Zji^-8tiYa~IS@4&4{M{IK>ydk9MKLXYeO0{f zGuxFn2V+x=jwfeddJy}L!_XV9Yyaaj{2!-3@c8-zcKdVX9S6cSQ}*w8$~#PrXkbsZ zkP(F%jY6yKL2;!h|eN1JIDT>i6>rUX%PCeZ*mnH(jh z&|}IwT(_5l-N?tU^Vx?J7@1G&?2Zr73NMXTg?V3{-iaRoOi9u=P%92C^b4}!rhyXN zO(FV@sS1MoB@1>FQ?p>NmU35nMZ+qY8jt=wyJJ5h_HnBhp1ckBtLjgzQKHoQj!OE9 zy7f++XGFb1QCCiV;#l3OzA5d%iQcC!D0IgxRqTm_9d6V{*}a?C*9lS=$Ha$Buf(|2 z4q*_2b341^V`XV^>PrYhiN9iJxH7v96dnYSwYJ0f0fRf9Devfh|6~+~>Dj|Slv`MLFAx15t*sxdD4%w#din!4q~-~ zqLP(%2{!@x=xy6weLUu+!808p-UImadr!?sJR2Tb!}7fX&ozviV_V+m8J#dOBk2Kn zF2IqXZJhZpga0WU_E^s*K%a-{_uq*Bzv1wtCI1nSpBKhT9EsDCzXM3H z`%?Sgo@(n_+Lj2WX7{6QfVM9N0ICCKLk91 z!6ffwdoCwAg5+IfzMK*UK1t#C*|u#2j&=keF^;_VZQ%d>BUCQ;F`->$rK(jD+oen< z39Tv8*$Z^i?K-J7=rv~Yq?~iZwZP%F(?zcRs2n*p|M7@v0%X#Smy z-i>4MG$w!U5j2aJucsJ;UMcr2TS4&B`_BK(+JOn`m*9*C!$Z zc`jxqZ&KIzS{!L-E0S%#lRT-XvB>Y(N*CES$!6hgmJZ1k|2yRWhRGY4{2dMor+_D* zgulncKVT9Mi|!qcVi)zv%1EpM#lbF#D^w_=Pc|*aC1n~?*^{%pU!V;6Nk?QPQuA6R zxDFxABx$fpz=bM`9HPj3L2{*A(vgbff*C~~rAVsfDl(|ZzZr5UNz1zlwBMJU;cJ42 zZSU(p)OWt|4;boKQ|+B04RiG(0)_}1tP}u?FiwR?$5BTflABx z6Py#%nD?=T;LJJsgw6I40@E&Hqkh7k{SkRmmE!W3_RSz{+a%lJBtJs&e<@dj=Qc!m zX=Sk#HvAHK23WqN7KA*FC~d>f@|+FHL#{!fjk|?y8*%32xxL`X%UFyAdpG)gE{3%u z*+8J#MpX4U>T~SJ9KEK zx)CTM=N<6dOBkNR@6>j+@_tV5QswoqKsCynPH%(q4yN}z$~%(YbKXVma?Yf;QF)is zyXZ;EZKiiQ`)$qz^w!gB4b5Tm*jFhT*V4OLCA@*&Yn1mkdaot}+^`o=AJ|O%Ig6Hg z8L~_1%TAVgpX1GWklsvkSpJ9b|2~tX9sOrOMoMxL74MlOg+1C%GLIf9ut$nVn&FJH zGtqDSsexP?ceHc+W3)-goq>OEZX^Evxm)m`k^39`2Xo)We;2-QdA-AP#~_`ZJDt5Q zcM<+QxvTN-&Ak%;iMhAq-&N+DcgebSYjTg#zRoqdW!l%hI=5Q;y4K`=SHjj< z$9U7;NX+d7ZRKvqzn%L!{yn*0;{Re_ZYJ7lJvMTE4-M|^0+F9OFyeZiju7_#)V!g- zS@5q$GpCNUeUCD3s#-Q*6)Dw*He~g5up&c@g^nVTSG*%LeLOFx1BjSosTw`hEldbx6{8{7~P^@IOfZ#G$?qjDOP5BqwbiO7BT>l8;oR zBVm*x|A~ZbxW31dv^-l_o~IG$&rFRdj~Re71GeSiNIm*Vly1zk;69jSjb(#)6Fsjo z@lB8x%))@laS=l8Bo1%PBTL_;u7j8L$x=6|q%9zMVzac-Q!AdKQ`+w=%bJ!-BccgN zFRb%><vC{HIsKRJ%PI`|ih>ouIdS zw!ebbF`oetgTo%zwqoVD=34GvKeix$!ldKJRW`S`)P@W|mjF@Lf7*5_C;k2-g{WN9 z+7?V7NL#P1 zYg&!H*Z=gXYZyNn@AW-&Qk1b-qu)3-Y;ZQh6fC;?oXW}w6SM3AhE-Ye0fEOA-9NRF zAB3PweKX{lLbqP2-A^x;SzY_C|;(gr&};oS*M;(0Yq%W2~lvgcIJ3oUPNtZ6A( zy%OeuT6wBfL`$S4+-j(rjxRJOZMBhIu;CJB%*wVF6E&x@M5z%tV&+uNXi!=@=vi7Y zYEv$TlMujbG}7qp2s_!6<3G`Jj{oh1f&mG~WF?;HzbDb!>3_^W$3HyzS^vA9J=P`3 zo}aDtFZ17g!e;+FCwTgA_Dp!&U*lPjFxrN#TmN$Z&`;j*zm_m6Yx(l2(-Ly~e>Q6> z(hW;E#=h0lgpWj1Px55=@AjXc?4OlTp7q*#|1rt4rWPd6@+2=zp5=cu+5g;n|2y~i zv-}0gp4Oe7fdB4U36rz#@$^ZU0-L;9{`H{z+ma8I`iI`*-|z-XwH}%IS0~SUG1))$ zlZ4^@5@z@FKTiX@eG+Ed*Cw2ll`yGq`>zwm4De@p&P^z`6Xs?4pGz2uQA&?qxD|;9 zhE$E$d_js~pVF`la#B?qK?ctk&n*tiX(r0x72Arggq>Lkr5tF71d~_+F`r5Q76pQkvk{T z#kc}YYVJj#S)!zv)DJi;Q7!haM1_mHM2idm*J6~U<0n(P7-d-|Q8XZ-S)!WCe1rUj z!!qA^`N>hIimHK0b+?nM%6Q+EAe^cS<2T3_=?sGDWDqYa&7{3hm+`(E<}&3pp9^DL66R~<0;dGkrcfqZn29%n z);Sf9I&ps%0pU~?CR>9s%rT!Qh5f!$=%@jtRPyXa%D>GHb67cig>|_0m+@peFNEi1 zwfDJNzf}PR%!bu4qgkWv^lEFK>T#PUY_-+i#!%Dpwt7pMuXXJ0a&6X}%K2rmB)S}{ zu*`ElpXFobFnDisPDoObHeO71<1w=j9OL&KtZHj)J`a|9=dP?dw>^a7wAZ#Nmgy}aSO=|aKU>!xiLkV+ z3{3*xDUQ#*EDn*X39%H;y*f^}rDG|TwvEB<=5p51=?sfoTbp6Ev@KM}_CTaQ3%U$( zA|uve!4U7+?aL!AwVDmx8(QZy)P}6kYFI^WQ}4RUb}lD0w))u_2FA;LneYDee&%vu3&s7_a)xus!wLzC)tHKs}m!>66C zgC>uvr1ZZyO(3y2d5sQZRL`O4d7+ifEp0Pv8XDVMLJT-WpJ1PEL5bN6HRpuX%OrY# zt!g_9OBr=Y1iIfar^DKASyOAMskNc4VHK@GN4E)`qm_lq{^OtSYI9ia51q zWeo}%Dw!|CNkpRgRWm0?B`B+$TaMG#R1g(Yxn{-L&5cpPF!)~H+}gS(cEKv^8#QR_q zSa@o5)6cG{om)Atc|}cAR3fx|!KB!sCpRoFfqC?JiOL(=+8RUgImSoV9hr?U>{aae z!d}FxrH;jwm2;<;6<3wbol^~e*(r0ZsPK6uRmEji3j_GqN&gd;( zONgD0cZligHr9gM=W5+}FkcNnY@KspZnB!?Drr&+nqlL*W@Q@&uv1!^+gG+))rPIw z@bOEP9=Bj3zctjdDpXhCw!U9oTOX=D2RBKK-Rj^+FPhZX{DrZ`39F5_TmBWQ{{sDw zv!(-$r$7y>trAH4+}d9-2cKIFQ(+{bV#-5J`q6?V!pg3i7TlzruWl@-`uwKFGBp!~ zn(AoDT$e=O&^3ejYnGuY*uGL&rcpJZ$B8VoLY7+4f_n%I@LTO@g|en)&1i-2M?I^y zrV-;rP3<|@*`U3pskp9=-w`pgIT3m+q2YAhj7aZ%CA4ZAYg!q#O#4^^tJOSfpc`ad}1*(zFDtNQ9a5rh=eaKqY&=|7R z(lOln%$LdVZQN=^leAdo+fI?bgK>3RYwQRX>JSF zGzHaZ#bSTG*~JOLWxPEGbBp*eqMwCgJO~#zHMiA=T7rC-3O2Mt2)b$AnjpH9JSYaw z!xL{%oqZ7&_58yp=ff4GJ0m6K7EQ@*Y!{ixz6yQGJU=1Y?RLrwmkH-=S)_Bv%Nv%% z;*QU7VzkE{&vO^)-0|k4vEgyY=bH#Ycl>}u#1|YQUS1O&F1LL1aoaGsP(ue9otlVh3O;T=gWoK1<8 zgqM>QHEmO@@FN$umeB8#*o2{`p*1vRnebq!(?yus(!4^pcyNX$Z6iW@7Rwm%{xYSZ zX(mRlDK%|;_?)8OK|*zElZTbfO?9o@1Vmp@QzFK=Wq8b|Bxe9dq<-=*>mlzvS8lk` zw6@hW)rPQvO)KR`ig(_5D48Sj6n)2-V(u7H>t4^=e?BrezGoSh3f&nI9t4ZAG0uLR zg#-H2%JD0jv0qO=`zfzw%zP`m^c;EvI5Ke@_+-$Mjpri&4_Q-4^wbL_=gw-@}dW$5G& zH_yD_!JfAldnI-FAf1pY~Q zsUeP^^&BJNlrkOgZ3e7hal>UNsiQ=BNsI|C5ZZF45Ch+6oQ(W45F^4a6K&v zsnaGoD$R0mDNS)8+)AWkLh6u8!lytoh?>Xeq@{f?m(|$nq0pPMD(w3r z%=bp{?H0Z}h0T#SQ}eOjJHWS9_`d7rbL~Swxu1f6weUNWrzU@qOFr5ls1Uw-w_G`& z)?%q-6*K&E?9@G(KIX=40Vp>G0G-c>q$ z_C^W6Snzy_ZhP?5{A`vpk;)z6Au|>^}y8w7R@@oUK9`!)VSqh|_A;2=wnG&81JO<$(VJN5k z*MX#822%c0K+30jI_2LFoC>}>fXs*X{+SQ$f-;}0fJ}cb@I=rHfK10#IFL8BMCg-% z1>lw(ij(|#?+iZQguKN&b%@C4v&(0rCI z2l9b~@mw`W+=1(y=}LiBz{!Gnf`bG%VoW*}@vT6(A&Z3Oa}?#e(w%3k63B4iy|I_$K;0)Bj%ZdxC2PO9hJrxsr|i z?+a2znDpI(mkEAX@LWOmC-M~uP8NIvjmq#>1n&~ORZt!Vee4(HJ6Vw507+BHi1?PE zJYxE&pTzJV3SJ}FBB;K@A^t%yk?$9R)q#$SeWof2`IAeSJKzEY5@JxFuBCvt5F@pQqtf-?k96jV!T!8cOqfFL(2VEV7* zd~@6O6> z_$2%rjKk#ri{KvxcMEdCB;%oPtMI3SKN7rF@H{~->Lh=aAny~T3j{|B^1i@ut_dab zK0q|rC)Kt{b6qO&SAtyEN}8%94-w?}Px?!_uKzChnjrU& zVm$8;M6SCgQel#4#)m6~zEqHlI~i}ri{(OB3swo13l<2D6g*O}zu;F8MtPqI?iK77 zd`gf@vGMcWB1mIFq^T84{k1@P=z%AhzDf6;(d-Z z?{mcG1fLMRUGQeX4T2X6)(GIadBme=;61DiC=zJ}DLfX8`koL10km3?SwL)czif-;Z?t zf!#pTyMfujE}^#p@$MVw6nZldZ4g)|^h#g`=%qqe0P!3VC=xm!h+BUkC^UGvL?8fA z`H{vm1c!U8Si*~dn?Vl)ZUhbmt^*zkWIGN4t_0#8IZzM8xl#Ea0bB@rAg}_6HdFh6 z;8{eK2j9DT?9-ACIuCq!&Qaw{0kWO(Dx~%WL77y!Fodh}V#rkS;8*uYB6t|7;z{oT zjeOL87C^N>2=#S`cRf1mj zThfBw6NMJ^a{n5}3wkFAE$C%`XS|?yw9tayJfQ`>!-W>~@;YI9LGNIp1-;y-gYkmi zenJa+d3`Zn(97p9(t=*U(1KpC(1Kn|XhHASXfLK0R7O=uAJF06PbFT^yI*KQwOmPu_ZiYeyc-09 zLK7!~K7jf%o;V8hPN9htKz9mF90z)}(8Lj-D}*MF0i7o_aWrVQBjpn@maFlN^lp?p z5A+>C(nK$4_FK}#k)YQDOE|6qha;SbcO5lekPd<#3;JXx#sKmnUM}fo32p3}@;#LC z4@>-+Lhll~mNW)RV^@{$vE+Y5;x8hNQO4K}<$Evb4QM2~JB98P`f;Ie7n;vgl=qs* zdrRVfEAd|l-7R$AM9tqV{8*x@(tj-U(WH_8`@&Bhddg2I)a98W@t;XNm&udgi<3^* zCj7&M|01DJ5}Mlel-Dfu)k1$y=q;onFGu8U6MCr7d~Rj@0-?Kw{*KTGgl-l(gM&Nx z+l0;&`g=n2{gLta2u-zimhT}cPmRz|3jH17e^&S}5&8q6eC?^J?SnHd1lGP zOo=yZ1E@R0{LFHee54`$g-VUN93V)?$@8;AS3rJbJQvzT(){KcNq>fvk#sYNNV+es zmq>b#OP;((IQj2%$=mLtA8@5V)+K+at9*~R%ERwHk>x3H$;))*m+j*Jfh&Hii~fx( z|6#89F)n##mI-Xiz37Thcgbr4S7iC|EZ2kfx%jD^6v@BJ#gAP|xGjs;a;8?BRlOp# zqP8BJpFp=Fy#30G*5#GZj8p7nqqag%g?I`&g!Z$RDYBcC@Hv%GgRg8jKLkBx=)5m) zqSCT#`Eqs$+TGQ)HEp%^5`q#Kx_W*Sl=4^WS1U3 z;N)K#Z971Tl^GoiYRYEO4rP&`#kRuH?g)HF8K zVfP)Jn5MRf6M@Q$S`FJ>H-r)wOG95y3+kYJdSyviv7g#!`h1|eVfB99k##Y&%4!*O zlAtV)GuBkQCZaIvT(-tai!5;p!!nsEDkuf2Wp`m4hxH@l*1?np5@V{*NpFeDDk5Fa z6$WVD@@DL6R9!uNrrODS?YAy{QB*hk0(jE|mG?Q>RylIh@nc zGdQBf#CAEfLZQ)$Q{1+udKLFh;qEvE+@OOVLmSMuPMJPE!a#l_RDCsP^wu4EXOwbX zvYs1^L~q2QH{5`%7+cJ6*AZ2!IC&Jr5m&(NO;kc7p)k(oFly5qau&uBRTyWdltLqU zylFbMj}1kQrzqu#llFhv4mNShJRwfL6QXx<(YwCHX&kjT4J)Fymr4{Z9(=Cm*Nz)&3{pougp8!K_^}d!g_~{Nk5?`-Y#S z@pz!_pTrXP?~?!o!1G-sgD!qB}{- zcO0JmT`smfrTK}q2Gui8FP=BkNitEMbNSp#*PgC%H_9hj#FQ6rKa`Nj(^8=SB=QUm zj44kkwIkA9J|oW~?PuieIYjxWHc#i4S10-*0(-Bp^`L6T%eVMR~5b2Vq?yC)}u!4dPM}ADblSP=yHe!g8d!+Ry*n*f{v-Me z7Y#-AmtbGb7!>}ce8G!w@yf@C(ndVwy31E2^33^N2YD>tHk2>+`PJ9&ikjsi-b38- zN?r0cy2=O9uKpLX{|h1^ug7>_A@WRNHjBLND4z)GQRPGJPg5b|XQ{NA*$;N|FsHx7 zl*hipC9>}FZ4r6HMcy8B;}#kaQyxz)F5js7J|gmFORBF$UMb2qLd$f?>wSNk40+Dz z(rK*KTZ&Lmdy{OlC54K<+$%d%2!lgATLYA?{{S1d{GMCBbS&Npw$m}F zmTDXDZ_s8F%Y=X~srw zt`NB~24>|APQ1M=V!Mu=^ zU6ptx&sXJSU`GNwnQXA%mQfG^1X>#a_#k`dve&De`+JRX~wk0-%JXEAl3go0&F4kyI_eg=AlnRysdsrqKvj zQDRa=3AygzNU$ZQ+kJm;{F!#&Kf}+pEs6c@zMQ90JOk`hR-PqH?BnD@^{&KZl}pk{ z_@4*6H_gwzqmumT6A_X*1%H03QTXhveoUUt)0=4Zr^c`(+cYjd?3#>8yjXyde*+SF_opNjfvi>2AhVkz?MAGTOJz}P#@iL`gh ziAXb0szo^$qU$MiMHW5aw8w-=sebG z*Le*gkE1Hk5vKW+!jbYWkN^lb-Y1=)O2ci?+~yk{ma2=y`#?D8OYxd(+on2qPiF*~ z9Bk_}<29*c*!udnnaK*D*~n9P_$ISlo7+bS!E%0WYX_5J^FlP^5WR1GBzuFlwBv9u zj+Sx>MoBCK)-D*Y@s~TSqlvvClB3fmD zYPVXB#WPg_8DM&hJuvQ33!6uwy5d$f!J`XqL3DFV2nL1pM3EBKV^EPHDZ-3avEJ{y zcWYcdWN^H)uo%C#-sxC4?M{!0I|jq#h`aaF3du6G!-_g;bhY%itP#v=1VgJ= zHa65Yv^A~?*5Uf3O}bEBP+u)U78!=qrUY|~B1OCHL+}xdu18OZ7;AJa9=PDilf#7l zE68sV=3ex#q(9s=K``Puu~!#$|8sGh_#ncEx#GSpxvDU~D1XZ2lQH9ngI??8!U@D8 z2K5jZ1ZCE}`{C!2ii3`2GIkTVRFrj;C8G!N)WYw%qYaMtt=(%OTA^tmM9 z)Tav|`vl#ug#Rl|T6`BL|6@YmCbUVfz7rtM@T+eQ5&Wk9y1udN|L0Hcy^sBu9|qW` zSQg4>oo|6mwUL*zkAnl`)EUeHUnq_fOY7+{rNAR81`whu?Ijq z0JJOcHspPdBN>gr^=tV!rsG(EqXEZ-IIhOQH3h%Iu@lE1aeRn_UzzxNe+-T(IQV{x zV2dxitRo!Xh#ACp;r=Q_y5b^x_ z!XSRFF*(A^AbtUmg!~@DAbuPXF1~j&h;QN&#Loo`;>)*`i|_ah;%5;FVn1LI-^`_` zeBEadzW_*%{N}?TeiRb%vUoy$dJ$Rtctb9J)R7>5>|qeU6-h!_^<71+h%<_xd!9tW`}`0O8A_0%tDiI29E8T?O;YPe0=cUd?v4Us|74H`WD7qAg@kFh| z7z)e>jlQAQVQ_s%5VRM_dNH2qhX4TsISAwc zF^&b;{`f8x*bDjS%Ykkn@(%0);yeX*N_ZC#7ein>5a%(l6^M%=&saf-zRDTS323^<%jh$@*TXu}aWOc?ho( z^tK5t=v^taptn(IK`--XdO>fU(1PBjLJNBHK<9v8(Ay0f=c7tctrH;4eg;(Q1W4}@ zn*Exzpjrn*dbh;0zmpbJ>tIOll=vMIFX-(OT2QTnA^#&fT&;s4yZcIUwnLa`28KnDJmYEkmQ{uBF{#=Pa78e)Y zMu{IG@tqPsUgEctMt*rxKk5N7ze3^ncy)d!3I8C{;NL9#6{Io1n|Vj}gLDj3Mh}DI zcsee~rBYv>3eraJ<7MIBEb+Wf$zxmrh)DVyL`2dnT=5%S^eh+687BN3_hXm5dKWEf zk!1^t=T#3^8obV{Uc_6_Sl7#%)4J@UWFu!@Ag!s+w`%*c=7P zVx#PN2-cWv>T7^#FN9XCgzjf83`R#Qn)c8aJuD?vD0(_2a}2{DqR^@|y?n8X{shtM z2QK%E`5~B{Zy>$$MSVh8Y&Gg?=?0!Rx0fCkTd!60Lt{r$12={)?D*Kh6HTx#j8?ss z@`caHzfi{Gj9^EBSLx(Og{mB*)jt*U@v*rJqV-J`JCu*5Jen-kvBr=k5kEYu))+ty_dGYjA?-Y4j3T(rOJVOIx%8RF`YUJ@{ zp3cbIitk1nRXczUV_<@w@4ybRFYjE6#(izzRj zp6UZq9wTEx(D)p5$y0i6arGj%i##J{Av|o#ATDG)0@2A6ktQPa`eN#V?h$$WG`qDr zC?0_xg+th(^gws!=!6R;ef>~fz9N*5T?x$^t9)_wXoDOm;3_m&T_SG_Mxsmd2`=`gWuJMn)D?{E_vIr3bnN&+K&Od`up$&qrQi@8=_) z9%!daUJ>NEoa_Adt_QkRH$2)>z z%8RE5+9>i&HB*n#@*@6Y%8RE5x>@Aq$@rWv@@Ox4f)?tM*Sj7l^=0Wye_1$6#shRn zygzeHs8m8F}e-iZ+q zYL@pQ*V0Y+RE2NkFN3~|bjLHwf4lLQbv%s}>vW2X5vrm$>*(^1zbkT$;V#{T7g$QM z&njM`bxSKNB#+WfCm@q06p^i%s8I;s^*j7$X;xjj!8)&O%8V#oS~!o1eT-k1?$2me zi2e%_s^a{e5;~qSrTe2M85LDJBzpzXix1|qEUJl4M=>g>|D zjy=dcBYgg-^Gk(aQOMnNB2;-NK8VyNsd{cGJwB&BNy-P^U}T#36*KK9*$?*3I{&>o zf9mAA>fq8mF5Pru5|Y&*nVgza@d&IhLwF$Bxto!|K;#Mgu@={ zxf;;t=k$Aig#RQOYtHF2AS3a4P)h32C}JUwJ_9M$$1h=jBYA|*WDxxR#N>?R-yy-* zI1>90P3BaR@(&p5WS*F!5_qUwl*B*3_tbFVlmCRIL4Lw?c`5rrFzklPqFSQW0wkV6!?5aa`lJyMaJSyALsisUyQMFtglogs&kwEVvS zeF6^Ow3LZ}1l#j#KvE5dl=-8 znO14_`e?Fj8%eFz>-hudq-ppoN=}L>;aeynn<6>gPUbw8@@Lw~2jS;@Rx(u4vXM%K z53qf-xXBVGE3ICYOF2oc)$5rCe=5ITq7*ncc3ObU=?n3fXl0y$FmIy&JD^sp*VSj9cLCa|!+aJK+62e5psJ>;(Aj0IRL?2v}Ln+&+pO zSi4q1djS{6_1o!%l^INVsQ7*_fO?YD(csGF1!@oFw@#~n9mV9@By1ysmph%kU<880 zqGlp2EUE$2043@emAb<6%m;fC=hAc1`(-5ZLROW`x|W%Yv27!`uaw$e@Vy=xT+t(g zUx3nO9Y_0!R{#4cX1p$|5y4@B&R*~mMCCZuw&#aS`Vtwkly?2`HdOsdVy@9inTpXi zT+4qTE}WJ#L<0-KU?2ZB3c)K;m+6F&7(J~l8@bv=wr!;Ca-^P(M3LpmaZZ9=W%VD* zbfvZ$RZSXNN1?M9{J7V&Coye>%?rymX=sT>r=_i5RU0LH17wD4L*4d)*RVDf9HF0M zhFLWfce-sG5$uU{_JUm0I4mj);bBo_;*UV$aigzd~c!jBh0Pi2y^Lpeup$k`ynzX1H&78qQ1cPF?=qn9PAr8 z?45`ZHeg>p?9qTR?-YIYuy-o?(Kvl&*c*#;om7XwoXqTS$4)*AA?y{I1Mu(^PdT2t z>SbBeQm3Sxkdly$n~Byl_eQI&Cx+G5eQve&B$wK{KT(wR;a8AksVIM)f5vWN3O%Jl!QDbq)MS5_MIW*!Fm z>KIKF<<^_8RLg+DfPN$U!D=F`eUEu2m`>3;s))mI;nt3yr`1~>-FcT{u8|&A1=S&k ztBj8VMAS@`070BQ>X|VDBWCxa;>^x=x(;Ao5Nc7|0P6rekH~?cgj!tc!F za{v1F)e+?D$Z4U3Gu zu_|R){u<86c)7HY4(k|<*F0pz$je0W;a#ViZ@gDIL6tf#{BKh6wSx}L&bJP_b>Sc# z5dJsM9NQe0s54<$9&}iu&cwfMF-F8?e)uaemNzz^UBeAHu|(jo7BsYAE9}u0FZBxzRd#?%eW!>(1I?rFNy9kDb@e;)C$;dl<_& z{%57ezqC>VcNKHrq4IsWKU>G1)q@Tyvv|CRDW1hq@i3AX5sS2u_q!-=B~9P_;>+tb zUP(}Q#5GDnahthcVx5q?@F-jaYjk|XB`L}k;g-M}hK4p89yASQRz*dy)WM7%Z0$s+ zmA>2(9n*^a8f)vTnj=ozVykB(N336oY+cP2(KtMFF&-qir*I@!FD+)(n8rKQF1x6u z-ZdV1n&%N_6w$m`{^M#etH!h)Ml#h>R*dS0?*egsIxXc}HSJgtg@sYv5I8zR)9x&q z(=E9~$kda&ZgNc&K+7-%Q*(E+;K_A56dBo~-=cwCO%&1L{>7$<+eZJ%2=mt0W9YC} z$x;)nF;PoSR)v?G6h(N4A(iPT!*nh1`mXdr{*!h3HhJ?=D^HGZlg`b{dgDvU|8^Hd z4)S;yGcUYkIdiu>w>>6TW2QL#z#v%7nitOhVg4g(T?~R$`S_@ZZ#vWkS4!6`2UR(! zPSXzumlNEZdd!zs{HdWm@b|&ByT3eglIPc7-c<5+_EDu3=Qi)U>B(ysZ9j3<;~(9h zk-l*KV;?lvU3A2wPYgKzk$nFz@4Bz+_;=15b6i)#`ltRoF!}Ts3+jJ#+6!ZE`0-QU zCGWc^KO^*IpX+#7~&B^reM)7da^|1Ih3gm9zjrC)Gre2YGP_{b{_D#dXIa#V4vCq=6Y2ACn zvTO`TR%+~HdR}`>%RX=Vdp7*MX1KoV%{Sj#$~9eFyTv_Ux&Dj$x1L#_K7#AJwr_tS zo9n%}9*ldtaxED5eB~N1uKD6xF}4HOgK^Cl*NbtTn3eLAFSvg!*M^No!KUGuha-ez zHI7XmiBgi1W*b7&q1aY=bg7_7h zT>K<0L7eAg5a&uHh~>sl&6Pnsr)?w`vr3U4w}rV*a^WnX1g(-1^Xs-G2s2xdL7Y{Tpx=u~&QeK2_H}YiR|zRx&8IRb zh(F=Vkc1owhLZ(zL_QO@KmB#ZwD zjv`*HaNn13C*O$uNZDRFn(d&eufr$lC@&RlvtRZZb?&<{^5xztJB9CbcfP0S{c0(1 z5%@ZVZ?T)NB-}2XnKJvTa=cM4M!t80&+MzJ6l=)n;^Um~clp!nsD3`F??> zVYcog5&7-LX$pV_bRbfL{YcHCl{@#%uQ^abzRAxNDr#%~mK?>G02 zSI2)QxI^#}!8L+rf5#l5GX!72RZRI$2~I+}(GGzikm0;uNS`F}ccNb~oRgG9+9xBf z6|57ag)@fpqa~4(sl>5@BLullnBiH12SAYCFZhn&p9EhLrS(P z`Jgj_c|i0{bzUJ$t-DMIQZAl{lw9;%B{v0Fitu5;$-n|2<={|qh(XX`R_Phfa*tL) zdjBJkYG0x4sLU}4-wMnHb^@VcruH`)0bB_hWe9M57zJDi#I>XLI~oWq1w9;C1cd%# zU@{QTeQLiqrpp73yw$#ME66?Dg1E5jA|6}*XV*9dug5F(13##?5jNhrl zy*ngc(Ay=npjz)rem)Zb)p}Rb+l9Vg_yxV&gckJPEwrFo@5=OBCH-v@FR0f4;(Ai+ ze}QTrHMD;f`x($XTw|4>+DDD?L5UwM@q%g}HO8}FGClWCBQ2=*Q6tU%%6LAjkQP+? zsF7wrX1rJ81=T)kjJG8IYt)CdpxQ@`^Z^~N_E97KsnGj{Ur_C%#`q5;ey_v}dfygW z(AzDvpjscz^l#{JwLY5k9-&_menGW9n(@0Op8bThpz1HA*xbO(jrB{aX4Q2rZ2 z^R0-qnN(aTG~dbSxQ{C1&DJ0;TJBk2c`27j0E^ZN?42DPwABjR@JjFS)YDjJrXzBZuUbRiV*)NJHY`FG zpNE&2_B=^^{YWbv+<%C6V0<-Gbr=g>LORp{uUh)CJL9BVerdkKV@f1<8pLvHwS!kq1e?1W zQ_5qcS*Ir%r>)@IYSpI{nDe4E3k>1YW+{(al*WJB)t4NUwi~^k(shdUnG~QqDI-cd z#(~8<=yg@lw5vHKqup)$T?_1+6s1NU7v-s({q zQj1TeI33j^`)?{h^Cv z6rhtghKk=4C$IgS5`Q5)iy8Lg&z?L3>D~!f!pWDQZ@|EQCBysZ8+bx$e`#>?59QdY z*)L!i-_NG!kv};^N`JL0R;f<|c-P}NDE@3OhOt)sX&E%7zjQcx?JpDkHU{ml`wIEP z>3+FzBNOs~HLXE=n$ji+1RC?fsLU6P$+*V*sj_K&pRF{4`18;=J! z?m5-^MjBVF`-4k{*#1gya@t>7e=M+f{hu+5;-1sn$zcZfl zB1^g|R8BR{Tj8=*eiPRZ8ZG`FQ`UyjA^w_?zts0X8;8zT%_QFI_n*bz67kniXfy5b zhrdz`38y$Ae<{`v8YC}d#Eo%WGq$g^{?g&bOU2*6OD@ifzYgSYwC&TAzu%1;A68%| zirU0DbG?0iEQd2X!sFl@5~T=r{Oh<8@ytpo9$E_52!0+m2Hs-yZH83pjZt4ZXi#)n zb=e{!jH8v?kINcBEhV4f&#H|B4jwiR@$nn$UfC3kbw`_q$J!6ax_$Lax)#OS_r|(I zTdJZv^7$`2y2{!bHBa_*9OAXxH9pooyD2BuUDhcx+v@CeIUtw7r4_ee7ySTC`9J?58DvBLB9J}bNzps;DDUBW3 z8@m_^KJ+s9=#G+rI(omqjG7mEeqGk44nIG3aduN)>|$kb+hedQYg2ic9J^T6&?k0r zeq*StO=V(uS)0nm;Mm25!ENi5sme;|5TAsdwRnG7)n~?j_u>LCZbisRUIGBYF1m<$#g{c8cem6!|Je z^>c{3fVfT$Lx6w8wtLC3`-qB`>X#7rGVRWxuF!sh+c;hel3r2E~P7X!;Xy(hR<<5KPdvdd9KZ0L3S;dIpgTz~jVp?y)^`fDM&! z+_5c3d<*2360ULBwGm94ZPV`9T*CvjRJS9J>AQx2dD1r8?-+efMN9R5#Jvs{$Ltyk zzTUQb%dvY?*_GS}5^Sq}3wD*;e*(iYD5|!f6JY=LS8;_|g>6l$=IWbNK7Yf`NHZpJmz)_`$a4^npxiFL1PxW>MIv)X!K4BOl& zI2D?rJGPib?a_%Je=9#a@$;q-@=&$?w;#f%@nC!K@pgQWAbMxn*UFaKUqo25E8}uc z&(TXgJ$}$fu#s{*BRcZuUA&I(6y0UeJ78mC+lM?X5=#Cm7hmM!8OLq7=*mHlV(a*# zr{_545M*K_G*5DeEew zd8R3=w_=`Xat`J_sQ2LBOn5Wn&6GED-b^NCHaXYH*-tJ$@fU zO%gNbT~_r7lkLGY`%LCp9l?f`o10liVJwpvA`}rBuZ8h!I$9X>h)bCKnoF4Yl1nK0 zE0-|!9hWfWgi9Frv`d)q_by=)+oC>b@#7S5Yx_EKA5zPTSwlm4MbHvv9lj1tiaE9> zn&A=PnMZ4q8Rj1+CbcG;;icf2DQk)uZUWCETT{*OUw~%;t((p855Y4N)-7iE74R&P zRceOMf@glLGBf-Icoy3#H^ZFx$KqHOW_U7qmeZPMhUb9iMQu$t!+eSJOX_Es;X3di zke_LWcY^*IneM@=1a$rpV3(QuJ3=M64pU0OW*b5{oo5$ z%oZ^D7r>dptzi4JHnQ`PEYr*;m@i;v-v*N5%jQe0UcPL;gUhh8_foR5U!)YsW*?we zAp4vxaoPu@5)jMEo=Fnu&FZNEn~~F-weuj^K0(fK3GpfpWX^IG;wflYUe4&qc@cuy z-{hSH4R8$9W`CB@=sgLluYwBgMCiqAohJCKf^vZ(t&+2@)`D_NDht}G6t|n zS7YndUMS#dHSb(Y z*5$>q|KVg1e_!wC0QzZQe7=VM_qW0QS6OCd-&$umJp7#*hFTbeUikng*QnEhY9MC> z&OOd5LO@MzS1fjV*iFlta_X$l*v&@q{~-E5SrC2t#q%nFgql&;xB=f;#OU))3JbZV zuKuo3(V7*jYwGcqKII_w6;`cN!`e3T{fbchiW%hqV!;@#+bfgAzx9hZ`eTJ z&^%vZU;n*ZeTDseU+w1`5?bUN67=Ux@ei637zNu6=HGte`<027udfDqr;LtawPycJ zB28nVX6qc)Qr++39g_i8T=bKH|D_qAY7_R?ag`mHydNwoV4ihv@MK)|3t=mr94uNZ z?EP_7tFWA^$^c(Sh5e7XDqHHdKq#zAg`F2yaat_{pS%pP;tYHS&WvP$>Sx0KGOoHT ztluf~qU(g^6bMPED~s#3h^k)Ld*iA-!hSEV(pAdQ3rVQ^zUShq-l`R0qM1-+b)c{} z##JMQof=n76ZW>a>ULo{!BmbI6ZX-#%8pCk<1eEMSQ1dPoPo&zD7|KN%kmqWcQtw2 zmQv~p)2&M>b!F)GrIfllI02SHDYc-BjO=K(*lni;T|(H|UXu6yL}eNaG^>kY8ej7k z0xEA2pz;;~DxH0O3Ze2ITmNmsn+g?7XF$)fO#0)L>}98%27T4wdUcWuqw^B4jip|b zOVa4>cACNhuSuaqjT7p_{722Ri^^abdCkq=*3v4MrRH^8%ci9S3?3u~-MIO$l)-Q0 z^_W`FZ5qeIUwbWS|4QrElIv*rPj3g?rECAk`DQ|z=g=rwGI3Nx?Z#1ctN3w(n~Fvk zkDEAZVO?YWsv03!Em9l|bH8mJUVudt%kOQdxqA`@*ekd=BQV;o?-{_@ek9GPt5;98 zD|~lBdok1siE>CK*s1jjiWOJ^GEq~YQr!KGy7~q?Lb1-0iwols+DCzHffXVpXILsy z$5m>jRsf6MpjNE3ZPhm*sM7IObsN^YqO{sc=7~?4K9x;^qc!X6R!C+QYpkwoT)Do+ zKCaChEAcG}r#v-lYowaEz-v+7GT<4Ulel-A z<0;3vohxVGxJ&mzc)SUWO;i<)OV*7YldKz8oT!_@qI(UM(rd}4k(gGU`$QEom#ARf zCu@?m>X3o!0qXB~$#YJuFZU2zYP|IpjH zQOR`1)J?!pSbkjVv)64{J$H@z(!wNl`NZ3Jip)W!n&Tu{EtcPY;OTVB)f>3bYRzh| zp5IV$+o_Z8R_KID5oimk>^y2_Je8SOPuZ)}hfWoz&b`~Q-JB-59uWT*S@%=GC?7k9 zpBMN#J~vQ*114Z0;6(y@X8${(0B$v|mrrPJdYTB2sn^FO&u%oIyWjt>S7&Y7GxMzj zT{m2Q>*(8O`R;N#wvE^x#Kw8Jv>%3zK@ClU4v<1{q=>#afZ2_W;aP0%G&)bTS)GylVIRw@iRd6x%ey|^%|GNIS{|f0m1p$R%6?O z?K{{w5O@&VzhJ}vOyfK@KPt9Aw&B>OV4I6=CALOv4`bu--t*XA#r6(1jw0fxhENMZ z5jc!S6<=D&G%i7tsX6g}x1n>mmP$$b6Z^_(Qsh>le=hn)k=F}dDf;;$mkT8hoc_7k zDgAQ%m^38%9@Grwb3#7^rTuA|dag@H`zM8RD4+J<7J0SMrJ}DAdA!h(q8}vk zZ&C5|_ZcYtd?516LjOVZeD_Yft)Q&OdqrL>l&?FWpE_M+wh#InVxO;DuLfoMq0r-( zd5uuwcPYy?m-!y-D8DOos!&dLpgtt@`^Z0Kd^T0lJfXxvP=5*Mo%AE2?+ZO6^rX;z zLU{queviZu;{(7O;3blmt6(i%%3gtUV%7=xr-BIQOwxs;J zFX_WVn}xF7QC};R?T+#tLgxydDRhcZzLurk0HJw8EukETV*JNKJB7Y0l=oQ19~Igr z^aY_B|GQV@$A$7<&2-H|dH<$dE0p(i%6yAVN*od?+bih^p@l*R2+b3kDU|J)_MZst z651j3jL;K8eL@=TlxAqLcb$)tI)MV zmkC`Yv`T21(1}7ZJx%3*s8CK*MAkETYbOl|1yS@vQX>1$U+q^l<~h2`wt~vsP&%6Lah#wg(_Sq)AN4M zA9VK6wiJi#L~&K>W?3F=|3nKDEn z&^;TYQ@G3-7)ylM=>g2&XY|wy+fn$UB=nNf{sC41O?k9rkdqCe64X)QvWl`r(`U|I zaC`FVn^IzXrBer$6UPQQDbpCH%uh17$}WEL@}RcfL5n4Vy8d`5wZ!A5fTXE>rUjX$ VDQ{ZPSeo*VEjC<8D?IlQ{s%n#jcot` literal 0 HcmV?d00001 diff --git a/test/ios/OHHTTPStubs/.gitignore b/test/ios/OHHTTPStubs/.gitignore new file mode 100644 index 000000000..a1e5f0b70 --- /dev/null +++ b/test/ios/OHHTTPStubs/.gitignore @@ -0,0 +1,15 @@ +# Xcode +build/* +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +profile +*.moved-aside +.DS_Store +*.xccheckout diff --git a/test/ios/OHHTTPStubs/.travis.yml b/test/ios/OHHTTPStubs/.travis.yml new file mode 100644 index 000000000..42f139e91 --- /dev/null +++ b/test/ios/OHHTTPStubs/.travis.yml @@ -0,0 +1,14 @@ +language: objective-c + +before_install: + - gem install xcpretty --no-rdoc --no-ri --no-document --quiet + +env: + #- RAKETASK="simlist" + #- RAKETASK="ios[iOS StaticLib,7.1,test]" + - RAKETASK="ios[iOS StaticLib,latest,test]" + - RAKETASK="ios[iOS Framework,latest,analyze]" + - RAKETASK="osx[Mac Framework,x86_64,test]" + +script: + - rake "$RAKETASK" diff --git a/test/ios/OHHTTPStubs/CHANGELOG.md b/test/ios/OHHTTPStubs/CHANGELOG.md new file mode 100644 index 000000000..40a1315c5 --- /dev/null +++ b/test/ios/OHHTTPStubs/CHANGELOG.md @@ -0,0 +1,226 @@ +_You can download previous versions [here](https://github.com/AliSoftware/OHHTTPStubs/tags) and latest version [here](https://github.com/AliSoftware/OHHTTPStubs/zipball/master) (ZIP files generated by GitHub on the fly)_ + +## [4.0.1](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/4.0.1) + +* Fix threading in `NSURLProtocol` subclass calling `NSURLProtocolClient` callbacks from wrong thread. ([@nsprogrammer](https://github.com/nsprogrammer), [#96](https://github.com/AliSoftware/OHHTTPStubs/pull/96)) + +## [4.0.0](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/4.0.0) — Improvements for Swift + +* Annotated the library with _nullability_ attributes to generate a better API when used in Swift +* Migrated the path utility macros to functions in `OHPathHelpers.h`, for Swift compatibility ([#100](https://github.com/AliSoftware/OHHTTPStubs/issues/100)). +* Added a complete Swift Demo Project ([#88](https://github.com/AliSoftware/OHHTTPStubs/issues/88)) +* Removed the `XCTestExpectation` subspec that was added for Xcode 5 support — Now that Xcode 6 is widely adopted, you shouldn't need this anymore (but in case you still need it, I will probably create a dedicated pod for that) + +## [3.1.12](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.12) + +* Fixed issue with HTTP 300 return code (multiple-choice) that is not supposed to redirect. ([@tarbrain](https://github.com/tarbrain), [#92](https://github.com/AliSoftware/OHHTTPStubs/pull/92)) + +## [3.1.11](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.11) + +* Added [Carthage](https://github.com/Carthage/Carthage) support +* Splitted the Xcode projects for more clarity (one dedicated to build the lib and run Unit Tests, and one for the Demo) +* Got rid of the `git submodule` used for Unit Tests against [AFNetworking](https://github.com/AFNetworking/AFNetworking) — it is now imported using [CocoaPods](http://cocoapods.org) and only for the lib's Unit Tests targets ([@corinnekrych](https://github.com/corinnekrych), [#90](https://github.com/AliSoftware/OHHTTPStubs/pull/90)) +* Improved [Travis-CI](https://travis-ci.org/AliSoftware/OHHTTPStubs) integration. We now use a build matrix to have paralellized and independant builds for each scheme (iOS Static Lib, iOS Dynamic Framework, OSX Framework) +* Fixed [#80](https://github.com/AliSoftware/OHHTTPStubs/issues/80) again (there was still an issue for people using Xcode 5 & SDK 7.1… if those people still exists) + +## [3.1.10](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.10) + +* Fix headers for people still building with Xcode 5 & SDK 7 ([#80](https://github.com/AliSoftware/OHHTTPStubs/issues/80)) + +## [3.1.9](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.9) + +* Use `NS_DESIGNATED_INITIALIZER` macro on designated initializer methods ([#79](https://github.com/AliSoftware/OHHTTPStubs/pull/79)) + +## [3.1.8](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.8) + +* Use `application/json` instead of `text/json` in `README`'s example ([#75](https://github.com/AliSoftware/OHHTTPStubs/pull/75)) +* Fixed an issue with empty files (when using `responseWithFileAtPath:statusCode:headers:` but the file at the specified path is empty) + +## [3.1.7](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.7) + +* Added `DEFINES_MODULE` Flag to be easily imported in Swift ([#74](https://github.com/AliSoftware/OHHTTPStubs/pull/74)) + +_(I also moved [Travis-CI build system](https://travis-ci.org/AliSoftware/OHHTTPStubs) so it now uses `xcpretty` instead of `xctool` to run Unit Tests)_ + +## [3.1.6](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.6) + +* Fixed issue with the main thread stalling when an `NSException` was raised in the response block +* Fixed an issue with `OHHTTPStubs/XCTestExpectation` conditional compilation in Xcode 6.0 & OSX SDK. + _(the condition was previously testing available SDKs instead of Xcode version, which led to errors with Xcode 6.0 not having the latest 10.10 SDK yet, but still having the `XCTestExpectation` already anyway)_ + +## [3.1.5](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.5) + +* Migrated Unit Tests to XCTest. +* Added `XCTestExpectation` subspec containing my own implementation for Xcode 5 support + +## [3.1.4](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.4) + +* Fix issue that made stubs never being called on iOS8 (#65). + +> _As of Xcode6 Beta4, **`OHHTTPStubs` compatibility with iOS8** has been validated now._ + + +## [3.1.3](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.3) + +* Fix #66: Use the ivar directly in initialization (to avoid KVO side effects) + +## [3.1.2](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.2) + +* Fix broken link in README (#61) +* Don't override Content-Length header when already set (#62) + +## [3.1.1](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.1) + +* Fixing a crash when using very very long data #57/#59 +* Fixing issue #51 regarding a probable race condition when stubs were removed before the request has finished +* Shorten the README.md file and moved all the usage examples in a dedicated wiki page to avoid a endless and frightening README + +## [3.1.0](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.1.0) + +* The `OHHTTPStubsDescriptor` protocol now inherits from the `NSObject` protocol + +## [3.0.4](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.0.4) + +Fixing issue #47 when stubs were not called, especially when the `OHHTTPStubs` pod were loaded both by the application AND the test target/bundle. See also [[A tricky case with Application Tests]]. + +* `NSURLSessionConfiguration` 's swizzling (to add automatic support of `OHHTTPStubs` to `NSURLSession`) is now done in the `+load` method of an `NSURLSessionConfiguration` category, to be sure it is loaded (and swizzled) only once, even if `OHHTTPStubs` is loaded by two different bundles. +* The stubs activation of `NSURLSessionConfiguration` no longer uses `objc_getClass` but uses a call to the `OHHTTPStubs` class instead, which ensure that it uses the correct `OHHTTPStubs` class in the current bundle instead of always using the one loaded from the main bundle. + +## [3.0.3](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.0.3) + +* Adding Mac framework & Mac Test Target (#44) +* Adding known limitations in README + +## [3.0.2](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.0.2) + +* Fixed issue with cookies when `request.URL` is `nil` ([#39](https://github.com/AliSoftware/OHHTTPStubs/pull/39)) +* Fixed missing `-ObjC` flag in Unit Tests target _(that made it unable to call category methods)_ +* Fixed Unit Tests on iOS6 _(`NSURLSession`-related Unit Tests now only executed when run on iOS7+ or OSX10.9+, and skipped if targeted for an earlier OS version, as `NSURLSession` was not available then)_ + +## [3.0.1](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.0.1) + +* Fixed issue with `NSURLSessionConfiguration` auto-swizzling (#37 & #38) + +> _Now `OHHTTPStubs` automagically works with `NSURLSessionConfiguration` **without the need** to enable it for every `NSURLSessionConfiguration` before creating the `NSURLSession`: the `defaultSessionConfiguration` and `ephemeralSessionConfiguration` are now preconfigured automatically to work with `OHHTTPStubs`)_ + +## [3.0.0](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/3.0.0) + +* Removed deprecated methods. + +> The Old API has now totally disappeared, leaving only a clean and simple API without the spam due to old deprecated methods. + +Note: **If you have already removed the calls to all `OHHTTPStubs` deprecated API in your code, you can switch to this `3.0.0` version without any further changes in your code**. + +## [2.4.0](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/2.4.0) + +* Added support for `NSURLSession` (thx to @ndonald2) [#31](https://github.com/AliSoftware/OHHTTPStubs/issues/31) [#34](https://github.com/AliSoftware/OHHTTPStubs/issues/34) + +## [2.3.1](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/2.3.1) + +* Fixed bug with OHHTTPStubsResponse+JSON when `nil` headers dictionary + +## [2.3.0](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/2.3.0) + +* Added the ability to give a name to a stub, for debugging purposes (property `name` of `id`) +* Added `allStubs` method to list all installed stubs (with their name if they have one, see previous point) +* Added `+[OHHTTPStubs onStubActivation:]` method to execute arbitrary code each time a stub is activated. Useful to log which stub is used for each request for example. + +## [2.2.1](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/2.2.1) + +* Complete refactoring to use `NSInputStream` instead of direct use of `NSData` (Thanks to @kcharwood - #28) +* Some other code refactoring to split the code in categories and make it clearer +* Some API changes to make `OHHTTPStubs` to fit the new possibility of setting both `requestTime` and `responseTime`. + * Old API is still there but deprecated, and will be removed in next major version + * To convert to the new API, you will mainly simply: + * extract the `responseTime:` parameter to a method call of its own (`return [OHHTTPStubsResponse responseWithData:data statusCode:code responseTime:time headers:header];` will become `return [[OHHTTPStubsResponse responseWithData:data statusCode:code headers:headers] responseTime:time];` etc.) + * convert `responseWithFile:filename` to `responseWithFileAtPath:OHPathForFileInBundle(filename,nil)` + +> Note: version `2.1.0-RC`, `2.1.0-rc.1`, `2.2.0-RC` and `2.2.1-RC` were intermediate Release Candidate versions during the big refactoring and migration to `2.2.1`, with the same new features as listed above basicaly, but without the last-minute bugfixes before official release. + +## [2.0.0](https://github.com/AliSoftware/OHHTTPStubs/releases/tag/2.0.0) + +* Simplified API + * removed instance methods, no more public `sharedInstance`: directly call class methods on the `OHHTTPStubs` class + * The old and problematic `addRequestHandler:` method has been deprecated and should not be used anymore. Use `stubRequestsPassingTest:withStubResponse:` instead, which is more efficient +* Added API documentation in the headers +* Remove all internal uses of Apple's private APIs + +> _Be careful: if you forgot to remove your use of `OHHTTPStubs` and your stubs from the binary you sent to the AppStore, your app would have been rejected by Apple before 2.0.0, as it was using private API (which was a way to make sure not to forget to remove them), but now it would be accepted silently. So don't forget to remove your stubs and `OHHTTPStubs` from your final binary!_ + +## [1.2.2](https://github.com/AliSoftware/OHHTTPStubs/tree/1.2.2) + +* Fixed Deadlock introduced by 1.2.1 + +## [1.2.1](https://github.com/AliSoftware/OHHTTPStubs/tree/1.2.1) + +* Improved thread-safety (#21) +* Stop sending messages to `NSURLProtoclClient` after `stopLoading` + +> _This version is buggy as it introduced a deadlock when performing a request on the main thread. 1.2.2 fixes that issue._ + +## [1.2.0](https://github.com/AliSoftware/OHHTTPStubs/tree/1.2.0) + +* Added support for "HTTP Message Data" stubs generated with `curl -is ` to replay them easily (#27). See the `README.md` for more info +* Added redirect support for 3xx response codes (#23) +* Dropped non-ARC support. Now `OHHTTPStubs` is to be compiled using ARC. _(This should not change anything as it is intended to be integrated using CocoaPods or compiled in a separate xcodeproj anyway)_ + +## [1.1.2](https://github.com/AliSoftware/OHHTTPStubs/tree/1.1.2) + +Easier integration process: + +* Use `#import ` again +* But adding the path to the library headers in your application project's `HEADER_SEARCH_PATH` is no longer needed! + +## [1.1.1](https://github.com/AliSoftware/OHHTTPStubs/tree/1.1.1) + +* Fixed crash when calling "setEnabled:" / "registerClass:" multiple times +* New integration process: we don't use the `PortableLibrary.xcconfig` anymore (as it generated problems for people using configuration with names other than "Debug" and "Release"). _(1)_ + +_You will now have to indicate the folder containing headers for `OHHTTPStubs` in your `HEADER_SEARCH_PATH` Build Settings, and we are back to `#import "OHHTTPStubs.h"` until a better solution is found_ + +> _(1) This modification for the integration process did only last for version 1.1.1. Version 1.1.2 restored `#import ` (but using a much better solution than the previous xcconfig used) and filling `HEADER_SEARCH_PATH` is no longer needed in further versions. See changelog for 1.1.2 above._ + +## [1.1.0](https://github.com/AliSoftware/OHHTTPStubs/tree/1.1.0) + +* Added new API `shouldStubRequest:withRequestHandler:` to avoid useless building of stubbed response like `addRequestHandler:` does + +## [1.0.6](https://github.com/AliSoftware/OHHTTPStubs/tree/1.0.6) + +* Adding support for cookies (Set-Cookie headers) + +## [1.0.5](https://github.com/AliSoftware/OHHTTPStubs/tree/1.0.5) + +* Added Unit Tests +* Removed calls to the deprecated `dispatch_get_current_queue()` GCD function (was used with `dispatch_after` to add fake delay to stubbed responses) + +## [1.0.4](https://github.com/AliSoftware/OHHTTPStubs/tree/1.0.4) + +* Fixed #6 : "responseWithError:" released response object too soon + +## [1.0.3](https://github.com/AliSoftware/OHHTTPStubs/tree/1.0.3) + +* Fixed small compilation issues #4 (issue in sample code) & #5 (ARC invalid cast) + +## [1.0.2](https://github.com/AliSoftware/OHHTTPStubs/tree/1.0.2) + +* Embedded `OHHTTPStubs` in a neat static library for nicer integration in your Xcode4 workspaces. + +## [1.0.1](https://github.com/AliSoftware/OHHTTPStubs/tree/1.0.1) + +* Fix issue when used in a SenTestCase + +## [1.0.0](https://github.com/AliSoftware/OHHTTPStubs/tree/1.0.0) + +* Cleaning API, added `removeLastHandler` and `removeRequestHandler:` method. +* Now first stable API in this version. +* Example project now compatible with ARC and non-ARC environments + +## [0.2.0](https://github.com/AliSoftware/OHHTTPStubs/tree/0.2.0) + +* Added Example project +* Added ARC support +* Some fixes + +## [0.1.0](https://github.com/AliSoftware/OHHTTPStubs/tree/0.1.0) + +* Initial version diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.h b/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.h new file mode 100644 index 000000000..bf1a8f5fc --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.h @@ -0,0 +1,13 @@ +// +// MainViewController.h +// OHHTTPStubsDemo +// +// Created by Olivier Halligon on 11/08/12. +// Copyright (c) 2012 AliSoftware. All rights reserved. +// + +#import + +@interface MainViewController : UIViewController + +@end diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.m b/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.m new file mode 100644 index 000000000..327a4d2d2 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.m @@ -0,0 +1,169 @@ +// +// MainViewController.m +// OHHTTPStubsDemo +// +// Created by Olivier Halligon on 11/08/12. +// Copyright (c) 2012 AliSoftware. All rights reserved. +// + +#import "MainViewController.h" +#import + + +@interface MainViewController () +// IBOutlets +@property (retain, nonatomic) IBOutlet UISwitch *delaySwitch; +@property (retain, nonatomic) IBOutlet UITextView *textView; +@property (retain, nonatomic) IBOutlet UISwitch *installTextStubSwitch; +@property (retain, nonatomic) IBOutlet UIImageView *imageView; +@property (retain, nonatomic) IBOutlet UISwitch *installImageStubSwitch; +@end + +@implementation MainViewController + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Init & Dealloc + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [self installTextStub:self.installTextStubSwitch]; + [self installImageStub:self.installImageStubSwitch]; + [OHHTTPStubs onStubActivation:^(NSURLRequest *request, id stub) { + NSLog(@"[OHHTTPStubs] Request to %@ has been stubbed with %@", request.URL, stub.name); + }]; +} +- (void)viewDidUnload +{ + [self setTextView:nil]; + [self setImageView:nil]; + [self setDelaySwitch:nil]; + [super viewDidUnload]; +} + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Global stubs activation + +- (IBAction)toggleStubs:(UISwitch *)sender +{ + [OHHTTPStubs setEnabled:sender.on]; + self.delaySwitch.enabled = sender.on; + self.installTextStubSwitch.enabled = sender.on; + self.installImageStubSwitch.enabled = sender.on; + + NSLog(@"Installed (%@) stubs: %@", (sender.on?@"and enabled":@"but disabled"), OHHTTPStubs.allStubs); +} + + + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Text Download and Stub + + +- (IBAction)downloadText:(UIButton*)sender +{ + sender.enabled = NO; + self.textView.text = nil; + + NSString* urlString = @"http://www.opensource.apple.com/source/Git/Git-26/src/git-htmldocs/git-commit.txt?txt"; + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; + + // This is a very handy way to send an asynchronous method, but only available in iOS5+ + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + sender.enabled = YES; + NSString* receivedText = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; + self.textView.text = receivedText; + }]; +} + + + + +- (IBAction)installTextStub:(UISwitch *)sender +{ + static id textStub = nil; // Note: no need to retain this value, it is retained by the OHHTTPStubs itself already + if (sender.on) + { + // Install + textStub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + // This stub will only configure stub requests for "*.txt" files + return [request.URL.pathExtension isEqualToString:@"txt"]; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + // Stub txt files with this + return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFile(@"stub.txt", self.class) + statusCode:200 + headers:@{@"Content-Type":@"text/plain"}] + requestTime:self.delaySwitch.on ? 2.f: 0.f + responseTime:OHHTTPStubsDownloadSpeedWifi]; + }]; + textStub.name = @"Text stub"; + } + else + { + // Uninstall + [OHHTTPStubs removeStub:textStub]; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Image Download and Stub + +- (IBAction)downloadImage:(UIButton*)sender +{ + sender.enabled = NO; + + NSString* urlString = @"http://images.apple.com/support/assets/images/products/iphone/hero_iphone4-5_wide.png"; + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; + + // This is a very handy way to send an asynchronous method, but only available in iOS5+ + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + sender.enabled = YES; + self.imageView.image = [UIImage imageWithData:data]; + }]; +} + +- (IBAction)installImageStub:(UISwitch *)sender +{ + static id imageStub = nil; // Note: no need to retain this value, it is retained by the OHHTTPStubs itself already :) + if (sender.on) + { + // Install + imageStub = [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + // This stub will only configure stub requests for "*.png" files + return [request.URL.pathExtension isEqualToString:@"png"]; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + // Stub jpg files with this + return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFile(@"stub.jpg", self.class) + statusCode:200 + headers:@{@"Content-Type":@"image/jpeg"}] + requestTime:self.delaySwitch.on ? 2.f: 0.f + responseTime:OHHTTPStubsDownloadSpeedWifi]; + }]; + imageStub.name = @"Image stub"; + } + else + { + // Uninstall + [OHHTTPStubs removeStub:imageStub]; + } +} + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Cleaning + +- (IBAction)clearResults +{ + self.textView.text = @""; + self.imageView.image = nil; +} + +@end diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.xib b/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.xib new file mode 100644 index 000000000..bab95b860 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/MainViewController.xib @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.pbxproj b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.pbxproj new file mode 100644 index 000000000..a342a5ec9 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.pbxproj @@ -0,0 +1,382 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0984831517805426002A99FF /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0984831417805426002A99FF /* CFNetwork.framework */; }; + 098FBDD415D704E800623941 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 098FBDD315D704E800623941 /* UIKit.framework */; }; + 098FBDD615D704E800623941 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 098FBDD515D704E800623941 /* Foundation.framework */; }; + 098FBDD815D704E800623941 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 098FBDD715D704E800623941 /* CoreGraphics.framework */; }; + 098FBDE015D704E800623941 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 098FBDDF15D704E800623941 /* main.m */; }; + 098FBDED15D7056200623941 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 098FBDEB15D7056200623941 /* MainViewController.m */; }; + 098FBDEE15D7056200623941 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 098FBDEC15D7056200623941 /* MainViewController.xib */; }; + 098FBDF815D70E2600623941 /* stub.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 098FBDF615D70E2600623941 /* stub.jpg */; }; + 098FBDF915D70E2600623941 /* stub.txt in Resources */ = {isa = PBXBuildFile; fileRef = 098FBDF715D70E2600623941 /* stub.txt */; }; + 099C7343169016D800239880 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 099C7342169016D800239880 /* Default-568h@2x.png */; }; + 76C30541E2A1B24B6848F032 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B8BA1C0EA8F8EC24B9024E1 /* libPods.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0984831417805426002A99FF /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; + 098FBDCF15D704E800623941 /* OHHTTPStubsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OHHTTPStubsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 098FBDD315D704E800623941 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 098FBDD515D704E800623941 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 098FBDD715D704E800623941 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 098FBDDB15D704E800623941 /* OHHTTPStubsDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "OHHTTPStubsDemo-Info.plist"; sourceTree = ""; }; + 098FBDDF15D704E800623941 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 098FBDE115D704E800623941 /* OHHTTPStubsDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubsDemo-Prefix.pch"; sourceTree = ""; }; + 098FBDEA15D7056200623941 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = ""; }; + 098FBDEB15D7056200623941 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = ""; }; + 098FBDEC15D7056200623941 /* MainViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainViewController.xib; sourceTree = ""; }; + 098FBDF615D70E2600623941 /* stub.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = stub.jpg; sourceTree = ""; }; + 098FBDF715D70E2600623941 /* stub.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stub.txt; sourceTree = ""; }; + 099C7342169016D800239880 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + 0EE81E095FF3A8AF6D3C4E77 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 1B8BA1C0EA8F8EC24B9024E1 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 48556A011AA6E9FD0074B154 /* libPods-OHHTTPStubs.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libPods-OHHTTPStubs.a"; path = "Pods/../build/Debug-iphoneos/libPods-OHHTTPStubs.a"; sourceTree = ""; }; + B5AD292FAB98FC9C7637896A /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 098FBDCC15D704E800623941 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0984831517805426002A99FF /* CFNetwork.framework in Frameworks */, + 098FBDD415D704E800623941 /* UIKit.framework in Frameworks */, + 098FBDD615D704E800623941 /* Foundation.framework in Frameworks */, + 098FBDD815D704E800623941 /* CoreGraphics.framework in Frameworks */, + 76C30541E2A1B24B6848F032 /* libPods.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 098FBDC415D704E800623941 = { + isa = PBXGroup; + children = ( + 098FBDD915D704E800623941 /* OHHTTPStubsDemo */, + 098FBDD215D704E800623941 /* Frameworks */, + 098FBDD015D704E800623941 /* Products */, + DBC538A23E8B9FD8D58D30B1 /* Pods */, + ); + sourceTree = ""; + }; + 098FBDD015D704E800623941 /* Products */ = { + isa = PBXGroup; + children = ( + 098FBDCF15D704E800623941 /* OHHTTPStubsDemo.app */, + ); + name = Products; + sourceTree = ""; + }; + 098FBDD215D704E800623941 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 48556A011AA6E9FD0074B154 /* libPods-OHHTTPStubs.a */, + 0984831417805426002A99FF /* CFNetwork.framework */, + 098FBDD315D704E800623941 /* UIKit.framework */, + 098FBDD515D704E800623941 /* Foundation.framework */, + 098FBDD715D704E800623941 /* CoreGraphics.framework */, + 1B8BA1C0EA8F8EC24B9024E1 /* libPods.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 098FBDD915D704E800623941 /* OHHTTPStubsDemo */ = { + isa = PBXGroup; + children = ( + 098FBDEA15D7056200623941 /* MainViewController.h */, + 098FBDEB15D7056200623941 /* MainViewController.m */, + 098FBDEC15D7056200623941 /* MainViewController.xib */, + 098FBDFA15D70E2F00623941 /* Stubs */, + 098FBDDA15D704E800623941 /* Supporting Files */, + ); + name = OHHTTPStubsDemo; + sourceTree = ""; + }; + 098FBDDA15D704E800623941 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 099C7342169016D800239880 /* Default-568h@2x.png */, + 098FBDDB15D704E800623941 /* OHHTTPStubsDemo-Info.plist */, + 098FBDDF15D704E800623941 /* main.m */, + 098FBDE115D704E800623941 /* OHHTTPStubsDemo-Prefix.pch */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; + 098FBDFA15D70E2F00623941 /* Stubs */ = { + isa = PBXGroup; + children = ( + 098FBDF615D70E2600623941 /* stub.jpg */, + 098FBDF715D70E2600623941 /* stub.txt */, + ); + path = Stubs; + sourceTree = ""; + }; + DBC538A23E8B9FD8D58D30B1 /* Pods */ = { + isa = PBXGroup; + children = ( + B5AD292FAB98FC9C7637896A /* Pods.debug.xcconfig */, + 0EE81E095FF3A8AF6D3C4E77 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 098FBDCE15D704E800623941 /* OHHTTPStubsDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 098FBDE715D704E800623941 /* Build configuration list for PBXNativeTarget "OHHTTPStubsDemo" */; + buildPhases = ( + 5BF07CD1F1DEB3893534CA6D /* Check Pods Manifest.lock */, + 098FBDCB15D704E800623941 /* Sources */, + 098FBDCC15D704E800623941 /* Frameworks */, + 098FBDCD15D704E800623941 /* Resources */, + D61C918AA467A72C9C508B4E /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OHHTTPStubsDemo; + productName = OHHTTPStubsDemo; + productReference = 098FBDCF15D704E800623941 /* OHHTTPStubsDemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 098FBDC615D704E800623941 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = AliSoftware; + }; + buildConfigurationList = 098FBDC915D704E800623941 /* Build configuration list for PBXProject "OHHTTPStubsDemo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 098FBDC415D704E800623941; + productRefGroup = 098FBDD015D704E800623941 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 098FBDCE15D704E800623941 /* OHHTTPStubsDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 098FBDCD15D704E800623941 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 098FBDEE15D7056200623941 /* MainViewController.xib in Resources */, + 098FBDF815D70E2600623941 /* stub.jpg in Resources */, + 098FBDF915D70E2600623941 /* stub.txt in Resources */, + 099C7343169016D800239880 /* Default-568h@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5BF07CD1F1DEB3893534CA6D /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + D61C918AA467A72C9C508B4E /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 098FBDCB15D704E800623941 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 098FBDE015D704E800623941 /* main.m in Sources */, + 098FBDED15D7056200623941 /* MainViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 098FBDE515D704E800623941 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 098FBDE615D704E800623941 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 098FBDE815D704E800623941 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B5AD292FAB98FC9C7637896A /* Pods.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Supporting Files/OHHTTPStubsDemo-Prefix.pch"; + INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/OHHTTPStubsDemo-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 098FBDE915D704E800623941 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0EE81E095FF3A8AF6D3C4E77 /* Pods.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Supporting Files/OHHTTPStubsDemo-Prefix.pch"; + INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/OHHTTPStubsDemo-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 098FBDC915D704E800623941 /* Build configuration list for PBXProject "OHHTTPStubsDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 098FBDE515D704E800623941 /* Debug */, + 098FBDE615D704E800623941 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 098FBDE715D704E800623941 /* Build configuration list for PBXNativeTarget "OHHTTPStubsDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 098FBDE815D704E800623941 /* Debug */, + 098FBDE915D704E800623941 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 098FBDC615D704E800623941 /* Project object */; +} diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..68ace104d --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Demo.xcscheme b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Demo.xcscheme new file mode 100644 index 000000000..41f5f1bbc --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Demo.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..cfc0e73f1 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Podfile b/test/ios/OHHTTPStubs/Examples/ObjC/Podfile new file mode 100644 index 000000000..30504595e --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Podfile @@ -0,0 +1,6 @@ +source 'https://github.com/CocoaPods/Specs.git' + +xcodeproj 'OHHTTPStubsDemo.xcodeproj' +platform :ios, '6.0' + +pod 'OHHTTPStubs', :path => '../..' diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Podfile.lock b/test/ios/OHHTTPStubs/Examples/ObjC/Podfile.lock new file mode 100644 index 000000000..8192540ce --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Podfile.lock @@ -0,0 +1,14 @@ +PODS: + - OHHTTPStubs (4.0.1) + +DEPENDENCIES: + - OHHTTPStubs (from `../..`) + +EXTERNAL SOURCES: + OHHTTPStubs: + :path: "../.." + +SPEC CHECKSUMS: + OHHTTPStubs: 69b1d48b7dfe838a355fdf48d8592d1042e3d85f + +COCOAPODS: 0.37.0 diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h new file mode 120000 index 000000000..e466a3093 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubs.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h new file mode 120000 index 000000000..55a0a6a46 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h new file mode 120000 index 000000000..247257b1d --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h new file mode 120000 index 000000000..773f3f322 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h new file mode 120000 index 000000000..6a6273c69 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHPathHelpers.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h new file mode 120000 index 000000000..e466a3093 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubs.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h new file mode 120000 index 000000000..55a0a6a46 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h new file mode 120000 index 000000000..247257b1d --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h new file mode 120000 index 000000000..773f3f322 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h new file mode 120000 index 000000000..6a6273c69 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHPathHelpers.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Local Podspecs/OHHTTPStubs.podspec.json b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Local Podspecs/OHHTTPStubs.podspec.json new file mode 100644 index 000000000..3be5f2250 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Local Podspecs/OHHTTPStubs.podspec.json @@ -0,0 +1,26 @@ +{ + "name": "OHHTTPStubs", + "version": "4.0.1", + "summary": "Framework to stub your network requests like HTTP and help you write network unit tests with XCTest.", + "description": "A class to stub network requests easily:\n\n * Test your apps with fake network data (stubbed from file)\n * You can also customize your response headers and status code\n * Use customized stubs depending on the requests\n * Use custom response time to simulate slow network.\n * This works with any request (HTTP, HTTPS, or any protocol) sent using\n the iOS URL Loading System (NSURLConnection, NSURLSession, AFNetworking, …)\n * This is really useful in unit testing, when you need to test network features\n but don't want to hit the real network and fake some response data instead.\n * Has useful convenience methods to stub JSON content or fixture from a file\n * Compatible with Swift\n", + "homepage": "https://github.com/AliSoftware/OHHTTPStubs", + "license": "MIT", + "authors": { + "Olivier Halligon": "olivier.halligon+ae@gmail.com" + }, + "source": { + "git": "https://github.com/AliSoftware/OHHTTPStubs.git", + "tag": "4.0.1" + }, + "source_files": "OHHTTPStubs/Sources/*.{h,m}", + "public_header_files": "OHHTTPStubs/Sources/*.h", + "frameworks": [ + "Foundation", + "CFNetwork" + ], + "requires_arc": true, + "platforms": { + "ios": "5.0", + "osx": "10.7" + } +} diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Manifest.lock b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Manifest.lock new file mode 100644 index 000000000..8192540ce --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Manifest.lock @@ -0,0 +1,14 @@ +PODS: + - OHHTTPStubs (4.0.1) + +DEPENDENCIES: + - OHHTTPStubs (from `../..`) + +EXTERNAL SOURCES: + OHHTTPStubs: + :path: "../.." + +SPEC CHECKSUMS: + OHHTTPStubs: 69b1d48b7dfe838a355fdf48d8592d1042e3d85f + +COCOAPODS: 0.37.0 diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Pods.xcodeproj/project.pbxproj b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 000000000..9ac1e1973 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,488 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0287B0995D3956A77FE8245B /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F22C8E5911B3A17469606575 /* Pods-dummy.m */; }; + 05AF8AC740672A49F1DB86F8 /* OHPathHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AB4DCEA3E6E205F6150BB9B /* OHPathHelpers.h */; }; + 37E8EFCB93409F59A3519709 /* OHHTTPStubsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 64DE90B81CB54898D8031417 /* OHHTTPStubsResponse.h */; }; + 3C4E450E5248FA162C4836BB /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DA39110509B5D077268FC8 /* OHHTTPStubsResponse+JSON.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4C169F633246281BE747CBC7 /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = BB8B9FD03923F20EA8A5A11A /* OHHTTPStubsResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 5FAAE71C0DC019D177F03852 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B2C23953AEE92A8924B57BD /* Foundation.framework */; }; + 91AC7870E73F1D4AFD355954 /* OHHTTPStubsResponse+HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = CD10D9BE097DF051073D1136 /* OHHTTPStubsResponse+HTTPMessage.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 91F20FAEB508489E6E82A37E /* Pods-OHHTTPStubs-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C9D0A204842A77405B1B4826 /* Pods-OHHTTPStubs-dummy.m */; }; + B1DBEB199B89B0F2534AB372 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3F78A40A045AD979FC32D66 /* CFNetwork.framework */; }; + B3F948D4C6FEA3E3414304E3 /* OHHTTPStubsResponse+JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1C78DC9C9ED126B2DD803F /* OHHTTPStubsResponse+JSON.h */; }; + B5A13025620A2BC7F9523B3E /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 91CB751631C441AC78BFFF91 /* OHPathHelpers.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + B88B2F8C9696F7AFF1219FA6 /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 90C538A641602D6CA84175EA /* OHHTTPStubs+NSURLSessionConfiguration.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + C73743AF5192A2BCAD0BA639 /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = 757741D337827989EA9CFB35 /* OHHTTPStubs.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + D6D12CC401BBCC3846765533 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B2C23953AEE92A8924B57BD /* Foundation.framework */; }; + DDE78ABCE16D42E4E3347D57 /* OHHTTPStubs.h in Headers */ = {isa = PBXBuildFile; fileRef = F59CD3981590122479A99319 /* OHHTTPStubs.h */; }; + E93E7222A109F4DE8DEE1C8A /* OHHTTPStubsResponse+HTTPMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 26BD78083C121EBF426395FC /* OHHTTPStubsResponse+HTTPMessage.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 70209F8E12151BE9099A0906 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4E43A3978191CB163B56150F /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9BFA25996D607CC8407D9667; + remoteInfo = "Pods-OHHTTPStubs"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1F1C78DC9C9ED126B2DD803F /* OHHTTPStubsResponse+JSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubsResponse+JSON.h"; sourceTree = ""; }; + 26BD78083C121EBF426395FC /* OHHTTPStubsResponse+HTTPMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubsResponse+HTTPMessage.h"; sourceTree = ""; }; + 43DA39110509B5D077268FC8 /* OHHTTPStubsResponse+JSON.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubsResponse+JSON.m"; sourceTree = ""; }; + 51D2E996FA1B199219C88105 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 540BE0121862CF47DF5EAC7E /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = ""; }; + 5CAE31F1B62C6CE71BC12572 /* Pods-OHHTTPStubs-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OHHTTPStubs-prefix.pch"; sourceTree = ""; }; + 64DE90B81CB54898D8031417 /* OHHTTPStubsResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = OHHTTPStubsResponse.h; sourceTree = ""; }; + 757741D337827989EA9CFB35 /* OHHTTPStubs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = OHHTTPStubs.m; sourceTree = ""; }; + 7A817F08BCB2651ACDF06BAF /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = ""; }; + 7B2C23953AEE92A8924B57BD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 7F0BAB562664206098AE3E43 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; + 85434260BFFB3C7A7BC04F99 /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-environment.h"; sourceTree = ""; }; + 8AB4DCEA3E6E205F6150BB9B /* OHPathHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = OHPathHelpers.h; sourceTree = ""; }; + 90C538A641602D6CA84175EA /* OHHTTPStubs+NSURLSessionConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubs+NSURLSessionConfiguration.m"; sourceTree = ""; }; + 91CB751631C441AC78BFFF91 /* OHPathHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = OHPathHelpers.m; sourceTree = ""; }; + 925D0F1AA2487470D449CE49 /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = ""; }; + 95AC8CA1C533FBB6BD437ACB /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + A1BA020EDD8BB7AE11152ACC /* Pods-OHHTTPStubs.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs.xcconfig"; sourceTree = ""; }; + A976A0F9BBC8019FB5DD5B7F /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; + BB8B9FD03923F20EA8A5A11A /* OHHTTPStubsResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = OHHTTPStubsResponse.m; sourceTree = ""; }; + C9D0A204842A77405B1B4826 /* Pods-OHHTTPStubs-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OHHTTPStubs-dummy.m"; sourceTree = ""; }; + CD10D9BE097DF051073D1136 /* OHHTTPStubsResponse+HTTPMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubsResponse+HTTPMessage.m"; sourceTree = ""; }; + DBFCAD5C4AF069800133DA37 /* Pods-OHHTTPStubs-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs-Private.xcconfig"; sourceTree = ""; }; + DD8EC89EDDE25D7B79665F29 /* libPods-OHHTTPStubs.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OHHTTPStubs.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + E3F78A40A045AD979FC32D66 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + F22C8E5911B3A17469606575 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; + F59CD3981590122479A99319 /* OHHTTPStubs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = OHHTTPStubs.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 370CE9976B2CE6DC38C7AD35 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B1DBEB199B89B0F2534AB372 /* CFNetwork.framework in Frameworks */, + D6D12CC401BBCC3846765533 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F733C40CCF846B63AED7A63 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 5FAAE71C0DC019D177F03852 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 262D783B60DE608266D6A656 /* Products */ = { + isa = PBXGroup; + children = ( + 51D2E996FA1B199219C88105 /* libPods.a */, + DD8EC89EDDE25D7B79665F29 /* libPods-OHHTTPStubs.a */, + ); + name = Products; + sourceTree = ""; + }; + 2D13680F87CE7E9F973E18D6 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + D8918EE34F24A086FB93B162 /* Pods */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 3EB198ABE93CBAE1C25569ED /* OHHTTPStubs */ = { + isa = PBXGroup; + children = ( + C4B29A11FCEF09243EA85BD4 /* OHHTTPStubs */, + D882BE8B7A1CD1ACAD41FC23 /* Support Files */, + ); + name = OHHTTPStubs; + path = ../../..; + sourceTree = ""; + }; + 4CCC5CCCC482E8248CF90F91 = { + isa = PBXGroup; + children = ( + 95AC8CA1C533FBB6BD437ACB /* Podfile */, + A6534AD5BD03EA29AB460479 /* Development Pods */, + 90091CD0A828ED346DE8663C /* Frameworks */, + 262D783B60DE608266D6A656 /* Products */, + 2D13680F87CE7E9F973E18D6 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 6B5292DC8591159D72E93366 /* Sources */ = { + isa = PBXGroup; + children = ( + F59CD3981590122479A99319 /* OHHTTPStubs.h */, + 757741D337827989EA9CFB35 /* OHHTTPStubs.m */, + 90C538A641602D6CA84175EA /* OHHTTPStubs+NSURLSessionConfiguration.m */, + 64DE90B81CB54898D8031417 /* OHHTTPStubsResponse.h */, + BB8B9FD03923F20EA8A5A11A /* OHHTTPStubsResponse.m */, + 26BD78083C121EBF426395FC /* OHHTTPStubsResponse+HTTPMessage.h */, + CD10D9BE097DF051073D1136 /* OHHTTPStubsResponse+HTTPMessage.m */, + 1F1C78DC9C9ED126B2DD803F /* OHHTTPStubsResponse+JSON.h */, + 43DA39110509B5D077268FC8 /* OHHTTPStubsResponse+JSON.m */, + 8AB4DCEA3E6E205F6150BB9B /* OHPathHelpers.h */, + 91CB751631C441AC78BFFF91 /* OHPathHelpers.m */, + ); + path = Sources; + sourceTree = ""; + }; + 90091CD0A828ED346DE8663C /* Frameworks */ = { + isa = PBXGroup; + children = ( + D39958F9C841183DE3C7A500 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + A6534AD5BD03EA29AB460479 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 3EB198ABE93CBAE1C25569ED /* OHHTTPStubs */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + C4B29A11FCEF09243EA85BD4 /* OHHTTPStubs */ = { + isa = PBXGroup; + children = ( + 6B5292DC8591159D72E93366 /* Sources */, + ); + path = OHHTTPStubs; + sourceTree = ""; + }; + D39958F9C841183DE3C7A500 /* iOS */ = { + isa = PBXGroup; + children = ( + E3F78A40A045AD979FC32D66 /* CFNetwork.framework */, + 7B2C23953AEE92A8924B57BD /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + D882BE8B7A1CD1ACAD41FC23 /* Support Files */ = { + isa = PBXGroup; + children = ( + A1BA020EDD8BB7AE11152ACC /* Pods-OHHTTPStubs.xcconfig */, + DBFCAD5C4AF069800133DA37 /* Pods-OHHTTPStubs-Private.xcconfig */, + C9D0A204842A77405B1B4826 /* Pods-OHHTTPStubs-dummy.m */, + 5CAE31F1B62C6CE71BC12572 /* Pods-OHHTTPStubs-prefix.pch */, + ); + name = "Support Files"; + path = "Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs"; + sourceTree = ""; + }; + D8918EE34F24A086FB93B162 /* Pods */ = { + isa = PBXGroup; + children = ( + 925D0F1AA2487470D449CE49 /* Pods-acknowledgements.markdown */, + 540BE0121862CF47DF5EAC7E /* Pods-acknowledgements.plist */, + F22C8E5911B3A17469606575 /* Pods-dummy.m */, + 85434260BFFB3C7A7BC04F99 /* Pods-environment.h */, + 7A817F08BCB2651ACDF06BAF /* Pods-resources.sh */, + 7F0BAB562664206098AE3E43 /* Pods.debug.xcconfig */, + A976A0F9BBC8019FB5DD5B7F /* Pods.release.xcconfig */, + ); + name = Pods; + path = "Target Support Files/Pods"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + F9ECAC25D98304B8B72AF50A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + DDE78ABCE16D42E4E3347D57 /* OHHTTPStubs.h in Headers */, + E93E7222A109F4DE8DEE1C8A /* OHHTTPStubsResponse+HTTPMessage.h in Headers */, + B3F948D4C6FEA3E3414304E3 /* OHHTTPStubsResponse+JSON.h in Headers */, + 37E8EFCB93409F59A3519709 /* OHHTTPStubsResponse.h in Headers */, + 05AF8AC740672A49F1DB86F8 /* OHPathHelpers.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 9BFA25996D607CC8407D9667 /* Pods-OHHTTPStubs */ = { + isa = PBXNativeTarget; + buildConfigurationList = 99C679F5F4E67D87EC4BDF5A /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs" */; + buildPhases = ( + BE02003453F6728BF5A57B70 /* Sources */, + 370CE9976B2CE6DC38C7AD35 /* Frameworks */, + F9ECAC25D98304B8B72AF50A /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-OHHTTPStubs"; + productName = "Pods-OHHTTPStubs"; + productReference = DD8EC89EDDE25D7B79665F29 /* libPods-OHHTTPStubs.a */; + productType = "com.apple.product-type.library.static"; + }; + ED0986E9CFBAA34FCF4971C9 /* Pods */ = { + isa = PBXNativeTarget; + buildConfigurationList = 40030A743EB9FB86643D5978 /* Build configuration list for PBXNativeTarget "Pods" */; + buildPhases = ( + 222D0A79B1499A9F0B3FDA4B /* Sources */, + 8F733C40CCF846B63AED7A63 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 76788543FE7378BD74B08A8D /* PBXTargetDependency */, + ); + name = Pods; + productName = Pods; + productReference = 51D2E996FA1B199219C88105 /* libPods.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4E43A3978191CB163B56150F /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + }; + buildConfigurationList = A6F781DF7CB4BC20838676BB /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 4CCC5CCCC482E8248CF90F91; + productRefGroup = 262D783B60DE608266D6A656 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + ED0986E9CFBAA34FCF4971C9 /* Pods */, + 9BFA25996D607CC8407D9667 /* Pods-OHHTTPStubs */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 222D0A79B1499A9F0B3FDA4B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0287B0995D3956A77FE8245B /* Pods-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BE02003453F6728BF5A57B70 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88B2F8C9696F7AFF1219FA6 /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */, + C73743AF5192A2BCAD0BA639 /* OHHTTPStubs.m in Sources */, + 91AC7870E73F1D4AFD355954 /* OHHTTPStubsResponse+HTTPMessage.m in Sources */, + 3C4E450E5248FA162C4836BB /* OHHTTPStubsResponse+JSON.m in Sources */, + 4C169F633246281BE747CBC7 /* OHHTTPStubsResponse.m in Sources */, + B5A13025620A2BC7F9523B3E /* OHPathHelpers.m in Sources */, + 91F20FAEB508489E6E82A37E /* Pods-OHHTTPStubs-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 76788543FE7378BD74B08A8D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-OHHTTPStubs"; + target = 9BFA25996D607CC8407D9667 /* Pods-OHHTTPStubs */; + targetProxy = 70209F8E12151BE9099A0906 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 337E89F82BC61A2DD3C2E883 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A976A0F9BBC8019FB5DD5B7F /* Pods.release.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 63360606759F06BB75622084 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DBFCAD5C4AF069800133DA37 /* Pods-OHHTTPStubs-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 68471B2F01E99F601F6F8AC3 /* Debug */ = { + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 6B84606278B52C10D43487F2 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DBFCAD5C4AF069800133DA37 /* Pods-OHHTTPStubs-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 7DBF91DE1049E44BD8E62530 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7F0BAB562664206098AE3E43 /* Pods.debug.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + F0A06905E42C5AED58002639 /* Release */ = { + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 40030A743EB9FB86643D5978 /* Build configuration list for PBXNativeTarget "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7DBF91DE1049E44BD8E62530 /* Debug */, + 337E89F82BC61A2DD3C2E883 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 99C679F5F4E67D87EC4BDF5A /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6B84606278B52C10D43487F2 /* Debug */, + 63360606759F06BB75622084 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A6F781DF7CB4BC20838676BB /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 68471B2F01E99F601F6F8AC3 /* Debug */, + F0A06905E42C5AED58002639 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4E43A3978191CB163B56150F /* Project object */; +} diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig new file mode 100644 index 000000000..8fb40d2e9 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig @@ -0,0 +1,6 @@ +#include "Pods-OHHTTPStubs.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/OHHTTPStubs" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/OHHTTPStubs" +OTHER_LDFLAGS = ${PODS_OHHTTPSTUBS_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m new file mode 100644 index 000000000..6e93a65cc --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_OHHTTPStubs : NSObject +@end +@implementation PodsDummy_Pods_OHHTTPStubs +@end diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch new file mode 100644 index 000000000..95cf11d9f --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig new file mode 100644 index 000000000..de1d241ad --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig @@ -0,0 +1 @@ +PODS_OHHTTPSTUBS_OTHER_LDFLAGS = -framework "CFNetwork" -framework "Foundation" \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown new file mode 100644 index 000000000..79d3603ad --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown @@ -0,0 +1,15 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## OHHTTPStubs + +- MIT LICENSE - + +Copyright (c) 2012 Olivier Halligon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Generated by CocoaPods - http://cocoapods.org diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.plist new file mode 100644 index 000000000..756aa4392 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-acknowledgements.plist @@ -0,0 +1,45 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + - MIT LICENSE - + +Copyright (c) 2012 Olivier Halligon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Title + OHHTTPStubs + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-dummy.m b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-dummy.m new file mode 100644 index 000000000..ade64bd1a --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods : NSObject +@end +@implementation PodsDummy_Pods +@end diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-environment.h b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-environment.h new file mode 100644 index 000000000..5918510c4 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-environment.h @@ -0,0 +1,14 @@ + +// To check if a library is compiled with CocoaPods you +// can use the `COCOAPODS` macro definition which is +// defined in the xcconfigs so it is available in +// headers also when they are imported in the client +// project. + + +// OHHTTPStubs +#define COCOAPODS_POD_AVAILABLE_OHHTTPStubs +#define COCOAPODS_VERSION_MAJOR_OHHTTPStubs 4 +#define COCOAPODS_VERSION_MINOR_OHHTTPStubs 0 +#define COCOAPODS_VERSION_PATCH_OHHTTPStubs 1 + diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-resources.sh b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-resources.sh new file mode 100755 index 000000000..43f08523e --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods-resources.sh @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY=$(cd "${1%/*}" && pwd) + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.debug.xcconfig new file mode 100644 index 000000000..806e7917f --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.debug.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/OHHTTPStubs" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/OHHTTPStubs" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-OHHTTPStubs" -framework "CFNetwork" -framework "Foundation" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.release.xcconfig b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.release.xcconfig new file mode 100644 index 000000000..806e7917f --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Pods/Target Support Files/Pods/Pods.release.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/OHHTTPStubs" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/OHHTTPStubs" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-OHHTTPStubs" -framework "CFNetwork" -framework "Foundation" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Stubs/stub.jpg b/test/ios/OHHTTPStubs/Examples/ObjC/Stubs/stub.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c42a21cd74634618f6242384d5e598e9b82697a4 GIT binary patch literal 46859 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 DQ(N|F literal 0 HcmV?d00001 diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Stubs/stub.txt b/test/ios/OHHTTPStubs/Examples/ObjC/Stubs/stub.txt new file mode 100644 index 000000000..e662f91b2 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Stubs/stub.txt @@ -0,0 +1,3 @@ +This is the text from your stub. + +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullam corper suscipit lobortis nisi ut aliquip ex ea commodo consequat. Duis te feugi facilisi. Duis autem dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit au gue duis dolore te feugat nulla facilisi. diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/Default-568h@2x.png b/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Info.plist b/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Info.plist new file mode 100644 index 000000000..5dc7a4773 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.alisoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + NSMainNibFile + MainViewController + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Prefix.pch b/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Prefix.pch new file mode 100644 index 000000000..20ef71978 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/OHHTTPStubsDemo-Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'OHHTTPStubsDemo' target in the 'OHHTTPStubsDemo' project +// + +#import + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iOS SDK 3.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/main.m b/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/main.m new file mode 100644 index 000000000..478bfb395 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/ObjC/Supporting Files/main.m @@ -0,0 +1,17 @@ +// +// main.m +// OHHTTPStubsDemo +// +// Created by Olivier Halligon on 11/08/12. +// Copyright (c) 2012 AliSoftware. All rights reserved. +// + +#import + + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, nil); + } +} diff --git a/test/ios/OHHTTPStubs/Examples/Swift/AppDelegate.swift b/test/ios/OHHTTPStubs/Examples/Swift/AppDelegate.swift new file mode 100644 index 000000000..58f489a7d --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/AppDelegate.swift @@ -0,0 +1,21 @@ +// +// AppDelegate.swift +// OHHTTPStubsDemo +// +// Created by Olivier Halligon on 18/04/2015. +// Copyright (c) 2015 AliSoftware. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } +} + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Main.storyboard b/test/ios/OHHTTPStubs/Examples/Swift/Main.storyboard new file mode 100644 index 000000000..438521ca5 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Main.storyboard @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/MainViewController.swift b/test/ios/OHHTTPStubs/Examples/Swift/MainViewController.swift new file mode 100644 index 000000000..e983f11f3 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/MainViewController.swift @@ -0,0 +1,145 @@ +// +// ViewController.swift +// OHHTTPStubsDemo +// +// Created by Olivier Halligon on 18/04/2015. +// Copyright (c) 2015 AliSoftware. All rights reserved. +// + +import UIKit +import OHHTTPStubs + +class MainViewController: UIViewController { + + //////////////////////////////////////////////////////////////////////////////// + // MARK: - Outlets + + @IBOutlet var delaySwitch: UISwitch! + @IBOutlet var textView: UITextView! + @IBOutlet var installTextStubSwitch: UISwitch! + @IBOutlet var imageView: UIImageView! + @IBOutlet var installImageStubSwitch: UISwitch! + + //////////////////////////////////////////////////////////////////////////////// + // MARK: - Init & Dealloc + + override func viewDidLoad() { + super.viewDidLoad() + + installTextStub(self.installTextStubSwitch) + installImageStub(self.installImageStubSwitch) + OHHTTPStubs.onStubActivation { (request: NSURLRequest!, stub: OHHTTPStubsDescriptor!) in + println("[OHHTTPStubs] Request to \(request.URL!) has been stubbed with \(stub.name)") + } + } + + //////////////////////////////////////////////////////////////////////////////// + // MARK: - Global stubs activation + + @IBAction func toggleStubs(sender: UISwitch) { + OHHTTPStubs.setEnabled(sender.on) + self.delaySwitch.enabled = sender.on + self.installTextStubSwitch.enabled = sender.on + self.installImageStubSwitch.enabled = sender.on + + let state = sender.on ? "and enabled" : "but disabled" + println("Installed (\(state)) stubs: \(OHHTTPStubs.allStubs)") + } + + + + //////////////////////////////////////////////////////////////////////////////// + // MARK: - Text Download and Stub + + + @IBAction func downloadText(sender: UIButton) { + sender.enabled = false + self.textView.text = nil + + let urlString = "http://www.opensource.apple.com/source/Git/Git-26/src/git-htmldocs/git-commit.txt?txt" + let req = NSURLRequest(URL: NSURL(string: urlString)!) + + NSURLConnection.sendAsynchronousRequest(req, queue: NSOperationQueue.mainQueue()) { (_, data, _) in + sender.enabled = true + let receivedText = NSString(data: data, encoding: NSASCIIStringEncoding) + self.textView.text = receivedText! as String + } + } + + weak var textStub: OHHTTPStubsDescriptor? + @IBAction func installTextStub(sender: UISwitch) { + if sender.on { + // Install + + // - we use an inline closure for the test predicate with shorthand argument names + // - we also use the "trailing closure" syntax of Swift for convenience + // - we don't care about the 'request' parameter in the trailing closure so we use '_' + textStub = OHHTTPStubs.stubRequestsPassingTest({$0.URL!.pathExtension == "txt"}) { _ in + let stubPath = OHPathForFile("stub.txt", self.dynamicType) + return OHHTTPStubsResponse( + fileAtPath: stubPath!, + statusCode: 200, + headers: ["Content-Type":"text/plain"] + ) + .requestTime(self.delaySwitch.on ? 2.0 : 0.0, responseTime:OHHTTPStubsDownloadSpeedWifi) + } + textStub?.name = "Text stub" + } else { + // Uninstall + OHHTTPStubs.removeStub(textStub!) + } + } + + + //////////////////////////////////////////////////////////////////////////////// + // MARK: - Image Download and Stub + + @IBAction func downloadImage(sender: UIButton) { + sender.enabled = false + self.imageView.image = nil + + let urlString = "http://images.apple.com/support/assets/images/products/iphone/hero_iphone4-5_wide.png" + let req = NSURLRequest(URL: NSURL(string: urlString)!) + + NSURLConnection.sendAsynchronousRequest(req, queue: NSOperationQueue.mainQueue()) { (_, data, _) in + sender.enabled = true + self.imageView.image = UIImage(data: data) + } + } + + weak var imageStub: OHHTTPStubsDescriptor? + @IBAction func installImageStub(sender: UISwitch) { + if sender.on { + // Install + + let isImage = { (request: NSURLRequest!) -> Bool in + contains(["png","jpg","jpeg","gif"], request.URL?.pathExtension ?? "") + } + // - we use a separate block 'isImage' for the 'test' predicate for code readability + // - we use the "trailing closure" syntax of Swift for convenience + // - we don't care about the 'request' parameter in the trailing closure so we use '_' + imageStub = OHHTTPStubs.stubRequestsPassingTest(isImage) { _ in + let stubPath = OHPathForFile("stub.jpg", self.dynamicType) + return OHHTTPStubsResponse( + fileAtPath: stubPath!, + statusCode: 200, + headers: ["Content-Type":"image/jpeg"] + ) + .requestTime(self.delaySwitch.on ? 2.0 : 0.0, responseTime: OHHTTPStubsDownloadSpeedWifi) + } + imageStub?.name = "Image stub" + } else { + // Uninstall + OHHTTPStubs.removeStub(imageStub!) + } + } + + //////////////////////////////////////////////////////////////////////////////// + // MARK: - Cleaning + + @IBAction func clearResults() { + self.textView.text = "" + self.imageView.image = nil + } + +} diff --git a/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.pbxproj b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.pbxproj new file mode 100644 index 000000000..49d0a3d76 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.pbxproj @@ -0,0 +1,378 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 099F74141AE2D049001108A5 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 099F74131AE2D049001108A5 /* Images.xcassets */; }; + 099F742F1AE2D572001108A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 099F742D1AE2D572001108A5 /* Main.storyboard */; }; + 099F74351AE2D5EB001108A5 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 099F74341AE2D5EB001108A5 /* LaunchScreen.xib */; }; + 099F74391AE2D5FF001108A5 /* stub.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 099F74371AE2D5FF001108A5 /* stub.jpg */; }; + 099F743A1AE2D5FF001108A5 /* stub.txt in Resources */ = {isa = PBXBuildFile; fileRef = 099F74381AE2D5FF001108A5 /* stub.txt */; }; + 099F743C1AE2D632001108A5 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 099F743B1AE2D632001108A5 /* Default-568h@2x.png */; }; + 099F74401AE2D703001108A5 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099F740E1AE2D049001108A5 /* MainViewController.swift */; }; + 099F74421AE2D7E0001108A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 099F74411AE2D7E0001108A5 /* AppDelegate.swift */; }; + 33ABB39721D2012BFC1F5077 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F6C6334E088CD830EF8D38DB /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 099F74071AE2D049001108A5 /* OHHTTPStubsDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OHHTTPStubsDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 099F740B1AE2D049001108A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 099F740E1AE2D049001108A5 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + 099F74131AE2D049001108A5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 099F742D1AE2D572001108A5 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 099F74341AE2D5EB001108A5 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; + 099F74371AE2D5FF001108A5 /* stub.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = stub.jpg; sourceTree = ""; }; + 099F74381AE2D5FF001108A5 /* stub.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stub.txt; sourceTree = ""; }; + 099F743B1AE2D632001108A5 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "Supporting Files/Default-568h@2x.png"; sourceTree = SOURCE_ROOT; }; + 099F74411AE2D7E0001108A5 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + D1819A3B2BCA81021164F097 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; + DC1FF3E7FE2F711D9C9AD066 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + F6C6334E088CD830EF8D38DB /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 099F74041AE2D049001108A5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 33ABB39721D2012BFC1F5077 /* Pods.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 099F73FE1AE2D049001108A5 = { + isa = PBXGroup; + children = ( + 099F74091AE2D049001108A5 /* OHHTTPStubsDemo */, + 099F74081AE2D049001108A5 /* Products */, + 11944CD1D5FC771F513B1E27 /* Pods */, + 3116686BFC89EEC0587776C7 /* Frameworks */, + ); + sourceTree = ""; + }; + 099F74081AE2D049001108A5 /* Products */ = { + isa = PBXGroup; + children = ( + 099F74071AE2D049001108A5 /* OHHTTPStubsDemo.app */, + ); + name = Products; + sourceTree = ""; + }; + 099F74091AE2D049001108A5 /* OHHTTPStubsDemo */ = { + isa = PBXGroup; + children = ( + 099F74411AE2D7E0001108A5 /* AppDelegate.swift */, + 099F740E1AE2D049001108A5 /* MainViewController.swift */, + 099F742D1AE2D572001108A5 /* Main.storyboard */, + 099F74361AE2D5FF001108A5 /* Stubs */, + 099F740A1AE2D049001108A5 /* Supporting Files */, + ); + name = OHHTTPStubsDemo; + sourceTree = ""; + }; + 099F740A1AE2D049001108A5 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 099F743B1AE2D632001108A5 /* Default-568h@2x.png */, + 099F74341AE2D5EB001108A5 /* LaunchScreen.xib */, + 099F74131AE2D049001108A5 /* Images.xcassets */, + 099F740B1AE2D049001108A5 /* Info.plist */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; + 099F74361AE2D5FF001108A5 /* Stubs */ = { + isa = PBXGroup; + children = ( + 099F74371AE2D5FF001108A5 /* stub.jpg */, + 099F74381AE2D5FF001108A5 /* stub.txt */, + ); + path = Stubs; + sourceTree = ""; + }; + 11944CD1D5FC771F513B1E27 /* Pods */ = { + isa = PBXGroup; + children = ( + D1819A3B2BCA81021164F097 /* Pods.debug.xcconfig */, + DC1FF3E7FE2F711D9C9AD066 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 3116686BFC89EEC0587776C7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F6C6334E088CD830EF8D38DB /* Pods.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 099F74061AE2D049001108A5 /* OHHTTPStubsDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 099F74261AE2D049001108A5 /* Build configuration list for PBXNativeTarget "OHHTTPStubsDemo" */; + buildPhases = ( + BC9F93D044C7E42A3DAD6455 /* Check Pods Manifest.lock */, + 099F74031AE2D049001108A5 /* Sources */, + 099F74041AE2D049001108A5 /* Frameworks */, + 099F74051AE2D049001108A5 /* Resources */, + D95367D5DC075A18A3D27355 /* Embed Pods Frameworks */, + 5D1017B32E55D59BD180A034 /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OHHTTPStubsDemo; + productName = OHHTTPStubsDemo; + productReference = 099F74071AE2D049001108A5 /* OHHTTPStubsDemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 099F73FF1AE2D049001108A5 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = AliSoftware; + TargetAttributes = { + 099F74061AE2D049001108A5 = { + CreatedOnToolsVersion = 6.3; + }; + }; + }; + buildConfigurationList = 099F74021AE2D049001108A5 /* Build configuration list for PBXProject "OHHTTPStubsDemo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 099F73FE1AE2D049001108A5; + productRefGroup = 099F74081AE2D049001108A5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 099F74061AE2D049001108A5 /* OHHTTPStubsDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 099F74051AE2D049001108A5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 099F74351AE2D5EB001108A5 /* LaunchScreen.xib in Resources */, + 099F74391AE2D5FF001108A5 /* stub.jpg in Resources */, + 099F742F1AE2D572001108A5 /* Main.storyboard in Resources */, + 099F74141AE2D049001108A5 /* Images.xcassets in Resources */, + 099F743A1AE2D5FF001108A5 /* stub.txt in Resources */, + 099F743C1AE2D632001108A5 /* Default-568h@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5D1017B32E55D59BD180A034 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + BC9F93D044C7E42A3DAD6455 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + D95367D5DC075A18A3D27355 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 099F74031AE2D049001108A5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 099F74421AE2D7E0001108A5 /* AppDelegate.swift in Sources */, + 099F74401AE2D703001108A5 /* MainViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 099F74241AE2D049001108A5 /* Debug */ = { + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 099F74251AE2D049001108A5 /* Release */ = { + 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; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + 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.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 099F74271AE2D049001108A5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D1819A3B2BCA81021164F097 /* Pods.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 099F74281AE2D049001108A5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DC1FF3E7FE2F711D9C9AD066 /* Pods.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 099F74021AE2D049001108A5 /* Build configuration list for PBXProject "OHHTTPStubsDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 099F74241AE2D049001108A5 /* Debug */, + 099F74251AE2D049001108A5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 099F74261AE2D049001108A5 /* Build configuration list for PBXNativeTarget "OHHTTPStubsDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 099F74271AE2D049001108A5 /* Debug */, + 099F74281AE2D049001108A5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 099F73FF1AE2D049001108A5 /* Project object */; +} diff --git a/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubsDemo.xcscheme b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubsDemo.xcscheme new file mode 100644 index 000000000..a3b4ac68e --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcodeproj/xcshareddata/xcschemes/OHHTTPStubsDemo.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..cfc0e73f1 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/OHHTTPStubsDemo.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Podfile b/test/ios/OHHTTPStubs/Examples/Swift/Podfile new file mode 100644 index 000000000..a0112f4b2 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Podfile @@ -0,0 +1,7 @@ +source 'https://github.com/CocoaPods/Specs.git' + +xcodeproj 'OHHTTPStubsDemo.xcodeproj' +platform :ios, '8.0' +use_frameworks! + +pod 'OHHTTPStubs', :path => '../..' diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Podfile.lock b/test/ios/OHHTTPStubs/Examples/Swift/Podfile.lock new file mode 100644 index 000000000..8192540ce --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Podfile.lock @@ -0,0 +1,14 @@ +PODS: + - OHHTTPStubs (4.0.1) + +DEPENDENCIES: + - OHHTTPStubs (from `../..`) + +EXTERNAL SOURCES: + OHHTTPStubs: + :path: "../.." + +SPEC CHECKSUMS: + OHHTTPStubs: 69b1d48b7dfe838a355fdf48d8592d1042e3d85f + +COCOAPODS: 0.37.0 diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h new file mode 120000 index 000000000..e466a3093 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubs.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubs.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h new file mode 120000 index 000000000..55a0a6a46 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h new file mode 120000 index 000000000..247257b1d --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse+JSON.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h new file mode 120000 index 000000000..773f3f322 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHHTTPStubsResponse.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h new file mode 120000 index 000000000..6a6273c69 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Private/OHHTTPStubs/OHPathHelpers.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHPathHelpers.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h new file mode 120000 index 000000000..e466a3093 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubs.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubs.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h new file mode 120000 index 000000000..55a0a6a46 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+HTTPMessage.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h new file mode 120000 index 000000000..247257b1d --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse+JSON.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h new file mode 120000 index 000000000..773f3f322 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHHTTPStubsResponse.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHHTTPStubsResponse.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h new file mode 120000 index 000000000..6a6273c69 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Headers/Public/OHHTTPStubs/OHPathHelpers.h @@ -0,0 +1 @@ +../../../../../../OHHTTPStubs/Sources/OHPathHelpers.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Local Podspecs/OHHTTPStubs.podspec.json b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Local Podspecs/OHHTTPStubs.podspec.json new file mode 100644 index 000000000..3be5f2250 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Local Podspecs/OHHTTPStubs.podspec.json @@ -0,0 +1,26 @@ +{ + "name": "OHHTTPStubs", + "version": "4.0.1", + "summary": "Framework to stub your network requests like HTTP and help you write network unit tests with XCTest.", + "description": "A class to stub network requests easily:\n\n * Test your apps with fake network data (stubbed from file)\n * You can also customize your response headers and status code\n * Use customized stubs depending on the requests\n * Use custom response time to simulate slow network.\n * This works with any request (HTTP, HTTPS, or any protocol) sent using\n the iOS URL Loading System (NSURLConnection, NSURLSession, AFNetworking, …)\n * This is really useful in unit testing, when you need to test network features\n but don't want to hit the real network and fake some response data instead.\n * Has useful convenience methods to stub JSON content or fixture from a file\n * Compatible with Swift\n", + "homepage": "https://github.com/AliSoftware/OHHTTPStubs", + "license": "MIT", + "authors": { + "Olivier Halligon": "olivier.halligon+ae@gmail.com" + }, + "source": { + "git": "https://github.com/AliSoftware/OHHTTPStubs.git", + "tag": "4.0.1" + }, + "source_files": "OHHTTPStubs/Sources/*.{h,m}", + "public_header_files": "OHHTTPStubs/Sources/*.h", + "frameworks": [ + "Foundation", + "CFNetwork" + ], + "requires_arc": true, + "platforms": { + "ios": "5.0", + "osx": "10.7" + } +} diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Manifest.lock b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Manifest.lock new file mode 100644 index 000000000..8192540ce --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Manifest.lock @@ -0,0 +1,14 @@ +PODS: + - OHHTTPStubs (4.0.1) + +DEPENDENCIES: + - OHHTTPStubs (from `../..`) + +EXTERNAL SOURCES: + OHHTTPStubs: + :path: "../.." + +SPEC CHECKSUMS: + OHHTTPStubs: 69b1d48b7dfe838a355fdf48d8592d1042e3d85f + +COCOAPODS: 0.37.0 diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Pods.xcodeproj/project.pbxproj b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 000000000..5c218cc64 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,562 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 025EDA37E7DE8225A36E9533 /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A6726A194863F5663B3675B /* OHHTTPStubs.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 04A739CC8DD477CF2DD1049A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCC1018CD76A5124E04BCF56 /* Foundation.framework */; }; + 075B64EB9838CF1EC0D30922 /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = B78D37976D52B166349E5E6F /* OHHTTPStubsResponse+JSON.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 14483D9A6C49CA7A40EFE534 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCC1018CD76A5124E04BCF56 /* Foundation.framework */; }; + 166C7DCBA88C67DD08E2213F /* Pods-OHHTTPStubs-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D519BA859D6F5C634D553D4 /* Pods-OHHTTPStubs-dummy.m */; }; + 2838C1C53AE2A4B7A0CB6B2D /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 78DEBA4FE0386495BD23333C /* OHPathHelpers.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 2A5F193F83B7231858F7168E /* OHHTTPStubsResponse+HTTPMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C4EA7ED7B1527D723F8E532 /* OHHTTPStubsResponse+HTTPMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 476FA37EB9E1E2550A09B791 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EF5E38002A9F6264D56C1B71 /* Pods-dummy.m */; }; + 88E7C5F2FEE4A3B2BB0F62AC /* OHHTTPStubsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 86F20EE5AC3F660475C1B1C0 /* OHHTTPStubsResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B9C7CAB43CDB46B8F62A9BEE /* OHHTTPStubs.h in Headers */ = {isa = PBXBuildFile; fileRef = E0D231B2CD70092197143783 /* OHHTTPStubs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF155DE6DF34A3513FD4E824 /* OHHTTPStubsResponse+HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BCF165693C58B3CF965CBD9 /* OHHTTPStubsResponse+HTTPMessage.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + D6E4E9277A6BE0092AB01AB6 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AEB564388B3581B65467A32 /* CFNetwork.framework */; }; + DD462307456DA68D48B3DD09 /* Pods-OHHTTPStubs-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F9BE2226EACE897333DC5A85 /* Pods-OHHTTPStubs-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBF36E9C2568E24826C031B5 /* OHPathHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A996F9D34EDC707D02187F0 /* OHPathHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F0720B4AF2F6D426ED586B80 /* Pods-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DF781F1D5A3BD5192A49E9 /* Pods-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FA49795CDB854B8AF5215EA9 /* OHHTTPStubsResponse+JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F033017DBD2D340A327913A /* OHHTTPStubsResponse+JSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FD0D1769D5FA62B3B81F4A7B /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 657749B5FFBC67FB429EF8C8 /* OHHTTPStubs+NSURLSessionConfiguration.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + FECF1D77B5EA6D3A14324E0E /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 90935C1FB6D11C0CF2A1C0D0 /* OHHTTPStubsResponse.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C797270235A90C615B678C99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C2CBDA3936450283A6DE5391 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D30DD3818F4A6F62029AA2A7; + remoteInfo = "Pods-OHHTTPStubs"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0A6726A194863F5663B3675B /* OHHTTPStubs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = OHHTTPStubs.m; sourceTree = ""; }; + 0C4EA7ED7B1527D723F8E532 /* OHHTTPStubsResponse+HTTPMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubsResponse+HTTPMessage.h"; sourceTree = ""; }; + 0D519BA859D6F5C634D553D4 /* Pods-OHHTTPStubs-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OHHTTPStubs-dummy.m"; sourceTree = ""; }; + 0E1F5577F3CB2A1A816F4766 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; + 18547927D8BAD627CE1F2767 /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-environment.h"; sourceTree = ""; }; + 1BCF165693C58B3CF965CBD9 /* OHHTTPStubsResponse+HTTPMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubsResponse+HTTPMessage.m"; sourceTree = ""; }; + 3133227F412A22268B8AF43A /* Pods.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Pods.modulemap; sourceTree = ""; }; + 3C4E18BA425FF99FB4BC94B2 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 41DF781F1D5A3BD5192A49E9 /* Pods-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-umbrella.h"; sourceTree = ""; }; + 50D1B3B17AC91BE94D7AC1C3 /* Pods-OHHTTPStubs.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-OHHTTPStubs.modulemap"; sourceTree = ""; }; + 5A996F9D34EDC707D02187F0 /* OHPathHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = OHPathHelpers.h; sourceTree = ""; }; + 5C62297C51CB5C28BA2B8A3D /* Pods-OHHTTPStubs-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs-Private.xcconfig"; sourceTree = ""; }; + 5F033017DBD2D340A327913A /* OHHTTPStubsResponse+JSON.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubsResponse+JSON.h"; sourceTree = ""; }; + 657749B5FFBC67FB429EF8C8 /* OHHTTPStubs+NSURLSessionConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubs+NSURLSessionConfiguration.m"; sourceTree = ""; }; + 68E4D04F52C1DCB5E40CC71F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 776DB99A4E43C19DCEDA35EE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 78DEBA4FE0386495BD23333C /* OHPathHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = OHPathHelpers.m; sourceTree = ""; }; + 7AEB564388B3581B65467A32 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + 7CC91F06E268AD95D8E87E07 /* Pods-OHHTTPStubs-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OHHTTPStubs-prefix.pch"; sourceTree = ""; }; + 86F20EE5AC3F660475C1B1C0 /* OHHTTPStubsResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = OHHTTPStubsResponse.h; sourceTree = ""; }; + 90935C1FB6D11C0CF2A1C0D0 /* OHHTTPStubsResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = OHHTTPStubsResponse.m; sourceTree = ""; }; + B421722C71E69397A2EF865C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B78D37976D52B166349E5E6F /* OHHTTPStubsResponse+JSON.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubsResponse+JSON.m"; sourceTree = ""; }; + BE72840BBC26E4AACDC7A559 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; + C9E457A0D563C1AA75CE83B1 /* Pods-OHHTTPStubs.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs.xcconfig"; sourceTree = ""; }; + CB7B8D454F792A091232FCE4 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = ""; }; + DF8436795410709AD8A59E65 /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = ""; }; + E0D231B2CD70092197143783 /* OHHTTPStubs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = OHHTTPStubs.h; sourceTree = ""; }; + E2B7684424038D4C151FBB37 /* Pods-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-frameworks.sh"; sourceTree = ""; }; + E9DC5D74566513AD12B939E0 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EC618A869241D8D41FCA5D66 /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = ""; }; + EF5E38002A9F6264D56C1B71 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; + F9BE2226EACE897333DC5A85 /* Pods-OHHTTPStubs-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OHHTTPStubs-umbrella.h"; sourceTree = ""; }; + FCC1018CD76A5124E04BCF56 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BB29665972FBB8C2BDF6B926 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 04A739CC8DD477CF2DD1049A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C668BD504E49E41CBCEF977A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D6E4E9277A6BE0092AB01AB6 /* CFNetwork.framework in Frameworks */, + 14483D9A6C49CA7A40EFE534 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 06A88E21739F55C66513EA3C /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1FD2921CB92E9A0D66A7B44F /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 1FD2921CB92E9A0D66A7B44F /* iOS */ = { + isa = PBXGroup; + children = ( + 7AEB564388B3581B65467A32 /* CFNetwork.framework */, + FCC1018CD76A5124E04BCF56 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 50BB6BBA29675CDD0CA50ED6 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + CE249CD186D7B774C5BED5DA /* Pods */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 5F05422CA8CFAC32170B6ED8 /* Development Pods */ = { + isa = PBXGroup; + children = ( + DE8EEB58B39A5A1D181D097D /* OHHTTPStubs */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + 77B40E05B7BF4D0C1E0E9964 /* Support Files */ = { + isa = PBXGroup; + children = ( + B421722C71E69397A2EF865C /* Info.plist */, + 50D1B3B17AC91BE94D7AC1C3 /* Pods-OHHTTPStubs.modulemap */, + C9E457A0D563C1AA75CE83B1 /* Pods-OHHTTPStubs.xcconfig */, + 5C62297C51CB5C28BA2B8A3D /* Pods-OHHTTPStubs-Private.xcconfig */, + 0D519BA859D6F5C634D553D4 /* Pods-OHHTTPStubs-dummy.m */, + 7CC91F06E268AD95D8E87E07 /* Pods-OHHTTPStubs-prefix.pch */, + F9BE2226EACE897333DC5A85 /* Pods-OHHTTPStubs-umbrella.h */, + ); + name = "Support Files"; + path = "Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs"; + sourceTree = ""; + }; + CE249CD186D7B774C5BED5DA /* Pods */ = { + isa = PBXGroup; + children = ( + 776DB99A4E43C19DCEDA35EE /* Info.plist */, + 3133227F412A22268B8AF43A /* Pods.modulemap */, + EC618A869241D8D41FCA5D66 /* Pods-acknowledgements.markdown */, + CB7B8D454F792A091232FCE4 /* Pods-acknowledgements.plist */, + EF5E38002A9F6264D56C1B71 /* Pods-dummy.m */, + 18547927D8BAD627CE1F2767 /* Pods-environment.h */, + E2B7684424038D4C151FBB37 /* Pods-frameworks.sh */, + DF8436795410709AD8A59E65 /* Pods-resources.sh */, + 41DF781F1D5A3BD5192A49E9 /* Pods-umbrella.h */, + BE72840BBC26E4AACDC7A559 /* Pods.debug.xcconfig */, + 0E1F5577F3CB2A1A816F4766 /* Pods.release.xcconfig */, + ); + name = Pods; + path = "Target Support Files/Pods"; + sourceTree = ""; + }; + D2A210717D0CD3840C8071EA /* Sources */ = { + isa = PBXGroup; + children = ( + E0D231B2CD70092197143783 /* OHHTTPStubs.h */, + 0A6726A194863F5663B3675B /* OHHTTPStubs.m */, + 657749B5FFBC67FB429EF8C8 /* OHHTTPStubs+NSURLSessionConfiguration.m */, + 86F20EE5AC3F660475C1B1C0 /* OHHTTPStubsResponse.h */, + 90935C1FB6D11C0CF2A1C0D0 /* OHHTTPStubsResponse.m */, + 0C4EA7ED7B1527D723F8E532 /* OHHTTPStubsResponse+HTTPMessage.h */, + 1BCF165693C58B3CF965CBD9 /* OHHTTPStubsResponse+HTTPMessage.m */, + 5F033017DBD2D340A327913A /* OHHTTPStubsResponse+JSON.h */, + B78D37976D52B166349E5E6F /* OHHTTPStubsResponse+JSON.m */, + 5A996F9D34EDC707D02187F0 /* OHPathHelpers.h */, + 78DEBA4FE0386495BD23333C /* OHPathHelpers.m */, + ); + path = Sources; + sourceTree = ""; + }; + DB5D8EF15D472590591893B1 /* Products */ = { + isa = PBXGroup; + children = ( + E9DC5D74566513AD12B939E0 /* OHHTTPStubs.framework */, + 3C4E18BA425FF99FB4BC94B2 /* Pods.framework */, + ); + name = Products; + sourceTree = ""; + }; + DE8EEB58B39A5A1D181D097D /* OHHTTPStubs */ = { + isa = PBXGroup; + children = ( + E4D8AAB427BAAC84F3957D3F /* OHHTTPStubs */, + 77B40E05B7BF4D0C1E0E9964 /* Support Files */, + ); + name = OHHTTPStubs; + path = ../../..; + sourceTree = ""; + }; + E4D8AAB427BAAC84F3957D3F /* OHHTTPStubs */ = { + isa = PBXGroup; + children = ( + D2A210717D0CD3840C8071EA /* Sources */, + ); + path = OHHTTPStubs; + sourceTree = ""; + }; + F83DE1D494882E34A62D48B1 = { + isa = PBXGroup; + children = ( + 68E4D04F52C1DCB5E40CC71F /* Podfile */, + 5F05422CA8CFAC32170B6ED8 /* Development Pods */, + 06A88E21739F55C66513EA3C /* Frameworks */, + DB5D8EF15D472590591893B1 /* Products */, + 50BB6BBA29675CDD0CA50ED6 /* Targets Support Files */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 6109CBCD7C1C4DD48A864FB1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B9C7CAB43CDB46B8F62A9BEE /* OHHTTPStubs.h in Headers */, + 2A5F193F83B7231858F7168E /* OHHTTPStubsResponse+HTTPMessage.h in Headers */, + FA49795CDB854B8AF5215EA9 /* OHHTTPStubsResponse+JSON.h in Headers */, + 88E7C5F2FEE4A3B2BB0F62AC /* OHHTTPStubsResponse.h in Headers */, + EBF36E9C2568E24826C031B5 /* OHPathHelpers.h in Headers */, + DD462307456DA68D48B3DD09 /* Pods-OHHTTPStubs-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6B304C1E935C3B6D384BFC1A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F0720B4AF2F6D426ED586B80 /* Pods-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 520A8502FB55654F3D44663F /* Pods */ = { + isa = PBXNativeTarget; + buildConfigurationList = 35920CD46DC6721D6B943E13 /* Build configuration list for PBXNativeTarget "Pods" */; + buildPhases = ( + 87574F723CF88872A3710C10 /* Sources */, + BB29665972FBB8C2BDF6B926 /* Frameworks */, + 6B304C1E935C3B6D384BFC1A /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 3E902AAFC88492FC4CC25BCC /* PBXTargetDependency */, + ); + name = Pods; + productName = Pods; + productReference = 3C4E18BA425FF99FB4BC94B2 /* Pods.framework */; + productType = "com.apple.product-type.framework"; + }; + D30DD3818F4A6F62029AA2A7 /* Pods-OHHTTPStubs */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9E320C31BC20443632AE890E /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs" */; + buildPhases = ( + 70302128C9E296DA5A01A392 /* Sources */, + C668BD504E49E41CBCEF977A /* Frameworks */, + 6109CBCD7C1C4DD48A864FB1 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-OHHTTPStubs"; + productName = "Pods-OHHTTPStubs"; + productReference = E9DC5D74566513AD12B939E0 /* OHHTTPStubs.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C2CBDA3936450283A6DE5391 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + }; + buildConfigurationList = 5DAD56263AD60CAD28B28D71 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = F83DE1D494882E34A62D48B1; + productRefGroup = DB5D8EF15D472590591893B1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 520A8502FB55654F3D44663F /* Pods */, + D30DD3818F4A6F62029AA2A7 /* Pods-OHHTTPStubs */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 70302128C9E296DA5A01A392 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FD0D1769D5FA62B3B81F4A7B /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */, + 025EDA37E7DE8225A36E9533 /* OHHTTPStubs.m in Sources */, + BF155DE6DF34A3513FD4E824 /* OHHTTPStubsResponse+HTTPMessage.m in Sources */, + 075B64EB9838CF1EC0D30922 /* OHHTTPStubsResponse+JSON.m in Sources */, + FECF1D77B5EA6D3A14324E0E /* OHHTTPStubsResponse.m in Sources */, + 2838C1C53AE2A4B7A0CB6B2D /* OHPathHelpers.m in Sources */, + 166C7DCBA88C67DD08E2213F /* Pods-OHHTTPStubs-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 87574F723CF88872A3710C10 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 476FA37EB9E1E2550A09B791 /* Pods-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 3E902AAFC88492FC4CC25BCC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-OHHTTPStubs"; + target = D30DD3818F4A6F62029AA2A7 /* Pods-OHHTTPStubs */; + targetProxy = C797270235A90C615B678C99 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 204E7D31CAF5A4F252A4D622 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5C62297C51CB5C28BA2B8A3D /* Pods-OHHTTPStubs-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Pods-OHHTTPStubs/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = OHHTTPStubs; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 2AE519C01027BBCA761BBBAC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5C62297C51CB5C28BA2B8A3D /* Pods-OHHTTPStubs-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Pods-OHHTTPStubs/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = OHHTTPStubs; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 4C97FCFEC9543CEEE63EBFA1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BE72840BBC26E4AACDC7A559 /* Pods.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4E419842EB75B63AB6EB7CD9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0E1F5577F3CB2A1A816F4766 /* Pods.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 8B7B96657207941542B8A42E /* Release */ = { + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + F3155A251F8FB27D033C80B7 /* Debug */ = { + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 35920CD46DC6721D6B943E13 /* Build configuration list for PBXNativeTarget "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4C97FCFEC9543CEEE63EBFA1 /* Debug */, + 4E419842EB75B63AB6EB7CD9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5DAD56263AD60CAD28B28D71 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F3155A251F8FB27D033C80B7 /* Debug */, + 8B7B96657207941542B8A42E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9E320C31BC20443632AE890E /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 204E7D31CAF5A4F252A4D622 /* Debug */, + 2AE519C01027BBCA761BBBAC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C2CBDA3936450283A6DE5391 /* Project object */; +} diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Info.plist b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Info.plist new file mode 100644 index 000000000..c10e7eab4 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 4.0.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig new file mode 100644 index 000000000..56b72965a --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-Private.xcconfig @@ -0,0 +1,9 @@ +#include "Pods-OHHTTPStubs.xcconfig" +CONFIGURATION_BUILD_DIR = $PODS_FRAMEWORK_BUILD_PATH +FRAMEWORK_SEARCH_PATHS = "$PODS_FRAMEWORK_BUILD_PATH" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/OHHTTPStubs" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/OHHTTPStubs" +OTHER_LDFLAGS = ${PODS_OHHTTPSTUBS_OTHER_LDFLAGS} -ObjC +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m new file mode 100644 index 000000000..6e93a65cc --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_OHHTTPStubs : NSObject +@end +@implementation PodsDummy_Pods_OHHTTPStubs +@end diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch new file mode 100644 index 000000000..95cf11d9f --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-umbrella.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-umbrella.h new file mode 100644 index 000000000..28cfb1c4c --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs-umbrella.h @@ -0,0 +1,11 @@ +#import + +#import "OHHTTPStubs.h" +#import "OHHTTPStubsResponse+HTTPMessage.h" +#import "OHHTTPStubsResponse+JSON.h" +#import "OHHTTPStubsResponse.h" +#import "OHPathHelpers.h" + +FOUNDATION_EXPORT double OHHTTPStubsVersionNumber; +FOUNDATION_EXPORT const unsigned char OHHTTPStubsVersionString[]; + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.modulemap b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.modulemap new file mode 100644 index 000000000..efe706e39 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.modulemap @@ -0,0 +1,6 @@ +framework module OHHTTPStubs { + umbrella header "Pods-OHHTTPStubs-umbrella.h" + + export * + module * { export * } +} diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig new file mode 100644 index 000000000..de1d241ad --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods-OHHTTPStubs/Pods-OHHTTPStubs.xcconfig @@ -0,0 +1 @@ +PODS_OHHTTPSTUBS_OTHER_LDFLAGS = -framework "CFNetwork" -framework "Foundation" \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Info.plist b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Info.plist new file mode 100644 index 000000000..697454258 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown new file mode 100644 index 000000000..79d3603ad --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown @@ -0,0 +1,15 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## OHHTTPStubs + +- MIT LICENSE - + +Copyright (c) 2012 Olivier Halligon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Generated by CocoaPods - http://cocoapods.org diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.plist new file mode 100644 index 000000000..756aa4392 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-acknowledgements.plist @@ -0,0 +1,45 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + - MIT LICENSE - + +Copyright (c) 2012 Olivier Halligon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Title + OHHTTPStubs + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-dummy.m b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-dummy.m new file mode 100644 index 000000000..ade64bd1a --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods : NSObject +@end +@implementation PodsDummy_Pods +@end diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-environment.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-environment.h new file mode 100644 index 000000000..5918510c4 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-environment.h @@ -0,0 +1,14 @@ + +// To check if a library is compiled with CocoaPods you +// can use the `COCOAPODS` macro definition which is +// defined in the xcconfigs so it is available in +// headers also when they are imported in the client +// project. + + +// OHHTTPStubs +#define COCOAPODS_POD_AVAILABLE_OHHTTPStubs +#define COCOAPODS_VERSION_MAJOR_OHHTTPStubs 4 +#define COCOAPODS_VERSION_MINOR_OHHTTPStubs 0 +#define COCOAPODS_VERSION_PATCH_OHHTTPStubs 1 + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-frameworks.sh b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-frameworks.sh new file mode 100755 index 000000000..5b176d261 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-frameworks.sh @@ -0,0 +1,55 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + local source="${BUILT_PRODUCTS_DIR}/Pods/$1" + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source=$(readlink "${source}") + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers/" --filter "- PrivateHeaders/" --filter "- Modules/" ${source} ${destination}" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers/" --filter "- PrivateHeaders/" --filter "- Modules/" "${source}" "${destination}" + # Resign the code if required by the build settings to avoid unstable apps + if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then + code_sign "${destination}/$1" + fi + + # Embed linked Swift runtime libraries + local basename + basename=$(echo $1 | sed -E s/\\..+// && exit ${PIPESTATUS[0]}) + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/$1/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then + code_sign "${destination}/${lib}" + fi + done +} + +# Signs a framework with the provided identity +code_sign() { + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework 'OHHTTPStubs.framework' +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework 'OHHTTPStubs.framework' +fi diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-resources.sh b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-resources.sh new file mode 100755 index 000000000..43f08523e --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-resources.sh @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY=$(cd "${1%/*}" && pwd) + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-umbrella.h b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-umbrella.h new file mode 100644 index 000000000..21dcfd2c2 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double PodsVersionNumber; +FOUNDATION_EXPORT const unsigned char PodsVersionString[]; + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.debug.xcconfig new file mode 100644 index 000000000..c7ebebe60 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_FRAMEWORK_BUILD_PATH" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_FRAMEWORK_BUILD_PATH/OHHTTPStubs.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -framework "OHHTTPStubs" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.modulemap b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.modulemap new file mode 100644 index 000000000..841341307 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.modulemap @@ -0,0 +1,6 @@ +framework module Pods { + umbrella header "Pods-umbrella.h" + + export * + module * { export * } +} diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.release.xcconfig b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.release.xcconfig new file mode 100644 index 000000000..c7ebebe60 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Pods/Target Support Files/Pods/Pods.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_FRAMEWORK_BUILD_PATH" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_FRAMEWORK_BUILD_PATH/OHHTTPStubs.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -framework "OHHTTPStubs" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Stubs/stub.jpg b/test/ios/OHHTTPStubs/Examples/Swift/Stubs/stub.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c42a21cd74634618f6242384d5e598e9b82697a4 GIT binary patch literal 46859 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 DQ(N|F literal 0 HcmV?d00001 diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Stubs/stub.txt b/test/ios/OHHTTPStubs/Examples/Swift/Stubs/stub.txt new file mode 100644 index 000000000..e662f91b2 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Stubs/stub.txt @@ -0,0 +1,3 @@ +This is the text from your stub. + +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diem nonummy nibh euismod tincidunt ut lacreet dolore magna aliguam erat volutpat. Ut wisis enim ad minim veniam, quis nostrud exerci tution ullam corper suscipit lobortis nisi ut aliquip ex ea commodo consequat. Duis te feugi facilisi. Duis autem dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit au gue duis dolore te feugat nulla facilisi. diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Default-568h@2x.png b/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json b/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..36d2c80d8 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Info.plist b/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Info.plist new file mode 100644 index 000000000..29b20c32a --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.alisoftware.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/LaunchScreen.xib b/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/LaunchScreen.xib new file mode 100644 index 000000000..a9be7a994 --- /dev/null +++ b/test/ios/OHHTTPStubs/Examples/Swift/Supporting Files/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/ios/OHHTTPStubs/LICENSE b/test/ios/OHHTTPStubs/LICENSE new file mode 100644 index 000000000..a83928dd2 --- /dev/null +++ b/test/ios/OHHTTPStubs/LICENSE @@ -0,0 +1,9 @@ +- MIT LICENSE - + +Copyright (c) 2012 Olivier Halligon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs.podspec b/test/ios/OHHTTPStubs/OHHTTPStubs.podspec new file mode 100644 index 000000000..ffa5e93ab --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs.podspec @@ -0,0 +1,37 @@ +Pod::Spec.new do |s| + + s.name = "OHHTTPStubs" + s.version = "4.0.1" + + s.summary = "Framework to stub your network requests like HTTP and help you write network unit tests with XCTest." + s.description = <<-DESC.gsub(/^ +\|/,'') + |A class to stub network requests easily: + | + | * Test your apps with fake network data (stubbed from file) + | * You can also customize your response headers and status code + | * Use customized stubs depending on the requests + | * Use custom response time to simulate slow network. + | * This works with any request (HTTP, HTTPS, or any protocol) sent using + | the iOS URL Loading System (NSURLConnection, NSURLSession, AFNetworking, …) + | * This is really useful in unit testing, when you need to test network features + | but don't want to hit the real network and fake some response data instead. + | * Has useful convenience methods to stub JSON content or fixture from a file + | * Compatible with Swift + DESC + + s.homepage = "https://github.com/AliSoftware/OHHTTPStubs" + s.license = "MIT" + s.authors = { 'Olivier Halligon' => 'olivier.halligon+ae@gmail.com' } + + s.source = { :git => "https://github.com/AliSoftware/OHHTTPStubs.git", :tag => s.version.to_s } + + s.source_files = "OHHTTPStubs/Sources/*.{h,m}" + s.public_header_files = "OHHTTPStubs/Sources/*.h" + + s.frameworks = 'Foundation', 'CFNetwork' + + s.requires_arc = true + s.ios.deployment_target = '5.0' + s.osx.deployment_target = '10.7' + +end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.pbxproj b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.pbxproj new file mode 100644 index 000000000..39f1c8607 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.pbxproj @@ -0,0 +1,1021 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 09110A4519805F4800D175E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09110A4419805F4800D175E4 /* Foundation.framework */; }; + 09110A5319805F4800D175E4 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09110A5219805F4800D175E4 /* XCTest.framework */; }; + 09110A5419805F4800D175E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09110A4419805F4800D175E4 /* Foundation.framework */; }; + 09110A5919805F4800D175E4 /* libOHHTTPStubs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 09110A4119805F4800D175E4 /* libOHHTTPStubs.a */; }; + 09110A6C1980605A00D175E4 /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A6B1980605A00D175E4 /* OHHTTPStubs.m */; }; + 09110A741980606A00D175E4 /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A6F1980606A00D175E4 /* OHHTTPStubsResponse.m */; }; + 09110A751980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A711980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.m */; }; + 09110A761980606A00D175E4 /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A731980606A00D175E4 /* OHHTTPStubsResponse+JSON.m */; }; + 09110A791980608600D175E4 /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A781980608600D175E4 /* OHHTTPStubs+NSURLSessionConfiguration.m */; }; + 095981881980682800807DBE /* AFNetworkingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 095981481980668E00807DBE /* AFNetworkingTests.m */; }; + 095981891980682E00807DBE /* NilValuesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 095981491980668E00807DBE /* NilValuesTests.m */; }; + 0959818A1980682E00807DBE /* NSURLConnectionDelegateTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814A1980668E00807DBE /* NSURLConnectionDelegateTests.m */; }; + 0959818B1980682E00807DBE /* NSURLConnectionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814B1980668E00807DBE /* NSURLConnectionTests.m */; }; + 0959818C1980682E00807DBE /* NSURLSessionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814C1980668E00807DBE /* NSURLSessionTests.m */; }; + 0959818D1980682E00807DBE /* TimingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814D1980668E00807DBE /* TimingTests.m */; }; + 0959818E1980682E00807DBE /* WithContentsOfURLTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814E1980668E00807DBE /* WithContentsOfURLTests.m */; }; + 095981D319806A7900807DBE /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09110A5219805F4800D175E4 /* XCTest.framework */; }; + 095981D719806A7900807DBE /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 095981C219806A7900807DBE /* OHHTTPStubs.framework */; }; + 095981EF19806AA200807DBE /* NilValuesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 095981491980668E00807DBE /* NilValuesTests.m */; }; + 095981F019806AA200807DBE /* NSURLConnectionDelegateTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814A1980668E00807DBE /* NSURLConnectionDelegateTests.m */; }; + 095981F119806AA200807DBE /* NSURLConnectionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814B1980668E00807DBE /* NSURLConnectionTests.m */; }; + 095981F219806AA200807DBE /* NSURLSessionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814C1980668E00807DBE /* NSURLSessionTests.m */; }; + 095981F319806AA200807DBE /* TimingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814D1980668E00807DBE /* TimingTests.m */; }; + 095981F419806AA200807DBE /* WithContentsOfURLTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0959814E1980668E00807DBE /* WithContentsOfURLTests.m */; }; + 095981F619806AAC00807DBE /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A6B1980605A00D175E4 /* OHHTTPStubs.m */; }; + 095981F719806AAC00807DBE /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A6F1980606A00D175E4 /* OHHTTPStubsResponse.m */; }; + 095981F819806AAC00807DBE /* OHHTTPStubsResponse+HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A711980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.m */; }; + 095981F919806AAC00807DBE /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A731980606A00D175E4 /* OHHTTPStubsResponse+JSON.m */; }; + 095981FA19806AAC00807DBE /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A781980608600D175E4 /* OHHTTPStubs+NSURLSessionConfiguration.m */; }; + 095981FB19806AB700807DBE /* OHHTTPStubs.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A6A1980605A00D175E4 /* OHHTTPStubs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 095981FC19806AF300807DBE /* OHHTTPStubs.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 09110A6A1980605A00D175E4 /* OHHTTPStubs.h */; }; + 095981FD19806AF300807DBE /* OHHTTPStubsResponse.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 09110A6E1980606A00D175E4 /* OHHTTPStubsResponse.h */; }; + 095981FE19806AF300807DBE /* OHHTTPStubsResponse+HTTPMessage.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 09110A701980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.h */; }; + 095981FF19806AF300807DBE /* OHHTTPStubsResponse+JSON.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 09110A721980606A00D175E4 /* OHHTTPStubsResponse+JSON.h */; }; + 0959820019806B1700807DBE /* OHHTTPStubsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A6E1980606A00D175E4 /* OHHTTPStubsResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0959820119806B1E00807DBE /* OHHTTPStubsResponse+HTTPMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A701980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0959820219806B2200807DBE /* OHHTTPStubsResponse+JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A721980606A00D175E4 /* OHHTTPStubsResponse+JSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 095B1AD51AE30BA7009D1B56 /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 095B1AD41AE30BA7009D1B56 /* OHPathHelpers.m */; }; + 095B1AD61AE3138C009D1B56 /* OHPathHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 095B1AD31AE30BA7009D1B56 /* OHPathHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 095B1AD71AE3138C009D1B56 /* OHPathHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 095B1AD31AE30BA7009D1B56 /* OHPathHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 095B1AD81AE31395009D1B56 /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 095B1AD41AE30BA7009D1B56 /* OHPathHelpers.m */; }; + 095B1AD91AE31396009D1B56 /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 095B1AD41AE30BA7009D1B56 /* OHPathHelpers.m */; }; + 095B1ADA1AE313E0009D1B56 /* OHPathHelpers.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 095B1AD31AE30BA7009D1B56 /* OHPathHelpers.h */; }; + 0DB397E35DDB6808A5496D53 /* libPods-OHHTTPStubs Mac Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F49690D948DE88BBB4A36B11 /* libPods-OHHTTPStubs Mac Tests.a */; }; + 47AF337B1A3775B600158C9F /* emptyfile.json in Resources */ = {isa = PBXBuildFile; fileRef = 47AF337A1A37757B00158C9F /* emptyfile.json */; }; + 47AF337C1A3775B600158C9F /* emptyfile.json in Resources */ = {isa = PBXBuildFile; fileRef = 47AF337A1A37757B00158C9F /* emptyfile.json */; }; + 4DD13AB8422F0151AF227209 /* libPods-OHHTTPStubs iOS Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 446DA13BA37A8466FF4F9D35 /* libPods-OHHTTPStubs iOS Tests.a */; }; + 725CD9B41A9EB6F600F84C8B /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A6B1980605A00D175E4 /* OHHTTPStubs.m */; }; + 725CD9B51A9EB6F800F84C8B /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A6F1980606A00D175E4 /* OHHTTPStubsResponse.m */; }; + 725CD9B61A9EB6FA00F84C8B /* OHHTTPStubsResponse+HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A711980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.m */; }; + 725CD9B71A9EB6FD00F84C8B /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A731980606A00D175E4 /* OHHTTPStubsResponse+JSON.m */; }; + 725CD9B81A9EB70000F84C8B /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 09110A781980608600D175E4 /* OHHTTPStubs+NSURLSessionConfiguration.m */; }; + 725CD9B91A9EB71000F84C8B /* OHHTTPStubs.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A6A1980605A00D175E4 /* OHHTTPStubs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 725CD9BA1A9EB71500F84C8B /* OHHTTPStubsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A6E1980606A00D175E4 /* OHHTTPStubsResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 725CD9BB1A9EB71A00F84C8B /* OHHTTPStubsResponse+JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A721980606A00D175E4 /* OHHTTPStubsResponse+JSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 725CD9BC1A9EB71D00F84C8B /* OHHTTPStubsResponse+HTTPMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 09110A701980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 09110A5719805F4800D175E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 09110A3919805F4800D175E4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 09110A4019805F4800D175E4; + remoteInfo = "OHHTTPStubs iOS"; + }; + 095981D519806A7900807DBE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 09110A3919805F4800D175E4 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 095981C119806A7900807DBE; + remoteInfo = "OHHTTPStubs Mac"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 09110A3F19805F4800D175E4 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + 095B1ADA1AE313E0009D1B56 /* OHPathHelpers.h in CopyFiles */, + 095981FC19806AF300807DBE /* OHHTTPStubs.h in CopyFiles */, + 095981FD19806AF300807DBE /* OHHTTPStubsResponse.h in CopyFiles */, + 095981FE19806AF300807DBE /* OHHTTPStubsResponse+HTTPMessage.h in CopyFiles */, + 095981FF19806AF300807DBE /* OHHTTPStubsResponse+JSON.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 09110A4119805F4800D175E4 /* libOHHTTPStubs.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libOHHTTPStubs.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 09110A4419805F4800D175E4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 09110A5119805F4800D175E4 /* OHHTTPStubs iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OHHTTPStubs iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 09110A5219805F4800D175E4 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 09110A6A1980605A00D175E4 /* OHHTTPStubs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OHHTTPStubs.h; sourceTree = ""; }; + 09110A6B1980605A00D175E4 /* OHHTTPStubs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OHHTTPStubs.m; sourceTree = ""; }; + 09110A6E1980606A00D175E4 /* OHHTTPStubsResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OHHTTPStubsResponse.h; sourceTree = ""; }; + 09110A6F1980606A00D175E4 /* OHHTTPStubsResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OHHTTPStubsResponse.m; sourceTree = ""; }; + 09110A701980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubsResponse+HTTPMessage.h"; sourceTree = ""; }; + 09110A711980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubsResponse+HTTPMessage.m"; sourceTree = ""; }; + 09110A721980606A00D175E4 /* OHHTTPStubsResponse+JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OHHTTPStubsResponse+JSON.h"; sourceTree = ""; }; + 09110A731980606A00D175E4 /* OHHTTPStubsResponse+JSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubsResponse+JSON.m"; sourceTree = ""; }; + 09110A781980608600D175E4 /* OHHTTPStubs+NSURLSessionConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "OHHTTPStubs+NSURLSessionConfiguration.m"; sourceTree = ""; }; + 095981451980657C00807DBE /* UnitTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "UnitTests-Info.plist"; sourceTree = ""; }; + 095981471980665400807DBE /* UnitTests-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UnitTests-Prefix.pch"; sourceTree = ""; }; + 095981481980668E00807DBE /* AFNetworkingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AFNetworkingTests.m; path = "Test Suites/AFNetworkingTests.m"; sourceTree = ""; }; + 095981491980668E00807DBE /* NilValuesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NilValuesTests.m; path = "Test Suites/NilValuesTests.m"; sourceTree = ""; }; + 0959814A1980668E00807DBE /* NSURLConnectionDelegateTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSURLConnectionDelegateTests.m; path = "Test Suites/NSURLConnectionDelegateTests.m"; sourceTree = ""; }; + 0959814B1980668E00807DBE /* NSURLConnectionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSURLConnectionTests.m; path = "Test Suites/NSURLConnectionTests.m"; sourceTree = ""; }; + 0959814C1980668E00807DBE /* NSURLSessionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSURLSessionTests.m; path = "Test Suites/NSURLSessionTests.m"; sourceTree = ""; }; + 0959814D1980668E00807DBE /* TimingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TimingTests.m; path = "Test Suites/TimingTests.m"; sourceTree = ""; }; + 0959814E1980668E00807DBE /* WithContentsOfURLTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WithContentsOfURLTests.m; path = "Test Suites/WithContentsOfURLTests.m"; sourceTree = ""; }; + 0959819819806A4200807DBE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 0959819919806A4200807DBE /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 0959819A19806A4200807DBE /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 095981C219806A7900807DBE /* OHHTTPStubs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 095981C619806A7900807DBE /* OHHTTPStubs Mac-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "OHHTTPStubs Mac-Info.plist"; sourceTree = ""; }; + 095981D219806A7900807DBE /* OHHTTPStubs Mac Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OHHTTPStubs Mac Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 095B1AD31AE30BA7009D1B56 /* OHPathHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OHPathHelpers.h; sourceTree = ""; }; + 095B1AD41AE30BA7009D1B56 /* OHPathHelpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OHPathHelpers.m; sourceTree = ""; }; + 0F72EA0B0A785AE724116B35 /* Pods-OHHTTPStubs iOS Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OHHTTPStubs iOS Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.debug.xcconfig"; sourceTree = ""; }; + 446DA13BA37A8466FF4F9D35 /* libPods-OHHTTPStubs iOS Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OHHTTPStubs iOS Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 47AF337A1A37757B00158C9F /* emptyfile.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = emptyfile.json; sourceTree = ""; }; + 725CD99B1A9EB65100F84C8B /* OHHTTPStubs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8DB8134EA435816E00804074 /* Pods-OHHTTPStubs iOS Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OHHTTPStubs iOS Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.release.xcconfig"; sourceTree = ""; }; + B11995FF7A5A81D0A322D6FA /* Pods-OHHTTPStubs Mac Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OHHTTPStubs Mac Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.debug.xcconfig"; sourceTree = ""; }; + E2483255B84CAC7897D6E98C /* Pods-OHHTTPStubs Mac Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OHHTTPStubs Mac Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.release.xcconfig"; sourceTree = ""; }; + F49690D948DE88BBB4A36B11 /* libPods-OHHTTPStubs Mac Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OHHTTPStubs Mac Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 09110A3E19805F4800D175E4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 09110A4519805F4800D175E4 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 09110A4E19805F4800D175E4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 09110A5319805F4800D175E4 /* XCTest.framework in Frameworks */, + 09110A5919805F4800D175E4 /* libOHHTTPStubs.a in Frameworks */, + 09110A5419805F4800D175E4 /* Foundation.framework in Frameworks */, + 4DD13AB8422F0151AF227209 /* libPods-OHHTTPStubs iOS Tests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 095981BE19806A7900807DBE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 095981CF19806A7900807DBE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 095981D719806A7900807DBE /* OHHTTPStubs.framework in Frameworks */, + 095981D319806A7900807DBE /* XCTest.framework in Frameworks */, + 0DB397E35DDB6808A5496D53 /* libPods-OHHTTPStubs Mac Tests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 725CD9971A9EB65100F84C8B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 09110A3819805F4800D175E4 = { + isa = PBXGroup; + children = ( + 09110A4619805F4800D175E4 /* OHHTTPStubs */, + 095981C519806A7900807DBE /* Supporting Files */, + 09110A5A19805F4800D175E4 /* UnitTests */, + 09110A4319805F4800D175E4 /* Frameworks */, + 09110A4219805F4800D175E4 /* Products */, + 69EB7ED77E3A41F78D65093A /* Pods */, + ); + sourceTree = ""; + }; + 09110A4219805F4800D175E4 /* Products */ = { + isa = PBXGroup; + children = ( + 09110A4119805F4800D175E4 /* libOHHTTPStubs.a */, + 09110A5119805F4800D175E4 /* OHHTTPStubs iOS Tests.xctest */, + 095981C219806A7900807DBE /* OHHTTPStubs.framework */, + 095981D219806A7900807DBE /* OHHTTPStubs Mac Tests.xctest */, + 725CD99B1A9EB65100F84C8B /* OHHTTPStubs.framework */, + ); + name = Products; + sourceTree = ""; + }; + 09110A4319805F4800D175E4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 09110A4419805F4800D175E4 /* Foundation.framework */, + 09110A5219805F4800D175E4 /* XCTest.framework */, + 0959819719806A4200807DBE /* Other Frameworks */, + F49690D948DE88BBB4A36B11 /* libPods-OHHTTPStubs Mac Tests.a */, + 446DA13BA37A8466FF4F9D35 /* libPods-OHHTTPStubs iOS Tests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 09110A4619805F4800D175E4 /* OHHTTPStubs */ = { + isa = PBXGroup; + children = ( + 09110A6A1980605A00D175E4 /* OHHTTPStubs.h */, + 09110A6B1980605A00D175E4 /* OHHTTPStubs.m */, + 09110A6D1980605D00D175E4 /* OHHTTPStubsResponse */, + 09110A771980607200D175E4 /* NSURLSession Support */, + 095B1AD31AE30BA7009D1B56 /* OHPathHelpers.h */, + 095B1AD41AE30BA7009D1B56 /* OHPathHelpers.m */, + ); + name = OHHTTPStubs; + path = Sources; + sourceTree = ""; + }; + 09110A5A19805F4800D175E4 /* UnitTests */ = { + isa = PBXGroup; + children = ( + 47AF33791A37755E00158C9F /* Fixtures */, + 095981461980663000807DBE /* Test Suites */, + 09110A5B19805F4800D175E4 /* Supporting Files */, + ); + path = UnitTests; + sourceTree = ""; + }; + 09110A5B19805F4800D175E4 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 095981471980665400807DBE /* UnitTests-Prefix.pch */, + 095981451980657C00807DBE /* UnitTests-Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 09110A6D1980605D00D175E4 /* OHHTTPStubsResponse */ = { + isa = PBXGroup; + children = ( + 09110A6E1980606A00D175E4 /* OHHTTPStubsResponse.h */, + 09110A6F1980606A00D175E4 /* OHHTTPStubsResponse.m */, + 09110A701980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.h */, + 09110A711980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.m */, + 09110A721980606A00D175E4 /* OHHTTPStubsResponse+JSON.h */, + 09110A731980606A00D175E4 /* OHHTTPStubsResponse+JSON.m */, + ); + name = OHHTTPStubsResponse; + sourceTree = ""; + }; + 09110A771980607200D175E4 /* NSURLSession Support */ = { + isa = PBXGroup; + children = ( + 09110A781980608600D175E4 /* OHHTTPStubs+NSURLSessionConfiguration.m */, + ); + name = "NSURLSession Support"; + sourceTree = ""; + }; + 095981461980663000807DBE /* Test Suites */ = { + isa = PBXGroup; + children = ( + 095981481980668E00807DBE /* AFNetworkingTests.m */, + 095981491980668E00807DBE /* NilValuesTests.m */, + 0959814A1980668E00807DBE /* NSURLConnectionDelegateTests.m */, + 0959814B1980668E00807DBE /* NSURLConnectionTests.m */, + 0959814C1980668E00807DBE /* NSURLSessionTests.m */, + 0959814D1980668E00807DBE /* TimingTests.m */, + 0959814E1980668E00807DBE /* WithContentsOfURLTests.m */, + ); + name = "Test Suites"; + sourceTree = ""; + }; + 0959819719806A4200807DBE /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 0959819819806A4200807DBE /* Foundation.framework */, + 0959819919806A4200807DBE /* CoreData.framework */, + 0959819A19806A4200807DBE /* AppKit.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 095981C519806A7900807DBE /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 095981C619806A7900807DBE /* OHHTTPStubs Mac-Info.plist */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; + 47AF33791A37755E00158C9F /* Fixtures */ = { + isa = PBXGroup; + children = ( + 47AF337A1A37757B00158C9F /* emptyfile.json */, + ); + path = Fixtures; + sourceTree = ""; + }; + 69EB7ED77E3A41F78D65093A /* Pods */ = { + isa = PBXGroup; + children = ( + B11995FF7A5A81D0A322D6FA /* Pods-OHHTTPStubs Mac Tests.debug.xcconfig */, + E2483255B84CAC7897D6E98C /* Pods-OHHTTPStubs Mac Tests.release.xcconfig */, + 0F72EA0B0A785AE724116B35 /* Pods-OHHTTPStubs iOS Tests.debug.xcconfig */, + 8DB8134EA435816E00804074 /* Pods-OHHTTPStubs iOS Tests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 095981BF19806A7900807DBE /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0959820219806B2200807DBE /* OHHTTPStubsResponse+JSON.h in Headers */, + 0959820119806B1E00807DBE /* OHHTTPStubsResponse+HTTPMessage.h in Headers */, + 0959820019806B1700807DBE /* OHHTTPStubsResponse.h in Headers */, + 095B1AD71AE3138C009D1B56 /* OHPathHelpers.h in Headers */, + 095981FB19806AB700807DBE /* OHHTTPStubs.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 725CD9981A9EB65100F84C8B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 725CD9B91A9EB71000F84C8B /* OHHTTPStubs.h in Headers */, + 725CD9BA1A9EB71500F84C8B /* OHHTTPStubsResponse.h in Headers */, + 725CD9BB1A9EB71A00F84C8B /* OHHTTPStubsResponse+JSON.h in Headers */, + 725CD9BC1A9EB71D00F84C8B /* OHHTTPStubsResponse+HTTPMessage.h in Headers */, + 095B1AD61AE3138C009D1B56 /* OHPathHelpers.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 09110A4019805F4800D175E4 /* OHHTTPStubs iOS StaticLib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 09110A6419805F4800D175E4 /* Build configuration list for PBXNativeTarget "OHHTTPStubs iOS StaticLib" */; + buildPhases = ( + 09110A3D19805F4800D175E4 /* Sources */, + 09110A3E19805F4800D175E4 /* Frameworks */, + 09110A3F19805F4800D175E4 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "OHHTTPStubs iOS StaticLib"; + productName = OHHTTPStubs; + productReference = 09110A4119805F4800D175E4 /* libOHHTTPStubs.a */; + productType = "com.apple.product-type.library.static"; + }; + 09110A5019805F4800D175E4 /* OHHTTPStubs iOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 09110A6719805F4800D175E4 /* Build configuration list for PBXNativeTarget "OHHTTPStubs iOS Tests" */; + buildPhases = ( + 7F432602D77FABAF29E05AA8 /* Check Pods Manifest.lock */, + 09110A4D19805F4800D175E4 /* Sources */, + 09110A4E19805F4800D175E4 /* Frameworks */, + 09110A4F19805F4800D175E4 /* Resources */, + 2E71B8D8A7ECD8287E0E81D5 /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 09110A5819805F4800D175E4 /* PBXTargetDependency */, + ); + name = "OHHTTPStubs iOS Tests"; + productName = OHHTTPStubsTests; + productReference = 09110A5119805F4800D175E4 /* OHHTTPStubs iOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 095981C119806A7900807DBE /* OHHTTPStubs Mac Framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 095981E019806A7900807DBE /* Build configuration list for PBXNativeTarget "OHHTTPStubs Mac Framework" */; + buildPhases = ( + 095981BD19806A7900807DBE /* Sources */, + 095981BE19806A7900807DBE /* Frameworks */, + 095981BF19806A7900807DBE /* Headers */, + 095981C019806A7900807DBE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "OHHTTPStubs Mac Framework"; + productName = "OHHTTPStubs Mac"; + productReference = 095981C219806A7900807DBE /* OHHTTPStubs.framework */; + productType = "com.apple.product-type.framework"; + }; + 095981D119806A7900807DBE /* OHHTTPStubs Mac Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 095981E319806A7900807DBE /* Build configuration list for PBXNativeTarget "OHHTTPStubs Mac Tests" */; + buildPhases = ( + 752F2AD343353136781BDAB2 /* Check Pods Manifest.lock */, + 095981CE19806A7900807DBE /* Sources */, + 095981CF19806A7900807DBE /* Frameworks */, + 095981D019806A7900807DBE /* Resources */, + BF1C89AB0FF2DD0E338DD44E /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 095981D619806A7900807DBE /* PBXTargetDependency */, + ); + name = "OHHTTPStubs Mac Tests"; + productName = "OHHTTPStubs Mac Tests"; + productReference = 095981D219806A7900807DBE /* OHHTTPStubs Mac Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 725CD99A1A9EB65100F84C8B /* OHHTTPStubs iOS Framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 725CD9B21A9EB65200F84C8B /* Build configuration list for PBXNativeTarget "OHHTTPStubs iOS Framework" */; + buildPhases = ( + 725CD9961A9EB65100F84C8B /* Sources */, + 725CD9971A9EB65100F84C8B /* Frameworks */, + 725CD9981A9EB65100F84C8B /* Headers */, + 725CD9991A9EB65100F84C8B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "OHHTTPStubs iOS Framework"; + productName = "OHHTTPStubs iOS Framework"; + productReference = 725CD99B1A9EB65100F84C8B /* OHHTTPStubs.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 09110A3919805F4800D175E4 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0510; + ORGANIZATIONNAME = AliSoftware; + TargetAttributes = { + 09110A5019805F4800D175E4 = { + TestTargetID = 09110A4019805F4800D175E4; + }; + 095981D119806A7900807DBE = { + TestTargetID = 095981C119806A7900807DBE; + }; + 725CD99A1A9EB65100F84C8B = { + CreatedOnToolsVersion = 6.1.1; + }; + }; + }; + buildConfigurationList = 09110A3C19805F4800D175E4 /* Build configuration list for PBXProject "OHHTTPStubs" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 09110A3819805F4800D175E4; + productRefGroup = 09110A4219805F4800D175E4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 09110A4019805F4800D175E4 /* OHHTTPStubs iOS StaticLib */, + 09110A5019805F4800D175E4 /* OHHTTPStubs iOS Tests */, + 725CD99A1A9EB65100F84C8B /* OHHTTPStubs iOS Framework */, + 095981C119806A7900807DBE /* OHHTTPStubs Mac Framework */, + 095981D119806A7900807DBE /* OHHTTPStubs Mac Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 09110A4F19805F4800D175E4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 47AF337B1A3775B600158C9F /* emptyfile.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 095981C019806A7900807DBE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 095981D019806A7900807DBE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 47AF337C1A3775B600158C9F /* emptyfile.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 725CD9991A9EB65100F84C8B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2E71B8D8A7ECD8287E0E81D5 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 752F2AD343353136781BDAB2 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 7F432602D77FABAF29E05AA8 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + BF1C89AB0FF2DD0E338DD44E /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 09110A3D19805F4800D175E4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 09110A751980606A00D175E4 /* OHHTTPStubsResponse+HTTPMessage.m in Sources */, + 09110A761980606A00D175E4 /* OHHTTPStubsResponse+JSON.m in Sources */, + 09110A791980608600D175E4 /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */, + 09110A6C1980605A00D175E4 /* OHHTTPStubs.m in Sources */, + 09110A741980606A00D175E4 /* OHHTTPStubsResponse.m in Sources */, + 095B1AD51AE30BA7009D1B56 /* OHPathHelpers.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 09110A4D19805F4800D175E4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0959818D1980682E00807DBE /* TimingTests.m in Sources */, + 0959818A1980682E00807DBE /* NSURLConnectionDelegateTests.m in Sources */, + 0959818E1980682E00807DBE /* WithContentsOfURLTests.m in Sources */, + 095981881980682800807DBE /* AFNetworkingTests.m in Sources */, + 0959818C1980682E00807DBE /* NSURLSessionTests.m in Sources */, + 0959818B1980682E00807DBE /* NSURLConnectionTests.m in Sources */, + 095981891980682E00807DBE /* NilValuesTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 095981BD19806A7900807DBE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 095981F719806AAC00807DBE /* OHHTTPStubsResponse.m in Sources */, + 095981F819806AAC00807DBE /* OHHTTPStubsResponse+HTTPMessage.m in Sources */, + 095981F619806AAC00807DBE /* OHHTTPStubs.m in Sources */, + 095981F919806AAC00807DBE /* OHHTTPStubsResponse+JSON.m in Sources */, + 095981FA19806AAC00807DBE /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */, + 095B1AD91AE31396009D1B56 /* OHPathHelpers.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 095981CE19806A7900807DBE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 095981F119806AA200807DBE /* NSURLConnectionTests.m in Sources */, + 095981F319806AA200807DBE /* TimingTests.m in Sources */, + 095981F419806AA200807DBE /* WithContentsOfURLTests.m in Sources */, + 095981EF19806AA200807DBE /* NilValuesTests.m in Sources */, + 095981F219806AA200807DBE /* NSURLSessionTests.m in Sources */, + 095981F019806AA200807DBE /* NSURLConnectionDelegateTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 725CD9961A9EB65100F84C8B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 725CD9B41A9EB6F600F84C8B /* OHHTTPStubs.m in Sources */, + 725CD9B81A9EB70000F84C8B /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */, + 725CD9B51A9EB6F800F84C8B /* OHHTTPStubsResponse.m in Sources */, + 725CD9B71A9EB6FD00F84C8B /* OHHTTPStubsResponse+JSON.m in Sources */, + 725CD9B61A9EB6FA00F84C8B /* OHHTTPStubsResponse+HTTPMessage.m in Sources */, + 095B1AD81AE31395009D1B56 /* OHPathHelpers.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 09110A5819805F4800D175E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 09110A4019805F4800D175E4 /* OHHTTPStubs iOS StaticLib */; + targetProxy = 09110A5719805F4800D175E4 /* PBXContainerItemProxy */; + }; + 095981D619806A7900807DBE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 095981C119806A7900807DBE /* OHHTTPStubs Mac Framework */; + targetProxy = 095981D519806A7900807DBE /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 09110A6219805F4800D175E4 /* Debug */ = { + 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__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "XCODE_VERSION=$(XCODE_VERSION_MAJOR)", + "$(inherited)", + ); + 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 = 5.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 09110A6319805F4800D175E4 /* Release */ = { + 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__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "XCODE_VERSION=$(XCODE_VERSION_MAJOR)", + "$(inherited)", + ); + 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 = 5.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 09110A6519805F4800D175E4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = /tmp/OHHTTPStubs.dst; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = OHHTTPStubs; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 09110A6619805F4800D175E4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DSTROOT = /tmp/OHHTTPStubs.dst; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = OHHTTPStubs; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 09110A6819805F4800D175E4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0F72EA0B0A785AE724116B35 /* Pods-OHHTTPStubs iOS Tests.debug.xcconfig */; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "UnitTests/UnitTests-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "UnitTests/UnitTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 09110A6919805F4800D175E4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8DB8134EA435816E00804074 /* Pods-OHHTTPStubs iOS Tests.release.xcconfig */; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "UnitTests/UnitTests-Prefix.pch"; + INFOPLIST_FILE = "UnitTests/UnitTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; + 095981E119806A7900807DBE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + FRAMEWORK_VERSION = A; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "Supporting Files/OHHTTPStubs Mac-Info.plist"; + INSTALL_PATH = "@rpath"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = OHHTTPStubs; + SDKROOT = macosx; + WRAPPER_EXTENSION = framework; + }; + name = Debug; + }; + 095981E219806A7900807DBE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + FRAMEWORK_VERSION = A; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + INFOPLIST_FILE = "Supporting Files/OHHTTPStubs Mac-Info.plist"; + INSTALL_PATH = "@rpath"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = OHHTTPStubs; + SDKROOT = macosx; + WRAPPER_EXTENSION = framework; + }; + name = Release; + }; + 095981E419806A7900807DBE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B11995FF7A5A81D0A322D6FA /* Pods-OHHTTPStubs Mac Tests.debug.xcconfig */; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + ); + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "UnitTests/UnitTests-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + MACOSX_DEPLOYMENT_TARGET = 10.8; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 095981E519806A7900807DBE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E2483255B84CAC7897D6E98C /* Pods-OHHTTPStubs Mac Tests.release.xcconfig */; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = ( + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(inherited)", + ); + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "UnitTests/UnitTests-Prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 10.8; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; + 725CD9AE1A9EB65200F84C8B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "Supporting Files/OHHTTPStubs iOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = OHHTTPStubs; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 725CD9AF1A9EB65200F84C8B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Supporting Files/OHHTTPStubs iOS-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = OHHTTPStubs; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 09110A3C19805F4800D175E4 /* Build configuration list for PBXProject "OHHTTPStubs" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 09110A6219805F4800D175E4 /* Debug */, + 09110A6319805F4800D175E4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 09110A6419805F4800D175E4 /* Build configuration list for PBXNativeTarget "OHHTTPStubs iOS StaticLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 09110A6519805F4800D175E4 /* Debug */, + 09110A6619805F4800D175E4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 09110A6719805F4800D175E4 /* Build configuration list for PBXNativeTarget "OHHTTPStubs iOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 09110A6819805F4800D175E4 /* Debug */, + 09110A6919805F4800D175E4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 095981E019806A7900807DBE /* Build configuration list for PBXNativeTarget "OHHTTPStubs Mac Framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 095981E119806A7900807DBE /* Debug */, + 095981E219806A7900807DBE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 095981E319806A7900807DBE /* Build configuration list for PBXNativeTarget "OHHTTPStubs Mac Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 095981E419806A7900807DBE /* Debug */, + 095981E519806A7900807DBE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 725CD9B21A9EB65200F84C8B /* Build configuration list for PBXNativeTarget "OHHTTPStubs iOS Framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 725CD9AE1A9EB65200F84C8B /* Debug */, + 725CD9AF1A9EB65200F84C8B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 09110A3919805F4800D175E4 /* Project object */; +} diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..25fccc6ba --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs Mac Framework.xcscheme b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs Mac Framework.xcscheme new file mode 100644 index 000000000..d9a07a32f --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs Mac Framework.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Framework.xcscheme b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Framework.xcscheme new file mode 100644 index 000000000..92fa01674 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS Framework.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS StaticLib.xcscheme b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS StaticLib.xcscheme new file mode 100644 index 000000000..ae7c69efd --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj/xcshareddata/xcschemes/OHHTTPStubs iOS StaticLib.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcworkspace/contents.xcworkspacedata b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..06ceb62b6 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Podfile b/test/ios/OHHTTPStubs/OHHTTPStubs/Podfile new file mode 100644 index 000000000..5e37ca872 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Podfile @@ -0,0 +1,14 @@ +source 'https://github.com/CocoaPods/Specs.git' + +xcodeproj 'OHHTTPStubs.xcodeproj' +inhibit_all_warnings! + +target 'OHHTTPStubs iOS Tests' do + platform :ios, '6.0' + pod 'AFNetworking', '2.5.0' +end + +target 'OHHTTPStubs Mac Tests' do + platform :osx, '10.8' + pod 'AFNetworking', '2.5.0' +end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Podfile.lock b/test/ios/OHHTTPStubs/OHHTTPStubs/Podfile.lock new file mode 100644 index 000000000..c3fbbd33b --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Podfile.lock @@ -0,0 +1,30 @@ +PODS: + - AFNetworking (2.5.0): + - AFNetworking/NSURLConnection (= 2.5.0) + - AFNetworking/NSURLSession (= 2.5.0) + - AFNetworking/Reachability (= 2.5.0) + - AFNetworking/Security (= 2.5.0) + - AFNetworking/Serialization (= 2.5.0) + - AFNetworking/UIKit (= 2.5.0) + - AFNetworking/NSURLConnection (2.5.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.5.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.5.0) + - AFNetworking/Security (2.5.0) + - AFNetworking/Serialization (2.5.0) + - AFNetworking/UIKit (2.5.0): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + +DEPENDENCIES: + - AFNetworking (= 2.5.0) + +SPEC CHECKSUMS: + AFNetworking: 96ac9bf3eda33582701cb1fcc5b896aa1e20311e + +COCOAPODS: 0.37.0 diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h new file mode 100644 index 000000000..dfa82f669 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1,67 @@ +// AFHTTPRequestOperation.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFURLConnectionOperation.h" + +/** + `AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + */ +@interface AFHTTPRequestOperation : AFURLConnectionOperation + +///------------------------------------------------ +/// @name Getting HTTP URL Connection Information +///------------------------------------------------ + +/** + The last HTTP response received by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSHTTPURLResponse *response; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an AFHTTPResponse serializer, which uses the raw data as its response object. The serializer validates the status code to be in the `2XX` range, denoting success. If the response serializer generates an error in `-responseObjectForResponse:data:error:`, the `failure` callback of the session task or request operation will be executed; otherwise, the `success` callback will be executed. + + @warning `responseSerializer` must not be `nil`. Setting a response serializer will clear out any cached value + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + An object constructed by the `responseSerializer` from the response and response data. Returns `nil` unless the operation `isFinished`, has a `response`, and has `responseData` with non-zero content length. If an error occurs during serialization, `nil` will be returned, and the `error` property will be populated with the serialization error. + */ +@property (readonly, nonatomic, strong) id responseObject; + +///----------------------------------------------------------- +/// @name Setting Completion Block Success / Failure Callbacks +///----------------------------------------------------------- + +/** + Sets the `completionBlock` property with a block that executes either the specified success or failure block, depending on the state of the request on completion. If `error` returns a value, which can be caused by an unacceptable status code or content type, then `failure` is executed. Otherwise, `success` is executed. + + This method should be overridden in subclasses in order to specify the response object passed into the success block. + + @param success The block to be executed on the completion of a successful request. This block has no return value and takes two arguments: the receiver operation and the object constructed from the response data of the request. + @param failure The block to be executed on the completion of an unsuccessful request. This block has no return value and takes two arguments: the receiver operation and the error that occurred during the request. + */ +- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m new file mode 100644 index 000000000..1de5812ca --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m @@ -0,0 +1,206 @@ +// AFHTTPRequestOperation.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFHTTPRequestOperation.h" + +static dispatch_queue_t http_request_operation_processing_queue() { + static dispatch_queue_t af_http_request_operation_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_http_request_operation_processing_queue = dispatch_queue_create("com.alamofire.networking.http-request.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return af_http_request_operation_processing_queue; +} + +static dispatch_group_t http_request_operation_completion_group() { + static dispatch_group_t af_http_request_operation_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_http_request_operation_completion_group = dispatch_group_create(); + }); + + return af_http_request_operation_completion_group; +} + +#pragma mark - + +@interface AFURLConnectionOperation () +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSURLResponse *response; +@end + +@interface AFHTTPRequestOperation () +@property (readwrite, nonatomic, strong) NSHTTPURLResponse *response; +@property (readwrite, nonatomic, strong) id responseObject; +@property (readwrite, nonatomic, strong) NSError *responseSerializationError; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@end + +@implementation AFHTTPRequestOperation +@dynamic lock; + +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest { + self = [super initWithRequest:urlRequest]; + if (!self) { + return nil; + } + + self.responseSerializer = [AFHTTPResponseSerializer serializer]; + + return self; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + [self.lock lock]; + _responseSerializer = responseSerializer; + self.responseObject = nil; + self.responseSerializationError = nil; + [self.lock unlock]; +} + +- (id)responseObject { + [self.lock lock]; + if (!_responseObject && [self isFinished] && !self.error) { + NSError *error = nil; + self.responseObject = [self.responseSerializer responseObjectForResponse:self.response data:self.responseData error:&error]; + if (error) { + self.responseSerializationError = error; + } + } + [self.lock unlock]; + + return _responseObject; +} + +- (NSError *)error { + if (_responseSerializationError) { + return _responseSerializationError; + } else { + return [super error]; + } +} + +#pragma mark - AFHTTPRequestOperation + +- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + // completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + self.completionBlock = ^{ + if (self.completionGroup) { + dispatch_group_enter(self.completionGroup); + } + + dispatch_async(http_request_operation_processing_queue(), ^{ + if (self.error) { + if (failure) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + id responseObject = self.responseObject; + if (self.error) { + if (failure) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + success(self, responseObject); + }); + } + } + } + + if (self.completionGroup) { + dispatch_group_leave(self.completionGroup); + } + }); + }; +#pragma clang diagnostic pop +} + +#pragma mark - AFURLRequestOperation + +- (void)pause { + [super pause]; + + u_int64_t offset = 0; + if ([self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey]) { + offset = [(NSNumber *)[self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey] unsignedLongLongValue]; + } else { + offset = [(NSData *)[self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey] length]; + } + + NSMutableURLRequest *mutableURLRequest = [self.request mutableCopy]; + if ([self.response respondsToSelector:@selector(allHeaderFields)] && [[self.response allHeaderFields] valueForKey:@"ETag"]) { + [mutableURLRequest setValue:[[self.response allHeaderFields] valueForKey:@"ETag"] forHTTPHeaderField:@"If-Range"]; + } + [mutableURLRequest setValue:[NSString stringWithFormat:@"bytes=%llu-", offset] forHTTPHeaderField:@"Range"]; + self.request = mutableURLRequest; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestOperation *operation = [super copyWithZone:zone]; + + operation.responseSerializer = [self.responseSerializer copyWithZone:zone]; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h new file mode 100644 index 000000000..9f390294e --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1,308 @@ +// AFHTTPRequestOperationManager.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +#import "AFHTTPRequestOperation.h" +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" +#import "AFSecurityPolicy.h" +#import "AFNetworkReachabilityManager.h" + +/** + `AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. + + ## Subclassing Notes + + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. + + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. + + ## Methods to Override + + To change the behavior of all request operation construction for an `AFHTTPRequestOperationManager` subclass, override `HTTPRequestOperationWithRequest:success:failure`. + + ## Serialization + + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. + + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` + + ## URL Construction Using Relative Paths + + For HTTP convenience methods, the request serializer constructs URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`, when provided. If `baseURL` is `nil`, `path` needs to resolve to a valid `NSURL` object using `NSURL +URLWithString:`. + + Below are a few examples of how `baseURL` and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Also important to note is that a trailing slash will be added to any `baseURL` without one. This would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + ## Network Reachability Monitoring + + Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. + + ## NSSecureCoding & NSCopying Caveats + + `AFHTTPRequestOperationManager` conforms to the `NSSecureCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. There are a few minor caveats to keep in mind, however: + + - Archives and copies of HTTP clients will be initialized with an empty operation queue. + - NSSecureCoding cannot serialize / deserialize block properties, so an archive of an HTTP client will not include any reachability callback block that may be set. + */ +@interface AFHTTPRequestOperationManager : NSObject + +/** + The URL used to monitor reachability, and construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. + */ +@property (readonly, nonatomic, strong) NSURL *baseURL; + +/** + Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. + + @warning `requestSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to a JSON serializer, which serializes data from responses with a `application/json` MIME type, and falls back to the raw data object. The serializer validates the status code to be in the `2XX` range, denoting success. If the response serializer generates an error in `-responseObjectForResponse:data:error:`, the `failure` callback of the session task or request operation will be executed; otherwise, the `success` callback will be executed. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + The operation queue on which request operations are scheduled and run. + */ +@property (nonatomic, strong) NSOperationQueue *operationQueue; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Whether request operations should consult the credential storage for authenticating the connection. `YES` by default. + + @see AFURLConnectionOperation -shouldUseCredentialStorage + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + The credential used by request operations for authentication challenges. + + @see AFURLConnectionOperation -credential + */ +@property (nonatomic, strong) NSURLCredential *credential; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used by created request operations to evaluate server trust for secure connections. `AFHTTPRequestOperationManager` uses the `defaultPolicy` unless otherwise specified. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///------------------------------------ +/// @name Managing Network Reachability +///------------------------------------ + +/** + The network reachability manager. `AFHTTPRequestOperationManager` uses the `sharedManager` by default. + */ +@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager; + +///------------------------------- +/// @name Managing Callback Queues +///------------------------------- + +/** + The dispatch queue for the `completionBlock` of request operations. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, strong) dispatch_queue_t completionQueue; + +/** + The dispatch group for the `completionBlock` of request operations. If `NULL` (default), a private dispatch group is used. + */ +@property (nonatomic, strong) dispatch_group_t completionGroup; + +///--------------------------------------------- +/// @name Creating and Initializing HTTP Clients +///--------------------------------------------- + +/** + Creates and returns an `AFHTTPRequestOperationManager` object. + */ ++ (instancetype)manager; + +/** + Initializes an `AFHTTPRequestOperationManager` object with the specified base URL. + + This is the designated initializer. + + @param url The base URL for the HTTP client. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(NSURL *)url; + +///--------------------------------------- +/// @name Managing HTTP Request Operations +///--------------------------------------- + +/** + Creates an `AFHTTPRequestOperation`, and sets the response serializers to that of the HTTP client. + + @param request The request object to be loaded asynchronously during execution of the operation. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + */ +- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +///--------------------------- +/// @name Making HTTP Requests +///--------------------------- + +/** + Creates and runs an `AFHTTPRequestOperation` with a `GET` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `HEAD` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes a single arguments: the request operation. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a multipart `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `PUT` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `PATCH` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `DELETE` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +@end + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m new file mode 100644 index 000000000..4ae727548 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m @@ -0,0 +1,253 @@ +// AFHTTPRequestOperationManager.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import "AFHTTPRequestOperationManager.h" +#import "AFHTTPRequestOperation.h" + +#import +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +@interface AFHTTPRequestOperationManager () +@property (readwrite, nonatomic, strong) NSURL *baseURL; +@end + +@implementation AFHTTPRequestOperationManager + ++ (instancetype)manager { + return [[self alloc] initWithBaseURL:nil]; +} + +- (instancetype)init { + return [self initWithBaseURL:nil]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + self = [super init]; + if (!self) { + return nil; + } + + // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected + if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) { + url = [url URLByAppendingPathComponent:@""]; + } + + self.baseURL = url; + + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; + + self.operationQueue = [[NSOperationQueue alloc] init]; + + self.shouldUseCredentialStorage = YES; + + return self; +} + +#pragma mark - + +#ifdef _SYSTEMCONFIGURATION_H +#endif + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + NSParameterAssert(requestSerializer); + + _requestSerializer = requestSerializer; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + _responseSerializer = responseSerializer; +} + +#pragma mark - + +- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + operation.responseSerializer = self.responseSerializer; + operation.shouldUseCredentialStorage = self.shouldUseCredentialStorage; + operation.credential = self.credential; + operation.securityPolicy = self.securityPolicy; + + [operation setCompletionBlockWithSuccess:success failure:failure]; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +#pragma mark - + +- (AFHTTPRequestOperation *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"HEAD" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *requestOperation, __unused id responseObject) { + if (success) { + success(requestOperation); + } + } failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:nil]; + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"PUT" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"PATCH" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"DELETE" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil]; + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.operationQueue]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURL *baseURL = [decoder decodeObjectForKey:NSStringFromSelector(@selector(baseURL))]; + + self = [self initWithBaseURL:baseURL]; + if (!self) { + return nil; + } + + self.requestSerializer = [decoder decodeObjectOfClass:[AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))]; + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.baseURL forKey:NSStringFromSelector(@selector(baseURL))]; + [coder encodeObject:self.requestSerializer forKey:NSStringFromSelector(@selector(requestSerializer))]; + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestOperationManager *HTTPClient = [[[self class] allocWithZone:zone] initWithBaseURL:self.baseURL]; + + HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; + HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; + + return HTTPClient; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h new file mode 100644 index 000000000..8fed5a689 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1,240 @@ +// AFHTTPSessionManager.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +#import "AFURLSessionManager.h" + +/** + `AFHTTPSessionManager` is a subclass of `AFURLSessionManager` with convenience methods for making HTTP requests. When a `baseURL` is provided, requests made with the `GET` / `POST` / et al. convenience methods can be made with relative paths. + + ## Subclassing Notes + + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. + + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. + + ## Methods to Override + + To change the behavior of all data task operation construction, which is also used in the `GET` / `POST` / et al. convenience methods, override `dataTaskWithRequest:completionHandler:`. + + ## Serialization + + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. + + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` + + ## URL Construction Using Relative Paths + + For HTTP convenience methods, the request serializer constructs URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`, when provided. If `baseURL` is `nil`, `path` needs to resolve to a valid `NSURL` object using `NSURL +URLWithString:`. + + Below are a few examples of how `baseURL` and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Also important to note is that a trailing slash will be added to any `baseURL` without one. This would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. + */ + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +@interface AFHTTPSessionManager : AFURLSessionManager + +/** + The URL used to monitor reachability, and construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. + */ +@property (readonly, nonatomic, strong) NSURL *baseURL; + +/** + Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. + + @warning `requestSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns an `AFHTTPSessionManager` object. + */ ++ (instancetype)manager; + +/** + Initializes an `AFHTTPSessionManager` object with the specified base URL. + + @param url The base URL for the HTTP client. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(NSURL *)url; + +/** + Initializes an `AFHTTPSessionManager` object with the specified base URL. + + This is the designated initializer. + + @param url The base URL for the HTTP client. + @param configuration The configuration used to create the managed session. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(NSURL *)url + sessionConfiguration:(NSURLSessionConfiguration *)configuration; + +///--------------------------- +/// @name Making HTTP Requests +///--------------------------- + +/** + Creates and runs an `NSURLSessionDataTask` with a `GET` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `HEAD` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes a single arguments: the data task. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a multipart `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `PUT` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `PATCH` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `DELETE` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m new file mode 100644 index 000000000..6413297d7 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m @@ -0,0 +1,321 @@ +// AFHTTPSessionManager.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFHTTPSessionManager.h" + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" + +#import +#import + +#ifdef _SYSTEMCONFIGURATION_H +#import +#import +#import +#import +#import +#endif + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +@interface AFHTTPSessionManager () +@property (readwrite, nonatomic, strong) NSURL *baseURL; +@end + +@implementation AFHTTPSessionManager + ++ (instancetype)manager { + return [[[self class] alloc] initWithBaseURL:nil]; +} + +- (instancetype)init { + return [self initWithBaseURL:nil]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + return [self initWithBaseURL:url sessionConfiguration:nil]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + return [self initWithBaseURL:nil sessionConfiguration:configuration]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url + sessionConfiguration:(NSURLSessionConfiguration *)configuration +{ + self = [super initWithSessionConfiguration:configuration]; + if (!self) { + return nil; + } + + // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected + if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) { + url = [url URLByAppendingPathComponent:@""]; + } + + self.baseURL = url; + + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + return self; +} + +#pragma mark - + +#ifdef _SYSTEMCONFIGURATION_H +#endif + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + NSParameterAssert(requestSerializer); + + _requestSerializer = requestSerializer; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + [super setResponseSerializer:responseSerializer]; +} + +#pragma mark - + +- (NSURLSessionDataTask *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"HEAD" URLString:URLString parameters:parameters success:^(NSURLSessionDataTask *task, __unused id responseObject) { + if (success) { + success(task); + } + } failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"POST" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + __block NSURLSessionDataTask *task = [self uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { + if (error) { + if (failure) { + failure(task, error); + } + } else { + if (success) { + success(task, responseObject); + } + } + }]; + + [task resume]; + + return task; +} + +- (NSURLSessionDataTask *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PATCH" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"DELETE" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *, id))success + failure:(void (^)(NSURLSessionDataTask *, NSError *))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + __block NSURLSessionDataTask *dataTask = nil; + dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { + if (error) { + if (failure) { + failure(dataTask, error); + } + } else { + if (success) { + success(dataTask, responseObject); + } + } + }]; + + return dataTask; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, session: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.session, self.operationQueue]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURL *baseURL = [decoder decodeObjectOfClass:[NSURL class] forKey:NSStringFromSelector(@selector(baseURL))]; + NSURLSessionConfiguration *configuration = [decoder decodeObjectOfClass:[NSURLSessionConfiguration class] forKey:@"sessionConfiguration"]; + if (!configuration) { + NSString *configurationIdentifier = [decoder decodeObjectOfClass:[NSString class] forKey:@"identifier"]; + if (configurationIdentifier) { +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1100) + configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationIdentifier]; +#else + configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:configurationIdentifier]; +#endif + } + } + + self = [self initWithBaseURL:baseURL sessionConfiguration:configuration]; + if (!self) { + return nil; + } + + self.requestSerializer = [decoder decodeObjectOfClass:[AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))]; + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.baseURL forKey:NSStringFromSelector(@selector(baseURL))]; + if ([self.session.configuration conformsToProtocol:@protocol(NSCoding)]) { + [coder encodeObject:self.session.configuration forKey:@"sessionConfiguration"]; + } else { + [coder encodeObject:self.session.configuration.identifier forKey:@"identifier"]; + } + [coder encodeObject:self.requestSerializer forKey:NSStringFromSelector(@selector(requestSerializer))]; + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPSessionManager *HTTPClient = [[[self class] allocWithZone:zone] initWithBaseURL:self.baseURL sessionConfiguration:self.session.configuration]; + + HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; + HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; + + return HTTPClient; +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h new file mode 100644 index 000000000..5e610d887 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1,193 @@ +// AFNetworkReachabilityManager.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { + AFNetworkReachabilityStatusUnknown = -1, + AFNetworkReachabilityStatusNotReachable = 0, + AFNetworkReachabilityStatusReachableViaWWAN = 1, + AFNetworkReachabilityStatusReachableViaWiFi = 2, +}; + +/** + `AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. + + Reachability can be used to determine background information about why a network operation failed, or to trigger a network operation retrying when a connection is established. It should not be used to prevent a user from initiating a network request, as it's possible that an initial request may be required to establish reachability. + + See Apple's Reachability Sample Code (https://developer.apple.com/library/ios/samplecode/reachability/) + + @warning Instances of `AFNetworkReachabilityManager` must be started with `-startMonitoring` before reachability status can be determined. + */ +@interface AFNetworkReachabilityManager : NSObject + +/** + The current network reachability status. + */ +@property (readonly, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; + +/** + Whether or not the network is currently reachable. + */ +@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable; + +/** + Whether or not the network is currently reachable via WWAN. + */ +@property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN; + +/** + Whether or not the network is currently reachable via WiFi. + */ +@property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Returns the shared network reachability manager. + */ ++ (instancetype)sharedManager; + +/** + Creates and returns a network reachability manager for the specified domain. + + @param domain The domain used to evaluate network reachability. + + @return An initialized network reachability manager, actively monitoring the specified domain. + */ ++ (instancetype)managerForDomain:(NSString *)domain; + +/** + Creates and returns a network reachability manager for the socket address. + + @param address The socket address (`sockaddr_in`) used to evaluate network reachability. + + @return An initialized network reachability manager, actively monitoring the specified socket address. + */ ++ (instancetype)managerForAddress:(const void *)address; + +/** + Initializes an instance of a network reachability manager from the specified reachability object. + + @param reachability The reachability object to monitor. + + @return An initialized network reachability manager, actively monitoring the specified reachability. + */ +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability; + +///-------------------------------------------------- +/// @name Starting & Stopping Reachability Monitoring +///-------------------------------------------------- + +/** + Starts monitoring for changes in network reachability status. + */ +- (void)startMonitoring; + +/** + Stops monitoring for changes in network reachability status. + */ +- (void)stopMonitoring; + +///------------------------------------------------- +/// @name Getting Localized Reachability Description +///------------------------------------------------- + +/** + Returns a localized string representation of the current network reachability status. + */ +- (NSString *)localizedNetworkReachabilityStatusString; + +///--------------------------------------------------- +/// @name Setting Network Reachability Change Callback +///--------------------------------------------------- + +/** + Sets a callback to be executed when the network availability of the `baseURL` host changes. + + @param block A block object to be executed when the network availability of the `baseURL` host changes.. This block has no return value and takes a single argument which represents the various reachability states from the device to the `baseURL`. + */ +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## Network Reachability + + The following constants are provided by `AFNetworkReachabilityManager` as possible network reachability statuses. + + enum { + AFNetworkReachabilityStatusUnknown, + AFNetworkReachabilityStatusNotReachable, + AFNetworkReachabilityStatusReachableViaWWAN, + AFNetworkReachabilityStatusReachableViaWiFi, + } + + `AFNetworkReachabilityStatusUnknown` + The `baseURL` host reachability is not known. + + `AFNetworkReachabilityStatusNotReachable` + The `baseURL` host cannot be reached. + + `AFNetworkReachabilityStatusReachableViaWWAN` + The `baseURL` host can be reached via a cellular connection, such as EDGE or GPRS. + + `AFNetworkReachabilityStatusReachableViaWiFi` + The `baseURL` host can be reached via a Wi-Fi connection. + + ### Keys for Notification UserInfo Dictionary + + Strings that are used as keys in a `userInfo` dictionary in a network reachability status change notification. + + `AFNetworkingReachabilityNotificationStatusItem` + A key in the userInfo dictionary in a `AFNetworkingReachabilityDidChangeNotification` notification. + The corresponding value is an `NSNumber` object representing the `AFNetworkReachabilityStatus` value for the current reachability status. + */ + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when network reachability changes. + This notification assigns no notification object. The `userInfo` dictionary contains an `NSNumber` object under the `AFNetworkingReachabilityNotificationStatusItem` key, representing the `AFNetworkReachabilityStatus` value for the current network reachability. + + @warning In order for network reachability to be monitored, include the `SystemConfiguration` framework in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (`Prefix.pch`). + */ +extern NSString * const AFNetworkingReachabilityDidChangeNotification; +extern NSString * const AFNetworkingReachabilityNotificationStatusItem; + +///-------------------- +/// @name Functions +///-------------------- + +/** + Returns a localized string representation of an `AFNetworkReachabilityStatus` value. + */ +extern NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status); diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m new file mode 100644 index 000000000..1da148282 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m @@ -0,0 +1,259 @@ +// AFNetworkReachabilityManager.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFNetworkReachabilityManager.h" + +#import +#import +#import +#import +#import + +NSString * const AFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change"; +NSString * const AFNetworkingReachabilityNotificationStatusItem = @"AFNetworkingReachabilityNotificationStatusItem"; + +typedef void (^AFNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status); + +typedef NS_ENUM(NSUInteger, AFNetworkReachabilityAssociation) { + AFNetworkReachabilityForAddress = 1, + AFNetworkReachabilityForAddressPair = 2, + AFNetworkReachabilityForName = 3, +}; + +NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusNotReachable: + return NSLocalizedStringFromTable(@"Not Reachable", @"AFNetworking", nil); + case AFNetworkReachabilityStatusReachableViaWWAN: + return NSLocalizedStringFromTable(@"Reachable via WWAN", @"AFNetworking", nil); + case AFNetworkReachabilityStatusReachableViaWiFi: + return NSLocalizedStringFromTable(@"Reachable via WiFi", @"AFNetworking", nil); + case AFNetworkReachabilityStatusUnknown: + default: + return NSLocalizedStringFromTable(@"Unknown", @"AFNetworking", nil); + } +} + +static AFNetworkReachabilityStatus AFNetworkReachabilityStatusForFlags(SCNetworkReachabilityFlags flags) { + BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); + BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); + BOOL canConnectionAutomatically = (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)); + BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0); + BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction)); + + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusUnknown; + if (isNetworkReachable == NO) { + status = AFNetworkReachabilityStatusNotReachable; + } +#if TARGET_OS_IPHONE + else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { + status = AFNetworkReachabilityStatusReachableViaWWAN; + } +#endif + else { + status = AFNetworkReachabilityStatusReachableViaWiFi; + } + + return status; +} + +static void AFNetworkReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) { + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags); + AFNetworkReachabilityStatusBlock block = (__bridge AFNetworkReachabilityStatusBlock)info; + if (block) { + block(status); + } + + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:@{ AFNetworkingReachabilityNotificationStatusItem: @(status) }]; + }); + +} + +static const void * AFNetworkReachabilityRetainCallback(const void *info) { + return Block_copy(info); +} + +static void AFNetworkReachabilityReleaseCallback(const void *info) { + if (info) { + Block_release(info); + } +} + +@interface AFNetworkReachabilityManager () +@property (readwrite, nonatomic, assign) SCNetworkReachabilityRef networkReachability; +@property (readwrite, nonatomic, assign) AFNetworkReachabilityAssociation networkReachabilityAssociation; +@property (readwrite, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; +@property (readwrite, nonatomic, copy) AFNetworkReachabilityStatusBlock networkReachabilityStatusBlock; +@end + +@implementation AFNetworkReachabilityManager + ++ (instancetype)sharedManager { + static AFNetworkReachabilityManager *_sharedManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + struct sockaddr_in address; + bzero(&address, sizeof(address)); + address.sin_len = sizeof(address); + address.sin_family = AF_INET; + + _sharedManager = [self managerForAddress:&address]; + }); + + return _sharedManager; +} + ++ (instancetype)managerForDomain:(NSString *)domain { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [domain UTF8String]); + + AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability]; + manager.networkReachabilityAssociation = AFNetworkReachabilityForName; + + return manager; +} + ++ (instancetype)managerForAddress:(const void *)address { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address); + + AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability]; + manager.networkReachabilityAssociation = AFNetworkReachabilityForAddress; + + return manager; +} + +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability { + self = [super init]; + if (!self) { + return nil; + } + + self.networkReachability = reachability; + self.networkReachabilityStatus = AFNetworkReachabilityStatusUnknown; + + return self; +} + +- (void)dealloc { + [self stopMonitoring]; + + if (_networkReachability) { + CFRelease(_networkReachability); + _networkReachability = NULL; + } +} + +#pragma mark - + +- (BOOL)isReachable { + return [self isReachableViaWWAN] || [self isReachableViaWiFi]; +} + +- (BOOL)isReachableViaWWAN { + return self.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN; +} + +- (BOOL)isReachableViaWiFi { + return self.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi; +} + +#pragma mark - + +- (void)startMonitoring { + [self stopMonitoring]; + + if (!self.networkReachability) { + return; + } + + __weak __typeof(self)weakSelf = self; + AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + + strongSelf.networkReachabilityStatus = status; + if (strongSelf.networkReachabilityStatusBlock) { + strongSelf.networkReachabilityStatusBlock(status); + } + + }; + + SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL}; + SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context); + SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); + + switch (self.networkReachabilityAssociation) { + case AFNetworkReachabilityForName: + break; + case AFNetworkReachabilityForAddress: + case AFNetworkReachabilityForAddressPair: + default: { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{ + SCNetworkReachabilityFlags flags; + SCNetworkReachabilityGetFlags(self.networkReachability, &flags); + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags); + dispatch_async(dispatch_get_main_queue(), ^{ + callback(status); + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:@{ AFNetworkingReachabilityNotificationStatusItem: @(status) }]; + + + }); + }); + } + break; + } +} + +- (void)stopMonitoring { + if (!self.networkReachability) { + return; + } + + SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); +} + +#pragma mark - + +- (NSString *)localizedNetworkReachabilityStatusString { + return AFStringFromNetworkReachabilityStatus(self.networkReachabilityStatus); +} + +#pragma mark - + +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block { + self.networkReachabilityStatusBlock = block; +} + +#pragma mark - NSKeyValueObserving + ++ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { + if ([key isEqualToString:@"reachable"] || [key isEqualToString:@"reachableViaWWAN"] || [key isEqualToString:@"reachableViaWiFi"]) { + return [NSSet setWithObject:@"networkReachabilityStatus"]; + } + + return [super keyPathsForValuesAffectingValueForKey:key]; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworking.h new file mode 100644 index 000000000..68273da58 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFNetworking.h @@ -0,0 +1,44 @@ +// AFNetworking.h +// +// Copyright (c) 2013 AFNetworking (http://afnetworking.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +#ifndef _AFNETWORKING_ + #define _AFNETWORKING_ + + #import "AFURLRequestSerialization.h" + #import "AFURLResponseSerialization.h" + #import "AFSecurityPolicy.h" + #import "AFNetworkReachabilityManager.h" + + #import "AFURLConnectionOperation.h" + #import "AFHTTPRequestOperation.h" + #import "AFHTTPRequestOperationManager.h" + +#if ( ( defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || \ + ( defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 ) ) + #import "AFURLSessionManager.h" + #import "AFHTTPSessionManager.h" +#endif + +#endif /* _AFNETWORKING_ */ diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h new file mode 100644 index 000000000..a880d7519 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1,143 @@ +// AFSecurity.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { + AFSSLPinningModeNone, + AFSSLPinningModePublicKey, + AFSSLPinningModeCertificate, +}; + +/** + `AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + + Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. + */ +@interface AFSecurityPolicy : NSObject + +/** + The criteria by which server trust should be evaluated against the pinned SSL certificates. Defaults to `AFSSLPinningModeNone`. + */ +@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode; + +/** + Whether to evaluate an entire SSL certificate chain, or just the leaf certificate. Defaults to `YES`. + */ +@property (nonatomic, assign) BOOL validatesCertificateChain; + +/** + The certificates used to evaluate server trust according to the SSL pinning mode. By default, this property is set to any (`.cer`) certificates included in the app bundle. + */ +@property (nonatomic, strong) NSArray *pinnedCertificates; + +/** + Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`. + */ +@property (nonatomic, assign) BOOL allowInvalidCertificates; + +/** + Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES` for `AFSSLPinningModePublicKey` or `AFSSLPinningModeCertificate`, otherwise `NO`. + */ +@property (nonatomic, assign) BOOL validatesDomainName; + +///----------------------------------------- +/// @name Getting Specific Security Policies +///----------------------------------------- + +/** + Returns the shared default security policy, which does not allow invalid certificates, does not validate domain name, and does not validate against pinned certificates or public keys. + + @return The default security policy. + */ ++ (instancetype)defaultPolicy; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns a security policy with the specified pinning mode. + + @param pinningMode The SSL pinning mode. + + @return A new security policy. + */ ++ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode; + +///------------------------------ +/// @name Evaluating Server Trust +///------------------------------ + +/** + Whether or not the specified server trust should be accepted, based on the security policy. + + This method should be used when responding to an authentication challenge from a server. + + @param serverTrust The X.509 certificate trust of the server. + + @return Whether or not to trust the server. + + @warning This method has been deprecated in favor of `-evaluateServerTrust:forDomain:`. + */ +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust DEPRECATED_ATTRIBUTE; + +/** + Whether or not the specified server trust should be accepted, based on the security policy. + + This method should be used when responding to an authentication challenge from a server. + + @param serverTrust The X.509 certificate trust of the server. + @param domain The domain of serverTrust. If `nil`, the domain will not be validated. + + @return Whether or not to trust the server. + */ +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(NSString *)domain; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## SSL Pinning Modes + + The following constants are provided by `AFSSLPinningMode` as possible SSL pinning modes. + + enum { + AFSSLPinningModeNone, + AFSSLPinningModePublicKey, + AFSSLPinningModeCertificate, + } + + `AFSSLPinningModeNone` + Do not used pinned certificates to validate servers. + + `AFSSLPinningModePublicKey` + Validate host certificates against public keys of pinned certificates. + + `AFSSLPinningModeCertificate` + Validate host certificates against pinned certificates. +*/ diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m new file mode 100644 index 000000000..1f97f914f --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m @@ -0,0 +1,335 @@ +// AFSecurity.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFSecurityPolicy.h" + +// Equivalent of macro in , without causing compiler warning: +// "'DebugAssert' is deprecated: first deprecated in OS X 10.8" +#ifndef AF_Require + #define AF_Require(assertion, exceptionLabel) \ + do { \ + if (__builtin_expect(!(assertion), 0)) { \ + goto exceptionLabel; \ + } \ + } while (0) +#endif + +#ifndef AF_Require_noErr + #define AF_Require_noErr(errorCode, exceptionLabel) \ + do { \ + if (__builtin_expect(0 != (errorCode), 0)) { \ + goto exceptionLabel; \ + } \ + } while (0) +#endif + +#if !defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +static NSData * AFSecKeyGetData(SecKeyRef key) { + CFDataRef data = NULL; + + AF_Require_noErr(SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data), _out); + + return (__bridge_transfer NSData *)data; + +_out: + if (data) { + CFRelease(data); + } + + return nil; +} +#endif + +static BOOL AFSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + return [(__bridge id)key1 isEqual:(__bridge id)key2]; +#else + return [AFSecKeyGetData(key1) isEqual:AFSecKeyGetData(key2)]; +#endif +} + +static id AFPublicKeyForCertificate(NSData *certificate) { + id allowedPublicKey = nil; + SecCertificateRef allowedCertificate; + SecCertificateRef allowedCertificates[1]; + CFArrayRef tempCertificates = nil; + SecPolicyRef policy = nil; + SecTrustRef allowedTrust = nil; + SecTrustResultType result; + + allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate); + AF_Require(allowedCertificate != NULL, _out); + + allowedCertificates[0] = allowedCertificate; + tempCertificates = CFArrayCreate(NULL, (const void **)allowedCertificates, 1, NULL); + + policy = SecPolicyCreateBasicX509(); + AF_Require_noErr(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out); + AF_Require_noErr(SecTrustEvaluate(allowedTrust, &result), _out); + + allowedPublicKey = (__bridge_transfer id)SecTrustCopyPublicKey(allowedTrust); + +_out: + if (allowedTrust) { + CFRelease(allowedTrust); + } + + if (policy) { + CFRelease(policy); + } + + if (tempCertificates) { + CFRelease(tempCertificates); + } + + if (allowedCertificate) { + CFRelease(allowedCertificate); + } + + return allowedPublicKey; +} + +static BOOL AFServerTrustIsValid(SecTrustRef serverTrust) { + BOOL isValid = NO; + SecTrustResultType result; + AF_Require_noErr(SecTrustEvaluate(serverTrust, &result), _out); + + isValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed); + +_out: + return isValid; +} + +static NSArray * AFCertificateTrustChainForServerTrust(SecTrustRef serverTrust) { + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)]; + } + + return [NSArray arrayWithArray:trustChain]; +} + +static NSArray * AFPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) { + SecPolicyRef policy = SecPolicyCreateBasicX509(); + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + + SecCertificateRef someCertificates[] = {certificate}; + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); + + SecTrustRef trust; + AF_Require_noErr(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); + + SecTrustResultType result; + AF_Require_noErr(SecTrustEvaluate(trust, &result), _out); + + [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; + + _out: + if (trust) { + CFRelease(trust); + } + + if (certificates) { + CFRelease(certificates); + } + + continue; + } + CFRelease(policy); + + return [NSArray arrayWithArray:trustChain]; +} + +#pragma mark - + +@interface AFSecurityPolicy() +@property (readwrite, nonatomic, assign) AFSSLPinningMode SSLPinningMode; +@property (readwrite, nonatomic, strong) NSArray *pinnedPublicKeys; +@end + +@implementation AFSecurityPolicy + ++ (NSArray *)defaultPinnedCertificates { + static NSArray *_defaultPinnedCertificates = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"."]; + + NSMutableArray *certificates = [NSMutableArray arrayWithCapacity:[paths count]]; + for (NSString *path in paths) { + NSData *certificateData = [NSData dataWithContentsOfFile:path]; + [certificates addObject:certificateData]; + } + + _defaultPinnedCertificates = [[NSArray alloc] initWithArray:certificates]; + }); + + return _defaultPinnedCertificates; +} + ++ (instancetype)defaultPolicy { + AFSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = AFSSLPinningModeNone; + + return securityPolicy; +} + ++ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode { + AFSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = pinningMode; + + [securityPolicy setPinnedCertificates:[self defaultPinnedCertificates]]; + + return securityPolicy; +} + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + self.validatesCertificateChain = YES; + + return self; +} + +#pragma mark - + +- (void)setSSLPinningMode:(AFSSLPinningMode)SSLPinningMode { + _SSLPinningMode = SSLPinningMode; + + switch (self.SSLPinningMode) { + case AFSSLPinningModePublicKey: + case AFSSLPinningModeCertificate: + self.validatesDomainName = YES; + break; + default: + self.validatesDomainName = NO; + break; + } +} + +- (void)setPinnedCertificates:(NSArray *)pinnedCertificates { + _pinnedCertificates = pinnedCertificates; + + if (self.pinnedCertificates) { + NSMutableArray *mutablePinnedPublicKeys = [NSMutableArray arrayWithCapacity:[self.pinnedCertificates count]]; + for (NSData *certificate in self.pinnedCertificates) { + id publicKey = AFPublicKeyForCertificate(certificate); + if (!publicKey) { + continue; + } + [mutablePinnedPublicKeys addObject:publicKey]; + } + self.pinnedPublicKeys = [NSArray arrayWithArray:mutablePinnedPublicKeys]; + } else { + self.pinnedPublicKeys = nil; + } +} + +#pragma mark - + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust { + return [self evaluateServerTrust:serverTrust forDomain:nil]; +} + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(NSString *)domain +{ + NSMutableArray *policies = [NSMutableArray array]; + if (self.validatesDomainName) { + [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; + } else { + [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; + } + + SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); + + if (!AFServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { + return NO; + } + + NSArray *serverCertificates = AFCertificateTrustChainForServerTrust(serverTrust); + switch (self.SSLPinningMode) { + case AFSSLPinningModeNone: + return YES; + case AFSSLPinningModeCertificate: { + NSMutableArray *pinnedCertificates = [NSMutableArray array]; + for (NSData *certificateData in self.pinnedCertificates) { + [pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; + } + SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates); + + if (!AFServerTrustIsValid(serverTrust)) { + return NO; + } + + if (!self.validatesCertificateChain) { + return YES; + } + + NSUInteger trustedCertificateCount = 0; + for (NSData *trustChainCertificate in serverCertificates) { + if ([self.pinnedCertificates containsObject:trustChainCertificate]) { + trustedCertificateCount++; + } + } + + return trustedCertificateCount == [serverCertificates count]; + } + case AFSSLPinningModePublicKey: { + NSUInteger trustedPublicKeyCount = 0; + NSArray *publicKeys = AFPublicKeyTrustChainForServerTrust(serverTrust); + if (!self.validatesCertificateChain && [publicKeys count] > 0) { + publicKeys = @[[publicKeys firstObject]]; + } + + for (id trustChainPublicKey in publicKeys) { + for (id pinnedPublicKey in self.pinnedPublicKeys) { + if (AFSecKeyIsEqualToKey((__bridge SecKeyRef)trustChainPublicKey, (__bridge SecKeyRef)pinnedPublicKey)) { + trustedPublicKeyCount += 1; + } + } + } + + return trustedPublicKeyCount > 0 && ((self.validatesCertificateChain && trustedPublicKeyCount == [serverCertificates count]) || (!self.validatesCertificateChain && trustedPublicKeyCount >= 1)); + } + } + + return NO; +} + +#pragma mark - NSKeyValueObserving + ++ (NSSet *)keyPathsForValuesAffectingPinnedPublicKeys { + return [NSSet setWithObject:@"pinnedCertificates"]; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h new file mode 100644 index 000000000..85435564c --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1,328 @@ +// AFURLConnectionOperation.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" +#import "AFSecurityPolicy.h" + +/** + `AFURLConnectionOperation` is a subclass of `NSOperation` that implements `NSURLConnection` delegate methods. + + ## Subclassing Notes + + This is the base class of all network request operations. You may wish to create your own subclass in order to implement additional `NSURLConnection` delegate methods (see "`NSURLConnection` Delegate Methods" below), or to provide additional properties and/or class constructors. + + If you are creating a subclass that communicates over the HTTP or HTTPS protocols, you may want to consider subclassing `AFHTTPRequestOperation` instead, as it supports specifying acceptable content types or status codes. + + ## NSURLConnection Delegate Methods + + `AFURLConnectionOperation` implements the following `NSURLConnection` delegate methods: + + - `connection:didReceiveResponse:` + - `connection:didReceiveData:` + - `connectionDidFinishLoading:` + - `connection:didFailWithError:` + - `connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:` + - `connection:willCacheResponse:` + - `connectionShouldUseCredentialStorage:` + - `connection:needNewBodyStream:` + - `connection:willSendRequestForAuthenticationChallenge:` + + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. + + ## Callbacks and Completion Blocks + + The built-in `completionBlock` provided by `NSOperation` allows for custom behavior to be executed after the request finishes. It is a common pattern for class constructors in subclasses to take callback block parameters, and execute them conditionally in the body of its `completionBlock`. Make sure to handle cancelled operations appropriately when setting a `completionBlock` (i.e. returning early before parsing response data). See the implementation of any of the `AFHTTPRequestOperation` subclasses for an example of this. + + Subclasses are strongly discouraged from overriding `setCompletionBlock:`, as `AFURLConnectionOperation`'s implementation includes a workaround to mitigate retain cycles, and what Apple rather ominously refers to as ["The Deallocation Problem"](http://developer.apple.com/library/ios/#technotes/tn2109/). + + ## SSL Pinning + + Relying on the CA trust model to validate SSL certificates exposes your app to security vulnerabilities, such as man-in-the-middle attacks. For applications that connect to known servers, SSL certificate pinning provides an increased level of security, by checking server certificate validity against those specified in the app bundle. + + SSL with certificate pinning is strongly recommended for any application that transmits sensitive information to an external webservice. + + Connections will be validated on all matching certificates with a `.cer` extension in the bundle root. + + ## App Extensions + + When using AFNetworking in an App Extension, `#define AF_APP_EXTENSIONS` to avoid using unavailable APIs. + + ## NSCoding & NSCopying Conformance + + `AFURLConnectionOperation` conforms to the `NSCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. However, because of the intrinsic limitations of capturing the exact state of an operation at a particular moment, there are some important caveats to keep in mind: + + ### NSCoding Caveats + + - Encoded operations do not include any block or stream properties. Be sure to set `completionBlock`, `outputStream`, and any callback blocks as necessary when using `-initWithCoder:` or `NSKeyedUnarchiver`. + - Operations are paused on `encodeWithCoder:`. If the operation was encoded while paused or still executing, its archived state will return `YES` for `isReady`. Otherwise, the state of an operation when encoding will remain unchanged. + + ### NSCopying Caveats + + - `-copy` and `-copyWithZone:` return a new operation with the `NSURLRequest` of the original. So rather than an exact copy of the operation at that particular instant, the copying mechanism returns a completely new instance, which can be useful for retrying operations. + - A copy of an operation will not include the `outputStream` of the original. + - Operation copies do not include `completionBlock`, as it often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ operation when copied. + */ + +@interface AFURLConnectionOperation : NSOperation + +///------------------------------- +/// @name Accessing Run Loop Modes +///------------------------------- + +/** + The run loop modes in which the operation will run on the network thread. By default, this is a single-member set containing `NSRunLoopCommonModes`. + */ +@property (nonatomic, strong) NSSet *runLoopModes; + +///----------------------------------------- +/// @name Getting URL Connection Information +///----------------------------------------- + +/** + The request used by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSURLRequest *request; + +/** + The last response received by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSURLResponse *response; + +/** + The error, if any, that occurred in the lifecycle of the request. + */ +@property (readonly, nonatomic, strong) NSError *error; + +///---------------------------- +/// @name Getting Response Data +///---------------------------- + +/** + The data received during the request. + */ +@property (readonly, nonatomic, strong) NSData *responseData; + +/** + The string representation of the response data. + */ +@property (readonly, nonatomic, copy) NSString *responseString; + +/** + The string encoding of the response. + + If the response does not specify a valid string encoding, `responseStringEncoding` will return `NSUTF8StringEncoding`. + */ +@property (readonly, nonatomic, assign) NSStringEncoding responseStringEncoding; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Whether the URL connection should consult the credential storage for authenticating the connection. `YES` by default. + + This is the value that is returned in the `NSURLConnectionDelegate` method `-connectionShouldUseCredentialStorage:`. + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. + + This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. + */ +@property (nonatomic, strong) NSURLCredential *credential; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used to evaluate server trust for secure connections. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///------------------------ +/// @name Accessing Streams +///------------------------ + +/** + The input stream used to read data to be sent during the request. + + This property acts as a proxy to the `HTTPBodyStream` property of `request`. + */ +@property (nonatomic, strong) NSInputStream *inputStream; + +/** + The output stream that is used to write data received until the request is finished. + + By default, data is accumulated into a buffer that is stored into `responseData` upon completion of the request, with the intermediary `outputStream` property set to `nil`. When `outputStream` is set, the data will not be accumulated into an internal buffer, and as a result, the `responseData` property of the completed request will be `nil`. The output stream will be scheduled in the network thread runloop upon being set. + */ +@property (nonatomic, strong) NSOutputStream *outputStream; + +///--------------------------------- +/// @name Managing Callback Queues +///--------------------------------- + +/** + The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, strong) dispatch_queue_t completionQueue; + +/** + The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. + */ +@property (nonatomic, strong) dispatch_group_t completionGroup; + +///--------------------------------------------- +/// @name Managing Request Operation Information +///--------------------------------------------- + +/** + The user info dictionary for the receiver. + */ +@property (nonatomic, strong) NSDictionary *userInfo; + +///------------------------------------------------------ +/// @name Initializing an AFURLConnectionOperation Object +///------------------------------------------------------ + +/** + Initializes and returns a newly allocated operation object with a url connection configured with the specified url request. + + This is the designated initializer. + + @param urlRequest The request object to be used by the operation connection. + */ +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest; + +///---------------------------------- +/// @name Pausing / Resuming Requests +///---------------------------------- + +/** + Pauses the execution of the request operation. + + A paused operation returns `NO` for `-isReady`, `-isExecuting`, and `-isFinished`. As such, it will remain in an `NSOperationQueue` until it is either cancelled or resumed. Pausing a finished, cancelled, or paused operation has no effect. + */ +- (void)pause; + +/** + Whether the request operation is currently paused. + + @return `YES` if the operation is currently paused, otherwise `NO`. + */ +- (BOOL)isPaused; + +/** + Resumes the execution of the paused request operation. + + Pause/Resume behavior varies depending on the underlying implementation for the operation class. In its base implementation, resuming a paused requests restarts the original request. However, since HTTP defines a specification for how to request a specific content range, `AFHTTPRequestOperation` will resume downloading the request from where it left off, instead of restarting the original request. + */ +- (void)resume; + +///---------------------------------------------- +/// @name Configuring Backgrounding Task Behavior +///---------------------------------------------- + +/** + Specifies that the operation should continue execution after the app has entered the background, and the expiration handler for that background task. + + @param handler A handler to be called shortly before the application’s remaining background time reaches 0. The handler is wrapped in a block that cancels the operation, and cleans up and marks the end of execution, unlike the `handler` parameter in `UIApplication -beginBackgroundTaskWithExpirationHandler:`, which expects this to be done in the handler itself. The handler is called synchronously on the main thread, thus blocking the application’s suspension momentarily while the application is notified. + */ +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler; +#endif + +///--------------------------------- +/// @name Setting Progress Callbacks +///--------------------------------- + +/** + Sets a callback to be called when an undetermined number of bytes have been uploaded to the server. + + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes three arguments: the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block; + +/** + Sets a callback to be called when an undetermined number of bytes have been downloaded from the server. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block; + +///------------------------------------------------- +/// @name Setting NSURLConnection Delegate Callbacks +///------------------------------------------------- + +/** + Sets a block to be executed when the connection will authenticate a challenge in order to download its request, as handled by the `NSURLConnectionDelegate` method `connection:willSendRequestForAuthenticationChallenge:`. + + @param block A block object to be executed when the connection will authenticate a challenge in order to download its request. The block has no return type and takes two arguments: the URL connection object, and the challenge that must be authenticated. This block must invoke one of the challenge-responder methods (NSURLAuthenticationChallengeSender protocol). + + If `allowsInvalidSSLCertificate` is set to YES, `connection:willSendRequestForAuthenticationChallenge:` will attempt to have the challenge sender use credentials with invalid SSL certificates. + */ +- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block; + +/** + Sets a block to be executed when the server redirects the request from one URL to another URL, or when the request URL changed by the `NSURLProtocol` subclass handling the request in order to standardize its format, as handled by the `NSURLConnectionDataDelegate` method `connection:willSendRequest:redirectResponse:`. + + @param block A block object to be executed when the request URL was changed. The block returns an `NSURLRequest` object, the URL request to redirect, and takes three arguments: the URL connection object, the the proposed redirected request, and the URL response that caused the redirect. + */ +- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block; + + +/** + Sets a block to be executed to modify the response a connection will cache, if any, as handled by the `NSURLConnectionDelegate` method `connection:willCacheResponse:`. + + @param block A block object to be executed to determine what response a connection will cache, if any. The block returns an `NSCachedURLResponse` object, the cached response to store in memory or `nil` to prevent the response from being cached, and takes two arguments: the URL connection object, and the cached response provided for the request. + */ +- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block; + +/// + +/** + + */ ++ (NSArray *)batchOfRequestOperations:(NSArray *)operations + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock; + +@end + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when an operation begins executing. + */ +extern NSString * const AFNetworkingOperationDidStartNotification; + +/** + Posted when an operation finishes. + */ +extern NSString * const AFNetworkingOperationDidFinishNotification; diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m new file mode 100644 index 000000000..cfe609a2d --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m @@ -0,0 +1,789 @@ +// AFURLConnectionOperation.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLConnectionOperation.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +#if !__has_feature(objc_arc) +#error AFNetworking must be built with ARC. +// You can turn on ARC for only AFNetworking files by adding -fobjc-arc to the build phase for each of its files. +#endif + +typedef NS_ENUM(NSInteger, AFOperationState) { + AFOperationPausedState = -1, + AFOperationReadyState = 1, + AFOperationExecutingState = 2, + AFOperationFinishedState = 3, +}; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) +typedef UIBackgroundTaskIdentifier AFBackgroundTaskIdentifier; +#else +typedef id AFBackgroundTaskIdentifier; +#endif + +static dispatch_group_t url_request_operation_completion_group() { + static dispatch_group_t af_url_request_operation_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_request_operation_completion_group = dispatch_group_create(); + }); + + return af_url_request_operation_completion_group; +} + +static dispatch_queue_t url_request_operation_completion_queue() { + static dispatch_queue_t af_url_request_operation_completion_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_request_operation_completion_queue = dispatch_queue_create("com.alamofire.networking.operation.queue", DISPATCH_QUEUE_CONCURRENT ); + }); + + return af_url_request_operation_completion_queue; +} + +static NSString * const kAFNetworkingLockName = @"com.alamofire.networking.operation.lock"; + +NSString * const AFNetworkingOperationDidStartNotification = @"com.alamofire.networking.operation.start"; +NSString * const AFNetworkingOperationDidFinishNotification = @"com.alamofire.networking.operation.finish"; + +typedef void (^AFURLConnectionOperationProgressBlock)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +typedef void (^AFURLConnectionOperationAuthenticationChallengeBlock)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge); +typedef NSCachedURLResponse * (^AFURLConnectionOperationCacheResponseBlock)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse); +typedef NSURLRequest * (^AFURLConnectionOperationRedirectResponseBlock)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse); + +static inline NSString * AFKeyPathFromOperationState(AFOperationState state) { + switch (state) { + case AFOperationReadyState: + return @"isReady"; + case AFOperationExecutingState: + return @"isExecuting"; + case AFOperationFinishedState: + return @"isFinished"; + case AFOperationPausedState: + return @"isPaused"; + default: { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" + return @"state"; +#pragma clang diagnostic pop + } + } +} + +static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperationState toState, BOOL isCancelled) { + switch (fromState) { + case AFOperationReadyState: + switch (toState) { + case AFOperationPausedState: + case AFOperationExecutingState: + return YES; + case AFOperationFinishedState: + return isCancelled; + default: + return NO; + } + case AFOperationExecutingState: + switch (toState) { + case AFOperationPausedState: + case AFOperationFinishedState: + return YES; + default: + return NO; + } + case AFOperationFinishedState: + return NO; + case AFOperationPausedState: + return toState == AFOperationReadyState; + default: { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" + switch (toState) { + case AFOperationPausedState: + case AFOperationReadyState: + case AFOperationExecutingState: + case AFOperationFinishedState: + return YES; + default: + return NO; + } + } +#pragma clang diagnostic pop + } +} + +@interface AFURLConnectionOperation () +@property (readwrite, nonatomic, assign) AFOperationState state; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@property (readwrite, nonatomic, strong) NSURLConnection *connection; +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSURLResponse *response; +@property (readwrite, nonatomic, strong) NSError *error; +@property (readwrite, nonatomic, strong) NSData *responseData; +@property (readwrite, nonatomic, copy) NSString *responseString; +@property (readwrite, nonatomic, assign) NSStringEncoding responseStringEncoding; +@property (readwrite, nonatomic, assign) long long totalBytesRead; +@property (readwrite, nonatomic, assign) AFBackgroundTaskIdentifier backgroundTaskIdentifier; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock uploadProgress; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock downloadProgress; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationAuthenticationChallengeBlock authenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationCacheResponseBlock cacheResponse; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationRedirectResponseBlock redirectResponse; + +- (void)operationDidStart; +- (void)finish; +- (void)cancelConnection; +@end + +@implementation AFURLConnectionOperation +@synthesize outputStream = _outputStream; + ++ (void)networkRequestThreadEntryPoint:(id)__unused object { + @autoreleasepool { + [[NSThread currentThread] setName:@"AFNetworking"]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; + [runLoop run]; + } +} + ++ (NSThread *)networkRequestThread { + static NSThread *_networkRequestThread = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil]; + [_networkRequestThread start]; + }); + + return _networkRequestThread; +} + +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest { + NSParameterAssert(urlRequest); + + self = [super init]; + if (!self) { + return nil; + } + + _state = AFOperationReadyState; + + self.lock = [[NSRecursiveLock alloc] init]; + self.lock.name = kAFNetworkingLockName; + + self.runLoopModes = [NSSet setWithObject:NSRunLoopCommonModes]; + + self.request = urlRequest; + + self.shouldUseCredentialStorage = YES; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + return self; +} + +- (void)dealloc { + if (_outputStream) { + [_outputStream close]; + _outputStream = nil; + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) + if (_backgroundTaskIdentifier) { + [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier]; + _backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } +#endif +} + +#pragma mark - + +- (void)setResponseData:(NSData *)responseData { + [self.lock lock]; + if (!responseData) { + _responseData = nil; + } else { + _responseData = [NSData dataWithBytes:responseData.bytes length:responseData.length]; + } + [self.lock unlock]; +} + +- (NSString *)responseString { + [self.lock lock]; + if (!_responseString && self.response && self.responseData) { + self.responseString = [[NSString alloc] initWithData:self.responseData encoding:self.responseStringEncoding]; + } + [self.lock unlock]; + + return _responseString; +} + +- (NSStringEncoding)responseStringEncoding { + [self.lock lock]; + if (!_responseStringEncoding && self.response) { + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + if (self.response.textEncodingName) { + CFStringEncoding IANAEncoding = CFStringConvertIANACharSetNameToEncoding((__bridge CFStringRef)self.response.textEncodingName); + if (IANAEncoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(IANAEncoding); + } + } + + self.responseStringEncoding = stringEncoding; + } + [self.lock unlock]; + + return _responseStringEncoding; +} + +- (NSInputStream *)inputStream { + return self.request.HTTPBodyStream; +} + +- (void)setInputStream:(NSInputStream *)inputStream { + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + mutableRequest.HTTPBodyStream = inputStream; + self.request = mutableRequest; +} + +- (NSOutputStream *)outputStream { + if (!_outputStream) { + self.outputStream = [NSOutputStream outputStreamToMemory]; + } + + return _outputStream; +} + +- (void)setOutputStream:(NSOutputStream *)outputStream { + [self.lock lock]; + if (outputStream != _outputStream) { + if (_outputStream) { + [_outputStream close]; + } + + _outputStream = outputStream; + } + [self.lock unlock]; +} + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler { + [self.lock lock]; + if (!self.backgroundTaskIdentifier) { + UIApplication *application = [UIApplication sharedApplication]; + __weak __typeof(self)weakSelf = self; + self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ + __strong __typeof(weakSelf)strongSelf = weakSelf; + + if (handler) { + handler(); + } + + if (strongSelf) { + [strongSelf cancel]; + + [application endBackgroundTask:strongSelf.backgroundTaskIdentifier]; + strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + }]; + } + [self.lock unlock]; +} +#endif + +#pragma mark - + +- (void)setState:(AFOperationState)state { + if (!AFStateTransitionIsValid(self.state, state, [self isCancelled])) { + return; + } + + [self.lock lock]; + NSString *oldStateKey = AFKeyPathFromOperationState(self.state); + NSString *newStateKey = AFKeyPathFromOperationState(state); + + [self willChangeValueForKey:newStateKey]; + [self willChangeValueForKey:oldStateKey]; + _state = state; + [self didChangeValueForKey:oldStateKey]; + [self didChangeValueForKey:newStateKey]; + [self.lock unlock]; +} + +- (void)pause { + if ([self isPaused] || [self isFinished] || [self isCancelled]) { + return; + } + + [self.lock lock]; + if ([self isExecuting]) { + [self performSelector:@selector(operationDidPause) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; + }); + } + + self.state = AFOperationPausedState; + [self.lock unlock]; +} + +- (void)operationDidPause { + [self.lock lock]; + [self.connection cancel]; + [self.lock unlock]; +} + +- (BOOL)isPaused { + return self.state == AFOperationPausedState; +} + +- (void)resume { + if (![self isPaused]) { + return; + } + + [self.lock lock]; + self.state = AFOperationReadyState; + + [self start]; + [self.lock unlock]; +} + +#pragma mark - + +- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block { + self.uploadProgress = block; +} + +- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block { + self.downloadProgress = block; +} + +- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block { + self.authenticationChallenge = block; +} + +- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block { + self.cacheResponse = block; +} + +- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block { + self.redirectResponse = block; +} + +#pragma mark - NSOperation + +- (void)setCompletionBlock:(void (^)(void))block { + [self.lock lock]; + if (!block) { + [super setCompletionBlock:nil]; + } else { + __weak __typeof(self)weakSelf = self; + [super setCompletionBlock:^ { + __strong __typeof(weakSelf)strongSelf = weakSelf; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_group_t group = strongSelf.completionGroup ?: url_request_operation_completion_group(); + dispatch_queue_t queue = strongSelf.completionQueue ?: dispatch_get_main_queue(); +#pragma clang diagnostic pop + + dispatch_group_async(group, queue, ^{ + block(); + }); + + dispatch_group_notify(group, url_request_operation_completion_queue(), ^{ + [strongSelf setCompletionBlock:nil]; + }); + }]; + } + [self.lock unlock]; +} + +- (BOOL)isReady { + return self.state == AFOperationReadyState && [super isReady]; +} + +- (BOOL)isExecuting { + return self.state == AFOperationExecutingState; +} + +- (BOOL)isFinished { + return self.state == AFOperationFinishedState; +} + +- (BOOL)isConcurrent { + return YES; +} + +- (void)start { + [self.lock lock]; + if ([self isCancelled]) { + [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } else if ([self isReady]) { + self.state = AFOperationExecutingState; + + [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + [self.lock unlock]; +} + +- (void)operationDidStart { + [self.lock lock]; + if (![self isCancelled]) { + self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + for (NSString *runLoopMode in self.runLoopModes) { + [self.connection scheduleInRunLoop:runLoop forMode:runLoopMode]; + [self.outputStream scheduleInRunLoop:runLoop forMode:runLoopMode]; + } + + [self.outputStream open]; + [self.connection start]; + } + [self.lock unlock]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidStartNotification object:self]; + }); +} + +- (void)finish { + [self.lock lock]; + self.state = AFOperationFinishedState; + [self.lock unlock]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; + }); +} + +- (void)cancel { + [self.lock lock]; + if (![self isFinished] && ![self isCancelled]) { + [super cancel]; + + if ([self isExecuting]) { + [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + } + [self.lock unlock]; +} + +- (void)cancelConnection { + NSDictionary *userInfo = nil; + if ([self.request URL]) { + userInfo = [NSDictionary dictionaryWithObject:[self.request URL] forKey:NSURLErrorFailingURLErrorKey]; + } + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:userInfo]; + + if (![self isFinished]) { + if (self.connection) { + [self.connection cancel]; + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:error]; + } else { + // Accomodate race condition where `self.connection` has not yet been set before cancellation + self.error = error; + [self finish]; + } + } +} + +#pragma mark - + ++ (NSArray *)batchOfRequestOperations:(NSArray *)operations + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock +{ + if (!operations || [operations count] == 0) { + return @[[NSBlockOperation blockOperationWithBlock:^{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(@[]); + } + }); + }]]; + } + + __block dispatch_group_t group = dispatch_group_create(); + NSBlockOperation *batchedOperation = [NSBlockOperation blockOperationWithBlock:^{ + dispatch_group_notify(group, dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(operations); + } + }); + }]; + + for (AFURLConnectionOperation *operation in operations) { + operation.completionGroup = group; + void (^originalCompletionBlock)(void) = [operation.completionBlock copy]; + __weak __typeof(operation)weakOperation = operation; + operation.completionBlock = ^{ + __strong __typeof(weakOperation)strongOperation = weakOperation; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_queue_t queue = strongOperation.completionQueue ?: dispatch_get_main_queue(); +#pragma clang diagnostic pop + dispatch_group_async(group, queue, ^{ + if (originalCompletionBlock) { + originalCompletionBlock(); + } + + NSUInteger numberOfFinishedOperations = [[operations indexesOfObjectsPassingTest:^BOOL(id op, NSUInteger __unused idx, BOOL __unused *stop) { + return [op isFinished]; + }] count]; + + if (progressBlock) { + progressBlock(numberOfFinishedOperations, [operations count]); + } + + dispatch_group_leave(group); + }); + }; + + dispatch_group_enter(group); + [batchedOperation addDependency:operation]; + } + + return [operations arrayByAddingObject:batchedOperation]; +} + +#pragma mark - NSObject + +- (NSString *)description { + [self.lock lock]; + NSString *description = [NSString stringWithFormat:@"<%@: %p, state: %@, cancelled: %@ request: %@, response: %@>", NSStringFromClass([self class]), self, AFKeyPathFromOperationState(self.state), ([self isCancelled] ? @"YES" : @"NO"), self.request, self.response]; + [self.lock unlock]; + return description; +} + +#pragma mark - NSURLConnectionDelegate + +- (void)connection:(NSURLConnection *)connection +willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge +{ + if (self.authenticationChallenge) { + self.authenticationChallenge(connection, challenge); + return; + } + + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] cancelAuthenticationChallenge:challenge]; + } + } else { + if ([challenge previousFailureCount] == 0) { + if (self.credential) { + [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } +} + +- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection __unused *)connection { + return self.shouldUseCredentialStorage; +} + +- (NSURLRequest *)connection:(NSURLConnection *)connection + willSendRequest:(NSURLRequest *)request + redirectResponse:(NSURLResponse *)redirectResponse +{ + if (self.redirectResponse) { + return self.redirectResponse(connection, request, redirectResponse); + } else { + return request; + } +} + +- (void)connection:(NSURLConnection __unused *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten +totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite +{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.uploadProgress) { + self.uploadProgress((NSUInteger)bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } + }); +} + +- (void)connection:(NSURLConnection __unused *)connection +didReceiveResponse:(NSURLResponse *)response +{ + self.response = response; +} + +- (void)connection:(NSURLConnection __unused *)connection + didReceiveData:(NSData *)data +{ + NSUInteger length = [data length]; + while (YES) { + NSInteger totalNumberOfBytesWritten = 0; + if ([self.outputStream hasSpaceAvailable]) { + const uint8_t *dataBuffer = (uint8_t *)[data bytes]; + + NSInteger numberOfBytesWritten = 0; + while (totalNumberOfBytesWritten < (NSInteger)length) { + numberOfBytesWritten = [self.outputStream write:&dataBuffer[(NSUInteger)totalNumberOfBytesWritten] maxLength:(length - (NSUInteger)totalNumberOfBytesWritten)]; + if (numberOfBytesWritten == -1) { + break; + } + + totalNumberOfBytesWritten += numberOfBytesWritten; + } + + break; + } + + if (self.outputStream.streamError) { + [self.connection cancel]; + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:self.outputStream.streamError]; + return; + } + } + + dispatch_async(dispatch_get_main_queue(), ^{ + self.totalBytesRead += (long long)length; + + if (self.downloadProgress) { + self.downloadProgress(length, self.totalBytesRead, self.response.expectedContentLength); + } + }); +} + +- (void)connectionDidFinishLoading:(NSURLConnection __unused *)connection { + self.responseData = [self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; + + [self.outputStream close]; + if (self.responseData) { + self.outputStream = nil; + } + + self.connection = nil; + + [self finish]; +} + +- (void)connection:(NSURLConnection __unused *)connection + didFailWithError:(NSError *)error +{ + self.error = error; + + [self.outputStream close]; + if (self.responseData) { + self.outputStream = nil; + } + + self.connection = nil; + + [self finish]; +} + +- (NSCachedURLResponse *)connection:(NSURLConnection *)connection + willCacheResponse:(NSCachedURLResponse *)cachedResponse +{ + if (self.cacheResponse) { + return self.cacheResponse(connection, cachedResponse); + } else { + if ([self isCancelled]) { + return nil; + } + + return cachedResponse; + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURLRequest *request = [decoder decodeObjectOfClass:[NSURLRequest class] forKey:NSStringFromSelector(@selector(request))]; + + self = [self initWithRequest:request]; + if (!self) { + return nil; + } + + self.state = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(state))] integerValue]; + self.response = [decoder decodeObjectOfClass:[NSHTTPURLResponse class] forKey:NSStringFromSelector(@selector(response))]; + self.error = [decoder decodeObjectOfClass:[NSError class] forKey:NSStringFromSelector(@selector(error))]; + self.responseData = [decoder decodeObjectOfClass:[NSData class] forKey:NSStringFromSelector(@selector(responseData))]; + self.totalBytesRead = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(totalBytesRead))] longLongValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [self pause]; + + [coder encodeObject:self.request forKey:NSStringFromSelector(@selector(request))]; + + switch (self.state) { + case AFOperationExecutingState: + case AFOperationPausedState: + [coder encodeInteger:AFOperationReadyState forKey:NSStringFromSelector(@selector(state))]; + break; + default: + [coder encodeInteger:self.state forKey:NSStringFromSelector(@selector(state))]; + break; + } + + [coder encodeObject:self.response forKey:NSStringFromSelector(@selector(response))]; + [coder encodeObject:self.error forKey:NSStringFromSelector(@selector(error))]; + [coder encodeObject:self.responseData forKey:NSStringFromSelector(@selector(responseData))]; + [coder encodeInt64:self.totalBytesRead forKey:NSStringFromSelector(@selector(totalBytesRead))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFURLConnectionOperation *operation = [(AFURLConnectionOperation *)[[self class] allocWithZone:zone] initWithRequest:self.request]; + + operation.uploadProgress = self.uploadProgress; + operation.downloadProgress = self.downloadProgress; + operation.authenticationChallenge = self.authenticationChallenge; + operation.cacheResponse = self.cacheResponse; + operation.redirectResponse = self.redirectResponse; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h new file mode 100644 index 000000000..aed454981 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1,463 @@ +// AFSerialization.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +/** + The `AFURLRequestSerialization` protocol is adopted by an object that encodes parameters for a specified HTTP requests. Request serializers may encode parameters as query strings, HTTP bodies, setting the appropriate HTTP header fields as necessary. + + For example, a JSON request serializer may set the HTTP body of the request to a JSON representation, and set the `Content-Type` HTTP header field value to `application/json`. + */ +@protocol AFURLRequestSerialization + +/** + Returns a request with the specified parameters encoded into a copy of the original request. + + @param request The original request. + @param parameters The parameters to be encoded. + @param error The error that occurred while attempting to encode the request parameters. + + @return A serialized request. + */ +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError * __autoreleasing *)error; + +@end + +#pragma mark - + +/** + + */ +typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) { + AFHTTPRequestQueryStringDefaultStyle = 0, +}; + +@protocol AFMultipartFormData; + +/** + `AFHTTPRequestSerializer` conforms to the `AFURLRequestSerialization` & `AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation. + + Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPRequestSerializer` in order to ensure consistent default behavior. + */ +@interface AFHTTPRequestSerializer : NSObject + +/** + The string encoding used to serialize parameters. `NSUTF8StringEncoding` by default. + */ +@property (nonatomic, assign) NSStringEncoding stringEncoding; + +/** + Whether created requests can use the device’s cellular radio (if present). `YES` by default. + + @see NSMutableURLRequest -setAllowsCellularAccess: + */ +@property (nonatomic, assign) BOOL allowsCellularAccess; + +/** + The cache policy of created requests. `NSURLRequestUseProtocolCachePolicy` by default. + + @see NSMutableURLRequest -setCachePolicy: + */ +@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy; + +/** + Whether created requests should use the default cookie handling. `YES` by default. + + @see NSMutableURLRequest -setHTTPShouldHandleCookies: + */ +@property (nonatomic, assign) BOOL HTTPShouldHandleCookies; + +/** + Whether created requests can continue transmitting data before receiving a response from an earlier transmission. `NO` by default + + @see NSMutableURLRequest -setHTTPShouldUsePipelining: + */ +@property (nonatomic, assign) BOOL HTTPShouldUsePipelining; + +/** + The network service type for created requests. `NSURLNetworkServiceTypeDefault` by default. + + @see NSMutableURLRequest -setNetworkServiceType: + */ +@property (nonatomic, assign) NSURLRequestNetworkServiceType networkServiceType; + +/** + The timeout interval, in seconds, for created requests. The default timeout interval is 60 seconds. + + @see NSMutableURLRequest -setTimeoutInterval: + */ +@property (nonatomic, assign) NSTimeInterval timeoutInterval; + +///--------------------------------------- +/// @name Configuring HTTP Request Headers +///--------------------------------------- + +/** + Default HTTP header field values to be applied to serialized requests. + */ +@property (readonly, nonatomic, strong) NSDictionary *HTTPRequestHeaders; + +/** + Creates and returns a serializer with default configuration. + */ ++ (instancetype)serializer; + +/** + Sets the value for the HTTP headers set in request objects made by the HTTP client. If `nil`, removes the existing value for that header. + + @param field The HTTP header to set a default value for + @param value The value set as default for the specified header, or `nil` + */ +- (void)setValue:(NSString *)value +forHTTPHeaderField:(NSString *)field; + +/** + Returns the value for the HTTP headers set in the request serializer. + + @param field The HTTP header to retrieve the default value for + + @return The value set as default for the specified header, or `nil` + */ +- (NSString *)valueForHTTPHeaderField:(NSString *)field; + +/** + Sets the "Authorization" HTTP header set in request objects made by the HTTP client to a basic authentication value with Base64-encoded username and password. This overwrites any existing value for this header. + + @param username The HTTP basic auth username + @param password The HTTP basic auth password + */ +- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username + password:(NSString *)password; + +/** + @deprecated This method has been deprecated. Use -setValue:forHTTPHeaderField: instead. + */ +- (void)setAuthorizationHeaderFieldWithToken:(NSString *)token DEPRECATED_ATTRIBUTE; + + +/** + Clears any existing value for the "Authorization" HTTP header. + */ +- (void)clearAuthorizationHeader; + +///------------------------------------------------------- +/// @name Configuring Query String Parameter Serialization +///------------------------------------------------------- + +/** + HTTP methods for which serialized requests will encode parameters as a query string. `GET`, `HEAD`, and `DELETE` by default. + */ +@property (nonatomic, strong) NSSet *HTTPMethodsEncodingParametersInURI; + +/** + Set the method of query string serialization according to one of the pre-defined styles. + + @param style The serialization style. + + @see AFHTTPRequestQueryStringSerializationStyle + */ +- (void)setQueryStringSerializationWithStyle:(AFHTTPRequestQueryStringSerializationStyle)style; + +/** + Set the a custom method of query string serialization according to the specified block. + + @param block A block that defines a process of encoding parameters into a query string. This block returns the query string and takes three arguments: the request, the parameters to encode, and the error that occurred when attempting to encode parameters for the given request. + */ +- (void)setQueryStringSerializationWithBlock:(NSString * (^)(NSURLRequest *request, NSDictionary *parameters, NSError * __autoreleasing *error))block; + +///------------------------------- +/// @name Creating Request Objects +///------------------------------- + +/** + @deprecated This method has been deprecated. Use -requestWithMethod:URLString:parameters:error: instead. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters DEPRECATED_ATTRIBUTE; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and URL string. + + If the HTTP method is `GET`, `HEAD`, or `DELETE`, the parameters will be used to construct a url-encoded query string that is appended to the request's URL. Otherwise, the parameters will be encoded according to the value of the `parameterEncoding` property, and set as the request body. + + @param method The HTTP method for the request, such as `GET`, `POST`, `PUT`, or `DELETE`. This parameter must not be `nil`. + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be either set as a query string for `GET` requests, or the request HTTP body. + @param error The error that occured while constructing the request. + + @return An `NSMutableURLRequest` object. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + error:(NSError * __autoreleasing *)error; + +/** + @deprecated This method has been deprecated. Use -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error: instead. + */ +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block DEPRECATED_ATTRIBUTE; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and URLString, and constructs a `multipart/form-data` HTTP body, using the specified parameters and multipart form data block. See http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2 + + Multipart form requests are automatically streamed, reading files directly from disk along with in-memory data in a single HTTP body. The resulting `NSMutableURLRequest` object has an `HTTPBodyStream` property, so refrain from setting `HTTPBodyStream` or `HTTPBody` on this request object, as it will clear out the multipart form body stream. + + @param method The HTTP method for the request. This parameter must not be `GET` or `HEAD`, or `nil`. + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded and set in the request HTTP body. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param error The error that occured while constructing the request. + + @return An `NSMutableURLRequest` object + */ +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block + error:(NSError * __autoreleasing *)error; + +/** + Creates an `NSMutableURLRequest` by removing the `HTTPBodyStream` from a request, and asynchronously writing its contents into the specified file, invoking the completion handler when finished. + + @param request The multipart form request. + @param fileURL The file URL to write multipart form contents to. + @param handler A handler block to execute. + + @discussion There is a bug in `NSURLSessionTask` that causes requests to not send a `Content-Length` header when streaming contents from an HTTP body, which is notably problematic when interacting with the Amazon S3 webservice. As a workaround, this method takes a request constructed with `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:`, or any other request with an `HTTPBodyStream`, writes the contents to the specified file and returns a copy of the original request with the `HTTPBodyStream` property set to `nil`. From here, the file can either be passed to `AFURLSessionManager -uploadTaskWithRequest:fromFile:progress:completionHandler:`, or have its contents read into an `NSData` that's assigned to the `HTTPBody` property of the request. + + @see https://github.com/AFNetworking/AFNetworking/issues/1398 + */ +- (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request + writingStreamContentsToFile:(NSURL *)fileURL + completionHandler:(void (^)(NSError *error))handler; + +@end + +#pragma mark - + +/** + The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `AFHTTPRequestSerializer -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:`. + */ +@protocol AFMultipartFormData + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{generated filename}; name=#{name}"` and `Content-Type: #{generated mimeType}`, followed by the encoded file data and the multipart form boundary. + + The filename and MIME type for this data in the form will be automatically generated, using the last path component of the `fileURL` and system associated MIME type for the `fileURL` extension, respectively. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended, otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The file name to be used in the `Content-Disposition` header. This parameter must not be `nil`. + @param mimeType The declared MIME type of the file data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the data from the input stream and the multipart form boundary. + + @param inputStream The input stream to be appended to the form data + @param name The name to be associated with the specified input stream. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified input stream. This parameter must not be `nil`. + @param length The length of the specified input stream in bytes. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithInputStream:(NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(int64_t)length + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified data. This parameter must not be `nil`. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP headers `Content-Disposition: form-data; name=#{name}"`, followed by the encoded data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + */ + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name; + + +/** + Appends HTTP headers, followed by the encoded data and the multipart form boundary. + + @param headers The HTTP headers to be appended to the form data. + @param body The data to be encoded and appended to the form data. This parameter must not be `nil`. + */ +- (void)appendPartWithHeaders:(NSDictionary *)headers + body:(NSData *)body; + +/** + Throttles request bandwidth by limiting the packet size and adding a delay for each chunk read from the upload stream. + + When uploading over a 3G or EDGE connection, requests may fail with "request body stream exhausted". Setting a maximum packet size and delay according to the recommended values (`kAFUploadStream3GSuggestedPacketSize` and `kAFUploadStream3GSuggestedDelay`) lowers the risk of the input stream exceeding its allocated bandwidth. Unfortunately, there is no definite way to distinguish between a 3G, EDGE, or LTE connection over `NSURLConnection`. As such, it is not recommended that you throttle bandwidth based solely on network reachability. Instead, you should consider checking for the "request body stream exhausted" in a failure block, and then retrying the request with throttled bandwidth. + + @param numberOfBytes Maximum packet size, in number of bytes. The default packet size for an input stream is 16kb. + @param delay Duration of delay each time a packet is read. By default, no delay is set. + */ +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay; + +@end + +#pragma mark - + +/** + `AFJSONRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSJSONSerialization`, setting the `Content-Type` of the encoded request to `application/json`. + */ +@interface AFJSONRequestSerializer : AFHTTPRequestSerializer + +/** + Options for writing the request JSON data from Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONWritingOptions". `0` by default. + */ +@property (nonatomic, assign) NSJSONWritingOptions writingOptions; + +/** + Creates and returns a JSON serializer with specified reading and writing options. + + @param writingOptions The specified JSON writing options. + */ ++ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions; + +@end + +#pragma mark - + +/** + `AFPropertyListRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSPropertyListSerializer`, setting the `Content-Type` of the encoded request to `application/x-plist`. + */ +@interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer + +/** + The property list format. Possible values are described in "NSPropertyListFormat". + */ +@property (nonatomic, assign) NSPropertyListFormat format; + +/** + @warning The `writeOptions` property is currently unused. + */ +@property (nonatomic, assign) NSPropertyListWriteOptions writeOptions; + +/** + Creates and returns a property list serializer with a specified format, read options, and write options. + + @param format The property list format. + @param writeOptions The property list write options. + + @warning The `writeOptions` property is currently unused. + */ ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + writeOptions:(NSPropertyListWriteOptions)writeOptions; + +@end + +#pragma mark - + +///---------------- +/// @name Constants +///---------------- + +/** + ## Error Domains + + The following error domain is predefined. + + - `NSString * const AFURLRequestSerializationErrorDomain` + + ### Constants + + `AFURLRequestSerializationErrorDomain` + AFURLRequestSerializer errors. Error codes for `AFURLRequestSerializationErrorDomain` correspond to codes in `NSURLErrorDomain`. + */ +extern NSString * const AFURLRequestSerializationErrorDomain; + +/** + ## User info dictionary keys + + These keys may exist in the user info dictionary, in addition to those defined for NSError. + + - `NSString * const AFNetworkingOperationFailingURLRequestErrorKey` + + ### Constants + + `AFNetworkingOperationFailingURLRequestErrorKey` + The corresponding value is an `NSURLRequest` containing the request of the operation associated with an error. This key is only present in the `AFURLRequestSerializationErrorDomain`. + */ +extern NSString * const AFNetworkingOperationFailingURLRequestErrorKey; + +/** + ## Throttling Bandwidth for HTTP Request Input Streams + + @see -throttleBandwidthWithPacketSize:delay: + + ### Constants + + `kAFUploadStream3GSuggestedPacketSize` + Maximum packet size, in number of bytes. Equal to 16kb. + + `kAFUploadStream3GSuggestedDelay` + Duration of delay each time a packet is read. Equal to 0.2 seconds. + */ +extern NSUInteger const kAFUploadStream3GSuggestedPacketSize; +extern NSTimeInterval const kAFUploadStream3GSuggestedDelay; diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m new file mode 100644 index 000000000..a56e8542e --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m @@ -0,0 +1,1339 @@ +// AFSerialization.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLRequestSerialization.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +NSString * const AFURLRequestSerializationErrorDomain = @"com.alamofire.error.serialization.request"; +NSString * const AFNetworkingOperationFailingURLRequestErrorKey = @"com.alamofire.serialization.request.error.response"; + +typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error); + +static NSString * AFBase64EncodedStringFromString(NSString *string) { + NSData *data = [NSData dataWithBytes:[string UTF8String] length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; + NSUInteger length = [data length]; + NSMutableData *mutableData = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; + + uint8_t *input = (uint8_t *)[data bytes]; + uint8_t *output = (uint8_t *)[mutableData mutableBytes]; + + for (NSUInteger i = 0; i < length; i += 3) { + NSUInteger value = 0; + for (NSUInteger j = i; j < (i + 3); j++) { + value <<= 8; + if (j < length) { + value |= (0xFF & input[j]); + } + } + + static uint8_t const kAFBase64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + NSUInteger idx = (i / 3) * 4; + output[idx + 0] = kAFBase64EncodingTable[(value >> 18) & 0x3F]; + output[idx + 1] = kAFBase64EncodingTable[(value >> 12) & 0x3F]; + output[idx + 2] = (i + 1) < length ? kAFBase64EncodingTable[(value >> 6) & 0x3F] : '='; + output[idx + 3] = (i + 2) < length ? kAFBase64EncodingTable[(value >> 0) & 0x3F] : '='; + } + + return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding]; +} + +static NSString * const kAFCharactersToBeEscapedInQueryString = @":/?&=;+!@#$()',*"; + +static NSString * AFPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + static NSString * const kAFCharactersToLeaveUnescapedInQueryStringPairKey = @"[]."; + + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kAFCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +static NSString * AFPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +#pragma mark - + +@interface AFQueryStringPair : NSObject +@property (readwrite, nonatomic, strong) id field; +@property (readwrite, nonatomic, strong) id value; + +- (id)initWithField:(id)field value:(id)value; + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding; +@end + +@implementation AFQueryStringPair + +- (id)initWithField:(id)field value:(id)value { + self = [super init]; + if (!self) { + return nil; + } + + self.field = field; + self.value = value; + + return self; +} + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding { + if (!self.value || [self.value isEqual:[NSNull null]]) { + return AFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding); + } else { + return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding), AFPercentEscapedQueryStringValueFromStringWithEncoding([self.value description], stringEncoding)]; + } +} + +@end + +#pragma mark - + +extern NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary); +extern NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value); + +static NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) { + NSMutableArray *mutablePairs = [NSMutableArray array]; + for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) { + [mutablePairs addObject:[pair URLEncodedStringValueWithEncoding:stringEncoding]]; + } + + return [mutablePairs componentsJoinedByString:@"&"]; +} + +NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary) { + return AFQueryStringPairsFromKeyAndValue(nil, dictionary); +} + +NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) { + NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; + + NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)]; + + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = value; + // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries + for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + id nestedValue = [dictionary objectForKey:nestedKey]; + if (nestedValue) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = value; + for (id nestedValue in array) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; + } + } else if ([value isKindOfClass:[NSSet class]]) { + NSSet *set = value; + for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)]; + } + } else { + [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]]; + } + + return mutableQueryStringComponents; +} + +#pragma mark - + +@interface AFStreamingMultipartFormData : NSObject +- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding; + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData; +@end + +#pragma mark - + +static NSArray * AFHTTPRequestSerializerObservedKeyPaths() { + static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))]; + }); + + return _AFHTTPRequestSerializerObservedKeyPaths; +} + +static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext; + +@interface AFHTTPRequestSerializer () +@property (readwrite, nonatomic, strong) NSMutableSet *mutableObservedChangedKeyPaths; +@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders; +@property (readwrite, nonatomic, assign) AFHTTPRequestQueryStringSerializationStyle queryStringSerializationStyle; +@property (readwrite, nonatomic, copy) AFQueryStringSerializationBlock queryStringSerialization; +@end + +@implementation AFHTTPRequestSerializer + ++ (instancetype)serializer { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = NSUTF8StringEncoding; + + self.mutableHTTPRequestHeaders = [NSMutableDictionary dictionary]; + + // Accept-Language HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 + NSMutableArray *acceptLanguagesComponents = [NSMutableArray array]; + [[NSLocale preferredLanguages] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + float q = 1.0f - (idx * 0.1f); + [acceptLanguagesComponents addObject:[NSString stringWithFormat:@"%@;q=%0.1g", obj, q]]; + *stop = q <= 0.5f; + }]; + [self setValue:[acceptLanguagesComponents componentsJoinedByString:@", "] forHTTPHeaderField:@"Accept-Language"]; + + NSString *userAgent = nil; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], [[UIScreen mainScreen] scale]]; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + userAgent = [NSString stringWithFormat:@"%@/%@ (Mac OS X %@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[NSProcessInfo processInfo] operatingSystemVersionString]]; +#endif +#pragma clang diagnostic pop + if (userAgent) { + if (![userAgent canBeConvertedToEncoding:NSASCIIStringEncoding]) { + NSMutableString *mutableUserAgent = [userAgent mutableCopy]; + if (CFStringTransform((__bridge CFMutableStringRef)(mutableUserAgent), NULL, (__bridge CFStringRef)@"Any-Latin; Latin-ASCII; [:^ASCII:] Remove", false)) { + userAgent = mutableUserAgent; + } + } + [self setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + } + + // HTTP Method Definitions; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil]; + + self.mutableObservedChangedKeyPaths = [NSMutableSet set]; + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext]; + } + } + + return self; +} + +- (void)dealloc { + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self removeObserver:self forKeyPath:keyPath context:AFHTTPRequestSerializerObserverContext]; + } + } +} + +#pragma mark - + +- (NSDictionary *)HTTPRequestHeaders { + return [NSDictionary dictionaryWithDictionary:self.mutableHTTPRequestHeaders]; +} + +- (void)setValue:(NSString *)value +forHTTPHeaderField:(NSString *)field +{ + [self.mutableHTTPRequestHeaders setValue:value forKey:field]; +} + +- (NSString *)valueForHTTPHeaderField:(NSString *)field { + return [self.mutableHTTPRequestHeaders valueForKey:field]; +} + +- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username + password:(NSString *)password +{ + NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", username, password]; + [self setValue:[NSString stringWithFormat:@"Basic %@", AFBase64EncodedStringFromString(basicAuthCredentials)] forHTTPHeaderField:@"Authorization"]; +} + +- (void)setAuthorizationHeaderFieldWithToken:(NSString *)token { + [self setValue:[NSString stringWithFormat:@"Token token=\"%@\"", token] forHTTPHeaderField:@"Authorization"]; +} + +- (void)clearAuthorizationHeader { + [self.mutableHTTPRequestHeaders removeObjectForKey:@"Authorization"]; +} + +#pragma mark - + +- (void)setQueryStringSerializationWithStyle:(AFHTTPRequestQueryStringSerializationStyle)style { + self.queryStringSerializationStyle = style; + self.queryStringSerialization = nil; +} + +- (void)setQueryStringSerializationWithBlock:(NSString *(^)(NSURLRequest *, NSDictionary *, NSError *__autoreleasing *))block { + self.queryStringSerialization = block; +} + +#pragma mark - + +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters +{ + return [self requestWithMethod:method URLString:URLString parameters:parameters error:nil]; +} + +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(method); + NSParameterAssert(URLString); + + NSURL *url = [NSURL URLWithString:URLString]; + + NSParameterAssert(url); + + NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url]; + mutableRequest.HTTPMethod = method; + + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) { + [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath]; + } + } + + mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy]; + + return mutableRequest; +} + +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block +{ + return [self multipartFormRequestWithMethod:method URLString:URLString parameters:parameters constructingBodyWithBlock:block error:nil]; +} + +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(method); + NSParameterAssert(![method isEqualToString:@"GET"] && ![method isEqualToString:@"HEAD"]); + + NSMutableURLRequest *mutableRequest = [self requestWithMethod:method URLString:URLString parameters:nil error:error]; + + __block AFStreamingMultipartFormData *formData = [[AFStreamingMultipartFormData alloc] initWithURLRequest:mutableRequest stringEncoding:NSUTF8StringEncoding]; + + if (parameters) { + for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) { + NSData *data = nil; + if ([pair.value isKindOfClass:[NSData class]]) { + data = pair.value; + } else if ([pair.value isEqual:[NSNull null]]) { + data = [NSData data]; + } else { + data = [[pair.value description] dataUsingEncoding:self.stringEncoding]; + } + + if (data) { + [formData appendPartWithFormData:data name:[pair.field description]]; + } + } + } + + if (block) { + block(formData); + } + + return [formData requestByFinalizingMultipartFormData]; +} + +- (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request + writingStreamContentsToFile:(NSURL *)fileURL + completionHandler:(void (^)(NSError *error))handler +{ + if (!request.HTTPBodyStream) { + return [request mutableCopy]; + } + + NSParameterAssert([fileURL isFileURL]); + + NSInputStream *inputStream = request.HTTPBodyStream; + NSOutputStream *outputStream = [[NSOutputStream alloc] initWithURL:fileURL append:NO]; + __block NSError *error = nil; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + + [inputStream open]; + [outputStream open]; + + while ([inputStream hasBytesAvailable] && [outputStream hasSpaceAvailable]) { + uint8_t buffer[1024]; + + NSInteger bytesRead = [inputStream read:buffer maxLength:1024]; + if (inputStream.streamError || bytesRead < 0) { + error = inputStream.streamError; + break; + } + + NSInteger bytesWritten = [outputStream write:buffer maxLength:(NSUInteger)bytesRead]; + if (outputStream.streamError || bytesWritten < 0) { + error = outputStream.streamError; + break; + } + + if (bytesRead == 0 && bytesWritten == 0) { + break; + } + } + + [outputStream close]; + [inputStream close]; + + if (handler) { + dispatch_async(dispatch_get_main_queue(), ^{ + handler(error); + }); + } + }); + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + mutableRequest.HTTPBodyStream = nil; + + return mutableRequest; +} + +#pragma mark - AFURLRequestSerialization + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + NSString *query = nil; + if (self.queryStringSerialization) { + NSError *serializationError; + query = self.queryStringSerialization(request, parameters, &serializationError); + + if (serializationError) { + if (error) { + *error = serializationError; + } + + return nil; + } + } else { + switch (self.queryStringSerializationStyle) { + case AFHTTPRequestQueryStringDefaultStyle: + query = AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding); + break; + } + } + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]]; + } else { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; + } + [mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]]; + } + } + + return mutableRequest; +} + +#pragma mark - NSKeyValueObserving + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(__unused id)object + change:(NSDictionary *)change + context:(void *)context +{ + if (context == AFHTTPRequestSerializerObserverContext) { + if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { + [self.mutableObservedChangedKeyPaths removeObject:keyPath]; + } else { + [self.mutableObservedChangedKeyPaths addObject:keyPath]; + } + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self init]; + if (!self) { + return nil; + } + + self.mutableHTTPRequestHeaders = [[decoder decodeObjectOfClass:[NSDictionary class] forKey:NSStringFromSelector(@selector(mutableHTTPRequestHeaders))] mutableCopy]; + self.queryStringSerializationStyle = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.mutableHTTPRequestHeaders forKey:NSStringFromSelector(@selector(mutableHTTPRequestHeaders))]; + [coder encodeInteger:self.queryStringSerializationStyle forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.mutableHTTPRequestHeaders = [self.mutableHTTPRequestHeaders mutableCopyWithZone:zone]; + serializer.queryStringSerializationStyle = self.queryStringSerializationStyle; + serializer.queryStringSerialization = self.queryStringSerialization; + + return serializer; +} + +@end + +#pragma mark - + +static NSString * AFCreateMultipartFormBoundary() { + return [NSString stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()]; +} + +static NSString * const kAFMultipartFormCRLF = @"\r\n"; + +static inline NSString * AFMultipartFormInitialBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"--%@%@", boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormEncapsulationBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@%@", kAFMultipartFormCRLF, boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormFinalBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@--%@", kAFMultipartFormCRLF, boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFContentTypeForPathExtension(NSString *extension) { +#ifdef __UTTYPE__ + NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL); + NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType); + if (!contentType) { + return @"application/octet-stream"; + } else { + return contentType; + } +#else +#pragma unused (extension) + return @"application/octet-stream"; +#endif +} + +NSUInteger const kAFUploadStream3GSuggestedPacketSize = 1024 * 16; +NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2; + +@interface AFHTTPBodyPart : NSObject +@property (nonatomic, assign) NSStringEncoding stringEncoding; +@property (nonatomic, strong) NSDictionary *headers; +@property (nonatomic, copy) NSString *boundary; +@property (nonatomic, strong) id body; +@property (nonatomic, assign) unsigned long long bodyContentLength; +@property (nonatomic, strong) NSInputStream *inputStream; + +@property (nonatomic, assign) BOOL hasInitialBoundary; +@property (nonatomic, assign) BOOL hasFinalBoundary; + +@property (readonly, nonatomic, assign, getter = hasBytesAvailable) BOOL bytesAvailable; +@property (readonly, nonatomic, assign) unsigned long long contentLength; + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@interface AFMultipartBodyStream : NSInputStream +@property (nonatomic, assign) NSUInteger numberOfBytesInPacket; +@property (nonatomic, assign) NSTimeInterval delay; +@property (nonatomic, strong) NSInputStream *inputStream; +@property (readonly, nonatomic, assign) unsigned long long contentLength; +@property (readonly, nonatomic, assign, getter = isEmpty) BOOL empty; + +- (id)initWithStringEncoding:(NSStringEncoding)encoding; +- (void)setInitialAndFinalBoundaries; +- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart; +@end + +#pragma mark - + +@interface AFStreamingMultipartFormData () +@property (readwrite, nonatomic, copy) NSMutableURLRequest *request; +@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding; +@property (readwrite, nonatomic, copy) NSString *boundary; +@property (readwrite, nonatomic, strong) AFMultipartBodyStream *bodyStream; +@end + +@implementation AFStreamingMultipartFormData + +- (id)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding +{ + self = [super init]; + if (!self) { + return nil; + } + + self.request = urlRequest; + self.stringEncoding = encoding; + self.boundary = AFCreateMultipartFormBoundary(); + self.bodyStream = [[AFMultipartBodyStream alloc] initWithStringEncoding:encoding]; + + return self; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + + NSString *fileName = [fileURL lastPathComponent]; + NSString *mimeType = AFContentTypeForPathExtension([fileURL pathExtension]); + + return [self appendPartWithFileURL:fileURL name:name fileName:fileName mimeType:mimeType error:error]; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + if (![fileURL isFileURL]) { + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"Expected URL to be a file URL", @"AFNetworking", nil)}; + if (error) { + *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } else if ([fileURL checkResourceIsReachableAndReturnError:error] == NO) { + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"File URL not reachable.", @"AFNetworking", nil)}; + if (error) { + *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } + + NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL path] error:error]; + if (!fileAttributes) { + return NO; + } + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = fileURL; + bodyPart.bodyContentLength = [[fileAttributes objectForKey:NSFileSize] unsignedLongLongValue]; + [self.bodyStream appendHTTPBodyPart:bodyPart]; + + return YES; +} + +- (void)appendPartWithInputStream:(NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(int64_t)length + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = inputStream; + + bodyPart.bodyContentLength = (unsigned long long)length; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name +{ + NSParameterAssert(name); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"", name] forKey:@"Content-Disposition"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithHeaders:(NSDictionary *)headers + body:(NSData *)body +{ + NSParameterAssert(body); + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = headers; + bodyPart.boundary = self.boundary; + bodyPart.bodyContentLength = [body length]; + bodyPart.body = body; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay +{ + self.bodyStream.numberOfBytesInPacket = numberOfBytes; + self.bodyStream.delay = delay; +} + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData { + if ([self.bodyStream isEmpty]) { + return self.request; + } + + // Reset the initial and final boundaries to ensure correct Content-Length + [self.bodyStream setInitialAndFinalBoundaries]; + [self.request setHTTPBodyStream:self.bodyStream]; + + [self.request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", self.boundary] forHTTPHeaderField:@"Content-Type"]; + [self.request setValue:[NSString stringWithFormat:@"%llu", [self.bodyStream contentLength]] forHTTPHeaderField:@"Content-Length"]; + + return self.request; +} + +@end + +#pragma mark - + +@interface NSStream () +@property (readwrite) NSStreamStatus streamStatus; +@property (readwrite, copy) NSError *streamError; +@end + +@interface AFMultipartBodyStream () +@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding; +@property (readwrite, nonatomic, strong) NSMutableArray *HTTPBodyParts; +@property (readwrite, nonatomic, strong) NSEnumerator *HTTPBodyPartEnumerator; +@property (readwrite, nonatomic, strong) AFHTTPBodyPart *currentHTTPBodyPart; +@property (readwrite, nonatomic, strong) NSOutputStream *outputStream; +@property (readwrite, nonatomic, strong) NSMutableData *buffer; +@end + +@implementation AFMultipartBodyStream +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wimplicit-atomic-properties" +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1100) +@synthesize delegate; +#endif +@synthesize streamStatus; +@synthesize streamError; +#pragma clang diagnostic pop + +- (id)initWithStringEncoding:(NSStringEncoding)encoding { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = encoding; + self.HTTPBodyParts = [NSMutableArray array]; + self.numberOfBytesInPacket = NSIntegerMax; + + return self; +} + +- (void)setInitialAndFinalBoundaries { + if ([self.HTTPBodyParts count] > 0) { + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + bodyPart.hasInitialBoundary = NO; + bodyPart.hasFinalBoundary = NO; + } + + [[self.HTTPBodyParts objectAtIndex:0] setHasInitialBoundary:YES]; + [[self.HTTPBodyParts lastObject] setHasFinalBoundary:YES]; + } +} + +- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart { + [self.HTTPBodyParts addObject:bodyPart]; +} + +- (BOOL)isEmpty { + return [self.HTTPBodyParts count] == 0; +} + +#pragma mark - NSInputStream + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + if ([self streamStatus] == NSStreamStatusClosed) { + return 0; + } + + NSInteger totalNumberOfBytesRead = 0; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + while ((NSUInteger)totalNumberOfBytesRead < MIN(length, self.numberOfBytesInPacket)) { + if (!self.currentHTTPBodyPart || ![self.currentHTTPBodyPart hasBytesAvailable]) { + if (!(self.currentHTTPBodyPart = [self.HTTPBodyPartEnumerator nextObject])) { + break; + } + } else { + NSUInteger maxLength = length - (NSUInteger)totalNumberOfBytesRead; + NSInteger numberOfBytesRead = [self.currentHTTPBodyPart read:&buffer[totalNumberOfBytesRead] maxLength:maxLength]; + if (numberOfBytesRead == -1) { + self.streamError = self.currentHTTPBodyPart.inputStream.streamError; + break; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if (self.delay > 0.0f) { + [NSThread sleepForTimeInterval:self.delay]; + } + } + } + } +#pragma clang diagnostic pop + + return totalNumberOfBytesRead; +} + +- (BOOL)getBuffer:(__unused uint8_t **)buffer + length:(__unused NSUInteger *)len +{ + return NO; +} + +- (BOOL)hasBytesAvailable { + return [self streamStatus] == NSStreamStatusOpen; +} + +#pragma mark - NSStream + +- (void)open { + if (self.streamStatus == NSStreamStatusOpen) { + return; + } + + self.streamStatus = NSStreamStatusOpen; + + [self setInitialAndFinalBoundaries]; + self.HTTPBodyPartEnumerator = [self.HTTPBodyParts objectEnumerator]; +} + +- (void)close { + self.streamStatus = NSStreamStatusClosed; +} + +- (id)propertyForKey:(__unused NSString *)key { + return nil; +} + +- (BOOL)setProperty:(__unused id)property + forKey:(__unused NSString *)key +{ + return NO; +} + +- (void)scheduleInRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (void)removeFromRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + length += [bodyPart contentLength]; + } + + return length; +} + +#pragma mark - Undocumented CFReadStream Bridged Methods + +- (void)_scheduleInCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (void)_unscheduleFromCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (BOOL)_setCFClientFlags:(__unused CFOptionFlags)inFlags + callback:(__unused CFReadStreamClientCallBack)inCallback + context:(__unused CFStreamClientContext *)inContext { + return NO; +} + +#pragma mark - NSCopying + +-(id)copyWithZone:(NSZone *)zone { + AFMultipartBodyStream *bodyStreamCopy = [[[self class] allocWithZone:zone] initWithStringEncoding:self.stringEncoding]; + + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + [bodyStreamCopy appendHTTPBodyPart:[bodyPart copy]]; + } + + [bodyStreamCopy setInitialAndFinalBoundaries]; + + return bodyStreamCopy; +} + +@end + +#pragma mark - + +typedef enum { + AFEncapsulationBoundaryPhase = 1, + AFHeaderPhase = 2, + AFBodyPhase = 3, + AFFinalBoundaryPhase = 4, +} AFHTTPBodyPartReadPhase; + +@interface AFHTTPBodyPart () { + AFHTTPBodyPartReadPhase _phase; + NSInputStream *_inputStream; + unsigned long long _phaseReadOffset; +} + +- (BOOL)transitionToNextPhase; +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@implementation AFHTTPBodyPart + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [self transitionToNextPhase]; + + return self; +} + +- (void)dealloc { + if (_inputStream) { + [_inputStream close]; + _inputStream = nil; + } +} + +- (NSInputStream *)inputStream { + if (!_inputStream) { + if ([self.body isKindOfClass:[NSData class]]) { + _inputStream = [NSInputStream inputStreamWithData:self.body]; + } else if ([self.body isKindOfClass:[NSURL class]]) { + _inputStream = [NSInputStream inputStreamWithURL:self.body]; + } else if ([self.body isKindOfClass:[NSInputStream class]]) { + _inputStream = self.body; + } else { + _inputStream = [NSInputStream inputStreamWithData:[NSData data]]; + } + } + + return _inputStream; +} + +- (NSString *)stringForHeaders { + NSMutableString *headerString = [NSMutableString string]; + for (NSString *field in [self.headers allKeys]) { + [headerString appendString:[NSString stringWithFormat:@"%@: %@%@", field, [self.headers valueForKey:field], kAFMultipartFormCRLF]]; + } + [headerString appendString:kAFMultipartFormCRLF]; + + return [NSString stringWithString:headerString]; +} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + length += [encapsulationBoundaryData length]; + + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + length += [headersData length]; + + length += _bodyContentLength; + + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + length += [closingBoundaryData length]; + + return length; +} + +- (BOOL)hasBytesAvailable { + // Allows `read:maxLength:` to be called again if `AFMultipartFormFinalBoundary` doesn't fit into the available buffer + if (_phase == AFFinalBoundaryPhase) { + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (self.inputStream.streamStatus) { + case NSStreamStatusNotOpen: + case NSStreamStatusOpening: + case NSStreamStatusOpen: + case NSStreamStatusReading: + case NSStreamStatusWriting: + return YES; + case NSStreamStatusAtEnd: + case NSStreamStatusClosed: + case NSStreamStatusError: + default: + return NO; + } +#pragma clang diagnostic pop +} + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + NSInteger totalNumberOfBytesRead = 0; + + if (_phase == AFEncapsulationBoundaryPhase) { + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:encapsulationBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFHeaderPhase) { + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:headersData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFBodyPhase) { + NSInteger numberOfBytesRead = 0; + + numberOfBytesRead = [self.inputStream read:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + if (numberOfBytesRead == -1) { + return -1; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if ([self.inputStream streamStatus] >= NSStreamStatusAtEnd) { + [self transitionToNextPhase]; + } + } + } + + if (_phase == AFFinalBoundaryPhase) { + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + totalNumberOfBytesRead += [self readData:closingBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + return totalNumberOfBytesRead; +} + +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + NSRange range = NSMakeRange((NSUInteger)_phaseReadOffset, MIN([data length] - ((NSUInteger)_phaseReadOffset), length)); + [data getBytes:buffer range:range]; +#pragma clang diagnostic pop + + _phaseReadOffset += range.length; + + if (((NSUInteger)_phaseReadOffset) >= [data length]) { + [self transitionToNextPhase]; + } + + return (NSInteger)range.length; +} + +- (BOOL)transitionToNextPhase { + if (![[NSThread currentThread] isMainThread]) { + dispatch_sync(dispatch_get_main_queue(), ^{ + [self transitionToNextPhase]; + }); + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (_phase) { + case AFEncapsulationBoundaryPhase: + _phase = AFHeaderPhase; + break; + case AFHeaderPhase: + [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; + [self.inputStream open]; + _phase = AFBodyPhase; + break; + case AFBodyPhase: + [self.inputStream close]; + _phase = AFFinalBoundaryPhase; + break; + case AFFinalBoundaryPhase: + default: + _phase = AFEncapsulationBoundaryPhase; + break; + } + _phaseReadOffset = 0; +#pragma clang diagnostic pop + + return YES; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init]; + + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = self.headers; + bodyPart.bodyContentLength = self.bodyContentLength; + bodyPart.body = self.body; + bodyPart.boundary = self.boundary; + + return bodyPart; +} + +@end + +#pragma mark - + +@implementation AFJSONRequestSerializer + ++ (instancetype)serializer { + return [self serializerWithWritingOptions:(NSJSONWritingOptions)0]; +} + ++ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions +{ + AFJSONRequestSerializer *serializer = [[self alloc] init]; + serializer.writingOptions = writingOptions; + + return serializer; +} + +#pragma mark - AFURLRequestSerialization + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + return [super requestBySerializingRequest:request withParameters:parameters error:error]; + } + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + } + + [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]]; + } + + return mutableRequest; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.writingOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(writingOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeInteger:self.writingOptions forKey:NSStringFromSelector(@selector(writingOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFJSONRequestSerializer *serializer = [super copyWithZone:zone]; + serializer.writingOptions = self.writingOptions; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFPropertyListRequestSerializer + ++ (instancetype)serializer { + return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 writeOptions:0]; +} + ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + writeOptions:(NSPropertyListWriteOptions)writeOptions +{ + AFPropertyListRequestSerializer *serializer = [[self alloc] init]; + serializer.format = format; + serializer.writeOptions = writeOptions; + + return serializer; +} + +#pragma mark - AFURLRequestSerializer + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + return [super requestBySerializingRequest:request withParameters:parameters error:error]; + } + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/x-plist" forHTTPHeaderField:@"Content-Type"]; + } + + [mutableRequest setHTTPBody:[NSPropertyListSerialization dataWithPropertyList:parameters format:self.format options:self.writeOptions error:error]]; + } + + return mutableRequest; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.format = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(format))] unsignedIntegerValue]; + self.writeOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(writeOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeInteger:self.format forKey:NSStringFromSelector(@selector(format))]; + [coder encodeObject:@(self.writeOptions) forKey:NSStringFromSelector(@selector(writeOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFPropertyListRequestSerializer *serializer = [super copyWithZone:zone]; + serializer.format = self.format; + serializer.writeOptions = self.writeOptions; + + return serializer; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h new file mode 100644 index 000000000..030e8faed --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1,310 @@ +// AFSerialization.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +/** + The `AFURLResponseSerialization` protocol is adopted by an object that decodes data into a more useful object representation, according to details in the server response. Response serializers may additionally perform validation on the incoming response and data. + + For example, a JSON response serializer may check for an acceptable status code (`2XX` range) and content type (`application/json`), decoding a valid JSON response into an object. + */ +@protocol AFURLResponseSerialization + +/** + The response object decoded from the data associated with a specified response. + + @param response The response to be processed. + @param data The response data to be decoded. + @param error The error that occurred while attempting to decode the response data. + + @return The object decoded from the specified response data. + */ +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error; + +@end + +#pragma mark - + +/** + `AFHTTPResponseSerializer` conforms to the `AFURLRequestSerialization` & `AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation. + + Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPResponseSerializer` in order to ensure consistent default behavior. + */ +@interface AFHTTPResponseSerializer : NSObject + +- (instancetype) init; + +/** + The string encoding used to serialize parameters. + */ +@property (nonatomic, assign) NSStringEncoding stringEncoding; + +/** + Creates and returns a serializer with default configuration. + */ ++ (instancetype)serializer; + +///----------------------------------------- +/// @name Configuring Response Serialization +///----------------------------------------- + +/** + The acceptable HTTP status codes for responses. When non-`nil`, responses with status codes not contained by the set will result in an error during validation. + + See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + */ +@property (nonatomic, copy) NSIndexSet *acceptableStatusCodes; + +/** + The acceptable MIME types for responses. When non-`nil`, responses with a `Content-Type` with MIME types that do not intersect with the set will result in an error during validation. + */ +@property (nonatomic, copy) NSSet *acceptableContentTypes; + +/** + Validates the specified response and data. + + In its base implementation, this method checks for an acceptable status code and content type. Subclasses may wish to add other domain-specific checks. + + @param response The response to be validated. + @param data The data associated with the response. + @param error The error that occurred while attempting to validate the response. + + @return `YES` if the response is valid, otherwise `NO`. + */ +- (BOOL)validateResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error; + +@end + +#pragma mark - + + +/** + `AFJSONResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes JSON responses. + + By default, `AFJSONResponseSerializer` accepts the following MIME types, which includes the official standard, `application/json`, as well as other commonly-used types: + + - `application/json` + - `text/json` + - `text/javascript` + */ +@interface AFJSONResponseSerializer : AFHTTPResponseSerializer + +- (instancetype) init; + +/** + Options for reading the response JSON data and creating the Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. + */ +@property (nonatomic, assign) NSJSONReadingOptions readingOptions; + +/** + Whether to remove keys with `NSNull` values from response JSON. Defaults to `NO`. + */ +@property (nonatomic, assign) BOOL removesKeysWithNullValues; + +/** + Creates and returns a JSON serializer with specified reading and writing options. + + @param readingOptions The specified JSON reading options. + */ ++ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions; + +@end + +#pragma mark - + +/** + `AFXMLParserResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLParser` objects. + + By default, `AFXMLParserResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + + - `application/xml` + - `text/xml` + */ +@interface AFXMLParserResponseSerializer : AFHTTPResponseSerializer + +@end + +#pragma mark - + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + +/** + `AFXMLDocumentResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + + By default, `AFXMLDocumentResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + + - `application/xml` + - `text/xml` + */ +@interface AFXMLDocumentResponseSerializer : AFHTTPResponseSerializer + +- (instancetype) init; + +/** + Input and output options specifically intended for `NSXMLDocument` objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. + */ +@property (nonatomic, assign) NSUInteger options; + +/** + Creates and returns an XML document serializer with the specified options. + + @param mask The XML document options. + */ ++ (instancetype)serializerWithXMLDocumentOptions:(NSUInteger)mask; + +@end + +#endif + +#pragma mark - + +/** + `AFPropertyListResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + + By default, `AFPropertyListResponseSerializer` accepts the following MIME types: + + - `application/x-plist` + */ +@interface AFPropertyListResponseSerializer : AFHTTPResponseSerializer + +- (instancetype) init; + +/** + The property list format. Possible values are described in "NSPropertyListFormat". + */ +@property (nonatomic, assign) NSPropertyListFormat format; + +/** + The property list reading options. Possible values are described in "NSPropertyListMutabilityOptions." + */ +@property (nonatomic, assign) NSPropertyListReadOptions readOptions; + +/** + Creates and returns a property list serializer with a specified format, read options, and write options. + + @param format The property list format. + @param readOptions The property list reading options. + */ ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + readOptions:(NSPropertyListReadOptions)readOptions; + +@end + +#pragma mark - + +/** + `AFImageResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes image responses. + + By default, `AFImageResponseSerializer` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage: + + - `image/tiff` + - `image/jpeg` + - `image/gif` + - `image/png` + - `image/ico` + - `image/x-icon` + - `image/bmp` + - `image/x-bmp` + - `image/x-xbitmap` + - `image/x-win-bitmap` + */ +@interface AFImageResponseSerializer : AFHTTPResponseSerializer + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +/** + The scale factor used when interpreting the image data to construct `responseImage`. Specifying a scale factor of 1.0 results in an image whose size matches the pixel-based dimensions of the image. Applying a different scale factor changes the size of the image as reported by the size property. This is set to the value of scale of the main screen by default, which automatically scales images for retina displays, for instance. + */ +@property (nonatomic, assign) CGFloat imageScale; + +/** + Whether to automatically inflate response image data for compressed formats (such as PNG or JPEG). Enabling this can significantly improve drawing performance on iOS when used with `setCompletionBlockWithSuccess:failure:`, as it allows a bitmap representation to be constructed in the background rather than on the main thread. `YES` by default. + */ +@property (nonatomic, assign) BOOL automaticallyInflatesResponseImage; +#endif + +@end + +#pragma mark - + +/** + `AFCompoundSerializer` is a subclass of `AFHTTPResponseSerializer` that delegates the response serialization to the first `AFHTTPResponseSerializer` object that returns an object for `responseObjectForResponse:data:error:`, falling back on the default behavior of `AFHTTPResponseSerializer`. This is useful for supporting multiple potential types and structures of server responses with a single serializer. + */ +@interface AFCompoundResponseSerializer : AFHTTPResponseSerializer + +/** + The component response serializers. + */ +@property (readonly, nonatomic, copy) NSArray *responseSerializers; + +/** + Creates and returns a compound serializer comprised of the specified response serializers. + + @warning Each response serializer specified must be a subclass of `AFHTTPResponseSerializer`, and response to `-validateResponse:data:error:`. + */ ++ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## Error Domains + + The following error domain is predefined. + + - `NSString * const AFURLResponseSerializationErrorDomain` + + ### Constants + + `AFURLResponseSerializationErrorDomain` + AFURLResponseSerializer errors. Error codes for `AFURLResponseSerializationErrorDomain` correspond to codes in `NSURLErrorDomain`. + */ +extern NSString * const AFURLResponseSerializationErrorDomain; + +/** + ## User info dictionary keys + + These keys may exist in the user info dictionary, in addition to those defined for NSError. + + - `NSString * const AFNetworkingOperationFailingURLResponseErrorKey` + - `NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey` + + ### Constants + + `AFNetworkingOperationFailingURLResponseErrorKey` + The corresponding value is an `NSURLResponse` containing the response of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. + + `AFNetworkingOperationFailingURLResponseDataErrorKey` + The corresponding value is an `NSData` containing the original data of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. + */ +extern NSString * const AFNetworkingOperationFailingURLResponseErrorKey; + +extern NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey; + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m new file mode 100644 index 000000000..083d30c26 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m @@ -0,0 +1,793 @@ +// AFSerialization.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLResponseSerialization.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +#import +#endif + +NSString * const AFURLResponseSerializationErrorDomain = @"com.alamofire.error.serialization.response"; +NSString * const AFNetworkingOperationFailingURLResponseErrorKey = @"com.alamofire.serialization.response.error.response"; +NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey = @"com.alamofire.serialization.response.error.data"; + +static NSError * AFErrorWithUnderlyingError(NSError *error, NSError *underlyingError) { + if (!error) { + return underlyingError; + } + + if (!underlyingError || error.userInfo[NSUnderlyingErrorKey]) { + return error; + } + + NSMutableDictionary *mutableUserInfo = [error.userInfo mutableCopy]; + mutableUserInfo[NSUnderlyingErrorKey] = underlyingError; + + return [[NSError alloc] initWithDomain:error.domain code:error.code userInfo:mutableUserInfo]; +} + +static BOOL AFErrorOrUnderlyingErrorHasCodeInDomain(NSError *error, NSInteger code, NSString *domain) { + if ([error.domain isEqualToString:domain] && error.code == code) { + return YES; + } else if (error.userInfo[NSUnderlyingErrorKey]) { + return AFErrorOrUnderlyingErrorHasCodeInDomain(error.userInfo[NSUnderlyingErrorKey], code, domain); + } + + return NO; +} + +static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) { + if ([JSONObject isKindOfClass:[NSArray class]]) { + NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]]; + for (id value in (NSArray *)JSONObject) { + [mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)]; + } + + return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray]; + } else if ([JSONObject isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject]; + for (id key in [(NSDictionary *)JSONObject allKeys]) { + id value = [(NSDictionary *)JSONObject objectForKey:key]; + if (!value || [value isEqual:[NSNull null]]) { + [mutableDictionary removeObjectForKey:key]; + } else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) { + [mutableDictionary setObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions) forKey:key]; + } + } + + return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary]; + } + + return JSONObject; +} + +@implementation AFHTTPResponseSerializer + ++ (instancetype)serializer { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = NSUTF8StringEncoding; + + self.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)]; + self.acceptableContentTypes = nil; + + return self; +} + +#pragma mark - + +- (BOOL)validateResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError * __autoreleasing *)error +{ + BOOL responseIsValid = YES; + NSError *validationError = nil; + + if (response && [response isKindOfClass:[NSHTTPURLResponse class]]) { + if (self.acceptableContentTypes && ![self.acceptableContentTypes containsObject:[response MIMEType]]) { + if ([data length] > 0 && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: unacceptable content-type: %@", @"AFNetworking", nil), [response MIMEType]], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } + + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:mutableUserInfo], validationError); + } + + responseIsValid = NO; + } + + if (self.acceptableStatusCodes && ![self.acceptableStatusCodes containsIndex:(NSUInteger)response.statusCode] && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } + + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorBadServerResponse userInfo:mutableUserInfo], validationError); + + responseIsValid = NO; + } + } + + if (error && !responseIsValid) { + *error = validationError; + } + + return responseIsValid; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + [self validateResponse:(NSHTTPURLResponse *)response data:data error:error]; + + return data; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self init]; + if (!self) { + return nil; + } + + self.acceptableStatusCodes = [decoder decodeObjectOfClass:[NSIndexSet class] forKey:NSStringFromSelector(@selector(acceptableStatusCodes))]; + self.acceptableContentTypes = [decoder decodeObjectOfClass:[NSIndexSet class] forKey:NSStringFromSelector(@selector(acceptableContentTypes))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.acceptableStatusCodes forKey:NSStringFromSelector(@selector(acceptableStatusCodes))]; + [coder encodeObject:self.acceptableContentTypes forKey:NSStringFromSelector(@selector(acceptableContentTypes))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.acceptableStatusCodes = [self.acceptableStatusCodes copyWithZone:zone]; + serializer.acceptableContentTypes = [self.acceptableContentTypes copyWithZone:zone]; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFJSONResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithReadingOptions:(NSJSONReadingOptions)0]; +} + ++ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions { + AFJSONResponseSerializer *serializer = [[self alloc] init]; + serializer.readingOptions = readingOptions; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + // Workaround for behavior of Rails to return a single space for `head :ok` (a workaround for a bug in Safari), which is not interpreted as valid input by NSJSONSerialization. + // See https://github.com/rails/rails/issues/1742 + NSStringEncoding stringEncoding = self.stringEncoding; + if (response.textEncodingName) { + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName); + if (encoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding); + } + } + + id responseObject = nil; + NSError *serializationError = nil; + @autoreleasepool { + NSString *responseString = [[NSString alloc] initWithData:data encoding:stringEncoding]; + if (responseString && ![responseString isEqualToString:@" "]) { + // Workaround for a bug in NSJSONSerialization when Unicode character escape codes are used instead of the actual character + // See http://stackoverflow.com/a/12843465/157142 + data = [responseString dataUsingEncoding:NSUTF8StringEncoding]; + + if (data) { + if ([data length] > 0) { + responseObject = [NSJSONSerialization JSONObjectWithData:data options:self.readingOptions error:&serializationError]; + } else { + return nil; + } + } else { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"Data failed decoding as a UTF-8 string", @"AFNetworking", nil), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Could not decode string: %@", @"AFNetworking", nil), responseString] + }; + + serializationError = [NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo]; + } + } + } + + if (self.removesKeysWithNullValues && responseObject) { + responseObject = AFJSONObjectByRemovingKeysWithNullValues(responseObject, self.readingOptions); + } + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return responseObject; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.readingOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(readingOptions))] unsignedIntegerValue]; + self.removesKeysWithNullValues = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))] boolValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.readingOptions) forKey:NSStringFromSelector(@selector(readingOptions))]; + [coder encodeObject:@(self.removesKeysWithNullValues) forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFJSONResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.readingOptions = self.readingOptions; + serializer.removesKeysWithNullValues = self.removesKeysWithNullValues; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFXMLParserResponseSerializer + ++ (instancetype)serializer { + AFXMLParserResponseSerializer *serializer = [[self alloc] init]; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + return [[NSXMLParser alloc] initWithData:data]; +} + +@end + +#pragma mark - + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + +@implementation AFXMLDocumentResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithXMLDocumentOptions:0]; +} + ++ (instancetype)serializerWithXMLDocumentOptions:(NSUInteger)mask { + AFXMLDocumentResponseSerializer *serializer = [[self alloc] init]; + serializer.options = mask; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + NSError *serializationError = nil; + NSXMLDocument *document = [[NSXMLDocument alloc] initWithData:data options:self.options error:&serializationError]; + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return document; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.options = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(options))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.options) forKey:NSStringFromSelector(@selector(options))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFXMLDocumentResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.options = self.options; + + return serializer; +} + +@end + +#endif + +#pragma mark - + +@implementation AFPropertyListResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 readOptions:0]; +} + ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + readOptions:(NSPropertyListReadOptions)readOptions +{ + AFPropertyListResponseSerializer *serializer = [[self alloc] init]; + serializer.format = format; + serializer.readOptions = readOptions; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/x-plist", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + id responseObject; + NSError *serializationError = nil; + + if (data) { + responseObject = [NSPropertyListSerialization propertyListWithData:data options:self.readOptions format:NULL error:&serializationError]; + } + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return responseObject; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.format = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(format))] unsignedIntegerValue]; + self.readOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(readOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.format) forKey:NSStringFromSelector(@selector(format))]; + [coder encodeObject:@(self.readOptions) forKey:NSStringFromSelector(@selector(readOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFPropertyListResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.format = self.format; + serializer.readOptions = self.readOptions; + + return serializer; +} + +@end + +#pragma mark - + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import + +static UIImage * AFImageWithDataAtScale(NSData *data, CGFloat scale) { + UIImage *image = [[UIImage alloc] initWithData:data]; + + return [[UIImage alloc] initWithCGImage:[image CGImage] scale:scale orientation:image.imageOrientation]; +} + +static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *response, NSData *data, CGFloat scale) { + if (!data || [data length] == 0) { + return nil; + } + + CGImageRef imageRef = NULL; + CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); + + if ([response.MIMEType isEqualToString:@"image/png"]) { + imageRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + } else if ([response.MIMEType isEqualToString:@"image/jpeg"]) { + imageRef = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + + // CGImageCreateWithJPEGDataProvider does not properly handle CMKY, so if so, fall back to AFImageWithDataAtScale + if (imageRef) { + CGColorSpaceRef imageColorSpace = CGImageGetColorSpace(imageRef); + CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(imageColorSpace); + if (imageColorSpaceModel == kCGColorSpaceModelCMYK) { + CGImageRelease(imageRef); + imageRef = NULL; + } + } + } + + CGDataProviderRelease(dataProvider); + + UIImage *image = AFImageWithDataAtScale(data, scale); + if (!imageRef) { + if (image.images || !image) { + return image; + } + + imageRef = CGImageCreateCopy([image CGImage]); + if (!imageRef) { + return nil; + } + } + + size_t width = CGImageGetWidth(imageRef); + size_t height = CGImageGetHeight(imageRef); + size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef); + + if (width * height > 1024 * 1024 || bitsPerComponent > 8) { + CGImageRelease(imageRef); + + return image; + } + + size_t bytesPerRow = 0; // CGImageGetBytesPerRow() calculates incorrectly in iOS 5.0, so defer to CGBitmapContextCreate + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace); + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); + + if (colorSpaceModel == kCGColorSpaceModelRGB) { + uint32_t alpha = (bitmapInfo & kCGBitmapAlphaInfoMask); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wassign-enum" + if (alpha == kCGImageAlphaNone) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaNoneSkipFirst; + } else if (!(alpha == kCGImageAlphaNoneSkipFirst || alpha == kCGImageAlphaNoneSkipLast)) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaPremultipliedFirst; + } +#pragma clang diagnostic pop + } + + CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo); + + CGColorSpaceRelease(colorSpace); + + if (!context) { + CGImageRelease(imageRef); + + return image; + } + + CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), imageRef); + CGImageRef inflatedImageRef = CGBitmapContextCreateImage(context); + + CGContextRelease(context); + + UIImage *inflatedImage = [[UIImage alloc] initWithCGImage:inflatedImageRef scale:scale orientation:image.imageOrientation]; + + CGImageRelease(inflatedImageRef); + CGImageRelease(imageRef); + + return inflatedImage; +} +#endif + + +@implementation AFImageResponseSerializer + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + self.imageScale = [[UIScreen mainScreen] scale]; + self.automaticallyInflatesResponseImage = YES; +#endif + + return self; +} + +#pragma mark - AFURLResponseSerializer + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + if (self.automaticallyInflatesResponseImage) { + return AFInflatedImageFromResponseWithDataAtScale((NSHTTPURLResponse *)response, data, self.imageScale); + } else { + return AFImageWithDataAtScale(data, self.imageScale); + } +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + // Ensure that the image is set to it's correct pixel width and height + NSBitmapImageRep *bitimage = [[NSBitmapImageRep alloc] initWithData:data]; + NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize([bitimage pixelsWide], [bitimage pixelsHigh])]; + [image addRepresentation:bitimage]; + + return image; +#endif + + return nil; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + NSNumber *imageScale = [decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(imageScale))]; +#if CGFLOAT_IS_DOUBLE + self.imageScale = [imageScale doubleValue]; +#else + self.imageScale = [imageScale floatValue]; +#endif + + self.automaticallyInflatesResponseImage = [decoder decodeBoolForKey:NSStringFromSelector(@selector(automaticallyInflatesResponseImage))]; +#endif + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + [coder encodeObject:@(self.imageScale) forKey:NSStringFromSelector(@selector(imageScale))]; + [coder encodeBool:self.automaticallyInflatesResponseImage forKey:NSStringFromSelector(@selector(automaticallyInflatesResponseImage))]; +#endif +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFImageResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + serializer.imageScale = self.imageScale; + serializer.automaticallyInflatesResponseImage = self.automaticallyInflatesResponseImage; +#endif + + return serializer; +} + +@end + +#pragma mark - + +@interface AFCompoundResponseSerializer () +@property (readwrite, nonatomic, copy) NSArray *responseSerializers; +@end + +@implementation AFCompoundResponseSerializer + ++ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers { + AFCompoundResponseSerializer *serializer = [[self alloc] init]; + serializer.responseSerializers = responseSerializers; + + return serializer; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + for (id serializer in self.responseSerializers) { + if (![serializer isKindOfClass:[AFHTTPResponseSerializer class]]) { + continue; + } + + NSError *serializerError = nil; + id responseObject = [serializer responseObjectForResponse:response data:data error:&serializerError]; + if (responseObject) { + if (error) { + *error = AFErrorWithUnderlyingError(serializerError, *error); + } + + return responseObject; + } + } + + return [super responseObjectForResponse:response data:data error:error]; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.responseSerializers = [decoder decodeObjectOfClass:[NSArray class] forKey:NSStringFromSelector(@selector(responseSerializers))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.responseSerializers forKey:NSStringFromSelector(@selector(responseSerializers))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFCompoundResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.responseSerializers = self.responseSerializers; + + return serializer; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h new file mode 100644 index 000000000..f475773d0 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h @@ -0,0 +1,531 @@ +// AFURLSessionManager.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" +#import "AFSecurityPolicy.h" +#import "AFNetworkReachabilityManager.h" + +/** + `AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. + + ## Subclassing Notes + + This is the base class for `AFHTTPSessionManager`, which adds functionality specific to making HTTP requests. If you are looking to extend `AFURLSessionManager` specifically for HTTP, consider subclassing `AFHTTPSessionManager` instead. + + ## NSURLSession & NSURLSessionTask Delegate Methods + + `AFURLSessionManager` implements the following delegate methods: + + ### `NSURLSessionDelegate` + + - `URLSession:didBecomeInvalidWithError:` + - `URLSession:didReceiveChallenge:completionHandler:` + - `URLSessionDidFinishEventsForBackgroundURLSession:` + + ### `NSURLSessionTaskDelegate` + + - `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:` + - `URLSession:task:didReceiveChallenge:completionHandler:` + - `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:` + - `URLSession:task:didCompleteWithError:` + + ### `NSURLSessionDataDelegate` + + - `URLSession:dataTask:didReceiveResponse:completionHandler:` + - `URLSession:dataTask:didBecomeDownloadTask:` + - `URLSession:dataTask:didReceiveData:` + - `URLSession:dataTask:willCacheResponse:completionHandler:` + + ### `NSURLSessionDownloadDelegate` + + - `URLSession:downloadTask:didFinishDownloadingToURL:` + - `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:` + - `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:` + + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. + + ## Network Reachability Monitoring + + Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. + + ## NSCoding Caveats + + - Encoded managers do not include any block properties. Be sure to set delegate callback blocks when using `-initWithCoder:` or `NSKeyedUnarchiver`. + + ## NSCopying Caveats + + - `-copy` and `-copyWithZone:` return a new manager with a new `NSURLSession` created from the configuration of the original. + - Operation copies do not include any delegate callback blocks, as they often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ session manager when copied. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. + */ + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +@interface AFURLSessionManager : NSObject + +/** + The managed session. + */ +@property (readonly, nonatomic, strong) NSURLSession *session; + +/** + The operation queue on which delegate callbacks are run. + */ +@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) id responseSerializer; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used by created request operations to evaluate server trust for secure connections. `AFURLSessionManager` uses the `defaultPolicy` unless otherwise specified. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///-------------------------------------- +/// @name Monitoring Network Reachability +///-------------------------------------- + +/** + The network reachability manager. `AFURLSessionManager` uses the `sharedManager` by default. + */ +@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager; + +///---------------------------- +/// @name Getting Session Tasks +///---------------------------- + +/** + The data, upload, and download tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *tasks; + +/** + The data tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *dataTasks; + +/** + The upload tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *uploadTasks; + +/** + The download tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *downloadTasks; + +///------------------------------- +/// @name Managing Callback Queues +///------------------------------- + +/** + The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, strong) dispatch_queue_t completionQueue; + +/** + The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. + */ +@property (nonatomic, strong) dispatch_group_t completionGroup; + +///--------------------------------- +/// @name Working Around System Bugs +///--------------------------------- + +/** + Whether to attempt to retry creation of upload tasks for background sessions when initial call returns `nil`. `NO` by default. + + @bug As of iOS 7.0, there is a bug where upload tasks created for background tasks are sometimes `nil`. As a workaround, if this property is `YES`, AFNetworking will follow Apple's recommendation to try creating the task again. + + @see https://github.com/AFNetworking/AFNetworking/issues/1675 + */ +@property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns a manager for a session created with the specified configuration. This is the designated initializer. + + @param configuration The configuration used to create the managed session. + + @return A manager for a newly-created session. + */ +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration; + +/** + Invalidates the managed session, optionally canceling pending tasks. + + @param cancelPendingTasks Whether or not to cancel pending tasks. + */ +- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks; + +///------------------------- +/// @name Running Data Tasks +///------------------------- + +/** + Creates an `NSURLSessionDataTask` with the specified request. + + @param request The HTTP request for the request. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +///--------------------------- +/// @name Running Upload Tasks +///--------------------------- + +/** + Creates an `NSURLSessionUploadTask` with the specified request for a local file. + + @param request The HTTP request for the request. + @param fileURL A URL to the local file to be uploaded. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + + @see `attemptsToRecreateUploadTasksForBackgroundSessions` + */ +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromFile:(NSURL *)fileURL + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +/** + Creates an `NSURLSessionUploadTask` with the specified request for an HTTP body. + + @param request The HTTP request for the request. + @param bodyData A data object containing the HTTP body to be uploaded. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromData:(NSData *)bodyData + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +/** + Creates an `NSURLSessionUploadTask` with the specified streaming request. + + @param request The HTTP request for the request. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +///----------------------------- +/// @name Running Download Tasks +///----------------------------- + +/** + Creates an `NSURLSessionDownloadTask` with the specified request. + + @param request The HTTP request for the request. + @param progress A progress object monitoring the current download progress. + @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL. + @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. + + @warning If using a background `NSURLSessionConfiguration` on iOS, these blocks will be lost when the app is terminated. Background sessions may prefer to use `-setDownloadTaskDidFinishDownloadingBlock:` to specify the URL for saving the downloaded file, rather than the destination block of this method. + */ +- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; + +/** + Creates an `NSURLSessionDownloadTask` with the specified resume data. + + @param resumeData The data used to resume downloading. + @param progress A progress object monitoring the current download progress. + @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL. + @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. + */ +- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; + +///--------------------------------- +/// @name Getting Progress for Tasks +///--------------------------------- + +/** + Returns the upload progress of the specified task. + + @param uploadTask The session upload task. Must not be `nil`. + + @return An `NSProgress` object reporting the upload progress of a task, or `nil` if the progress is unavailable. + */ +- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask; + +/** + Returns the download progress of the specified task. + + @param downloadTask The session download task. Must not be `nil`. + + @return An `NSProgress` object reporting the download progress of a task, or `nil` if the progress is unavailable. + */ +- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask; + +///----------------------------------------- +/// @name Setting Session Delegate Callbacks +///----------------------------------------- + +/** + Sets a block to be executed when the managed session becomes invalid, as handled by the `NSURLSessionDelegate` method `URLSession:didBecomeInvalidWithError:`. + + @param block A block object to be executed when the managed session becomes invalid. The block has no return value, and takes two arguments: the session, and the error related to the cause of invalidation. + */ +- (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block; + +/** + Sets a block to be executed when a connection level authentication challenge has occurred, as handled by the `NSURLSessionDelegate` method `URLSession:didReceiveChallenge:completionHandler:`. + + @param block A block object to be executed when a connection level authentication challenge has occurred. The block returns the disposition of the authentication challenge, and takes three arguments: the session, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. + */ +- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block; + +///-------------------------------------- +/// @name Setting Task Delegate Callbacks +///-------------------------------------- + +/** + Sets a block to be executed when a task requires a new request body stream to send to the remote server, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:needNewBodyStream:`. + + @param block A block object to be executed when a task requires a new request body stream. + */ +- (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block; + +/** + Sets a block to be executed when an HTTP request is attempting to perform a redirection to a different URL, as handled by the `NSURLSessionTaskDelegate` method `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:`. + + @param block A block object to be executed when an HTTP request is attempting to perform a redirection to a different URL. The block returns the request to be made for the redirection, and takes four arguments: the session, the task, the redirection response, and the request corresponding to the redirection response. + */ +- (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block; + +/** + Sets a block to be executed when a session task has received a request specific authentication challenge, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didReceiveChallenge:completionHandler:`. + + @param block A block object to be executed when a session task has received a request specific authentication challenge. The block returns the disposition of the authentication challenge, and takes four arguments: the session, the task, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. + */ +- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block; + +/** + Sets a block to be executed periodically to track upload progress, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`. + + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes five arguments: the session, the task, the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block; + +/** + Sets a block to be executed as the last message related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didCompleteWithError:`. + + @param block A block object to be executed when a session task is completed. The block has no return value, and takes three arguments: the session, the task, and any error that occurred in the process of executing the task. + */ +- (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block; + +///------------------------------------------- +/// @name Setting Data Task Delegate Callbacks +///------------------------------------------- + +/** + Sets a block to be executed when a data task has received a response, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveResponse:completionHandler:`. + + @param block A block object to be executed when a data task has received a response. The block returns the disposition of the session response, and takes three arguments: the session, the data task, and the received response. + */ +- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block; + +/** + Sets a block to be executed when a data task has become a download task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didBecomeDownloadTask:`. + + @param block A block object to be executed when a data task has become a download task. The block has no return value, and takes three arguments: the session, the data task, and the download task it has become. + */ +- (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block; + +/** + Sets a block to be executed when a data task receives data, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveData:`. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the session, the data task, and the data received. This block may be called multiple times, and will execute on the session manager operation queue. + */ +- (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block; + +/** + Sets a block to be executed to determine the caching behavior of a data task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:willCacheResponse:completionHandler:`. + + @param block A block object to be executed to determine the caching behavior of a data task. The block returns the response to cache, and takes three arguments: the session, the data task, and the proposed cached URL response. + */ +- (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block; + +/** + Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDataDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`. + + @param block A block object to be executed once all messages enqueued for a session have been delivered. The block has no return value and takes a single argument: the session. + */ +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block; + +///----------------------------------------------- +/// @name Setting Download Task Delegate Callbacks +///----------------------------------------------- + +/** + Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`. + + @param block A block object to be executed when a download task has completed. The block returns the URL the download should be moved to, and takes three arguments: the session, the download task, and the temporary location of the downloaded file. If the file manager encounters an error while attempting to move the temporary file to the destination, an `AFURLSessionDownloadTaskDidFailToMoveFileNotification` will be posted, with the download task as its object, and the user info of the error. + */ +- (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block; + +/** + Sets a block to be executed periodically to track download progress, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:`. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes five arguments: the session, the download task, the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the session manager operation queue. + */ +- (void)setDownloadTaskDidWriteDataBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block; + +/** + Sets a block to be executed when a download task has been resumed, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`. + + @param block A block object to be executed when a download task has been resumed. The block has no return value and takes four arguments: the session, the download task, the file offset of the resumed download, and the total number of bytes expected to be downloaded. + */ +- (void)setDownloadTaskDidResumeBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block; + +@end + +#endif + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when a task begins executing. + + @deprecated Use `AFNetworkingTaskDidResumeNotification` instead. + */ +extern NSString * const AFNetworkingTaskDidStartNotification DEPRECATED_ATTRIBUTE; + +/** + Posted when a task resumes. + */ +extern NSString * const AFNetworkingTaskDidResumeNotification; + +/** + Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task. + + @deprecated Use `AFNetworkingTaskDidCompleteNotification` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishNotification DEPRECATED_ATTRIBUTE; + +/** + Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task. + */ +extern NSString * const AFNetworkingTaskDidCompleteNotification; + +/** + Posted when a task suspends its execution. + */ +extern NSString * const AFNetworkingTaskDidSuspendNotification; + +/** + Posted when a session is invalidated. + */ +extern NSString * const AFURLSessionDidInvalidateNotification; + +/** + Posted when a session download task encountered an error when moving the temporary download file to a specified destination. + */ +extern NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification; + +/** + The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task. + + @deprecated Use `AFNetworkingTaskDidCompleteResponseDataKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishResponseDataKey DEPRECATED_ATTRIBUTE; + +/** + The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task. + */ +extern NSString * const AFNetworkingTaskDidCompleteResponseDataKey; + +/** + The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized. + + @deprecated Use `AFNetworkingTaskDidCompleteSerializedResponseKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishSerializedResponseKey DEPRECATED_ATTRIBUTE; + +/** + The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized. + */ +extern NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey; + +/** + The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer. + + @deprecated Use `AFNetworkingTaskDidCompleteResponseSerializerKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishResponseSerializerKey DEPRECATED_ATTRIBUTE; + +/** + The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer. + */ +extern NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey; + +/** + The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk. + + @deprecated Use `AFNetworkingTaskDidCompleteAssetPathKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishAssetPathKey DEPRECATED_ATTRIBUTE; + +/** + The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk. + */ +extern NSString * const AFNetworkingTaskDidCompleteAssetPathKey; + +/** + Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. + + @deprecated Use `AFNetworkingTaskDidCompleteErrorKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishErrorKey DEPRECATED_ATTRIBUTE; + +/** + Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. + */ +extern NSString * const AFNetworkingTaskDidCompleteErrorKey; diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m new file mode 100644 index 000000000..d53e6ec2d --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m @@ -0,0 +1,1079 @@ +// AFURLSessionManager.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLSessionManager.h" +#import + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +static dispatch_queue_t url_session_manager_creation_queue() { + static dispatch_queue_t af_url_session_manager_creation_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_creation_queue = dispatch_queue_create("com.alamofire.networking.session.manager.creation", DISPATCH_QUEUE_SERIAL); + }); + + return af_url_session_manager_creation_queue; +} + +static dispatch_queue_t url_session_manager_processing_queue() { + static dispatch_queue_t af_url_session_manager_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_processing_queue = dispatch_queue_create("com.alamofire.networking.session.manager.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return af_url_session_manager_processing_queue; +} + +static dispatch_group_t url_session_manager_completion_group() { + static dispatch_group_t af_url_session_manager_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_completion_group = dispatch_group_create(); + }); + + return af_url_session_manager_completion_group; +} + +NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume"; +NSString * const AFNetworkingTaskDidCompleteNotification = @"com.alamofire.networking.task.complete"; +NSString * const AFNetworkingTaskDidSuspendNotification = @"com.alamofire.networking.task.suspend"; +NSString * const AFURLSessionDidInvalidateNotification = @"com.alamofire.networking.session.invalidate"; +NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification = @"com.alamofire.networking.session.download.file-manager-error"; + +NSString * const AFNetworkingTaskDidStartNotification = @"com.alamofire.networking.task.resume"; // Deprecated +NSString * const AFNetworkingTaskDidFinishNotification = @"com.alamofire.networking.task.complete"; // Deprecated + +NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse"; +NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer"; +NSString * const AFNetworkingTaskDidCompleteResponseDataKey = @"com.alamofire.networking.complete.finish.responsedata"; +NSString * const AFNetworkingTaskDidCompleteErrorKey = @"com.alamofire.networking.task.complete.error"; +NSString * const AFNetworkingTaskDidCompleteAssetPathKey = @"com.alamofire.networking.task.complete.assetpath"; + +NSString * const AFNetworkingTaskDidFinishSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse"; // Deprecated +NSString * const AFNetworkingTaskDidFinishResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer"; // Deprecated +NSString * const AFNetworkingTaskDidFinishResponseDataKey = @"com.alamofire.networking.complete.finish.responsedata"; // Deprecated +NSString * const AFNetworkingTaskDidFinishErrorKey = @"com.alamofire.networking.task.complete.error"; // Deprecated +NSString * const AFNetworkingTaskDidFinishAssetPathKey = @"com.alamofire.networking.task.complete.assetpath"; // Deprecated + +static NSString * const AFURLSessionManagerLockName = @"com.alamofire.networking.session.manager.lock"; + +static NSUInteger const AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask = 3; + +static void * AFTaskStateChangedContext = &AFTaskStateChangedContext; + +typedef void (^AFURLSessionDidBecomeInvalidBlock)(NSURLSession *session, NSError *error); +typedef NSURLSessionAuthChallengeDisposition (^AFURLSessionDidReceiveAuthenticationChallengeBlock)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential); + +typedef NSURLRequest * (^AFURLSessionTaskWillPerformHTTPRedirectionBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request); +typedef NSURLSessionAuthChallengeDisposition (^AFURLSessionTaskDidReceiveAuthenticationChallengeBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential); +typedef void (^AFURLSessionDidFinishEventsForBackgroundURLSessionBlock)(NSURLSession *session); + +typedef NSInputStream * (^AFURLSessionTaskNeedNewBodyStreamBlock)(NSURLSession *session, NSURLSessionTask *task); +typedef void (^AFURLSessionTaskDidSendBodyDataBlock)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend); +typedef void (^AFURLSessionTaskDidCompleteBlock)(NSURLSession *session, NSURLSessionTask *task, NSError *error); + +typedef NSURLSessionResponseDisposition (^AFURLSessionDataTaskDidReceiveResponseBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response); +typedef void (^AFURLSessionDataTaskDidBecomeDownloadTaskBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask); +typedef void (^AFURLSessionDataTaskDidReceiveDataBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data); +typedef NSCachedURLResponse * (^AFURLSessionDataTaskWillCacheResponseBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse); + +typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location); +typedef void (^AFURLSessionDownloadTaskDidWriteDataBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite); +typedef void (^AFURLSessionDownloadTaskDidResumeBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes); + +typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id responseObject, NSError *error); + +#pragma mark - + +@interface AFURLSessionManagerTaskDelegate : NSObject +@property (nonatomic, weak) AFURLSessionManager *manager; +@property (nonatomic, strong) NSMutableData *mutableData; +@property (nonatomic, strong) NSProgress *progress; +@property (nonatomic, copy) NSURL *downloadFileURL; +@property (nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading; +@property (nonatomic, copy) AFURLSessionTaskCompletionHandler completionHandler; +@end + +@implementation AFURLSessionManagerTaskDelegate + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.mutableData = [NSMutableData data]; + + self.progress = [NSProgress progressWithTotalUnitCount:0]; + + return self; +} + +#pragma mark - NSURLSessionTaskDelegate + +- (void)URLSession:(__unused NSURLSession *)session + task:(__unused NSURLSessionTask *)task + didSendBodyData:(__unused int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend +{ + self.progress.totalUnitCount = totalBytesExpectedToSend; + self.progress.completedUnitCount = totalBytesSent; +} + +- (void)URLSession:(__unused NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + __strong AFURLSessionManager *manager = self.manager; + + __block id responseObject = nil; + + __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer; + + if (self.downloadFileURL) { + userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL; + } else if (self.mutableData) { + userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = [NSData dataWithData:self.mutableData]; + } + + if (error) { + userInfo[AFNetworkingTaskDidCompleteErrorKey] = error; + + dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{ + if (self.completionHandler) { + self.completionHandler(task.response, responseObject, error); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo]; + }); + }); + } else { + dispatch_async(url_session_manager_processing_queue(), ^{ + NSError *serializationError = nil; + responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:[NSData dataWithData:self.mutableData] error:&serializationError]; + + if (self.downloadFileURL) { + responseObject = self.downloadFileURL; + } + + if (responseObject) { + userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject; + } + + if (serializationError) { + userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError; + } + + dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{ + if (self.completionHandler) { + self.completionHandler(task.response, responseObject, serializationError); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo]; + }); + }); + }); + } +#pragma clang diagnostic pop +} + +#pragma mark - NSURLSessionDataTaskDelegate + +- (void)URLSession:(__unused NSURLSession *)session + dataTask:(__unused NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data +{ + [self.mutableData appendData:data]; +} + +#pragma mark - NSURLSessionDownloadTaskDelegate + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location +{ + NSError *fileManagerError = nil; + self.downloadFileURL = nil; + + if (self.downloadTaskDidFinishDownloading) { + self.downloadFileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location); + if (self.downloadFileURL) { + [[NSFileManager defaultManager] moveItemAtURL:location toURL:self.downloadFileURL error:&fileManagerError]; + + if (fileManagerError) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:fileManagerError.userInfo]; + } + } + } +} + +- (void)URLSession:(__unused NSURLSession *)session + downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask + didWriteData:(__unused int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite +{ + self.progress.totalUnitCount = totalBytesExpectedToWrite; + self.progress.completedUnitCount = totalBytesWritten; +} + +- (void)URLSession:(__unused NSURLSession *)session + downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes { + self.progress.totalUnitCount = expectedTotalBytes; + self.progress.completedUnitCount = fileOffset; +} + +@end + +#pragma mark - + +/* + A workaround for issues related to key-value observing the `state` of an `NSURLSessionTask`. + + See https://github.com/AFNetworking/AFNetworking/issues/1477 + */ + +static inline void af_swizzleSelector(Class class, SEL originalSelector, SEL swizzledSelector) { + Method originalMethod = class_getInstanceMethod(class, originalSelector); + Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); + if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) { + class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); + } else { + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + +static NSString * const AFNSURLSessionTaskDidResumeNotification = @"com.alamofire.networking.nsurlsessiontask.resume"; +static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofire.networking.nsurlsessiontask.suspend"; + +@interface NSURLSessionTask (_AFStateObserving) +@end + +@implementation NSURLSessionTask (_AFStateObserving) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_swizzleSelector([self class], @selector(resume), @selector(af_resume)); + af_swizzleSelector([self class], @selector(suspend), @selector(af_suspend)); + }); +} + +#pragma mark - + +- (void)af_resume { + NSURLSessionTaskState state = self.state; + [self af_resume]; + + if (state != NSURLSessionTaskStateRunning) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidResumeNotification object:self]; + } +} + +- (void)af_suspend { + NSURLSessionTaskState state = self.state; + [self af_suspend]; + + if (state != NSURLSessionTaskStateSuspended) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidSuspendNotification object:self]; + } +} + +@end + +#pragma mark - + +@interface AFURLSessionManager () +@property (readwrite, nonatomic, strong) NSURLSessionConfiguration *sessionConfiguration; +@property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue; +@property (readwrite, nonatomic, strong) NSURLSession *session; +@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByTaskIdentifier; +@property (readwrite, nonatomic, strong) NSLock *lock; +@property (readwrite, nonatomic, copy) AFURLSessionDidBecomeInvalidBlock sessionDidBecomeInvalid; +@property (readwrite, nonatomic, copy) AFURLSessionDidReceiveAuthenticationChallengeBlock sessionDidReceiveAuthenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLSessionDidFinishEventsForBackgroundURLSessionBlock didFinishEventsForBackgroundURLSession; +@property (readwrite, nonatomic, copy) AFURLSessionTaskWillPerformHTTPRedirectionBlock taskWillPerformHTTPRedirection; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidReceiveAuthenticationChallengeBlock taskDidReceiveAuthenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLSessionTaskNeedNewBodyStreamBlock taskNeedNewBodyStream; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidSendBodyDataBlock taskDidSendBodyData; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidCompleteBlock taskDidComplete; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveResponseBlock dataTaskDidReceiveResponse; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidBecomeDownloadTaskBlock dataTaskDidBecomeDownloadTask; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveDataBlock dataTaskDidReceiveData; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskWillCacheResponseBlock dataTaskWillCacheResponse; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidWriteDataBlock downloadTaskDidWriteData; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidResumeBlock downloadTaskDidResume; +@end + +@implementation AFURLSessionManager + +- (instancetype)init { + return [self initWithSessionConfiguration:nil]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + self = [super init]; + if (!self) { + return nil; + } + + if (!configuration) { + configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + } + + self.sessionConfiguration = configuration; + + self.operationQueue = [[NSOperationQueue alloc] init]; + self.operationQueue.maxConcurrentOperationCount = 1; + + self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; + + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; + + self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init]; + + self.lock = [[NSLock alloc] init]; + self.lock.name = AFURLSessionManagerLockName; + + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { + for (NSURLSessionDataTask *task in dataTasks) { + [self addDelegateForDataTask:task completionHandler:nil]; + } + + for (NSURLSessionUploadTask *uploadTask in uploadTasks) { + [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil]; + } + + for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { + [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil]; + } + }]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidResume:) name:AFNSURLSessionTaskDidResumeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidSuspend:) name:AFNSURLSessionTaskDidSuspendNotification object:nil]; + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)taskDidResume:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task isKindOfClass:[NSURLSessionTask class]]) { + AFURLSessionManager *manager = [self delegateForTask:task].manager; + if ([manager isEqual:self]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidResumeNotification object:task]; + }); + } + } +} + +- (void)taskDidSuspend:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task isKindOfClass:[NSURLSessionTask class]]) { + AFURLSessionManager *manager = [self delegateForTask:task].manager; + if ([manager isEqual:self]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidSuspendNotification object:task]; + }); + } + } +} + +#pragma mark - + +- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task { + NSParameterAssert(task); + + AFURLSessionManagerTaskDelegate *delegate = nil; + [self.lock lock]; + delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)]; + [self.lock unlock]; + + return delegate; +} + +- (void)setDelegate:(AFURLSessionManagerTaskDelegate *)delegate + forTask:(NSURLSessionTask *)task +{ + NSParameterAssert(task); + NSParameterAssert(delegate); + + [self.lock lock]; + self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate; + [self.lock unlock]; +} + +- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + [self setDelegate:delegate forTask:dataTask]; +} + +- (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + int64_t totalUnitCount = uploadTask.countOfBytesExpectedToSend; + if(totalUnitCount == NSURLSessionTransferSizeUnknown) { + NSString *contentLength = [uploadTask.originalRequest valueForHTTPHeaderField:@"Content-Length"]; + if(contentLength) { + totalUnitCount = (int64_t) [contentLength longLongValue]; + } + } + + delegate.progress = [NSProgress progressWithTotalUnitCount:totalUnitCount]; + delegate.progress.pausingHandler = ^{ + [uploadTask suspend]; + }; + delegate.progress.cancellationHandler = ^{ + [uploadTask cancel]; + }; + + if (progress) { + *progress = delegate.progress; + } + + [self setDelegate:delegate forTask:uploadTask]; +} + +- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + if (destination) { + delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) { + return destination(location, task.response); + }; + } + + if (progress) { + *progress = delegate.progress; + } + + [self setDelegate:delegate forTask:downloadTask]; +} + +- (void)removeDelegateForTask:(NSURLSessionTask *)task { + NSParameterAssert(task); + + [self.lock lock]; + [self.mutableTaskDelegatesKeyedByTaskIdentifier removeObjectForKey:@(task.taskIdentifier)]; + [self.lock unlock]; +} + +- (void)removeAllDelegates { + [self.lock lock]; + [self.mutableTaskDelegatesKeyedByTaskIdentifier removeAllObjects]; + [self.lock unlock]; +} + +#pragma mark - + +- (NSArray *)tasksForKeyPath:(NSString *)keyPath { + __block NSArray *tasks = nil; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { + if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))]) { + tasks = dataTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(uploadTasks))]) { + tasks = uploadTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(downloadTasks))]) { + tasks = downloadTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(tasks))]) { + tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:@"@unionOfArrays.self"]; + } + + dispatch_semaphore_signal(semaphore); + }]; + + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + + return tasks; +} + +- (NSArray *)tasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)dataTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)uploadTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)downloadTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +#pragma mark - + +- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks { + dispatch_async(dispatch_get_main_queue(), ^{ + if (cancelPendingTasks) { + [self.session invalidateAndCancel]; + } else { + [self.session finishTasksAndInvalidate]; + } + }); +} + +#pragma mark - + +- (void)setResponseSerializer:(id )responseSerializer { + NSParameterAssert(responseSerializer); + + _responseSerializer = responseSerializer; +} + +#pragma mark - + +- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionDataTask *dataTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + dataTask = [self.session dataTaskWithRequest:request]; + }); + + [self addDelegateForDataTask:dataTask completionHandler:completionHandler]; + + return dataTask; +} + +#pragma mark - + +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromFile:(NSURL *)fileURL + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + }); + + if (!uploadTask && self.attemptsToRecreateUploadTasksForBackgroundSessions && self.session.configuration.identifier) { + for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask; attempts++) { + uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + } + } + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromData:(NSData *)bodyData + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData]; + }); + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithStreamedRequest:request]; + }); + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +#pragma mark - + +- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithRequest:request]; + }); + + [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; + + return downloadTask; +} + +- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithResumeData:resumeData]; + }); + + [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; + + return downloadTask; +} + +#pragma mark - + +- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask { + return [[self delegateForTask:uploadTask] progress]; +} + +- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask { + return [[self delegateForTask:downloadTask] progress]; +} + +#pragma mark - + +- (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block { + self.sessionDidBecomeInvalid = block; +} + +- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block { + self.sessionDidReceiveAuthenticationChallenge = block; +} + +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block { + self.didFinishEventsForBackgroundURLSession = block; +} + +#pragma mark - + +- (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block { + self.taskNeedNewBodyStream = block; +} + +- (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block { + self.taskWillPerformHTTPRedirection = block; +} + +- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block { + self.taskDidReceiveAuthenticationChallenge = block; +} + +- (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block { + self.taskDidSendBodyData = block; +} + +- (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block { + self.taskDidComplete = block; +} + +#pragma mark - + +- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block { + self.dataTaskDidReceiveResponse = block; +} + +- (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block { + self.dataTaskDidBecomeDownloadTask = block; +} + +- (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block { + self.dataTaskDidReceiveData = block; +} + +- (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block { + self.dataTaskWillCacheResponse = block; +} + +#pragma mark - + +- (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block { + self.downloadTaskDidFinishDownloading = block; +} + +- (void)setDownloadTaskDidWriteDataBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block { + self.downloadTaskDidWriteData = block; +} + +- (void)setDownloadTaskDidResumeBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block { + self.downloadTaskDidResume = block; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, session: %@, operationQueue: %@>", NSStringFromClass([self class]), self, self.session, self.operationQueue]; +} + +- (BOOL)respondsToSelector:(SEL)selector { + if (selector == @selector(URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:)) { + return self.taskWillPerformHTTPRedirection != nil; + } else if (selector == @selector(URLSession:dataTask:didReceiveResponse:completionHandler:)) { + return self.dataTaskDidReceiveResponse != nil; + } else if (selector == @selector(URLSession:dataTask:willCacheResponse:completionHandler:)) { + return self.dataTaskWillCacheResponse != nil; + } else if (selector == @selector(URLSessionDidFinishEventsForBackgroundURLSession:)) { + return self.didFinishEventsForBackgroundURLSession != nil; + } + + return [[self class] instancesRespondToSelector:selector]; +} + +#pragma mark - NSURLSessionDelegate + +- (void)URLSession:(NSURLSession *)session +didBecomeInvalidWithError:(NSError *)error +{ + if (self.sessionDidBecomeInvalid) { + self.sessionDidBecomeInvalid(session, error); + } + + [self removeAllDelegates]; + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDidInvalidateNotification object:session]; +} + +- (void)URLSession:(NSURLSession *)session +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler +{ + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + __block NSURLCredential *credential = nil; + + if (self.sessionDidReceiveAuthenticationChallenge) { + disposition = self.sessionDidReceiveAuthenticationChallenge(session, challenge, &credential); + } else { + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + if (credential) { + disposition = NSURLSessionAuthChallengeUseCredential; + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +#pragma mark - NSURLSessionTaskDelegate + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +willPerformHTTPRedirection:(NSHTTPURLResponse *)response + newRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLRequest *))completionHandler +{ + NSURLRequest *redirectRequest = request; + + if (self.taskWillPerformHTTPRedirection) { + redirectRequest = self.taskWillPerformHTTPRedirection(session, task, response, request); + } + + if (completionHandler) { + completionHandler(redirectRequest); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler +{ + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + __block NSURLCredential *credential = nil; + + if (self.taskDidReceiveAuthenticationChallenge) { + disposition = self.taskDidReceiveAuthenticationChallenge(session, task, challenge, &credential); + } else { + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + disposition = NSURLSessionAuthChallengeUseCredential; + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + needNewBodyStream:(void (^)(NSInputStream *bodyStream))completionHandler +{ + NSInputStream *inputStream = nil; + + if (self.taskNeedNewBodyStream) { + inputStream = self.taskNeedNewBodyStream(session, task); + } else if (task.originalRequest.HTTPBodyStream && [task.originalRequest.HTTPBodyStream conformsToProtocol:@protocol(NSCopying)]) { + inputStream = [task.originalRequest.HTTPBodyStream copy]; + } + + if (completionHandler) { + completionHandler(inputStream); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend +{ + + int64_t totalUnitCount = totalBytesExpectedToSend; + if(totalUnitCount == NSURLSessionTransferSizeUnknown) { + NSString *contentLength = [task.originalRequest valueForHTTPHeaderField:@"Content-Length"]; + if(contentLength) { + totalUnitCount = (int64_t) [contentLength longLongValue]; + } + } + + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task]; + [delegate URLSession:session task:task didSendBodyData:bytesSent totalBytesSent:totalBytesSent totalBytesExpectedToSend:totalUnitCount]; + + if (self.taskDidSendBodyData) { + self.taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalUnitCount); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task]; + + // delegate may be nil when completing a task in the background + if (delegate) { + [delegate URLSession:session task:task didCompleteWithError:error]; + + [self removeDelegateForTask:task]; + } + + if (self.taskDidComplete) { + self.taskDidComplete(session, task, error); + } + +} + +#pragma mark - NSURLSessionDataDelegate + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler +{ + NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow; + + if (self.dataTaskDidReceiveResponse) { + disposition = self.dataTaskDidReceiveResponse(session, dataTask, response); + } + + if (completionHandler) { + completionHandler(disposition); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:dataTask]; + if (delegate) { + [self removeDelegateForTask:dataTask]; + [self setDelegate:delegate forTask:downloadTask]; + } + + if (self.dataTaskDidBecomeDownloadTask) { + self.dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:dataTask]; + [delegate URLSession:session dataTask:dataTask didReceiveData:data]; + + if (self.dataTaskDidReceiveData) { + self.dataTaskDidReceiveData(session, dataTask, data); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler +{ + NSCachedURLResponse *cachedResponse = proposedResponse; + + if (self.dataTaskWillCacheResponse) { + cachedResponse = self.dataTaskWillCacheResponse(session, dataTask, proposedResponse); + } + + if (completionHandler) { + completionHandler(cachedResponse); + } +} + +- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { + if (self.didFinishEventsForBackgroundURLSession) { + dispatch_async(dispatch_get_main_queue(), ^{ + self.didFinishEventsForBackgroundURLSession(session); + }); + } +} + +#pragma mark - NSURLSessionDownloadDelegate + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + if (self.downloadTaskDidFinishDownloading) { + NSURL *fileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location); + if (fileURL) { + delegate.downloadFileURL = fileURL; + NSError *error = nil; + [[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error]; + if (error) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo]; + } + + return; + } + } + + if (delegate) { + [delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location]; + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + [delegate URLSession:session downloadTask:downloadTask didWriteData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite]; + + if (self.downloadTaskDidWriteData) { + self.downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + [delegate URLSession:session downloadTask:downloadTask didResumeAtOffset:fileOffset expectedTotalBytes:expectedTotalBytes]; + + if (self.downloadTaskDidResume) { + self.downloadTaskDidResume(session, downloadTask, fileOffset, expectedTotalBytes); + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURLSessionConfiguration *configuration = [decoder decodeObjectOfClass:[NSURLSessionConfiguration class] forKey:@"sessionConfiguration"]; + + self = [self initWithSessionConfiguration:configuration]; + if (!self) { + return nil; + } + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.session.configuration forKey:@"sessionConfiguration"]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return [[[self class] allocWithZone:zone] initWithSessionConfiguration:self.session.configuration]; +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/LICENSE b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/LICENSE new file mode 100644 index 000000000..0616192d0 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/README.md b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/README.md new file mode 100644 index 000000000..13e080c09 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/README.md @@ -0,0 +1,383 @@ +

    + AFNetworking +

    + +[![Build Status](https://travis-ci.org/AFNetworking/AFNetworking.svg)](https://travis-ci.org/AFNetworking/AFNetworking) + +AFNetworking is a delightful networking library for iOS and Mac OS X. It's built on top of the [Foundation URL Loading System](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html), extending the powerful high-level networking abstractions built into Cocoa. It has a modular architecture with well-designed, feature-rich APIs that are a joy to use. + +Perhaps the most important feature of all, however, is the amazing community of developers who use and contribute to AFNetworking every day. AFNetworking powers some of the most popular and critically-acclaimed apps on the iPhone, iPad, and Mac. + +Choose AFNetworking for your next project, or migrate over your existing projects—you'll be happy you did! + +## How To Get Started + +- [Download AFNetworking](https://github.com/AFNetworking/AFNetworking/archive/master.zip) and try out the included Mac and iPhone example apps +- Read the ["Getting Started" guide](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking), [FAQ](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ), or [other articles on the Wiki](https://github.com/AFNetworking/AFNetworking/wiki) +- Check out the [documentation](http://cocoadocs.org/docsets/AFNetworking/) for a comprehensive look at all of the APIs available in AFNetworking +- Read the [AFNetworking 2.0 Migration Guide](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide) for an overview of the architectural changes from 1.0. + +## Communication + +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). (Tag 'afnetworking') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). +- If you **found a bug**, _and can provide steps to reliably reproduce it_, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. + +### Installation with CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like AFNetworking in your projects. See the ["Getting Started" guide for more information](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking). + +#### Podfile + +```ruby +platform :ios, '7.0' +pod "AFNetworking", "~> 2.0" +``` + +## Requirements + +| AFNetworking Version | Minimum iOS Target | Minimum OS X Target | Notes | +|:--------------------:|:---------------------------:|:----------------------------:|:-------------------------------------------------------------------------:| +| 2.x | iOS 6 | OS X 10.8 | Xcode 5 is required. `AFHTTPSessionManager` requires iOS 7 or OS X 10.9. | +| [1.x](https://github.com/AFNetworking/AFNetworking/tree/1.x) | iOS 5 | Mac OS X 10.7 | | +| [0.10.x](https://github.com/AFNetworking/AFNetworking/tree/0.10.x) | iOS 4 | Mac OS X 10.6 | | + +(OS X projects must support [64-bit with modern Cocoa runtime](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html)). + +## Architecture + +### NSURLConnection + +- `AFURLConnectionOperation` +- `AFHTTPRequestOperation` +- `AFHTTPRequestOperationManager` + +### NSURLSession _(iOS 7 / Mac OS X 10.9)_ + +- `AFURLSessionManager` +- `AFHTTPSessionManager` + +### Serialization + +* `` + - `AFHTTPRequestSerializer` + - `AFJSONRequestSerializer` + - `AFPropertyListRequestSerializer` +* `` + - `AFHTTPResponseSerializer` + - `AFJSONResponseSerializer` + - `AFXMLParserResponseSerializer` + - `AFXMLDocumentResponseSerializer` _(Mac OS X)_ + - `AFPropertyListResponseSerializer` + - `AFImageResponseSerializer` + - `AFCompoundResponseSerializer` + +### Additional Functionality + +- `AFSecurityPolicy` +- `AFNetworkReachabilityManager` + +## Usage + +### HTTP Request Operation Manager + +`AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. + +#### `GET` Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` URL-Form-Encoded Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` Multi-Part Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:filePath name:@"image" error:nil]; +} success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"Success: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +--- + +### AFURLSessionManager + +`AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. + +#### Creating a Download Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { + NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; + return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; +} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { + NSLog(@"File downloaded to: %@", filePath); +}]; +[downloadTask resume]; +``` + +#### Creating an Upload Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"Success: %@ %@", response, responseObject); + } +}]; +[uploadTask resume]; +``` + +#### Creating an Upload Task for a Multi-Part Request, with Progress + +```objective-c +NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil]; + } error:nil]; + +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; +NSProgress *progress = nil; + +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; + +[uploadTask resume]; +``` + +#### Creating a Data Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; +[dataTask resume]; +``` + +--- + +### Request Serialization + +Request serializers create requests from URL strings, encoding parameters as either a query string or HTTP body. + +```objective-c +NSString *URLString = @"http://example.com"; +NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]}; +``` + +#### Query String Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil]; +``` + + GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### URL Form Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/x-www-form-urlencoded + + foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### JSON Parameter Encoding + +```objective-c +[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/json + + {"foo": "bar", "baz": [1,2,3]} + +--- + +### Network Reachability Manager + +`AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. + +#### Shared Network Reachability + +```objective-c +[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); +}]; +``` + +#### HTTP Manager Reachability + +```objective-c +NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"]; +AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL]; + +NSOperationQueue *operationQueue = manager.operationQueue; +[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusReachableViaWWAN: + case AFNetworkReachabilityStatusReachableViaWiFi: + [operationQueue setSuspended:NO]; + break; + case AFNetworkReachabilityStatusNotReachable: + default: + [operationQueue setSuspended:YES]; + break; + } +}]; + +[manager.reachabilityManager startMonitoring]; +``` + +--- + +### Security Policy + +`AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + +Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. + +#### Allowing Invalid SSL Certificates + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production +``` + +--- + +### AFHTTPRequestOperation + +`AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + +Although `AFHTTPRequestOperationManager` is usually the best way to go about making requests, `AFHTTPRequestOperation` can be used by itself. + +#### `GET` with `AFHTTPRequestOperation` + +```objective-c +NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; +AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; +op.responseSerializer = [AFJSONResponseSerializer serializer]; +[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +[[NSOperationQueue mainQueue] addOperation:op]; +``` + +#### Batch of Operations + +```objective-c +NSMutableArray *mutableOperations = [NSMutableArray array]; +for (NSURL *fileURL in filesToUpload) { + NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil]; + }]; + + AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + + [mutableOperations addObject:operation]; +} + +NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { + NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations); +} completionBlock:^(NSArray *operations) { + NSLog(@"All operations in batch complete"); +}]; +[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; +``` + +## Unit Tests + +AFNetworking includes a suite of unit tests within the Tests subdirectory. In order to run the unit tests, you must install the testing dependencies via [CocoaPods](http://cocoapods.org/): + + $ cd Tests + $ pod install + +Once testing dependencies are installed, you can execute the test suite via the 'iOS Tests' and 'OS X Tests' schemes within Xcode. + +### Running Tests from the Command Line + +Tests can also be run from the command line or within a continuous integration environment. The [`xcpretty`](https://github.com/mneorr/xcpretty) utility needs to be installed before running the tests from the command line: + + $ gem install xcpretty + +Once `xcpretty` is installed, you can execute the suite via `rake test`. + +## Credits + +AFNetworking was originally created by [Scott Raymond](https://github.com/sco/) and [Mattt Thompson](https://github.com/mattt/) in the development of [Gowalla for iPhone](http://en.wikipedia.org/wiki/Gowalla). + +AFNetworking's logo was designed by [Alan Defibaugh](http://www.alandefibaugh.com/). + +And most of all, thanks to AFNetworking's [growing list of contributors](https://github.com/AFNetworking/AFNetworking/contributors). + +## Contact + +Follow AFNetworking on Twitter ([@AFNetworking](https://twitter.com/AFNetworking)) + +### Maintainers + +- [Mattt Thompson](http://github.com/mattt) ([@mattt](https://twitter.com/mattt)) + +## License + +AFNetworking is available under the MIT license. See the LICENSE file for more info. diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 100644 index 000000000..312d680e0 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1,76 @@ +// AFNetworkActivityIndicatorManager.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +/** + `AFNetworkActivityIndicatorManager` manages the state of the network activity indicator in the status bar. When enabled, it will listen for notifications indicating that a network request operation has started or finished, and start or stop animating the indicator accordingly. The number of active requests is incremented and decremented much like a stack or a semaphore, and the activity indicator will animate so long as that number is greater than zero. + + You should enable the shared instance of `AFNetworkActivityIndicatorManager` when your application finishes launching. In `AppDelegate application:didFinishLaunchingWithOptions:` you can do so with the following code: + + [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; + + By setting `isNetworkActivityIndicatorVisible` to `YES` for `sharedManager`, the network activity indicator will show and hide automatically as requests start and finish. You should not ever need to call `incrementActivityCount` or `decrementActivityCount` yourself. + + See the Apple Human Interface Guidelines section about the Network Activity Indicator for more information: + http://developer.apple.com/library/iOS/#documentation/UserExperience/Conceptual/MobileHIG/UIElementGuidelines/UIElementGuidelines.html#//apple_ref/doc/uid/TP40006556-CH13-SW44 + */ +@interface AFNetworkActivityIndicatorManager : NSObject + +/** + A Boolean value indicating whether the manager is enabled. + + If YES, the manager will change status bar network activity indicator according to network operation notifications it receives. The default value is NO. + */ +@property (nonatomic, assign, getter = isEnabled) BOOL enabled; + +/** + A Boolean value indicating whether the network activity indicator is currently displayed in the status bar. + */ +@property (readonly, nonatomic, assign) BOOL isNetworkActivityIndicatorVisible; + +/** + Returns the shared network activity indicator manager object for the system. + + @return The systemwide network activity indicator manager. + */ ++ (instancetype)sharedManager; + +/** + Increments the number of active network requests. If this number was zero before incrementing, this will start animating the status bar network activity indicator. + */ +- (void)incrementActivityCount; + +/** + Decrements the number of active network requests. If this number becomes zero after decrementing, this will stop animating the status bar network activity indicator. + */ +- (void)decrementActivityCount; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m new file mode 100644 index 000000000..c2d855a59 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m @@ -0,0 +1,171 @@ +// AFNetworkActivityIndicatorManager.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFNetworkActivityIndicatorManager.h" + +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static NSTimeInterval const kAFNetworkActivityIndicatorInvisibilityDelay = 0.17; + +static NSURLRequest * AFNetworkRequestFromNotification(NSNotification *notification) { + if ([[notification object] isKindOfClass:[AFURLConnectionOperation class]]) { + return [(AFURLConnectionOperation *)[notification object] request]; + } + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + if ([[notification object] respondsToSelector:@selector(originalRequest)]) { + return [(NSURLSessionTask *)[notification object] originalRequest]; + } +#endif + + return nil; +} + +@interface AFNetworkActivityIndicatorManager () +@property (readwrite, nonatomic, assign) NSInteger activityCount; +@property (readwrite, nonatomic, strong) NSTimer *activityIndicatorVisibilityTimer; +@property (readonly, nonatomic, getter = isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; + +- (void)updateNetworkActivityIndicatorVisibility; +- (void)updateNetworkActivityIndicatorVisibilityDelayed; +@end + +@implementation AFNetworkActivityIndicatorManager +@dynamic networkActivityIndicatorVisible; + ++ (instancetype)sharedManager { + static AFNetworkActivityIndicatorManager *_sharedManager = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _sharedManager = [[self alloc] init]; + }); + + return _sharedManager; +} + ++ (NSSet *)keyPathsForValuesAffectingIsNetworkActivityIndicatorVisible { + return [NSSet setWithObject:@"activityCount"]; +} + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidStart:) name:AFNetworkingOperationDidStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingOperationDidFinishNotification object:nil]; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidStart:) name:AFNetworkingTaskDidResumeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingTaskDidSuspendNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingTaskDidCompleteNotification object:nil]; +#endif + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_activityIndicatorVisibilityTimer invalidate]; +} + +- (void)updateNetworkActivityIndicatorVisibilityDelayed { + if (self.enabled) { + // Delay hiding of activity indicator for a short interval, to avoid flickering + if (![self isNetworkActivityIndicatorVisible]) { + [self.activityIndicatorVisibilityTimer invalidate]; + self.activityIndicatorVisibilityTimer = [NSTimer timerWithTimeInterval:kAFNetworkActivityIndicatorInvisibilityDelay target:self selector:@selector(updateNetworkActivityIndicatorVisibility) userInfo:nil repeats:NO]; + [[NSRunLoop mainRunLoop] addTimer:self.activityIndicatorVisibilityTimer forMode:NSRunLoopCommonModes]; + } else { + [self performSelectorOnMainThread:@selector(updateNetworkActivityIndicatorVisibility) withObject:nil waitUntilDone:NO modes:@[NSRunLoopCommonModes]]; + } + } +} + +- (BOOL)isNetworkActivityIndicatorVisible { + return self.activityCount > 0; +} + +- (void)updateNetworkActivityIndicatorVisibility { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:[self isNetworkActivityIndicatorVisible]]; +} + +- (void)setActivityCount:(NSInteger)activityCount { + @synchronized(self) { + _activityCount = activityCount; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)incrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { + _activityCount++; + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)decrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + _activityCount = MAX(_activityCount - 1, 0); +#pragma clang diagnostic pop + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)networkRequestDidStart:(NSNotification *)notification { + if ([AFNetworkRequestFromNotification(notification) URL]) { + [self incrementActivityCount]; + } +} + +- (void)networkRequestDidFinish:(NSNotification *)notification { + if ([AFNetworkRequestFromNotification(notification) URL]) { + [self decrementActivityCount]; + } +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 100644 index 000000000..1c1f8dd6f --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1,64 @@ +// UIActivityIndicatorView+AFNetworking.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIActivityIndicatorView` class. The methods in this category provide support for automatically starting and stopping animation depending on the loading state of a request operation or session task. + */ +@interface UIActivityIndicatorView (AFNetworking) + +///---------------------------------- +/// @name Animating for Session Tasks +///---------------------------------- + +/** + Binds the animating state to the state of the specified task. + + @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task; +#endif + +///--------------------------------------- +/// @name Animating for Request Operations +///--------------------------------------- + +/** + Binds the animating state to the execution state of the specified operation. + + @param operation The operation. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m new file mode 100644 index 000000000..6627dbb1b --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m @@ -0,0 +1,97 @@ +// UIActivityIndicatorView+AFNetworking.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIActivityIndicatorView+AFNetworking.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +@implementation UIActivityIndicatorView (AFNetworking) + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + + if (task) { + if (task.state != NSURLSessionTaskStateCompleted) { + if (task.state == NSURLSessionTaskStateRunning) { + [self startAnimating]; + } else { + [self stopAnimating]; + } + + [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingTaskDidResumeNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidCompleteNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidSuspendNotification object:task]; + } + } +} +#endif + +#pragma mark - + +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; + + if (operation) { + if (![operation isFinished]) { + if ([operation isExecuting]) { + [self startAnimating]; + } else { + [self stopAnimating]; + } + + [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingOperationDidStartNotification object:operation]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingOperationDidFinishNotification object:operation]; + } + } +} + +#pragma mark - + +- (void)af_startAnimating { + dispatch_async(dispatch_get_main_queue(), ^{ + [self startAnimating]; + }); +} + +- (void)af_stopAnimating { + dispatch_async(dispatch_get_main_queue(), ^{ + [self stopAnimating]; + }); +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h new file mode 100644 index 000000000..b94f1cb8e --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1,96 @@ +// UIAlertView+AFNetworking.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIAlertView` class. The methods in this category provide support for automatically showing an alert if a session task or request operation finishes with an error. Alert title and message are filled from the corresponding `localizedDescription` & `localizedRecoverySuggestion` or `localizedFailureReason` of the error. + */ +@interface UIAlertView (AFNetworking) + +///------------------------------------- +/// @name Showing Alert for Session Task +///------------------------------------- + +/** + Shows an alert view with the error of the specified session task, if any. + + @param task The session task. + @param delegate The alert view delegate. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate; +#endif + +/** + Shows an alert view with the error of the specified session task, if any, with a custom cancel button title and other button titles. + + @param task The session task. + @param delegate The alert view delegate. + @param cancelButtonTitle The title of the cancel button or nil if there is no cancel button. Using this argument is equivalent to setting the cancel button index to the value returned by invoking addButtonWithTitle: specifying this title. + @param otherButtonTitles The title of another button. Using this argument is equivalent to invoking addButtonWithTitle: with this title to add more buttons. Too many buttons can cause the alert view to scroll. For guidelines on the best ways to use an alert in an app, see "Temporary Views". Titles of additional buttons to add to the receiver, terminated with `nil`. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION; +#endif + +///------------------------------------------ +/// @name Showing Alert for Request Operation +///------------------------------------------ + +/** + Shows an alert view with the error of the specified request operation, if any. + + @param operation The request operation. + @param delegate The alert view delegate. + */ ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate; + +/** + Shows an alert view with the error of the specified request operation, if any, with a custom cancel button title and other button titles. + + @param operation The request operation. + @param delegate The alert view delegate. + @param cancelButtonTitle The title of the cancel button or nil if there is no cancel button. Using this argument is equivalent to setting the cancel button index to the value returned by invoking addButtonWithTitle: specifying this title. + @param otherButtonTitles The title of another button. Using this argument is equivalent to invoking addButtonWithTitle: with this title to add more buttons. Too many buttons can cause the alert view to scroll. For guidelines on the best ways to use an alert in an app, see "Temporary Views". Titles of additional buttons to add to the receiver, terminated with `nil`. + */ ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m new file mode 100644 index 000000000..b7e2a26cb --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m @@ -0,0 +1,111 @@ +// UIAlertView+AFNetworking.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIAlertView+AFNetworking.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLConnectionOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static void AFGetAlertViewTitleAndMessageFromError(NSError *error, NSString * __autoreleasing *title, NSString * __autoreleasing *message) { + if (error.localizedDescription && (error.localizedRecoverySuggestion || error.localizedFailureReason)) { + *title = error.localizedDescription; + + if (error.localizedRecoverySuggestion) { + *message = error.localizedRecoverySuggestion; + } else { + *message = error.localizedFailureReason; + } + } else if (error.localizedDescription) { + *title = NSLocalizedStringFromTable(@"Error", @"AFNetworking", @"Fallback Error Description"); + *message = error.localizedDescription; + } else { + *title = NSLocalizedStringFromTable(@"Error", @"AFNetworking", @"Fallback Error Description"); + *message = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@ Error: %ld", @"AFNetworking", @"Fallback Error Failure Reason Format"), error.domain, (long)error.code]; + } +} + +@implementation UIAlertView (AFNetworking) + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate +{ + [self showAlertViewForTaskWithErrorOnCompletion:task delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlertView Cancel Button Title") otherButtonTitles:nil, nil]; +} + ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION +{ + __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingTaskDidCompleteNotification object:task queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + + NSError *error = notification.userInfo[AFNetworkingTaskDidCompleteErrorKey]; + if (error) { + NSString *title, *message; + AFGetAlertViewTitleAndMessageFromError(error, &title, &message); + + [[[UIAlertView alloc] initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil] show]; + } + + [[NSNotificationCenter defaultCenter] removeObserver:observer name:AFNetworkingTaskDidCompleteNotification object:notification.object]; + }]; +} +#endif + +#pragma mark - + ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate +{ + [self showAlertViewForRequestOperationWithErrorOnCompletion:operation delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlert View Cancel Button Title") otherButtonTitles:nil, nil]; +} + ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION +{ + __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingOperationDidFinishNotification object:operation queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + + if (notification.object && [notification.object isKindOfClass:[AFURLConnectionOperation class]]) { + NSError *error = [(AFURLConnectionOperation *)notification.object error]; + if (error) { + NSString *title, *message; + AFGetAlertViewTitleAndMessageFromError(error, &title, &message); + + [[[UIAlertView alloc] initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil] show]; + } + } + + [[NSNotificationCenter defaultCenter] removeObserver:observer name:AFNetworkingOperationDidFinishNotification object:notification.object]; + }]; +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h new file mode 100644 index 000000000..e6ed6de04 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1,181 @@ +// UIButton+AFNetworking.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@protocol AFURLResponseSerialization, AFImageCache; + +/** + This category adds methods to the UIKit framework's `UIButton` class. The methods in this category provide support for loading remote images and background images asynchronously from a URL. + + @warning Compound values for control `state` (such as `UIControlStateHighlighted | UIControlStateDisabled`) are unsupported. + */ +@interface UIButton (AFNetworking) + +///---------------------------- +/// @name Accessing Image Cache +///---------------------------- + +/** + The image cache used to improve image loadiing performance on scroll views. By default, `UIButton` will use the `sharedImageCache` of `UIImageView`. + */ ++ (id )sharedImageCache; + +/** + Set the cache used for image loading. + + @param imageCache The image cache. + */ ++ (void)setSharedImageCache:(id )imageCache; + +///------------------------------------ +/// @name Accessing Response Serializer +///------------------------------------ + +/** + The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. + + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer + */ +@property (nonatomic, strong) id imageResponseSerializer; + +///-------------------- +/// @name Setting Image +///-------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the image request. + */ +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the button will not change its image until the image request finishes. + */ +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the button before returning. If no success block is specified, the default behavior of setting the image with `setImage:forState:` is applied. + + @param state The control state. + @param urlRequest The URL request used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the button will not change its image until the image request finishes. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes two arguments: the server response and the image. If the image was returned from cache, the request and response parameters will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)setImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure; + + +///------------------------------- +/// @name Setting Background Image +///------------------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it as the background image for the specified state once the request is finished. Any previous background image request for the receiver will be cancelled. + + If the background image is cached locally, the background image is set immediately, otherwise the specified placeholder background image will be set immediately, and then the remote background image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the background image request. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it as the background image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the background image request. + @param placeholderImage The background image to be set initially, until the background image request finishes. If `nil`, the button will not change its background image until the background image request finishes. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the button before returning. If no success block is specified, the default behavior of setting the image with `setBackgroundImage:forState:` is applied. + + @param state The control state. + @param urlRequest The URL request used for the image request. + @param placeholderImage The background image to be set initially, until the background image request finishes. If `nil`, the button will not change its background image until the background image request finishes. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure; + + +///------------------------------ +/// @name Canceling Image Loading +///------------------------------ + +/** + Cancels any executing image operation for the specified control state of the receiver, if one exists. + + @param state The control state. + */ +- (void)cancelImageRequestOperationForState:(UIControlState)state; + +/** + Cancels any executing background image operation for the specified control state of the receiver, if one exists. + + @param state The control state. + */ +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m new file mode 100644 index 000000000..a225290a2 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m @@ -0,0 +1,293 @@ +// UIButton+AFNetworking.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIButton+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLResponseSerialization.h" +#import "AFHTTPRequestOperation.h" + +#import "UIImageView+AFNetworking.h" + +@interface UIButton (_AFNetworking) +@end + +@implementation UIButton (_AFNetworking) + ++ (NSOperationQueue *)af_sharedImageRequestOperationQueue { + static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; + _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + }); + + return _af_sharedImageRequestOperationQueue; +} + +#pragma mark - + +static char AFImageRequestOperationNormal; +static char AFImageRequestOperationHighlighted; +static char AFImageRequestOperationSelected; +static char AFImageRequestOperationDisabled; + +static const char * af_imageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_imageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_imageRequestOperationKeyForState(state)); +} + +- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_imageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +static char AFBackgroundImageRequestOperationNormal; +static char AFBackgroundImageRequestOperationHighlighted; +static char AFBackgroundImageRequestOperationSelected; +static char AFBackgroundImageRequestOperationDisabled; + +static const char * af_backgroundImageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFBackgroundImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFBackgroundImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFBackgroundImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFBackgroundImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_backgroundImageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state)); +} + +- (void)af_setBackgroundImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIButton (AFNetworking) + ++ (id )sharedImageCache { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: [UIImageView sharedImageCache]; +#pragma clang diagnostic pop +} + ++ (void)setSharedImageCache:(id )imageCache { + objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (id )imageResponseSerializer { + static id _af_defaultImageResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultImageResponseSerializer = [AFImageResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(imageResponseSerializer)) ?: _af_defaultImageResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setImageResponseSerializer:(id )serializer { + objc_setAssociatedObject(self, @selector(imageResponseSerializer), serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + [self setImage:cachedImage forState:state]; + } + + [self af_setImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + imageRequestOperation.responseSerializer = self.imageResponseSerializer; + [imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setImage:responseObject forState:state]; + } + } + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.response URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setImageRequestOperation:imageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:imageRequestOperation]; + } +} + +#pragma mark - + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setBackgroundImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setBackgroundImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelBackgroundImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + [self setBackgroundImage:cachedImage forState:state]; + } + + [self af_setBackgroundImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setBackgroundImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *backgroundImageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + backgroundImageRequestOperation.responseSerializer = self.imageResponseSerializer; + [backgroundImageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setBackgroundImage:responseObject forState:state]; + } + } + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.response URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setBackgroundImageRequestOperation:backgroundImageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:backgroundImageRequestOperation]; + } +} + +#pragma mark - + +- (void)cancelImageRequestOperationForState:(UIControlState)state { + [[self af_imageRequestOperationForState:state] cancel]; + [self af_setImageRequestOperation:nil forState:state]; +} + +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state { + [[self af_backgroundImageRequestOperationForState:state] cancel]; + [self af_setBackgroundImageRequestOperation:nil forState:state]; +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h new file mode 100644 index 000000000..5d523636e --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1,143 @@ +// UIImageView+AFNetworking.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@protocol AFURLResponseSerialization, AFImageCache; + +/** + This category adds methods to the UIKit framework's `UIImageView` class. The methods in this category provide support for loading remote images asynchronously from a URL. + */ +@interface UIImageView (AFNetworking) + +///---------------------------- +/// @name Accessing Image Cache +///---------------------------- + +/** + The image cache used to improve image loadiing performance on scroll views. By default, this is an `NSCache` subclass conforming to the `AFImageCache` protocol, which listens for notification warnings and evicts objects accordingly. +*/ ++ (id )sharedImageCache; + +/** + Set the cache used for image loading. + + @param imageCache The image cache. + */ ++ (void)setSharedImageCache:(id )imageCache; + +///------------------------------------ +/// @name Accessing Response Serializer +///------------------------------------ + +/** + The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. + + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer + */ +@property (nonatomic, strong) id imageResponseSerializer; + +///-------------------- +/// @name Setting Image +///-------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + */ +- (void)setImageWithURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + */ +- (void)setImageWithURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the image view before returning. If no success block is specified, the default behavior of setting the image with `self.image = image` is applied. + + @param urlRequest The URL request used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the image created from the response data of request. If the image was returned from cache, the request and response parameters will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error object describing the network or parsing error that occurred. + */ +- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; + +/** + Cancels any executing image operation for the receiver, if one exists. + */ +- (void)cancelImageRequestOperation; + +@end + +#pragma mark - + +/** + The `AFImageCache` protocol is adopted by an object used to cache images loaded by the AFNetworking category on `UIImageView`. + */ +@protocol AFImageCache + +/** + Returns a cached image for the specififed request, if available. + + @param request The image request. + + @return The cached image. + */ +- (UIImage *)cachedImageForRequest:(NSURLRequest *)request; + +/** + Caches a particular image for the specified request. + + @param image The image to cache. + @param request The request to be used as a cache key. + */ +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request; +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m new file mode 100644 index 000000000..c06aa9ca4 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m @@ -0,0 +1,216 @@ +// UIImageView+AFNetworking.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIImageView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +@interface AFImageCache : NSCache +@end + +#pragma mark - + +@interface UIImageView (_AFNetworking) +@property (readwrite, nonatomic, strong, setter = af_setImageRequestOperation:) AFHTTPRequestOperation *af_imageRequestOperation; +@end + +@implementation UIImageView (_AFNetworking) + ++ (NSOperationQueue *)af_sharedImageRequestOperationQueue { + static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; + _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + }); + + return _af_sharedImageRequestOperationQueue; +} + +- (AFHTTPRequestOperation *)af_imageRequestOperation { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_imageRequestOperation)); +} + +- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation { + objc_setAssociatedObject(self, @selector(af_imageRequestOperation), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIImageView (AFNetworking) +@dynamic imageResponseSerializer; + ++ (id )sharedImageCache { + static AFImageCache *_af_defaultImageCache = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _af_defaultImageCache = [[AFImageCache alloc] init]; + + [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * __unused notification) { + [_af_defaultImageCache removeAllObjects]; + }]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: _af_defaultImageCache; +#pragma clang diagnostic pop +} + ++ (void)setSharedImageCache:(id )imageCache { + objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (id )imageResponseSerializer { + static id _af_defaultImageResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultImageResponseSerializer = [AFImageResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(imageResponseSerializer)) ?: _af_defaultImageResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setImageResponseSerializer:(id )serializer { + objc_setAssociatedObject(self, @selector(imageResponseSerializer), serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)setImageWithURL:(NSURL *)url { + [self setImageWithURL:url placeholderImage:nil]; +} + +- (void)setImageWithURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setImageWithURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure +{ + [self cancelImageRequestOperation]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + self.image = cachedImage; + } + + self.af_imageRequestOperation = nil; + } else { + if (placeholderImage) { + self.image = placeholderImage; + } + + __weak __typeof(self)weakSelf = self; + self.af_imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + self.af_imageRequestOperation.responseSerializer = self.imageResponseSerializer; + [self.af_imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[strongSelf.af_imageRequestOperation.request URL]]) { + if (success) { + success(urlRequest, operation.response, responseObject); + } else if (responseObject) { + strongSelf.image = responseObject; + } + + if (operation == strongSelf.af_imageRequestOperation){ + strongSelf.af_imageRequestOperation = nil; + } + } + + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[strongSelf.af_imageRequestOperation.request URL]]) { + if (failure) { + failure(urlRequest, operation.response, error); + } + + if (operation == strongSelf.af_imageRequestOperation){ + strongSelf.af_imageRequestOperation = nil; + } + } + }]; + + [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_imageRequestOperation]; + } +} + +- (void)cancelImageRequestOperation { + [self.af_imageRequestOperation cancel]; + self.af_imageRequestOperation = nil; +} + +@end + +#pragma mark - + +static inline NSString * AFImageCacheKeyFromURLRequest(NSURLRequest *request) { + return [[request URL] absoluteString]; +} + +@implementation AFImageCache + +- (UIImage *)cachedImageForRequest:(NSURLRequest *)request { + switch ([request cachePolicy]) { + case NSURLRequestReloadIgnoringCacheData: + case NSURLRequestReloadIgnoringLocalAndRemoteCacheData: + return nil; + default: + break; + } + + return [self objectForKey:AFImageCacheKeyFromURLRequest(request)]; +} + +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request +{ + if (image && request) { + [self setObject:image forKey:AFImageCacheKeyFromURLRequest(request)]; + } +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h new file mode 100644 index 000000000..94082f6cb --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1,38 @@ +// UIKit+AFNetworking.h +// +// Copyright (c) 2013 AFNetworking (http://afnetworking.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#ifndef _UIKIT_AFNETWORKING_ + #define _UIKIT_AFNETWORKING_ + + #import "AFNetworkActivityIndicatorManager.h" + + #import "UIActivityIndicatorView+AFNetworking.h" + #import "UIAlertView+AFNetworking.h" + #import "UIButton+AFNetworking.h" + #import "UIImageView+AFNetworking.h" + #import "UIKit+AFNetworking.h" + #import "UIProgressView+AFNetworking.h" + #import "UIRefreshControl+AFNetworking.h" + #import "UIWebView+AFNetworking.h" +#endif /* _UIKIT_AFNETWORKING_ */ diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h new file mode 100644 index 000000000..3f1bc086f --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1,88 @@ +// UIProgressView+AFNetworking.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIProgressView` class. The methods in this category provide support for binding the progress to the upload and download progress of a session task or request operation. + */ +@interface UIProgressView (AFNetworking) + +///------------------------------------ +/// @name Setting Session Task Progress +///------------------------------------ + +/** + Binds the progress to the upload progress of the specified session task. + + @param task The session task. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task + animated:(BOOL)animated; +#endif + +/** + Binds the progress to the download progress of the specified session task. + + @param task The session task. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithDownloadProgressOfTask:(NSURLSessionDownloadTask *)task + animated:(BOOL)animated; +#endif + +///------------------------------------ +/// @name Setting Session Task Progress +///------------------------------------ + +/** + Binds the progress to the upload progress of the specified request operation. + + @param operation The request operation. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +- (void)setProgressWithUploadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated; + +/** + Binds the progress to the download progress of the specified request operation. + + @param operation The request operation. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +- (void)setProgressWithDownloadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m new file mode 100644 index 000000000..927f56d84 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m @@ -0,0 +1,183 @@ +// UIProgressView+AFNetworking.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIProgressView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLConnectionOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static void * AFTaskCountOfBytesSentContext = &AFTaskCountOfBytesSentContext; +static void * AFTaskCountOfBytesReceivedContext = &AFTaskCountOfBytesReceivedContext; + +@interface AFURLConnectionOperation (_UIProgressView) +@property (readwrite, nonatomic, copy) void (^uploadProgress)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +@property (readwrite, nonatomic, assign, setter = af_setUploadProgressAnimated:) BOOL af_uploadProgressAnimated; + +@property (readwrite, nonatomic, copy) void (^downloadProgress)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +@property (readwrite, nonatomic, assign, setter = af_setDownloadProgressAnimated:) BOOL af_downloadProgressAnimated; +@end + +@implementation AFURLConnectionOperation (_UIProgressView) +@dynamic uploadProgress; // Implemented in AFURLConnectionOperation +@dynamic af_uploadProgressAnimated; + +@dynamic downloadProgress; // Implemented in AFURLConnectionOperation +@dynamic af_downloadProgressAnimated; +@end + +#pragma mark - + +@implementation UIProgressView (AFNetworking) + +- (BOOL)af_uploadProgressAnimated { + return [(NSNumber *)objc_getAssociatedObject(self, @selector(af_uploadProgressAnimated)) boolValue]; +} + +- (void)af_setUploadProgressAnimated:(BOOL)animated { + objc_setAssociatedObject(self, @selector(af_uploadProgressAnimated), @(animated), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)af_downloadProgressAnimated { + return [(NSNumber *)objc_getAssociatedObject(self, @selector(af_downloadProgressAnimated)) boolValue]; +} + +- (void)af_setDownloadProgressAnimated:(BOOL)animated { + objc_setAssociatedObject(self, @selector(af_downloadProgressAnimated), @(animated), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task + animated:(BOOL)animated +{ + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; + [task addObserver:self forKeyPath:@"countOfBytesSent" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; + + [self af_setUploadProgressAnimated:animated]; +} + +- (void)setProgressWithDownloadProgressOfTask:(NSURLSessionDownloadTask *)task + animated:(BOOL)animated +{ + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; + [task addObserver:self forKeyPath:@"countOfBytesReceived" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; + + [self af_setDownloadProgressAnimated:animated]; +} +#endif + +#pragma mark - + +- (void)setProgressWithUploadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated +{ + __weak __typeof(self)weakSelf = self; + void (^original)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) = [operation.uploadProgress copy]; + [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { + if (original) { + original(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (totalBytesExpectedToWrite > 0) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + [strongSelf setProgress:(totalBytesWritten / (totalBytesExpectedToWrite * 1.0f)) animated:animated]; + } + }); + }]; +} + +- (void)setProgressWithDownloadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated +{ + __weak __typeof(self)weakSelf = self; + void (^original)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) = [operation.downloadProgress copy]; + [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { + if (original) { + original(bytesRead, totalBytesRead, totalBytesExpectedToRead); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (totalBytesExpectedToRead > 0) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + [strongSelf setProgress:(totalBytesRead / (totalBytesExpectedToRead * 1.0f)) animated:animated]; + } + }); + }]; +} + +#pragma mark - NSKeyValueObserving + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(__unused NSDictionary *)change + context:(void *)context +{ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + if (context == AFTaskCountOfBytesSentContext || context == AFTaskCountOfBytesReceivedContext) { + if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesSent))]) { + if ([object countOfBytesExpectedToSend] > 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setProgress:[object countOfBytesSent] / ([object countOfBytesExpectedToSend] * 1.0f) animated:self.af_uploadProgressAnimated]; + }); + } + } + + if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesReceived))]) { + if ([object countOfBytesExpectedToReceive] > 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setProgress:[object countOfBytesReceived] / ([object countOfBytesExpectedToReceive] * 1.0f) animated:self.af_downloadProgressAnimated]; + }); + } + } + + if ([keyPath isEqualToString:NSStringFromSelector(@selector(state))]) { + if ([(NSURLSessionTask *)object state] == NSURLSessionTaskStateCompleted) { + @try { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(state))]; + + if (context == AFTaskCountOfBytesSentContext) { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesSent))]; + } + + if (context == AFTaskCountOfBytesReceivedContext) { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesReceived))]; + } + } + @catch (NSException * __unused exception) {} + } + } + } +#endif +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h new file mode 100644 index 000000000..37ce772de --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1,64 @@ +// UIRefreshControl+AFNetworking.m +// +// Copyright (c) 2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIRefreshControl` class. The methods in this category provide support for automatically begining and ending refreshing depending on the loading state of a request operation or session task. + */ +@interface UIRefreshControl (AFNetworking) + +///----------------------------------- +/// @name Refreshing for Session Tasks +///----------------------------------- + +/** + Binds the refreshing state to the state of the specified task. + + @param task The task. If `nil`, automatic updating from any previously specified operation will be diabled. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task; +#endif + +///---------------------------------------- +/// @name Refreshing for Request Operations +///---------------------------------------- + +/** + Binds the refreshing state to the execution state of the specified operation. + + @param operation The operation. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m new file mode 100644 index 000000000..e266451fe --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m @@ -0,0 +1,93 @@ +// UIRefreshControl+AFNetworking.m +// +// Copyright (c) 2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIRefreshControl+AFNetworking.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +@implementation UIRefreshControl (AFNetworking) + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + + if (task) { + if (task.state == NSURLSessionTaskStateRunning) { + [self beginRefreshing]; + + [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingTaskDidResumeNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidCompleteNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidSuspendNotification object:task]; + } else { + [self endRefreshing]; + } + } +} +#endif + +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; + + if (operation) { + if (![operation isFinished]) { + if ([operation isExecuting]) { + [self beginRefreshing]; + } else { + [self endRefreshing]; + } + + [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingOperationDidStartNotification object:operation]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingOperationDidFinishNotification object:operation]; + } + } +} + +#pragma mark - + +- (void)af_beginRefreshing { + dispatch_async(dispatch_get_main_queue(), ^{ + [self beginRefreshing]; + }); +} + +- (void)af_endRefreshing { + dispatch_async(dispatch_get_main_queue(), ^{ + [self endRefreshing]; + }); +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h new file mode 100644 index 000000000..202e8f4ea --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1,83 @@ +// UIWebView+AFNetworking.h +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFHTTPRequestSerializer, AFHTTPResponseSerializer; +@protocol AFURLRequestSerialization, AFURLResponseSerialization; + +/** + This category adds methods to the UIKit framework's `UIWebView` class. The methods in this category provide increased control over the request cycle, including progress monitoring and success / failure handling. + + @discussion When using these category methods, make sure to assign `delegate` for the web view, which implements `–webView:shouldStartLoadWithRequest:navigationType:` appropriately. This allows for tapped links to be loaded through AFNetworking, and can ensure that `canGoBack` & `canGoForward` update their values correctly. + */ +@interface UIWebView (AFNetworking) + +/** + The request serializer used to serialize requests made with the `-loadRequest:...` category methods. By default, this is an instance of `AFHTTPRequestSerializer`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + The response serializer used to serialize responses made with the `-loadRequest:...` category methods. By default, this is an instance of `AFHTTPResponseSerializer`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + Asynchronously loads the specified request. + + @param request A URL request identifying the location of the content to load. This must not be `nil`. + @param progress A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + @param success A block object to be executed when the request finishes loading successfully. This block returns the HTML string to be loaded by the web view, and takes two arguments: the response, and the response string. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)loadRequest:(NSURLRequest *)request + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success + failure:(void (^)(NSError *error))failure; + +/** + Asynchronously loads the data associated with a particular request with a specified MIME type and text encoding. + + @param request A URL request identifying the location of the content to load. This must not be `nil`. + @param MIMEType The MIME type of the content. Defaults to the content type of the response if not specified. + @param textEncodingName The IANA encoding name, as in `utf-8` or `utf-16`. Defaults to the response text encoding if not specified. + @param progress A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + @param success A block object to be executed when the request finishes loading successfully. This block returns the data to be loaded by the web view and takes two arguments: the response, and the downloaded data. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)loadRequest:(NSURLRequest *)request + MIMEType:(NSString *)MIMEType + textEncodingName:(NSString *)textEncodingName + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSData * (^)(NSHTTPURLResponse *response, NSData *data))success + failure:(void (^)(NSError *error))failure; + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m new file mode 100644 index 000000000..525d02aea --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m @@ -0,0 +1,151 @@ +// UIWebView+AFNetworking.m +// +// Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIWebView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" + +@interface UIWebView (_AFNetworking) +@property (readwrite, nonatomic, strong, setter = af_setHTTPRequestOperation:) AFHTTPRequestOperation *af_HTTPRequestOperation; +@end + +@implementation UIWebView (_AFNetworking) + +- (AFHTTPRequestOperation *)af_HTTPRequestOperation { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_HTTPRequestOperation)); +} + +- (void)af_setHTTPRequestOperation:(AFHTTPRequestOperation *)operation { + objc_setAssociatedObject(self, @selector(af_HTTPRequestOperation), operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIWebView (AFNetworking) + +- (AFHTTPRequestSerializer *)requestSerializer { + static AFHTTPRequestSerializer *_af_defaultRequestSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultRequestSerializer = [AFHTTPRequestSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(requestSerializer)) ?: _af_defaultRequestSerializer; +#pragma clang diagnostic pop +} + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + objc_setAssociatedObject(self, @selector(requestSerializer), requestSerializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (AFHTTPResponseSerializer *)responseSerializer { + static AFHTTPResponseSerializer *_af_defaultResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultResponseSerializer = [AFHTTPResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(responseSerializer)) ?: _af_defaultResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + objc_setAssociatedObject(self, @selector(responseSerializer), responseSerializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)loadRequest:(NSURLRequest *)request + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success + failure:(void (^)(NSError *error))failure +{ + [self loadRequest:request MIMEType:nil textEncodingName:nil progress:progress success:^NSData *(NSHTTPURLResponse *response, NSData *data) { + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + if (response.textEncodingName) { + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName); + if (encoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding); + } + } + + NSString *string = [[NSString alloc] initWithData:data encoding:stringEncoding]; + if (success) { + string = success(response, string); + } + + return [string dataUsingEncoding:stringEncoding]; + } failure:failure]; +} + +- (void)loadRequest:(NSURLRequest *)request + MIMEType:(NSString *)MIMEType + textEncodingName:(NSString *)textEncodingName + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSData * (^)(NSHTTPURLResponse *response, NSData *data))success + failure:(void (^)(NSError *error))failure +{ + NSParameterAssert(request); + + if (self.af_HTTPRequestOperation) { + [self.af_HTTPRequestOperation cancel]; + } + + request = [self.requestSerializer requestBySerializingRequest:request withParameters:nil error:nil]; + + self.af_HTTPRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + self.af_HTTPRequestOperation.responseSerializer = self.responseSerializer; + + __weak __typeof(self)weakSelf = self; + [self.af_HTTPRequestOperation setDownloadProgressBlock:progress]; + [self.af_HTTPRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id __unused responseObject) { + NSData *data = success ? success(operation.response, operation.responseData) : operation.responseData; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + __strong __typeof(weakSelf) strongSelf = weakSelf; + [strongSelf loadData:data MIMEType:(MIMEType ?: [operation.response MIMEType]) textEncodingName:(textEncodingName ?: [operation.response textEncodingName]) baseURL:[operation.response URL]]; +#pragma clang diagnostic pop + } failure:^(AFHTTPRequestOperation * __unused operation, NSError *error) { + if (failure) { + failure(error); + } + }]; + + [self.af_HTTPRequestOperation start]; +} + +@end + +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h new file mode 120000 index 000000000..ac762c823 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperation.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h new file mode 120000 index 000000000..9dcc623c6 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h new file mode 120000 index 000000000..56feb9fb8 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPSessionManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 120000 index 000000000..67519d984 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h new file mode 120000 index 000000000..68fc7744f --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworkReachabilityManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworking.h new file mode 120000 index 000000000..a5a38da7d --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h new file mode 120000 index 000000000..fd1322db9 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFSecurityPolicy.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h new file mode 120000 index 000000000..d9b35fb75 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLConnectionOperation.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h new file mode 120000 index 000000000..ca8209b81 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLRequestSerialization.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h new file mode 120000 index 000000000..e36a765d8 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLResponseSerialization.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h new file mode 120000 index 000000000..835101de7 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/AFURLSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLSessionManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 120000 index 000000000..c534ebfb0 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h new file mode 120000 index 000000000..f99281338 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h new file mode 120000 index 000000000..8f2e22193 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h new file mode 120000 index 000000000..a95d67380 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h new file mode 120000 index 000000000..95017cce5 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h new file mode 120000 index 000000000..730b167dc --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h new file mode 120000 index 000000000..8efd82620 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h new file mode 120000 index 000000000..c8df6ef17 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Private/AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h new file mode 120000 index 000000000..ac762c823 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperation.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h new file mode 120000 index 000000000..9dcc623c6 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h new file mode 120000 index 000000000..56feb9fb8 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPSessionManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 120000 index 000000000..67519d984 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h new file mode 120000 index 000000000..68fc7744f --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworkReachabilityManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworking.h new file mode 120000 index 000000000..a5a38da7d --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h new file mode 120000 index 000000000..fd1322db9 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFSecurityPolicy.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h new file mode 120000 index 000000000..d9b35fb75 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLConnectionOperation.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h new file mode 120000 index 000000000..ca8209b81 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLRequestSerialization.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h new file mode 120000 index 000000000..e36a765d8 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLResponseSerialization.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h new file mode 120000 index 000000000..835101de7 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLSessionManager.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 120000 index 000000000..c534ebfb0 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h new file mode 120000 index 000000000..f99281338 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h new file mode 120000 index 000000000..8f2e22193 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h new file mode 120000 index 000000000..a95d67380 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h new file mode 120000 index 000000000..95017cce5 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h new file mode 120000 index 000000000..730b167dc --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h new file mode 120000 index 000000000..8efd82620 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h new file mode 120000 index 000000000..c8df6ef17 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Manifest.lock b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Manifest.lock new file mode 100644 index 000000000..c3fbbd33b --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Manifest.lock @@ -0,0 +1,30 @@ +PODS: + - AFNetworking (2.5.0): + - AFNetworking/NSURLConnection (= 2.5.0) + - AFNetworking/NSURLSession (= 2.5.0) + - AFNetworking/Reachability (= 2.5.0) + - AFNetworking/Security (= 2.5.0) + - AFNetworking/Serialization (= 2.5.0) + - AFNetworking/UIKit (= 2.5.0) + - AFNetworking/NSURLConnection (2.5.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.5.0): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.5.0) + - AFNetworking/Security (2.5.0) + - AFNetworking/Serialization (2.5.0) + - AFNetworking/UIKit (2.5.0): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + +DEPENDENCIES: + - AFNetworking (= 2.5.0) + +SPEC CHECKSUMS: + AFNetworking: 96ac9bf3eda33582701cb1fcc5b896aa1e20311e + +COCOAPODS: 0.37.0 diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Pods.xcodeproj/project.pbxproj b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 000000000..27db8eaff --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,906 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 05F10BA864A937B79CEF7AB7 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 5447FF01A06FD20A36A2E25D /* AFURLRequestSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 07109DEE2D3CCAC6E27FF610 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 49BC80768F1ECB71168E4F0E /* AFNetworkReachabilityManager.h */; }; + 07C1C70C97F4B12085CF9B54 /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = CEA9DC40500CC7C2D1322784 /* UIImageView+AFNetworking.h */; }; + 09696F6B38AF4AA07130BDA5 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 49BC80768F1ECB71168E4F0E /* AFNetworkReachabilityManager.h */; }; + 0B0AC3DCF875ACE1AB25DB06 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 497A151ED83BFF5C3E5B595D /* AFSecurityPolicy.h */; }; + 0D8DD2899735197CB2EDFC53 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BF517ABC8323C43878EE5182 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m */; }; + 0ED74CA078B559E46733EB86 /* AFHTTPRequestOperationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F35D08450536F79059CA3B8F /* AFHTTPRequestOperationManager.h */; }; + 111FA2DCCECDC450CCE86B79 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D0F6E023E9623249382E1A8 /* UIProgressView+AFNetworking.h */; }; + 12614473A129EE388A04B562 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F35939851ED38CB5738C6911 /* AFNetworkReachabilityManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 1A69E8016FF6786724EA2DA5 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 5447FF01A06FD20A36A2E25D /* AFURLRequestSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 1B0340808D17594E7E20416E /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E571E4A2307F50521384E71 /* AFURLResponseSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 20CD2FEFF175371C94C52D11 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 093C199AD28717A653273DE0 /* AFHTTPSessionManager.h */; }; + 25142432152E0D0FC54821E0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88C39391AEC2A6F4CE298276 /* Foundation.framework */; }; + 2A341F22AECC9350634749A9 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = D0B40D3B78D919B1D19604BC /* UIProgressView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 2B8F7B192A59BAAF912AE712 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 551B551AA3280D6BA8335A95 /* UIActivityIndicatorView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 37C0EFD701AE7760758BD7DC /* AFHTTPRequestOperationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F35D08450536F79059CA3B8F /* AFHTTPRequestOperationManager.h */; }; + 3BB9707D34A1B32642EB71FF /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51BD7E303C7824651C140D50 /* Security.framework */; }; + 3F7B393D7F0475C76239AEF5 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 497A151ED83BFF5C3E5B595D /* AFSecurityPolicy.h */; }; + 44648DED9CBCDDE10E27F589 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C156A7437E431745406C066 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 4702916A49A441A9A944E912 /* AFURLConnectionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 57ADF24AEC45DB9B5B2B88EA /* AFURLConnectionOperation.h */; }; + 4870AB9943E61FC2D614B70D /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 6015221E4A360237C44A8015 /* AFURLResponseSerialization.h */; }; + 4900C036A4BF4E5C2EA93B03 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F35939851ED38CB5738C6911 /* AFNetworkReachabilityManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 4F01C6D7B6853EF4AA5B65C0 /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DC2B2A5E77746321B51034D /* UIActivityIndicatorView+AFNetworking.h */; }; + 50C3B855E98EA0044351A87B /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = C024B152BB38AA08EF79BCA1 /* UIButton+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 522A96083A107EBDABC5A8E3 /* AFHTTPRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 505424A140C5A8E367324EB7 /* AFHTTPRequestOperation.h */; }; + 543C00C69B2B794A949F073F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD3A78B755B763DA38819067 /* Security.framework */; }; + 578705629C31E0FC3C99ACB5 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CEE8864C15957F177F3E032 /* AFURLRequestSerialization.h */; }; + 58C2691912FAE6112F221A24 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E08739E866C3624A421F65 /* AFNetworking.h */; }; + 5D38932376ACB1D542540DE8 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E08739E866C3624A421F65 /* AFNetworking.h */; }; + 5FFE1317E23BD6A2F1739550 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C3004FE78D278EBD2159B2D /* UIImageView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 63359255DE4DAB8D48D8398A /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A54E4650469C5E299F0D89E /* AFHTTPRequestOperationManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 6F1F3338B6C18B4B6A5FF672 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D2AC08FFF124E07A01EAFC2 /* CoreServices.framework */; }; + 754E33A6C10F46A7A36092D8 /* AFHTTPRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 505424A140C5A8E367324EB7 /* AFHTTPRequestOperation.h */; }; + 77D3C6F11D2CA0A86A3EAF29 /* Pods-OHHTTPStubs Mac Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 321953436B9349FCF7BF8964 /* Pods-OHHTTPStubs Mac Tests-dummy.m */; }; + 81ADB8C804615D4048C91FDD /* Pods-OHHTTPStubs iOS Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D83EBBF184D064CDAD710A40 /* Pods-OHHTTPStubs iOS Tests-dummy.m */; }; + 85B667118C68BEDF6F983AFC /* UIAlertView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = ED516141A9266AEAAD48B422 /* UIAlertView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 8763C4B08BB723B01752ED7A /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D4DADF799A34500A06BD78A /* SystemConfiguration.framework */; }; + 88512D9EC7516213FBEEDFE1 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D78D241677420BC40EAB1666 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 8F6FABABA39F6EB2B25939F3 /* AFHTTPRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D78D241677420BC40EAB1666 /* AFHTTPRequestOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 92DADB41EC0F2CE69047AB84 /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 560D9D22979DFBE868DEDD88 /* UIRefreshControl+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 932CE4581D3CC4B038CCDC7B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FA4BA2FEF754E9D702A1150 /* Cocoa.framework */; }; + 94ABFD6DD946F56D219ADC22 /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 3915011C479A0B120388E604 /* UIWebView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 96F3BAB009B5A271F0A4CAD7 /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ACAD995D17054176A5526B8 /* AFSecurityPolicy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 9A5155FDA741A40E62176688 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 55B5C6EAB2939CF9557557FB /* AFNetworkActivityIndicatorManager.h */; }; + 9B3D20C65197332A7B9D7A10 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CB595356B57E21F6B502D2 /* AFHTTPSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + 9EF6386D389001640865A6A0 /* UIAlertView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F23E7994981C3DACAAF7E45C /* UIAlertView+AFNetworking.h */; }; + A89EEDF58A1E524677F157AA /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 6015221E4A360237C44A8015 /* AFURLResponseSerialization.h */; }; + AB53CB4E94CC50F54326D9EC /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F8B3CC903D3CB9DDE04B17D4 /* UIButton+AFNetworking.h */; }; + B15E5A587912F49A725192DA /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ACAD995D17054176A5526B8 /* AFSecurityPolicy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + B24CEF9198BE0DFD988FFCC8 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E3CB595356B57E21F6B502D2 /* AFHTTPSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + B917CE9E60F38DA6AE956D10 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 227A9F36B3754E843BA612D4 /* AFURLSessionManager.h */; }; + BEE8719A65D2BF151C8FF1B1 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C156A7437E431745406C066 /* AFURLConnectionOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + BF4EA978E0DB56CAF0A3D751 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 910E02E98AB0087421897E08 /* MobileCoreServices.framework */; }; + C494DB10D68900498C06D033 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F4090349D8B910197D7DF11F /* Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m */; }; + CCBEB7124FE5B8E0772ACFBD /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FD3A50893C3DD6D814913A1 /* UIRefreshControl+AFNetworking.h */; }; + D1803A9D2201964C36D553F2 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B303111D0141201348C4833 /* AFURLSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + D348E2D2580AA24B5E35DAC0 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7581CD963368C82A3138112D /* SystemConfiguration.framework */; }; + D999D52BA23C8B7FC607D108 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E983A5C6230930CDB296DFA /* UIKit+AFNetworking.h */; }; + E2ED8AB618422BC864886DCB /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 093C199AD28717A653273DE0 /* AFHTTPSessionManager.h */; }; + E36FCA4D3E27E2FFA7E5A27B /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 762E066FFCD8D46681603BBB /* AFNetworkActivityIndicatorManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + E4DD261A8784962967035ABE /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B303111D0141201348C4833 /* AFURLSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + E660CA7196C3AE15DA966314 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 739C1918DF54A0F91712A4A6 /* CoreGraphics.framework */; }; + EC557A30CAD5634B82D54AED /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 227A9F36B3754E843BA612D4 /* AFURLSessionManager.h */; }; + F04762E2C44454C499EA9042 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E571E4A2307F50521384E71 /* AFURLResponseSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + F21FECFE160DC8796FCF20ED /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FA4BA2FEF754E9D702A1150 /* Cocoa.framework */; }; + F4F2BA5E80803A456F424CA8 /* AFHTTPRequestOperationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A54E4650469C5E299F0D89E /* AFHTTPRequestOperationManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-checker -Xanalyzer deadcode"; }; }; + F558FDD298AA8E37CD4AD341 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88C39391AEC2A6F4CE298276 /* Foundation.framework */; }; + F6043955003537905B134B62 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CEE8864C15957F177F3E032 /* AFURLRequestSerialization.h */; }; + FA6A84FB2D6AF1D3183C1373 /* AFURLConnectionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 57ADF24AEC45DB9B5B2B88EA /* AFURLConnectionOperation.h */; }; + FEFED9420F6A72FB3F123BF5 /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ABBA795C17AC61F960788BE /* UIWebView+AFNetworking.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C627703060BD61C91F2A4C64 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E0DDD61A0770FF4B6366DB86 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 11C6440715C5C37466193A71; + remoteInfo = "Pods-OHHTTPStubs Mac Tests-AFNetworking"; + }; + F877A0D43CD157C66D5C6BB5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E0DDD61A0770FF4B6366DB86 /* Project object */; + proxyType = 1; + remoteGlobalIDString = FFE6CE2F3BF00868F830AF0D; + remoteInfo = "Pods-OHHTTPStubs iOS Tests-AFNetworking"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00B451C5114FF92A77CC1279 /* libPods-OHHTTPStubs Mac Tests-AFNetworking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OHHTTPStubs Mac Tests-AFNetworking.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 093C199AD28717A653273DE0 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; + 0B163EB111AF4BAF3759BBA1 /* Pods-OHHTTPStubs iOS Tests-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OHHTTPStubs iOS Tests-environment.h"; sourceTree = ""; }; + 14337C81A6290F7C528EA00B /* Pods-OHHTTPStubs iOS Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OHHTTPStubs iOS Tests-acknowledgements.plist"; sourceTree = ""; }; + 19D183DE47274EDE451A5BC5 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig"; path = "../Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig"; sourceTree = ""; }; + 1D4DADF799A34500A06BD78A /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 1EDD5C86339F3D8A90DEEAD3 /* Pods-OHHTTPStubs iOS Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-OHHTTPStubs iOS Tests-acknowledgements.markdown"; sourceTree = ""; }; + 21559B0A80457F825BA4C039 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 227A9F36B3754E843BA612D4 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; + 274F152996A2D6D92762AAFC /* Pods-OHHTTPStubs Mac Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs Mac Tests.debug.xcconfig"; sourceTree = ""; }; + 29D3CFBC625C8949354A4766 /* Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig"; sourceTree = ""; }; + 2E983A5C6230930CDB296DFA /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; + 321953436B9349FCF7BF8964 /* Pods-OHHTTPStubs Mac Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OHHTTPStubs Mac Tests-dummy.m"; sourceTree = ""; }; + 3915011C479A0B120388E604 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; + 3CEE8864C15957F177F3E032 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; + 3DC2B2A5E77746321B51034D /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + 3F8FF92F806E569F09F7C3CD /* Pods-OHHTTPStubs Mac Tests-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OHHTTPStubs Mac Tests-environment.h"; sourceTree = ""; }; + 42A5AD26F924F2FB09A7D68A /* Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig"; path = "../Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig"; sourceTree = ""; }; + 497A151ED83BFF5C3E5B595D /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; + 49BC80768F1ECB71168E4F0E /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; + 4B303111D0141201348C4833 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; + 4D7F0273765019AA5DEE864D /* Pods-OHHTTPStubs Mac Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-OHHTTPStubs Mac Tests-resources.sh"; sourceTree = ""; }; + 4E571E4A2307F50521384E71 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; + 4FD3A50893C3DD6D814913A1 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; + 505424A140C5A8E367324EB7 /* AFHTTPRequestOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPRequestOperation.h; path = AFNetworking/AFHTTPRequestOperation.h; sourceTree = ""; }; + 51BD7E303C7824651C140D50 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 5447FF01A06FD20A36A2E25D /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; + 551B551AA3280D6BA8335A95 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; + 55B5C6EAB2939CF9557557FB /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; + 560D9D22979DFBE868DEDD88 /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + 57ADF24AEC45DB9B5B2B88EA /* AFURLConnectionOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLConnectionOperation.h; path = AFNetworking/AFURLConnectionOperation.h; sourceTree = ""; }; + 589F6CBD907470D4ED9E48ED /* Pods-OHHTTPStubs Mac Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-OHHTTPStubs Mac Tests-acknowledgements.markdown"; sourceTree = ""; }; + 5A54E4650469C5E299F0D89E /* AFHTTPRequestOperationManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPRequestOperationManager.m; path = AFNetworking/AFHTTPRequestOperationManager.m; sourceTree = ""; }; + 5D2AC08FFF124E07A01EAFC2 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/CoreServices.framework; sourceTree = DEVELOPER_DIR; }; + 5EA2CAEA9606CF3E2B7AC15F /* Pods-OHHTTPStubs iOS Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs iOS Tests.debug.xcconfig"; sourceTree = ""; }; + 6015221E4A360237C44A8015 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; + 6C3004FE78D278EBD2159B2D /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; + 6F25EDE9E451323B84AEED61 /* Pods-OHHTTPStubs iOS Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-OHHTTPStubs iOS Tests-resources.sh"; sourceTree = ""; }; + 739C1918DF54A0F91712A4A6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + 74DFB2792104932B42329735 /* Pods-OHHTTPStubs iOS Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs iOS Tests.release.xcconfig"; sourceTree = ""; }; + 7581CD963368C82A3138112D /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 762E066FFCD8D46681603BBB /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; + 78B46767D42DDCD769A17785 /* libPods-OHHTTPStubs iOS Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OHHTTPStubs iOS Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7ACAD995D17054176A5526B8 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; + 7C156A7437E431745406C066 /* AFURLConnectionOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLConnectionOperation.m; path = AFNetworking/AFURLConnectionOperation.m; sourceTree = ""; }; + 7D0F6E023E9623249382E1A8 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; + 88C39391AEC2A6F4CE298276 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 910E02E98AB0087421897E08 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + 9A2F6C5D14D45DCC71486040 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch"; sourceTree = ""; }; + 9ABBA795C17AC61F960788BE /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+AFNetworking.h"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.h"; sourceTree = ""; }; + 9E73E04B4EE7C8C760AE5357 /* libPods-OHHTTPStubs Mac Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OHHTTPStubs Mac Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FA4BA2FEF754E9D702A1150 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; + 9FB42624CAB24DF25D07AAE8 /* Pods-OHHTTPStubs Mac Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-OHHTTPStubs Mac Tests-acknowledgements.plist"; sourceTree = ""; }; + A6E08739E866C3624A421F65 /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; + B8CA917E680C843D80B254A4 /* Pods-OHHTTPStubs Mac Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs Mac Tests.release.xcconfig"; sourceTree = ""; }; + BE5080D59238C5D11E0B4732 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch"; path = "../Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch"; sourceTree = ""; }; + BF517ABC8323C43878EE5182 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m"; path = "../Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m"; sourceTree = ""; }; + C024B152BB38AA08EF79BCA1 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; + CEA9DC40500CC7C2D1322784 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; + D0B40D3B78D919B1D19604BC /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; + D78D241677420BC40EAB1666 /* AFHTTPRequestOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPRequestOperation.m; path = AFNetworking/AFHTTPRequestOperation.m; sourceTree = ""; }; + D83EBBF184D064CDAD710A40 /* Pods-OHHTTPStubs iOS Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OHHTTPStubs iOS Tests-dummy.m"; sourceTree = ""; }; + E3CB595356B57E21F6B502D2 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; + ED516141A9266AEAAD48B422 /* UIAlertView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAlertView+AFNetworking.m"; path = "UIKit+AFNetworking/UIAlertView+AFNetworking.m"; sourceTree = ""; }; + F23E7994981C3DACAAF7E45C /* UIAlertView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertView+AFNetworking.h"; path = "UIKit+AFNetworking/UIAlertView+AFNetworking.h"; sourceTree = ""; }; + F29ED5E808F38B9662A3D952 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig"; sourceTree = ""; }; + F35939851ED38CB5738C6911 /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; + F35D08450536F79059CA3B8F /* AFHTTPRequestOperationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPRequestOperationManager.h; path = AFNetworking/AFHTTPRequestOperationManager.h; sourceTree = ""; }; + F4090349D8B910197D7DF11F /* Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m"; sourceTree = ""; }; + F8B3CC903D3CB9DDE04B17D4 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; + FD3A78B755B763DA38819067 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + FDC42A4A088707A78177FC59 /* libPods-OHHTTPStubs iOS Tests-AFNetworking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OHHTTPStubs iOS Tests-AFNetworking.a"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 08C808FA697B8118DD3D19F9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E660CA7196C3AE15DA966314 /* CoreGraphics.framework in Frameworks */, + F558FDD298AA8E37CD4AD341 /* Foundation.framework in Frameworks */, + BF4EA978E0DB56CAF0A3D751 /* MobileCoreServices.framework in Frameworks */, + 543C00C69B2B794A949F073F /* Security.framework in Frameworks */, + 8763C4B08BB723B01752ED7A /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2F46D4BF3329AFCC2E0ABF7F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F21FECFE160DC8796FCF20ED /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6E1895CAADD4CD67C0D35599 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 932CE4581D3CC4B038CCDC7B /* Cocoa.framework in Frameworks */, + 6F1F3338B6C18B4B6A5FF672 /* CoreServices.framework in Frameworks */, + 3BB9707D34A1B32642EB71FF /* Security.framework in Frameworks */, + D348E2D2580AA24B5E35DAC0 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97EF063BB4F1B51722BEEEEE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 25142432152E0D0FC54821E0 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 05169BCB42A2EF48FE2D19D5 /* Support Files */ = { + isa = PBXGroup; + children = ( + 29D3CFBC625C8949354A4766 /* Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig */, + F29ED5E808F38B9662A3D952 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig */, + F4090349D8B910197D7DF11F /* Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m */, + 9A2F6C5D14D45DCC71486040 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch */, + 42A5AD26F924F2FB09A7D68A /* Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig */, + 19D183DE47274EDE451A5BC5 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig */, + BF517ABC8323C43878EE5182 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m */, + BE5080D59238C5D11E0B4732 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking"; + sourceTree = ""; + }; + 070A94383B2AFA6C7D3962A7 /* NSURLConnection */ = { + isa = PBXGroup; + children = ( + 505424A140C5A8E367324EB7 /* AFHTTPRequestOperation.h */, + D78D241677420BC40EAB1666 /* AFHTTPRequestOperation.m */, + F35D08450536F79059CA3B8F /* AFHTTPRequestOperationManager.h */, + 5A54E4650469C5E299F0D89E /* AFHTTPRequestOperationManager.m */, + 57ADF24AEC45DB9B5B2B88EA /* AFURLConnectionOperation.h */, + 7C156A7437E431745406C066 /* AFURLConnectionOperation.m */, + ); + name = NSURLConnection; + sourceTree = ""; + }; + 2741788D7C16E4291B3E2737 /* AFNetworking */ = { + isa = PBXGroup; + children = ( + A6E08739E866C3624A421F65 /* AFNetworking.h */, + 070A94383B2AFA6C7D3962A7 /* NSURLConnection */, + 4DF1A361DFF937F38D57611A /* NSURLSession */, + AD3758B807D8663FD2B641DA /* Reachability */, + 644025E06DD06301D572A1DD /* Security */, + AD924DCA2EFDB9F9B379AF22 /* Serialization */, + 05169BCB42A2EF48FE2D19D5 /* Support Files */, + C9A1F23AF6BE37E3FF2E4EE8 /* UIKit */, + ); + path = AFNetworking; + sourceTree = ""; + }; + 3DC5022FE56EB79029E28B86 /* Pods-OHHTTPStubs iOS Tests */ = { + isa = PBXGroup; + children = ( + 1EDD5C86339F3D8A90DEEAD3 /* Pods-OHHTTPStubs iOS Tests-acknowledgements.markdown */, + 14337C81A6290F7C528EA00B /* Pods-OHHTTPStubs iOS Tests-acknowledgements.plist */, + D83EBBF184D064CDAD710A40 /* Pods-OHHTTPStubs iOS Tests-dummy.m */, + 0B163EB111AF4BAF3759BBA1 /* Pods-OHHTTPStubs iOS Tests-environment.h */, + 6F25EDE9E451323B84AEED61 /* Pods-OHHTTPStubs iOS Tests-resources.sh */, + 5EA2CAEA9606CF3E2B7AC15F /* Pods-OHHTTPStubs iOS Tests.debug.xcconfig */, + 74DFB2792104932B42329735 /* Pods-OHHTTPStubs iOS Tests.release.xcconfig */, + ); + name = "Pods-OHHTTPStubs iOS Tests"; + path = "Target Support Files/Pods-OHHTTPStubs iOS Tests"; + sourceTree = ""; + }; + 4C7E9800525AE6821F145253 /* Pods */ = { + isa = PBXGroup; + children = ( + 2741788D7C16E4291B3E2737 /* AFNetworking */, + ); + name = Pods; + sourceTree = ""; + }; + 4DF1A361DFF937F38D57611A /* NSURLSession */ = { + isa = PBXGroup; + children = ( + 093C199AD28717A653273DE0 /* AFHTTPSessionManager.h */, + E3CB595356B57E21F6B502D2 /* AFHTTPSessionManager.m */, + 227A9F36B3754E843BA612D4 /* AFURLSessionManager.h */, + 4B303111D0141201348C4833 /* AFURLSessionManager.m */, + ); + name = NSURLSession; + sourceTree = ""; + }; + 4F22DE6DD75BB25D57A6F08C = { + isa = PBXGroup; + children = ( + 21559B0A80457F825BA4C039 /* Podfile */, + 594802449485ED7FCDA90219 /* Frameworks */, + 4C7E9800525AE6821F145253 /* Pods */, + 840E1705B7F3F6B6B5CAA8C1 /* Products */, + 76D31DB545556A7BCD8EB2F6 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 50238B3AF25CBF2261585387 /* iOS */ = { + isa = PBXGroup; + children = ( + 739C1918DF54A0F91712A4A6 /* CoreGraphics.framework */, + 88C39391AEC2A6F4CE298276 /* Foundation.framework */, + 910E02E98AB0087421897E08 /* MobileCoreServices.framework */, + FD3A78B755B763DA38819067 /* Security.framework */, + 1D4DADF799A34500A06BD78A /* SystemConfiguration.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 594802449485ED7FCDA90219 /* Frameworks */ = { + isa = PBXGroup; + children = ( + EBF9743714B11144B2AFAA6A /* OS X */, + 50238B3AF25CBF2261585387 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 644025E06DD06301D572A1DD /* Security */ = { + isa = PBXGroup; + children = ( + 497A151ED83BFF5C3E5B595D /* AFSecurityPolicy.h */, + 7ACAD995D17054176A5526B8 /* AFSecurityPolicy.m */, + ); + name = Security; + sourceTree = ""; + }; + 76D31DB545556A7BCD8EB2F6 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + D5658B605F60D854FF21EBF8 /* Pods-OHHTTPStubs Mac Tests */, + 3DC5022FE56EB79029E28B86 /* Pods-OHHTTPStubs iOS Tests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 840E1705B7F3F6B6B5CAA8C1 /* Products */ = { + isa = PBXGroup; + children = ( + 9E73E04B4EE7C8C760AE5357 /* libPods-OHHTTPStubs Mac Tests.a */, + 00B451C5114FF92A77CC1279 /* libPods-OHHTTPStubs Mac Tests-AFNetworking.a */, + 78B46767D42DDCD769A17785 /* libPods-OHHTTPStubs iOS Tests.a */, + FDC42A4A088707A78177FC59 /* libPods-OHHTTPStubs iOS Tests-AFNetworking.a */, + ); + name = Products; + sourceTree = ""; + }; + AD3758B807D8663FD2B641DA /* Reachability */ = { + isa = PBXGroup; + children = ( + 49BC80768F1ECB71168E4F0E /* AFNetworkReachabilityManager.h */, + F35939851ED38CB5738C6911 /* AFNetworkReachabilityManager.m */, + ); + name = Reachability; + sourceTree = ""; + }; + AD924DCA2EFDB9F9B379AF22 /* Serialization */ = { + isa = PBXGroup; + children = ( + 3CEE8864C15957F177F3E032 /* AFURLRequestSerialization.h */, + 5447FF01A06FD20A36A2E25D /* AFURLRequestSerialization.m */, + 6015221E4A360237C44A8015 /* AFURLResponseSerialization.h */, + 4E571E4A2307F50521384E71 /* AFURLResponseSerialization.m */, + ); + name = Serialization; + sourceTree = ""; + }; + C9A1F23AF6BE37E3FF2E4EE8 /* UIKit */ = { + isa = PBXGroup; + children = ( + 55B5C6EAB2939CF9557557FB /* AFNetworkActivityIndicatorManager.h */, + 762E066FFCD8D46681603BBB /* AFNetworkActivityIndicatorManager.m */, + 3DC2B2A5E77746321B51034D /* UIActivityIndicatorView+AFNetworking.h */, + 551B551AA3280D6BA8335A95 /* UIActivityIndicatorView+AFNetworking.m */, + F23E7994981C3DACAAF7E45C /* UIAlertView+AFNetworking.h */, + ED516141A9266AEAAD48B422 /* UIAlertView+AFNetworking.m */, + F8B3CC903D3CB9DDE04B17D4 /* UIButton+AFNetworking.h */, + C024B152BB38AA08EF79BCA1 /* UIButton+AFNetworking.m */, + CEA9DC40500CC7C2D1322784 /* UIImageView+AFNetworking.h */, + 6C3004FE78D278EBD2159B2D /* UIImageView+AFNetworking.m */, + 2E983A5C6230930CDB296DFA /* UIKit+AFNetworking.h */, + 7D0F6E023E9623249382E1A8 /* UIProgressView+AFNetworking.h */, + D0B40D3B78D919B1D19604BC /* UIProgressView+AFNetworking.m */, + 4FD3A50893C3DD6D814913A1 /* UIRefreshControl+AFNetworking.h */, + 560D9D22979DFBE868DEDD88 /* UIRefreshControl+AFNetworking.m */, + 9ABBA795C17AC61F960788BE /* UIWebView+AFNetworking.h */, + 3915011C479A0B120388E604 /* UIWebView+AFNetworking.m */, + ); + name = UIKit; + sourceTree = ""; + }; + D5658B605F60D854FF21EBF8 /* Pods-OHHTTPStubs Mac Tests */ = { + isa = PBXGroup; + children = ( + 589F6CBD907470D4ED9E48ED /* Pods-OHHTTPStubs Mac Tests-acknowledgements.markdown */, + 9FB42624CAB24DF25D07AAE8 /* Pods-OHHTTPStubs Mac Tests-acknowledgements.plist */, + 321953436B9349FCF7BF8964 /* Pods-OHHTTPStubs Mac Tests-dummy.m */, + 3F8FF92F806E569F09F7C3CD /* Pods-OHHTTPStubs Mac Tests-environment.h */, + 4D7F0273765019AA5DEE864D /* Pods-OHHTTPStubs Mac Tests-resources.sh */, + 274F152996A2D6D92762AAFC /* Pods-OHHTTPStubs Mac Tests.debug.xcconfig */, + B8CA917E680C843D80B254A4 /* Pods-OHHTTPStubs Mac Tests.release.xcconfig */, + ); + name = "Pods-OHHTTPStubs Mac Tests"; + path = "Target Support Files/Pods-OHHTTPStubs Mac Tests"; + sourceTree = ""; + }; + EBF9743714B11144B2AFAA6A /* OS X */ = { + isa = PBXGroup; + children = ( + 9FA4BA2FEF754E9D702A1150 /* Cocoa.framework */, + 5D2AC08FFF124E07A01EAFC2 /* CoreServices.framework */, + 51BD7E303C7824651C140D50 /* Security.framework */, + 7581CD963368C82A3138112D /* SystemConfiguration.framework */, + ); + name = "OS X"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 256F5FE3B2E18567D1F66C08 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 754E33A6C10F46A7A36092D8 /* AFHTTPRequestOperation.h in Headers */, + 37C0EFD701AE7760758BD7DC /* AFHTTPRequestOperationManager.h in Headers */, + 20CD2FEFF175371C94C52D11 /* AFHTTPSessionManager.h in Headers */, + 09696F6B38AF4AA07130BDA5 /* AFNetworkReachabilityManager.h in Headers */, + 5D38932376ACB1D542540DE8 /* AFNetworking.h in Headers */, + 3F7B393D7F0475C76239AEF5 /* AFSecurityPolicy.h in Headers */, + FA6A84FB2D6AF1D3183C1373 /* AFURLConnectionOperation.h in Headers */, + F6043955003537905B134B62 /* AFURLRequestSerialization.h in Headers */, + A89EEDF58A1E524677F157AA /* AFURLResponseSerialization.h in Headers */, + EC557A30CAD5634B82D54AED /* AFURLSessionManager.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A9C373A2E563593F432AD79C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 522A96083A107EBDABC5A8E3 /* AFHTTPRequestOperation.h in Headers */, + 0ED74CA078B559E46733EB86 /* AFHTTPRequestOperationManager.h in Headers */, + E2ED8AB618422BC864886DCB /* AFHTTPSessionManager.h in Headers */, + 9A5155FDA741A40E62176688 /* AFNetworkActivityIndicatorManager.h in Headers */, + 07109DEE2D3CCAC6E27FF610 /* AFNetworkReachabilityManager.h in Headers */, + 58C2691912FAE6112F221A24 /* AFNetworking.h in Headers */, + 0B0AC3DCF875ACE1AB25DB06 /* AFSecurityPolicy.h in Headers */, + 4702916A49A441A9A944E912 /* AFURLConnectionOperation.h in Headers */, + 578705629C31E0FC3C99ACB5 /* AFURLRequestSerialization.h in Headers */, + 4870AB9943E61FC2D614B70D /* AFURLResponseSerialization.h in Headers */, + B917CE9E60F38DA6AE956D10 /* AFURLSessionManager.h in Headers */, + 4F01C6D7B6853EF4AA5B65C0 /* UIActivityIndicatorView+AFNetworking.h in Headers */, + 9EF6386D389001640865A6A0 /* UIAlertView+AFNetworking.h in Headers */, + AB53CB4E94CC50F54326D9EC /* UIButton+AFNetworking.h in Headers */, + 07C1C70C97F4B12085CF9B54 /* UIImageView+AFNetworking.h in Headers */, + D999D52BA23C8B7FC607D108 /* UIKit+AFNetworking.h in Headers */, + 111FA2DCCECDC450CCE86B79 /* UIProgressView+AFNetworking.h in Headers */, + CCBEB7124FE5B8E0772ACFBD /* UIRefreshControl+AFNetworking.h in Headers */, + FEFED9420F6A72FB3F123BF5 /* UIWebView+AFNetworking.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 11C6440715C5C37466193A71 /* Pods-OHHTTPStubs Mac Tests-AFNetworking */ = { + isa = PBXNativeTarget; + buildConfigurationList = A66489F018353B6058D4D8CF /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs Mac Tests-AFNetworking" */; + buildPhases = ( + 20F1F831CA391CB98DA7148C /* Sources */, + 6E1895CAADD4CD67C0D35599 /* Frameworks */, + 256F5FE3B2E18567D1F66C08 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-OHHTTPStubs Mac Tests-AFNetworking"; + productName = "Pods-OHHTTPStubs Mac Tests-AFNetworking"; + productReference = 00B451C5114FF92A77CC1279 /* libPods-OHHTTPStubs Mac Tests-AFNetworking.a */; + productType = "com.apple.product-type.library.static"; + }; + 5A989F1DC87EA18917A83ED3 /* Pods-OHHTTPStubs Mac Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = D1FCAD37DEA7C4E61C26DF3B /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs Mac Tests" */; + buildPhases = ( + 114ABB025720040B090F8BC3 /* Sources */, + 2F46D4BF3329AFCC2E0ABF7F /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 1EA3D04C16DB6059C82BFBA1 /* PBXTargetDependency */, + ); + name = "Pods-OHHTTPStubs Mac Tests"; + productName = "Pods-OHHTTPStubs Mac Tests"; + productReference = 9E73E04B4EE7C8C760AE5357 /* libPods-OHHTTPStubs Mac Tests.a */; + productType = "com.apple.product-type.library.static"; + }; + F692E0F1F69A02A187429A81 /* Pods-OHHTTPStubs iOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = EFA235A59A8027AB996E0D6B /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs iOS Tests" */; + buildPhases = ( + 4DB617D0D63B727656D14BC6 /* Sources */, + 97EF063BB4F1B51722BEEEEE /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 0A6A94A7B2C7311729278CD0 /* PBXTargetDependency */, + ); + name = "Pods-OHHTTPStubs iOS Tests"; + productName = "Pods-OHHTTPStubs iOS Tests"; + productReference = 78B46767D42DDCD769A17785 /* libPods-OHHTTPStubs iOS Tests.a */; + productType = "com.apple.product-type.library.static"; + }; + FFE6CE2F3BF00868F830AF0D /* Pods-OHHTTPStubs iOS Tests-AFNetworking */ = { + isa = PBXNativeTarget; + buildConfigurationList = 16E1077524B3F86733F1A5AE /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs iOS Tests-AFNetworking" */; + buildPhases = ( + B84BB191C7AF13939DF58349 /* Sources */, + 08C808FA697B8118DD3D19F9 /* Frameworks */, + A9C373A2E563593F432AD79C /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-OHHTTPStubs iOS Tests-AFNetworking"; + productName = "Pods-OHHTTPStubs iOS Tests-AFNetworking"; + productReference = FDC42A4A088707A78177FC59 /* libPods-OHHTTPStubs iOS Tests-AFNetworking.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E0DDD61A0770FF4B6366DB86 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + }; + buildConfigurationList = B1768547D52EBBCE2FF93150 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 4F22DE6DD75BB25D57A6F08C; + productRefGroup = 840E1705B7F3F6B6B5CAA8C1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5A989F1DC87EA18917A83ED3 /* Pods-OHHTTPStubs Mac Tests */, + 11C6440715C5C37466193A71 /* Pods-OHHTTPStubs Mac Tests-AFNetworking */, + F692E0F1F69A02A187429A81 /* Pods-OHHTTPStubs iOS Tests */, + FFE6CE2F3BF00868F830AF0D /* Pods-OHHTTPStubs iOS Tests-AFNetworking */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 114ABB025720040B090F8BC3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 77D3C6F11D2CA0A86A3EAF29 /* Pods-OHHTTPStubs Mac Tests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 20F1F831CA391CB98DA7148C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F6FABABA39F6EB2B25939F3 /* AFHTTPRequestOperation.m in Sources */, + 63359255DE4DAB8D48D8398A /* AFHTTPRequestOperationManager.m in Sources */, + 9B3D20C65197332A7B9D7A10 /* AFHTTPSessionManager.m in Sources */, + 12614473A129EE388A04B562 /* AFNetworkReachabilityManager.m in Sources */, + B15E5A587912F49A725192DA /* AFSecurityPolicy.m in Sources */, + BEE8719A65D2BF151C8FF1B1 /* AFURLConnectionOperation.m in Sources */, + 05F10BA864A937B79CEF7AB7 /* AFURLRequestSerialization.m in Sources */, + 1B0340808D17594E7E20416E /* AFURLResponseSerialization.m in Sources */, + D1803A9D2201964C36D553F2 /* AFURLSessionManager.m in Sources */, + C494DB10D68900498C06D033 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4DB617D0D63B727656D14BC6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81ADB8C804615D4048C91FDD /* Pods-OHHTTPStubs iOS Tests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B84BB191C7AF13939DF58349 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 88512D9EC7516213FBEEDFE1 /* AFHTTPRequestOperation.m in Sources */, + F4F2BA5E80803A456F424CA8 /* AFHTTPRequestOperationManager.m in Sources */, + B24CEF9198BE0DFD988FFCC8 /* AFHTTPSessionManager.m in Sources */, + E36FCA4D3E27E2FFA7E5A27B /* AFNetworkActivityIndicatorManager.m in Sources */, + 4900C036A4BF4E5C2EA93B03 /* AFNetworkReachabilityManager.m in Sources */, + 96F3BAB009B5A271F0A4CAD7 /* AFSecurityPolicy.m in Sources */, + 44648DED9CBCDDE10E27F589 /* AFURLConnectionOperation.m in Sources */, + 1A69E8016FF6786724EA2DA5 /* AFURLRequestSerialization.m in Sources */, + F04762E2C44454C499EA9042 /* AFURLResponseSerialization.m in Sources */, + E4DD261A8784962967035ABE /* AFURLSessionManager.m in Sources */, + 0D8DD2899735197CB2EDFC53 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m in Sources */, + 2B8F7B192A59BAAF912AE712 /* UIActivityIndicatorView+AFNetworking.m in Sources */, + 85B667118C68BEDF6F983AFC /* UIAlertView+AFNetworking.m in Sources */, + 50C3B855E98EA0044351A87B /* UIButton+AFNetworking.m in Sources */, + 5FFE1317E23BD6A2F1739550 /* UIImageView+AFNetworking.m in Sources */, + 2A341F22AECC9350634749A9 /* UIProgressView+AFNetworking.m in Sources */, + 92DADB41EC0F2CE69047AB84 /* UIRefreshControl+AFNetworking.m in Sources */, + 94ABFD6DD946F56D219ADC22 /* UIWebView+AFNetworking.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0A6A94A7B2C7311729278CD0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-OHHTTPStubs iOS Tests-AFNetworking"; + target = FFE6CE2F3BF00868F830AF0D /* Pods-OHHTTPStubs iOS Tests-AFNetworking */; + targetProxy = F877A0D43CD157C66D5C6BB5 /* PBXContainerItemProxy */; + }; + 1EA3D04C16DB6059C82BFBA1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-OHHTTPStubs Mac Tests-AFNetworking"; + target = 11C6440715C5C37466193A71 /* Pods-OHHTTPStubs Mac Tests-AFNetworking */; + targetProxy = C627703060BD61C91F2A4C64 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1FFF8AA98B0E9F51AF0A4CE0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5EA2CAEA9606CF3E2B7AC15F /* Pods-OHHTTPStubs iOS Tests.debug.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 377FFB69F9741DDB7D6B51A4 /* Release */ = { + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + MACOSX_DEPLOYMENT_TARGET = 10.8; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 42B00731E778630AB234053B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F29ED5E808F38B9662A3D952 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + EXECUTABLE_PREFIX = lib; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 10.8; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Debug; + }; + 4BA8335C897812C11D5A8C31 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 74DFB2792104932B42329735 /* Pods-OHHTTPStubs iOS Tests.release.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + A9A3FF96249A9958252BB1F6 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 19D183DE47274EDE451A5BC5 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + C49CFB955A1420ECBCD0BFDF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 19D183DE47274EDE451A5BC5 /* Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + C9BD9E8F4CC2D9BCDC661322 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B8CA917E680C843D80B254A4 /* Pods-OHHTTPStubs Mac Tests.release.xcconfig */; + buildSettings = { + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + EXECUTABLE_PREFIX = lib; + MACOSX_DEPLOYMENT_TARGET = 10.8; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + E2F6597E58383F288EE79539 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F29ED5E808F38B9662A3D952 /* Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig */; + buildSettings = { + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + EXECUTABLE_PREFIX = lib; + GCC_PREFIX_HEADER = "Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch"; + MACOSX_DEPLOYMENT_TARGET = 10.8; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Release; + }; + E2FCAC7CA6D459AA427B170B /* Debug */ = { + 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; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + F28053CEB69826456475093D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 274F152996A2D6D92762AAFC /* Pods-OHHTTPStubs Mac Tests.debug.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + EXECUTABLE_PREFIX = lib; + MACOSX_DEPLOYMENT_TARGET = 10.8; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 16E1077524B3F86733F1A5AE /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs iOS Tests-AFNetworking" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C49CFB955A1420ECBCD0BFDF /* Debug */, + A9A3FF96249A9958252BB1F6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A66489F018353B6058D4D8CF /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs Mac Tests-AFNetworking" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 42B00731E778630AB234053B /* Debug */, + E2F6597E58383F288EE79539 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B1768547D52EBBCE2FF93150 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E2FCAC7CA6D459AA427B170B /* Debug */, + 377FFB69F9741DDB7D6B51A4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D1FCAD37DEA7C4E61C26DF3B /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs Mac Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F28053CEB69826456475093D /* Debug */, + C9BD9E8F4CC2D9BCDC661322 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EFA235A59A8027AB996E0D6B /* Build configuration list for PBXNativeTarget "Pods-OHHTTPStubs iOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1FFF8AA98B0E9F51AF0A4CE0 /* Debug */, + 4BA8335C897812C11D5A8C31 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E0DDD61A0770FF4B6366DB86 /* Project object */; +} diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig new file mode 100644 index 000000000..a254ef11b --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-Private.xcconfig @@ -0,0 +1,6 @@ +#include "Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/AFNetworking" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_LDFLAGS = ${PODS_OHHTTPSTUBS_MAC_TESTS_AFNETWORKING_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m new file mode 100644 index 000000000..2de591a2e --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_OHHTTPStubs_Mac_Tests_AFNetworking : NSObject +@end +@implementation PodsDummy_Pods_OHHTTPStubs_Mac_Tests_AFNetworking +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch new file mode 100644 index 000000000..043318bf1 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-OHHTTPStubs Mac Tests-environment.h" diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig new file mode 100644 index 000000000..1fb0c387d --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests-AFNetworking/Pods-OHHTTPStubs Mac Tests-AFNetworking.xcconfig @@ -0,0 +1 @@ +PODS_OHHTTPSTUBS_MAC_TESTS_AFNETWORKING_OTHER_LDFLAGS = -framework "CoreServices" -framework "Security" -framework "SystemConfiguration" \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.markdown b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.markdown new file mode 100644 index 000000000..59a175087 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.markdown @@ -0,0 +1,26 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AFNetworking + +Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.plist b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.plist new file mode 100644 index 000000000..899e8ae43 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-acknowledgements.plist @@ -0,0 +1,56 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + AFNetworking + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-dummy.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-dummy.m new file mode 100644 index 000000000..f124d0bf5 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_OHHTTPStubs_Mac_Tests : NSObject +@end +@implementation PodsDummy_Pods_OHHTTPStubs_Mac_Tests +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-environment.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-environment.h new file mode 100644 index 000000000..42c1cb911 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-environment.h @@ -0,0 +1,44 @@ + +// To check if a library is compiled with CocoaPods you +// can use the `COCOAPODS` macro definition which is +// defined in the xcconfigs so it is available in +// headers also when they are imported in the client +// project. + + +// AFNetworking +#define COCOAPODS_POD_AVAILABLE_AFNetworking +#define COCOAPODS_VERSION_MAJOR_AFNetworking 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking 0 + +// AFNetworking/NSURLConnection +#define COCOAPODS_POD_AVAILABLE_AFNetworking_NSURLConnection +#define COCOAPODS_VERSION_MAJOR_AFNetworking_NSURLConnection 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_NSURLConnection 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_NSURLConnection 0 + +// AFNetworking/NSURLSession +#define COCOAPODS_POD_AVAILABLE_AFNetworking_NSURLSession +#define COCOAPODS_VERSION_MAJOR_AFNetworking_NSURLSession 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_NSURLSession 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_NSURLSession 0 + +// AFNetworking/Reachability +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Reachability +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Reachability 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Reachability 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Reachability 0 + +// AFNetworking/Security +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Security +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Security 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Security 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Security 0 + +// AFNetworking/Serialization +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Serialization +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Serialization 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Serialization 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Serialization 0 + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-resources.sh b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-resources.sh new file mode 100755 index 000000000..43f08523e --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests-resources.sh @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY=$(cd "${1%/*}" && pwd) + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.debug.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.debug.xcconfig new file mode 100644 index 000000000..72f9cec4a --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.debug.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-OHHTTPStubs Mac Tests-AFNetworking" -framework "CoreServices" -framework "Security" -framework "SystemConfiguration" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.release.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.release.xcconfig new file mode 100644 index 000000000..72f9cec4a --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs Mac Tests/Pods-OHHTTPStubs Mac Tests.release.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-OHHTTPStubs Mac Tests-AFNetworking" -framework "CoreServices" -framework "Security" -framework "SystemConfiguration" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig new file mode 100644 index 000000000..6f4361172 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-Private.xcconfig @@ -0,0 +1,6 @@ +#include "Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/AFNetworking" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_LDFLAGS = ${PODS_OHHTTPSTUBS_IOS_TESTS_AFNETWORKING_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m new file mode 100644 index 000000000..8aa49d138 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_OHHTTPStubs_iOS_Tests_AFNetworking : NSObject +@end +@implementation PodsDummy_Pods_OHHTTPStubs_iOS_Tests_AFNetworking +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch new file mode 100644 index 000000000..80fbb8dc3 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-OHHTTPStubs iOS Tests-environment.h" diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig new file mode 100644 index 000000000..b8aeea85b --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests-AFNetworking/Pods-OHHTTPStubs iOS Tests-AFNetworking.xcconfig @@ -0,0 +1 @@ +PODS_OHHTTPSTUBS_IOS_TESTS_AFNETWORKING_OTHER_LDFLAGS = -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.markdown b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.markdown new file mode 100644 index 000000000..59a175087 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.markdown @@ -0,0 +1,26 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AFNetworking + +Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.plist b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.plist new file mode 100644 index 000000000..899e8ae43 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-acknowledgements.plist @@ -0,0 +1,56 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2013-2014 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + AFNetworking + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-dummy.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-dummy.m new file mode 100644 index 000000000..0fb6509a9 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_OHHTTPStubs_iOS_Tests : NSObject +@end +@implementation PodsDummy_Pods_OHHTTPStubs_iOS_Tests +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-environment.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-environment.h new file mode 100644 index 000000000..e1a5d47d3 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-environment.h @@ -0,0 +1,50 @@ + +// To check if a library is compiled with CocoaPods you +// can use the `COCOAPODS` macro definition which is +// defined in the xcconfigs so it is available in +// headers also when they are imported in the client +// project. + + +// AFNetworking +#define COCOAPODS_POD_AVAILABLE_AFNetworking +#define COCOAPODS_VERSION_MAJOR_AFNetworking 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking 0 + +// AFNetworking/NSURLConnection +#define COCOAPODS_POD_AVAILABLE_AFNetworking_NSURLConnection +#define COCOAPODS_VERSION_MAJOR_AFNetworking_NSURLConnection 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_NSURLConnection 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_NSURLConnection 0 + +// AFNetworking/NSURLSession +#define COCOAPODS_POD_AVAILABLE_AFNetworking_NSURLSession +#define COCOAPODS_VERSION_MAJOR_AFNetworking_NSURLSession 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_NSURLSession 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_NSURLSession 0 + +// AFNetworking/Reachability +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Reachability +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Reachability 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Reachability 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Reachability 0 + +// AFNetworking/Security +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Security +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Security 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Security 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Security 0 + +// AFNetworking/Serialization +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Serialization +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Serialization 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Serialization 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Serialization 0 + +// AFNetworking/UIKit +#define COCOAPODS_POD_AVAILABLE_AFNetworking_UIKit +#define COCOAPODS_VERSION_MAJOR_AFNetworking_UIKit 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_UIKit 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_UIKit 0 + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-resources.sh b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-resources.sh new file mode 100755 index 000000000..43f08523e --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests-resources.sh @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY=$(cd "${1%/*}" && pwd) + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.debug.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.debug.xcconfig new file mode 100644 index 000000000..89450f5b6 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.debug.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-OHHTTPStubs iOS Tests-AFNetworking" -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.release.xcconfig b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.release.xcconfig new file mode 100644 index 000000000..89450f5b6 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Pods/Target Support Files/Pods-OHHTTPStubs iOS Tests/Pods-OHHTTPStubs iOS Tests.release.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-OHHTTPStubs iOS Tests-AFNetworking" -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs+NSURLSessionConfiguration.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs+NSURLSessionConfiguration.m new file mode 100644 index 000000000..1184dcad1 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs+NSURLSessionConfiguration.m @@ -0,0 +1,71 @@ +// +// NSURLSessionConfiguration+OHHTTPStubs.m +// OHHTTPStubs +// +// Created by Olivier Halligon on 06/10/13. +// Copyright (c) 2013 AliSoftware. All rights reserved. +// + +#import + +#if defined(__IPHONE_7_0) || defined(__MAC_10_9) + +#import +#import "OHHTTPStubs.h" + + +////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * This helper is used to swizzle NSURLSessionConfiguration constructor methods + * defaultSessionConfiguration and ephemeralSessionConfiguration to insert the private + * OHHTTPStubsProtocol into their protocolClasses array so that OHHTTPStubs is automagically + * supported when you create a new NSURLSession based on one of there configurations. + */ + +typedef NSURLSessionConfiguration*(*SessionConfigConstructor)(id,SEL); +static SessionConfigConstructor orig_defaultSessionConfiguration; +static SessionConfigConstructor orig_ephemeralSessionConfiguration; + +static SessionConfigConstructor OHHTTPStubsSwizzle(SEL selector, SessionConfigConstructor newImpl) +{ + Class cls = NSURLSessionConfiguration.class; + Class metaClass = object_getClass(cls); + + Method origMethod = class_getClassMethod(cls, selector); + SessionConfigConstructor origImpl = (SessionConfigConstructor)method_getImplementation(origMethod); + if (!class_addMethod(metaClass, selector, (IMP)newImpl, method_getTypeEncoding(origMethod))) + { + method_setImplementation(origMethod, (IMP)newImpl); + } + return origImpl; +} + +static NSURLSessionConfiguration* OHHTTPStubs_defaultSessionConfiguration(id self, SEL _cmd) +{ + NSURLSessionConfiguration* config = orig_defaultSessionConfiguration(self,_cmd); // call original method + [OHHTTPStubs setEnabled:YES forSessionConfiguration:config]; //OHHTTPStubsAddProtocolClassToNSURLSessionConfiguration(config); + return config; +} + +static NSURLSessionConfiguration* OHHTTPStubs_ephemeralSessionConfiguration(id self, SEL _cmd) +{ + NSURLSessionConfiguration* config = orig_ephemeralSessionConfiguration(self,_cmd); // call original method + [OHHTTPStubs setEnabled:YES forSessionConfiguration:config]; //OHHTTPStubsAddProtocolClassToNSURLSessionConfiguration(config); + return config; +} + +@interface NSURLSessionConfiguration(OHHTTPStubsSupport) @end +@implementation NSURLSessionConfiguration(OHHTTPStubsSupport) ++(void)load +{ + orig_defaultSessionConfiguration = OHHTTPStubsSwizzle(@selector(defaultSessionConfiguration), + OHHTTPStubs_defaultSessionConfiguration); + orig_ephemeralSessionConfiguration = OHHTTPStubsSwizzle(@selector(ephemeralSessionConfiguration), + OHHTTPStubs_ephemeralSessionConfiguration); +} +@end + +#endif + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.h new file mode 100644 index 000000000..d4b85dc16 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.h @@ -0,0 +1,195 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +// For SDK 7.1 Compatibility (as this macro was only included starting SDK 8.0) +#ifndef NS_DESIGNATED_INITIALIZER + #if __has_attribute(objc_designated_initializer) + #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) + #else + #define NS_DESIGNATED_INITIALIZER + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Imports + +#import +#import "OHHTTPStubsResponse.h" +// Because this is supposed to be an umbrella header, we should import every public headers here +#import "OHHTTPStubsResponse+HTTPMessage.h" +#import "OHHTTPStubsResponse+JSON.h" +#import "OHPathHelpers.h" + +#ifdef NS_ASSUME_NONNULL_BEGIN + NS_ASSUME_NONNULL_BEGIN + #define _nullable_ __nullable + #define _nonnull_ __nonnull +#else + #define _nullable_ + #define _nonnull_ +#endif + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Types + +typedef BOOL(^OHHTTPStubsTestBlock)(NSURLRequest* request); +typedef OHHTTPStubsResponse* _nonnull_ (^OHHTTPStubsResponseBlock)( NSURLRequest* request); + +/** + * This opaque type represents an installed stub and is used to uniquely + * identify a stub once it has been created. + * + * This type is returned by the `stubRequestsPassingTest:withStubResponse:` method + * so that you can later reference it and use this reference to remove the stub later. + * + * This type also let you add arbitrary metadata to a stub to differenciate it + * more easily when debugging. + */ +@protocol OHHTTPStubsDescriptor +/** + * An arbitrary name that you can set and get to describe your stub. + * Use it as your own convenience. + * + * This is especially useful if you dump all installed stubs using `allStubs` + * or if you want to log which stubs are being triggered using `onStubActivation:`. + */ +@property(nonatomic, strong) NSString* _nullable_ name; +@end + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Interface + +/** + * Stubs Manager. Use this class to add and remove stubs and stub your network requests. + */ +@interface OHHTTPStubs : NSObject + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Adding & Removing stubs + + + +/** + * Dedicated method to add a stub + * + * @param testBlock Block that should return `YES` if the request passed as parameter + * should be stubbed with the response block, and `NO` if it should + * hit the real world (or be managed by another stub). + * @param responseBlock Block that will return the `OHHTTPStubsResponse` (response to + * use for stubbing) corresponding to the given request + * + * @return a stub descriptor that uniquely identifies the stub and can be later used to remove it with `removeStub:`. + * + * @note The returned stub descriptor is retained (`__strong` reference) by `OHHTTPStubs` + * until it is removed (with one of the `removeStub:` / `removeAllStubs` + * methods); it is thus recommended to keep it in a `__weak` storage (and not `__strong`) + * in your app code, to let the stub descriptor be destroyed and let the variable go + * back to `nil` automatically when the stub is removed. + */ ++(id)stubRequestsPassingTest:(OHHTTPStubsTestBlock)testBlock + withStubResponse:(OHHTTPStubsResponseBlock)responseBlock; + +/** + * Remove a stub from the list of stubs + * + * @param stubDesc The stub descriptor that has been returned when adding the stub + * using `stubRequestsPassingTest:withStubResponse:` + * + * @return `YES` if the stub has been successfully removed, `NO` if the parameter was + * not a valid stub identifier + */ ++(BOOL)removeStub:(id)stubDesc; + +/** + * Remove all the stubs from the stubs list. + */ ++(void)removeAllStubs; + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Disabling & Re-Enabling stubs + +/** + * Enable or disable the stubs for the shared session or for `NSURLConnection` + * + * @param enabled If `YES`, enables the stubs. If `NO`, disable all the + * stubs and let all the requests hit the real world. + * + * @note OHHTTPStubs are enabled by default, so there is no need to call + * this method with `YES` for stubs to work, except if you explicitely + * disabled the stubs before. + * + * @note This only affects requests that are further made using `NSURLConnection` + * or using `[NSURLSession sharedSession]`. This does not affect requests + * sent on an `NSURLSession` created using an `NSURLSessionConfiguration`. + */ ++(void)setEnabled:(BOOL)enabled; + +#if defined(__IPHONE_7_0) || defined(__MAC_10_9) +/** + * Enable or disable the stubs on a given `NSURLSessionConfiguration`. + * + * @param enabled If `YES`, enables the stubs for this `NSURLSessionConfiguration`. + * If `NO`, disable the stubs and let all the requests hit the real world + * @param sessionConfig The NSURLSessionConfiguration on which to enabled/disable the stubs + * + * @note OHHTTPStubs are enabled by default on newly created `defaultSessionConfiguration` + * and `ephemeralSessionConfiguration`, so there is no need to call this method with + * `YES` for stubs to work. You generally only use this if you want to disable + * `OHTTPStubs` per `NSURLSession` by calling it before building the `NSURLSession` + * with the `NSURLSessionConfiguration`. + * + * @note Important: As usual according to the way `NSURLSessionConfiguration` works, you + * MUST set this property BEFORE creating the `NSURLSession`. Once the `NSURLSession` + * object is created, they use a deep copy of the `NSURLSessionConfiguration` object + * used to create them, so changing the configuration later does not affect already + * created sessions. + */ ++ (void)setEnabled:(BOOL)enabled forSessionConfiguration:(NSURLSessionConfiguration *)sessionConfig; +#endif + +#pragma mark - Debug Methods + +/** + * List all the installed stubs + * + * @return An array of `id` objects currently installed. Useful for debug. + */ ++(NSArray*)allStubs; + +/** + * Setup a block to be called each time a stub is triggered. + * + * Useful if you want to log all your requests being stubbed for example and see which stub + * was used to respond to each request. + * + * @param block The block to call each time a request is being stubbed by OHHTTPStubs. + * Set it to `nil` to do nothing. Defaults is `nil`. + */ ++(void)onStubActivation:( void(^)(NSURLRequest* request, id stub) )block; + +@end + +#ifdef NS_ASSUME_NONNULL_END + NS_ASSUME_NONNULL_END +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.m new file mode 100644 index 000000000..4d36ae693 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.m @@ -0,0 +1,530 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +#if ! __has_feature(objc_arc) +#error This file is expected to be compiled with ARC turned ON +#endif + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Imports + +#import "OHHTTPStubs.h" + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Types & Constants + +@interface OHHTTPStubsProtocol : NSURLProtocol @end + +static NSTimeInterval const kSlotTime = 0.25; // Must be >0. We will send a chunk of the data from the stream each 'slotTime' seconds + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Private Interfaces + +@interface OHHTTPStubs() ++ (instancetype)sharedInstance; +@property(atomic, copy) NSMutableArray* stubDescriptors; +@property(atomic, copy) void (^onStubActivationBlock)(NSURLRequest*, id); +@end + +@interface OHHTTPStubsDescriptor : NSObject +@property(atomic, copy) OHHTTPStubsTestBlock testBlock; +@property(atomic, copy) OHHTTPStubsResponseBlock responseBlock; +@end + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - OHHTTPStubsDescriptor Implementation + +@implementation OHHTTPStubsDescriptor + +@synthesize name = _name; + ++(instancetype)stubDescriptorWithTestBlock:(OHHTTPStubsTestBlock)testBlock + responseBlock:(OHHTTPStubsResponseBlock)responseBlock +{ + OHHTTPStubsDescriptor* stub = [OHHTTPStubsDescriptor new]; + stub.testBlock = testBlock; + stub.responseBlock = responseBlock; + return stub; +} + +-(NSString*)description +{ + return [NSString stringWithFormat:@"<%@ %p : %@>", self.class, self, self.name]; +} + +@end + + + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - OHHTTPStubs Implementation + +@implementation OHHTTPStubs + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Singleton methods + ++ (instancetype)sharedInstance +{ + static OHHTTPStubs *sharedInstance = nil; + + static dispatch_once_t predicate; + dispatch_once(&predicate, ^{ + sharedInstance = [[self alloc] init]; + }); + + return sharedInstance; +} + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Setup & Teardown + ++ (void)initialize +{ + if (self == [OHHTTPStubs class]) + { + [self setEnabled:YES]; + } +} +- (id)init +{ + self = [super init]; + if (self) + { + _stubDescriptors = [NSMutableArray array]; + } + return self; +} + +- (void)dealloc +{ + [self.class setEnabled:NO]; +} + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Public class methods + +#pragma mark > Adding & Removing stubs + ++(id)stubRequestsPassingTest:(OHHTTPStubsTestBlock)testBlock + withStubResponse:(OHHTTPStubsResponseBlock)responseBlock +{ + OHHTTPStubsDescriptor* stub = [OHHTTPStubsDescriptor stubDescriptorWithTestBlock:testBlock + responseBlock:responseBlock]; + [OHHTTPStubs.sharedInstance addStub:stub]; + return stub; +} + ++(BOOL)removeStub:(id)stubDesc +{ + return [OHHTTPStubs.sharedInstance removeStub:stubDesc]; +} + ++(void)removeAllStubs +{ + [OHHTTPStubs.sharedInstance removeAllStubs]; +} + +#pragma mark > Disabling & Re-Enabling stubs + ++(void)setEnabled:(BOOL)enable +{ + static BOOL currentEnabledState = NO; + if (enable && !currentEnabledState) + { + [NSURLProtocol registerClass:OHHTTPStubsProtocol.class]; + } + else if (!enable && currentEnabledState) + { + [NSURLProtocol unregisterClass:OHHTTPStubsProtocol.class]; + } + currentEnabledState = enable; +} + +#if defined(__IPHONE_7_0) || defined(__MAC_10_9) ++ (void)setEnabled:(BOOL)enable forSessionConfiguration:(NSURLSessionConfiguration*)sessionConfig +{ + // Runtime check to make sure the API is available on this version + if ( [sessionConfig respondsToSelector:@selector(protocolClasses)] + && [sessionConfig respondsToSelector:@selector(setProtocolClasses:)]) + { + NSMutableArray * urlProtocolClasses = [NSMutableArray arrayWithArray:sessionConfig.protocolClasses]; + Class protoCls = OHHTTPStubsProtocol.class; + if (enable && ![urlProtocolClasses containsObject:protoCls]) + { + [urlProtocolClasses insertObject:protoCls atIndex:0]; + } + else if (!enable && [urlProtocolClasses containsObject:protoCls]) + { + [urlProtocolClasses removeObject:protoCls]; + } + sessionConfig.protocolClasses = urlProtocolClasses; + } + else + { + NSLog(@"[OHHTTPStubs] %@ is only available when running on iOS7+/OSX9+. " + @"Use conditions like 'if ([NSURLSessionConfiguration class])' to only call " + @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector(_cmd)); + } +} +#endif + +#pragma mark > Debug Methods + ++(NSArray*)allStubs +{ + return [OHHTTPStubs.sharedInstance stubDescriptors]; +} + ++(void)onStubActivation:( void(^)(NSURLRequest* request, id stub) )block +{ + [OHHTTPStubs.sharedInstance setOnStubActivationBlock:block]; +} + + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Private instance methods + +-(void)addStub:(OHHTTPStubsDescriptor*)stubDesc +{ + @synchronized(_stubDescriptors) + { + [_stubDescriptors addObject:stubDesc]; + } +} + +-(BOOL)removeStub:(id)stubDesc +{ + BOOL handlerFound = NO; + @synchronized(_stubDescriptors) + { + handlerFound = [_stubDescriptors containsObject:stubDesc]; + [_stubDescriptors removeObject:stubDesc]; + } + return handlerFound; +} + +-(void)removeAllStubs +{ + @synchronized(_stubDescriptors) + { + [_stubDescriptors removeAllObjects]; + } +} + +- (OHHTTPStubsDescriptor*)firstStubPassingTestForRequest:(NSURLRequest*)request +{ + OHHTTPStubsDescriptor* foundStub = nil; + @synchronized(_stubDescriptors) + { + for(OHHTTPStubsDescriptor* stub in _stubDescriptors.reverseObjectEnumerator) + { + if (stub.testBlock(request)) + { + foundStub = stub; + break; + } + } + } + return foundStub; +} + +@end + + + + + + + + + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Private Protocol Class + +@interface OHHTTPStubsProtocol() +@property(assign) BOOL stopped; +@property(strong) OHHTTPStubsDescriptor* stub; +@property(assign) CFRunLoopRef clientRunLoop; +- (void)executeOnClientRunLoopAfterDelay:(NSTimeInterval)delayInSeconds block:(dispatch_block_t)block; +@end + +@implementation OHHTTPStubsProtocol + ++ (BOOL)canInitWithRequest:(NSURLRequest *)request +{ + return ([OHHTTPStubs.sharedInstance firstStubPassingTestForRequest:request] != nil); +} + +- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)response client:(id)client +{ + // Make super sure that we never use a cached response. + OHHTTPStubsProtocol* proto = [super initWithRequest:request cachedResponse:nil client:client]; + proto.stub = [OHHTTPStubs.sharedInstance firstStubPassingTestForRequest:request]; + return proto; +} + ++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request +{ + return request; +} + +- (NSCachedURLResponse *)cachedResponse +{ + return nil; +} + +- (void)startLoading +{ + self.clientRunLoop = CFRunLoopGetCurrent(); + NSURLRequest* request = self.request; + id client = self.client; + + if (!self.stub) + { + NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys: + @"It seems like the stub has been removed BEFORE the response had time to be sent.", + NSLocalizedFailureReasonErrorKey, + @"For more info, see https://github.com/AliSoftware/OHHTTPStubs/wiki/OHHTTPStubs-and-asynchronous-tests", + NSLocalizedRecoverySuggestionErrorKey, + request.URL, // Stop right here if request.URL is nil + NSURLErrorFailingURLErrorKey, + nil]; + NSError* error = [NSError errorWithDomain:@"OHHTTPStubs" code:500 userInfo:userInfo]; + [client URLProtocol:self didFailWithError:error]; + return; + } + + OHHTTPStubsResponse* responseStub = self.stub.responseBlock(request); + + if (OHHTTPStubs.sharedInstance.onStubActivationBlock) + { + OHHTTPStubs.sharedInstance.onStubActivationBlock(request, self.stub); + } + + if (responseStub.error == nil) + { + NSHTTPURLResponse* urlResponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL + statusCode:responseStub.statusCode + HTTPVersion:@"HTTP/1.1" + headerFields:responseStub.httpHeaders]; + + // Cookies handling + if (request.HTTPShouldHandleCookies && request.URL) + { + NSArray* cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:responseStub.httpHeaders forURL:request.URL]; + if (cookies) + { + [NSHTTPCookieStorage.sharedHTTPCookieStorage setCookies:cookies forURL:request.URL mainDocumentURL:request.mainDocumentURL]; + } + } + + + NSString* redirectLocation = (responseStub.httpHeaders)[@"Location"]; + NSURL* redirectLocationURL; + if (redirectLocation) + { + redirectLocationURL = [NSURL URLWithString:redirectLocation]; + } + else + { + redirectLocationURL = nil; + } + if (((responseStub.statusCode > 300) && (responseStub.statusCode < 400)) && redirectLocationURL) + { + NSURLRequest* redirectRequest = [NSURLRequest requestWithURL:redirectLocationURL]; + [self executeOnClientRunLoopAfterDelay:responseStub.requestTime block:^{ + if (!self.stopped) + { + [client URLProtocol:self wasRedirectedToRequest:redirectRequest redirectResponse:urlResponse]; + } + }]; + } + else + { + [self executeOnClientRunLoopAfterDelay:responseStub.requestTime block:^{ + if (!self.stopped) + { + [client URLProtocol:self didReceiveResponse:urlResponse cacheStoragePolicy:NSURLCacheStorageNotAllowed]; + if(responseStub.inputStream.streamStatus == NSStreamStatusNotOpen) + { + [responseStub.inputStream open]; + } + [self streamDataForClient:client + withStubResponse:responseStub + completion:^(NSError * error) + { + [responseStub.inputStream close]; + if (error==nil) + { + [client URLProtocolDidFinishLoading:self]; + } + else + { + [client URLProtocol:self didFailWithError:responseStub.error]; + } + }]; + } + }]; + } + } else { + // Send the canned error + [self executeOnClientRunLoopAfterDelay:responseStub.responseTime block:^{ + if (!self.stopped) + { + [client URLProtocol:self didFailWithError:responseStub.error]; + } + }]; + } +} + +- (void)stopLoading +{ + self.stopped = YES; +} + +typedef struct { + NSTimeInterval slotTime; + double chunkSizePerSlot; + double cumulativeChunkSize; +} OHHTTPStubsStreamTimingInfo; + +- (void)streamDataForClient:(id)client + withStubResponse:(OHHTTPStubsResponse*)stubResponse + completion:(void(^)(NSError * error))completion +{ + if ((stubResponse.dataSize>0) && stubResponse.inputStream.hasBytesAvailable && (!self.stopped)) + { + // Compute timing data once and for all for this stub + + OHHTTPStubsStreamTimingInfo timingInfo = { + .slotTime = kSlotTime, // Must be >0. We will send a chunk of data from the stream each 'slotTime' seconds + .cumulativeChunkSize = 0 + }; + + if(stubResponse.responseTime < 0) + { + // Bytes send each 'slotTime' seconds = Speed in KB/s * 1000 * slotTime in seconds + timingInfo.chunkSizePerSlot = (fabs(stubResponse.responseTime) * 1000) * timingInfo.slotTime; + } + else if (stubResponse.responseTime < kSlotTime) // includes case when responseTime == 0 + { + // We want to send the whole data quicker than the slotTime, so send it all in one chunk. + timingInfo.chunkSizePerSlot = stubResponse.dataSize; + timingInfo.slotTime = stubResponse.responseTime; + } + else + { + // Bytes send each 'slotTime' seconds = (Whole size in bytes / response time) * slotTime = speed in bps * slotTime in seconds + timingInfo.chunkSizePerSlot = ((stubResponse.dataSize/stubResponse.responseTime) * timingInfo.slotTime); + } + + [self streamDataForClient:client + fromStream:stubResponse.inputStream + timingInfo:timingInfo + completion:completion]; + } + else + { + if (completion) + { + completion(nil); + } + } +} + +- (void) streamDataForClient:(id)client + fromStream:(NSInputStream*)inputStream + timingInfo:(OHHTTPStubsStreamTimingInfo)timingInfo + completion:(void(^)(NSError * error))completion +{ + NSParameterAssert(timingInfo.chunkSizePerSlot > 0); + + if (inputStream.hasBytesAvailable && (!self.stopped)) + { + // This is needed in case we computed a non-integer chunkSizePerSlot, to avoid cumulative errors + double cumulativeChunkSizeAfterRead = timingInfo.cumulativeChunkSize + timingInfo.chunkSizePerSlot; + NSUInteger chunkSizeToRead = floor(cumulativeChunkSizeAfterRead) - floor(timingInfo.cumulativeChunkSize); + timingInfo.cumulativeChunkSize = cumulativeChunkSizeAfterRead; + + if (chunkSizeToRead == 0) + { + // Nothing to read at this pass, but probably later + [self executeOnClientRunLoopAfterDelay:timingInfo.slotTime block:^{ + [self streamDataForClient:client fromStream:inputStream + timingInfo:timingInfo completion:completion]; + }]; + } else { + uint8_t* buffer = (uint8_t*)malloc(sizeof(uint8_t)*chunkSizeToRead); + NSInteger bytesRead = [inputStream read:buffer maxLength:chunkSizeToRead]; + if (bytesRead > 0) + { + NSData * data = [NSData dataWithBytes:buffer length:bytesRead]; + // Wait for 'slotTime' seconds before sending the chunk. + // If bytesRead < chunkSizePerSlot (because we are near the EOF), adjust slotTime proportionally to the bytes remaining + [self executeOnClientRunLoopAfterDelay:((double)bytesRead / (double)chunkSizeToRead) * timingInfo.slotTime block:^{ + [client URLProtocol:self didLoadData:data]; + [self streamDataForClient:client fromStream:inputStream + timingInfo:timingInfo completion:completion]; + }]; + } + else + { + if (completion) + { + // Note: We may also arrive here with no error if we were just at the end of the stream (EOF) + // In that case, hasBytesAvailable did return YES (because at the limit of OEF) but nothing were read (because EOF) + // But then in that case inputStream.streamError will be nil so that's cool, we won't return an error anyway + completion(inputStream.streamError); + } + } + free(buffer); + } + } + else + { + if (completion) + { + completion(nil); + } + } +} + +///////////////////////////////////////////// +// Delayed execution utility methods +///////////////////////////////////////////// + +- (void)executeOnClientRunLoopAfterDelay:(NSTimeInterval)delayInSeconds block:(dispatch_block_t)block +{ + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + CFRunLoopPerformBlock(self.clientRunLoop, kCFRunLoopDefaultMode, block); + CFRunLoopWakeUp(self.clientRunLoop); + }); +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h new file mode 100644 index 000000000..0ac0f6e12 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h @@ -0,0 +1,62 @@ +// +// OHHTTPStubsResponse+HTTPMessage.h +// OHHTTPStubs +// +// Created by Olivier Halligon on 01/09/13. +// Copyright (c) 2013 AliSoftware. All rights reserved. +// + +#import "OHHTTPStubsResponse.h" + +#ifdef NS_ASSUME_NONNULL_BEGIN + NS_ASSUME_NONNULL_BEGIN + #define _nullable_ __nullable +#else + #define _nullable_ +#endif + + +/** + * Adds support for building stubs from "HTTP Messages" conforming to + * the format output by `curl -is` + */ +@interface OHHTTPStubsResponse (HTTPMessage) + +/*! @name Building a response from HTTP Message data */ + +// TODO: Try to implement it using NSInputStream someday? + +/** + * Builds a response given a message data as returned by `curl -is [url]`, that is containing both the headers and the body. + * + * This method will split the headers and the body and build a OHHTTPStubsReponse accordingly + * + * @param responseData The NSData containing the whole HTTP response, including the headers and the body + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + */ ++(instancetype)responseWithHTTPMessageData:(NSData*)responseData; + +/** + * Builds a response given the name of a `"*.response"` file containing both the headers and the body. + * + * The response file is expected to be in the specified bundle (or the application bundle if nil). + * This method will split the headers and the body and build a OHHTTPStubsReponse accordingly + * + * @param responseName The name of the `"*.response"` file (without extension) containing the whole + * HTTP response (including the headers and the body) + * @param bundleOrNil The bundle in which the `"*.response"` file is located. If `nil`, the + * `[NSBundle bundleForClass:self.class]` will be used. + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + */ + ++(instancetype)responseNamed:(NSString*)responseName + inBundle:(NSBundle* _nullable_)bundleOrNil; + + +@end + +#ifdef NS_ASSUME_NONNULL_END + NS_ASSUME_NONNULL_END +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.m new file mode 100644 index 000000000..03d0e7a6d --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.m @@ -0,0 +1,54 @@ +// +// OHHTTPStubsResponse+HTTPMessage.m +// OHHTTPStubs +// +// Created by Olivier Halligon on 01/09/13. +// Copyright (c) 2013 AliSoftware. All rights reserved. +// + +#import "OHHTTPStubsResponse+HTTPMessage.h" + +@implementation OHHTTPStubsResponse (HTTPMessage) + +#pragma mark Building response from HTTP Message Data (dump from "curl -is") + ++(instancetype)responseWithHTTPMessageData:(NSData*)responseData; +{ + NSData *data = [NSData data]; + NSInteger statusCode = 200; + NSDictionary *headers = @{}; + + CFHTTPMessageRef httpMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, FALSE); + if (httpMessage) + { + CFHTTPMessageAppendBytes(httpMessage, responseData.bytes, responseData.length); + + data = responseData; // By default + + if (CFHTTPMessageIsHeaderComplete(httpMessage)) + { + statusCode = (NSInteger)CFHTTPMessageGetResponseStatusCode(httpMessage); + headers = (__bridge_transfer NSDictionary *)CFHTTPMessageCopyAllHeaderFields(httpMessage); + data = (__bridge_transfer NSData *)CFHTTPMessageCopyBody(httpMessage); + } + CFRelease(httpMessage); + } + + return [self responseWithData:data + statusCode:(int)statusCode + headers:headers]; +} + ++(instancetype)responseNamed:(NSString*)responseName + inBundle:(NSBundle*)responsesBundle +{ + NSURL *responseURL = [responsesBundle?:[NSBundle bundleForClass:self.class] URLForResource:responseName + withExtension:@"response"]; + + NSData *responseData = [NSData dataWithContentsOfURL:responseURL]; + NSAssert(responseData, @"Could not find HTTP response named '%@' in bundle '%@'", responseName, responsesBundle); + + return [self responseWithHTTPMessageData:responseData]; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h new file mode 100644 index 000000000..fc8719df0 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h @@ -0,0 +1,47 @@ +// +// OHHTTPStubsResponse+JSON.h +// OHHTTPStubs +// +// Created by Olivier Halligon on 01/09/13. +// Copyright (c) 2013 AliSoftware. All rights reserved. +// + +#import "OHHTTPStubsResponse.h" + +#ifdef NS_ASSUME_NONNULL_BEGIN + NS_ASSUME_NONNULL_BEGIN + #define _nullable_ __nullable +#else + #define _nullable_ +#endif + + +/** + * Adds convenience methods to manipulate JSON objects directly. + * Pass in an `NSDictionary` or `NSArray` to generate a corresponding JSON output. + */ +@interface OHHTTPStubsResponse (JSON) + +/** + * Builds a response given a JSON object for the response body, status code, and headers. + * + * @param jsonObject Object representing the response body. + * Typically a `NSDictionary`; may be any object accepted by `+[NSJSONSerialization dataWithJSONObject:options:error:]` + * @param statusCode The HTTP Status Code to use in the response + * @param httpHeaders The HTTP Headers to return in the response + * If a "Content-Type" header is not included, "Content-Type: application/json" will be added. + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + * + * @note This method typically calls `responseWithData:statusCode:headers:`, passing the serialized JSON + * object as the data parameter and adding the Content-Type header if necessary. + */ ++ (instancetype)responseWithJSONObject:(id)jsonObject + statusCode:(int)statusCode + headers:(NSDictionary * _nullable_)httpHeaders; + +@end + +#ifdef NS_ASSUME_NONNULL_END + NS_ASSUME_NONNULL_END +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.m new file mode 100644 index 000000000..aebcb9908 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.m @@ -0,0 +1,31 @@ +// +// OHHTTPStubsResponse+JSON.m +// OHHTTPStubs +// +// Created by Olivier Halligon on 01/09/13. +// Copyright (c) 2013 AliSoftware. All rights reserved. +// + +#import "OHHTTPStubsResponse+JSON.h" + +@implementation OHHTTPStubsResponse (JSON) + +/*! @name Building a response from JSON objects */ + ++ (instancetype)responseWithJSONObject:(id)jsonObject + statusCode:(int)statusCode + headers:(NSDictionary *)httpHeaders +{ + if (!httpHeaders[@"Content-Type"]) + { + NSMutableDictionary* mutableHeaders = [NSMutableDictionary dictionaryWithDictionary:httpHeaders]; + mutableHeaders[@"Content-Type"] = @"application/json"; + httpHeaders = [NSDictionary dictionaryWithDictionary:mutableHeaders]; // make immutable again + } + + return [self responseWithData:[NSJSONSerialization dataWithJSONObject:jsonObject options:0 error:nil] + statusCode:statusCode + headers:httpHeaders]; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.h new file mode 100644 index 000000000..a80abd133 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.h @@ -0,0 +1,271 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +// For SDK 7.1 Compatibility (as this macro was only included starting SDK 8.0) +#ifndef NS_DESIGNATED_INITIALIZER + #if __has_attribute(objc_designated_initializer) + #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) + #else + #define NS_DESIGNATED_INITIALIZER + #endif +#endif + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Imports + +#import + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Defines & Constants + +// Standard download speeds. +extern const double +OHHTTPStubsDownloadSpeedGPRS, +OHHTTPStubsDownloadSpeedEDGE, +OHHTTPStubsDownloadSpeed3G, +OHHTTPStubsDownloadSpeed3GPlus, +OHHTTPStubsDownloadSpeedWifi; + +#ifdef NS_ASSUME_NONNULL_BEGIN + NS_ASSUME_NONNULL_BEGIN + #define _nullable_ __nullable +#else + #define _nullable_ +#endif + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Interface + +/** + * Stubs Response. This describes a stubbed response to be returned by the URL Loading System, + * including its HTTP headers, body, statusCode and response time. + */ +@interface OHHTTPStubsResponse : NSObject + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Properties + +/** + * The headers to use for the fake response + */ +@property(nonatomic, strong) NSDictionary* _nullable_ httpHeaders; +/** + * The HTTP status code to use for the fake response + */ +@property(nonatomic, assign) int statusCode; +/** + * The inputStream used when sending the response. + * @note You generally don't manipulate this directly. + */ +@property(nonatomic, strong) NSInputStream* _nullable_ inputStream; +/** + * The size of the fake response body, in bytes. + */ +@property(nonatomic, assign) unsigned long long dataSize; +/** + * The duration to wait before faking receiving the response headers. + * + * Defaults to 0.0. + */ +@property(nonatomic, assign) NSTimeInterval requestTime; +/** + * The duration to use to send the fake response body. + * + * @note if responseTime<0, it is interpreted as a download speed in KBps ( -200 => 200KB/s ) + */ +@property(nonatomic, assign) NSTimeInterval responseTime; +/** + * The fake error to generate to simulate a network error. + * + * If `error` is non-`nil`, the request will result in a failure and no response will be sent. + */ +@property(nonatomic, strong) NSError* _nullable_ error; + + + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Commodity Constructors +/*! @name Commodity */ + +/* -------------------------------------------------------------------------- */ +#pragma mark > Building response from NSData + +/** + * Builds a response given raw data. + * + * @note Internally calls `-initWithInputStream:dataSize:statusCode:headers:` with and inputStream built from the NSData. + * + * @param data The raw data to return in the response + * @param statusCode The HTTP Status Code to use in the response + * @param httpHeaders The HTTP Headers to return in the response + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + */ ++(instancetype)responseWithData:(NSData*)data + statusCode:(int)statusCode + headers:(NSDictionary* _nullable_)httpHeaders; + + +/* -------------------------------------------------------------------------- */ +#pragma mark > Building response from a file + +/** + * Builds a response given a file path, the status code and headers. + * + * @param filePath The file path that contains the response body to return. + * @param statusCode The HTTP Status Code to use in the response + * @param httpHeaders The HTTP Headers to return in the response + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + * + * @note It is encouraged to use the OHPathHelpers functions & macros to build + * the filePath parameter easily + */ ++(instancetype)responseWithFileAtPath:(NSString *)filePath + statusCode:(int)statusCode + headers:(NSDictionary* _nullable_)httpHeaders; + +/* -------------------------------------------------------------------------- */ +#pragma mark > Building an error response + +/** + * Builds a response that corresponds to the given error + * + * @param error The error to use in the stubbed response. + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + * + * @note For example you could use an error like `[NSError errorWithDomain:NSURLErrorDomain code:kCFURLErrorNotConnectedToInternet userInfo:nil]` + */ ++(instancetype)responseWithError:(NSError*)error; + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Commotidy Setters + +/** + * Set the `responseTime` of the `OHHTTPStubsResponse` and return `self`. Useful for chaining method calls. + * + * _Usage example:_ + *
    return [[OHHTTPStubsReponse responseWithData:data statusCode:200 headers:nil] responseTime:5.0];
    + * + * @param responseTime If positive, the amount of time used to send the entire response. + * If negative, the rate in KB/s at which to send the response data. + * Useful to simulate slow networks for example. You may use the + * _OHHTTPStubsDownloadSpeed…_ constants here. + * + * @return `self` (= the same `OHHTTPStubsResponse` that was the target of this method). + * Returning `self` is useful for chaining method calls. + */ +-(instancetype)responseTime:(NSTimeInterval)responseTime; + +/** + * Set both the `requestTime` and the `responseTime` of the `OHHTTPStubsResponse` at once. + * Useful for chaining method calls. + * + * _Usage example:_ + *
    return [[OHHTTPStubsReponse responseWithData:data statusCode:200 headers:nil]
    + *            requestTime:1.0 responseTime:5.0];
    + * + * @param requestTime The time to wait before the response begins to send. This value must be greater than or equal to zero. + * @param responseTime If positive, the amount of time used to send the entire response. + * If negative, the rate in KB/s at which to send the response data. + * Useful to simulate slow networks for example. You may use the + * _OHHTTPStubsDownloadSpeed…_ constants here. + * + * @return `self` (= the same `OHHTTPStubsResponse` that was the target of this method). Useful for chaining method calls. + */ +-(instancetype)requestTime:(NSTimeInterval)requestTime responseTime:(NSTimeInterval)responseTime; + + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Initializers +/*! @name Initializers */ + +/** + * Designed initializer. Initialize a response with the given input stream, dataSize, + * statusCode and headers. + * + * @param inputStream The input stream that will provide the data to return in the response + * @param dataSize The size of the data in the stream. + * @param statusCode The HTTP Status Code to use in the response + * @param httpHeaders The HTTP Headers to return in the response + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + * + * @note You will probably never need to call this method yourself. Prefer the other initializers (that will call this method eventually) + */ +-(instancetype)initWithInputStream:(NSInputStream*)inputStream + dataSize:(unsigned long long)dataSize + statusCode:(int)statusCode + headers:(NSDictionary* _nullable_)httpHeaders NS_DESIGNATED_INITIALIZER; + + +/** + * Initialize a response with a given file path, statusCode and headers. + * + * @param filePath The file path of the data to return in the response + * @param statusCode The HTTP Status Code to use in the response + * @param httpHeaders The HTTP Headers to return in the response + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + * + * @note This method simply builds the NSInputStream, compute the file size, and then call `-initWithInputStream:dataSize:statusCode:headers:` + */ +-(instancetype)initWithFileAtPath:(NSString*)filePath + statusCode:(int)statusCode + headers:(NSDictionary* _nullable_)httpHeaders; + + +/** + * Initialize a response with the given data, statusCode and headers. + * + * @param data The raw data to return in the response + * @param statusCode The HTTP Status Code to use in the response + * @param httpHeaders The HTTP Headers to return in the response + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + */ +-(instancetype)initWithData:(NSData*)data + statusCode:(int)statusCode + headers:(NSDictionary* _nullable_)httpHeaders; + + +/** + * Designed initializer. Initialize a response with the given error. + * + * @param error The error to use in the stubbed response. + * + * @return An `OHHTTPStubsResponse` describing the corresponding response to return by the stub + * + * @note For example you could use an error like `[NSError errorWithDomain:NSURLErrorDomain code:kCFURLErrorNotConnectedToInternet userInfo:nil]` + */ +-(instancetype)initWithError:(NSError*)error NS_DESIGNATED_INITIALIZER; + +@end + +#ifdef NS_ASSUME_NONNULL_END + NS_ASSUME_NONNULL_END +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.m new file mode 100644 index 000000000..69d846a74 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.m @@ -0,0 +1,187 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +#if ! __has_feature(objc_arc) +#error This file is expected to be compiled with ARC turned ON +#endif + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Imports + +#import "OHHTTPStubsResponse.h" + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Defines & Constants + +const double OHHTTPStubsDownloadSpeedGPRS =- 56 / 8; // kbps -> KB/s +const double OHHTTPStubsDownloadSpeedEDGE =- 128 / 8; // kbps -> KB/s +const double OHHTTPStubsDownloadSpeed3G =- 3200 / 8; // kbps -> KB/s +const double OHHTTPStubsDownloadSpeed3GPlus =- 7200 / 8; // kbps -> KB/s +const double OHHTTPStubsDownloadSpeedWifi =- 12000 / 8; // kbps -> KB/s + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Implementation + +@implementation OHHTTPStubsResponse + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Commodity Constructors + + +#pragma mark > Building response from NSData + ++(instancetype)responseWithData:(NSData*)data + statusCode:(int)statusCode + headers:(NSDictionary*)httpHeaders +{ + OHHTTPStubsResponse* response = [[self alloc] initWithData:data + statusCode:statusCode + headers:httpHeaders]; + return response; +} + + +#pragma mark > Building response from a file + ++(instancetype)responseWithFileAtPath:(NSString *)filePath + statusCode:(int)statusCode + headers:(NSDictionary *)httpHeaders +{ + OHHTTPStubsResponse* response = [[self alloc] initWithFileAtPath:filePath + statusCode:statusCode + headers:httpHeaders]; + return response; +} + + +#pragma mark > Building an error response + ++(instancetype)responseWithError:(NSError*)error +{ + OHHTTPStubsResponse* response = [[self alloc] initWithError:error]; + return response; +} + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Commotidy Setters + +-(instancetype)responseTime:(NSTimeInterval)responseTime +{ + _responseTime = responseTime; + return self; +} + +-(instancetype)requestTime:(NSTimeInterval)requestTime responseTime:(NSTimeInterval)responseTime +{ + _requestTime = requestTime; + _responseTime = responseTime; + return self; +} + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Initializers + +-(instancetype)initWithInputStream:(NSInputStream*)inputStream + dataSize:(unsigned long long)dataSize + statusCode:(int)statusCode + headers:(NSDictionary*)httpHeaders +{ + self = [super init]; + if (self) + { + _inputStream = inputStream; + _dataSize = dataSize; + _statusCode = statusCode; + NSMutableDictionary * headers = [NSMutableDictionary dictionaryWithDictionary:httpHeaders]; + static NSString *const ContentLengthHeader = @"Content-Length"; + if (!headers[ContentLengthHeader]) + { + headers[ContentLengthHeader] = [NSString stringWithFormat:@"%llu",_dataSize]; + } + _httpHeaders = [NSDictionary dictionaryWithDictionary:headers]; + } + return self; +} + +-(instancetype)initWithFileAtPath:(NSString*)filePath + statusCode:(int)statusCode + headers:(NSDictionary*)httpHeaders +{ + NSInputStream* inputStream; + if (filePath) + { + inputStream = [NSInputStream inputStreamWithFileAtPath:filePath]; + } + else + { + NSLog(@"%s: nil file path. Returning empty data", __PRETTY_FUNCTION__); + inputStream = [NSInputStream inputStreamWithData:[NSData data]]; + } + + NSDictionary* attributes = [NSFileManager.defaultManager attributesOfItemAtPath:filePath error:nil]; + unsigned long long fileSize = [[attributes valueForKey:NSFileSize] unsignedLongLongValue]; + self = [self initWithInputStream:inputStream + dataSize:fileSize + statusCode:statusCode + headers:httpHeaders]; + return self; +} + +-(instancetype)initWithData:(NSData*)data + statusCode:(int)statusCode + headers:(NSDictionary*)httpHeaders +{ + NSInputStream* inputStream = [NSInputStream inputStreamWithData:data?:[NSData data]]; + self = [self initWithInputStream:inputStream + dataSize:data.length + statusCode:statusCode + headers:httpHeaders]; + return self; +} + +-(instancetype)initWithError:(NSError*)error +{ + self = [super init]; + if (self) { + _error = error; + } + return self; +} + +-(NSString*)debugDescription +{ + return [NSString stringWithFormat:@"<%@ %p requestTime:%f responseTime:%f status:%d dataSize:%llu>", + self.class, self, self.requestTime, self.responseTime, self.statusCode, self.dataSize]; +} + +//////////////////////////////////////////////////////////////////////////////// +#pragma mark - Accessors + +-(void)setRequestTime:(NSTimeInterval)requestTime +{ + NSAssert(requestTime >= 0, @"Invalid Request Time (%f) for OHHTTPStubResponse. Request time must be greater than or equal to zero",requestTime); + _requestTime = requestTime; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.h b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.h new file mode 100644 index 000000000..aa250547b --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.h @@ -0,0 +1,77 @@ +// +// OHPathHelpers.h +// Pods +// +// Created by Olivier Halligon on 18/04/2015. +// +// + +#import + +#ifdef NS_ASSUME_NONNULL_BEGIN + NS_ASSUME_NONNULL_BEGIN + #define _nullable_ __nullable +#else + #define _nullable_ +#endif + + +/** + * Useful function to build a path given a file name and a class. + * + * @param fileName The name of the file to get the path to, including file extension + * @param inBundleForClass The class of the caller, used to determine the current bundle + * in which the file is supposed to be located. + * You should typically pass `self.class` (ObjC) or + * `self.dynamicType` (Swift) when calling this function. + * + * @return The path of the given file in the same bundle as the inBundleForClass class + */ +NSString* _nullable_ OHPathForFile(NSString* fileName, Class inBundleForClass); + +/** + * Useful function to build a path given a file name and a bundle. + * + * @param fileName The name of the file to get the path to, including file extension + * @param bundle The bundle in which the file is supposed to be located. + * This parameter can't be null. + * + * @return The path of the given file in given bundle + * + * @note You should avoid using `[NSBundle mainBundle]` for the `bundle` parameter, + * as in the context of Unit Tests, this points to the Simulator's bundle, + * not the bundle of the app under test. That's why `nil` is not an acceptable + * value (so you won't expect it to default to the `mainBundle`). + * You should use `[NSBundle bundleForClass:]` instead. + */ +NSString* _nullable_ OHPathForFileInBundle(NSString* fileName, NSBundle* bundle); + +/** + * Useful function to build a path to a file in the Documents's directory in the + * app sandbox, used by iTunes File Sharing for example. + * + * @param fileName The name of the file to get the path to, including file extension + * + * @return The path of the file in the Documents directory in your App Sandbox + */ +NSString* _nullable_ OHPathForFileInDocumentsDir(NSString* fileName); + + + +/** + * Useful function to build an NSBundle located in the application's resources simply from its name + * + * @param bundleBasename The base name, without extension (extension is assumed to be ".bundle"). + * @param inBundleForClass The class of the caller, used to determine the current bundle + * in which the file is supposed to be located. + * You should typically pass `self.class` (ObjC) or + * `self.dynamicType` (Swift) when calling this function. + * + * @return The NSBundle object representing the bundle with the given basename located in your application's resources. + */ +NSBundle* _nullable_ OHResourceBundle(NSString* bundleBasename, Class inBundleForClass); + + +#ifdef NS_ASSUME_NONNULL_END + NS_ASSUME_NONNULL_END +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.m b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.m new file mode 100644 index 000000000..cac24a636 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.m @@ -0,0 +1,35 @@ +// +// OHPathHelpers.m +// Pods +// +// Created by Olivier Halligon on 18/04/2015. +// +// + +#import "OHPathHelpers.h" + +NSString* OHPathForFile(NSString* fileName, Class inBundleForClass) +{ + NSBundle* bundle = [NSBundle bundleForClass:inBundleForClass]; + return OHPathForFileInBundle(fileName, bundle); +} + +NSString* OHPathForFileInBundle(NSString* fileName, NSBundle* bundle) +{ + return [bundle pathForResource:[fileName stringByDeletingPathExtension] + ofType:[fileName pathExtension]]; +} + +NSString* OHPathForFileInDocumentsDir(NSString* fileName) +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *basePath = (paths.count > 0) ? [paths objectAtIndex:0] : nil; + return [basePath stringByAppendingPathComponent:fileName]; +} + +NSBundle* OHResourceBundleForClass(NSString* bundleBasename, Class inBundleForClass) +{ + NSBundle* classBundle = [NSBundle bundleForClass:inBundleForClass]; + return [NSBundle bundleWithPath:[classBundle pathForResource:bundleBasename + ofType:@"bundle"]]; +} \ No newline at end of file diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs Mac-Info.plist b/test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs Mac-Info.plist new file mode 100644 index 000000000..a3da7a555 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs Mac-Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.alisoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2014 AliSoftware. All rights reserved. + NSPrincipalClass + + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs iOS-Info.plist b/test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs iOS-Info.plist new file mode 100644 index 000000000..a321905ba --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/Supporting Files/OHHTTPStubs iOS-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.alisoftware.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Fixtures/emptyfile.json b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Fixtures/emptyfile.json new file mode 100644 index 000000000..e69de29bb diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/AFNetworkingTests.m b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/AFNetworkingTests.m new file mode 100644 index 000000000..f0dcc952c --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/AFNetworkingTests.m @@ -0,0 +1,226 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +#import +#import "OHHTTPStubs.h" +#import "OHHTTPStubsResponse+JSON.h" + +#import "AFHTTPRequestOperation.h" + +static const NSTimeInterval kResponseTimeTolerence = 1.0; + +@interface AFNetworkingTests : XCTestCase @end + +@implementation AFNetworkingTests + +-(void)setUp +{ + [super setUp]; + [OHHTTPStubs removeAllStubs]; +} + +-(void)test_AFHTTPRequestOperation_success +{ + static const NSTimeInterval kRequestTime = 0.05; + static const NSTimeInterval kResponseTime = 0.1; + NSData* expectedResponse = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:expectedResponse statusCode:200 headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"AFHTTPRequestOperation request finished"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + AFHTTPRequestOperation* op = [[AFHTTPRequestOperation alloc] initWithRequest:req]; + [op setResponseSerializer:[AFHTTPResponseSerializer serializer]]; + __block __strong id response = nil; + [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + response = responseObject; // keep strong reference + [expectation fulfill]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + XCTFail(@"Unexpected network failure"); + [expectation fulfill]; + }]; + [op start]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; + + XCTAssertEqualObjects(response, expectedResponse, @"Unexpected data received"); +} + +-(void)test_AFHTTPRequestOperation_multiple_choices +{ + static const NSTimeInterval kRequestTime = 0.05; + static const NSTimeInterval kResponseTime = 0.1; + NSData* expectedResponse = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:expectedResponse statusCode:300 headers:@{@"Location":@"http://www.iana.org/domains/another/example"}] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"AFHTTPRequestOperation request finished"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + AFHTTPRequestOperation* op = [[AFHTTPRequestOperation alloc] initWithRequest:req]; + AFHTTPResponseSerializer* serializer = [AFHTTPResponseSerializer serializer]; + [serializer setAcceptableStatusCodes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 101)]]; + [op setResponseSerializer:serializer]; + + __block __strong id response = nil; + [op setRedirectResponseBlock:^NSURLRequest *(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse) { + if (redirectResponse == nil) { + return request; + } + XCTFail(@"Unexpected redirect"); + return nil; + }]; + + [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + response = responseObject; // keep strong reference + [expectation fulfill]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + XCTFail(@"Unexpected network failure"); + [expectation fulfill]; + }]; + [op start]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; + + XCTAssertEqualObjects(response, expectedResponse, @"Unexpected data received"); +} + +-(void)test_AFHTTPRequestOperation_redirect +{ + static const NSTimeInterval kRequestTime = 0.05; + static const NSTimeInterval kResponseTime = 0.1; + + NSURL* redirectURL = [NSURL URLWithString:@"http://www.iana.org/domains/another/example"]; + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:[NSData data] statusCode:311 headers:@{@"Location":redirectURL.absoluteString}] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"AFHTTPRequestOperation request finished"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + AFHTTPRequestOperation* op = [[AFHTTPRequestOperation alloc] initWithRequest:req]; + [op setResponseSerializer:[AFHTTPResponseSerializer serializer]]; + + __block __strong NSURL* url = nil; + [op setRedirectResponseBlock:^NSURLRequest *(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse) { + if (redirectResponse == nil) { + return request; + } + url = request.URL; + [expectation fulfill]; + return nil; + }]; + + [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + XCTFail(@"Unexpected response"); + [expectation fulfill]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + XCTFail(@"Unexpected network failure"); + [expectation fulfill]; + }]; + [op start]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; + + XCTAssertEqualObjects(url, redirectURL, @"Unexpected data received"); +} + +@end + + + +#pragma mark - NSURLSession / AFHTTPURLSession support + +// Compile this only if SDK version (…MAX_ALLOWED) is iOS7+/10.9+ because NSURLSession is a class only known starting these SDKs +// (this code won't compile if we use an eariler SDKs, like when building with Xcode4) +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) \ + || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +#import "AFHTTPSessionManager.h" + +@interface AFNetworkingTests (NSURLSession) @end +@implementation AFNetworkingTests (NSURLSession) + +- (void)test_AFHTTPURLSessionCustom +{ + if ([NSURLSession class] && [NSURLSessionConfiguration class]) + { + static const NSTimeInterval kRequestTime = 0.1; + static const NSTimeInterval kResponseTime = 0.2; + NSDictionary *expectedResponseDict = @{@"Success" : @"Yes"}; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return [request.URL.scheme isEqualToString:@"stubs"]; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithJSONObject:expectedResponseDict statusCode:200 headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"AFHTTPSessionManager request finished"]; + + NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURL* baseURL = [NSURL URLWithString:@"stubs://stubs/"]; + AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL + sessionConfiguration:sessionConfig]; + + __block __strong id response = nil; + [sessionManager GET:@"foo" + parameters:nil + success:^(NSURLSessionDataTask *task, id responseObject) { + response = responseObject; // keep strong reference + [expectation fulfill]; + } + failure:^(NSURLSessionDataTask *task, NSError *error) { + XCTFail(@"Unexpected network failure"); + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; + + XCTAssertEqualObjects(response, expectedResponseDict, @"Unexpected data received"); + } + else + { + NSLog(@"/!\\ Test skipped because the NSURLSession class is not available on this OS version. Run the tests a target with a more recent OS.\n"); + } +} + +@end + +#else +#warning Unit Tests using NSURLSession were not compiled nor executed, because NSURLSession is only available since iOS7/OSX10.9 SDK. \ +-------- Compile using iOS7 or OSX10.9 SDK then launch the tests on the iOS7 simulator or an OSX10.9 target for them to be executed. +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionDelegateTests.m b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionDelegateTests.m new file mode 100644 index 000000000..2a37ff129 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionDelegateTests.m @@ -0,0 +1,394 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +#import +#import "OHHTTPStubs.h" + +@interface NSURLConnectionDelegateTests : XCTestCase @end + +static const NSTimeInterval kResponseTimeTolerence = 0.2; + +@implementation NSURLConnectionDelegateTests +{ + NSMutableData* _data; + NSError* _error; + + NSURL* _redirectRequestURL; + NSInteger _redirectResponseStatusCode; + + XCTestExpectation* _connectionFinishedExpectation; +} + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark Global Setup + NSURLConnectionDelegate implementation +/////////////////////////////////////////////////////////////////////////////////// + +-(void)setUp +{ + [super setUp]; + _data = [[NSMutableData alloc] init]; + [OHHTTPStubs removeAllStubs]; +} + +-(void)tearDown +{ + // in case the test timed out and finished before a running NSURLConnection ended, + // we may continue receive delegate messages anyway if we forgot to cancel. + // So avoid sending messages to deallocated object in this case by ensuring we reset it to nil + _data = nil; + _error = nil; + _connectionFinishedExpectation = nil; + [super tearDown]; +} + +- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response +{ + _redirectRequestURL = request.URL; + if (response) + { + if ([response isKindOfClass:NSHTTPURLResponse.class]) + { + _redirectResponseStatusCode = [((NSHTTPURLResponse *) response) statusCode]; + } + else + { + _redirectResponseStatusCode = 0; + } + } + else + { + // we get a nil response when NSURLConnection canonicalizes the URL, we don't care about that. + } + return request; +} + +-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response +{ + [_data setLength:0U]; +} + +-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data +{ + [_data appendData:data]; +} + +-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error +{ + _error = error; // keep strong reference + [_connectionFinishedExpectation fulfill]; +} + +-(void)connectionDidFinishLoading:(NSURLConnection *)connection +{ + [_connectionFinishedExpectation fulfill]; +} + + + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark NSURLConnection + Delegate +/////////////////////////////////////////////////////////////////////////////////// + +-(void)test_NSURLConnectionDelegate_success +{ + static const NSTimeInterval kRequestTime = 0.1; + static const NSTimeInterval kResponseTime = 0.5; + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:testData + statusCode:200 + headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + _connectionFinishedExpectation = [self expectationWithDescription:@"NSURLConnection did finish (with error or success)"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSDate* startDate = [NSDate date]; + + NSURLConnection* cxn = [NSURLConnection connectionWithRequest:req delegate:self]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; + + XCTAssertEqualObjects(_data, testData, @"Invalid data response"); + XCTAssertNil(_error, @"Received unexpected network error %@", _error); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], kRequestTime+kResponseTime, kResponseTimeTolerence, @"Invalid response time"); + + // in case we timed out before the end of the request (test failed), cancel the request to avoid further delegate method calls + [cxn cancel]; +} + +-(void)test_NSURLConnectionDelegate_multiple_choices +{ + static const NSTimeInterval kRequestTime = 0.1; + static const NSTimeInterval kResponseTime = 0.5; + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:testData + statusCode:300 + headers:@{@"Location":@"http://www.iana.org/domains/another/example"}] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + _connectionFinishedExpectation = [self expectationWithDescription:@"NSURLConnection did finish (with error or success)"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSDate* startDate = [NSDate date]; + + NSURLConnection* cxn = [NSURLConnection connectionWithRequest:req delegate:self]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; + + XCTAssertEqualObjects(_data, testData, @"Invalid data response"); + XCTAssertNil(_error, @"Received unexpected network error %@", _error); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], kRequestTime+kResponseTime, kResponseTimeTolerence, @"Invalid response time"); + + // in case we timed out before the end of the request (test failed), cancel the request to avoid further delegate method calls + [cxn cancel]; +} + +-(void)test_NSURLConnectionDelegate_error +{ + static const NSTimeInterval kResponseTime = 0.5; + NSError* expectedError = [NSError errorWithDomain:NSURLErrorDomain code:404 userInfo:nil]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + OHHTTPStubsResponse* resp = [OHHTTPStubsResponse responseWithError:expectedError]; + resp.responseTime = kResponseTime; + return resp; + }]; + + _connectionFinishedExpectation = [self expectationWithDescription:@"NSURLConnection did finish (with error or success)"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSDate* startDate = [NSDate date]; + + NSURLConnection* cxn = [NSURLConnection connectionWithRequest:req delegate:self]; + + [self waitForExpectationsWithTimeout:kResponseTime+kResponseTimeTolerence handler:nil]; + + XCTAssertEqual(_data.length, (NSUInteger)0, @"Received unexpected network data %@", _data); + XCTAssertEqualObjects(_error.domain, expectedError.domain, @"Invalid error response domain"); + XCTAssertEqual(_error.code, expectedError.code, @"Invalid error response code"); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], kResponseTime, kResponseTimeTolerence, @"Invalid response time"); + + // in case we timed out before the end of the request (test failed), cancel the request to avoid further delegate method calls + [cxn cancel]; +} + + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark Cancelling requests +/////////////////////////////////////////////////////////////////////////////////// + +-(void)test_NSURLConnection_cancel +{ + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:[@"" dataUsingEncoding:NSUTF8StringEncoding] + statusCode:500 + headers:nil] + requestTime:0.0 responseTime:1.5]; + }]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSURLConnection* cxn = [NSURLConnection connectionWithRequest:req delegate:self]; + + XCTestExpectation* waitExpectation = [self expectationWithDescription:@"Waiting 2s, after cancelling in the middle"]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [cxn cancel]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [waitExpectation fulfill]; + }); + }); + + [self waitForExpectationsWithTimeout:5 handler:^(NSError *error) { + // in case we timed out before the end of the request (test failed), cancel the request to avoid further delegate method calls + [cxn cancel]; + }]; + + XCTAssertEqual(_data.length, (NSUInteger)0, @"Received unexpected data but the request should have been cancelled"); + XCTAssertNil(_error, @"Received unexpected network error but the request should have been cancelled"); + +} + + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark Cancelling requests +/////////////////////////////////////////////////////////////////////////////////// + +-(void)test_NSURLConnection_cookies +{ + NSString* const cookieName = @"SESSIONID"; + NSString* const cookieValue = [NSProcessInfo.processInfo globallyUniqueString]; + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + NSString* cookie = [NSString stringWithFormat:@"%@=%@;", cookieName, cookieValue]; + NSDictionary* headers = @{@"Set-Cookie": cookie}; + return [[OHHTTPStubsResponse responseWithData:[@"Yummy cookies" dataUsingEncoding:NSUTF8StringEncoding] + statusCode:200 + headers:headers] + requestTime:0.0 responseTime:0.1]; + }]; + + _connectionFinishedExpectation = [self expectationWithDescription:@"NSURLConnection did finish (with error or success)"]; + + // Set the cookie accept policy to accept all cookies from the main document domain + // (especially in case the previous policy was "NSHTTPCookieAcceptPolicyNever") + NSHTTPCookieStorage* cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage; + NSHTTPCookieAcceptPolicy previousAcceptPolicy = cookieStorage.cookieAcceptPolicy; // keep it to restore later + [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain]; + + // Send the request and wait for the response containing the Set-Cookie headers + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSURLConnection* cxn = [NSURLConnection connectionWithRequest:req delegate:self]; + [self waitForExpectationsWithTimeout:kResponseTimeTolerence handler:^(NSError *error) { + [cxn cancel]; // In case we timed out (test failed), cancel the request to avoid further delegate method calls + }]; + + /* Check that the cookie has been properly stored */ + NSArray* cookies = [cookieStorage cookiesForURL:req.URL]; + BOOL cookieFound = NO; + for (NSHTTPCookie* cookie in cookies) + { + if ([cookie.name isEqualToString:cookieName]) + { + cookieFound = YES; + XCTAssertEqualObjects(cookie.value, cookieValue, @"The cookie does not have the expected value"); + } + } + XCTAssertTrue(cookieFound, @"The cookie was not stored as expected"); + + + // As a courtesy, restore previous policy before leaving + [cookieStorage setCookieAcceptPolicy:previousAcceptPolicy]; + +} + + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark Redirected requests +/////////////////////////////////////////////////////////////////////////////////// + +- (void)test_NSURLConnection_redirected +{ + static const NSTimeInterval kRequestTime = 0.1; + static const NSTimeInterval kResponseTime = 0.5; + NSData* redirectData = [[NSString stringWithFormat:@"%@ - redirect", NSStringFromSelector(_cmd)] dataUsingEncoding:NSUTF8StringEncoding]; + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + NSURL* redirectURL = [NSURL URLWithString:@"http://www.yahoo.com/"]; + NSString* redirectCookieName = @"yahooCookie"; + NSString* redirectCookieValue = [NSProcessInfo.processInfo globallyUniqueString]; + + // Set the cookie accept policy to accept all cookies from the main document domain + // (especially in case the previous policy was "NSHTTPCookieAcceptPolicyNever") + NSHTTPCookieStorage* cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage; + NSHTTPCookieAcceptPolicy previousAcceptPolicy = cookieStorage.cookieAcceptPolicy; // keep it to restore later + [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain]; + + NSString* endCookieName = @"googleCookie"; + NSString* endCookieValue = [NSProcessInfo.processInfo globallyUniqueString]; + NSURL *endURL = [NSURL URLWithString:@"http://www.google.com/"]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + if ([request.URL isEqual:redirectURL]) { + NSString* redirectCookie = [NSString stringWithFormat:@"%@=%@;", redirectCookieName, redirectCookieValue]; + NSDictionary* headers = @{ @"Location": endURL.absoluteString, + @"Set-Cookie": redirectCookie }; + return [[OHHTTPStubsResponse responseWithData:redirectData + statusCode:311 // any 300-level request will do + headers:headers] + requestTime:kRequestTime responseTime:kResponseTime]; + } else { + NSString* endCookie = [NSString stringWithFormat:@"%@=%@;", endCookieName, endCookieValue]; + NSDictionary* headers = @{ @"Set-Cookie": endCookie }; + return [[OHHTTPStubsResponse responseWithData:testData + statusCode:200 + headers:headers] + requestTime:kRequestTime responseTime:kResponseTime]; + } + }]; + + _connectionFinishedExpectation = [self expectationWithDescription:@"NSURLConnection did finish (with error or success)"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:redirectURL]; + NSDate* startDate = [NSDate date]; + + NSURLConnection* cxn = [NSURLConnection connectionWithRequest:req delegate:self]; + + [self waitForExpectationsWithTimeout:2 * (kRequestTime+kResponseTime+kResponseTimeTolerence) handler:^(NSError *error) { + // in case we timed out before the end of the request (test failed), cancel the request to avoid further delegate method calls + [cxn cancel]; + }]; + + XCTAssertEqualObjects(_redirectRequestURL, endURL, @"Invalid redirect request URL"); + XCTAssertEqual(_redirectResponseStatusCode, (NSInteger)311, @"Invalid redirect response status code"); + XCTAssertEqualObjects(_data, testData, @"Invalid data response"); + XCTAssertNil(_error, @"Received unexpected network error %@", _error); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], (2 * kRequestTime) + kResponseTime, 2 * kResponseTimeTolerence, @"Invalid response time"); + + /* Check that the redirect cookie has been properly stored */ + NSArray* redirectCookies = [cookieStorage cookiesForURL:req.URL]; + BOOL redirectCookieFound = NO; + for (NSHTTPCookie* cookie in redirectCookies) + { + if ([cookie.name isEqualToString:redirectCookieName]) + { + redirectCookieFound = YES; + XCTAssertEqualObjects(cookie.value, redirectCookieValue, @"The redirect cookie does not have the expected value"); + } + } + XCTAssertTrue(redirectCookieFound, @"The redirect cookie was not stored as expected"); + + /* Check that the end cookie has been properly stored */ + NSArray* endCookies = [cookieStorage cookiesForURL:endURL]; + BOOL endCookieFound = NO; + for (NSHTTPCookie* cookie in endCookies) + { + if ([cookie.name isEqualToString:endCookieName]) + { + endCookieFound = YES; + XCTAssertEqualObjects(cookie.value, endCookieValue, @"The end cookie does not have the expected value"); + } + } + XCTAssertTrue(endCookieFound, @"The end cookie was not stored as expected"); + + + // As a courtesy, restore previous policy before leaving + [cookieStorage setCookieAcceptPolicy:previousAcceptPolicy]; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionTests.m b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionTests.m new file mode 100644 index 000000000..0621384db --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLConnectionTests.m @@ -0,0 +1,187 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +#import +#import "OHHTTPStubs.h" + +@interface NSURLConnectionTests : XCTestCase @end + +static const NSTimeInterval kResponseTimeTolerence = 0.3; + +@implementation NSURLConnectionTests + +-(void)setUp +{ + [super setUp]; + [OHHTTPStubs removeAllStubs]; +} + +static const NSTimeInterval kRequestTime = 0.1; +static const NSTimeInterval kResponseTime = 0.5; + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark [NSURLConnection sendSynchronousRequest:returningResponse:error:] +/////////////////////////////////////////////////////////////////////////////////// + +-(void)test_NSURLConnection_sendSyncronousRequest_mainQueue +{ + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:testData + statusCode:200 + headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSDate* startDate = [NSDate date]; + + NSData* data = [NSURLConnection sendSynchronousRequest:req returningResponse:NULL error:NULL]; + + XCTAssertEqualObjects(data, testData, @"Invalid data response"); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], kRequestTime+kResponseTime, kResponseTimeTolerence, @"Invalid response time"); +} + +-(void)test_NSURLConnection_sendSyncronousRequest_parallelQueue +{ + XCTestExpectation* expectation = [self expectationWithDescription:@"Synchronous request completed"]; + [[NSOperationQueue new] addOperationWithBlock:^{ + [self test_NSURLConnection_sendSyncronousRequest_mainQueue]; + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; +} + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark Single [NSURLConnection sendAsynchronousRequest:queue:completionHandler:] +/////////////////////////////////////////////////////////////////////////////////// + +-(void)_test_NSURLConnection_sendAsyncronousRequest_onOperationQueue:(NSOperationQueue*)queue +{ + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:testData + statusCode:200 + headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Asynchronous request finished"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSDate* startDate = [NSDate date]; + + [NSURLConnection sendAsynchronousRequest:req queue:queue completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + XCTAssertEqualObjects(data, testData, @"Invalid data response"); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], kRequestTime+kResponseTime, kResponseTimeTolerence, @"Invalid response time"); + + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; +} + + +-(void)test_NSURLConnection_sendAsyncronousRequest_mainQueue +{ + [self _test_NSURLConnection_sendAsyncronousRequest_onOperationQueue:NSOperationQueue.mainQueue]; +} + + +-(void)test_NSURLConnection_sendAsyncronousRequest_parallelQueue +{ + [self _test_NSURLConnection_sendAsyncronousRequest_onOperationQueue:[NSOperationQueue new]]; +} + + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark Multiple Parallel [NSURLConnection sendAsynchronousRequest:queue:completionHandler:] +/////////////////////////////////////////////////////////////////////////////////// + +-(void)_test_NSURLConnection_sendMultipleAsyncronousRequestsOnOperationQueue:(NSOperationQueue*)queue +{ + __block BOOL testFinished = NO; + NSData* (^dataForRequest)(NSURLRequest*) = ^(NSURLRequest* req) { + return [[NSString stringWithFormat:@"",req.URL.absoluteString] dataUsingEncoding:NSUTF8StringEncoding]; + }; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + NSData* retData = dataForRequest(request); + NSTimeInterval responseTime = [request.URL.lastPathComponent doubleValue]; + return [[OHHTTPStubsResponse responseWithData:retData + statusCode:200 + headers:nil] + requestTime:responseTime*.1 responseTime:responseTime]; + }]; + + // Reusable code to send a request that will respond in the given response time + void (^sendAsyncRequest)(NSTimeInterval) = ^(NSTimeInterval responseTime) + { + NSString* desc = [NSString stringWithFormat:@"Asynchronous request with response time %.f finished", responseTime]; + XCTestExpectation* expectation = [self expectationWithDescription:desc]; + + NSString* urlString = [NSString stringWithFormat:@"http://dummyrequest/concurrent/time/%f",responseTime]; + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; +// [SenTestLog testLogWithFormat:@"== Sending request %@\n", req]; + NSDate* startDate = [NSDate date]; + [NSURLConnection sendAsynchronousRequest:req queue:queue completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { +// [SenTestLog testLogWithFormat:@"== Received response for request %@\n", req]; + XCTAssertEqualObjects(data, dataForRequest(req), @"Invalid data response"); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], (responseTime*.1)+responseTime, kResponseTimeTolerence, @"Invalid response time"); + + if (!testFinished) [expectation fulfill]; + }]; + }; + + static NSTimeInterval time3 = 1.5, time2 = 1.0, time1 = 0.5; + sendAsyncRequest(time3); // send this one first, should receive last + sendAsyncRequest(time2); // send this one next, shoud receive 2nd + sendAsyncRequest(time1); // send this one last, should receive first + + [self waitForExpectationsWithTimeout:MAX(time1,MAX(time2,time3))+kResponseTimeTolerence handler:nil]; + testFinished = YES; +} + +-(void)test_NSURLConnection_sendMultipleAsyncronousRequests_mainQueue +{ + [self _test_NSURLConnection_sendMultipleAsyncronousRequestsOnOperationQueue:NSOperationQueue.mainQueue]; +} + +-(void)test_NSURLConnection_sendMultipleAsyncronousRequests_parallelQueue +{ + [self _test_NSURLConnection_sendMultipleAsyncronousRequestsOnOperationQueue:[NSOperationQueue new]]; +} + + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLSessionTests.m b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLSessionTests.m new file mode 100644 index 000000000..08f67e828 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NSURLSessionTests.m @@ -0,0 +1,228 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + + +// Compile this only if SDK version (…MAX_ALLOWED) is iOS7+/10.9+ because NSURLSession is a class only known starting these SDKs +// (this code won't compile if we use an eariler SDKs, like when building with Xcode4) +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) \ + || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +#import +#import "OHHTTPStubs.h" +#import "OHHTTPStubsResponse+JSON.h" + +@interface NSURLSessionTests : XCTestCase @end + +@implementation NSURLSessionTests +{ + NSMutableData* _receivedData; + XCTestExpectation* _taskDidCompleteExpectation; +} + +- (void)setUp +{ + [super setUp]; + [OHHTTPStubs removeAllStubs]; + _receivedData = nil; +} + +- (void)_test_NSURLSession:(NSURLSession*)session + jsonForStub:(id)json + completion:(void(^)(NSError* errorResponse,id jsonResponse))completion +{ + if ([NSURLSession class]) + { + static const NSTimeInterval kRequestTime = 0.0; + static const NSTimeInterval kResponseTime = 0.2; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithJSONObject:json statusCode:200 headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"NSURLSessionDataTask completed"]; + + __block __strong id dataResponse = nil; + __block __strong NSError* errorResponse = nil; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"foo://unknownhost:666"]]; + [request setHTTPMethod:@"GET"]; + [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; + + NSURLSessionDataTask *task = [session dataTaskWithRequest:request + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) + { + errorResponse = error; + if (!error) + { + NSError *jsonError = nil; + NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; + XCTAssertNil(jsonError, @"Unexpected error deserializing JSON response"); + dataResponse = jsonObject; + } + [expectation fulfill]; + }]; + + [task resume]; + + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+0.5 handler:nil]; + + completion(errorResponse, dataResponse); + } +} + +// The shared session use the same mechanism as NSURLConnection +// (based on protocols registered via +[NSURLProtocol registerClass:] and all) +// and no NSURLSessionConfiguration +- (void)test_SharedNSURLSession +{ + if ([NSURLSession class]) + { + NSURLSession *session = [NSURLSession sharedSession]; + + NSDictionary* json = @{@"Success": @"Yes"}; + [self _test_NSURLSession:session jsonForStub:json completion:^(NSError *errorResponse, id jsonResponse) { + XCTAssertNil(errorResponse, @"Unexpected error"); + XCTAssertEqualObjects(jsonResponse, json, @"Unexpected data received"); + }]; + } + else + { + NSLog(@"/!\\ Test skipped because the NSURLSession class is not available on this OS version. Run the tests a target with a more recent OS.\n"); + } +} + +- (void)test_NSURLSessionDefaultConfig +{ + if ([NSURLSessionConfiguration class] && [NSURLSession class]) + { + NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; + + NSDictionary* json = @{@"Success": @"Yes"}; + [self _test_NSURLSession:session jsonForStub:json completion:^(NSError *errorResponse, id jsonResponse) { + XCTAssertNil(errorResponse, @"Unexpected error"); + XCTAssertEqualObjects(jsonResponse, json, @"Unexpected data received"); + }]; + } + else + { + NSLog(@"/!\\ Test skipped because the NSURLSession class is not available on this OS version. Run the tests a target with a more recent OS.\n"); + } +} + +- (void)test_NSURLSessionEphemeralConfig +{ + if ([NSURLSessionConfiguration class] && [NSURLSession class]) + { + NSURLSessionConfiguration* config = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; + + NSDictionary* json = @{@"Success": @"Yes"}; + [self _test_NSURLSession:session jsonForStub:json completion:^(NSError *errorResponse, id jsonResponse) { + XCTAssertNil(errorResponse, @"Unexpected error"); + XCTAssertEqualObjects(jsonResponse, json, @"Unexpected data received"); + }]; + } + else + { + NSLog(@"/!\\ Test skipped because the NSURLSession class is not available on this OS version. Run the tests a target with a more recent OS.\n"); + } +} + +- (void)test_NSURLSessionDefaultConfig_Disabled +{ + if ([NSURLSessionConfiguration class] && [NSURLSession class]) + { + NSURLSessionConfiguration* config = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + [OHHTTPStubs setEnabled:NO forSessionConfiguration:config]; // Disable stubs for this session + NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; + + NSDictionary* json = @{@"Success": @"Yes"}; + [self _test_NSURLSession:session jsonForStub:json completion:^(NSError *errorResponse, id jsonResponse) { + // Stubs were disable for this session, so we should get an error instead of the stubs data + XCTAssertNotNil(errorResponse, @"Expected error but none found"); + XCTAssertNil(jsonResponse, @"Data should not have been received as stubs should be disabled"); + }]; + } + else + { + NSLog(@"/!\\ Test skipped because the NSURLSession class is not available on this OS version. Run the tests a target with a more recent OS.\n"); + } +} + +- (void)test_NSURLSession_DataTask_DelegateMethods +{ + if ([NSURLSessionConfiguration class] && [NSURLSession class]) + { + NSData* expectedResponse = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return [request.URL.scheme isEqualToString:@"stub"]; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:expectedResponse statusCode:200 headers:nil] + responseTime:0.5]; + }]; + + _taskDidCompleteExpectation = [self expectationWithDescription:@"NSURLSessionDataTask completion delegate method called"]; + + NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURLSession* session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; + + [[session dataTaskWithURL:[NSURL URLWithString:@"stub://foo"]] resume]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + XCTAssertEqualObjects(_receivedData, expectedResponse, @"Unexpected response"); + } + else + { + NSLog(@"/!\\ Test skipped because the NSURLSession class is not available on this OS version. Run the tests a target with a more recent OS.\n"); + } +} + +//--------------------------------------------------------------- +#pragma mark - Delegate Methods + +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler +{ + _receivedData = [NSMutableData new]; + completionHandler(NSURLSessionResponseAllow); +} +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data +{ + [_receivedData appendData:data]; +} +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error +{ + [_taskDidCompleteExpectation fulfill]; +} + +@end + +#else +#warning Unit Tests using NSURLSession were not compiled nor executed, because NSURLSession is only available since iOS7/OSX10.9 SDK. \ +-------- Compile using iOS7 or OSX10.9 SDK then launch the tests on the iOS7 simulator or an OSX10.9 target for them to be executed. +#endif diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NilValuesTests.m b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NilValuesTests.m new file mode 100644 index 000000000..ea1317402 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/NilValuesTests.m @@ -0,0 +1,213 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + +#import +#import "OHHTTPStubs.h" + +static const NSTimeInterval kResponseTimeTolerence = 0.3; + +@interface NilValuesTests : XCTestCase @end + +@implementation NilValuesTests + +-(void)setUp +{ + [super setUp]; + [OHHTTPStubs removeAllStubs]; +} + +- (void)test_NilData +{ + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" + return [OHHTTPStubsResponse responseWithData:nil statusCode:400 headers:nil]; +#pragma clang diagnostic pop + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Network request's completionHandler called"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + XCTAssertEqual(data.length, (NSUInteger)0, @"Data should be empty"); + + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kResponseTimeTolerence handler:nil]; +} + +- (void)test_EmptyData +{ + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:[NSData data] statusCode:400 headers:nil] + requestTime:0.01 responseTime:0.01]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Network request's completionHandler called"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + XCTAssertEqual(data.length, (NSUInteger)0, @"Data should be empty"); + + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kResponseTimeTolerence handler:nil]; +} + +- (void)test_NilPath +{ + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" + return [[OHHTTPStubsResponse responseWithFileAtPath:nil statusCode:501 headers:nil] + requestTime:0.01 responseTime:0.01]; +#pragma clang diagnostic pop + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Network request's completionHandler called"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + XCTAssertEqual(data.length, (NSUInteger)0, @"Data should be empty"); + + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kResponseTimeTolerence handler:nil]; +} + +- (void)test_InvalidPath +{ + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithFileAtPath:@"-invalid-path-" statusCode:500 headers:nil] + requestTime:0.01 responseTime:0.01]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Network request's completionHandler called"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + XCTAssertEqual(data.length, (NSUInteger)0, @"Data should be empty"); + + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kResponseTimeTolerence handler:nil]; +} + +- (void)test_EmptyFile +{ + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + NSString* emptyFile = OHPathForFile(@"emptyfile.json", self.class); + return [[OHHTTPStubsResponse responseWithFileAtPath:emptyFile statusCode:500 headers:nil] + requestTime:0.01 responseTime:0.01]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Network request's completionHandler called"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + XCTAssertEqual(data.length, (NSUInteger)0, @"Data should be empty"); + + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kResponseTimeTolerence handler:nil]; +} + +- (void)_test_NilURLAndCookieHandlingEnabled:(BOOL)handleCookiesEnabled +{ + NSData* expectedResponse = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [OHHTTPStubsResponse responseWithData:expectedResponse + statusCode:200 + headers:nil]; + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Network request's completionHandler called"]; + + NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL:nil]; + [req setHTTPShouldHandleCookies:handleCookiesEnabled]; + + __block NSData* response = nil; + + [NSURLConnection sendAsynchronousRequest:req + queue:[NSOperationQueue mainQueue] + completionHandler:^(NSURLResponse* resp, NSData* data, NSError* error) + { + response = data; + [expectation fulfill]; + }]; + + [self waitForExpectationsWithTimeout:kResponseTimeTolerence handler:nil]; + + XCTAssertEqualObjects(response, expectedResponse, @"Unexpected data received"); +} + +- (void)test_NilURLAndCookieHandlingEnabled +{ + [self _test_NilURLAndCookieHandlingEnabled:YES]; +} + +- (void)test_NilURLAndCookieHandlingDisabled +{ + [self _test_NilURLAndCookieHandlingEnabled:NO]; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/TimingTests.m b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/TimingTests.m new file mode 100644 index 000000000..a805070aa --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/Test Suites/TimingTests.m @@ -0,0 +1,162 @@ +/*********************************************************************************** + * + * Copyright (c) 2012 Olivier Halligon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + ***********************************************************************************/ + + +#import +#import "OHHTTPStubs.h" + +@interface TimingTests : XCTestCase +{ + NSMutableData* _data; + NSError* _error; + XCTestExpectation* _connectionFinishedExpectation; + +// NSDate* _didReceiveResponseTS; + NSDate* _didFinishLoadingTS; +} +@end + +@implementation TimingTests + +-(void)setUp +{ + [super setUp]; + + _data = [NSMutableData new]; + _error = nil; +// _didReceiveResponseTS = nil; + _didFinishLoadingTS = nil; + [OHHTTPStubs removeAllStubs]; +} +-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response +{ + [_data setLength:0U]; + // NOTE: This timing info is not reliable as Cocoa always calls the connection:didReceiveResponse: delegate method just before + // calling the first "connection:didReceiveData:", even if the [id URLProtocol:didReceiveResponse:…] method was called way before. So we are not testing this +// _didReceiveResponseTS = [NSDate date]; +} + +-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data +{ + [_data appendData:data]; +} + +-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error +{ + _error = error; // keep strong reference + _didFinishLoadingTS = [NSDate date]; + [_connectionFinishedExpectation fulfill]; +} + +-(void)connectionDidFinishLoading:(NSURLConnection *)connection +{ + _didFinishLoadingTS = [NSDate date]; + [_connectionFinishedExpectation fulfill]; +} + + +/////////////////////////////////////////////////////////////////////////////////////// + +static NSTimeInterval const kResponseTimeTolerence = 0.8; +static NSTimeInterval const kSecurityTimeout = 5.0; + +-(void)_testWithData:(NSData*)stubData requestTime:(NSTimeInterval)requestTime responseTime:(NSTimeInterval)responseTime +{ + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:stubData + statusCode:200 + headers:nil] + requestTime:requestTime responseTime:responseTime]; + }]; + + _connectionFinishedExpectation = [self expectationWithDescription:@"NSURLConnection did finish (with error or success)"]; + + NSURLRequest* req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + NSDate* startTS = [NSDate date]; + + [NSURLConnection connectionWithRequest:req delegate:self]; + + [self waitForExpectationsWithTimeout:requestTime+responseTime+kResponseTimeTolerence+kSecurityTimeout handler:nil]; + + XCTAssertEqualObjects(_data, stubData, @"Invalid data response"); + +// XCTAssertEqualWithAccuracy([_didReceiveResponseTS timeIntervalSinceDate:startTS], requestTime, +// kResponseTimeTolerence, @"Invalid request time"); + XCTAssertEqualWithAccuracy([_didFinishLoadingTS timeIntervalSinceDate:startTS], requestTime + responseTime, + kResponseTimeTolerence, @"Invalid response time"); + + [NSThread sleepForTimeInterval:0.01]; // Time for the test to wrap it all (otherwise we may have "Test did not finish" warning) +} + + + + + + +-(void)test_RequestTime0_ResponseTime0 +{ + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + [self _testWithData:testData requestTime:0 responseTime:0]; +} + +-(void)test_SmallDataLargeTime_CumulativeAlgorithm +{ + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + // 21 bytes in 23/4 of a second = 0.913042 byte per slot: we need to check that the cumulative algorithm works + [self _testWithData:testData requestTime:0 responseTime:5.75]; +} + +-(void)test_RequestTime1_ResponseTime0 +{ + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + [self _testWithData:testData requestTime:1 responseTime:0]; +} + +-(void)test_LongData_RequestTime1_ResponseTime5 +{ + static NSUInteger const kDataLength = 1024; + NSMutableData* testData = [NSMutableData dataWithCapacity:kDataLength]; + NSData* chunk = [[NSProcessInfo.processInfo globallyUniqueString] dataUsingEncoding:NSUTF8StringEncoding]; + while(testData.length +#import "OHHTTPStubs.h" + +@interface WithContentsOfURLTests : XCTestCase @end + +static const NSTimeInterval kResponseTimeTolerence = 0.2; + +@implementation WithContentsOfURLTests + +-(void)setUp +{ + [super setUp]; + [OHHTTPStubs removeAllStubs]; +} + +static const NSTimeInterval kRequestTime = 0.1; +static const NSTimeInterval kResponseTime = 0.5; + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark [NSString stringWithContentsOfURL:encoding:error:] +/////////////////////////////////////////////////////////////////////////////////// + +-(void)test_NSString_stringWithContentsOfURL_mainQueue +{ + NSString* testString = NSStringFromSelector(_cmd); + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:[testString dataUsingEncoding:NSUTF8StringEncoding] + statusCode:200 + headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + NSDate* startDate = [NSDate date]; + + NSString* string = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"] + encoding:NSUTF8StringEncoding + error:NULL]; + + XCTAssertEqualObjects(string, testString, @"Invalid returned string"); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], kResponseTime+kRequestTime, kResponseTimeTolerence, @"Invalid response time"); +} + +-(void)test_NSString_stringWithContentsOfURL_parallelQueue +{ + XCTestExpectation* expectation = [self expectationWithDescription:@"Synchronous download finished"]; + [[NSOperationQueue new] addOperationWithBlock:^{ + [self test_NSString_stringWithContentsOfURL_mainQueue]; + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; +} + +/////////////////////////////////////////////////////////////////////////////////// +#pragma mark [NSData dataWithContentsOfURL:] +/////////////////////////////////////////////////////////////////////////////////// + +-(void)test_NSData_dataWithContentsOfURL_mainQueue +{ + NSData* testData = [NSStringFromSelector(_cmd) dataUsingEncoding:NSUTF8StringEncoding]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return YES; + } withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) { + return [[OHHTTPStubsResponse responseWithData:testData + statusCode:200 + headers:nil] + requestTime:kRequestTime responseTime:kResponseTime]; + }]; + + NSDate* startDate = [NSDate date]; + + NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.iana.org/domains/example/"]]; + + XCTAssertEqualObjects(data, testData, @"Invalid returned string"); + XCTAssertEqualWithAccuracy(-[startDate timeIntervalSinceNow], kRequestTime+kResponseTime, kResponseTimeTolerence, @"Invalid response time"); +} + +-(void)test_NSData_dataWithContentsOfURL_parallelQueue +{ + XCTestExpectation* expectation = [self expectationWithDescription:@"Synchronous download finished"]; + [[NSOperationQueue new] addOperationWithBlock:^{ + [self test_NSData_dataWithContentsOfURL_mainQueue]; + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kRequestTime+kResponseTime+kResponseTimeTolerence handler:nil]; +} + +@end diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Info.plist b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Info.plist new file mode 100644 index 000000000..e2305ec01 --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.alisoftware.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Prefix.pch b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Prefix.pch new file mode 100644 index 000000000..a0a31a66c --- /dev/null +++ b/test/ios/OHHTTPStubs/OHHTTPStubs/UnitTests/UnitTests-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'OHHTTPStubs Unit Tests' target in the 'OHHTTPStubs Unit Tests' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/test/ios/OHHTTPStubs/README.md b/test/ios/OHHTTPStubs/README.md new file mode 100644 index 000000000..dafd89fa5 --- /dev/null +++ b/test/ios/OHHTTPStubs/README.md @@ -0,0 +1,113 @@ +OHHTTPStubs +=========== + +[![Platform](http://cocoapod-badges.herokuapp.com/p/OHHTTPStubs/badge.png)](http://cocoadocs.org/docsets/OHHTTPStubs) +[![Version](http://cocoapod-badges.herokuapp.com/v/OHHTTPStubs/badge.png)](http://cocoadocs.org/docsets/OHHTTPStubs) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Build Status](https://travis-ci.org/AliSoftware/OHHTTPStubs.png?branch=master)](https://travis-ci.org/AliSoftware/OHHTTPStubs) + +`OHHTTPStubs` is a library designed to stub your network requests very easily. It can help you: + +* test your apps with **fake network data** (stubbed from file) and **simulate slow networks**, to check your application behavior in bad network conditions +* write **Unit Tests** that use fake network data from your fixtures. + +It works with `NSURLConnection`, new iOS7/OSX.9's `NSURLSession`, `AFNetworking` (both 1.x and 2.x), or any networking framework that use Cocoa's URL Loading System. + +[![Donate](http://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TRTU3UEWEHV92 "Donate") + +---- + +# Documentation & Usage Examples + +`OHHTTPStubs` headers are fully documented using Appledoc-like / Headerdoc-like comments in the header files. You can also [read the **online documentation** here](http://cocoadocs.org/docsets/OHHTTPStubs) +[![Version](http://cocoapod-badges.herokuapp.com/v/OHHTTPStubs/badge.png)](http://cocoadocs.org/docsets/OHHTTPStubs) + + +## Basic example + +### In Objective-C + +```objc +[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { + return [request.URL.host isEqualToString:@"mywebservice.com"]; +} withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { + // Stub it with our "wsresponse.json" stub file (which is in same bundle as self) + NSString* fixture = OHPathForFile(@"wsresponse.json", self.class); + return [OHHTTPStubsResponse responseWithFileAtPath:fixture + statusCode:200 headers:@{@"Content-Type":@"application/json"}]; +}]; +``` + +### In Swift + +```swift +OHHTTPStubs.stubRequestsPassingTest({$0.URL!.host == "mywebservice.com"}) { _ in + // Stub it with our "wsresponse.json" stub file (which is in same bundle as self) + let fixture = OHPathForFile("wsresponse.json", self.dynamicType) + return OHHTTPStubsResponse(fileAtPath: fixture!, + statusCode: 200, headers: ["Content-Type":"application/json"]) +} +``` + +## More examples & Help Topics + +* For a lot more examples, see the dedicated "[Usage Examples](https://github.com/AliSoftware/OHHTTPStubs/wiki/Usage-Examples)" wiki page. +* The wiki also contain [some articles that can help you get started](https://github.com/AliSoftware/OHHTTPStubs/wiki) with (and troubleshoot if needed) `OHHTTPStubs`. + +# Compatibility + +`OHHTTPStubs` is compatible with **iOS 5.0+** and **OSX 10.7+**. + +`OHHTTPStubs` also works with iOS7's and OSX 10.9's `NSURLSession` mechanism. + +`OHHTTPStubs` is fully **Swift-compatible**. [Nullability annotations](https://developer.apple.com/swift/blog/?id=25) have been added to allow a cleaner API when used from Swift. + +# Installing in your projects + +Using [CocoaPods](https://guides.cocoapods.org) is the recommended way. +Simply add `pod 'OHHTTPStubs'` to your `Podfile`. + +_`OHHTTPStubs` should also be compatible with Carthage — but I won't guarantee help/support for it as I don't use it personally._ + +# Special Considerations + +## Using OHHTTPStubs in your Unit Tests + +`OHHTTPStubs` is ideal to write Unit Tests that normally would perform network requests. But if you use it in your Unit Tests, don't forget to: + +* remove any stubs you installed after each test — to avoid those stubs to still be installed when executing the next Test Case — by calling `[OHHTTPStubs removeAllStubs]` in your `tearDown` method. [see this wiki page for more info](https://github.com/AliSoftware/OHHTTPStubs/wiki/Remove-stubs-after-each-test) +* be sure to wait until the request has received its response before doing your assertions and letting the test case finish (like for any asynchronous test). [see this wiki page for more info](https://github.com/AliSoftware/OHHTTPStubs/wiki/OHHTTPStubs-and-asynchronous-tests) + +## Automatic loading + +Thanks to method swizzling, `OHHTTPStubs` is automatically loaded and installed both for: + +* requests made using `NSURLConnection` or `[NSURLSession sharedSession]`; +* requests made using a `NSURLSession` created using a `[NSURLSessionConfiguration defaultSessionConfiguration]` or `[NSURLSessionConfiguration ephemeralSessionConfiguration]` configuration (using `[NSURLSession sessionWithConfiguration:…]`-like methods). + +If you need to disable (and re-enable) `OHHTTPStubs` — globally or per `NSURLSession` — you can use `[OHHTTPStubs setEnabled:]` / `[OHHTTPStubs setEnabled:forSessionConfiguration:]`. + +## Known limitations + +* `OHHTTPStubs` **can't work on background sessions** (sessions created using `[NSURLSessionConfiguration backgroundSessionConfiguration]`) because background sessions don't allow the use of custom `NSURLProtocols` and are handled by the iOS Operating System itself. +* `OHHTTPStubs` don't simulate data upload. The `NSURLProtocolClient` `@protocol` does not provide a way to signal the delegate that data has been **sent** (only that some has been loaded), so any data in the `HTTPBody` or `HTTPBodyStream` of an `NSURLRequest`, or data provided to `-[NSURLSession uploadTaskWithRequest:fromData:];` will be ignored, and more importantly, the `-URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:` delegate method will never be called when you stub the request using `OHHTTPStubs`. + +_As far as I know, there's nothing we can do about those two limitations. Please let me know if you know a solution that would make that possible anyway._ + + +## Submitting to the AppStore + +`OHHTTPStubs` **can be used** on apps subbmiting **on the AppStore**. It does not use any private API and nothing prevents you from shipping it. + +But you generally only use stubs during the development phase and want to remove your stubs when submitting to the AppStore. So be careful to only include `OHHTTPStubs` when needed (only in your test targets, or only inside `#if DEBUG` portions, or by using [per-Build-Configuration pods](https://guides.cocoapods.org/syntax/podfile.html#pod)) to avoid forgetting to remove it when the time comes that you release for the AppStore and you want your requests to hit the net! + + + +# License and Credits + +This project and library has been created by Olivier Halligon (@aligatr on Twitter) and is under the MIT License. + +It has been inspired by [this article from InfiniteLoop.dk](http://www.infinite-loop.dk/blog/2011/09/using-nsurlprotocol-for-injecting-test-data/). +I would also like to thank to @kcharwood for its contribution, and everyone who contributed to this project on GitHub. + +If you want to support the development of this library, feel free to [![Donate](http://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TRTU3UEWEHV92 "Donate"). Thanks to all contributors so far! diff --git a/test/ios/OHHTTPStubs/Rakefile b/test/ios/OHHTTPStubs/Rakefile new file mode 100644 index 000000000..094945cdc --- /dev/null +++ b/test/ios/OHHTTPStubs/Rakefile @@ -0,0 +1,55 @@ +# Build & test OHHTTPStubs lib from the CLI + +desc 'Build an iOS scheme' +task :ios, [:scheme, :ios_version, :action] do |_,args| + destination = "platform=iOS Simulator,name=iPhone 5,OS=#{args.ios_version}" + build("OHHTTPStubs #{args.scheme}", "iphonesimulator", destination, args.action) +end + +desc 'Build an OSX scheme' +task :osx, [:scheme, :arch, :action] do |_,args| + destination = "platform=OS X,arch=#{args.arch}" + build("OHHTTPStubs #{args.scheme}", "macosx", destination, args.action) +end + +desc 'List installed simulators' +task :simlist do + sh 'xcrun simctl list' +end + +desc 'Run all travis env tasks locally' +task :travis do + require 'YAML' + travis = YAML.load_file('.travis.yml') + travis['env'].each do |env| + arg = env.split('=')[1] + puts "\n" + ('-'*80) + "\n\n" + sh "rake #{arg}" + end +end + + +# Build the xcodebuild command and run it +def build(scheme, sdk, destination, action) + puts <<-ANNOUNCE + ============================= + | Action: #{action} + | Scheme: "#{scheme}" + | #{destination} + ============================= + + ANNOUNCE + + cmd = %W( + xcodebuild + -workspace OHHTTPStubs/OHHTTPStubs.xcworkspace + -scheme "#{scheme}" + -sdk #{sdk} + -configuration Release + ONLY_ACTIVE_ARCH=NO + -destination '#{destination}' + #{action} + ) + + sh "set -o pipefail && #{cmd.join(' ')} | xcpretty -c" +end diff --git a/test/ios/ios-tests.xcodeproj/project.pbxproj b/test/ios/ios-tests.xcodeproj/project.pbxproj index f644d912d..d6c6344c2 100644 --- a/test/ios/ios-tests.xcodeproj/project.pbxproj +++ b/test/ios/ios-tests.xcodeproj/project.pbxproj @@ -14,6 +14,14 @@ DD0581041ACB661200B112C9 /* Headers in Resources */ = {isa = PBXBuildFile; fileRef = DD0581031ACB661200B112C9 /* Headers */; }; DD0581061ACB661C00B112C9 /* MapboxGL.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DD0581051ACB661C00B112C9 /* MapboxGL.bundle */; }; DD0581081ACB663200B112C9 /* libMapboxGL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DD0581071ACB663200B112C9 /* libMapboxGL.a */; }; + DD0E6F671B01806600DC035A /* MetricsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6F661B01806600DC035A /* MetricsTests.m */; }; + DD0E6F841B0190E200DC035A /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DD0E6F701B0190E200DC035A /* libOCMock.a */; }; + DD0E6F981B01B68E00DC035A /* OHHTTPStubs.m in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6F8E1B01B68E00DC035A /* OHHTTPStubs.m */; }; + DD0E6F991B01B68E00DC035A /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6F8F1B01B68E00DC035A /* OHHTTPStubs+NSURLSessionConfiguration.m */; }; + DD0E6F9A1B01B68E00DC035A /* OHHTTPStubsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6F911B01B68E00DC035A /* OHHTTPStubsResponse.m */; }; + DD0E6F9B1B01B68E00DC035A /* OHHTTPStubsResponse+HTTPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6F931B01B68E00DC035A /* OHHTTPStubsResponse+HTTPMessage.m */; }; + DD0E6F9C1B01B68E00DC035A /* OHHTTPStubsResponse+JSON.m in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6F951B01B68E00DC035A /* OHHTTPStubsResponse+JSON.m */; }; + DD0E6F9D1B01B68E00DC035A /* OHPathHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = DD0E6F971B01B68E00DC035A /* OHPathHelpers.m */; }; DD41CE091ACB5DBC00FA7979 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD41CE081ACB5DBC00FA7979 /* CoreTelephony.framework */; }; DD41CE0B1ACB5DC400FA7979 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD41CE0A1ACB5DC400FA7979 /* SystemConfiguration.framework */; }; DD41CE0D1ACB5DCB00FA7979 /* libc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DD41CE0C1ACB5DCB00FA7979 /* libc++.dylib */; }; @@ -85,6 +93,28 @@ DD0581031ACB661200B112C9 /* Headers */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Headers; path = ../../build/ios/pkg/static/Headers; sourceTree = SOURCE_ROOT; }; DD0581051ACB661C00B112C9 /* MapboxGL.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = MapboxGL.bundle; path = ../../build/ios/pkg/static/MapboxGL.bundle; sourceTree = SOURCE_ROOT; }; DD0581071ACB663200B112C9 /* libMapboxGL.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libMapboxGL.a; path = ../../build/ios/pkg/static/libMapboxGL.a; sourceTree = SOURCE_ROOT; }; + DD0E6F661B01806600DC035A /* MetricsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MetricsTests.m; sourceTree = SOURCE_ROOT; }; + DD0E6F701B0190E200DC035A /* libOCMock.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libOCMock.a; path = OCMock/libOCMock.a; sourceTree = SOURCE_ROOT; }; + DD0E6F721B0190E200DC035A /* NSNotificationCenter+OCMAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNotificationCenter+OCMAdditions.h"; sourceTree = ""; }; + DD0E6F731B0190E200DC035A /* OCMArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMArg.h; sourceTree = ""; }; + DD0E6F741B0190E200DC035A /* OCMConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMConstraint.h; sourceTree = ""; }; + DD0E6F751B0190E200DC035A /* OCMLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMLocation.h; sourceTree = ""; }; + DD0E6F761B0190E200DC035A /* OCMMacroState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMMacroState.h; sourceTree = ""; }; + DD0E6F771B0190E200DC035A /* OCMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMock.h; sourceTree = ""; }; + DD0E6F781B0190E200DC035A /* OCMockObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMockObject.h; sourceTree = ""; }; + DD0E6F791B0190E200DC035A /* OCMRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMRecorder.h; sourceTree = ""; }; + DD0E6F7A1B0190E200DC035A /* OCMStubRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMStubRecorder.h; sourceTree = ""; }; + DD0E6F8D1B01B68E00DC035A /* OHHTTPStubs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubs.h; path = OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.h; sourceTree = SOURCE_ROOT; }; + DD0E6F8E1B01B68E00DC035A /* OHHTTPStubs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubs.m; path = OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs.m; sourceTree = SOURCE_ROOT; }; + DD0E6F8F1B01B68E00DC035A /* OHHTTPStubs+NSURLSessionConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "OHHTTPStubs+NSURLSessionConfiguration.m"; path = "OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubs+NSURLSessionConfiguration.m"; sourceTree = SOURCE_ROOT; }; + DD0E6F901B01B68E00DC035A /* OHHTTPStubsResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OHHTTPStubsResponse.h; path = OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.h; sourceTree = SOURCE_ROOT; }; + DD0E6F911B01B68E00DC035A /* OHHTTPStubsResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OHHTTPStubsResponse.m; path = OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse.m; sourceTree = SOURCE_ROOT; }; + DD0E6F921B01B68E00DC035A /* OHHTTPStubsResponse+HTTPMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "OHHTTPStubsResponse+HTTPMessage.h"; path = "OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.h"; sourceTree = SOURCE_ROOT; }; + DD0E6F931B01B68E00DC035A /* OHHTTPStubsResponse+HTTPMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "OHHTTPStubsResponse+HTTPMessage.m"; path = "OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+HTTPMessage.m"; sourceTree = SOURCE_ROOT; }; + DD0E6F941B01B68E00DC035A /* OHHTTPStubsResponse+JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "OHHTTPStubsResponse+JSON.h"; path = "OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.h"; sourceTree = SOURCE_ROOT; }; + DD0E6F951B01B68E00DC035A /* OHHTTPStubsResponse+JSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "OHHTTPStubsResponse+JSON.m"; path = "OHHTTPStubs/OHHTTPStubs/Sources/OHHTTPStubsResponse+JSON.m"; sourceTree = SOURCE_ROOT; }; + DD0E6F961B01B68E00DC035A /* OHPathHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OHPathHelpers.h; path = OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.h; sourceTree = SOURCE_ROOT; }; + DD0E6F971B01B68E00DC035A /* OHPathHelpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OHPathHelpers.m; path = OHHTTPStubs/OHHTTPStubs/Sources/OHPathHelpers.m; sourceTree = SOURCE_ROOT; }; DD41CE061ACB5DB300FA7979 /* libMapboxGL.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libMapboxGL.a; path = ../../build/ios/pkg/static/libMapboxGL.a; sourceTree = ""; }; DD41CE081ACB5DBC00FA7979 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; DD41CE0A1ACB5DC400FA7979 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; @@ -125,6 +155,7 @@ files = ( DD0580E81ACB628200B112C9 /* IOKit.framework in Frameworks */, DDBD016E196DC4A10033959E /* libKIF.a in Frameworks */, + DD0E6F841B0190E200DC035A /* libOCMock.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -191,6 +222,50 @@ name = "Supporting Files"; sourceTree = ""; }; + DD0E6F6B1B01906600DC035A /* OCMock */ = { + isa = PBXGroup; + children = ( + DD0E6F701B0190E200DC035A /* libOCMock.a */, + DD0E6F711B0190E200DC035A /* OCMock */, + ); + name = OCMock; + sourceTree = ""; + }; + DD0E6F711B0190E200DC035A /* OCMock */ = { + isa = PBXGroup; + children = ( + DD0E6F721B0190E200DC035A /* NSNotificationCenter+OCMAdditions.h */, + DD0E6F731B0190E200DC035A /* OCMArg.h */, + DD0E6F741B0190E200DC035A /* OCMConstraint.h */, + DD0E6F751B0190E200DC035A /* OCMLocation.h */, + DD0E6F761B0190E200DC035A /* OCMMacroState.h */, + DD0E6F771B0190E200DC035A /* OCMock.h */, + DD0E6F781B0190E200DC035A /* OCMockObject.h */, + DD0E6F791B0190E200DC035A /* OCMRecorder.h */, + DD0E6F7A1B0190E200DC035A /* OCMStubRecorder.h */, + ); + name = OCMock; + path = OCMock/OCMock; + sourceTree = SOURCE_ROOT; + }; + DD0E6F861B01B67100DC035A /* OHHTTPStubs */ = { + isa = PBXGroup; + children = ( + DD0E6F8D1B01B68E00DC035A /* OHHTTPStubs.h */, + DD0E6F8E1B01B68E00DC035A /* OHHTTPStubs.m */, + DD0E6F8F1B01B68E00DC035A /* OHHTTPStubs+NSURLSessionConfiguration.m */, + DD0E6F901B01B68E00DC035A /* OHHTTPStubsResponse.h */, + DD0E6F911B01B68E00DC035A /* OHHTTPStubsResponse.m */, + DD0E6F921B01B68E00DC035A /* OHHTTPStubsResponse+HTTPMessage.h */, + DD0E6F931B01B68E00DC035A /* OHHTTPStubsResponse+HTTPMessage.m */, + DD0E6F941B01B68E00DC035A /* OHHTTPStubsResponse+JSON.h */, + DD0E6F951B01B68E00DC035A /* OHHTTPStubsResponse+JSON.m */, + DD0E6F961B01B68E00DC035A /* OHPathHelpers.h */, + DD0E6F971B01B68E00DC035A /* OHPathHelpers.m */, + ); + name = OHHTTPStubs; + sourceTree = ""; + }; DDAE739B1ACB557500E1A793 /* GL Library */ = { isa = PBXGroup; children = ( @@ -207,8 +282,11 @@ DDBD016B196DC4740033959E /* KIFTestActor+MapboxGL.h */, DDBD016A196DC4740033959E /* KIFTestActor+MapboxGL.m */, DDBD0168196DC4740033959E /* MapViewTests.m */, + DD0E6F661B01806600DC035A /* MetricsTests.m */, DDBD0167196DC46B0033959E /* Supporting Files */, DDBD014D196DC3B00033959E /* KIF */, + DD0E6F6B1B01906600DC035A /* OCMock */, + DD0E6F861B01B67100DC035A /* OHHTTPStubs */, ); name = Tests; path = "Mapbox GL Tests"; @@ -392,8 +470,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + DD0E6F981B01B68E00DC035A /* OHHTTPStubs.m in Sources */, + DD0E6F9C1B01B68E00DC035A /* OHHTTPStubsResponse+JSON.m in Sources */, + DD0E6F9B1B01B68E00DC035A /* OHHTTPStubsResponse+HTTPMessage.m in Sources */, DDBD016D196DC4740033959E /* KIFTestActor+MapboxGL.m in Sources */, + DD0E6F991B01B68E00DC035A /* OHHTTPStubs+NSURLSessionConfiguration.m in Sources */, + DD0E6F9A1B01B68E00DC035A /* OHHTTPStubsResponse.m in Sources */, + DD0E6F671B01806600DC035A /* MetricsTests.m in Sources */, DDBD016C196DC4740033959E /* MapViewTests.m in Sources */, + DD0E6F9D1B01B68E00DC035A /* OHPathHelpers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -545,8 +630,13 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "../../build/ios/pkg/static/**", + OCMock, ); INFOPLIST_FILE = "Bundle-Info.plist"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/OCMock", + ); OTHER_LDFLAGS = ( "$(inherited)", "-framework", @@ -574,8 +664,13 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "../../build/ios/pkg/static/**", + OCMock, ); INFOPLIST_FILE = "Bundle-Info.plist"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/OCMock", + ); OTHER_LDFLAGS = ( "$(inherited)", "-framework", From 6519d23611755a3cb1d17cbf6068941673af9e11 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Tue, 12 May 2015 18:36:59 -0700 Subject: [PATCH 06/15] Merge pull request #1491 from mapbox/1ec5-metrics-opt-way-out refactor metrics system to immediately jettison data & tracking when users opt out --- gyp/platform-ios.gypi | 3 +- include/mbgl/ios/MGLAccountManager.h | 31 +- include/mbgl/ios/MGLMapboxEvents.h | 7 +- include/mbgl/ios/MGLMetricsLocationManager.h | 13 - include/mbgl/ios/MapboxGL.h | 2 +- platform/ios/MGLAccountManager.m | 54 +- platform/ios/MGLMapView.mm | 13 +- platform/ios/MGLMapboxEvents.m | 531 ++++++++++-------- platform/ios/MGLMapboxEvents_Private.h | 7 + platform/ios/MGLMetricsLocationManager.m | 107 ---- test/ios/ios-tests.xcodeproj/project.pbxproj | 2 + .../xcshareddata/ios-tests.xccheckout | 12 + 12 files changed, 394 insertions(+), 388 deletions(-) delete mode 100644 include/mbgl/ios/MGLMetricsLocationManager.h create mode 100644 platform/ios/MGLMapboxEvents_Private.h delete mode 100644 platform/ios/MGLMetricsLocationManager.m diff --git a/gyp/platform-ios.gypi b/gyp/platform-ios.gypi index 1f96f9470..7e91648c4 100644 --- a/gyp/platform-ios.gypi +++ b/gyp/platform-ios.gypi @@ -19,6 +19,7 @@ '../platform/darwin/reachability.m', '../include/mbgl/ios/MapboxGL.h', '../include/mbgl/ios/MGLMapboxEvents.h', + '../platform/ios/MGLMapboxEvents_Private.h', '../platform/ios/MGLMapboxEvents.m', '../include/mbgl/ios/MGLMapView.h', '../include/mbgl/ios/MGLMapView+IBAdditions.h', @@ -33,8 +34,6 @@ '../platform/ios/MGLUserLocation.m', '../platform/ios/MGLUserLocationAnnotationView.h', '../platform/ios/MGLUserLocationAnnotationView.m', - '../include/mbgl/ios/MGLMetricsLocationManager.h', - '../platform/ios/MGLMetricsLocationManager.m', '../include/mbgl/ios/MGLTypes.h', '../platform/ios/NSBundle+MGLAdditions.h', '../platform/ios/NSBundle+MGLAdditions.m', diff --git a/include/mbgl/ios/MGLAccountManager.h b/include/mbgl/ios/MGLAccountManager.h index f8bb2bf9a..7ec4135f1 100644 --- a/include/mbgl/ios/MGLAccountManager.h +++ b/include/mbgl/ios/MGLAccountManager.h @@ -1,8 +1,29 @@ +#import + +/** The MGLAccountManager object provides a global way to set a Mapbox API access token, as well as other settings used framework-wide. */ @interface MGLAccountManager : NSObject -+ (void) setMapboxMetricsEnabledSettingShownInApp:(BOOL)showsOptOut; -+ (BOOL) mapboxMetricsEnabledSettingShownInApp; -+ (void) setAccessToken:(NSString *) accessToken; -+ (NSString *) accessToken; +/** @name Authorizing Access */ -@end \ No newline at end of file +/** Set the Mapbox API access token for the framework. +* +* You can set an access token on MGLAccountManager or on an individual map view. The same token is used throughout the framework. +* @param accessToken The Mapbox API access token. */ ++ (void)setAccessToken:(NSString *)accessToken; + +/** Retreive the Mapbox API access token for the framework. +* +* You can set an access token on MGLAccountManager or on an individual map view. The same token is used throughout the framework. +* @return accessToken The Mapbox API access token. */ ++ (NSString *)accessToken; + +/** @name Providing User Metrics Opt-Out */ + +/** Certain Mapbox plans require the collection of user metrics. If you aren't using a preference switch in an existing or new `Settings.bundle` in your application, set this value to `YES` to indicate that you are providing a metrics opt-out for users within your app's interface directly. +* @param showsOptOut Whether your application's interface provides a user opt-out preference. The default value is `NO`, meaning a `Settings.bundle` is expected for providing a user opt-out preference. */ ++ (void)setMapboxMetricsEnabledSettingShownInApp:(BOOL)showsOptOut; + +/** Whether in-app user metrics opt-out is configured. If set to the default value of `NO`, a user opt-out preference is expected in a `Settings.bundle` that shows in the application's section within the system Settings app. */ ++ (BOOL)mapboxMetricsEnabledSettingShownInApp; + +@end diff --git a/include/mbgl/ios/MGLMapboxEvents.h b/include/mbgl/ios/MGLMapboxEvents.h index c70c7cb33..5c5d8a924 100644 --- a/include/mbgl/ios/MGLMapboxEvents.h +++ b/include/mbgl/ios/MGLMapboxEvents.h @@ -32,10 +32,6 @@ extern NSString *const MGLEventGestureRotateStart; // You must call these methods from the main thread. // -+ (void) setToken:(NSString *)token; -+ (void) setAppName:(NSString *)appName; -+ (void) setAppVersion:(NSString *)appVersion; -+ (void) setAppBuildNumber:(NSString *)appBuildNumber; + (void) pauseMetricsCollection; + (void) resumeMetricsCollection; @@ -58,4 +54,7 @@ extern NSString *const MGLEventGestureRotateStart; // + (void) flush; +// Main thread only ++ (void)validate; + @end diff --git a/include/mbgl/ios/MGLMetricsLocationManager.h b/include/mbgl/ios/MGLMetricsLocationManager.h deleted file mode 100644 index f02c76f53..000000000 --- a/include/mbgl/ios/MGLMetricsLocationManager.h +++ /dev/null @@ -1,13 +0,0 @@ -#import - -@interface MGLMetricsLocationManager : NSObject - -// These methods can be called from any thread. -// -+ (instancetype)sharedManager; -- (void) startUpdatingLocation; -- (void) stopUpdatingLocation; -- (void) startMonitoringVisits; -- (void) stopMonitoringVisits; - -@end diff --git a/include/mbgl/ios/MapboxGL.h b/include/mbgl/ios/MapboxGL.h index 34e080a51..a6d23d328 100644 --- a/include/mbgl/ios/MapboxGL.h +++ b/include/mbgl/ios/MapboxGL.h @@ -1,5 +1,5 @@ +#import "MGLAccountManager.h" #import "MGLAnnotation.h" #import "MGLMapView.h" #import "MGLTypes.h" #import "MGLUserLocation.h" -#import "MGLAccountManager.h" \ No newline at end of file diff --git a/platform/ios/MGLAccountManager.m b/platform/ios/MGLAccountManager.m index 09bfb3db2..32540e4e4 100644 --- a/platform/ios/MGLAccountManager.m +++ b/platform/ios/MGLAccountManager.m @@ -1,12 +1,12 @@ #import #import "MGLAccountManager.h" +#import "MGLMapboxEvents_Private.h" #import "NSProcessInfo+MGLAdditions.h" -#import "MGLMapboxEvents.h" @interface MGLAccountManager() -@property (atomic) BOOL showsOptOutInApp; +@property (atomic) BOOL mapboxMetricsEnabledSettingShownInApp; @property (atomic) NSString *accessToken; @end @@ -14,49 +14,49 @@ @implementation MGLAccountManager -static MGLAccountManager *_sharedManager; - // Can be called from any thread. // -+ (instancetype) sharedInstance { ++ (instancetype) sharedManager { + if (NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent) { + return; + } static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - if ( ! NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent) { - void (^setupBlock)() = ^{ - _sharedManager = [[self alloc] init]; - _sharedManager.showsOptOutInApp = NO; - }; - if ( ! [[NSThread currentThread] isMainThread]) { - dispatch_sync(dispatch_get_main_queue(), ^{ - setupBlock(); - }); - } - else { - setupBlock(); - } - } - }); + static MGLAccountManager *_sharedManager; + void (^setupBlock)() = ^{ + dispatch_once(&onceToken, ^{ + _sharedManager = [[self alloc] init]; + _sharedManager.mapboxMetricsEnabledSettingShownInApp = NO; + }); + }; + if ( ! [[NSThread currentThread] isMainThread]) { + dispatch_sync(dispatch_get_main_queue(), ^{ + setupBlock(); + }); + } + else { + setupBlock(); + } return _sharedManager; } -+ (void) setMapboxMetricsEnabledSettingShownInApp:(BOOL)showsOptOut { - [MGLAccountManager sharedInstance].showsOptOutInApp = showsOptOut; ++ (void) setMapboxMetricsEnabledSettingShownInApp:(BOOL)shown { + [MGLAccountManager sharedManager].mapboxMetricsEnabledSettingShownInApp = shown; } + (BOOL) mapboxMetricsEnabledSettingShownInApp { - return [MGLAccountManager sharedInstance].showsOptOutInApp; + return [MGLAccountManager sharedManager].mapboxMetricsEnabledSettingShownInApp; } + (void) setAccessToken:(NSString *) accessToken { - [[MGLAccountManager sharedInstance] setAccessToken:accessToken]; + [[MGLAccountManager sharedManager] setAccessToken:accessToken]; // Update MGLMapboxEvents // NOTE: This is (likely) the initial setup of MGLMapboxEvents - [MGLMapboxEvents setToken:accessToken]; + [MGLMapboxEvents sharedManager]; } + (NSString *) accessToken { - return [MGLAccountManager sharedInstance].accessToken; + return [MGLAccountManager sharedManager].accessToken; } diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index b6ae9eb99..dbc86b213 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -20,6 +20,7 @@ #import "NSString+MGLAdditions.h" #import "NSProcessInfo+MGLAdditions.h" #import "NSException+MGLAdditions.h" +#import "MGLAccountManager.h" #import "MGLAnnotation.h" #import "MGLUserLocationAnnotationView.h" #import "MGLUserLocation_Private.h" @@ -158,7 +159,7 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) - (void)setAccessToken:(NSString *)accessToken { _mbglMap->setAccessToken(accessToken ? (std::string)[accessToken UTF8String] : ""); - [MGLMapboxEvents setToken:accessToken.mgl_stringOrNilIfEmpty]; + [MGLAccountManager setAccessToken:accessToken.mgl_stringOrNilIfEmpty]; } + (NSSet *)keyPathsForValuesAffectingStyleURL @@ -210,14 +211,6 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) // setup accessibility // self.accessibilityLabel = @"Map"; - - // metrics: initial setup - NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; - NSString *appVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - NSString *appBuildNumber = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; - if (appName != nil) [MGLMapboxEvents setAppName:appName]; - if (appVersion != nil) [MGLMapboxEvents setAppVersion:appVersion]; - if (appBuildNumber != nil) [MGLMapboxEvents setAppBuildNumber:appBuildNumber]; // create GL view // @@ -711,6 +704,8 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) if (self.isDormant) { self.dormant = NO; + + [MGLMapboxEvents validate]; self.glSnapshotView.hidden = YES; diff --git a/platform/ios/MGLMapboxEvents.m b/platform/ios/MGLMapboxEvents.m index cb4cdce60..9fcfc7153 100644 --- a/platform/ios/MGLMapboxEvents.m +++ b/platform/ios/MGLMapboxEvents.m @@ -1,15 +1,15 @@ -#import "MGLMapboxEvents.h" +#import "MGLMapboxEvents_Private.h" #import #import #import #import +#import -#import "MGLMetricsLocationManager.h" +#import "MGLAccountManager.h" #import "NSProcessInfo+MGLAdditions.h" #import "NSBundle+MGLAdditions.h" #import "NSException+MGLAdditions.h" -#import "MGLAccountManager.m" #include @@ -44,133 +44,30 @@ NSString *const MGLEventGesturePanStart = @"Pan"; NSString *const MGLEventGesturePinchStart = @"Pinch"; NSString *const MGLEventGestureRotateStart = @"Rotation"; -// -// Threadsafety conventions: -// -// All variables accessed from more than one thread are -// designated `atomic` and accessed through dot syntax. The -// main thread uses underscore syntax during the -// initialization of the variable. -// -// All variables accessed outside of initialization and -// from within a single thread use underscore syntax. -// -// All captures of `self` from within asynchronous -// dispatches will use a `strongSelf` to avoid cyclical -// strong references. -// +const NSUInteger MGLMaximumEventsPerFlush = 20; +const NSTimeInterval MGLFlushInterval = 60; -@interface MGLMapboxEvents() +@interface MGLMapboxEventsData : NSObject // All of the following properties are written to only from // the main thread, but can be read on any thread. // -@property (atomic) NSString *token; -@property (atomic) NSString *appName; -@property (atomic) NSString *appVersion; -@property (atomic) NSString *appBuildNumber; @property (atomic) NSString *instanceID; @property (atomic) NSString *advertiserId; @property (atomic) NSString *vendorId; -@property (atomic) NSString *appBundleId; -@property (atomic) NSString *userAgent; @property (atomic) NSString *model; @property (atomic) NSString *iOSVersion; @property (atomic) NSString *carrier; -@property (atomic) NSUInteger flushAt; -@property (atomic) NSDateFormatter *rfc3339DateFormatter; @property (atomic) CGFloat scale; -@property (atomic) NSURLSession *session; -@property (atomic) NSData *digicertCert; -@property (atomic) NSData *geoTrustCert; - - -// The paused state tracker is only ever accessed from the main thread. -// -@property (nonatomic, getter=isPaused) BOOL paused; - -// The timer is only ever accessed from the main thread. -// -@property (nonatomic) NSTimer *timer; - -// The flush expiration time is only ever accessed from the main thread. -// -@property (nonatomic) NSTimeInterval flushAfter; - -// This is an array of events to push. All access to it will be -// from our own serial queue. -// -@property (nonatomic) NSMutableArray *eventQueue; - -// This is a custom serial queue for accessing the event queue. -// -@property (nonatomic) dispatch_queue_t serialQueue; @end -@implementation MGLMapboxEvents +@implementation MGLMapboxEventsData -// Must be called from the main thread. Only called internally. -// -- (instancetype) init { - MGLAssertIsMainThread(); - - self = [super init]; - if (self) { - - if (! [MGLAccountManager mapboxMetricsEnabledSettingShownInApp]) { - // Opt Out is not configured in UI, so check for Settings.bundle - // Put Settings bundle into memory - NSString *appSettingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; - - NSAssert(appSettingsBundle, @"End users must be able to opt out of Metrics in your app, either inside Settings (via Settings.bundle) or inside this app. If you implement the opt-out control inside this app, disable this assertion by setting [MGLAccountManager setMapboxMetricsEnabledSettingShownInApp:YES] before the app initializes any Mapbox GL classes."); - - // Dynamic Settings.bundle loading based on: - // http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you-dont-open-the - NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[appSettingsBundle stringByAppendingPathComponent:@"Root.plist"]]; - NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; - NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; - for(NSDictionary *prefSpecification in preferences) { - NSString *key = [prefSpecification objectForKey:@"Key"]; - if(key && [[prefSpecification allKeys] containsObject:@"DefaultValue"]) { - [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; - } - } - - [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; - } - - _appBundleId = [[NSBundle mainBundle] bundleIdentifier]; - NSString *uniqueID = [[NSProcessInfo processInfo] globallyUniqueString]; - _serialQueue = dispatch_queue_create([[NSString stringWithFormat:@"%@.%@.events.serial", _appBundleId, uniqueID] UTF8String], DISPATCH_QUEUE_SERIAL); - - // Configure Events Infrastructure - // =============================== - - _paused = YES; - [self resumeMetricsCollection]; - NSBundle *resourceBundle = [NSBundle bundleWithPath:[NSBundle mgl_resourceBundlePath]]; - - // Load Local Copy of Server's Public Key - NSString *cerPath = nil; - cerPath = [resourceBundle pathForResource:@"api_mapbox_com-geotrust" ofType:@"der"]; - if (cerPath != nil) { - _geoTrustCert = [NSData dataWithContentsOfFile:cerPath]; - } - - cerPath = nil; - cerPath = [resourceBundle pathForResource:@"api_mapbox_com-digicert" ofType:@"der"]; - if (cerPath != nil) { - _digicertCert = [NSData dataWithContentsOfFile:cerPath]; - } - - // Events Control - _eventQueue = [[NSMutableArray alloc] init]; - _flushAt = 20; - _flushAfter = 60; - _token = nil; +- (instancetype)init { + if (self = [super init]) { _instanceID = [[NSUUID UUID] UUIDString]; - + // Dynamic detection of ASIdentifierManager from Mixpanel // https://github.com/mixpanel/mixpanel-iphone/blob/master/LICENSE _advertiserId = @""; @@ -189,7 +86,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; } _vendorId = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; - _model = [self getSysInfoByName:"hw.machine"]; + _model = [self sysInfoByName:"hw.machine"]; _iOSVersion = [NSString stringWithFormat:@"%@ %@", [UIDevice currentDevice].systemName, [UIDevice currentDevice].systemVersion]; if ([UIScreen instancesRespondToSelector:@selector(nativeScale)]) { _scale = [UIScreen mainScreen].nativeScale; @@ -198,8 +95,159 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; } CTCarrier *carrierVendor = [[[CTTelephonyNetworkInfo alloc] init] subscriberCellularProvider]; _carrier = [carrierVendor carrierName]; + } + return self; +} + +// Can be called from any thread. +// +- (NSString *)sysInfoByName:(char *)typeSpecifier +{ + size_t size; + sysctlbyname(typeSpecifier, NULL, &size, NULL, 0); + + char *answer = malloc(size); + sysctlbyname(typeSpecifier, answer, &size, NULL, 0); + + NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding]; + + free(answer); + return results; +} + +@end + +// +// Threadsafety conventions: +// +// All variables accessed from more than one thread are +// designated `atomic` and accessed through dot syntax. The +// main thread uses underscore syntax during the +// initialization of the variable. +// +// All variables accessed outside of initialization and +// from within a single thread use underscore syntax. +// +// All captures of `self` from within asynchronous +// dispatches will use a `strongSelf` to avoid cyclical +// strong references. +// + +@interface MGLMapboxEvents () + +// All of the following properties are written to only from +// the main thread, but can be read on any thread. +// +@property (atomic) MGLMapboxEventsData *data; +@property (atomic) NSString *appBundleId; +@property (atomic) NSString *appName; +@property (atomic) NSString *appVersion; +@property (atomic) NSString *appBuildNumber; +@property (atomic) NSDateFormatter *rfc3339DateFormatter; +@property (atomic) NSURLSession *session; +@property (atomic) NSData *digicertCert; +@property (atomic) NSData *geoTrustCert; + +// Main thread only +@property (nonatomic) CLLocationManager *locationManager; + +// The paused state tracker is only ever accessed from the main thread. +// +@property (nonatomic, getter=isPaused) BOOL paused; + +// The timer is only ever accessed from the main thread. +// +@property (nonatomic) NSTimer *timer; + +// This is an array of events to push. All access to it will be +// from our own serial queue. +// +@property (nonatomic) NSMutableArray *eventQueue; + +// This is a custom serial queue for accessing the event queue. +// +@property (nonatomic) dispatch_queue_t serialQueue; + +@end + +@implementation MGLMapboxEvents { + id _userDefaultsObserver; +} + ++ (void)initialize { + if (self == [MGLMapboxEvents class]) { + [[NSUserDefaults standardUserDefaults] registerDefaults:@{ + @"MGLMapboxAccountType": @0, + @"MGLMapboxMetricsEnabled": @YES, + }]; + } +} + ++ (BOOL)isEnabled { + return ([[NSUserDefaults standardUserDefaults] boolForKey:@"MGLMapboxMetricsEnabled"] && + [[NSUserDefaults standardUserDefaults] integerForKey:@"MGLMapboxAccountType"] == 0); +} + +// Must be called from the main thread. Only called internally. +// +- (instancetype) init { + MGLAssertIsMainThread(); + + self = [super init]; + if (self) { + if (! [MGLAccountManager mapboxMetricsEnabledSettingShownInApp]) { + // Opt Out is not configured in UI, so check for Settings.bundle + // Put Settings bundle into memory + id defaultEnabledValue; + NSString *appSettingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; + + if (appSettingsBundle) { + // Dynamic Settings.bundle loading based on: + // http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you-dont-open-the + NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[appSettingsBundle stringByAppendingPathComponent:@"Root.plist"]]; + NSArray *preferences = settings[@"PreferenceSpecifiers"]; + for (NSDictionary *prefSpecification in preferences) { + if ([prefSpecification[@"Key"] isEqualToString:@"MGLMapboxMetricsEnabled"]) { + defaultEnabledValue = prefSpecification[@"DefaultValue"]; + } + } + } + + NSAssert(defaultEnabledValue, @"End users must be able to opt out of Metrics in your app, either inside Settings (via Settings.bundle) or inside this app. If you implement the opt-out control inside this app, disable this assertion by setting [MGLAccountManager setMapboxMetricsEnabledSettingShownInApp:YES] before the app initializes any Mapbox GL classes."); + [[NSUserDefaults standardUserDefaults] registerDefaults:@{ + @"MGLMapboxMetricsEnabled": defaultEnabledValue, + }]; + } + + _appBundleId = [[NSBundle mainBundle] bundleIdentifier]; + _appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; + _appVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; + _appBuildNumber = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; - _userAgent = MGLMapboxEventsUserAgent; + NSString *uniqueID = [[NSProcessInfo processInfo] globallyUniqueString]; + _serialQueue = dispatch_queue_create([[NSString stringWithFormat:@"%@.%@.events.serial", _appBundleId, uniqueID] UTF8String], DISPATCH_QUEUE_SERIAL); + + // Configure Events Infrastructure + // =============================== + + _paused = YES; + [self resumeMetricsCollection]; + NSBundle *resourceBundle = [NSBundle bundleWithPath:[NSBundle mgl_resourceBundlePath]]; + + // Load Local Copy of Server's Public Key + NSString *cerPath = nil; + cerPath = [resourceBundle pathForResource:@"api_mapbox_com-geotrust" ofType:@"der"]; + if (cerPath != nil) { + _geoTrustCert = [NSData dataWithContentsOfFile:cerPath]; + } + + cerPath = [resourceBundle pathForResource:@"api_mapbox_com-digicert" ofType:@"der"]; + if (cerPath != nil) { + _digicertCert = [NSData dataWithContentsOfFile:cerPath]; + } + + // Events Control + _eventQueue = [[NSMutableArray alloc] init]; // Setup Date Format _rfc3339DateFormatter = [[NSDateFormatter alloc] init]; @@ -213,6 +261,16 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // Enable Battery Monitoring [UIDevice currentDevice].batteryMonitoringEnabled = YES; + + __weak MGLMapboxEvents *weakSelf = self; + _userDefaultsObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSUserDefaultsDidChangeNotification + object:nil + queue:[NSOperationQueue mainQueue] + usingBlock: + ^(NSNotification *notification) { + MGLMapboxEvents *strongSelf = weakSelf; + [strongSelf validate]; + }]; } return self; } @@ -221,57 +279,62 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // public class convenience methods. May return nil if this feature is disabled. // + (instancetype)sharedManager { + if (NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent) { + return; + } static dispatch_once_t onceToken; static MGLMapboxEvents *_sharedManager; - dispatch_once(&onceToken, ^{ - if ( ! NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent && - [[NSUserDefaults standardUserDefaults] integerForKey:@"MGLMapboxAccountType"] == 0) { - void (^setupBlock)() = ^{ - _sharedManager = [[self alloc] init]; - }; - if ( ! [[NSThread currentThread] isMainThread]) { - dispatch_sync(dispatch_get_main_queue(), ^{ - setupBlock(); - }); - } - else { - setupBlock(); - } - } - }); + void (^setupBlock)() = ^{ + dispatch_once(&onceToken, ^{ + _sharedManager = [[self alloc] init]; + }); + }; + if ( ! [[NSThread currentThread] isMainThread]) { + dispatch_sync(dispatch_get_main_queue(), ^{ + setupBlock(); + }); + } + else { + setupBlock(); + } return _sharedManager; } - (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:_userDefaultsObserver]; [self pauseMetricsCollection]; } -// Must be called from the main thread. -// -+ (void) setToken:(NSString *)token { - MGLAssertIsMainThread(); - [MGLMapboxEvents sharedManager].token = token; ++ (void)validate { + [[MGLMapboxEvents sharedManager] validate]; } -// Must be called from the main thread. -// -+ (void) setAppName:(NSString *)appName { +- (void)validate { MGLAssertIsMainThread(); - [MGLMapboxEvents sharedManager].appName = appName; + BOOL enabledInSettings = [[self class] isEnabled]; + if (self.paused && enabledInSettings) { + [self resumeMetricsCollection]; + } else if (!self.paused && !enabledInSettings) { + [self pauseMetricsCollection]; + } + + [self validateUpdatingLocation]; } -// Must be called from the main thread. -// -+ (void) setAppVersion:(NSString *)appVersion { +- (void)validateUpdatingLocation { MGLAssertIsMainThread(); - [MGLMapboxEvents sharedManager].appVersion = appVersion; -} - -// Must be called from the main thread. -// -+ (void) setAppBuildNumber:(NSString *)appBuildNumber { - MGLAssertIsMainThread(); - [MGLMapboxEvents sharedManager].appBuildNumber = appBuildNumber; + if (self.paused) { + [self stopUpdatingLocation]; + } else { + CLAuthorizationStatus authStatus = [CLLocationManager authorizationStatus]; + if (authStatus == kCLAuthorizationStatusDenied || + authStatus == kCLAuthorizationStatusRestricted) { + [self stopUpdatingLocation]; + } else if (authStatus == kCLAuthorizationStatusAuthorized || + authStatus == kCLAuthorizationStatusAuthorizedWhenInUse) { + [self startUpdatingLocation]; + } + } } + (void)pauseMetricsCollection { @@ -286,11 +349,25 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; return; } self.paused = YES; + [_timer invalidate]; + _timer = nil; + [_eventQueue removeAllObjects]; + _data = nil; [_session invalidateAndCancel]; _session = nil; - MGLMetricsLocationManager *sharedLocationManager = [MGLMetricsLocationManager sharedManager]; - [sharedLocationManager stopUpdatingLocation]; - [sharedLocationManager stopMonitoringVisits]; + + [self validateUpdatingLocation]; +} + +- (void)stopUpdatingLocation { + [_locationManager stopUpdatingLocation]; + + // -[CLLocationManager stopMonitoringVisits] is only available in iOS 8+. + if ([_locationManager respondsToSelector:@selector(stopMonitoringVisits)]) { + [_locationManager stopMonitoringVisits]; + } + + _locationManager = nil; } + (void)resumeMetricsCollection { @@ -301,14 +378,34 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // - (void)resumeMetricsCollection { MGLAssertIsMainThread(); - if (!self.isPaused) { + if (!self.paused || ![[self class] isEnabled]) { return; } self.paused = NO; + _data = [[MGLMapboxEventsData alloc] init]; _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil]; - MGLMetricsLocationManager *sharedLocationManager = [MGLMetricsLocationManager sharedManager]; - [sharedLocationManager startUpdatingLocation]; - [sharedLocationManager startMonitoringVisits]; + + [self validateUpdatingLocation]; +} + +- (void)startUpdatingLocation { + MGLAssertIsMainThread(); + if (_locationManager || _paused) { + NSAssert(!(_locationManager && _paused), + @"MGLMapboxEvents should not have a CLLocationManager while paused."); + return; + } + _locationManager = [[CLLocationManager alloc] init]; + _locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; + _locationManager.distanceFilter = 10; + _locationManager.delegate = self; + + [_locationManager startUpdatingLocation]; + + // -[CLLocationManager startMonitoringVisits] is only available in iOS 8+. + if ([_locationManager respondsToSelector:@selector(startMonitoringVisits)]) { + [_locationManager startMonitoringVisits]; + } } // Can be called from any thread. Can be called rapidly from @@ -330,12 +427,6 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; MGLMapboxEvents *strongSelf = weakSelf; if ( ! strongSelf) return; - // User has opted out - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"MGLMapboxMetricsEnabled"]) { - [_eventQueue removeAllObjects]; - return; - } - // Metrics Collection Has Been Paused if (_paused) { return; @@ -348,34 +439,34 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; [evt setObject:event forKey:@"event"]; [evt setObject:@(1) forKey:@"version"]; [evt setObject:[strongSelf.rfc3339DateFormatter stringFromDate:[NSDate date]] forKey:@"created"]; - [evt setObject:strongSelf.instanceID forKey:@"instance"]; - [evt setObject:strongSelf.advertiserId forKey:@"advertiserId"]; - [evt setObject:strongSelf.vendorId forKey:@"vendorId"]; + [evt setObject:strongSelf.data.instanceID forKey:@"instance"]; + [evt setObject:strongSelf.data.advertiserId forKey:@"advertiserId"]; + [evt setObject:strongSelf.data.vendorId forKey:@"vendorId"]; [evt setObject:strongSelf.appBundleId forKeyedSubscript:@"appBundleId"]; // mapbox-events-ios stock attributes - [evt setValue:strongSelf.model forKey:@"model"]; - [evt setValue:strongSelf.iOSVersion forKey:@"operatingSystem"]; - [evt setValue:[strongSelf getDeviceOrientation] forKey:@"orientation"]; + [evt setValue:strongSelf.data.model forKey:@"model"]; + [evt setValue:strongSelf.data.iOSVersion forKey:@"operatingSystem"]; + [evt setValue:[strongSelf deviceOrientation] forKey:@"orientation"]; [evt setValue:@((int)(100 * [UIDevice currentDevice].batteryLevel)) forKey:@"batteryLevel"]; - [evt setValue:@(strongSelf.scale) forKey:@"resolution"]; - [evt setValue:strongSelf.carrier forKey:@"carrier"]; + [evt setValue:@(strongSelf.data.scale) forKey:@"resolution"]; + [evt setValue:strongSelf.data.carrier forKey:@"carrier"]; - NSString *cell = [strongSelf getCurrentCellularNetworkConnectionType]; + NSString *cell = [strongSelf currentCellularNetworkConnectionType]; if (cell) { [evt setValue:cell forKey:@"cellularNetworkType"]; } else { [evt setObject:[NSNull null] forKey:@"cellularNetworkType"]; } - NSString *wifi = [strongSelf getWifiNetworkName]; + NSString *wifi = [strongSelf wifiNetworkName]; if (wifi) { [evt setValue:wifi forKey:@"wifi"]; } else { [evt setObject:[NSNull null] forKey:@"wifi"]; } - [evt setValue:@([strongSelf getContentSizeScale]) forKey:@"accessibilityFontScale"]; + [evt setValue:@([strongSelf contentSizeScale]) forKey:@"accessibilityFontScale"]; // Make Immutable Version NSDictionary *finalEvent = [NSDictionary dictionaryWithDictionary:evt]; @@ -384,7 +475,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; [_eventQueue addObject:finalEvent]; // Has Flush Limit Been Reached? - if (_eventQueue.count >= strongSelf.flushAt) { + if (_eventQueue.count >= MGLMaximumEventsPerFlush) { [strongSelf flush]; } else if (_eventQueue.count == 1) { // If this is first new event on queue start timer, @@ -402,18 +493,16 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // Can be called from any thread. // - (void) flush { - if (self.token == nil) return; + if ([MGLAccountManager accessToken] == nil) return; __weak MGLMapboxEvents *weakSelf = self; dispatch_async(_serialQueue, ^{ MGLMapboxEvents *strongSelf = weakSelf; - if ( ! strongSelf) return; - - __block NSArray *events; + if ( ! strongSelf || [_eventQueue count] == 0) return; // Make an immutable copy - events = [NSArray arrayWithArray:_eventQueue]; + NSArray *events = [NSArray arrayWithArray:_eventQueue]; // Update Queue to remove events sent to server [_eventQueue removeAllObjects]; @@ -440,9 +529,9 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; if (!strongSelf) return; // Setup URL Request - NSString *url = [NSString stringWithFormat:@"%@/events/v1?access_token=%@", MGLMapboxEventsAPIBase, strongSelf.token]; + NSString *url = [NSString stringWithFormat:@"%@/events/v1?access_token=%@", MGLMapboxEventsAPIBase, [MGLAccountManager accessToken]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; - [request setValue:[strongSelf getUserAgent] forHTTPHeaderField:@"User-Agent"]; + [request setValue:strongSelf.userAgent forHTTPHeaderField:@"User-Agent"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:@"POST"]; @@ -463,14 +552,11 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; - (void) startTimer { void (^timerBlock)() = ^{ // Stop Timer if it already exists - if (_timer) { - [_timer invalidate]; - _timer = nil; - } + [_timer invalidate]; // Start New Timer - _timer = [NSTimer scheduledTimerWithTimeInterval:_flushAfter - target:[self class] + _timer = [NSTimer scheduledTimerWithTimeInterval:MGLFlushInterval + target:self selector:@selector(flush) userInfo:nil repeats:YES]; @@ -487,22 +573,13 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // Can be called from any thread. // -- (NSString *) getUserAgent { - if (self.appName != nil && self.appVersion != nil && self.appBuildNumber != nil && ([self.userAgent rangeOfString:self.appName].location == NSNotFound)) { - self.userAgent = [NSString stringWithFormat:@"%@/%@/%@ %@", self.appName, self.appVersion, self.appBuildNumber, self.userAgent]; - } - return self.userAgent; +- (NSString *) userAgent { + return [NSString stringWithFormat:@"%@/%@/%@ %@", self.appName, self.appVersion, self.appBuildNumber, MGLMapboxEventsUserAgent]; } // Can be called from any thread. // -- (NSString *) formatDate:(NSDate *)date { - return [self.rfc3339DateFormatter stringFromDate:date]; -} - -// Can be called from any thread. -// -- (NSString *) getDeviceOrientation { +- (NSString *) deviceOrientation { __block NSString *result; NSString *(^deviceOrientationBlock)(void) = ^{ @@ -549,7 +626,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // Can be called from any thread. // -- (NSInteger) getContentSizeScale { +- (NSInteger) contentSizeScale { __block NSInteger result = -9999; NSInteger (^contentSizeScaleBlock)(void) = ^{ @@ -597,23 +674,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // Can be called from any thread. // -- (NSString *)getSysInfoByName:(char *)typeSpecifier -{ - size_t size; - sysctlbyname(typeSpecifier, NULL, &size, NULL, 0); - - char *answer = malloc(size); - sysctlbyname(typeSpecifier, answer, &size, NULL, 0); - - NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding]; - - free(answer); - return results; -} - -// Can be called from any thread. -// -- (NSString *) getWifiNetworkName { +- (NSString *) wifiNetworkName { NSString *ssid = nil; CFArrayRef interfaces = CNCopySupportedInterfaces(); @@ -630,7 +691,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // Can be called from any thread. // -- (NSString *) getCurrentCellularNetworkConnectionType { +- (NSString *) currentCellularNetworkConnectionType { CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init]; NSString *radioTech = telephonyInfo.currentRadioAccessTechnology; @@ -695,6 +756,36 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; return result; } +#pragma mark CLLocationManagerDelegate +- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { + // Iterate through locations to pass all data + for (CLLocation *loc in locations) { + [MGLMapboxEvents pushEvent:MGLEventTypeLocation withAttributes:@{ + MGLEventKeyLatitude: @(loc.coordinate.latitude), + MGLEventKeyLongitude: @(loc.coordinate.longitude), + MGLEventKeySpeed: @(loc.speed), + MGLEventKeyCourse: @(loc.course), + MGLEventKeyAltitude: @(loc.altitude), + MGLEventKeyHorizontalAccuracy: @(loc.horizontalAccuracy), + MGLEventKeyVerticalAccuracy: @(loc.verticalAccuracy) + }]; + } +} + +- (void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit *)visit { + [MGLMapboxEvents pushEvent:MGLEventTypeVisit withAttributes:@{ + MGLEventKeyLatitude: @(visit.coordinate.latitude), + MGLEventKeyLongitude: @(visit.coordinate.longitude), + MGLEventKeyHorizontalAccuracy: @(visit.horizontalAccuracy), + MGLEventKeyArrivalDate: [[NSDate distantPast] isEqualToDate:visit.arrivalDate] ? [NSNull null] : [_rfc3339DateFormatter stringFromDate:visit.arrivalDate], + MGLEventKeyDepartureDate: [[NSDate distantFuture] isEqualToDate:visit.departureDate] ? [NSNull null] : [_rfc3339DateFormatter stringFromDate:visit.departureDate] + }]; +} + +- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { + [self validateUpdatingLocation]; +} + #pragma mark NSURLSessionDelegate - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^) (NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { diff --git a/platform/ios/MGLMapboxEvents_Private.h b/platform/ios/MGLMapboxEvents_Private.h new file mode 100644 index 000000000..6a48b31f0 --- /dev/null +++ b/platform/ios/MGLMapboxEvents_Private.h @@ -0,0 +1,7 @@ +#import "MGLMapboxEvents.h" + +@interface MGLMapboxEvents (Private) + ++ (instancetype)sharedManager; + +@end diff --git a/platform/ios/MGLMetricsLocationManager.m b/platform/ios/MGLMetricsLocationManager.m deleted file mode 100644 index 9c186e4bf..000000000 --- a/platform/ios/MGLMetricsLocationManager.m +++ /dev/null @@ -1,107 +0,0 @@ -#import "MGLMapboxEvents.h" -#import "MGLMetricsLocationManager.h" - -#import - -@interface MGLMetricsLocationManager() - -@property (nonatomic) CLLocationManager *locationManager; -@property (atomic) NSDateFormatter *rfc3339DateFormatter; - -@end - -@implementation MGLMetricsLocationManager - -- (instancetype) init { - if (self = [super init]) { - _locationManager = [[CLLocationManager alloc] init]; - _locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; - _locationManager.distanceFilter = 10; - [_locationManager setDelegate:self]; - - _rfc3339DateFormatter = [[NSDateFormatter alloc] init]; - NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; - - [_rfc3339DateFormatter setLocale:enUSPOSIXLocale]; - [_rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"]; - // Clear Any System TimeZone Cache - [NSTimeZone resetSystemTimeZone]; - [_rfc3339DateFormatter setTimeZone:[NSTimeZone systemTimeZone]]; - } - return self; -} - -+ (instancetype)sharedManager { - static dispatch_once_t onceToken; - static MGLMetricsLocationManager *sharedManager; - dispatch_once(&onceToken, ^{ - sharedManager = [[self alloc] init]; - }); - return sharedManager; -} - -- (void)startUpdatingLocation { - [self.locationManager startUpdatingLocation]; -} - -- (void)stopUpdatingLocation { - [self.locationManager stopUpdatingLocation]; -} - -- (void)startMonitoringVisits { - // -[CLLocationManager startMonitoringVisits] is only available in iOS 8+. - if ([self.locationManager respondsToSelector:@selector(startMonitoringVisits)]) { - [self.locationManager startMonitoringVisits]; - } -} - -- (void)stopMonitoringVisits { - // -[CLLocationManager stopMonitoringVisits] is only available in iOS 8+. - if ([self.locationManager respondsToSelector:@selector(stopMonitoringVisits)]) { - [self.locationManager stopMonitoringVisits]; - } -} - -#pragma mark CLLocationManagerDelegate -- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { - // Iterate through locations to pass all data - for (CLLocation *loc in locations) { - [MGLMapboxEvents pushEvent:MGLEventTypeLocation withAttributes:@{ - MGLEventKeyLatitude: @(loc.coordinate.latitude), - MGLEventKeyLongitude: @(loc.coordinate.longitude), - MGLEventKeySpeed: @(loc.speed), - MGLEventKeyCourse: @(loc.course), - MGLEventKeyAltitude: @(loc.altitude), - MGLEventKeyHorizontalAccuracy: @(loc.horizontalAccuracy), - MGLEventKeyVerticalAccuracy: @(loc.verticalAccuracy) - }]; - } -} - -- (void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit *)visit { - [MGLMapboxEvents pushEvent:MGLEventTypeVisit withAttributes:@{ - MGLEventKeyLatitude: @(visit.coordinate.latitude), - MGLEventKeyLongitude: @(visit.coordinate.longitude), - MGLEventKeyHorizontalAccuracy: @(visit.horizontalAccuracy), - MGLEventKeyArrivalDate: [[NSDate distantPast] isEqualToDate:visit.arrivalDate] ? [NSNull null] : [_rfc3339DateFormatter stringFromDate:visit.arrivalDate], - MGLEventKeyDepartureDate: [[NSDate distantFuture] isEqualToDate:visit.departureDate] ? [NSNull null] : [_rfc3339DateFormatter stringFromDate:visit.departureDate] - }]; -} - -- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { - switch (status) { - case kCLAuthorizationStatusDenied: - [self stopUpdatingLocation]; - [self stopMonitoringVisits]; - break; - case kCLAuthorizationStatusAuthorized: - case kCLAuthorizationStatusAuthorizedWhenInUse: - [self startUpdatingLocation]; - [self startMonitoringVisits]; - break; - default: - break; - } -} - -@end diff --git a/test/ios/ios-tests.xcodeproj/project.pbxproj b/test/ios/ios-tests.xcodeproj/project.pbxproj index d6c6344c2..50e12595f 100644 --- a/test/ios/ios-tests.xcodeproj/project.pbxproj +++ b/test/ios/ios-tests.xcodeproj/project.pbxproj @@ -631,6 +631,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "../../build/ios/pkg/static/**", OCMock, + OHHTTPStubs/OHHTTPStubs/Sources, ); INFOPLIST_FILE = "Bundle-Info.plist"; LIBRARY_SEARCH_PATHS = ( @@ -665,6 +666,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, "../../build/ios/pkg/static/**", OCMock, + OHHTTPStubs/OHHTTPStubs/Sources, ); INFOPLIST_FILE = "Bundle-Info.plist"; LIBRARY_SEARCH_PATHS = ( diff --git a/test/ios/ios-tests.xcodeproj/project.xcworkspace/xcshareddata/ios-tests.xccheckout b/test/ios/ios-tests.xcodeproj/project.xcworkspace/xcshareddata/ios-tests.xccheckout index e2f98de8f..b6ff646f1 100644 --- a/test/ios/ios-tests.xcodeproj/project.xcworkspace/xcshareddata/ios-tests.xccheckout +++ b/test/ios/ios-tests.xcodeproj/project.xcworkspace/xcshareddata/ios-tests.xccheckout @@ -12,6 +12,8 @@ 10265E242415D473A6A613214DB7AC3EE3D43F93 https://github.com/mapbox/KIF.git + 38C2A0D4F62B675E8C16C8BC1437C7753846C8AC + https://github.com/AliSoftware/OHHTTPStubs.git 7E68CB584078A487C0535CC191D3B7551EEE2095 github.com:mapbox/mapbox-gl-native.git @@ -21,6 +23,8 @@ 10265E242415D473A6A613214DB7AC3EE3D43F93 ../../../..test/ios/KIF + 38C2A0D4F62B675E8C16C8BC1437C7753846C8AC + ../../../../test/ios/OHHTTPStubs/ 7E68CB584078A487C0535CC191D3B7551EEE2095 ../../../.. @@ -48,6 +52,14 @@ IDESourceControlWCCName KIF + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 38C2A0D4F62B675E8C16C8BC1437C7753846C8AC + IDESourceControlWCCName + OHHTTPStubs + From bc0b783b59c2fc798811c1c52ef97d9b24b84867 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Tue, 12 May 2015 18:53:48 -0700 Subject: [PATCH 07/15] bump podspec to 0.2.24 --- ios/MapboxGL.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/MapboxGL.podspec b/ios/MapboxGL.podspec index 0da0081db..439beeb4e 100644 --- a/ios/MapboxGL.podspec +++ b/ios/MapboxGL.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |m| m.name = 'MapboxGL' - m.version = '0.2.23' + m.version = '0.2.24' m.summary = 'Open source vector map solution for iOS with full styling capabilities.' m.description = 'Open source OpenGL-based vector map solution for iOS with full styling capabilities and Cocoa bindings.' From 7c14d8c8bfeea67745d9d581b2a02353255af153 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Tue, 12 May 2015 18:54:11 -0700 Subject: [PATCH 08/15] [publish ios-v0.2.24] From 1ae3b1d122977b0acfef656f9f0b116b8a599fa0 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Wed, 13 May 2015 09:03:41 -0700 Subject: [PATCH 09/15] Merge pull request #1547 from mapbox/1ec5-ib-nil Return nil for IB designables agent --- platform/ios/MGLAccountManager.m | 2 +- platform/ios/MGLMapboxEvents.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/ios/MGLAccountManager.m b/platform/ios/MGLAccountManager.m index 32540e4e4..2e3c0a38e 100644 --- a/platform/ios/MGLAccountManager.m +++ b/platform/ios/MGLAccountManager.m @@ -18,7 +18,7 @@ // + (instancetype) sharedManager { if (NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent) { - return; + return nil; } static dispatch_once_t onceToken; static MGLAccountManager *_sharedManager; diff --git a/platform/ios/MGLMapboxEvents.m b/platform/ios/MGLMapboxEvents.m index 9fcfc7153..2b9d88777 100644 --- a/platform/ios/MGLMapboxEvents.m +++ b/platform/ios/MGLMapboxEvents.m @@ -280,7 +280,7 @@ const NSTimeInterval MGLFlushInterval = 60; // + (instancetype)sharedManager { if (NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent) { - return; + return nil; } static dispatch_once_t onceToken; static MGLMapboxEvents *_sharedManager; From ac1dcecef6bb6eab52ef157a086bdbf20d70acc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Wed, 13 May 2015 10:38:43 +0200 Subject: [PATCH 10/15] Merge pull request #1532 from mapbox/1465-text_collision Calculate text collision correctly --- src/mbgl/map/live_tile_data.cpp | 10 +++++----- src/mbgl/map/raster_tile_data.cpp | 6 +++--- src/mbgl/map/source.cpp | 22 +++++++++++----------- src/mbgl/map/tile_cache.cpp | 2 +- src/mbgl/map/tile_data.cpp | 9 +++++++-- src/mbgl/map/tile_data.hpp | 23 ++++++++++++++++++++--- src/mbgl/map/tile_parser.cpp | 13 ++++++++----- src/mbgl/map/tile_parser.hpp | 2 -- src/mbgl/map/vector_tile_data.cpp | 24 +++++++++++++++++------- src/mbgl/map/vector_tile_data.hpp | 12 ++++++++++-- src/mbgl/renderer/painter.cpp | 2 +- 11 files changed, 83 insertions(+), 42 deletions(-) diff --git a/src/mbgl/map/live_tile_data.cpp b/src/mbgl/map/live_tile_data.cpp index 096e899d8..59f7b4de3 100644 --- a/src/mbgl/map/live_tile_data.cpp +++ b/src/mbgl/map/live_tile_data.cpp @@ -21,7 +21,7 @@ LiveTileData::LiveTileData(const TileID& id_, spriteAtlas_, sprite_, source_), annotationManager(annotationManager_) { // live features are always ready - state = State::loaded; + setState(State::loaded); } LiveTileData::~LiveTileData() { @@ -31,7 +31,7 @@ LiveTileData::~LiveTileData() { } void LiveTileData::parse() { - if (state != State::loaded) { + if (getState() != State::loaded) { return; } @@ -46,12 +46,12 @@ void LiveTileData::parse() { parser.parse(); } catch (const std::exception& ex) { Log::Error(Event::ParseTile, "Live-parsing [%d/%d/%d] failed: %s", id.z, id.x, id.y, ex.what()); - state = State::obsolete; + setState(State::obsolete); return; } } - if (state != State::obsolete) { - state = State::parsed; + if (getState() != State::obsolete) { + setState(State::parsed); } } diff --git a/src/mbgl/map/raster_tile_data.cpp b/src/mbgl/map/raster_tile_data.cpp index 20c07b573..0f8efe3b4 100644 --- a/src/mbgl/map/raster_tile_data.cpp +++ b/src/mbgl/map/raster_tile_data.cpp @@ -15,14 +15,14 @@ RasterTileData::~RasterTileData() { } void RasterTileData::parse() { - if (state != State::loaded) { + if (getState() != State::loaded) { return; } if (bucket.setImage(data)) { - state = State::parsed; + setState(State::parsed); } else { - state = State::invalid; + setState(State::invalid); } } diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 8b0bf905f..e663ef3d5 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -127,7 +127,7 @@ bool Source::isLoaded() const { } for (const auto& tile : tiles) { - if (tile.second->data->state != TileData::State::parsed) { + if (tile.second->data->getState() != TileData::State::parsed) { return false; } } @@ -193,11 +193,11 @@ void Source::finishRender(Painter &painter) { } } -std::forward_list Source::getLoadedTiles() const { - std::forward_list ptrs; +std::forward_list Source::getLoadedTiles() const { + std::forward_list ptrs; auto it = ptrs.before_begin(); - for (const auto &pair : tiles) { - if (pair.second->data->ready()) { + for (const auto& pair : tiles) { + if (pair.second->data->isReady()) { it = ptrs.insert_after(it, pair.second.get()); } } @@ -211,16 +211,16 @@ const std::vector& Source::getTiles() const { TileData::State Source::hasTile(const TileID& id) { auto it = tiles.find(id); if (it != tiles.end()) { - Tile &tile = *it->second; + Tile& tile = *it->second; if (tile.id == id && tile.data) { - return tile.data->state; + return tile.data->getState(); } } return TileData::State::invalid; } -void Source::handlePartialTile(const TileID &id, Worker &worker) { +void Source::handlePartialTile(const TileID& id, Worker& worker) { const TileID normalized_id = id.normalized(); auto it = tile_data.find(normalized_id); @@ -265,7 +265,7 @@ TileData::State Source::addTile(MapData& data, new_tile.data = it->second.lock(); } - if (new_tile.data && new_tile.data->state == TileData::State::obsolete) { + if (new_tile.data && new_tile.data->getState() == TileData::State::obsolete) { // Do not consider the tile if it's already obsolete. new_tile.data.reset(); } @@ -296,7 +296,7 @@ TileData::State Source::addTile(MapData& data, tile_data.emplace(new_tile.data->id, new_tile.data); } - return new_tile.data->state; + return new_tile.data->getState(); } double Source::getZoom(const TransformState& state) const { @@ -453,7 +453,7 @@ void Source::update(MapData& data, bool obsolete = std::find(retain.begin(), retain.end(), tile.id) == retain.end(); if (!obsolete) { retain_data.insert(tile.data->id); - } else if (type != SourceType::Raster && tile.data->state == TileData::State::parsed) { + } else if (type != SourceType::Raster && tile.data->getState() == TileData::State::parsed) { // Partially parsed tiles are never added to the cache because otherwise // they never get updated if the go out from the viewport and the pending // resources arrive. diff --git a/src/mbgl/map/tile_cache.cpp b/src/mbgl/map/tile_cache.cpp index 25aed6d15..37acf628a 100644 --- a/src/mbgl/map/tile_cache.cpp +++ b/src/mbgl/map/tile_cache.cpp @@ -46,7 +46,7 @@ std::shared_ptr TileCache::get(uint64_t key) { data = it->second; tiles.erase(it); orderedKeys.remove(key); - assert(data->ready()); + assert(data->isReady()); } return data; diff --git a/src/mbgl/map/tile_data.cpp b/src/mbgl/map/tile_data.cpp index c6d87c7bd..aa66ceb80 100644 --- a/src/mbgl/map/tile_data.cpp +++ b/src/mbgl/map/tile_data.cpp @@ -12,10 +12,9 @@ using namespace mbgl; TileData::TileData(const TileID& id_, const SourceInfo& source_) : id(id_), name(id), - state(State::initial), - parsing(ATOMIC_FLAG_INIT), source(source_), env(Environment::Get()), + state(State::initial), debugBucket(debugFontBuffer) { // Initialize tile debug coordinates debugFontBuffer.addText(name.c_str(), 50, 200, 5); @@ -29,6 +28,12 @@ const std::string TileData::toString() const { return std::string { "[tile " } + name + "]"; } +void TileData::setState(const State& state_) { + assert(!isImmutable()); + + state = state_; +} + void TileData::request(Worker& worker, float pixelRatio, std::function callback) { std::string url = source.tileURL(id, pixelRatio); state = State::loading; diff --git a/src/mbgl/map/tile_data.hpp b/src/mbgl/map/tile_data.hpp index ecc53a6b5..7f16e7c41 100644 --- a/src/mbgl/map/tile_data.hpp +++ b/src/mbgl/map/tile_data.hpp @@ -49,10 +49,24 @@ public: void cancel(); const std::string toString() const; - inline bool ready() const { + inline bool isReady() const { return isReadyState(state); } + // Returns true if the TileData is in a final state and we cannot + // make changes to it anymore. + inline bool isImmutable() const { + return state == State::parsed || state == State::obsolete; + } + + // We let subclasses override setState() so they + // can intercept the state change and react accordingly. + virtual void setState(const State& state); + + inline State getState() const { + return state; + } + void endParsing(); // Override this in the child class. @@ -61,8 +75,7 @@ public: const TileID id; const std::string name; - std::atomic state; - std::atomic_flag parsing; + std::atomic_flag parsing = ATOMIC_FLAG_INIT; protected: // Set the internal parsing state to true so we prevent @@ -81,6 +94,10 @@ protected: std::unique_ptr workRequest; +private: + std::atomic state; + +protected: // Contains the tile ID string for painting debug information. DebugFontBuffer debugFontBuffer; diff --git a/src/mbgl/map/tile_parser.cpp b/src/mbgl/map/tile_parser.cpp index 65b445a6c..388950491 100644 --- a/src/mbgl/map/tile_parser.cpp +++ b/src/mbgl/map/tile_parser.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -35,13 +34,13 @@ TileParser::TileParser(const GeometryTile& geometryTile_, glyphStore(glyphStore_), spriteAtlas(spriteAtlas_), sprite(sprite_), - collision(util::make_unique(tile.id.z, 4096, tile.source.tile_size, tile.depth)), partialParse(false) { assert(sprite); - assert(collision); } -bool TileParser::obsolete() const { return tile.state == TileData::State::obsolete; } +bool TileParser::obsolete() const { + return tile.getState() == TileData::State::obsolete; +} void TileParser::parse() { for (const auto& layer_desc : style.layers) { @@ -119,6 +118,10 @@ std::unique_ptr TileParser::createBucket(const StyleBucket &bucketDesc) } else if (bucketDesc.type == StyleLayerType::Line) { return createLineBucket(*layer, bucketDesc); } else if (bucketDesc.type == StyleLayerType::Symbol) { + if (partialParse) { + return nullptr; + } + bool needsResources = false; auto symbolBucket = createSymbolBucket(*layer, bucketDesc, needsResources); if (needsResources) { @@ -194,7 +197,7 @@ std::unique_ptr TileParser::createSymbolBucket(const GeometryTileLayer& return nullptr; } - auto bucket = util::make_unique(*collision); + auto bucket = util::make_unique(*tile.getCollision()); const float z = tile.id.z; auto& layout = bucket->layout; diff --git a/src/mbgl/map/tile_parser.hpp b/src/mbgl/map/tile_parser.hpp index 18184e27a..67150bcd4 100644 --- a/src/mbgl/map/tile_parser.hpp +++ b/src/mbgl/map/tile_parser.hpp @@ -29,7 +29,6 @@ class StyleLayoutRaster; class StyleLayoutLine; class StyleLayoutSymbol; class VectorTileData; -class Collision; class TileParser : private util::noncopyable { public: @@ -69,7 +68,6 @@ private: SpriteAtlas& spriteAtlas; util::ptr sprite; - std::unique_ptr collision; bool partialParse; }; diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index 7560168ed..263ad52b9 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include using namespace mbgl; @@ -19,12 +20,13 @@ VectorTileData::VectorTileData(const TileID& id_, util::ptr sprite_, const SourceInfo& source_) : TileData(id_, source_), + depth(id_.z >= source_.max_zoom ? mapMaxZoom - id_.z : 1), glyphAtlas(glyphAtlas_), glyphStore(glyphStore_), spriteAtlas(spriteAtlas_), sprite(sprite_), style(style_), - depth(id.z >= source.max_zoom ? mapMaxZoom - id.z : 1) { + collision(util::make_unique(id_.z, 4096, source_.tile_size, depth)) { } VectorTileData::~VectorTileData() { @@ -35,7 +37,7 @@ VectorTileData::~VectorTileData() { } void VectorTileData::parse() { - if (state != State::loaded && state != State::partial) { + if (getState() != State::loaded && getState() != State::partial) { return; } @@ -48,24 +50,24 @@ void VectorTileData::parse() { TileParser parser(*vt, *this, style, glyphAtlas, glyphStore, spriteAtlas, sprite); parser.parse(); - if (state == State::obsolete) { + if (getState() == State::obsolete) { return; } if (parser.isPartialParse()) { - state = State::partial; + setState(State::partial); } else { - state = State::parsed; + setState(State::parsed); } } catch (const std::exception& ex) { Log::Error(Event::ParseTile, "Parsing [%d/%d/%d] failed: %s", id.z, id.x, id.y, ex.what()); - state = State::obsolete; + setState(State::obsolete); return; } } Bucket* VectorTileData::getBucket(StyleLayer const& layer) { - if (!ready() || !layer.bucket) { + if (!isReady() || !layer.bucket) { return nullptr; } @@ -91,3 +93,11 @@ void VectorTileData::setBucket(StyleLayer const& layer, std::unique_ptr buckets[layer.bucket->name] = std::move(bucket); } + +void VectorTileData::setState(const State& state_) { + TileData::setState(state_); + + if (isImmutable()) { + collision.reset(); + } +} diff --git a/src/mbgl/map/vector_tile_data.hpp b/src/mbgl/map/vector_tile_data.hpp index 146bc9322..5fe351ca0 100644 --- a/src/mbgl/map/vector_tile_data.hpp +++ b/src/mbgl/map/vector_tile_data.hpp @@ -16,6 +16,7 @@ namespace mbgl { class Bucket; +class Collision; class Painter; class SourceInfo; class StyleLayer; @@ -45,6 +46,14 @@ public: void setBucket(StyleLayer const &layer_desc, std::unique_ptr bucket); + void setState(const State& state) override; + + inline Collision* getCollision() const { + return collision.get(); + } + + const float depth; + protected: // Holds the actual geometries in this tile. FillVertexBuffer fillVertexBuffer; @@ -69,8 +78,7 @@ private: std::unordered_map> buckets; mutable std::mutex bucketsMutex; -public: - const float depth; + std::unique_ptr collision; }; } diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index e2a3df625..56d814c03 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -381,7 +381,7 @@ std::vector Painter::determineRenderOrder(const Style& style) { const auto& tiles = layer.bucket->source->getTiles(); for (auto tile : tiles) { assert(tile); - if (!tile->data && !tile->data->ready()) { + if (!tile->data && !tile->data->isReady()) { continue; } From 625f644180371c21f9f1910b3cbafd387e510537 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Wed, 13 May 2015 13:02:36 -0700 Subject: [PATCH 11/15] bump podspec to 0.2.25 --- ios/MapboxGL.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/MapboxGL.podspec b/ios/MapboxGL.podspec index 439beeb4e..5358d9aa0 100644 --- a/ios/MapboxGL.podspec +++ b/ios/MapboxGL.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |m| m.name = 'MapboxGL' - m.version = '0.2.24' + m.version = '0.2.25' m.summary = 'Open source vector map solution for iOS with full styling capabilities.' m.description = 'Open source OpenGL-based vector map solution for iOS with full styling capabilities and Cocoa bindings.' From 059d42c8cb79f4af4af2ee83eec810d04c18de99 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Wed, 13 May 2015 13:03:33 -0700 Subject: [PATCH 12/15] [publish ios-v0.2.25] From b1fac0a796c1ca9b49101aebbe4a1b6e67baac7d Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Thu, 14 May 2015 14:17:03 -0700 Subject: [PATCH 13/15] bump podspec to 0.3.0 --- ios/MapboxGL.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/MapboxGL.podspec b/ios/MapboxGL.podspec index 5358d9aa0..1f68e18a5 100644 --- a/ios/MapboxGL.podspec +++ b/ios/MapboxGL.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |m| m.name = 'MapboxGL' - m.version = '0.2.25' + m.version = '0.3.0' m.summary = 'Open source vector map solution for iOS with full styling capabilities.' m.description = 'Open source OpenGL-based vector map solution for iOS with full styling capabilities and Cocoa bindings.' From e7d60f8e0b6f0af33780c9aa6097534cead7d14d Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Thu, 14 May 2015 14:17:17 -0700 Subject: [PATCH 14/15] [publish ios-v0.3.0] From 1bb7be670217f801c36c46401b2d1ac14ce185b6 Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Thu, 14 May 2015 14:53:26 -0700 Subject: [PATCH 15/15] update podspec homepage --- ios/MapboxGL.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/MapboxGL.podspec b/ios/MapboxGL.podspec index 1f68e18a5..6ee2fd966 100644 --- a/ios/MapboxGL.podspec +++ b/ios/MapboxGL.podspec @@ -5,7 +5,7 @@ Pod::Spec.new do |m| m.summary = 'Open source vector map solution for iOS with full styling capabilities.' m.description = 'Open source OpenGL-based vector map solution for iOS with full styling capabilities and Cocoa bindings.' - m.homepage = 'https://www.mapbox.com/blog/mapbox-gl/' + m.homepage = 'https://www.mapbox.com/mapbox-gl-ios/' m.license = 'BSD' m.author = { 'Mapbox' => 'mobile@mapbox.com' } m.screenshot = 'https://raw.githubusercontent.com/mapbox/mapbox-gl-native/master/ios/screenshot.png'

<2<0K<{61lYK;%u~59@Xm;p`p5-zjjDzz%^c z1io2dTp*`A8SestYTqz$>dnzVB=En05dV!pwgcj92ZY}hDDPY3vx4)zWB5k}Qs0kw zpTJ&$+=xv7^#WH3e7ivE72+3BQ=@C!h)cAmzg;Wa8fw_$`400{030 zn7|JRe6PTJ1l}gFQ{ZZWHwxq@7SmZI5N$=_)dIO}#&EvHgzT#c0The_UW%s3c5xA4 zIbaNs?czc}JUjZP)Td?rPXr_%@Mbrz^i&CFOE}t+@}CRX4}b6+y#o+Dm7Xh>rj(xR zRKQmFV`*x1BOv}Cl%DGpze(K!jPd0Aqkx08&1NM*-u2 z0M<1E(UujRH~%mm9@+;Z=T$Yc!{NI6hH$ujLr*x|Z)>&K{q}%;0P3-{h&}{(%GQ?8 zX&L>&5Uh%a_9F73(BaS#SV%7|i-xpS^?jlJA=niU9mk#4&hZ?k`2}k~5+9ArxMzr? zt(%#|LE<1Z`YGQgo`L@nRb!ahC60ACqtEdp;s`VN5b-R_GWr=mCyv4}`V}XLqo9pG z1GfWs<(ULosMl)r6Rr__8w(ar>7gQghv2tMc)#Eu6nvN9Ule?g;NKN|K=9uPzEAK` z$UF5!jXs02H;(iMCHzecN3F)u3DX&SK3(t?f?p%}I>DC;elKxP{@+U+`7!z! z_xtc2#69Kl5OL&hmGFClIAm><{D0kt^Q=L>G`$jj#E0jgtx>Pn=rfEZ4*na2|K-H- zM``pE%6<5?f`3xh^KT}OxPy}3cER~)OZNNHRL&VX682x}F#4!Lc z>-$5*F;Fn;^EB+wPQ$=3+jZIzHIH^^i zy4S8~=>Vn-GP-KUp6_c%+px_|>*O%o1eN8(-0 z>o*{kd5e|BSk4@D&%u$~x3zVwUAm#^){QN&%Dk}|`$)AUS~0a0$t3YTD{IKEc|L8X zINg`9PRUE{sz0mZ@CK!s>=F&0R6S{vf#E*Ile3y81*(vqyOrYMrwRk+7Db~sNblLG z(guY&79oQIN6@AoCP_yvIEZb9W5zKsbl6m(=qt&p3aVSQq9L(-!LNLvdsruRJ)T_0>Xi00G=^9`vn_7IQzLHa}(7N$8(@i$? z8|BG2Ys2@RI=bpRt2vkW=D~b2*KRdaTw96}C z6_w&vROvQS0jsA9hm}(eD=gX-t%c$+?7hZ{eY0m1^ZS2~+MdLh3 z-~1%TpH>VP9R6yp&BW8VJ~cweH!}z9a0X`-Uid3l?rinV2Zf&eFtoIGU~GWl6K5KF z35+xP;pyy)8a};b0(V5@qd*v*(MgC#48L^x<_j@yq&rXkyjNn3>2tyS(&(G7!Z?kt zTm!31gldF*l0+cCbo%BG2tQ$GeM0yd959eyI(>7)?-CKl@S~l=;p9uFZ~g?vZFF-* zihov>ig6qGP1Zqy@}<)^e?{8l;}Xk^*EK7359F6l-~3Y;6MNm4WjyKe^YI&A|Jv}w zx3+SAeo4$gVf35R>4%&B5~dj+fqZO|hcGsl`j8R5PS2x{9HQW82QTa4M6#hhq?uSXoB;8-H1cs-riV*t ziA2MKl?`r$>B5imDRc|YjvtJRboY?npWk}n*UCV+M#=9G@{7;&6ldzUsfX4;Q~B-l zmEWN7D?Q^$Fl;0@` zV+F+#jwYpO2v-8X3XpcFPay`Yr5+dEC32Z(^DYuUTj#aUi8!q8`*G0@=VRcv&2n^? zwQe-Ss6T9Ue}NbN;jLeT4zdkh@X({L-fP|ea#-scL*Bi%)%$PM9cDb7{rcGVZEJ6T zDE>+u@XHtLv|fOJYfk(Xt@{mH`RDWb*p76M$#%@-&(K0kthr*Wz9@FM`<1A#pW zw~WW=U##%unaCYfj)`1L4w3tC<3w|)CTlw$qbjXz-m^)RW95Dh;5A%XdvVKq88>Ux zG28}mDP7&Hf5nqJozu=eipPAg%X*%EAtpA4>lyYe+cqLIBAvZHf{?HydK>&)(SHRj z|Mx2DcW|%5m48N|Kf?VMTw@zSLbp!?EAt+dnLV52{oe3hCj8wDf8%Q0Uu1ZX`1cDO z$DL;OT!xSB6~7$vQimFN=VlaC~)=%JBVDliwm_1_@H}3P0 zN0!#8Y&=}0kf=S1OA;E%vq!~%XtI2}@CqPRxa=9BNhrYaMPq?vW@OC-D6pvqoDa@3 z0B^#jI4^e)w5Ostu&iiS8$hH7w~yfpPtH=4srTdAJ`2U&WKG+&s=N4~&UAHkLlLCt zRm#oM8nn^zupD_A`mF3srSY1>z9QGC*@{9g+Ll+X7SnX$(X$a}jH~|Z)h5Q#h~d$* za<9%^RKR4%=0X{H9Lj#2D-Mdwv3f~LGk(!)Jc#P*nYmuuuoK_dtv|L^N?)@Sp z8B%M*|I2i79V>Im-(5a^(=M-VM${i#k9OfAm{x3~?&f)44Nv@CsH`XwzLw}4qr0Q= z{rCRnAHy5(36J_+DBq*d$-fM`098R9;C^ugs8^c7YFuaobSX_g)9R4an>T&4>vfkr zZgIW(<#DI$Wx9^tu9xX;Ok)Vhhml~l6Kk1~V7u$pFOM#xW#Z!i!{|owfikIiY;?R# zDk-s6IwUL1qY*x!*cyb|BoLg|UZHXsr6j*WNK6UaR!hHlnc{?(_&A_Xp85s;j~R{( zo{BhoMawI1FdWLflNp!8jwEKqJDOV-E5*rcJG*Yf%y>%|9#)94#1Rcks#$c$h(XKn1pM7XlBfD}z!=OI~a*m@jMY;F8e>vATV z*RQskOpYA;h*Sw((z$3oHe}L*qq5;@orQc>lV;nb#Kjo+f7A?Sb9=X_9Ma=vNTI=g^+6Zb$$llu8*4(;yV|UMz&YlIE5oZ>h)8_Sq`oKJ^Vm_Pla+!NupLO#! zl~wWbSv9k0WKe6HO{%Dl!`B(RyD|SZPey+%1Ih7{&l&tN@XsODe&KtLUoh|1?)Ojq z(@%fcQ*h=Bukf3q5f}TLUR<=l#JFX+=tOVB`h`XuvH*x(C*9lx4oln3u85ea_ zmgC|m62RiH5}${39E;LRjZ9U+sm}#^v4n++-x&1T;(Br9%yQ;;3#d437h-;7keGiq zqV>g(3VLw>E>v+zm;>Nac*AkTO)541*0ONiOfL?zg^H9OHy_WS$nbcnNBYxk!G-cq z3EvHWv>l~Sbva-!@GAgY0WSrN16~GL4tOOX+ZpOy+0z58jRD8#vu>h>wXEyOpvwnD z-PeJJu$EtQ_(eV@@I3jolfXp+=LkFvK6s3r6bPLbg-;jA^t|D;8%CVpIfNMk z)z=sB-@=pr{DvZ={s`eW1*$EYz`rQ?E`j|5-zD%J0=oqAn-0IoQh~IaLVUJBegYC_ znBt-5sCi;;rAQjW3V|LGSmIRhv%WJnf@PzUg<@FevZ)3VmK8u*|&W^Tg5jnt8_;iK79U zdBb-i4zlRDIG()tMLxXUhp+MB*ZXjYn#7O1z5Jp0(b5hB+iNk*YUx^nWplsUi5h9~ zJZwE!^NmImI+zx*b+{ViCDyC)9b;*hYr0y%*kPsY=;_u?r7m>4tLxQzHF<`kdEi}s4^$P<*3M?6 zY9j=%o~xuBZH(llcC9Wj!()_f-kgR7*DYQCHs86NrbeN-ku@GGaQ|W zx;b+f)FqrqrK+XO&}Vs8h<-o?m;AZ#j>CsF)M^bCI8Yca2kuJ=+KMqnz23f$e`;x5-&7q?&p2=f$6tY3Z#U~(XS?1$#KA8d`Jv0Pj^Gcn zjUMN?-fsAOje@|Hqi?5+&BmI!ek6OxjkMnWG3htC=Y#Gg4&ahqFuyeG?Ij{lx$tO} zaqdaTCrJeIOSj&>Q1}^^;4jH>DJqC$A1;wzY4$Sp!Dr?f&9{~w_j@-sxbLrsgIj(j*jO@>)D3i`=m1c z{E~zNSK)_0wcz#aBNKJf{USlxrTRN@0LtiWiYNvtVND?X(%KW-e1WDb7eNMvUt`>{ zx2Fl@Zq|#_=>zP7az7o%t8}N!w0yC-8p6vb-|+eh1H!LaaYN+GBw83dgU~{Q9MF)XdQBWeD{ve|<^vO#wM8XyF2U!yyg>**9&t*0Mec z*k2ESd_VDT9goWO;m!-*>I_WzR8wJRdwccHr(kc+*nM+#641__GfTlM$+q09cRsxf ze(1(~m(y06kGAl1Vn6f?#_{RiL338?vli^f%|pKDBL8z>Kkk6irSR&6&?en6-^X*p%OzP+{m9sm) z3mB#pN=o#MR<0w3y(}+^|9bm;u5Q@Ntx*|(S-3K;8EpfE>=5Vd?3k?x4ATb18vdPA z5Sr^Sx9i;uwt*&ZBALf_FvDQp1Y)%%c0$G)JdWYsaVwuWyaP`v<0@OBSwQVebg`PW zxEGtwUjGR^sSK%N-3mW9)$aov`zEG($qh)A2hWUcP$)CdfNR`MM9aPzv8?wJ-HVsq zzOoeP<3I~uL_yh?eG+l4P&+*AN-c&-J|=%a_WH~5vQ;`+HM>4vSEos?%p}{{Z<5``Ql)-WYIV++>I|s~{AHSzVL=@v zI=k~%hSlR_^++JAWro$ySr|8KR)$5~Va4NoRbhOAtOf&F-E3H8BiLT2Ss50a4XgF< zG_0N=D^=rezW|%b4i!=O zVOGmse3e4?WhG-)NbO7iM|%z1h)H2JWq`BS&w{rq0~J1yl+sUujr}@#|Ks~W7Qtm@ za2sc)orR$M@a+5uI|IH1QC2Fc!fyl`vNGO}=kYc-y~gaj^ZNjY;6u{<_W^lcAyGU3 zBMy>h=d(IB8IH039FXH6v+q{AXGNpA<2ExR<0ZwJh6nS(c|RbxYAVkE?jYy`M}GrY zRmh@$d(toZWd_Qv6*>@xKL3 z*ZTWeO}{3)OnW8bM#Gcba)V!+^1C$2?=Izcd6M6Q@XHTRcKxCcz=zDkQ<-}!i(6dt z!&M#%b`n?c;Wb9nBipG{)i%>SDtO<6>N<1@xtn>3q z5_o36kTo$cdIz3aPg%-hY4n{2RTfL5+{vqADT}4i4;WNgERFU9y_I~F#nR{%K<_20 zEtY0{i(*v4GakwENcbH{I2mM-F?Pub^E}Qjfz@Pd2K|fd60Qmk%rL%5@U^}}qV1DRvA9doJHxTv5iFO-8W$D`v2bd*=MaM8Uo#+}qO{-;TUUQ_Ehp= z_^p;$Ugxpl$(Bo#G+N!m!tV)Hjn653S5D#YBjFpU)OuO;7>t+xJQU{<;ZAM*5x;uqki22UuMhFk z5ANMC>Jcv}lbXksPON5^UO$;w8=P1x%;SwttQLQ)-QqzFB|6($qaWP6339olkeDw9 zOgJbPP@jfmi$k((Kpux&uM_f!u2L8+(+}?5Ffy?NRBcm9R=Dx?Q%n*lbrP!glbDYP zv!W1?Df4l_j~==JlDGtMU&aU|jSfjlrc=2rHw<~?YZ}Jp3t_8EVjgK%U&l&mNG8@U zha^QD^FdICKQ+xIrSuF*sY8;MOVlA*ZXV-~SF?GX?|7x8WrpaRT@v$n!0~F!?bf#NMMN-E25VR%&xD6y42H z%u^#^m{eOd!tARc@$%J)1+%$5%8afP?yC@}!J7&Y4SLtsFE%r*YUx_K#@GPr#*T%z zEb8cKSqr1XYr3HCB?f=B#+EiJ)WDtA&8RO9k6dgU?h>EupG=6K#>gB;QJzk#9E{nS|5=tDh?NQ6^3CH*@G{-uz{Q-Qs zRIuWR9Cce8J4giEy-M1R=m%;NwEn!vEfJQpgSmBMfu(dEdMAe3gW*(|HlGY4&l_*u zf%o2mjvC*8PyFE5+q0jeNnUx&&5@gWaBTNgx0-b2qgWg>-|1c+OLlxntF)S6zo{9` zqpink+K6&SaW{1o&Po+q%{JG|Tg%F_Y_BXti25eN_Xqyzd!V zz-YHFPgC4!t3`Kd?ik?jPk%3g|Jx<-mX39uw{^r!2Oqm6u5GNhb;R7RZ;Ivi$1%RC zVpF}V<<^aDw6*R;SAjjZb;g`O7AhtLIKRF1OMNu{@T(;}3TQ6;W4LnhPxp2HaqEA0 z>|wigW0PkbrvAo*{*gfMA9KX9-3%MhthnBNhK*=(Y(9%umCLp?UV0aUw&;Tx zH{U7$Q?>7)rxm~0`=@xZA&Xzbt!*X|=)iGmL_R5eCHMMJepr{u_4+vISd>dX49}U3 zsn>Ik=!x*x%!iq5@UTyM{JXqK#c@su+sXf>@{NsFLZ?Y>go00{#NZg1`&s= zr~jAp_1Ekl|JLR3`ddbFOtUW+i(X1^+UW1HPPylnj?Y{!#EPQYmrET%?yn^+7sj|Z z>Ed}e{@3O6=3erZJ3fEM%>Cujr=EH2Gmm}nvRfim-tH-U}e)s6N-C6z5 z|9ocJr?xz|_=+2Txb#04J+bUNTk_sCZsBbo{Pp{<`TDIN`9{m_4!SggO zY87$sav81~Tnlk=7P}SKW?X%^_TU=8Ma7aKTqkkyPbME%3>Rl$*CGS-j^LS2DXah* zTxmuCe_R^HH-x@~8Hf8hF2?^X5x5%A5vRrs9rpqf&*cqn7a$+sA?YdIAmAqa5uq=} z5-#1J0a?D}&p6ZzDL@)GZk_C7&qxX4%r`Ti!N)%st!3+%Uuyi|x2};@XSr0ItKhj^R3ji^a}7u)J8Nl*iQN zO2|qXP1#dHfw-w#sx%Ncd7>%=ag*n}1UF?!wG;eQnX{ZtU6{NxE?rRG4GqKipH@gh zIP&xFX{SHSg+z4tlE$!VMB(WY$*g`Uy^0ZN-bNozyXQlMxk=>w?ohZH{Nd;z&Y^owey3x(nq;&?z>^nghP-Fe~tq*+2XGde|d*9;-5K)e~tK8*=RE2*IhAg6Gx>__q#f? z`0H*{Qx<>SM`9lXlac<%&~Wa8UIm5&tfq+8=b>+58{oNczt6&IHi{nLTP&>R?$*5s zvJr4H-0!fknoW%SHdt7_Snx%H*8q}kCg9l!S7~8&1t8-c2Z(;Hw%o$%5dkfI%p-t5uwXpgKAjY5C z!xox*nC=DN0pRE{Y7bgy?qOm%JO&)FdLJOV?{oJ6vOIQMc=awomd8#DtM3COzk2}D zPt_t1gw-3xy%!M2_-k*muzCYvDexW(tLp$szZkF>?u#s}t`c{&VUDG>Xj6pMlf-=- zplOd58hs?>gD^%PNz%gVR&TJl6G*PoM-(f3H%<~Gs8b5uv_4D0{K4B zKPB+jXm`YaCh#KyKOpdAfg=UpgTM^W_CS~tST67pq?_*F5{Toa2A?IcMBr7z5Bdp> zzbo)X$;W>R{8xb#G$r4i0x5<{{6hjM$V&WLfz+Ep{0e~-dnGPIs8?eu4K3q`WfuzenIr0y_j!x|#m90@-g7pCgd+(!@s#q&PM47o?mhY)zc~ z6X8CA)OSt%et}wV6jY}B8i5pSC%#DFJb@DgjuluWkaJsx|1*9FDK<}dK;V9X-w;R% zef%drB9H?7#5)A85lE>Vx~~v8N8mJpX9(o+0Q@K70{<-S=CHs+0)H*=X96D*$b&Vc z|B}GZ3FLcD_e}z?7sxXabYCLyB7x@!oG6g*CBp$2xCQVAe2%f-SP!@na2;STU>hL& zi|YV80UH5Z0KvPc9&i!hO27*M>i`!5E(WXt#AEKcVn1>|@Jc|uOGZD<9KaNC_!<2) zGXYD0&j4ilrUL?)d%7x6k2f+LU?0N)q6~^S-r!rUh$DA5Am`NdKLq#zzyZLI0u#0ZCs1_6NJ{JO}0MWJ$J@zCF9r1nnj?)Xc8}MC# zI{}gAqK$yJ0rmpk3b+9f^Qxj2z$t+BfXe_^0zxvVs16YCK+$4AjDbZpfNbwofM)?# z0^ST*0eBPOVf34frysBjko|QBAp2{4?-ca{;+-qn0N4rG3Ah=s9`Fo6%HlKrIzYx> z4oJE~aifQ#=m6kq;QIla0Jj0Q0QLc{0pvXLZorLzlK^`G$&d3!@~Z(Podehacogk_ z72pBDiGb{18J_(s!*d=-|2n{{0T%>q z@nm61JYG)CTNRTl-LfuzLg;?*#0{J%F2IycaMYzc02ewga~V?uqr|R>0lv9=9OI`vcure|%pY z;bX^Ry?|TdTjPCz+u}RoJL56ACGU%@5{draCiQm{C>d4^7rRI4&P0Q%?ZSm*qZ1A+?m*w z*p16I_a^q?_h{lc-0mpYSg@%e7TZ#=wE$@^*jBIu*uH|t@Ez;4q1{t&mzpl(XuAV| zG<;7u_fUN+w-U!YsQOa)J;t?1)lc#P;usAT=l2`+kg2|rj}u2@Qhgy?iKC&ZevZ!* z52WWi#D`(cZJbTdF9jbE+}zg(|3iY8A#J3eXM;Oa1z#li65;^4nq!naBI5()nS z!OI2TCU{ElM~Nf7O;Sc&=V5#m;-3<{QteA)<5@2JVrW}T&lK@Li8%bP7JsU+r~e%Be=BjsS8|$7PnY0}1^);EP3-z@$=68wPR#{@qr_&BsJ(tld$rx8bdH4`mA-UCZ~qu}ooe4F4qg#If+|6TDv zEdIY2ylRr=cM94n`K=WELgL8(b&~(9i6cFGg?S1 z7em`&e96;o{IdnG6uh1|;=fhsHwgY-!8a2}dJal@?iczELjSLV_Y0nncZd8wCiJHe zM|$ccJ+p`-Jp&THRq&ECZTdb;ybR?d_{WKZU!U;%is1JP{;1$z7X06dBfUo?y)O_) ze09=ajKjM~e&3MrGl?U8^^(3?!P^9HA`bd3LVvf=|48V!OZXlM|6K`xNWvc`J_`IL zKSzm=20y{M*hRgQeS#;6W74PkZ%T-dMfsm?%cq?9NwA+|@f30N9jZU(^cdF3(B{fd zwf<+sExuCvkF#Bi@00%Ymk7r2+P}66eT&d@9#8+I(0^V0cZ>fn(j!kBQZ~K?f_Dmj zz2H59$Atc{#DB5y?-l+#C4GJ3&&em_uM~f-uMn@1_vGs7%a`|bLD~I9T^(yxf;Z#(*(jOn zDZX%UX83Mub5ECqo8pVMr`>gH)PqjXU=b3In_{JE(-nwP<}OOME_@B8(MFjgq}8Qq zLIq?2MH^T4yJTO_Ww;tuP(V-e4xO6|)EhYqrX+N&W&iVhRSE7Z~?_kprRvNGCZW~fk;i!Q`)AgUaFJ-TbtYB(S! zd$p>hjk@tRm!GG*HHvU%u0v3RoO}}PvQcbjzvfd-UiM7wyf%%yo_^e@r1-ZGXW=}} z(}WvI&P#A3?h=;FXXEKzmK(`)cCPxuUBWp^7D{d3$bqq3oO3o52ps34jlOYtdd{rO zsQe#tel17FW=^+hj2a|@2fK2y@UAhAY74jxIP%a~wo@eDdlJQLmb}iPz9{9LPs@?a zSvec!tg7f_ddF#?IGehbt2{l_=#Lk#di#Q9t9)J6)2h5zE!{VZv#0JkJ+!@WdRmpI zcG`C6dN*@aRY~HqF!U-YJs!EIxe98f{cEtN`4?TMhxTtQ54q3M7boPNC05m5UFFqB zIvuoGOD%@nvt({MipwN_dX@;MYd$@HTb{vs^WI}G&S+)f#&t%P6yk_NIOR6HRUAdDUlmgG``O(u*uA4oOvdk%dNOJ0{J^GGNZi(w)!B(pSxj z>b+;>c!R^Ki7b}cnW;0yGCNCg&5kOrK!u!Gq?uW_k#Zo;*?hz7&6H%0T>mh~UjHy1 zlMuR3=lsDyJN!)NIB)P-4(^4RIWy&(X)~u+o;Rav_RMLi)U3)G@TfGN(<&=xGvMqw zGplT9b1%e&8ycHCds;i%1Lub8x;oak;?6?3DFO>KFh73z_kY3i5tnVuPaa@h0e(_= zV6YVD97q^zKDjIz7!|q)(!Vf%lwZ{ADg3hD7f~baw@&!&6nayceFFW$Z>23Rr!tdYS`iL*pFp`3+&tm8@dWv0yH8++ z@RMygXYUE}%XXi@2H{6JCz?Zp^2>dnz-AeTQidCTP_L}t0l$9J%5Mt%SV4!Rz0;Gj zM~8tkkCi|utIuTWJHj!A55sc1CF;F{b54`44<35@q08NYPIwUAb1N8=H{L)q1o*nh zH^METi+m^1(XNaWHc=#V*Ita@IAvpx5v5yR8^B+Pxl8kJhus}Lg1^h4v~?CNC3z!D z3T}tLQFWW7oNP%PPWOw`5K7Gc6i9p&Ld2Zp%dk^l`H*K|`3^(PHXcKN0Q(Ucw1F#G)hRrD=9mAOjP2gc1!iQ2BIgh~&E5uLX_4sjzjlpm7J`@Ty z?|Nw}-VA4+Jb>oiV%`n96c04-7QYpcX@%z9V!AQk(7Ze3O4zFz#%SIh(x9l(ygTGt zpoYq5-W|dtUj{XrcZc)>ZNy_W?+zIbD?^Cp-C++hg_LTi=3PI9eQ-VruF$+&{A0C` zaEpHh`((P0c8mY0?ql2`d2nM2t>#@5%lSmD=G_u*bM8g({Nbfv2PjAmn+BH=v++~< zJRB14$TE_TVhQ9sqsIW`<(E(@{z5#-`K9v#Vs1%00MC{T8DIKgdbnlGn<2vp>Xy2v z7mdu17nLMVE_&j&!e?$9RtoO1Xw9*4Ptz^lggg&HPnI9hTnjXjsbjam*Rh+l%5Oa# zyFt#vKXRCU?%swvZ^bT?f$_5Vk0w>iJ4 zqV?ZKeR~;2xLD@M$<73NBRX<9H?^8}Pf%NK85*j#U=D*c5!yWeW=a`z7SD;RX*By9 zxp<{o8rqxMn*9a)xr6C%45~jfp8)s~#fzxch$^R=om@$9GLis|Wo@gWYi@0mRqd$S zhm3Z*hIT)(C!nmXt)qQS%F|8x#Ky?d5zNC%tasYpVhSlxR8m6l;Oe1AQqdpXPA z%#kY4*!jE>!8Iaw3-uCECjoUH zP;UYC9#F3VbssQKkL{cFS?W5V9)m;R^=I-#;wRvliRWTGSK?WVrx(vh@q7^vr=E}D z`3;^w;mJpZaGD3J!x(}^=~$p6uB=13>bq=k@k zc{*`^EKZz$(us3X;l)`zojCoLP@KHdiF0Cc;@1G32Jpzqd^sIzawdu3mjXlaOG5~? z{`u7)gmS#k;fIV6a-K{=PMsxP{B)rczilKGY{tk;E>CfVe6J_UIa-M1wIzWAUOfj8 ztP;}%vRx6E!cH(8aR3810wT(yUO=>)qIy7zI!&>r*^;8pNp|hVtgR-o*2aLHrEji0^=`zts!Q zOWbI9zM1m#y1w*D;;2YnAL=8HwKZMe`4VwdxUSE9g*Y09uCH*tmGZ#4KC*{6)+BU& zV?W}gyk`r_h~{EEMm|(6lmUE;I?_y>M8e)$pD5DsWE?s2JE;c#XRLv&B?x|(Vz1hNf z?P7PYYpQB@msF-9u!(8+k#g*0<}7Qo2_<_}nGzGeR0ggw5AWHTZL)|>vcL{p?x=%B ztUJ}YDY#=M8)sH72QptK2Ue;CGG4?W5@Nt~tTfqs*JsR5`DU>FwP}^JgZHjO>n{|8 zHU`!5rf;uB?W@(WlTO+9i2G_`9iZ07{%(=+sh%`2igWJ4hvO2>iSDcMoIDNrp-XX& zLWUmW8Yerw1Zs32EZe@C@}d3{nmy7FmS9jagPmn>J@KpjvhAz!+%66EdC(lt$(u#_ z%j9~-jgh4QYlf( zcCdZ0eZucul8OqMvudK!G7CpdU$%SV7fXBNcNEPwN#91KkNp6eXH@#K-gDk7{4~D< z;1^DliAa7VeOdQ8Hwr&FuHqazvHUht={=(e-|N0j_)$LtO%i8?SReh!Z)nPH`~&q7 zxsSM?OS>?qTVVEe#A-k|@4@^=-AjH{_-XmAL`Tf@@w`!v_L6lUQEN~6)oaJ@Co)vO zx%Uy15_+G|w`B55%kp6Ri2H@#BH>rbfh*la^2@f5ScbVU%_Iw)o)hGkZ6C2p_#KnN z-!dq_-1~@CI_^sPwqTrO{nn#?31QOmI|U9bq7Cq0DV{9y{lIGoCqmyKUQ&EQc>9Rw z!On+6-&^p6h8VaEZeG0N+qg&D#r@&9L;QAofA|ZyKl}*p4<9&zyPE$ibeH!)yzBwQ zD)*T8KG=slyU`|b$9eCA|6uO#9`(S(xAXq)g@|_n?(cpi>pj&{jT%D{Ouj!qDw2_rW``5BpW3 zW86Cl@EEgEpxg<~{k|{ZG5+xZ0IuG+XcbN#zg68aq`rvg9}G(GyT~J-ze9l~_>ETZ z7rG_?fFGvO?42gQ4BL zF+SSt8W(Y&m)pt1nYH%|Xo~*@PcALEW#3ui>ZY9Mo7< zVyGW$aS9c<1Wy7x#NP&_zN-Xwh<^#l)FiM&tVv0XD;)j=+<6af!t4+aKcuMHAs+rm zr7}Cj!;dR!c8G^lCFd)oHFvWP{|v0fa7x&_Srb%wTl9bNQ(jx?_j<-ReHZ9exk&Okuvco7KcZB{TW5L;Nu8EAZqEFI@;wkWBmwz=-|$ zDZK?h+#x3UsHgFR9bzs-V2AicfS=(hm|yy10PGMak@SgplH*H95x8Z{n<2y4Jopar zB_pR}(|CkiGqeePY33d=_jxZFNxc*Ky04qC`?_-3D&h=o=MK@`-l5UE(8Dq}mka&P z<>BGYcr>myZRHiF zW0N~#6}SxbTge*|@dmm~&Ri`l2b!c2` zsn!)9Rg+pd)1t`{7bjsfuCrXNy~cq~jbihF4x3xOAa!az5>?xo_{9GpX?~9Hz7v@?>3D zH20_R*0RXV280G0G(h0$H@zAxBcaa!E`fr-k{p5eX1>`Lb0;45OLz}n_!>7{G#7b? zT`SJ}T-Q8EbI7dd%og|tGLr-?zk9J`lH(0xUu*aHE8aj{BxN6t+31^QQs9IMS60Kg zn8$1;=+AIE#$*dWn7dr8g`2bHVlzW;!V1V@)Hrjac&J&9G=~Hz72+2mp~o!y$Sda zL}0l7LVv~0Hzja>)zN$vPmrEp(ZtnX^FcR0QTe!a&xh(J!;jyXEdL5Tj4z4@oHKZ^ z3^bl%`12`aKp651%Ym?c&|S-nWz03#BpxkKE|+s{M{zFyQpSU_9h3u6xem&JQ09a3 zAbR%&^Fw(N-e*C15z2@h1U>T;Lmo%r;W{Yy+?U{Kz|({0eR%jS%r*ahJpYR4Sv>sw z12A8bvJA@)Xgcx3TAcW8M<;&Oi4#8<>BMiyNq{i?ET-`Bh6N ze&R|feoWHoIY0@;w9<*6{o=&c3_9I|M?^SSt90U5y*TlUlurCem2~k-pHBSjml*k# zN+*7}N+^Et(urTc;sh*c*uD`yFX%=)-D#TefJ27APP;m@_;c=cKIBCf0b=W0%r;2*g|)ni6Hz4eh5_$ zxQG}fxa>rCep?fARf=$qz-a={5Xdzw{AcI^ACUMC2>hWyu9q=97e@&{FYprr?-JM} zuuWitz;_5-BJd)C=LnoAFewng#KUripOODT*%h-G0N#&a^k7dVj!d5o$aTGdjTr|Hvkp_b^@LW*aFD()B|Em*~mqm z0ayoo5+Kvd_yM?fUQ`2!q$N@U0Sq3Cr6$GWlPhN$jlHqh%By0rrj}T2tJ?=fyxZIz z?oO!X-Q)HH+vieEZ!Fduy8}vjH^r!)Hx}!Q-3M$(Y-em2V1I0HY#-Vn-&?MRs+mn3 z?z*PK_nUH4x}Uv}cplDL$m0HD;;`%fFZ*-KO)1WHOSviC&%Kg(5_!eTL{m>31=BIy z;;V_{QA2q^$~EbJ;r9fuGbLta1R0+7Kx5>d5Pqfj8#yQ7^@3l3yfOUqHn?*Garn20 zKUX7(cM48DdBmwtk%m1l<+yaemP?OpY#Y%SXxLd(u1fb`xnN4UE!{umy#+yhGI8+N z{LK*mAHt31t;7*`uf)Gp{2v$p7Qqh+ew*M=3vToZBmO@K&bzi4zse7MpE%OKQTRU= z!hb^?`P(M`l!puAC!;NpUtIiW5XV5E`;&7+IQ5m&pZXnXT7-Ur(D#b}v*N#nIO0Dn z{=CPD@y!sN_ok8GA0<5R$Dsc_@gGYZ{?s2yGmSX-)d=2390Qu}e|8h+0E{p+HxWmN zr2CKWA&!n;_YaL;VhsMe|MwC4qodLNyH63vORoEG9|F(fK>L|U9BI}1T`Bk-lKzJz z{1&Od=YXU6dWLhUAkO(!5JyteaQX%P)AbgrVnFi=zqWhL^5*s?k!kZK<8pi#P4T|P z!s2wfh`hCepp29#5X`=6U;~Gw<8nk3Qag-6c`6`6}lkeXZV!*`6|% zbS)t{D!|Cl&4#KqRPSt0-v@>JLW;I#d&x`pv{HDp=V*1L`)0}$8ezjM3P-ZUpM^J+ z>@n5ndHO`c;*#efK=@@*3B+7Q5*C3pNuFj^dYqRjK4~Q+!$ih)n%9ETi)C770od@= zc^6hkLQ+rpOxDI0UH;QDi_}Jxtu`~u+JuLSz|4e&bk<}~nyDr!KP%WdtjD9-f+KBT8PQF+dk3{K>Ssg=`-$us8n{9^4TP^0pa z+2lEu&xbHyq1i9;ob~uf!1R=c>^-CWvdMFP8S@MpmFJ{>?~sY+mqniQCzuz|R9fJ? zTgLm%NS_ozB)@F(oUUX_*g0Pleu@J|^2;XAsr)EcK%@M&43fTV@|?et_R%Dn`yl3I zG=1R5Zy=b+^ktLhoG;%GHB!HSc!Tnsw}t9+sx0W(q(!CA%#pInbM^|qI$=-=eoSgT z8gta^B(spL@|^pHpVIaUzdrDjB9$4djW8fT7^&CffbhFs(zh{`-?Yj=7)@U`c~1Qv z)Ar1dZRU3y(#NKW<{p*4LFGB+wR0-LFPtVxx&e|tBhT5@yt+Fqf2rR$T7FfMz5}_- zFROg$W_iD~*lNHpXu@gL^bIB-Y9+Jq{VM4jK>E@OP9h1^Z=`(aPWisk`UuNkW=kJ8 z_oC!O2ZW!N-)6kDrafa3CP(|rDj#|%#BYmq0)aA2%eKmM8u?2E3hTu>Ed2HfgT73D zX<1f&e2YmE=C@m7UnKlmbRZKPAd+7;`OxFSZ<5gOI6;2dgp#r{G0<(3bv zmvOw_a7CNLxXb!&LH!cKq~&)C9GE5Q`>zvE7CGfZ&j;K&5#Q{1d9f7Y$%k?cln?n; z;Ry{{a2ebjx$HZT4TXH@1u7eQVsfFrY^5(7iP${3&|V`8TJ}IL8O>KOaDDa(y7 z`2~L5p)c_F6xY@G9tTe2u6+c*aWCGxh+lpT8kpF^{ zn>Y*BBCa%64S{Sa^UTZ_&x121G>1U8bPpic8izo(^cS!*=|dn}Iskhk-6320TiB~< zx3Z;&6}7UZ$CS#-mgXU#VPa)Vxh~pHS}R++6@hz+ifk!mJc}N{PfZfCrCtho8#J?* zgly^mQ9EQysp*I-sY%F|_NqH%OFs%bQ<$`}rHti#qE@yvF%9++v++}UGklD$At0l; z<_byDFT#zwhJZZ|>(Ke7KLUUxsTQd_q2xw*a_er`_|j7VAXLgs84j2r{9UNjdEF|A z^u0#AOEW)b9XPDmzYCTAFA*w@Se%HEC5_Y@WG~WzN+7&-OO^*2soSE~MlO0ZblqrO zAlMTOCW|2=i5gP%qC9-fG}eWaM%d5>Pe=_>a-I=8P0mlm8!2@<-j_PPn)vB|ip>iM zoX(W?oC0#iCSO zy&xGW)REgv5)cgeR4b(fXd)z8mFlPsfgo8K>o*j#E`dGpHr}*0*wd|v1}ib{cI1cDmrGFp{==nO;3xHQ#+Ghe?=uw)G)QKySeKU zsylA%SZDM&`LAr~ou*V?WLwM9S; zupLcSTf>SQJDZ)xmWD1-Y-L>~;Hu6ptb+7F^=wx&N@9I;6EZ|~R-w-5e}vvC??rmE zExF`Ho0?ZQtZVDJpt&9E)=npuuY=V$H%t9zG+(DZ*j!&{2JlUmW};gpd$9kx@}bhn zrsYEsjHBNAB=cIL9Z^50q=9!8q*6DN-d=(`^|xVHs<8}MwzvjxvKJiGDmt3vAxsPjcUL3|V^ zoN&93o-pP!6mWnD%qikOU@*uV00zTrKIq0LDj$nq>Yg_le*7$DJyhUfd;@rBf;@;rRicU*h>a z9#-y1Je1>68A*O($-3)dgkUIsS&9?q5_IB1gveX+yNyo#l$!(y!*5GE@k3LVzW8NL zrvdy(D1IZ;i66`oil5BO&cVb28!Ix*$q#03jF@sn8y*_`Oa#rU_4!zfRL?v-op{HxD9ql>bEgtmRw{(8y8F27VlLfYqGlF&rxxOP#gP zTUdPvumt$i78<$GYJ}Sb9ADhEJ1wl{dp!#HeHK=8K1zP~0HTf8Znm&`BOv3w!@}wn zg4YSoe2}gN5NnyWuoG6#1Z2DwfOv0eCs|lM4v_JdTUh-^Kx8rTTY=vY_+^3MVf<$a zMBWVEXKN^N35ZG06)VEQ6_<4b!5XhxA`u7NI6WAc|9RimK zyhz|V0w)Sg3Is6x76Zc1$a_+bvl2MvI9YClDZny7=9~Vcp92VB|NxCY8V|knlH~@Gy-~qr1fI9&v18xIE9*X(^(GLD9a-B?n4fwNsQvv}D9*dQa zi^nHbOpeFr)hvp|>Q=;JceooN#ktwN$K3)c&imYLz;?R3+}*Ald)j>-Zcn?1;P$+G z*gXR5xZ4Yf&W$ljdKMs(B0Oq%o`Le5DRCP~9B;kuXOAVG=Qz3_J)U?z(q@NN=XBz* zE6z@Y@|?P#OF3j#n(oK)d<5k=bw9P5I36`^#PI^^e&I&JRbKOc3EwFMkBWc2X%UX| zl;ACbv*RWI$0htZ#EX4-M(Pa@%5$y}T;)06OB^q-?$>T2jt-{&23dCqr-aFq`&6MjZM6dkngCmQ+C0RANDfqzTN>t*6d|Jg!6 z0&R=_kBI--#1a2t@xPKd!mGSymxTY3g#UnqS9#4n#4)hxe&i#>(ShiG;y)7~1^z;B zwem^#K)o>W$;`M8p>;G`r+~1X@s&p=e87 z+u3vDs>X)K7JTg*`7S?XkePhxg@x7v3@Ie_I>j)95y?`B-Uu4>!n%scvPDT6=JFG% z%OJDxl1mQGo~T?@v?6R7!8+q>*Gs-B;y3r!UzR?uEfrBXTZbx9n3*;s(Z>7IKoxQ8 znXh&+;_5Rib7)C3MGlQ`R@q7uUl!j?c|gNU66w`}%~~LZo@6Pc5kpsGMr2&7IVAKb zqN161_ZbmGZCM_X6;#ZUd5B|%BeCJ5E_4e>P@ZsNUyFohnjmCE45mV?fFs0ciOsRn zkaMgwhQhc8yt5>sr>_*wGcdBQ8qrae$N0 z6l1k=i!H>n7|J6VgSifk;{2B8a}ph4PE_uZUw6iUAFY)s*;#*$a*xUQA%Z_poYA#(glk$A80IkcQuDH2)^!w#CeEG`}ozk59?GvQij4CFAr?q)(!VB}bfc#X7=p;8~$U@k<{4}ScXgo#XFHo3<( z%#~=y3cof^7}8B7zifIe-z(*>EZ)lx*K`x&XI9g*%I)bnC`_Y_*$94V4AOb4Tp?G> zBjpq~N&1co-KJ3b!n_BQQ`{)+V}tP9h`An%vTqXRae!#f;si~d1?I&k zzw*=lbyW2t)by?EZ0?GZQ>+ty+V#|-BO$+);3w}#RQj^YJ+2gfO0-h=)q|guoqCyM zu3FWIrq|lO#$Zfu`h9pU!VgnkV_LMM6Ff_OWR;`r5`LJ%8`E`y{IbbWZWMl1Qdk=$ zzn#c0J_9n$U~-iG^1dz;%6=Rw4Vql}jgq4*m+uO#-*PM%v3^r$FPj|Y4&jH_)tDV8$S<25<$mG! zEom?N2j!Prj&id!vOY=QW-MB609d|GUX`$yX6`)l52jh=FrBP&l7sU*x@r&f zeY(((30xyS7_F zAJGY}yz+K415S`3y%@i7N)}SK(fG$3Vf#;Fvl%4z2*aK2x=qAjc3A-0+hOx*xnS6z#xIX%auq2&S|jHs;4BujrqF7BZp9g2Djv6kN!>0IS_a z2SGOcC1C6E6dlJ;v1tG&AaQy^N=%0$6TVi`bj_!Uz#W(gq$hXzIl?Rl-bHyg)!otz7(aNuD3FkZ=RrMM!ZJM6H?}=X=~ysC2nt@Xx%PK{#A0BpQ85n_%y^7PmcWUSVmo>K;6rP}BPSt>RU>=N5v zFG!tQ5s5JoDORcj9#sZo9d1${mpZi`@tiVJtW@*7AWM71%3VVml+G@(?(?0LXQ5Pc zL>VgYaURt&wJNo1WE^Zf@~aFhJjU3rwSG;$(?+rO`A)oqj%KIt)Gt;ll%a``_SNWS zdO?FE`j*xTr1Uz?IR;s`PeM8$i$S2Q*d^V)C zyViEE=zt>Lo{q+jwz*m^5W?-g@cMNPzDuyl%taO>8j{zo{4cgFzTi^x&UQu3gOG2I zKNa%4kz(MQk*qJh5jL-zHU&x-I_A1_P`Su?2Qu}z!G)8dQB$j25+l9^Y^)2bXTAqT}gJhanb+0NvZTR@aU zK4)R#;kSJ0cb~oV*zMIvil01f_Nae-`q72U_CNTgnU6NT>%yWxZ~9IC7KGh~XE&aG zcsQ#%gy$$8u4 zmC-j;gEjN<$36~q3ocD}A>?IJRife4Np?abO)da>au9y z;~d0~IC0H_PF%o{#d@y8(1~k1vi{740XlKzN}S5XiB&01T*F`}E@%iZu9MJ->n9S5 z>ne2O!i$9B$_AY_`JuREK_{+XNT_-V#kHbI@Pgr52t#psM4XJf{xrb?|2)MN(w&Cu z-BJGf6_U+gC;WVeP|q3sb!NLS3;#Vx@7p0t%DTale(g33t62b$N3G>79I(0B>;N@`VcLKIlYU?emUI~aTrCLtx0jp~PNnZnqt*hF37FN#`_sM|RvaGGJ zuzC_;Iq;N))z2e;q(2~VpTIqUqY-Ymh1EO6eT%@20&fAt`fcq73#-|r$ZsVe-l^IZ z7FO4a`#gb_fT(q&{}<5c|6Kw+1$V&e!zfqc&s%8ZxXE__IQCs@4_avS|I&RwaBSt( zK4xJx>jm$1?OqG3`vA#rtA*8D07Q zaEk!(-q+SxSX~8(t(n@H7FJINB)>_37!zt!7FL%7GCe3G!fNV-#((020;dZ+Tj0MS z9Q~!=O{^1qt-v_~rwJ?($oeJSA5hl-Kc2WY_;Nu0B2`m)IwNr*ah9AQJ6!@$_=?4;A2&O;VC7~RTNKg)# zI2W4<*-sMk*aRW_PC_}fk)bDfFu8fkL6d%%z{66$hXnpm;P(Y`Ok#L0z!QE#AQ$$D zvmFt(32YF^Z2-ETFL1U%ZX?s3JtbjMAb`O;0TH&S1#lK%Js{ek(H}e=knI(1!`!D{ z30MPsDj?hI6hOEcx%Ub{wArE*;5mS7r)L9}0G~%#C{;U<#SM5Rl{GLiz(Dj-mn31~YN8%EVU56)Kmg+&i{W~`cxqBbEH<+$9Tz69gp?Kn<1MvfovF#8jlYWVTofXahiKpey>&&BtR z=LS6aDdN~3Q2cV@7Yc=sn6jX9Xc~y4LR21!?=^NhJaZ>;gjM;S&kMd8l}^J$ zP7L2_6$R^N62{|4#8g zEV#;M{tpqy zi@E_1%|8&wTcz?%-y#nF_Xz)=5)ahZFU5bW`2SJx2L(@}trADd9Zo&6S`F~RIp9}sq;wb+sB|ZNn{{JEVPYC`e z!H*G#eZSQ2nRu5;-y!t#iE}XH19Js&gs&6&_Yp6{TvhzO7Kq*AB}H7!9PbF z13*1!Xud=oowLgSe3dvR!YaS>kHj%yR{5LjKvNuOk9gJ0ISp;!9}@ox$vRglA~k4zG7kiCjXn=PEo+-DZVVuryuXYnpp> z%`SBEB4T?k`m{$lK_Nc6ho=&bnfkP?Fg*`(1lI;bY>=D_DBIVCi=%oX65>Te@$uJr z0wkOhf0;kWxeS%Fk2;niCq6Rx=31nEBj+=`^9fOjkuxH%DKWYNj17StMNpMxOCxG+ zJSU@Rp04Vs3{3ORIz;;B%>1-$xzD-??j_VT&&+c&zUt`6)Od=bqkN}N%T=7yarj}? z6bgFhDD&yw0gT89ymKs(zVWvh%X{&0hm z(AhL-i?>%k-g%bXhjyeW(nEW>On1)08w$}QxkQ|mF=@$GEYq@N4NAZx`A@gn=ci@$ z_gZdxHl}Bu1TyKGE;_*dR%Cn7K%Ftl@F}_6^@T8_BYC_M*Qp8wskK{fh zORO^nIi{4+=EB@fQ*{kHus1oJuRZ=lk@_x;! zwC9xUxucXZgXw3VHDk_<=_aH(r_|AS-DO4_(v%K6Wr#YTl*0VnNm+kPeVlFhUdm>A z+pJFwXJ;-v%^4eyfFn-$;Jh&L{18o2AtHIDWas4}HvA#1HXnYlW7mhBhqX(1g#g z92S09dN8K)?RGCn(2R|NRjbxCHm+*k(AeDBv#O`znlQhk!mmacRDmB8l>E5YUX-do@LZG5LKzs*SBbaa_+>pWc0l;mN%(T`Gg<$n z-75~U^Xenpd9jL>mO|Tei}0%fKPiGxeVA`V)Bf0C!tJ?I`0>-3rW5>vCKg0s5468X zJ@nPW?<+$0t`p-2QIqZ-l7#E`u<+x(VKkMEw)_?&zc*N?v|mY|$#2wotd-K{yF@_N-dhegnjyR;@Buf_g+AzdY+ieoSf-?d3G+D z=p5-;j;G}dSnI+IdgvRF3LTezzUwdW=fgIcKp5c*?8MD0H$S``YruDdN8~vkx?>OK z?ikM1sGVnQ5W_vauJes_x|(C*aLDuKMmgW}%FW-6I7bvS=Y*UH{=xY4JWtR~&-NfK zW$9)^#JzKt_uxO3rVoRhoVxm(Z2C2>CPwreY@Mx!nC$NY9whB|)&XXBV}pAh`WN8L+anq6^wk`9I%MX9=K))eYI^;2=5|AQ$vaka>`;N) z_57SYBlj@Uq3wb7hO*m?=Wg0H9;c?8kzN2pr&tSV{ zKb5O}#+=@t+H&y1l^ySRX#2}+T%2)?q2A-D|2(wceB2x2-u-Gk&)nnjB+h+WI<#H1 z*=@Ij zs6B&PZr-&%sLUI{nbRlYC*ho=eg9rc;GUG&*ykR3<<%9MmM2cGIre1yk z*MrAjHGMwInrBljAA25ke4g{i@5Y@KEGxbfTGnG=KQ@M8$0AO9PW5Q$d?@RNywH~K z(J)HSIz{;H7!x-yL|bQGY&hqEmq*qdI~#pZFdZ+iS-5=wvm^5cpr;O>j27|aWni#^ognKy3t42vg?ayrq`YiW|{eC ziAfWTkL6~|!iEX@VXrr`%!28NYQsSuPfB?O-82tuZ+y1je&x}mJLF$5Px;2f7r5x3 zF2sAZ2=CJcc&`@X{aUd7c*morPbF>Cd-&Ul53W7l;Ua7dG;z@8fd}5hn-dsIT#O|c z)5rBKIl_9FP=D(0^K3gi3FWA1!!pxFH;*WhCwNS(5M3DeIuV%xH98_7AXr=E3I>#0oF4!l1a zuWfJkEb=QiUxfTzhxXpbf+U{aJwoSw_9>wsucpR@ylm+Gse0QFl zh&C}%+k~&X0R7qnW7sB&YmS|aa9ZB1qobfX1{%{Q;BVW+$t zExiwJytbtZI&rVhE4ln-^mAqm@cXWsV=OnNw{s4*aXWsnztjA(o}nA{f!=G=)8UWv zGUf#Oi{Qwk|oIj78g=m8Fk+34PqrtbLr- zH^M${tQq$>Z&&*}-l#wyXX9l(Jtggc@y|lrWg3Eg+hWYCINvytxmA>|npbak zev;nTnSQBiah@}a^}{}2>&b7kwm)Rw$2w)-pI+Ct%>2I2hDSSHrZmCuM`T{?w^3i` z&BKrIn>JJ5Ot!qdgt1N67NX{_MCrU4h_C|@?+VsEcfoJFrWZ?cWdlEU zw!c0Kx%v0k5a=;E3Ow?RxDTZx;yV_4Tfe}uKq zGHmf)uW8qKXOwRI6zhlIs^p1!-#&mj=M$JK>NghMzk%=9hhyc>ec{h`UirlB3%5V@ z!3EnjzXx8{?^c^u?TgI21%4;;ZoM6eM4T`fSzvs%puXQ9!rvJ-c8ztM zf`| z_mbZtkh{#uGpAYVEGuO}$#cVM?WQzVSAvzFvUi!JP~(xi(lzXqZXA7J+_jG>z47l$ zqyITW74S6RaQ9yPRu-I8Qgjs@*;I-v;qp9?f^k4&#XRI=&{GV0CD6an_f&(vOVRNL z{eYq=gMLiW2}GR|9#l)_4=pLBW~C2-OaAByrPQWm>|-Vrv(2*Z@`o9Mf{(yn!Yd1S zA8OIpfWh4@{T;}E3B=ro`UDVO%jyx!wXBJsA%r3)*W*;~8|6Jp+BTO(;3^$8>(jU$_oUG;0~TyjPV7liU+=m~amb_m zQ5xksVqRn10<7>HHplA^uv=Q@#Qsc1>s?nFpzC= zGcr1v8M)PUl|h-us2+@l@%1oe;noFnQg|Ji+{%_lCKnUl?z&1`?lHMP2NNf+k#z63 zFO|}?Dec-P(sJSw^NQrHz?{4dr2nv`SGs=%;=>w}kV)P3q5DYNhHyxf<%Vze$UIAu%ua zzXz7TjaBg3U!y@hfl3;=pJ*Rn_Oca{gqe&6X5=CI-ODO>%G8m}Xv$VdsC@!Q@pX5% zvxR@2sVP$rkK&+&R0m7(RZ@JP6rfSB;~L8*v8aQk`6g+YI+)mRV8_MIu9m?@>yFpz zIS@yeBO@Z&y8->E~vFE*JG{R|Pooo1^*w__^^qZ51sC=1_8Mn9VgMtpmg zkj*b$SIK9xo?zUyPo<^zQy}%zyB}D-Vf0HfnhzqI-d{4k>wwxKeu71OY9Z?6fF_fP zhZ)tuWE?yfeuqqyc{ej9zq2h;Q?c7i&GiWGm)-)9`Kh@9SpFx-?{`;10HvStEf&f? zfn_Zrhf(*E;6LXe`7eS124~^m@}g@x7LEC^^+S2Qkd}h6h{#XDJYe}xk>QI>!4^Da z&r5_mg~Lb_;Zb&?sJ?xS>s8lP{<}azv>G?uNDEr4;?{!?0Pd%)0-Egu}pO>DzmMt2PO=v&CW z)MYlxk|qjBBnZ2*$svcaH-Wu7-sRiB&;}Ya936x^(=~3cCPdE%xofXPP(S<4Ao3H$ zQ)6Y1No4nw+B}Rlam+USFjRjE^d&z29EAa9{gwUx)G0%#zSPCsmc4dsA(6B7NR?#sghJxt` zS#mKPtA-BsnUr1vCO?MP(9xx({{%ZZ3?1v1{t9+ZY=@p)So$RFY*s_Z6&Ak&`$e>y z%hQYVz|f$>5lg&yI8Z}nE>ABmSJYgdUOW+KCuz;)>BZZ@>ODm5<>>{FGll;M$C@Dp zffT+2E}Xp#DRxV*Q~L9c zxiO?g&iLox7-3fIotl#xm_yK8It(s?iZ5|H=|?*LYQ zh%eC<<_&%U_~>KA-{JDDE88XMdLGMbH1_?x(p>=0lyNu%E!w@xL=Jp{PIV_}85cZ; z_)pu;G?o;waToBVDR>gDC42F*r;3A({%dey3oEvb{vn|3)DBuxNyE#I+m|Y@i%~SbSXW_zCk^tx(a!( z7;#3ReHOrlNf*JB1 zWl)d9*#=z>LS}u$IYga;JTNR72gl^d!a#a-wm%Z*ehc_nP;f2+PD~)<$-HT9NfEzP zzyZD&k;7%X;WM`lE5*Dh=Id6?u8!3YldgX? zKVAQ7BB+10z$!~kszTHu!<~51B_pju)S)AR%tPNWj2tc*IkPZ^JQoJo0Ue&HwzbGt z+lmvFq?|kKEyFC&l91Zg(oF5FBYd5(BWHq~#MJ0oHVmaR0;Ms^ca7oIA1!D;1C5bV z$Un0%y%fqN*$73Vu|5&elg=Ur-Q<?~u>*=Ra{*E0L&X_=i$9h0q%4Lz+8 z9G<$ev7@PZ3IuDX;w)(o6diU?UDUk3xvc}2ZcMFfYv?g*?54KXwRE&MU$%Tor#J;d zEngIoxOLrKQ(M~`+txKTPhBMvtT?dhAKo!~ZS{!i32U>($=nS$A~f0rg|jVP8egNg zcFFPuU0n?lFyne~OTT3KCGG1wY&lq$RqJq&wrW)mFmz$y>IV?bbnwAjnC7#*XWcas z&KDXzhNh4`-&#L5a9Of^5mW`j6L|qg@7g8Fz=h@<1?tF#Knh>_ssXisz$~pk9=PuzKnR~pJIzfCE}OTKFit{(>@pW(VnW_KgB8$ z=-ao^=lc$@(L>8#xHA#oX3JZJTkQG+e6EeU&ZtFp=IBy9XjgLMEs>&8N&x%n~*;lY_nj$H`vGA_rxY4_9XZ| zXkxH#rwpo<*j1GC3bGZb#kNOc0Gsz6F_lA+~rFXcO^w8^7CQ2w$DNIeru1{8+`vGWpIjHK0#nq-V}|aVu~?-W zTcHuwltH6%BEHx7eJ7TD`Uq}D9hF?4h=0pC{QypgW%9^7;~O5j^rhc_FL`4kzTJ5J z!lVEtSx$w_u}MYop0~y(l^;&tlH7pIpiW~I=zq0QVe~czI(Tcux>z8b+Qh1>_7R$T zB?L8l83T>OHDaw72&YU&OU2Uz8pkG&s?PHhiw4=^1*xQf*G!KpBRLwR#tV{> z91Swr3$jeD+_|7Za@5-CIb|eAy?VVMb!y$=IW=02{;yJP@`7ZfP=nm#1<8ner+D>y zLF&}{yyuh=w^BXk1<8n8gFNm9$%y-~c;!j29PvWv<_5J0(&Pw24R$t2Mp|@>gEMg( zq)x47YX)v?I3c4{cX(78jCIYv62lY?lBd=^o>K;6rK`oGF(r$irfHrJ>y3fqGF41^(KPSuuI=zHyix*W!b?7e6J}*d}TKlm|L*qKl z*5dyvRhbuLsnHpM5G}q_r&u@oPFuyg+jlxDR^7pgXjU5CUN4c$)T#_48iZ2ydsNHS zS}t+&UDJfO1>7{{_XONDrab{SzeKFV8$k1VyRpv7ST&#=5E1={qR{-N4Eb{T7dESteD+__&PPYqJx z1z9>%tQ&l%JH)!xchYS%-7t&Dm-0U7=S!_h9Z{^xFc0hXG^h-Os&PbAkup5!QPru{?o68A z_%Ig#X>?;R2ctX*iWII8YoG75L#%s!CynN5-$|o8?mOw$Vv1|AFkr8ni&ehUO0o9( zP6J|n-gi1GR#n;vUYar0y9lSNN^DHJB?%|%;Qwmj9qpb7d`uV@gXurp3sWR}X zmipnXO{sQ!RLj(w^x|5h)InUoIPji@{V;~jm-j_bKZ$%XOA$|+TPmJ+R)Z| zQ}fkfFS59(qs!imlW}>H(X4_W-1WozjY4dNR@HDq)nX_>XG0g`Wl9joWrj~?sP@*z zW(lIn2=NJo$R63MwGG!bF9EO27&`0?MO}rlYbTfP!&gSNHMg(n zX>r;*+SjDkwRg9!X>V>qk@jF~;POkb8M6jgE-hKU+}<(X)O^jlHH!kwmMk}$A-GM5 zX$#(LW$#cjdk>f4N~$hwUO>-Nx6_U7f^J+*w9Z6fc1Xbg(sj_))Yfd#0BJYwVxlT1 zZWB4J-d0IBH!HkMS~Zs*>Z=Dew`&F6y;8_1r-r5`Ze*ZzLqzZhY@=lQcQ^M0{DWDI z2;0-q$zt`jp? zx^+9NyP&G4*1m-{^s;6IZC`O?XS37T($FP5tg8fEC0(Vns;k-FPlmUH@9d?a_*9Q- zH^`x)x4FsbF~x}6)NCQz+vGe9dPyD8&jZ#yMlaSX_6j!n(6-ZV_;fL5%Mn@WcD$~` zq*(Sak)A+Ns6ylg-KHb7DRscQqpNvIN4xDn4KuvlKAqmj)#|z;=e0%Nf zW((SzmYEj>z0z`YK;5fbk?k~|fj2h%zT5i0yj`|5oBS9un_E+dx!aFH*R*5&$=>i* z@%0XLoZVpNk6Ww^xf5?Kx(76IJ5)Fg20G&CjSfzOS{=_4IT|?)Qmjs3kP+Si7iBWn z@rM}`sos8P#uk%c?;1btFr5Zd@}X`L5eLgSMB8tDJpH~88AKQ8G}qc4#=JpwPNPhGDFCOjp{;FsPebE%wtHI8 z)PxSHyBQyhb>H!l$!#mUC*6=^3lLbh&j@?<7mBd|%JPVd8$YvMPTedXdO zZn|UstDoNE#Al}9!lxFGTZ11y#`NO10?#gD+wka?HNLU-;^H$p|96^3UOMSuTt>%j z2DAk|m*ASt4GX$uLX1|~-P6#HNpSke6dcDLXpir1o{OfxwxMUPgO=0LXnGsImf97r z!-$X8&v%?XC%ycBOI=bw5jTd6Xhknx@OkkK~yeqhxv%`EWbk8-@VBW>)k5hJL9GtM*z*4Sr(a&@V zFXY3Nmz`6P`{go$mx(+2^NevPXCKzMuB!{;SIgG5*LHMtIvD+%$u`&rE{8xBhU*(} zN9elt%iDWe+bBUaH+TPrWbz)|;CsHNt>c;ob{##R>_Gq{4lTRBLz_K-na>vhd- zH^Q%>#{_KXYEG@|MvFFyz#!Gr+K52cbV0f?g`T||iw>!d)hUen==)Rnv?N&<(%!*I zsip}X%j(uO__k|G;m%~t%X%0|N2;x(0WRp?)^v2WHg~61cXg~yrNsi*DXB%RhHVP( z3<`jRc*9MK&PA7V0TR@HU2|88v*h{ds~)G<%tapUP1Rb4H#A5=;bZB#=BBx+(`y`t zJG~|xv^#Y}GYWu}(V7{!Vg*YO{|!iT7lb}j98puN8(Q0tQ(K0N%YMBzrEX|xZf7w= z5i2g0Mgep*Vk~KHnsSzj-j4lDMJRz&jQ2WxQK#o4kffnQ)N}3-$xY7ih{Z6yprM_a zWB)PLa+qqrAGEB_JiX@3)HThG4Vc-Y98%ru8e7z_c|&V=53<*8YJz!Z^>VH=1s{ya z$LTd!&&7Hfr{U()uL_2%B|M2pAnEup3=%)_iKWPwu=n6_R;rM5y`Ql!JQ2B+t zGyG-G*b5e>mrd`i{vz+;-5brlta3alJe;@xwT$hQ?4-oe%e8T(Hm}p3h^t}5ihH&l z-n9)^XT5*7_WJ4O-tC3(71t(O?Ty>8n!CBv@87n>a}iAL=nhyJi}0aqjn93d!;8Cv ztGlP!5@8vMFvnl3i2f#g`FgUR-)LR4JoxNz3kSBAzqwaO^z`58clOJO>ZQL*|L&)_Hi|f@dC{YCPxTx%d7HMt|4& ze(@8litoDS^JkBJvf#x@@A=(7{v!75_YOU>`(3T^ai6^<{_iJ^yyM=>&%9&)Q}4fj z=Y$9HkB;wn_OgHe_C+&4cmL{G!*kD$-RFMs;KSFfS%3G{6_{KK1P-KTE7A`pWd< zmECvl{n``1J@4*kuDJ6jCq4SLukW4rmF4qi{Gt1B!GkmJ%s;mNxmRxaL}EhqCvN?6 z@h2XA=BrmMetF2sakn+jdGD56=1l$7qjUCDCa-+(_S3F>u;-qaKlRR@hkn$5mgX(_&A}s$^Aoqe*cXF-eLVem_Tw4A z!@F8pAtiWHcqsZ^gQpHpJ)TZHz5kEBw*jxCD%bvJ@12j`G+(7H1Sn+}QkrUMlO|15 z>_AFeXeG3vEfBONX_G*T{RnL+tyYLwF=~N;MT3nRwMc=gQK~0u(I8c$R4K?5)__v3Ftb#@>tlDE2|@L)aaBYMPHdg1s1f zCH89Ub=aG+w_VRvv*=3|dwFUDSpy&8KR_Gav@*xRvtGtEH# zcE*YAop=CY-CU*zkzeEahBBw?;KnZ_d3ZU(a{GwnLz2Ia3QYf>>C2h>75*hp8*A93 zZ0Ns$X~gEuG5~%<^1TXQu1~wXsT$yaRO#`iq=7uF^u8ebtx6xiW8~qZAUALF7Le+4rVzfZu%CJ4fX+LE*i@=zY` zcys%Ag}3>skZjB2J&Mnk*C$n;HhQ?T>6?0b`6L7ptxoAn4X=2G-FZ}J)(aaILx zm~+!Bf1BTC#b@*TC6$LQuN6w4O}{sH7wp*j=uPJW`3S;sYp~^MM9kS_;+=)t??5^U&5;Z`KdUw!V9FKS8$j_hqHmmXCw;!tl2K+WQmTxX0h0 z;N)~n?^?t6HqHwc0gJFRewHE6Q!93!59W#G%(7&8@fu({Sa(_9d5)P+)-9F?%aG;9 zv@t!bgFMeHd)9B(QRa(f!TQHCwe==8-AG14x_J+@I{XHY_e=du;;?z&krU}{A)!!rq|GvuQQHcp2IPlq!h zu(YsoW;Hr-rU+?qS`Rukqj2TKIb7((30)NMPmt-v>DdZFY^*GF;=B^l;+$-B;skAS zV)daDC$*3h=YpdXXS}fHA=2q7>`DZuL!lGrMv+#o%ySwCIdNh*YH{)w1?21{aP{VG zffHwRl+SPAO66yvZC5 z8FHE=Cr(%)C(dC^0pQOoWYTs+?`c$M$iQRKB=ejw}UuS`8P8?*ebCn zvu}qvrt-IA9Q6*3k{P+#0gj7|b3*#(wc932w|6YaXeFvK)Bk;c+dpE&2CB*MF z=J0DlIbnX;gzznBD7d8xZ$|*J@G-x4LU=nyCslYmilu|$lf-Ywc$t~Y7FU_XJ9Nfy8T>bxw4efxp;5!l2%F(Lo)i4YC~gML5f05y)^AU<>p(X)@>* zf?FX+4BdPXZEqF7I|tn`h*^p+J&mu`8GZ<4zD^pt$H7d*GibPG0K_e;s^8G%xA6?u z2d;+uVMDhUd^_YrhHfiJy%z9xxHlWRbs*ET+R&{5ska2Y8t(kgA9Ux-y%=nU`wT<3 zQ0@gF(>=k^%?2}&?y%vSG?3|b4Bb=}^v*xH0pTNt zE{9go|0Ehbp3f78?jXo|FktBRf;>-$4A*pkjHf~Fb#ku;X>So&1bdZ+?tHn=0N25t z<5NJlQ11Dn18#)>X%r^t4uQ0H9Avr&4c!5`9|hk5_albxArOC6J%;WQT%`kKe+Az#4>KZRjqM z{|u1lneP*zI|<}J>%hrl58P8zy{AnOCiR)K4}!3z*>KUfHM ziF-iW+XXhjUaO(IQ|?XRrEqUBbXSA_gj{3jR)ZHK{0xwGCV}Cg=<-2><#QU3g`hhKdige7(*ZKv zZt!M=;~+xNZI%0Wa1GpB3|$Unq&^2WvR$c@yb5HyQ*G#0$$yEVTMY7gJB>$O#?Qf* zEca6&p7}226neBf2;Kxc1BUKVa3SO)hHf87y&iEt$ojs|(Cq>%A$J0f^=E*1G^i>v zbPMHP0G7g?{RE(!FZVErTV7R~q01i&-U^vR*+G~6Evy$OLE1kKE`|S~p?eHuy*O&< zvM+*qhefQH;I)$n4c+~6?*Lg}_87YDAnVI+LzlA^(9U*{*Kv!X+YB;2?5CptYH$hs zYYg2bAk(wR(5(ciR}5Ya_Zfz6q1+3=tKdGt(9M=RAIcWP{WM;^K=%|#J10P<`?#Sy z2r}IRhVD_2dOcz{h=<}(D^Mu?7zzVqc z8@ilMg!)H7{2o)q{$p%OwL6`HLP`?9Y{oiBgw#&T@Wc}Y|=(d7$An!DE zn?Q!I0cm%Yp<6BYMIh}~8oKl4UIx-`v7tKyoDI3i&<%qQ%FlaG@2$MQaDtpSBR;<8g6;uu8p3sf)8XD} z=?0vS(%p*sP*7;?U$dn%ykbVHYuQ88RUh(6k?V}>r@8|i)+jKICu z&^;h`zE@M9eV?GaTkgBS3*g>r=x&hvYLNM;F?3hS9qYibFSlxup<5|;zIQVpWrl7s zcpl^#hHe4K^l?QP+QqpbT}SSxP@DyDA2M`Lg490_((a(4I{=;ox!=$|3{vkPNW0yJ z?g6=XffL}~Y3O#yy&a_8-G*)(h*zVkU50KGNV^SSKHTdJ-5L;&+EuFzUEHg^=X~6g z$Tf>VJPKD;8oCuA?G%GKaGzo57J}K3BZlrIka|cf`_iirC+R|m{p(d>L-#%yN0DW` zPrO_#7k`gP=>Hp$&(oAUM9#TN`A(6~ilm09g_VzH*_fC*CM77Z-{1#VI0}C1JRK;D$=fHY_9s#A-6EHsq0Ci8$Q9z%B3G)Rd!aZ<94C$u|DpT%U&Y^vzZUyN_8-ySm&MPC zpBA}n4*l;IxdIR6HRAQ+QgMMeSL9kh)Mx(@nJorHE)7I?`<(G($=?&75xJHE^|-PS z`H=WQ@ow=>af8?(E)^Gu<>E|nyvQYyXn#o0A?!b*Y@b`WL=$B$9!h>%e7|_N$lu}U zzd@`MYeYUM(tnZ2{vyi7BKwCZPZHTLM4A0UB>RELQ{r#MUy0ulzac&)J}GvI?C+tS z`^5K&?-aL)w~DpmD$zby>3gq?d2*jAULu|^ju*os`*RroU-aC>#knZ!Kr1%+;{WWxFe+{`yWPc6iX0b_JBXYq5`oC4YQk*7UD6*f1dZ+b#_A8MKo6()$ z|Bzf7jod4KSk%`88Lg7<5I2hP&x5n%K24k?P7vdt7ynJqfn21H@joka2|LPNBKun? zzgy&5d6eHKa@9S`b49M(M|pynEe1rc@<;z)h+J=x^4Gz4zzDMrw6gP{vid7=t=kb>@U7RA~ zoz`>zhn~CtEdEX$6!|{R@K1|h7C$CFB;F}*78}IX;&tLuai(~Qh`t9e9z4E#M6=}) z@K_+?u`j9re7K(%aNfNg%n3NT&EN#E2^<5~f%#w!cs5uKV!fK&CEz%)5*!a!fcRE5 zw;0R@i@?F!8R1uw_&;!>;<=jD7)Nd@atd`_%*N& z>;Y@Qe*vq(uYl}_K^f;(g6R9mtpJ|_i@`5}Mc@~~2-poGP0klU;fm_{IrA5LT;7Z41No8o#blp8OW8A zi@|R~j!4c2zX92iJcM`-K^_EY|0wuX$i0%g!OuhPlH3kH2Dw#oGq?|Oo#bk;3v#98 zV(=r7Ba-vMU627Uz9rx>$SkLe5I^cvL07}Tfk!QWv~eR zEf@heg9YGEzgC`dbf;J<^tU@h1K z{u|g0{s!C+z76Dk%nG__M5<8fpy?=um&6itHJ%? z67U+Z68t4t0saCk2Hye}fk(gy$m_EJM4wA;KFIur!JmT;SPl-OKGS^&8~{&%W#FLP z`$1mUN5K-XPwu_o&mi}JsC(Y^_I+?a^1HK8Y2AR$!;HSV!a2i+vGTvhFVXz3C3PwQc7l7>`&Z+Yw5M}Ar?_TgC z$T;_&UN?9YGRoMQ0(OBc#}1I~6KwE1F0Y-Vdn@GU!R_EAuo-*~Yyy7>)`91OH6Zn? z!5@H2z_Y*ard*uirt`V`MR-SL_m7#X7MD z91A^ONBEx4yM7ohB7a95M7{9riCto=SSMDB5z!F`5!eeac8RTGomeSGL`NJ%zHpe) zD|U&kVx3qiMnu317YJhU>0srOU@)8=3gu5I2!$erMWN7);<8|{a#1L>s%CXKxTGpG zSl1B1dO5oTLHutEghIOm?SVaDXP_&v59|&c4DaCa~eJP4B~%xFcdl%>I093`a=VuU~njODijE|r*)(S@qbTRDAbYGnbrmFPdkv-4fdoRO6!I1VA^p=r_zSg zPJ?afyVKj#gTc=9F8n`~-i!YO>4W%xI=wX`80^kCm=Ovc%IM8F4C!dbG5kNCaRUE` zGfv}wd*+@@$Xm)t80bWSxLClyxd=7~D5@|JVa#aUQaJvJYhkVWS^4VIX@j`#5+yyESK54)UAR zm9sAgC6zM>>3GhGoRg4F=d|V`jkz7Uo#27o?%adm;oQF5Be}ugsoY`w-<{W<2c5i* zyiV|7UQga3@Mzw#y#72`$ZO3lOWKRo{Qc+`%G zT@z6@6ZcO%03MlmbmFmz;b7nRBjYoJ`zIWj5DpGcJUuZpI52S#{zuO~c6R^S2z~bO z*{8v_b9SH8ehzYXPAe{`wu0RS?FHfBz&V5GWCjlv^ule|d2Q$IJ`Z*Fyw3Bw&cpR` z-TVn}5f(XBRGD>xF$K+1%z~t`92Vtpq@?re%pF9A! zlaq%gp8`8C?7DE@g}7!eJal0%IC$al3r~QjFKmtMiXf)Qfk-#l8#x^5iy$xO51t&S0U0>*iqOC9w_WCJO~~x>?=G14ipX+9xn_B+X{CVW(J1}PZi?qPCYyoB{6ky zD$eoL-l@=@+BfwGr2eS`kWNk=ntEy~(lYh<)Xd=SOWH3%yqE05|AUwGToMR&OzWD4 z_N%C)2xT{|b6P0WHErLt{nLWM!_)d89h=raZ2;1)qV^)3m7>m~{a{oBZ z+&k{YO_$sKl(DbJ&6yj&*T_xBGlb-iQO=0U>~F};#69~`qyJgTxXC?GX=Hv6l8YPQ zp=*r%CCV}B`2po@d}C5&{7+KG-EqlvMh+ux%GHvmO0JQ7C1r%KRQPrBuap1XlzH>L z!PwhF8S%Fm(fN|XFH!h^Rrn@_=l42{zgaT#PIe@Eq#8sMg1=MKP3Ml`F~C_ zpDVe2pEA;4r}S`9d4}Jw@MCapY2S|jm`oY^P13(Y{_Mx$b|Ynk?^gIbB=<=Eu=IPS z{{_l8UlE+(M#{|orAh4gvf^+2Ef!Iasr#jR0tfn<&sX8N0z z{=Jlu-ags?s`NKVpX2(dzg_x&l7FxK!&xT$QH8%ma=+w7l#w3Rb8cKjo$(FIe~0`X z)H`l_<$uDaNAi&57bOo%{)=RO49Sh(4KTf}N-xK4Fut(-`MU$~Ne)7n;p-IsT*xEbIQcrth=0j-CcQVw{~OZhxEF^1 zspR)l#yRO3 zNS+~ixnzzjqW>Dnt0gx{ZlR1a>{WT~l>ZL-?~#0$WR7pjMH>30e~|LoXb;zz^#6!5 z_9Au!VEY;696T>6{GTbKye?T~{7=jOe)&(BVDul6JVWy5BrlSDQ1WWYUz5!BDHz`o z$-5>0tK@x>UzdDH@|a~NJ;x{`eWk06{B!x|$^S2s&zGDt(Zu&A$x|sK{M!|Nru^s2 z|0>BhO1@e8ZPLG0{7_Hf1`}_{Z#RJoiiw} zKgquU=aS|3y5wTX8Ou$1ERj4>a-HN$B=3-1A^9Q6t0X@u`E8O9OI|Da=aO%i{8!3( zj`ONb?>Q!YAC&*OlJ`oUO&R*ruQ%zPFaO8of4%&d$-h?elakj<|C`dkNB+N*|8B{H zl0PE(capm#|3&f>lu@4Fk-cXrPe41V>*KjN`4`eZCjGxro`?@ArT@=3c_KQ@=)YM0 zGbL9`zM3-P|E28JN&buE9g;JvO?f>ed6MKODZ~ETYmEP4$~Y%Ol8?m6Ly~)LGWz4$ zDTw%|%iaviuvf3}i{(FC{x?g$Qu3YB-z5EZ`QI%6$0gq;`CF1VOa7VUZIVw(ez)YD z^Gten$o?ggcS*j2GSYv)^lRk*ko<3#f0z6}DE}_`e@6aK%m0x4pOpWP<^Kcu|3Us= zk$>j-CjLSBM<}EGo{|4N$wwrwpp5gwPI+!S6#nlD|B&=wl>U?Q59oe(Sn|1&e=hz1 zCH=q3|3dlau`?LuGedHbP-QK=L~&;~X_felKN| zNw~p;-%S~5=#~61W$ec#e}eJ_cz$m(`j1hb9F_ly_qM#4``2?&%NvL1jT?>r3dx5h z?~{B)@{r_Xl1n7p`{ypneexfN_bkT8L1WzVu;X#a-})fL%KHA)_dkvBvHla0{#g0% zapC`0od2b1BlY#&fp4F`BgNX|c#T-OGfuuP&iDlYx+iu2cZ!Ztd`jq`^%BLDb} zeuV7QVmkKv+KpRpU5S~#omx&ojKv`~t=+J66J`S5ifLmTH`QZJfqJuQkyE?;%C|18 zU3$ZU6}5%6v9os0v}-1%R4}vFVp?J>juN|sQfiZCvh39UF&4Luk}`kh>zm$Dd+QyT4_s=Ec1HZon>aD3w0O}@PbE7xAX>CW|=8fsTGZpEzo%HiTAt8S`ZjM9%? zc)~kzSkhyCgI%~F=9Jm>uCBtA&35v68CzJjVC72BR&;jr1g{uVwY3YcT8MgqB@nc# zgg4XsipE3`?pqa?aL- zL?lFh?c!AnqUIC4t(RRctkzVR#*NJ_J8Hb7z&D`QvMh|j>ai=)eg_{(vORI(>A z&hoOA%e*C+;+#?cZs77+>#?FkydAq7LcBW{K8RC>nQPb9Z`r)kTh|~yfabx~Y9hur zw&bG4W6B5D5msJ7B}FN1D|R+uT|D!@#5l}2|8u?n74fUqMHeMl z<5a~YuxjbbRkbS?U$uC};$;gLvx-}9ED5!E;i}~;Vtq&Rn?0Imnf3IlL}H|Ktbejt zk)_(&J2q{?f?2raZ!s%j)W+vf!9Uqn-NM^Wv8c<7IUwo2A9^p|swNA23-KOGhok(y~OGF{>OV zyIxAmOy^rBLeG%~-9OX{0Y`es!EKPgEAC6v7h6tn8ksNv^~+K|l|wT8_ZH9K?4 zZMmnokmihfA(fZd;K{OGUOK8T?siFT2Xp+IkRnCpqc(YSM=h$kxaTH`vpo5oX|7*% zDUvdGPJI0`=QX+%�$$uDQpTqM6;WuzKn2lG=n8Cf;7ms&k{7t{Al#Dn>mq75i@1DsjPQ~2hvwnt$zmnuFK?$DwM!7eXV0nyDy%SDXs&&c| z?vkUdgf@CPu=PmNrj_8~FK#X5l#6(+NnrtRB}pwOoVvty>ijgPxMWI3e?lw4Bid*M zjpv1=Nkc_T?w`(Tf@H*Rlt&uzYurd@zkEhIm!ycZB!%^8g^sh6!v5?O_GhQCKij<1 z&W%2XjErZte-)2(=ZW+Ro+r-hV)H6e?TY1b{cuuCQA*zVWf_+GE(k0>?1Q+&WoM~%Tp9-d5VfcRl zKjSm$6=g|TiozZG))m@|n&0vaDB^IRO@N1AC zxl)xX=g~J)KZG%rq=_}AqOZsCArh;QLZqrfXqMwMs1T`go}~R&h{T*LAE|Plq{%m? z@V33d+?@++mtwK?1?YROWnL31VtnFFjJRjSd&qEN0VzbP0*bz@`(-UtsR}67{ip=* zplNbYGrXn;6@kRtg=xQVU>+<>N^sd2FI*-% zK!fNh<1)CoWY+A8NOUVHn_WD&w4%JMBodiZTndk3&l7KYu?V&hVmh2+Hk z2s3lD|Enp+n*IIvn(D;-K8l}d9nO8~M2r$X5pa6+&8l%3`M*csyH+y{HY?-vY==8O zA@H`^+Lp%cEfRp*+Et5d?6*cyXJ?7*&>nt5cEZ+ZOU%}wyfQBYa@PHjkEWJ3Z_^F{$6MfnlSiNQ6#muac#Yq<#>BPwFNDEZ<-pD zGIN;J9+stTq<1QNds!i{S$oZANFP^x=N518j)>>%9Kbia+`c{Ca69bvnZu;%!(*i9 z8*gvQ3=@d+x^TOFj$zFIr1o?=64HnM&k@`Et{5Rwh_mPYRF0L^*LsRb--1;OqG9k1 z>TUWQ$Z3N;eA3|bptO@+PWmNvD}Qs}(s;|(czbQKXT$c(-Z1Q`zT`(^XZf3-@*7*4 z_%j>ik=I+h?A0ppU|fDjWEO^P`WiPdb>8_Mk>8=YCieYGL?z0C`E_pb=3C^jfn@2c z=Tf}M^4n2i3{@I9CuDCw?5PY=+GB>}^V=_b_A)8DQig>T`Q@h|UaJ* z9`kzw>03C`v?s-!kCq+HiRYvHEhZ4MX|~1oz%Vg=^|&<9Nh!7X{QgPyo{|58GuyLS z^+Lqww|BlV6bTsSqp9_phV|Zjn2IF|<<~pE8}KnryuCr!=-T>Re6=aRcG$B~M6LPt z58sQ>T4Mb>5ofPL_Buwlw|?W=TN~M+#;0#6&R!+##cgr*Z*4QyG_Pgd!{w3Cz6{G= zjoQ;CiS|aE;@Vnck5@6{MfyhE->OmHxY_HiOZQ>p>ith@&r4tP+WL5V!?LH_kh4VJ z&7a90D|52^PSQniqw>4qjP~j`Z$!FU@LhoS=}&FdqL{dy?JBQI+3Tw|^`#5v_adV> zBEK`?#uL$TKEN@z)nR5B_tZ^TJ@rc@=fMJshZf^+cvUb{-rL8GaA`Dm4BH#Ifg8$l;V;?GD_H zzVl!J$Mmy0)=oIk`qkFkiiQV66Q1}c;&}aC3m!kU{9F5bL$yDN)p44dhUxa#8=r$Lhnph`H+5g{PP9fB%;1jm~*nF{0{PjOjr+$rk!Z2s9S7)nUP5i&2Ud6Tv ze~!CGm|uG>CcF0I%OYM*yyi?94&oY(Z5LwGz;=o0z@D^iV!Ok(DS9r@CZWw~xvgn9 zHh#uIom6RvZ<}6!*Eb)39d`futn-4gQ~Bzc%AOUm?c#6m4o)9~b`bN6J$T}=z~h7G z*fi=|xi~gm(YEWGu>1PEp7Gk2#JmO)+B=(eroT7fl>IZNZD#&oLOfQd^(@GlBirQ+ z+#cv2TOPJujL)~z>O43lpEfwvKW-~H#ypAM@&B$eIS~px!FX-iPGKHHVV=JU|C7Em z*D02tEjyMY%kS6!Q-0nv%HSKgCRt{&*UFjd9oPRd4|KSjV9V#~CEkVyHz#1ca1`vK zcu}Bpi zycjmqAHY%g5dH;%KjHuB0qO@@@sHac11GSV!J?7j1<4uXM}~1f>HToY`XZu^WR1@s z`*%o;Ap0J;9LJtD5n|BE+KA(VFf=YhhCGeep}H1A*we^f2!$@};jgxN`F09D-~5+2e9J2!s)(pBu>e zK8{()>E~zXyntgCVfv)(?2|a=;uz`Kh$NKF^>IBh#}iN6P`RF%2}RFHo+q9Kkqf1# z=X)Z@bo5gkN6|^=+z(lM;aHiL8I!^YT(}%^T3#S$xjjBBkn?sNzl-i?2Xbz=?&k!u zcj1^xN*m+Hav#MkFP2=c+_4BMp`5(gKxR0-6)ySj!@s-@aL5RZJBz``KZ1Yh&V-M` zEiFCwNl4$O_Z4~H1cHGyPW5>Lhv~gI2>%pEf!r5xI1_v3g?SOW2F_xBJyW?(`fqWZ z^=Z0~xjldEX&fL)0VnHYo>Oj2o;h5Hc^-q)6ZGa5EiqNz*1jS{$1Sk&@=$Co#Osk0 zt@59QG|`)aw}hwRTiBi8uV6PY*O;?r4*BNp8(|JpQpT8D0BPc3Tu*_y&*J)OV4z?c z0t8%R&YIyYbKC+O2S%7<1&gNc*EIKUH0S<1%w;f8a0<;WH0G=sUM<`L8{drA!RRHo z9PUwbJcAQgh8esIBj@&e=3JUvYRp+Pt#C8u-Z{eDpGKIQ2Ca##`GKXZ`){S_73ESE z<%ek_xDNjV%Z+tw)z0t{*w{b9x>pi@`*0TgCbl!N%YTZ#GH+S*;7*#m-k7syI-tlc zuyGpnqIu`S4AHzFq}JKqBJno|0yYdM@#PlSSU)1{izC8vsq~4@Fex{)(J5x2Am=#= zYzQ!I0c&O#eXs>Ka<-aiQdUy(bG8lAIe($KO$_a%{}TTT0#_r>NZ{H`ydZd2Cu@G@ zX$YLTCU|i;kjbf1jF273%!9zIFnDo(Ap2YhrBDl88@w13@#XQ7OixSa8dn8@GI-|0 z@FgIxZO<^L5jH|N;GA0vDX__utIfm&1m+glc-}v}#15d&1Rg>hS0g*g^}z2f`yITDX9-7X@qz3T;X@kHNJtnYj+6!_6FV;V$O_ zF8>~|ip73_%lrV>&@K2~s=ddYHLJy$s<{O=HbFaj);J?j^sGGy$(*(KdS~t2A)0!x zDKl&0pf$DGl-YYfoC_ton#=gTyo_I@lF6afKkSF&G(IL@5&vi*j+8^Ic+?NT`N&Ox zTc{R%6N)%+pUI)ss-O?Hz{a;iJDS4}z&)D71CUG(A22!eroeu{rBJ`>IR_tsLD5Ieg0Gu$88sGC8y+SR*`BI-yUM;!!#fVMnK_qgG+QuXsB=O_mn=N4IzZ zyewHo`@$$fLk#O`LGC&EV_%U|_UlOP)o2lN&xJ-X z`(`M7mEw66oh(klAI{Fo&*{U##qh{JdrHo6dwk9m|9LihtQR1iYpQ1bjG@N9HRf6A z7+m0C!P>vGhUqH&kR=&(s) z5sWLDlJhrvJbOycKX7~}nw)W^Q*tIC)LtIXnUZsTv z@-Eqg6pwo|MJIhH3}$7*TKKH&nDp4^&$BScP&yw}(;uZ`6BWmgjZw6bkI$KsvlhOz zJwA7wpYZW{Q=D`z@-k%^s$WrHQ?`8o2y8+M0@?NvfMPh1Z65+CW(TtKkX-ME2vH9L zi`XJVEC^)#FM1I1mXN*_UQ^zTcp`|$J`X6KS+K+>0>zULt@~vOh9|{{c*00$oar4j zx7ADbd!xyI@5p3Bj7>Jg*knVDO*X{XWJ6@KIeEd9`@MJ`h{p54$ao;e#se`n9*D8= zK#YwCBI9XdJdb!ZTw$LXAapk(uLZRbl2 z5=@u?*(Nl-j6+T<-g{5njd#$a@jvSZd&Tku2potwA3W9zJ|Hs7%c-^pP1iJ&leX`yuufs zzMJy59pB+!Jcs9;@PXh4FZ>rhhZmw6PkIh7IaC~t7_)yj> z8KFI%;~$)_g>r&30-=^*aUf${Mpk%R`1995Jj1SE9~J3->Kdn!rR-RB~Kr=1GCas zskVm)eW!#J+E7)#N)%6wmCg+1KqJJs96J-$;y3J=Nan6FZ850~g7N>YY4)Sw?K zA%#}usIRiZ9&(iqZULv>9v1md2`RMQtWCa3wLKj0of68>hT=oDi7O$6R;9sLSz!jYY_=>{~HOwAX`k@-^VXN=7 z(x^xOTSLRXp_TSS%jibX?skVpNxSg0#2`9sb+UJK#$f{M@6N4xAg&ErP>}ApqGdnDzrI> z{MwolpXX7-YoV8wPMZ}+XFRB7>55+bsF$X&ilf)%UM z>8o6454(M*8hd!qcS<;!)~m-?Nr=m;9P(8XQfxb;**(QA$^FsxKo_8!<_szme3gWV zZ0B>Ouab~lt1{nLxy~L|`%X3XaFy?rP&C%7##c#*%c`vQRT5Hcd$IY8LW+FbuIrvN zs~q%I5+drC7d{zE6_HgL@Kvs}heN(ojXgZ&J0&#X)@#^TNhlhta@to(NU`nl=EAAm zlGGa8&0TY5l~uk8o6458HjG8hdEFzLVUPtXGF0Dj_bb(&?)t zq}XLQdvR&is)k|>>Y^S(4_9^*kvMOc1m4t|FPkE)Ul8__z z0W?Ocs&2S8g1Jz(;>{{jKC?JdgfHbc-Fj(xaq-OJnRCjgM~c?1-P+g?fw!kyI&;p} zZJVY$Z>+0fR{WdZMrT&@mi5~((cKvgn5iOShl@qblvwMxu66iMTkCz&Zw?{jUD;XR zkR;SrytA%x7IJ)t|5oj6X{_Ij88927Z@|vRk+0JZCY4;*xMle*b~?wc&W6pKZjIc5 zDLHT5gaX04H0)i^**b5<9DiPqLRI6YTU(lBYDFVn%Qvm!AdC8@wOdBGO0iaD;nZ$v z+}gNhTVsP`%*MUjJ8QSxiuoteH3Oq-F;WUsUtYO+^9JY2<;$y_7Wg){I9nSxpb$21 zF-77_n2W@z^-{-JTD*ZmwakOpYv9ykWQk`I(-gwnGmb28b^MHaiC5Rbi2en?6c=pu ziq|CCf$7a#8kb>?QSYpH#zyoasIviCwLKLJyf^!;PCa^PSgKzC1E~28jX1&vD@Kx& zy>?TBDRw(~*oX?``+6M>sZ>@qZP|QhD$nZ8TU%23EnK@{!(}$xsgxFNPUV9s2JghA zrmHruXk5F&l%3{e8Ig%(^W}Kcs>Es)VYWMT-?gl7+&Vo{>*sq7hHvotsjanlE7FvgKb?=B(uuhm$vT@7W4Yjv6Zo;&e z^-wJ*CG)cub}z^e5|Bk*+pqY*6H?3tf?=JZ4JKWaQ_&91GTQ+DRqk_8J80Zq}ogcJ0U82$jv3@Xx8MInT$uwjl2~N%~mJImxAVE-Wt<{ZDlWKj8(sF zv#lMxZ6_#IW3N`2S?{&qx1c%R*x)cu$G>PV!=cjZyO{>eS?iGv{zC6QvuvetfSzf^ z5Y+ESb-eMHTN>A53Rve3+-{a~$nvt4(SB8@9@Pvp&DOueG@=U{8gTt@#keZpW95#G z>o#xToiu6}v3bp+vo^LvmZ{=R8S~@Dbkj0htf0|$k}hZzowZl8X`z(loI8oF9yDX_ z-f<-w+x|Jx_Rnc)YBbTzOlZg!qRp{QAgTX* zQKs?9(MVkLX!_s%->c%t4u)lW)tfSBCA2m94m`Qw0S3>S4rULHo>}u~aG7_BP(QXZ zMO|^b+qNFR<6MTU+QNzYvJ|}2ep%9b)X>0-k(Zf$c!(a_c3*SYv^~D)a%fgSF}C4a zRe8mX6*CsiSmrtEX7}IIgz;J)b<>YbR_FgUeVcE~B`X&!VUbM0&a%L#JKjdOfUZdX z6vS(jorPiS>?EQdzJ}u(?ao=)@$HR+Wrw(2nAa9yNgl2P&o$z`aqbs`)3DF~$hB9j z{^a9d`110PJo&<`Up+hTeH}YrKmU7gyJ}JYw$P+c?3{4@lf&Qs$g|<6$9%T`H-DY- z%FVCd_t>n$C+a_RQOUu%W4F!u*(V=4eDt3izH;Bn>*p@J^4Cv)@bDjh@z`g7`|h^u zF5W(P;~yUR`0u`a&w{hBIQpG+*I%(^a3JHu-+1P2Z@%{aDL-2G^z*~(p80tHJFXA) zPQGCN^qTMg@V2}!Eq~~$317VBVBPzlXng48vv)nWw;LJn#m-+KPhn3(<|kk;#9oGd z5%yKs8?d)v--Ue-_I=n7Vn2-i8201XPhsb%k_p%gv6o?AgnbqE2J9`^cVXXyeINFN z*bierhW$A9Q`q?(A%AkJz`g|goj3tVmSg89XvK-4JQW{0apQ-tJXe!-vR;Dz3pim< z;pTL&bh_ZrFg)Mfc0)H-ejoHHPvgnP#%^fJUqyPj?Unqn5gl)A3XW}>ykQEESF1ty zMwdYTGSbHF1ImMy(_lB&KKs!r-=_H1D?R*Tl^Z|urvC%_oyi;B2HB>^8+rpdtoXb! zATj!%SNKH=|18cE?VYdqyn#iKZT#Nn=a5&i;$!nZ^#+F}d*5qAUZ@8EZ}b9Wn_h1? z3uGIg_rX5oEh^tGNHe`N;&CUA~ zAGG#gR(#gKOXY3z&ruybb-%|y4jK3&>@$t`z~1$$L*JGSTL%33nrX0Uw(Sav*85s5 zS-Zlo*S4j<_F7NR4<=SXZ#DKGA}+?wbIbB$o|$gOW7E46?z}G-Vdpt#x_PcxKUoH> zhpbyn3(I^oTQ;3cJGc0BGL2S;?c7xCY%94TI^;P6Ove{ereK&~MD4YcEPmR82gFleEq0xj45EmLT)n$v^z{pDiqtKZ36|f8?&ASp&Jnt!-mZ7yZ3|@W|ZX zF8=$L%YS?Oj?a`o_4I4=)9!yb=jETj;5PrcJY09r6&=&N);#~`*6Sz!HREg9?Gryf zH2thuv$x;mysatkk{us-e9zN6=e+jFZ=WccenH#V`Var+ikA^b*JIDU`mKvjW&IAv zUWD!=8l~+|;V!s#rBiIjM$Jlu1U$OrN`!M#g zDA>u^ORz7(&QEiZ1c%@0jyK;#vTD$Y-?7VyA63$cU)jp(yAbKL4ZEB;7LraJ9$5%t z#(`vX;;=F$g5R&x zi665oAiq?n6F*y*6GslviNgrw#32ZD;*bS7aqIw{IFLY2JQsBOZ8Tl{f}c+OoL^dH zN>>GJDqS22N-d57RqB5Pkxot6<-}h~>BONFvc*BLbP7jfQJ&w%_cUjZWsKqn4hm3fX!rV|G^C?G$ErxU-7S3r)5rBhcl z#y>!$6UQPe5vSzDAKPpKTzx@`3&%)Re?Az}* zQpImS-bfX{{cC`8Ll}1?uVT&km+a#X?GX67~xtCUEa^=UI#KAs}0>6xmSTq#}Y$#KDY>S zg`ryvE`&V8(2amh$0Wlw+2DTIcR;3t-^(z*K@c->RPkK~bo=Dq3o;#t4BZ~NbCfO9 zvER_`1TTl&Vd(PN8&l&|@!bh@TS2CS4dCC0x})F;A3Dn$aL%jOA)Ti z&~1}@E68;0G<3JieFMmJG#R>lx0?;Q#?Y+>OCVPnx|JZ)G2d{_43O!FfJ}!2G99PT zK3|G(Lx%1kI0N#4p?eghUN87&xF0ffyTQ-G{eb+tz&F94pDBWFi`+MW%ukb{+aUKE zkoj3<=q>?^AoG0zbmxQ9AXgZ=GeG92$Z$;1r|c@kfD1JtcKie=7=72i)lHydO+(m{wi zL6Ca=Ak)Di06Z`INV zGjtDwxK~&88oE6o?RJAq#{olk7x-yh@2!Sw>Ljn0Tmv#3u62(~K*qDk(5(c=LY{Bv zmVvN+X(7n#I%4P+fUr@;=L^u?gFwh~#%{4*e7ks=$ibS_`y-5z|1LfwepPH2+r%2N zTFenS69Mh~a*W}N;^)QBitEL-;$-n`aVTuU^Erg}zA65T_UojSG-+ZFYd#AgZjKrk=KjY zisy>s#P6pWy>E$Z_Zg1uK6!ySQT!p=C%S(}yj#>d>=|qa>Cg6$d;;}`L|yfWXBm%k z#C(zMB=sItz2W=`lsAc-c7gIWA}3^^TqJTH2g>Opr-Y#VlE}V2%HI?@_U&gXG*qR5#^D8Hh5sy^+E=Ouqvyr@l5Y_?H4FV0ik!5C zGM|sh0x?HS7yqt$&iN0h_oB#tU&`u>&p05NQx(vibJCETM9ykM`5KXv;ZWxDEy?Fw zGF{}H8kAoVUlxBUa`qki9}?|#_K0N8^F#k_B4+`jyi(*mLX?X|jtiljBXVLQ$}j6W zdr5pzNk#zy^=Yv82z`4&0?dtMqDAjRh%WVZ=>I$XBRMA=*(dgj zUluuo9R4yM5X7OSX&5V~0z~d5d9ext20G|Mh!AHR&a32@}mxH|T(4XPE zK)~q`G1qx6+?-7y+?)+yJ9rz|1|n^_tzZ+l9oz;sgSUcka~i=qa0^%iB2T&1;LYF? za1B@q;#tj0=i9+z$ZrFSz?;Abh_JZ@;EiBDcmo&)uLl7R^7X=_EWPlLfDGRWM!-*i z48Ip-_>X}M|0xh~J`S?}?gshZfOC<{_XXyk?+Z95xqMH!7u*hh2yB+j_k#~Yu9I8? zegJZ{aJs`?9w_EP}!Mh=MftP?Ca&HIU4Y>|%25Z1NumVI~%Pj^s zgGC_EUj&>27Jv<4KFInK1}B3KxDgyiIkWx@f%qLR_XPM3a1dmD>IZR-a*u+yfPEnA zS1*X)1af=i-VHWE-Vfqg+^e6|?|{sD*AC*Odi9g;t&mv{w}UxgGstwphF6d3z%h_( z<6y~kAhc$-QW(8>01DHft6q@h%|WVcnipM zTm~|}JHaI&o&~+@0q-DQy=?)Rj#*$nI1>cCdP&|#y)<3-;$XoTa6&;S6e%nU2Ip6XLW`DEg@dc>!ok+Su0SBz8|Vv!LI(offrEh{q{EQ<0!IQz z!T!KNU=TbR7z&&MTZ6lTZNWhBSa2X13iSpL2m69SNd1rof`h^1;K|@n@D$h@+7)UG zg+hBm9ih%pAb27)1nF3)KQs^uLOKa)D0C_`47R52N^47lZdylLC%8ZDKw5WNAb2`$ zS9&OPBJE__P+AaDE2LfNZRxwgJ?S0ko#6iT1L@u1q4eJL!|8$Go{Y{6Sj^a!(UuW} z)B&k8qbp+{cp#%Y;~;oAqc7tK*q_eH847h|c4l^E1|fArI+)p$c?dk5 z*_U|)?9Uv?90X5h4rQLo3#G<+=F4-STphfjc~ z!o%Uy(CQv@a12s9rgzL?aB$4=F(<&`F{j70W`%=C#~g!nEUQ0jAPc$9I+-;D*Zo-s zvND4`S%>ida8@6DI>&a6-8U9?#`caqJT@~pFm@3ChsK_Q+llOx*+bc((CO^foLxEL z;Gyi^?9AYi?4$VKpFIGduAF^2`*T8}w%pyh?YXd)+m*Wy?dw3!U`}T6WX=%&59geQ zMsM!n+&*aR&pVLUorn1Hdh-tFg@dPaTk|r5yYt%dzay^`J_C7!c_+ZW{3H2C^C9OC z<{!@w2Rrk-@-u@6^1JcBC;t$9TF31g*ESC69Cvcu5O{iA>shH=k{>I;u`Rrq79okPB*Q#A_?DLdy?c4Rj4pL6XHymhWxqXdt zMpW*loas1sL_BZrr)J&^r_3<&5&EM+wCi2{E9IEno1e| z!*h+jD=8y{O3C4F^`gtgO#@8!A9 zNb)ku&~HV$xv{^T`hD{Mfb@$cKPLSNh=0cGTN#XfB2<S#O_UM;1laN7 zmu!Fk{itNVPjc&(+#&fj%1GZ39)7q@MBQb4&9Yxg8TR=e%k3J;_V-=B$J76){O^}s z0lVD#D8qilH8Q{Jqy6o&?>#Iay!}0wzdO>N{r#5x5tQxkwQrZ)FZ&NuhW%>U{{m&$ zZiDpp5-tg@3c;y^^n#+$H%Y$zPD%Ecxq_ z+aw>A+$H(nB=<;8Q~P&R@;Q=ENPd%K@1ZmgUpgthVdNz@Mn0c1%4b;q7stsd$L|GE4(Q$~I(=b7|9BK-%Y|3%3kll(o(_@TkBXZJ#!+)o+x z)wXAY3cpX`hov7?d@-E~AX{cwF(Vpp5c3 zq5R$^|AX?sNAfo$e@yasC4WisQOVzz{G#NSD5LyZbv<2#W9Da_(l<}?M#(EA-zoVW zlHVhFm*fvh{GWG)H@1K%eCC^0Ob0;{?pxTde$`er@k}r>wZ=ifO zu5bC@O!*vK50Y=8T!8lUN>g7pQ9c*`lDAPl5BIx;#{VwL=c7Hp+Q{Dp@?zSf-$<_0 z^?VWT>uApXZ3l!{`7?3yU*hDlIN4huz_*5PB;xF6#_98SIQ;qB#W;$Um&M5qarW+t zlRprr|FJl^J5JsbCr^n>4^G{P^e}C)>2tKs=+;|THew7QmoLTeN({QIuia?e9J5gJ zQY?>LTgau6?Qq!wtV88}>9yKE(9%&f<(360*MS#O9TV!_0UTbFx- zU%f%OwY8oH(}MA^wU~zjGbCWh<_K4R9I3aMvspjgOXP@g!X{Z*PFicHr_zWCZ!?Jq zy~1eR*xa(Cwtg+9dsKnMC`X6+Fxo_aGc4E}y=X^VCMsRId3&PABcCsQ)oFu?EldLRfk6Hm|&rK|a z*l7hK(P;%Zb;f^Xx)V(c5Hr018jR5jvaEbm-%(FO+3ZonmX7LM#+-84dcy21oD=51 zHa*LKdVUrpX+FT-q|2^~Rq{!;rQO{X>0ad#eOR|Qp?ZBNN2y@ z8|mzy;E~QLQc#jAPXA6b(o9JTJF`mZ)IDP+?73ZEJm8B_)sWkC4c9%zuXT6aTDzW;tzoOJU3BAu6<1kr$J)6^ zomm|J#jO|i^wSZ|`k;zG9}g`1CE-?}x=Q z@~Fyj2mGkC9}7W z6$=}`x8s(E-yOUS9gyhW=9V;lY^%A&r|%2;z0;mw{%#SsCAFv1kzlVRu8u#5e)za8 z&Ysup=S}-cJ*02Jss+&y_V>tYId#AuPfMevvEv>~QO)eyDNMaHSZPCUSo#@~gMyk<4jTL_e z#2Hj{QpIU(tAomnRB2_j)s&*fDLU9=SygH|pilm1?j~d+M7~ zS;R5rOEj@`>Gd`Dh^X)@Mrl~z<0v1y9^K_vKA0?a`ZuNhhNOHlY^+M8_LfPqQXu71 z#*0~DZ+%Y*KP)9F7f&foI&Z_TrMbO>3B3JbI+1c^bTv}nVbs^dT7|p%gZmSKU+Vpj zdZ%=6(qJ`Uox|Wx}sU zZYn|&eEF&Jwbs^o`7INEGlapObL7X)^{a1#@H-*=4v)&Ou4NO-)lt2N^V_?4TZmb7_--d^R5iJs((tHMSunB-<(+bWFp8 z{7P}iEf;6!?#`_I=e@7oYwvw!skQUfrPdQKhC}-X!`90fN8J&-;$>Xta&GOkK_hG@ zxbHd>w)W{b#(&~I`fI<=hdb{m9v%!A?t270U%7Yj-ZLv7?HdSJKb4-J;nVqW%^eNH zZl2`#;yIMXn};cb)zC1^Jl}&0N;kH?8x&A;TDg1iZ#(@E`Yg%G_7;K)$6u?Q*qh#l zv+&IbXuzSu!_?~AL~1(1GTM1InW@!#PG%?0p2Ly#KKy0>7=KpeF#bM{gPS5+S)amL z&Jq0CxxeK9n{3Zj3bE9Np9^3@fSwr4vL!hxa2;DYG1>^tqe^cupiv+Dl|&S`cHWM z58KL+7M#7GDn9%6`NUFN-C;a97h8A|wyC>=d%G23gSg^}kza66x;lDX99b0kBKC|s zlUo=naBZ(vCT-}mg@Wg_lJ=wgzGx3JCiNs9ui`MT)*X;EhVsgW{izX_D)ayg-(>c=r*+>1vVkj zhM`T?sf}pq%AI35@J#e;2i%*Loe0{BcwLU~D&g0~AvJLnB+C}$m>26rM=Vfhul>)M znWdFk*pF2vX$|^uHMaCPSHS~wG|I8ew53Ozc=RC6bKdv(ezxFHNhCgHVZ~ElKmDFl z3x_|m`c*9_1OKe3z2I6S=dfS2{bUw-24Gl6_hV7oIfrXR#XXWD}4>AXBxe-p>Fm$~(l zpWF5z8z4+oHv7+L|w;YKjx``HFkL3IGIV1w5UXmmhD3@co5Fx|mrB3NjSC7Ll z+&lwhJUfp|l?Z>wam==0uR>#N05}i!6b=G0#S%ZDF~;$OPnbCS2^iyJrws9S0Wq}` z@75UW0+Qc$jj^>tR|y>lGF=4_-ySJ;9GEZ10^XqFGc?Ag0-0}-#@O$HsAtx11ivcy zML~)gG90`VvfiZ63Z51m68u*|zW6d8KRSpH34ToQ!-5@xO@g(8w+OBfyk77s!Rdk# zL4eAq5{Nkfr4Kn5SOR(uknKQ>0>=Yc4~8>+DG;Fa1Bv)%Q+j8ZyH)YfRw^C_l8RRd zWW6r~4g%4(N)HZVl}i8ZQeYqaF9G%f(SJ%WZyc}-G|E1<6UgwbKwOVXA8s130W|Zi z0pb&1>E%U%RiLR)$bMr!09DQkAlo-82vBq=R5Udlo>4qA99~objj*bj!nrJ`Ogp35hK?fq=y<=P{*9TBJw+Nf z1v8)e0%_b-3_VOb8}}!qq5BgKHm;eE-`dL^baVn%JhR0e?a21-gHls#sy>MAD<(Q!7_j{(oru}$>&S@air0KWLqze^hB zrJV)3LDIM&%>3D}JoGClO={$bD<0*-swL;pVy&7!&E^W06R%Kn~{Jh10gdX|2#bjv0v zd0S635kkfCuUjbBKayT}odLn&m3ng=nH^0R%5}4IVso|aHOi5C%9HjTB8#JbVsd5; z+%HT7`n=qoPm~eZI*Xrvd_~I9%UAWtdc7*?EC}mHHL?tzBq}af$I*02fv{9D0v+fq z-=+rYHBJapNmWuq1H7?*%lw=wx)$7Zh_k?(?B}2g_~xr6VW2zd4fU7OP`&{x>*C+>+b)T!GC9=*>9b>oA=Nt4mi9sSVeMARUV$dDtQYw zdToa0ZH@=i)1B)&Gwr(3k)JxfSiMj2jk;3>$e&pk4q9h6eE8g;J1F<ooeklKPD-wQ9ex4p%(SaTSE9k1hG#EbWSVnd_vII~&ionS zr@2_xD&c2npfA6mb!Nlwk5XU5uV9q&1+6phmN7&-J9Ke8yXlI+Z<#*zEnm<&GxZDU zY9-YRc$RydFTbF5=FiHYFg(`aS?_Tkerm=jaGkkN_*Ds$b>PRUm*d62?{adl8~Uv? zQ=g8GuV8e2!fz}1Nx@8z3U{q*`mQraWPE%?#m1b2r@kqbMI7OW2{Zq7=3e1fDg3JN zZp8X_p?rKr!{y^wzQA>LuA|eLw(1dnN5M~qq#wV)b!)SZF2ly^1wU^cb&mSq-5-AI z)@P-BhTnehb2~3@SAY1gGfQn22$TMEdB{nx>{E>G7ZjWsOocO2~(RUxT=?)v(z zTMx?hYWkxa>yqr><1=@0GAsfM*isj+{1JigO-(RPlSs^T>kF=wI{? z3GaOPM`|5?^1eqN;5vG;T>o8b>AKvV51X}hFYRqB$`cHQZS;+`5BLA>dFU5nRPYM) z&orE$2uD;KJcoGo@2U7mYWqyucLHtXu0Q+bS`17*7}3jc$#wk>P_A|T-6SX34-#-F z*CZ(G`Y$2i47^l$m~T6i!QGw?uZ#)E#Gb@Ft|vKFk(?;{FiEAsJc)a290zG-egc14 zHtl&uv8JB=Q;=9Iw^@xpA@(52xXecrlr{ocyLek0^WNfUsN4}2}7ED&$ zb6>&vPjF<05IgS&IJ0xd$ z5vIsB;vIQLf&u0#{}yPsXvRNDb9&`s^L8><>xniDJ6%xV=cSFAP5-j<9|KC5(Ad;OiW zH@COVZfve=+FYNQt%Ud9m~7YF4NdknSjs#7T(ONGD6SUt+WnQnHm?lb}6D6&IOq3l?l-1^x zml>T++mxx!r0NoHw1zo7>Uh@D;Y3L*v3acF#;KgoxHQkMUBOYz^XXtRia9;wc-5Ozb9?j|mxj>+C)Fx* zdd%@!XHE^n5g6@vQmrXcu30)=As?<(7jeL@C8I}14C#thjlIm@WDnedP zbQaa?$HJ_qOw*0EcP30sR75{81KMh2NiS1ytM+=fO>LaYHzU-_GLl&=-_kW5ZH>(v zt-1!NOt1yt5T|6~Ml56P=8hI4Nj8#n*=Q|i`bNeLn+B7zs4<)RrnT3X>-sPJ%Tzl8 zwgou&fHyjdNtLDy0liph8NO5sPZ(YVql22RmlY0ct(jCK!#RR%dxC%Yto#v z!hC}|CymbmbHmAK?xzwfyG#`?zX^Tr>! z^!p#(Hf`I}XFv6=y+^+|=@Z)yA>9!iPvba+gOB=r6k;llnK%~Vh~u~oM-z^1IEqmy zfR*4MocdSf?XvHUIBCH${*gLEX^JkgKmwEf~ zL$ox0>^GAq`;Uit@nm1SW18bgP+&{wNLsCARMPu=*0;F zSt;d&4ZZkTFJ7Fvp%!TmF!bWQjPT+N4!z3oC$qn7WqNV$NfPn{pI)37kc6Bz zqSqN5lH;Iwah6JWv3D4Y^IsARlyOZsK>(XH#nGRx2Zvv{dGD=9IJl>!H?Oa}$HSov zsctKa1Q!%;UR;C1&C6y``I+O5kY_xJe6Us>AJiD*>nHsW191j8}M-hkP}IO`3Jtp%(t(+AKbxG1d=cxejWK zaon?9y+AB=#d&W5#&!W&u5OL71|a#Z1&)D#mBv_H{L6v)@GsLCD-nO*7jQi*`B7jj z3YzUWRbz}3UZ|3@Kgy?t{+J-weHng>;B>)@1Swy~@Sh5bJatx^&_VL2`z8EuFqoPC z0YUFRFgJ-m_x@%)+T$j2KXBst?gR5nDYvQjV?vvKV0wk-6eRh-TaXi)q;D1Elql(| z1!oJ+5LEN92NjCCas{5BxRH8BdLJT0y<70&d_K?Bsj z7NlYST?UK-F9j9>Q6|NA8jyStrubsXP9gbqqOf=+AKMC? z59Iyk3Sb2gYs_lj5nPjM-x1s|)P5t#TkSV87g&IJxL>G!Ij#l{BcD>>X&~BY>>vIA4|o(b`5gvM0uBJ@0Q-UDcK}!j>=XZ9Ao=wG#{;{8CBQBq>)i=NWt1HAOkgYM zD6j%J3y89+`V;|kKoq0pdx66Zak-PpWhPpB`nA6r}W zhYo?_HWx=g4TVnOe>ij&|6So7*wo@+_z?aNg&)V376-%q_&*dLz=jr&hYyF300+Y- z!&C#dE<+{Ua?3MG<61WJEptdCqLEkP^Mi8KM&9Txq%*Ncj~dD7W70S`^bMr((q!ay zsz{?zjl9jU2p?92)@g1T2gjRCU2tOb+pU33a zBn+=2jqrX6uM~Pf=!C@2KpMJj5`I|1KOyu{q5CC1uLruLLT?rNq|jYL50gfHEJ=R> z+Lq-xF7(wx4+_oa0_D7o{LgyQcwien`g=*c+K0~<$~_x-96op4^k+!B+HbFfQ&yX9 zK@ECGMfC zB|hzO(`_M*3p~OL6z)C`{UB+ykC9jTq=z05x5mf0&3(*DoNueXyievNaID;$aDN1 z%0RhvGaj!ajk27P^3(}EEcA4t&G^_a>5t0w{9e+yHhSdx_#S9E#hDIs(`P*4&w6Oa zb;oBh+;pm3dn#q5+?DC5q@8OsCpgQQxzaMZJ~7l(Xke(C_N3Hq%1onk zDy>dXTI%Q%qy{_Y+fu#L1^bmHJrtax^QEQpOa(x;4}Vw z^(hRWcDxVMJ&tbxy7CL1NjnMA{*L}bfZe{o#(O8-g;Kt&@s8wi{`>;;DL#YuK)MnQ z7WeC+t3>%E3txUg`V>zHKg|VufC@iD1AY0acLoG{?N%9noWG$n{HjJNUsHhHzD5oP zxT~dd=6!e__~A$ATRtq^sX%Y}dS$$AmsC~q{;DGDKVN=9`V=$x&E#^&@XqUT9)4<- zI?yhj;ipRvePR#46lTasUaJE26?&w6l~Slmyn}N{7Gu(eLmRL0awX~rZuxjW{ft53 zC(USe3%^$IlP>b`tJABflE2sP+>r3QNy2-;&+XFdTerc@5dE8Cx35C3uc$CN4SpQr zTTwnQFGg|K*H8bUM)=`VM7aWdv$&m?r{Nc*udr449S|nP;K%;xLizAXljek9p#Dv< zT(4Di@H7n z?ErRr_*Hny2iBhPH?lrOkMLV3jZ~S=FQv+(=~J8*ev5=(?>X`d(x;dy-=i~x-_z&F zFG!!FO89X;Tsbqag#>u&JF-4Sm9%!$q{nlY{cB-?!|!=C3qed0K{(r-nQ?Bj26P26 z3R?-dU^)KGn4X7o9*m1QT6Nz7oR{;H+sBx6^d|;IPa??fA2Qo@!qIW?vk7SYw5~%m z!zxSV@795^c20s$z_ZZNAm19>I!GM}LkH!9TSp;zT1cyTSG*i@&UOB1`|dhR+b~Sc ze`1<`0foNVrsxgTRZ0DV`{2iw6YWBuCwT#v)wMG(N%p3{pIX}Y5Khj$pu6aQ*kfM7Ig6EbQT~{TK-M5@YJLvak+SKZkHUp>xcsKbF^ZfCQl%QJNG?Vxa-1TU zfLx0st3Z(h$btpR8c)*7djNFg-|$zFne8eem(Wk*$Q);n;cAmQpJ0#qTb#c{|H<~4 zJ;r~Eo%2sPXOS{vG-p3w~@8p-r}y!eD233fahGe}VOefh)?$jq`7aulh2j}U&2*W_VRDqjov z=NsYtG3jFXn5JAlQ5OYmm=wb=(314yIkh*zwkcIVaT=n|#=WeN(em=%g40Px+<&rL z+&@tM-dt;7n&Nh$RYOWG`2XbZeZ>A>qx}6Fqa5JYNvM`5H6~d7KDPaJ0Q_PGs{`DK zm%WzyHIRL+?bzH#Ede|wR;)?x3aEYf;-xhRsy9Qvv%INQ>aQHoAp>{2Amp-p<#bQdi+5bQqZ)8SsX8O48Mp({`3Q9D z0LzNX2^0-XcAZJDUODYcdYSBol3pe|skHH84vTF4gHTh&WiTAHjSD_6#?4umE;yz=Y#riUbZ3%0{lMPn8n>N~KS zV(jWtwy&ED=P$)@@@-FatdTM-gbY6R zT-kcJmE0*+i{ZDyZ0SlZbC39%(?YAQwvjUYP}!>OKw9KqMXJ zw4!yj&C!lf`kyZkq8} zD<=WNS=~yC5r@a?ar{P-8%!XZ2ts)L|H<7or%dG6{Yz!!Uhy`gzC~nuMAg;EJ+t1e z@6GqdXfwW&ECPHD2AIR9qkb%~5^Xig(gc9$}`r>~eWn`Kq< zyPsY=lk&WGe_-#f@qd5+Hp=c&w)gbxr^gN+x%$_=pa1^Ll>6lu*MH)m7WE_?#W=3P zu>waejt(4ujpGwIzKCN0$B%GOE{>lI_^B@snQk}%l3xFaL%jHsPcOdSiy|_0j7v4)Nlb z3BCB4B8A`=488bKBZc6H7`>jwA?*3NLN9*7NGzq^3NH>#@gn7Nd_70sX1Ki6Ddozp zMTLezVQj?DXpEf((*G0?`Nr88z}O%V;uvxE8!&bZh`Ej?z6}A_9|4X>I4cT_4FJjK zAg}=b2Q(_XsPyjv{TAR3AjW6BOJi(1kl|Z__#TUQXpA+9e+>|0FMgZG*gEl#1M}fu zsWDaoyas$00m-ifi18brsWHaZqJI$(Vj1y5jj;tlG)-2iAj+=jX5IK%l=Edc+m-mT zgv-#%`lZmEO9}xs7x&k;IO1dWMqk!xWm5??c<6i`2kY2p%dN zX%vmNS8{}C^RbfW<6>xX-pd!`c~4o5u5d;8q%n&Ss&U!8VzaIW12|gFphFTly5WZD+h({ zcF9A0v$m(bVUs9{P6@-_%FR10w!al71Z8n(51gzD(%FLdS$&F7#TVZxQ-Vq3eZy zfV8VVA0&+%k691e>7jc_yXyC8(kM@h@KbhBLBCt*A21v@z8Yzdr#$qpNn?F!g|90WOh%|20X1!#ohrWe0_zy__9~62}=&z8*O~b5@e4R9Il4gD5 zTcjspe4$O~4wJ?c&a5x|fblbKSLTf5;H&l2k;n&`cw(O&kAko zcO7U9QO9lc&_=<>L^$FJM^mSyf3JuBm4}|`p_#Wk|5OP$2$e0padA^)Z9CrTSGF~7 zY;3M=GT$cn2;%E{H9n!1!%A3fb6rAz1z0f1N*&)eL|)!Z6Jpq?D$!hb_jOzA60Nkr zkS46=3aPGMdOb{0kYR^bt5hF6s}ma%ZD4{=J|&L_2@tn|Sf6iWpNOMN#ku6}f?1kK z4m(PPoWFeB`FzxiJdB?-n32r!3v=YA`~n>rAiqFI;Kwh}v3=?nSnBNc=^N@4Nwwnn z3Hm`~tEn10V{z54zS^uvJDZOB<|n&yI`wfxhm?qq66h%ll43GVo0=w2tjsI4q;d%0 zJ+e3%woT`l!WQYSeQRNN*EfeCIX4J%kx9}{uO7F_dSjpSChyf`kKNV&6FsX$;c&$#R#&)uWx3$WV+0wmP)FsJG)#9*p+MXt#Tb!E@4+&xp3#ZuWIQW zv$3kkXJJOS`R&~01=BNkHNuEYuzZ%X2_D6b77mXFtDi4-0j@;8rmFan3TJ4%GAa2i zzW36dt9%yUZ|KO6r=1sL&XXSJY46tXS%l{`-Bx)XcTK~~sP>YaG%=cdRz2Pk>E_DA z=b$`KwXgd3=NBNK^)V>~->d0<#Rnr?KguUr`0@*q&-xePr@25UlP~6}&X-@1e3s$& z9Z6;Q4UAI0Ao;8h$@sWf_&tMnBD%xiccnh{Enkp))_&>Fvy$p8KO9q?FTWu9ETa!# zSPbKx$>Tiyl>AAcyp7>kB}~YVL$PSO|J<9%+XUKwHTpy5Qmn)~9QmySKN&A6J?@g< z;ll^lU+O-dYBCDxza-_OeOk9msVo9a`GV}-8hs>F-w19TEME=Ehu2}wY5A2e&_1ov zkHPDya_hj)TP6uoAmvkUcz*I|1(LgIzZxmufxz|~SstxO_-&R#H1J00a^A95J5PTd z$t#c6E&O_g#~}Ez?)}n!;_ZODzJBs(C3uIYGsCzOlLl^=UOqLR`SRPrc;50=3O_9Y zg6|FRWB*2Gcsf=xag9G;`LQaw{-YAV*E}eM4k}-e{8+2-GyOXNek@-X$~VIG5hy>l z)x+$%!PmWg4s=OcHsVFTWu9u^qw>&86Ja z=g2Qee(ZqoGxvLE!{B5gJ>?r&e(Wf|ap`K*zhy=7UcmnCMuCZNDg0)^gB{d|@Lmbz zEw1uX*rx#Y?O?<4Cc6Bi`^hU?Ffl|!rT z;?bF9&3F4789Ijj-X$wH88T|<#O@`KOM5mvc^|`TLKdZ^l;0ra;EaE-?e9N`X>h;z zxCuxZxF>J={<^w+oe$q1iu{eYtX_M&I$YcDy#i(CfoEJdbcJ``fOEX6{t#oQ`%ch< zu;=@1I2U$%b6{sVPt}R_D#sv0IpOpjb!3^kq7nDvrOoRt;H2(zVakGi0EaytUKtG7I&v9ga z2Y-3T@Mq^fiT^CH%=`&X@;QZMjbS=6RU%(1veK!yFShMgMu1~tI(yRuBn~^(_%QsE z)%Z4}jO9G8eW`7mH0J%@-ozQ)WZI#Ww6sc-@pYAyh8d`AJ#GliZeKM8?SB@emHT)2 ze-KCJ$MBcOwJtmJA^hiX>Qe~?nno)47kFO_UkC*jaH92To?l=WycfvEgHT{W7tVi6 z|Ec+roxsC9S3-di>N+S=2?a(t6{}Jyp+Feg6jBKVM*ayTuLdm?7+HqXJd|040y9bH z(71&X3Uo^NW0df7@P$xdK^9P*Pp}In;G7&G6j)Gf{HNFvE`G5{S}0KE!kw!`C~*7% zoKp-iW6XqK1F|EThu|~uTlkwm5yvdMa1xVGeiDC~)|3^1jLh-B0&K&PeeHz103mz4 zX=Ho)_zcwINAQhYJmK2}dlIXuIE=M2ry?}xMf&H!HnUT&Q}AJ3a@gCW3kNQrc+TR1 zZ>+K2q;*|)0mr4vC>Es45{`Gv5>80U5>C{zgoXTioTOz5CmUJ9DM?wvK&e5F1wZ#F z{6iK6fB#Qv@PCceVEPnLkknv$%)gk_pwZdZvW2+9oe>$H0vW;v$`D@Y+8Mi+9@C83 z;jHjGNM9c52+f>~&9WONMgAeYH8j%>Epy2jmdOwwK`yYwiL%P?dZ1sS6UC9`i#uM9 zx!)?s%bbY^WK-m9doqeSJ?ePXInm|Bq}uI7Nh_gwD4uenRGHI$+%M^TLaHC z4wi4t>C+CQv}P-lAX5w<6Uc9%EM@uyb>6a+X)GM=e>JT;svsrA{>&7xSAtLpr8%Ky zf>>L%g&d+uW&)y)MF3e5N{^8yo(bc;Vyi%xc4To)700nEo5swl{a+=|=?GH(g#VIn<68il9>5)Lltj{8*!|t-sdNmXDhgTdca4 zR><9M?x?*TR+xG2a$b4VTU=p0^@eAT5{}pO6z5H!krJBD-^{H9+-xCX*kk@tsYtBY4_O8INT(g85x=-lYj0C5??}3Ik^oOIcpl&Di0ML6&z2y#9z|Eb2N92VZaAii7fLn{aU6!cRt* z`n&n)Y<`F1)Z(Z43?Ljo!s(?xzm<>04|00(8(m^?7KC1$5|KGwe%jNE(;u?@%h?}# z9l;@9oFAYUCkuoZr&&O$=_$nGG>Js!Bm*P!8(+LQjYKcbDT#b8=R4@d$qy;Z&m|Ve zq$K2UU@T5`NkUFu(2MgKQWnlJ(2Ele!i#fW^x~|8c;QStzJ((!!_WrlPgjq_FWkJm zu0 zjxYUNL8IN{{3Za#>VfoM2b=_d)*Bd$i~lkpuCaK9##lKJZ5=Pu7@G;a5$TJ8s`0KqUta zJE8GC@CU~DmBsYCfVh6+-5O(EK(^m@jWP6@qN{{PU#N5yK(^;1jj=Ky^X0uM7ydIe z#-;+9FZxL3%l5!8i|s*Vy@;$25i+<6=Lw>2ik53JD+A+2#g}x?3jVv`zX@^*6u+!5 z2!2+uN3dJ)eS(~n#m})5e2380f;S7YfAMqd*)9;8Ho@tCnILCmNrwe_Pa}O=koP&# z|0>AYU()*o9}@hSAm@r1-XYi|SS!f)9EPtDyk77s!Rdk#L4b;13A`FZr5v~hSOP>} zEBR+)6g1_t3nZNBSAqs8d$&ZaCn-7Vxxfn0vw`IIW+3^^1Qr7?2S$OH0XZHn1(Gku zijwcX1PIcK3ZgE`KI|M|C;V3fTY;s(8lkIz$V27JaGWbUu~7*x0A2}yfJ%QFxES;x z@GZdOK#VnIr?vvv2l`rIFYpFnH*g%V3rP9!P9Vm-vQL{2Yz2J{umQ;W)Bqs@qU6mN z0;@oyEmVD(4@lKs6+re^R1l!(P>6!#Gm2-1!;31Gg+f(pL!s^1VlEt}0oooInB8Od zIpX8t@G1MWeFk)AXnUv&reZ_hXz8Ahq6P*LdWrcDs&qE+rwSqNa$4fbT~WIm9Zm(WxN-K=Cj$j_majn zX(m|te5M?_kt6yLX{0oAKp!EUX<0_@hU+$zLpL-vOelwLb-?i3UIcVg8IFN(=sBcO9@E|n zBs^2%SCPi3H*zjFOL)G7Hw&$1_QCdjLQj?O-9pb4TFHsy+|*aeiKA{tPUTyS@1m8Q zINHwCU&)E1{4wG8E8$-wG&hf6`Zj5=2*xVw+bH2t(g@os;a3Q~P3Sp7zgOsMBz=dZ zUqc#gZRA#z9aFXr?uSg^RZW(VYNu&OsllU7YezU~CPvQ?s{4bN9gzHPfA0~|#CL?DuKpHPrj+_W- zJPeGS$5GOF!839i$4TSG(8yT~lE#apk(1cZq39aV(@DF=+Y=IQ?AYD|8ke)<>OJ%f z1iHij;0dqsgs<_0)6TX#{df=kQBQm{RZ4uOb*E32`!|+vl?>CS_Kj;2%}|{7*uiy8 zpO~4JBV#U#aF})N~Zo0<=K?^=&Pil3E1HB0_CbBNeEX!njKrKo!85#;WdU zXlvQxQ631G@$kwuD`UAnMfPxWMEXVGD&1~wQuyCh&ex!{;N3QwC{9I*ngM-O4d62g9|pP~WGp!#{kE~&3K z#p~0x6<}3#goc~rC@Q=b{RsaYl^Q@f3#l$)uSk8`7}D{zG1GEKU&9gTPbv^V&|a#N z8YoGfil&AJB%0^XD^P!e*NscIzj_vBo0VrklF|Tk!O)-3S{6{4@UIR{@sd3az^W5i zoRyP+%D_glDvC2gb)&nQj;uVIOi3+=^e*u&*c`2N0sFJwV6AlF>pRCOQ);)&Nmofx zT;@6hCrEkY97{Vlz5R6tjv9(9gA_BpK6fG2ykc+{_IBCWrE_(om(JCy9;I`2^OVjN zd%bfPSm&+xQ97@rJW8kZKJ>DK+C_MEqOPTFM7@s+d{0kezgI1dGE%16&>d>=>A=Osp@n2_vaU&_py(S16QKK%9Z!w<0zkG;ma>b z@8c)JPuN)tg`c5;zWjppJ`BIx@%=+*_zjLyz97AiMVJhuv@heZ=}Ietvoor=@)Ov{H`trQI%| zzJYoWW5WuI+;M=;6rqAYj$t8_w;5$`_;uQ6!8^`_Y~; z+plZn_6yX5h~ zXcc}lgvZfyx6s3-Q=N z)N`rw+x3oLUDHP&Z{%<>Qd{8!La4nqaDgN z=hn`NkeNpqWd0}aLk_!=x&;+4PqHbmzj+wrIYqC4w1sqDf5W5mj(NkhmHWs8))Q{| z{ef`xQ#uXOg16PsFibzU-o}eAodg?suuSfJV0V{Iw2OKSuiU$M@0pd4_IY`*zT|_$ zx6b6tIwyJS@^pA~6O67zx~*SrC-@QM<1WK1=u15SBI*hoO|PH<1&~WoZ`e;=G9kd0gIQ2KhgS&l5QECV>p) zb2V9!lSx{+{|Y*qiv(Ah1fPP>q%e4?1Xk_`Ko><21Bx1&*h&w6hs4{d-rgOmHYI5OD;O0OW7^XKK6xyii7aHX>hzL~Hv{9T-r zb0#bd{}Siyl}uO|{teFA=9yFT^SL7YO`a=dg8XrYRLTVTl%G_olrlj+7vB}BlnL@@ zf&4EVnaaX&{$8-nK|^F}3&WWU5S05*@T|zlc9n1ue7Ij+1}qG-iPSkP3~#|XwG}d8 zVVG4_{!{GyUYxUp8Op-2%H^L)iiKgW?bjemc+9vJ04NiD2|fk1Kr@cZ%d{}eDtNHcsf3{~*G)gBW)K$WT7_yL*Y`g(R)q4}p%1$t@UD zgOeHrjF~)b%r_#j&{dRP z_;8euovMoRc|*QQk&l4n)j9UB6!~pKUaZI;8ZxTLXAC)wq?O5QJoCr!e4WZ6TFnBy z9JLUdW5%#@+hC3uqt7{x-D%9U=Xz{M=S_u8=knY+NS*IBBmEb!7VWQDGC9>4_LPbC zsr&L-B^t>7<$ZkW&%}XFfr}_S!NxR%uDu`~|buv}|sxOBle^H-fA;-gq*<+1{XR|0f!h_M0X0Q4LWm083YIZtiH@ zMC;HPHE9NHwHn8{8;$0gi(_B*#@dd$23RH$Ws}8iZMAo6hAGk3bZov|$4T*a)xvPl z%Qu?EiZxjE*_z~sk*L>t99GT@naUr$nNgajE1T3XJT&xmgsUM{cV*_p$S*=OCPud8 z7Dkq2h1XGK<;oY}Gn^G(Nn$P(TxLuREt(iAI6t+Oa=9vf)F#Y(7FPo4e3W0zGi^Xc zP*Ke3X~(Nh&KxkQjyO?PIbm{Q9(ej4R53QE9lTk<*;X23lZtDNI!Yj8ik0aotMy6p z{|(dX@EZu{sny}bLTPnCTcW*IYiX#N4X?t6(!20WoKRxsYQA^9wUmWuv{Z`C6^`8K(N5qZndM5?e0(#b=nMHyQ}%ySzYHI?g}t1jbKwx zMs?rIN&8e6Od2~}ib<{_TB@b2^!7+qMM~a<{@iDxSJMQ2n1rZ&xQhoB7*%g)U@Y`4 zYkj?|+6$#pf0m*Kv?yN-m0W)D>&&GH>G4(ZhB)TM0i^yrJ67 zt*=2n0=`|~wOh3Vm$$eywcvd{+j4F>)-nC&?q^QD@PXf5_nSYBTe0N1Z*F<=uRn8n z?+=?g5vLnRFAhGq2XGw4F^J`};waIA_~*Mn`%yx7iM$6(*^Yl(cAemsszI5jg9q3FFBL@gBLq* zGB(+%(_wTuSQqMo^jy)q{%r9djvHI-)Call4{dLu9tib4PQ3W#uTVea)`oGHQAZ?- z#-Z)G>v7zIqY1}-I5P7p7VG*|Od5MZNw5(i^(Do`{om_z&GvUQa9C~s3M!YyPMK4ZMNkUE_(Tj6RGk|cMlb{zTC?pmK481rpAm!o| z61_O9BndfDK`+i)NJ7pX(u;GA;$?JCK9=<2L=$6i?n!uYqKaOe=8)2Jj)`8JbrN1R z5{nZi5{q+*jKz62iS-9bcpTp1^(;;qs{w~3I zI3M}2{=oIyfK1;Z*aUL{#qdJ5AiCEv1LH=t9LVw) z12I{Yq6fnA^FG4ze-fR8s$_B6j#w*ri{L)QqyIyKL3$x?lK9gRnejP`NaP=JSkgZu zD3@^7_k?~_Q10JZoX})C>EA526X|yea{80>3PH}|lfFuDx*+eP^am)c1YU|sKeo?8 zUQ1+WJg1$G0+0lR>g13Q7pQ|Uc`nbLcpe*^rPZw(OZ zXG-sZ{#BrvZxN9B0JxZ>;;~&SKog^a07cuOng*8+MAh1Lp%887H#D_ILKVv*q1|>b z)Ex%w$L+&F+Q~l-rHCD&ZkO`IA*IX^4pW)o=};uJKg8*7<@iBOd4A)lS4jN@GYeQl z8e_`H!)zd(VOd6=h0i1EFBtieHqz*2Lz55n7mPf}dq_tt%gA%^2|)b?BaiVx(m0Ic zk_F}Ijl99Ph3@Br814jVw5E|Cuu*o#ACU0BB8@n^b#$ddNcw=#^%DQE#DA~QM}_{B zq(39^zc1m(CH&Vy8+q?+v=#LUj64Y2j)SltgNp8I(zsz5`Hr`c#*L*)_+96r-$B|{ z|Jx<}CW(JHX;=L_C49Yve@y5)q5nbX7NI%a&iwBe`e~sb6dG%?N}s~WQ~c3GEBy%6 z&&Wq8{RkJm1Y?Ez9p)Le+(TEBM*g3Z{I*Cq=Gv9}Flq2}CcY|9hLI_4m5_7 z;|6f%rjd0Dy~0BmA+kIE91s07Py7lG&9v_H{_^o@67eDun4Fa`U(eNQLM2#~UJ`Pu zU#6Gbvbsum-Sw&Ie29A`NJoiiWY@jl@1qL4BSCVS%T*9x8~bWr*eArBD`hrcqt$#@ z5lmY|`AI*bw73zH^%F^Vq?})a)OA_#giyjge;7E+DAPtFt?O4jM=0Dcusk^b^a+*` zTd33#B=*avREycphm@^*a2ly)pFUAyx%0I&?)(6$Y#k>+CRq!T&rg?3R)W+4veyAp z+yVIq@GjL^U+uJrSAhF!ihu_Qa0fNT)y^<;M6dk?wN>>Xm+mXTUCLb$RL(AWX)+XR z`hmG?v-nqQv-k_Nu=E1mI}1dTTuVwXz$+u(t6zhi{5hp_%gUp4l$Tz4yV{(wEjh8M zt>jzQ5B~6*KjHDDZn6Bs>XRtL#T$IwW033(WOh!4J0 z=g%)dUiu-t^U#%OuwKA3o33}h^Stxr7bGwJL*b{nV6QDa^F7X&Uy!`C;rEQBGW_~R zDPNGh^grSqhi)1tp5R`^#{%5}@T*a0{{0aoFKzSzzsdm%N4v=$=Ud+(dFl6w{H*DZ zC#P#}2XF;S79M`;MIumMx?lKJNueS$^nBb=@Wbapnltjqn_ClYesx5qc zJ}zZQN(*b&qsdDb2){2&;u`RCyOhczz?3gYUi$D|@O%k_n&M0`O1e6Ms@5;NmPPK3bzX?Uyyuw@id*D;pM{bHmO)wI=_@Ek0u|!OYTqg(r71V%1IJ@ z`31>`4+}qY8>oD9l98PG@(Yp=pDK*zNUEk$`Hd_eUM1I8jdW)3Y~8=T=wD1X(4~}b z7ChKN!wBy|8U}K1s{1XlIRG5I9yTj*Gho^(9CWR6@cyzHM@k2SJ{R|T<-_qB&^-`J z%70ISJoU4%50AWe85wYlamb8Qe!O^?aYqUdk`;gD-bePn0y*thN048)U9#MeV%+)4 zz28#u;AdODzV{Cs?Y+a*p}jBN9EO~D#@<)%&D{ISQhVpC4}_I`xGp1Qzbjtud*H(1 zS6|K8`|7J<93dR`UWQ+UI&|D|uOkD`x}K=Bc0N~U?>rga_GOmc)a}0@bB^QS(3Fao zry`!_Z|$UQ{b8he8EGzreR_s7&x`G;&)2{N6?w4jh9*MZ{qB2)X=ne0$m8FdZSAZM zPkFxXPp__Z=XWAp1e^93sC3Nt=2u?*YK^O$h2a0J@YUt$e7FYk?Z)p#M+czdW$fqZ zlvTCobgyiD#mjpixOF&U=X@V)0bhM&sSUaJ>(Hjl(6&p_#!JxFi}#*w`HpIP)&)m5 zj-5%F|IUX)4aMbdn)3gqjhHXu7y9V}SP1jPOVJ5ne%|n;9)qs8JN$&S3)|f-zaK*1 zxZ|-rf7tj9)XzpeL#S^UV+i9Yj4`Bi3_|-%J{PF5ez#K}_cd{GhV{E?VQVdU)8FL5 zaiPbL-fw~Z*m*~ihqMW_I)<2X_G(O24Q>g9?@MVW5MJ-QhR&H8Pf#CXWM3GnTHp81TLxD@@`O^@z*Z& zIg%G?xqai=CnuuYG8u*a9$p+3qwqzben4tEV=3L1XKA5CXcqf@ty*b}uPNkc7!Dq}} z_={xRP%yR|C#?Cn)i~jLe8vjf8nc|iP=G05X}CgT6kzzZv=oPGr}2;CjO*IrF%u}d zkR8dPc>av2reE%9XZlQtVQl2)|8K9Zc3{GAXC0;-CtzWj$6t zh5~#8WNww@xm7r*Pn*f_Vky^fFi>m8$~`WzXo!j~cgW+Br&8R)6m&Vuk<7l`woSo~ zI|ba0l*s}Xl5z@oHK;<|n30s6ZY4=|6#MoDF#Rk@E9X7re1~ltj%H5E-t-c}lblbH zayZWem%>kz)g5)H`c9lp{vydHj!&)!P5wuR{1eWgL~|B7MYAR+$8*6x_;5gF6=8UX z3MlyT5t2$ou;e1de zdu%eNaX*F+OO_2$kIV{0%wTG}id+Md2Dc)Ys?3WnVAKoe;V;*^XdMDGGBX#08Z!ah3!oF{T+anZ5X$Bgow&>f zMhmk%k-TKIaqL0%Uu4X*algblJ1;VJ{J7uX{L@Gh88^+!+{3i&vPe$8E3K(`4%S;U z4>Qg?z&{FIzGN{f;X|HUm#<(INM@I(6z>WsWX7h;(~5U*td5VrVoh!ycA=TTG9~wJ z!3FMC2pZ#22pXGI2pX5Z!%KlzM<{U17ne#8-x^#bo{y9A?3)0SlcfrQ^wIk%f)s;w zf!;FaLbGMeMdz?(jJZ0IJjMMx#&^h~9^(J$1^xN9jDe`K&!WV+D(ATMUpQ|CRTuP+ zFUxeDn-yzTv~)CXXslD}1V)KwS)-C$uWd_e(wG98l}$&XCf?$t#g&3PJu=rWd?EIB zNl^9WO;CNAIWbfM6`9DEtnhmJUHbJ<$t0sE6DqSqRTHsO6%=I3Cq_0$V$_qFQJ7o! z&D_Fo#Gz92<*e{G?_;`eTQ49i@{8ZY^V+QNmz3udR%nJDDlQDwOgbQq)q)KYetg2C+Vp)3xT|2Zqp7b&=m#30mCL8ls>7#vQ zf*PC>RXG)qlTHcRF?y69CrVmtm=`uGB-5ca%qibQv{#)zN&cHu15TfgGn#*hITgTwG~fBI`dNI(-S7UxRYwN zIZYO_PP0k=uM@^510TjF&wh#OGn!45gHDvRHZ)QCoG7c!>0!sK-kctHyjCa6s?Q9g zJx-K0=Jbf;RcB6ysw#8ZkGB^(^lAnkt8_C2eLC7On(3rkRW7H-3^1B? zn|K{a#xlGM9o}ipW_S-fgRZEdZJs^)Y7~$y1BU> z8fI$u7^;fhw7j_^u`$txQ~iWj0yRGTp%&y4u5jyFL6M8%Jw9n_H+QtGPHbwqD?ziT zOB2YdEjV^U2@C}?gL+xxhPy`zUff|`6oT_JqDW z8h3+O)k|7hnye)&SH_K|B(%{+RL-kYZ9_%0^k($xlBre06#Ya!bev7D>a6OC0_?U#iWj%X%_QhXzAe~;Oce@;t;Awtd2x`$5QIJZD?#tSW4;wjLi73 zMj8gt+-rs+q2<%-R&7dM8o_uIRQ=3j*F0;@^Kh%&RJ}L3zaXvj`}9^$GBDK8TXOex z&9E`thQ?{$$Z@}>qqZZlQ1?UoLKSBrI*gaAX>HP4Pf%_@R&9O#N`0xQkzj&#Z@9Zb z5BC%e&)W75ofevzT<2#Yu5W4ERNDdl!Ofd)PqfkJCb>b$jcK7=Wh3{OuEpYx<>)qS z;{}$`{%?2pRI+LucTUW<+Q#<8LdXiLQj9eE{Rh4bL%)F%ba!YI>zTME$W{Lr91Q=B zthtuU_1_2%TzE>nSIfj%msTu{>gK_N$bBJ3x74=NBif?H=jsIFmdaprvws#TtX=Kn-FFNk@F~t4&h>7$^M;qY199#RFP3oMdp^SWk;FJAogcdI1b@Bg5zl%r*NFbk&g;Y#W54dA{=oXtQ3N* zhjk>$(?TCYCz8Hd=B>_Ws=_TQ!8=se^P})4^845dJz8PZ_=wJ z8_*_ywW<7Epk*gjVYupnnX$bQ>lAcMGi+wBS#@D?0i!so|&AsX&|hsRcgJ zhX3CPKf__SGEo7Vanvr14+{I;Mg>Apbo~pzed#4X4%+${CG9voaH7TKFg?wO+9Mv ztw+6U>R}r_>-#Tw{>{|cUX<~-503edXP$_)zBr$H*wovm4)!w-t@vc~1@C_w>-;o$ z{U?qPGMt2?7{@g@R^X_`(Sd_|{EV~*AIA%qiV)4}L0^e#5?7k()qsPSG~5$7=yewk zQCxmh5^@P@2E5_8n95jOUllJdJJE{^QNo@puk_*qim>N05WTo2B(b;-MK7*`ODwMB z(2L7D5{nB%^x`U!cyWoCUR*C0FRqZ$i|cB_i;KbZ;v%tlEf+5?ElWbK3o#ZKiNuRb zVe}e8ka%(E(Ti(n(m0^R^#PFtL8*@ZbP#i+OA9}#{jE-Lh8#;;xS7wCYXU_`b!H`- zV-7AYyibf* z<57*VA{`zt)EKjX(DjRR#t#@f24uQJz$@Y3uQ7H|{PzQ|fIsIffw2xCq*30?Pf4b$ z1VThPzD#4R95@|xnZ{TNP?ZaK8T_LfV@2Yh54;rq5sfkSEaRUE>-IaXF?I?VMLfRu9Y#WgI z@e`W)H31($yc!_em)9*Ywid{K;Ji5dfwSokAYK&sCiqX)7|RgrH{Be!30rBq#;@XWL)EGMeyb$z$jWMn;kZ(7T z`R~ve+YWpeXkNd-SO<{fgV#I92iG?yf#&@I7^?x^2R<`_ofyx>8rRPNZijyna3bOt zYK-Lr%Romo#w;MqamLp5KCLmv_agca0w*9o-<5zdzBkdoPjDCTe$Y+8@rcL!0Wij8 zAI2*O;vS{;+XSlpHd#MD&se{FAj=)mxSmT@Ecam`zOCYqYm6NNvfTX|V_iVa2K~Z#^8C*FiqKyWY!c)+U_5y@%$g!J_ur%c z4+Z6cn8kMp`d=V8UhtQw2mOC0xKHpQ!IdVug0!YMb1u36In)e}Mq2SBX zjue)n|5JkhCis{jC9W9WE6Do@=?@9MPmoe%^luZ~C|E7HRxmDDDtLt;?H4dT#lMJu z#2=BuV??gf5-E{J{Hov=1s@XR`zd}|@~x7!MQA?v>CgKFae*KO14&O794i3IuM(Ut7!d@h_`DA=ow+W& z;k>`xj9VJ-C+`K80P*gn?1vDepyvXap5aV?HxOWT2(|)yL9YS!09OIKfmOgR;7VX8 z5M@{PL2d*h4fkzU_Cam{)_`6PTn9v%lzkA?QSBRh9k2ra%YZEBQeX-2T3|5{DjKSs zxECmUB8z|p@Q13ADlb&%RC(tEqwv2ASOnY(WW0NTtk=CjfVBn4@~sBe0N(?w0=^Ac zA#@4wt)Qbqlh0z%02QCls|L`6z}tZwmp1_q05<^noZ1NN1)`6Y1Q`9hKqr8mKs*=5 zwgT&c4Zu2J4G_=Uu~k6y{n$$2JAoCzS|FcmXp^xez#3pNknJ7?{uQtY$oK_7wrd19 z6=(r(1rDS9)xguh3xGqwTY!T=_SdV-VeRfY~ z3}qm0#u@x~W^T_6hj(OlXYR_hL;EuiW`^*80DcEE`!f##ABQC25#X`R>s*%RrDWQY2*4`pYE4o3QMemMIG&L58)MtEP& z{+t6j;c$P>p`3vnJ9H@b@mxF9mDimY3Z2dA%ngNh<@V%)Pwt-FK2V2p2S7cZdpP$9 zsII&nc_?*WZ{8l@<9UbkjsUyzcjR~HXNQjF9?Ok{y7PABVIShW<9Y0xcj7s~d$DnR z@8G$dP>60{wg^rE7SK$h4`Jo^v7|L(kXj52tTPw zD75`MqXLqdOA=+i=fQ|Mu#e@Yts*lu)u521Y;qhDHxwqiKjjgId%q&tP?`w+{= zj~KdL5^lcZ)qcFF?^X#vCh;Rezaa6=cl~(u1^E?7_-xY1Zzjq`cZ-AlMCcbtqrNq`Inq)8pZvNc{7TX&Pr1;Qq!GVU;#ZSK`B-ndT@t@S z;;a2`k-k!BwSO(*n|X$_62D5qFT_}5e(QuTCynxS3w?`(Hwe9jG|JN}<@s9)uaWTm zq;p|!2_JcM2T4!FyjxU})=x>}N;3N5&ymKpV)VVA_s}-RKFepua}H^guT}CJPa5eb zU8MOJlg5p{N5V@a{2~c|tI(GS{Z6586neAJ>xJGSbVBGoq;YK;{p$T5`YWVe9itc%#w+kKSLkIQwsL&UYMt)zB`pl5<-4eb?=suy>3jGzKnxS!oMrwlO_CF z3IDo;zf2nZOQd{PqHM~(mc*Y!8ZSmArhKIF0#z>b64H2y*)?64?*`HrKo42y)ueIl z8vW>7Nng3|>0dxhcY4m&yXpVu3BTJzbM3($e}^ZWk8O82 z&)u}Yy)Z~<)Kv!<0W;zzE=jzkkc2k(vmBeER@20nPh2BLQC(f#-T`r^>bizIt2b_j zwQ(s*!U(>!G}9zHjitl7hAZ-h+D3>=rJ6MJ$tXyogWG+tPPDePbzBcdo7=EAAGfW5 zv|Dp+)AD9ocxY_zNHo{o?b^dz@tJZ6` zoR;2n=WaJm6(hcU&D!eK*Ij?z>g!f4y>1PLqcKwDXEIFhBJPu^5%d%TSAJ==Sv8-u zjuhw!iAOP*HbTl#ZJ-6ndAg*$*26wm`o7;m0-__xTLlVw`pRLAY}zfbIrRnYBo651 zPRiVVC2Lui8`m0eucoM+>%Q`9p*UZ*L;(YIA)T&X8Wa8dt|3~ zd2*}wfD+AhOuYGWrKP=eu5$ygDz_9_x>WB7U4WgkM+yz>ARm#x5xc0&=_0@SmN~5v z&|GCBcF{a;RG!{kWsYq@-#oP$yg4PXeCNJJi&ew)+mEtWIHv^Lx5IqpoaEiYvFMlF z<9&`85u5|diPF5Ov9ygr*v#_}4)FeS+Bck|j0tjYd#O(V^PnO^{>r~*PNS#Rcn{V5@uIjIe9HX6UoKyfzY9=ARIo#QQSDX7RrMWsW7t)Eboq^lcffG_s~; z0VOXpL&zzJ8uiug@dK-jdQc)yc?}q4V3wvA-`~Wf@}1{gkExZKmtH9yKcLsi7X|HP5*^eNA5aT&2E!I4|AUr^+%Vj5HftLqvD|7KY)u`=p&Mnp9b4@rNby$~w4fZ+bUOi_{d6bU! zIjd^hIvQ)6T%Q~*;7jLcpEHW@J1fdiHK%X&VU8fkbuHH+6-)zXXiNiHJY<>xUmzWc ztylmu&TH?^`0vN}F&+7F%JA?Sd<*k~E5qu@nhR+t^cS`18E7v&IRLk- z6Mil~Uw%RMISoIqThkeSt)r9=3MneScR%l)GN15a%tz2Yak<8=;P)T;)VF+mV9|N` zMX%I}UXrm{Q>JOxzc0Ta``Mi8dCF$)0a{Mc4>eNw)yC?DF6&QrdT?R|C& zzYeL~QSfs+Z&^pP_gQd_P92qmRoCfp+>7#E;$|%8;K$hzCj{49%6KV>>7Wvc(fU@+ z??8j@XD6YYxZBUqerS#GE0p-X;OBPf^;L6fP9eSJ+baADBw;`Jg~9MJ%ExD@*Gc&{ zB{~{>?T2<@ahdKN8mz zog=>>`=RFgdQj?Hup(J7IrEe+(NMjijmn(LdGF5&&-ne^s#Jb>4Z%oEI$m#^T5Ib% z@EyCQvAMpwI=(C!ipavxT)%zb$D*#oc){`kT}t_8!Gj%s8sUt{K)zy}-eg(N0i)aS zu7P(Tz7AF4p!>QUD<^rfgrj?N`34Y(ysOz;crJi|0_LN08QSo6^gdWts?nx@Z?=Syx1oGV^sI;B(#0)9h-+2!$u@l>3_(&bb!|FYWhL9{ju%|1G;>;0bHG02kr0nW0}*h#gWHZ1ml!rO82ks(-XQs3rDou z`RS{+r6}j%f6vM?sjegz zyQs@J75D-4=Y=Sb*KW7>y*|#8zC^b*lp%EH>i&am=)LMT9oPo|GiQ7cDNtL*=t*~yT(*F<;%AFva}1v)s+|RrqlY)O$$*j3s64u zq5JoUdL|B`T+U6lZg>g0t|>d(5A65~zcc(9_qvp2*KO84bx6m{Dcq{h+S&CLaKue+ zo{tP485Z|B!n`D5YT=*P;rtQ z{_nR=KSiFS^cB-CUVb1qqI~&Iz`m66v3#(0_7SGXZS!cOXfNSuN-LH~)K*OB=|okYE3AZ%_2UjETnz;G5f|1Zd& zKF;8WMrPX4c=q6APquF)(1PZu2I$qj0#{xRa^ODJ?%rgu-;-gAwUsmp%%1!>f?mTw z$z3?Tg2VT5oKk*)ljVN~r!U~}Q0uGjOSl^K6P)bSS9!kBwoQBmk^;NsX}GxY-c9Dj z`#mtr!))1?+5v(I*X4xg(hE2IP(=7N`tqHRbK12yQFn9tB3v+e8FO*L)xgx$=uoV5*#WsSzO**jl-LfJs*(b_iO~%B{qx2Hi_y6p|M+gaOEa$ zI@o9@bM{Kh$Hb(55+{3(ZJS_wq{{4;-$VpoN#+E91uSVX>tqhodlLeUxq|dE78EBO zkGYC;9_jBXGW8Iy>}9rXB3R15h%k1`QnTB`HwOwCjLd@$8PCF>5adMsc1%cef1Se z%2%twjK@wVzynTz0eVY)g>vt;ZR2APWYO3yT!!aX8YkGh^?x;(&f~qzBWLuExrC|M zMS7Za4(V3xIrLv($Bo}a^Ec{mf@-fz?0 zHVMqt1%rfcMa8-aJ%tc%LNA7|F(0A0Z?djy8OXDM;=Zl>UL&T@5%+@#aks^X-dLCS<2KA{r&~JlK2z zBxRBczy+6zo}=iMpkJr!WJTKyJy+3>8X8b^hoMtQt+a{Y{^Zo`jK89ccoQY(P02`w zrMezB#d&rlr>Ov0dk_;>wENzdeKEje`wqY+jXjy)e?xZq(_rw4$Ims&Dl_cqR1F(G zo&4E&kbVutk<7c5>+^kY;9^uNu52Hbe54(NYak1yHWiHWGQSHOW;08bnw9ntczz~) zn1^2`7fi6GGIhD$4i7A*OjWL#Uocc_824>tG+SUl~tv@APgzquY`XB@&cdxEq)JLAX3ew>~860VuT zv{6nhH!FN~(!nbX5OXWNPWa)QRaXpJo*w+%Xc+|r#%Zx|Csc!^q6~c443*q;r;oUImzD4Y~RGp zmu^Y_-7RUOVeN4hbIUw`Um!`ULgvXE;rC~qa)v%utt6?9@cPM&p+GS~4e3niGEzl;Z z`u_5?G?ucHaMaS6NKN`Vu_?hn5;t?D>D0GxwD6lv0>-&Q&@WL$cs9l-qYQMw39cj$ zBA=LJpSUI6o0*ozM80wh5;y4rRbb~}ErT^#tM5P8sP7NB>iegRwU^~wh@zWH;kb+V z5v9N_FR*Di@L~evSL%|~B~Io6Xt=@a*rQ`}2($$IFDOhK25xK_GcX5eMr(Zw)CEp2 zE-EdXGo!k7b9;TrfYu~v&7hWG(I?+AV@-W)Lufia=gq(bc1*PI?3l4Av?bKsimg3o zR5jOiQo&=#jHar_)=i-m)zjO=D$G~)qBxrNH+QtpXxdcYytyGXgCAS}LD5!k!)k$+ z8I?`z+o2qP#u9#GyRo(X`i>b(S~qXPgaa&Kn6AFO(RRktP#u(&cKm}97hWbc@+~pm zbgI8)V}a$>Y6Ep>{YTSaf#VA8%4m>HpKDuhktQhwqkN&;Vr zZ``d7)lh_7*NNpCIzBGh*y3(8fE3hhhR)pb8peqRi&VHCWOI9+nh2Nb&duw!b^GQ` zolPy2jy!}dZ-51ahbz3*Ht41FO@v#)dk%IrSkIjZ0^Bzs$5YB(4T9X);2PRqSY-;X*`MmEZz3k72xxv9J-|;NX^l$bQ{c$XSlBn=4gW*m!R89LdkV+;e}{99{~>+( zxc^2^XRbHL(_njBuswng@%w-0nV0+cR7somj*?Z%nG~z1Q{> zA#<;Nj49n^`;R~F&GPT}cKSR058eKzXIifRA^$_KdkV+-yvLNEZ`%HOhq+;A_&Yp>d8xUdK>n1=QSFlJf7m~V#a4j6#q>I|-VE)h%3K~1w>T=-O{gNr zOVsyk;{n~U<7Jh(bOqPD{`A#Ru^1FYa?B+k(loY}Fw_a{172d1W5#zX9VzCswuC{q zEl$+YK@&$xmpI+!c!`nX47Rvlj>_eLYjs>MPqggKO;k*km_+Sy zqFZGy_c~TF<-1>;lAO5eO^QsMaaxF(=TqT?TBDQdo=x!`cDz)X%L;T!G;su*P<>9Q zl}F|BxNDUy0?ab=I8Dopf7Lp1Rhi2H$EseZ!#$f&H#=Td?v~5Fu9XpB2F6B+eytN~ zmAN#b2ydxKdV`OEdl!r%f9t{t?!KtIXwHcsJBm_4>j+ zn^2WbsFlXI85xU{!e;Spyv8YtJ>un*BY1-wtG?PVPE>kFV_O^bg?l!ksh^L=wqm51 z(3Ost7%9}gN8={9Nn5yQD*U5yy@a%ddp2osy~L!2Y6WTVIa3*%N^K%dp*U@Iyu>sS zQ}F$+7jt)CslHToyQ?Vlrhy^*NzdnM*gWm{yZ70&5+?8+E$evx#$; z<0U3;Gvql5e*kIFsLf@CW7VMD+_MRl?|4~hF5OTuDK?{}tDR6)=CaMPiV0;#PIo$9 zs?6nK$0~G8E_dPYF^x@?LXpM@I_QL2X#@NeCeMJorG#opkiE~Tt5vN0rmnw64%CU+mEfeav<7K7sZQ(z(jw|LN-z&be z9WOBjYKEAx8!u4V<3o%qd6XzB*q4FIsD~<0` z*J_bmHn>(=qI))ihMeeEnM)HIrLjf?aQvPo&b!hn5#WZ3X=MMX{f%N*IJHL101|62`5<=%~YVC1B&F^_w>? z3ONlPV?t{D%WCRa-c*kQclVJ>q)u?bpC(6H*X&5DHz!~DDV6y(IzAmVB24C^(pw^H*4>`m3uphoy= zKvfH{uteRe+oYScvzJwZyU|k3LZ8**Fr=XaT3y2KMs8K4Zab@v;A}nk9rQ>`%n~Jtp>Bq1XFNJQ65e4s zJG`m%$q*)*R#?VGyH3OW4qcb394v@#Z4WJPl{!$uB8E0)&@-&%%vU?Os`lfGSH(R- zr-oW~JzHnh6ImUb*Xt^8*@ioc-G?qr-G+2UT4LpRS$1WW#lx|1`i5wqjsv}$HZKuH zxV3E44K%#mT2(KsY}hV35MP+5Wi4&eNEV=5xxNxBp{(h;Up0L}E2^-D&(fM2?y=SZ zbXrbL&63TV>Z`EkQ}wjXgEYCdL~$P%}sS3)#hd}^XJCs<}k; zzN%xh#FJC2@M2Lu&sXVQ=;#YM4hJTiB(hOhG^_H&h`d$-*cSK84V4^$i5w!RU4=^ z)^${2b!`*&U~`@{bZ6U{tNZA=rtKgB+>OF?( z(QgRYC=QRhuzU54wYWj|J#M^nO^~x_PZBtu&$;MR!{6Xgo~BX0$95Q}+1K$?8FQ_3 z>g@H0%BtSHK~g(cj(Pbo-5^!Kjr52zx7GjR|8XTy@g7qY z=bg0h{ECb4*jrw`x^Ck}ymmPk`aL+%&>GU)5O(PQe*yg2qPCFcZ2|TexCa8ADr7+2 zZlR9L0voYu;rSIx=)xuPK7CelTAQ0M-OwHi1=hDWH6SrDB2^S4bu;M3B41=9Z^76u zi<^Vq*l~5J4i9Rh+)qCYBJG+w)UA%)Y42}#H}5P)Ky>=fF%E)7Q9Oo9 zg5uoI$}8h5lp`kWd$8aqd`u_%U-Ne^fdJ%1w~6p5yddVDuE6!uaL2#l8v9_%j+oXK z**eqNN>e+X7qx|^wq@@I7lyS&2CcZErhYw|8b2{+uR%_yI~NCL%qhb>W3r~YW)n`r z!F!K`$n=weBO3?rcdk5us$(^ygzALZhwwgmqq6SL-}zAM72o*QKkedvnmaB|`suE( z?9B>X(E7-RgSB^Lzdm7I?eja{u3vpw@QsI0zw*Mom#)9QWA5#*jPJ8AdwkX19Vb&B zU9#iZ>A&m!%k51cy}fSJ+U9pAcihwR%--CiNgXp@dt}AEUtji-S)bzGoKtV`y;jum zi6hG|zC67sZ(tJlacRIoJuKUC?8L!I3!Ep@7aU7>`aK-``su$oW#jyy-Y8(wX zI&o~ru@lE090ze6!Ep@7aU7>`B%u-H;wZpTibE}TLH-ZGjbVE-49uT}(roA7ES5O_%38zsGl?-O}O{#tQ2={+gwWj{xwR!{*=`Y#p# zy^mf_%Bn^qjR;oz!3{M33B_IEH`#z8C2(3e*m zt`?*fS0RWmt_YwN*8+$Y7ZcKo)94F;Fb|0@F6t0jTsT5sTty;QT(?N8ML3BS+Z3(1 zXhb#yeFc0j-)5i{zebT4==@8$8_%^VeuMWTO;iQi17XiE^@%s@B@_ju)FW(}YL(ZuB6e6xQM zj`70pMJxUd_IJDs_#teSwnJlZyV!39Vl{SUr^aA2@EQ1T1Tx%OU?JT3)gKs~C-&2T zXj7G(X#flshT+9!9rj@c!9>?Bw#P( zW&@uDvQuF^!|0tCz~3p2!66{+Uj(8lRSswj^0D+jaDE8^2KNJBfIrTfr2j_Xe7HAg z46Xsv|7u_buu5ZaskRSR0HN};l4~DlJ6Y5-DB6_EZH0oh+vXbjF1 z_d;=>1Z22uUq;VY;CQ$xqJRB~8KhC!Xs{O4Qj?Y(M@EDN(`hdI-k7!i; zThsm^cp>Z$XbkQL(!K|HA?$Z+RQp@geh2sku-~pR*aaMfeJAjI*tcm6HUjIw8#D%s zfb_@zzS*!3Xbkc{75(LE4ElkLhY!8;V1L@9Fv$PUEVm&b-CqPwh5LX;wXZeHtrwj6 z=gfcR|1Mwve22#1%|QIesobhj?Nglt-Ubd-`&3i@TJUpWzeZzlHIVidz{#+mr!mO? z474uEnMBU~mY?^l=P= z>Emh-hU*7TfIU}%0E0)w{xEPn>^T+y3?2aHgLBmdFt`W!B*Je8vYfg!2AhGD+W;I3 z`&x}^KWwI_3Y_Vw1TuUDknMJ!#&zXDrn6LIFdNAFP6Fb;VWp)pIBe zTn%LSrGoQ-X>c#s7%UR|0FeC|>QMD(*P>rVmV6%+94DA1_$c}tx<4#6@%Mti5j-Y%RPbTJeS%*SyjSo}L8|4Ckngi}UnfWfD&%tosb7VBoM4tHd=7zYG3Y@cV+?hmroM&4tMKQ6d)#5I-*XQNeb>>jbGyfc~f)hB!~KRPZ9fDS~-| znSx6D4#IJNONJj591v8hd|>~G@COCIB6x@3ErOkb&4MchscwhzrwdXW4|$rPSCH?a zv_C2Mg5a})-xZ|7ANu>U;O7PJ5~O}0x;F_@w-EUfL8=}ir*;k^H4_o}9!VUQ{_9tQ zF9<#+NVP}w_jy5TMIz_>9kE$(r66@G(SEuhRW6aI2|_u7;=|JKofLdQ@L9p{3R0gF z!+%-O^s9Uyqy2WlCc!$vC4y8fMSs*5LzH11U$$_*chUZj(y#qa@E3wV6_l}YAN5?( z{~kfUPm$jvNUd1pn*=uqeps+taH(L0;Q4~*2#yh?hAztcPwCgG-;11U8i_{)&2xcc zo3y`I@Sg;47o_$uy4MQweTe)@!Nr2n&yx$q{#-%6|1ccaqY`bww?N4MLy*eL$e$5> zT2Q`i`1n3U_Xh;;7mR*h-6Hlk3iAC1KOf(3h}Q^GbsBk@AT_a(=Ln_=o|Na=kl?d| z-xGXL@GF9!7ra}rQ?OaEPVgE*{KwPj5X3v7PKO}6CB*>>@h+#(JZGcb`QGvad@|sB z*_ZGNRRp{r2vsfCZeRfTMPNSgJ|N%M@NT8{dq>*Ue((1Jhau;4K;|FsTx!4fdw_%B z-M|6hUBG_ec3>ayc3>~?HsB%Pt-u4oF5q6^Ex;b&$AE~_`X~^xsFg5t2k<6f7w{v% zt-x)-HXyDu8-WdV237%4#+gfj9l#3UCSW-bWu93C+z2cLZU6>=Az(hR z9+(YW5A*}C1p?GQ^^}J?RdRj~q?{iCDd&g40I(Lw@N{SR?*jqWVZq0M0q`S0#`iRk z{+|NU|961^3vDTr{|~-E4tySX67_;MlsO0_?+5-9uvhp2;HSZRgm(k)1n&~w2K*Fw zt?(+~C&4R(7Xf#G2ZUz>?*O-ipG3Mo0X_&+@dG~&-Yfh7upPWdcsK9{@GjwPKpd*R z7`_U;6<8teMZgyDfbeYKb>ILMUjXueRDexg+ z1(5B&99Rh~0`3PE0@;oOz-hpI;J*N~foykv;Ke`-$n*>&Utb5F1Qq~?fV3Y3-Uu83 zP6746=En|tQD*fWVxlnKg;bH5$idjz`#YXvI=1A+h*&g-2NDDZmA=T&$-wGCcxb6cm^+huRJci0}!PJ5T_ z_4e3%?7hH2`?x&>+f(*1SeIwJXNSl39P}LacyK=C@p}6`$2 z+~wQuLoR%~e8`1wk8dy7aUT?kcu)FH`G$epQ+A}>mE!g8PU%V613Zv&Fy#>NNJ?MI z(G-toDCGp$aLVbFF2C*Bk=~tdd-~Fkr+YlT{v&?4_)q)0MtQy6qjrwk1>8UCz^H@3 z!BNLY4FS7Sx2Nt%^?L70?M~eZ>`gtA+6O$9I-GhMxI3*UZBLp9lJ81~l=PkHyCAzS zeE{ru`cV3bbie0-|DfOR>GvP=r+5yg9ZE~_^rjub`Dj`{&I4&L;(R=92>Ps<9{tWdFVuF_@0}I!|YdE!4@%zj%O#|%%;hso11mNZ+3zfpL1mVnbdy6~w#fU2@Owc?(RdZoEv+-t?1;{^2ID4gR7651m-zn`c@Eke2k2nlkno2jd=B~n%HJXWxw4$; zIUw<0A-rGsdf_L9ZzD%~_KLjE3qK(I5pu+7zRQ0nivNTh>Gz|aXnrT$e4qcTaOZnG z;$nQgB7eE?KH(f+qcJB1Gje~=vUvEFEoiTj|qzfO+)XG?jdWoZBAdwwN3{0xcz z>&4xC&;O?Ie&m_v74d&k{3qj$iQ$KZ7YOG^IGTmz$g|o1?}{j1C;m-;*(C0_mFnlC<1qW}eVZKd-6!Fn6~0gSadNyE)=K(Li2DI?_wuC?;eRH4 zg7BAxmyn0`r*p|iqkj~63!?Zka+bf`PbwkG_;ztWE$*KZ_kR`l&k8>* ze7Ep-gg+oWX|9wHIpRy+Py zYsqm`NqKD){z2hw!aIa-6Mnbw+k}5b_?^PPEqtf&9|^yo9O=79;(tWke=6=z2!BEN z4}=d0@0alVB>a%@gTmFHA=v#w{EtH03-2#SlOz5k;{PJyL&E0^PnY+JYlKe_-Y)!n z;dhcFzE>o^&x!joasP(!tA+nS_(tJ_!nX;3OZX>*k3nCbnTz{X`mYI5{8I9Z*DLvZK-_;W?oWt&zVQDbABX;2_?zVUcwZF$SMu@b zuZ8;{J97f&SS-}{597+5i1%sXdE}Gu{1HBx{2ct}f4}yB0r_OSuL$3T_pq$6{`x$4 z%R--G`rF6E9sANNBj52f!THlT@HlhKN22(4IEK5+__E`_(i`c1a}@t<6wis`gGgVv z{G(Cvt%yp`zNqj|M{yY^cG7nuD*V+^@$HLp|9w>a??mwrM{#~H$ImerN2TZYQM^6M z|G!7YZ$zknTr-5RzHc+o(Q3=O# zJt*MN+HSCRu?B09q3@->@%oyLo1tStiCBolc802r0)`s39YZg|{uda^Y>Lj;UE?zzV%)VS7D$Q<-L=mX=A8Kjq+=gPU zZ#2bdf|$BtgIc%*^~sg(ow~l1Fn86dZv1Y*M7a@t&yoYzziG-5SvOjAwD9okCU%L{ zYJ6I{A~4URq7-|6VBp= zt5>Y5S+#h{;#G^6FI-$*V~yZeGLmEINRDMAIVMWBqrq#0Bo!BpB)PaGL5YMd&tGQ* zsM@YvR=qmBI0{BAkYdzC4Ym=cY9QSD8?>T|ngo%$opC}9UeIC^S0~s=B~TtW4OmGS zFKH!cQ*lyU;#6&dQYe{iiYZ>BDVZ~p>rAxZcyY!ryppm6#TTY?$*Hq=iJ3Wb#Kg=> zAl|3~8Cmv-#V~WkVkj*hDP5%_rn)pysz=Z*F=9qaXD29zvr>~Zvgi>@Vb+MHFl)q8 zm^Evp5}Y++-OL&>Rb?Zlstnz3oCaKm9yp#gI^%fObK+Xhj(>B^jvwXh_)*SwvYz1f zon1as$(0xJ5&HL3;V1o7g4C23Grsjo=b!0`Tia{!#2YD|O z-$9m-SWtD;~Mzi%0A%i;MLOVyXLzgjdw1HT<)g`w=_Y#r3vCKO%QKsf_O_4#5*fNyyz(7miep%@y<#R@2mvzmL-U{ zjIEkASjK0Ax-hM!jIYzQnaww4bzwZuHlAlENXBf_Lds3UDChH5XBa7}S(Nzv??qTNtjqWzQjaV2K0~Ya29=YVnnhR7 zU$w;XV&vQ-^Er;lck)A1)jUA@qj<*{d3Ed8w}-Y+ex$r)nfJhPd77&@;2mk=%WJRO zv@t|ww2|^|WZ}RRX|R5P@1->U^PF+?xbj-+>Q$Db<$X=$X(^WVUn0+NU|f04(0xol ziR4lL3yqPNeTMYmZ;$dHEiYZlf33({i|=tX`H)wrFXN^UPZ#AHEw2%cmga4*#zXkt z6=mYelj?}c?|Lb(S`qRsHhh>h1*j8!86{7RYbt%xbVmB-ub!_x^4ur#s>CWE-}0E$ zU9LQF(IDfbP?Z>Jhwj&oXnFbgmP=!9#YT}g0D00RBWhga@oNId?~uO8`z;{ydX!Ym zV}iVJ6OmasnDm93nY!5g_KLiK2+78c&-@M|eMvw}SBsZE?4#h+Z$$YGiads;DT2J{ zG-(%omh`E=W%0_7-{WaaBFZIwTudx-jg#_+|FdX%{Jx@1bomX7JOOK|>FC6NbXp-# z22hQ>$o7(r@9Q)Hb;fsD$Yb8K-SmlzhVcBdf}_({B=XE{(RIf3srJloBC3~;ZhuQf z9_LZh?2_^eAbt339%I7VAJt07v_F2|r>Rh9e8~IrXemZ^p*42!!Hqq(p6?x|V z$i}yDw!eO)Z-o1!sikgXh#hLQJkBSeG4k>uFUmx<7i^r`9I9bm;PzmD5b-?f7kQ@q z0Q%nWF1=0QH-!?IQ9!9d@dM zF3>s<>Bv`=rQlZphcAXc2t3m<1%!H1l;KoE9&9(9h9Qp_T%El+wc?3=@7!eXduO3_ z&$|n)=U(@E9z5l>c)W$S)a|z`-Wp0V*Va8Y_@LLi2Qlo_?p=?5_PWC1L2vGZPa^y~ zH_hL7YQ=Z=_Ihi6_RdXD?t2G*DcAV58XJe*uoZ9NwW<3e+q!3pmird+-Ms+Qng+f8 z2k8&%1n+t0rl*v=H?RHsYJnr<9*(cRkv5-In1e-~QO2Umo}6 z2~Vb4H~jX(FHd;Mo1Vy6^W@!D=-v+!Pm%D)uyl)IPOBudE2;Fk1$FnjzI@M{<%xeKS) zaQHrsQ_8P#viv{6=?geK*ofTneF;~ip2x}d{E_E?{W@VSPBi;9AnqUF%8mPOGAHhD zfu*iw+*3b@yu83bK300#BBauv^nvX3akyZN839~ejw5NgZKcuH@0pdI$wYDCi>C~p zJXZ1?T#v?~(wDUiSG4hFWM2qK@q4ZW*oF2()1&w$iA3y zXWkV?Z96PGOskun=?I?G&g>L&F>C|q7&RN{;+3E|Mev;ac{*RR4xGv!;Nc6jP|8fe zd~YC3+HY{GNKOgM{H?HI=99DRjL(|uF?Pn6am|uT&a*QfG4|u^%syOir2QzQ-<$ay zXd`JVspb1HuE*Bmlzjj$K09w5J?D4Qi#47~D3g*se*)O0wkifwMAThDW4BVPpIfb* zQ{$GycPKzLsZutnK?cft0Rhg#;d@{9IRLB+qQVb*j*h?xHh*sHmUrRmMvzD5w3|6# z6aK`4o1<18ud*iERNGLVnvLY%9yi5l zxhZKXfbTyMQ`&xp8g)Z=FG2y-buRJ za~^shwSL*MN89IT<|KPFvwagYU%DmzcekYRcJsJ<)i28l-*6s_&%K#u%Xw%L@@8^- z`DHm&vYDKR{o=it4eiTP8^@>UJ>!wx3>Bz6wFJ+wQ8^&<@W4uSceZEfG=U=7(~%LW z)KAj6RM+RYIfK|~I8ePXex(jnUE*Z!6vGYH!86()TZH`=WZQ;;8xH#nySmNL+U@^; z*e71S3eMohcTJd=#oec7tic?x&~&^h&cFmA%w+29n6W6dCDh!Ce~~k)n(I38g{Gxr zMpIQ|>!#3(>gm{%OId~as$O)3>!Eyl@$`;{>t|GN!@Q`L8I?`z+w0o5%~;Zox7r(9 z+pq7Kv7~kLCj99|?9O!?RLDxNHMPrM_e!Fl66B9C*LO2 zkoEyDD^JN~p%W@5IVM!E6Ka*YbmNLC3iG7q3lvS9U89YcrH+@FxMRJnGQQ1|8kx{B zxM$;^)C%E}L38Q6kb5BFoBY^eF0b#d;T_qYLO%+Pbd?4V?1;}iB-?1338$IPxk z=GR$jP9*Mo-3wUFdb_#i)=e7&&R%X!n>yj+Doz32h#lXYDVFLBe5`y9o`vmfhmYH4 zHY!q#y?xe)+W&Fe+$BgO25eLxzq&Q7G{d$$Ob`rPinXrK~MP^ahew2EMgpV#WxjVd|<5VE`rHif|cWbUb-ECN= zbIg@a!t_Ss?11ray2CU1cLM&8T=3pUBjLzu_?BnRj*POymfq`XO3XebVcU-^aCbA2OT8(Hss5=k5t)4p@P~v; zsGTuE<_UlI)SnIRKfr*r<24Qb5~_0NwIA0X`NePNht@r{;EMb2_TKcFulFDS$9@gm=ZSHo9f?mrZF6W_0d8~LW( zD3eFJ$kiPG5n(>{y@ki80XZnaHp;jdKhs3H@npd{Mi$H1#K+Ij_4 zfZ9BkBtfVI_t#LG4U915Wo$3>WJ7>-ENildzJWrjnOwBk6W1mx%vtvKLR z0E98ys&Lp%tT@I-UrddN=MW*SIBF=qIQT*<4#$WujwjNJBQTN()-tU){vwIs2n@oi zAy)X}u!?x*i#a{B*^5Yy714_0QewrCGFowTN&<46g;p$QvEnc&t%wqkgIu)YD419s z5MQ-$l6=8~WBAVqK9IslWBxJ8pP(3b^Z(>71Vdyo?&hg2?G=$n8uM2`?!%bywMf(w z3|X%MLPq6kjY0kqSqgjV%?-ky@c@IRK>7~=(bg*`X$-Po!856nZwJ8O5R$PB{*D3} zzE5M2fBP7IClG^DmE9VH+kv=;D!Vi)y}0S%Tfu?BPT&U+t{F&qjT(a$!siJu2fiQv zrUB94Ru*au27vekr1atfgMZRB=zCSLTX2V92>HOzw@&a;geQMk5NS|+mLT%1IQ1yg zAMZCJ2T_TW1v$h@{ui8xuL}+d4hnuxkfXf#`FMX5WnHE3OnL)(d(r=V!87R%q-Xl) z4MY5uAioxnKPJeJ3FMy_<5dLNY2Y@BOejwUZW-kzBqV%L8%}P(& z4B%ea;}d#j4{$ng7w}SGHxT2ZN>3Wvd}bFo)4LUjXOq&Cb_uW%{9<4&5YITJC+#9& z75Ig~d?3>W;5SSq2TAqSf)gtQ1A+i$@9|6uc)f+wiaZ{wE^BP|c(&ebG?%4#y6v5| z?b+$s4Gm;FJ-eWrY`3S!vj^-Dw39(M74(#;$Mk+gLVYL3e2X0SN~hQzB1Z>k=21OC zo`k2AycZuK$4h{j$Mhp|pUeBn;n&O~`WZPY)64^UksJkM=JD_u8lE2N1EszaGf#!@ zLv&v&39ckZMVNUa+!Kxd`}jft!+wSO6wEx0`z8E-?QA_K;ZKTx_D>AoFPwR2eC&s5 z<_b6cJJ-w8|A6?vog5vYnMd>~ax|=R-f%E{7oh$EGcV{6c{-do@-fMQa;~^;zz{)N5%gy#r;n4|GMzc3a4IR%KxPJ zKaU*pza;LLi97X%&{T{2K5@UE9M|2*Bh7u{|6%b@{l%1bQ2hT${AUaQ3pwUc^a|(4 z9O|bq^HN5U<3VWVm5e4wCt&7qZLuBwBwEw=vm0_ zba166Atuo=lH6IqW?J9>$TIY(FF0`)&X2T`JS>r%1^qX!7LO^6c!SR}BR$^gF}-*y zR!Z1Nle7LR!NNT=i#(oqE zi~6~iBuwvsSJ4;_SuEkWM@n$wa%V^$an#Dp`qEUL;z0;iNyREMixx z=tUH)-21kqM`n3_)V#G$k=7EJp3iNWiVk|WyEuN`c zP4P@!^2J#5uI#b23?>!ky{^M3DaIA#0L{7{b(O)9R~NHumX%(ufxbE zPhh$WwZj4NV>n;0dEiw*nX_GoL4Bk&l!sSYtD+e1RoAO*O(L&c{X>B~{PC7o zBZ_y-nbu*viFXv5&&k98U*!Er+p2SXc?s5GP;VoRs$k${eDQ(lNBSg+xbhOM!+2ce zX(@O=6?ujOjrVIBBX8gg=}WW@BTL@j-o*PK&6E7&2r~$IyYyw;^d(w{ zk&Jgxnp1dxrg`LCjbZ1w@)E7XcuVG~S4rXTE6|d9=Boe2BvJCz3s=H*1eNFL@TOW$ zpC2VaJ3HsFdFz}i9W!rzjmUdd(&xXx392q45(gWRhi{Pa*G(*y^6C{a!xyS?LW_EI zSv9zAq{g&|Gp$ST2edzv-$T+bXxrGlhp!`uw{9X|AGihmrJk>Q|&`XLSUVS87 z=g=D^uPrKlNNbcly)HqmBYH;l8R$zlsED^hi=^e%1HTD6zTf)qkg5%Bl0^Po>@Ul z;m)xoI@#(M6Vq%Fne&UH{ZX zYjtEev+hIJv#DECXB88yQu=58zj2=RR#%)hFgP=E?F;MrO{DQRSU+-Sz8jxTi*-*b znYsV+Mg>AeZeE9eoUEBX6>6PvkQ@r!Z+VNh~C@j3!YqPV-471-1CcY?=M6j zumF9*{C%fezpvI-alcRfK;V}tJ`2$CEAvsDZS90Bz4mFUtvu0v2Tw3|3!V^ILxT7B zI>=J)-XgHu@LFN>b6?UdFncOzA@GS}d5+>_UuxS%g#2&7dY8|@CD{>WS0y`w?3KQ? z6m#jD47|!p`75!+R@4aC3p*OS^_MuiX?g@KToh))Ae~fM>v`X(X$0Fd8(`12Z6o6l z1;N;@oUt%+qGp>!ZKRNSwi=u^0*+}p5Yz@&H&FwycMIw-^p*M<_(*#eCx0?lWj%}w zE)vPuhl^k1NM4SmDm`@eVpZ0ixZr0luU?gv^*pZmc{p_dr)*9NvHkp;@m(BA8KVvW zQv50W@MX`pSsS)V+Hog|Ik0wKu%^d<$CZ=cX!!_GP%B1wnBe>?$rId8!&zt#-p&5!EGodmS5)hq}hvt{J#4LvSC~c5#nDWskL8 z+&_>h^y#%-jAbdQUfY#=8LmfH;54cNEU-7&Go-w{Y!~EAGt*aqMRF z?Y)u>iXZv%S?6{&E9^>y%zucHeVC1-jr8A0*KR;h!5uosKT5iq&1FIrywI$LJT^`Qy?gxOWsUd%KQ;rm|eZ(Et6B% zn1j?jRH`QvZ?T$=BehZk5IKr1B01?S7IvNWvMy)IS1MXcg*Hq=+8Qja?L$aP6151(5g%Q-uol zSRX@;{_onazu(%gf6T(P%^mGCnl{xpZ*B<9sFDBVafj8_qB9OfndM?D%<3@IyILi( zaMk8bolPwv5Sz!WK_KE`xSH<{kfM#N^%bXK(rkJOyJt({lZ< zct7Ib?@fEmGY>T16Bv1^TbJB?wpAZ-8-|f0$IHq}xm@E~)yieFYb94PfC&}K*p{;( zuFJ7%kShmv$<-dmiy0wtyqK53BWL!~?|5111eXi*o;K)siHYdAIGuLAm`gJh9;X0J zsC>Q$z+kyqfn0J1tymcW=G`F9qBJ9DSOE_yT_5el5fB?hh3|Fxjf}saRw(%sUUL8mq8j%_oaaq z-|c9cU8~)4$rlG2_~MHx%|X}ds9X-XR>$S?q-*7uyt>7((iB6vQw%Ft%O(FA(ICbi zx!mho9hA#{*J?m62VE=k0md!mm8O*aQrZw-D3?X9)jYXeg!#p`f9((G?i;}C)-F>W!}_nqOEruGkoTbjxq47W7ZeJb2Cy24fLCj0ZGnv|uf^xAMsQ|$-BEltI9?wXT$ zQ}sjPmeG~3A~GeNF14vFO#>(ow=_+lGThQM0#i|1rcQ}-HZT2doo_IicI$kDNr@3< zTN@k+aMz86^(U9?$zaD{4(@ z{HT^~+|=40THd-zzpY_6o{q#3Ma;p9T0s2YT@4&3c_v?OsjZX6o{o}&fB2%{I@zuW zYf(Gvpvkep>V#FO(^4N{al(!{R#St!cvRWrV>Ikr+bv86vuczY2df6V1*wmsHO^8@ z>?{PO5)|96oK*y@63baoUEc`xeew#7w_mqt)GV<$h1jBIy>ytRw23QMJh~F$6|dJ^ zYRr~ckKKr! zgcZwSw{lo=n%rEsZ?xK=YY&But1WfSn?qbH-l;~q*i-h&WA>=vDZ$m!B{v8*3YwlZ zx?82JaKn)_nrQg}>HP}@O9jm%AUZzttkKfk^FfiHNS=8BnWxNqm2ciS%wy1mPm~^{ z%#R}*$7mewxHqA(!D_7QScsdesufK))Q&n(+mgYVH>9B*!m;RmORLri6F$AzxzD9j zP?IuD({OIVv*^UoqnIdHLz&}zwCsk^*11-gz1Yp~&^`BDG%?JQ-ntFA_=e4O&9t}z zdi_>xP%UpRQr^+pyd_lK7Q(h_%^zd~!(N^twlr*%Hdi+}t4-%$IWszSG1rPSG1cUY zj=Z@cBIXuMbg!AaKk`;*@H5?fCS=$>6zA59*J+@x|6ec_*3yMn>Zy$HDLe7TMJRx; z{)KXo|E(q;0eN5j-);iPfb?{6vqHBsT+_22a`EQA3 zhHw39ehtGKf1FdpYwKS_q2B-4{jtG=OU9i4!nIF4@ap2xKS;azTPeTz#j!h{UX{7^ z!or8C2jHT2bE+qJ@A*X97botYT)5=RlOKKIN7qiiFKG~RPU2uCW#b6oD8f;JqY6hY zjy4=!IJ$B4;5dMz7e_yiqdKV7K^ZXWGbvDiEyn)Q$PBz$UU^LOu|-~pgXZJH4>Hp* z6UD#b55O+mKfkSzpX3R~=mjtXY1>5JmEx{GXTqQHuRaTd8~^HyEV%K%K*F2+)Co8F zxlg#skEvfq$0J_-es}7r)M;?zmm=0D^G^9p1LZPqrjL1!Cl}sgJ8hzN*x8%K`?l9_Nyl^8Z(2s3#g-jdJL$$fO-r96HnYt-2`k`UPPRS<02d!>05zg zJ&w&dcHsCTj&I<23db=VzsK=5jtnF=fP){Dm*BVt2S3cg$@(KQk)(2?zR}Z)-`DbR z!0_`Nt@tfZtXS~03cyNK1N4B?iXZKmcNl((r4_#kO2A>U;^)=^<;mjLclzR|cnQc4 z=(OUuVF}0&%(UXyX7ME}v(+bg@x>42^uSuW8`4;+zCYM6ZbFw@LBE z&&Tw|Z^@F!0}_xQ`6VE~Gtw8onu^sPiIJZ+#i~MlRlrHC5Js6DIKwtcr~|a8VIKzr z0g+~x&_wQg&){zESM~8Wj(jr&o=E<2k)J62X1tO8)46f-w-lv=884TX3QiKt1V$YglIyiPr90H;*s^s4gV36x{RXTx}z@8(Lz~B+FXP-p({XnLJBi2mE zPO;xE*e19Z_%Zlj1H1_SS8ELNqbTJR01IIs&={Nq#FW&^e2u{*;054pWWeBQw50RF zc_#vc$AJalgBpWe9DW}7fW{zaj!XsT9Rds<22KG#q%pV`7yzeE5nyl!5cOTTU1P8d zm=Aul#$YFK6L_1(Am`yu25;0DYyh4EUaK*<7Kk=lxkh7fDUkWD0Ah|;+qAljz`86Tfpz#w}Qrk5X+fWZNc zmAoIx`+*GC2gJKy0}$^* zm9-j!YsJ0_m=60&jlo4?Uk=1`ud-BQut@CDCY3%Av@K!~b*Sq>WAHOcs^j#1N-$rL zf8$XEKG9d?dkXEAJQ?*wdp5S)Dn+4|x77Jzz-YN0? z60edB|GZ$IASbub{sF=J1wSMBDZyI=Zxn16PY9~XMBqOc{v*Nf3O*vJrZd4`kMLcB)Zt8dw+n6+WIs>)s{}bGid<=h2VN}v zT)}aI>4Hgun9r)haf%hg|4i`5f=>%RE_gtY{W<;LFZek@>Vu#?-!Oqd4nMP zd-9cn%LFeMzglpaAgA-;=es~~vLN5XY0r72#6dy! z*W}+3n7r`-9POMiYrfa2w_qHy0=O6a1Hc|2%2?_5L7Ymz4<=YE{XR>8U2tCv zWO^3?ncfA!M&Nv4EwBQ(28cRR`h9{x$WnTJ;AUM0UJjfKWcu;!QF@VJml*(`4a^6k zZk0ZxSwKHHo~fAtrLQOeY!`nwioY%5Z?pL81nxy;qAg|eJ){=c4O|Xv1g;0x0_%Zm zfOs#+Tq^bzz^lR8Zty;kSqQ8H27qXjnfXBEUFlQ8Kcq|+Y7KB0>ADtp5||4d00P4z0q_q2_X4wlJ-`nFcLA>fb_273JAi9|T|lOH zD-eaG>V^Ir!LI_=0!IPi*IEs%0=En|tQD*f37@_Gvjr+K}l<@3DW%Bs~~Z*4=P z$Fsw}%l3G7*}HMxYwySTkbT(pdXLzB_EE57_5jp9owj#C!P9BG3ksfgc<%CaV|x9r zq`gUA?@sS7?{2Txd%%0pdk8q>J>fkG>`L06v?B?UlXk<`-lY9W2Y`o@dXtU-2a;Y) zx+~f1-IKgG`2g@x^5Nt@;6U<=$wR>5)D%Cv_#Kc(y0+!1eR?)}K>< zBK239_2ZnA&Jhi>Ui%_)yki;8=Mwc-nf2GR$k7PQ`svHakq)!|c|LhqdiZ~a`iRVW z;qAh!@aKr;pM|dx{)F&a;lCt@ydB!Rm4UpF?-G8Q@V&yX7k)_i-QQmRd~1Xr-bhk&i6n1-z)qb z;Rl3IMBUK+knlOedxc*uyifRM;r+rtD||pW--ju0Q20-T4+;OH@RP#%-cA3*!j=9d za4Vn-?ET{2Bkm#c42(aDJKy)IuPa~pox%gc_X{r+{;cpK;r~Gnd8xwxOWeza=c8>> z-Cu8t{rb+k|;kOFENcb1X!|LOo z#l1w_9~C}d_;bRq7XGU6I^j0%eWrh-@bSVsg%=C|nDAx7KO?+O_!ot5BgX@-BA~Kk z-5SMrl4qlS#eH`a{{cB3sAfI54~ct`#*{Muf%O7?yH3#6y8jZ<5H2gogCpCr|9x{M0mgO7s>JBV%F~;C&vp;ugE(= zJ{Hp+gr6eEi;-FXewut7WS_6)C*j`X%ZFKio=!d<-+(UE?$6nH)}a0>MBdG?rhd28 z(*73-uM!UL%H7=mH%oX^{~>VtG3Hbhe+LfX?m1EJeE$n~=Qvh4|7sNfR+PN&NAV}3 z{Qn`!y)26VHj0ZjvSrw}xrS=fV&^JNkMnK6M$MmUG1}df;-Rw<5jn9yD=Zo*T)YVb zDv=%Yo15yK=~KwW!Yfy_H*IX%RM%`KbYPnb<;kjn&X)R?Hqms4$rG;Hx-gAf1vSg7 z_4JBxJzT0tIP)jQav?Qwv||!VXRKQlCJZguwkos%6NNBqCCbC{>g8(B46%+>TNhjY zalEPZ6`ay0T09b~t&3NoG0D+WRg{LOzfHYdY@!2^b50z!Z1L2t8U0=H+#Ky&@f;mh zTk#yr5>35B%HmHo(<OllRS6sO~SaM z=g5s%FU3WPVvL>IGqRu&Yq5C5YQ!Xm5z3^vd?eQrN7q}t@+=uK-jWgHEg3Q1nIpzK z)6pCkFICXMHbQ=(hiwGcQb&hfJjtaa##=gKyrm=Nch-pUmQerSbn4BLq@O`QWCG`z zP9%vuIQ5yx19jvvA*E;XS*q3DmCVxW?@DGl#U7~~P<5FlWlnWRx;hDtw05c?(t4ID zo=EH2@vRdis5n8K#R(!UP7rHxf@q5q#9LAk_7RWB#6I6>mMvBb9#=*QYlH0 zj+qJk&rA>x^czZ}jFb;Ohw<$b$S+MGzcfKP&eG4>k}{`URGY0)Iv%Acp_x&?bRcQ- zwX>+rjD18&kOZlig*y;h9ZSlbd)&#bQXUyUud|%AMf#rQ+&zxHO7^VS*p>8Iv9W6Z ziOMFnPPCi^bsp#TQ~t{mw8c1WO8a+Iuol!TTVB0-{_=&3Yna6qi>l+k7{?Tw786@M z+CH{;R574Zq@Kf~#oPF@`3ou+Cx}=AoL!?Zx03G5O6689Ww(q*QHonrqt*mkid)j? z_bdvyrnt1EX!gwVveM!}U{=vgIB3`6qN1|W(mx!9L9fTn!+p9cL`onykm^Ky7lYZLtA3y{eSGe3w%|@xi-Gm z-a9)x7jg#zqHGXjL@wcKKz0dN0V4#06)QG`B#_jQKoT@mtWl|@mDbqOQ%;MTTKW|& zR!V8bN;N8;a;mmyv8AWB2Nh58NLx-ti?{NBo|$*nT6^uigP!x9{=W17o%!vxpLySz zdFP$Wy3Lw-=cjnrrMpE^{aW7hHCO#7mzTn>=R8&{T!s3_IL9#UIgP=35tLM3D!ZPW zMV^SWwuwAL1Cz>Y#_}1)@zrC zd7HI2sXRWP(D~)PF5?W3NPl@}v=-v|Pbx2!UC;Z&U&Of4tZXeSYESqEV&)iPJCpf+or+VjO!NlS^@nEfoTc) zIVLz&3V;3OaR3J{s{Vl=)ACM3o}4lgqCv`=(#~a>$dk*cRRMWE=c~WI?OejlxN@9d zKu7zFJ{MPoXR~v;RL+MHBBZ{;CoSRp@aUJs&Sj@h-sTS}FO{9k?IQ1b>1?~sDzBkY zmKLgl_|M;hY4PP7K0BVqaA%{JgY%8cdg?l0F8>CsBdV#Xj7w20@_MB|mm-v^7UScs zG;CaZj6oRr+YrvVd<-ncu^S(O?*#U&z&U|yAM|kSW-f=H2XA#PIELZ)sLpRwvM^*l zUxZ=XtpV$<+VgtLUkTo{$JkTsI&x$7wG{vofeIFUH@FOIh&$RAB& zztXQShRoL;h26=wVMp)OqQ_v%(uOTd>#noa1?%908)v{4-jmAqU0-%FPX+AqTm`Rl{5A&Gc@MZ9fJyn%?PZ5lFOWT;i}_&wITT^K@t z3$_`D+PVxkV4A|?_gU+3onQL+r|oqwBYdbm={h^dT6zoQ9t{q7;8$nPd~FTm{mEWu zha|k8wRGosR>9Ce+UrWwx|ZCZ+qGnpy?HRpX!JXcI%oYFnl=%?nclU;^o6$_TH8$h zD`?Ea`VZRl92y+(#_Jc}J2+xzj64W?i0`6ZP{tx#^@pw(j10E5%hPi13lu&Rv5KCl zu_A9gkxmNSfuX`8yy$AWfM*B|>4t(P_)WPc#_8!8>qb}6# z->DnwE>idpU!M=%ro(?x;n%(%unV6lwRN7uP)FW8dxF-adBJl=Vy^Wim_K>fDIAS~ ziYXcAT7}F%G^pa!T|qa^r%~THp>dwD@4IECeOi~N%fs{GkLZWfL)N+{(1z+9<9P-f zjD6W%WIsQRbbrCYH2(AY%xxCzvf2-r^Q}MZkE(dckLW%3-n`AaA8q-LIZutPSZ^Gr zc^PSSd9>~<5BaRC$C01kZY<8bcWB4fvMLmQaO30me-PBRFDW|!oxFK`aN`p@A+IQ* zEVH7|v>+EDEpTIZJU>MXzC66@1<<&tn;XNXMiU> zK3}i?{c$ZGpz4{|XT~#fd2RnNx>2V|nA*g;eFEh+^}v2?{ETxiuQTcQ4!#-qI?idB zo*Egk`;Q!&X04m?w=+0@i*T);iEH%?*e!iZU9Y{@`ZKfKI;c)k2R&l5*z(kYzrR8! zr|sD8Nz06U%sqo`Vd{kbcUM0Od#X0{3qa2x?nAJv9E43}Id|VeIlXnwJXjA)GhBPh zY!?$}ptO;;&#T)Z3cI!@T(^b3_wZVsjDHOLG+cZ1b$*i$<{I@X z_{#pSvQs?hfn#!>c{+x zeR9|y)WxKY(-CqIjy_!MoEOxWaom2T?U8$*lX9Rt`Z%xG-8k+tdH0p(RVlYO|Fg9j z%k7PC>Xi5WWc)ZD%7%EJdxow%me1SPY(sC^SQcKpO#kXj$AK8z!958MEePk@7G4j^ z)m!+E(Zp1_vhPrT+*X z%!{-F+8A!+cKDyhVUG#k0m%3<{gLhX|09lIzs%nP(jx&InmxiW`-zNT@nrbmf{)=Z z>nZ$Y4nug@4sg1)*6^i_U{s<7W;)#e$Ox7SH(M|-kX>@P8Bo2Xg|g6>FABUJqjbKl0eFW~6+uMYVZ$U)^q?!s>rL*_>W}AKCfvJWbCKc;2JuLU_(Y9;&L0GTo4@lv$!{UlspiG6%3m zw@I*L7!HFhg{D+oK|we0A+(8oPlRuDmNEuw@3h(FY}?dWbBJN!tm#*f3E0VCuB7N! ztjNvy|2oLxAtWDAEwVVLgv56l^$@cf^c1wQe_-3T5!YeFwhkW4xIg$j|EmV8Jbs{5 zSZrmhg{%8SBa>vKleC{ox{pb5ZNg%;Uo)Ghr0q?-9VY%7yWeEy^3*xta5GLT``?-1 zpiPEtn~07fxHUTdK?YC3Q9PZ=fA$2bD{yBdXFjQCSYoblv?8=BT!i+rpHQ}iGs5&| z^G(`*Ua~NvPhsqb4z;ROdY)O_j3ejc6#61hjw2uoxh9Bir(iA@y%=Vrk@8DV!MLgi zZV*@N*}q4Xo4mTiDu8)j%S?Vh9?9QB?0zd1$x0tbiP?*p^fjB|wr!HV?MeCHxOe%!N}{@DluoMnLU~jKaJ$>db3iI#&%-L`Hv*f%F1HDvQHb zh*$Bl^uc*)FPa2g4#P~+ho}TxJgmrb6}bmw7%HZpr${bhR^(7czGBFzBL8T}VI-{( zSJ*_tnR($Bcv$!00mH(dHvWOboJ(;yOC<<$>T2kpm@2X^FO3Vzz{jmFG0J0QF061BbIXsAMx5$ptAZ$Ew%832s3dDPYPov;<||jt3=m}D%P<3Si&l~ zEEK34Kow8h0(J3M-r>Usz6M$LC&?f9Cwgm?_pkJ>P~IRFs#V@xdYhDY2)&Arh7bH4i7zP`U#7QPCHw}xcPZ}w9Phw~=`COkEAklr-(Zq{Bk-7GtHvU5;yog6ixJ)pwBN7i$J0d1A+!@pg^8+WkeUHsn?E-64=-4?cjCs5&`UJzy3 zgFI*REO6NOvrC7CFNdFJUG_zGxEg*|TJ}ggoztXMoO5`sNN+Pi`m%K+NOtjTecAdf zNS-{|`m%K|$UP+WW$TBARF^Fa_KVTVsIKgsiy~VQZ98atZ15l99oY@PbuphAIqz3p zj?`mf5>L}1Q&nfC+ILZkS6fXk6`<_QT`AonTiAqGX>M#9CYhrIJ5Hcr&(@a7K6 zoD4{d1UWf46h@5F{1Q(EeIKDLeEzs$VV=OsKYm#FC-84WlKct7!oP%nKmC)2g;~$a zKY3WXleQGv2h*M87b((_FjA2pAR#L*|6-C>@NVk!Phdt0vOW5k%WnY|S_FBW9{m)w z8}oC-K9g>ZWrc*&g8#zAcSBmV5SL3{6(Q74=f#bA6zW^lSKwuN3e_zteH%!&d7(Cn zpVAOM&AHDnoSr>3>(ZA@4%xd2z>KsQ4?S-AwOXpozW zSLMNOK8$sa8;kX8ibjowNKo2^*=_)CUm_rFzADUllBd2<<`Md`z{ zaPpiV&&RZLw?Q!_J$jJ_xrJ!z!bG~i<0+PbAjjgh9P zfHv4-hLt=0XH@arKXWT~IokJ4T*L!bColK*dsqm< zM*@W4u*YJ0$k^7pHLZ2mjTu)qaq^V0)vfE>>KY7SZZU$azrVqIeu4cvWm~TagzsDp!^xv+Xh zTU+f06Rb^mqAPmiV4wKfwhmZSboWm;iI>#2tmbY9kiD>aNyF;(&9!ZFI@iJwV>??@ z1+;nhM5w_e{|V#G<_3DZ1w_M{$dI)iZ6;`8^&B-(!x6KvdUlhV2Zhd~1*0^TVxkfZ zo@!QxK7Zj0me}EZY-=zmGA(#rWEXZK2#hLBn}&@D(k!qtu(83PB6}I-ROEZXBi3J3 z?C;zh7-0uW3xWfH!HGYPd?)zv$g#)p;1GMWH+WHCwtabJaB1XN^6K6_L){ zFTXrEB2Z;NejD~Jpp3}(0+oetULLtIv+(jOG7E#5x01Ula-4wO4sL@Ak77558&rlJ zk&a+)&S?TOlC>K}`e^ForE=jBpXiDvr-hs=Z$x(ld9gyR6Hh1AA*xa znT>OSZk}M0Ef&h8mv#!mo;Yn=&>eAEn&JLeB&2FeOx5JZ*FIxS-OX!NVyadCR4Wql zTAi3`wLjHPNoArY=@q*q%3eX6E9K)|wp3iHQ-LX?6uVK3*G+YGyjXO3iCylbO6asv z338<*@m{+l3Ia6%L_@JIVI zbV<%3GuF2`brdtY_iXAYha{*Nmvfy_f-YtN&kVsq7vtTVI+cmS!LJm8P3jY=qnLrb zJUoYMDOJY1*i61i7ge zyMfwgQezH-a!LA@880isTRI)8-FP=Ttc0SQRC!L6#m4KVN+`M+1>5bUsxsbrcwN-l zH<)oPGxCHDIn1ckCOoH0EbVdsjqF{H?8U}A+mT&oWWR*hSvp*T6J;lq_JGKA1=Slt zX50)ln<%KB!x41b9laCkWRqy(mKL8A;$6L@c1xcStR0oEUz$p zwp`MHXGF{nZLL?UMXNBav#AqCx@+~`0oqo$dc@REuv~W8+|aVRqtQ|(^_@KcxDs?> z^_BBsr+hWmd@ii6*3)8BVkTbM>Msss3<`Ax4w6=EL`Ua@8zOF+>nbp>S%Bx<# zQkNcyu#j~=ssz5v9N&Bh@GindpkiR*t$!`9u1m)bJC>(Wls}fUVpnH4qrJTqHqkp8 z>RBHM)UBX(ND=5+Oo`0_R<2*|wFAGf+L&Tr*i_eGHFUz}dWU+2Q~N2vd^Z;Bwp;BT z>sPkJdOBVK(2D9+19-)H%)V}J(4;46JLGV3HlF$0J@)5SJv#3s)*5&l>U9BHWuY>9 zU9BmSLbusjJE-!6Lh3ghX@*pxXuM`8VnWYh;w24hTiZJ3);2Y-Z)+gqEPaA~x(!RK zSq-(lz!{E3pEhx&apPYq8}=(zr8P z>KYNG;xl&ANLRKuT-nmpd3I?!VqI%}!&TTeW~Lf0XlqI?bdmHQbhqkR^XKa;!<-f* z)|-1QoU?3c_0l<22>}ag*VaPOhB;Tt<;0Wd%B6G56B5j?UQ~%@YZ;diQoUi#%GTxt zHa4NDY;AAfkX*6q#->#r3+BtU&Xc*xXMBP{)E+A(fqxZdGq>K*KC5cn_(_S{c|#Lr zdP67lDS2X_p=Al7D98A+@#7aHR{a&Vb&IN(w63XbNl1j6A2&HUcV^S-IoPr#RietK zj*jMr)G;O`mK~W*7~iMZ3FG?^t4tuwsIFc#YyOO-^A|0wfq(vG3#|nH5-dZUzp!TE zqJ=Y-F1lj=ti%|z7FAu{SGbmtJRR>4v(#;@4Y$uuU3u6X1Agqk!V7bY)hcI6i!z^p z9W-j!cHjbbSzGJ+we41oiB@Ccadbvsx3H^Edqdmx4fW&nod}unKHgN1y?q)R>aN30 z64!2ZaG;0V{OI`OlU-A+4&HA0H%|SJ*M78`CXHvDx~#Sfle>Rt|G0%1MKqDddkGa% z+0ddNEvOOJi`BN_Chd$gQBO7Gq{T8d6Ew8cbDtEgiN2xh2;#3@g{olvYL&+^4NEYd z9w%@-Y`3XpGPs9eQy^)Tpp)Yo(D3|BTMKwnF^ zEsL&3q<2Qfth(mfb_T7|K9<00H_sZqDS+(czN)avzX z8`@MBP^eZm(BjR?!ri2U_aSRlQ*(o*7Np_UXGY`P+c+QZU=y%Ip3Tj3w0Vd&PtNgA z!kCwkB7UlocYKWc#zS3J@WLICv=;|Wnc1|XTn?g=#60}XHu>1rA&l==V1Cpmmw$5k zjiqBoUKBfj%*f?8SryZ*ww8shi#kCCW1d)%pjRy%O8G@6QVu-aL$zQI)6AP*?XNoe4IBBet)>U(>byH;rUL8_V~lm zBl~o?V#klC^Bts0U%;ozg?Va2TU%=z_9ap$F(b&s%hU#W#dxei-fkSB0Y;b zdfp_aHnq&fHDqdS2Ok5c>bHT0dbOF;+SZo(c5V@-PpGM$tIaAra8r_VDMX-t2A>}% z?*?CPxa7BY)V9<$V0*iE%J+(Q-aaUq*T$*(+C9}=yQS29w%Y%kK(m(!`!T+WChRxD zl5ljK{gmf22PpVmv>y=jnbn%L({G;h$<5cT{^tjW1|P^eyz$%3U%IjMsssHiu6g^# zF~iE!zVuyd)DIuI=aAZf@2hpX*eozEXTnC_l-EZaqPmeAIGyeUczw#$NM<4p|F}M z201Yq6H}A4K))cgnotRv@#xeSrUu?juO-mS`Gc8%KoQ~KfaX2ZL-X*}B5V!-!0T~riQwkAwOyY9#F@Dz1 zaL}nKTELTJ!l_xjz;6oueTh$-opk&V#Gr2}3VM)-qf}_qH^`&I+z91JbDtUZgO3u2 z{pDO7W}-5y$-iF>Rij)Mk=34#!`tV0J>@z{_EpO1kAr*B&iLrwtb9y z(#)Co%g+~mwd)VukB0l#{C4H-Up#(t{=M9zCNd#<_qL0Au8pj?b^7>Yf2-qOH&g20 z-@-j?3d`@FJ}va6uX1l2?uo-aZ@9lr|F^?G=Ds-G59fFHExdakD&ZO&EjVt$!B0rv z!NEz(hjH|^pG`9g$vMkk#_??&`*1vioA z3n#OZ#qob(iBWfp(_4kb$$5;$`Fc_=HNguk&O(wLIU|d)I4@9GoW(>IXL^YeobN{# zX8=kpPL3jrGo>U)HCq`h&OVk{YY~O9I`Ai~r$Lg%*}B5|t+2KOB}dK$V=PV#6Y?D}a zTwB3QCg03eM-|esGsQXcT`E<$`6yMYQzhtUzDRKuM6&$Nx26Lr!p)Z*HbS!W=F>}a zig5FJWD~-Z)t{MVEZ5G2@|%wtQDly1>4fs_M8kd#Q*pmA&s#Ez>7flYK-j%Qr~?VV|#(?kZw2dV(@oqjP(F1 zXS>E&H}E3RTQtTt11X0eS%9&PK;~Z$WO-L;j4c;_rC^v5@djp#!s?IGGw4I|gL@X9amdW4iqsV|#_a6UcNsG{$;>EXOtp-vYc4 z^k$8*E?^1hjT&Q}K*s0WGRxfzWWLLQ7l6N1W2{Q}Lj?1HsvH_)A>p4+*ZQ2&7&`%^ zyd%Kjkat*P>{;M2(0rc(#%LerbBMPW7zLkS`+%{{z}vy!1Y89^&j(en}O7Klg3yVknuZ!YoYI2jn_5{ly*s{Ft~;4jq} zs{%6LN{z93K*}2h+z1Q-?*P6Z())uQ2i^?&Ft8EnI9&i3I|%#&`1^r3L63bJuk8Uc z->pFA+pRIS1;~6kSpgW^1Z2LP3b7eD4|p4}9LV%#z+%K7r7>12{3sA(0F^^D#W51t$wefruJL92M`gQjTv*dvKK#!%cf~0TbzK1giz-3G#lz@JWKB z1&0fAK^DW$Nc(Yr1JWl1j|u)p@Oi<16669e#{ZV!Hw5`yN&aTRn*`SjeoBxF#u(4^ zpXoyL{z5+QE5v-k48gzQx=TLS!4duYu<^b@{%*mq3UYxF`L_ywTCi1+ixnBp>pgL{ zAosl>&Bc#Iv%ebmE+HKh!7+j*g4~CO@q&V< zL6ANv_@bbUVTGR*n&TPxh3^&on&1{eEV5DIO@g(89~b2MZv4U%1i84HG~YXk5y21S zyygOO^8ZEf1;K{}9}?Uu$omfCuu(3Zct@mw=86od+BP8ldtc4XX=k->4gee?71p{A%E4 z;1XaLa1jt?RQpn`1zrKV5m*Ua0lXZz47dPT1)L9@2gITDnE@;ZT>&fuVjY;;$7%{N z3L0T&-CwL2@zAE+62qDWi~wUmfZE5a2la|yxJz(_V1-~*&=Nd~bnu3I1$zX$1Xl>M zTzG^Cvs^bKzY5_;1p!Kq9ay%)4s25UVJ%x8465z1Hrbo88P*oN+ujP~23fm-`|V!) zfSn#FDoziSO-v8Wo|hgtWuFG8qZ6A;1$G3|11AHg@XyV$0)bQMr_-@#Dtx^uYE=Ps9#v&gjm-He4B7GJ?VGjI9~lKpo0BoDosmP}zawnI|)Y!NZwHGGD?b zSI09?fZCL`IcrN6w#~}gpVbR|HtSH<;jBpDWag>N^uX4vZCQ3;XZG&wKwxY3HvI3* z-j$6ly|NExKMU$a_Q~u>V0ZT3Y;1UyeI(ls?8@1jgRQ!9w&Q_ zxkqwe0-nk}o%=p;OI~;0);#d@j^w=rd_S)%e^WkcC4WnPH*iP(&iq}#{rSE52Y@H@ zPvxHmZYk(4*jf+>>@Vmo2nLT994j~uYE$9nLTpu5xW5p*!efQUL2WMD0zJBmwiayz z?kw6>v>Uj;sJG|<@OaUQqLW4Gfh~pIh3SFb!UOolf%OKSLT1#>QSM-AKx5?NiJt6TAPSEnRp*!PuP15v5LT?s&uF%~=*O5m4m6CrmX`Fy&+>!6A zUix-PzfIEbAPs%G#_RkZmGB-3|BcW)h5jpPl<$z}%lC5XyIaC1lZL!rk#~iJ@00NB zB;1npw+dY$^gl}cUWxy(&ahMSqT8F@9*G)_1kgSZJ!;XN0~`=&zE7K39o8_el6c3ICDMD}?^J z#9txte@z#Q-XwID z#J^ACUrieMAC>&qO88?EuJ+-A{67nQtHh6*{wDF$CH;M*k>57S@5e%aQ|K3j{*}=G zF7&?(&9%Zz|7W2G3w=uH@j|Cddo2)pw9qR_L*FT)&vio261qd;&zJaHgl-mkhs3{9 z;;VhR@?ly)`r{87UV!VD(ENyS0T?!%X^9nC@*DU;5EL{r3Cx$@YcIxQL@qhA%$9>w5J^*Nvn5 z`{MtDFMOwu{%2qQ!+qhSee%+L`TxQfevVIGi%;HQAN@rijZLwz_gUO>iZu;u>Kd_m z7v>1L+lRS(o~2r1K|yDkPp@TC_QGncr>JiFbOR>5WAVi57S4WG!7Xl{D;uz}Sq)~} z*EPx}W|-}1=$b3F9cWAqT91j8ddrYG^VFUb+|$gNY@|x)TiJndJ=2ympk}FgnKiX- zbrUhIs=jrNWQN(Eoa*18!mDbVpf;xC)nRVo>L#p?*UK_AA4QjyBCG{jDxzyvEe$cV zqF8V@W0#9WOOmd~p$sJf^Sk`ZMleSfZG`Eln9F-z&Fb~FZJ5@J35_+_>P<}+W#Xh_ z%@Q0Xpsl%X?FNd_@<7&hXp*u_VYNVShMdBs>ejCpR8=aou-Kccwz;VuJISGuS~@(9 zf{Ku-Vr&ClDN023oJB zZi7b|)voQy(jrSVrz?}0qJW}M9lH+e+ns%zvJ6HWNK85sL^&%2w>q zS5q@zq>ZLVH=FFY5WDfSHsm7j-COFxi zUyuYl@hzAYi0g&y)8HgXA0?*(zzGK2^dNII_!AimGt8tx6`Gn^YyKUUyHcq={G$iEV;S z;gYiZ)c?P6H@H6A+1=GDSqUdP`!ppB?R&2{>^YUJ8r-d=l8Q`TrIV63kGthoGFjL( zioJ6Jim1D*-X&=QHo((-y))bdY~UqbCw>zw9m_3bd}!jZK4YA28ZXV= zIMK)Fj#Av`4!a{Jt4(a;rpm%?!BjkVpTu}U+$u^(NTIm9Nun>IQ5`!WCer|W`Dww} zuT4DM?JUV@!IPdvakoW`&*}f#25u=z=x&P`pD+4D()Lf)FPyr@?rFM2DYr#SAsO48 z>4ez7OgEow+%-jCP$y2&U3VhhSQ$QXiV2sEy{4!))APrToiI7-y0h);HE!I*OLTm- zua~>WC@kif)w5=gFFaCPzj*hLf5R|bU%xmv$%^8D!<-0fAI2V1xn8{E(s6u& z&d_}AzcSm{guxR)s*nenuYW4AU8T%c6bj$Aw#TetER2NjF34 z?{U76!mWrp^Hr1Thii$7=a;uz+Vi*4zRsj?6kPd$6X zYJsC)+&)@cM4mZyUV^+h0Y2gKTN@Ux z<(GHdr(b!omRALN(nJ`|ah=FplWJeClOpdHNm2oMUgs~n(XRn3(N?vq{t{Q-PU*i< z5pq!U<9>L&M&Wc!rk{GTNmkx%BG0tPago=Vvb=TZdd@a!=r2pLrrRx1kH{M>tdnOg zuX&!=3H-+9CJc>-^oeq+F312rOinFR6_?FBs>$Vtz;a1p^L1IIYsCGhj$d3Pxe zxn;rk;T`%P_Vnp`B+yt|exGIbQ0aQ)b?m#80bVcmH8OFm#>S-d>6-o6E5*j1DFN*5 zg8f~dvee!#r-Fe8xVOt&S(fa-QSr|4T;tdKfgHttWYAXaanvsRt5Ki(Kh?;o_}vTO zzX&$d?*G)t@}1yezTQOYGr-x?qvD-Z`+NBJl{qSVYw7an{1Jyk|J`+1r^EeE%pNV= zgXi(5xTno5lxrr+Hv@aY98mk~a2(nxS-8@{s3t0v!5PE$NEXe?w3|SbW){6*dbBWxEIF?oM}S4*=7oCk5C zw49Zou7)>vH9P~=wYZqoej`W-wsl?Sd>&*wqkRdUyaxE}be=Mgz?VKW@?Aj0E@CAp z`8ihZ!|?Z`Qjv^xd09V$M~Ulqfnw!&DuN#-S;!20$;-VOd8f3&?b>QKR-)_iffW-w zX_|Xtb^vcUnC&kFu4QQ+OVbDoyXof_dL^U}fYEMk`x^Sv7W2olvT)tcaP3*6cNf|x zZq5$oXtU4C*mss|>^s|U*}I=>M_R?jr(NcOD%6I<^Ng|Y{6sV11={F$VJ_;TNSli8 zuS`WlrvX$iE9+zM4m5_Qi@k=Xxd_T!EY(6*kjj}0hM^7q3mPwAeT!}SzXqe*$2L_p zwzf1ZsxBWhZcKaqbz}d>7>w3tj4`1KpFLZy7h7K5K^n*#L%0z=TFO)rm%CyCin6U98PCovdn9s$Zy zOEGu#iquiet-IchV!THkR)hE)FsZtnD2uzrd)Q?aOG(XH4&%ZS=ztNl!b!Encundg zMmzs*<{ndZ+7D~`ar8B*`VNfYXq$2PCcmVChN7lkYxNPmNn4C_VqfdE#Mo!LYFJ`x zhhfJ0KIJ#!V|+8L=b4if+VpLnQkyPmsCScC9A{~*cTP>q*i|tfq}%&8W~nUP!%`Hj zUTRU=^b-wAS#`8K<>gAm8ZpA@TGLWCwqQfhr%bJU6^D6~j#?O0ff+5Z8an*8y6_zy zjnUec#G0gRv5n949csv{rrlhHVBxE^MTy0{1q7=MQ0#WgvD~Q&AQz>$>lKVt)xmaO zL;Z|)^(k2^Zb5WwTLTQ^=}*#1SX^h4%NUAl+H8ih0)G~(l5sM4jk93NrmoTHSZH>q z$E3V&TZz3Ftmajyhc)%qs^;3&5Tg`y`g4Nw<3LY{1FQVb5v2-|7mWjYwBp;5Ut0VNvo<2^-+CBM5!`N ze@>;vDv#qjWUu367+qW+@Z8XJC?2}tDV4+U{xit2i_m{2;YUmpMSMIx^y%bYlroM9 zk0QqKl(9Zs!1d$HD$1so&m1?|!a=V!bNobN1z8C~jJ+6)NmxAaZA&@oL|ZU)wEw~~ z66x^N!|`MldVJKkR#{!=4*%KxujQqk9@={DmJ7aiPyUap|8V1V_fEef@@yC4@&4R{ zV>gao9EWfm#c>kHtq^9~9Heyw2kCVr;M5QXkbQ#ghZ6scCM~{?GyW4obKS2uy&5Y( zn2FE%k>2>G{N(XSR{mGs-17tWUk(niPf-`@_XG|j*DD9?1UalX6NlqucvEve!9XnX z#s*!e)sPxt)4DJ(#^snBrfOS!0iqlZ71FlO$%_ic(pC=b>(J)ThR@%>_5IR!kI+8O z(PuAtowj#qYlpUTScabOJoCcmZ5LHW0S>U17Y!H zn=HP0i=h|}7LmpAqY*gZIB-A~M-fCkM_|a}h>gh+Ub3i+BxC}zI6xw?`0h;>-^PW- zAp^4b0xo*-J)bNNjR=eVfGob9i>iF(CyS#1k|W1`$l}0|h|hwTEDpbjEDqq1#ep4R zalnTxju%Nn4q1@J@e2_T%Iky+De=z4&eQCKaPyp=DtxwxS$AHMI@~B3&&Yk>cL8E_H9@H4?1!7FOdB4VM_W?0n zP`OuQtOr;Qdb`HhR^SxS-5O(?fU_XC6Nqz1t#b#)nn9zUD;qV&AVbMvJ;1Nlty9hj z(7;%cghOW)&I({SK!>Be_=U~7>0g0Q`saeT3w}lrX;t_*LCR(P-DnwN3I2%Z2^I=U z*9o7L_{Rl*C-|b^&jg%fm}}*1>#eLS|7-8rZ?*Yr-BBl)_11|!00V%H&muG3xQRjF91T8(hH!^6P?H)T4;JU{2z^1@vbTMV0&%5qz50v1#H}j&rk2J0_X8y)wq|xck{EGvmaq~Cx z9ezd{j|ql8L>d_|SD$?7LK=NaxsM6W^OJ6s(6cpZ zZ6%G~V7`CzJmNYf^Zoi465a(K-3g&L3!Q#WT8em?Jb>20Jv`tt_j)t^J>Jb8LVzXyHvUeX?Y zA0>_a0uuiPp(&H@b)iQH%_}6q`|={|ZeX_U`=&mQKZY2StUjTd>VN#mkvzE`*S zXtmA}@#jeVZ%FtxQh$3y-p3{UXA)i~;jfT}KFd%ibp6p6ng2?OKbkc1Z;|+ONF#o) z#HalPt}`;91<{%aesryORw>TZ}!ob z`)Ik(7;)A;K6$*ZdF9I#^7$X1u>^CoQ@zcN@x65FdFN+K!M-JTFjHL!`2Onlk(%{)_i{xSU&aWJ12|CkYs|MI>@0uzT``W)EvkHefLvNQJ6 zXS{>~lxxjQ)nxOXO<0Nv@FqA}QfF3jvOs4#ZL&blPfncct1Dd3v!28$-JZ1=OBVHU zGU+zb4T<^NN$2J2IJ$u`16;MLnTe|@XU2Q{MBfzhoJA7xv8BIEHcIF-K~3`3xo}#! zDwo@7`z~A3(&(-@IdP`2TJ>czk5?^4WM{H|d~B@J@aL>#kK@d3Re%vS^A}bxoq*75* zz~R=2*$&E^^sjh?X783bhQ=eKn*Yr7bRTy9GwuG+Q63)ctb=$7Xe8q!&VM#?mQWG6 zA$W$PixF(ID5<i=OpuhH$nGn&sOm6vM%^CO~UQj*UvJ|rjRGLhFcT3rZXi@Zr9WafvH$7Qh{OyZvp zZ076o{hh8;>aP^_hjEVt=Phrt`Ni8XNJD4ZW8MY2J=RX_yFJ#_u5REO6~BHxK6zD; z=X1XH?R$RlPLa1lDt=j_ytpPg+x+4P2CeAoHCX#F_~Ua)<)xZm+${3sc4-YM^-1$} zN26b=`NiELuQaITRGd{_-}8(24cBs3NPlU(ShsH{+LzY@xVZ9;0fP;62;m&7V<0b4 zw3o9SxD$iD>?}-ct_egQRJj@lhK)Y5d;6-NVE(L)dBK<)e4BL_vgo#)xx3a~h48poy)Bun>7u)m7;a@<^B$g{0?KDcovbeVy8D}Ft?g*`m(f-&L?@hn6RN}Gk5+u<5noz+iquO zSS;adU(096B_{I#F-CSXh-YVg(xYYI z+5FU1j_o;3*&u!D~R(wp%YiLA>@`#G7M>YQG$SUH}; z@MVUDiQp?s@GtPB_h-HKD|F+8`N3d3n!2Bw+#Y@dUY4Yvn%o|?5nqvda(nO+1gCS& zWO-JmD-9e)*>=^hPVhK8()%v?K@ zUuTuSz|K4a|5PN;#B|L5NTv7#?J(_zQ^QO(UtQ%=Nm9>O4^D?adp7={1=_~$m&3@p z%kYiChbfb7;0`F$bdR{A6N!}}}v zvWI3J1Vro{7F*?!V-+%Udnh}wcH0H*HNQnj(Lp>2i|u4k&w=_WzWUhbBUXQ&p!P6+ z39ts#Q_KZ63EPM`?1(A>+ZDxcjIO9APy>~y3sveWD|jWMr}K+Rac)sw8c$?Z$igo( zlhL+q1g{mX?KLz@>}IefE`x_aXCOV?JRja=;t+cwf> z8>y`;k;to0vC|0lVru}u%h>a5byYQKmO5$giPLBkGL29DF{ZAvd1~1v)d7=w4fj4! z@^pn%&w@($ifxX%nS#7nrUln z3bRc*Zn#8ex2}#$e;-oB6{L`6GVRs2ZBm$F9lQ0LaVcrm+0FSla~^DNAA`;56QmKy z^pg--oQF#sd!s(d{z(2J6grykz4T23hgF!bFMa&<#JfelzVt0%d{j@qT>8eNz0>Q# zEH3EpcJ9n;z+ulQ7>LJXJKw$_r!Xy;lNUZG=jEHTU%NRgA0h%=i7~%$diK<;OS5PR zFsN5igc28Jq`8YS!u~}W>Apo75%0o}46`C5GjT;mmb)k};0mPvAbuWX>(i64E z5?dbELN%{Sc@<@R8cipP=UUd+(AIb!!Tk|>E36Q$RQve=)4c}h9qL`l%aMB(j%E{QJY0fmz>Q$*>KpzThSgp5oS zzV4hw%2p@J65~DYuOqxa-<|wu!+*> zL|J0IJr1kRcy~Cg1a-{w3O9kEgF42`S*Ds*r#XChg4#eRYNo3!CcjIb~*RYqK?T z(V|N1o9-BbT7$#dIzmRTgV` z`&7JZ6T)G?))R`f-dk-#Y$Z+KcT>yjGh9hfH{%UT!i)}ctHxqFzw%Jd6E!j1b4tog z98bxcTADhz6St`-vvklCr5+Y;Vb&@!t@P!##E|wIny?UTX{)E%uC?MT*|W&YTe~`z zr*hbGn#AJ6))u3ug+$(1ebks$Ybwujc1vG{?a(dt?Hl5qV3bm2!aU8R5Hs>rFV1ye zg;}+ZPEu1=lH%)|!rA{-RjW*_+VxmFh$V!z?YNXCJGho-sIq; z@7_J<{r*GeRjq4%_U@;?ynNrZ>!0}Z-n`spw>^HMwf?5Tk3BhX%Koy*_rLpt-YKu$ zF#3|-z->?eYfkx9zZlo}^~KMP`Nlm@|E>5hKhEac3D>y{!7&QQG#r&Umg8u~u@T1> z9NTg1!m%I6vp8PDaRSHtIQYIW1V0gY)!%Y9uw62(kU%&9^D1`A79Qz^5!#ZFd)Q$B|dDMZrv3$(Wl*^k3 zk|*TBzG>oM%D%-ZEbOy%tlDI2AjwBo>e|QjJolKEectr<{_yjh;X26Q|Ni9_T>Hp1 zj@vHkxt8lBe|O))yFbyGTf%ja`}RH8pX(yIZZfv^&B4;&#h+&~;7 zal~+3g@fO1Zo<)xgN9~)goFDS`;0JpIC<&-RbeGwM*#!r2HgLr-j zl3e($hLJf`E|Kd&lg00f!cyO`z~WfBB;AK-+=kGss6AAOOK-=icw zzX>z)DjX7-HAoh}Qwob;zsTZuFG_KG^9!9MM4)mUUjjEIqyuK$sT>?gO9(e3 zN~zMD;Uu|_se(Jg;pw7^aC>ni%YUMzNR@u}S;Ebj&05G$roS0f*_a~S448nMg=YJa=DnEV#X=VWnIG@dMAjU>?NsvK4UC-z zl7AA2xr~*(uLENo4<)$27(^;NU zjju*82==YdY{l3I}XHIUU^JotQW|5`+)i2^ZWwF zb^)pPPL0=Y61q$1jXMcYXxb`f%HN_+IJu=j|$o zIzi6rVEl!Ga|JIJJYO&(2vG6a?>>(9VLPEOt99d5K!#rlgx{J7oCll$tN@M&mIKRx zIMn*@Qs8LNQ6T!bT8E9im0W}=xfcQvtk!8$-Yn3RvkXW%R{<%97zK_5<^dTV0agP6 zYF}Pr73h5^G-T!M1ftA2JwWuqoKE0nz_mc?(+I?MKW7;w)5_5dk&8?XY{4IBjA z45ZvH;B;UoZ~$;E5Ys?%8i8ELzXDhUL|rI3C_BHat9HRVscIL>DF^>jU>PtESSs&5mb?34B> z#OP8>?6FmCU~6Do0Ne8hb_KARZ(x6*HxLON4jci+?SoGT?7&vFf$-MgwqOvxp5PAP z?%>|wK45R~K=2^&NbsfLQEW4OB6t$i`@yczrcflXEwml~dqey1e;{-aHUdtBPKJWP z)1mi6U1`WYZEM=Lv_N1-+D`l*NqY&rV`<0JPJrqTZ^gdn+rvHK9pOmeRN86qdcz08 z*qS(e7$Gl(kA{!odQCSTm70UYIQBo<2{3aZK1LeXPP5KwHfdaY%{rw8q;V}b>w?&? zX(zzYydKd`fLZ6WoHQEUtkYRZ8Xdx{v*CH-)n_wl+=zPFao~6z1ijQ?p%~jt=pGy+OlDO+jX$DOu|n}_<9LHEa6`x4S9z|-aZLm3mJ4r zB>ibg|F(p8N%;AwOQt^}>G|AAebh@bU?pk9<#QVy-?T{cxsL8$p_dB%q@<7FB&Rzn z;RhuA9SP5q@PTMM=2tBAB+`)2=U%!+LYwDm?u*IzQHlR$(w_GCI_WIrE9JS*NAHvL zroDP4{NE(L+P@g--w^sw495eESvSPz0@^L8;)4nt$5fc#UnRb>0{}Wh>U*|?7YMyv z=%GTZ{flw6G3$snO86)V-%2_c??qDH?Gipg!uJY&snE{~Jxl0gq;cUh>wr%9=ra<3 zk;ET}bA@&t%sQW;K6;YSUl)C@AdT{VQqngF-754=LVrf+uS)v+B>jUD{&fj|TIln!L2^ljxX2@P1xNYFj}qdUh=|xZm@}IA4yuE7q0mhq$kr38AitNeOwyf6x4{e^wXulIDJiw$kCAK~d+Udtb>MV+hHF zVmCZx%-18-ocSN}gMA-aW2Z@;U*oWIphl+$JH`=QD-z?dO`^z(4^3&TLd&GVizG%h z+yW(+>R7Xg&n(fPgf{DtLWyzO3d1;eFUNRsu)e9aOpzTnGfZ0Ml$#f7V;|$N4Wy(~ z9l1tVV{%bO#l)(NV}3KSi$Non9FqAA2h%Ed@7MR9(rjp)x{t zv}Jm+)8T3JX8$$c7$ot;@n@t8j?EkWd{wz>FVjA3gq&5b(@#A%M&b;BcqFKza&JTy zS$6Lnk1HMN@z@+zqi)#o+(TCJCtI}pQ66>OS?zvIDx0k1ugF|j{qfr7^$i!}?mDBs zzKPRl+RYw_$?Sjh;MvKF;(+7hT`B1lZeCOe^hz8RBijEkayULomyLG;y3UIsQ+wsjNfT$Y|53nqH#mMHq`Mg z<8vt82t4c3?Sp=jMN)ZdYU|XNkN*9uwu(G01<$7<&(Of6@>1FVF!ElLR7PI!S@gpc zDwU;QzYTa-qT_-tx+(HrcM$UGH7lupsqBC7BLUqrBCl88D>PUACzY4V{>L-&9%Itq zG0gZJ^vP59KWH>Nsl5&(uTmP*FE36QvM}~AQrYV$miMY|QRm2T{f+(j7(G`6-CSx| zNATKnNVXr~PLXHcKN`>1@;b*l{V%0F7T9l}WVgsO-Eb}Bd0mR~vi_3V!}y8FGfLd_ z;pC;Xhhg@Is}iNUrMz7zuUvAx>YDbzd_Y>mVEe@HM;Vp=X6o;#$lKj_{iWP*&%75K zdB=U_g>t4Ul%B>ugt9jQj{kfs6aBVIsZJ)!i)#`ikG+~n{PGTnyk#P9(+KgnkW^kO zdl*A7*iC1|yktC@&HtqGQrW|(5P5$vsV;B@iO+;6vIg5Mtie8j9Wd;6LsLtAO-b@M=DI1u~iS$ECbuybF;&b$Nbi+^>$-Sq;7ZHk7D zw%6^VoD1xAFGJ2n;NzBCG<2N3u7~_N_PTEZo4`jOFPaa;c~>;_3VU5G_^$_V+JibP z%CH#Twd4zd-YIWEzZ%i6M)X?%{c51!`5|lRVB0EM0R3v9-|^wrQq*ntb#1i<9@$KIFamQu&>b$9CR=zQA_=W`4XruRNvqJT&^eGNIxTBmWwv?T0et z#izONnLhG-b$L0)?NlG?MW13HdKq2P}ikhY;*Mc9-as2JGX$&#QE|1(26}gcZWWwd9PoJG*7MD z!*UG$qP;GPc;?!23$86H&Gd>rL4?2l9^wXP?BTgL)XIDVbGw!fwKCq|HSj2|jkG6Y z?9X66(7NO4_YOW9jHKMVbLo3$&R96AaGVsRzu4n1_xKscqfBrfa37B4IC?N2a<3r$ z9UlKykDp;Ywg_(ru>AcqXEuIt=FHB&ojJ2xkp5#He-UW%yhnx59l$4Xf5J5wj$fO3 zKf{+|+dgzlm}Cf zK7*3|8nqdip7lJz&VGq?JIZDUu48Mh;f~44IwU}@o__p zzu7}v`ml$Xa=(X|^hFO5d)h-xd(1;j=A3gQx||q2hm{S?F_+}rA5#_Pwg8T zD#^qcEKq4sbgrWT~G->lZGy}3$BHqN`*wJc~nf>;irff0q2Yc0nur{9+rr%r3YS{#WRqKg`O*BNq%JW#r|v_EnLx!Qr_Z zf+sJ?VC-#M_$O4tC%~1xZHwyQ|9}al7;Oo&OwOSSyutl z0$Kdho*u~J#DKI=*4?B+S$j!EvVK7-lJ#dzan2Q}Nq|r&>oP(llhxAzZ(4RHYiAR^ z{c`^RZywEzM8XR^h4=jL;9g9qNrQ00#d zE>@GvijN{)p!gL2gT?Idq2eL;h$goa%bTAXW-E6leG>}6S3h% zOt1NoERTticuk^6+|SJxWzRyhI{V1laeLC{yXH>{67852`Yoaq8QUQJjrEfO+P=xa zkUhU}jkDh^-qlKBf@KJvY6dx4qfQ6sqS-k=%iI?&+;-29M`y+uHRb-RtE1J#ZuGxf z&i)UxBa(VQ+*w$RITx$LVFDKe=wsBH>>FC!t{XeAp%%-?+i3(O$vFF2wxv}mj5!dj zS?|jl$*j3Eu@)4OaiY(fyKw!QmC8~FD4ccZZQ2E&gpIx6Pn0!{pILzsc5orAZ1mU# z!E(%Yvx7B(*>+&mfIwAVprSZ1v0pGFPyt3>U}8?7Y;a&=e(=+QiFTl@C@`uhP@4B6 zz~bPL1(6sccG_=8)(4K;=-4K^5#oWp1LNH%fwr~Ec=tQ3)#f>>Na>Ap#9B2(ylY+7 zM)B@+Stdt6PINR_Y@Y76I@vAe9fR&!mvvOU@4Kw1R9~ea3_Nh=J>3?UwM)FcF6)?h zEnKMSkT5D=80+i zrcY!srnsB6K==Q&WR)!ff>!<++YqDNyw04l4OQ;t1`XxOjdxw;+-$`6_pyeO;>!ME zjiQXcMg)|4KfzuU#h$@4H^3&rRE)aMT8h1iVST}4sRWVrMSgB;o4QY&#iELlqIWo! zEES(Bwp>+CpO?FJYbQ5^%OSwu5fO)+6G)Z!CQ3of+j zqS?y23t1*XWqgofM@=$cc+&LA;=~DB)!bSudMU3}-?|=_U9?KtZ>@xt7^gfmHlqpd z39oI>7>PogV8=EMK36t5#niTJ9CI}bt95JAet`C|$_^om-YSOhr_ODZYOk~-zNo|7W1n(NJTTl~psC7zrflO+^Viv9LNAku~jqYWbgb4xY3(4a7*i<}O zG(VrTpJ%d87N*+XD_D1@sR_4<|7RH98-O))!g!ht`6Nt;w2d6Eo@0xlsXUhcx9Duv z>+>efBU^G|o@Re&`uSMPJ8sWgPb^sXwaZ@k(HkS*f8nRUe3{=aSKwHSV-pSz@-TiW z4mve@2OK1Y;9v@6ag6UY4!UpS@TM_3F&>XpI*ng9?ESj0yf&TBUVPG@?aP~kQ_19t zDhYB~K9e`|WZf6xpyTs)GW!Kg!+PTr3kExs-43SZKmpS-d>}A-&WSr|pWwk8UwrSy zlb^_=O@in(v3H*P%CtRGzP|Px+A5$Og1O)R@bL|sOP?wmHO5u|nQpm+R|1)Cp2k=O5L2=$r)i8$1TuaZka|Rc zj6XzUEDwnDw~|Apz*q>#_!f}yPoi-dpD)zZ>ll#ymw-55EB`F}A1jHm@z<{6$BnlcnBnhGdAtV8!Aqn|FP?Tr_gf5>J1zWVBu~LhcwmyoA z8Y?PRR9dN`@>r~BgJO#o6&2-wU32cUJ9~CFl)nG>d4Iq6_nu_-p6i}_?zv~qoH^&r znU8}e9kU;l@%BmhZcxVKyE)_S6#jNloPm6H+=7nT0?K%sCA^q&0vCLOa6l=6E)DX-?c0ki$4d@E>Y;H@Sdvl*1~8$l`0 z%1Zr>CLJ>y6yIp`XP9&hzb;U|5R~${pp?%x>6i>qtUuFAig610Lj;ook4XYW8=D_* z(lMN0O?@s<>N|l7Pkn6bXfL~a$loD!D=2z*)%pXVW7tE)@YSGbzw>$Ff{tkhrQSx9 zj!6RD6KS-P(yn;Hq_m6oL0nU;~P^QECBl^ViQ%yR?zAtzr^x;2B+RCUS zkRz7+Y1A0O7)GS{C|gArA^(({gL+OX_v0vDPsDPMj2a<0O=usX{A^0O6R0Poygo<| z3q2_Gk3#<-^a-K-3QKveu};d5w4|)(q^#eh6NU0~DX}a=6U8r!#A?-TP=1glJ|gsx z&_4-%Rp@gBfVZI?}x;4V~XNEk~mW+@0-MZ zgz{cWoFJ67hemUOM}>YU^lhPU2z^oLGeUO?-7fS# zp?3@YiO@TRvQvxp6bmgBnlCg*=t!YyLI()ta8btREs)eL6hz?`P{d7W1jX~Cn*V+Y zD6iWQpz}d-Z6(YG#Wkzuzh4YG1$Y?fc+jDs*`OJq(82XsI$W2aAHtI$*B6xb^Z^Co zdNGQQ1BEWN{=h)cTwo7qe^A`R*nX(^2vhNqR~7Fly@y8=~MeYXWWbsp=oI1W8N)ALFj5-9`9NiMVIyxev zHF|sW4$xiEyQAAc4@Mt~J`8#+`grsS&@Jw*?p8N;s(0^m?*~2QZj5P;!KC+?$76QI zL_1fz*1Mvehg^s8yEU>kGTOO6@&JA}Ms1FYR+H4DoyVh2z`xqP-W~1S?QX+wyZab^ zH^*#&hRPa*IoCU*ojY832$_WP;QVFlVEy2=XMKaao)~S3HBNsvG1@k3oIU$hIe*<6 z*Ut8t^Vcnmab{}%x;0LHF)>dXZrVIpY> zp2@_Be*h1OJa|7Leot_Y;G=@o^A&FVJ4N4YhHJP^L-g!*>$n0n!@h z{u5$6fLi0!?;=LyZH+Vk8F32UJqX~FxzWA zoPHhK=T}=ju~$m3noM~%=j5dp`}%VA35sN!J;I!|b@p?Q&*n3M%w!8S@za{+7G@%> z6&xz6Z-!i`K;Jy%P=UTlf1v^~kF5iHu}60Yp_pmfK`3U-br6cFg&l+r^G$3FX>*4; zy12s}VMbv`>2_>YhnoG9D?{4cVUA?NYNjvw!1`eBXFhDW%#_89a@ax;3R|#}*f-6R3Bhokwnsj-jQ3!h$W2o)TlJ5tEj+OlWQSA9x^3x0H zGhfFodnI27g?=gd8;IvD=5w~thhYcv%RW4o7v}S*{M{z>=Ryl5zpawr^I$jg`<>*M zk0Q)xp3q{+Z#US@eBLejd|K!+p~;BP{ErlRz0g5Y9tA?z2z4SKET5aDeBP3B;TlS` zpM6rS7iCgTd{!g>H&QP)30@)f;=iR{OqTLv?>Xf=A-}8_cS|`Plydq|!a0teavY99 z`mB`GVkxHsQci_ZP9B7_UUWu!tQQqhPV1zco?~C0(6a1vm{X#z#8i#sBz2^$OROt0W%Y|-6 z{sW)G@RiM4YhObAE8$oHX%#`6vzSUkh-w?km@;V1eJjocCuTh*BE-MX3m07pGA1xs zGbyK3P1BbMw&Vh11?SziJdQs@RzO;@Z>x)t`LX1JRGS-m_&2z*m6$C!jpc@~&6Oo} zb@r^=MXPHo=2cXcRAOU_5c!<{Q_JfcYOAJkv;lULTU3F;qG42ZEUnp{Q?+Cq7ICPr#r_`k zA(BOi2Q$o|UJp%nI2syu^0b$#B#hLST&h0^4&vt|MNG81qv{8FK;)-ES0BTc?; zQjmFR+#W`qr_kpoRH@r)na$YHdV-40rX*BeLTj23@+{cZg~)1Hb=CEu&W2X?@)nnt z*O)u;{F~MK--w~<$Izb&tW#7U{;JVVVtCoKn!ro#-;3lM(G#*&JhN$9K2W`|m13zH zEIy^W4qJ>#nfomX7D=npVue0O!I4BxOMCL1y7JmZ<+awWE+}QYfVC!EnXWx_`u3>7 zsfWEg_%}vNE4OM<(0w65DD+Nk_Lkb0Ak_L|bfmb#cjxa=O16%(t)%BqtxoM27qY7O zgo2AF#3FmP3pRv=c5f4PgWD#0Pz$)(5c2l{=7<<(?StCll+)u?0Wf(+>Rs*9cZ!Y1k zev%hkhQkYL1^n-{JRxLo4fz_xaH;zQY!3oj>Y?^J3t2wl1^wEri`9QoiDkYbz7F`vbD-a<%fms`MAif4|A7QULN$x0>gJOw8u#`tqKrKGmL0#A$f3(c3YAOV~o ztCoa3JwXwI)2ywouP&|bDA6DZc?8D!R#8Kz926@kY3)72+DXz@$iWh680v{ROOvXr z%xeRW##V9rN-0DvIW=WDb>_o1R_LiN6NCPpc>brCkeLlm5n@=Ftg@n{j$@(aHJ|{S z)|F!aI~AxI;y>Y6moG5`abD}o3mWE>%4-Jp3*=)b$JEy4VCO)GS3SctTx?@=ib+Fg?KD33aBd8rI9i?72c( zDwfg^RPn5wv9&Vy=~Kc}u#Qv3VihH1$T(yVSrvgAjOD+gq@uE+7Gs=Y0`3+a4-^uR$rR?V_z}<-a_&v#hmKFoZ34s9K~+rB&1w;IXL=8&P*u@AMc8 zO0eBzP8D9YcoUFh0^5`hEz%6v*6Ooc>kqP?m%`j;{DKDhB`+S~@0RrV`X$l(X!c8* zy_QzLgX{MBuceTS_n|-Mjqg7H5#2ooy5Q9JEYcP-JSO(gAL5uY)i7ES zMoJMn`Lu_%pX$pO*ZU*c*ZN|}5BOHc_~_y?PF#nvTlBb$M*OP7T2D_cRtJuKJt@ZT ziT;~y^8GOLMz!Ap<5H74EFC3t=G2xi3f9rBpJ6H97iq$AwgdtX2YkGn;OiPUe9j>?Lva)#K;gE|(u{5tk^U`J(jsZws&F>eqC zoS_de4g*zq9Dok?A>s(K1APZ7z^KDJai$LI*QWrCGp(7|mW_Q1Ay+ouOt=|!8fwwwt(NM7 zk2*?G6l^xl!(P{SvGB+ zX4vQ^jJLr(4Klvjyu2q`_eIhaxNygjM*rLuU8ZQ&#|76;YdY4uo!nw?p4+?bciD!q zDnAu#A*HsDgRQGx_O5(_yu9P9a>33_Z65;m(D#?OJ;hk{g{w|_cRdY>HI4V@Q0~~O z8L947OHEmWDxm7QRVtHG`q*e6{{oV|1zeI8Cv%D*xQ(0~Fu6qeAZ;W?S zH;UA!Caqcd9)ogI<6)P3Rbi^jo7c$Hzs7~gwBG}5ZmS>YUD=CKW~9cinRr~u!Vu(( zvVVjO%H`+;T);4~>Ey^|NlhmQuX;DJc{t2F`U8HNPUb9|+;nnO;_`n2y^_ZpilHfO zI0kdv%$+E0pwg9pfOXz==OO7en>@6%5SBvl=*6gwO($PT)d^yWPgh#zYNA&tEiGQ}jT&>P661;U7A2{ogMlht zSdzlPXH)?!uk|b!(Mbvl5rT4$muj>+u_) zc)d+=f#14`>%E(%Wkai6#5{?7#5wu|bTpkTXt+(c@C}=ySignqE`yfDCyU-V`UY0A zYihf%>15K)+1}=r7%yQsPM$uj>v_kf=MQ+elheI!81+0?^v=;0&|@}0AzGg&KSg<} zI;I(ZE7S~ayJOF4*sj`CJM+NBqaQ0VrSIZqlqeM)o!U4V7D!9 z7hl|eA?|MPx~mZPUuN95aE|qK+ih{*9`DQR#CGqdzKD7Bc3XOfZE+sZ;vDvF8q7FX z+2S0u#i`Qb9P}0)@;;fyXwTZr`@|OQ5`VOH0}vtc`Jzvbevics6VEr^L^I9(s=08* zGNJT8qxt`-`58vn4^@EldQj_LJi6V$G0QvC?OicoB+exokyX7@+n>A=#j|!WIdWTj z2%J@~cvq~|q&AR;s#*iublRENoW=`s?OhOAb5A$CV_26gg~}+Lcig+;(@_+)bHv;7fbtxEo=-U5 zmR~A#XiduqS}^h8nwBe+=fIlA0rceUhpnsrRV$d1FEvSGHjsR%%+q+OY* zpWVpD@tmf%wx*NGY&@D?#c6dMMB~xalkwg{bGNKh)5%#4{k%=rk@JGIG|3QN?i23A zpkI2M%0bt7|H7Qh{bfzlOGGex63lMe6K}Q?P3J=L=t9gL_BQpWcdqhYL+=gBdl9`; zl$U$G9?etUJbFhd?{Iq4m3IQYsmeQ%-k!=kh~5O{9Z7G5^5)QclGkz*b}TWDeh%** z6d?B#-3K~JDE+(xlG5=GWce*xExcPmH;LTWpblWpm$T$7+Fj#uK9a?^DCa8Cp9PBR zmXFXLxoq(WJu%69&$8jFXz`GALX|Kc16j6Tj^h<`VtHF)^A5!Kt{pc*$*I7|CIv>j3hY%cEPr*)ioYU4V%`g%MXg!!JiJYNJhO_`Gdc2{5}0Ri zrj_UK^*sML7Lz+}``%cy_IsGIW<{K-v1w1rET!n$X?Gmkio#IJ)H?_Y@X5~+%iC>L z(TT)s+Y$%m9faEpw+n7N+-A6z#6im!qppC=XO-D>nPtElV%>&Ype^wUCD!kdn^4V)c+*)-{#X_VblNR^l}7Iebk%rQj8*!Ndy7tZ zpPR)b3UM=MS+2dsN`_qqXe3{UyuY0Zkxt*x>D;Z-c@Mh16U}tKrl2pKzP5DA1JXfd zO$}_%o=LZgDlM(U zWZt!(Tuf!S=^XcNdi5f!*w{1S%hym!Ur+(NC&rY*0;rE ztc_s8s+3tb^-^AlaJja+CR)9xE(bDz9)Dck>bMiX4kx|NN9gVD*i1skL-Z6;Frp#K zFn$?N$qjDT;%LKotCI*t-Uj68IUX37oDnquKhzMplKfu3!P`;_AOLu)$m{(WWbxR{ z!~GzBK7(`S#QYT`%Hcc?;z)Ho69GaC@))P+CHP!ED_UWn-;C=J7W*j0QX>U73YSUKm==q61Qy-e8=%(8PsCDuZ8>fBvx zN?FK=`W6!0Alc;K{wwH;*sxQq@7lN#>&PuE?vBQd$@e^SXM$p>QPL;*#%VFxF=8#vE(|SJr0l^a%V*!Bd%W zvqEzb3RhChT_Dje=kGxrPnj8Grgp{x7af9}KVw|u+@CQn+F>>ePqA5GSHIaTJi}(; zdO*YZIkg@%wdTg*g9O{SB2F{*Ykf38>l&cgSeEKRYFz*rmqhrU*_PBtH9*f0=&`XI zL$U*f0uc@5EHB3=rhzo>PG#U*0S3Mf8zOv-vU5XxcV*uvw9mOA$*fWBysn)aZVg0+ z^9CmHxtRc!Pe$1|iZW3j{3UP^OWBt|Cm^!~K4%IavIMSV3HqJ0P>kmGyJ>H~Nm%~&`l`|meDEcr!?Nf*uP#Qf|X}BCx z9KDv))+mSBVl1{nqlXLmal}g^OyC)n2)7#dm&og(6NwK@B*9@e%#w%?8a=o$fFnf` zVFKsi2JI;NbwDDVaTOvbDZWHrW=^^}%+~mpUV+f)v6zYUmPDAqttycuT(bV0d=)y8 z-hqjn=P;X2NyG;YwOasg*XB840`I9r8UhlDL46I8lT=?KvAmiGILtP1aj!sV^!S`P z86t@=fssjI6ulRa$hn~t84{RCn!~&eN+LdJ^tccu;mDLkn7}rb$mJ+xe{l^Bok*rH zktxi{2*=NHPVr#TD-aqz%9+S$NrVZ+bY@Ok0}{y#oyh3GL@slfH&{u;2aO&NGm%_L zgb7rtL}Fl?KPT6PP9)ct$QI`03J33V%t;_Ldi<4%XyOSPn>4nFg+ zKmwuB<3%P?A&D@7jmcmX9SKMzh7F>xy*`R4=cqQYLZ$L7u&MVZM>MXbhz%{vdR+wt zj!H+e!p%Y0=y8e(*Gs}olw;={MKf{B@aJw25)N^l*ZXp}kjX4^n2*x+y#k?;@M~yG z9swn((XrYS1fNd$Y!cnAbJy?S=hJy~Pe<2yG?%>VMxPVkH5q=YjqV-aEe(DaV01hl zKq9&gw_qm)FSBALC^*4_i3)Ps>faeRNx}D!+_!|C35|q_@F%x}>4}QgEaaVy&p24Y zs_PcZ-^I~&JN$gwi0bC(`kck@?&$U>_-SEOj4zco!dNqv-^1UVkD)P7K`_d3?s*hG ze;i9Nhy810M}ABfWtGYBNo8Iw+?JLU=^cT6FXGo}>8<&L?L#1&J+ zFjvBhv~MR_u?bqDkATBckHxxp34e!7-#wIx9O_6);ln61VVuV@Q6;dDXb zZ(`HUzKKnD%}yBBL$=R}ydZu;@~}8&H9NKpM)efA$O&ruonB&uz;m=vC@@e>bAx#f$>E30eDYtsvIueLU%@yTVS4Na>nyD7b)t~R}* zse8o|R+p8hVKiVm=5N+xj!d1VcZwtxr2K4+2*3YKhkMWb zpD6UUsA<;$35O#8pR>z(5MTX1K3%W~M~U*a5J_&EIkA zH;x+JIly)9x%mCiaL!Ps_iu#?q{6o zT?1)`V2kSENW^&w!Y#`97mK__DSw%>NVq`Ge%)cqh6bd6!i<`wJ~CrU0?w(^Xu!ja zd9e9f4(CL_D=D8}uvrX#)xltsHBC51H9WV&X`84#1jyb5|i}I-HWiO+-681H;_)a(otO40>dTF}@wt-92uQI*tyt~Wv z((owUG$6n(wy~y{J#Dv}UUsPc&h)Zh?Gw|RguI>$hiH0sUk52B-@w6Z zNy2MainRTL)BJ)yi{?N@xl-fH7`yC-p%x?Iq~V}h;vohLxQ5&ub0 z_J8SVX|nN@m2h8LTDV&a_oYSo8}JMbojxABzn-@7*jv>L4{W*|JC|;;@z@viu8qg8 z8?GOv$7N5;RvV8UBW}Fy>vHVJxXH$2x5FDY9(xHc!i%vUmoN4A*m!(H|H{VW3w1Ld zArUv}C!lM^zYdh|yyRQwPLqwNtc3f@TMKt<;l8q^{3%nXkM}>dk5srBeG81U*-Xl> zC2-Rk&-{`)?(H(goL_+%zYPoUq&m|uw|z0Uc^W%;a=yW}Cc|pMRx(!9oO-nvPmauJ z#RgRsnE0yZ)tK{bl@~vpcUe)^vEB;bx(m7Gb)~fxY8{c8hB@taQURU;sio4~H_6&+ zN$mnPsld0zl5any4zo}qS=SPhtRM>=#x(PC_VKuP)Y-=>#o0RhSXSBaT%UbxJRzTb zBrC}Y|4HOJZXoubr>S-wI{WCA*iGo{V_6yHenV#;n`!=MG4*u+GY#e@W@m5nTy76` z_R*MCbHAmtkBg~}n2CS(@nquI*+(obP_sPGKBBcGP{^2i8yfI38rUowp_^rMKQT_V ztSGc@vQp>U?9aRj$!j{q7nG^HlNq~$=BRvia1Wx4x+|$7H#g=pSGlQE+oXBS z3xQ$<6}Oc8a>%{_V-7c5l#T&oL4%ses5W6_(U?%lv37f`Yf{~V%$*rkQ)VU;ETTB- zhh^=HZN?F+)YWDxpiszrqFxE=d?$hnMbsIk*n^noQT1jRW&RtfKLci6_vhO$W8DLJ z2gk_`QK^lRDm3vDt~NvrB^2hiWz1=qI~R-ZSUC@Ke_~Axr4?**`86v(ED0qS?sj6R zfIt-mVQxL@41`k7(-){BpAB7zGNk00!h$u0ixIZ<4%nzNTw86Z05dh(6}DkE^Q~=t z8MY}l!Z)@?_~z6Knt}xetTrQ5;aOp($>Z^CUkJx{(`M^AAC#RSeCg*qJzwapV~~=2fYo(l z@z307YwZ`?Gv9@WB^&F?N3mPF1Un~cQlm=DN9|F@BCgoQHCAk!!)hBl;=<6kJyexk zXRwmlv7N_@Q#xo+_o(!hjlANF3b;FB zB~Pr4QBhS<&*C%hgrkg-27C>`%?z8T2e$a;y}+u8XjvE3R9CTQzo5LPq?QW21)?S*UQdsG-bIf-LS<=4D(Ifwjpep|Bhss8d&G8%BVFgQeAzo@Zp|DLqCb2#p7BmAHjVE z*9qgV&wqx(Cz#WBiWgCVEZX{d|+?8TSZj39b!djf@PpK-aEcaNKwuhg& zJQwt@yCBUNW#k$;a>@Jo9>%I`sNwQkc$6Mx^v~{}J<9MP_b}@+qpG6P$nM)eyRR`C zUXOMXFEg&oD=;QaHZJI2dV$fu%;-PA0`E!kd{j&!d{cDWA z{pDx?*@!6MPK}ZHu)jIPAxng825Ice5Nh@5@6k)OKtda8y;uFSK9E^ zHar>Fsii;F7CsGFx93VMz+a-96La} z!>!N8Lr^X}I9R6(;eQDJhvA?`LrM?d?r zdF|29ersNX^s~R3*CPGwr{*aWznRxE{p@GvHBCSJmw9c|&wgcIXp$!;rMvLX0yPdcvIpcOIMvu0Px$ zxQpPfzBzXAAGVaP*>ZAP#g02_x4+-zzsBD8_3m>{zqRe4$5WQF|L$|!&n=nd8T^XT zYe-sT%`1fmH+9ZW{@b|kZq0hHrSG~MuQ~FUyZ0`+#Q5!3#c%ewW7^yiU+n$-l7c6G zJMG(lmG#*4mwWdY-8uD7zuR#AhnHUYY2E#OUb~=QRo8!<_m_i@jW53bfeWtt=dnvK z*?m*prw>jV`p&ECSDo|zlMh8+@XHS`OgkP|@x-5Zx?YP*?s4&-H+|kV;r`FRyw!Et z%<_k}%%1mW?=ck4DY$qiK9Rutp@5^gEnYPcQ5TDED2F_`#tDxr4rdFdp62=PrM^8qo{>30yloswDg+d0F_AU@Ke=X@y)r z@Oh{qilC*eBsenh(T?@X3Ri={fqRNRHQ*Z9(yzwh0zW5TEYw(OU=Bm$kpjKcXX#%8 zIpTJd4G%Ri74&nlhvR%0zE|u~V@iRi!Y&?a&>?7!Tm)*^H1Ik}Z@buU$KOG^OZh&Dav{D>%2SOF2Da><1v!SN!tpo`r`xkn(zEP2F6E8ETIxub^sV!$raK_S z3ZEq5mOTd~zE%IelyJ+wMf^IBnkXfx|2%a-Y}&eKlX!urfIdabQ6Q;sm%v>GHxsS~t_hCAGdQsb|7yZfH&7fLO-hy;TBC5tl)SY>f=;3`?1(I6}ia3zZ~DTKwcAd7RQc#p=BCoGO@7WEu1 zODWFtkcgZVMHc6m2#bS~$x5O+3yVX6$x`Ej zL2+>28Cjf!maHyjgJX!v;;>>df-kLam+7SoPQ)NUfyJ>;ohJ)IB=INj^dS) z;J9G2IF&*oa@;Xl9HA^ye+4A#K{%1(5Mr`8b3s^q@F$B?0EER6#$<8ofv}zuyErmf zSR6%7DGnkQ)`_z|5Z^qkYua(kRKu~0c5+>@ zB66jxDS}~mg*84z_*NL{3!mT*p8@vvCr_W=KyyRHUkY~5r%s>#X_)XW2=_d5`ZUKp z`QqoTaIM4%XB)B`?kj{((8F_ADBBK#*LU~n)357cg>JHX#B_LIL__)Eb@=M0Z+mx5QT=_9Tbx!K@vmGUD0 zdf{IM{&tO@3v8uNxm1x$0sr_oGoAPG!WRo{*-h-w;t_uj$NV1Y?6;fzmxTXc;2#!! zi^2O9u%(aqeqhTE;>{B84ox5VbA&%t)7KTeD>Qw?mumWmhfBQkG=1d%h!wwmVLx;NW3Q*FWW39^6wG;3h>)R-xc6tA3L8u;z~^)@mz^FS<^>; zy712jf2ZjC1P^3gHGRbKnm*zviTBS$zkTHIhhu)*z~3tRR)Y5gu$5opM}e*U5i}(?@)z#LLk1k>6SP4)7aA-z&J6ev{z0kN9(7%RXY> z;hC@f;9KW|{NDq2FG;Y z249c=IZ@X-CO_RQTJ#->mU}Zi~NGF8onO5M#GbV=W93@c)Es1 z0x#8Y8t@bi_X8fU;jVaRW;u5P|G3<@X(u`wTMaos#NPt1*W!HvoUh@xftxkF2RK*5 z_X0O+cs1~94L1O{Xm}RVq+Qd5UV-qv(yr57%42`h*25ZJ2)tjz^MSK9{n*#Fb+m@B0nXC!c;HM8^A(Erc)-ul z_`QUm0Dg+bcLO(T>7Ry;jE{Gv)}0z3voc$UXz|_?xjzfVA~&rAweaVJ|2y#aNI5e9 zJA}U#{5FlB1$;>G69&fR122{IiHAtMF5p|&4f)Z)N3?j~M+L_F3hz72&->u(@%95B z*5bWli}!-Wd)O8a({o!7YVm$*i?>GN)!E|B0XC$3X!o_Yc-Kh0OKkB50K2q!=h)(P zm3ZGr2Ij9F{anm9wk&Sls+Hp(f%j?l{{fh5)#KPkyLJO}uLlc13f!LU#}5PR=VhCu zvl4v0e9M7PXz_||@vf72*pfIPUb^tl2R~lRH~LOn7i)GUiQLz&!1%8MpVHEO7Ff5J z`xLWW?z6>f20o~zcRTO_P0wOrJ$+6OrJm_FJz2nRP0ui3J^djPuZt~SG%y#I$Dz){ zj}d|KPDYsNeE_~*&MyET*W&H6#rvJa+iZ)6{;h!g-6(Q5fS;<_k1eJH@;zDPvTXW> z34Z|i9xXoi6K6T0kImO^vYy2W|9hv=+C!87(rL0HwQT{M+qjvt^5xLjEPtxMQ zB>Z0s-6-@9q4-A8dQ2;?B4GXeOcuG};Opg#ckkA>wRFC71ePEA9|Owi9}Y7g2f)|$ z+$;QLHhzQf7YLn(@bzPnaj6fO3?Fda<^t>2?WMr_b&IXTRk;rW|F=1QJ?98N4*bV7 z{}wJ;Xe<4TQ-2$w;mqGzeVUxLQ92Cf&30h50AsfRhnMn zOGIuU_=R$P;XzK3ThVm#L=%4L*@`MgD%CUmgSS7S~7 zOG3+p&KAlKqKx;w(4PstN9b^&Lxt|g{gv|jgx(}{o={GRW4Kf3Hr&sM?-R;BJBV=~ zRP-IR>%?yfZ4|mx=wP9^KPb6Z(H>I%C821K6>bt*BeYWJK%uEZ|BQBt@!t^oEv`@E zuY{ugP~|W-Yb*~(J*|u&^v@K6uLm@Org9_Q+|TbJfXvdaz!JC_Yr!o&`v^QgnldaiVH?j z{$rsZ3jLE%4sK;Q?%RrTJuc#334KT??%#@kuh3OOmkYg3=n|p)h(SH<3uSPUtm4 zIq;TpV}yPXiu=35hlFx$1;h6WeM;zm3ANgdM+848l;8LmZ?jO||B06i z<#PaWt(u_3PC2%q0i@$cgI3Q~SkCFS=Y(w_)j zAr#LmihrxndZ9H!D}M&oN5x7@<}>Jxp+#&sbFLb=n(L%F?W(v&^ zYR@0PZ82X~KH~-B@k{aT`E3UukAAKrLJtc)B=n%r148!;-6wRf&^sS7^4-(L%F?W(v&^Iz;F|p{YVWLVFACAv8s3lF)deZlNxrAnJTlzOVXh zVi+D!%AXHP`97eO?*|HEV2n#V+eHA^R?q?PZWg>=Fu(mWyixFC!E6U9KVR@{!P5m# z5zKav@v{YI3C<8aP_RdE55Y---GU9lCt)}B9S3Fl?Sc;rJ}7v<;Jt#|1n&~OQ}A}d zTLo_xyk2mN;6}lV1=k3kFL<`#>4K*S9xpgsaF*Z=cf9afj^y*XpL`1A-*pOl$v+87{s~a>j|=~p z@Y{udMEHk=e@OTTg?~W!`-Q(x_A-a!+8E`{$AiC8r}nZK*Mdodo;Wo z_;C&I0&dmtp=yc4)t!#jZMHM||TOvA0fg&N)poU7q2z?mA}44kUrjld}yUJvZj z@M_=_tOQctEx<=K+zfm`!;QduG`tk}aSbm9Zq;x-@J0>S05@y661ZN&^MT7WTn1dI z;n~2s8lC~1sp09ssTwW>PSNlbV3&sTflplN&;NMfBO1;HKA_=j;5`~14g9!mesYcu@j+nLAI{$)-VMz2%eg(oTY*{LocBZA2z&^bbApIx z1GfQlz7TOP@K#{XB_d7*ZUp8$BVrfuY+%koB0hraA{&_Rd^oo40rmhZ1l$VT3xM|~ z-mm(@T>v)-ZZO=1a6{lOg5%tpfpGWZp(6o~$6Mm3{!ZvOAfIXHh@W=dDt_Ahd+{?r zN5#*)o{zp5#$`Fo6u+APBz~6Po8o8LM!8IRmV2J~c}{K>KhM`w;^(>im-u;}*+0m% zSO?grNI&aGtN2-W4vU}lsz;P5!#c-rp_FHRcA=msjYW@|Pzd-Z1YW^{r-|Vk2wQ}D<%LblLE3KIt z|4WU}aqX7;&6Dh?C_#Txb4xJowRl1Kg3|dY47Hxj zg1UJHnC*=4@giNJ7t}e!%3dAJi9SQjkW-`25XYJ`9Ad`z z8DfTA9^ee|!Ym$ehFD>iaydgRYf^rg6<*E|JM^*yXNY7a8G6xzGeoWnvkc4`qFHH% zTkzlv(bXCQ{(1V=!VzbPWhEMBv4bL~(vtd$>MGpk z0%ns3N7t7$vrFfVHy8fOK)>J6^ovJ${KwGDVHuZPoHZhIn8!0b<6;D4sKB8a86z?? zJ)TQ0$uJq7*|9-ukX@+Tlvd4K^BdoN{v#euWDcH5bII_S&jg3?JQM0@$8*(e$dOW< zuBQkV7uT0BuJ^|(E-uWQUg*d4wcyc!@p+8zZa!&_yx^LLrK4odoZ9k5)ETJb3p_{S9n9d^R@)J*qqd}K z9u_pS>*$K-Lk}WjEU`M;Uns(xbL~Zk;OAoWdM`YKu`X zQUMRb4#t~}3eMLnoG!dQm`8DODT)GX$@p+!UEcy7eGqoamX|;~O6TfIP^JNPv_Xdl zIy`v4K$SJN!wwgyen?)_3O3A*UB_YQV4Q5|VA^}3L+YuP7geT82Mg6+rbnQIucx`t zp&x;H@tqg0;SzLSzJQKyht%g%VUS=$iTZG0sB%m=?Qg`t?Q1RYX8f^;Z5YD!A&cCcfk()^U!qM*s!3cSS<(1fa2l_6Q@j`T1Y>Sd1yCy z`M<(Sq8%vbWEx{q!@Vo2HK~3G^{%Z0XU#pB>=Cf{ZZu>5Iq~kc&zwWs5}#;m z@@+bdU4fg94QZz_H+UP|-X_fFFudL$QM}j#SnXo`N3`^-URib9ac|R?WYen5)b`(l z?e#jD(!^t6#;<=9#LX|03X#FV;Sf;HEu8W)1u=fn=@k06e8#}N|h zpG2ia55gDWOJfp|FO5+^k!tMFP>%d{{}q_sH?HTH(8U}rSP2#^I*Omz1q{OWq;cr( zHMl=iJd>alwHPns|o{>$NF((#jszHP%1m5pDHPIM(j7lB}t z(naKFIha{&YG*#jIf^LbH{T00l6>Z4w@xFb2?Cw@%ohDHexe*P8$n`u!Eu){zo|ch zLsPNKSbP$)r~F+U@f>2wG_lKAJeN*T{O*oU+3l}8fs8X zA%eR8a!}UU(LW(MG9n=<>YRiRm&Jd)3|mJbPz)KtDy*>;NRjxCW=+;>GJKJ83P-msP1 zMs09jn(Y3Cb9iU>Wxt6%;T()=!K!jI9QLb_$0f7!uqD*CUbzr(m||Hsb%TxWL|&0v zO!B@^V$(>>&hcyEQwJMdwwB!7h|~-&kWkfvuQV0nDaAan#3Yt8%+H@T(X$A>wCEA= zj7ZDy48*f_)x3*FWMrgeqzxZ2$TM&b7E3MjAXv#>oHo2}QPm(Ly?#MWdUff7>e8Fi zhGt}r7@1yB-B4RvZV|l4BPjihC+%$Zy0D%9z?IcK4Rz&p1vTZR6(yAgsz(QVgPE(N zhuQR^V|8;IDl6Ha4PAJ53fk;qTxCfe7Z0C&_B&OaIbA3n$F%Eas^wmTt9~#iurQ49 zg~6qm=jyA9tCeccu(bRFb>*3*+3~9KY87|&f@Q5kX>gf%^MPEwPGi|=vj>V_7S!d1 z+?X`5%vB___?cgGMRvgz24#Ka6tL_)OAf1{qi;s*a5q%iljoZ8N69*=23}jVb$hGS zHyVAxeeFX5)mq)QDs?i%oT9=jvc%g#$p@Ou_y4!y{tovw+z)VZxN)8fHyn=NAS>!T zb!L_J)Tuh{!9w~CwN;mUxI$=uzT&8ZOY87G9%Ju(_-SC=rPQJKsu|Y0k>+ZVwS#5V zNH$V@cb|-SdAArvwzB}?zkGG)I!$Un%gIeMEhOgwUa4R3Qk)=4XU5RdKIQVeSI>@QU`U>PrFGe$9F_G z9Q%n-b*W zS|cpJNl=Opx6(bq;w6iZ@516c16h2RkcfQ8Ad7DxBE>fZviL|XQV$D@Pkv%5AE+tC zr)!DG*Cw*=fD!ubBWp3HW3zevZsWXyO5x82f1}37Tu3E+k@S8RMYGC#i z;!tuWB6kh=ZNlgEaW!zGhVw*jB=}1;KHrF$&iO)dR(*C*55{!yT)GN{z6l=jYeMf8 zYRyR)E_kR=cC=Ccq{Lq**ei6Y(8WS)gjNcjDfBv_Q-$&soO&-4%JWTpp-|?F7`)dPqSOWjx3zd9*ERY&bE)iAiyriq8b? z41NYE?hEllK=H2T8VE}JQbCcX%L7XNw9Co|`MO=?Q!)9LU4Tk|8O|d%W#+MseVDU> zRii0*2JmrZl^H%A_^^fxf%j{83UHf-k&o6I(a-+P4B+V+ZUZhv#&B$7zvFJ;91ZUR zPSfz?z}DC-%I^erYvDV9ze0zTrEfd%-!$9`{HBJt0`J!F7T{lLcr)-l8r}%pq~Z0z zH5#4`%zHnMZ3kdiHt=Evjctzudw@-7Y}*Jd=fhY9Cfg1kufWmIcx?3Pr%v|la2yh! zC#uBHXNhg}_e5VQ^yNSvP#yg=e~I#&A^f#uZq@kckUiT`Jb}-fK|^x_UqvxEC+z4K z^)PIWap8V*9Y6nve||JSV|N@o@Co|gjp2Kao@oSs1`hER*=B?N<8ZK!piJAN1b$B* zCLf4BJkInzd1&Uv@$curBKIC+z_~e zC@Dqgtmo^0=lgL39<~^thi4$x$fM^hz8^DwFEo%JoA)ZCeX#Gj1Wy&_ai;Ib>(KB{ z#szU2*Ou)F)}h{zg1;YsfJWGZ$dlx8XESava*YM)2>1P%J^DPVM2CsgZ;*~~-;b#y z9c5za*xG>|;l3ZU!@d;8-zN`v+o1!+$|J}Qyl|-i`*$d;>1IsfLv#-ntp5b*kRlEG z9(Fjzj5fupP<}0%4zuM5_x+eU8ju&e4xa+(Jk$5%=_rR>$n8DPEP#_k)V-7M2uYSn zq61sV`N|{U+wT_WU^S1&b)u(j#U~XVW!!en#DU+BTcHD&h>;>X8ZR<+Dq;Dt^3qUK zUK{HB@jmEqL3Xt0XoC)^r}n(4@5iBZ?3cV`i;lg}A$ihtbo@R2AawAVZ9H`7hh8@L zCg0)r^el`wVS?MC16AHQ=(oeCQp!W+CDgZYj#A-w_6%R- zARXbpg|CK=R75`|I!sOKH%JFhN*#ji?buG}SP5wl72((gJA&K7j=zOpf_8&V*~0^r z3f~XPxtV~?WO1?V9!Db-4*Z^eHFUVZf5xT*w?4%;<8=HzeF}8UMm=qV4i^ z3-LXDAHsM^WM{%iTwIXxeNSgaprbv^7sJ9GyP${pvmf{Z?9FqlFTv{jwwg?86nkeT z@e}vTv1lITQ*?VLnC)G81v&f#E#J1k!A)TmJ}AdqAC%jf#B}e(ByW-1+n7i3c&AE$ z-_P|A_k$7UbwzvEeu@DO)+h9bsSh8}S4?Bfyc6CP|6nLmTVsCK_Cmn_QNHPz+e*;w zU4Iaw-uTYm#;p=(ReWlDk&0mE(J$M$gR(A1;79Q3%yr8Kr6$4KIMc7@6@013IWyX$ zB*Xj)u75u_qfWD;4hRwTHM||NtR$)`@ZQQK3@AwQVlYEfPsT@?ct6J(waVnDjQ4GG zoA;TnDtKi5MPBb0nm{cCyxy+@pJ8vjj~%u7_Smr7ti4I&t}f6v=aY zU0ED9kfHeArU^{S`>mEryh`Nqq5JBU!P*FjykC9PWO zH|}`^AktuOQzQa;ei41u%N#DziXe(|9D`ZQj%J`ckR{jKs%2VboyCGfeO>W7p4U`_ z-l;rW$d%DPo$0UmZ-l6t_9u$4_R4^bkqFl6u69OddGnII6W!i>o?(=t)zs~El& zyIfZ#MgJWhCKLM}JSo(L7v-2gG1xgg$rsr`A%I`@|>u}oOJ4@AUnPl?5?bdybw6%5PnkQV*N^D-$V>9krUUg zb1Vn2FiKocM{EiF1xPaPocP$A;b*0Y>mBdD3;xUL$50C+!hNp=J1O{p6)Qo(M=hAB z;4Z+mjGLrjI^b5q&V)wf>%cK%@Z*V%)-3!hEMif_COTrju>4&du|L3{hUl@~9I;#+ zN6B<|xLG8$FjkE^aWj={!dNqvi{Vei;)6y)0z#r3Nu4R&B_BVLM)FATT#<1zfH+bp zvIL%#`S2NCS!elT3N<(1%`7qqYQPtNNGknrlK_lM4J*E?O{e6;b7z7 zV3Y`YinxZR-`uj`XnPs$G6yT5gHd={I*R@g5N&aAw2vsCXGUWbUayX#{&-aJr?xsc z8cPr3rFa=Q7)31+RWu_Y+EGOFw~kwZdN?8An8XXC4X|fCVF8s4gbt(o#nf8ja8Mf; zt8^4S7NC(I83Ir9AZjRK{Z*&AhzjO89E_~aSkXTN6tH(AP=T^&9xbAR|Ao;`=x=cO z1{UG|5^0WJib{4ITNWRY5EsXRPM<8pGh(!V0F&E3S_$`o0NL2!5l(T|fTnnBKvO4u zBvpccBvqn0wkatQW!u>t+tkGx+m!4d+mvFasn#Xuz^JU)VXzX5znX)yCL}wNx9cA0 zs4Z?yz-|ds2x>8q2tCx;q#hhx?y}*%DX6C^p|;*>Q%;}EWO9ldF!wO4m`c&cK#zas z?8K7#()s8@Rtj<9s|p{{!x39CG}fK(?&H30TkIzrGB^tC7w&&8iv7g>_t@RPi~Y*k zFL^mefAvdlq1Zd?(w!GU;y2DkUETBC!!S@R-@U>8PBW-;Vlvh+b+C<89n1PqFWwR- z!GTAwI(V0x52y2ZGAht7c+PLSurh{Kq|9dXR))2wum zsNq(jJ{E5&v8uK47ZdLi^)?fF4&nxOm zxYKxPvFhbB#{Fl5&Vt55$)#p+^qzTTVWiQdiqdkU4zs>7+K)4Vjj@v_=NsjVG5)At z%@~}_&nmby>N%;quD)ST9rj7b^=w^`{y|zfwY4Qn^r&?JGNHZ>`=>9G5ny$^>@*vE z0dfHvwdTj1GXJG1BfSb>X9-3^m7ncMHkC8>RaTe%JHy$6K3o~rWbQgdFTqr|GNT@> z@_O?;;bft>jEXW2vxBd?*5vyT2gAwCkYbGGQa$3uEOj$C#psGvYB4z;!72ev-mf#P z8M)@Ek){hJu9b{cSUGj7o|w&`0oB;@eo}Rnd7_oFP>mf=h4t+WGwwB{>LsW3`%l#< zep%E->dNao2rVlwsl+E4dnB!<+k^adM5=;aKwS`K7VSYQ#~8C2kY~G)Sp|I62%DuB z$O#L|+uZ8fo3TEEzodgC%BsujCRNw7_~un%{RB-FuW570r5YJYXe&yi#9wld)XNcV zfhst2+jsqh+OucBEcE;sC6+zv@-{14aHfosDt{J@uvx<8t8x@zXD!MO!-ReIYG;;N zl6qAZP%|+Gv%G#naP1uByXphPRby3NW;THxoISIw(4G}E%u$tO@>~^%YU^sMtIFyM ztF7`F6;QA+r%+wWre(gy2r)}4>dHr<$QG2;k5UC-KZil})x7S4PE&|t4`0#?{7ob7 zgZ$q2G298bQ*bVH@+H9yh8qhv9j*+n5pD(Cy>O4hJq5Q1?kzYx=%`+=UFZqck1TxG zupj*P!|!s|fz9hZr6pBrS9>)6>E@jw9fQX!<}UG=XT)ITw8D1CAcP^V28ajs56>lmFWC z!Q=hD{I6?9F5kR#@x?t$JnW zhNX4SoqGAB$45*W`_Z%W`(4#`%X=T?e4Q2Z)+y-cH%hKeGz4xmTs|Co4=dr8!mWne z0=ENhH{3qBLvY97PQk_F#Bc)F5V+BB`EaTq1-fI=-@rrlK7e8`5_ODVM+JNbC0zAt z0q?9@T-s3#5H%dS__abMwrGJm$w?zI?!CVu7#~Q&_diw=i_NopY z$mNKAs`CoCT=c14DPYSUc2hHbD_r%w09*M}9d5u@`qn<&n?%3r>Or`LKM{MZ^i_8j z!ma#Rb&F}zS@qt;X5G4ee&T>32xI3v>tHGz^Gh38PPCQwQz!Gyw3xnSvz`W`2BpC| zYssKXMAcJXw>((P;l@-WIrZAcy3W3sE^ySvxEw?6o_*)#wEYi#PsG0Yuf`&dpH^e0 zv9B}tVYc>vw)S^cW2`aWn)^X-9<+5P_jBeLZ0_^SG1n)dHx31J9^6p4T)1oD*o}T0 z+S%S)}-B zfGmD25MBJPK^8l_CE|y|;%5(u$c}VMu~%Ipz9v%SOGJKiq10YDkz(gHS?snJDSkE~ zi{DU0ieC~G%deh2;bgJ@Q6kP47Q4}<2+bE=theXSqknw3-v>SBeT39LR-Ctl-f-(b zJbhaA6IlBV3qK2VDZ;J<^^F79#)(e{`$2@`E1EwXUh1re+lH`0P+weaKiiF9{{`Xc zdN};FiS0-`!qlxxvx#B*;66gwrJz2&7@N+pb~xwXg2QMJKkD^C*k~55rBmCNITidd zADuou4Z)$pdA-yj{KgRB6*vd@4jDN$0(-)l_uFkf!NVRbt((nLsPJVXhi@kj@ScuC z@zLYi$}tQU#-0wXoY!w*euJX^e_}1ijlzEsyic6Q16wtGSmgFWZoS6eD16K*Xk9J* zmBFh zSg~S7i-Hvu6_vKuqGF3Jwpe3Di;Xt*{I-wH!{H-SIH;xD%3(ccVU)2=Q79xdU9BHVNd zM{=6*v4*8>n#F$?&pl+v`;JiV5lOsW=oF!og!U5JUFZQk)aZY|P#JHyXT~fL{(Pa| z5PGiA&vAb+{6B;~CG-iQ!;x;fBR`7b+l-=bpk0w)ia*lHLPcxG%TGk)4-(1`OT;~d zqCOSo$4K&1g>uYJd`#jwB9wJZ{)a-}7s~JKGmqO)%;oT{Chfo%_szG58MGHXr35(%LM+nUq zIz%Yt(w%Zi^MvLK?Jbn?(Vg*;288;B`h+qabO&+e;d!a_IB*~MDF;jX{ggvWIdo@u zx-%fUVTz@?hLS@{3!1y)Lx$2XL0ILEXPBRvrko@2M|v0(<1+7FP{ifk1Il#03JM{r zKFQx9{O!Wu49ard1WNaf;@&3w^}=5#{I$ZrUHEH+zf$`|+6Y`+zrEcrWl;3-1A5ZsAvf z7g~5XaE*m`0Z+5=PT=tt-T^$q!rOrdT6imPj)k`X`z*W}_y`)bN&hC`b_;I=-fQ7D zVD52c{0{`4D&@&FqAcG$8CP(vCd)U=!YtpUx$2+X-9TpPH)emXGcorpI9j{^1yUJ0BFtf8}^9vIU@YAnto z0aWuzD-l1RbG+7zoid&iJLPkk3H>ncBVuQ|xIBn_ra52i%nuhlkIpVj(dG5kbN42P?d*|VJ51)Ft_HXBh#yBZhs2~SqeSI@0)TvT3J zfzQ?v8%0kZtERt0bAJ);UuCarJBe;WI@)YH_7>9W%cjwc3)>62lu90Fs{Nty5v?4b z*Hk7VK04{|rQsi20?)}Gex~-V^a4Y3-KF?? z;c5rQ)(>3HiR@h6Pvp`b;~J8UehhA;^g^SD1Jrpq{{FIDYQgZl_Tc$FkQT4gOv20P z_Ql&@mf>GQ-`bm#khrqZ$6|cT3q7>HjEs2u%W}T70CL_%KOAvI%ZQ^Ncmt+ta}js| zC;f3%AsrCOD@sN@{lE=+y4NWZ89I1u8S(T3DdPZQG%{*CNJl*Vz?)E(HzV3pvUCa> zAw!ZBm6v$>ftjcT&Rsq#GCImjJpI6pct-Ln<{%*aveKdY&$v2ul)*Md84Pp)dEr>W zzU1lA5KpJ>Rlay3K%>aucvR{(VB}c(UsP8@yA9X>+5;JP!t=t2yto;Gn@LB!eQv3T zo(q537!xquAf$tNLGz7Fhx(uxOSf+gWH2xJBBM5bUgGLH-Yzmmhzy8}x+E_u9kKNC z)LQ=XoZ45HcVRz# zYXuX2T%9_mg9crq+I~YGc|g%uG2~EYpGWjBHyyk!<0MLX#fy1*lSodA3AmZfy{W`wCiMXJ^Hq8zH#9b<$d z>UX$_m0H~;Diu(xOQfifTHUko5K^micZD^Ie4BS6Trm60VDlC&RVx5y=e4)0fTGgY z&ayxlX#U;K0HR+PRvgfDyBw;8vnhw#YE<#+jV*g22MS@Q2bW!=LM8@pxr&zW)@hG^ zWW~2)sxFO8c;4)Bx9HVsVb7z|bbas(3_IIzkl?x&M%1eArL}8Ft*Vw-?@4F9V;N0||YRYR^E=FcJ#j#{y4T zcl?Kh;3Ym>h?C5I$lruNuQwx*&abr0O$IIBCO6=5)PA>A|NT_+pAPJA?BeOsZ0?a{T{-gTE7em^@`ZhOiXc zN%_e9HLOfoC#8IqNnI=jwenT+HyNH^ck@zGLqalkA;d@ErgY277%xFmdU!H;hB)gY zrI$a0->lhkQhNI{7sFmnyHdW&D&?z8_C6|=R zS^OSCt$daI39$bx{Bg@)H=7xIkwR7-w*1Zbv$1#fWPA$yR0PMCzZonw<)^zRvk&Y{ zlHT%H#WIUfD_~=0yd}aFRE}?$5)Y*L!s!ovl#cMeoD*pU{HAs5+ztgMK{8D61rE zb(j>RYa*I2TGynL(PT-Dt!0vCX_-K%KSD_+J)}^R5v?zS86;}8Q2j>77O>T2vO?-I zovm1qk1o-gJK0*HrYpt|PB*Pk)7>c4Id-;;OBwukq z;Qv8tFA-A9D^P+3Vh zy~_qsXt^fUH^ld5P3rc|)L6MKVQ@A!+V`l|eia(Ltw+M=@zW8!9l(6}+Wz?b$&;PT^7IIwbKC{Z+8Z_()|0A6PfN5pTulS0N1-{E;gGfJ**LjS)UNa# zY=rEZig{JF)gdO55T!{n|9_D#N5lU%<&CJyWk;fSOxDUcQQd%9$B)gRm1crbHHg)q zpcH|o_WOYl7bg<$c-!vMmrWGR% zb1SZ@)&Uwys^@c^zPrNz8tAPUSuwK~U2;e-=d9j>`8~{gFn@vh2TVHB-Uo&k`>g0v zW!I(Og=PN1;e1c5i{bem&bT-i!;5iM!p?4W9Ku}*`wrMIgPnfZjWP|~50PCZ<6wN8 zm!h9$>El zpFQ^A_2thzc-i0A!tX|ytuVV__QLQbnPr1-xK0ktK$s#7g_#DKJ5eKb;^i>BxV-`K zHiht#B>1RcuHdBm8vfx@?~|a$zj{3cHvaF0onB3RzY%QWQ?G8|8F{AM7=|XY+`w{< z4*bX7L7;p&V|h_F=ZfOmZ}Kc?no>~+oz&-5@p9}Mf1^Eqrf zl*4Ilu4(34n>`hT+oVzr*mYi*H+e?E!T74un}9Uh3!>P`)C` z)aaXl^u_l>VR71lEY3m5+FZU6lf`#rsY|{RlEwE!5ziVSi*HvF&@5c$d#?E6Gyr|^ zZA@5vpC^kii;@Vw=aI!XTw(EbpDfM*NFw;kM;6}#g~c~=vRDivo^SPJ@x@zYjTcsZ zh{f{7Ppu)BfP5Dvi!Y`kKC}?o^ktE2kb5Hl&5VP`jE$z zKio&y?y@F$A$UjO*4=i4opIg{^BLS&b&>H_A}3f{lQbD?I#%jFZ^H@TO#ohQ;R37$ zW#5TQxt}HBut`W;tHn>Y{IQfiLIBGD9X{bTi@)9Ay^b}UMjr8F;_rU=TP*$-f%ko2 zep|t{ftY!rJlxxD3oU=wTk_}+E!UM#Z)Fm0g3$92zEQ%HoDIzH9=JA;42EGmx!{|< zeaT1py6GX_fIQ;o{k~9HOX2M#co+Q8eW%bngx)H2xX__O`3$0et|cM8PVhBCYlKz_ zWm};?PF|4~2xVI$W}iqpP-u?OY@uGEAj)4JDEck61`$-PK}4F=8bmw_)fz;)`?No` z1`*}pXL$5~6sIWL9hhoQZBoWZ%KVYSC`viR3`h#%QdGOY4Vdw*6S@`@GQ5jH(Kmb9 z?isET6zTKY;W#Z@T+f$y{MCg9sFyb<_%3%3E+T6jJ1r50WXJkG*vfrnX`^_Od5 zx^o=K^yXwkUj+Dwg3gAc$ma~;9fJ1*7Xa4^-T|Botf8}EJupRsIHyA>S75NIMo@G$Z0OA&cMN z`F;U0PA1&hA5RfJ-%n7+$_+#vI6;5BUV<_91D5?x%T66EvtF!+Wsh1T7J6S%t4*R` zGNM+2g@+JtUhqaU|B$7p!`~PqDBUU=1-f!I<(Zg3og(oup+Njw6Vy}=ouHUeAQW3sGtEI3` zipOlb*YVa#4L@tByH09SDYh|~GfQ?88jJ0Ns^^CvvsQ<@L0_@J4eK6Xjb0ONN zeW9FNiRpH{bwb-AV+8z_$UR?!j(`aOy9PvE#5pjF;l{SJ6Z9x3{J86cScX!Lin^Hq zKk{0L@X~(5oWj=$VH;z$FlOm@kRP>qFc-$)+~y$S4KDp2xWUzT^S>+y%V4sDW!WGB zET8ea`zm7@&E@cI_8Cq@s&v947sT9*gvf%JpU~RfqY_v_d)c}8PrML}8wg<>?^2Ky z7%qlMQt#Q_djVqQNz&Pf!P9-4LfJ{v6ygT33Ag4r$x9J9lH(vtx)5^VJIIa#Zud0;ZDEFAHve*D%hNCmJw@KMXL(t z3oNIwx6}+jK$&Y2)M?6iW+zz-6ad4QRJhxV`a-KAIz=vhNHxnb(#(nrKl`P0y_O-v ztYydyt!0S2SR#6%1r|(j?^2Y3j#jU>P`wOG1|{jv?pG+R|JVkwpEdsfy%^%_Sqy=% zea9QP$6S?Q2hz(5I5vU}bvJqJxEW$@EQ#2n z8p{bT#hJHulgIG=A+ZZz*hZ4_`5#+H>P;h$x6B}7Vxm&Li*mzA6LqLnhNWy0br5Q+ z=gn@cK_Ti5X2U#`;=o@lXHfamb-?W!E1DYXrc}?ZTTnf2e%)OC<~ve8HQRT|NEW+E z!bnp-VKv%u#W;MwD1oVh!JN(Ls;W6$wb9@#ICDtBkdgWL9*ZxpL(gJg%6ACdaL!Wr z-#0c(2bPi zSW;fhy|(Fp&Ofl|m}Y*rGX|y%rUvFZ7|wTYfZ@R8MHo{i9MECt&Wl4DxHuf-2#W(BvN#G77DpvysUeE0 zUWY>^vN(E@y5iV}EDmjCdW8cUvN)C$79Z7Q<>F7ob67_f2dCnT11PeXbP>-n8d)>& zC%!mtB#YxoVR5uY)(-rMcn&?u;>cB4>N}%bpYgsi<{dtEtO9`|zx9=Y)fEq!VVH~F zr0)Ust?P8)jTSyx{P9~C-_LO=e?wtGg1qprC|{?Dx!(<`S1^de42rRu;**k3%6Bic zOZ9CCO!aLE?bvJNu}$NB-fO}$9R24bJtcUT!?l6$r$c}XEKK)}g8A-A_q7(@4g3SX zNFhAm33maT^LdGP0xz-LcL4J&Z{vSE@Ff=B3e2;|jr$hhp%&f@e4>Rn0dtIK{BHz4 zf&wwP4ftIPuLpk3!s~#aw(wfuO%~1trZ8L^_8}hL%V)yydjYQ|m<$vo`$ObK+1VHV zm3Fj4zMs;ocvlVB%;87rLfc)veh4Tfb4$RjhO#e9)aVe`aa?wrjbLqz{p>C;}!eLv?M=bX&|>cPp?WxtUfZH&u@IvNCj zr1V0=dx_TEUnhpiJY<2hV{FcCvSfjE?dWZ$5ag%+cM6PCw$Z%2W*n&UNe7ttpYgxm>;Cqm6433-fa&%sLBOUBdVItF^=A~ol(Q>f_^TPc<7Lcse>hGxP{#oP=~I>15-^=0PA)!a5%k>^Sdf($l@X(Geh*A46ziIKq^QEHTo&iZ{s_G@xl zAwvR3$x!L2uc(Za(FhrNkiFh)%D{;96(u9y9Q#_xcm}?Aij3Qljx(ZUbUep?DF&y! z=WaSdVi$sPZl#s?-|^1KoC_JOmpdb5;IX6X90W2t*5{@E{TlddgA5jcx4)K&ZnlQu zd6CcCX*%3U7oz~zfeAnEJUxeIG`wFho>gujF|R_%VHzW^@OgSypZ8{TPfDNn&$NW} zd50kB)aU&i?BFdQ(NUCev*;rFygcfRJJ z@nCRuD=j$Tka9(dcpEA$xRfVA2C4kJqUbYWl?x?G3Q-xJ7Qy;5_mV+s#Y z&3GOhTXqgI$1JuS%u&fuD!pa?U~{^Onu@soJe;%W$KB(!4^`oE%#oORVWFV$+x#X5 zy-@e{t8}}85en~@g?XHzciR7nhiA*qJRGd~7WxKOFDjlcxSzj4f~yfmzFc4|?s$5J zRC(tSYgOK#qrTsS3>Db>8qj@2t}5><@TygLpN7rxZN}dc7(Hu#BW#_v;Lnr#3;y@@ zcqsb_?OK)BmCp=>$xr(;BJ=d+K2p@n^&f(V1bkjWN<1D)P_q_g@4}YoN*Nd_#Yx5@ zPA7c|{sP`EfsApmFm0LLVc~PttCd)D0q4SawG!(@Sb3(QS1Ylm^R2_12+dvQuN)vz zG_E}WahsNRA)|Rrou(J z<}!**?r^Q3K65hbZ@^C>gl}}`M?mlm$%71}e+0WX_3A)IHV_NPN&k~#Wmq+|9~{;Y zzi=gwV6f%*^Jm&ErU3HU8WAz0=Zb0OBvZE-oQ5^kkkt378JsMVgk1FBG3?HPLzYpB(p zPX~O0VYS-xqY(QFp{PCgp`DMpTz`s{!b)&h6#h(4pvl-fdjdDW-i#prZk_=3tCb(9 zJ^zSy^3|D>nT+K&LQ#9Z3HI(cGc$NP<#F{P$E*B{3tA) zSdpHrov=;-FQZTAb3uHb9?Xjh2({-wB86Yzd)$OBU+{~Z`JNX3Ee_GzpTNGXdUHq# znqU6xl%z*!K4*l!^+l^WM}MKqvNfMOhcutNgklVjFI#_p=>G)S)$l=2?xN&a%;JV7W zIG^H-p+oY|I%jZcUDN!^YC|wh4kzcoTjf`cR{uK^@xNb1+MO*@pCM77E+h0s5nsd1 zm&b|4aza=K9~||k9sP~*fBe~jI80b;Sr4X`b#cOgE(znicoP!m-+?(MNSk)>#kHf|5YcBT$zG1G z4@^&~lk1{1og1qg8pra$s#$Yt-LHl5zevhgL^WfEyqdK|y*=;fo^4VSP7e2d5%4Hm!hx`!y_dzi*apzKe z;?8+F59hORF^z!gVtU34XcoF2)aX*<1HSr_uaDU>MbXc3OK++=kIQu!bkd-ULlv*< zff41xm~Z1u6AjbBi|OZgZ+^ulHs7?F587ESq&@Q9ZK7_qck=ipg}>Rd<;1tV3o?dZ zw2kLzo%qq`KWm1+H8AU8HpA?Ic@<_q%pn*xCjgoU!)q7Dag5vG&jkN~OkCzOu)*pL z6#SQzE7nzm((7`;Z%TNB87JM1f0KXmXd?3u7T!)b{CyAz-+!5Jrj7C_!=%HO19p@g zmX-0t`7TbgoAw8>h&vf`UP+KoSDhBlZ803{g`ba@HqMEmNvXENrb9hvt|Kt|(&k(! zp7X?Y2Gosy``$_4SLZ}wO@X_<0BZ}VJ5Akcu1nyVQe1;TJ!|Hdde)pN>H~8oOcBg9 z7_I^MHVj|O+F*VP!}S4g!yJO)A_GnjoB}fnhTrIC!tfPuIm}%!KZfC38oWDvWs|z* zYz0{qEnoQgVn!BU$%Mt3AhP&ADlE=2ki~fAa}Hmt$>KY)W zHQxcr;%lL#i<3HJafU|%@@1bazWED_(=lXmj3g}15|G80Z%HcWaLD4^j<7iALl&ou zBp}CLWN{8h67h(z_|hsYPA||GCmbXor%%Y@bc?X~zDpM0^d&~VjFZJTbMeKdO%~sG zr6f41Ko(~h#8*gVJ7j|obD8!WZ;eIGpN}15zZtp4g5P5~_w+d2Z;s)f1KxC)+z*Z& z8*aP9PPc_H=fG{8?FJq1IY>UH)|1e7?`2<%YXciup77DWU49~X2jPMKUq{pSiT}mm z{ZjbPfv*-^Ko0p^fjM`MOW_{@Uv1$wI8ffL;7jMO{Gsn?<2O4K4o%sWlL2NK48u(j zdLG=5ihsJF4Xl)k5ijvz@s|rezro>BeDpDHJoG1R$omlTil6tl;E}#5^bVm&ui_6E zI#ei&g#M4{_Tw!O%(^3=eI)5Xp{yHXc^>j}tHL0P=7FLQQ)^q$!j#@LK8dKcE#Qag zP1Bv>kq>r*YE6uxOc$76SU-9T{4?H7LRnA5>p>yQyAl-fdD+L4)`KEl-da$`Qv-@( z_OeYff78T$s<@X3zgYO=gs#S(m>Q>fa4E#6#uZMjN?Y+@A{EX13I!fc(_=%zPY`=>{g>z3Rkd*=Pm8&5p^n&CnNKYPf;n;Fpv)esF zBgzE=La`~=FLA_346mGFovb&T)8}pAWQ~&fbvSIJaZ$uVw|M7qRF>oA&JCkS0xNnReHj_? z^sh%^@WqwU3;LT7E{&EEXT4n!`nX&KyJ3J1n>WMlqoQQQTW?nl8N4=#42{%(l#F=m z?I`0s6sD0eXh!^WVE#Y}k6i0=Z!W?lInM7+QO-_2WUSHFsC2|zZ}$V_;g6`B-=Coa zTK`cp;;pw^dZr%lKYOkYy`_pxLtU1P*_D;$)e9@D>l@1(D`rNnb6XD?`3SNPG8kwN zWVnH~EVMDT7Ao$Vy*-eDv5*rOrNbV8jL6$TWW+uD;wWS=?IT1+UbR~2xIsuqA5c_xWIE!mx7!67%s*cU?6|>l zFG)w-b$_oy#t``S7ibxIv((s_;jMIZyv~g;Mtr9k1sV2br>VTWau(X?oO!dg5482s zQ%8q1Z_n+azf6^1{u((X>_@fGS-jKVfH}=>$nhcQI>t#<-y90Y^Pfx z<5UDVY^9Ci!}FrrshgO{bR2+;gC6ulV|2LbNC&#Zu*+&=G1niyI#TcI?k@}r7Be03 z&hf~{y~c8=hYY5__{z9#9bZ(q`jG3*!s}&($Y>N9Q{&5stK&ZkGT2TRM&t!7tBrN6 z<6j6F?YKFbMaFcbV?G4na;xUJ>km<<2N0m$4-%zBaG$Dm)j5=%zM>;85ZVGbNJe3Nwn9ISJk0we~rm^CI%<>ei( zVQj-h$3l4CKgER56m``~8;Tq4p}r2klsv1e<&- znsB7ZN9gsr1aaB<=rF$-!k~#C1h}Ui)@9b$EQp!QomIw;s5K zo|ha7F1=kvgi}KfiR-GOLtHM{01u&4L+q1CihRMJoq%|QtGn{w>!bHK#*^`Ymf>Hu z^mO!&W+5Zv>k}rfow?VCiM)a!<}eXEmL>ONrfh3Q@UPELm@qZi& zOA!)(uDD9#ABTrf;?<%{zlsxEG5CUaU!vmd!(x5W%X`CV&qs)$w@>i#%jo7m+brzt z3;v56)%jK#_{;&j^;?M+ffyfc+f&;NV!4k-=pT zSlmx9fWKQFB1hJi9#EV|v>&xHl(qc}aLsNIrWw_?Go6?5kd~G=;l841OAvpDf-MaU zU9=em9o*KR_Qm?NmF4vHLa^mJi`U5bf+t7BcLlhuJ2G$LIy{_v6P&m?n2%`efak)? zIWJ_kazxCdab5^6L5%04dAx`$GimM5jl%-u9jMP>8s$q46Br{rvS5(4jqqe3n%2#L zEB?OXGsyF1vaP*M_uw@YFmdAw@DS!DdMer!WFE0bb~AaGkq4PzGT6lo)^Zwyfx)=Y zl$I%3gRR6|!cZ^LP1#U5!&HzqvLP1!=j=J2-=s=(8=+N6`gp z(H_cqffD};UNCqreVH}1D3xH561p9Zt6J`2<1X5>s^vjt*}JM`o3iX%)xx`HMbZ9M zEx%Qk1FKp-P?q*pE&o)OgTa>TAv+lS2L4x-?ZL((x(TUD@u#p-T2vBR=nZ#A*~VaY z_u!+yM4hZ?+WKPAc6fRA#iAV`&Zba_AR)kBra%ntg)wTt6S**hZn+`F`F*?{4!Is-}(slmfGEln|evk;S zylo1ygTe366VFGI=AWoN^-=CQ!Qho}50(Y2s%qaqHgvbI_*Ki_Jx$rn&eI|G`&(fr z@7ti6eOi%wRmQ4MW#KOIt-2sPI4N6V#VyHGbDj1=%6Ks+I4(!-3D@ORy6g;GQGWSz znSGi?9?y@$Ln=6q3E+LLgm~eV5-iroV;EXakFwXjuV6_8kRGOXBYdrRF8KJK!4Tj* z+pMAgIoLO$w^@T&!46Ign8JFL0WLqd;yHGqj}hRkEm$8`)&rCQu}=~`7o2z~c*9;L zIVHGa3oT6nyX05ETX4w%RHt6O&Sn5vmohYXL5M~%1&a=Zn4wXs zL@WecCiG*ph{qRX6-i#s}*`-uXX(k6`c}j2j?5u&U*Gyw$*lSQ(va z9YOsp{sVosybGT!h+nGK#~Ta{>_s@W?pX18)0kk(eOi>_Kg{S+5aU%O?`s$L;c=@H z_@U+hdT^}AiCOKRt)3|EQDJ?V1RfREl|gxG7n6~l*IuB4OJ&=t1uG^V2`)eJRQR5F zG}!#T(^VERm^s44WvWnGwZKG#^ToEpml+a7A6NE$x-t!SP?(j5?FDG~KilE9x#*xX zP0%YMg5D4jwB?}Bq$dz8Ly`tEq&LAd!c&ZYpDHMO+=6?2^=B9l21j84lgVJKe+Xzo zc1OtI>Icb@I%ZSw7p~1UVc1@9wTvplK9AJp5+5VS%5~cDBtDD)svO^>Wp%kF@t5b5QyC%g z32-~i_2ow53MDb!lDI@k%!-gW`*;%5jKnTV;x;yQ>DNzF5}zi=%5~S{NqhnURIcBr zW%V3O;#>H@8(cj%LgI7ac9`qgM&eycVs}g8G9|HBgv6_lC$X!M*jGt>{*+LzhbxIM zkz?h$Png8>)6GjTz69b5DFIyz#4kl~zn9ito;f6BTtpX;@DoQe5;GB10Qm(Lgkb&>{CT|>2GY6AfQiW%3d=?0 zPQu}Q18L#md`z#(kXG?Y=K7C*Fe>SRi(%upDICtn?fr2$A7{cnXLuOI!}M@s=6r;IyXgi`jiuxMCMojds$#}Zya*GmYw4TfiCeHuP25H=82E(N@vu$6E&U2h{?M_ALG zgoQJNn+WI7^H#!V22)z)SQwVw70iehC$zO7VpJAMyS1`&M;6I?^YsP@B z*R4n{ZWmu~Wf=({PR|DV+YCQ{QvNo=pLU)^=d>W5TRk4SvK4sBUWSiQy*&u`Q1jqQ zuFe;+-ddUb8v(nVz$`8$*N%0$m2fRPmG3Eu zROIrsc|4SMmy*b(WnQ;0K;eZ1KExmir{dqU$=}}9_TyY*$JviOtAmAesr)jl#^$hN8J<*@+}qY479dTZ2yW3mZX~4 zHdA_mN_a1Tpybh6`6Ql%B8uIi#Zu%QO6*NxVzb~UEED=EvV+Zym69-rLY~(`C}5`& z@^YAv0Z~Hw;Rf_PKb+4x3ZW93=MP#41$5(GT9%0x8_M80kwTn=-3<1g4#prgD%iNN zU=yQ*bwYW24(ebG@}vs3BrI4(bgR=4ASq1BdwiYUq??(mecbLJTrJ~vj!z8ez%f1yB?vdzlgHd6gBnihb z+~e6(c3W7u=cB{TW4Kfa$1wM+a4(02dn-EJ4;d~~!Z8fLIeW?yQ2C+!eHaz4zvsIs zxLh8B%O?>>2APY%VRO`n;AY-rpwjhp{I$S2zMg^fr%Zrka9BP*t=F1vpw??00QeES z`m|o_cmuUwYng$$h&v&3hJjkI)&DufQuQ|D9avBiRK3mk(Ac4R`vTZZtf=0me1e$# z=Rk_L6OM#UMzdm`9RE-t3G6I&=XJPZCjAg^* zUe19Glu@aj*yE>bjoAkQSw`tvWA+&XwZ?49j~EU2 z<;_dOLBU2y2Ae1Q_%s|8e5M3R!$HA?u+QPc2nPkTTVkh_294RNu(Nkf(;Bmv8K^a8 zt4t`ZF;XqHN%!XBIP@<<}vl20sJ4p#GmA(u&z>m0{h8V!`9nVm-$Ed zSA&K+)h^!$%wwwt^m;NswxG|GdDQak_heGqY2rEH$>i9GBO`{*_GG$`R=^zSrSmD2 zP6n(C; z&+NS`TmI_3cT>$SziA-_Ut68{YdT0dAA1;cd*TUQ5^x)5N2dkL7(?01N6~c)K@6(X zJY@)%ljh0tbVjZB2+6}OPHA?YdL=n#zvSLxMc@;(TJnjRsLVcEEjibyCHD=fCHIrG zC7tXKR{`%It^J(W)ia^X$w=$~MuYp1pCV5VDQKe==;Hs=^=O7M6`uK^F&D=a2~Ka^ zP5)MS{(81S{_oJuZfcl6c+R}a+NP@N!R7KDKYH0-%-xr<5_9a7rg@EX=2mOPXR}|e zQEHxuy};_KO0ku01@tHB35|&>N{n}`!(6yXv$6cpUEB!{?kYL3*EmP6BosfP1*+QP zfAU=E`QiB~Qp>!sy{#5LskCs8I-|H^z9buu8ocmfT-Hy%+~a!+Vt)Jy)UV*3w(oGlkS@M{t*PG_hBLAg26RpR zQ^H9|;lo4&yPE%giM@PJGWDau`U?M|2+kD{wlX)T$L@>Z-4A>?g2%b1G&BG^EGL&{ zYM$FgkyioZaV|j!b#Xq4yS&;#Ibrk-R1$dpF`(nbZo(LMk5d}Wy4bKdXY?1m~nz0Pn(BDgQe>rYTo7Lq<`90oxSI zO$Ak^7%4!q$06W$vD@w*4*Q)Fj)n#+>o*%g7|M!}f|eFqcN~ zIEQk31dmf9&qeS!!_gJvSz8{bFJ?#ZI5+V`1dkIB+{)Ju%UK1!kZkzgp1p znOHo36|@o-)Lq5RRV(Z27nRpk*FyJ2oWR7U9gXwrBKff*gmOw#Jra3M#eAG55T4r7 z>RMEA-TXM&jM9iPp(mRYA!0?yZ5ifN)XurKI^28gqU0{J*2ob-tVGRgnme<4{^VJs z=g)4Mi*pqkoLTd+z`0l-nxKPD`7hkDBUX0U;&gsHXfBmpuN*srXm9m(^Qs!A)>#>A zh&*&6R?Kr6E}Ap1YVs@jI=L;l$@g&ukO z;F3hURRxnKF+By-5L6> zia9ua#%Tnrx{*mz{jpQ7`Z=e3es!Z#9V%ysp$U4)vioK<-Aj}4CdJXISP zHDQJOi1J1hvXu~%w$Tl`Y*gRtKr|kRlj`Q_a#g}m(4lZfAv9DIqt&~ys*jL2mHp#B z8lAev8huie)6g_ib)3$;>T5z3H+K;p0(@G5g-3&~9bJTuuv{-#xbM)+T~ydKckZGI z?xROMhMq;-(y1ZZp9-wv8B>d+g^H;#a)y2Yn`U2!f-dLqsJwhuZ3POt9Mz)EN2-E# zT+_VDl16&5{JZY8b@OKDx)sACi%RiabjIS5ZUPqSC%J*;@{A8jE58QAG!6o)=HN+! zt-y?z+Bwi+sHiO;>QvS?ueD+qkP@vAZ5_b`nn}<3!B9sEZa%N~wt8LZQUI0?-SKyr^$R-ALZR&hh&cyMqpO+EmSBhmSg*ThTbOgRVPv$7r~r zcE|fl_t0Og`Rnd2qKQO|D39N|qniK7_{}@i`^ zZQxT-)bou4(O55_@J_juW#my`Io5@FH}0+EOh9|0E-^2*a zS1VrS7nEa&$fTePQRMDD%v6r`|i$d>Z(~n09w| zgSRDu2e!JGa%sWEvhts!?fZoiv8*sh>b!vPr$Z(uTVE49Ct2SSJ11AE5Jo?oR6Qzo zPNsH3{N!^IHCybQJnbuXPMV%6c21U_Cw5MfzAVr05hx4$;)#*iaI*ghXTbd}=jR`~VyL$Tf{~!cI}cv{MAqDK%hp`^ryjdJmz;QX{{x>qm@((AUu@`CxqSBd{odGB z(sHYJ(9bV8c}3II%g)(8#OJx;mN!p6_v635IkNQm>ocAh{Lz-qtFHacA4h+0*(IB2 zZJDub+xnJUhyC)89~PewxS{dcm)}29@$n~f{&{`tYroGb`PSG$?~TlQW7lc-_neS+ z??+vxp%K@>EQH}+jcZ{x!fb`v1+y2X9p(rOwajv02EuTY#qluHU}|6%!Yqeb3$qbs zE6gsKy)f-CM__!Yyd0Q;Fe6~b!%TyzfmsN%9A+)dMwqQIyI}Uhw8I>M@u8#5ff)!h z0%knSG?*F~e%V?MvleC}%vP9PFneLtl48_n31sk6OWi?tv0>p-tL#B97pzwQ0>3W) z)dFJRdj&s$K89ZNV0fu@ouK@v#Y?TW1-%b(^V)`nO8*Pw6OCH*4tze!l-B_mx_^fN zSBCh1ST}jKDwytEJjY9|wFFHOd1^5vu#x`(?tS|2BH`8IMc_Y)|36ClZ>J|*?~4C@ zlHNBZe&hc-!80ZP*TuidpITH2IX@QpGsOR4iJyxL8P!XS443{8i;que6TEH`|96V~ zzexH_{cr;ZhX1Fe_s8P@e2GsjQ--@qzgpu9Y|5`v(rfDf2NK?tUk3VIiZ=D3R?Y&O z^r-dnz>i9Le=F%T^`+D;;BLxOE!YJ%<)t)BfKC3@`e7OdN#DJ&6PxyVOypfD^`Z1O;BLxOEoTNc_4OSoAJg9SB3+b^ zly?#C1Ijn@c8h;g|6GAccXPkgio3Z#Oh3=;(7;(;3}gCv+B430Ve?&w{#wXk#%36< zrDfmFe6j3Vo-8w#JKGBL!#ZR+u&xT z#kBw7NFbj#UnY#nBa)=9$UO47WBhQz8J|;TT*YdQ+#8rYWJNvukTeHPmiuC={rvds z>jKjihR;79lhzZ4WwmY65kL3(HTwlWwRreHpY3-zRqYLo{eXEE@q?c%OXI%4+z0s1 z_kT3>JlQjtdjoSn;UUe-(~b`O$KI1BzVmF?Pm`Y<=AOdb zmzZ_N{fDO_(P7%#ASArovAxT4q_`;@V`gxMr2bgo|2MWO0GA_~KxZ zEUvW`7FU^)#bqRUpt!gYnJlhU7Fp+rcrJ|=7WKX8iwli~^$s9eb6`X~*Xxo+-4|g| z?TajGf=P^2AR&v|BqEDTXvyMwTG_al3TR|e8%=x_pt+F6Wziy@jU45tRP4aw%3yJM z9b9_821Z13(JonB6D(=rLT$3RYFlFAQe?8~L$bIQmn<&K6<=HqOBUD03X7|d$>Ne^ ziIGd+$>LIZ@x?XUWN`tvu()QOEUu3i78OLuqRxmUmC7(=Q8PwZ>^{ii+6ak}>#ND) zas=@OWbVUwdm3jydFNp$aXJU>ZRHe$F8NSwp zG3j0_JcD_zEh(PjcozFo?i!9P1p@vg?{XAjF5Fmxho3rjY&x*_7HrNOLk8XQpFVbM z0{pshNFH*)S`7CpxSwUaV_#>Lf4F@cZg1LdR{E%>H+;vjV{gT9r|i9O{|N4A5}~+Z zrQ2b+y$QDwwj1K5TL9(p3Ec3?6%}p}-2Bf(*B8T$hg%BV&b7md%qqB@6vwR@Zbfjz zUIStAu?*J1Z5rId>ey-n+u?q52k!gezP$r?j&(okz@3YabDxbL|0uXm>A;B+HdbTg^=EXBeb8V3#_zN(R*l`+@F;kDgue^? zg%b;+*%2@+>%!T-i^XvV96uD9{8w)C!TG|BOWK=&a&iXg2!hL z(~YNsn?CYS1U@42h`UOG5x?0flwabl67B(uzaG5h!e5B+J0<)q@aimo#1qBedGNPG{GA3~zU7a&n}q|w zJa~iYJ>(0e_jlmE2h9CD*&c~s5`RyCzg^`25WLO4P(Fxn7JuJ{zpdi$6%0fc3cm*Y zEf#;K@TmdGbWDPKz2!be_@{%v+2Wrp{B-cwsE3%df$<~)Z?gRT3p|y-6znU1q0SHe zy$8I{^2c{v`g=qu2T#P!Lg&K&M)A-0qN)_PZ8QJ*=cK(^rYf}pDg@Olbp8o7XKZ%F`i$6zs};n zDEuwpH%oa^&X0uuJ@D%-{u<#ogFnOKUkkj}l6$rIs}ed@Xra&%@W0pcf2#2N35C{^ zdmk}9fe8PcCu4rz5&E(h`^k$uZmqBln0uA7o``<}%(deN-vyi}?Sk$rflYddmx|o0 zz`xy+TMfL&!qb6EtawU+G571nb0P2$3y%iQweSewfQ1JGI~G0(_|VxQdAX9VPT;Sx z(vc|qzhhj$a`}tUKPEbDD=mL-3!ig$^!JF+`{8f77$p zn=L*y{mJLiuA~E^)5wBJANfzfpQ%scyTsp0@TW=m8t__xO*s%>EB@wzZ}LU{MB$GH zzeK`w9tpRW8!s^*bxcox_$#*jVP46NhyIS>xr1zb4-4HPbh}V_!}hicE)iNRG)HK* zQ0hWZ-rGWdB=mlv4MOXLQt^ZSM+i+4s`X49?+*0)bl)!YI-%DH%@dj{^h5Ni^#8ul z$AxM|8pr!5^e1%xgV2YCJ}C5Zp_dBXf%{g)FO>ZUF*Srp7YLm%^jktN7Md(HK`7_Q z7>?gRNqs`OZ4B}2_#^$5&<#SrFLa*JD}|z6D*tZ?{ejSXgz}viUcEzw^4mA@DUzO# zC7;~;fc&?Gat{UKmxMkq^f95_(}C_AgmP~P;#ESq#RTypp-n>ZoKgG=q2CnBeKY9) zJfT#TB|b&y0HIxlW(oBO<$fge|DjNBYeM{%(AR}NFO<8#(4Ef-(uagb)^AYwod2P} zYlPzYpzu{fxseUsrwN@ZbfQqsbJBgJP(CM!PZrAgP+}eoM#?!-QlC(-(8JPBxHAvk z-x11KW&>EptLZ=EX5n3R0l+Zy!2MWy*$~jrai`!LE5JfSypeP<6G2MsYd6g^UlvnXk z%Y(nJki)q&JPXzNW9NfX{&}G6-{?+xbZ2~+zhg8GUh4@JT?m>E+$gkOXsuA@o92mP@;NQ;Gz7g{K^Kq$+J{_wn3G+!w4sqi471BK=Z%@xXgGd#6>!v$5Y81ATY#aa$kt|LJye;6p` zyaJ}Ff!7~I;6I>#Ayx;=C zBLoi-JWz11;2gmL!9KwtD!t@0{mc;CE8R)=;g9W#bI@!@dq7e4-d92K^X|r9H_%<6 zEbpDd-ywYVL*$!&Xp8VS3x5+Re%_73ZxjA{;ja_^TH)U={58T~Dg5QaZxw#C@D~ez zq3|1pZ})FZe~s{~#QzNOKVA6aL0Jw3LPvqJ9CAS!zBefInFE>$%KnXfpYXlHKO*IN z7?kdZKpF0!@Y{udK=}KGzfbskg}+DmuL^&+@OKG+r|@?Of4lIv3V)06Hw%B0@HYy- zP5A4DzfSmTg@3#7*9d>5@Rtj}Rrt-qUo8BE!fzCQz3^*=UnBe~;m;8Mbm31E{#4&`@B^UPs0R?Yzhr$+#d}`w(d0TCc%DWHu;0SPz()&0 z?)Y}ncF@9w!22v*0KD76qky+t7~hlIHd#0yc%6lZ0I#$#zT>nlw(vmUS_|g^Pq%O` zaIuAZ1CO$B4)7ogV_eeK+rk*1wD~RU2R`}@hnFfJj9c0cS{UQ|wtW_MfOlK?DBerA zTlfg@CJP@1UT5J$z$-0$5O}eL+ktB>d;oa5h4%v&TX-MvC=2fe9%SJ?z`ZT}DzM+e zyMd3MAIkqO;DZ+43B1q3JAijvcsuZR3vUJ9WZ^Bq>nyw(c%_9m0WY@jM&Mctw*gPL z@Ot243$FtnW#P5JgDiYIaBmB*0rp#XCGb%UKurBF2R>-wR^WXWZU)|M;l;q)ExZtT zlZ6|B*I5|%ZQDM%{|15L{%xzWa0&cBUZm5*Gh>Q@e_-M9z-ugA2)x9?1;AHYcogs@ z79IgyXyJU|p%xwje4>R10jF7bAn*}(PPku~zC7S}Eu0JdnuU7pzh~itztz!ux^mvhY6Ot%t;@Yqh1FiMITpLVW3)~FMb;HEPz%zikrkHpTZ~-va z8x#A1bAh=QnfM?d9>83uOuQR-Kl&@KVJ6-LyaSl)n~7HfuLtJZXX0AmR$#8XCN2T4 z0p^-);(TB}FSuTtI0u;hIoEO%AH4w2AYiWZCf*Nx1ogoUG>CTs?*rzNAL5O`+kv@u zoR~+ctOMq{a^f1`W?-(HCoTq_0X#$SAmAcko-;@HEZ|YVW?tO~d@}Grc@Ozy9M*56 zJ~)R%|GR)$KV08Vyb*XiaHZho!0Uj~295!AyoJf%zuP6qr(&sW4?Q7sFfv z!*Ru>FoR%5!654nvt10c*^4!6IuFhsu``Vyi=FB3oTU9QZ^OjSeDgaA!?H~9O-0#R zUR>`>KFji#VrRMMB!k}t?Fs{xA+)2dv3|zT4*#q>u8g9c^?J3~S?8O?&i3#Jv9qlN zfa#y@Xtdbb#%76~?e7M$vu*xJ>}DT{7mWTo>vmYGAzTOe!pB8hc~R#@hvHYekwisg)Sjappa31k3#md!IccTnC^prj zqnWO5bhHz;)o{wWy8@K(vGK%&c~Avy!1e(s(nXPlQZ#<*r6onELtBBq90>JNi9H^w zmHNF_LqvV4s>OCcP}zt6eB+|>1w&Yks6p%tR9SOX`RpcakHFYLN1#?cK8b(M4AP{oFauo8!MozQ^%!;0eX zz$09h$8wc9<_zl7<=CYFn@%84VcgLE24(ZE!Ol13(Cmc{a(LEfRm`cy9vIx{pd34I zXys(Xh}On6F4$c|r9Rw0xD&!un2mSr?}Y6jM6cN?*BYhe^d7c*j_tw?CW_Dqs-ToA zCzQ{u#-1eQl@*PZHNvSzu53KFVRk8a;U}7xHlgm%R6G`zNqWqksHpB8QfrR6fluxi z->56rE<{!@7+buhdmq~ac1`$tcHH_e+j1*<501vU_09!j$6BXB*H({U%jCu!QM+^f zAK9KOUUSip3U$B5ZV~GCjqMa;i;dVG!#7ok?I*fF`1kHum5p(?8p-881!mKbm?heA z(EpRWW7XONr74ruKutetLL(gU6B-+J>@Tl;!lcrvqbH3mDo2pi!PWv<g<(0eQq7v9a=%Vp@f2$#mvEfr6bgzaE z9(rbO=o*@T=8&_8jW{bG%;7_Z!C{DU96DskS^4?7xkHENpM93%%t+-3Xa4Ln>L}+I z|M>88yb3#bl~C^igl3mZd$BF|W-OE2WaBK}+i{$sY5;KPIt zMDmJ~F}I>pWhYVwb$xjy;@v*tijq-_&CKX0mWbutICAB|{DT)x#0{^E9A5 zMo%3b@;@Ciasih^1_Lb|jP>!_87b74ygYEgsy6 zRH%9hOUKr3YF^(tfVmom+lq9sx-m^=rK1wX$)T{mBGb_h83W;z-A6nK2~S7mEL%uq zc?3|WjBpfW@E*?@Vl_~a#{n8f_=2MIk_#EE)?&!ueLD~`D9gU2Jk&;f@ev#$<&2l2ivVkQbaCkcnKnA``JEI_ji4P2iel;i_T{ZO2 zi+tXfqcFF7Dro))7_aidz-a-T=4P0HGPF{Zc3vC{jR z;{M9=w*#DzTP9D1>>9-n&y2lF!S*pEk~|sstPV!Zb=*qcOIPHSbW3hyd|4@2bT?GR&H5I zUsA{?C|@6($}`Zr(Oz^gxGYb3TVr|qv?n4fI@p-7;&&?!we0MDMfqiyKlc}OXY7IS z98(Xj(CNb*xO!zVD9XOJ!=3c5)Ns{%J9tRzZU0zPXy*gBNy@i54bRj|9lg0UdO(~vNd z!Oqgb802vk>@{%1vKyv95DNGh2Kk4tP?A@I7bYcLNjX;) z;H`lSwe0=8v8Z$>fuEK=W3)WV!V((Dn;j-^eUv=40DnwhNZ`?+nTr{y(DNeGN&ycl zA%WA-nRyDAz?X+DDg7OVbt?Q$+H3Is6ZlLRopnD*vZwP;8E!NFeoIT)hw#uvwJx-x zY-QO6IZo%@bl%TD##q)Ba<%h5Iwu^U%LJV#`cTX0%g%+bP#GP9$M7;zN)Z#-u#l(p zR4--dv}QXAsf=in7D;ipsfbsHiR9fFF0wy`Oybvfb%H9E(>b0}-R>!XTf2D5ejO$R zOLQWHsJbhax^ohSGte}B(@}u>c3PH$m_nHw6kEu&r%XyNqL9mVb|`=^_nxxL@gLR{ zLw9ZgB{O8~pgf*h7ww|THoBgD0IS4DfJF53ET)C!?{I2-lR z4SI)4MAx-U&rH_%8i>Y~7>CrhIYn~lx;#xgPn}e>{*@x8C{YRGXlxIGTyn~|L*l^ zS!fsup%W9sPbEy`F^TH5LkRJ@082ZP%=wVX`h3U~b3UXmT?NtSLv}LfL#Ae;xYBeO zp45oDAanv_0)(eqkSj;*BN#JdB@ZqbrNGQT>{Le_Ru@z0nMe0=fL&;#Ei5w zT@EKUw|boR>ru+YAMhy0KKd+4H7$u72bb5uj$g-UV-I7l^Wd1^Jc$bY_lb^Q&xwva znu0UX>ik5`Cg2=FRDxMIp^^Ae2O7dYmQz#MAA4RSoKaV@&pQA*65L3th7-GcQqSkv zeXT?JJKy)PhKg4+6vy`YnjX4_r}r)Bj6(wxw_Trbk|*`aguKqFYZ6~_e2qNo55eK# zf{6cq@Sb*~uO)GT?+xF1+k6itrX`%}Nk~PbVf-8u+J|Iu0D7k8$?UEkka92xe=d)M zM)feY4iDqluT}f=fvD>y{67R^$H7tCW18pA^KcNx!G!IP1F37+KUr~bT=b&|9)~)= z(L6VO9M&LUSXd5X&WYf06hgg2I}Q#ixc18Caf~n;HD>ep$fr&ycy7Gpy#Ryb2mb&< z9VJ*vwDn>nOI>`<&ru#ZG*%baPW?==Twh<;xnt6-2iMP^vjB@h2IEus;JQjK3piuw zko>dG8C+V|G{3T1h;tf_3S*Gmig}BUcdVH0w?xl7T^=T2vRW^KrApy!vv}q57)Q6b zGI=6RtrZTqt}&8Tbahh&k4&;d)iuW8+J`(`jw!7(^Q|CZj^XEbMV<5%XUPCIq>pi+ zmm5cAO?Bl}T7w=a{f4u@_m;&}+OuxJK{=m1F-(&|Bj+&rW zT_a-)b(Bsc%1JK}1AhXmRE4m7gf9%hhVc!@J<){+v;5CH)df!x$E{IQhM{^7okdY0 zC-;PW>-u+Q@|XtXOi}xQn*Yb%`@mUQRr~+v%$%7yGYm5W%m6Cp5l2Nu84wi_br47_ zP!zbLA}}(eLymwmgMw0V0~H$obtNOEWNPYCVHb;vjJ&9ncqOGGqr##hqoSmwE*Up| z@6UeLbIv~hX7GD&{l2g7ZO`np_F8-GwfD21{p@G|S$jPpDg1=YElqq+XdWLra?K`M<%Zfb@$PZ(nWc<7m(*=az9#Lm8Wu^P zsD*FZP^x5P?x!R9;fKu2v0?^oNln@9%|y_)GS2@_gLX|kY|8l`-K-myqyBT(wD$4t z!#{vui~kb-S^UrNzsJ9YFX`_F){#EIhOqriYi?){zUS07)_XEBoqlOu{YZDSWZz%= zb0^uY(>lD~qk3<~ZGUKzpy$?!DZ?#>7Q72WEAO++==-etz*75YvjLy9`kpcmUqAeO zS%QaS_=wO1eEp@PBD0L8o?yyayxV`QAb(x6_QB*%AUvP2#x182zJst9!_FoAKEfKO zTx$FppG>f@#wAx0z6TzSN3ON-mkF!BAA+v&$6V+iC9JW-`w4%Vu*M7z5q^rW#tM%T z-a=SogijEbOpOCH1kqZZTdxCZ|Ih8c5zcfB5Zr#6=;F)e^gPKW@V@-U$>vbR7U$R?)wUwP^es7s@q@Dt<}EKiTJC&{JyWeJZbFcvuCaB_1ULR zx^Dcxyq5UY6Q@40q0ghI%SQZ}|MHC;JFkA>-(Nnu;)Gky>a1AVd(ob6|JU+c&iSv3 zhraZqAz$hoeCy`dR{re#XP