From fccd8955dfb7471b7f3a040ad184e0994738e878 Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Fri, 22 Jan 2016 12:45:31 -0800 Subject: [PATCH 01/13] start of location service update --- .../AppIcon.appiconset/Contents.json | 58 +++++++++++++++------- .../source/ui/QuestionScreen/PacoQuestionView.m | 8 +++ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json b/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json index c3796c8bf..83f36029a 100644 --- a/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,27 +1,48 @@ { "images" : [ { - "size" : "60x60", + "size" : "29x29", "idiom" : "iphone", - "filename" : "icon_ios7_iphone_120.png", + "filename" : "icon_ios7_settings_58.png", "scale" : "2x" }, { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "icon_ios7_ipad_76.png", - "scale" : "1x" + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" }, { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "icon_ios7_ipad_152.png", + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon_ios7_spotlight_80.png", "scale" : "2x" }, { + "idiom" : "iphone", "size" : "40x40", + "scale" : "3x" + }, + { + "size" : "60x60", "idiom" : "iphone", - "filename" : "icon_ios7_spotlight_80.png", + "filename" : "icon_ios7_iphone_120.png", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon_ios7_settings_29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon_ios7_settings_58.png", "scale" : "2x" }, { @@ -37,21 +58,20 @@ "scale" : "2x" }, { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "icon_ios7_settings_58.png", - "scale" : "2x" + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon_ios7_ipad_76.png", + "scale" : "1x" }, { - "size" : "29x29", + "size" : "76x76", "idiom" : "ipad", - "filename" : "icon_ios7_settings_29.png", - "scale" : "1x" + "filename" : "icon_ios7_ipad_152.png", + "scale" : "2x" }, { - "size" : "29x29", "idiom" : "ipad", - "filename" : "icon_ios7_settings_58.png", + "size" : "83.5x83.5", "scale" : "2x" } ], diff --git a/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m b/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m index 3b0c43f1f..2a7048a0d 100644 --- a/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m +++ b/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m @@ -18,6 +18,7 @@ #import #import #import +#import #import "PacoCheckboxView.h" #import "UIColor+Paco.h" @@ -29,6 +30,7 @@ #import "UIImage+Paco.h" #import "PacoClient.h" + static const int kInvalidIndex = -1; static NSString* const kPlaceHolderString = @""; @@ -417,6 +419,12 @@ - (void)setupUIForQuestion { } self.map.delegate = self; [self addSubview:self.map]; + if (UIDevice.currentDevice().systemVersion.floatValue>=8.0) { + //---request for foreground location use--- + location.requestWhenInUseAuthorization() + } + + lm.startUpdatingLocation() } else if (self.question.responseEnumType == ResponseEnumTypePhoto) { if ([self.question.text length] == 0) { self.questionText.text = NSLocalizedString(@"Attach a photo.", nil); From 825252e7ba70f2e3cf76c17b31cd4209d089a36e Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Fri, 22 Jan 2016 12:46:46 -0800 Subject: [PATCH 02/13] added info.plist key for location request --- Paco-iOS/Paco/config/Paco-Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Paco-iOS/Paco/config/Paco-Info.plist b/Paco-iOS/Paco/config/Paco-Info.plist index 7872fa58a..8f397cd16 100644 --- a/Paco-iOS/Paco/config/Paco-Info.plist +++ b/Paco-iOS/Paco/config/Paco-Info.plist @@ -28,6 +28,8 @@ 1.1.6 LSRequiresIPhoneOS + NSLocationWhenInUseUsageDescription + "This app will display your current location" UIBackgroundModes fetch From aee36ac317dc5149ea2993306335615936942a53 Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Fri, 22 Jan 2016 12:47:23 -0800 Subject: [PATCH 03/13] remove warnings --- Paco-iOS/ParseKit/ParseKit.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Paco-iOS/ParseKit/ParseKit.xcodeproj/project.pbxproj b/Paco-iOS/ParseKit/ParseKit.xcodeproj/project.pbxproj index 43f9bc46d..6ceafdd0c 100644 --- a/Paco-iOS/ParseKit/ParseKit.xcodeproj/project.pbxproj +++ b/Paco-iOS/ParseKit/ParseKit.xcodeproj/project.pbxproj @@ -4918,6 +4918,7 @@ isa = XCBuildConfiguration; buildSettings = { DEBUG_INFORMATION_FORMAT = dwarf; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.0; @@ -4931,6 +4932,7 @@ isa = XCBuildConfiguration; buildSettings = { DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.0; From 8a352c1165f85106fdee75918a802a19593bbc6d Mon Sep 17 00:00:00 2001 From: Mridul Shrestha Date: Sun, 9 Apr 2017 18:21:46 +0545 Subject: [PATCH 04/13] Bug fix (ios): Notification object not removed after being fired --- .../Paco/source/core/scheduling/PacoNotificationManager.m | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Paco-iOS/Paco/source/core/scheduling/PacoNotificationManager.m b/Paco-iOS/Paco/source/core/scheduling/PacoNotificationManager.m index c3d8656de..cbb9c577e 100644 --- a/Paco-iOS/Paco/source/core/scheduling/PacoNotificationManager.m +++ b/Paco-iOS/Paco/source/core/scheduling/PacoNotificationManager.m @@ -111,7 +111,19 @@ - (void)handleRespondedNotification:(UILocalNotification*)notification { if (0 == [notifications count]) { return; } - [notifications removeObject:notification]; + + //The passed notification object is identical to but not the same + //as the fired notification object. + //Therefore removeObject fails to remove the notification from the array. + //Since at this point, the array is already filtered by experimentId, we + //can just use the predicate to remove the fired notification object. + + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"fireDate == %@", notification.fireDate]; + NSArray *filteredArray = [notifications filteredArrayUsingPredicate:predicate]; + id firstFoundObject = nil; + firstFoundObject = filteredArray.count > 0 ? filteredArray.firstObject : nil; + [notifications removeObject:firstFoundObject]; + (self.notificationDict)[experimentId] = notifications; DDLogInfo(@"New Notification Dict: %@", [self.notificationDict pacoDescriptionForNotificationDict]); [self saveNotificationsToCache]; From 6fc7a407892bfbbb8b642a5183193459517b4939 Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Mon, 10 Apr 2017 16:55:13 -0700 Subject: [PATCH 05/13] reset to Paco developers --- Paco-iOS/Paco.xcodeproj/project.pbxproj | 15 +++++++++------ .../Images.xcassets/AppIcon.appiconset/Contents.json | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Paco-iOS/Paco.xcodeproj/project.pbxproj b/Paco-iOS/Paco.xcodeproj/project.pbxproj index 1f2ee7e85..891aa19ee 100644 --- a/Paco-iOS/Paco.xcodeproj/project.pbxproj +++ b/Paco-iOS/Paco.xcodeproj/project.pbxproj @@ -201,7 +201,6 @@ 4448BCBC1A808E7A0034FCE9 /* GTMOAuth2Authentication.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC891A808E7A0034FCE9 /* GTMOAuth2Authentication.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 4448BCBD1A808E7A0034FCE9 /* GTMOAuth2SignIn.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC8B1A808E7A0034FCE9 /* GTMOAuth2SignIn.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 4448BCBE1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4448BC8D1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist */; }; - 4448BCBF1A808E7A0034FCE9 /* GTMOAuth2Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4448BC8E1A808E7A0034FCE9 /* GTMOAuth2Window.xib */; }; 4448BCC01A808E7A0034FCE9 /* GTMOAuth2WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC901A808E7A0034FCE9 /* GTMOAuth2WindowController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 4448BCC11A808E7A0034FCE9 /* ReleaseNotes.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4448BC911A808E7A0034FCE9 /* ReleaseNotes.txt */; }; 4448BCDC1A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BCDA1A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; @@ -619,7 +618,6 @@ 4448BC8A1A808E7A0034FCE9 /* GTMOAuth2SignIn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2SignIn.h; sourceTree = ""; }; 4448BC8B1A808E7A0034FCE9 /* GTMOAuth2SignIn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2SignIn.m; sourceTree = ""; }; 4448BC8D1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GTMOAuth2Framework-Info.plist"; sourceTree = ""; }; - 4448BC8E1A808E7A0034FCE9 /* GTMOAuth2Window.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GTMOAuth2Window.xib; sourceTree = ""; }; 4448BC8F1A808E7A0034FCE9 /* GTMOAuth2WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2WindowController.h; sourceTree = ""; }; 4448BC901A808E7A0034FCE9 /* GTMOAuth2WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2WindowController.m; sourceTree = ""; }; 4448BC911A808E7A0034FCE9 /* ReleaseNotes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReleaseNotes.txt; sourceTree = ""; }; @@ -1402,7 +1400,6 @@ isa = PBXGroup; children = ( 4448BC8D1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist */, - 4448BC8E1A808E7A0034FCE9 /* GTMOAuth2Window.xib */, 4448BC8F1A808E7A0034FCE9 /* GTMOAuth2WindowController.h */, 4448BC901A808E7A0034FCE9 /* GTMOAuth2WindowController.m */, ); @@ -1537,6 +1534,7 @@ TargetAttributes = { 319771C3163F0733000AC06B = { DevelopmentTeam = J7M7JW942W; + ProvisioningStyle = Automatic; }; 319771ED163F0733000AC06B = { DevelopmentTeam = J7M7JW942W; @@ -1713,7 +1711,6 @@ C567E89017A03FDE00267A26 /* deepbark_trial.mp3 in Resources */, 4448BCC11A808E7A0034FCE9 /* ReleaseNotes.txt in Resources */, 36000C5917CD1AF600A8A9E7 /* Test_999999999.plist in Resources */, - 4448BCBF1A808E7A0034FCE9 /* GTMOAuth2Window.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2033,7 +2030,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CODE_SIGN_IDENTITY = "iPhone Developer: Paco Developers (NW2F476Z8Y)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Paco Developers (NW2F476Z8Y)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = J7M7JW942W; + ENTITLEMENTS_REQUIRED = Yes; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Paco/source/Paco-Prefix.pch"; INFOPLIST_FILE = "Paco/config/Paco-Info.plist"; @@ -2045,6 +2044,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; @@ -2056,7 +2056,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CODE_SIGN_IDENTITY = "iPhone Developer: Paco Developers (NW2F476Z8Y)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Paco Developers (NW2F476Z8Y)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = J7M7JW942W; + ENTITLEMENTS_REQUIRED = Yes; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Paco/source/Paco-Prefix.pch"; INFOPLIST_FILE = "Paco/config/Paco-Info.plist"; @@ -2067,6 +2069,7 @@ ); PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; diff --git a/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json b/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json index 83f36029a..1beb0d131 100644 --- a/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Paco-iOS/Paco/config/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,16 @@ { "images" : [ { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { "size" : "29x29", "idiom" : "iphone", "filename" : "icon_ios7_settings_58.png", @@ -34,6 +44,16 @@ "scale" : "3x" }, { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { "size" : "29x29", "idiom" : "ipad", "filename" : "icon_ios7_settings_29.png", From 922a2443696a5ab4dc830071bd3d8d5190728c89 Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Mon, 10 Apr 2017 16:55:39 -0700 Subject: [PATCH 06/13] reset to Paco developers --- Paco-iOS/Paco/config/Paco-Info.plist | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Paco-iOS/Paco/config/Paco-Info.plist b/Paco-iOS/Paco/config/Paco-Info.plist index 8f397cd16..81aee8fc5 100644 --- a/Paco-iOS/Paco/config/Paco-Info.plist +++ b/Paco-iOS/Paco/config/Paco-Info.plist @@ -2,6 +2,10 @@ + LSApplicationCategoryType + + NSCameraUsageDescription + Used to add picture survey responses CFBundleDevelopmentRegion en CFBundleDisplayName @@ -21,15 +25,15 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1.6 + 1.1.8 CFBundleSignature ???? CFBundleVersion - 1.1.6 + 1.1.8 LSRequiresIPhoneOS NSLocationWhenInUseUsageDescription - "This app will display your current location" + This app will display your current location UIBackgroundModes fetch From a3c8c238afc9fdd73567998040d42256c4d391fc Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Mon, 10 Apr 2017 16:56:06 -0700 Subject: [PATCH 07/13] don't throw an error on json parse response --- Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m b/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m index f80f07004..57acfa405 100644 --- a/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m +++ b/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m @@ -157,7 +157,7 @@ - (void)authenticateWithOAuth2WithCompletionHandler:(void (^)(NSError *))complet NSError *error) { BOOL result = [GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:@"PacoKeychain2" authentication:auth]; - assert(result); + //assert(result); // TODO(ispiro): If user presses cancel at the final screen, assert will fail. Should return to splash screen. self.auth = auth; if (auth && !error) { From 8beae99990fdda0abd57a7259a00edce9c10f83f Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Mon, 10 Apr 2017 16:57:07 -0700 Subject: [PATCH 08/13] dump response when error to aid debugging --- Paco-iOS/Paco/source/core/service/PacoService.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Paco-iOS/Paco/source/core/service/PacoService.m b/Paco-iOS/Paco/source/core/service/PacoService.m index 2a9d700ab..000e53a54 100644 --- a/Paco-iOS/Paco/source/core/service/PacoService.m +++ b/Paco-iOS/Paco/source/core/service/PacoService.m @@ -78,7 +78,8 @@ - (void)executePacoServiceCall:(NSMutableURLRequest *)request jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError]; if (jsonError) { DDLogError(@"JSON PARSE ERROR = %@\n", jsonError); - DDLogError(@"PROBABLY AN AUTH ERROR"); + DDLogError(@"PROBABLY AN AUTH ERROR\n"); + DDLogError(@"JSON dump: %@\n", data); [[PacoClient sharedInstance] invalidateUserAccount]; } From d39da25afcfe45ad21d068d5c1d3249044380810 Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Mon, 10 Apr 2017 16:57:26 -0700 Subject: [PATCH 09/13] don't barf on new input types --- Paco-iOS/Paco/source/core/model/PacoExperimentInput.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Paco-iOS/Paco/source/core/model/PacoExperimentInput.m b/Paco-iOS/Paco/source/core/model/PacoExperimentInput.m index f708b0a3e..d9eaa76bd 100644 --- a/Paco-iOS/Paco/source/core/model/PacoExperimentInput.m +++ b/Paco-iOS/Paco/source/core/model/PacoExperimentInput.m @@ -144,7 +144,7 @@ + (ResponseEnumType)responseEnumTypeFromString:(NSString*)responseTypeString { enumType = ResponseEnumTypePhoto; } else { - NSAssert1(NO, @"[ERROR]responseType %@ is not implemented!", responseTypeString); + //NSAssert1(NO, @"[ERROR]responseType %@ is not implemented!", responseTypeString); } return enumType; } From d6892340a0965b91ae2527f3538dacf52a75a2df Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Mon, 10 Apr 2017 16:58:48 -0700 Subject: [PATCH 10/13] don't ask for location permission for version > 8 --- Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m b/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m index 2a7048a0d..c913d9c6e 100644 --- a/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m +++ b/Paco-iOS/Paco/source/ui/QuestionScreen/PacoQuestionView.m @@ -419,12 +419,12 @@ - (void)setupUIForQuestion { } self.map.delegate = self; [self addSubview:self.map]; - if (UIDevice.currentDevice().systemVersion.floatValue>=8.0) { + //if (UIDevice.currentDevice().systemVersion.floatValue>=8.0) { //---request for foreground location use--- - location.requestWhenInUseAuthorization() - } + // location.requestWhenInUseAuthorization() + //} - lm.startUpdatingLocation() + //lm.startUpdatingLocation() } else if (self.question.responseEnumType == ResponseEnumTypePhoto) { if ([self.question.text length] == 0) { self.questionText.text = NSLocalizedString(@"Attach a photo.", nil); From d412f478139f14d021629c82c145dc29ff828a78 Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Mon, 10 Apr 2017 16:59:15 -0700 Subject: [PATCH 11/13] use more specific super type for notification banner --- .../Library/JCNotificationBannerPresenter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Paco-iOS/vendor/jcnotificationbannerpresenter/Library/JCNotificationBannerPresenter.h b/Paco-iOS/vendor/jcnotificationbannerpresenter/Library/JCNotificationBannerPresenter.h index 46dc1c77f..037c6b9a9 100644 --- a/Paco-iOS/vendor/jcnotificationbannerpresenter/Library/JCNotificationBannerPresenter.h +++ b/Paco-iOS/vendor/jcnotificationbannerpresenter/Library/JCNotificationBannerPresenter.h @@ -5,7 +5,7 @@ typedef void (^JCNotificationBannerPresenterFinishedBlock)(); @class JCNotificationBannerWindow; -@interface JCNotificationBannerPresenter : NSObject +@interface JCNotificationBannerPresenter : NSObject - (void)willBeginPresentingNotifications; - (void)didFinishPresentingNotifications; From 130da82bc48700a2522398490829b8e1c4d79b66 Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Wed, 26 Apr 2017 14:44:26 -0700 Subject: [PATCH 12/13] iOS 1.1.8 Move to new GTMAuthApp Google authentication. Use Cocoapods to manage dependencies. Remove old vendor code for libs replaced by Cocopaods. Move to GTMSessionFetcher. Update to target iOS 9.x Proper descriptions of photo/camera/location permissions. --- Paco-iOS/Paco.xcodeproj/project.pbxproj | 470 +- Paco-iOS/Paco.xcworkspace/contents.xcworkspacedata | 10 + .../UserInterfaceState.xcuserstate | Bin 0 -> 116179 bytes Paco-iOS/Paco/config/Images.xcassets/Contents.json | 6 + .../LaunchImage.launchimage/Contents.json | 158 +- .../LaunchImage.launchimage/Default-568h@2x.png | Bin 0 -> 101081 bytes .../LaunchImage.launchimage/Default-667h@2x.png | Bin 0 -> 122236 bytes .../Default-Landscape-736h@3x.png | Bin 0 -> 145452 bytes .../Default-Portrait-736h@3x.png | Bin 0 -> 228299 bytes .../LaunchImage.launchimage/Default.png | Bin 0 -> 32723 bytes .../LaunchImage.launchimage/Default@2x.png | Bin 0 -> 80065 bytes .../LaunchImage.launchimage/Default~ipad.png | Bin 0 -> 91079 bytes .../LaunchImage.launchimage/Default~ipad@2x.png | Bin 0 -> 237477 bytes .../Default~ipad~landscape.png | Bin 0 -> 68849 bytes .../Default~ipad~landscape@2x.png | Bin 0 -> 174034 bytes .../Default~ipad~landscape~nostatusbar.png | Bin 0 -> 68136 bytes .../Default~ipad~landscape~nostatusbar@2x.png | Bin 0 -> 179769 bytes .../Default~ipad~nostatusbar.png | Bin 0 -> 89585 bytes .../Default~ipad~nostatusbar@2x.png | Bin 0 -> 242563 bytes Paco-iOS/Paco/config/Paco-Info.plist | 25 +- Paco-iOS/Paco/resources/paco32@2x.png | Bin 0 -> 7802 bytes Paco-iOS/Paco/resources/paco32@3x.png | Bin 0 -> 12472 bytes Paco-iOS/Paco/source/PacoAppDelegate.h | 9 + Paco-iOS/Paco/source/PacoAppDelegate.m | 29 +- .../source/core/authentication/PacoAuthenticator.h | 12 +- .../source/core/authentication/PacoAuthenticator.m | 216 +- Paco-iOS/Paco/source/core/client/PacoClient.m | 2 +- Paco-iOS/Paco/source/core/service/PacoService.m | 80 +- .../source/ui/MainScreen/PacoMainViewController.h | 1 + .../source/ui/MainScreen/PacoMainViewController.m | 40 +- .../PacoOpenSourceLibViewController.m | 6 +- .../Paco/source/ui/UIComponents/PacoTitleView.h | 25 - .../Paco/source/ui/UIComponents/PacoTitleView.m | 80 - .../Paco/source/ui/UIComponents/PacoTitleView.xib | 35 + .../assets/splash_ios_tablet_1024x768@2x.png | Bin 0 -> 60117 bytes .../Paco/sourceImages/icons/icon_ios7_ipad_152.png | Bin 0 -> 14403 bytes Paco-iOS/Podfile | 9 + Paco-iOS/Podfile.lock | 24 + Paco-iOS/Pods/AppAuth/LICENSE | 202 + Paco-iOS/Pods/AppAuth/README.md | 327 ++ Paco-iOS/Pods/AppAuth/Source/AppAuth.h | 81 + Paco-iOS/Pods/AppAuth/Source/OIDAuthState.h | 238 + Paco-iOS/Pods/AppAuth/Source/OIDAuthState.m | 499 +++ .../AppAuth/Source/OIDAuthStateChangeDelegate.h | 39 + .../AppAuth/Source/OIDAuthStateErrorDelegate.h | 62 + .../Pods/AppAuth/Source/OIDAuthorizationRequest.h | 233 + .../Pods/AppAuth/Source/OIDAuthorizationRequest.m | 300 ++ .../Pods/AppAuth/Source/OIDAuthorizationResponse.h | 128 + .../Pods/AppAuth/Source/OIDAuthorizationResponse.m | 209 + .../Pods/AppAuth/Source/OIDAuthorizationService.h | 156 + .../Pods/AppAuth/Source/OIDAuthorizationService.m | 354 ++ .../AppAuth/Source/OIDAuthorizationUICoordinator.h | 51 + Paco-iOS/Pods/AppAuth/Source/OIDDefines.h | 44 + Paco-iOS/Pods/AppAuth/Source/OIDError.h | 318 ++ Paco-iOS/Pods/AppAuth/Source/OIDError.m | 40 + Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.h | 107 + Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.m | 160 + Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.h | 116 + Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.m | 112 + Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.h | 40 + Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.m | 27 + Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.h | 31 + Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.m | 25 + Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.h | 48 + Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.m | 58 + Paco-iOS/Pods/AppAuth/Source/OIDScopes.h | 46 + Paco-iOS/Pods/AppAuth/Source/OIDScopes.m | 29 + .../Pods/AppAuth/Source/OIDServiceConfiguration.h | 68 + .../Pods/AppAuth/Source/OIDServiceConfiguration.m | 132 + Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.h | 352 ++ Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.m | 350 ++ Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.h | 158 + Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.m | 274 ++ Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.h | 102 + Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.m | 168 + Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.h | 55 + Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.m | 51 + .../Pods/AppAuth/Source/OIDURLQueryComponent.h | 79 + .../Pods/AppAuth/Source/OIDURLQueryComponent.m | 197 + .../Pods/AppAuth/Source/iOS/OIDAuthState+IOS.h | 46 + .../Pods/AppAuth/Source/iOS/OIDAuthState+IOS.m | 36 + .../Source/iOS/OIDAuthorizationService+IOS.h | 44 + .../Source/iOS/OIDAuthorizationService+IOS.m | 38 + .../Source/iOS/OIDAuthorizationUICoordinatorIOS.h | 66 + .../Source/iOS/OIDAuthorizationUICoordinatorIOS.m | 154 + Paco-iOS/Pods/GTMAppAuth/LICENSE | 202 + Paco-iOS/Pods/GTMAppAuth/README.md | 372 ++ Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuth.h | 30 + .../GTMAppAuthFetcherAuthorization+Keychain.h | 52 + .../GTMAppAuthFetcherAuthorization+Keychain.m | 46 + .../Source/GTMAppAuthFetcherAuthorization.h | 133 + .../Source/GTMAppAuthFetcherAuthorization.m | 518 +++ Paco-iOS/Pods/GTMAppAuth/Source/GTMKeychain.h | 62 + .../GTMOAuth2KeychainCompatibility.h | 135 + .../GTMOAuth2KeychainCompatibility.m | 321 ++ .../Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m | 287 ++ Paco-iOS/Pods/GTMSessionFetcher/LICENSE | 202 + Paco-iOS/Pods/GTMSessionFetcher/README.md | 23 + .../Source/GTMGatherInputStream.h | 52 + .../Source/GTMGatherInputStream.m | 185 + .../GTMSessionFetcher/Source/GTMMIMEDocument.h | 148 + .../GTMSessionFetcher/Source/GTMMIMEDocument.m | 629 +++ .../Source/GTMReadMonitorInputStream.h | 49 + .../Source/GTMReadMonitorInputStream.m | 187 + .../GTMSessionFetcher/Source/GTMSessionFetcher.h | 1308 ++++++ .../GTMSessionFetcher/Source/GTMSessionFetcher.m | 4549 ++++++++++++++++++++ .../Source/GTMSessionFetcherLogging.h} | 50 +- .../Source/GTMSessionFetcherLogging.m | 976 +++++ .../Source/GTMSessionFetcherService.h | 190 + .../Source/GTMSessionFetcherService.m | 1352 ++++++ .../Source/GTMSessionUploadFetcher.h | 128 + .../Source/GTMSessionUploadFetcher.m | 1804 ++++++++ Paco-iOS/Pods/Manifest.lock | 24 + Paco-iOS/Pods/Pods.xcodeproj/project.pbxproj | 1206 ++++++ .../xcschemes/AppAuth.xcscheme | 60 + .../xcschemes/GTMAppAuth.xcscheme | 60 + .../xcschemes/GTMSessionFetcher.xcscheme | 60 + .../xcschemes/Pods-Paco.xcscheme | 71 + .../xcschemes/xcschememanagement.plist | 52 + .../Target Support Files/AppAuth/AppAuth-dummy.m | 5 + .../AppAuth/AppAuth-prefix.pch | 12 + .../AppAuth/AppAuth-umbrella.h | 41 + .../Target Support Files/AppAuth/AppAuth.modulemap | 6 + .../Target Support Files/AppAuth/AppAuth.xcconfig | 11 + .../Pods/Target Support Files/AppAuth/Info.plist | 26 + .../GTMAppAuth/GTMAppAuth-dummy.m | 5 + .../GTMAppAuth/GTMAppAuth-prefix.pch | 12 + .../GTMAppAuth/GTMAppAuth-umbrella.h | 21 + .../GTMAppAuth/GTMAppAuth.modulemap | 6 + .../GTMAppAuth/GTMAppAuth.xcconfig | 11 + .../Target Support Files/GTMAppAuth/Info.plist | 26 + .../GTMSessionFetcher/GTMSessionFetcher-dummy.m | 5 + .../GTMSessionFetcher/GTMSessionFetcher-prefix.pch | 12 + .../GTMSessionFetcher/GTMSessionFetcher-umbrella.h | 23 + .../GTMSessionFetcher/GTMSessionFetcher.modulemap | 6 + .../GTMSessionFetcher/GTMSessionFetcher.xcconfig | 10 + .../GTMSessionFetcher/Info.plist | 26 + .../Pods/Target Support Files/Pods-Paco/Info.plist | 26 + .../Pods-Paco/Pods-Paco-acknowledgements.markdown | 621 +++ .../Pods-Paco/Pods-Paco-acknowledgements.plist | 665 +++ .../Pods-Paco/Pods-Paco-dummy.m | 5 + .../Pods-Paco/Pods-Paco-frameworks.sh | 103 + .../Pods-Paco/Pods-Paco-resources.sh | 102 + .../Pods-Paco/Pods-Paco-umbrella.h | 16 + .../Pods-Paco/Pods-Paco.debug.xcconfig | 9 + .../Pods-Paco/Pods-Paco.modulemap | 6 + .../Pods-Paco/Pods-Paco.release.xcconfig | 9 + .../Foundation/GTMGarbageCollection.h | 72 - .../Foundation/GTMNSString+URLArguments.h | 41 - .../Foundation/GTMNSString+URLArguments.m | 45 - .../vendor/google-toolbox-for-mac/GTMDefines.h | 444 -- .../gtm-oauth2/HTTPFetcher/GTMGatherInputStream.h | 64 - .../gtm-oauth2/HTTPFetcher/GTMGatherInputStream.m | 197 - .../gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.h | 175 - .../gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.m | 612 --- .../vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.h | 847 ---- .../vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.m | 2156 ---------- .../GTMHTTPFetcher.xcodeproj/project.pbxproj | 461 -- .../HTTPFetcher/GTMHTTPFetcherLogViewController.h | 66 - .../HTTPFetcher/GTMHTTPFetcherLogViewController.m | 275 -- .../gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.m | 1134 ----- .../gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.h | 130 - .../gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.m | 507 --- .../gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.h | 139 - .../gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.m | 947 ---- .../gtm-oauth2/HTTPFetcher/GTMMIMEDocument.h | 57 - .../gtm-oauth2/HTTPFetcher/GTMMIMEDocument.m | 281 -- .../HTTPFetcher/GTMReadMonitorInputStream.h | 65 - .../HTTPFetcher/GTMReadMonitorInputStream.m | 189 - .../vendor/gtm-oauth2/HTTPFetcher/ReleaseNotes.txt | 84 - .../gtm-oauth2/HTTPFetcher/UnitTests-Info.plist | 22 - Paco-iOS/vendor/gtm-oauth2/JSON/JSON.h | 65 - Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.h | 53 - Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.m | 44 - Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.h | 48 - Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.m | 45 - Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.h | 86 - Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.m | 78 - Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.h | 86 - Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.m | 516 --- Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.h | 127 - Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.m | 239 - .../Source/GTMOAuth2.xcodeproj/project.pbxproj | 686 --- .../gtm-oauth2/Source/GTMOAuth2Authentication.h | 362 -- .../gtm-oauth2/Source/GTMOAuth2Authentication.m | 1321 ------ .../vendor/gtm-oauth2/Source/GTMOAuth2SignIn.h | 191 - .../vendor/gtm-oauth2/Source/GTMOAuth2SignIn.m | 971 ----- .../Source/Mac/GTMOAuth2Framework-Info.plist | 22 - .../Source/Mac/GTMOAuth2WindowController.h | 336 -- .../Source/Mac/GTMOAuth2WindowController.m | 728 ---- Paco-iOS/vendor/gtm-oauth2/Source/ReleaseNotes.txt | 132 - .../Source/Touch/GTMOAuth2ViewControllerTouch.h | 398 -- .../Source/Touch/GTMOAuth2ViewControllerTouch.m | 1104 ----- .../gtm-oauth2/Source/Touch/GTMOAuth2ViewTouch.xib | 494 --- Paco-iOS/vendor/sskeychain/SSKeychain.h | 178 - Paco-iOS/vendor/sskeychain/SSKeychain.m | 109 - Paco-iOS/vendor/sskeychain/SSKeychainQuery.h | 117 - Paco-iOS/vendor/sskeychain/SSKeychainQuery.m | 267 -- .../GoogleAppEngineAuth.h | 44 - .../GoogleAppEngineAuth.m | 175 - .../GoogleAppEngineAuthGithub/GoogleClientLogin.h | 57 - .../GoogleAppEngineAuthGithub/GoogleClientLogin.m | 197 - 202 files changed, 24353 insertions(+), 18969 deletions(-) create mode 100644 Paco-iOS/Paco.xcworkspace/contents.xcworkspacedata create mode 100644 Paco-iOS/Paco.xcworkspace/xcuserdata/bobevans.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Paco-iOS/Paco/config/Images.xcassets/Contents.json create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-667h@2x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-Landscape-736h@3x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-Portrait-736h@3x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default@2x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad@2x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape@2x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape~nostatusbar.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape~nostatusbar@2x.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~nostatusbar.png create mode 100644 Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~nostatusbar@2x.png create mode 100644 Paco-iOS/Paco/resources/paco32@2x.png create mode 100644 Paco-iOS/Paco/resources/paco32@3x.png delete mode 100644 Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.h delete mode 100644 Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.m create mode 100644 Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.xib create mode 100755 Paco-iOS/Paco/sourceImages/assets/splash_ios_tablet_1024x768@2x.png create mode 100755 Paco-iOS/Paco/sourceImages/icons/icon_ios7_ipad_152.png create mode 100644 Paco-iOS/Podfile create mode 100644 Paco-iOS/Podfile.lock create mode 100644 Paco-iOS/Pods/AppAuth/LICENSE create mode 100644 Paco-iOS/Pods/AppAuth/README.md create mode 100644 Paco-iOS/Pods/AppAuth/Source/AppAuth.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthState.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthState.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthStateChangeDelegate.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthStateErrorDelegate.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationUICoordinator.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDDefines.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDError.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDError.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDScopes.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDScopes.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.m create mode 100644 Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.h create mode 100644 Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.m create mode 100644 Paco-iOS/Pods/GTMAppAuth/LICENSE create mode 100644 Paco-iOS/Pods/GTMAppAuth/README.md create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuth.h create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMKeychain.h create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m create mode 100644 Paco-iOS/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/LICENSE create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/README.md create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m rename Paco-iOS/{vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.h => Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h} (65%) create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h create mode 100644 Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m create mode 100644 Paco-iOS/Pods/Manifest.lock create mode 100644 Paco-iOS/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/AppAuth.xcscheme create mode 100644 Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMAppAuth.xcscheme create mode 100644 Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMSessionFetcher.xcscheme create mode 100644 Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/Pods-Paco.xcscheme create mode 100644 Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-dummy.m create mode 100644 Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch create mode 100644 Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h create mode 100644 Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.modulemap create mode 100644 Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.xcconfig create mode 100644 Paco-iOS/Pods/Target Support Files/AppAuth/Info.plist create mode 100644 Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m create mode 100644 Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch create mode 100644 Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h create mode 100644 Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap create mode 100644 Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.xcconfig create mode 100644 Paco-iOS/Pods/Target Support Files/GTMAppAuth/Info.plist create mode 100644 Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m create mode 100644 Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch create mode 100644 Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h create mode 100644 Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap create mode 100644 Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.xcconfig create mode 100644 Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/Info.plist create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Info.plist create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.markdown create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.plist create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-dummy.m create mode 100755 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-frameworks.sh create mode 100755 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-resources.sh create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-umbrella.h create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.debug.xcconfig create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.modulemap create mode 100644 Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.release.xcconfig delete mode 100644 Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h delete mode 100644 Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h delete mode 100644 Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m delete mode 100644 Paco-iOS/vendor/google-toolbox-for-mac/GTMDefines.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.m delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.h delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.m delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.h delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.xcodeproj/project.pbxproj delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.m delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.h delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.m delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.h delete mode 100755 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/ReleaseNotes.txt delete mode 100644 Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/UnitTests-Info.plist delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/JSON.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2.xcodeproj/project.pbxproj delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2Framework-Info.plist delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/ReleaseNotes.txt delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.h delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.m delete mode 100644 Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewTouch.xib delete mode 100755 Paco-iOS/vendor/sskeychain/SSKeychain.h delete mode 100755 Paco-iOS/vendor/sskeychain/SSKeychain.m delete mode 100755 Paco-iOS/vendor/sskeychain/SSKeychainQuery.h delete mode 100755 Paco-iOS/vendor/sskeychain/SSKeychainQuery.m delete mode 100644 Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.h delete mode 100644 Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.m delete mode 100644 Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.h delete mode 100644 Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.m diff --git a/Paco-iOS/Paco.xcodeproj/project.pbxproj b/Paco-iOS/Paco.xcodeproj/project.pbxproj index 891aa19ee..16b384fd9 100644 --- a/Paco-iOS/Paco.xcodeproj/project.pbxproj +++ b/Paco-iOS/Paco.xcodeproj/project.pbxproj @@ -89,8 +89,6 @@ 36A8201918B556CC00FE83A5 /* PacoScheduleGenerator+Daily.m in Sources */ = {isa = PBXBuildFile; fileRef = 36A8201718B556CC00FE83A5 /* PacoScheduleGenerator+Daily.m */; }; 36A8201C18B5576400FE83A5 /* PacoScheduleGenerator+Weekdays.m in Sources */ = {isa = PBXBuildFile; fileRef = 36A8201B18B5576400FE83A5 /* PacoScheduleGenerator+Weekdays.m */; }; 36A8201D18B5576400FE83A5 /* PacoScheduleGenerator+Weekdays.m in Sources */ = {isa = PBXBuildFile; fileRef = 36A8201B18B5576400FE83A5 /* PacoScheduleGenerator+Weekdays.m */; }; - 36AD6CDD17C420F800B93855 /* SSKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 36AD6CDA17C420F800B93855 /* SSKeychain.m */; }; - 36AD6CDE17C420F800B93855 /* SSKeychainQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 36AD6CDC17C420F800B93855 /* SSKeychainQuery.m */; }; 36AD6CE217C4440000B93855 /* NSError+Paco.m in Sources */ = {isa = PBXBuildFile; fileRef = 36AD6CE117C4440000B93855 /* NSError+Paco.m */; }; 36AD6CEB17C5977E00B93855 /* PacoEvaluatorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36AD6CEA17C5977E00B93855 /* PacoEvaluatorTests.m */; }; 36B5A4F218282CBC004DB894 /* PacoScheduleGeneratorDailyESMTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B5A4F118282CBC004DB894 /* PacoScheduleGeneratorDailyESMTests.m */; }; @@ -131,7 +129,6 @@ 36B8EB8B17568DAF004CF035 /* PacoTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EB5F17568DAF004CF035 /* PacoTableCell.m */; }; 36B8EB8C17568DAF004CF035 /* PacoTableTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EB6117568DAF004CF035 /* PacoTableTextCell.m */; }; 36B8EB8D17568DAF004CF035 /* PacoTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EB6317568DAF004CF035 /* PacoTableView.m */; }; - 36B8EB8E17568DAF004CF035 /* PacoTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EB6617568DAF004CF035 /* PacoTitleView.m */; }; 36B8EBD617568E29004CF035 /* calculator.png in Resources */ = {isa = PBXBuildFile; fileRef = 36B8EB9617568E29004CF035 /* calculator.png */; }; 36B8EBD717568E29004CF035 /* current_experiments_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 36B8EB9717568E29004CF035 /* current_experiments_disabled.png */; }; 36B8EBD817568E29004CF035 /* current_experiments_focused.png in Resources */ = {isa = PBXBuildFile; fileRef = 36B8EB9817568E29004CF035 /* current_experiments_focused.png */; }; @@ -163,9 +160,6 @@ 36B8EC0117568E29004CF035 /* smile_icon5_re.png in Resources */ = {isa = PBXBuildFile; fileRef = 36B8EBC417568E29004CF035 /* smile_icon5_re.png */; }; 36B8EC1017568E29004CF035 /* uicheckbox_checked.png in Resources */ = {isa = PBXBuildFile; fileRef = 36B8EBD317568E29004CF035 /* uicheckbox_checked.png */; }; 36B8EC1117568E29004CF035 /* uicheckbox_unchecked.png in Resources */ = {isa = PBXBuildFile; fileRef = 36B8EBD417568E29004CF035 /* uicheckbox_unchecked.png */; }; - 36B8EC2D17568E33004CF035 /* GTMNSString+URLArguments.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EC1717568E33004CF035 /* GTMNSString+URLArguments.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 36B8EC3317568E33004CF035 /* GoogleAppEngineAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EC2A17568E33004CF035 /* GoogleAppEngineAuth.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 36B8EC3417568E33004CF035 /* GoogleClientLogin.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EC2C17568E33004CF035 /* GoogleClientLogin.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 36B8EC3C17568E40004CF035 /* PacoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B8EC3717568E40004CF035 /* PacoTests.m */; }; 36B8EC3D17568E40004CF035 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 36B8EC3917568E40004CF035 /* InfoPlist.strings */; }; 36BC10DD17FE09E8001EA9DD /* PacoIOSLocalNotificationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36BC10DC17FE09E8001EA9DD /* PacoIOSLocalNotificationTests.m */; }; @@ -182,29 +176,10 @@ 36F02D34180DE16B0027395F /* PacoNSDateCategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36F02D32180DE16B0027395F /* PacoNSDateCategoryTests.m */; }; 36F3EFE818FC645500ABF242 /* PacoESMDailyGeneratorWithCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 36F3EFE718FC645500ABF242 /* PacoESMDailyGeneratorWithCache.m */; }; 36F457E31863ABA900931049 /* welcome_paco.html in Resources */ = {isa = PBXBuildFile; fileRef = 36F457E21863ABA900931049 /* welcome_paco.html */; }; - 4448BCA11A808E7A0034FCE9 /* GTMGatherInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC531A808E7A0034FCE9 /* GTMGatherInputStream.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA21A808E7A0034FCE9 /* GTMHTTPFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC551A808E7A0034FCE9 /* GTMHTTPFetcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA31A808E7A0034FCE9 /* GTMHTTPFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC5A1A808E7A0034FCE9 /* GTMHTTPFetcherLogging.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA41A808E7A0034FCE9 /* GTMHTTPFetcherLogViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC5C1A808E7A0034FCE9 /* GTMHTTPFetcherLogViewController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA51A808E7A0034FCE9 /* GTMHTTPFetcherService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC5E1A808E7A0034FCE9 /* GTMHTTPFetcherService.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA61A808E7A0034FCE9 /* GTMHTTPFetchHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC601A808E7A0034FCE9 /* GTMHTTPFetchHistory.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA71A808E7A0034FCE9 /* GTMHTTPUploadFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC621A808E7A0034FCE9 /* GTMHTTPUploadFetcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA81A808E7A0034FCE9 /* GTMMIMEDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC641A808E7A0034FCE9 /* GTMMIMEDocument.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCA91A808E7A0034FCE9 /* GTMReadMonitorInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC661A808E7A0034FCE9 /* GTMReadMonitorInputStream.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCAA1A808E7A0034FCE9 /* ReleaseNotes.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4448BC671A808E7A0034FCE9 /* ReleaseNotes.txt */; }; - 4448BCB61A808E7A0034FCE9 /* UnitTests-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4448BC771A808E7A0034FCE9 /* UnitTests-Info.plist */; }; - 4448BCB71A808E7A0034FCE9 /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC7B1A808E7A0034FCE9 /* NSObject+SBJSON.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCB81A808E7A0034FCE9 /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC7D1A808E7A0034FCE9 /* NSString+SBJSON.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCB91A808E7A0034FCE9 /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC7F1A808E7A0034FCE9 /* SBJsonBase.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCBA1A808E7A0034FCE9 /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC811A808E7A0034FCE9 /* SBJsonParser.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCBB1A808E7A0034FCE9 /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC831A808E7A0034FCE9 /* SBJsonWriter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCBC1A808E7A0034FCE9 /* GTMOAuth2Authentication.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC891A808E7A0034FCE9 /* GTMOAuth2Authentication.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCBD1A808E7A0034FCE9 /* GTMOAuth2SignIn.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC8B1A808E7A0034FCE9 /* GTMOAuth2SignIn.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCBE1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4448BC8D1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist */; }; - 4448BCC01A808E7A0034FCE9 /* GTMOAuth2WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BC901A808E7A0034FCE9 /* GTMOAuth2WindowController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCC11A808E7A0034FCE9 /* ReleaseNotes.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4448BC911A808E7A0034FCE9 /* ReleaseNotes.txt */; }; - 4448BCDC1A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.m in Sources */ = {isa = PBXBuildFile; fileRef = 4448BCDA1A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 4448BCDD1A80901D0034FCE9 /* GTMOAuth2ViewTouch.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4448BCDB1A80901D0034FCE9 /* GTMOAuth2ViewTouch.xib */; }; + 44239C001EA9DD4B0026E69A /* AppAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44239BFD1EA9DD4B0026E69A /* AppAuth.framework */; }; + 44239C011EA9DD4B0026E69A /* GTMAppAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44239BFE1EA9DD4B0026E69A /* GTMAppAuth.framework */; }; + 44239C021EA9DD4B0026E69A /* GTMSessionFetcher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44239BFF1EA9DD4B0026E69A /* GTMSessionFetcher.framework */; }; + 6A56DF05AC441FE9735102FE /* Pods_Paco.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DA66BC3BA03A7F250872B5E /* Pods_Paco.framework */; }; 7F8531D41A37BE680028BA23 /* JCNotificationBanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8531BE1A37BE680028BA23 /* JCNotificationBanner.m */; }; 7F8531D51A37BE680028BA23 /* JCNotificationBannerPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8531C11A37BE680028BA23 /* JCNotificationBannerPresenter.m */; }; 7F8531D61A37BE680028BA23 /* JCNotificationBannerPresenterIOS7Style.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8531C31A37BE680028BA23 /* JCNotificationBannerPresenterIOS7Style.m */; }; @@ -216,6 +191,8 @@ 7F8531DC1A37BE680028BA23 /* JCNotificationBannerViewIOSStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8531CF1A37BE680028BA23 /* JCNotificationBannerViewIOSStyle.m */; }; 7F8531DD1A37BE680028BA23 /* JCNotificationBannerWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8531D11A37BE680028BA23 /* JCNotificationBannerWindow.m */; }; 7F8531DE1A37BE680028BA23 /* JCNotificationCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F8531D31A37BE680028BA23 /* JCNotificationCenter.m */; }; + 7FB660801AA8C305008D2327 /* paco32@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7FB6607E1AA8C305008D2327 /* paco32@2x.png */; }; + 7FB660901AA8C352008D2327 /* PacoTitleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7FB6608F1AA8C352008D2327 /* PacoTitleView.xib */; }; C567E89017A03FDE00267A26 /* deepbark_trial.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C567E88F17A03FDE00267A26 /* deepbark_trial.mp3 */; }; C5B4691917B07E4900B6BC18 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5B4691817B07E4900B6BC18 /* CoreGraphics.framework */; }; C5C4F5D217B163EF009E9F18 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5C4F5D117B163EF009E9F18 /* QuartzCore.framework */; }; @@ -302,34 +279,6 @@ remoteGlobalIDString = D3FDC5820FFC4BFC00F1F797; remoteInfo = libParseKitMobile; }; - 4448BCC61A808E7A0034FCE9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4448BC561A808E7A0034FCE9 /* GTMHTTPFetcher.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = GTMHTTPFetcherLib; - }; - 4448BCC81A808E7A0034FCE9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4448BC561A808E7A0034FCE9 /* GTMHTTPFetcher.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4F74D92F11E68BD300F2D927; - remoteInfo = UnitTests; - }; - 4448BCCE1A808E7A0034FCE9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4448BC851A808E7A0034FCE9 /* GTMOAuth2.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D; - remoteInfo = OAuthTouchStaticLib; - }; - 4448BCD01A808E7A0034FCE9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4448BC851A808E7A0034FCE9 /* GTMOAuth2.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 4FC754FA13E77E25006A0C26; - remoteInfo = OAuthTouchNonGoogleStaticLib; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -431,10 +380,6 @@ 36A8201718B556CC00FE83A5 /* PacoScheduleGenerator+Daily.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PacoScheduleGenerator+Daily.m"; sourceTree = ""; }; 36A8201A18B5576400FE83A5 /* PacoScheduleGenerator+Weekdays.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "PacoScheduleGenerator+Weekdays.h"; sourceTree = ""; }; 36A8201B18B5576400FE83A5 /* PacoScheduleGenerator+Weekdays.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "PacoScheduleGenerator+Weekdays.m"; sourceTree = ""; }; - 36AD6CD917C420F800B93855 /* SSKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKeychain.h; sourceTree = ""; }; - 36AD6CDA17C420F800B93855 /* SSKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSKeychain.m; sourceTree = ""; }; - 36AD6CDB17C420F800B93855 /* SSKeychainQuery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKeychainQuery.h; sourceTree = ""; }; - 36AD6CDC17C420F800B93855 /* SSKeychainQuery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSKeychainQuery.m; sourceTree = ""; }; 36AD6CE017C4440000B93855 /* NSError+Paco.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+Paco.h"; sourceTree = ""; }; 36AD6CE117C4440000B93855 /* NSError+Paco.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+Paco.m"; sourceTree = ""; }; 36AD6CE917C5977E00B93855 /* PacoEvaluatorTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacoEvaluatorTests.h; sourceTree = ""; }; @@ -516,8 +461,6 @@ 36B8EB6217568DAF004CF035 /* PacoTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacoTableView.h; sourceTree = ""; }; 36B8EB6317568DAF004CF035 /* PacoTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PacoTableView.m; sourceTree = ""; }; 36B8EB6417568DAF004CF035 /* PacoTableViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacoTableViewDelegate.h; sourceTree = ""; }; - 36B8EB6517568DAF004CF035 /* PacoTitleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacoTitleView.h; sourceTree = ""; }; - 36B8EB6617568DAF004CF035 /* PacoTitleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PacoTitleView.m; sourceTree = ""; }; 36B8EB9117568E22004CF035 /* Paco-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Paco-Info.plist"; sourceTree = ""; }; 36B8EB9617568E29004CF035 /* calculator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = calculator.png; sourceTree = ""; }; 36B8EB9717568E29004CF035 /* current_experiments_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = current_experiments_disabled.png; sourceTree = ""; }; @@ -550,14 +493,6 @@ 36B8EBC417568E29004CF035 /* smile_icon5_re.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = smile_icon5_re.png; sourceTree = ""; }; 36B8EBD317568E29004CF035 /* uicheckbox_checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = uicheckbox_checked.png; sourceTree = ""; }; 36B8EBD417568E29004CF035 /* uicheckbox_unchecked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = uicheckbox_unchecked.png; sourceTree = ""; }; - 36B8EC1517568E33004CF035 /* GTMGarbageCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMGarbageCollection.h; sourceTree = ""; }; - 36B8EC1617568E33004CF035 /* GTMNSString+URLArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSString+URLArguments.h"; sourceTree = ""; }; - 36B8EC1717568E33004CF035 /* GTMNSString+URLArguments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSString+URLArguments.m"; sourceTree = ""; }; - 36B8EC1817568E33004CF035 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMDefines.h; sourceTree = ""; }; - 36B8EC2917568E33004CF035 /* GoogleAppEngineAuth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GoogleAppEngineAuth.h; sourceTree = ""; }; - 36B8EC2A17568E33004CF035 /* GoogleAppEngineAuth.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GoogleAppEngineAuth.m; sourceTree = ""; }; - 36B8EC2B17568E33004CF035 /* GoogleClientLogin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GoogleClientLogin.h; sourceTree = ""; }; - 36B8EC2C17568E33004CF035 /* GoogleClientLogin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GoogleClientLogin.m; sourceTree = ""; }; 36B8EC3617568E40004CF035 /* PacoTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacoTests.h; sourceTree = ""; }; 36B8EC3717568E40004CF035 /* PacoTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PacoTests.m; sourceTree = ""; }; 36B8EC3A17568E40004CF035 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -580,50 +515,9 @@ 36F02D32180DE16B0027395F /* PacoNSDateCategoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PacoNSDateCategoryTests.m; sourceTree = ""; }; 36F3EFE718FC645500ABF242 /* PacoESMDailyGeneratorWithCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PacoESMDailyGeneratorWithCache.m; sourceTree = ""; }; 36F457E21863ABA900931049 /* welcome_paco.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = welcome_paco.html; sourceTree = ""; }; - 4448BC521A808E7A0034FCE9 /* GTMGatherInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMGatherInputStream.h; sourceTree = ""; }; - 4448BC531A808E7A0034FCE9 /* GTMGatherInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMGatherInputStream.m; sourceTree = ""; }; - 4448BC541A808E7A0034FCE9 /* GTMHTTPFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetcher.h; sourceTree = ""; }; - 4448BC551A808E7A0034FCE9 /* GTMHTTPFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetcher.m; sourceTree = ""; }; - 4448BC561A808E7A0034FCE9 /* GTMHTTPFetcher.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = GTMHTTPFetcher.xcodeproj; sourceTree = ""; }; - 4448BC591A808E7A0034FCE9 /* GTMHTTPFetcherLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetcherLogging.h; sourceTree = ""; }; - 4448BC5A1A808E7A0034FCE9 /* GTMHTTPFetcherLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetcherLogging.m; sourceTree = ""; }; - 4448BC5B1A808E7A0034FCE9 /* GTMHTTPFetcherLogViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetcherLogViewController.h; sourceTree = ""; }; - 4448BC5C1A808E7A0034FCE9 /* GTMHTTPFetcherLogViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetcherLogViewController.m; sourceTree = ""; }; - 4448BC5D1A808E7A0034FCE9 /* GTMHTTPFetcherService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetcherService.h; sourceTree = ""; }; - 4448BC5E1A808E7A0034FCE9 /* GTMHTTPFetcherService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetcherService.m; sourceTree = ""; }; - 4448BC5F1A808E7A0034FCE9 /* GTMHTTPFetchHistory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetchHistory.h; sourceTree = ""; }; - 4448BC601A808E7A0034FCE9 /* GTMHTTPFetchHistory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetchHistory.m; sourceTree = ""; }; - 4448BC611A808E7A0034FCE9 /* GTMHTTPUploadFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPUploadFetcher.h; sourceTree = ""; }; - 4448BC621A808E7A0034FCE9 /* GTMHTTPUploadFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPUploadFetcher.m; sourceTree = ""; }; - 4448BC631A808E7A0034FCE9 /* GTMMIMEDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMMIMEDocument.h; sourceTree = ""; }; - 4448BC641A808E7A0034FCE9 /* GTMMIMEDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMMIMEDocument.m; sourceTree = ""; }; - 4448BC651A808E7A0034FCE9 /* GTMReadMonitorInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMReadMonitorInputStream.h; sourceTree = ""; }; - 4448BC661A808E7A0034FCE9 /* GTMReadMonitorInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMReadMonitorInputStream.m; sourceTree = ""; }; - 4448BC671A808E7A0034FCE9 /* ReleaseNotes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReleaseNotes.txt; sourceTree = ""; }; - 4448BC771A808E7A0034FCE9 /* UnitTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "UnitTests-Info.plist"; sourceTree = ""; }; - 4448BC791A808E7A0034FCE9 /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = ""; }; - 4448BC7A1A808E7A0034FCE9 /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SBJSON.h"; sourceTree = ""; }; - 4448BC7B1A808E7A0034FCE9 /* NSObject+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SBJSON.m"; sourceTree = ""; }; - 4448BC7C1A808E7A0034FCE9 /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SBJSON.h"; sourceTree = ""; }; - 4448BC7D1A808E7A0034FCE9 /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SBJSON.m"; sourceTree = ""; }; - 4448BC7E1A808E7A0034FCE9 /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = ""; }; - 4448BC7F1A808E7A0034FCE9 /* SBJsonBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonBase.m; sourceTree = ""; }; - 4448BC801A808E7A0034FCE9 /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = ""; }; - 4448BC811A808E7A0034FCE9 /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonParser.m; sourceTree = ""; }; - 4448BC821A808E7A0034FCE9 /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = ""; }; - 4448BC831A808E7A0034FCE9 /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonWriter.m; sourceTree = ""; }; - 4448BC851A808E7A0034FCE9 /* GTMOAuth2.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = GTMOAuth2.xcodeproj; sourceTree = ""; }; - 4448BC881A808E7A0034FCE9 /* GTMOAuth2Authentication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2Authentication.h; sourceTree = ""; }; - 4448BC891A808E7A0034FCE9 /* GTMOAuth2Authentication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2Authentication.m; sourceTree = ""; }; - 4448BC8A1A808E7A0034FCE9 /* GTMOAuth2SignIn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2SignIn.h; sourceTree = ""; }; - 4448BC8B1A808E7A0034FCE9 /* GTMOAuth2SignIn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2SignIn.m; sourceTree = ""; }; - 4448BC8D1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GTMOAuth2Framework-Info.plist"; sourceTree = ""; }; - 4448BC8F1A808E7A0034FCE9 /* GTMOAuth2WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2WindowController.h; sourceTree = ""; }; - 4448BC901A808E7A0034FCE9 /* GTMOAuth2WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2WindowController.m; sourceTree = ""; }; - 4448BC911A808E7A0034FCE9 /* ReleaseNotes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReleaseNotes.txt; sourceTree = ""; }; - 4448BCD91A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2ViewControllerTouch.h; sourceTree = ""; }; - 4448BCDA1A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2ViewControllerTouch.m; sourceTree = ""; }; - 4448BCDB1A80901D0034FCE9 /* GTMOAuth2ViewTouch.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GTMOAuth2ViewTouch.xib; sourceTree = ""; }; + 44239BFD1EA9DD4B0026E69A /* AppAuth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppAuth.framework; path = "DerivedData/Paco/Build/Products/Debug-iphonesimulator/AppAuth/AppAuth.framework"; sourceTree = ""; }; + 44239BFE1EA9DD4B0026E69A /* GTMAppAuth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GTMAppAuth.framework; path = "DerivedData/Paco/Build/Products/Debug-iphonesimulator/GTMAppAuth/GTMAppAuth.framework"; sourceTree = ""; }; + 44239BFF1EA9DD4B0026E69A /* GTMSessionFetcher.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GTMSessionFetcher.framework; path = "DerivedData/Paco/Build/Products/Debug-iphonesimulator/GTMSessionFetcher/GTMSessionFetcher.framework"; sourceTree = ""; }; 7F8531BD1A37BE680028BA23 /* JCNotificationBanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JCNotificationBanner.h; path = jcnotificationbannerpresenter/Library/JCNotificationBanner.h; sourceTree = ""; }; 7F8531BE1A37BE680028BA23 /* JCNotificationBanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JCNotificationBanner.m; path = jcnotificationbannerpresenter/Library/JCNotificationBanner.m; sourceTree = ""; }; 7F8531BF1A37BE680028BA23 /* JCNotificationBannerPresenter_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JCNotificationBannerPresenter_Private.h; path = jcnotificationbannerpresenter/Library/JCNotificationBannerPresenter_Private.h; sourceTree = ""; }; @@ -647,6 +541,12 @@ 7F8531D11A37BE680028BA23 /* JCNotificationBannerWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JCNotificationBannerWindow.m; path = jcnotificationbannerpresenter/Library/JCNotificationBannerWindow.m; sourceTree = ""; }; 7F8531D21A37BE680028BA23 /* JCNotificationCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JCNotificationCenter.h; path = jcnotificationbannerpresenter/Library/JCNotificationCenter.h; sourceTree = ""; }; 7F8531D31A37BE680028BA23 /* JCNotificationCenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JCNotificationCenter.m; path = jcnotificationbannerpresenter/Library/JCNotificationCenter.m; sourceTree = ""; }; + 7FB6607E1AA8C305008D2327 /* paco32@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "paco32@2x.png"; sourceTree = ""; }; + 7FB6607F1AA8C305008D2327 /* paco32@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "paco32@3x.png"; sourceTree = ""; }; + 7FB6608F1AA8C352008D2327 /* PacoTitleView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PacoTitleView.xib; sourceTree = ""; }; + 8DA66BC3BA03A7F250872B5E /* Pods_Paco.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Paco.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D60D437C62D01DB8DA47FFA /* Pods-Paco.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Paco.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Paco/Pods-Paco.debug.xcconfig"; sourceTree = ""; }; + B8B04486F837EC6A07859438 /* Pods-Paco.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Paco.release.xcconfig"; path = "Pods/Target Support Files/Pods-Paco/Pods-Paco.release.xcconfig"; sourceTree = ""; }; C567E88F17A03FDE00267A26 /* deepbark_trial.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = deepbark_trial.mp3; sourceTree = ""; }; C5B4691817B07E4900B6BC18 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; C5C4F5D117B163EF009E9F18 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -674,6 +574,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 44239C001EA9DD4B0026E69A /* AppAuth.framework in Frameworks */, + 44239C011EA9DD4B0026E69A /* GTMAppAuth.framework in Frameworks */, + 44239C021EA9DD4B0026E69A /* GTMSessionFetcher.framework in Frameworks */, E4D5DE861837DE9A00E5446A /* MessageUI.framework in Frameworks */, C5C4F5D217B163EF009E9F18 /* QuartzCore.framework in Frameworks */, 319771C9163F0733000AC06B /* UIKit.framework in Frameworks */, @@ -687,6 +590,7 @@ 3197721D163F2672000AC06B /* SystemConfiguration.framework in Frameworks */, 3197721B163F265C000AC06B /* Security.framework in Frameworks */, 31977219163F2655000AC06B /* CFNetwork.framework in Frameworks */, + 6A56DF05AC441FE9735102FE /* Pods_Paco.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -712,6 +616,7 @@ 319771C7163F0733000AC06B /* Frameworks */, 319771C5163F0733000AC06B /* Products */, 36000C1517C6AEA900A8A9E7 /* ParseKit.xcodeproj */, + 4E3FFB9EF2A09E0E4F8D8E9A /* Pods */, ); sourceTree = ""; }; @@ -727,6 +632,9 @@ 319771C7163F0733000AC06B /* Frameworks */ = { isa = PBXGroup; children = ( + 44239BFD1EA9DD4B0026E69A /* AppAuth.framework */, + 44239BFE1EA9DD4B0026E69A /* GTMAppAuth.framework */, + 44239BFF1EA9DD4B0026E69A /* GTMSessionFetcher.framework */, E4D5DE851837DE9900E5446A /* MessageUI.framework */, C5C4F5D117B163EF009E9F18 /* QuartzCore.framework */, C5B4691817B07E4900B6BC18 /* CoreGraphics.framework */, @@ -739,6 +647,7 @@ 31977218163F2655000AC06B /* CFNetwork.framework */, 319771C8163F0733000AC06B /* UIKit.framework */, 319771CA163F0733000AC06B /* Foundation.framework */, + 8DA66BC3BA03A7F250872B5E /* Pods_Paco.framework */, ); name = Frameworks; sourceTree = ""; @@ -810,17 +719,6 @@ path = PublicExperimentScreen; sourceTree = ""; }; - 36AD6CD817C420F800B93855 /* sskeychain */ = { - isa = PBXGroup; - children = ( - 36AD6CD917C420F800B93855 /* SSKeychain.h */, - 36AD6CDA17C420F800B93855 /* SSKeychain.m */, - 36AD6CDB17C420F800B93855 /* SSKeychainQuery.h */, - 36AD6CDC17C420F800B93855 /* SSKeychainQuery.m */, - ); - path = sskeychain; - sourceTree = ""; - }; 36AD6CDF17C443DF00B93855 /* common */ = { isa = PBXGroup; children = ( @@ -1122,10 +1020,9 @@ 36B8EB6217568DAF004CF035 /* PacoTableView.h */, 36B8EB6317568DAF004CF035 /* PacoTableView.m */, 36B8EB6417568DAF004CF035 /* PacoTableViewDelegate.h */, + 7FB6608F1AA8C352008D2327 /* PacoTitleView.xib */, E462379018F9F1E900610F56 /* PacoDatePickerView.h */, E462379118F9F1E900610F56 /* PacoDatePickerView.m */, - 36B8EB6517568DAF004CF035 /* PacoTitleView.h */, - 36B8EB6617568DAF004CF035 /* PacoTitleView.m */, 368C2EDF178DFFBA00546918 /* PacoAlertView.h */, 368C2EE0178DFFBA00546918 /* PacoAlertView.m */, 369EC7FE18467C2B00A1EFE4 /* PacoLoadingView.h */, @@ -1172,6 +1069,8 @@ 36B8EBAB17568E29004CF035 /* find_experiments_normal.png */, 36B8EBAC17568E29004CF035 /* find_experiments_pressed.png */, 36B8EBB517568E29004CF035 /* paco32.png */, + 7FB6607E1AA8C305008D2327 /* paco32@2x.png */, + 7FB6607F1AA8C305008D2327 /* paco32@3x.png */, 36B8EBB817568E29004CF035 /* question.png */, 36B8EBBB17568E29004CF035 /* smile_icon1.png */, 36B8EBBC17568E29004CF035 /* smile_icon1_re.png */, @@ -1192,63 +1091,13 @@ 36B8EC1217568E33004CF035 /* vendor */ = { isa = PBXGroup; children = ( - 4448BC371A808E7A0034FCE9 /* gtm-oauth2 */, 36C4A33618A4DEEE00D8FE59 /* lumberjack */, C5C4F5D417B1738E009E9F18 /* jcnotificationbannerpresenter */, - 36AD6CD817C420F800B93855 /* sskeychain */, 363E211017AF8420007DE3CE /* reachability */, - 36B8EC1317568E33004CF035 /* google-toolbox-for-mac */, - 36B8EC2617568E33004CF035 /* touchengine */, ); path = vendor; sourceTree = ""; }; - 36B8EC1317568E33004CF035 /* google-toolbox-for-mac */ = { - isa = PBXGroup; - children = ( - 36B8EC1417568E33004CF035 /* Foundation */, - 36B8EC1817568E33004CF035 /* GTMDefines.h */, - ); - path = "google-toolbox-for-mac"; - sourceTree = ""; - }; - 36B8EC1417568E33004CF035 /* Foundation */ = { - isa = PBXGroup; - children = ( - 36B8EC1517568E33004CF035 /* GTMGarbageCollection.h */, - 36B8EC1617568E33004CF035 /* GTMNSString+URLArguments.h */, - 36B8EC1717568E33004CF035 /* GTMNSString+URLArguments.m */, - ); - path = Foundation; - sourceTree = ""; - }; - 36B8EC2617568E33004CF035 /* touchengine */ = { - isa = PBXGroup; - children = ( - 36B8EC2717568E33004CF035 /* iPhone */, - ); - path = touchengine; - sourceTree = ""; - }; - 36B8EC2717568E33004CF035 /* iPhone */ = { - isa = PBXGroup; - children = ( - 36B8EC2817568E33004CF035 /* GoogleAppEngineAuthGithub */, - ); - path = iPhone; - sourceTree = ""; - }; - 36B8EC2817568E33004CF035 /* GoogleAppEngineAuthGithub */ = { - isa = PBXGroup; - children = ( - 36B8EC2917568E33004CF035 /* GoogleAppEngineAuth.h */, - 36B8EC2A17568E33004CF035 /* GoogleAppEngineAuth.m */, - 36B8EC2B17568E33004CF035 /* GoogleClientLogin.h */, - 36B8EC2C17568E33004CF035 /* GoogleClientLogin.m */, - ); - path = GoogleAppEngineAuthGithub; - sourceTree = ""; - }; 36B8EC3517568E40004CF035 /* PacoTests */ = { isa = PBXGroup; children = ( @@ -1307,113 +1156,13 @@ path = lumberjack; sourceTree = ""; }; - 4448BC371A808E7A0034FCE9 /* gtm-oauth2 */ = { - isa = PBXGroup; - children = ( - 4448BC511A808E7A0034FCE9 /* HTTPFetcher */, - 4448BC781A808E7A0034FCE9 /* JSON */, - 4448BC841A808E7A0034FCE9 /* Source */, - ); - path = "gtm-oauth2"; - sourceTree = ""; - }; - 4448BC511A808E7A0034FCE9 /* HTTPFetcher */ = { - isa = PBXGroup; - children = ( - 4448BC521A808E7A0034FCE9 /* GTMGatherInputStream.h */, - 4448BC531A808E7A0034FCE9 /* GTMGatherInputStream.m */, - 4448BC541A808E7A0034FCE9 /* GTMHTTPFetcher.h */, - 4448BC551A808E7A0034FCE9 /* GTMHTTPFetcher.m */, - 4448BC561A808E7A0034FCE9 /* GTMHTTPFetcher.xcodeproj */, - 4448BC591A808E7A0034FCE9 /* GTMHTTPFetcherLogging.h */, - 4448BC5A1A808E7A0034FCE9 /* GTMHTTPFetcherLogging.m */, - 4448BC5B1A808E7A0034FCE9 /* GTMHTTPFetcherLogViewController.h */, - 4448BC5C1A808E7A0034FCE9 /* GTMHTTPFetcherLogViewController.m */, - 4448BC5D1A808E7A0034FCE9 /* GTMHTTPFetcherService.h */, - 4448BC5E1A808E7A0034FCE9 /* GTMHTTPFetcherService.m */, - 4448BC5F1A808E7A0034FCE9 /* GTMHTTPFetchHistory.h */, - 4448BC601A808E7A0034FCE9 /* GTMHTTPFetchHistory.m */, - 4448BC611A808E7A0034FCE9 /* GTMHTTPUploadFetcher.h */, - 4448BC621A808E7A0034FCE9 /* GTMHTTPUploadFetcher.m */, - 4448BC631A808E7A0034FCE9 /* GTMMIMEDocument.h */, - 4448BC641A808E7A0034FCE9 /* GTMMIMEDocument.m */, - 4448BC651A808E7A0034FCE9 /* GTMReadMonitorInputStream.h */, - 4448BC661A808E7A0034FCE9 /* GTMReadMonitorInputStream.m */, - 4448BC671A808E7A0034FCE9 /* ReleaseNotes.txt */, - 4448BC771A808E7A0034FCE9 /* UnitTests-Info.plist */, - ); - path = HTTPFetcher; - sourceTree = ""; - }; - 4448BC571A808E7A0034FCE9 /* Products */ = { - isa = PBXGroup; - children = ( - 4448BCC71A808E7A0034FCE9 /* libGTMHTTPFetcher.a */, - 4448BCC91A808E7A0034FCE9 /* UnitTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 4448BC781A808E7A0034FCE9 /* JSON */ = { - isa = PBXGroup; - children = ( - 4448BC791A808E7A0034FCE9 /* JSON.h */, - 4448BC7A1A808E7A0034FCE9 /* NSObject+SBJSON.h */, - 4448BC7B1A808E7A0034FCE9 /* NSObject+SBJSON.m */, - 4448BC7C1A808E7A0034FCE9 /* NSString+SBJSON.h */, - 4448BC7D1A808E7A0034FCE9 /* NSString+SBJSON.m */, - 4448BC7E1A808E7A0034FCE9 /* SBJsonBase.h */, - 4448BC7F1A808E7A0034FCE9 /* SBJsonBase.m */, - 4448BC801A808E7A0034FCE9 /* SBJsonParser.h */, - 4448BC811A808E7A0034FCE9 /* SBJsonParser.m */, - 4448BC821A808E7A0034FCE9 /* SBJsonWriter.h */, - 4448BC831A808E7A0034FCE9 /* SBJsonWriter.m */, - ); - path = JSON; - sourceTree = ""; - }; - 4448BC841A808E7A0034FCE9 /* Source */ = { + 4E3FFB9EF2A09E0E4F8D8E9A /* Pods */ = { isa = PBXGroup; children = ( - 4448BCD81A80901D0034FCE9 /* Touch */, - 4448BC851A808E7A0034FCE9 /* GTMOAuth2.xcodeproj */, - 4448BC881A808E7A0034FCE9 /* GTMOAuth2Authentication.h */, - 4448BC891A808E7A0034FCE9 /* GTMOAuth2Authentication.m */, - 4448BC8A1A808E7A0034FCE9 /* GTMOAuth2SignIn.h */, - 4448BC8B1A808E7A0034FCE9 /* GTMOAuth2SignIn.m */, - 4448BC8C1A808E7A0034FCE9 /* Mac */, - 4448BC911A808E7A0034FCE9 /* ReleaseNotes.txt */, - ); - path = Source; - sourceTree = ""; - }; - 4448BC861A808E7A0034FCE9 /* Products */ = { - isa = PBXGroup; - children = ( - 4448BCCF1A808E7A0034FCE9 /* libOAuthTouch2.a */, - 4448BCD11A808E7A0034FCE9 /* libOAuthTouch2NG.a */, + 9D60D437C62D01DB8DA47FFA /* Pods-Paco.debug.xcconfig */, + B8B04486F837EC6A07859438 /* Pods-Paco.release.xcconfig */, ); - name = Products; - sourceTree = ""; - }; - 4448BC8C1A808E7A0034FCE9 /* Mac */ = { - isa = PBXGroup; - children = ( - 4448BC8D1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist */, - 4448BC8F1A808E7A0034FCE9 /* GTMOAuth2WindowController.h */, - 4448BC901A808E7A0034FCE9 /* GTMOAuth2WindowController.m */, - ); - path = Mac; - sourceTree = ""; - }; - 4448BCD81A80901D0034FCE9 /* Touch */ = { - isa = PBXGroup; - children = ( - 4448BCD91A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.h */, - 4448BCDA1A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.m */, - 4448BCDB1A80901D0034FCE9 /* GTMOAuth2ViewTouch.xib */, - ); - path = Touch; + name = Pods; sourceTree = ""; }; C5C4F5D417B1738E009E9F18 /* jcnotificationbannerpresenter */ = { @@ -1489,9 +1238,12 @@ isa = PBXNativeTarget; buildConfigurationList = 31977200163F0733000AC06B /* Build configuration list for PBXNativeTarget "Paco" */; buildPhases = ( + 9EE300EE5E584EA2BA9D7BC8 /* [CP] Check Pods Manifest.lock */, 319771C0163F0733000AC06B /* Sources */, 319771C1163F0733000AC06B /* Frameworks */, 319771C2163F0733000AC06B /* Resources */, + D20EC8846F25838C3B206789 /* [CP] Embed Pods Frameworks */, + FF6711621A40FDBEB880F61A /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1555,14 +1307,6 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = 4448BC571A808E7A0034FCE9 /* Products */; - ProjectRef = 4448BC561A808E7A0034FCE9 /* GTMHTTPFetcher.xcodeproj */; - }, - { - ProductGroup = 4448BC861A808E7A0034FCE9 /* Products */; - ProjectRef = 4448BC851A808E7A0034FCE9 /* GTMOAuth2.xcodeproj */; - }, - { ProductGroup = 36000C1617C6AEA900A8A9E7 /* Products */; ProjectRef = 36000C1517C6AEA900A8A9E7 /* ParseKit.xcodeproj */; }, @@ -1632,34 +1376,6 @@ remoteRef = 36000C2F17C6AEA900A8A9E7 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 4448BCC71A808E7A0034FCE9 /* libGTMHTTPFetcher.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libGTMHTTPFetcher.a; - remoteRef = 4448BCC61A808E7A0034FCE9 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4448BCC91A808E7A0034FCE9 /* UnitTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = UnitTests.xctest; - remoteRef = 4448BCC81A808E7A0034FCE9 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4448BCCF1A808E7A0034FCE9 /* libOAuthTouch2.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libOAuthTouch2.a; - remoteRef = 4448BCCE1A808E7A0034FCE9 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 4448BCD11A808E7A0034FCE9 /* libOAuthTouch2NG.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libOAuthTouch2NG.a; - remoteRef = 4448BCD01A808E7A0034FCE9 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -1667,18 +1383,15 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4448BCDD1A80901D0034FCE9 /* GTMOAuth2ViewTouch.xib in Resources */, 36B8EBD617568E29004CF035 /* calculator.png in Resources */, + 7FB660901AA8C352008D2327 /* PacoTitleView.xib in Resources */, 36B8EBD717568E29004CF035 /* current_experiments_disabled.png in Resources */, 36B8EBD817568E29004CF035 /* current_experiments_focused.png in Resources */, 36488BB518C8FB2E004517E2 /* incompatible@2x.png in Resources */, 36B8EBD917568E29004CF035 /* current_experiments_normal.png in Resources */, - 4448BCBE1A808E7A0034FCE9 /* GTMOAuth2Framework-Info.plist in Resources */, 36B8EBDA17568E29004CF035 /* current_experiments_pressed.png in Resources */, 36B8EBDE17568E29004CF035 /* experiment_disabled.png in Resources */, 36B8EBDF17568E29004CF035 /* experiment_focused.png in Resources */, - 4448BCAA1A808E7A0034FCE9 /* ReleaseNotes.txt in Resources */, - 4448BCB61A808E7A0034FCE9 /* UnitTests-Info.plist in Resources */, 36B8EBE017568E29004CF035 /* experiment_normal.png in Resources */, 36B8EBE117568E29004CF035 /* experiment_pressed.png in Resources */, 36B8EBE217568E29004CF035 /* feedback_disabled.png in Resources */, @@ -1695,6 +1408,7 @@ 36B8EBF217568E29004CF035 /* paco32.png in Resources */, 367171FD183AFE33005A5058 /* help.html in Resources */, 36B8EBF517568E29004CF035 /* question.png in Resources */, + 7FB660801AA8C305008D2327 /* paco32@2x.png in Resources */, E480BE201896F3E100662432 /* Localizable.strings in Resources */, 36B8EBF817568E29004CF035 /* smile_icon1.png in Resources */, 36B8EBF917568E29004CF035 /* smile_icon1_re.png in Resources */, @@ -1709,7 +1423,6 @@ 36B8EC1017568E29004CF035 /* uicheckbox_checked.png in Resources */, 36B8EC1117568E29004CF035 /* uicheckbox_unchecked.png in Resources */, C567E89017A03FDE00267A26 /* deepbark_trial.mp3 in Resources */, - 4448BCC11A808E7A0034FCE9 /* ReleaseNotes.txt in Resources */, 36000C5917CD1AF600A8A9E7 /* Test_999999999.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1738,6 +1451,51 @@ shellPath = /bin/sh; shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; }; + 9EE300EE5E584EA2BA9D7BC8 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + D20EC8846F25838C3B206789 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Paco/Pods-Paco-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + FF6711621A40FDBEB880F61A /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Paco/Pods-Paco-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1762,9 +1520,7 @@ 36B8EB7317568DAF004CF035 /* PacoDayOfWeekSelectionView.m in Sources */, 36B8EB7417568DAF004CF035 /* PacoESMFrequencySelectionView.m in Sources */, 36B8EB7517568DAF004CF035 /* PacoESMIncludeWeekendsSelectionView.m in Sources */, - 4448BCA71A808E7A0034FCE9 /* GTMHTTPUploadFetcher.m in Sources */, 36B8EB7617568DAF004CF035 /* PacoESMPeriodSelectionView.m in Sources */, - 4448BCA51A808E7A0034FCE9 /* GTMHTTPFetcherService.m in Sources */, 36B8EB7717568DAF004CF035 /* PacoFirstDayOfMonthSelectionView.m in Sources */, 36B8EB7817568DAF004CF035 /* PacoRepeatRateSelectionView.m in Sources */, 7F8531D41A37BE680028BA23 /* JCNotificationBanner.m in Sources */, @@ -1776,9 +1532,7 @@ 7F8531D61A37BE680028BA23 /* JCNotificationBannerPresenterIOS7Style.m in Sources */, 36B8EB7C17568DAF004CF035 /* PacoConsentViewController.m in Sources */, 365B3C2E1836EF41003D57A7 /* UIImage+Paco.m in Sources */, - 4448BCA61A808E7A0034FCE9 /* GTMHTTPFetchHistory.m in Sources */, 36B8EB7D17568DAF004CF035 /* PacoExperimentDetailsViewController.m in Sources */, - 4448BCA11A808E7A0034FCE9 /* GTMGatherInputStream.m in Sources */, 36B8EB7E17568DAF004CF035 /* PacoFindMyExperimentsViewController.m in Sources */, 7F8531D71A37BE680028BA23 /* JCNotificationBannerPresenterIOSStyle.m in Sources */, 36B8EB8017568DAF004CF035 /* PacoMainViewController.m in Sources */, @@ -1786,14 +1540,9 @@ 36B8EB8217568DAF004CF035 /* PacoQuestionScreenViewController.m in Sources */, 36B8EB8317568DAF004CF035 /* PacoQuestionView.m in Sources */, E4E8F352183B21500022613A /* PacoContactUsViewController.m in Sources */, - 4448BCA81A808E7A0034FCE9 /* GTMMIMEDocument.m in Sources */, 36B8EB8417568DAF004CF035 /* PacoRunningExperimentsViewController.m in Sources */, 36B8EB8517568DAF004CF035 /* PacoCheckboxView.m in Sources */, - 4448BCA91A808E7A0034FCE9 /* GTMReadMonitorInputStream.m in Sources */, 36B8EB8817568DAF004CF035 /* PacoLayout.m in Sources */, - 4448BCBC1A808E7A0034FCE9 /* GTMOAuth2Authentication.m in Sources */, - 4448BCB71A808E7A0034FCE9 /* NSObject+SBJSON.m in Sources */, - 4448BCB81A808E7A0034FCE9 /* NSString+SBJSON.m in Sources */, 363C99F11815FF8200D806F6 /* NSMutableArray+Paco.m in Sources */, 36B8EB8917568DAF004CF035 /* PacoLoadingTableCell.m in Sources */, 36A8201C18B5576400FE83A5 /* PacoScheduleGenerator+Weekdays.m in Sources */, @@ -1804,29 +1553,18 @@ 36B8EB8B17568DAF004CF035 /* PacoTableCell.m in Sources */, 36B8EB8C17568DAF004CF035 /* PacoTableTextCell.m in Sources */, 36417BE8180DCA9600335B74 /* NSCalendar+Paco.m in Sources */, - 4448BCBD1A808E7A0034FCE9 /* GTMOAuth2SignIn.m in Sources */, 36B8EB8D17568DAF004CF035 /* PacoTableView.m in Sources */, 7F8531DA1A37BE680028BA23 /* JCNotificationBannerViewController.m in Sources */, E462379218F9F1E900610F56 /* PacoDatePickerView.m in Sources */, - 4448BCA21A808E7A0034FCE9 /* GTMHTTPFetcher.m in Sources */, - 36B8EB8E17568DAF004CF035 /* PacoTitleView.m in Sources */, - 4448BCA41A808E7A0034FCE9 /* GTMHTTPFetcherLogViewController.m in Sources */, - 36B8EC2D17568E33004CF035 /* GTMNSString+URLArguments.m in Sources */, 365D20FA1820695E0097F379 /* PacoUtility.m in Sources */, - 4448BCC01A808E7A0034FCE9 /* GTMOAuth2WindowController.m in Sources */, 36C4A33E18A4DEEE00D8FE59 /* DDFileLogger.m in Sources */, E4F9A79818899F39006A2803 /* PacoStepperView.m in Sources */, - 36B8EC3317568E33004CF035 /* GoogleAppEngineAuth.m in Sources */, - 36B8EC3417568E33004CF035 /* GoogleClientLogin.m in Sources */, 36946B05177A37CF005E0C04 /* PacoExperimentFeedback.m in Sources */, 7F8531DB1A37BE680028BA23 /* JCNotificationBannerViewIOS7Style.m in Sources */, 36C4A33F18A4DEEE00D8FE59 /* DDLog.m in Sources */, 366F46B318CF82C200789A54 /* PacoPublicExperimentController.m in Sources */, 36946B08177A385A005E0C04 /* PacoExperimentInput.m in Sources */, - 4448BCDC1A80901D0034FCE9 /* GTMOAuth2ViewControllerTouch.m in Sources */, - 4448BCBB1A808E7A0034FCE9 /* SBJsonWriter.m in Sources */, 361A118B18F30CC9000E9CA2 /* UIColor+Paco.m in Sources */, - 4448BCA31A808E7A0034FCE9 /* GTMHTTPFetcherLogging.m in Sources */, 36946B0B177A3968005E0C04 /* PacoExperimentSchedule.m in Sources */, 361A11A318F5A89A000E9CA2 /* UIFont+Paco.m in Sources */, 36946B0E177A55BA005E0C04 /* PacoExperimentDefinition.m in Sources */, @@ -1836,7 +1574,6 @@ 36488BB818C90D9A004517E2 /* PacoScheduleGenerator+Weekly.m in Sources */, 366F469D18CF127E00789A54 /* PacoScheduleGenerator+MonthlyByDayOfMonth.m in Sources */, 369EC80018467C2B00A1EFE4 /* PacoLoadingView.m in Sources */, - 4448BCBA1A808E7A0034FCE9 /* SBJsonParser.m in Sources */, E48622A2188FEE17000B5044 /* PacoSubtitleTableCell.m in Sources */, 36488BBE18CA598C004517E2 /* PacoPublicDefinitionLoader.m in Sources */, 36A8201818B556CC00FE83A5 /* PacoScheduleGenerator+Daily.m in Sources */, @@ -1852,12 +1589,9 @@ 365D20E7181B198D0097F379 /* NSString+Paco.m in Sources */, 36C4A33D18A4DEEE00D8FE59 /* DDASLLogger.m in Sources */, 363E211A17B5B13F007DE3CE /* PacoExpressionExecutor.m in Sources */, - 4448BCB91A808E7A0034FCE9 /* SBJsonBase.m in Sources */, 363E211D17B5B1F6007DE3CE /* PacoInputEvaluator.m in Sources */, 7F8531DC1A37BE680028BA23 /* JCNotificationBannerViewIOSStyle.m in Sources */, - 36AD6CDD17C420F800B93855 /* SSKeychain.m in Sources */, 7F8531DD1A37BE680028BA23 /* JCNotificationBannerWindow.m in Sources */, - 36AD6CDE17C420F800B93855 /* SSKeychainQuery.m in Sources */, 367233E1180619A5006611E6 /* PacoScheduleGenerator.m in Sources */, 36AD6CE217C4440000B93855 /* NSError+Paco.m in Sources */, 7F8531DE1A37BE680028BA23 /* JCNotificationCenter.m in Sources */, @@ -1970,8 +1704,8 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Tom Pennings (3962CV8FL3)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Tom Pennings (3962CV8FL3)"; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Paco Developers (NW2F476Z8Y)"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -1985,7 +1719,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "ParseKit/include/**"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; ONLY_ACTIVE_ARCH = YES; PROVISIONING_PROFILE = "6FF1CA60-7E74-4967-9810-F69E1FEC48AB"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "6FF1CA60-7E74-4967-9810-F69E1FEC48AB"; @@ -2004,8 +1738,8 @@ CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Tom Pennings (3962CV8FL3)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Tom Pennings (3962CV8FL3)"; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Paco Developers (NW2F476Z8Y)"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -2013,7 +1747,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = "ParseKit/include/**"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PROVISIONING_PROFILE = "6FF1CA60-7E74-4967-9810-F69E1FEC48AB"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "6FF1CA60-7E74-4967-9810-F69E1FEC48AB"; @@ -2026,6 +1761,7 @@ }; 31977201163F0733000AC06B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9D60D437C62D01DB8DA47FFA /* Pods-Paco.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -2033,14 +1769,17 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = J7M7JW942W; ENTITLEMENTS_REQUIRED = Yes; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/DerivedData/Paco/Build/Products/Debug-iphonesimulator/AppAuth", + "$(PROJECT_DIR)/DerivedData/Paco/Build/Products/Debug-iphonesimulator/GTMAppAuth", + "$(PROJECT_DIR)/DerivedData/Paco/Build/Products/Debug-iphonesimulator/GTMSessionFetcher", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Paco/source/Paco-Prefix.pch"; INFOPLIST_FILE = "Paco/config/Paco-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + OTHER_LDFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; @@ -2052,6 +1791,7 @@ }; 31977202163F0733000AC06B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = B8B04486F837EC6A07859438 /* Pods-Paco.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -2059,14 +1799,18 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = J7M7JW942W; ENTITLEMENTS_REQUIRED = Yes; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/DerivedData/Paco/Build/Products/Debug-iphonesimulator/AppAuth", + "$(PROJECT_DIR)/DerivedData/Paco/Build/Products/Debug-iphonesimulator/GTMAppAuth", + "$(PROJECT_DIR)/DerivedData/Paco/Build/Products/Debug-iphonesimulator/GTMSessionFetcher", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Paco/source/Paco-Prefix.pch"; INFOPLIST_FILE = "Paco/config/Paco-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + OTHER_LDFLAGS = ""; + "OTHER_LDFLAGS[arch=*]" = ""; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Paco-iOS/Paco.xcworkspace/contents.xcworkspacedata b/Paco-iOS/Paco.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..c9034a92f --- /dev/null +++ b/Paco-iOS/Paco.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Paco-iOS/Paco.xcworkspace/xcuserdata/bobevans.xcuserdatad/UserInterfaceState.xcuserstate b/Paco-iOS/Paco.xcworkspace/xcuserdata/bobevans.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..dc0e1c919140ee1d2c0e5506dfff17264dee4365 GIT binary patch literal 116179 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∾l0sW?p}W8@ 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

N-Dr%<7iGA4+7i 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 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/Contents.json b/Paco-iOS/Paco/config/Images.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Paco-iOS/Paco/config/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Contents.json b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Contents.json index b68f4a649..7c667b5ee 100644 --- a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -1,55 +1,163 @@ { + "info" : { + "author" : "xcode", + "version" : 1 + }, "images" : [ { "orientation" : "portrait", + "filename" : "Default.png", + "idiom" : "iphone", + "scale" : "1x", + "extent" : "full-screen" + }, + { + "orientation" : "portrait", + "filename" : "Default@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "minimum-system-version" : "7.0", + "extent" : "full-screen" + }, + { + "orientation" : "portrait", + "filename" : "Default-568h@2x.png", + "idiom" : "iphone", + "subtype" : "retina4", + "scale" : "2x", + "extent" : "full-screen" + }, + { + "orientation" : "portrait", + "filename" : "Default-568h@2x.png", + "idiom" : "iphone", + "subtype" : "retina4", + "scale" : "2x", + "minimum-system-version" : "7.0", + "extent" : "full-screen" + }, + { + "orientation" : "portrait", + "filename" : "Default@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "extent" : "full-screen" + }, + { + "orientation" : "portrait", + "filename" : "Default~ipad.png", + "idiom" : "ipad", + "scale" : "1x", + "extent" : "to-status-bar" + }, + { + "orientation" : "portrait", + "filename" : "Default~ipad@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "extent" : "to-status-bar" + }, + { + "orientation" : "landscape", + "filename" : "Default~ipad~landscape.png", "idiom" : "ipad", - "filename" : "splash_ios_tablet_768x1024.png", + "scale" : "1x", + "extent" : "to-status-bar" + }, + { + "orientation" : "landscape", + "filename" : "Default~ipad~landscape@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "extent" : "to-status-bar", + "size" : "83.5x83.5" + }, + { + "orientation" : "portrait", + "filename" : "Default~ipad~nostatusbar.png", + "idiom" : "ipad", + "scale" : "1x", "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" + "extent" : "full-screen" }, { "orientation" : "portrait", + "filename" : "Default~ipad~nostatusbar.png", "idiom" : "ipad", - "filename" : "splash_ios_tablet_768x1024@2x.png", + "scale" : "1x", + "extent" : "full-screen" + }, + { + "orientation" : "portrait", + "filename" : "Default~ipad~nostatusbar@2x.png", + "idiom" : "ipad", + "scale" : "2x", "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" + "extent" : "full-screen" + }, + { + "orientation" : "portrait", + "filename" : "Default~ipad~nostatusbar@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "extent" : "full-screen" }, { "orientation" : "landscape", + "filename" : "Default~ipad~landscape~nostatusbar.png", "idiom" : "ipad", - "filename" : "splash_ios_tablet_1024x768.png", + "scale" : "1x", "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "1x" + "extent" : "full-screen" }, { "orientation" : "landscape", + "filename" : "Default~ipad~landscape~nostatusbar.png", "idiom" : "ipad", - "filename" : "splash_ios_tablet_1024x768@2x.png", + "scale" : "1x", + "extent" : "full-screen" + }, + { + "orientation" : "landscape", + "filename" : "Default~ipad~landscape~nostatusbar@2x.png", + "idiom" : "ipad", + "scale" : "2x", "minimum-system-version" : "7.0", - "extent" : "full-screen", - "scale" : "2x" + "extent" : "full-screen" + }, + { + "orientation" : "landscape", + "filename" : "Default~ipad~landscape~nostatusbar@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "extent" : "full-screen" }, { "orientation" : "portrait", + "filename" : "Default-Portrait-736h@3x.png", "idiom" : "iphone", - "filename" : "splash_ios_mobile_640x960.png", - "minimum-system-version" : "7.0", - "scale" : "2x" + "subtype" : "736h", + "scale" : "3x", + "minimum-system-version" : "8.0", + "extent" : "full-screen" + }, + { + "orientation" : "landscape", + "filename" : "Default-Landscape-736h@3x.png", + "idiom" : "iphone", + "subtype" : "736h", + "scale" : "3x", + "minimum-system-version" : "8.0", + "extent" : "full-screen" }, { "orientation" : "portrait", + "filename" : "Default-667h@2x.png", "idiom" : "iphone", - "filename" : "splash_ios_mobile_640x1136.png", - "minimum-system-version" : "7.0", - "subtype" : "retina4", - "scale" : "2x" + "subtype" : "667h", + "scale" : "2x", + "minimum-system-version" : "8.0", + "extent" : "full-screen" } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file + ] +} diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe07e7791eb03e198cbc1a29701049a45740b9cf GIT binary patch literal 101081 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

^LfA9PtX?@8d~o1sIJAc3u5O{w1@?xZL0;k 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

YhMOnN8$>*eETt60|E8itN^o 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%0DKsCj_GgY-EX%K;2Z)H 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�@+4$%viSO`0KkInC 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 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-667h@2x.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-667h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2069e20a4c56d5e4f92566c41d4614a5d71a89 GIT binary patch literal 122236 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�i^+0hPa+n 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

-DL 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 XxAmu1&0*q`E21bkm-R>K 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

CMp|y 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 Ht(X4`HOV1} literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-Portrait-736h@3x.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default-Portrait-736h@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2e69dbce4b2ecef46149287e9f4af75584e455 GIT binary patch literal 228299 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 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default@2x.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a243d9d917cd66334f86ec0240901f99c29e513 GIT binary patch literal 80065 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 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..e0519e2128369afe1ec8185c35028845424f1111 GIT binary patch literal 91079 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 )>oh#ltX~rxyoPOnf!7 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 WBIY7=AY8!!e=?E^5~X4W{{Ii|Vv;QY literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad@2x.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bb561d20f2b3d2143d385e61e86df2e34142e7fe GIT binary patch literal 237477 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

v>I&x7a8{LdTBh43#;Tcmzbe2{C%*+4toW;yR) zVKFmQO)wakviJ#|YW7R~@1}#DQJx;#JZO$2=Z=Gn=(qF7N%M^VvN10Z1aKwR4bO-M zI%#0^K@D(s>K1I+aT7^fLgobihR!rn_``nY3y2?VP1f8N=lUxoB|s*}#MGrKLsOvg zM~;7_;YupYY~#!7-pt5Ky$B>dmtJCaH`;}U$jX1>CxwMhP)d_?eAxqgeJEQf(UwTr z@`7qGRw9YY2Dx$WyrqF@b`&raQk~U3m%wWjs09gTK$ZtQPJHNea~-4#6kKb{qE|x0 z3=E{%Kr>=U^FSSW6g?$cdAs$X$IZK#BWniUkXu5k`uuo_+ji=uz#-4h6~zssYB_l& z!4*Gx7^x2{$38j55QkI2k5cMNlmcoOC#(CtKqx|K3pFMzzs5C)J)@rzwE_;m;9j9c z@R(CyZ|Bwh9a0YAwNefEe>Gi!ZOZ%D&Pa?KDapMP$LcBL$kM@A-&TpWQ4 zp4Q;{1FAe{j|t1g4WvezWf=Oc^owQv_q_+dnyjy;WkiB^Wq5HRvtiG)w2mXy#35*= zeqTsBHow8MA-|pgdS6FAj{OHOswB%Gi5e40TayxPw2u-8tZ+rTBIZ3 zLg#nlf&hd5mIE~SQnL^Ron2~O=FXRDn&fU(bT+e>9)gd~O0Q9Oz5*vbPv-{tLfv>d z23$HOm%zs!oPUfTf#ic0F>O8TWRbAE+WqqlGWj=BzAWh=Hnp>TQ2Eu8vQqs0qrG2?v6{HjG4Y1tKGa}je1#2lYhWYz4dMmzAF*nH-Z$UR z5eHU#okjwdYe^RE2A{QFxcL7#bnDv^nZ?>YRE-2zDM{flXn#>yDIjqBwhS?f)um~> zwOO-O*DAjdynx1i1uy||dTsx9Bp^S85t2|Voa3{Zci8ukNuDK=MDz3-6S?M(3RP8A z-`PmRqeAg`GGg^<2&bY!hn_5pgYPZ<#@n~-t+Nebhy@W&BQ07{P3NxxLn$aZ5 zcEj#`1N=U4!Vx|z?$(6~H2{Sf%u7s|3%Q05!sYzIbY(dpVmFV9TXlLpjH^aJ=mKT| z)*|h%P}z%u*e>*ze(|=uy@$unbirTdNWumR*|1_mbWI#s8V1}G1!D8+C#i+K5)g|P z()sa~^rJ{`r%>g+wgYg#0dqiMzAbZ(;ss+ASuCUiqi=~MK?W5)z4zLF%R3{o(t)M_ zasw)D2kdg$O7~dc|`g`nsOeH3@;W6eUU$AMV;%78z{u*dN;&c;+3Erbl zVQNy5w{)|Ln@4ahl_GNCz|FS$lW%>wB;ff#D2=snyaGf^Ol=?WLt%&*poAH#4-KKg z#po0F<0)nx5-kO(2B$YlN^cIV7^m4rLI~W~?Z8sm5VW*s?}FNygb^WBWbr@Bs#BIq zBQWrsi&cyxr=o*U_jkcuALFRKR9HdDV}VM6$L=!|E8-8uy9zeinSwz62E8X>5L`_* zW3&&q+o$&co6t3XrE|lXkIGl!o(uv&$IVbm{u=ADStDZLO!uKN)`AFc;jdn;{!f@5 zeeKStvbxXYeC8qG@|QC*_ghvEaN|xf|sKH$(l#eYPRtoir|#!Ydl*c z`|x;u=%o5V1#4@WMwwNwe_6k|Rpb8G-!+YKL=dkE2zKm(YRXPuD!deXNTt;>i`R~6 z@*}{l0h4k3HXpl(I|khV3hXc#Ce83UaaFs3anzOu_X0%SdaO4(7w8pyL!~2?ZprZ z-3}}I_s;3JHzNBGn$5;C;u-qf>ZZrX4$)ipcyB4$So1>eKv3Kd3y4(fd7+Bw2Y&_y zeogkysKHjp^kzz~#x|W9cY+F;U=HaM-n8cK^p8RmI^qAyZR0m{darZ;cSlCDtl)n; zCgFW4HLaOQdOAA)P*@N|>yzHvYNw}b;47&a%-4;pK_IE_0Xlt`>uleTWJ>Mc;&V8q zSqLq-FRv_n%#gmlT-%rW2j)tB%ZO;UQ} zS4zaK@r+bwO#T-Um{C14nETcS_vOvH;CD1o(DdcClJHoIj*R1Di|5B(dfR3{&$eFv zTfkf|b=LjFjNd`02t$nlhp$4E2MS^sL8$q6SyAZFbe}Y~y9Hf`2OxF%y;%Ms8SBYut-U9k+58(Di1IGUsZN8r`lRfOqS&8` zgYQ()q+BDEatXFX(9;gV(>#61fuj~Jmu)^7d#|pup#{~wg3ezM&ni^ws*nCmSZhl_ zY_Fra4VbAayVbPEptEs|4c{A4D5lBtOKm;ciDgR?u`2J2<=NOTxMWs44z-Y!YuAc8 zhQ8=-J%G+c$Kd=fjtOm2@#vjMzN#+F^j^PfZobjn1pZ2Rr}#$Y-=k&VOw!rWYfnI< zGK%yS(nul#QQm(v9bis98JXH8)8Ds3DqW_ok(zH6%Z5RVS!CnGuS;ipat2)fJGPd+ z84Sh&PsG9D>=y-i!5efopdqHH8ztB9!GLJSCVuG9xfaVpxl$5; zSAj`@W!Ie^ZR{K10}e>urFm0AXbTNGKN4=d`o>!@gsNq&~r; zs>T;!&ooUl;X!!cP3 zq+qH$dG46}R(~9UH%sRpG$R{hzHp!*x=6~rn+XGz#L`2K^*1IpJ;|A1ZT-7g{Iy-O zC6}af(o2qv(0{t@;jc3nxFnp(OTVg=@vtbuTfaj>Kt&l7@acohwt%|qP~%ZT!PvFA z%!7vXKt1RH^Z;)nYJI$?@)H(KFKZa}=}~%Ms+-_vQ^|uv&Bod4cauYW1meCdb~QS~ zz>oC%iKX2s45$qCqQ>jLOFgbTf4^kx$*9&}fiyE=xa%gWyiuMni9L&>lT0xq%pJe2 zMeGRGjsiU8o&x@$UEFtebI#vdeW8OoBKjx5xqPT-seqp(g&YM0Jd6RzJ}+qV&4GLJ zcgzgSi|90VZj<=qvYv$8R5D8Yo3ogQI zw!lxh8e4K7OPPjW*`1cJ+6oel6v1Q^SbXz#O}TWIU}wI_o$k0vU@;nuO*(3sGRV5>;sQQw9oGbMR_bCOEZqd$ctELb#OTxr3lB4%Xx z_DUh9$1B>`hj9-z_6?0VlBAEoW>y+dpd=@mR~kkZFjen6e_4?L5y6&SzIc0a(dJnQ zGUX*5T0C?$V(S>@tn<4+XxpSgi_5v2NhJ^41Ye&4IeuQ%v5Gv(G6Z|Ex`bI$V@UZF zrL8diWtu21NsJ_4h2l1zxw{~_>o~;1V(1Y)b38rHuvUgT9*ZafGg=u~|As!6opY*c z;BD;SfVL*jPeu3FR=lLb&}75}t)g?ArUYpUpcealnQ4C9&?Z4LW5uG04leI>DD?by z&*Dt~1c-J)h?R5g<-_iV1uJ}-oG|R)dOCNvs`5v)^JFQ}xdWDF7}o;uIDYMjiB6w= zdpIQhOx5H-bfy8=1_9V+lEHeH@}T{7CTLXKZ}h&uVM0%Erc!+) zSnK5If3(Y4=c6(6NFJNuS(WG+U4B)V&WiJ;OAEt{e{%xolxZCWsa9j=LRaGQx#1Ni z;haDs<}?`bUaLld_1_%LB=}$Pk>t$X5!=S`jj;V%#f=U5oe*q)QbG29f#>uNLKjeR zh<7Sn+IF0AsweJh*a(sjLN3}SAloq@j0@ZTD|=x=T>{oJ6bW&%Y&33?;+xFb@EbJQ zuCLbg_I|t7Ln|G-nMRgqpiXYr7^|jOYK8$a&a>Cw^2y9G5a}4FtBZu-iI?imd{TYi zHbV94ztyYQqL?vU7fgf@q&hjhtM(azDG4c$UIw~GpupeTll9wFdEc+?_=Fli~}=2OO9*s3tGo z%})}QK!Rq<;dAj|EF9GG@W`!&{^8L*^ef_{KVL7&?EEJY=B4Evd2xxkeJ?M$8qoV? zuXZr^+b!i!Im0ANRr#bp&GxGqnCaMWn;Eb&UyYuvR!6u0Ja1pjRR}Qe(`%bt016{W zl1-OYrN%0+0)xX`B`W>D6X-ZA$lzt5gFlA$w-AzSsE;T}d-v((@f#uFM! z+T&|nfr7VY?ptzcqLVunhBk4YxvprUOAC)Agd$5Fl38Q>qhUA-Qn|huTBz!|EpaBu zSWBSjr1K3^FIIe&$AHMP^_?COK-t8G-ktBNWy` zyL9~qlFWkDCNf%#HpqkDX%3&-?@@K~0q`JqEfclwo^JP9K|41Y)!Rz7GkE*~=vu>G z6&-!w_dJn^?3EOlKp|~W@Pf7KX=Yu|ZAGB}`LCrjhe1~+WP4?CuYMEDT`_9^hDvuk zG9CAl>ByZYX*h@3FL?>Z#;X2YCVddv-HLS!G{Rzc{|s0%2!g2*J`F6QtXJrvj<6t^ zFn$0!FF#($eDY{$lZMJLoP(@?^W=3#)(mUA4g05#M(UdWnZV-Cv@@`Y}3qHYd@#;JN!}M49xv@{c|{ z+y(R#kln=o7t%}ABqc?$H*Fd5UId+ex&IE5k$F|-Zp>#~&kQ(|L7Bd01*D0HS0h%E z*`+QTqEsAKuuq_P8yvDg+n1AO3{a<0?@?-Z!X7O;AVMz}pH&TemlAPztkj_0MOhm{%e&s;f;PO3kbg4 zJqB9lM5!E63X^Ky%O6#42-w|$pd}v~qP$-BltROUCMge^+u^#E5lXT0@Dl+HyA@hF z#pfQjHCuj-k1GL4MXXTk9n)cBut&aLSZOziVUj?8XCn&KcsP}riD#(!$AL~^V4R#2 zVH}FeA6eV3QUH>|KsYM$2MLh&8I^ znYeNMl*`&7_nuHKlV& zo#nP?xYk&$HP4y`Z(gxNR0Xw3phDA{b^p#N#X5n||9llBgHX52?D=(^VnA^iL9a?p zt-Y>~5qm}{2%2bfva!DmI&Ifi?14C=>vYh|(9-yNeYor{0u9LQ=*R5*P)1&$TchrF z-BYk!zq?7-QQQ+pro<>OaTZo8@Jg>1R2OvFCnYsn?i~!DCiMf8JJ&fcrOqlGhsI}i zT+fE<2Y?3yr1IfHow`6h z8IA;D1=g52&R!|I4N-7()ps=!UpsH}eo4h!kVa5SC^`>XLd-FX=}1$N;QgVHs*3+& z=QD5&Uq6<1`g74E5F81|I>x-$T*F-W$RiQr6HRqpKO4PqHl0fFm@PDe`ebS9y5CkG zKi_)0ot}LLJc*A>QYp9b;Y>_t95OUqTxQUa!(33v=n9rl|9e1Q8zEYEFVugylBLr^EprTZ%6TS}WqDobh$Zk0kt&n&T(&E`*1WS{0G8dDiRi>+8_%qT4^0 zJQK1vbUWjHzvkJ@>>d_xagoJQpobH05=r`(e22SEoQL@TUI0tz@$*3a=*$+kg8`6> zxv*s3ks2IAKj;aVKT1Q;Pu|a&X#DC%QnVJHcGcoR_Kq$%VS;#V)-d}P#XJSh^f}Ka zios;FR#MBUo;hbcN$$02ELOkVRpdDTGcW%+h#EoVW~6zpm;-ZSjQwP_ zb*l@PVo7`0+Rvsvm^V^2H(;g0hDI`o!3P&&i@z~fzOJ^7s5gQkaZ<+9bHAIjm4@Rk zlee8;OJUOA?8dFDC&Qsv(s8+rYhmmMKTG~C^0yJ;h*ys#5QS80d-RsG6hAqRxguJ+ zDN0w!%VFEnrL2lIfPl&l`{Mp&eqQN+g8=gSw>M8>hoK^kl+O#wJta1|6lQ3_nSRL?jo{ry7U?q4BBNY~kcpM}7WqtI zfU(oK!;>&aQ1qM!k|mj8$vGb;7x{lQePdi@?e}+`PSeS@-DKN#O}0JNRFiGH$<}0J zvTfV8&8PeK|2!|xoAYAtYp-jquhygIw@XY#UoTKQQbDKCM^2Jqw}Gcct><|8P}m+)oJ>;38HwYMxNM6;mA=Fy(kV;! zn*0@AMcdx%f_eGPXAHCqBe3*b+uxO-&qyp98p&#DQrw1NP2Z3M$%8J_9Oxf+()HDy zY`W*uPj;Cym{x6cypnb~CmU_oT{{;mn=41{Lfhrlw%kB4A;u4->&}}etNbcMv3qxS z=ok;(v0f0qq)4*KkOhI1`Si$5L@zcThCj-c`=d4@N$j$aHO>IXyrc@J^2nTZAlEF9 z*Iog<^K~&Sx4ul*408_x=gZRyy-kOjhZLxHk)>>)1H`XAlh7dt8Tub>IUl0MNChy> z9#gKL7u%WdW}A+wQy92DB^^0w88;d!7mBJH!&WUM;`O*Sj^anSYd(9jap(m|QFXv! zR10$D@*FFqWWQl>g#^lu^hJiF5D>a1jU|`rQ99D22II;Qr|n9ZO#fJ7BCU+S+yP4= zJ_Lt9(l#QI`RLWV6mqIYMxB9O^!NQ@LZJY>{IdFPVGTZEZA9vF5FTi)mcENw&kDs_ zr9SEAjVSlJL~F6l#W!-#K=~ay7>RewQ)+&ZUT-*g5jm=L4ev;KoU2&gba&>f-5vef zftIetZLW>4g1t^KRzz`~tnN^y^If0HyiF8F8MRFln%w<_6{$t%nIHp8U=kvj6~PtF z>`A%Gv()tt;;WK;k=|ck@TLY39io^)GqP{tbg7!aTe462`FVkB*4d62XLTAQ-Q&lP zvWon)?|YB;kq)zkiQ(C9GBBA30udaC_We{1~mpD`%Sw z-MGz968*)xCWw}D?;qZ-G6nae1$tq)JYKvHzFY+^yh|cy8=D^xt0P@$?X=p#f|Q%$ zVrn?vWi)NVR1w;;qEEY(qCsTvIhOWqlkg9eu0?1Kn{xeD*g%+KE($uI<6`=8?}6j* znKf%^MMpO6E85-~_mZiK?LULY-h*pEm*7#F<8aY@E2((^{gN^>~ zQ+vwIk@N_KbkTGyoUly;<@#>#`&HihXv9gL-(rMBwYk+j&v7?p4rw~ypEu9fn!BrY z!X*qmgfTexly@})9idj`NtdC#zU%1D7afwWc*6jDv>8F z!SXIzEJ{j0 zHD5O&{`B>RUMWmbWzd}P(1s6^>+xIA zGsw!GVE}(aA8xU4Jiv=%@8f=>Pugq0x=783&K`%+MY9Xe5|Mk7m#LP!4!M+8opphRpZG}Wxex<#{c=&_IiT>gMVI`<-?$+h3S(WqzpK*9}R|NeXymN5xW zTyzN1vE1hncwN=L{3zcnjnKl**~ZVD76r}xto^h2+K@DThRee?D*wcs4yYu?mHvh_ z)jw4&^_PJ{hFPx`!W$$g3?I51s4TvW2_xe3KcqJ7%Urp$Okc0^mG~qICPS0Iy3ul9 zW4W|s1OFbVpc9Q~73zei6B(oRuH7m}mVvay#RS@G7K%-J^3=j`9a2#)I@s2=1w)CX z8nnm7zdg`1u9_d5G>KuXZxz={LiEvtoA534D`dp;QM&~ZhEWL%c@FQv#mi$#_Q_FW zyYCFsvEAU^7!w0=~vTK5(e_ zpsyb(KyXf|f4B|lgdaHCWpIcRr^GTp&qxjXr!SW0)vD$>YEZIQy=iIlvof1B&_=O~ z!H6j*$nN4;U^5+KaYj?MaG zLe!-F=MGQ2OR{mqlbWrp$k)bz>&GOOc(YeiknY}I$-suv(P}J9sTHieZ22jLaLvpjF#n(8<^dAw)WC_yx zs;@JozG4A~oKUTgi2npcFc?iTv9!pqptCUX7I-A&ASe-YBZ4<<`%rZR!1+SUse1@C z3NqP^Y7Tu~d{cTih*Ti7bZ@JdH!B;rUIOfJKV%~;V)c;8s?o#=(8-j*6Twce9p7?W zhZ+4dXky3oi7_ zX%gqzf^~~|Hm-W)ZzE%Kqz+^fzlfkJwFQQcZFPZmmtEb#I^ubDS2#WMtHO9!3>Nf) z*%8gB8+ZCZA5cW5|01G=qb6C}bwIM-6T2*6OqN1oX^#a>mRoM^xSa|hnT8w=oU)Lf%_@uD|aokR4yb9pkX7djvHl5Gc5W5nRTE)Kmq z8VwS`Y(^6<8VmUksyv~qrDoP52mTT3`r5B~Zi;dpg7j)iZB5EG>tTLzZtkW}onflN zNC5sJ@tT4LS9y|Vc^vG|HmXe3gx7ktJ`AQ&%DeLTGRHCxdO-KVhK%40@j%g^xR^AD z_MdLIGj27y`Uxow<>4wkis-l_=vm)(_cn=5l~C#>#fQ;drJ#+sDLO4>FMZ>NuiMm$ zU6bayn3*nu&9h}GX2b28GoD?`R$Q!`z{RlFnJPZHs4(={@Di*aG7o8eUQ6zubpbK|PLj^4B=H>;D){u1!;=Xi2B)B9Tvo%Nh;Ms3Ju3X;8t9#`iy7H-Mlz?l&h_9jx`l`Tk zK*IKvuL_JsB^Ok+*?W%U|zU3fRVPOF_G+-0S|SHjyIe-KqP-H?j8sQV96TOzWfX%!{TTli1{rGWd({=GG+dgP0YJ`4O`|!&Y9vh2 zySmXjc)o9|B%yWSROg%x4zV1BhM6&za>rSjG|zqqPrG`NVv225yAexD4t592oxj3t zu3<>bU7(-K4UmahA{8u#MFc8#PBUGh2=G~D#Nt$XZ9iA(xIOge*14RO@f(6etGQQR zjT63M`h0A@$4s{0U~o?A{a*c@dGwpqEb-6gSdv;TxhohvvBpaxb{#Hc}HjHU{%%JaihoY`9 zV9i=N=5Bv7f77m2laHsp)b0I}D6d<+2COIbkwH>GKaaEMJr9-T2&tLG_GIvAn_p7V0#B6M@fA zAf1^DS-Y$j$7`0vqBZbgG^k9xkDy7-h%UH}lBtp%+X^X1TXZe6uQm z-Et1O6`8pA+y5BC1sC9bd4_!iLiSzp-WBOA9^;)oRXUCE1ChRT%v=?5khK}g+Fq{( ztKQq+?-n6ReChp43f4J(o_h-=s6svuDbOQ8Ba^xhAT@J67u?>%4+lStMdVQ>vRAHk z-cNtDYgfF0H`3&+E0}osUO+2D9@v3wOgT2k4uZ=sCNOjA8^78yvHzt9w$%p}LFxm5 z)iC=0N;4$#!C(s-;#IG!K5wgEx+EP1L9n6Y$6f?3$>ese#|t6U=;hqOsbh87b8W}L z%58L3!}gTn6B3D;JK6JtQEyV;0PqO(##6WZMmO_+_8y(!>vBN~_PG*Mwd#!S&tX5Z zrIVbV9mqvU+=K5?kaDJ$6KA-{wNY5v>Ra*!&aJb;6cw+`DotA&!CwuDF9CPjS%%Ro z;_c=k&sl$;`GpDnBr;CPr$qGHl}1XKMTAu_JdnIaW7!&-D)*#CBWyGlb*=3Q`S8~v zE|K3NZalI=?)(FMu6%At-^8|Wgk1TUCHPE2v&4C}IQfU|qnB^3e_B-au4@=QQs8m; z@{|Su4ITS$ilvO6Ayx!*1jsnq3x@#_j%t*6oT$ic?PjXew+4LjoTqDEk#oRfYs2@Q zeVyF1XSFKb!PSv_+QqZjMV+P3?2Iy|5x^5nck+-YA8j2k=_gzA2OR?mtnX~33rpy27iOe`BVe`v{9?x|2wh?a1RG9llS?T@q( zw0w#-A4F!0#1Dc>|EjVZMDdupe9Q+W_Sjo%p)({gQ^}T@-=490Fq^5f3v6-$qX6pPZRlyzF#hrMHp1I|7H5FX|6V}~6JRN?-Qza@U^?q`Nuw;=7GT&7Kb@^LYw-ZLi1@@MFU*Lg z*w~N(+9VW1Q;Z*!1=Vf{abn$I1a08iMI6-3KP^GCe6zRzM@U;zGXPtXZQHQSV{yMa zbTdI_>iqJ9C8F#Iq;SFQEu^k?gR@r|cG_K%oR`2@tuU+k@CnpzHT(d@d6Jr-+ z=M(1+hi6Y+m^0C4tohjE2bl_Bku%TCWpU;OE;GbUCsISEy?Q4QF8(*>!YJj3g5~dji;W{xf zmR5}b7<5%(+5L*rUlrQb(C@R5s$;k}79c|cg9*Q-Nmu<#@zf{h#UqWs#`_wW39!#c-T zikj-1st|^o(QHkC^YxkDmb$5!E_}ZbgwU#|bJmB99ubQzBT<=7{iquepql*^^Nda! z3r^NSZ10sc%~bVryl~r??7Rm7gl@!-R(2mdgdnO~Enpbs>Yc0av6_I(UxlXDadT;PE(d*SrMcr zuGL`j;4xmZKaw$it;1>=eIok`mD1K;!RqKt_TEg$?KjV!+>!#2B7My$2{YaI<&Xql z8EhE-EgAea5mT-w0yL1nyhuc6>S?D=nlFU+mm702E(}N;q-br{{HC02pSXUV*m`94 zRACSA`dSZ&A{gR!SA2%%rze=Bmz{~1-geI=Z1oLGA?8n-vi=zQ?cXThlGg@%#nT)y#iGA@Z@V>y};ra z(GIH?a%2@eBP^%E9Y9Ht^X5c=DHa>Nl*}De!S4uJ)6PggM+{mZ37L|r^ zP7t{q6N!9@L6QS~&TC7?nyFsQk?5l~!xtDUJy6VoyoPJ&U_`|2D#{o1X)+!4(w6Yi z3?0e$21xPZcjfPXkWdV8MMx-8LnL&)Q7Lm8Wj;K_B;a?wdrsE(Uo}LwiiDO#$@LC3 zzp4wp?MsY;4&}|`f^4FOm1amDU2n4AU5Ubtr_y!XoxjDLAWwkqdF6cF*bEAB_g^6LdEvuVb$Y4ylItwc*sJCgxs}7qrE!SpUejLy>~O z=@o<~l;CFATL-OaI$oqj#{f^X&3jDR^lV~rQQ*UTuhCpHE_p6k z#Pb$`AgK%s^wy2raqnqp$oB6`v^UBw5^o;xek{wyPpkWjg3=u!8#M@86uxg7owr&* z^j2cT=EppCbnmE=MdLUQXZRxMC&_VKscHHwr2e|?^PeMbNl`#2LqQm3a6Sj6+5#+k z^iyy>$KB7jqXg=s0U^tGB~g7;0?SXRf0P`{7F!rGcQn*jj<0WJnk zEFam#S+vh0Qfgd(um_F;3UAbb8Io{z%oQBnUs*EH6bq*Uy_}lF;~xjl3LcY|=OV}; zl*YNigzK-WsS7*#0QEmZ&n9+dCn~pTfMd^Pmr1w>&OMd0%aw)|9oojX`qwDX^xhyZ!%QZ7ZJ#)9dq zN!+R?Vst)S8F?!p3ex(8taFm9(YWA1UM#Rg*q7g_n2+pF4cbHu;7?M=i%%b5Q*a*YOUKf zAsuJc_w@*)-Mb15!(?lo==Iyo0kLCQEQtR8-tu|ppPE8n6{0;n_)W;r&s5Ai7)d3} zOZGVE_!R4aciWaW7mVbgh{nY2%2q%L1&q&fL&P~!N_1_}N@{3q^gf(u_j!JrRm#Qs zS{yKrT|Q>36>FmTr@)&3HvRKu^|$$C+w%f$Z?8z6?^6TW4w~MNq3smqIw5dXI!^y{ z*QP0A(iGr@1)uszPh)}BssiOcK6yT7qX^iZPS@ceqGpM;p;*fTHP4uL{IYZ%jj2P3 z%b6Gg z@t*5;G`l>jmEHOvaL+zO1X~e01YXEuZI2wqXrlc~17cp-AKU=zRi!(!FR#p(M@bl@ z2%AI7x>R3==0{JeSTVuxoua4hSW0nrt*x$Cl|FA(a%K|FzR_p+vwb$Y!b$b~PZzFk znHC{}bV)Tuwd>Jync{IuSC~4#>-jn&RCKnuskXIGqe@H}M1GMf9joWde0uh$?aQ_k zAq_Jl&t~RHZDC^jD-2VO0KIy~y{F}O?F?Ny6C@Z+XZSJ0m4$tC});@{TdL>sJD3-ijt&ZTcJ%d4=c7&+5O zqO1LiDWWLCZ%_O8g$p%GXh`0a-VJ8#BB&m~}trd7gj{ba^q^W%GQd3jgy$&~?o&u@DrzQ6^ed8Ki z+t1-GK!|lpHLNT=*$ik%-;VB%XQxB`y8VIv#dD-mMM~c*dPnP4_DZ0h$g-k>_pFCS zbGT<6hqNPX(hDdNalj)ZqC{2at!RV<5t!HpDL#BykrZjFkDUH1PgF!-X>|FFBlR(8 zeix*^x=zlf_Eu-k=#9MPKYwl3BcIJz|D#VlH|jU?y6RdQ%)bzsGjF4WDoQ zkZ$)Ey6|Ih*<)m<*9pK2{h&aT(}4-vw$CXYNVxVWeB*ZSyPj$MEAqP3ZYI~<649wu zhAs;mmsO-*%RKdT6eVW%%Y-!v@f=~UHdY*h;lZ8`t@ zVvCKI|JP@c1G*yss6ZXHGv%WE03tvDmQc)Dj!Pt5Vhu5e=e0X0`eit$kW6XxYb2AP z&sHA_(-j}CyctWRf=P(Y5g%^Mz7t0F$!B`pKP}6IzQEb^T+Upy)DWRUg*^ zG3(7)LH7x&2-U*BN98)mq6md**nruU-(^sNtR5PIhaL(&SxCR?_ zT1y}ltB9dhB%1h7U}QaFH=6XA&*3y?N&||3J%Qgz93Xpypp79NnO5|&QEcFC4};cO zH3XHy$lNqZyKE!94ilZvCk6r?4K6ilH#)pN%c?p{{)}7=OOq!MoUu961n1FU)lc$& zqVzgHH^>apT#9EK?-?vno0YPoNF?Hrw%W*~z%}8=WsQZ_{pqfot+nDOVE4N_q64n= zAIp&eBR39H0yg&Y3cutiUsm<*|4w~CcV?qBGUpkn3!J*WgPr98nzRoha;cVQsoYQ> z9v#+a*coqN$-^h-N2`{Lr(bRg#&n!Tur>B6+wD^`$Hw!t{%Nk=syqH0lvRU;)m47> z=W4{|+ttbC=XLiugAN5O+a+TDK6=A9nmC%&h~u^1WxV3-+Fd(W8hN%?uwQ>@kf&*Be|Th0!2}l5SSs5xQcx(HR1`;A4YrS8_U4Q?e085JX&Of zRZtWpo=2FLTR7@~23R(e>x`U$1j!j5nlDd-HWk|8!NKQKQOx4vOtU8eZDdyhTDS)t zHMTsVrKuO6*L~T~RN0I6%Qkd`kZnq|ElxiE9rLEKF_Q)>wrrOx)X0#zQOY+L%4Ezs zav=i`#NEtl0g}Vv0E9`KXu}~An*~caUHFfpSEIknvIy=`|99{~Usj8gIKLbtMIZty z0CXCwtFNh_TD5SMw1%1-fZx2Ua*K}ZeE*uHhq=uQq(_Q#mGgV)Cb^>}5sb|8dOs`V z@E0$zc{p4~+7>4ZBUEAArtFL?_}2N-`E44srt0U(_@+65kv#j9K8Zn% zx0{UA_MnM*)QJo7^`=^O8ru~G#pwygHO&3+Ba!VE)l1S8613i>KdCo40}%?jLXR@X zk>Te4ra?zNQ-DO49od&|21Ec?g@RwS0>E}SG3H|O1pAX*vn0fAbQjs=dfjAI@O06B zLDa8%`toKFk&w6P(yPhEBgMwjLpchjM2U4X}Qejku= z62;HUAnhs6(I>-}-KvfPzgH*lYOwQ8VwG|t&5k_nQ!kUL?)Z(*X7=&691hEtCfs?3 zj?Dugh2Q2<_2A<+gk8U8iT?`G890FFsG9TL)%ymSQrzofVLQ79 zU!r4Qsh>VI3F7{jzCqWwnw_~`W{$L}udH-F*;uPQvaI&Ei>)x0);X?Rb&<)iN5tXM zi?Y=iTYYWKv?{dQ3@XUCiidoUWv?SDqGs#XG=_9UvxOuUa!)Z3Suy=!dge;7^b=r`RiD@u+0z*A#*XUfOlJ@Vut#f#b6~@sE>>_j zDbUW%#8wF9G}aRUNHR^;q5oXne23*6R_cZdrhiNI8F4B>yLw zKmTvKb1t6x{Z+06m4P|d6O*zPw7kR!Vg$~8RDgXpT`C^NPy2*oj*1Q*%rFO?M@y7! zR>!{28ah}rsDMEQ0s$APKlAJVz!5-+LunruF&`8g9PaOR0&@IqLTzJH+A|N`c&_%k zl}op$&x5zA)+PRPP31Jx-IBAn74i0^A`u2gIR4WA!Mwq_oG#Lhvoaomv>b zR5Njd@qWUr@QryUsjE>?X7PISKJN{)#)X<1TtLLg6l8kHKL*Y!iKIWXv%~wR7tN;X zeDO#ei`eXT*FF6an3E6pM}%_f7hDu@=87Y7}&5b zML?t=k5?qIuNF*kgX*uajzAy?`+0i&tE0pDa>8p&q*_4o&f6EoNY1bR`+m5~#YXQN zx5ovX#xz*O(zy^_ynlV-*+?V4Wkw&}lNaoyJIP{!57ms8D@ zfOv(8N-ldvwR2K*=)>zzG`raU#t3(uFAnhj?n-f+3cwc%1_vMhe0KBZ$lnf7z+yo0 z_b=vZaIEoXWQDsHahFfHckq!gHMlgU5+MTzWtzB_rp3Zqfyf6?SjIxFtL|Fz?~ zJxB9PbZ5AAQKIv0+=mLCCZn9i@7=ql=UZRp3e9O^zoR#o?ocwaAtrD=+GrM55X>6! zD6z@^@$D+r2!uS1hH2poZqz{n6W?R^c9F`DCC4b+#afY=c;DY&cz=IC-*7*l*pQg0 z3gxY@K_{t=@B(Gipv9)>7pvW_<%EY@F70IGFjGHL(hQ95=-_V(658#buJ?I$MSk}u z)J3Y44d|ce8Y~C4@yR~?=-aS@35Xc(p(({U4M86TN1@TSv$P`t#jx}6xExLdgoTxO zmH;uO3gmh0h_@FgOJ;g{P#hkPg={P=QZT!uAx%hOE~dX@BBA1RU6??LauWFvVZ@g< zOnFY!%i>~WX}2hJUI+m8xZsTGqvKo=Cf3J`u$S#}7-J-;{!>GPf7KyhqUud*7_rR% zMu;xzmHiv+ zqAIeNklcU0V7U==tQ=PNw|abcK5bN_JS9j$N_Dg~@?^$C$l`Z8m^<#- zG7wNQ5`hKm&+)K+MIN}*9;-;JnnP;oKqN%z%_62F7vF|gQU;Tuyo8jgW{#^P9^eMU zK|qZ*6c+ARb+kNOXA49H_V8v@gozh9g&T zt9e^?SS6>2{iq5s4GsD8+bcJ$Uv|2FTSZDL$1L>xoek*`FxVdeqKnSv@^Ly$4WFt4*KbW9owN5!F zWF7UH7lK1E{!-2F;G<$XJzU>?IlcB>bA~rZa(_oL3sjD{GW$0VL5EquF4q0(rclj#>G-?AglrRgLlt(GLVdfpelL zjBmUQ7VcJ^dc16LL3;n$)TjXM|H)+BP05P!(ENJ8WXG1{0&dnAx864w6%BJsR>^d* zOkuhGL^#*V9*GN&PI^7gR<&JlqO7{z5f<42>qhGYd|viPcaVXA^`EyPbye;7(M7hN z4pRt{N%ah3ot< zHjerIymqWyB%j6m4F{xkt;Z0E`O-cP9r_h|C(Q}|F-UzFW=YVa*5Kg0`Zq8687&@b zeoLv8GNj%Dpl49oz1i)8HH+1&PM!GoZ1Nf7o9@yyZxcVXz z?R!tqEhq-z*{$zd8ot}DqP}H|QZGpkp>yoE=vxn{#QAnOjUxWaMNWEF#v=sG?q7LY zACtXqQrt%FaRAojJ=h>kE~ALQ;Ou|Y;(y2y2yo{odH7$x#}ok|+IU=HgJyqGQ|P*& zR7i?3Q?>)p9yCZg7?HJ}C7Ld6>;meFZ|7!b zblmSH9E6HqZ+T&uMf^371w=(pyHw^ug3Sn0t~dx^m{W3h|K6(R%$mdqi?8Bj@(Wxq zEEY#e8@FF@ksMWH!ITd4P?Y=L7=e4yLpOBE&++eSt9vN`Dkg_FphyLMobqgVMlgaC z=^Y5&Z+3VP4oP*kzdI=L`eFdnO~?x+s(4=qnk1kQ7Ys_|a@~J=R*<$?@y!Q#o~JMM+dCl;~UahbY)_MF{3WB;XG| z&nh1pjKL3hRm4a3uaCu-QneYRHUmMoiF~n05U5=Nc>%G#A%Z%Sql- zRY35*V}+nX6H&<5*%@opx@zscH6E}}=kD8O+f8!aYiO)n=adL7Az60TP6u0nm4%b;m- zmHKmNg=4Pb-$vD|t{oJogsVMI!K{wPVk>m$Nwr3j^}W4b4|FwuY!wD2h}vA_h{xzU z6?yR@lo4*u^ceB$Yv}8@I_x*7P(!+;6jgXsS~0-%T!kd7vMrb=Mxc`&Zg5du>eX-b zIvMH3=Ik0#l~caBNnIfSVEVjflsGF58>U>WTyOF@G-QtJJENFwQb!yLW_*?m=ip;{ zZE#gyyfZ<;ql$2J{CdD;X_{p_OXTr#Bf3SacfFS)lE4cwGQN?&RjV*(lg2) z!C(V}m9Hdee;8HZEXtrmbgtP_-g|h`1I7=sq{L|cBXOtzA+TS44SwZy-i#6u0RT``MkxPM27$OHTfx)m;Zwx?oEVKIr~dDLFfi&2PoD3` z3WQZvriPxt-xXf7soi$Dh#6E`N%u$7oVAWVchfG)-#Mh(Xjc6Y1n{~6lI4FXzZqUB z4Og6_#qJ9Rtz8bRH~&bEDj>k!6YIYecq-8H&FMBixP7jX*j2CcP8c>3>AQuk`}r@X z!K(|iY@t+>Muz6!uT4|UZ?}XS%^GN1z8TV7|9JJQmL(PbRghhTQ-bFj3pM|Nkz+7R zx}}KpZKRV`xPSy;0Yu;8+}LsA;pB*bie-n4S(KsRXyIF?k&(GKR~ehI-IkgE>t}NQ zAsKkTpXxs*iK?U}!}<-FUGJaFPM^bzvt-L`z8=&)FMmgAg|M=ll@oZ-cKs0%|qoZA#z7hJepQ z6OlZ8dF^F}wU-2bwi53v2}O}EsrM-tDi>0epZGFK!bNJv9g@cgZ+^Lck>gn5h`P1Ux=Jxz7#nynV_4!(D( zEz=D)xK=!f3qeN5o5A|ts447VyVg(?0~@1+uTnE$XD|}USXUcD;mQ+ znC+tQi%OyN-ER5l&|q|<)>}Ug9c*=#@-vU&mVhE53@YW#^J_*ep?6lym`7&vuY7*F zgVYs^>Z9|@QWXs4*LaJH_h|}j(P@C1JKhAv2f?MS6-Hu^1sM|zbss0 zvw~T3y1TUjiQ^upCPF(6qRV(byp@(|c^OG$OQ!yts`X1?k>WJZs>vQ}-aCd#Mv%nc zHGD+t&R3pcNqV{ z45ngVoh8HR(2VyFU`rI3HPEV|VLxcU+0vwNd077AS*?aVSUiL?DQG&n(AID8-S zqoSv>S9PtXt}ZTN_S5<0hwqbSi3wctR}5A<^~px^H&AXU6BAqNxG95fi|clerYNbA z=E8imHpC2{Ci{F~aNH^0bTodM(nL85LUH?jO-W<#3#2uG+0i#9^kG<>*Z2FOc&)(F zg@KXpV4rM<&*wJBqAl$hgLpo2sAJPo_P5|_<9LaO{fX!qqMxGk98hG8z>e>sQeb{Gh3)y6x?q)Jss*}W zyT24@%`UqK=fZ!nV6fXGa-fE*+1cc>v(rEK5*V15@oLN}UJb^{LUygn357Zs5w%s6 zACJRb9f(j6M~H4>wnT0G6x11v8PVcI4ys%=egG$6UjrVHnI&h8OII3aZPiVS68|q$ zGD{>!-8qjB3J(2$mJV=mQD6E!=6S2A>z6&E7pD>Gcwg8usFNU1Lx&USG@;WQq;O=xJHBvi)v@jXoa%+>lVE zRL`&r{68K7pJ`Nr)xQWS&3dn2#Qy(;@mD>J=Xtm zj3gje)!k?iUVZw1pcyJ~q|k`IeFBK(suK6_X9Z$gI|Y-kgPH37gOz#YdTu~lb+{ev z-yqg7bAa0Xo`&hsS!+qR@s^HOL~}NI4q50<*ln_5GC}mcK#Pa5sXaiLnM}kp0wOd( z+*m{4W;mZ}ETmCEeKs%c3)8Ii`mT#7hclf+O9W9bfiZq*E~cp%Fcru*?(UMZ#gH(( zML@iPQGrB!{l6_6?KE!Laf84-G3B<>fJXje;w7ZE?dKqn+SQvd=yrH` zxI+a-{ZXa*AOhIQx6aL}*uuYgnC&@Si?=gUTzhH*7BR&_1)Gm)_)3Hz|)-Tn$UYnT!K zUpKQwE|@c@lAjFrV+At2Yc$Mvvu3QJnKDQRXSh17yDbDljVnpHjuy(BBg^(m@i2*` z7~?Evf6iFwyWvo1nTWN?2)g{%q^>u|G{@GDIlB3abM-}h>%F<4N1umLj*ZW(%8)SC z7?IjZS4;IBO+Rx(a=#sqz*0;m1a<5&7*1#hPa^c`Z@b)swbi*ddFV~t1c((Gs7T~} zG~3_27_%8d0q zZyni|6<@64ApaT-!Sho1^jGNCf6}nYu;jfTqBGGtI}wE125DAmBqYr4?(RO7kigfJ z7h{Jb`>ht87Os{fV?z6AB*#1k#VNvdOoytr(WD-YPZAq&hbCf%2Jab{*hwZ1iLBnP z^{!Q{n366)0YX0%`Jt%aCI2_9dd>ktXT;KFgPgcgg>}d!R|{vBq0}E!LP=EFL%micYJr%H2KGGjz37(6WKoI7PX_6f_xG z?7Ssim-Kv4_%yV49^n)-7?Cz}~0IrOZ9MSHmn$KV_ zxeLw<_V`R- z%6V0EIVLFnbluu*_t!03o=*$-v(+?9cb&0y?gdPkxOux9ldaH`qfm~MOxe|F+g0q9 zs>M4PGz<~jfru*_iiXnT1+ra_8`pTS{Jc#i*;$_+yook&>+r2%``LlYbbcqOk^m{V zg7Ggn@|ul?Fsx8`de4um-u;4>?*CrX11k8zV&})bcQ=9T$p6m*Xp~sxwgR2m{&Jq1 zI$8fP!n0Y$@v-~;GR^m7YQVAPV3K>EMCU=LuQ#e{-74*%=kzKV)wh=gopAkC3P}h6m-ly4SHiVnYuPd@KR2PgaR4O^snE-R=Ydy=slpPs1&MuBm)SkM-YgyVW5$TCv1bJp|%EG!XkUZK$N9v}j!L81Kf%7e?oOS>pIB1Q&E zmGf}pBx1qQ!RTZwj|#ZrueDFm{daw_cyN!xgu2)#20mZ3xC(EUOovJ%b>KUpa}$Ev@1bf(8`(Jx9mwqgZNEAaDvp4XMz+w&sR#yTkT}4 zyQYVz?lGvH3Ca#t?-yD`p>QtNoFiW`F)3CO&FD>&q8RP zR%hVhNrW(#T_rPh=?=nO#a8at9b@iYvirdWES8;qfchNWIH3sv1kq&Y8jM}15h=NL zB(lR=>DPi$9CAOMOd;KB2MMA`Yq&WhY}-A(M~L~}53yq_M^^ndUe7)%K83a5HGiu> ze$O^DH)qh{e0(`g?%58_qrU1Fbg{E;H=pc4-HiYvEp0)O7e-|;Uzm26u=>afYdQ^Q z5)u>wNh>PAjksGZ-aF+2dJ3Mr3gf@{$^S>wJBC-*bxotOZM$RJR>w)lwr$%+$L`ok z$9BiIZJRs!_Wiu){M+lg_P;sTSYuSxsPehWzIce4Xt0dsf9Pa?EXFh5eOO$Dc1;+4 z?Z0fBvUi|b&)7p?;g=v2EH$FiIiC{LE)T+lequEUG@-pzsJxKYdlbhB27)Y9NrHomR#@?j%!O znn)qZ({2c(TK?Cz_7ti(2M2SpC5)9K@_!5h@bp$gL7G9CZV;oA$wU#vps__- z6`OD8ifqV&n7=(`r$LM2(_h}Ad0KO%P%KaP2yMr82F&@M`ZK(dDnwK-n|?kLk6LBF z$pRhS<~NAZQsM?3h0AKxs-lSqxZNuqPCeUIXt3tvs?GQqh&8Qux45=LHRwBoL1b}| zJEmJ=-Nf$hKO}gpf8?oE%0zxIS` z>MWf2GZu1&ath|yHO(N7BCa1j+5Xk1&$uDTu23l>%lqEo z>#Vnyz6Kr)8kp5qC{n7}N5u-NW*7oi7F`XIK*v9`9uT@mgcH?gES-*8oa+&pP4xzQ zY8xNi&m!+~c^BGuSJ8uE%XWtj^}-x(M7R+I{l}(u5e!O`mQ=?}6`ihB?JohDVhrEu zkvvS|iAy)*!)Jr(>8B$>J01&6wv6X%Fppt6d?jk{=XC^mnZcQxm?5&j9|_=W4(#7N zP`M!-Mmsl*wDJFgV{ySe8?1DGbVax%t$x`$=-2xl1QH%oMHB6LwU=Ch z$CS@6(YhYT{|^7UX#b*wEc`mp(xy+P-^k0!31&jjtU;%W@0UUVBk43q@#*v(D@o{20D<=` zQFCUBB1FMmt0WIQ@b*dDGhcW*X;);$7P>@kRl7FnB+|c{7ErrD$M^DD1q{V|Gk2+xZXW{ zFzlSaw<=Az(ZYtl={*&N1Gx?p#cScL*?*0R1?ag9%XBbCe0Bl_|dRiC|jfr z_zyUbDKol0?Da)K*!7Jm;jwDfi+Y+PjSuZ#@ z<#rpufxp}D0!j26Wd*B6;K)T5V2R(|hahE$x+*nFU*s4&1SOtFTBw)-5>CX(rueP+ zrzEjX`~Z^Up!Daz$5nuB-=gRv@hVHIY>89?Q3$rMy(c?Z3p~|aa3@;pXpe>gDn7g~ z^(XI@OoMrLC(>7^hO>7y_9ilAhA{F5_HAKS~)(#1+|dxaG*8JUOK z@2w?`5rSplR)H3T{Jg{g&Rpj-~$7LGUCF#_rkU6F=-+EF#J(!;tA$3s(N`)M4ltRNO7L5qd#Wt zA1dT0$!(sD?T4k~d)}9k6?HukXX3z5)Uw^O_5VW+sKKCvfb0|!*i+G>IoD!hQK-hu zbF;dRfj&+rK;GOeDm_^LQoep~3XAsTcwPy&v-2a&p5EDZK2Zw25C#l_-!JIWWAcyr z(DwJ(&hQ7c&z_q%bO}kQ;K;fqXz%9&9>#j#Qg2_rPwWEEw8Iy&lJR z7xlG8wV?=x%iHHvcIzBmuo_MDe2~pQc+6H8Fmm`h1=Hj3A5i;Mp6n8~Wnq4FF=wHL z=!=Hs-x;>zupbLw7*`!l8BHyAb=B4WpG^6>y-sXsF-r~mFn zjQ&>N62opws#9k+d}%EcafIa`bO{1eA?40hQr=m1gAg==x~0dT8!FUv+?s_>;(++G-+XCvnxxM7>Me`L^SC%OtKu^xv`eb9Ay!Yh%#Lv zlyP~To+qmu#$~X(9Qel@v4;aWRks}ZIb1Ih?g^O`Hd*O@a0!mal&bm%nQ$a2VvlG3 z6^o3xuKelUa&_ft%-1e-t_388vNbQCtETW|ifl7zmzwH$$ zh9#^JWs}{|@-P%*^BbMVMX=+mfr0&#`~V)I-qX4dub>OKzoxOif||8q6iCOm_$jzh z#2nB(Eq~SR*BVgRVocX;Fs?o28juX%Lr%&N#-S#;{V^-+o2(s@122XcCS)f_$uSV1 zeyV%&OK#52n>Q#m%ijxIN;Lc-@50}JA)HRTbnOqFODQwrHVy;9DDTKoBaE*cNlE(3 zppEh!aV^&yd$WGlAqMPU-F(wqhT;$Hql*1@Pyb)tZTfG$s)psy5BCt^5x({}_w(pl!_d_Zm<&rkU7>jnKYV68xq6H+M!d8H;0Y|GG%9Iq+8c36Nnec(L7q|cfrEyzk|q^KmyYvf`rM`)!M7+}5=(qfBQ1^r zrrp~wO$fY1T&>&sTZtqt(eR5~n0NHK0{LQ0aS~dl=0b$aC=?O=-aO9W6I4DDrWd#Q z3o&nGguZBXLZi~@NBklh@aL|`wVeupF`*BLmP)PfP5RB}?n!-qNnrreS#^Q&e=hYO zfqgyK8_$J8O|ZbO*N_RNPqOBmBptg6yPR&7h)YBJmaH`#P z7)8BrD5ofiA_JCC7ruYFjd44Y0`Ma*gFqD_&ga`H{+HJaF(m>U&Zz$uPfypc>Ac^6 z^;BXd9TzJ-GZC+`$RZZj;*is55q$E|{$LSG5k3_|>QY4G$9(=Tfuse5 zur06vk+oaPGjP=Y`2{MsU2mZcY^F0cwFLTQ?en8HH_Ioz%f2J31)A+tA~n-XSBf=YQz^**n3WDtnYDh9WqvtdE@_*3x6^r zNoF)F+_osP(`r*Z%tH^S@Vm(p?X1t2?m?Yp6f zTP)WtZ5cF5sf}x!Tb(aL-=8)=7xL!VJMAi18d&nx@>c&Ac1RlZf87Q@?)AREy=fR+ z+}!+9Lj*f?UMnH~_I3C6ejYmn=y0J5N~NiRDQCYXdPUZsa^O!l6#TkK7SgLrt)ach zwIoLk^KH<)e6HDey@JCp6es&317@JnWEs7RQNx5Zh9PVar|f9sq`TM+{=DiK13+xr29-)GVVuAGGa$677+@U|kxq3iAox!ExBuMlCM zw8MXS8u3U#buBNiiM)>t>MA6dTWBK$Xy{9M4V?(;=kW7%oXkQ;S1X#^M8yPHm(OEy z;Q@G-XQe`5TBW+!-eKRJ3mWWNU{Q*EF&E2oH^wK0_3~+^>|Ia4r@{Hd&gY0NC*lY! z_aO=FefV-*JszwWsDq=6wHe2+r#mU?OX@}1g^EFaa|%>~SiG#s&dZ+>E+8ocaLjdK zhG)yBE#O|KIB&jR%TqpF4m&KOg>em*HqmXrD-8^N;bv%=ar#hNY98!Y3U(sOg$0Q( zTK!#nH$#1)P+O>6VrnB!!BNrHS&r~UCx!YD?DKPLQ?20067+}BC1J3nNyBUs-kO^R= z6;3bYL30KM4qs4qWW=ITp~`S^ISe20@bZ0}d()FZa=^IsGjHv+J0m}{=Y5UpR}5Wy z7?rKy#5is6O_QyS4Jf@tKC&d2rxZ%Er>}6SxT-?zeir>%P4g?+9(5O?5a4hES;)J$ zS13$L{x6Xe?GLv6F!Bs+Bp9J!oJUI~$q(5xl@3$m5(n=7?%7>s9+77#x6twD5H)=H z@NjgIuIc`VV(@3^i|BeGcL_A>x*ot@_RY8S9LY zoGQ#u_XeHK*&9?OthBe0>7K7+DWSPwC~NZZ@sXzi{U>voZ6k#Ry z?3&QiVS3BtD19!Lb9Gv;YijDoR6@LL>qO*!WlUM}$MnMJ%Bx3@GzUA^wqpOw*c45} zalMpZAWD~BBq~?S5U>~CWK@U@&w%mEbwMt_OQwjjzy1A8a@xcW3WC>8!rFDJnVJ>m zDQwsF=DKcM_OjI9$Sl*u^cxSABiEGjo_jWz^Yl)zFS0;^jg2ke_nv1I>2@?1g>i!; z+=3Z-gBUbuGU?~V+2UXZX5&Q%{rAlG#rN|&z6OSxmDRWQgh|Z3_-q2uPap@B{O-j2todOED;r+|a%f3DkXL;jra6*0ymJF;hm}8n# zK~v~qsNfLfSFA=%6lKk1!pGy1cF5e;3%520WXUBL@FY{sunlY$%}W@}YHtK_YJ!i` zy6*^JYDB!uT7J6upV|2TI&q(<|DX+7SF0_IpmbQ!KhECQiee|?IO`U5{sKGg@*?~5 zN64Y7M%1VXv}E`C0w;$O`{88zR>qE+$YD{Xo$`=OgEX%4D$RT7LoW;%viv z?ktCfOPUmc7N}Dee3!Zs!%GMj=1DIC`BQjMg@hXd%%)1-iQDiptoLnV;K9>fdLh|# z?%8!&>gH|&F)yd4Js-n?Leve`+~GX+{r<`D{?vP*h=ssSjuALvaZuz_zFMv5--9W6NSenlo)=v$+NdO zLV9o8u$)CF@!7`6Xm7h48XkTknvA^o7q(f5MiIixqD7W~KYFERjnToqOZGgd4OgU~P+|M{IDznxvRde$eH_ZlvC==r0jW(DJ+#?4cB)%b^4~#}&v^A-L^M8j@(D!~C z|FF>a6H||5+DqzBcK`jqPR}(ScoWVE_`J)oA#VAuN^lq!E?^cf&X$JHqM+N|kVOi> z>p?2X0d|}QBGP!q%d=K5k@ttRvK95b>lP##VDlG(b$c2%oH+65*xPNMM*`$omP(|# zEz1`#Np{ZNwfK8`=oY^KMFcacvJw<9Y_gEaAe)M+2D?S${9ndZxeQu{Fzz7%Oyr{V zx2TGaiPX7`&ud!h~xAC=kMNGhl9a1 z>YZ_-3XXz!GY}H-uhw3=WV5SuW^}!yuU7{rJNzC;Qxgt7F3+ofw3R z?!va~Ew8oZ%Khy?o;&?{N_>s`4Ia1E6aybqw(a|Z-TQtMpU(?xY!)-ME_uP+^t1T= z9U6KfY(R!GH!tVN&F!G_1=$pD@xr`>zKS*ni&V417H!0IhAk9=yKcq8;ur;yH&sRu z(Mw@6jeDb-`)EHL(Hy=aGOW}f?KRr04paWV>3W~ncFtW<*B+wy1c#I8cj6x>ZmUo? zO;xwim5o$1EDdG?0l&Mco3CM}nJ(|J1IY2O$06xor2h$B1_OatgBPJl+^iUefE!H7 z1Y+(+OcXs?t@UVb)rgBdNY6TFHYJ2LVQ3qmO!#rkfG0R#1w-a@eD4EZMAc9w1g9hX zi28ASIO|CLTqW&$c)TPuDTEvG4>EPYZ%tQ<8&W*CugYVgX$2nhbl;RjzXLord=yf} zhyioSO@d-;hwuYDR2YOMQV}1nef*ZQz7Vs@7&sZnCI|spXoSLmM7(ZrOJ(F$V#Ih9 zyG+ZVQKJmY?;vfP1EZcc$j=GR@J&QOkfTUCwuq_zG={ zY8hw|PJTCqq#uq(D?L5REOd3f&(^f5>i|tp>s3NFB}ZrK=pYj>md;xUNhtlBtqted zJ3v=;)m(8Nf$18NjQpx5eQNaE%=hO@-E?$Jo9J07imy_Z*C;Th6kdl8?|i? zua6`|=lUgy3l79A&=Bj}{wRP+&i6TW9ot5|Ym8%FEx^dG`B+sdK5lmf-l+6vII{x; zLMhNrUpzEFFRwS?<;zAx-$V;H6ZA-_T4i$Mh#!FsR(`XRa}j((UJP+aRHnrgOD4_c z@0$2^`Z*eor5qDzct?k?Zy!v5)CS_!;@q#`*m9;moQ59wx?Y#J?wi5y3+m77URCs9 z_i$ht;I{lvOF2s}yio>200mJn=2#sVNXATV$xwGO1~!QPX{YCTf>v)N(n*>rbR-EE zSo8YOBGiU_1L7qTN%8Bh2Q(Bs2z_ee0<;CT^q;@R?_zj|o)s>3e)pH+FAZ=L~8@_v*(szDjYX@7IqpxTzveq#qOxmz~a7FEq=ObP+G| z&NLN>o^heqtmZ#?>RjUcy;qcZrj-;iqP4+B;DUp$c7T&<(Io{gA{KveNHmk0t{f-Fuz6p2;0PFzD5|S_sX9(*-MQthC4mB-_ z&d*)aJMK}>W>6@4jI$C(C{eD4*lXtIP@9?*qjC8+!9YdS0eAks)Fd35H1G?t;qtl~ zysP#<7-5ezVvDgZ&_kqO7;X7-*K1nnj#$zS`-A&tUTzW?>Z%QQRZ~sfFJz9&AsXT3 z`(7N`zC*Bty&*6pI0lqG_ShXzC*jlOiWPEs0K4~LzJkz99Y{Zhnp)}S8U`ynV(CF& z2`fnX(^kg&TIl}fOjr=f%f%Ali#GY)ia1h-jF>g6OxH~n4T26hG;xD4FZ&G4%58kv z+H#D3@Fy!VoL}8dxDh7@9ao=^wee=a42!{4|1wH}Vdu?oY8$J-uxoU@PxaV&-DL__ z%vq4`@Q^D$cBvR)`SU+Z0*oMlWMD_&71zF0jetkK$09EP?HL;me7ikv>(kfmE2uy` z>jfnwzDBUc?=87KhbC#ZWy-;GkJjG9L=ZwHoHdL6-6SiPqDzM>)~zuk<|$6!>zj&d z+Q6FqT~waw0Tx7bTjIizk;h#8moqaQ+lPudCTW8oPCW=+OttWQ)oTpJvn75!vOqlE z@vl-9d59n45Q-A)t9Wg{O|Xl@9U=%~t&%Wc7dqeiAizuCe4VV%$4&yijJ?enP1%Dp zY#CP`@k^Q0LSoza!4lGUv_-bu*iJvpIODsRv4U+IVu3kZ3cSp^gCuFPKm*R*20J+Sg zw=lC#6U5F=;Q@N`V1z$cf$);T)g5+Ak?s3}QsMTlt>e*^XbNPf3C7|^e6SbkTTivw z9wr$wCHKH>;Su71zj@P^)>PYSQ;=w@f#WQ*5BW^$|IzS|;~u>a+t9@K{GYwrM28*_ z`n5ozX+qDdOl=nmTO)b%-41HIy~+sA`&z$ z8fIIXQOlmiI4zbh49DSG9&~@;EebU$rZ%P)>x=1+mQc5RI1)aM?s#YgrM-k7!MAV0 z#2!jvHY7#?yg(sgB~K|9LVovsf2Yvv+i3-Sa^*Gp@Mcik|ActJ*-}Hubd}e^PK%ema;)bx6KWJuyC*URIYG^oOZXT18A;ZeVv@fD^^xsu^Gki zsBGnCZJjAKS}fQE=T&4@fpbA|d4;P*e#*Gt{VYkW2}1Y*<0?sLyC7ZlYt#i2oL?laII$!T z{f959zNmnU;qh)Ei-3UN!F!EpPhbHj_W{`oA!-nZCUFwVY{pLZMJPT--Xei#3IjGL zw$C+wB`y(98V-@RTMo0~rtQkJZa)^W$Ym`f!^z*01poJRu|ctbPXMt@37T9!vx&~; z+a+sk;PNu7M%}h>pf!Zw3AfTvPB~<%bah*Ysm>4jc?+{_0DPn7DntCgkQDgLrC^%Y zBhdBg{q2t9_<93FfZplh!T!vfS>-6#Hz+#%*BIU&HQ1{0r@GeA4s?M`ihYUUcUqCol{_$ zL_tm~$W7|acYB&B!DvOI&Z{9=O^e)Hx=nkXs)FPC$&k&_c^%?)Ts5*^cDq4NPG}bK zFHpGJI(2Gub+&^|mNnj#g2kL^T z7_*)OkuEsC+v+B~F36V@*d5^mEu(#CxFNM}fM&>s20Mkwpj1IV17E=XQi9URWc$iC zpUazkIr{d?oxTK5(~&8|>v^Y8WNEm0X{o*c^S7DCN?*cRr6WD&zeqX8qj9s#N#y2> zAOj3;aR{zp)=7i{B3GMgP4!(2M60|go~dJS^lGJ1Ay4M`dK$8vSbggH_E*lGKC1x= z(IeFN2*|<%J!{ul=bVKxk!pE`K5J9Zo#;czhY=XZr79T)!)iEbLs8?a95W#=>aTonfPsxl_T33T|} ze4Vdr(tt|B$#{4l+TZi_uK7ubesn;18b* z>Zcg_xm-*r_Izu6pF<0M?j0^JY8V7`J9QsH7YxaY$NIe7*mPheNF^x{`O;EBb3l-~ z%XR8HM%Ab{Rw?|wr$I|+J~SSi)}R-KYVD{f@$6Ot$?d~IMP2}*S1d89CC zAihJAOhjpIp}9zE4ft%eFz8Ok!wJu(0<_$IqHvn(o6R$ z|Mp2mvQ9{9y3FeP%c6&5^OxRnw!U+r0DmAP1(QgS51}&*1gywNYx?u^^YwLTd_Rk% zKdIy@U*UDI?;1KNACUM^=jle>;6sdq-5rGRXQ9&R{l`uI*Vo6L0COFZsy|TbaouKfsUR6 z4i3OUb1hIK-sn`g7YG7z3;^NWIlCu#(r(ZkHJ>NikYHJ;U8Ved9lhL|0!?Qaso3s( z&-^uwm=KHbhz#M@ty|$)hfdg6WawmMWpD3pWi{MF=qq9HgPiuvXdmntR2G9&*O3He zsX3Byt)AlEIopEg;2Rhd+OlT*~KO3g-raZc!UtM}E6 zooBXqy~qa^XRReLl3D2U;w9j|PD&x)f=6ijl+}mdjHEi55>|KGWLy1}m7b=HdcLA8Uco5Q)CGIvDz5e3pZFfYpP7k^ zkDs5J3l0rYva*r8MRzpqq>j-)Auc%`{w~F13Kv2MqfLUs&Ycy1oESq=2|b0_A;oDt zm&De8h(a}X-E>(#ef{(?oCWi-|H8z;;1ATM4;zoo4tmD-XxgS*%-R`F?Dt-!!R*OU zFs6^m@q3$Q9$mrPrGXfEt81vcoIRmHP3k1(PGQ=- zh`@9>gqb*s$A_Xjlc+@D;7y-E6TW^BvfwX6C&)OIzeN5oWxb1o%3P%%?j>hD|DRsU z5*<{rbByz%c=$i5TRJi*iZB5|4B1!@Z`a2~z0Sz9{Yc1V@P(k-z6z?_k6+`z?f!6d z0y`!|);ZKq3W4~8#Cn(zWh;_WDY57wmsMgDvGx-8%jP>7lpsB+Y2VxD7yl$2f;E*u ze?KBnYEJ1vHsAZ|KhSREPA}^gVUNj_7vN5gggs{^n=(kS>yatL>IM0ACFz10k0-T6TJHGV)RgOk&Tzzk(?+SS|lgWAzcGBvyDLQzt|zzA@0 zeXo_pe}bdlg}>y2laYs=Kn)I(BU~HuGmWOI5dGYzTVn@%Nsc*m=sOx61wY$p@aXNj z74mR4Hg z+cV~$cuUPf3@`WHw?BmT?P-#tYU^mX`2ngXG`2Cs-`*}Z{KM}?Q$`ZfOD)i%cjM<; zO1g3>8VbR56SWlUY8ZhL>;9huVeq{lR}LF`lO45(_hEMIQ#cy|%=y3y{mHT504y`_e7P6St?K z`T5-yqL&!A$4d*(WRU-XIIt!$^nmZlZPX#!~a?! z{sv}GOc;D|^%q>5KY15!{(2iNX2Oc*a@cD7Si4#58LAx)hgBAy4W6iyrGp1jg&)_O zpZwE?_MV4o`EW`vQNb|$!2iO6oi0`!7|t5Km4upvJwf6-z32c~{}BBZ-@>Mds#npT z%rsX+9bGtfBz(=B{+(MeR62ksiuVISUQE}2rLWcm+axgX@vcBcN>R`EM5-5u$Bn4m z^-3$C?Y0ECX8IorDIf-vBKSZt)MSv|&XWdWzmE0KEu?S1AJ6nU5x@s2=-`M2f*WT9 zmB(K(E-IYnsNF|gx-`hDzJa(J54qq*(xA#qn(l=Ec#Emu^Ydx8CM_5_&78OaoEjh# z3Bmq+)`{~~t{!y!Cs6@KUNCXvhkRb6#h6i&-1nYH)N`yVGHE7rTG_QhJ08v` zI&zBV2kJHjJp+l`-~*udN9k1?DEJ_s92p;<9~wGbJZ!40a5SeF-r!Lp;wn!Dc_7{~ zHzAl=dexGkNrP**Esf(bsG}KG!XTzr;18Xl#7D_8I;#yr9ElvEwVxJNpxzpr#`rY+2Sg&)*4)@-e+%4T$e^Z8Vn zA8UswmoXR8?m)$2Lj&5#+5Bkv@v>W|6+bAIjO%NeN4NAUj*8>d+R`9NVMHxU6hND@HYyCvDZj-Ouazut)D zCiY)7AEt|0$702Bu$RsA+@ed7(&zXWg3+b7n6m*LX8baWH8QdBNQohDgi>!Q>T5WeZon+f^nP~-U&j&e& z{0RJsxFwCrvzq0q1YZ721eS@3esX5oOEDkfZ0{BV8q=UgZdLueRhMBl#9L;0sfWN4 zsi7Oi-_!XX_S1|}pTEuuFFEN(_F#iOc#otBd(XKo5O3cMaSrI^3gMe*LgwWL*@aRa z1cNJ1ty26$+?Sd=5tZGD@?R8d&e-kNQOM@n->F|V+3v{a7!!XlE;6e$>KGVn{Eeks3)C&W@jvigHD_Osf zQ@-UEZ?c6#K>jHphcLW`e1M!-Y_uggyp%-f8)5+cqc$vQXe%Jvh z#>l>nuAaKA`ySt(bO-GaCVnO+!EMteQ$PJE6!uDj)Bf!k#6Ac6nd2$a;c){hqucHL zMz)WS>QNz~a%8*A857$d)1>wYq$S6L`VA_N3!b}-fb<==0KJd;61wWq-4}_>y4ZWg z7E!in+f2^tzEf8uc<=qxPS_3dv!&?$cA0>83{WCWCJgaRB@8zErF*Ie{EbA05<^8f z=C;&(qAK=-zqVPM8oZ818$~BoBP)wM=R3YjMZR z7ku{l7t-xWU^wd2MCH&TvAIEe6VStXbE1;uqcG?ShP_@P>F{Z8P%36ZcGwsdGQ?fb zy61$pOZIX(V9h(p?0H)%Ux44EU6&DZ&{4-S5~MNLQGRJLeygvbglrEc>vTQ*SNLw? z(^H(y3O{i07(E5;V$2&dr~2zcTL?yaIy0z%sNe^wK;T9-yv`d)hq4{qOQz#9sSH8W z3~_j8?$h`bq5j-y#=(~{ePz(8!oOyV1bOKX7%Tfj^2gchq{D=vQEk|_9GIfpC!BuB z{|qz>{yx3=hG%bS|3wus@()sE6F0+7=i%jgdZ+h$PKsDR;3aD@9Yw8O&#G{lw@Znz z4*IQ(p}3${9kq``Q1JQm?!dVs7D8=m>({NJSTZN)yvNNw0Q?r>o~APPLiHKidfSv& zhmC1{_Y3E(@EMT##~gwR(2dsV=Kkznk8@CoyMy9>$obiRJ* zdF2dth+qb0Kmv5WQXKxNnTiBbz4=RG^vL`DC9kqhTGeJOI6W-I7>mj5cOuvTKEMiD$MXMQp|0>mmi5^A(XO-X7ctpUdc<9 zsIhK@+P+`!5D;!mS@)ucR}F8VZ(2;6SQ$0JbEJHui%UQGAypp`O!#gH938W}?_rnm zBs<&Md>@YOii%|mJ3QCd_CV)SZYPoa^}iB!z9#Uw?7#Ynzb4@8deUT` z8gmng#~YM0F8~4WXD?ra2Ae*Q%slL)6OsC^4r24hBY(A$+bgMop{8JP4(+PZ;^b3# zTDlo+veh-Eb^4vt4?Ts2q>&-o^j6uDPBta(!`-j@14OJjMsK+n3*DI=TWGJlWI-3# zQGyJ(%gJ-X{M3U*mCdv_Gx11_p4ucVEI!`nhY}PvWd@HkWPdy&K~PD+>`^@%j*it8 z7mzRsv}>qJr}#mC=xfQOG)PFg%35Obe~W*s&@925&t zsHku5h-AdOgJ0$GJ%N;~UMLF5T#^cS!~T}yM&t3hQ<(}eKY8%eFW9-Nsdnn^2SLa(|+9u6qQUtA((I{7r9J4|KQjv-MT{w`wA02Z4W! z7v9{~_P7U~Pn|^>ISb0yQ@9{GO`m+7lZV54zxMr@`+Wio#jX?USE5D}$I%zm2%Jc+ zNVmg)&LHv#$W#~LN7hh%hKKKWs{BLNHRI)-oLxfxlWY@Q=s|b&t%qB-Zl13G27~Lf-pLb{Z>K4p^*j(Sh2_ zpN_N;jZ^iuTlJa3vu0kq?F)V5N)kwz`EiPz)CcK z4)A$#+xndW4(4v_4K8|^C|QedD#$pn0_6?e=Pwa$)g+ICg1JPUUI#eO|GMrZcZ}x? zICGW%=EYDJB(Q8Iw#(^JefN^%d5-9D?x5>1j9sRDM9u<#oA?a#LeMd+MjW+!q z3tY{#&X~S%&|OYkQ-F`sUZp+w6QG~w_LyKO=SZ9FE>ic8Jtz0Mbfuw)Wh&Oy_=`W^q%l93ioR-ZEEC@0>uco3zgKfq?BI67IDp@fXL>93%6t53n?*7) zOailwx)M?BTjU>E`Xv%Qzaz@;!16!uoq@%TZpoTmiFWE~=?**H5t}np`&(=R%tCb-Ij-atgy}us_!=LT>?H-xfmM&u1T9 zX#20-Ki!SmS>hZl3iN!H7f5KsL}3pcBJ8jud{sLK)O6|7?6*6BOvyRFO=m>X2JmV9f|%?Kw;D zab?fHqkmzH7V6@v0Jp4X1S%_#ooe^K*qp8}7Rnfv!Xip%=cfNVsGwz-w$H$lW|3KC z;3EMK7|hZ=^uURMk5uZCqM6m#vIVuWDx+;bT@H33#9j~^k)xop*Xrdt6w3#+!OJT4 zXLOuH50tyfaC9&!1r)3lT4VZlM(3?IGg@6=u#o|)-e;cIA&!T2-)ta;I>u$L)JvT} zj|X}ZwqrmP6viRQI^)?zrt_MsQf?{stO-I|h_`?)##w+ThON7Uh;Y&!jSTm614NVJ zW^^B@Js;2SsA+Sqd333KK-J|mVcdwAhahtmP{_gkk%z@5FRE0%+R4{9?@yt)>@0Fpis zvnY@!$w6N6kGT9S>+UZ8HWmP3Rly(!xb!H+N|e+(nafUG1c8J`d%P0f4xk6x6!*-e zluNb+b6>x`UY!xq)>%P-eM!?JrBg5bjV>X(_7ARmau@)CUk8BumD4{@yaq~IMM_|il!^rDsWQsubzu=?e!SgI zwIS~A^t@RqQQ010^9UmxJE?l65-c|h{f9k4Ydw;sM1~gfE2WGvUOpdQ(xecENZrS7 zf>)Fv{#c0))HKEG=z`j_`*9b`nUR!EN;*XWVF?u6cQ@iFjT>Iw!ctA@vG2n0uJ>_5l{UAvk?Wew>tV7v?hyBjiYamQ=MoZtVNFUV;Fm79zQ#J-x}=*8_k5v zAGz2s@)L&7<;vO5s2A}v@Km|6o)9qtS~6T*BvA5s_ga9P-U>7z8w?j|oQHD=CFg1zoU@L&33n9bAREUFgGO)97KUAWn4!-zl>1LxtmRci?*8lgng z1@FhX40#?PQbO~J)&Q!C8(~4+1Ov;Zo=k1%hgs1Jct7=Y|I$qu$oqMpwkMyY-BFW>)V7xqcNHO5Mp$!0nu<{5dHsq0sO?s&;WPA z4RW0O3YVnqB1i)lF|AqO$}!4_R1m#m`qgTNS!i@+mze3vh=O3&GVeY%A}i-&74Yc@ zHlT)nE;}#?eHIOjJxa%})fi9I63D^B`0=e|fHsZvQ7PoM1Z`p&fWuHE@@DsW2J6&t z#PfI_R1hs|Zent9cQA50pq$~cK^lwMUo7oN?xa>*Los0=Pr#md@Ade2x%&t)4x0v7 zqRSa`F?z!H1tmHRPtFe5VSlW)>ON`pLVo=l};>)i_%U)r`mhC1|;cMe_f3558f6 z@V(DH^F#pP+4RZ&+#S7ucpLLgpAn7Q98kz3? zn!zI8p0Q{Fy01Xeo!bqAjVI@wrq(xyalep ztjm_Mc4+M_jv2%zJ3&V+0c}zAT!xV6NRy1AmIiR1j1kAK9o2XW+Iu&?7SLyE(#UD5 z?EBMw8xnyjv+*+S!%FI_E;|df>ZBpeNAgM5tbe-~pw zx$k7qx5Tl6qgRUV*==^X+|Vt(qu==#kMFOGPyYgihGh3k%=dmTQGTA}{mENId16bT zf$(gg?nRnJxw@IeP+gBJ?}KM^G|X&085GLE`Gb~%1Xqn~Kc~D@%A5@*SM!Npc`ahq zQ#gqpDRB-GDon*IUp*-HWUKboZqn6tPq~hrwe9D%hyn92YAmFb83G8b~`nE}wtAo6-ECsgeYh5h2gi z#Xl==_N$h`#2jbmj@|WaO+$FFxreKyrS>=f@~appagn*cJCI-&nH94E-}b|hGtfoq zD3ncRW_EHmGmC2{ZL@S-cBP|ycMLAOu6;bxbw@s=s}pIU1o1nXVg&T5X!)3G1>qaY zd%Il3x?8;pY$K+nnQ3ioY-DHajQ&IzxMpnmSC&wv)=Jy8A_7YDY*PT;f>0UzbNpy! zJ0mN%k?`aF$ws42Z?KMRMM~p^Dj1FGPOgy?0i5OvZ zP&rvuU!p5R1y)CpurgBFJF$K}n~+7cM}q;!RlD<79;3{~WLuv}wCR4$mmQ7A=^Cwx zV}vt1!~g%$bdB+Ga8Ebc*tRxCW7}-f*tXr+Hrob`)v&Q`HH{kEww=72JpZ?!x?lE} zojdo;%$b>UF2 z5ptR!8AcGXens|(kb*~7LXaHX=_EOy-t^P;<)6*NWml!sGM}LwlaZv^J4fPBYPuWczZKg;IQh%fAoHFO%0o_ z{TxXV`1wtZj`%b$kOh&6zZIKe){GpJs(@ammb#D>47|twK73?*{#xIl_wICMZF&Ci z=!j1j9F~}|m{hIGHd98pwW6+KD{SDTj5i-cl=>5+EwUBMA8y5!~KWo))Gtxq7Bflj?NkB+7oEbDx)?ke?{^=Ft2?>IcBaZ$n=0>6US6d1^}=xwxg1RPZ-qycG?~en zN^AvRZ}4$34#K47=5_zqJtn=$px39nGykWhHA!%RFUhTJVdN{(L&mjqVRpT6LlQ;Z zQ6}X7+#HWpOZ{<^kmA|N@cBXMrTF>~8mJ;4%4Ef7e*f5I22d0(l-ElYc%zb?Fx7&E z{0?Og+|-bGt;$;M_3C500!juD4xV~!Gg~rqa%1i)Jqzm3qlo}LMDDcpwe@ujqz25p zV@ri`Yk;uHRz2(DtjUfPmtziowf;VfblZA@o}=s*OVa3nw^J&PgkUM0AOlJ8@Zu!% z>n&4HQF8H=rK}BhbvJKzotr_L=VBH-Mdv0=f5F`2znuW%5f4R-`Spk~GgeArjq95o zUb;zMy0f3tHR*5rEexJt?%rMpg&u}yXVtm!PtZQMI~LxOKpf(FX*JRC2LNNvIu#Jk zyabY!Fd@xuH;=?H*y{688R|sCKT6vO;b=%{Fl#hIBFXn8f?FQa5Fu86oboZuL!=I^ zocz2xA*$y59NXzE+8?7UN7+!CRH^vaFZ<1|z2iTBGA?SiQ5^H?sPCle5Ba_7ni@Jt zBfjyO8`aan58ZF*dE8g&&c0}`-?(>haI&?w)j4wu+vpk&;>AJmwT%>Vv*uX(+1a|V z6T+9#@iQTteG#y*B7BIi%KF;;-1AIc;07;6es0NkO*=zLvn=!{S%ulA+VHokUL$Aa z+`QbC{#NJX+}oke+Vd=kiod-4bJua#e)hIvHpk+?je??L5Q0|eW!4)qI{?!Y-+ zTSxx;v-Z%^?``Nh11OUaOu(PuM*e=qQNcA}6Tr6NC9Ol=DRsv>xUPU0$|rLs{aFBM z?GGF%#+=ABGN5mNuI5n{S^}LKwvsR&IN-GDw<=M%7@V^ZYv*OFST*5Nm?Xp*+`VEB zwL2v6p3iWfgBplw9>g_Ka|OVDT#ykw)QZ&kBorM6eAb4HYuBz{mK zBUMzGWWhVLNkw?_Q;O^r%I-!<_n+mPztBjSpOF28dA3G;gfoe=x8@gOkrqB>3bH+U z`(F=YOsOdP`<(}qJinlHyq$0K3Ik!mi!ESpPK6zdgl~Nn`fWsBofHZKvr7(9ilC)> zs!hK{P=gn{&w<6pfXZhRnE=Qf6Hjd`<#$5_?!tDN39HwA)#ykf#H}7Be0J~{OM!iO z68n>T4@OGFVGAK43WiJ8m6kpd=@O)A6>gM^yh9QulUL7WaOPd_kzj^qG56Oi|B$Sa$IALS=;Q2YZR;!`m5BBmz zYK>#p*h$BU*o7;~;MZK~XM^V@|EHq2t4&X==Bht*BWNPn+~ z#-%w~M}GT`iM}JXzq)DmSZ3HT1G|iEH{(vS$G4+HzjzecKI}pM1!Nv_-$%>y4?p38 zqe<&@@Sy*OFF|LiX&C{ChW-&0H`r-^`%h74fAR>8o5>i}aI*d-CRKvyJcx`Aeh}ez z)94fuAi+voHhRRPkAa-&cNqYcH_*&)@7B%~&_iLaklB1au;erIJC*mV^a~cj?y&kVw zH}&>vbd)1whnzZ5^$BG3l5?{r<>kj)JAYris}=Vg($tMi7%ogIJRKrW}^6T_Z-RO&#$DXQVa zi`D<`4M^n*-8FHKv8}nf#ph}Yg?lxe@NY3pwKbqTWNi}--6L_K>iz(yPs#*%R%kl;DQp9ityw!Ez4p#WVcH`I~lb8@U zVB^bS{87dc0JSuo946r?wspzSj@IiE8-q-3mHMh_unPUagQT`NTAXjrTt$zsDd9S( z$T~h#P=G~%jlD&a&LK!=Z3t%*exV13x- z>t3Pvnj~%P=xD2r`OEh%mkU&Vfg(!I6bMxh*^R8TKj6d^wo5MR?gm9+eC72S!sEBF zKOBv*zxcu!LE%Z4>d~%Ts+Q(aA{1%e5{r#+5LiK}EwTrq-jbm!HhicHZ|3-((bn{u z%Y{SVkKB5`yE6g5XIMSyZ_8_3=Sy#w@r|tMWhjCbUB#t4EpF9=7U?~zuHVfJ1EJ<- zuELwxq@(hfxwzO^StIb}lHdW8i-O0782$Td_eJyMfl3qCH{7{Dc)2DYsf8Vg3@^3|nf|cT zdJ}3Fm$Q<3*q}Lj$;Rk4JiVJl7#QYXtbfelE%abB1%Q<6ptK3HQa_PNH`Roe@$N@2 zFTYo#nG$J0+1pNws8X$sfcx39?^*lZn%~ojD(eCl^EqGVn^beq>zm&mlfr-+Ezf)| zH|+d$)skXxi6xIY!`)Y|Iojisounic>b+H;D~=z24oe=#yYunt27j5k5PMli$rG2F z7(rTOeVgJgw3|I1l{mwzo~z_egg=07e$I&<=hy)~em90Q(_PmkD!G<`1#7?CT7z}- zoBIn;d2PSb*dSV+3XI@OJDcRK4;Nf)**DRaYqfJ{R;07*-Qze9AWg=nxGB=ha{0(d za^AU>`pe4cJoWSi#A%FlzJziDxFZ$Br z87_8V0esD0r}{N7g;>0)It>kVht)QudeH>PxtZ)o9}czl$A`VOx7RfkkRBTp9AH#F zgZ~ERZIr|+?Qs&tPg7UnNd+z>j{~_VQJ@>~JWF-mT;aSm%>|Z%R0a_RNnSn<1qFq) zSvh>3GiY=EEO;lTMdNgD z1rI6)x0|PvS-7g&~d0?y_grUb)Y1 zZ}w|J29tD6NJzcCR%t5H@~6*KH7C4g={#>PTwW+w#oEbVAFsE!w?ho3Xzo74sL!T+ z5#0ncqBkr!e7Ri7KZidAsJL4bsD2I!+bESPrRg34c^C4ku>R`N77${_t-K#-(vAjn|5g-wS4R>~ZsH^^(!4;uKRW0Qg*;2wP!QL)z0kRe^&)97{Maj~Vem`~l3 z+C2PN^!$+)8-DF!%w4owk)9X<640%9KYdX9=j~jmP@~b|`4J;tdHV%_Q1;y0(hAX5 zpF;(|kTp7w_P|`d@i+~5-q&MavSN+`kiit}UAyo=JRBbyV*YzaJ&|q~ee3We07p=L zh&#^9EtYt)?5UbV_ePs|9}27TrNEL1eQ>=q6CvMCw%E&MNrSb0fnOcR4I7FvQ5uMZ z$_SzDP?4z*y=ua%U|Od>L&BM1-H++{HhmzQC=QaFtcXp(|ETOx1F7H~{ckP&XSYe~ z_|Pnagr!DHsRl$^(ZR_kn89@$_y;#+o(KLov!sZW5G$>Jr8HsDQEnpo^m}7hdnqxL zo`oy9BLZ7-XLhle1j-#8d8YGQa1^#U-F(p(wc3Sa>TF-Z&hujRET6rXqU_ek%C)m_ zrAI@*4n=ypD1L74{W}qg;10B6GV&w&3;dj<^#9U#lnLVk* zmwNaEDRc>snHin^&;!C?mMZV)L6xe^YH=X8st$I5WAL|`_4&U)LDO!il#%wZgNAk! znD1pn3*->Q{(cr8KF>$=BZo9ppnIK||66jD4SF8ctLrL_%!%|%3=O(-EdLGrf%F_- ztmsGpR4T0w>~v51NddSqStJnlTM+lp$6#B{$l~GpmX?-|hQx(G*EdDHb_rc@u!2&c zr{9HMFXEM|@hPhrb(?UbC4xozg7j2P`!!0I+x%WO+LsWb%Z$c8!I+64S2f|J>i#_} zmEi%E_ig1bYSlzj^xR=_6P*6sRKwQQx;3dw;$~&GhhgOBnQHa(j&64AF+&-)RN+1y zwbbU+)B`~xLg-V+i=p~03Sb(adOFDxVXgIYH5;FZ2qmL6*InHks59rVp9L#@^(VKM zlqh+9u}GjJd(SW=aEZ3yv@^nq7Dr=#TjP1HP2BelUmYr8)1?1oJ(2xrcjy7O!KYjI zc0FPcsk$#xVMl{t+f*UXeGL#G8#&cE=hSVN3~^YeBR*5=u#QFrmkMMS1`=PW`pddY z_LLeVX==|WPb2bs?m}t7NhUdF;GhA*!dOr&{9Y&5UiV0htpTD^KtxwFu{p&&&e=Jk z=W{X5<9Q#N;PRoD;9%-;JzPS3P?Ib!{!W(cU+xdi+0P?7Sk!x}h)WHM!h@WyOGD|Q zbsfo0f5|GXH!RuFV@c~v@e#wfF63nVGgeo}aDX^7Bi8O_+6ufPlXuG11vLLk*lO4A z2Xq|mjp2N(j`+cK2}(;bW&5uOu&;r(npT--$zC3`u)-I#KR$hb>GqJebLtuTXJ^SY#w6&49wP z!OLb?DeXD*;ciKSINU0K`qGkt&xL2M;`LK~;48T5S(rXXoVY>;ukY^hPeb~!G`PpVxj>rT@^z@O@ZS`VF!EX6X1C80JeVs(rj@HrnGBd4ETOlpm9L;x z7(kjRssGNOUtcX0?rv@ZIXz8XEUY#}yP*wup4%H5vc_=|QH%NXRG0>{z)o+>YFQ^s z!9vo(v=uR3Pm>x4EabOty^kX&AwQBy0r{LV10U}UD5UuJfF}&;2CMpMY(8@8(}?Vx z|HGS8u2Z0jsst=lf%dN~`zG8j+XPPsUL9mBXYK;ly-Y92xiM4%&u(-unV`+^6v$FZ zjf~HXDeeCLey`oVj@%Q{5T~HG?kEbn0)(bOx`0x4EkY*DFdV@GrdoG?t!0X<_$;8IS&c?=s z55j_MI%qLzZ)l~OWFBAs3y*>1{K7(Q5$GQ@3=CNMbT))%^9#6QZ-pf4{QdoYd3vKp zR9UWKz&%$q-lZ19;^j!4R$rA?*!Zb|?9Mh`mSD;;fg>HLl`b2xO8Q>5yQG799xGJx zFCShL2MG@O?K~*qm;`>XNbxPx>;m&Xx2aRLp;5La=AV3KHZ;H1>}N@C4f%dK`9w`! zS+;g#gXaw>8C7=qb-Sf8TZ_FtlAf2n)t9GX)0!)``63w2Bu73`!5rmk(AwSWp3wd4 z-P?Wq+x^kn{Ub;UrEG`d(+fl}IR?gr;R>>z^l6dN`}1<(x`r;gaEudb~octRa2lrabQ8Pg#r!Bm7C9L8={# zZW#}up@FY{ya?W?0((+}&YxTC)2ZxT>Z42qMI@E2&_vQW{9D9Y>ay52^Dh%kw$wR2 z4>yOl>6K?ll9Z;nKRjnJ6=a^l`|W?zADQ)rheQ$Hvde-5aO8KG|aO-Idip{2u4)B>vYbre%@+TPJx| zXC9WqG)RTk+ReJJw~d`wC~x=q!;z7o2hm9(ZGC(I9MhE3e=a=GeP7@dNWMLR@~fF7 zvzWKt@+D9wR9{nbXvaCssOoa9X89$xa;0|M!kO)>3bjI3YHF&mB0)j#O7_2_Q`7(q zRDj)BmO#>Q*Wd{_Z+~RK$x7yGyggG6Cf|-pGL;g^k<|k>C&ai=R;NAD<5j9k0uTe!U zEp5)A_1JI}l3Z<0arh1xM3eKaHvPdGbxzJ*oZYjv*2cOfm#f(?O;k_-5gAcq;4Mjv zB5py8y{&@-dEj;LU_9}%e^p&w2ufZxE}=hfXh)!1wP=+@@5Xm(3x({gV2sZYFq4c# zqyc4s&CoTHCdUnW#sn0>dsG}NGGd2w>w}?GuU4gmYD5UDsova)pKL|)8L5)Eg)~5@ zRu#siMm9WEIG?8T^V!U&jBx_^@O8B5C5*$N{Z#bXP4)8mWNg^{98-!k%W5QE5F7N4 zFUwRQ^j#7!5di%^qKkzLEXl~xmX%P}yfN8`>4Go?u}r6Vb2B*@$UHBRnf1v>$7N~Q zJPKSwSnsO1aHysWK91zrtcT)z8YdLg&;_i{&*jezkdxafBtA9GKjkS^@`mo>)c(Q& zl&MVkA9PP~K(*WHxc{rE?eW2bN}GZK+vw09!sAOmIXTe3skSR;-4!5IIFiEj_pe;H z*6#`!S1%dGr*YD*D_y#u{N8TJo`LquO?osn;#<C916J7S(yu{)I>CWN1fcvLMldtWHNiSJ#`ceI0ihPE zN%c@y*LrBQg-VHF@kmavcbG}42e?5g*z$Rhh~cM{*rX&1-Sgz+D1*X zz2@rlDHSfac-}Za-yTjuz|pgKXTbtjK`x@`kWGS5^q%jnSHS^K#-^7SZjyGq4-Dwq zXyAN=vB<%B3}$n6*d1`{__Gf$-DoS9s)cEZmGeX>fwB>~iz|e6B;P5&*4I!9=&(0N zw}5)S4N0Tsx#%;1AINTmiz^f0mAS))CVGCqmLP8JFHh1+uYMH`jKx=FdX4%78AC-+ zl+3fSeRt@1z&Fil37grDvAP>WE%r*lgO|x!^Vzy7J!$sZ;w@0t^26&*$=ZnywN7{I zcal_y$rAW#?c*aZ5#~W$ow~Y`XMK|9?YtuMjhUYx6V_6i*nev`^XYCE!Y5&m&k@1H zt*QM2ncDXtX8t@vvxSo(BZlhHR4q6!?1w56i7X$eSO8rVVHmgsuxXK|Y4#73;GzcL zO$+g2$x=G_*6GiP3dS>`D?av07Me1<2aibw29gd0mp-n6Gvbzc4hbdGJw4;onfms3**v!~e@gH~Qne*8YofOl288z* z1IR>pOTDI_?0hoxmM|dLTrr@&t$JPEeBG0m(z@|7kWzB7vmVSR*M;RKFD*qxyl%fd z>=zz-du0;3egs6(cR!tY{H+evGF<6lLjAd}^y%d0Yl@`Qz!S`4PcAT`i`ugBQN@Aq zjNf*&a%ZX6OnJ^+YZ$(0MIAB%+?Y<)GIY=aCN zBPs4<>a3-vlBmFyQ$m9f`wS#FxE_$iAC6D#-uo3*4xZqXn?v`fA0)77z&$mWQi|tw zZQI%GI&;u|RW@0lkBx3nE=zPS$ucc8B{!n^dHrPoF&QE( zUR?AW84@(A!gqXJ;lg?5<2~Jqrna`4x;8|+A-9D4-Bg0W)&;N#gDLsUtX7{LG9Q08 zfALE1Sg-=+eXQW%mmvrwyofCyX^Y;9pLG9f+r*=jzu-P(aR^=ixxyLGO8p6qjcWPF zF1CK-B1AN|q~v0BbabiljDd+EoP6W)som{xg#d*xpe@3^j43tDp%50WT=Y%`8SyFD z=nh(p;lGw+00M|2bp|Kn5cz04-9jb^50c2??`qGOw;;GAbbI93Y8Jze|4DLpe?31n zvXZ$g%<(gx=Cu9A?=Zpa;nF)~%335pHkz4{{xb^mWUJ{UqL0yQAlj47KK^;%R zK*}vQ#hyAdZgZ;XW1dPy2%6nLNz$lnLq`q|*l*J5lzOe(fFxCC!GzZbJ*T=oa<}$o z>Fe8DQ*KG|@5i%Kh=_-8zcF!#P|?`mj)z^WZSQ0=xG5{6gH2Rh#VJr$qC%HqztRE) zz7PA|%5eWCJuL!QVQzoXgyS598#j!KK_R5wnaYyz14OeZ z!Dhrz&9tW4tS}8Ld6P-v0y{xN&&-Gogpr_7K!$_+%tG15S0w1NCbx$+hSGnD9UFflW7ovi;5sceCp2k7h}`oad1pFihutJ7i^0|?sB8kNk7WZ&;O3GMJ+FPcZWiT z$N7Va*{a-t5Fz#4H$4M)iQC`amE)vDT|CmEzI|45awb2gwl@W)WDWmxM#qU>0s%Q@ zTyoR*OJ6L?#gjr6g=2SOM711p zrRA7{Yvsxua{P^bwtM=ohA^WaFPNWiF{>}0UaE>cO+&Flz1?yCc)>+@c`Bd8AT3mG zfN`+!I9>GcsEU)_6cMGa2qp7Ws1jKUfBj0WSo7uL(*?|=9H+$(7p9TC)h4^Om+Hn< z@=Nw!DLXH7XVBicmvv2L{EU}W$KI@tk28g6UQ>5>cXP8b)s+!rHcp?3_r_cZL-t?q zMC(qGQN+JQO9>oKE}I3V4@-q#kUkDHB47kEZqLCtg;eS5$C0LFff-k{5f1)4tcu0^ zF;szZ^QolDSdD+MqzSdKA#))sjkweC0`M&icyQ#$5tI;E4B&G#c1FAa`a<}I8U6Uo z+v|MHiTm$hbX1(|qQ22UjFn<+kZ8n;xb>>RU35aQ%J}K&3AOufcFCbHfB0tf#92$~ zgum(LWaWwGE#?Mpn682lpMGF+(dH>Yu zGrKi$kX88RFX2DWWFDO#?zvED94>5O#ymscdJYw zp}VCN2Xd2ifA5#pT728)=L<>cdQFi2cZ3B;{;MugI0MZNwAlm5Ap3(mh3 zu5_0{J%5iW2sK2@$Irjdom?<bJci$%@S6(9x0Blqv<=u4gw1Y{BEV==c=SuqS0%%rBjISiUG{Xl#oT-LTmyp$Q@O zc_B7Fh)e_-f8J_KC%$P@Gg}u^J6D11Pr{Cy2{^HQ_G3Jn>LQ`G#81kpio!G4)KHd|B z7NJ)d&!z=gGpNap2y zb!wWL!=RFJ1h<}mfNjf+!j0%t_Kmf}O(SZh6WV49FnxqQB6GaM!X zSVJjJ@Q$egu-EvYyvpk&X2Rp+v<0NVTH@gzihf8@;xhdK2(1_%tWQ?aT@5F6YBnI4 zc}(~`989&x4Rq?q3PZ>63EqKm*0EJrA{8Tluh|!GXTw{l5nkHf5VERtAw+6=^Vo9P!{m+|EL`Nb{hRhcaXdVCd3^;Ke}G9n@cy}d*; zBaeuOL7s-Md#65LY&dXFECq3HE58QXiKoIwiWCB~smD2}pn_WRi?!<xYWCk^HH;tefW4KTCtZR-U`j0HD{NGErB$N^vicdn}whbr3sE*=<6gRFFU%Y zI2d?jinz!Nmg%V5C$*-lI>VOfGJ4RGqFSO+99j3D$HT`*ZEZ!!U6HTi%Ye%V{-90} zUE_ax{Bv^BNJ1$QCUQF4H)Zs~1A`iefIT`5ep^Zrw=YMNzM-wHt-iUvrUv>ByHA45 z+Xdwif2dz&2zx7XX!`H=PZjDXRL{OzasK(1uWpV<38uM~OrE=ct#r5UPMK_RZgR+S ztc~5FCz|zvcS~7OgF0wX$N)uh@oI(o&4_O?xIK)S0b`@t+8=u=gevc2*;5#@Qy(3T zCMht3oi8d(=4@?*%lT(r6G3wd6u@u}iOnmTZ$8`CB&qf1FCsPb3(d`-9sefodRu`_ z;kv?7x_{EW=C9ASWo?c^2K0njH!!l2>OZ=>1LySHW4t!bU#yO+JH2INwRtH3nk`9b zgNQW-P!NHUk<~l>J35VLWJzkADH4Iq=Hs=f6N^IO>_fh-u>-vzLZ|8SFiDyMasdjX zyWuR0$P1%A@*6uVzb;F({!){hMTZ!XYo}I|x3fMn0QE3{=kNGMD8X$>&z%%11*~B# z;du|X70mmgf}uI4bSd4;xTgT>KW3GHfN^TWysi?O-|Jq0h?xni51A+Wga3 z1V`lxEaXeo>z!;9@z!H9aW=AGrCJ~n^u5I3+sh=`GoP1HRkG@q7HxX$R@)R#*#-8| z`kR@^>PZK`D;q_B3K`?C2Net}$EjBSIB>@q_NJ_1w_M!(_aNyjd*=t|AVCHiSl)~!R_#h%6WXQc;I~yx)7m?LJS2e zO{-c>dK?ft)Mk_&DEsU^Lxgz5dacTG|#mgDby zv(v6Bzm2sG&{3oTqVxwZL5Ve%rG@OBOPLoY_yOHOm7P@nq*ue%t(~-Z0;wtVZ~z6| z1?uL+`FbotBj+3!Pj`{Ec4e*zVXPV_($vE&SEnEs7Xk`ULdk7AK%amiwkRLcZH$i{ zsHO%81o8*vm}l{Fq{};yksVLw4<3x3SaQb{XoRaB61eAHFPgV8UBrUaI}f)bwYw{O z-c8DR9MrZ}lgn)$?OLm838`x5ssslBqaj=QSs8<#j z>Bv=nROFlULz4ft=+iek8uMYHr(aa{NB8t+)a6c*rkHSj%CqAO4i72aW0fokpgZ3H zlO-E)-lg9|#H9X;O0gur6#kXoexqD*8B<+#>D;o&7vtnrt(U0~bxmXS8&SNKceI&t%TMH-*SYh9}EzUPJ;uk8=sD8&0- zKd;VT1Jp}a2)IekO!{|LI-gl!xsTM2ql`4wvV9+t5Gvc8NipN@*R!3Ak;75t5=lE# zWqJ`{Q#cDNXnQmbRMGE`;u|=T#C8%je?y4#HnTguel~}i8O;;H1UKP&#kqri%Z|c1 zIJ;Pjb}tn8fOYZp1W>QvMS8tN=f7(}nlNIUbnd8ws)TW$qtq*yAYlYV_o&Na!oN*K z4OssiusK?->0|87PZ$@GH<1e|DGdjSl9QVY-Zvc+gQ(Z(ceGp2*Dx41j<#na5sjR; zn0xm#Fpiy4=RlGBe$ht5Twabe)Q+1lEEArfRV-7vR_aIB*kd27WEBM@>2oZw`{JUy z@p`VYp#di)Sv^?;2OAqn1*I6jw2Iu}+`iwWC=?skFn2b-h5=@06|KPYae4XrdV7CJ zksW`F+sA7NkYKVTooK$xhBbKU_476`W1*BDxi5%pTu5_8e}z%RI+T94=NjcCp_KX* zC(p01iVO-BmWv%VBH%aT_GFrs7+Zekhh+xCL5?!Gr~6Ot<6|ZeY>Od#g;N%)QsK7C zXa`IdtQ9VUsW{T;3w<)u@yydMa$lTJ2Q!ZV4*u1u&X=|~Mfv9kYd zzoY{zK$9(^y$8Vqg0vHh(dqXuTh3_6zeCxAf`ZyKz&XznO`6{h1z$!kz19i00{dtq z^H8cyQPEM!L-?dmhCln`87*Lop*mV8R}uA60tA#PUt@Q57z% z$^#+nWo(Ct)|lmcY49FwM_=}ar4QZFC9oeQOnXI08P2o|RhWWcQZ+-IC#sH8sPA%K5msf>rqt5Kx4ko})u(5PB)KCyO>g-19j-$4&gb}>ZX`m_L9Nm5x zyLp#*IPw6w(O3c3WV%Tc!Bv96B5!?t_mLPXy}iMXLOoJVX~;zMQ?;d7wW{=HoHkeY zpZ78PXjk`$B4E%6j#LFcE%m4AtF4?6xbCaWyMu9FZC$*-H$l||)4Jz6`7)kb(i7!R+xepN=40&zFY<{)BWMg6l426PB@9N99y{=om50Oc zYWIY%@ocq~Z(NONb)=@qu<9fvWK&;6FY=7DSwM(|KPo)I}K z?N9{3CyVJP;0W8(f)!Fq0Urnw#x_2V<`;@?X84+ z74VKT#7Ete6=&}Y3Vr$6f8$eVDlM9irsl1EG#1~aqWXzgX>-$$<2dE8LKDedk0a_F z47AQm5Ax#!d}5yeSP%~_kom4_GOW_5KcX53Xe&i`$b8f}OCy2&0gAwuO#)q2BIdzt z8aBvk&IVpl?|5FiXi!pW%z&GZmzVI|=5N|b5I{A!F~1=viqm!xgKg?U6H)y%80N~r z$E~+QbHZ$$Qnk_9AfPoc{^;a)xgBmH8ZtB}3jy^O{|QZ`$Wg6pc2kggsjq=aF75yU zd`CY|)^GlN+ct|%DTzueB&}Cx#hascZOURH0Z#RR9#y2-m&S@W9V?8a(;DgvjYbLY zVu7_$R#H_n#b7iTKRV(Fd(D(bcx~GbYW6mbTS{N6b6A~+FgiT zkoms>O1}32N@R<}(DzI0NCDTizo=`#h!tHml>m6`55xIQlucdyxtGPx4~fd)SJ81s z+OiUh9EjGx{M+2jW+6{@_l11wux~hc2Z4YU`GFeywD9$Ji!a^9KZu5=%!)tPCn;3<$55t>w%F9--gtIu)8{V&h9C84hW2of zjy15L)qsRyOado-nuTNiQRA*-gV1Z4Oy&e+6cD9O9XL9JrP_S)ATG|`rU-7FteXTU z3^CcY={5HIT3x^c5hW?cP)pzMre}E>PBS&afJZz$D6?YY*zs_B`TidFkTzGfZEs^s zlo7@gRu=xPQ`7zF@Lw4ZIdeArzEn*ibWk9uC;PW+hK4xUPS3%u=%|wTvk)3+0*_zM z#1?MOz~p539POKC&&^_3hg+q61LuXmuXhUs-+Vnw^9<@~C}+(Z=C$Z7r;EH{|76w_ zXCW9oxWqN37+`!wYf*RjFz>8+kiV!o&NqZ-9dQUiBK1h3WSQ)9a{aIlX_}r)F-$~2 z#Ub|}VN?D-IO^)=Lh*i!);%x+d=wdX8>T+R**UjOG*t%`6fwJ!kuHE(SBkIYaCqTE z@V6BI(0?`li;xjHO`o!mM?$*Y;#hTUxzNsVk9(i5%(?`0{5UYdp@#0{gsbXzz;VGPHdYG>?2789B_-_ajuyv3Nopj)jPx zWpM0uoKxZq6&wd{x*)y%k2JZTon~Hp+h-@dG|7^x_S4ib9Qk;pWx}5gn>WRvJ(~MO zw&A^{mPY*uTF1oYy(qT}O!gT}e!u6a36h&F`;Zt(Y3S+g-5XEeWP2cl>UWrbr~eCH zl%QhI6^`9i?1M9RhBU0ktod30D?H9@E+%8ZVqJn}(2+f$M_4wUl0ra09HU6N{D&;> z58~-IP!tpYM}mniI%^SAe(~VqHQv&U(2HB5kU)r!j~b;($Sa*k+kcbnA_P5x$&H8x()lI|cpln~TjXUpbJm zb?tP;4`pTzsg;-TJG6;k;GWKP>n8WebmLsg`pi%?`if(VFLsI0NB$T6j-+Iw*B?`6 z>t-PSyik>~Tu8r|TXIVh*|NJgWTqqXkt>=v%b7gCFLygAtO!9_sjF5}W!jP3<#rkG zehxT;yj`57?C&;o=Zq?CH!4yzX3buxzTWlWA*kgL$7 z#|w)j*_aE)6WIugNBOo(w!^p@ND22+tj|C&pA9RaCkQ@GgvMP6=}7$>IO=5H`eVUz zZ}XeDAfEEWWPyXzR~|iK>k2WYVfQig-5{MoX;nDOZvjhOraQZO0Xg#I(0`|Ibj=a+ z*km~r{-3JCeW$99Lna(QlGb+d9MvJLub-S@cV)hgI~xggMMT^ubw@lJGC&*wgxrkG z_aUr4xy%!1FyYNo8St?2v!W~9kQc)rWG9mCSr!YS+FKJai>{TZg~ISN<@F{Y7OV3S z)O)Rab-_~`iK*+E&h{f5s|uk`@zb%L^pxf>Mg-_U(qS#J#whzO(eJeh`b69BG^k(w zy&57Tfh(Kh4B|f7vD4dZZyR5VE1n)B+z1Wf+Y|mva{KA8T~&R9qwJ+~veI9NUmJg6 z*%=z9w9i~H-@zyVmR%UcKS2X089z=dB_8Z@a{m`-Qf*+EwwP-aP%K58OQ=a-Fy^q0 znm_$5cUre`$Ov2y(nJl5r2^i!`uuv|@NK{9H`E3D6HS=NNimNrYE^||vz*$UakqWJ z{c)(M5C(W7T$j`UI}v%SRWicN=X$)xp?0y7);VeZ6xgR|Gm~0F-Whn9(E=>lx}*^WkgugG?9DA$ufxpyETKIwL-^vtTG<^soq%D zFekv0Yt5}B*{xKyZqYV-Yc|CLbJ&X`XkK?TKuwQs1?M~DFYRGLX86+Jb%+kK;z=|7 ztm)PPZvW}C1dgFwk`;+rz=)QAOk_j|GohV3J)3*EdfW96(t)%^R9m8$!@E6%F(LUk z?Aw3hd@E6BXpNdK&5vAPsNNRl&l&!`-K<8(9fn+c5{g7vPL%T`{6u=QXPLCG|hh_64{YoCSLEk6^2OLQ@ z(b>_R9s1?OCNe-c*HY${;IFmb+)<1@iMe7g@LU>7DuO4)N8W@KTivRf@B~BlqK#4LzUx$9DMo?c|Z_RBN?5St)A&(Tx zPgoAjSqC8c9dH&Mp7iPgEFK<$XrF@ewmjQnXg9@ljx%YssIKn~j-v!wGXgDuE{Og1 zm(KvrF0Ybqd?b~Ar2%$g01y3K8&0bPESFrFa%5`Ox|*QLpdeu#gCjl`p!N6n69#GUrGW8UvZf!Q*!$`a?fD4iep!KRK>C*^`Jzmp zw7q7!76;iRWtj7#thar^}2g?4+OKL7h0C9 z7$@ASs) zwagdFm&d(xHq^s#)k2KAf1t!W+pZnJf0@H_iEd(bN)A8?8qs1H=62g#b9_UtYksZ1@dr#h)f1R81L4>{!W zVePY4*oJLI-uG*2O570M!oDm>UhH>hyV67SrziFXtLYVfM9~Ru@X9&XSZDiMWBjLO zBYcOwW^d8+?(6_Ek+FeMM0>W(qoZNrwybaZ8;~7Bry6D(co)yjy}py-Lu7+aqEwl) zvJwsi5<3RdD8BOVHUt8`yyu`+rY`?2FX3VcKd0oT%wppps@mO=8jnD+6;QRj@5_s` zj}3YQ0nHP1tVLc?=2%uLTOz4)gta-h0xUyofyd5TBJI2OXD;r3Q8AxBB6+ZXc*EoV-{z@UK zsAO~{v%8I^lFI%MsJjB+qYf&P?}uZ0EWma-kTg3JuXeUOK3V^=CWokthEzOE#b`a9F^VY*t@vsO;Y@QFOn9c04!aN$vt2^!Pr zpRsAdau%IzTgcGm;>k^_LzPiJ-HyC_Rj}?P%YolXe=(u2d#=?kOx@;A{?!@!v3=#3 zF59Sx5VKN7i=@bQZD|1dx$oHJa+{(h6)qq9-(MY&4w>`Hef#*Yr)R~cp`@1Syh0Ew zY?#zhmz@R%D>B?{O1}?0E^JOg6@xoVN(bhTkOCMfMuN$Y8uexm#hlc1iV}u*J3@iq z)1~!iBrf%|SBV{DyMGOW4&l=l#(*fr{9$cW4g1>|BiQMhm*%@OY-d5P z!vXoaRDf{3F@agWYTa*VE^?`j30&o0;?f|BT^@F}-crkf9hmQyx5WFFVu5w%o=rFz z9a=wlRZrac9HIZ;_&^sa2(kB3H&o`{eKT;Cblug~+v@c+)24G#xAp9*Me*fjp;@Fr zq)weR??z(!o0?VSv=i0^-nW2rDAQ8E#4_|Le}3q!ZJe)IBbUGzTDy<$35HwG3e?Hd zAJY7lX62nf)l1T`HroK*gsY$T>sEYHy$@qRm>(-b{O9gZx~@>YZSG{%IJ)x|Bt4x4vX@8-e&3UkVaZSP`X(f3F+F!QJq&|R@G}0;E zA|Z`*cXzWa3-5#9-+NvBbN*nT6EpYRGiT0BGGflSAr9rTt7Ztf%!yZ_+0i+vG#k0a z-N>wrryW6^R+L}C?*GMSUc@oQ7V(u(yMo6*Ke zG6b(xw@*^(C^DXJc5Yl7RaqRI7Fx&T*C+m6;mxN7&zb8MtFrK0k>-^dx;>Z1N8Ie) zKrG)A-CzhuMZYCUAwyiHby);2SIe8xwL&_*$$|(%Oj3)g*+s(dSMODS{)?#rHux*} zYAsiYkN8vi|7>upTyV;6r4|O{m?P-gxGLx}*54|VM5=_Ik`i7xP{sAtnAk;b8M?5< zFTJCxr={VZt>f0DDLF19r@qFw1>uU|Xyl_yb=Yk22U$RxonIlgH|8Bd9KvILb!$E~ z-I!gYoaK1SNq;Gicr_<;>V#!t_BUyuT+ZNkbvHtZCCUhLt8ZOwnq*D&{rOWvpI=ky zEB~!!8|8n{vIn@a(*ljtoPd@|<$9q_cf~qYzU{gT>w;`<<)pX@e3;RT8~Eg#A?F%0 zA87+dV+mbxjadIQ|kLE1RUu#Hz*af`0m;O`R*IL zx0L8G{IAAv&Xce=s8W!VJIC6=VNHnGTuU;wKFfAkpc%p4td@zqc^jAU|_EGi2*wT@sD4 z&M!)IJMic_X+PQ8W2%KjJ~YoQ_=%oI!g9~mQ=NmT?CZ?F=}&54u^a@TWi2-KrXeKM z_Z6WgbA0Y-8=vq{1GIh#ffPvcAmgadVO5SB-+t}qjPj-f zn5+m$%Nv8%<p}T-8f+j!zpIfllcexe7=5)DiRi0z2oB38Sk5vLq!gJW{?e`<0rsPcl7|^&N@zqq zKptUW>sJrYl#3iYct$GnLh8F+=(~S!%g?Y8DR%7d_{Xhj8AOFZ$@05GGX@Vm#A{s4 z%f0!P@L(~~4+cuBE=vci!?B0A{hJ+`IXyQ?S;33q9|r#2LoNaprB$GqrAROG+C51V z?6lfw3wzjmKJV>%x*BcpsMbFBfyiWAFMl^1-6$cO*zSprv?nCSXt1%8Gzb|m2ZKJX ze(gc99cKQoeyLHl%CqCQGFNh80DvC*?4VuU{g4OqR2BS5FXmG*A%gz5s^=HtU9Z%n z+Z~^@nx^oDhz0$)yX%j|N}gAjS8j(r_560WAdj>Cy-PVH7!?!r|4ad(m(ed&Lh62+ z=btLYBKmi#y?-t@e%ybyK2yqBlDiU8roa4+1>gQgZCY2;aK+HUtEF|tamm5&_Rr@i_Xu` zkK2Jc;e|;WglNJ1oFPucvG5@ydk~Qvro`^6(X|UmO3s;6)#pvNbJ&55d+*eHb0z$1 zyD&Uz!t|sCoqTmam{|%-yht#aMtnG0ikfKJa`}JgYJ5&tVi7$k^k8^wp#J=#Nvf;i zhv!E&_>JZL2D1&Y@bR!Fjn-T{WzI^`>Oks1=#(W}?wh*5^F@uTR9}~H(vHe(^EbDj zc7690$|$W#jp;!6G$BuPxz}q60%m{}#^0BP|C}ASloQ|z>*x|)HoBE%Y-5E9XTuq) zh6d6R|5Z?N9bqX86A3sdL}^w(dxH)tNnd_d;%WSrq#nBDOOt=tnf$PM1WYhM9InN4 zsE?KtoSBkTK_lFlNuHHRBO#68OWg7o_ooN?4zjjFp%4aHMzP1vEXQBC(jqmN+gql* zkp2C1TZ5*y52*owFOmSJCfFYu08?M>P5=pNa=BZG=QCop9WE!ZCb9drXC1cx9uv8+ zRfE9r3S^q8k#u>%RVj%{ErI;B>QPL(RX%V$&IXkzY~>YYx+BFH=@uq-X?J#NbQ z`?~PWWg3diy;^xr?&{%EGbFFlBT~FuJgBbL`&dp9P2s98{Kxu}EuF&9u^-rWUW+*apW}g5KE%PX zf1PpdlY&*tmwLt>2!dQJlZ8c<1h`)P)ol4|f50weO;*?W8XI%&`D3|QH|i+m$L|MW z*(%f`KQ|`=8wZEx9tKz4wURp~`fuat5EE`7&R)=ml%_NPhtrWP95iIc!t_Sjg}Cs zfC>)o-zof7FB06EL4ES(og7bdE5yTtn~Gbb$VN1v=rc<5wuicxI81u#vg+;FsYB&# z`8D5rc`6BbKsM-|*+A&vfz6HBm%+Loyh>2r!FC6^cC|6YHZK8NMut+55REUaV=|bR zklWe1wf2i>j6o@_jbuekhK{OC>rL9V&xn!iPqyMe)znJFZ94j{ARK%Bq%oTud zzvmr@lYQB_-~zPuHjfsKR>%c(ZtdB&NaI(W@qll0w-<^j+GMWNyY2FrwiS;kCX@Gc z3Pp9AY;?F4={IDveo3Xrgz zw>Zex67>hk@2T)WvmHP|H}>1lVWXodMXnJaa@+U_j?;k&b)l)i9iBn<_JPCmO$=5E z8Y=R72D&xCAo0mi{g}u>j+t772=_3dp2^%0wE^#Np)(Js=Jb=d+M}+d3bgbIj%K!D zzX|b^#7WdY8ywc?v3R)oXx!Db&;dGiga($5#k{_GF*9^@0PG)VCc*3)uzEVfmY(^x}5m3WqLBf@G8S9buZ){-x(g{ zU(`=>gyQA6+;Z#4SX&P1z2$pqUHR0?h5X^d7t0WfG$ZE0;D$8T<4dtOOUfs-l=asj zp027338^9K)6^J&#E8~%jKb4(>uNwI@Yxyjk#)3P>8azX)1-8hLPbTkwIv0qXc3++ zWGP@}%`%%o6id?^vV4p4^-1}pC_+FG#gLWoGLCZSC6D!Ge&WFVSefgv{>={=R3dgB zp_`rq+qZsZNEX&`H@@rK=aZ6Rv*y;M#5}BH_AppGMBLCfQYIy`lrP40%vez&{_!bY z4#{w&ScSavPmyMQ#}z;DW3sq4!YV-{Y9Q^L-D*Y$ax^Jw=|mNrK;cu8S`7~)`kY1c zHn60uXSVMwKaRgI(%0}S5(W!(m7XNC_E)kLiJ0& z!jW4V`;}e;OUe<(-meGQ8#&AR7;3+)QI68LV!(4RRgmgOy*I`DoCouoGE3`PVh_M`aQluSARkpauN> zjE6(Yy{)wz27ZKoLKQy3|MUUHiDS7#_kFn;Y;%NXWH`Y@GuJyn&>)o!&D5S_>7;M( zZHXAe)pa6bsP_9zHhO{?Gf+dW@o`iTU_$`TYv5L9RrD#<-nQ>E{=2IEGL=6mJqcoF z%r}1Wf)1(~An8Kz8*p zDPX0uQmxTXMaMeGo`m0u$}Vl#*7>Ft|MUs+u-C-AuYuUu2G~|@_{)6FeoZFxPc~>K zx|{6zFr#>rUQD4FKA0>*7RS1(<4XHa2PMwsQ}giM-Y{tx{1z56p{B$7ZJX_YgHBwu zjIrnaBi(j!387m{?+WKH@bb_(Ye_4)Df?yk@%O!v zMwR&`ek+xWYj=I8=kCA6Zm4ylAYrY^Q7|H+Fc{Qar{OG;HIEE%#ihj5|2 z-fOnDaZ;xAW1j;5OVyAZvPKYj^mFKwxyWSjq1bteNJMBjgURb`DYkFwvmazhhxT6J zLkSMD_L@=15K?K`9v}HghY&ce$Tp|VRqOd7B01TO-7b1wv%!WjrS)zhO3q~NaKXaw z8Spu7Nh1*H2bKMu@p$TEf3w}ucz~JbA9bexhro?ndPblqm#hA)y6t6tRQ{8kL z5u*`mqVAwOjeLnCt}t}!M68A;)V}%OM`_3JIEx?QVN!5LQF5Sg>ODDnj^48y`7qOG z8@Bx^GL6UgynC29tBS4P6;2INDh|3*%Hg7Q+|H;xR?RrW| z$4R9SbywyGilK~+@OJDUh|yWZk&J(EgV~(2F^HzWL_N6;1$GH9YXz_r8MGwu4O=Q~ zrxqh$Gf;`rhEOrUjgr#Yec-HZBuJvk9$d|>!jgV0o74YcHPc#dF^n8t=u~XUh=bEK zOHEW~`w9G(ZaDHqlh$_tn$(d6yaEI^1cXA+?X?4|ylD~Qg9qObsg;oQ^i^K&k*I^PhBZAR2U;?5BO+ z}T0Re7Da@Us(&43q!GgBV<&~G6Z7m47eQPR8`}D zB4Hc#Z)|^8UUE;f_3td`Cyd|;gBOR>D*sVja@1U%l$MUx_Dko+gkc}c7HuhXjFz|V zN~)H>k*4FYc>J8tR_%+B>3vjiM01px$~95J9{Rs1fh8Eo!;yZLZnuWbWuL|q5KFS< zP+-dVw?=D;%-&{z+0i=ssCH_Fyu9s`3jZ74ogKOydSol;7R1b10gT4=Yk-CY@E=fc z0;H!64b1Sz>aSOo@q$5mz0?B7QlxB2jG4;l*%{ub!_J z^>kRZ77LOE{7`zz5EsY!YXG5e@N3rHZOX;i|N6NENcH^w?9EJkxe@wVVb_JgoE3a& zjA{Y6Ye`DHz&J* zjnx_ZPqK+b&{RjKFC%ol2y!VzqyoWTjYr%0jcTt2JRw(`ASM`ASqYlP5aXys;zuyk zB;bXt`@%N|{=CNj>q(O^X!(a6{Z(xZ2h~J;Q`asi{L3W&_PxlG;~gF)4Z7k7O8e1e z|2vbQHEFVCJjo697in4d22P1WOqx64g;9KeP2(!&RBappbyELaaTwcT*LOL>|1}VG z0g0hI0cA0m(EXa7(od^yL|!yAlrDk(m*hVp9$b&Q{t$n5aZwZG`c9*i7W1}<8kGlx zN_v|ICt!!!$V2;Xw46A0x1ePSf;k)_;2dLv4=nx+Hy3VN$n8%efN<9!P-((2`{;^p zMu*{Gkwx`pW9BTAGM*VBjVpv3ufq9q^_Hq(NCY*c#O>MFQ}Rsir-u9wmZDGw$8@(B zCl6$ehwD<8M2JS#i|_=>Vf?$-^&5-|#?|H4M4a!mNIMmME1tzdIK;&#D!RO8NvPw+ z6xQ)#I(b3Xftc64ZePE?Y(WN)U!IX^r-0#grlB~+I-TRoki-Z*>Niz!)0jC@ClXT2 z`-suKVTq9=sDD4?hzhy_gN8I?7!u7g$X}L(-`z$@g2!j1{Q9Wdl5=}%95Vt}ER$6; zo+5(wwK?~#6tX~6;8oP!56#MBdp3JfJ?>%4Pv8!yPp-b$G#sMn-dDxCJ;_b{q9>_HRq~xzp6bFC$Z;5?jc>&DGf~g?9GNHS7r3u{4F;9)P%NPTV=kG&nw9Kh%Zqve78!MN zkIQYYi0B~@qMh>LZ)teM?`k~#7KTT~;u#sjgHtekD#{io0p#s0Qg{lH42s}dmclLX@gGEVAVgb)4UIXVio!(J%0$Shy;@3JR za!bnyV$^pwe6ytvZO|WTuI=Qg(_q42RZ_QBy@`B2#V~SF zAl>(F8P2H#BOw|kaYT(u)#R4a<6D0m;2trdb;qfMhqSocc^2YEV!g2n_TGfqT}bBfQ}o< zM2^28aj-fn7^Z9J?|ioiO)1++(bWIq9OF>gfDlW-434b&g;2txyZQ0<13Bk2O>IPl zNi7}xmR=hgPOfXM0b6u;f)?MZp85hAKxb@G*DpahG9}WH~8^jk5K2(YMcnle&r2h|2@`8un#J4?5 z(3L~<0{~=!@cB~2PhKZr8c@%GHH}5PASpFAq!E87cl^G;rRN|oB*8dLG_WrBG`Mz) zH<;e8Pr~yyb{xMg6T2pw5kQ~>ureN)$kg#=W?=X+hG3*WPqz-0E%BU;F@4J^;n~`OP{qPGC8TSqP}0rsf|p{MC35PQW%s|`&lYQl+mV zNT#IuKp97RW6vHQSdy-{$XcFsCye3 z=G$q&uK88nuqJ=fa^VMSgWu9y<2CS^xJonjS}!PRRmxL@#@fFd%r5$Y$~I-ugMB?GU%rd zPL)@vkLTboZi=FsM19icR@JvG5MEB`oB_}@!iZF$E7}vbPvXSAJlsqK+4VbD41k+5~ITIoEUudY$ZI^!{xYVs95DX{PEK~ zAfK2lN=Fy-fzqfs@5(J7PYG};X3Z^P>DTSyy`8o&YPDx9iEip~RX>qTxHgW8I8pxg zs@D^kU+naPZ7H&dW0mY#XCcr7;Y>_mAF?+_jDRV~<-Ui%ud~x+Z6nVtzsmXV@((YA zfa6Fp_9@l|5>IzN$e67pHgn#1(({}ivDSNn{2h0%ib_X|$ZVc&qLd^dyrkA&UXQ<2 zQwuND1OYJt9#x|59BvcZ4zhPx(bS4Fd+l~rKwW@cJh!xkgu5u86!!ut-Rc0oe9vD; z__ryhbjeVGrB=tV(zOd5;g-x{f0 zcT3D4iJ%fe1sWg2p-u)n;o)ji#8;q#_WSIVoUo=13&hnN>1#xn7goK0CVV)ZLK`%k zlC=ZuW7Y>iEx7g~v|fOh2jo90z46B4S=TTtkuZmCNfiwij>u!Df@(#R8xjv?=SZa<>y{n<5IITwZ=EmlSCz#}rUd-M6=F;uEn@D6Cn+}@TY5bkV2B?XgOJj zkc9SEOzI#bP5qoMkLRoSzfn*aG1keDK*5XWH}(?BSh$ir0?zs&A$U&zO&YKE?j7%3 zdy*Lw(}^Uy*&wcw3g*+_`QW@a&XC$0>I?tcL(=#t_Adi@xC?a&-gR+HTNG067&dg~ zyh`wfjBq$K%%eaa6YN5$a~Qc6I)I3qWv$iGrmwGnb4uuDiyV3}^3U2%;dcKG1qjZI z1qnm#-YHBN2BH-$Py2Zlwy=XI^-LT&(K6Zrx+kC%4yi)n9f1#8dS1YT$!}^5D14yB zvyUiug~-&s1<&Ag&B?~F)`xCV#C1Dbb9L_F@BwN>=Hg(=nEc1P zLlljQ9abqcEk&Z?6OR~Yb3S}c!Po^8I$bUjr(gGkR|#&fvyyB1GN7J^lHgW6RY$KG zoBwfXxw1UjdK^1WSzv%y?_aR^l(w4!e44?brvQBK2(fJD_tRDq&oYQA;C-SP zoZaVwd|bS!p5321+ffmFp1+`!det>kqctZ7Gh9=zpzzW7J_^_)zx}@*cdmZFjx%=K&tf$5-4+)J}Cqf z<+E9G9<(gwRC9=Nvs$)u`FYk*y!uBL#pIJL33~OKn@Hl>Ym4I`P747&N)joSQ>YkKaI|efhq(nbqmq^!xle;qE_Vo&`?j(BYsSegFFJ#&NsD4HwX^+&9pOG)v zybK1Ag52u!ON?`QP8(b){sVS+(9)od$}6d!#obm1I`b^tk~Ay8#2MAD_^i= zC@1Byxi3!D92Iy)fV`(D?cWM#bU_zS@A}8Gh%SWzTK-}*WdQE_DV+H3p9S^A56WPu(8m;}d&6xpztQUEzHnqy`OP$ic zLjE0}IiLtU{jq-k22fOsB&d-7QTp$X&L&A-IZFdAiK*{#esxJE5iNhR@>izYCtD@q zBcj!EKL^k^6jeyMaE3ILfnv)VWMHn5->wMwZG`|;Nbc1^!HtB)wwhY z`SWG+=4Z)^dU&lki&BBqgNg_4hv)B7hDmz!&ZnoRAsBnbj6eGO`)LzPOl=bE(S1-= z``SB-rVbDrdw=(A^sKI)NutRY<)T^M-Q9V4VguzM9!x(`7aMi@`?y=Yn#IP#!v39a zvoJ_tm){e@9gwAJ8hV0_{~~v0Mx9X8_On_Og|n4*SW;=}L+pN%$?tV0tr4f z0?5rYWp1thrX-qOz^?O)-B`Z+GUk=YO%Dk*Hg(byh$f0+7&h z{wcI0t{fGk7L~s$n|8aA7VkknVtb*o#do}!C}}g2JSJy5BG5Tuk3lN%{(o+6F7Jsj zcBizo{`u%uEr= z63!+e_X>D@Dw&5%k)dKUf?$b;pR%8z&xaPB9*mN3s;!Zuvb%pjH@e_$yVmTz-msFg zFtdYV488U8524}7P5ZTp0hk&3b76oZjbE)BzYHd@;G^9Z))wWgaXO6HguN|K`zhKh zl=;7UOFP)qZsS(zHqxBeWkdWa5yS1`=uLYfqs!vrMxk786Ds+Wd9frM?HB#zUH2Gk zF*sP%3nP6BB#B{=%BEG{cXuW(rY=^yJ(c=iGO|%jjQxrJvYOnQ>UoIb*FE%Ts(ob{ zjDd<4=L-u9**V68J6Cxo-v0iZl}$!LS4(SwTl#Bc(ITIz1=vd`Tz-AYFLS;n^)Ykd z%@h?9@pyWSSbL149^qiCsHpINg6x%Qu=pedZ>DhU)^7D-keFPhbD2-ngztFv)AUYk z_#lqvHHz5AKYOMIPxuQnBNp$s!W{SXJL?~h&af70E4Fq z5oMw|IXSrzfXD8tL_B}nRe4hHg1--f*Qu-G7&U~hQ=b_^yYb8C%-gYiO`5C7LZdI= z$Eg6tp^h@d;NA>s&I(P=FGj&%p3xj#9v(hiUKWIfZRb2ga)O?rUGRp;YSAUljDB61 zE53rL!w7E%!iC~?J}?mQIj!EG_u@RC{t%N?zX*|g_bMFMJjxO6Gd5CtOrHTuwro|7 zYf#?xiRDR+(C3f3Hk2>B3X>*m+8uasQNYdU8OPa z$KJ0jB9b7as(>*jp5pF$@V z>eUBb18$G$>yTc>62V(ogq?+depczb83%SC*G72J5L{eoL@aa)3Is^_Zo6~ z+8;N1?mI*NrP^uyas0ox{2_2iG)yBBI7{8&Fsknc*gzzy8ws&yf7Ch&rLC<+Lt?fo zBjPub0h_<6`oQgV=pQexG{exB5?r@VyJ+*?r{v5ZPV)pBO9n($KR zv&h!^jE0+Vi6J6=b$*7X-R|yyWC6imfeUl-$zjaNzpKUSmuNF9*B=+ax-}=mO-BG- zx1mc%njexGjFPi?V|Ae7pwOWHWbo@Br2EKzxnVS^?Abv2zk?)PMwZ|mYu6=f&^b!b zJJI(cY4!re;%jBrQpD|Hn_-f*_cU_Cx7fZe9qf+9n*tk&4WU$f5mFL1Ky^OYl4AS9?nN;#YhMbAwzjd~)d)nP%nC?b&`lKv zBG|dcsDnWlBterL<~#gt;=!*?UeaR>CE@Jm3-@R*NrItB@3<{w>6UI|KpGluYHL+B$R*Kyn&DsH+$fly zM*x)|gq?@~x=U(l+Qj-pbH3X^^}2;*wBq85qPQkQCjVgc$RQ3HLR-!M-Sq=*;WeBq z6jN{|(8VqiaHxTB-a1xYXPx`iP<(wloB!M!xQ=l3wC^&@xWd8Qy(BUF8z5#aRj;UGv`7u2u1>j^7}X5v7F4dwMu8rFMEb3Z>nFKcUu07^U~ zSv{uTG=wbbDHbduVqNdJpt%}s8y~{IZg{=@go*Q2I92)kcQ|+I|KQlHlC5e@Fu+m) zz9qoj^cljNv{eogH+7OOQC#YL0+mc~J#g6@vPuKS$zA;>`!y7Rl>o$bibTQX9O&k! zzG=cy<(q+Yb>_oxKO*)gvTRDWKMA{5*4B4>XYEbx?GIhB>Y$4?SZt7}uyE*lF)yQu z@k8M0ji0nVV1g-~6Ivb4sNzkwDG|w&k{Tc}Bej_9faEyZ@c8n?ZJ5 z=?#k1zgapzzai$dQ*c8OBG+W&rjPqzMZxdXe89m<=2~}t8U(9H5P@%)pPOr1^|^!j zSKT{3jdne)-gWZvikdbBYw!nf!1+k6+*MXqTF}1v*4;(4T<&0~%svKg&`MRKKq>4-IaD7FQ*Xd3yqLFf0|1cxPHDvIqYvc>k#9*TAvGo0iDl!slN+wz4_XpveSO{W-(Ffv&H2V zIUkjGowA^mkZ6s+G_9hPrnB_+XAaGX7CD{frci%L) zSzG7C`^`hK(bY%4Wu05!mR9Fo3ycJxcptA{KB4HAlf^z{Xkg*;{$uT6=0!WaJX&b|+(QPRcE5 zFD`Gf_Y4fY2xFxl9~%=#2*r%5+*5A+h^aDYo3zR09yHyH7tE8g5< zL1!{W8g&SFauF{Mv)sA>{0Qip0{cn)<=W(gF}UsS2(U4bW7zal=V?4wwNzV3PJTdm zaCAE>Gos8u%+`Ce1Iqij%h*^2 zud@~C!gwGr7Z+E+tvwAc|Bg>YFHCe&jy(4aMB0Cvt& z{BZ`sm*&6KCEWL4@Xs;@{TCT}NfveWGdgY-BIZ_Acq$K_{cNdT;#2NfKw8aLI_oH4 z<^hUuN3|VsGeUD!#}(D73JfzpIHB>9$|#8l#CJ&^A2cJ5kk4RU{@=sZ^-F)YwLMP` z_>I52q^%mfW_^&7AehxdhdKy{u=fYhauqc6T^ucWK8;Wydk83xhRzNPQSep0c==Rf2%lgNU{^v>VQxDKSzgMnSNfo;*{+X2FAr)qoZ3 zUJ0G$<>jy-U+77^=!3UuAXPz}3~j=QUjCD?B}%Q@)X$KRkTTn+N9r}$*xjn{$;|M* zx+>wUgs*&QDatqL>atH|c+5MB`e==N4W*6VDk!MyG3JQ0efGPzKhC7hYUkxDpG;7E ztw>&`zm5%r8e!YJT1QokQfSqr#uCjRp1Xu0QOtQa} z{bW{hz3Ip~t{Ni^d8Pi$AISN(0%~C>OG={(8oAi@Tm@&%I6H}hF8%JT)}Es7wtz&1 z;BhwX{K@_KbLYL21HE`x2>c2^#G;17L8=!@>=h5?K4z~yZN%+bCAe1pg3-{X$Ez(;DXKjFL7xer@0 zz+3wVB5B!D2cgqmB1W$1yM-%Rw1HE(?V*wm1H*C)N- zf1>a1NA~*R&;HVL38*B!UJx&~xU{73<8MsyN2QOmU+v4UucrAGN7pB4+H0!4A$-9NFcM2IA0+DNy|dV;vHF8k_BHf``Wns?8f#aP8#2* zteMeRKvn830fd~x1MUY}-xTx!Qsqb+EX|pU5qsCw9JoW>G`rVPrhNI1tDMzp;xhLk zt@uM7yfF=XPEIzL9OgX!=jj63^1IW~<1^}g(Sl;flCsv0j*i-fh?ox@^`CVb_wpCQ zr{XK&{~IpqSXqgP=!+X2jdF8CfkKbS$?Lhen$DIJiIBKydvedFXF4-zbZ<1=CW1v_ zm@O5n_q#`tjw%f{@LOAw?Vh4F;1adLOd_ceo;CdVV@%Kp9y-5cm9UO}=l$r}V@5^E zbg-c0_YMG;_;Ua+Zf_j#Ef5}XW(DpxHRBru#r#fSK|1YTN|%R5pS2CsMi`Uka?!t; zd0X}wJ-ChD?fe!$dXqM+ub&Cj3|?HGj|>X08urF7!yWS(r21oFX6eDh`)ZEckZ}BT z`_|iIbrDjB9^o%)jJvcIbhYD(6x2Ncur52#+n(MC$lY3ySh}Jw16qi7a&j_munA&~ z$q_x=bp(~Fx#&6$8#`N6XowBB`_r;O?}So)z1!r5X;ZzB0fu`};eVsw((_l8?UZXg zGghk|%p>J@evS1n4n2-c7gcY#etg|!JdX4=^PlN3h!Kto3j&s$04_&Gy&2% z96fuPd;BSQRl+n=*1zzv4Xt|vfve;&5)+5!;aND0Tt~iW^YE}AmX1;)B>IY4Lvu$r z4uRBKOIs`GGC2o~;|qjzBsR%i-0duL)4EdL>F$`7s=bjs_O9DVR59($8n8wr6}Fu* zB6?nYUI?+DNc^puj|P;>Iy*U`qF`JEB(g= zt^Z#OAgS;A`%a>ZW1Fv3fN4AZLCAj3>Fyr&qa-~qJ~`FFp->%1f?L8rEC(11(UcV3 zO9Gq>T&#sodqbo5%?Wii2ZsrWh4q$m-g0Z-*iE{hL^l$OQx=@(um2qC9k{J?CvhNG z#Cg_!)${97f}aq+(Aq2H6!)`~miFA!+4DK|V+fdyO32MhZEBi>WMs6tS2!o=2V)i3 z5N~KSd90SE36@m1pt$)iQI7GlMHrE+Hs!Z+i$-lirrf^B<|`=4r&>uy&S8dou9R45 z`tv{5^(~5w0X0F*?R9J!B>8xroC-y1MFwvc+K4eCfD(9&m^tHAB#6WubsVu)cDwVH zVzm{S&%cD{>zcgYab3Y(*Z>uD6Utj{6YQWe!X=*&HGAVtYM6j_V?Eb#8%7_-e%ukC zIdnq8#Kb$mxZJV-dm$c1@<4X3!sI#9KZ2ARtV8cq$!_$#zZZ*Rh3g(-@Jq3K zl5K>YBFdwSzML6m-!m0{w8O*&#{)|L&Xqm_^mj_UL+Mlv3|dE0M$PRNjjXa(E6ssj z|2Y5cb2Mt~dnB|*8l88U-SHVA9P_GhCheK^R(NP!B1s76A_h zPp^-5I-O$kC(Xitd5hl|zgPS0uN%I(&a!@VwFjX+2{C$>&}8ETuCHh?ThuLBurOe= zrCpGjE#-a(?|?ucaaDkR*QNPeA+;6_JNagqNDP|wDq&c!4K60hqqQd8=nzxvV_&N)b#Y!Q|ZluY+d$F(+ zdoKh50w@r0ZSylM*rTSyJeYZQaq$p{PC~s-nd;wMV|+$= zyAEnx4ATp1*voNv+#g6qibG*o;^{rNC6iH|%K7c2|KQ{MUuB-~>CQni&=#42AW~G% zP*+zsw$F@?PEuuGYLwG44!0YENXWIPX6(**lJT5uPkL;6jkVI)WFteQ(YHGkV-#j0Zig$Bx$@{B%Tg{xLt(d!W3< zP{=upRoh?iWS#>`5MBq@H#CTFaiu912LE6TrSS1ZwMFb3L_vvdSq^#{?s`1xf@Fr+ zTq_4&7w~mnjK-$1D=I5TNt)(?C>vgtUqq^Z6wH=kxLL_Id|X{z1rR#RSf|-#3pp#G z2FJj20xd9Bg$=<>3C<<$-9fF0v8dqR?yc|PrZz}e6jR8pqE%>79g!iJSlGXuFfRML z!G!P$y_oJ{0%k*RmF|x6Y;H{k)Ze!C*eo)y{?S@k)@kW#z3%U;?l8SaxEbmRmwln< zB7oAU#D8Rq0uuWsh~SN!J_SMhqt1ley~=e)$^>U}suX)|h5F=iu)%Ui@KLyU+`mT= zDvQyXvKnq~{O(Ta;L!Dk(P*O$2^H_4iFAUQ!=`&U)du1L*K*wWjaxr(#UpW93dit# z5#1XHAZg`|naV_Xy3zd-^x6)?3#Nt#iZc8Vnk`N#YD7zj|2u>~y65ET?q7_0(GcHG zTV{U$9)9&7Ti3UyO#eeV8Xq3Ri0Kk$O@25RH#891MkdkPZU5!sW^b(VbE-l`@yk^< z{RBHeAs3}nUt)aMr=&~1mN}G0$gQUw9)?M2~<4LtSFdPys5g=Yi}{i4`?KQo)G;A zIMILAbM+$N3ist!l+ctFU#s=gOkD!k8@p5^*#d6Jf0acJfocUfldoUhb6VrJmwk$h zmeBX4`KGdXJkQ#m@`*}hoXW`0KpGu-~=Y*Gl2L67(Sa8xEfV2 zT)_F4=2|n8bNM&S4``?ec^Zr1uqYSn5LyjE<+D9t-xxRCeUp3nP+xwCP$p9~7aCEjaozMy%8Pe*Ao04GoghN?CCH5C-PnNMo+Yx_sVA zc$@=tklcM;F^MZAJ#+4I!9d&Iy@ByZP0Y> z8N!)?ZjPq09fCHzg%H~tUm|+qz)J(MCp*7r@7vqkL>Nk6*N8lk^s+vH+jLV^UrBxb z;Kq7EXFEnm-&)K?B1@5$Y@ms!@Gq1@!pb=4(ZeQjN=!pn1mNb}>J1DGvsR3P5bvlB zmRrqH{Ql(^I1;SyR4;LLKLJ!?SrN{dHW>w)^Vk~{;C)0VEh`s+9EHY*Q*!1okn}ML zcRS=6s{iQY&!|zpdpNY%8--EpO;P2b5o7?v?s*dzu25?483bh6I^lf&0@Yi$cVyo{ z+)lg(tKdkfP*k_@dTWrNt|#kCa6%u4dKb1g*d@DL-yt2p_;;j$B@!^FvOxkICJZz% z?9ZO-T=gUDayiVkCHx$n1Ur;bOcq>$Csh+%JP4y&1Fhk12g=-3#Z`_jpx|IiN}dn9 z)!audp@LU`mr}+{H#K=ui5f`B(=^vNJK$p1XkXgM$YDk1BEFyMLf9=ZBA}O+8G;n0 zbMU6_l^5%tnJ&k_K)-J+oY=jeou~jApo<@Ymn-HODJKm@D124Bu5WaC><@C)SL$;- z@o=#XO0L=d)S>PW1l=4&E{{h@xR{!vnT6<{n&WoxJU2T-FwM>Fj>cB}c3dOa4V9Ft z>C0ovNSlufx(P{n`)V*yd>BaQu196>8t16eH3`ll*kARqzvOl2E+KlK9Nl8p1OeQ| z3%@&*->1fFuRi{^an6M!aSZP?tG`+=?sG~_W3r|<+)Z&W#%y^r*4O0Q^h!0qFH9FP zIum-)L}kTO2jn?xiwg_n6fprQggGv(pbusLv8KBtFJz-fz)t~9Vd8^}4_ooRdPkJg zAoOH_=d&f91I8_H8~LbL`3p^W)z1ME9^NB3oT-> zu5N)XCP>6U2fV^;fh|f*YV1x5(p0aELAt9lnQ(e_ZbaCyYQP&=m4TsSq$w+MFCl1| zavA;huuR~%-3Y$?KL6aL4pxr5r0NF<3b?2{APH4&NJZjQ5ZGi*@$itLIv? z`}$ye*m-c!aO~tckYLE=z%aw-ezc;p0FFAbG2$*&Q;(rM-xn?kCa+#7a!c{pPAD_) zA;j>31qp(dP4#9sr|sVSlYIIK5Pty#745HPDjEOs4E3{ms|bwYm9AG{sbN3OoM5mm z#-Ygh4!Mc#A$};_Qlh~?`UfqdKFcj1hK_(IDsv6oC`u?lP8{(Vy7BSAt(K|@C! z3LAh?)?Xa<0>3xOe_wrdqMeM}VXc9Vu4*0}7yt)7?2t&_VsZA#>oo=zyONP<66o@* zCnO|rTF~LB2jCo}47&_c|Gf2Wno1ZE3mDDN9mk+G6EBan6e|}~Y<-ci3{&w^pCD&2 ze@bx@J1|{agFy5aa7Z^|tK`t7=%=U>r%*L!rT)tf2mu@di^SO5q}F2qXkpMB$dN^! z{@Iuqat>(0kak3#f^mfTrDRjP2Uy_8jntr=ZF7ut>l1oD+Bi5kJwEkq=G)!p?;82q zYvd9qYi)}zTmRL3V#Srq^SQj}S#>w(ykk)cT>w(R zl2>aD98aSD(=s1E=i8PCNZFVH28awCf7lhxM_TR@Uni!Ld z7vpP`-OhSkXiw~STx`KHZ@&A?og~})9QS(t&@yE*17!(2LUOrw@iZt5%T|Wrj zd%o%Zx_LLH|Lyn=Y$VbcBzke^xxE^G^?ec~DFKp1D{SA?E5dK>fs>~5+%sP>940{`^odGYsS|8kUFL#Eq* zUE42jP&riT);Fc6ht){?ga6s?2QU#vu~vn7J!Zzu{z;i!Zr=6`tSRMhT!V%=a(2~U zX1aas!iOc*^1f^3!Z}t{I3j zfPzDU@~7PW)za!LyZEe_48dC9vDxN%Op=hgoF!z&ryxEI3pR{mR1C;>v&J^#Od3EL zn07Abe1C1(5oVksE8m6Ij%He==3(u?lwo7kcFn64c(wQDOqHS-BE0A+v}N1^$woXR z>g|ItWq2fj4+6i1D6QS?0`BrNU~g~ZS#Xl)E(QzYIG{*+l4?JlRwF^(^36?mMM5u6$VlM(~qV10}(%ynyoxkH~yH^QF_-lMFX<Sv)9W$`!H^6taB_VDKg?+!Xv^qS^S^fRAKx|;v!0*{KPtlMi z>ALK9pJ#ZgKQC5E_0MD!-3p!GyO!M{Ff807P zt-dG3cm9}*CQMS&fbpxK5<%ZF?VsYr9r%=_2+-~K`nTX9tt1JMb+WSn^~a#IvolI` z9&x`+%YqrQ4uC7g$WIyC#?J2axWl>RqxRg3wONyJz&9L3#~(|C!CZs;v#2aYgaldH zKPbee`%ky}jT_R#bb^yA6Uaz<>&`oxl%zghg@yc!Q8afAKMwZYUJUi!Wzhj zZS2>=Dq{FkEDeQ)(wCN*UQmAUjT)Jj@w&@3v{R2NdiG8KOYWr!!le9#RAmyftfGSreHw--~zh%70si}laY1D~# z?rlErV!z(!maQ9WuX^dB{PWbo9b9W|0ZlowDhKml2*eHRQC9fBLuHUDY?(4FaM#~q zaVSYUFTeU{eu!WYc)^iLrO4-SY10GGWFn@~P~^2EDsAV2a%fY?AcWV1f6}_Sv7>>X z_g{YUdx}B+HW5nDNP|;Fb9Z}lZyOj&rkt~EgMx{Yk;9KT)c*MAZk6Hd_o}+D*xZLc zemIKBRfP&UOA708oJ9U3`Gt&~l%6wYoC*D&hbf zGQVz7gUcWMe8AA9-VVD(`nSau}yRH&Eh{btsB|s|c zxB^EC8#T>39|Fu(v*ZkSowYaCt!TAdfilFV5zs%}-5e{h0xXFF<)(aDV%OhyT2=Wr zv8vI9q%3qs#!#SVX=a$?U_KVRZ>SUfVdA$xf{LgIi*~+2KwI=CEGx&K!}h|vXBakP z)RrcA=c=KEYOi1&1}Mz=a56LgHH|{iI9)YcY|ki{Fe9-L2J``V+ZhiZXWIIXj@0qu zccY>)e#(qLOMZ3kDVxc12O^N;QW_zY?#c&F=KYYrL74BdPH9@EaZ*!%hl|eo60<*P zUugkw+XDjYQv*rymxEUkNToXQ)=tv5IHS$yY(aO7};EaB+R z3+EA5?DHR?(i|H5XE8CcF`sh2w7Zz3O<3FkBGXK>L52ErM@NH!vO7>RNv;vQ$oyEb zw&AMWYwWt=;Ry4)s^iZ$geMmtzt_2rs~IhnmT`rhe?i>uvLiSSQ5Lq+@rpUNDo(p+ zoAmJz52x|Wl^T%MS6R09mkczsS2`-Kb=XKmykEA57Y*Xj(FUzb)v#E_S=VV`JFGgX zs*DbQQC^oVw;$^!cDHpnwf9ai)V~OU`K+-Hc%f?_N>}Z%2QL6i#up3<40Ou)z?0JF z{sG6^Fcsu9(6{8mtZ* z4gbBK0=zr}R!cN`b%B(RbV-?&m65+r=Y$T>h!KCxLV7P=!dkfcpDWrm;zh>twr`a3GRak){ zOMZ{js!nsSZEz#k3idvN1Y+0z6+M6nD<&p~-}L^u>~677fCSlZ7c{x&l)gR7yR^D5 zTNlfkG)c99d-0VD`=d0EB}AsX(CTq%C?l$_TY%qJ1S2wB4PqN3_GNq;Bri_u@zh-6 z$+IE_?cm?664oV{^(Dom-*?-Tc&y$EFi0CT(*;xa8^I&WZ{tMZ04JdP{Kv5^(;e*X zI`9Qel;MJ|Ai8r0j)FN0Qv{owjEIDY-~4=W7BK`}xi%e`4j|~+ff8!TMAwnXr+e5- zfMZH(sw71<#)^e-Yvwz6JZ_h0e!GxYYmrc(5?an|a4pC6;mdc+4Im11dt`Gb{7osP za8g?8;nh?jF$e8jnE)&<1#Hp(+n^I*KuZCeuYwr6tw(fsgcHS`r3E+ISg4W1;=eRw z@az75cWDR*FS{lav${<##H2$HPsjgVHbCy{)M|>2K@UM(>?lNde|)bC>e*SxM*v1V zzQ6Z9xw$`Qt8FVou{quyLh1oi7IzvhJd;&1{Q{Uz(V>(B6_h#0h9*~3I@F4>sd|C#2YW? z6e#Vv50K@#l#3uhHE{~_yB90@pbYYga1$a)fB1N*Q7%fr@(n4Uw*6J@C(`=YY{6&S zmQQ+H!FQUvg8U5^mFC++xqO1Y7nfgPF2q*RM`;%gWE0JS%0y$djUzo;vLIi$fBU_6 ziZ~t62?%ky&lUzxpvnVFD=cB4?$-3J1~->!-sGB-1aY_aB(@LgE^e%i#lQ|x0dvC~ zDjt095=4~_E=E4qE9B>c#)ToFh1~bAMi)Umj=5cC6YJuj=M5b3S0zofEEZ^2`|c-OOLSTGae`aYfnnu1Xt|jBp#h!@8=v7k4tX ziwXeEn!w5jD>dzUkN`*X8zWvBmyouvo#FI>P#VkfgFpYxt?xWnP{HUlfcL@)O%sy~ z?9EkR)Ob=a-q<_ZXH59!Wz>~;NCaK);?1%)(Z4gqGl677NJf|;@KuEA$$zup^FG~C zsXqM;>LHTnklA~rfc}I^Z>$wrx67L%gw5tUjq&AAmGR>wHv)P8Es@)xe8awF$h{5F z=F7u!O_ULK?y(E2YkwGb_$vz?&VyOStBn9*L8`IFEgR8^+a(p`OQsGc!hKKy#+qGrJ`5EuGRIY{qJo5)7}WQmb^Y1ciNj8jn@d7m zR?kuDQUX85q+5@81!R0|J3C6FG3$1lJ8@M)f#eF#p*$84rpabfyQg#2nz_@5>B0qpV zLk^DIesGTEgzdm0ga&Ro5S#@rNa6EL!3b1q5)l%IfR#G5KGLG;`mONVuPRF;c~eq- zAsRBZkM4E%wgHEao84o5v|1YGvs04Y>rRP_{NFqTUKD`UG4T{izBT+B#X-03JO zU7${lF%_$8^(V~9oNS>!@b7^=2I%<<4rcFwzk5CcY0!%i4Myyb+=b+|Q+1_Uvb0g5 zDhSBQWE6g(Z`!<`hn$S?>fu=??w8Y?)~Uo}U{V4Cl(W{o?l^cH-jD*+MzqzieL*0S zSMW~>aZ)*!hwqhpkbsc<{jSrV3T@s*pH7%{%lVvYej(AP*QWvgKarwa|1=nJZ{2w0 zLbBhXlqLXj&`gs6XgcoyUCVZj3FRS0kg3QW*xt3u`WhuNaM)cC30Kbm6KzQ4UX^sZ zX3B_$h-GZZ5V?yEZw5Cus@qF>h?!bV^ec^`&E;>FMN}-EQcJZ?49opW__BL3bh*{z zK}JPHg;jWgf{5gn48xb(tmKC|Qr`t~W0K%urwW()-dv$23+Q}m&;=vlNDSU~J!pPT z+yUZTOJXSI0bjA#zD*iE8j=n^>($YJMaJGUf5jdxR#68WO{Ijy8Hh-8_=1?$HL9FN zMM+tFn0!R?YX25)U`<_?>3Kavsl4tsY1h#_|I)R8a2dSJ_vpYLiN4~*K|+m-MU9OX ztCbuUpw~fk!zjlYEeSl7b4zX}WtF2M|jG8|ax>7uo>sH-8_Y z4@`{_i4rTn!kd@VaelymKuU&T_d@l8oZ_F;_7uX(i4i4PsC!musLl|5!fik;n1c6r@<3 zmIW^=6Bj(o)X=NSim!dOwO4!(EWrTw$S8rF?w)460LdmX5JCnoW)Q0dgwT4f)(BC0 zR-!@#d#O+(2P?b#e}k2|n}-y3E{Q5N`!tn|=8mzw8tP zqOnz1pUM#>Ck-zIbyK_IVy3}osLaP``B-|`sPUp$tVA%VBqy1mQM7&Qz|ljPA6&25 zo$NHvv?GN(c^k_QFa<;sz(Y5Dnl*j( z3YhyzI^k)P5fMiXnNV@dt)_OTnisk$Q(!>wHt~{di}_J767ZLXl=5tVDVCqbTpam3 zx5E@C1rdhoLc!fLtq;PJX#cq7XD1E6aq)2>NGPmzLJ7xk zL%g3h$q>og@yD>fx2zOjbdm@T%dRjY#Tu=EKSOpRlGHcQA z6M`%m4v_DCLo35&Pza#Ix=cE<$3EYwhDE4}<5aq9r5i|CAoG5q= z)RTG=wJY$LN^DrY(`C(_tjw@@xVk7bC2DxTancDmdhp@IDJsarL;DTC%lce$@matt zm`@Y;>|n`*kY0*Tl`*ZL(M5$r(6Jc<^MkM$!5-JR0$0zOd!Hcm{;&SqPumW}BA#S^ zlXuUIVj!C7q&Hl_ZnKlpn_;ETKROzESWG-rv;O*<+9!ad<-qdU<6n(rICGARH$Uck zyv|HJ6tox$p)$?@{%QYB1E|4xtacbVO%x0?5{|j}Q3xMFWEj|F%aR5sbTRJWIRY*` z=Evuz0AJDKJQtoI(Jca3D&dh6BhOD&k(5K?GyYSeSduzt0Wu7Q6-=qw=j_a>AICm1 zd9?TDasA4O*5)48X?~70W6F8CZTsE*^y6J+rMmuBgNa;{$X7NVK7u%ODz!2-X1UQx zVAqO{7zjVt2~#t(xamnumz}HiKPW3VP`LM?dxIwRjltH7BZn4ZTL8=7SjbLo<`>53 z$-fKhiGz@BFI;<{|DFhVLWlz-u)2*0U|>F$!BWK0QZCpyupynn!J5ieuF#26Y>{kX z1|s-Li}zQ|L}+nYTZ#}`V^}xLH>>L!4!<827W-?zT5ODyTZ#o zNeJN{39isWnjRj!Ez?R9DQVnpl1_C5+n84RoiaFP2&~Don8vH2E?Ludp?Vy~X=`Kh z1PlZc$y6O9L5-3zH&+@_u<`JxjG0|^z$E1U79-|@eR6Q7h3cj@r_G%L)(2=x(M@$Y zp>Sosh3v5aRQfSM4LZ6 z_gm70GO%gQSIigVBEiwqm!Shq%mgXTdADoix>OtXsGCQKhl7iQr3Xcn~J?wAB5!zjAEi=fMM9N{X5Nd)mwz+d|dsw z?_uIwF*bB?iIe=~$A>r@wv+6K2dYU^WU>H~@LPZhPgBpW<^4}C`U@EupSKp}JnYKD z@W8y0rO;apETjlRZe2Rp;uER1L{Jv1)d(Afo6;TY&7`MT^B<}fF^J>+JzWup^8>;_ z6cdLsNcZG;1pn8T0s~DxJ7aBibqYT!^!M-B+JeyFXbR~3P}87$L~sz*1^ZEaPxp)3 z1d9HwRG8FlQrJU}K8EA)DthXU4kj8b7;KV6y>nstGqr}MxaH+284}f>lv#)-Wr_eL zXU>`7BXw1Ak`Ct*j7&5{Clo%iLrqOxSxag)uX*A!%4txyefOY*C6cB{e;bS)@4Rrt zdRgK$Y9la$(v55`Ic1@`N*rfUC*HXyKE|IUA@`Q0N%SczG}RDd>Ao$m1Mmsq!#fRI zR^hO=Iw>tvPOUyDQ00hjCWLiLx1BwR6MdJk7|sMy)ND1*7MZ(T^Y_q(3xV zXk(mQY#vrePrC&pR}KFQP+t;A=DH<4lLl^Ya&!I(I0Kc27GiCP}X&tcbU-wzNi+fkN0t_ z;o{;@QxE6ejJgr)k)8~swPS>3Qjn93c@n04oD^x%+R3$aHgnql*UApIsf^%ytit#_ z65i2lkp-)wApt^&GN_6&4V5J7860T5tK2G))+wqwqFULp6pezGmz5qkr~dWSIy+n| zkVxQTz~KqDzmkW6O0xayueK?}Zcs0cmiLoG_AS$B-~PziopfOXgdx!8V~c<1=?Y>M z&66QF%k1I4g}WGkhkNlp6P~l6Zq=|4TE|kh4U_GE`3K!w;{cin9k`?eRcI}vXvLf? zKKEs=t5o$z#|U^0EojlFh6IZNl!;99(4|Cz-2kHFJC6t-hp->rF1q-0#n*a&D%n(K zPxGhQZ{Z)t#s65%y$X1{5qYUT|8b4q9@D23rw?`*Xkf3arm#ERg<0v5#&riX#m}y+ zqp#YNLm^Def27Tm(*I@_q*;DTIGp-l@z)%19xW)e#BZ=;80gd^GJ@!TK~SqxB}w#|I1wMVC4wp!wy&qCs%7Vav9QC7F)i2^L6a}nPZgv) zoG8i4?=#Kmy{qS>@UHq2|}P;v}Z=h~h0$?1Z&o79UkY&%lr}gM_#W@o|Vg2T5J3i&eci$=jqP?l5G9X@MYsY`p}2ZRQUFzjm1X+ z4m2bYRB^7ziYuk*;d*~GN~lNRShgbarzZ$Q?)(cY3S@@%(MRL?1-==d zcN#~>Mi*Y9a==n!9bVHxs>C|UhioMWl@kmeT{bYO*glHIqCI(g&93}{hA(Hb<{}ZB zct51Yee@5;l}_^~c`4Sg6Q+eZ=i`j*U|>i&rzjW46EVP$TV!gApe?XhoIPjkZ3t#h zh6#G7%0LqO^lM`>)}EBoTfHedLU3Ky&xhWp1qOEW1;)KG=O#ssY9`=x2|$(r4Uj~C z)n15eBGkYCW~`(T7&`q9iR}x?lsoEQX`CIXN1P4mvFe4?pTdaL*YzMKq_x0$dWzco zCsp3mMhbse$SnS3l?Zj(RGS$oGAg2gN`cnTUFXm911Hz2UM)-3`bC`|_a{3l&Eb6l zEZGW~K0Zg}^)@SB0?1C=q1^O&P$HzQe+Ka>gsIHZqO3IG%UTCRZ?MxE^#}d2N+MDc zE}sAuMnh)2A0;Xsdg2KBB`Q3af9VF+hu{Nn?W=Ap^g+m06XMetOvx?cLc(@SJ~cV8 z!RI8O9L zUe=Clw%iE|3$L5tZ#2;akNG%?GZfq$+Ub&p07s zfwmBh*fk4^d^{JWj-3lPCnrcY*(Ai&zL-L?t zKIJPxy0j)}>ZT?}6MuG8K2f5UO>?m%jYY@Ciqb?5>Bc@ZQk(B0Qma4(7$9uK^MB;A*!+6O5%fl`q9h1?k4Kn?_AfLP z-!8V6nPuRvJn~9OFsNd$2BA;PrO$QMx-GLe&WuDhIdF@O4!6ol^*5@)yC{PT&pVWp z3r}CUCTEP|^sA=7sQ5D9l+wBPFNeiZxSOfiMN=i+DbU~|bxWQG85a@ zTdO^(l!Q^hDaYe85T~@IbFwwXm=OkL=<1~F8f@|x;Efp`u>DC%=3MeHL&@V zuRY(H4cTY1GkwUiQZWibJ*S@#eDfD8kK*&YWlsonMGhyBOl5s5${ zFO@0e<8}Mk@{m!L{eIJ7X%@exoU<7lA%6~uqfbi@BEhTdGHx)H(;h8V>@QY#?$zT9 z^W1nWR*nFzqGSsunqaMM$@2hwPQ??J{X3|8D8}HZCH3bly0=6&P#EB5MaHU@K`~Lw&EWhU;>&Fkr)x zCH1&eq)?x=D29&&=MNxMKFKQnzo3@C=gZ$cq>^6Hp(ay%BU6kwUd2lGXKkPlew*Pj$8( zSaD+cKlwjZodkbT>qt8%poF4`f$PvjeHtMATpu`*P*2m55FOg$kZwGG@Xl+5-;+j? z*7U@ERPf^?ijUisahtx5q#G*sd8M=+w4h5E3oXdld6^@owIE`Fhl= z&&i;&gph`3EqyimN|%$H)xqLzrck~j4Oh<79d*~mF9e~}!LU{xOYG0%sH}?1_vy(&`>1n*xL`z zo`DHHa*3Z@WE#oRie`z(@7}!|GarR`RJkEhM6##wpN?7N5fZHoaw#^!1raTs$~M7yge3(ncO+hqEZm#^HHz zQKHN1TEp<;8~pb;8{79M4UAB7H%3vgTbwU$KHubt*Z*XllRp<=d|bA>YG*n_qhA>2 zFS|R-%FF6-msLG6VU59C$Qu&I3L<4yaux!MG4_-&v zog?rPV>CmCGrNEo^k=Da6w^)gIUQ(>eY*Vd6BS43lColo+H|bOyAn@eIJGRWzJyUy zQg%-z!-h3M0k=7DG=lp?Uz<1K*7f?nVJ5=ylS{D1Jgk^A7t&0wJPlsvpIyKcwo5MW zAW9Zi)Yh)@+LtC)5mcPW#F*>PD}fGbTNg=iMt?|S`Q!Y>Ldw|v@#~3z1K2F+O~dE~ z7~}vtY6!Ga5-LFkKojOKk3fMix^smdbM{>Evq}=XvcKnjmaPe8MguDJC?^Nk(^t(` zt3IQF`Rhj|l4azkEl<0_`^wYEUyK;MBlO?j=k$hyQi*)eVkQSpZrjb`7zTYT?K{Lp za^#!1o0TizLUi*bQb<_IOp@g`*BNkz)?CD@tqs4-6W}nfbG={h?95b<3M`PJprNjh zz>jwdA%+u(s;3L)Fh}nAK-ZIKAa+h@#-km77Kc^Y=~zB^f((W!P%`}bl@Es%XA!Te z^3gN1w7;e5XXl(t*cg)dI9VQ$H-H1v^U{MVK0wc++uJPDwu+jGw)9>0YOx=%#O0G7 zD}taPlj0&-dIl;ffyXzhgcSec2(MOiFHBLfPAv`uG{07a>Asy?4C?5!pXFu_b`QjSllqPp?tz&AqLn3~&qS>mM>eGZ z0ZX^sT-^t1LUfdcC;#f2c!ia?XkUmZOwvXI#WZ;0wdErn`U z%8+1le{E00RF$8P<8(w>M2QqN8G5QWV2O^-PJtfxM^o}wzCVPORI5QrG1YxW`BJS- z$3uZ8zA!lr^n{m9e82yh|+`8A+&g6R}yf`wWCyu?viVeVG1u z3Z!%4Hp|Xi`#}$z9vEMGGQo$OGe7#YvEU-*%q2m1^z<(y8pTw{_gry&7#GZ$g=SX| z_`T;3Fko~ip)l?`vWE9PK53BU0A%c_Syz|4O%?ev6$bfl%d~wa2(HBmsV=0F6O8Z& ztRtnb_`fe8=$KwlEPB^ci z&-KAe5Ljsw(a|b~y`*9isVxtCxb`&Hg(<*#8ewl`$Orb?3Q414R%_Vu2WT}|t*K|v z#X&2aElWokSzGy1h4kPvF{CjKFtVtCVl_kIct!jd0rNxoP#r_+htB8z)%i>?6j*{z zt9GH(Ca1`}b&f&}epU_#rd4>jAKje(!>5GHk~XgmSMwE zMjBQ#F?ahDTFdAmi?be1(bQOXx(Za>&D%&2;KSe_wL@qIT_Uph`(ikgCc6otf*Y7w zSqsx=RTV{+XJ=zReW-5y3{G(5EV8{K`*l~(CUnUwEb{&r54kpKCJWSOq7alof99Oz z)7MtQ0e#}YKJx0b(2_oi1!OGU!UP`RlENWP*!fe=6C#0TqQJXsrI?--W%Ik%?mrO| zh+{#aqHa|L_48*Y&bLrqXPuBg_hB|l#|{Y$%n+E7$^_rpD}>1>%*@a8@^J}t zxVt<;EZpC};~t>0w`uki+SnI;xwsgMC`mCV&X6osQ|LQX!=WXL`+CXw9_@5_&}sUZ zdzk4=*7Vlp!iSCELx39{q9|1edLcT^FB2Yh9+$8n5l!CD#n#RmL(UEL6E*@hj7<6h zEdifu0G>J}d+6)1%8j8zA0U)!CWC6fbJ#;C`KogHNW$E+jTtNc_ojQ;YuAM!vd}!S z9Ne=LP2V0ddWa-xsrttQmn#U=btd?v@gKQfD-{HKS|j+t_rD8(gQa+IxkGn# zxhagbAA@)GdB>LFrmff)ami2)ldLm;A^&10#IHdlgcTiJQyw5c53!Ui!TQxpvpg6X zy<#W5B}BSO6aDdYPUhL|i0EEH@MNgeGYL)Bm){ifBMtfkY7P zqPDJ=T>ZOjudZ~(cA3^poOCo9>&eX`<0%281}DX4#X6>PNDZY$*6jl<#>at*5GtfC z-iR?XI^gs^7$F06uC`F&8~+j5tI2>u^nD6s6wj2JtLk7$1F-s;U@gklv$a6LLUWq5 zWvs=JgqHUYxubXpn+=}=dPcDF z_}&#k^_1TQGB}Rp^Ne1r8UZ=STIluC^%f zN+G=)t$*)vra?XQ!KhW^Uy1~MK%H#DKdARPdf1HBk1LIcgu7n_mO#sd>3mb zP%!IP<4%^t*5-D_gBoSZbQHhO!S7Vq;7<_dN3y>M$uypKauLf=82+P)Wxc(x!&BXS z%@$MJzY846^;Uus zcO|HapLHHZS7FX-E5lzc%Q71SU@9+hiO=xchX=$t((Hwc0H>rS4{)^HtKkVffUrwh z{v+fhB&2a}E+!YGqfoazsnx6Lpn;cppU!w4F%r$amJCd@ek71ARpo2_%-3nnwfj#K z=at$V0)m25!v9>j$Yzx^zWeP(W(Jt#*aRDa3B8Q17%|X#?>h{S4*zZ~c?c7~OV5kF#!!T?Nh#3-@7KD^^thY0OMC)u+8Eco7jHLy?b*#8PD2@{?fwZ@6*hyQ(Tx?>oQU5d2s& z!9RE4gpoximE9hLg?~`{yRf{yB7?}whNb;SAzLC-%v5mY8#^j_S6hnyR-05_kmstY zibH1L05Jk|-m+3WwF-GayH+y&k8jBNZp^BibT!isB}|yS9OK&YQTLNjNX=-tI|TkiaeIXTg5Cm+SS9aR!JACr#|l<_&$oo0Fz?W~)N#58qZV`htc3))&qvmF zo(2>9`NwKbSe6jGF&1wMP`|QG1+8g4NjmfRh+?jg$2o8G4R<&DQyYMXxjBGr$wjV+Kn0$tTYr;Gn?Ix{k$tUpK@-P zw(Rv4b%oUn)rEA-RUPbB_8=%7ZwK|GQ`%Y@=`Di+#B}7NP^rfeLa1 zi<#~$D({!*D*A+!g&R(xC z30uaNq6|s4JqsYygXBBxJ}t=U7%tM3&oTAurMn+J*;)Qj-MPOE-Cxt>fN;L?cWHRr(@1(eJNZ zE0{Zc%!t385+Q;p&D@q+n9N-qbp>;O>0(<-9?nUoA~YJ7QlmgR#J0%;C#Q!GEx+$4 zENL3+yQ9-7=n`iZ_@G&1$3HhYH#NnHI{q0e%OfHsPca*tu8>hp2^+%lU%(R7X3(Qd zQJO_eC23awY?*SB|K~^n^k7(cuv3Aev_3YA2w2H-Ou+J3!=`5bXVW1t44zK`V-jW0 z0pS&l)MIo}Ogd*v< z9D(`SSyd$*gq&h1Zfk)cp9U>8u9~ji*M~U2-OVkDLWYgJ$~lHXozrd&s`rJy*^`Od z8c2jJY3$3}hN-Y~PCX@P>(co@#XyO|tYo+?<;9P_Mh9;uQC`j;HoufqfFm0?#Z_#G zwgwKI$PIEHnV?6Ydsl;X{fRss3@^o|i$kfwr}b|JTKbTaxUf5a4roOs9JntP`C-59 zD**T|Twwq2`x-5_&+0=gGm8p zX|Z;|@LwD!3A@Q}qX58RmI!u z+vI~=m8=5rQKMbqXj+7c+(UGxd{*i0xqLnkeVGQaEXavTT#)uF2=0a03Y?SmU!Eci zUGu8k;#FNv`zB+b0z&d9XS1_{v7jFV13r{KpR^`%sNeD%TmISY}i z0eX=cQ8tQ5y91mXt|FF6^F5E0pNYyG`EU#mHg2vnT;)S5x+o%ce`WrO!^XcSaFe5Y z-m^Om&cFlS20tF#32A@+z|vC2iVt>H z8mgD!h+2z?8t7*0ax9NHxolLFUS8gcz`9F(znw*NQjzZZdXRddWY?E2J25-eNXfR5 ztEl(i?i&<+wl@m~5ft+!e}7?D_~J}dD9q}s&$x>%7c$fxlJPhnHOd_t!1Z#CFIYF}Pr ztd<$?S43hdd(Vi9uoeh|tR(}w@UIsG&eL}9{jZL)T(hHe*%{lL^s-OSj5tWkHui?U zqk6BGVZzWF=V+XReyQEmmkLh?WYjPWU;nC3l!7nE#hD``Ei*8o1rNEx7v+$B4W~M` z6anOzCW0*w)c+DqeG>?X)rH+>F|sxGJR27G*IFb;3$tEJv1=%5$=9;gG!Og5zW}#! z+&Mex>brox5L1vi*aSlFrh{}YZGffr{X(RA$KOW)w)N*Rbbk# za_e%q8Lw(f!T*;>xP1h4Iw!Gc=RZFART@y3=h>F(^7T=c=ws-h7%pvF#1vUq z(d9cKaoV0tH%Fzf#Y)N8aHHZLJ;88=t91y-AMyZTOq|bk(X!g(zu*5hj%##%gMw&x ze=5~fRZePY+=1COGedQ_@}4jEb3I>{i|AuLg+=5wtGvjpZG@rp&N2(DH@+$Vq`|NW zN$mT3m%m>l*Eif{wj7qXa6)wx4LrP7Y6zo|E${A}F`z6&G87xV7B;^djA&xxF`I(V zP7bqn;bXr~DxU0mu;hJYT~l(hLZR6u5B^MnI`RY4vPiU=`KUtg51gNe%WhNN>sp5M zzEA*!E=y8CtBZE%#D_!Ot+=qVYJ5DiGWImJJ+xE<&)6qGJx8BUl=R{ z+_41Sb@+eQ2n@}T#nJkDJ~4i#?^%~$iG&MN33H{B4Q;?5=oeXGj{i}@6wwY{_cy9* z{Nhl)PWDWzEfoSnY{TMT;yjYqYYPJuSf8(td9RjMj{G=?vWaGrlIqKD*=VbsQZ<&v z8mhnJjnl@=A|pB4EzUFca|NAmkLNb5^6)bZo3S1`FY3lr4?3(x^5n|0S@V*p|8NJ` zEJ`JuTilD!#Gd*oC&~vMRj<0{kFo;y-wHrB@@=7u*8e-;E^5$MK7v@`7v#JJ?!9ed zQP!)%BolV`ux4dxUDvN4A9kU2=}N19_alFT{^c6GPo7FoWNzj=*+usaa?0;78aHVn1G}*1(S-FCPh(Ub`fo-DnxUgWMo?lRszWYeuZdD{x`9#Jr%+W(Zl)q z#=*T^vD}K-<`yv2tZ_9wRZc?esZKC^D_G))7I^(`Kn@U3Dji}2SnB*1#LZcn_u<%J z#l5Cw@|QvKG?G9D&#@-UUt$)HkkZQH#8Pdh&!KAiDWth{Cjj+gC|AJi0&HekuCJSs z(ZRf?-{seru2+~UO-jD^;j)9 z5Uy3h1ruawFc9*^XIcL_y>9Wj3S@k;;3&WJJ#$T`8Fx~2=aqY^GVsA( zad*_C%rn$6K)ZkLeI)KhOB|#g>^H(_EYz<2+0oJTI=3KqV?&7z zWlAV*>h|X5?)Jv-p?=F|Bw4C(d!`hMRI$eZgWHCYZf_s|(d++`Dtd*7X;5RdS_UxHq1Vu+s3>T{!E5JBt zb$dyd9^N+D%*{dWa?px1c>KG!cLlwdI;~6La=cTpyxR12&+Pcijw>a)2_d;2+@QWc zF)>gRnDt(O`FOET;HzQ;W6|1kauaH0YGH>eZhW=a1*ow8m|ZJhrDv;w4W+CUr(oo% zIt(G7twhdo_6uBoAs~@TUe5g-eotby3Xj~!Cz!(J19r+ol<5O@F8rti8jo29SH7DAC4IA zV}SvVg{b@O;_}@J$1$l@-5Ko8x8!2z_|Ldtwx&n~5`Qe*@w@|&Uv)J|tuOylkAXDX zia)1ri!~R150%H=x9dkT{WySuwkKm#<6_~qxpDjk7%g<&?zk<1uPtG0mc7Q%*S_-a zLVx_I(KQQh$X2gW)im5!!JSoz0}ji^v}#Nlu74PA|_{COGoUXadL2ikBWS7aMbDYJui$M zCq5hPNi;GJh`vy7IPQXG(tR_Yk@=oBdT^6kIr!GO37mO;J1p}-gt`{}5RkaS5^tg4 z^wS&7A9|f8PPNnadc7Yf$#q)mxO!oYnS*~ECZ72#Yf9XtSE=(PTjg|WR+KdGya011 zV$e{KQeq2^uRu>Dw8albUH=_>ut-vvs_SE=DF+%jqt?HzeuxQ^y!xeqG*5{$_zv%m zAt_y^k~X%_#&}^v$;5-FYw%F;Op+eUW#>#GsmkN(L`K`|c|S`xgzD@EunE>=&QYaG z?_Wvh&TWDhhHpUNRl$@CM3{Lh$_7%^d*H zez}g)dD-CYa(?GtXZDv30Rxp7Ti>BBh)tO^n0>}|67kK)%=CQt8?rlOzRJWH?ly@W zWb56G1E>>LxO2LPVZ#e7tfU>=SAZd3Ol{gf5i}3Mh_M8p0z_ z{;yhR45UCBZjTf;|8aC&pieG%p6+Bwcp4dP?9KpGBER$rj5a3X#LQh%Axj&ZVh0-Q z0I_=Qp9t|koG2mV^M;R9BSSlxJ1@IaUznak#iF!4n|fAMbPhk<~jlXD-6|7-2SoTufcYj8a^RiYRU_O}7T zyZd{+^Fj|EB$(sv3@TU15xMV487pmU z8CqI-)}1Z%tX=i>?ex6HMCC9XD3g`@fIi=abn!p0TfT(QT5laet*x!Vnv`1`5&?VT z$JVB`-8GEo`6ReCiC~Ny;Iyyp9h-I3JJ+p2lCk{=k zEFHwHzWU5|$Mva{FMsaq&7~VV$@#pIA@iwzku~`FVD5!)rR}|>>YmnpCzoD~zEZrn zICbqT1Gk%;>74r zA_sXBLxpA3klXdRe%X0*GwQERH=){7bL#AyqgG&ZGPX0@fBn<{8^c!wAUa(#X{YTOi7a@n_d1IUF4E-)Vo6KraS)JMT&|#=Ozih zIABPp{^T|k|K%IM#HYPJLx4I8MZy~X=Fyz*X;5an>%RW?EP)46D$i~B&0*5u+{M0I zMv|DZnR0D0CcWZ@bV`?V+`|QCL&pncdTh8~_-yYDsZ3H!l?8qDrr=gz6C3>U0-!p5 zkmOkCJZ|E|DtZGkzsFzU(z)-6F^58~Uym`z+$#ML-;)&nT|=Jbda}}B&g*(iI#z=R z&Bq2IfZrQDFi0NwaAsR4+{}VuSZ;dOjW}hMy_L@Kwsg1Ak@dE7XqR#Z97x^!%5{RL zH%vb}g#sF+?f!P8QeM{9mY0V%Egrjy7b+yM9jy`n3mQjoVOen5Qi^SkMvw8pr?5a7 zBP>OD8nZ|;I}vLxltXR?ZrjE9^2$ZneOCJOg&6%)jMPP7Edv!Jd{n4D-eEH7GG4Ft zn@?%H?Jo~XJ)0dhZOieVqQJ$7Zb@iL+9b||8)0C>%lnX|9e={<+x->83eOh$MDhaT z2#@<;&l-?gg9eG^7Kw93@Of%GwDlN+zRG}4lSJ;YYGou7P+wTm4CS6t5Wfz9@(<1Y zX@o&ZiaonVJpabybhgxgdpOzk;l+%*vtB%`Rr2T0$#j$T<^bf=>c@)?9;cUNVobuZ z5d37`7nnu?$6lmD7h`7?;4HQ?(JL8_7=a3NVL3&q{$+;AX`OQHFY8d|xzBI>jfkmm zu0Z14(&TYJiTgz8&g~7F4bO}rOIvNkSRt@5=lwPhz569a$hednG~8}kEz$wW`4K^) zw(5aAp9yGdK&Z?IJVamkiWEMpcKBoeuAMCc1qOAcXj~W`B}j zZP-8!wlSrbB}=EOLx8TKYE{>4byWL-j*qYJW{3wm24%pdHZqd>VE+MdxqUBM zbqVLgre^d$I*Ms|Zdugv#&b-~X;XCJDmU8LI+e1?>8USE z+8yZ`rAYZ)w|>X=TUCfWl#k4+LVG-R_2DG z5XQ8;`UW0QY6VmMaww6aT&)g=Q>!=7B79U|CsN?yZj0o)|3`sophkPXPj^5KAf^9p zWoj*46A!H^C`rJE+zd%@M7c6QM`lwQ0@z95>$G#O)rrD7>UtK*mk2}9u{}YbiBV4! zpp9OUMz08I2tw;ZR)&;>=)8^V42J#=ku(~;yv;$@GcrPj`SThsC7tehGAzdI=eX%? z(Ow`x_-Ovt`0x^$Rsh~a;^Wai!t~B!fzVVc&{^$piXD5a+4~^WjewJnc`gG&MNgB&XY3s}EbtGi0?E25orVnAyx*Uk$xkAXgnVP&yQAGnjN0WEoFv>_#XPk6 z3NnO}M6UoD%?g#SRkmX#kVGnJ8{wPzV!gFlf~jg&-wtS#^FCwS!8yq(NnRMPfD6f9pz^+B!tU6~xEqI!CJ zrt{iv(Q)yzv61zGHaByYK;y1v;s)yNid_P8N=qrAi6$?p?Vy;1=0leqh&nuQws~c% zELYSR%iJKYk_HvOdbitOPBYa^;J<#~CV@R{ z)^rFi(i+Ex{gT^W3e}bB=-Cu`N!sFrnDR_;NFj&>`KEmp$N{;WmU4Jg21hDrT*Yd? zf^H$Ice!a>C21k`swkX9x zU9+248O$ErP%v`vyp&+_dfr?QW(yL9M9pOx;do<67E=l%Vs1z75#R<<(wFQP%-wjD z!2fJo28r(AB$jnbH5wqmO5t!@*@fF`tgbWqj|uj90}ApDJ{XAL{(&Aku&1MAq(EtI zz_kF&^+VaFy)91>+T%$?A4V!z#McFXzGMW?AIcyrG|ztAeYs~cG-Fu8<;X}#cmUSp zKr4>fkmtP_`JCw6@9@5jUr>A!DMEKLx3}p&MykT$qh1d`?!4(}slP8HS7xrBV`%2e zErf;28+{8^O_O%pR-p5E2-ErdE(X#gZ-`KvD%~as)+}7wpIdsYoi#}lx`1H3+9b8+ z`m3<9)`pXT)!$UkNfz}GF(|JE(ckLm+UWsN8s;lzxOF9BY{O^daECbZKjuci`y@hj ziNSnzT~3a6Z=0;iF{~5V*ZY~X$=1^msh;5kWL*8Nl~RHNLB2N)p6UnW;w}FTO_U;x z$a8Ije}?TBQYe$4vTuSwLD9;*5#hF;*|s36TNH5TQvK>>B9^#sLt=M+v!9ZZqQPp+ zSb~lkK+lmQ+gw)UZs1^Gp|5XZF!}fIpS=fNlt;1?vXoX45Pq#=A1~qKa zDR4o-jCHNWD$NeN=aKQ#MW&ScQZov4GX6fr0Pi(5aSQR$)=yOwQLkcvKHgS0EIB=`-Z|h|& zVRS8B6mbdG>Y(hRTo2$Ca4QgQXZu^$i0lF(VCPEDvE~{b$!lF;p-<(JJCyWOG**#7 z1WYL!qIFWb5~RpbD#T7?EJergE12#FkHeiGAEUxUF!+XS=PA&&a@gmyim=PWS*rHxKEhnQ z^dv-6LQn-dj**kQm`O=|Hbf?h*COBF{6#?3M>Y=xB|y26r*TT{^CJjt@qj&%jD%g} zTpthnlY_@dQ(LvGVb6O)t(<;`1L@twHsN>Hr)6P{Dj_k13auOJQO&N~++^5#2pT>6 z?Hc!W-?0Uvk78WABU*}F%{9*merv^}IQ2@4C8Bz!t#bXtA9Lu`ytn6d${_z~`=!d0&L8sO>@hPejY(Ps|QdkN+d3HFnC5<$Qw?+2LGgwY$PmOGS+yyud z&&J$8?t~hc%1sLq{;Op#C4ulnwUQohmDKs8LE-I_DezI32Ui+1@I7_Vj10XBd?m4_ zz(4!;2Y&BC*rjKjghaVKhn~$q6s-i;m5cMMT zX}CV!4?Ho}Qy?9mmxN#qBp{n#bfgg@B;CQiBtT3VNqy%*+~{`;<<*s`qqh>@YBrXp zn(1bSTQs2|%`gyxm3SzVYJoz-{T2@nHQI9$@&b9~dIA&^6|m+GbhrR>m8!y6n5f0N zI$2KK0DzRft(WNmcI8|lb@M_cn(pBnZIWX{@Kx3ud6odA$!p2FtAYc`Xa432lnu^t z{T5FAN4E|@3?Sk1xLqh1D%Q@YT7?jifu7qOskTSOVL}cQz&as8xQP_-p-cG+G7a%j z=#2LiHG4kqypEeAU&_Ln2H_sj1HS`4zmN0Hv&Z{6>xN{}%=MErRi(!FP%5~(p=BW& z3Md&;Mgrfq0Bza?2_ElkW0U$a=j?!1VXgnP^ZY;;Km#(p`svF9(YjgVHuy|lriL@Q zcXLV7#+4C_ok6bqJ-&$>Sb397En}XYJ&LqJ4i73n_v~ChY^38x{UWkY+Q@A2;Fp7? z&JX#gAuJUIiQyEMO6lMRTyS1y&v~@hq0L-HhPo#GR1&AArrvCYPr)-So3D#euO;`b z%`tL+Jj>v)(Y$%0cpc327g7dRh-Bfw?l3F=CpZb_n}>=2z3v%=@6LgHxe#g^OrXTe z58S#9f~>FOw9IjPEUAs2^Dgvd5Dd@LZxtLN*wu|iS!pXnpmn4$QRUE@JP89qOV3sB zpN37A6s&lzj+yu4c2QeLTRUZi6)#fA#(1r9CiInVcBq`XNI6LkqV-py9Mc1tPZ!0> z+SXI&wf~^_Tg{_vj3e+xDW-sUqE;}o5b1gYyN-BJYx z+FiD{UGGUBmm~Y5{(V3S7@EdP1*A6u@_xlytF6A(Wpx|fCTTfC&7poBCjM7p9Of6Y z%;OWB`nC!Kg3t4{0+BizR_t{7KYCLEWsA+~WazixY}9e75%$T1`RQECB4;J&U3SLR zX|nmD11$bBS|lXL3wQ>&e6|1K`hM*&Ecmi5RT#cEZHvR(ThmNPLZQakMx@X%8POJ> zVosSs;=v*2hWlYg)23TqTM;KZH0*0+Jx=5-y5YkJ;J9B+5!ar>X$~6UR~&M87O@}| zA*b_Y2ze`@bN;U>U!+h_RSH5LdxAqOc<>j*X1k9%QtP2bThOnOqR+!@kqEc!=^|> z?Iu9}6ZtF{bL}bW*#rImBcz##4^Q9%Jk3wZPv(yW)I%{Kj;ZzXDu&#vhae=;0sP+4 zqDzfTc~yD=|E9!c11EeSuxK|AAWNW*Y}n{kw_XaCFiJaZd2;fc)a86SLW(6#TX;@R z^UcH@Oja(z~oI2~XsbliKYg&2l6{|0@K|o*$TwCME_wP1=f(fB)Mam$e>yE*R zz&<^N$;O5@Fr7(t!f;H8Wy~9A1fdsE?rAH`OUiH9rCixq!BQfLhmgfQVXQo=nQcl# zg*9WcOcc&6zM@9RzECiPFEZ$HC3C#q9{?3P9VZw~dUX6WEF=j3!kTj~*`zp8TiWtj z<0I@#3<53%D&D#oBZSp8;?qB^XB1^AIM)}IC4xo8L>d{{v!=kitNsSMVe}Bq{?Fk6 zKNdS^F!qG1=;6k$v5JcFZ3@X?*h8W(_18ip`LPw&_aP{Lkz~SO>1Qa0S+NqQ&-FQ9 zV^9M}rdhW7c48g0bdpCgfd#$;il_j)O!}M zrkeHvJ1s_3|E{h0!_jJ2VZ1(VOM5k=bKev?|IIS3myOm(*)_UrEwnu zX_2tH*$SDUfDtneXwhr{>XY^BYlQXt?jq*F;rG(WsHn#~hcK|qH80f+HAbL6o7`;9 z{ra`2POB45IFtG?(G#zu(7#x+iVVNsy( zo9cx)yQygoKv7uyd<-RW5CjV3(8zP{wPhv)CI1bl9l?1iHv@mk58nvKrGHJ=-9CT-H*vHtu3>p+!QybJs5AP{_5^(|S0|(GgLw~@{!;#?LCni25rIo&UrXd} z(mcxkG*;scw>MxyBJ+U`|AkZ>SRy+*zI2YySpCXKZQ9)K0ywA`y(CtgBE6y^c=y+^ zUDmU+vd*_=o|+zov*Vt7whXtCauz;6j9t9MbiHhdV5^*5p5azoiOJ>fJh&BT&K%s z#{5o=?rY=8-;4TP99*cD!Q+tvWnP!tguNToyX?lHwj~ek1 zmf-z?5td8XOloT8cDeM#rU7Qb8AEL{K6S6j(cl6Ym>DBIBBV7At9nOtJ8B@GL%G1Y z7UB?6Yg8sN2&ik~#u|6#Q&R}bCBfsm*KBXAdLAPW`z$5T17~MO&;J&u0e&Dph!Zgo zej3#wCzqY>{q2%~ly7}=TC_MDGv94hb;cISfejYkWY?H&WXyihLP z*5%QoFbClq{d~|md0HV<8$o5;6Yrza@eX0mR_HuVapNFQajTZ~Y8lcwJUwL#Z2z z5k)GGrCN{MJ@-ASVWLveAAZOw23^el2<}FNt}YumW^~x?eTLI{yX_JqMZH!nw@8J) zyM6Wm)!~cn80*=bPzsOg3YBlRz3#Z1p$@e_?=B_dfMDgvKtF~Ha1(9cMx-Xz73X!f z_L7>5%ScfVWGMy+-~o#f;)C2|OSMgSVnGVFS17rV`QIO~1+ zuvTB_kCjYY@(QL1$W6w+THpqb!>JGmq)ba%{IbnI;R4z}jOH!WM~#tV`?w_Yedb`Y z;HIIPXghYVA$L0j{iZ~yWG)Tfrx+|{KrjnUQ+WZ$=H8Es-hkVz4q6z$!AqIS^1Hix zJRUm|`U91XMGh>m`|~;-s8;+NT8Gn z2(wc!qL28lJH)D#k-gsPPK^qKK$|ZP2lgr_*yeV8+J7U7&txsWj>$ji&E83WQzyB5 zo28NpRxHveLpPXKM4|Dp?ASTVTCK)SHb!yr7schMe0r(jx^{Xc26)K*&?R*N>Az6j zr{y8~0Y+N5SyI%KT3zkT?g|f*b!Q1PZ?tN8dJR3#%UfQ>;+4XJ8b1vd?DQMaBxb(U zV=oJ9Qn!|Bc6k9ekKbQ@Tv)$1=Cz^y4yx|dtU0=N1L9&_*dQsP=bG*EI~IS4VojnJ z7XY>yNRH4q^J-GjbjQ*$m|WcO=bet?kifPT{}UvUMtPHnbci-K*0$RuTwh%e8;{aD zXI)I1>70Mj#uwu|kOvHdCvp7OBiTsm16e8Zh&OD&Sf{c{UmiOeOkV?s;PDeFVx(Rn zLk{b&CVtV;Lx^n^??%KNs?>1lu~1F)&jheq$dN+O(jkT#58_vSc~AxaQW6+`u$^^z z{r7`3-X}MR7>JeCrz*-k0JiFk>PL84=%%#uT~OG{|*)ELmUcZ5QrEo_Kg*K>AR z6+d*#wCf`nBq<$j`}Mbb-48$ZqCSq=Hs2#PP#HMPL9VRWu-RRnbd5!!tQZ#Pl>@)1 z*tT%-+VA#K@iPCEitbotYpi8j(yeMRJr{yx-t&0g;f`hP{u2$bVq5~RQmxzg@~|)l zQ6Amhh8r}&#aeSoFD%?d0Z)E{AqoiKsCYzR0*{fSES| z5c=enoTw41`?P5JX$%f3GX^Q=Vnq|%#eRe4;x(D733W9RfpkF4M8XWyDa|p3%1vDi z^HI}FV7PQqKyv%3^m^6*Ob3Z?ZrXG?rF*}V+4Q=V`k58w>`=Zgn(TB)5!APBLQUr0 zo?5A7LRsljXOLSmU(f<9-a=RpB{tkrosAo{=?&W>wpi9^o2<3}>192=q>+4YAr7=& zkXGml;;~B~C4i2UCP3_O6?-#1nI_o_qx^_EkWu9#f$r*I9M(l8C1cy-N0#8nUk znb4IM;Y1jMbU_tVvhnz41YDr+z=A~)|AcOBXAETr{RCeyJf)U|s>AQKHr${pwIhTs zK0}v<<-m%#fASL(R%1HIbiK<~hfozl8ca~slK5H=?}biWl@@AMN*4IrGMGM}*4KI1 zV>%8f$poy+%VM-!1#Q{Irz10z8NxTzk%DRxT9q#snO}BZ4>)(;S6F-P;!L^q#z6Oa zFH{!pCnRj=aC>^bsh9CX{ty92wBVl+itrqPha^G<6x}+S07+RRt1WtN_lJR_} z<_z;h&c5A;bbC9JOg?0Pzd%eh$)}lSrBoW^x2#igsh*jz&>Q+8Q~!Q>rixl9=0-1H zMa2BdouY$i;BW$M45nc1#<8<#NBiJ-n`=_{O>gpx?qi6iqu;$1vK?h*j7N>l?MXw| z+lkKGypEUBA~UuAKI)&J_fWBviIZt-oZKDObacV822FJdVb8DQ5|`APU4JDk&a2OH zS0Mnk<+N+cT-v;f`zA&AK_GDtIcnyHZ0cOs%4PhjION$|F2;{rM;m!XLUOrRS!Btb z21Gy{@A%JQY0=M$e>&?1azfX3UQ&Ey?T^+}YSQ52jR3mTSahVs>D|UBxxq#apPm8 z>*H~;QuA6o77KCrm&ewO4F}-M7m>k1(k2{m%^WooAu9CQveB?QrscWX46E3$54xx8 zgl0EZI@N8PI2U`MLH$n_^%d)GOEl(r&S@V%S;E5Q+s#c(EGXCJN3ACQYfuaJ5%%F3 zpZbrNsz(G}CPtFMOYX2`&l=r9t4=612-`@3j`5|^&pMe~&8;n5s1}SCR}9Qn*dgU_ zbo&eDom{2Y56ZnKp$7WJ0v*|;8_Z|vBRZfQYKm~_osBI;Gw}e}Tj%2G)ktpHMxq<= zm<`l4%f|0(+LD$PMBf$=L52_8QC}TSM=x_Ov|(Y@S)kw5P7no#j(&3<+Kqe(03qSR z3`G3hDZzAn0m(KfoiKGiKxBeg^21pl`Gdi*=u_fAm`4t=g1?3);T^$K5lnsaR| zvlw_gCnr8zW~N0H2s2*1@r02)@AGuj$IIl$%^>f)Z8z~KK9csw)r&nFvy^??x-TCg zmXJvz)Dcw&^9Y-=ns##A%>q@w1#HW2DOWl-2*u(A+Q=k7E#F9d8Hx$FpyZPAUhO5C zp;ow`+X&An$QKG7)8Igu9_)h$WH1bZ3x`nEvYU4*I3!(=C zDDeMkImvnx%OK+^u`e-nd^Bf^(P{f?^kUCRQ`m27@`$bx`b1j$}w zvB81Sb$h4Z8({q|MHF*(d~7sr3x5JGS$7=XM&$+E+Fdz8`}eE94Hf(M2_KHT;e`JE z)y3J60(ltokDA=eikj_4;2?TdN>8>pIkGId7(hhx-B}1a6hQ`%_ zvA*)uSCT`5Udc>>P?Z)eX=-YkcP^sl*-G8_ z+fFOj2|rz@QDJ_m)>x7jl^@J2_6(J{z}^Qj^i-|ufSMRcZ7__8QO(x z{T{VttFn!L&gMlOil~6c8kB;=MECY2y7_VO2piB&B7W+S^^;`@4RUEcmWzdbdVXDv z-ToAPe^rHcqxs6|8(i;oV*Vm(Hv?7A6xs>21A=k=kyn&=yf_-W~MQu->Ti@huo(Th^xLq&QqAV@iWN_|5W<>axrA3 z7sHtl5Ts~ux*}df#bw+_KikTrH8%?jD-6dY4nNYqNb@8_!LPiN9HvB8*^N?lG)L1B zH`G@5d=_wf=>2j7+#v$!^1keN1k&>mglmH=XRNdsO%xa3@Gp)|^cTkiIV;>zz!a9p zjAxpvw6s$?21I7&iNKJpaA-4c|8TrrTg|=oc>0IvrwzWZ1%QW)mu6|9^tM4Qzi-;9 z{m6d^C*Znys(Y86dpL;o{X9uu{`DV%P94X8Ua6x&|H%!S^aM7+vK|`K>fuop)%iNR zyXe@={q)!l=lb?5cG>1g&D8`d=@$ty#N7Ps?)8g&$UKm+Jk`+oI5;_>1ZH#$gjI`x z9l8#ev!@X5K4R{U4hlcN-Wdz2myy>FgvnJQI>w(tUr|Kaf6U6lEAV$m`KD9Tt;eVhEUlg z;BWT5pzjC|7Ude+0p`Jm=izyk_c_7G^XjIWRKW`X@coVJ*Bd`op{X19#>9j)nZN#l z3jH$*I{1&*gZM(?`dLU)t1wU~#qO@ov-!LiSCV z7;{a!QgbUCeV0pq?Jd?6v3c&F4gWziA}|C8nABj@lwY4njSTE*4(`Kj zb9z?w(#3FFWSH6(p>vrSM9d$@VqV;oEY`8{>xBhRmWGxZhA`_wrszZx$!Kt(&mH(; zVf5(Ry~@YQ>BrT5=ew`>8}I9*0^s4rgQuL@x*utNd4?l1vY@EiuCe&i{|7{m#ANBo zFKMmul5Yk1Skxgyv7pJpfrIyw#x-|jOHia@Qdqx;kTRsN+6t0oLS17B2bc*}|LD(1 zG7w$g_L=&-$5)oAUY)vczE5<0bZi3KPu*G3W?uQm2E+&_PEBTV;9@oKV-8F{W`uuHOU%XX_wCe1l$ zYmHM;x#SZ=L&LczgwLphK%=RhP`|C6VziYm(9#rMcGC-yqzG3u$J_G%g&US10_P5X z3`UF$Li{BWsFx3+J!HU?M61cypS7s%`ZG;3B$ombtk|KmWwz2xJ-^Ie*8mHkLS4je zf4uh^fuxLSg_BB_tF8daFZdX^n240U81K4q9^n9JeYsF}UCj&zr@?QqlTAfnwz*%b zO;Ih^NyK;f7?^n<|MeGfCk~FF@ zE%#CS^$5*}eNzJ4Sg^cdRwxW8(B8hIP?O7t*L;?; ziuX{PAMXVc!0PR!QSB_?;fuc>E?A67-9p-a2d7yi+^}|G>FIL1@>G4fexVYLhR{=# z(q<5Qg>ndi`%|Sk<5Vh5L2OPuE@a0UHTE}1s+b=oT!|6Ju6j@BDD1w1lE}1BESePz z1_@F$lDZJ(-<|eX=FO9Mn(qcCwEFBT^=V!!JPXN+26&$s5binYrlF3&B(PU<0p>J|BcXnSE z8aueddLIOa6i$l6m+2y;wD^){u*%e{BTOyBlSYM+V3K|dc(t0gd>$w#q}?#2wQdO~ zYQ9QgI=<@yY`#A-$)rD5Y`!N2MdI?OCR+j;5c-mtG-!{-p7cq*>J=;5vgpWa3v$2i zI23hGrcTvHD4(`c4ZwV<&6P$(zhc2~M2E41rDY%_Mjyhvht?k67jY$gx_;{FZ>ddhs|k@2BMix=myql5=6H`Jc8dCzKA$SKt|3Kl5d#H*yFPs zFww~kC7piz;-CM1X5lw22eiz37~d~!;Fbc3t-wkXFy69(dLTv)v`MGG9q}H1I33)q zs?rpKk}+80QTgO3*Mww8{90@Lf@PYfAb`?cywCJ)&#gxs=Nq1Qk$ixIa`a!$6p_S| zs}wwbB6^EJ|7Tgl$ z-Yq7b_Ui$!*V}xOj))GYK7#>WWk=gZG(wiZ+g~|VGCGWq5M&=!*Yj~dpQQqWqoykD zR?lN@#Wq`8DZKZ-7uac$J7K?T9`+f%g3)uX5{xb6l7V05HL9%#8&^sF%y+7b-AnIz z(~%SZPv=t1{jUvpGI@gU^L^n0=Nzjd?Vl7lt5|vaM)>8VPO(oCrEl{>nueBZ=o}3w9DN&@|m0sDmR3 zoMB7j9B>k>P8<%soh+mAsPSg?mz3k$=?231+T z-cHOw&i|if1_RC1l6h%P>EA^h2xAu+BCZ52ou$Es1&Y>!@`eDtW1?8P!BG$I0mXrA@4%>uqW3D{N|}%DfQ2)(Ag{fG6&sS3WGeoBPbNhF&mlypD#O zUi#QVvt-B$g9A3!%Sg9%lqjrtS@PgGVQEwzML#n`Dejg2y+1BRr@&2#C->%y-gj>V z9&hG4ZFfCTVgPJhET5!K{~xfR8V@c4Imna*d4I0S*7-`~V4;u7Cv!_1g1#nW7V~yb zX=9FVVV}W33J8ZS(Xh@xXJG*6c3d?)NSFF}KOpsO@ z{$u9!3`Gs;hYI>4xP3)D8KE_5I860;vmSN}r}NzL0Vk8?a+5xJY2Tu% zq-7Ds)hK6O9gjwZhKvGTz&OH1HTvAE`AcG7Dx%_~KR;{X-NH^3zL(>`0=^!?FB6sm z=1)7lj4@v*0HW$>$F*2^0r`Ap*1DTs@T9g-M_ev+*Z`O)za3}2U1w3#Qh&8m6XQh= zWYIbGL<{>4!asrGicfB%3t1*=4V@@Kj+V6H^0T3q0;=`Qgf?aP;CO85Wq8{Ntf>Hxt7 z<&L7qPtx|BAB5lm0NewGnAzcY?yt`<`uk^ktF;(76MP2E-#$jfGjho}yrDqyKezBz zNb~a1V1a)tJAL1Q(sa#g1ZQn`6u@n6@XR!vgoO9Q$NM)hTArI;;JRz{@63()W9Zqn zMy1EOwdo4Vw<2=Cx9MB=+qb2j9?t8&mxavN@`n&YVYG;nDC#lnBf8`_Z{l4OVIM`R zE?Dqo-;kh|EPB1nCV4&eg&oqh16BUPhd1K#^r*{ffryce2*l{RI7DGA^VC>%nq)w7 z|K+?46B+97^+jR(cD5DDFR_pf*~e(y5aJ`4B$0$llfUE1L+N%~r#?mt-pGA>_dyTg z(ugu=&ZC_fQWZvRjYHZ%>kIC-0@elVHT)d7PzZrlC>UtAjEoL{W1fd)@29$|{KQI_ zm<_kUKvik#&gw-;DaUGD=3ii|4kPiS!3mTYx2mZ4=I;GFw#~EZHNpK|EbQ>WO^rO0 zr*vKE(qywGce9h+oDA&Si3Y(|vcW9u)%eym$;gdnZ6!HVGIDCeIb(I&vJvt6l;)%E zHS!Gi)qkxHyBqZ8`TVqs-wX_th_&WWLu*raJ!7#Fxodp3lGsA1l2oSxD*_bI3w9t$ zyecZof!pb~&$GJjSIVmRz~yhAGc!3QJkQ632k-d#(hE-aD>-)q!`S?gP_s=%E?SNv50Ghv{cm-s~`Q%@FJViO`ULNy>L zpUEBHt|mL}7a9s*DLW_npuI8it#gt`4cj~Us4+NQp03iWx)5ogBtE!CFp9a@C>NI5 zc{u@?-tUK3?ykO<=jZpp&LfOf=T~CPDK(|ct}$d`MYA<^hoqyS=~~{GiI}@RKB6bub45XC zSYWuS44*Dmz9n_NrxCnei5@#(_h-KG5IAk@!yD*Xac#~nuFftF+DG@XT<}u+Hpj>m z8CPj%w!IemKkhI#Zz`toHrB788hmS_JA)DC-fkvG7M3bLF>6Nt^L>!GaO8lQg#igQ zB?m{#AGntlFXS($GkY5gJ4%P}XWZlli+ZJ4cGD`r|4bEDQb2f!!mO^RN{VJelob7G zZw0u!UIS2N^|uK)a9JZuz;FQ8=UjY`k9c0?p+^DCXg)75fGB*^!NQ~Xf16@dxT-C%RgSWIM@MT zzCToTz2p&e#7mGtio-s=QM;qCd$vXL_q~BhbUEKYAl^OdT|bG2U>0X6ijh@zJd(wB zIrROwVacs$?`v>oxKpjnw3q0K1eM7bRuKq zdUXPn;C+v69F4}BGXxjH{0}ZS{7M8^*dwEvJ;O7|YrgYR>VE47VI7+(`(kvLZj? zUdGxe9ZOKgbx~DUApM#o8}do)RY@z@vU=R~E|OK?0WK-_@v>^3mNkzTq5RGcc_%f~$?_D_Nb1*a(#Cq%X2#LP$X zV^t=*8aUkjokyieY_`6Hw9{$dxDac7@VZ|<<1V`%0vy?j>=8k**@Hlh=-FeL`o6{X zk;sR{Dz9kiY|d9cY&2{x8Fn~6(^YFVj#_IrX*M-hJ_fF6nX0t8lm0>%4#`cvB^iUa zJHwUcDSGp4HSXSq06}m7yW#}*i@31QymHN)?Y>;?+6t*(PS>9E9DFJ}1t@5{onb#s z5>oNngRL8)eoOPsDM^p8wmdz-Vc)WIH~T15uHX#(Ux5q~2pLoLznLKa^Af%s$UgIb zWTugDxid61p0Av{D6nDcVot6Pnc_Tj(@aZMgG?_XXi4~ojApAd@+vCM&+(w$d)jpo zHoktr=M_%}R{$cQvB}BJPEU8UlR{Z!=`8NqjcLR>+#C2CZ?5+f%g$aArCJh4VgF6o z8$hvNt^o-tDTOIYt4zrq?u7mz3t%ZJsV06&3_T+D8gc0R%3XNarcm(A3b>%F)r$$>@N!s_Q-O<5eeKf7+<-y9r8JxMy%4Wmw@z zsrW2ncvMq;{gNxEUppZf*A(NbDu%h8q3z2{(WrCfr~oLt13p{P4{vG(Mz#%8ILM5R zY$jy8=JsT`QF}#FpGO&7R!ZDkX2?z#v95qL+obg>w7f?b` zpJCiR0|+7AJp)Yt>rewg^MS*Ps7Ix@dECZr8Y+|kv`fwfRq?9XnISQV-ugS)&9Lf# zi#!ATN=LM#776YiA0J3ihXrVjom*JCI!V3?6Qh89Jas&7dYzsVydO<=U7s{@a&iJ0 zRrZ)EL`*Q^c2;;UUGYE%CDBy!pTwgf?ak={03=+5WVJ~D%_Nx2OVE|$58K3mlf8fKe6zRzTLZp`bz(>SB5+IaLYqy+W}c)c%78Zt~S7D-8iC8diX*E_sQ%#rK6_-o@%ZE6 zz6*|MGT2iGfA!3X^=Xrao7Z{fz}g)4N6fpP`p=J#@tfSk7Jf<#{)!iqfb(GX0vx27 zn_r`m%cOI9dzqL(uj4#=P&6)K)BaffD9EY%D)hzp6-lPFHB-j;W;8`#fbj-hy-^jEUk!6x*bB-=$FcZ^0$Z^T)UE!cEC?f$bD~ z0jo_`J^P2i#V=81w6{nL4$@qp2f zbNg=XrHqC#HK|})X;g5*ofP-^I*<;5=Tj!iTZM5rG?%scj0P2!9vh4hzy}b=C>T$A zyl#tD*HfjU*KLd+sJa6xN;Ft2H-TOh>vO-D^jOv~ZcdGXlo7@`k=c+P^GW@j2y}OEz9l|n z`o7l)1_(%x7)vyYM*JjXw(dD>dYV%^$QVL|8_gTwUI;Ke=kQ(dXXH+C_?5V4!?v=z ziW4cah4xqSFDxXdZcs=hT-VcU7!uD*G1I~ex%Y#h8fuKz(6LRkCT-Ack3)CRtH{U( zXS1eUbewvup_&|WYGJUK#{3fg>~!aTic0vJassrg4-7a_{rh{Hf~ znTK%P`q&o*o!2=WAP#X4`R9{Of11*Mx)mCfZk>;60J$_*%%l+yps#97nSznJPmBg> zDaq)rjEb={EoR0gX$h~vpjK{`en<^kl_f&4&8X~KKu2p^o7@;x(zx5(dqkzjoVg(y zH+BR@EyZx<``xA24WP+ub9K@EY^equZ5PY%+$@<&Y-)%F+Y4`DW<{>23& zW22N1&$pGcvv5`99Jsw(b~XxEuFPa!^ivbjcT8%ATnYSnUTzgmuxQRL>;4;h@e;rE z0CLGx=Vc2o%uDB$KIsWl|I>w}RJ~^ufY&3U0V~-;+B{lcPQoL|ov4@>+^xL=YY`7% zZx)Bu>i+}6R_&;1v_Ilsf zb)7iQ^EeK{D4A|JbNYaAQI_%6tg*!de*HgzeZ3CAoTOha+u5tF@OoUoL&G=N0=@PC zm$0Lbm8JJ0W-8I`?jopoZf|d@T{&6(YYWb*jsvBG8dZfYq2tTHcHbFK34)U;C8o<8 zY%EX1GnzO*W7t(z@|$8?zO#B#Z`Ur(5&D{c17xm&NU9^QizK@LQL(Dt1-Ghb<*xwN zjDa881Y3KZox6dN$LVfZphirYzpTbExCeI}wFZhpNF+ITyP4ly?Xd2u>m*&25=9a` zL?9Ko-|cd<3eAn*8{u1Ve-w$(66|XAWu^d*Du#)np|7v)?e1)O=hF=?L)H9&WAu0U zpMMhskh{K#dQvlcCQp@)T>km9{M<$*d_ny=5^9AqX_Sa6T(i;CNeJy*-W*(iPUL-0 z>u~n+4$oG{hDfKOFW#{M38MF3K(kUwF%Y4-i5{;23h^L-GbPLEDl;+26&$dv{0JP{UCOP>hk`Wy-+kC5&ubZ}BV<2!BHj zHs@sKK%h1{L%{A$>+KVbA5O_kMy&f_Wwn9SAhy`v!BWyw@HuJ8y% z&9tEXAjS+x2SZE(0uh-%JvQO?jOcdKW-Nqjug`tUvZX}iTM;{jg$LSA$@6ne(5u$s z_3BKY+m5ONZ%nzBN6o@Ut0b9&i|zEAnR!`9meTwdetNP^4U!pu9m5a5joN zt1hGrDKh)DbRZ2{PP40p5|*#5utES@D6n0fISU%rrTQXGoiugPJ=;k$OD@|@1ApLn zYu!C#)->$8XW?YR_a7v=e7Si0OCBBJ>LJ@M=wBri8=pP|-nw6}!CFfaNIA#YI6bbF zvG@PFsFmmcJA(Jpr^vnZ-D@RW@CvmnXOapwwzI65--i)J-!unyeum5+8hI*`3Kf2u zgrBOabaAF_hW0adGWZv#K~WNPsj#0Fd4e#iadKH)4Qurfl8ukIOr z;d)Qth(e79d@;$S0=2}y6*05X***W-{Ic4zY+f%@bK}oGo1c@Hp>Y%%+*2(DArGHzQBu7P4T{$Ki?!;3yyxEeqrR8VE9LX6`qU`VuAoIw zOenhaNI5j@6g@j`qSvup>q@T>xT8B~O#i1Jc`2vGkH!zpgj1vhTe6?QG^uwcT-#s> zCynTHXxi1WGiN_@Ih#K3TPXQi!e%VK$E8kSN^Rcxi*+>d9oamm0^1$y$m@>yx!8YJ zlxQ_#RJs$8pnSd^wk&u!uExZ|SE(^#G6i_NH&%z#0izIIkByMdr|~xv2iQsu9=-{F z)L+$l)dYypU+eQ$pFMxNVo8e+j*OyPq^(C6|1LUG0jYI%EDOH@~p78;tB{~PqIp3d^(5vlae1v zMHx$^0^VFXl+m%Q;o*p6w-T1kn2yaUDL~iMnANnXqxL)w%Rz`0>8WWgMW3rC$1p3oZE0<0fuH0v}iADyEnW+D2qcJ8AJaHrWHtbFi<1v@w0~vUF z-&lUK?zU+8xZqDP>t_}-MO@yysFt3LYY$nJ-nnz)ynmE55O8#R!uCv#E;}|Rdct6S zJR`)F^Q47KCw_pq~k2C_RsG(d_@!yr(!{nR7l7Rnj#28Y!si zp41!9XDuS&49Pc11?GlTeBH^|Su@!c59whMXOiipVIw&PdDm7;q2ab-mW2S3B}(Ds zY_OhD)qxY$P`B6FvJfvNfeB|-ULNtcOe1dHPno;e8&%rw@6?iD$wozZ&lK;g5~Kqs zN6pWYvX;C*v_oBP6uO5L_}N0g3r~Ahm>-}>5Id5Vy@>+Bko%cw412a5sQnR71>zLG zHvc$(sdU0q7Mhp1yvHr}R(k2gitm#)<4-*oTSRc9RZ@fVxX;h>I_2>pMbl_~B>hS7 zUt{_1PUU4MYa#ye{l3C{7AKoq;PEuy7;_Kp;hL$D~I zI_By7=n6=y3vLG0$Q-#rqT`4%UApe$lPg9YNQ%jzwje)?<@3sc2*8tes(FnB@X5^rih=ik((coGgIWdRk6|*ru5355=MAO>jlf^O@ z4NVbtI2kKtnw(HHWNq2!`4I|xlf)%`Gt%ARBj@6odTht9B4;wXs&x;~0rBxcVTgT; z-w;!@+fza_ZNA(R7{Ng9zScF?e!olX=d4UhsiGVH@i(1u9!*gPGZDiNgr&mjYU?za zfi3VBS*Q^gsp#!<8C97K$l_2vE}vAK+TZMri$OGbR!^##cMk_q19=qpbLB)nHm-E| z_kRQG?a_kut#;cJQpHPpk7TW`;=H_~&bs0o)S~ctDJuqH)(8d&<3^~lnh6l8tq?Bz9 zl8~T?kyvcSX{Rmq`#7X*l8Jl$Tdz-)vY{WdA|BZF6d_CPnOl@5@w5z0#xyv=dc;W1hFf;WtA)!P)>2tzq?1(T?a@hc_^e}A{ z+=F$pg&NP|Go7QAw7%D$nrILG$OIZ#o?f*h-N3`JbW1nRSbcZH{q-8HJMohbV$$uq z9N+Cyl zt{Alhh9U}#xd0vkDTmu<$hOHM@^XE_N6-ers_hK)J0n4y4E% zPz86<+~*0TTGXv9uHuCwT{kv_PlyW;{i`y-j`6aY+1cn*K|kv^v}0 zRm&Z>?>O!KXP@&I$N*Mx&zyj({r0)kv)ZCV)XY1d5V$ekAwU$-?-mk3eqZFfr3IZC z*;wTE3PZ{YcfBU}ln>SWfawc=tWo%Vm;lI_fG7-TtsldY8!`$677z)wO z|GBj_&VPqzR<|>~AU=9u32Do|1NZPNPDB!MVLMtY%H~d6E||1@=yJ-D`r@Kdd+{J7 zflM>1NF)qN;BFHRP;Frv&HrJFePX2FJx`Y?HNM)6rmvlBlH|HL=Ma=sSz^RcPV2}5 z@yKVpZQT$}a#)Tali6~<>BbkJkd^;Tz(M4h{c(}7-iJh3>PfpF1o4tgkk^^Ug=6TL ztOEgibO+2{EsR@Je$tjtUdml-kI|!sI$Q;zx}a!?7|}`*e;0>PYt2dZirasJi`Bk# z8}Mee3CI+oh|rl{F1S;aVsn3Q5{LJHT&4!y#Ulw_2A~BH=zRS=k%^BBAU8qk6A+wR+m+C$xnEu3IzuI(AG9p8I680c zWBXApwt?Fq6CNhN{{{sN!0bdzl}U;8Be3%cbs511Yd?uocy}{df>!uF>+LkB(YMf8 z$T2iFxXlfxtcAs3_+}?CN4-F?KhHXZOf(y{}@7kNu4U`%Zt?t+L6~j|aj=3?hO0IUwtWGzhJqD=Nw4uv9AFG>W25r$7=%#8gKNE`o{A z*eAO=8js2X$Va-TEaQA`r_Uiqg8}(!fh$EK&Z%h4GhdCwrrByoI0|P~D7!YG$sg9c z$it}+XRE<4mF3VG1^jjjt2&qGQ0f*=^lf(mTh$^ZCjipIOg@L270fC#^mm>6lBmWi zHnz8}KV463Ag9{9+Hmm!LYn$rWFf z4yWY!-fF_|!a!>aprESq=XAQfh||=B-U}}p92qx0gDm7=s3ODbu3VDe@W;O}OsF=E zdu%T!*-QTlc>N9_vNsa%)2k95;1mvHGPwcR51_R21(;hM-5*qW1!jfgmbm`FL?>kV z6tDqjh(BxFb})GA?$7jtRaW=iZBys(-UDLm)p2v3z;lzpCSJ_!EZdCZq5~2J$NFZb z)dPeh$QRI(&GLglaa6%E3iq{<3Sb+zN->+QJW4vB%;yf;&)MFQ`7=BibRxJt(Fw-5 z8B6Iyn#FcU0$IpRPUPJu>1-Rd-axH^RvU`KQqPX*A z$W=0oR#a4!r3YG10HT`@8?nC5_XF|G&0NUX!>X7+4MHjx+Jl4@)ZO-eu`> zd}2EaA3TxKLn-iviqfvUSF2lXTwu~keBSuCzkx;y9lMB!==iokA<+VePXk+WZ10N^ z(P&v8)5U*g5Q{C3JWo)%wz0NE_Un4wbBBV0xpBP(xRDBiCwZR37_(`@q}lC?^fhtn=*@){I~i5JPb1Avljf`$aha4_3nhB|Pg|BCq7B?&%M zhJrZToc3w4pSsNOTzoox0s7zWni?mpF{BuHXkn@+-Am;!8P)yqN|r7j7B(Iz9#!Wt zlT^@!6;sw@SL>k0pUcSdAwJtGWBM%_LvOxCwlI4GxbB9sYjMU*4uv)$&b#BM7hp{+ z=w+{H@%1BU;iGoxZ!k4c$nkRVdf;$JM}#odZf8*jk;qHICP`cJOYfd||^BjtMY?)ObQXu)qB}TEt1`aH*)Cw&w+1Q*i$zY?d>ZIYW zgc+=wxSk##vwd&VI`4-&@jmb8=&))Oi!Uy5;^6S1MA28p7_~HU zh~~*S^=-rH)-S;**{&_4W6e85@`Wo=n%hCh{C&;rJCBawdGs%~^~Wxtb0GKvYkzZ= z;Q0{;kOOpuK;}f=_5*^7tGsW!&w9OM+&If_u$j^P4bosd@QDqoZ(Si{C~(Q(je@m_ zxlKI}p>zPL2k1QeWD2)d$Lrl^FY8ahmZE7T;kks7M~>p2 zoIGVBOH=V~vE3GROx0SKt6W2~7Kn^2t?_2Mf}nyfnuVZy6BUjlKlb-Vz|6&O|F1_z zkJPEaXoH72D{%9Ub-}K!T+S-#NB?_jEMWIh%edh{t-$GH^>sjnr z&EQw9<{DCYJT5nElwZIKWc!H(3jodKTENbn-T6$D5jEx9 z=(nhwa?6XP*)fg&nk`DXOm6I$U=)N%wl3*7FEXh%m#xReL)2B9>Y9sXU!Cl-k+ecs zWej3%7T&Cw?~ksFfO0~H5a!rnhV?_mxvP?_ z>w^9F{+`mo`07J5?Svj*5IlXFs-i+j;ONF5Bx49`J3qm>FRXkiqa!QL;7R@aGkkh> zM99vqE8PkM51r5BIlh+*t$qN4d)5(k`vP!?zEzh;;1==3dXttMgx+TX>z0*el%VCk zkx7ri)9ytC_g^j>#4vVC5^YI}X(vypsJp7Mwc(ebtLwe_%7 zQzR=9aKWA=I0+uKFx?kWVuzKTo054=f_Y%exVD$xi+4)lehmFeNTYH!Y93ojCHt`% zr|_NtR1wJ8{?jxnhcIdvSrOT4>TvH5lux?Y^J3#qHnTyO9RRP842)6*BZW18S}L}t z->XYI$lxdt&ciZf(<2Pd)6hQdRqx<;G@zRUjJS^dNfmer)J46YW6q<>UO@emMD)Yg z6;&Wr+lIBk(wvv{#}@TriJ@RK^q#g;=8Np0+J!0^E`;3I28f9!jeIw(7T zri>f6X3IwnE(k$GEJ$pSG?DN0QTRP2_|ICN5PZhrcZQ;guB28q>iW|W2csp%=^p_Z zFj*r47M`n!Zen4$aac@9&&cqn7hDV9`WSF;OzFIce%t7On=W5_veo`YpEOFb>F^^` z0vTDl-GT9LNY1kwJrqw+X7uOIGVG|9UQ{dME0M<+fd+S;nq+{S(iUL3u(8re z3}fU}mN2t2{SqYbuoaY;hz$1cmUiXd-Qw|fW+Y47o}@goLnjQI%>~O8ZQ0LQXhOBL zWz3f+gRRYvHIW$UyDT2pU41_m(T$lI?}6pVWp#y7IRWoFah970vike&wIu@ai;r2& z1Mkn#NNpyE<4PRWs{kPpnP$~g5{q}rn_=NkB(ihTUgQ&NR`M_%4rFQ|UoArJ33JF&5pGCZ}YG5*pqO>4yRcYUcJW$;!_ z>|k5ir&{-!_&9M?=n7;V4edQ!S4$_ZWKpMwhXAMOYabe*g(PG+J$>Ginx2(4`-!Aq zdxb%L;WjiaUSpt7Njx*ay zr&brHP_7?o+cU?ikU%M*Q)Qj3;BuB9H|v)4!^^g-c`O&%Z0#|vOQ=@B!3CZt^?|)w z^tQ=r0S7_%KqgkNr@8BjjGX~SUd`$5EV>bq~PBuzs2KITgX`p-{#p;*CyL<2!N9hifi4fh! z((y~)+Y1)%h@>7Q%z;1D9;Tb7Am5Jr69FQj3~XF4K(ClF_IZm4kv5NWn;5E=J=X?Y&p z^xeIHvy5L=U$GoGQzU)un~%ew!incxq{3)9SJHI6E!? zD1?a9WFh`;M{Gjd@WYkZBM#u$jId>tw`hq8M`O|9z2&>3fQUo8JkxtxU%aH({~I=u zoBj*csMXoW!vt~-SdA7(`tI|RvBvGO`(xHpNY|0`VX*eIegN7=R#Gn)e3w!Rjo7=FdYiFaDb@W5Y{{^!uWmibVP7df zq@cqEgJ8P|{~B#@dp)&6^_vz|5~u%EX|a;{Y2+w08F!`0Lk1i6lMFA;vzoL3N&mY6 zp1ELkQ{6e#(4HbqM_p?x+uSJ}gmi%0FJ~URI(z_p#3PU+PZW3>l=rE6d+dwGRf7w2 z7B;uvA`fVauf%Cqi4pE12wg)TPnAs|A-%iWYpRqRU$(HaSuz%DVl&@$hRQ)Bi?7uP z4U+(Bk|8I?j*0ns{UMqV{NQjV4;KfA!^K%0_UIEB=q{TZ5iGuRka~5o7TFrtm=UL%h}DWcjD^NE!jOR>;hC*YZr`10FknK#HmU`X zotri4Q$|BAtq}`CJpiYS*c^VJt;Jct`=^}e*NP@&Xw0bIQ;IMKNEcovxDxm37ldZ2 zfxurhOOm87f!!w5RT|e(i*T4HsyIbR+ibAUkO|39MunO- zvTNw{bPP}y|6JKB&i1shKPI|1Y3ot(8JZz_{}_M};D@Mu#N@+AH1v`47qfA`zIKh} zYqmdP|N8ZeHyk{hx{RzO-`^lWX*JSE?sw>Pm?~5cE{+^~#z+C$MbeHWtu!J&ObF5L z0={dT<<3J#M?huvYRp)S0+sV^1f{^k{!bvY`w0(d44k?BUKvT*M+p<79g47KPLmZ2 zG<3dBohEP~=TqeY+X)%it(!NseZCogr9h4TEBqxn!lNJh*h4mcs`Qr%%>lyB`Es)p zAT#UZ<3lNzb4Z8>0}=R->ikhLZjUcVH#18&Gbd3ruMO61S%B@F2=r&ku&~|`MZA3U z?3?8>XtA8`G4 zy}Qe$XvkmHFxXTvRm6ma?z5U2572KPV9yt-NrZmQ2BWu0UpbXaO9$9jSG1RtV>-3+ zNp9%SnV4EwSw-_d9Rm@|%gYm8DpOx)sA#$b4=Eak{TUqoqOJ%R?qVn8UWp7@oLLLi zpFnUXju0g|WW8$KtkTc>h(%Rhxp99?sjN5wT_8tG1AQ0aZgh+JdM}j!E0t@ZFxXlyk zH?>{SX?t;~F<Rm-$|KN*{}F%_>dBpk3b(m9<;a8@Q(q5B zic*A(5v4YU7a7c`)4|Hje|t3Vdo!K$yuH{^&QLsjbm46h9Vr$ys>M3umTa~}TGJDR zrZM3ufpQW>+1cD*Cub**fuTN`nJxm;Oo+o$>OQu9>oIJRHgkp!J=u!qlYROH7_cVZdd0uZXtM07689eOv&fFZT|+)vSK`Dqz)Iv z=a8oiqF*)(GVNcwZ!C9Tv71fo+<2gX&0$)3?IE2#7k573y1V7dJ*T`9Q6!Fzcv+uX zU2$j&8*YCNRF)(M&vUX8_TO`d*zs}SN|ZnK?r3RQL=ickS3CQ4+1FM5SBD{6uBXt- z*uedGLR4N~-%G-*fc)6C*_yo-(7_WE-Z1}rU~fo^?WxFdEliv;Zp?gO?Ck;R5SmYx zhpx*d<}AA_6&=`S2!rhZNmJ79$Z8&h$rMc|Uf8CclCfik#S!`I#$&4}IFyL)e~F_@ z1c<1fFtB_={}q$kB)M)kNJxa->;gA=gTcRv)o3j`Yglo2TKyy)mZj_&-wxz_8cYc47R=2kzq>wxf)Hyft6|JpLY)W^ zWC-lu0+}Ln*2qQsjpY6Pdr?0>KY4vSbvHLMoE=Wu+8}Vp1208IG6W(2me6w4^73Ig zxQkhG-T8O|JZ*Dh@zn=)vx#c0=61^GZ*|s{sJU--EFXfHBB9z zdLeK@@Ba26563*)wlp}8pc;jY;ZqXOeS!?nw>2;hwz7j|+e5Q0UOI7FX;!@|EkAGoM^HURqXjmLes$B6J04T**5;yhqZs*bW6o}RX&fljvL&=pGMkT8xNX;z;>WeC%3061q(DpWfo#)3fcpj4C}g#?C~(sD~Zad zNXilHc8DNSQ>9|-C*rTL#(Si;E1FiP;!)bjJ|~4mhNYL$SJ9ImRrenpM!Nn3Sel$3@MVuC+tgr6&?~kpZDX)LVS(l zUq9kWB$C$kkr0&$$%#tp2`F;oh`>kEZMbG@iX4%t65d+LJh&)Gj7_?`rx3mldCx*_ z2#p&?DTQEf#rZU5^*3<0cCeGdMGnvHu6X5&td*UAU5`k?{|D8|zK=hsNw@>v?+Bm^ zEe)ba%n)nl?#+y^ucw{9=dJ?bbv&5S;eQXQN>>tj%vx_GLYF2R_B%(;U{x^ugc=8! za97jYJPYX)g(D*sga8vM*}^IHY`@c&wa%>QV($$>Z1~%twLSTvQop;!&Zeb@YDVL& zYVr~?@0VKy^Wn()`o`y@J72GxF|0`gII~sJmjL^^+BUrNr~dwa2_(GV*Vl!l{V^`i zu0mggh4l-r8SKDym0fg$<`U(|)KW0laYC8Clz5$E_XtP|>`0w%7U|rD_EM6HaN7tOuP#;13zB@66^d8|RY%W4Jcj!dp%4oaSYq$4bDE7@Ouqy=0+Xrh zlcS2qvpX7xHqlXuJu|XN?0irg)4&~sK4UPX7)iX}YkyAfw3KnA=2?nK&X){hv4+%N z3}JQjGm%;a*FXutxuVJ0}Lwm3An6ZUS# z+ngErGQ5!>{TDEx8rqtoY!08Jd0H+miVPdiU7^pMSvtYE(}O?`JBAa&1&Mj`U*n!z zHJn>?6`&GI3lxym_OMp;L{C=u))52KFX{%xGD47k`{Rwe_MsE!U4J?w&a z9Gtg@p|680CYS;Z2G%7P=WDL)+*13uAcp-y98@OUmS5YO!%7qZe|5>(Dnr}(mYpr! zFl4oE&l4H5ymqbFc?w@WKBMx9e8dC>Fm$jvog<;2{}o>1VCQoOxLLfvYp-83I;o5| z&%qaM=dje^WX6in^}B3{w%}m}Woz(mS=bm66WGKVZL<#gTwlTe*6 zDzO0R#wNVg%G1==-Fg3yvb-(;Jgsl%DNyAf(BN?skrP!yYx>4*Lbr@hE&oy&NFgH* z7X~N|9HwGX%87|JpU!&|9WBI0utSZ$aIDLFLclEIjpg->12d>^Zk|Al8vLsK^ZmL9 zl%bk;*+rGbTe>c=IURNgamy$wW$9oz7SLDgAI18=Hy*iuQ+vCD&H` zJkg#NaNZ$F;$mbAK~+7xIXsm{8UClqQF(#%M`KrqqT+UF>GR*$OB%8>=3(k7{YU(7 zGs;!IcRac)e73Q;4_U(^BG>92ar&tpb#2vg!zRSgd~JW(QX$whVL{bQ`-cBd3!o0x zqZzIgqfMK{!fR#4FS4bG2vU)1+4XQrx~8(D-=^_vk?7w4y6;g~1sIJ{l(Q?uR4xf< z;QBxLgV?%m!;1g;*H8$li7Abd+vM`Jm7j0Bag3MWWsMl+@`N373wqNc7hmyxuz*U2 z^gJw35;EFS9_B_%S2wHEhf<#^m*MmH)zLR$PSi-yib6F-im#JwKhX(=4VOJNt zT0#0!+)3#zkG(@vV0eDH=t*_Y))PeSGaz80#8D3;Q{OAYFO|XFl~X>>w*6hRzr7}Alm`x2zIL-QHx|t;gRrk7MT?u>%4&YqqcAy<7F+NRs=RF!O@Q zFNwP4;3i0+HbD#9JlL9OB^Y+y znE^9`=WG1>kqdU-ht%Z#11MC%>lE18wGd}K;v^SUzpsIeynHKwYvJJ4H;J^zAdWYv z+T6+y@KiLH1Z*2r1%-jT*$C{q>09r>J{U>06>Qf`8236-)7OMrZjKPb4c_YL1tyUn zVp+KaZT$eqxa^9vAl~Ubs0L%;62~h(f|bbx>cgMvR|1_gzE|aUAx4ungE6}6UVX}0 z)-2=}hv7lrbURp4zTnNUe$$M{u=+IurYX?-r&C;w2UpGI+w0|<*U1S-7aG4N?(-EcrrI+BnLo9^7`PhQs9e4lbaHao8ilZvcpd+9U5|D9@U z1PK2pTZ^;9LtL>Eq+zOB2aNpwariOf0V=Ycgff!6-xpi*1?qqc8@01N*F+5|MGX>fVlb+Nj7 zq^!f+!dXebU7l9ij;v0>k8WKU$e9T3p(L_oV5nkx$$)*S_ zxXM#x2_xp7NHxXo|Hv-m2Q?mI99sCEDvOSQe`tB*r|v;BpF;Z_iY==qyVW>y(DCWBQv^x&dvXXpOG{fDMVU(G zi#_7@2G<^zNK3_()-a^(=Ie&B02Jr?4nNCz>V^-W1R}6ma>3R4*&V5hkKywz4=5+7 z*f(8hd0sZ3EjZ(#(2#2UZ>Va~dF8@t7;scB@akbFthH+?`Jq=~kEBt7R4^KA`HI&M z-ao(nj8CSzdR#nbiVU4Un$BF*Vt57UQu8Y-HG469KGxUfbjwgqs7Zg!^EkHM?!;v0 zogS8}_pd%0!MiCUdXT5*!~B2q?%@yX-pR;j&u04j=Pn~ZqN8G2n^MUJaYKaG8* zZ9^K24Z24d6BQjjY%3PG@UQeM3~sqE40PS1wRn7;Ct&+^-zvYBrki~fc?0iui&TI2 zsKc*P{io*SzPpH2brv)Uveud6=261#^)#_bSB{eA)TS(b142{v2^vc8Wz3CqvLv+k z+bXF^1EQ~BD2WhCLaMKNXLx>@;{svyhK+(cT=O=w(ZjljdcRc9iR9*pRX^j~orIh~ zfUnd`DXI722bQn!uFImDNYU`IenbRD1Tqe0N92CJTxTTI{J6@Pm3`j0iLT)ulqo-q z9Xq-c1UKP|_GvO*B?n|gAa*>AkqQnOfldu>{OaT+t0zb#FqQF8jCR~^nf9wcm$lre zg23wSklRe-?ag`=|OYlGZGQ8{dy?63)b$+)G2eK@03U`>bJJ)z3Re&}{whyb>RFw9wf5kYJKgLZrCoH$iVa~pQ95o`jCxnQQNT#Z| z$;|n=Yss#oG(#raYp0O?Gqy2wdB~CZ$zLwW=5s>7hbD#iF?@a>&+U83ySTNjhM)PL z!&G{Ck3u2@?_O;t_6dASkGFnWYLO(~j~3g#2vof^$g!{8h)b1xvslE3$Wz5+p?a|``NZ0KnOyQ>9#ux?1=hV0M2VEs zvVH>%oG+i#;YWk0AOf84EHVR|?0Y!=w+GSk1ohZ2ztZuDatUI?h+7|^B3N6n&63Fm zL5b!FVR0W5_|X5=6H=Jo=8GRucv46p$SlasI!_A^kC*55+H2!4YHNp*oy075Gl^e4 zOb0B(brHs!O@y8JpTa0S#lu>mxc{6Wwgy3FCgBan(LUC!8o22ivO7gAY!0Mvu_oiT zvYM%?Zl&Ebu6b?UAo(sGe*eMib}Hu{6few^2nVKivVEXT^$Mv^FB>Fymjo_o;|kzG z+cvJ~4}Fm{(mMA;O#5NcFhAzB2TelIQOmL2MOOB=Y1*N>F+j7^GjaI64*oR{1AXpH z4ozO+f1YOu?@}i{6UzPn6;`q!MZ$n9Dh*0b$3U=B1_Y zj27Qdph4}b&ENNOdjnLjik{<=s2?T zAT{)(*pKvM@n=1@^%B}dh>CO=K)4ixE5=SoCm7zfm;h~4#!~*VVtp?$`#!7rm-B@| z%*!UMqP6?;rn9w2b6bnb21u?t4gvd$xN#od(~<>%@QD;cN;RS`e7D{Z4u0j{R#8zi zJ4-H>%oX#>?~SZT>K8gvb~F&qxI0y*RIPFUNadVPvUD<*Jy=X3uWNmB2oNsgz5E{m z))FwshyZyBtU{Hv{8+LFkOLBspgc4C-xXf=Ca;LKan?O$!3?=apB(jm3){2}8+0H$ zv&MkbgVUNJK%l(NMrJY}K@n$%6~kT%_Sp1q*l#;FpG2c@%T3_JdkFv5nZIE)wQb9J z?K1vy<8p`4gmm5O>ABbMH$EcqujT zB_^}wUY*9%MIO%R66Uq_$;NBCq)#;!Dm3hb!D{F$4O=VsTX#e3>sHm<+>XoN#l`tS zyJZXqB_U16e?JHL=-kMWeW1BFLV5dXUFTAYCo|`BT3XqDb z@cZjZ#8zcdXGlR)!a_93BtLqR4tVUMzN)n<%U zecyH^&U|mPqqpcyVIp)`aUw##8QM)8UH;BuC|-eWBD$qPG%n~9z%vK4oM;D+-o(D; z4#s$18$neky^5|-5rfN0mgCT-pGb5k*h~oNVUhW4#4igFZ03~^-t-B;xdm^ngfK-l zb-q@%y>@5V`CZyFC&o0?Uzqwv9m;$BD6542lQ+FL*3j5^(D!r2&z{1m*^ygo$w`NI zt&4h7=)f=vVbX$!wCk5}9rlHOyg3|MYC^obe$@Q})#LN)MZ^WtninBA7+}?>w>l?M z7a`(ET&K!-nAuzANUp!F1C(zir})AiUpm>3PJ4WYxvsEw`n>lfg43XCXFJcydkAYLAB!y zCuKXI$5ToU{?V^oipd_(wT5;|+9$6EwR2yiwyz$-BqaV!GG&$#aBjR3IxyJPx!hh0 z?`0^?coWB(ovKfq3ZxOtM}x3RYSO@zvgu+<(<;Rt3;gD=C&c4+@x5RFQgBBC5T%D@ z@jnVH%lF%;g;sR?-~LoO2px3TG#?Xta|;uT03T#j%jRLPDO>?0b&jg&$4$OokE2TPhWk?Ml|NqQTy?HiH!;LGnBW#68cLRSU0%-H1A^LT_IH94xT4jc z%^Lo>w}Nk&7H(ee6b*f&1-M48x3dy)cB%5HM;EIc%8Ju2LYNq;bFAPOnt^1aRbzha zPA9;8uY#eX#B^ovt{zJ3UlMu8@zmFt`^81Ux2~@B+)-C~-lbzlQJp`7iBf>I z52*{561|NpO1mB|n2aesjj+%Fg(|T&T?oTmQSpshUh$A?nAh=r;#U8d&?)(i89oBv zM|lJw?SO7Yv`c{|@;lO;o&qAH-ZU@ZeSSZ)cg8p_+v5UOjQz-MnA#6%r&#JIEi(1 z65|>QHW5^fB)wuc@#Mp;a z6Sw5)^|@{7$mZyHj+H(s{F`{g+$CUW`r<^9@TD|?$TTsXZbsv)i2{O165IuNzrOqB zLsfr^7cj*U;E6T`G^o2eNB|~ghn8*ne>)~$APl65&=lSRMCfh!q_0L`_icG)AbY+X zmC?azq6>@5M22ihftP`-j>(w}#q@64|5kX+s=F+^_@~00Zp(RmTb$j|_WQT{$)Zcx zQhO9cZWyr;bWK`3b{bN!kH7!lk*M;hGJAEYfHLNPON1A}Bmvb+8;-=%@uLwFOxxvs z0#p<-)YAx>>a4Q#14eoSdw;#v2KujH3-E?23x@ef$}!Fwp;rQK4WOecz1;DV1bUXM z=#b-oOOh?FPJ-H$<-0o6MmP0xbCc!8$rdveWR)l;A>~vWkRLf~(idzw5<`=Ri;c}W zA}Cz1OnmPile1M1cuk6wqAOM`1>Veu#AcTY*rh@VY<84sPF0 zfTcyx{3I|VzMWD@V`P~mF={skrR?Fh^-uLDpm-Pd|A_j^fT-FoTEL*Bq(cxvQb1{G zr5ou6>CT~JKtu!tL>Q4A8ipaI8>PD$x`!INn|tv6?!CWY=GS@7>}SW?d#ye5NcDTB zZPvF^7w=#>UQg2oI2^87g7@|(JGOHn^jVn3lG zp0co@*!ZIGF8|BYtC#wS=gq+BJKvRet8wC&6~A z9`UaHXyqN;FEMG2lft}xW0FGuIb_qAr#0)y2H8B>(SPC+guzVoXw1*+M*}uiFMjG0 za0^klN3p4kyY;ciJw%t2V>r7ZJzOFHTXnWIdr{~={^?UYNA7{5Aqu-Vf!72U5B%==CT?KK7e|O z$(;a6-CxUbIyK@7EGEIl<&bPqC+gF~j(W;zB5Kh1tUo_vP_bI%&i)cZKx4owiXyi^ zBplB*0S){wSsX|1<@x@DvuYdpxafkh-4}*pO_{dbiV9lgA=pXMb1MW-V(5|uZ$EdE zGoIvGmBK#$^I;l<`Ab}o++TEfpZ;quCVfFu!j1n76$$vby!ukoc#OAfH5~qlZzcsLGaQ9d~^{NlK%;kp(y*7cfC0MKZ0Sw{jL+XzuCF}vom6h z*RLCbT?SiRN^_tq=L*USlkZEdAn*12te+@{-u#vaAG>*Az3!xYMK;RyDjANZ`!a8i zGP2#+_rfwh%EZ6`o=Rkpda+ZaeR$E(Zzb%0`fadzl+8gd;B%X*Qw*k?dX5)r{*!** z)FRm^A79MKUgE=f6u&$BOm}{S9DL8^3ZTu3owk){$Wg<@g)`(4|JoRyxIi=8vsYnQ z@SolIeMZZyA=Kn{J=CjbS5r``uT9@?>5Ht3J_bmx_8TnGM=g=Z=E_(t=dvHuITX+c zBY2JMot?oa!X+{W`cfYl(es($hxsyPO5qmVBsfNam%kVGWXCLW0zFL}E58aksc3>% zYB-8-b-41NZ1iY*bp0%lKvkF-Sz_ywmrnNyX{tS^okC&xdic6=RELn<4eaZ))PDfq zWFwF|O*h)hG5~uR0WysOMk%lVpRUPRo+gQ*q1dI&Lxz0>O>N2jbgVS!Cg8u}ki~my2sq%c5TB(6i)9lh>Z4KHE>O{4#Jd<{! z+`r&H650CdI{85O8I4ghJvyTrBHfYs=fQ2&Qn+vc5g+Qi3fOeHO{3)c`NSNc{;}bE zZ>~TUA$tFWqW01Z|4jyvVw5t>_&t8i9Q`o!SyF-aR)#6R0iPC$1~y60u!m!bn(eYr z>G8}LMx3NC?bDeLEq?1421_h<G>E;c$6r}kH?m=QuG976th`vBEV_gUuT^5-q0D@7F)`1?c5j!p_A;(dyRk{&wx2B3bG3_O1(GB8w}oR9qyq78sA#Af_Qy1e9E-YMXdcqrO};vH z>$Kw0&imeN?+hi-`#uuIB9<9kI*{Eyzch*k5ZW&<|~-^bYe94 zp-;OWNBy)jTX3?J@;jqxmCI4*Y`z-d89Y8dWn<&^)S(w8Yd8Y65|YNgoXOOJ_n-dR zY58&2mOw)9T&%oBH~Tf8bI`S;DIAZ*&MU*U<+86Dh_6h8G|EGP4AfY%V$nQUzE!4SI z_69R&!2VYge@yGFf5{Qv{awd{ zOWi9L0^aBYMycdB=hr>FGdplKI|2a{@;5lV9pHGs*RRh6g7cj2l-_G*Vu}nij zBmh_=y?1Yv9Wt}IQuy6vs~DT0`oG`f1Wx; zp35;#q6~|G{Y~7@-{C*nw2_0B!%R-1;y z_eX%K++RE)B8eXqV{lsW!?yjUqa3qQwa08&Tz@gwz7%71*QA6PC|DvUY`^&BQMXh@ zg#Mi#$$ZtFQ#fRhN*ym+-u)COlo|h-|0c4;!xLm0rHHB=C);QU!!{Mwlwa;!J3WmC zHhT9A$92Y@*G44zF3M_lSrXf`*A?r`@gSErx2vrwMl$J1UslEaPA65nYE$4Q*Pe$L2)HQ7g@xcL${bS;@$#YS`Z;Bob+r zIJrxM*|4rn9PXlcd_fKs_PMmM)?qeCw_DYDFHDHb7;AaMxq9?+Js!tmYA(F|HtP#+ zDyM~pn;4!?{N_6?(aD=!R;LooCh;3ge2t{*f{~n#|DF&MbOLNQJ8*g?9OWlKn14yf zTmNx{R|fDWYz$~ePjd_VtyDV@Bi(#PqwETV56ZC%2qI?p@x$hJShc>EIG}+%r5~DB zQGMA3`OVTgTauGSra;1^sT`w(woj#Ayb%@M35xtQ7cHvxLF4M$g5v0_zoC)wnnRU! zv7yfewFw;!rK`}~>kIh%4zn_|aGjq&0piTz#VaS(OGjhUQdE@0&O0+JM%^CfpQLXh zl_XGHT1a#!7NeeOkJHqE)0x(=XaN1wU75^lnjCq3%jAWQ}3-CMgg!=o!?&xXooJj`2+;6 zro-~N&e7@Rl`CFu9h`rs6iVoi_>uV)!yrJYN(N0aeY38RCDx|5d{F#s8+Y)TXyEM1 z$)^7J->*Z`^w4_u6{{CbpWZ=sON;QL2d1ge8|u5&>B~jfEj79jMn->M7RjDHGEg=2 z|9CyA7d8_jH&YZ9Iq<*oL{uf{hs55&qukAZR^|B!y)D_Lp(x85U>I;B-Svk{f3bfc z`wpG7h;?VdZvHD>Cn&6n|FY7+OOUH2&G1*^l3=v>(Tl+bIjHJ9ln zy~DWXo2wbGA1STD{BN1Ahs%i29URbJk>F@YC;v+EM^Y~cx^3t8J0bWO1LuER)qNoN z{*j~Wph8d_+Rr%b;87Wl=Ql6F^@5{3v*)5PzLz4&p-R(zru769xw^yO*|pl;y3RSZ zqoQzA?#xf79RDwlzC}Mon@%B0Eh7eWMOIWchAX8^O^AXlfdxl2yJ|0pR5=Fq1f^0P zL_a*6cX;)MZ7B;B)@i@waJ;5b-`_f!q+Ffn)Uo0U9@=yBacFQvp)=+1^z+Z}9@H4j zm>G$RCKUu;b~6JK*Jn3?#Pxz7ZK^vUaQz_eL71c+g;e;9m%TWr5CJp>rW6F&bKk>m$N_4MKOki8?C0K7*bpjize6+xsMzM}cCTj*?#>0^aCR~1!pZ?J(H>tzs*|x=8r3z#Fp1q-y&&9vEowK> zf$8?3hNi^-D#pZj#b8M;<#;{O;#CkD1{Mf{hOVaLafZ(OGv*L8Xn=`m!w@};hbpRw zgNtLfDVI{oqaS9Kw45KWSfK2Bb34D`F$C?m*qduKfQ`os+F0oIK8=zwm}u&iSJHah z{+=G9k`Mu~zizym&KeO5*O!~?gKe2*X0S;%cE>KHC%~Q!Jio=fLyF%)YYjOkgf|Gz zD^E_xHycFZT9G-&J#&4_DW5bUoK^X5y_!L!xQV7Lp4aV&=IfJ%O=_A6#?jQyR$7Mp z<8J4mp${2v{dQu)U!;&g3(kFL$5+CY-fRl+C+s7S>V$MPz|@GtY5iKw(?@@e!KE;c za+eScrf?RB(_BqcMMVuS*xvPE{`@#&UJ5#B-{H>3cc@Z{t-$#{V{vlz^H$IV0)d!7 zXi(c<_-AOcu|9a=l^;1iS(i6k1Fp(WxWT8#2c=4?pT=)aN z^V9j5f9;=*;KIEtF8O6C!N0|uEC8u~-R4SaNr^xcj15c`*Olmr85 z91KGl7?s|8K{Ir9hsjX;>5<%spuTPhQwz&lpTkgK^C)tyr;|e*3zP{%eKI-UzCJws zQ4q+z*_U&+fTBxG`IR&^Mcq_gRd-aa>6o`gF|eMOT4Owv@RR9{;6NASa(n(fNJ0aHjsC-Mu!^tFPqN?LAXq$t z6h>_l@>XX8`qy47VP+jqw%>G~NZZ{UI+$fcVv$iRn!NyyI2U*0RQBQ4PIskYnLp><`^zi%tf?9STfli<9(fKb` zE+`Z^W;>^Ng)S>=3jO-t@}bYc0-^J%Ow9WEWR`e&9Qsa^PN5miCL58ivECRV2lBzh z?8{1*yZuhOh6Lr8l1p9Nu?$K4HTvU9V*Oe>HY{bAZgzGyrZ#5&*Qc|o z1_I7Tjc&+^B7+k&7P5$kFX-o-r9-CepFL$q9#NxE((i0uFqWLHb`#4+)6vmT33+bk z7X&gfG0$mRuow;iV7v)oZmGFeC z%cp_h7KJ6HRHI)01!aH~%9_ygYJpGZcEq%3V%9E+MuDe5mCkQ>7SSXs@<#G}K?zHQ8YD8p;t3s?PhMQt56R zi{F&6R`8!Gcx4;G;!~Zf#R;(`_pw3co9oHBJ|5=b z0`DaAbgI-hh!M~JJ3gU=DK$D!Q zUXQSwO!SEsXxeHkFn3JUmPvm2Iw3A1ay>3!3|>;Sj-!UPx98wO)9$)sz}E+|bnC#P z0_23Md!=sMI=Tl1duy#giGdwrA(Yx}RlU2uG^N*WoHr;U z;J3QJxM<2q6W(E-@g3$pqWalKOEJcxs2_E(?w$xNUb()W179tYi|aUSdHT^NzJ=3j z%{B(qS64fyH!rZkW*l(5sGbhF=09YKGwgRN{Iv?|B-)fT81*2))gRwjjV&)}dgHfT zxF&}Ba6ut(|C-PrR*^qPo1Xt-{qF<5TDtyt`WIyA1vPnK5fygoHGd#?iN=IorD0#; zI={9EZL{#=Xd(xg!dc$BfI-31$g82wBhbksDx%8m;@WSoDW}(4+Po}$lM*@zA2Y+G z=93R2-Scip`x8u$==xf`o!cGM!Q7#e>dTobzgeIQ&6WV`(fVgYSHv+qc0M(FIq2i1Un-__bdFRTDnoJuUvMKl(}SYze&y z3IzO?+UYrR zikO5`cR{`@M{u3M(_P`_>nT+yqbnDeV~e8oVb+w2Z2kDL&)I7n zy1F;XXwsn;Xt!i%UUXV&y$1(W(LPNdHCvl;xUl zMg00*q{^Liodl92Ej!)Hr%+D%Q?Nnh7FP~<( z0Md;sovJBAgr)E4o72PdooAEk-Ti!gd@Ox@w5FuE6Z=@;*4sQq<$}{~KBKvVSCVIH%t~SYo#52UW}(pTOM~ea!92R^8UH zTy_cA)HEIJ;NWjK`b_y-r>`I1UW}#vk5`pT!$noQewKvzdF;?$1+R&DCt3Ug$I4+bR zc9X5!1xD3313Kn!t2>pJ#(sPvvVSSGQ)J5?^58+^!Fl&+9xr2mJj00~FPo#eD2&3! zsCs-nYPF+d+LsM7VD%fOsh&_%=XZ1j(d_8q*cy&GMa5c)eH8HM(vzK=sOg0Ha+8`k zG+joLCWiHWXRRJB^6`Hf5^`WuSkkPTBU(1^{UY{jC$P00^F`U$(Isv~_1+sZZNXLk zl?J5(v(pSMvl!lz+oGxh<${oTzq8K0yQ@LYz)R}Tchh0aoDCQ0LZWdhMX$J`qLpnr ztKA$pTT_{FSYByesM;Zo-$JMK1H?o&{MkPk;saaL|8ve`AQE&yojiv+c5_5EXzZltohFwKNG=)ujSrFq>UUYeC;#m=rK?ArwFlX2+Nf~4S!d((VgDvKe+esby0JOD6a1;H!Jo%0ek2Omsx zqyO%3l8Zy^fg2V>O0n6lZFAg?uX~^>`iL7n=0_T4yTsX1JEm={vDr(df&mxZ zi)hx-p)H7NKv~sIo%O*l+`uBPl7A)Up~>B4PpGPq6Qnbgit-sOA%XACi@u}`WcN34 z$0N^K788>7YtRbuv*-|DhSP7kj99!ET8kFDo5n3^Or)4N)>T%moZrmd7XO#rIX%P* z^33YA|M%8TwI%YBXiJ>e&fV=5-6M~n0o$k)FU(IZXs%(0^Fd3sr2c$eY*YO^o zHFcOJ8*N^PDR(PX7Hr6ll5%ly{R9l?b}fU%Qjr~~Uaq&=Rc{d{{^!hhH_+zGaRhU2 z?oD7bj``^evCxqeX61q4@Uj$fWO` z!y42SG&o;cg>ViJI_RfKO zs*}b? zOCa`$jq9qR|R(bvPMK{8undE+)sVM~?LK9P>>fpPz*@1)o+eIZZZTNMl2L^ zZ`;KK0{(5+lFAO+mrg=>pE-&6mA*SJ%#BJ=voQ;zmw;JXfg5N)dn6 z(PtM8Y2mOb7skvJ@oUBfQO5Md9)$}-D~~tTW$N&x#9mt8I+(LvrMi>j*5uK`ZR?$@ zi^bvXXLaSG;Lv|Qh0y!C1lqC0C-9k!X(t`;nU$9=J8+#!gXUF5XiJKBQsr~GyYbv{ zE(YbI1!*4O3i?z|&clYU!M7kb;lUTLuHoXl_4cxGGVt*BdhB5a%-Cd<*uq1LZI}YY2 zAnsnn8|ug~+!{d5VaSTqs$V|9ROVCQ3F)c}u0G&r`?!DUA3?!Os6-xuz@_$wBlJoU zH)$3YxG$_?>xDFt0-8{JC40dd?AlN*)r#Gj%Tz?4x~w%c(A>!t8`S?TDnZ zrtY(ROnAXW55%m>IsJ~h`D~$|M!cwivyX0apX*=98+ZhSJf}`}U<(qOom99b@ME$D zy9h3y$~qZd>yndHS#F&!33O*@}6_U*}Yi9B8sbYHNk}nr>Rb zeph>eNANT9HRl92pM;r(f(H%i#Zu;FvBPCeQtwanx0=3qm7>Tr)#LQ_x?To3GZxRK-e;WnJwNZ%6*~>Y{`|75P9@yH+~ATjLW)$tovs%zZ}m zR3G1)U^T`%7cb5P6*yJ?0S0Cx!)Aq+Mxsr-Qv!nc35sn>>G3h+nzeW?Nz3L2D;XaG z5Ms#j&?>QRUR!$EK-=6&uEuP9yAe`*p%|LU1MRi9&@0l%ejH+4GHAQD#boEL>)7j6 z@YAinF-P4eaCZU;WW@WCVDQ-vpe%J$Jpuz&c(tMMs@QHmaBW~ZdRv&e*)fp-6MM%! zKLaP-5Ot@1A3BeF8ZXD#^3Y%P01AbMQU4S; zCMg|PV6MawT|io`0uaW6oydo}tzVNwcPuML9`$;0+65A8tMS}0M*P#XgazCGbAqsw#^feXe4A6r;}mhm$n_mTX!acMi+LS;Et8f$ zMaMhuS;rM9Ho007zfQPY0goyTuDjP(Kmc8PP8+>ThGO4peEgVbRi(BS*P;awc{MY3 zS5Ew3;X1&?>M}slKF{&Gk5tZ>>g_Y)vxXOc_W1hkAIv7y|t{RpI|@ z{|^Kqw5bd#4tHOJlvw_-7r)56L+s%B1O#^sDtZ(Y2AfWezXS{B;(kc%4oVW$vG;Hn zat*-H;pGt#`N6e@n9znO*ifyfj;FC`5B1H`s+JnElH!KCiFuv$AT{~D4$32M0En$s zQnEEEz}w8i!H`rk$-gd>BHPfZp;I{aEH*$JJ03&8D8k;y_Fy_kQK!WC=6V{Ltizdb zNX-fD+!;=rFe9g+C%i2;(9E3Xsf+?VF^!K@n#@DDHhLt71#rsZK$aY(ZM z-Dz}=k{@){op9ElIHA{n8!u)AoPj!{v-$i&6?~c1+_=BwrxnIdg3nH3@3W-ZSnH;} ze#-PT44+QxVi27Y^w(+}9p9QhZmhjIVyXf=h^qL@=nsfpnPJ~qj8fD7v@`T-OCaD6 z;n6MVeMxx?aFZq0vDMJWd;&WD>#>YI0!5DryuRK_Uf@W;5#aRC4}LR|O&#?Joh?6q z{Lns9fp9iBeUProHmGzRGqT|Qi>0m%2HC^V>z!*n_Q)xujB-@?kLM=Ow@>;f3i$d# zJm9My1917aXT6nb)BY^3$y@*Hw&T8!MzIQW8xvWa)$*UV1%>2^l*AHVCG_H+?FL@M zO`6VDs)1{4y)^Z?lQaTPNnhvBOwQ@3aq&UG!FjM&-BRLbqZ^A0mN-; zw!^MS-$~>qHgUd2bB=U#PyA|HU?5MPx1Ed} z&>EcL#nW(=!9Kg(v|8b6C7PA7M-85SJnXI$sPKyLUkLK??!ztpwGfjAuccAd_ZeL+ zLqi*rlWl$5V`EC0;1=Y87Ad)H`DMY8E5sDE=)l*5{{)tJG@VoCgtAAG4}d`z%hLVl zAWuL`IP%gsM1Tj?8QVFkCU2OPml*hAhh%C9z zcKfy9xu5eqiUbf&sIrMX)=y+{sEaSkvWAJDlFb%}O(?tj=t4yvDF! z$9d{FU(5%aFV~JrnuwlAO9TpW5B>vWwvAiL8X6j|DoYEKFySj%E+1<^|w!Rchc?pe#t>GOoF} zsMHk7Q5kkDnQ;*(2AalrwIWUl<((QDZ*^Q8wuaiq`Zn5DSC5rUoc~%#P!U^cF>MNH z+`LdOz#R#Ii^$3Tnb*c14>&&gBU8kv&@Mlo)QVJM5^yqZ_S`vaXHO7IuJ>h6BhH*nz^P=Bp*DqQZQUAK<||7s7A2OamsnG%6I2bGMR~6Pr^N(W3jVYG!P`}a z5e3-lK}~cs;0teVq3u_g?8rmoJ!X_F07?@sa#S8o5j7zs3+0C>=XA~$x8c;L8q;k zeFgC^D4wX$31xSOI4{&?C_G1U_|36t4gFFUq-lR&7O#RF!MzC06qs=L3cNkC*LhJU z$NMy*-4|0P_vwS1vKmfX%Z{(13?GzfjNWv9fnknZ)J&9l(bc0aq8|UYov`C+^-$$7 z=_)EJo=>fBtf;BURIFcUgq6VAQC`mTx^q##>3MS)t{mZeRXn?EM%md4puKP-?iDYWk;*IOPBX8OzmF(-5q5i1nC3T&MFB( zdzm%50nWZ~wbQHlWP=9b1jBk1$lm!cZHbA8l2!5*-=clF^_I;aHE%PsLjd(&vKg!R z`Wi&MA@3Ex0Xe(?7nV5(33$0^G$*FMR{Cc`5S%9B^qOyibu*sz0Xbe$x zE$`tY+CKEQYKyY~@@Z|lyXbUd>p(-+yp?$HgaDu52|ix*w-bUVXQ!uj6VD-=W6na~ zLB1t-g;Rn*NYh{c3r;4mjwnlmOZkG(kYp(JGi*)NSX;~$r?bR%T^XB zj*~0+xL10Ehc-__jZ{c)Y@GdQDl5#A)j;{xU`8@ko6=tjro0piA=B@dzUJ0Ud>&!5 zJoFZ|i|pN*U@wgC^dAQ2yr+i_+TpA_FeQ&BXu1UiaMV^+HSjidsC1|{@2MY@MbbWg?_UNeQ-e(&CfxXJqrTPSzpePcsj52tH ze@(nIk-8*yKPnWYQZPP$GLE!g7r$&52EX;X$rKRG96ifx8xdL=um34bxI>+YPk=A( z&MT|q!#|^YfhyQfRFcU`DK=^>yl~;$+$+ah2hS0_Qp{SCp%d?L$PZv2BJBcVG1*3BRdNHgpvE{ zw%dA?Y75eD^&|AXOuMyH%pj6qFNTl!`$TqR7{Y!8zothfYA8@H2%CzXODhMrv;~$kt$aSQ|P)PIdVg*K@*NPILOk`YaGOT4k5fVu7PFgV^Yk zN_CFpsQ~4GnB|O<0vxX%tAY)?ro100*iR*DrMd6bof*B6KK7i>F})h2(p#y;`S`Di ziE1_VR@LXtN&3z?pUJ6)(-AzD-WmM@V61JcedldbCMNIwidT0{Pjkzw>>{##54$0& zjWe5&dLi$s$ZtiXZ=>*DJqx(4OfbHi7#r4@_|Z@X(gv4TV{OL)!%|}JyiiutXOg2)vY`q?z;X4ZBlv+(N}9i$Ph;NNvG;>w z8}_r@-iaL5vN~yV*AlCVH?_&;OY@?lW{2Oa8uZ@v->~89#PlldxZh3K-&QsW!~`7F zoK%cc9U%kjcdK{Htg4LQq|Ua`)}@W@3{B=2;-(elKu{+ncIrUrl8VQvU9Ncjc&m-D z^QoA!*&}2#*}C-g>hhA<=uuU0$nHfX>Z;}h9!-G)NBpk3ExApiPYWVIlc06vc3VE#RwH- z$<2=rzVUiz)V~GkZ%qDLAgmDctU=8(PN8Ck&I#TT~_aB2={@`vDBFM4&X@rUPBCjx-?8yhX=4*c_ za@0N`O3)yRaXRaz0}bRJ@xGKunjcp}a<97kh*H&6)VBN)$jv%!G1X>E(ie=~@Oo>Q zbme_8KL_H5Ve-Mb-wXwM=JNf8=lT?d$#z&1JlmzCIo8z>BUa)?;IiGpG>>3WW}G{- zz@&>pPP#927}g3v^ZhUeX40}ZDEI&Oymmmhu zTo`gf2NU~tK3)viDunI8qWyWAJyca$D5#*ngnTZQ8me_Jtit%RL_Kx(2*%alHu?%c z4K*?bC#v!7F_ohroCjjOLbrenDfqBmr~lCKpi%TPy74}~*XaepgFM{#_GD-1uH-7{ zs4c1QUog+3V}v(HoQl({zPa0t#%i&f@j(#1ONn^;tM}{OCJnQO4+_^}7?&C1g1!Il z95@9WMz+@=N+pb%blHjlu)WFSXd;T5ifHY??m2CBBdOX>jNK$to;5Rb-qV{087{gr z43J5px>mzc_GJBrTU#f`Da$WkoqR@z1gH$Q+@im!HXq!GQ$yco9>fUlbtRJ14@F@R z1Ym8-piMVaV?05hF)*38sW4lUvl z>fbhilZ;YRD|-3S47fNqTRj?CxT1TzU_Z!TwQf9)3^0an1*NEXy{4!OIO`<$z8Enu{4F>tYKN1D95?d^a*tY1LP(2Pv#MHMY{c_!a*ju@oc)XwL z8rIFH05Xv(1X7Ze%b0(|$MtVY(xwQwU-qJU)c@*RX6%hNrAMri#G{QNt&%G|(Bo5% zz6E*bLK0k`yqTSiHwcfd;S|0~1<#%0+QYaRVyw<*oTj9}_6Q|QUT3I!Q#lT=- zxD>`Muo!q=u6UhW@8oMAo^Z7hF3Zm$ImQo(TYnYKOktNm}csC(EX55@Y7Aw)TK!0VG0zWF+*@ zR!p^?hLE$@LpTMn)&SV9xan(O>mYN4!TMvxOIGo6WR)Z*bCB-WucWuW+mq*$K;Nd^ zp*dgIw);z+<4ZR5zPumZp#~6j<2PmV&$lqBI1AoFmc!c+&3EhNor5(-oInO9%x`lK z(hscx8HMBgyJyXQ{$KabIkVBRK;aTaxj*RorAEcM`2)@^7WSp+Q}qmL(iA!B8tKC{ zbP7hKfA?w`H8!Z9UN+FG22rJJ0}H24kw;hWGt_4Ley{desZTk`lo ziz3<^5UA8&DPo@2tCN#bujb*-q3Jc{aF)~bGOKSoPUd>fgh?pby(d2lSgY79$vdJ` zZZG$4r}_>?X=B2UtqJz^UjFl5#SbYks@TPh{~>&)bioB{e!FiH*yv~@Uq1FFzF7%V zoo@=XJ(=Heuxho;%{$QS2|XThtX_jrf-XKS(b_ZFUSZLwDT2s~mOO@SUXeVpcS>>* z{M}GdQP!0E>A8l#L4PRK>JqB|CVA}9 zBIMkG5=WnCe|uA4pz)w6k=Q!kHggWcQTsnM`Tx7Iq4m=+x<%ppUe<$$DV#cYU2UsN zz`Pb?Nksf=k{y`WHDZgIMzq+Bv&i%>_17Aay3eQNJV79d)@g5Yt;9?d$~s<1E=#mj zYsAX$sfw;5DapgNj=lK0))kYYI@*BP42?&20pY<6vN6hov?CirQTgRR^Y+(Wt8(dv ziSlQe%d39r85L^voS^0Fv(}~zG_?)sG+l+5TN_X0cjO{^asNYvC&|${A2f6I88r}z z6?(a@kAfa5ikCVwy72jIeUAFnwBhjXgYfPqsb+D)AvtOL zjpdtjhvbAq7Y&R`x3UViBe%nOJfnHVxLZv{q=K#G@?@ew;JSE!nqbax*fca(LXQId zAuUlU#*HlPiorvDrWV4|pC5j|xKAa}udp{tZZcesCpXEn8pHjpjq5#j{_gZb84+ZP z7ygy%pj!XvKlD&>vtr!AB2o+?p9vFu-cQ}+SP%WF2-i@G$3?}(c2>JlQ6A%FT72f! zz&3$oK{*|pQA%%i{+SGvOTLH#LIbYNo}pF)HZ5odrjPzF;a02j2r52Ozf(o$)L%}wxISWRQ^+8xVJ&$L6tF7-iu9(Zw_^|34S2iN=&RF z86ug~oibz{<2$hFwgzIEZ-_T)%wzq7F>GV<;*I-p`;^9DjLNeKnQ>;n3R~?+pxMd* zAOmN|C&3l*Xd4of^)^|Ti}TV&IWVl}re5flcs;b5VQxEd1YG{t^M7Zf%wSKq>7wzJ z^DU$iMZbkx0;@}I6{VnGP}S2j`a9{vmRS8ov)|90%@_}7s>E1J8dzp0H`$sJuJuB~iC~*awi<c1fA`sYBFiK)-?tiQT6qyneVO9nWB_PEar}h^jiOn z*g_uW9P=ggGsRI)0VS#m3Qkrg6IQFFs#pDBc74u4KRh!cg$=0dE`im6z_2KQR7Rb3 ztTe8<*)DzkLiWYd0WJWzBU!BqjDqkDEWi>`O4ZTcgoGF_qt_{Rbzwu=2J*?v!RTZRp zMnOYE`AiE(Gv+xefqvZ~qw+AOsGrfrsrroFB*5I?Uw!b$m55B+10a%dqtA~R$aF`f zF}7&6q-Fm#2Xe9de$R6?ae`xSk?`09-MjBSyqqSN+so~PB-oqW+IWRQ(w;B&yTZ)j zO`RFW6cjYODC!};vQ?F(3BYreJR<)ksW zl{tk+QKwtV$E>H66g27=F$OyzdknJ#&%bV^{S?)rI&%k)13W)TMBE6Rcq!;N;snS73l&aDM3>^ZY_uf=MdPzbHRiuUvp@jC{0e@&9T@1|xGJ?#3^h+(X+g}y)i7Uk?`&R^0m|0gf`b_5ba=`rI8u!!6 zpoQH1jO2D9$tjjJ=-DI^WCVOZ4EkZx0qfyss-OPQ+2DBkVpEj(FBcV;w{=*hVz>(^*} z^VRNwucFW0e))$JsG%XoOBdZzz3ohSui6yuhF~PQrj}p*oY`n@Hl^3nk1TGB`*YT- zL^x^?fS27Z`eFQ3=!Hl4WW2y_y4k9ulGp|5m~UT|TzF|m8+J{_c}B+aCK+$h?Cfq| z;jr%?lLG3?)uvgbC0U;Yj7fviwBpFMbdcXH31j)ug+FS3*Vu-3&FBriJ#i|iXcis4 z?IK=+^&hP1!j^G}kG=qv%d@Y1Y~_QxBy*vY?JE_Td)=OCf7G(!{uYXjm*2{?oVxvTI=L=2CY+ZqL(vTc8`4f(tq%?7v&(z{> z)H43Ip}Jdpf*kWER9A?^e2UpeSS=Paqcu3cHo$!lz+Ep;d_(*ovFT4-zo|Yh+Wz)S zo?Jny+Pr5pH0gkfJa%}J`xwK_EcV;|5y6s-%3X$Va^+q+%_p~KC5ho=_Ee`z;fAB4 zN?)j)S(z?@hz6ql@Xw#HRUd4-T*B)tKShe(Czr)Eul_+;lpAo(KEm9WyRDR?{cGNN z->1Q3JOr!9ZtJR>lY##tvqUz;#+|_sr0n_mE+&M~5mnqCCR5HFyL%t;B`MQ?58;&sg zc-*Ycy1lN2OCbR+RTj(sz!vXvb7`W zF>a_eUeOO{nK>`O@+IN_JQMHIva*y_7zqJ0)Y4T03iP7-c8ivlV%A~4SJm%l;K|X# zxUFduAPqJL-0w}pglf31$s?DDT+W2^D+_3=2d{6b&)xKx&sbkWooWbp|D@f@t{ z(+gy%1n*5{9-_DivLX!}hlclF`}<2Ss@1xZ9-IQ#B2j?F9^c=vJ%v=j&WS$Hbb@!q z8*D)r=Oy>M2L{BE0SL;#72}`0#P^DB|FoZ|Ze+wP&o!%xFEkLJNW4D$?2qOcsbQzQ zwdl>E;Pt|^!GRYa^QCpQ`XX^Kusz11!fBZtw;p%|qPT4t)%1m@sh-qSJV8eQ-;$M& znI3PO5Vr^z9NUd|r}d3EWq~jCYoSulz1p1-rJalz0vd)}m*uRiB3sQ~b@=PCb=I5$ zSaR)v_Dkf^$>FCJVAsF^RVEPEV}5=hmc_pmN)!8VHI=jm!t4$U2r1+9*Ah$m`YmA< zAy71Vrov(h0eA}v>|$p$iBu?2*A3p8nJDhY!vwCQe9s{LIxjGwNcq?LGA3dg8je5a zv=8P*mY)V0ral2&9tEdb1_C8hK)^UrG(H(wkx@Wi(D|XTAa5bJ;MT-ac##C* z)#1PZTYuYx1L4oNZr!FIX-0cqKATAgE&!t?dR(nNRdo~T!2bS?IAgDT?$6m^JMG)U zMQ?31tw^l1fGcb~4u7^kGb`fNZ!$WaD5iBjV8x+}>vU&BdEdVp@hsW@*ucNBhnN3B zS@km^U>A*$5WdziCCNqpJv(dbce*=MB5yd)D($HN8_Dpym~R-im*KOCxp<8Ir|a?=!3+o0O5WEA!+Ft?(wku*Yd{QR!sug!w!7dX zJ~0W2MGSUt5p~mD0Jm$6>E$DUWD&jPQ4w-x*I5BQ!f%`VNVyv_0$H}UJV=7xCdir^N5pKoD5VdU;`RzF;ZY87=F9Gcv%=FEUrz+-J9?&CJZ&dg= zCAIllhNSTt*dqaH$NO0_H6hr-+P57V^~F;Fy)npS5r}{fq-EkXs2X-*CTt z>hG0^TuERH^N5^z2-i?PZ8D3N0vREkXr?y$t>wKU9RkZGM#DurSNm|g$nI1yL$(yShKyueWO5$3V@RSgRsq@~MX#>I zK+5OEO=w$#FuG5dlq4?p=+QH5>CK;cl&A8G6J_Js_WGF?p3YB=o)k-_Vl=Ixa{ z`90NVlA~=Vky0SRWbG45$hQ{BzI5n!viE1Z*qj9|m%;4hY#c4A z`5fT(W+3o&&gOx?lGu&*!I~Hx^t_mY0!&{o6khaMbN>&p_$2kpF5YKOF$%2 z(SfUviJ`xYTP zlOeg%$FY0?rz1^%B&JWg4KeOr=FNif%9sdBy0mfzg< z+Z}s*?|RYmS1Ljyi4rEh1q?9OOI7#gzzTQycPWD?RGNjMb%yCV|=afx(6{we~8UE~huegW%%a_lj*=YSA zD4mMUWFm<_hgV{pJa9%Rh?25i*xWyCi-fTL*{XD!WTg%zM_bMdzy$~sZUVhWF^W!3 zC(F}6wBW(ogwOWXwnFMoMQH*9KBQtvl?K;v#?(hfAQFioe$xvPM!!U?jx|6!=e0*u zZe-Jrs?uJwekQf3Rz6Be5){E8?EYu?a{aq)=rzIEQ*|q<3^4cf9GT$Ea3khuy4>E3 zEp-F7gcS!oO$MH3s};kc!Gj${yuFDlkAtm~g%C zW0WGmc^f<&+}-RfBqI-BumVJ5lcqi`Hx(7*NjKS#Rr8VICckNpfW)`XXmVjV`o|)0 zLCyEyzn@kcXx3jqN(rpJPT0MVZ#S&dJ?k8PCDJb7PhVe=pOmZjK*>MBR*>WoVIHlw zuOzBV;g_FnDd5c)!1%$czESNM3jd?#dhacapwWb1EyiSF!aWz;w&LDqUeE2f7&Fn( zuo{#y3(Rsm;B?V{CeQ)CR+n^%U9Z=kqbe;TzL}5G=0?E5Ye035mu6kFk#AVb_tc_6D6VR1T9IB8bo4dr>fAP!Fnmc>jwTS&pj61jZd6}T^YS1KhrlBy0$<62#&n? z=E(q~{`SLgT*=|;FeTvE#Z4_TPldWf_aUIi@8~$7fHW)gCvYf0-D9Tk&^s4IJ~f!6 zd$XsQ8tXL@q)asYbmBAbFBe{g6=XM00cEKSd%n?2(f#uIPCqU zi%)?xM2%T+o9}j?w5$(&gurq*PSL;4sP_*dj2sgfnCe_THsWBmb`~Osy#bNx1uaR> zL|QHkc$^}|b=uL+ngK~ z0Kyi!3b?w!w^ZuCqZBhG#7{OLs7mMkydm`LkJ;v(OZt<60TQa(xd53#O&+ZJO-TH) z2m_GdUAHIB{rv!tP)d|^U9<+`-FESy_39&9*SjjG3nOKskB^jlcK0(J+Dk~#j2_~0 zx<3Sxns%+O@WoeS>N5fe&T74a8%Gi+UE5vT%hS!xPb%A#uyCXLpA%0R+t&}y z6_*RQDdk>&dRv6ISW<7Hu}YS}_9gRX_d6X*y9!M-6SM1{;~!s|y?njUmukN8y0F3l zxb5wr$@0{bUo8s9*(W^4Vf5DG@qNKT|NZ0Mn``56u_&(AH!HXKIVOq&NPN0{B+C=Hw)jQ8UG079pmL0?bfQLg zPRlwXGC;1b87A-J$PmHvqhl7@ZHb&QQKz%Y>g3v>S0FB%^S2FiAK?_~5 zcqHItExy~YJqz?0KAUU;3h4eP>S`22KW(=B%y$8n!UFKQoarxQ)UKx-9{dZ(2lx_c z8}U36x^d~Euf)j;O3*d@Q8yI*QsiUcGHQNh;xS}>p-7uN#|Ad$xHi?)x4oR&zj2ub zepKc?RP2AM(UAK9wr0VASynlql#pS&Wq_S?eH*Y8z?a?uoJAo~yWT!t4eZq$pLzMX zHH)^UVSF@u8w%#f|1=3~e%t=JF#Im-pkHluxkCU-!qDbM?nG-Gpi}YfbAlc07ww5P{IIw zi^&>c^q%!B+Aepf(6HWnSCu)jz5)$?_ z^^+nCx8a_v<7x%h)vQpSYJ&vYU#XP4J7ZQmFlj=%a=lD#b{&pcc|HL?A)kd`uVNsc zViQtKDa_f+z((Kij<}HS%^`(XR@q?K=uVJQAW67$3((%kz~{K*Nct4h@&75J4$mizMvIW6O#9>z@?DOPo=CDfy9dE)8iDop#n~>F(e*O zB?{zkUOA3BP?d1Dvo}zS+?N!z^J4tLBuCFng8({iu*4UEt4~^4viLe9$-iRBIB;4N z2)(rYr?OuQ+@^I&>>;qDtcZBBTu&-_N3ULS@HD$Dnk1mhUVGTQx?|iI z^W95(GWD{r=&WzU@n^42Vst*mLW3hV2$XwbwJPjIhgnl@H9yYn4RPq#pR{$n&uQAQ zloh;oqP3RTO}ty1yW`>QCgjWiwjKtGgVO^Se!rK)dL5V*1M&SGe0FqF+zbc)rL0I7 z=*vrKn|{R2>u z)_hMsUBAld5}=HE^i*_x3cmH$zxx6|H0@GcXO3^#F|xqc&kn6`p{p9lp6J!Z3$(S) zJxY~P>9sM$NSf<1w%J)GnQc|q>E%ZAKPyOkdb8Ux-7~!VwQ!XG*EcyZ&sMJ#BS}zP z4)L==?5dSa;;tLC)KRt+oPWad2)Nwy0zPQ}oiBqEA2p~wa1-ds~f$8cMhTCtiLXYV?r#>qAJgFM9CN5*EA#E=#ru0*OgZx}Mg9vF@* zj_6hc2SZ>W7dvKMu-s9-^PMpzw&vT{Ik<8P)jd@F%=n+|^5uUqEy)&W?t*m7E$veL zv7;ZudYu#m+0hfSA3KY@X`X7D`jq9ax(#$GlCzx*sMPA6crhJx$)1)DsIwbU?yi)> z`|i}hKC$_U;vWr2$#rAU0)|w>6qEgWs-@z zHKb!$r~H6D;hnB=%o=M^AA#O8(Lx8Oo0|5!dvmLU#tr)`a}ex|Vsl4k+U2*(HlGT7 z3tr0`yK-2<7k!GE($bQ8XQQvOiRP-sr{i_9r+xWivo+_`+bx=?KT;{0xZFCTSX36- zY{EqM@xk>AG!s-L?|uD@A5s^t4e*ZdIP{KO#krqq0?h72&$$0iT{n=pjMlvs@!KU| zkFsk+_2U7Low7nCkp9VltF*Wwse3NknsxQpi-BsN!RV&1+v(Zs=>|L&k2@}H_YY!` zCZJj|>#0~X+NiY!)WJ+i*Vl(}Y0O7zK!&OF=9O!okLV&g9XOmQ3}wI*!P&s>_i?7MeTf8hJ29BoSvNwrx}Be!siB! z_|LXMOK!>(A@R!bQTQbdL(BsH$iX$;{jUrYZ?JuSx|2nNJs_!X0f zb5KoGW%Nay3m<=2^k7r{?#!cd&Y-8&d3Q8oo=PMuv+#2%<^;#MeI0ROhk54=exrCw z;yViZmP&JrNMufOJa3`xkBCvBqPO-``T)JJPV#rTz)uQq>n3VEeG&cOlO5#;6|Ccv zBi(Wt89&>?SWCYo+Y97gRk2ol+aaT+@ZvfjT7kFo)BXhOAd~^-pWh~^zm&&tKxRKz zRxsJM7}PA_CRZR*ahnwSn9afl9A@d9B*g?{gP7O9pYUOPEIsnjF5hCS=Lob(0W5Za z6bEi=M(Qt-3Mzo|jD63dcXxfbtv5C=Cgv3Tm6bPH7HCX%daXqAqr(}phrS{te@n>U z?{c0Ke2+=K%)B}Y|DhWEJ4p^~O1G-uzT^G&)ytNc(}d zdW-r|EO&OD;-dP|gYTuseuphL`VfC@r1vVXIDz|zMbsy z=_easq5|vbdC+)<3)GCe(~dHn?fSq;ObST+FNO&CbW=J(*7|&ZTN2jScX7^W3qiGc z|9n)}w1Da>?B^!~oq^>u1doT08)l@+#fIkmt*26){bhnn9mxOl?YMY}pNRWR-CG-m z|Ne{=-cKIfbNr8Ca4&~}Qq`|HdgZPE%V-2l5jdxJT6p{SUqE_I2qe-b31^jz{}}Qr z-m5GB>kDu%1pscn#FH2<_TQrg;C(Rv_t^jXsi+zc|5LZ<*SXWJH2*myp%fiZWBuRH z5`gnu_7lx~XT6;NAvhD>Z{Q@q|M(T|r9BR!Zjons{`Y8j_*dKhC zLtMHXQC$C=1@ND^^e-U(FTC_ONBRF;j&gXiGVW2usq^IIgm|%DaIt=OLb`C^@`C`) zj1L1c8_nDltk;R2Jqf!je=RJP_({#S(bLQIyRm(u1dW1uYfcR)mmYE9-8suS%lYyX zq2A>YJFsW>x5QG3=e*wCM1)dyes9Pk@$d-Ku59qOjJ!|6; zN~2wSUc0@l_-I<8AUa0}PVKvG1!bM6Y7&UdfNN@6RB+h_V7TIqM}a2W=!W>fnaVTE+Rodj#7z(k=}}TP!bN8R^FtIXsFn%TcP(jARQDX z*gs9g!w8&H3e?>N8y8iau;zmWOde{!>Kim1>Rn64FD9noIT9xeSu;__K@Y@-v6615KGvRo-s2p5fm~?HQm{7u ziuK#bNkyp~nGo|Vos(3y+lyA6wxj!*+`fyy?nT<)R&|0(rgN-g3jL2fd%ca43oHd= z)>eRm_r@wciWzT-yzniB#NJ4+pZf_aZ^hOwBZhk{9?R>NPLf;kVP1a{3q}WcMfW1Y zr?+q)dKKwC<~?~Zu`|?8ZlC@Hgv`!QkaOVIc9=X`^{AE0!#v}>G^&oAAkv{dLs&%< z1aie$UiHLIuIIX6ER&)=>oYGpX~E?ZzxY`^^S;cZH9)qSJGnA~Ef4BP_jdr@ba3)U z@fW-buV`E7c&_KTRbJ@pFv`1gv+%~1m==TWw40o7M!ux6@Bp_C6guwr>gMxyAmXWS zyXES%YY=(8>7||AYc)$)S_28PgBgL>^{Z}$wn+n-6{KHkR&tqaU@#e}q1p)ym(Mh* zV43YIb9s&S9x{bpt9{M?{y!e20I&j&mS~o<*VI>8MHcrvDr?7A zR9zC_(O(d6(_+Ctmm5!x84rfrk`Bh^V_{)L{JvQ1P-BCP6jk={2Xnypc-+8KDek-_ z#fTv@SOaF#(Qhl!<6!s(T=_??6or@HqLQ(ms~M;ZkkNV zCuuVpdbl7bNpoAh)6=V?H{8)R-R0X1omRK_(`+67Fc>@BC3MvlDhdHyTk;@vc`4TT zcr#9NUbr_$w>;cUO3ix|UK8rDlt^|?xHLIl29C=PRWdz$ZNd}i{ONHV*&Wqp6^gM% z;SS$)uo{@FWD!}CVwNHxYaHt5<=%@}i(M%bXLzeyw+Wai1~=Ql5>BvX#Vb-{%L?YD z8L@pgMzrT4Yd-U+$>W`S6g0tQrTS%#FW=IZy_;{kKtUH7z4{5f;rd#QfE}LGQ=^^5 zJCHj;ZG)Lw0_IMF^TyH&!t34=h+TUJ@jLx#!DrU;$Jz60yM1Xne-LW4|HOy%8+(oZ zx9BZ|iT?4lp`>BKQ_%r=4IRcc{xB!i{hH0K#~RxO0;I{N1tCr z{0M--hG-|&-+#|~CC`X)u&AtR;S32D&_O0WP8q~ETzGmDmh?(~TiA?P0~x=#^H ztOs%!ZG=EY#}{F?G)4#dw-Gb1Wt|bn)SF{-0+sQrM2U*3w6o8A?YwuR!<(}2XVXEG zsj|N$QSxO9gOK;ay%e`?L$$;mT(wQLK58m}ITB$-*W6h2o+D+roIe}Vm+QTC_(vCD zfRclL2%OpO%VkPd{l#`s8L<}e^xfHe54auTHeK(5_Iob98l4PDB#4%%0V2#`RH~da zg7S@{b5!EDMP)17m~Ot~YgInSTghuX1@1c)qIDtmwibzpnQN(xy{oq|(KFE)?S_Nz zUSJK{d$h1Gu@9+)kM`Omlk~=lG_1IQpwu|WU&wZW=BTiu;aOfGCo1a#E&E37IW&7j zI7Tq1c#c#f=m~?|lQ}y_0r+)&4eAa(w6=sG&0E z;eyR&wZaBwd$9zlt!M@6XNUDD1GPgmYs|57BpnQ;Eh3g0{eL80coY6fJ7(afQVL_v`12^&aRy ziaGbEbfknGW;j^odw`mp=o{Mn%%;Fb0UHJo(Gbp|5pjv%%AV(m`x-_du2}sODsORL z$iZNmMCUaS;zg+msVM0E_NH}e24WOF1^9UC4ZGiFLA)z8K;Fd_;^?>O=g4m+y6NN~ zS)(n-l=k7dR_9T&!rAgh)@eBG^l0F4_nz0Syr*l^AMVIk64P*!>tw{Z>q&(TYm=-5 zXG?owq8A*A(VspOmn$xCI(aI2#OIeND>;ph+{tHQH@7t}@0wdN9y)F`j(MIBTcuLM z#2Cel`s|fK)zE4beo1L*0;--JS_NQ!s){G){PwUB;0;!MeH70ZMw&q1l2PWqZ~9=j zqkCzt!7Mv~0)=a9Vam{qEbjfKkHSQCZ2=3IlPLmo}rLMr-4lbYjt=j9r4i?2$zw_Y0czuC7pJBiUo;XqV z;E@)q)(MH6*Mb_UXNVq&V~BPuRGhoo$v^p``rbfg(Jsgso>Z)1#QQsGqN1NN-TR8V zM<7T+FaiR2_@ui~iIqD~#@`AwQ29xV!%@9{JEg=7uczeQVRhW(XumSvZ_`)i#n(Kc zR;s%;k#StfFyJ^kC{0$l-r-Lc2@OSlf|MP>)~)1|!`vUqB&dH=3X&-clF^c_eqCNgY$jGnB{{`FN_;T zpBzeHVML_qyD@?=sLXe}huTRW9^?2I0=;bSF)z&YkE<=#NcoVl@S;Pd!+=Dq!=l0` ze*%fTWV$6S)L*$x%YM|-w#81Zlp=ZsSyN9%*KL~5(; zNir0pYs6Q&o%~!3M@wMt4Kws>dpH~|C>ykr!wbe!nG!g+h4Je}1lE;RH<-^%FoFnh zoj~x;l`GODfnP}Cc12&6|5d|?QFH%$OGTRI7bZ*DL+wGoA%sJXY_5@f;hQ&X^OyA^oc~o z9jmWGrM(2UOqt4Q`Ln_2>pW;&6Gj6nW<_S$&8hu1}>0xl$Ngjtm_XM5Qeo9h!Je65fI zvGi`C&w=CZLbJ*xCHLFaLi|==w}~qHGb^0Ks-{&E021mbd!AeUBo%Al{w9!szZa}a zUCw%#b!!%gsYf_`o`g0CE2*BOLgx&`)h}BBB1PWpaDDCV<)@zORMVcj@;mW+TwQ)#6C65LtiAc$l&#QHu*5v8CTKD-(lFD9&8FlnDy~13~@2 z^M3PSsYM0gETW~`9Iq6WJ5;#ba+DlO-LoP|0T1=w3w>k-pdK*=hp7 z)~ZLN_Y+O0+zK zXmL(h6h?k?7srDL1LVPkZMtplx~eUz59D+z#V~81KT$;Z_~5*GC~$Pfuya;K{?QFQ zdi~ySegO6|VZ3@Pu+vt~{dy1`TrM1oRw!KL#vFSKg4xSm%737o)Igx#rN9{lY5Lk4 zmjl>Y47Ou>bYx{g)@pX?ASFP*X{R|VP3hcn3yF3f9t&kfCM->U;!`>B@Y~Fi?uaDu z1yg*J&>Oc&{AZop2u{`cwEBQ- zlJmImuTM2KJOn&OTyI3fxwHHCs5@_f(YTplz{bu0{8SM)DR3FZY-zgFzu$cB{Og&3 z(MUhQ{`JNG{IJ{!2;jTFyl|eepW`!Ny-m0;0izM5vHz1={cF(wcaQVU#CY}Fzh_|C zEpQT>e{#@>2V@Dxt96@;+2kYn7d$53eK`}ZiHC&=Ph`#>sf?TGgLh4r)n0$c#VFCm z4jg5KBc53Hy3s6v(RvZ)f zxm5XrQ-=o-0M}GKY5;_`ofYZ3Y);|T_ckGuQF^OsE*{9rgOjibXhm`AM=#I~=Vnr) zb#|TV4ji>p@}7(+i@dN~7Mi0w4Ls(K(+Tirb?w;k_L%B>Y6LFG17yYIA!KqN!ePAM zA;%jn+(C{0gJTlkl8Y<=Gl)eNxR)>LiF91(RB4S7=rP9}P7zC57a0cbHl7@H(nOTJ zuLq@Mm$i*n;~R2gK8l7N=1ksK>Ew=h@d$?yuP3%;}HEd@R)4gm`aq@x}^I0y<>p7N9 zEFG=+`_E_UzF@g=@4#xm!0cp7{=v4k46s%V_|j zCb!*36>d!ma!3OW#A#&IBuJN>RVy)B;`n~>YM z9>jfE+jvlmOFS_C;+8|TY1aOuobN|X0SLery7)9aW*i^U*<1+o z(US#Hdt>P%$u{Ah{zCmqYDeRNvm9bdmmP2^u}MPXIN%%zA>o6d9;MsSj6JN3;fD%$ z+f)=<{N&S$H&l7$p=%GbvgbQ;Y?krOW}%g^RcOIc`Nh9xpWdwLTVhWgx3#-rw6e1_ zoqHhYYErJt=%7`i=ArqT#X?})^q`X4t3NcPx8QXPM+1;v_>ZHFJo-b8To1%7$}iN? z^w`Fy(_wbT6D1t#)jFfID)|k=oPn&bUdTpzT_+ymYQkcXHP6)B3$QN{d{ zlPEb@mLAca7`Upa>{S#`a{B`(&W^WXu0pt#0-SQXpa} zWW_C=c0Aj{73V(mb+_aE_v2`3=$)Vw1qo`Ra`DJW0qv3>Uql~Pq$<@z5*TR55nw!R z5rLItZ0YFFIW?%6Ltdw#o&{)a%4Q2Tf}!9CIEQGt%hkb zrz*hFja~oJ5!Rq$NTan|qrIQ=UcifAr|{)?fjL=53-gh^8s&jw1&v2dxr=N0X6`sG z@nFa6EACFA7ilzTb05f!URT1G+yDML>6IZ&lFEp4BoJvFD55o8;ep(?6|5L>bbTNZ z{(As0bR1LvIK|NnP*8O}@uE4Jy|2Cgz|^mND)X-OoHBP!kAn9J+@y`sQ2@Dx$aUv( zMyxpI!<3KmF3cQO^!G^6^C;FYm3x`cXDfeUEBF64CepX_?s@#^3csof$jw$D`gy*K zy$*=frvc~k+LI3zDqn$6+SA&eF=N=l%2hM(Sq@{*x3ps^y3h`#!J1w)!){d@j=-Dd z1xX9z&Cuu9sI#VMPS=MlSRNJ@^Ao zgH>fPQ)x9X)SVgUe2jJ*64{&6qxysqB;B2f4R9+BP0VCj}2YER&(mk6D;2aoiUcDQ$o`s7~b8Iwh1uP$%Bdd3qA;s8tCodOI!6g!10{7?N@XoH*H*Txwl+=4h3BHpb^NFF!nQf>|&6G zoTg!Ge~n)bjxLD|*9?R0>XUX&Qg|VY%0obbMCaa@ZsNgqTp^9~*HTI0ytph>!(c06 zXgRGr)r!6HeReZ0V+hH`$X(V+=?MMvI8Vo;>IXf^=8|;%$``bz4HD(qdFJ~AtkXir;&oWE zAu32KJeS<{ft5FaH0t!9$oXSOAg_*oyIu~@t(=ToP0eLFN_^C@?IZ(P-Yt+7J%EfI ztFXR8kD`s=E;)hv`}c=T-d5x4XaIbT1e!~|mFJ~!7+F_8aL!HKEK9-rRWB}+o(op# zOe7R2L^CI3rKmV21_>Nnmf|YHO16sPUScm@#zWk+x)_hA87r8~A_HM{&n-HsVbwY2 zm@;TJdJ+gtf{hMo6Fzh)B$1Bas7t*Uecqf>*FcsAsl7~Me zx7X9>vc=Jr-&MY%ZI7HxkEJr~$Y&Pr z#~rB`a5=b#y~|$7N6n(&`GbV~WfJt^6&lL$vc}_^C1uYnuG9fXG2fizTTi;cZ+Tok zk#w>bdBS?V2AS^&n$s+9#e9jY`!l}gx0`%4lI(Un%vMe^w1!4z@=uKBHC?j&oyLGH zm5D|znU=?9RDT3Z!nqRiuMEXrtB5@MohkwTlbAFx8GixYHw|8x!eR8_nL?Y z6@TO;F;r>Mc|yydBfgf|&PxIc$r%^xw5jMzd)lKUZP7FMp_2 z)!i#AXv*n|rIq1zt92QDEqXINa}x3TEQ8P#R7uCV8|H*D1woIu8wO|I+Fd9p#s#^IAc(BVXr^%YG zI?$QG)R2WsWlfB4uyQT7M#VO5PoW-16w9XXyTE(oB(eP~jQ~&?=&C5FjFs*Z62G zc~=@n@&{48NcF6jK##+XTW-JEB~>lbxjyWpfW8iJ9HQ6$V6=R*WG9ZFZz-+PmKCuO zcCwg!Y}2Wat=4leePSmI)B0?EzKB%IsX8L6q%rXyaaJhpYVf>Jp9k!?4_AWw5C5 z)fxsxtjG)zh_bUlKt!}2Th{cT>v|MH?G-_tT0Lp2RHb6w{KAV$>DQ13)|~XVD&QY^ zx%mw?JQ_Bglu7IFoSTkzCmWAIsN<5v9@S}8wU~(9QIQrI84E5l_FySks*Jcp+=v^! zy9mkG(Mg$!VY|#aH-iFtqhf+AhLnksoO~?2hilDic+t^K?bWo9h2b!+Ma7`l? z5KFfWd8UK0KdVp)6ZswabJw5q1E4_50GZ3J34-<>+A4g>$wu@8dXeCW8wz||_B>CwTG?$h z6ylXA&?}A!DHzp^DRr;i>g7X%wm1x-wviqfEb?h?t zQV{9!?k!8Yp%w|1m7|$CuU&?`G$G;HIc~;r)beba!I5_mnQvky59%lFmbKcM>n-r} zSzy)f;H;QyM3gFZiO5LDA+MMl6v*U+3A~ac6ubSjEPT;&89tDzOC$dyFQ3OPncZfJ zEMozxqomZ@#PR&SCW(3gl}_Q@et0pJeh|Hz_YJ!#vT8r-Zp2nX63ii;4|-6oXAb(# z?~9O4Rme?SGP*$z`tsEwtbD?qzYsj&uA{`J8wwUFg+OTN^L47i(owZ~90>kF){bXO zM)P(EUao*vkg9e75>uKww^7kgbr0+Swdo|#UkxkPkTY!3f$PUUA0M%et1%S3zJMGp zGmHKm(-C&9yx&O+R4zI1g*<-cR-Tsy7P+Y<9Uo2XW~{r|E<_)*42l3}#mXAgt5k6m zb*7-}%sEDSYOcwAflLC|$U>GC7j8m-J^az5)FQ%7kBsT#eo7jeH3*ev*K!}coAZ+4=;hT&!Atg(*e6>4YeKTUWe;5Me-u5B9s z%Oz>++v@gnPIa^jQ=*b!u)TtO>1>D_TG7FcQn6YyUyTguct?hEYW1a!q2@tijUfK& z9nlqT*IN$drIj)|paHSEoaI}3L& zigY(d1M<*o!LKYwmlmWyrZw&SDOEeL;a=TT-gKDbZmABy?k0zOl)qo8Osub5&FawK zg#WCi@p6-&#GfRIzz%lR4Yu{{RQ7k|fnV^=8|PQ!rAa5m4n@i8?J{7ptvv;&h zlH6VSYdF?t4DWv%29Zz_@`|_oux~q;BwB(`82F(;!HYr za5FhA{uNnS=_?TEj`p3Ns`pSuks^rUJL!fa`ibg=MPaRY4QWYQZv)7J0Ew%fIKnrM zsvvdoCo;LmoO8zo@u+ozpI3Eb_<5irSfMeW=(84j2JYuRqpM-wCy6=gxu3nGYgI;p~?j5cdNvlbHkwkA4qLF#EJ`K%Wwh}WUI6k*n5Pp z#O*FzF)%By_w+&bkapE$3)XxWHavFguRBh|)@j3kT$Iy;69BEv&tnN5w@%3HfZ&sU@4CxlhKw zEfClY4tXDwn0jWd^?E>W<~iMrrN45B^vhGjKSt z^I{*dcwVPT22Zj{pX}(WB`YhVI;NxsRN_6{;^>FipvUC#v+OUKAM87ulfbFb9$+6E7zlSG_yQ8255s-Xe)+3u#^^GT?Uqi(7QZ!n% zx79ys#CPbZwK)oJ6iD$-%vE|9eM;5fGk1a+h`^uKc)BUEB=8OmzE_PXSY5J$<&Us& zEi$Lz7`ogdU&OmcH_d!!TOp(vNRtwk+@VooonxPi)RnP^jIip}YO`xQVEkbYquD(Y z4j4IfUCrCPPq~pb8~MLdXz?oTUx~Q8rQ4-^hZJ&_7D*(e1*<-fOy?S1xZ>VsoCCIl zkU$l;zbl)RkJXJxWZgN!qOsi6g|QT`1!?NLLk=h?@OnY)032O2WW zh|b9cj*f5ssc`8$%0+@x_G~(@x!IDmh=^*HA!ZRG5QYXVEH9YT&5bIY>av5ibs|@O zg@l8LZOy3CBS8c&iE9H;*cD(Gpx2~?@09gV>kmGn`o|$tUd8K{&A)S+*a!wP*XOrb zKk10QfQB=4iH!%BR4c>3YbG(D=(mdG5(`{#k{DBrvaCo%+o&ZA)H7~%`8g(isDNft z`bOzc@UhJ-+?E#K%^30H0DI}F-+3An=6M`Txz=wTHQ^vJUSdwf(L!B5JT8K1eDHtT zJNJL6w*QYyIZDx~Ly<^Vh3TAR(1@gv3}Or!my~iD#(hQ+9SSu<-}7Nse+vSp10bu z1QGt1+{$2sPEs7!$$>yaM*IoTq;CeyOC{vb%r66tM?YUmapKiTk>fQ-LRy79=b!9f z^f*T=@7Qbc4Q_UC zHJAGiDs$5+YW=Q+y*F-PIxQS13%!-_oB5fyG6E>D_B9O3Zqhdg0XS+Ka=JAkFg(KU zf&uSn#tR0Mgi6eKSrW%6CTjh<-v6z&JbL1t&&E0iiJ+i(EnP(d9iFVGShw04YxvEu z+;S3+&V^fOxgoaLZ?uBk1c21SNp6xw&o(OZ%()?hmsS%PeB}fGQ}P*y z`b7A7;<&m$+*noaZmoQEi3I@UH7XWxeU&oTDdA>s;S`2G5-Y3q$U$LKE?sDne@xB; zqtC>yaESCkl`t?dz|X-KT}2C++KEP^T`-)h+_ToVF#SCJ*5ZSbAuFP-ZV=g3iYnu0SVG3tY(t%s%8`u;-4CUxT@pPaI zKNQ_PsX&cC!DVmFh_R*KO)e#Yj*nZ@8f1~qT#P@|zyO>i|iky3$6p~RTRBf zXvc+Za(uyF7d3OY_7t+|3rI6-^6>yXjItPYIVcIwWK;7~XN$;MJ!bhrGQrDrrcd69 z%iB>rx@@jVp^1iqn!m(}PQFylpQ+*($O}|5HD+}P59m&z;4E4ZW{LmKp!R}Nq6G8I zegq{Ww?5JWy3t2YN5N>K!uI5aXt*6ir}>&sh*gn?v%T7*$=5kpvewjW?Y9WT> zE?2j2j-RP|*i?4>N+*u*GS_R+j^2ZCadM?7O-^G7g^EF)@9U$gAbX9Mi2+0p^qBLs z|JY${@3Y=S^}oWyi-|wMQE!V%5MTB@3`VKPG{f$11M{+QY@WLIv3p;$j1#dfyc_E# zPMRz1{+bp5py^4y@!hQGu}GD3YYR$mqx2%gZMohO)}N_MWpz6cNXL(T(rE|&V!K7? z@t-E=kF(3_t}T^+-WahY9$KQxwsUGdaOYK7HSP9S?KG~i}iU#;8Ek?h=uR~MNLW5L^S`mhLM10 z1VJ-3s>!KyQ%RR+@A-@Ds|^UxfQR)pndCQ(%Ycp8VeR1{i#SfNKc6^7PDnx7z~p86 zVqul~q1t?kWKyV|;zzfxok*?;K^E)gJ&AGZt_gc)k#`*6C=mH%M&h%8*=}aVT?#$_4+z$cCbE<0#i= z=Am4~x(iZLYK2y(Pdd^BJdu?E_n^|=j>!o-EG0@$e$SAmv@S%CXVyR()2#h-)ERin zd+HSvP(GQ=J)k>*)F}~l3|dxapdhdJuJryI6)#szt~|&1uRBZ9HoC4FJtN-POLXaC zW#W-qg<@if=7aQ%*_!Np+F&FWw@V5hmJzOLJM(5G1$yO(*pEN7sZqwL`}*inSLM(o z*TLf2hR|O%e048e?}UWRvuy#QnVu&VsS0|W3{!WRkN?}iJsTXS-f;C`R64{vVD z5=7}lJj+!WirL!{7w(L&eZK zak$X(ryuXjAA!;7)#j(vu6}qT8?hIzF`|WBUdbWtX)Z5TN3naDv6NcswL^xgJ{2*T zN{J%jC)dZ-He2mG76DtUW41{m0|DX5MGkk#)P(Yal?2vGW|Y|$`KasNjT33(jJipg zsKF8S`Qh!&b+j7)EC)*o(y+-GKzgysSTBSn!?p6YcN^CjZ2Z`hQer2meu8n}4`6dv zY*+VK>VluohzNGNsNAi%_&9x!i?_I`?0MERVMCVM8n z*r!H17MUJ96DBlE^qw+!Je}OIg)|Vy1Wae!@p0K`Q@3fvDqBwcjv_l;FUuCh>d5rm6twlmHWjrbrkh# zslVNXahsf5f@6ZpF^lA~2W9F5?3+ zSC0NAw1+bt8%oqA_?M#)BRqplu-~3klY)agt}s}gsdC|vecWvr@TV!<%0wPX^_z!= z;b*8&5aufF<82GhK+uyj72+(p^s|cP8NJ6xRJw^?!e$<}Xck%go{$2sQvkf5`Ejkt zKfTler+R&~0AbxUKeZ0)2PH<23;@E;-b^^1vJEDhM2Z>*Q6e(cDJiHn|Mv^u?M4;%SoHBJc@X zz<+Cn)x)dEK$wB*{ak;U%ro$H^qBx5NcDA)#+dRKP=WZ@_;GxAsF9^trNtJD9TXDl z;E;<#*zu`S^Zn>jTSgCVx4|=7uWmdr7lv1lrgNGy+tN)G6X~xATi~7?7!K_CGYsD9 zGxGG2iHMCLSyQ*XKXx)iV&fr((!|rICF|tQi7v}aa&ebZx`H-XciPD%V3T*)Dlv44 z@n-J&dH3U*yF69F!m7N`dwgns?_}l){~ETMrf0pGW9K}w6K zbba60J#?Es>r?GdU#!OxMJVGb1^VHe3p{%gCRF>FZdrM`L-k={dHJ?cMMpFm%dzK;v@y>Kfg*J5u^J-h6$YZ<3`!2+`?N^&eBzWNCCoTCQv9-wL$oQdK= z&RI*;Qn+&zvdN^juc&}~?i?6Vz$cGo3{=fzOyNptO$+Vy;^~&``@cd#PGyjGmJ8gq zqm=c<4dj%yrvLLbNHAYHZLAF(N#~D=NWHz!v`Cj>!;ykY`1wyPmD9W6RUzQ4p-?wi zgBPyL`D!js6y%d-CJsF46b2Xk)^6EE{kZ3*r{I?fWlu}Gy=MCdLEv)=p=>m=E|ii8 zAdRw0JE5AFkb&WkmmI^?C?Ds-ISDDrd3o7=_p&KPmq>gBwL-U7$$`@?+JJwA%TvYL z*aW>I23vBI6V4ecy$hw1agA<9_|o@4+ap%t=K>0qS=`eTsxg)e#4pLrB9uw1Ji{bB zTjaWtjR#W;oU#oBcpUi{@|9_x@B-Gdz0ntG|Ojapz2rB^QHrA@}h9&`}x^9jML`1YS z@`oE6W;KP&kyG-3F~GAg93K)@IE@i0i}Nq$dIS6u6Q?Tr6)bBa`~??r4XyzZMlPR1 zp07+de43PKGF#MoqyZwqU3TZgV|xXpe*OKpHnRx9>k=2=n8H}QKG z6tst|D)Z6@dKLiN!L37mS6%&Pqk-zQQH+DPCJJ@IJKu>hb<^(K8{Dh-vy_^RY2sH4 z9f%DmT%Ak+{Mp>A?ZF%S zUm3vnuGlI%pmS!uVcAhNVcn$hi!H{6-s9?2tHpSK;|&cynG^-rKqoD z53n%`Ts@0K1$}quo3xMy7(kgGFt8Na_ouJ_`4P-iN{_%`{QD38Y;0Vy0!?4;`|)%j zrDeNjO;0YL|BW5`|B~110Q@0B%02D7L*IC#V}O7SL;5HESIHU`zXLbBCfw$q$s_-i zym}K~Q(b>AY4_V%Kp8+B!JD$HU`}x3RL)Q|0IWZB1)s^?Qhqhuqyq z@AKy`dRCy{?Vao$?0BEdqx!mUeZ|L@qg22v(Cuh&qWr>+suuXoui@7c!uO<3;=U>t ze|7KA$9!61;vPzNv&NP}yk7_S)vvx+ckJC__r5b4s&LM5TbiX)4&R8-8i5ZcBXcLN zmdBe7d~GF0_gkRNlhh3FSHv6z!N;#WSFcOS*%40nOifMgzi*Lz%za#!PxMlHlhJ_T zeX(64w*-L_uVII<;2Uj~j^FL0nW6Z14{pPA2s>8#xV?!VM&OZFNzzhMV$|>7Gr_R` z((u23k74WCvm@vdaB^qnb^^oAaT%O z+l(RiTjPgAUzEo`6~l{do0>FIZ0`FXD%@Tw_W6y@%3x3Z)J%38FKPhD5To&KspTSb z!m|3?kM2l z-uTx;yClJ5ykQ4*$B%fpKM47shY$!JS;*5nB>#T-_jk+8__TPNwNFG}{MS&U5Tf?v z&xHS;>F*mKzT!rD%zaP)uc20a3ItZ_zwrMvJ8n7&72HTkm)DyAHMEkR9l!F)D&Bt< zhMO*vLxEs9v%Zk?zlP3`f5V%hb^E`?;t>qrVaNZVWu`~>UqhX5sp2_DN&Mep@$ffE zzu`%gJS`>r-+kf{)Z;c^|C0G%+y2+yJ&08CGAEKJiT>9_c=%?x&6_=<{>N;-5_V4*>aJWc3ej`v>m+Cr$jr68<4q|Hsw- z|0h?@FWUDvun@E5RUI5(4#3B7)Lm?t-}!r7+p7qW{;ekb0#Bbx)<+mn;uD?2@W|RR zKqbfj32jHdq(2T}dZqjV0!CnXZ^6q%0^BeYmG}oOMc(Ol*zWo2$ zo@frocITe?M*n-IxJg4MaMU?-sdJL%Kkll47b=EN8zM%T{pf$gIs39FjuV$OJVPq| zhY0+$w12Gjzp~H&r?Uo}_xSfwJG!L!x!`IXz>{HN!6)A!Km8n4)mS?j{A}cZG%QuT zOX~mmNSR^+*NYPuN4k@Y9|(wjutTY9a1ASG3sjsbc5eJT8Pbp{Wnll<9|@g*FT3Cx z*IU4bR5GrawdcM+%9TPBtO3@n!Z}Z<1p_<&%zG=XxWE2TNgrx-(WdC#z3V0G2!Cts zX6^6j>fMrpsJ6IZkzAkP+ob5utVBVDGG}7g&@KpjF z1$c&`d|5}AgrN%Dx5>L{OP4|kWy2!Dk+2r_bb|5fn z6gqUGd-N>c?{2dNUm*|Wu7?mYocifjl^rC$ei^vs&VO37A>I3dTkcnPcOjyBoTOQ4 z(b#+75zP*FT4Wk4TH(9MF3T(yZgz-BUSP94Av%9Ppi;-$>bIT%x@0pR&Mq?oXHU_} z#=TZ|+;A&cLHd4`$L?gv-@L(g*g)Kr;$Ckv>rm3-k%&Ap{1Ac@Q3;vic_m(i5LqGW z-a1t=fhSD!TBEK+z0IAbCV7)g>+ z2n&|}Da4nCt3Jk)e$wZ6+xH&MfRSTsHKco~f48oCun{#Guo!(wKb4~1ebZ?k>=x{5 z>+b6A9PD5IEeDd!M~;DmEx?Amb z^S1pHY}aaEy7@`)vI_<``*_@;$QWriH68*8q|zlPE0Y0(QD`uqn+xuG}

j+De`L8n5#*k}5PmHZMvQuz*}DAD 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 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape~nostatusbar.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape~nostatusbar.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2676989b4690c23f502d3005f13a752011cb9d GIT binary patch literal 68136 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 O{HZ8vD3r*V2mK$EnatY& literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape~nostatusbar@2x.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~landscape~nostatusbar@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..356d8a5df79e70bf6ddb46a5760e86f65dc3c629 GIT binary patch literal 179769 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 z zuynVB3W=en0Lf!)v?T}l(oF$(8er2zLx-fm|iv(jX$_YM{jr@ zfN^6+yFjPa@tKwf=?XXGEaP6O z{#EB5&uc;JOPPx&^yc6+z^>QbOBd~F~XT9YDm<`_@{a~c^$qcP|qusDa&viNR# zCsJRGZsmgOo|s$egN<^k@==RR06Ty2Sp2WG+~WYG4|%#EOx;!U;-GD=7pNxf?(T-| zECBQjhrqzX+H1P9Y;U4Uvb$_s-~r=caeIEK(UF4z4W*wz&$C0K2?*OQJu+)* z;JWRcQFygIqfA{VXXj{8!SRq~tGN;fcL6@QyS=xKzuQx3lX6yQJO}5rG>D(l-eeVA ztS4fw&DKa}F!EMICTvz?F!ck23@z^6sJ9(+{z4NNP^taSpz#C>=nz@w@!zC4=mfCZ z-3^_C{0MidQK#Cgst}<6*YqHc)F6+`crutFlk0;;-*Lcmi&ONYKWU6XZEOhJoA4hD zX2?K$PtRxm{-S>`iS^Ot*Mx}8EE#=U-vTaioRVUgE7&M$%r~?ov}LaOnlNKq1}oe? zo@?eqkQjGc__ykc>Wf&X$iCt&_^2>7N7DeF&tD#H#do|)6k~lz=7YVHy`Ek+!Bx=+;@LE-=cs-g&XGT;EIXxj93b*vG zUf!9C>eGT?zHq2DE7^SvM7K~Ac>eEwX?M`yqtb6cmZU93J|K&ePEkHF?}1+qAsY{< z#5hSd3*bzzIXWXY9Gz=Mk`isQa}sxGqXy>169j2>CF3tOYuMV%+brZP6hwx8xW*c7 z{`#86{QXlOlX;Bqu@_!oC_X>7dYa!Ca&eF!a>q3PUgUCm{ExrOt9-nDaGot26Xb5j zh?tnpgh4Sbw|&?|D>3QvEzT7<*z4y(u_Y9?LYPW{~t6{ zLMf>FgHvP0g-oEdnxpg&b=^WGanBk1X{`67c@E6wa(e zChGrsWf*YgN$I^n(L=WD|9mIZ8fcPa# z-1*K=cAYu$xF|R#EGJvNNYi5bZ7RMeHrSwP$DnFCvAXeM{=sv8V#bCC*oQ0R$bWUx zI;((r#d*j={ z!MJfBREM*RM~9^IAFDV5QyhH28AX~bA3nyXm z9Xn#{nK;e_{sp<{|cPNt_a*Dcx>gPbc%bc$i-u)lr|eaGXi@R_8f%HI@VK|!292ZzRb&l z4@QUbdy^1HyZ^FH*#g#nw|*mNqep{32%xh;H|lW~Mb!!>E&rvy?H65tYA8*!c~rpv zIhCx`IFv2eWOei8Yd{$mE_b6^R5n9dz5weB`74-~#2+zB!R5S*w{J@YNU(@~GO&np zSf+df#QuWvh99urM(X3Qf_7k-FXL-2Rcn>#V(zdKt*3+*rFrReLVu3v)6F&k8XBc% z_io=bc)W*f*=$bt>X%ayP7id~Ikwwyb58T5!4uEj_c=;)UL^tM9hFCQ=MJ>IT9V2- z6$;oAa)-T!%!k%UJiKQPtpc#J$uTBhy2&w9k$Z=>uKI+H?hY0bfJUz)TKI&vE#8o* z2ExKn{!r&8c5o849bdA#9AE4S7hF}A-i(V4{1kt1bWsD}dZv!j9iie`dsLW8MV9^lF4!!ff$4Hw6)+7DE49&V{tSZs(1S6KiyJ#7Bu1xO_1W|vPEnlDa zz5yUX?Pkl5Lr|n*_xOTcLTIfbcGxP4oCvZ5XVg|NKPoW^tu=m;ck@3eG0X$>tL0iA zd+GdMB3Om08&Pe+2X!!><3op;;lo{)gf3=Aa3H0wVPYsj-hiIUZRWKD_K9>qQXf(^ z8F1w&NfC3E$VZpExqOu2O zBJasQY7&Z7`W!*y|26}psaB3fU1cuW0Fws5_0)qCYue0R%Ap5nOfV)0r@UJF{Q-!y zdjd+{Nte=e%iz}7#N-nPH#i$HjwSVg*`;%gb7G)?E)juU4BmUiVq;}=^?OyD zL0(bg{O&)_H{l!uclDa&NYEd*_Z zHuIQa$}?Xy$vSxCZ3q)?8cCU(@$m7 z@%FbFnmT)R1x%DZq8!~iDC<{S2DiKjh1Ym;$J{#??P@)9c}h zObzx{Q>~*s|4|EpD%~lq0ead*|t5m1To`F(51D(I-CL;ki-g#gp9o&Px z&k+S_p#V~wfAj@gQDS~Sqd+*t_1jGb-fP~p`R!FG(pujG#Ug96xkF+aY;5+DHB+a` z!D?Qjn{GFX6u9o&q8Nj0-l0v$x7+&nKiTyK5O&9ZsLrBk(0~V;K(lB~!)vrZ!%y-3 z?s9iUV(G$fdC}6r03u^)WJvyh#9GZr@81WBTF((UNJJ6mW@14|^Pm&ioO&1l?7T;; z69rcRwAC}+_54iVzzp&IK2e7@_8IpYl4D$UFr}#nU}Yp=quvyT!6(e()-jzvfdKlG z34qRqPjsX41DY3E?$f+}(YToV|Frj=VNGRS+kj$2Y(o(c7-f{AfJhY#K@@PLgdQXi z98r3c79>DG#8K*~AOg~)cMw95kOWY`4gv`!G^MwMlF&ku@5Fh8ndf?+-`^kkb;yo1Q{CQ$ALuVHxDtxxLXWaF zz^bYTW^Q+Fm9 zyxoAeI!)9~wv9xQt~sL}OpOBq1dg`d+LOQ1b4*}3Q+IPz_TKchdsnS*yEz-Tu2-JF0oyhgQj%c|yVVK3Z!%&})Bg zctWx{)=dR$^1XWE1(~7_wacKyv-IAJp;jeh7wr*zC-(>6{6lob?e~Ah`V*B+2)|FA z_4@yu)n9i;zY?yXA~ytLB-;X@0<5*s1VtT(LL8XfI~fgaxWTsx1K~irRSdcqXZaEw(+$ms$OEp$o0_x(9YQRD)AiNs&6uRHgD1O3 zT$aZbQR`SBki56VM~7-EDEYiOY*2I26!lb(6VMSrP?>=r((eC3M9$bDiWciOa!Rr)O*z*xRqi&prtCV2pXWk?rx zRfN$?{*(+`8>9qcHssY!^|R~PW(MN)`|1tZPKHM;ndJ!FY`hkw*HryLd^a{2RGm&K=RmG+P5eJ+A$wQP#LluWRDhDWb3<}nTjxl8+83&1fwRCEtK?xpmuV2}=W zLm*kQg#sX=0XA!O*eT5u53GWoDkdmc> za8}c9NxR@I&$}iXU+)b`+qvgN>9RT0!cgv5&C*P;W39{;uK;AwT@7zD z@oOB1&4~%G^+U9Cj4GBrqgcTogl)VXGpjZU8Vn+^%=npFm5+h*BAnfGc~0&HNJjzD zYTa|(L5Fa1lY^Q2+Y1semCbKHfnYZ*G3~*-O{@B+!73aCR*YGOw21n6GjZ>&%3sn+ zFi3)EDW?7jFoZgvoob1{<9vd9{@#EH{Qn!5!ZBwY$D|td&QxZP^ypnUGYEw0k%m12 zHV*Rm>^0;qYeTQx-t$lGJSXh}L4xGOdJCxoz-;?80o>Qlr`Gm+9sc;9ULKe8et-P7 zyL2)}zaD^xE}=HTVFKlTq-#2FS30Dy%w zWbgmj?)49h|9!Qp0SC8Sx8NmiZ4~;iH}G+G3ykC*{c&2*_7eX)6!%(k;-8>p=5}P> z3elX4Gp4}zM?AT4<$sJ2xHo{%txUi73;C~mb3Rh31AITPN%Zlpy;9o_jPv#gW1z2V zujNJh_R9X(8-NK=KsPFh{A>Jbzb$lune3-Z%!NO}1EwjrSp&%fL0aY8thw$Ppd8p4 zNq?^V@x6w^Yphj*L&(YzfcYPt(y#&fy)%US+NHjzNeeOrZvfUv^2B}^))~DlF87EYPQXLdy%vwgtjOMAe00`c zo=_*;$^J^ZmAqqWj6?eXc!SLws4f+%c=V#3qZCA6OSn!OS$hw~FMUSfmlIf12^^;< z%r5(A{!C3X-m8EMfvNst4kr3C)CudKptu<;z8H?o)6khzt^)PP+BI{Sqm!G|4woad zG*<|+-y4|Mrw&C|Uwi$*;)MJ-=)je{bf%DvfGok1_<(3bRufpG=(iQ*x=%&6P(32m{5L)J?|m^wWME>_2F*owWL$zJE-{Fo2kzE9F> zy6b1s=dzm96;Ga3?Om^z;H|f%*UuVV9NX1FR2^^AC?FNvbceZ>mE<%XD27Yf7dNS@ zYp4zp72+fe1|R4P&oavwIg}hwJeDp=Ed9la=4E~0g~lDwo`i%U_u90wWYKjcie>}o zg4sJ&95jeF^tPmvNK~>63y}l%!b>2aDVGkM&m9FATakYA+|6(ci&66^_gq7<)V}Dv z4O#&hmmVUq_`ra6x!I*5(mt?n+_tCQS~fFdzs6Knq+2$cZE)=N8^z6L#l$C5c>Q-0 zrZQyzICs0zy^x@0PDFBGpdCt@Qax+<^Q+>%8vCh#_D9d;M8y{@iN{Jp0t(~=k7kxz z2g0V4!(5-QXFd%Z7=4x+fC>wSSHie8_lH4%8<+b(%GRb#;#eRQHWUYRY4ivUA7^bbK z*G8nrV^3*`aC3$xIN#^F50pR~6P8HrX{6N0rANChRcxTfiw_L)A-d*#Kb zLS6wSu=JpB58c&XuMbRWLlttl8vrNt?kt9*J&MGyh*=qodEl~|L&w1CAP6tgGq(Z=35pk-ld{c7my;41KeP;MHR19JwtswFF8 z%5cB>RHVK=l(G!i{!5z9a&LF{XAY8`N3FeqfDHjJd#*VDBIx4@4`m6CAZ|erdG5&mhBZ9l@M7HDeC=I?Op-uU-wp;Trbt`=yL$`nG%zu#Mu zU>@}+mr?7722YSRi1m;17E|(xMo4dw0|;F`wh3q_X4ynW+$9DpX_f|)qnb0EY>9m6*lK6d0H*B2Rjr%S1TB8{bi63zHm2?toYup z0PQym8xFn-?he8UU)BbcMC^EQ1ydqYM&Is0PLp~#ih)5Phn6#-T4>rcs_Yy5@3T=^W${g%>bw(FP+$gwYbRjw?6$INcmSQrN2^VdU`$7jMHTk&V`*fz9=;v zdvFWqMI0a5%SG6^rOW^#--we^*NI%*`P$JFAIcIH@7ex}1QbX&8@!qh4M~V>o{jQ{r8&GI1Z;4opKNk@w`7P<_T-B^Jy)$|Vbr2< z)F4b5ei^+2OJY4^Xv&uX<= z?8npv&Qf5p4z$`^OT4Kcei!KVyb`*v8$WhZ@fE(K1dx;8JX!Tj$>bWN6s9)gdHp=+jfvSM#3UY0j0r zIg-oI+G-Aj(pa?^Tp8lPszCD;t`PC0vwlsdzUjoE)JOYj5co?p1KtSh%oA2*f0bl? z1lm=)A=yO9)qxQ1@zJuRI2rQ4{FU-T37TSqteFD9m0tQ zi?TIj{``_oY6*7SNOHZdYObBL-(ZCKT+Q<34bbk6XIS(^ebU-3z8Q>z?)(J+J}M|% z9(myajbMGwh3Xd+o$)hGvpNH8aYYW~?0kI`_Qyup{*!-Q)lFGob#X}+3hvI4 zAbxlboV|(daU=|hhK%fx?1kL6RJ8w+kX@j@p_FSIpNo}&bzJW5_GYhmCx?ri`~dSm zRUek8D%kTKbdkK7)`M|8an&lnvqxy;Cp(Uw!v8?jJCCd_qQuv?;dLu3m)Ms-z12d7f`nWmwey>hoXr{c3E ze#+--|7Xl^4L*K*!^_oJ+AVKjh45!}JiLA}q8NHeg?9N3=;=T#d9XY@po$ugq-FE6 zq&C2|GAa(&>;FQGYgK1MpnT|L`3EIw#p5UD^wvMf2%s`&^385!Nf=NCXX~iJR1?^r za2M=i0$kKHV%m20sg{Ja82cz(9ug^nJFA}1BUi9U4fdsBnGz;E;iEk^t&&9J6iAt4EKFBXQF$98lx$3q-d=ER%^;G zk+8XUv37a{oKl0%`}3;qpPZJ-#8i2eVT5VG;0fk^vwNUPlXwV`v6zUMZtoP+o8L2p&QNdZ61;M(^% zeiy^*bP{N#H|JT%t~Y zIdeOWy2F9OEi^v$1hF}+kDtf`uiPhj`}U~|pH>VXO8M4P_Pc}n9(-_Q*KM=u!27Q3 z%oF`U{-81VZC0Rdk3&J%^=Q%6f!E#0OLE#7&NxdJB5V?&`9vSLdgSi8(`8u>alb;V zTBv$BSgUq_Y0QZ=z09@=dRLJ3!RTA+xA_&{wWn-y^}(5h@v?6_t?bwDRZmG z9_wt&Aaqllr22>#LFk0Iv1h|(ovlIH0JSSIARnBwr}|8bhH`Y&dBF$eP@q+MWeM(v zCg$lFw5m7}?q27s}tW4XS}a1Zz$+E%SKFQWdWcBBWyw!dJvE4&ljilYn;S zl2+E^F)uLW$%`;-iHU^b>yt8h&^e!ccSNnl6hP~E#37L>n&M_7-w41`_rTeY8k$(X zRLDOkcD^tebI2s&*P6u-F5r|KZJwXI>X-KU6J|ZLkJG2kFD}0n0O@yVc{{qEeeG$N zJ|mQY?@Fi8CQ+=(TdJKhhGsVj(!W{1CRu!)&ay$}?kyG3-!ZG#)Upg z!EW9SI?G$D*V*QDc?U{`cw6?~OYQN!*6k2+;&pL!i^apIkJUqO6g3q!&Ro2`{v2CB zAz_emw1?axGmzK0qh%IafPKQ`a;s*{zly+hwFt4@V6$_LCdId$pT|1@%EOlCu!#SJ(Z(0N`&@($ zDQ?&m28+6w^+z56T87qv(j|9W$^HsU42*u2@R!#`^4$XaG8?f1nq`x~OxevZn=e+P z?2wgNV205r>(V@ue2^m090fkG0RU%=XH@W>>ov8uLEWOx`NY0ip`$HwXIBOkQ_NHv zZ0@L&H7UfgH!88jNUvNobQ)@L{6459M+`Dg+o^;6T;tlA`j+9wC!T!R6_!iMvv=Q@ zE{yW#`cB(4io2l)K|6==M!ZudRrW)qxAVEocij3OhX(HZ9Hs0@E3UkO}pW$Iq zav?GUk4+Dt7RIN(*FJeKSot#Q>APN_+9232t3eO+G(ZD_v#gV~S#?(a{G9M8vxi$| zt6NuPAJFE)L(O7(OQ=sv(uwH4`zmUJ?2bRQAkZ%FJGgIl1uEM?7!s2(>o3}LOL^Lh zdET%VkUb`Q1~ygeX=NMfa3OSX$_-YR80PXDZxf@Y1(n82@9$li5&1wY>8%Hn)yV!% z9GBNDx<~82>jnO-&F zNxiGeRMP^z`72O1I^J;p7;1BI6vS^K<#>HCfI2r{x4%QB+Ye<*&(NL1;Zq zTAC|&(D}$OtoytA_=S8F&B2uN8!a&q?e#I;h4gFcf=c~GG3R!t&`foYQ%`*1cMU1F zxqwSqE<6}U)VfA%2nwazzioi)S1k_4)hwEkcLunF;2lWb{E~-6 zvmJ1YJSV>Kx5B;T-p9=TRUbU9JO@E^{r;ep)GehP62f zCMd;zwaPa!RPMGF1u#5L6g8iCWh$>}Ty3VR^|abm5>Tyi?9SLD+`a3AaS!v!eQz($ z*AO8I#$&^abvf|{a)ri7{6dtX%G)r(bfYs7@WQi4uHh{!Db>EjV&ZpnNe24gg$btn6 zUP=Qm*zF+`%6tr=Gw`nNHNQax>lneSl(JV*4>Red&T*hstnHQhlVbrjUVKSs7MM>l z4dcCz3G;3{WZY2Ad!_42sZYTeNs+xr0$SWGMxi@uMGI2Cb}2_hV>U%iwOys zX1#UBGDp1W%2=tHsKF)7R6RZ!$68BZ*G;W|{ZmqV=o7h7ZXI}*{8daJ3zbw1%r-VPzw4j;yU zOf7=%QkILa8KY_di6*=#gZ+*PAkp9LRX!I*)#HKE zur8u5u_AQdUCi_Lq|hL{NpkZdmL%Zp&1B_B&@O-mqna+~&lLEZ2eijdXXqT$q z3$j!plv{ZGpc_B+sCiCt#f!BNRx6CYiTv7zqr{;TaUz%Upg+THE^` z`yDRutNRmkW$Prn0fE-8j8bmMuRTK<=M-+$HR*l@l&~GhbH6@c(UwygzJK1>CDL^V zGk^4tgGd|YI!b83shLvva%vB)bHqy-H&HIu0B{a6-pC@UwNFbdnx0J7`1U|b&U!Ry zPNMA$!byOlP>heZc-MMi&{tjKRLSz|T3PL}zb@_DNd6_dWUs+D1%vql1ug=>OY@<-R1T%udh43zNcMkcSf9$f;D^A8}Jwk$($pDAG-5o>G|@7 zmhZh4_)<*dBwyu<>)tzB?cKUDB&4fna(*~V-s&JKuiE)Tql>OKXyll2PrPVcaa%?yu0<9g6YCy$z}+u?*)E zhEwjVE6`6xI@N*=&wJc-GH}SbI*;iy8B99w@|)v5^x5~ZRFlAbtouBwTJ35eU;3Q# zdw+y`7?PRNE4rZLR@S86GH%!^#0Kp?WV;^TQ9u4=;wW5;j#(j$hDqNtm?_~_ad6ah zbN<8zi_Rl_KLyD-m}j@~y-%f;kUcSj?++P84tIPkC$r>YfMe)LduR}5sxs^EBzsyW zpp{Rk7f>E>oGeMI^3=%7j3Xw8f33V8(OeWNI+E}j!~Ugl@Xcbpnt}Ud?}SXlBW|Oz zbVm#K`yfgQRW75a-aS=Q5>>vUP4U9TS(d(C%KlTrb`4)36s=t$tJdGwv4+(Yw6SoK zN+$VNZA`k9DZAUkz&YuR0)Of5(u z!N9#*B|rgb8QUmy63BVz8Dr8ojbwyQFAy@s25$%sX#7xg8Xxm2Jm8wT+rgvL#WC{9#0GxEeABccUylTF##du27eOq$k z<5`luU%m-4_xe3P^>cG^cD7w3uh#vBNS}=p-f!bxCmuLYLyB=Bd7CbtEzogilPUS3 zaS}kXh*HyK5|umY!Ti=`&Bvw&VzB5BT`kUU^}ip|^W6cC6nJot8GLU=1G@*Xnc4@g zfk4LA?kta^R4Pla|2|#V=%8?0ujL0x<+0r^n|c&CVx>i_D2^AzZaU7472_WP-X|3^v_ zD2vse-$+wayk*cH#)j|Yasu=cm}ley{>O$yfvV$$^3p1kq3a?Gq+B~e(&kF zMeDXNJ_03WXQlGBFbzerf&DO!B{ff)kJues>G`YVntNh2Y|N7jI5nR^?#`p8_|9t#E7R0|z z;HUNfwEmyY|EKf+zoW;`*#9&3|Ac-&q2IqT!w;nT6Z!u{{y&M|PvZBZlIGvU_9yTE h$@~Am%06p^#r!{I_Z6Hy$p!rVu4i(&T=)9j{|Eiy_&fjr literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~nostatusbar.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~nostatusbar.png new file mode 100644 index 0000000000000000000000000000000000000000..74aa404bee0cce60e914a5d50e7962185f0a8445 GIT binary patch literal 89585 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%0DWJ>#ds}`n17JA-{8*R2XsFF5 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 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~nostatusbar@2x.png b/Paco-iOS/Paco/config/Images.xcassets/LaunchImage.launchimage/Default~ipad~nostatusbar@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..faf862e58a139ae18517664888e449d741324cf6 GIT binary patch literal 242563 zcmeGERX|+Lwlxel&;)l9+#$FHcL)Rz5ZpaLaCc~2g1ZNIC&Aqa4dw4kx{f<~lYE9+JJ|5c!F=_q51CY} zu_X`Ca|BiMA-1OT0G8AlW87Ex>J2&{QI{Z;DvZH0R4D?2{i_-wz^tc~J}1@yQ=22a z7N93+4hh;XlJ-`r7?E_@0#{R0(=2ue&M%9yHU}uiw~eFx=5v8*JPkLrD4j|t8?%PI zMCU-qc)BkX_7OTb6Q*-@kjD8HSr7oengBNdSlZ(n1n#yqf@kFhEL7MA;SUVDXEC_O=tXEnqQ% zNW1rA9)m?SqsI?!IYYi-Wz1&tk^;JvRAv?u>w+z?^47;Q@`N7eUb()nN!6AbiBvMb zyFO@(M9<(yShH_6qA1pkN+w|<#5TaSCnBt!&t< zeMAZm?*knY``^|5DUbdr42ZYNxg-1A!2h%aga<-FDF8lU{;T2tl-D4@`_z0?7Wz-g zzdGkjN(w+EmHxl|5$1$cQy01y{D0d;2Lgqm#H9Y$@E~;#yd?z;aejLI_kjP?ik}aF z#)k&s|CY}}s+oOTLh}E#i;fO}MW_0IjF1MYW?t-4^#8UC53w2`hw}d#!59l2@Hwr> z`yU7VPk%&&0ocOv|MTy^KfD?EIMwFPIN8!b`yY z8LkUy`i9iP%e$1%bzx4EK)&@ggt$F~Wcqcy$A3or7*KU(gKyzn9~{N;_1%=$%Mc##+W*}8g>7hdFrKfLje z*7PDTyvPfGc;lbR@FFj~$P0hArT%2rFQ*q?cUUiga)FY>~Ryzn9~ z{6n5!-y<9^rx*TYlrINm{}|!r^umk0@K2a{Ilb^AFZ`piyqsQmkr)2a zSpI)Lz2MtQ#lqTjSngHB1^KO6s&MlcK1u71wvyNX}Ty%B45A}6EUKPNEJidzY5$(8| zsH&Czhvo}si9m05RCeksKxcWk>&0f(pcYN%^FybEpp@AA|pZYj-B;%hI04a0rfZnXCwEvZvl9F;J*O(yMQBY7oeB$8l3i(Ce zYji+9QF-5gzR#|cMF^`3on^n2nGq+<2c<9xXa0U15Oo zu@U_roBglyQ%JLYQ3^2syBH!DxkFy=&n#RpLIGKhaX_2P;DHJe|i)Bj$; zFAMvBupNS0FX;3SZ2U#~7l{4uFqQQZ?EV*&zC`T*W;ZXil~Up9E02`IN}) zKe*mefg~&I*|!{zI;@0N%4Pl6ZTid*CVF+|ctG$EsqJ8bKM3HNH!@l$@u&(toyQxy zIRv$TcWY3w_Afu&<5YdDcW6F$QBgrtwa(>QFIV+2%(-N z?0Jxi3xU9lg2@m6J;px`@H0R`jd#ah@&C`9K~vE8G+dMOKCd>V#T%u z#ZR;~^-zB*dH?OKz}=W-Q_qw+={VYnN==%4S zd*T2ez>Y|fyX-%p?;A{}aF&o!Nb4)tK22{UqpkEvJ8V-|U+TpFI5M(ySKdp%Z&BKM zWbWeS^}V@zc0cjisd-bcDUE>O(fd{pWTEg_DfT{>gBP5dby(9<$p15AQv{5a(En(b zA+M4|C7hce$XBdzNk+B*#f6s&Ej2xr7*=$0Gh=X2QEuet$jDFTpQB7anHUH?50pLZ zn-=%t)r$}##p{2`HTQ@f%3TVBeLs`*it;_L{WU6jgDJ$S0+Wpt|KmeZ>;|H%_;za& zSC!b5gnWX<+JxH8%>*qjRcl?Xw#J4gPY1W%xw|v)NJM_8zLAHewMTQS04J+vADeDX zHXR=Rd}xUE_6MWSuN4q%hdMQLSBemgq=%F?1=}+p!+B9G!o{oQUjtM+$9I-gDB0_H z1Sc3hc$P|3sZ@@Y>#NU}b__~?mXy@L?Q>r@N~2;()!-IzIhlFzrGP^v;c?vPi7_hN zLM2WWax`{!Zu2yrE#6b5QXOQ{D zpX4->*@g_Qnd|WA!LB?srFRAm(nijai+409w`L#4OzR$K2yWAkx@Se@JR;ABEcLQc?o<7Qn#o}ZNultrjDwd+`5YErQMW{4uh*V%!aIILso z4esW!hX>B#BJmq^z~SmDyTLS2_+xUc*T3$9@X*mWtsZmbk+;8{HOx`*`?jCNq}z70 zln{2j*x>2CyEmUkz|}wBFSDRDI?UEop;{YIz-wmV*tLmyuZ-kb!Ze(gK_V{>);+$@ zeQZ9@sTlH=)&r*$y5KV$#=DmC?pay3@KQL{Pg*k)^12;dd@uawdDXK^9VPJ86SH18 zv}%&OK2!3rlM8oA3$m{1B!vwPuxgEqgdFJI$W&(N<+ zNGG-1-8Z*>UDhUm!JGN^7!?sm(k@m`4o2ne)w-x@smaN7Nm`ZAne%p%376r{c2Q;f zvpN-MFlA@j_2c-=2%PUHIJzVSNW z?b=sqG&&@}Aox4Gyd{q4AcoxhaOg|M?ur8xMj>9(opFL1*G=~G`d8feh)sj@S+B{t zv3W^Hr_t%wQ{&9xXl~O%Ms4Y^ViBKU{|7G{7Wj1y?`CwxUcgThqA_rfu8Uiy45o6% z2eWY!%gZ4Di0bmEPNTvoq0@XL>P&9CtzCbKsFBgpqja``34>F7O8%Zmo>E5AL?}(%kVm1OPoc)&0 zTxeV|1za3;clI8-u_crBZ}K#2ZaSB?-7c!OPpGmVxnI&hSLNXwH!940TuajP+-k&W zzgY;2n`DEnZUUx2qRj|IxZnT@^S{3X7H+xzpjl1H}0btE3eD>VQv%g2{D!D4WGgIRTb|Sg;D_?0X`lM zmz9Bub!uWEr@O&Iy&He~tDRV2?VQ!HALgi@%)PiU;D?R)qcHw!fB^c`<9QZz)+3um z#$VONcZ`vRw_jc(xyJSOp>`ODIn(3W-@z2}$6|MH_V7^E!#!Ik^4z?hX!Wwu;Mh5M z)wT+}yl}u|gXV!0EKlO~P#kC4=KAmxD;SN$V{Lc4z;s(0S(#WA(~(PZ9^rroV)<_b zQn}8OfZs)Shpic}0f((AGZcTL&&dv~^XSpS@qgEsH=RVC=IyI$}9c5Tz8a68h` zWJ?Px z(;>|4U3;eNiG-c&0l|3`Xy6e!DWC}{dZZR2TWJy#978UYX-bPe{1+iuMu@*KWx=(y zb{uQHyc>Hy%&gRHg2Y|s?Lyil8fNMn+L(Y$65_3GF}Ftb$cK`(y6QuFTlHo(4mLKA zhu^zNZI2m+ZC8qgN~1p(olkFqc`(L4taw8%p}Ef8ZUe8$bNv%%p`fps6-L>$Yl3PM z(vF{xxVFdIZl7kCb=|KcA}$j~f4(<$w>E51`Ih79GvAFp6FNU+=e%h=vH37x%2m18 zQsaKU=RrR_yuIvpKFsX7ele-H>-d%k^@=5Utq~GLP9%Y40C&m*w{O2~PR@QRQvV&` z$`f#?EAwb>uRNc?bopk};`xagXUXe(*1_T++=zM@lS#(+YJ%EVm4F5!{jH2&jWZ$nT#d7&Hqb+7y_Fjg#QIAxb+BkA%UKB>t>^#8%cYQFPgkBt^IB}f7HvP%oTgWbr7FbDn%ooS zNff3-0z>OoQP9~L9tlxbdlmuPBTKJoGP@RQYp<8@Mk>9}a;HIO^;j83<%5l?7BzRg zG?^3D5g0{592_pTEC=mZXUmm~P5d(po=;KFmMxwZu?k!!Auc zSM@nZF43u_VR+u<8dTH zq`keiwh>H%EVIPM&`x_C^#+jOGTe?PF$@aYtl#8AA}Ohn23c1E=#qLX5^t4b2ir=&B8DBPAVelwSM=2e=cqBnObcw1;XWXG;FIY~vCO6NPi@bloob1)c{ zke3&3|#yFV4oP_X`NRo>pud91 zh4s-8;+M^%P)C~{3lOcQ)YO{xO9?DW>A7qYkyI-y7Bm~(yf&u{T{gGwh7?_DTO5j) z_3%hYESylI>fdOV%kfC{&4@J*SzABb#IMJ%YfJ0=%GjH!_;sEkq;e0wCuvuK(@+Kt zrDZ%1HE(8B?+sMes20t&?0wvk=)Mt=0=h5+vns7!9@}B zxv%}~TFniPB2G&wm8;RZDtb`+l|PTBClE;B3rD5!D-*(J>h(M}6G%YMhkDNq;BULK zV?ssL=M7O}S)Qi!JT5L?&em7GLbpdG&%Gd~Wd~0WH_F_TJfPqw{cW|6nGJ(Nm<^>6 z?o=Trm<6HX%7sRdXpN?p)xypQB|rFSXiS`BX-M-M{r1>WgZu5)8kk_3dAX_Db-%9` z!cRRFcqmH=GcOHn+3td_p5eIA>VxG$bra;dHH|FDUnBIChNo3WC=6fckZaA6gd3>zvvDsf=p_h`X)zCU{C`df1b6qCP(?9$B z=f&Wpy!UncQ@xVBpq46=CgKm%;LrV63BtDsrh1p9vx|@|qr-~rHV<~F@iv0SAcO-d z-`JaY5y#uR|8JD ze6cvP2fsX{IPo<8xrDule`%*uARZXu{hNSF)2O?eZly$yQTeKk5KmR^4Le`Ef^IM~ zA&o?EhU-DkV1K6T-9RzhCU=dWQtGLn6|+|tr>ovjp%M?`*~08J=qVR;x3a)D9Hus$ zq|2jP-N`t6*^CemqtRbiKa{f9esXZWd~^PMu^JSFue>w8B zGYS>&)pbV!*|H+{%}_8Z%s%5aHu9=XFD>MyKEH$HsTN^jYS!9q>ThlqG+SC)9GyO& zE=JV$Uj1IZ`kk$6+LWH{?8u^4%E6%(xm7~EaaB2fb!YR-Iq_|Tb0Y^Q>r_ci$zDg@ zlfK1zU&4OU@}Y~3wT(`ij_cM9)>wkxZxW%)o?_}uw}am)ySpj7vyDVdQsa^S_1B~d zx>wg8tu9M9mt)>HXzh=;LbU~GNm$CY)N{H43os`BM~ab*jA{%A*PPz>lc1f7iUh!; z4D-XPrN$MNhV?l1- za`T_$#9KMam}G<)Oe4MT8k4>~&P``N44pfi!@Z@Z9^TFWEPQ=4Sl@oE+7`*#v~LPJ z-@AT30x{{d{@#;KsI1DUEPO=y4r;1gJBxjaXTQ|~U2-u$?&=Zp+P8SB-gwu51YsPT zrhx&+9#-Tdb0km--?wVFuT%j)w#5yD;Wsd8nA!RyB+M_}7wz|E>9>~}op&E<(MFfG zTN)-9EkHw?jYEM=B{0p>H0)o!=ct}&p~i{%WA{bmO)jujZ7md-KD28j!jJqU`SvY^ z2a<7~_P5{sbYS*cmC;KRa&+A$ltOct=l90<4Gnd!tiLKv0$og!JXEG}B@SCW+3#dO z@5{3-k1Y-8S80qQx7yy!d>?DQh!A={!W#3eEkmN0dN2h6Nu+!_tRc46EfDd>Wq3XYH1N#TaA+Ndfyd4pKK&$ zg7)agNcfz#I#zQ(BP3wC9So0!k4-z4E^6qtU4|vKKMyB?T#qh~M@a7XdR%#&gfBU^ z>W+bZ{lVQLHdbyX&Z~pW?I&yX&u2fC^my$LjO~g>5jJ{+?~kzFcSk8gf;i1(+A}2O z*cv;DaV7=0=RJH&7v_Y_Ez@%CR4*q;`qk{VKG*BA+~B^NL65VM`n% zly`jldFcMZLG&I?3DRYj+H-*<0L`*2iMa%HR`Af_AcTSxt)+)L7phc@dLKe~=924W z#x%%ocfn$@w)b>2H1<3mDO0UnjrzKnX_{k*qehcIq^$(G=-mP_fwdK(fcGA~-t(l5 z*L8dR@>0@=_h@Uk{3esILuwnF=f@8ldQYcG&sW#;Mu$@ymOO1WyB}wtbuefu`G@bi z&WQ5U9WC7p9(yL4+inhz0zrRBKw%@j zjh2UGeO^rwj6nDWoh$}6no{?n<2YtL*XM_OQ|301^XD&iZeQ%IZu|P?6x~uL_84S; zlyo;A1qh-FH8$@RdWl^&mDj8CZ=(_lo?kdD-;L@Coi89gK5Z3xwSbm0p{X7<8f!12 zK=(pRPb1GddK#(e-xw{9(l6aW-tT@p3hZ1Dt#uX8!oZ4<#>@yM6W>ES9w9e@9!ZRO>AYIn{+Dn7?R!T4J-yEDv)$<(n0~s_^Q80M2EwJ% z_HmXMnZi8h;x>N@#<2wtX=W~a%+lU9F0&>Kw6V1+c-v|>x~-3>J=H#Z^Uj_3x+)#3 z=Zn)VS!A|Oyia2OS(~t#`MeKdrk7)!Q>7H`LpZC)UU(+EN+j2e<43Yl5g$=rJwj$+ zllN))xoH&W@Nn}Yxw zed+fS-XwLlC{yEr;NW|mw*BGOWr1zJ?RNXEuCsw2N4gArqReq6JmaqGL{W+n1QzIU z0L8cza0a?4&WyPG#|-oiE+?;A3I;bnG_G;i$wp@e0T;8E>*bn!DM46ls>*L{V+pYp zXHNy}%5KvhTK+ds+%_GwKP{}n<>jAt#-7x~5R{Y?`oBQa|7r^rfmy%FQ)1~uEIc(@ zeeCMX*acjRy!j*^QD*Ykt@m)_pZVzYUH9ED3cVsE&}U#<2q1-gg=8A2f%{6gS2l%u zwB36(-$pi*%Ab@iqnB)6tj_x4ZhR#m-i9sv7c>)WbZC&R#~+D)Av)h^&UG(o(6x; zBK2ngx@b6|=8GasYAtJ1E5J2}iHqhukr8ZDP6vQ6k`7Bo;yp!~P$f?5n&g^zvQLp8 z@O(qI^syDA*tMzfrsj8u3 zT{FuI-J=4kssB5}w3S=r;auV|@3;92LVC;l?Blv_;pBqBE`E3ulr*G^TGoQVyo55d z5EZy5iHVOltaPcx#Z8IQyYAA+L6gzHSruu!B@x^uxklnma2vZqVuoV-8q0c2KD45i zGfEX5Z(f6LSI3^Moebn;K2u749;+C8=7*LApm<`TI6|cW z@OQTG9=ae?hf6+%)k9?TaBa%IlM{d~pN z7G?U8`_Z71DC%1B9Rg$xR`|d()?cJaEDi1xgNR{)%tEH?-aI_L0oc?CdaU>b&vhh$ zG@;X|2X*Z+;hrPu0}(p7DclM4ky{dP(Z!0n1$o@|_-81zIerY(piA}h#k|+K%;*ex z9IYJ|dMbUcvVGhR#9ID32fy8eL@^Ep+(GOB2V0dQA-GfjW^j)VZXg7W z2N{~h@C%%8igYLP4wv`wa+k!HWFAs{cEk$mfG`AHtYw$deVJ0E>#0N>y8K%6FN+R3 z3h&eIdw$FQcwL){>`sh-N%#s}NZfpQ=O;nq*=hXlfvi9Z+2J+p6#DJjz|M}cfu;Rg z&(DF4@Nc7rKv_}4gYqKDmhV;pGOy7eM?iN%GNtq^p?(-j^0uzXl4;|X6an^@&4@9$ z9E@o~)*Qd5woS}0_9MHw>W?1Rkp@FyNb0SQY0thjW6YS7o!wE5Fg97k&WnblHK_5V z3>mL-tJ27Y%gIK{kA=&o2jsCcL22euYBR)`nO6EO=5H{DcXW_<0LMExM-;HbbA3=g zu-TE}K|vNJ?mHk$UeAiV(dpBo*7TOCQ1FsNZcU=3q&Zy#)065oXn@X%GAyhv8oO3k z^IPlL;6?Fw=C(UV6|Uf-f@&vZ#Bf$hh7rr*AR9F|ul!GyQ}p{In)zT$PK#QTa$}BC zxzgXL6dDts!K9}2QlY^a?5KwsJ2!7K0p0Lt38w*}(P(mX7pw2qb0i5;Vm6Ty)>qTFf1T`N|$YTEB{da{^bT8d%*KJ$qx}&2nxu z?I&z4xSmWt&Yr;#{~jAHK5LupghhBuzW{M7iRz*^Q|}uPL=(!0cnwyHG~ESsSbhaM za%PUc`RT};F_K4?oj?-UzA?~)j7zT49a#1i0d~mmHfvG%{0+pc`aoxjjyJ;1tgDRo z!dbxrTVC;BT|NVGeFe!$i!$rL<_wEz?arr%v%@46%p(P7SgCU7_54=g{sK3{Dau#I z{?{qV-)=jjo|+w)J-tqX6}d-PLVCFQPXy-8-H5x;Zov`Y+I){v8MLXSqlBbm@X&Q< zu~}boPClzbUeXVNtw*ls0^Q>GZTJ_HSYvT=&*&~>A?8wVyI9T? zj3oQBP?bSzud+(Tw4iUseIK*mc2l47amTWR&62+h{~AhQ4~7Z$KTdmy2E>2;n8JTX zwd4z*NwlK$)sVURBOyf%x+U9XYOJoRgR=6p#UMV~fr2(3IOehb zY_vI7c&y`oybVtqf$`=QGdnTw9z`6^aV5ioMsjmwlP$=|DO;lw{#ept|yo~%G8EH*O|}j3D-}o8JS(#hBu7*`*T`9BeUFu zPkMf%h7eDqlzc2SxMiHKZ5_XY9`4=AlqA934RJ9b5xd4PpStnaOnEaguGQXA8OaI7 zKps$(2`wI^n@9V7a1>oa)GYR1r$z4gha5rZduhrn=s+Pd>2P^XGcSwhk<1=4VcmxS zt|1v;g18w*CLBb6MAFU?=)S;Q%r)8G<|1P6LLtpHmpg2Wiy-jGSL;WbtA)!q$CR8l z<dQ=O)e*0@PydDhs9O?Z#()~|1i1^cot|}23o`*hyCGe6QO2q(E0ZWaKhP;w&E{k zwlG#@{vLz$S2(_m>tzI)ZCW&uEl-Qfi+rKu{?Zdw1VKb6MB$hbn#C=3Eob^|Kbq7T zD>?T^RAGp9Ul(cw4Tk6BudGsawuV6?Ok}mf_3oRzNyCPV(PRlDyCnbp%g7U*b~;$Jjy6J{xb+$EgY`^;Lg0CyBI4 z*VadHqGFk4b7N5IYA9b#tBWNDTP+E1`N4iIp7xWZBu+}sJAKw2BHI3T%uccP3AM5~ zOjKvmPlN~JVy`Oz?+w`WK7BE-!i8#4`czND`iZ@hc>+zs=tqdAerP3hJ5htd&Qu(P z9Msj=x*Tn7r$jCJ>ESX3#8ej#Ds8VYrwqOhHKlxyyJaljhThZIWAoQ#gjf(7zLU)E zSYIO5ilU1PCBEWHA#8*#)#PzL)V0WW&c(z$x@@L8^;!UhRSQ4hgdfb3K`d3TA^3b& z?|mZy;$(FwI3`3#@$6(AlKxC&+;5(*ZOu-wnSW0}j|BdO=orS2rb&i(<1B?3G-IoW zNv+LKO8j=_T32+CBsr77;i=i0Tc>`a{nbR*ejV+&8DST01tdQmpAT`8u}fT0 zK_ZCez&ivmW{`*&57gJ>O{f&n7Sz^>tHTI&i~^~P`KwPqVs5gzVSS?|!%*{p7|daq z-Dm?bk+Id(f<||tt~AwFrN%koT29y}AvZe}Dv)etkce>0$zO{uA}( z*j>Gr;VlLIuDu9J{;V_!C@6e6n!URrazb0C*7LYV3ldjvtqEDyPhQw`uE_f1B{EhvOI5xY`#U%Lt%a~c<`#ahs}#!${Q_Bm1gaskVN_^%uF?bWG5h>lZEMD99UZwHM7(wQuEO<{Yno2xbU(jjS4xXD z0#13wyB;3;wy*0wS0f~_VZgB0BILeRG93Z*g6KgCXVIn{|i%ItkL7VaZ#Qnh`| zHQU{A55iGZo{Ln_AoUuckXAB-WBH^GCnOe_%VjtR@7YPR8m1m1*%eh)H(wJxXXk5` zq^TMreM?IO6);7`VS> zY`G`+z4J|=cW!FkBrJXc6(m+SdT@QSMF9T58Ex+JyF>aUL9cDB(6MI(upsx@AT>ucsx|bm_o07VSdnb|2QE<4~n5S2+>HT(Bdr zBqCEYICcoP#!b^6L8KPv(Y=z+Bt6z8I!QW#>h?4lt zklBZ}8M#y^V1^ESVKS$H@}%g_`N5P@Qbt=tM@>c)I4K4bm^Z+?n@67t?AOtlG=rm* z4*hhureA%Q4B4K%27N>h?}Vxq2@-G6S$XFpPlKUn#g_1%`_@$NsW#>N*w1tiVqTF3 zMO(%y7xm|~2$?E*Na8t1t>1D_0bliMoWk}5=PwDv^=1A5m@EXN3vVcr?pAIj3 zo9hmXnxN)0nFSJEaBYDdCHe}+%@eKjnNf1#uf?hBti+qt?2*T!xq}QsmTK#MsL!ca zs!H!8In@5rEY%fBW)2}(FN@=VDXBE%$B&X~R?8uiP3ha~*`UP4_m!Fw%s!@QNi)*A zaY#H`^tYJd4#>@PdzI7pHKjzEF6>+lGj0rYbgqC%WC+3wlYfnc&`6V$zsp(WtSK zF(Q}-M%r{k_&k&9U{t{&&uli>>wc%XW0nx%g4s78Wi>wVd&&Epk`=Q)@6^l=Rax?G8Pxg|&1 z36-bq_T8hFTHa&lR*H_Kqho`|rm9H|Z z@EQhKMu(SbXsA=@@|90Q{JpV`|LYSGY!nnUm>Pu~N3O~cks1|1Gm0krN$O!%!ce$u zhWF})19K+#xwf6*yCi1g`|XRSW7Q3qNG@o9M-`&uMBLFiHYoP=LrxY5YMAM#`auxf z5ziMsdm&%*^ZFVy$n&(k-HAbK>f^*nA(U{^`PPO<1Ym($yYy_x<$2`zdHT6EWz@;Y zF#WD_Fwdrb%f{3D{5DE0jjEO(_XW6$)NunyWy5gsuC-1sf)Ci~&zs4#CMFE=oK6)y?;==!eyn_&BdDGkFp{o6{^-bS zumLt#wq+7XZr52-FHM|E1IHSH?NU4E1NtHiHyVzAxDb)*=W{XK%)ICGU0JjJc;<)B zjL3_c20#>!Oi)Jyjw(?qit>{CWNN}br|l{z4oZq?k(=Vp@Ch?i8xA zu~lfMUAY%CIrAP!>a!FnX=Qyviq@j$w@K##%=&ix?Z2wXuD`3+GH{(_bwjtNTJ504 zvXD%IfSk;JH+%WaYq42x~nj3eOA7qM|HB0V{xi6c->TBN_OIPgoQa9yFCA}v5AbroIQN>SEoWSAcQ88Y+iaviR-Lv44r}PFz#?aQD;b!TcgP($DOO;RI6YNi-Tj1>%FoO_vWA6Y?TwcB3Ua$JGXQ%<&rscU-59iRPNd4T54T3i5y?V(W_) z_4D2D1l>>y?-t+Db8J}Lpt$6Y>Uq?J(bg{*FdY=;%Nwqq^Bo^KK z745p4tS4<;)(P1+W$V-vPgyCD{(es;g~iqQD!o~+mvK}Hg1G-c9j7k zpCv$Efe91hm;*S7jy#8^*>cPTtb0Y(?7e~lA>%AR;Prn*lGSXxwQcJ>Un~xjv~YkP zb8<{4V8nNrCsdY=>4NIMW-#Ae0lrX!MK2<=oB{Y=Dp@R6WeNC%42WSRqhnbl+&D6u)ak`65Xkv`@upIr zTCymMQY0rsal=xYWN?QCW%>GQH%Yu2tvT_4U{Cd8As@B)c!m+w<`8`$5`7D-N0g>WrUN)ni#2faey z#XK4#KY|({X5BD=#=DWjz_`%$Je*C^6F6TOP7M-`Z^d!PJdKZ%>`qKZs4ah%`pEAXto4j? z5j4SdpvW!2u}ephohN_rgwbzE9F>A5RZT6lCd+7o&hcRCl&JfS5$TD1rRROU-ZM@+ zo7Wazw6cf1CW{b)p~1maYg*E_jjoPvy2aF9g_WB#)`vw!m!$yPV_GcZ)1@ClP2EoP zHQ8JTuii`ue6xZ}JZ@&P^g`z&KJi2Gt0+I&!{nd8TD4o^ldc*892RrOkD6$vS=_v_ z5v#VXh5rQ?go^p9)u{KkBdfn1GrrY#M6{?yC1;psEZ3j*BTa1z@5@}^Oq7lFdg{OW zT2&Cg4nMM3vq!(?I!gr(!^E*H;H}AY|5lcS-(-7rlVvH*!M-q_rSRdI73zmu%0*F2 zl(8rmO4ZOI=jpNdoa|>Mp7oyM?J@rQwMHDh3HA)=LJXuIQCe#hcn}V_VheAnOBpN^ z5G7a#UxhSNZRK9U{TJQPFtP+2DMirpTdM7^rxNb#D;Ar*jBZDnKYNL@egA5HK)5T& ze}G$QfF9NEnv8T$gi~Gf&~aIX*|9p%4Xj}fF!3B0uw^#)f7RuDLsiCE1&FAF?{XEDO4b_?k=qgEEBO_f3yrX_+TyNQagZb)DI7sY2AAjNZMX(93! z`9Hq@Frg3y5d-B$)6;ma7l#RW zqX6+*YJo!eEVYM-G1LP;a({)KWmBp;XBVt{|;;(TJd1CH_aCWF01y>9v}N{ z=7@uOs>D0RQ_6&Q(7B)B-Qg6lj7Tx>45`{#e6m`c8Q8l*Xvu0y$kZrM$XpfY%%*Th zk^{?pC$Qh<2SU@&#YMge_9O!n(H?!~NC8Gc3x(J`Y>_N*j-sv}z5b0}Nz&o{J2S~29dz2K>}61z7ph7>PG5Z?)`hLh z+Y-6&#6uPo}X2E-UeQFpIwUBDa1 zdBaA*da;Q%+xK0p)q32=*|e?@UZ#KlDnu!epNpcQQ_+$4W1>B6dGy37U4bl?-(F8g zGyy}`n39ddu;RP691nH8ru>z<#URz>?YoK$5kAJf zG?`%yA|znYMW-FZoCz-7AaI=J$1gzACw^?W22X8vNVerl2R(k#d2BI!eWcy$c(^97 zM!aA~jU+}iUK;_z&mx}RTzy0_!j{yG9(#i#pg%idzu-P>!L8f6%b-S7^b^1wGE~&{ zC9IFuu9BN06keFJ~%n6;SJmo z!+Ul-=?}R|Z0(Q1Ap2GN%J+cv({)0{(`fDaC3TIKtHF6LAuq_;S6HbJAM)&DH&HOi z?)8cuHo`?_M8{3b=QL?JNa7i9#*6LWlXXL%;dbh3f$qn0sU<>!L>XhzCyB>!aSD*A z#lN$-h3xV^@QNXg_r0F@p}ivjvNwepYB!#6%(^1V(RBFK>?`cag{3CpSt;E>wrG@{ z$`J!T!*gIa!v6j$oaB@Z7o`jdreLsy&KXnUz{QORj)W?=dgoMsE>B7>U0Nl5+Z6 z#9dQ4>@d6;@y^LS=3XAj0@ekmVIB3-u}ak`0^+_ce9BC;SX`2Bcz!X`wrmjrM&xYN z49Q}0bKJEdB?UJs8+@J`w0E|kZk=Fjiy!>_Eov57c^Ge@1Y1#$1jL)7A#XC^^pCaQ z)FO?6oX#%XvXKJjDcM9?&7+M{{N zPIn-6=5^eORSA%B;1T-maE5Yw^5AV=IEox4zkx%8Rw6(SSaCGD70KBxDN*{)zC+%f zPoCc`;cM*gh;k*xZpWDD6^{i*<~Q|nE7sKHkY$6qoGh1YcmnQGCGoU{9Zl!=y~^1_6s>9AhWqI^ZhYuGyRCeDng$(m zW!?^11WvFnU)$9m$cm>UQdGhCE`8hNd$$Fq@C9HAOXT3)tA*xHVjYtNrL$3t!vI;d zgEL3_FmpV-c<*N=@-J1I!6)e^ii*{b(Q>>3G$6I_9nnzmS$yD{NBc=};eB(Y8o^|j zpu3OrqLswCOPq!TF?nne%s~d7S(HAGa^%_6anTB}I&rMZ127*qCMkHZe7k$1KUcDC z0SXWKDB=pAZa{a}acqUcF&rh3bG=@Umut-lDCsgzuA-8NHBcX%XJG3D6fS(DuND;D z@)rUs>SXZ8;3)*ySB^2DqaDovW($Ud9_~4|_WZ%Nk_vot>#G7w5ptdgO+rs=;*W0} zlL^tph~OUf?C1%%4{YVTsVJDD^AIaVKjh#ZeodFR=tcf9_A`dRMgQJJD!5d`Ryfjp zLovm(g5|7>zEbG9cDi3aJ+K@1D5bygu;GYE0)oMjqV8pw#yC|*;00|BNZ8}{h8LzM zJ26Q0cDdSG^XEfysVHY2sTB?ApCX;`v#S+07Vb~iF=s^n94hOxE=}$ik46)exT#5O z__dj1IJm;0J8)eM=#PBx9&4DqK{*L=GT&H4Sp**66S*lAn@S)&6_s#yptAf|)vtnA zsPLTwAGqzw+gWPdrKR)_{6kD@hwdImh6jsu$}JaKz0Rk$anwkDD#Cl51 z^Z?|9>NQjMuKkj1hpmc+Gpt!fc1Bte$)c>8YV=30*2rx_sYx%M5ko_=AfOAK&a6|~;X zQ$Oc8boqu*$IetHt*Ll;-dMpVXs99ebAuxtKKp730aC){eI0m4U5n4|t}6uz=c|#@ zP#pFJ9|C4!?;o<)k@RQBTrU#i_!Ju$ITvuCR5B#Q3f&zdjNMrAxN;Sdmg#jd%LlTm zwFEQJxPOIyhZ06BQ)nR3I>;Mjs8vgrYQ!hl5VUE(uiIObF|Lr$5LiL($_lpy5bR)-GH8hJZ7@FR^Om)xTXJY~umwg;zVlMsbvHqlsh!)!%V^Vg`@SjV zH8&Ar$&LQcsC#dCyOc|F3+G1fO5@E4;6_Z8EEa!0IrcgOloILfZA#bfU`w%YM*h~$ zNXI2DY`6Sx-ZVqmr899O>sn`*kyJVwc`D@0Z0DoxjQZd}Ew*$JOq=Yt<^5 zb5@ao!M6@X>Y4fL-q_`^kOiOf*RHc8<<$~7?h%Cs2h3{YLb34N5qjO$qW&^`G=5mm zIB!0s^|MhJV8a~`V$toACcWsD?bRu-@8X*oMD47Tg+HQ* z%|?M~iN_@tG^rL%6)F-&6{kh`O*T^}=YA$yfLWi36HNnwZH06%OEYYIhcC61k_K^a zsdUR7QW6OP59+2hwaIXD_Too|Q8`o9f`QN~q5NH|afT2@H34Ks)wfQ}vLhg|P?nO? z4*L?vneBaWo17cT^e$s!K9UWk#3yhC3T|Cni?hGW1ZpmWavEAAPiqvxpZa<2IkZXu zLpU_#!kq?8Y=P{2t6u!bNacB!MJ6kfz&u~G@BSY!^*BBJeZiViL#%M~Y`|HY(etf< z#D8%PQ?=|b2P2Lh1GcEAioD$=L)aZ&HTJ3IHx^pR{eXK=4gir3nYHJ4OY#JMGe;gn z`UN5deJOy~?0YW21fr!vVVM9Pq3bo+=EdMs-K^$@59nCx(CK6kw8?(`#TAkgoS@sd^#+wE4|8 zO;Get>kR>9WW+bED>9#u`^YpXtDD3sb2VM2FPOh2VgI-woG}TuXOu{%I$h|Nf@MXA zhzT?k0(Wy-N=EJ~bIAIO709#aYUbKk7EqSjdUh^wHrv;8dz#+{wQ5keTN=kq0{}0CfVJjEWNHI5fXWhG|Fv_r8q5Rn z+hFfdIJVf9Ox}^@r+jWT25dE~a84S-ABrnxe~i5oHx#GhMh?=Ibm!R$;6p@jPNOPh zv85PH*>$%}46c84oU`NkD=yjh$k%WhC%p4iGK(NNa}-{49X@6I30&YPEtqNeYqxIh zwrqf;B;A+nXmtm&^eQU22zeuNsC^>!LdrjJ0Q=k+m4{f)D;ff9C3%zB2c%Rf@G#7{ z#RIyatChV`{%;pRw;PyxPDXwS)9cQ-sD_${ zAK3l%F`GGkb=n*h9l(MHV>cix2U;+P#E0qa%|bB=59oRYbewyvPd}gRqHYAp|N2r- zdy-J?E)>!p#5nRHUfF*VH4L`oSzyt!LPM_s!;d~6^cBZFN|D3dciJ5@*6fcuO~he> zG08Na)s(dH5Cr}dYN$y-ECizpl-jlQ;P3WARcNw8t~A9_`pv}CoXbpJ!rmaTF&FD>-mvU8KJ?iUoba zNEy{kejWm25Kuh%{omzQwR3(j%QYwZSPO(c5nu*L6H4o=Uvuz0Q`NzVJ1lMKT8Dnh z=rLE!_I+veIe$hp(#q8+C?RC@LA?htp`ss5(LJ$<8S<+FSsS$c$6QN{H#_!O#b#xaY$S=64G-C^(nu$8 zXR$03@HIFxK@W?i}>8WC0$&`Rx?{dTT5zXmA4v1t3--%2lWaDgBQ)!)hrl_>#%3CmZn*{-W=)a-Ox ztEVMo*z$d;#+HJ+%=*t>frUja;r*=XF)#?mRiKYQv^Pb|N<{OIZmBNgF9VLDXc##q zYEL-g3K|?V4hTz9=EyQv0@f)-%t#rY;4jzu%U#m&X&h*Ukj)|M`)aX~@Gxx{<)j>0 zWWXC^G>#9qv8G~6&Cw(4ZZ=aSt}JO#P}jYTt&0ZN;aJ_Nc8 z#02ynWZCrys5l*54qI51A1mfk(5Kpk&j1D4Y;6iB3fy6`l7`c6ss3NwYf(k*>h+s( zDXJgRn&t!wW1lf7STKQ;3Nn`2^#Oyoy?LdISm6)>>wHzEb+K?gpBx4~kJ>9KT&Va6 znO5v-0XWq-9iSJSj@!pW3nN0j>*{>2oNFSXZ)4_Ci>qrk;!@0!ndX2BaG z4-+uONKB5V_o6ix}@Co4;_HRcDS#@Or5NE)KpTLLkncT&z zEoLOK0c0@V*1rCcbFFBBI^m5Mt*ykWg*5Vb(grG0w6IqI~ri+VWdQ zSG1`E^5AnQO#Wesmu_h*#a8`TQD?elY3aV*;pYWi*JdS74B=4VqITXhZF3 zSzs)lx=d4ksCfy&$XQTKW81pzb257pS|fG>ToiSG2-pi!(M_l=N@kz4)eTj{HHIC; ztujX14)p4^q_%y6tf*OTfXjmfE%YSgh2^m+y6X5?pQ8 z@!?@xb>4yNfU{p3M85Wv4$T|RL~j?CHQR+=jaDwTn$wYD>b!BY@GCR4`T>O&rZtoa zrRrT?9+_A?tY1PB8X?|t+&&y~@z)3c#8{*xToU>Ge341#fdlzdsr-RGJ~ML45EyOr zWRV~~P0{BcFs&+1KxmTG2V){+`~=5U;dETkK#jPtfc^(@J-BdC1)sra2H{B0+MM4e zpUz}l3pP`^9g_@Nv%kg2(CrdVC+LWv)9bc*zxDy$74DdNPb|Z=QE7lIB;-d2+`FIz zTDol{0Ub;{4=r9WM|PQ@=ahQM=%#hPfcS-)Zyw;1ZX|R@;tvr^y#@;q9c{6vu8RIL zM&cYXy49O9YNa_CSm}y%M?yDE@?ggjQYb$zJX*rv2g^XDhbYYQ2osZlND*wIHN$Lj zCO*4l-Tsns-I32%XH}(&sd3lvE;J|+;o1;i={v5Adsnmgkx|I+blr8u;hG8;)36l} zI0CU@OI>hhz8dna1;IZw_M$O(<*nV{kh~t+*n9tC`84J#ycXoGJp+~%{Qqjg0Qj8T zuY64R!W0ne18$jmT1@Nh-x0gl$_eNd%ZUM56(u>ouq_8fjD%+_lwgsP0W&T4iQ`OJ zBVpJ`SL5Jqj+v;BRF`a|HGdi_O@jr%)XqQMc)|}9{Z2$40R1*$+oQC-iaz4h{?R5A z)R4D8B3kicxuABromBcFmF;mjmtypWz1qEqVmUdHnw9bkZr^0$xDW3Z1u_-ls^`5K z1V4xt=r>+nIe!$`oKzTWgR^0n)j4lHU$3sIq98E`SD3iQ0Jj7J@B><@%P%&XW7e9R*DufX8;Mi^??uPG6Zhl{Qt(p< zY2I~@JoTQ%_hpGJSgPos3~68&lHcVtkdisRz^++xV7_FmyB*ti zJ2s&-xpYZFzKRi4ib?t0bNzq$E8X)9Gw~wmfjow4VJdX#r{hzQ=DzE!xvQhOhQMv{|q{H+!v$ zbIoz>;~XQP1Qrg!&FtKP9`VI#f{7EFX5@dz(FGJhft=jJ6|y~Df;p)MUV{E7 z9R)(>?lQUlC+UmafX&m3Aj}N9%6TQk)`6@mYZbz zX2aggVTIzIAa`*rB!oAYo$zXkwOM`Me@d?qTz_|R*ei4bg-*MtDw6p$6rP+oec3oF zr2f`FP*eHLws3{J51L;@lIs^buG&l4CzM^~p^-uG{Sp>{$4Cf0h?{1}5J4~EBxEl{ z$A_l?VcVO}jrc6zeztpqrk{lL(mEld{MCK*ld+udTNblVio6+OuvnbML`X0;1=e2L{N|Dnlewgg|PA{_jOMX-S3cbl?$$ z;cxe^-OqNk6&JABG*0&-C7urer&sUOSzu`>_x23CUp#M4zQZS?5)?224&?e|i2>;f zxvl2^{v3ZpQor#$$`Sv4rnPpbtKt5nr>l`W`vqA!lSM972^kgf^BNqg!!N`Ek0MP> z!!wAzMW@`hjaJPrBTlP1yB^x5%Vce9sv&@tVgJd~FxC2%)res+_`f^jpbR)z z%7j3kolo3xX659J&txb<#DfMc_g2AQ8z=YGmqnO>rO*T$kFV#Md~d5FKPCo{xuMqb z@k0r4m|oV=zzBHz-#)K@1cU<`ApUnANBQpMpQ9+Hjn>C0=Ca)zaaEY}&$N8~x45qs zJbc~i=;$Me=NDT6g{Y#qe<{Z%Rc1MVJ4ltOkM91HWmV>!WlFQ|~P&i@&pD+}FEM@}`q+kds?dCKCvv-xt< zuwC=kfIp5@s@lvn;dRl;Gq9C{uX}b53lmM7VfUZ2&|f8mp*D0d>B@ zHYxhEjYD}K)#v|RAzVtpMG!g$vS|;58cm)pC^_}DOO1AY@kuowHzcuI@a;?&dD(R$ zn>d};TpX{pXSA>AF5;8x)wWw6>BH08X{X#5rxW1(lj}Yqp8sD7KZCB2##7k5of9Z7 zw6U&W@Z$kD6r3Lk5SJb#nlHXl`}D&E3xiBaP0q^bRZ=3uO?a& znXL+V=h^%9Fm1Q zWQj2L+ihf&o6bX1P>=9m_fBB%&74W^V@2i>nja+GI9{F~gubvl^sdTGsQGL3FX$}N zKpFd@trGdS@7ekIJYTDR@sr+C?bOBQZji$)Q_3tpjzh5y15XV3e z;{lQ3DOA-G5b?%RmC+p5Ce0L*K_&ga+$lXo4yLcgfQ8LzEW8o|Fuc+H7x(I|zp;YD zhiDdC40TGDE@0%SB^~Ju)LQ$cCB8~<8w@;dX1{L8Q{O$h`KCnqwM^G#&{8;HzEeZ_ zi)DfpYMs=2p4t-Q5$KEbPzUjvT=VOXPj3RgSF+_g&_V%2LM9B*Y-Tw)n2E_!LR()! z{5L(llgN`p)Lz*wyM4JzX$?|y1!>gFrezrAv#8YcWbZ=^@6%hj{(%&J`(fmA`46+= zWP)j&>_tVTsM*EWVOTx`VZHS#wbUHQf{@}8e-x04z7WC0;KYm2;pMIiaW{{~>tC`e`eKQpgp zwtF4_S)LB;ZzdSi#ZxlZnPb7=V#hNLdg6}W3YY7!EA z>hFq*_eg1c6xdmv*(E7t`;_W@Bg$+Uh}uIYW3o$uOM>2)8J^v3<;Vp8Py8Yl=C=`T zt;mt4G9GPFEcLs&uIl4&^3O8EVayMfQ7ku5(NyWvMN+l($;jZbR9Otv>b8!XNiXL& zJKw-Tqt;Akfwy@_JTi3iKaO-_D_O>e?q?Cnx-I-(oS9&7|9Nl+$w`<lZY<%(TIL1cPA}6^&Mn z%;t+n>?(+W z+l!Xr6PLi`q{I@tdE2%!x$uhs7@7$rpJWt$%-Q|B{qJ(%8UuosP)99}3hR%v+l73u zt}d57+uLNnGvjfsr?#yYD0u3Grap#Cz*a{K(`~xxM%(jdQEfTZqos`?LIVnEHkeEx z0ZL3280{F{a#5r1Tk#35sE=6ul-^A-QzH#KZU24-%&UcU+p0JAI&B};ss&@@;~mi0 zdpi8hZOI-`W{Xg#f_JN~D_z%RU`|YnCa{zxAs(ZxkC)y8d40~k*2h$c+QEGI@oGb4 zWj$L-L?y`G^g8skWP7{%!$^#|kb=&M9Be-a%J=3@nu}g50(|HBVju>ySuSj%9=Dz= z`4^ZrS{}PESEbT;3yXi0#ld`?eqhK>Bk$)$w;qYL_(Ms92}g^IPzf;h4TE-sUVNIZ z$eF&x5CNYelE(bzpv1af_0M8J^>xdtQYGfw|CIz4XkAx>pp_!(?=Q|Ko|N2%@`Y-A zP|`g~R-G}$_q>sKNU1BBW>-Do=m3<~R^5RFbi;}E1%PT{!Adl7qHfL1^^P!O zQ?*F4`qlUxD%->AXtM>DLJZgoVJ9=F!C&=W6-skZXuV5BTEZbpNUp`xqaGhG1ItM| zoleQ?eA0fGVHS5PA`Bfk-UhvhF!R2OMIYd{9!zdgM07oMH6julCKc(~@G(l?i=%r^ zn1;(!{bcImgU5&gZHN`zt~C0%Q~vr_mb{M>WeRs)N`FTA)}g3`J%FGruX$mHh|0?C z565O}074^VE&$C2H6L%mZUsIpD%O$+>R-eLV{$H5JRK|K6{Vi%@%`{ss`GiE z@Tt*eH)5?UmnPJZQuMP6*#HeSooD1uCd~0!@@XKblyj}+RD%G;IddvgJOyVN4$`(8 zJxH_34SqZns;)M70>fmNlrg}|5wBi=f-FzMk(=l#g@;NtaRZ3SQ!IfGY0 zauY}jhKSKE#jBve0oWM^Qbz@9BfZ`G@V0(L?#_;R+~7uEPenn8eQIX;Y{7-(V!w=QEkr_hyn$db>)bte7cLoNIHG_Sp3$GKi&DRp%PT`K{DS6RUXAK5MbEJ&PiV6M<-7&5wN)ImAPjT9s6vY^d=-p?>sQc8cWr(k$ zcCzsVA*8v+NmnPM2jNo{v<5T;L6LrxYxTod+(NBRFPDS&O-1RpfLWO^UPj5ylJ~Ds zv688Rd;c0t$foZi#}+PDpd+cyv`!Gbv+Jh1y}4>n6oSDZlOw}Hrm7Ot&mbC{Jhvq~ zU@h^&6+wem*~*uDk0sy)aVgtaW|?YUEVi5DM?6LY1|2DM@Ol3)3rEvHu?+d+u(!2m z@vCI~94+jA4TAs>NkPY`jOLonEFXqL?Wyc75M0D@d3{m{*#C`ilTBNrY>oFZV4l7| zl4-=j^|(aWX;$+Z=`yYTdCJM?`xnPO`Oukj_bZ2hcSk~fUswTml<{spBo-)^XOXwV zJsJ|9i>pq|PGr>V|J9vQU zKz{u$O!*u(@eXLFHlhCUciq;$7gT_FA$HaUGnk6Cpu>cYSm>5WPMmZ*Uwg(>k(Ht@ z`l4fwQWALKs2bTd^{xxcpNiH;1lKJG5Kz^R-I1$fawMy5j)&_fNuFQEP|0;T&16o6 zkBpLoF0RQP2jF|Gd#h$ok(<1lKXvf=(9+~3#>Yw&Yjjt=t8D%^i`yFl5k{=NTN2^z z^U>G*qkT!cdmFi${MHWp9{Wsxf7!ODiSF^lXZ0j1`BN|fMrXjAz#yClv~(UmX8eQ` z|C=!Qb@gU~+Cp(GL@2lT0_aH*CIk3woDPN1UatoC9lm9*uLP(#Y#*nyw&2V76T=g;ev-?tav=KX#OL%Y=9+vyKlv`n2;=w zp@VN_RcQqIh!ym>38h+lZC$92lmLr_(pvh9x9w%${WV@Q4d#jo!sq~aqDdG$?F3aa z;OFG}e#abuT^9p(oW!fmpl;^Z!|`3CAb2tM8QqVlBK>DcSTBmscR`If!Do)aa}%n~ z&DwUATu^EX!i#XTN)?c6?WPXH|Gjsla3eaYCq)FN4Dk?Ntnep69Tu0$fpr-mQucIx zZGuOlS?+4Q3~|XFCK?P_v2Wv|q=lx!@y(Mwo2?FID@Il(zNO{@^gISy=y>W?r(R*T zD-A5%DFELeFpdOf0)$R@Ex?X}3jk0azE;|#2zfr;-b|dDD{#`Nv#_rf_$XVYK~p|t z4c@KnhP3NjB@<|lpjaxhMNq3A6irY3e;gtj!q(fAyVzS&h+Bh)GcJXybl?P)C8!pQ zTBAtnck(v#0#T3_DRPz%!ys3=+*~q7C8e`Q8pED3T+o(F8G{NY{zL6p$jjl%+jAz# zGbB&Wdj48zivu6n5R>2Dy@IFUAGn4D3HD(TI=v{qpbtWCo0Y*21ohKprUmMAq%MP1 zjH!>kTaOo4jy4K#{_WO1D~SH>ZLa)c>xOmCjJ}Gg|MjxUXr$)i&;2kF@O}f+5FoX` ze``&g;*EjCIJ8b{$d^TYobkNeKS?HvNg;w{-D1xdrJSfSBFf~W%-VClAD+QVlOc@H z#lTEFEdw)=y8Y?Ol_37kx?w#ql4AnV>J?}1<|^Zb4% zOwH1h>HmPUqLL_t0po^~&2AJy3bWyJzft9S=T|d}(N#;WLLkcwt|a^lBHB{>yyLue zWq;H>!ehTltMPCVc_G@D6B(+#)Bij~EE+=c&RDQV9J2ufNC!`1#6ngb90vnp7VxPF zkrmC992E}(i)toFxt_M}`I&5uLW$}9&kqFu zo){^-fz}m8#O;elJp1?0m2mupfTdiHeSAyWC~idVV0D-ZCj4I_5m*_v8X*u#beMwZ z0epakI>D$4f0q~Vyl@beVgNOWMy)_L9H{?+4Fk@Yq)ixp3fi2$o_L0kHjG4QjuQTp zkp=Z-a3s7<`lsJQD>VM(&>mmSIa-@k=s5*TSnS_sN3gmAFHk6Cp)P$lFCFO^Q>MGO z`>Tl>C{-wJLJGvMxPK{T^LZWh$cY&TPL1qeM76_@P04X_-nj@Ij+t{1R_S?`XVvgty9_Y?{N#kzfwRpPn*|)9-;`gOC<}CHrWNuK&wwQR;nC@ba;3!7# zs1mWyLFT6>VmN8}x@?_1Buumo0+jbxqSed*A@7V@NbOqF?7LBv0H%$wj5DO{V+y?ql?Gif2;n6zIw82X$WvANTJaLOr4hs2NCh)cM9TKI0-)A}E5 z;tUUNbo?BqI6TbzMlFzo0Ynk_Zq1V2pqvOacm23QqezB8VL`GuM%@EBr;XtY zP=@w8&0zc*4_Ir1wA%?`nJuyfNe>QA6E()szJv<611kYxA zZ2ya@S54i$m&c_*-jyHlm4f}!0E61R4-3HcR1(gbatk6OdEDF^~ zc!7r}(L&iw#n)wQsaNkli7UeF2K+5XF~+X1zh<9{idtFta&tAV!U^tEV}E)dKI8;{hs^F~9IH(p42@$nBIAG<$8`}wlMlfxrePm95P^=`hPK;%#BSNoHUGPn zQVoIk>IGbHUQI=~rI8xN#ltkIm3X`O$9_MiNkgy@N2sHH`uE?EIVBVzL^mrVz$m|L zLVnkXhu8WDzkVqf2N;}hAX#hJTD=d-<}5t0s<<62a-Te))hiloYb^d@T47#=VtZOVk}fNd)<3>@+?PPIQ_KbfI4Nlfq!r4` z(iG|kdN5(gfn;q@Uy(F4Slf)00|I4S^yexHn1g5@l-p3C`Ui!1u6G zQqxrO9yU+`n}1`Z>D=ts-1kY|9AEzwr#`52nEY5*xrGz7dCs*sZ}LBVMDyxsSNBk^ zndIl%DL|=&sS!AdKhKA4qyH~_DwF$dp5Un|rSs|6G?e@_)C$VtC%3N=ZQiyjr28=V zQ(TqGlQs^}4UGas5Mh${m*%3q1|j5P&xXjzhiz<@N%nk7m+22TR)uE9TQ~fuerl$m zq1u9wkX;wBG^Bz$9X1UC=$%erHd&e+ld`Jaj4To2u&|J6|c zvIYeN6aWrLLWzYY?@wp}eTj0ro^fd++ibWgtf@>=h(eWv!NJFq_D_B|##(yg zYjgOX=rjYhzhjTqy%1XO63y_>)>^LDM-MH8Ax_u*8{glhMiktn{7*2wsZ9#80-hJO zGitv+n|RIDXQH8`RV^d>#T!mQ8DBkLHCvG+Tf16U4%`+Qzl|rn%jD0ZqWKR!VYvWq z!uy@M%v@S0!=X|LFu+E9K<7|KBCq^2f_+}|IWK6|3r(6ZZ;EZc!41pn6I(YrjdU%U z8BJaLw℞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�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

UvKzx()QVjW=o0~*5-ZAhuhg2Xf( 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 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/config/Paco-Info.plist b/Paco-iOS/Paco/config/Paco-Info.plist index 81aee8fc5..3e3005a6b 100644 --- a/Paco-iOS/Paco/config/Paco-Info.plist +++ b/Paco-iOS/Paco/config/Paco-Info.plist @@ -2,10 +2,6 @@ - LSApplicationCategoryType - - NSCameraUsageDescription - Used to add picture survey responses CFBundleDevelopmentRegion en CFBundleDisplayName @@ -28,12 +24,29 @@ 1.1.8 CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + com.googleusercontent.apps.619519633889-f79aogqhj44eut1u75e8jaa5eav8p3eu + + + CFBundleVersion - 1.1.8 + 1.1.8.2 + LSApplicationCategoryType + LSRequiresIPhoneOS + NSCameraUsageDescription + Used to add picture survey responses NSLocationWhenInUseUsageDescription This app will display your current location + NSPhotoLibraryUsageDescription + Used to allow the user to attach a photo from their library as a survey response. UIBackgroundModes fetch @@ -42,6 +55,8 @@ armv7 + UIRequiresFullScreen + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Paco-iOS/Paco/resources/paco32@2x.png b/Paco-iOS/Paco/resources/paco32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4061374544e629d80c7f4bb963183dd2364f732 GIT binary patch literal 7802 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 @class PacoMainViewController; +@protocol OIDAuthorizationFlowSession; @interface PacoAppDelegate : UIResponder @@ -27,4 +28,12 @@ - (void)processNotificationIfNeeded; +/*! @brief The authorization flow session which receives the return URL from + \SFSafariViewController. + @discussion We need to store this in the app delegate as it's that delegate which receives the + incoming URL on UIApplicationDelegate.application:openURL:options:. This property will be + nil, except when an authorization flow is in progress. + */ +@property(nonatomic, strong, nullable) id currentAuthorizationFlow; + @end diff --git a/Paco-iOS/Paco/source/PacoAppDelegate.m b/Paco-iOS/Paco/source/PacoAppDelegate.m index 27148b284..5541ea948 100644 --- a/Paco-iOS/Paco/source/PacoAppDelegate.m +++ b/Paco-iOS/Paco/source/PacoAppDelegate.m @@ -15,8 +15,9 @@ #import "PacoAppDelegate.h" -#import "GoogleAppEngineAuth.h" -#import "GTMOAuth2ViewControllerTouch.h" +#import "AppAuth.h" +//#import "GoogleAppEngineAuth.h" +//#import "GTMOAuth2ViewControllerTouch.h" #import "PacoClient.h" #import "UIColor+Paco.h" #import "PacoMainViewController.h" @@ -149,7 +150,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( } else { self.viewController = [[PacoMainViewController alloc] initWithNibName:nil bundle:nil]; } - + self.viewController.stillAuthenticating = _currentAuthorizationFlow; self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; [self.window makeKeyAndVisible]; @@ -175,7 +176,7 @@ - (void)application:(UIApplication *)application performFetchWithCompletionHandl - (void)applicationDidBecomeActive:(UIApplication *)application { DDLogInfo(@"========== Application applicationDidBecomeActive =========="); - [[PacoClient sharedInstance] uploadPendingEventsInBackground]; +// [[PacoClient sharedInstance] uploadPendingEventsInBackground]; [[NSNotificationCenter defaultCenter] postNotificationName:kPacoNotificationAppBecomeActive object:nil]; @@ -218,4 +219,24 @@ - (void)applicationWillEnterForeground:(UIApplication *)application { [[PacoClient sharedInstance] executeRoutineMajorTaskIfNeeded]; } +#pragma GTMAppAuth +/*! @brief Handles inbound URLs. Checks if the URL matches the redirect URI for a pending + AppAuth authorization request. + */ +- (BOOL)application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options { + // Sends the URL to the current authorization flow (if any) which will process it if it relates to + // an authorization response. + if ([_currentAuthorizationFlow resumeAuthorizationFlowWithURL:url]) { + _currentAuthorizationFlow = nil; + return YES; + } + + // Your additional URL handling (if any) goes here. + + return NO; +} + + @end diff --git a/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.h b/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.h index 285e9aacd..4049bf9fa 100644 --- a/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.h +++ b/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.h @@ -17,17 +17,23 @@ -@class GTMOAuth2Authentication; +@class GTMFetcherAuthorizationProtocol; +@class GTMAppAuthFetcherAuthorization; +@class OIDAuthState; +@class OIDServiceConfiguration; + @interface PacoAuthenticator : NSObject -@property(nonatomic, readonly, retain) GTMOAuth2Authentication *auth; +@property(nonatomic, readonly, retain) GTMAppAuthFetcherAuthorization *auth; - (id)initWithFirstLaunchFlag:(BOOL)firstLaunch; - (void)reAuthenticateWithBlock:(void(^)(NSError*))completionBlock; -- (void)authenticateWithOAuth2WithCompletionHandler:(void (^)(NSError *))completionHandler; +//- (void)authenticateWithOAuth2WithCompletionHandler:(void (^)(NSError *))completionHandler; + +- (void)authenticateWithGTMAppAuthWithCompletionHandler:(void (^)(NSError *))completionHandler; - (BOOL)isLoggedIn; diff --git a/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m b/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m index 57acfa405..173de5ebc 100644 --- a/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m +++ b/Paco-iOS/Paco/source/core/authentication/PacoAuthenticator.m @@ -15,21 +15,46 @@ #import "PacoAuthenticator.h" -#import "GTMOAuth2Authentication.h" -#import "GTMOAuth2SignIn.h" -#import "GTMOAuth2ViewControllerTouch.h" +#import +#import +#import "GTMAppAuthFetcherAuthorization.h" +#import "GTMOAuth2KeychainCompatibility.h" +#import "PacoAppDelegate.h" + #import "PacoClient.h" -#import "SSKeychain.h" +NSString * const gtmAppAuthKeyChainName = @"PacoGTMAppAuthKeychain"; +NSString * const oldKeyChainName = @"PacoKeychain2"; + +/*! @brief The OIDC issuer from which the configuration will be discovered. + */ +static NSString *const kIssuer = @"https://accounts.google.com"; -NSString* const kPacoService = @"com.google.paco"; +/*! @brief The OAuth client ID. + @discussion For Google, register your client at + https://console.developers.google.com/apis/credentials?project=_ + The client should be registered with the "iOS" type. + */ +static NSString *const kClientID = @"619519633889-f79aogqhj44eut1u75e8jaa5eav8p3eu.apps.googleusercontent.com"; +/*! @brief The OAuth redirect URI for the client @c kClientID. + @discussion With Google, the scheme of the redirect URI is the reverse DNS notation of the + client ID. This scheme must be registered as a scheme in the project's Info + property list ("CFBundleURLTypes" plist key). Any path component will work, we use + 'oauthredirect' here to help disambiguate from any other use of this scheme. + */ +static NSString *const kRedirectURI = +@"com.googleusercontent.apps.619519633889-f79aogqhj44eut1u75e8jaa5eav8p3eu:/oauthredirect"; + +/*! @brief @c NSCoding key for the authState property. + */ +static NSString *const kExampleAuthorizerKey = @"authorization"; typedef void (^PacoAuthenticationBlock)(NSError *); @interface PacoAuthenticator () -@property(nonatomic, readwrite, retain) GTMOAuth2ViewControllerTouch *authUI; -@property(nonatomic, readwrite, retain) GTMOAuth2Authentication *auth; +//@property(nonatomic, readwrite, retain) GTMOAuth2ViewControllerTouch *authUI; +@property(nonatomic, readwrite, retain) GTMAppAuthFetcherAuthorization *auth; @property(nonatomic, readwrite, copy) PacoAuthenticationBlock completionHandler; @property(nonatomic, readwrite, assign) BOOL userLoggedIn; @@ -52,41 +77,26 @@ - (id)initWithFirstLaunchFlag:(BOOL)firstLaunch { #pragma mark - log in status - (NSString*)fetchUserEmailFromKeyChain { - NSArray* accounts = [SSKeychain accountsForService:kPacoService]; - if (0 == [accounts count]) { + GTMAppAuthFetcherAuthorization *authorization = [GTMAppAuthFetcherAuthorization authorizationFromKeychainForName:gtmAppAuthKeyChainName]; + if (!authorization) { NSLog(@"No email stored in Keychain"); return nil; } - NSAssert([accounts count] == 1, @"should only have one account!"); - NSDictionary* accountDict = accounts[0]; - NSString* email = accountDict[kSSKeychainAccountKey]; - NSLog(@"Fetched an email from Keychain"); - return email; + return authorization.userEmail; } - (BOOL)isUserAccountStored { NSString* email = [self fetchUserEmailFromKeyChain]; - NSString* pwd = [SSKeychain passwordForService:kPacoService account:email]; - if ([email length] > 0 && [pwd length] > 0) { - return YES; - } - return NO; + return [email length] > 0; } - (BOOL)hasAccountInKeyChain { - NSArray* accounts = [SSKeychain accountsForService:kPacoService]; - return [accounts count] > 0; + GTMAppAuthFetcherAuthorization *authorization = [GTMAppAuthFetcherAuthorization authorizationFromKeychainForName:gtmAppAuthKeyChainName]; + return authorization; } - (void)deleteAllAccountsFromKeyChain { - NSArray* accounts = [NSArray arrayWithArray:[SSKeychain accountsForService:kPacoService]]; - for (NSDictionary* accountDict in accounts) { - NSString* email = accountDict[kSSKeychainAccountKey]; - BOOL success = [SSKeychain deletePasswordForService:kPacoService account:email]; - if (!success) { - NSLog(@"[ERROR] Failed to delete password and account in keychain!"); - } - } + [GTMAppAuthFetcherAuthorization removeAuthorizationFromKeychainForName:gtmAppAuthKeyChainName]; } - (void)deleteAccount { @@ -94,13 +104,9 @@ - (void)deleteAccount { if ([self hasAccountInKeyChain]) { [self deleteAllAccountsFromKeyChain]; } - // Remove auth from keychain to prevent future auto sign-in as (null). - [GTMOAuth2ViewControllerTouch removeAuthFromKeychainForName:@"PacoKeychain2"]; - [GTMOAuth2ViewControllerTouch revokeTokenForGoogleAuthentication:self.auth]; } -- (BOOL)isLoggedIn -{ +- (BOOL)isLoggedIn { return self.userLoggedIn; } @@ -117,70 +123,102 @@ - (void)invalidateCurrentAccount { } - (void)reAuthenticateWithBlock:(void(^)(NSError*))completionBlock { - [self authenticateWithOAuth2WithCompletionHandler:completionBlock]; + [self authenticateWithGTMAppAuthWithCompletionHandler:completionBlock]; } +#pragma mark - GTMAppAuth -#pragma mark - OAuth2 +- (void)authenticateWithGTMAppAuthWithCompletionHandler:(void (^)(NSError *))completionHandler { + // Attempt to deserialize from Keychain in GTMAppAuth format. + GTMAppAuthFetcherAuthorization *authorization = [GTMAppAuthFetcherAuthorization authorizationFromKeychainForName:gtmAppAuthKeyChainName]; + self.auth = authorization; -- (void)authenticateWithOAuth2WithCompletionHandler:(void (^)(NSError *))completionHandler { - // Standard OAuth2 login flow. - // See: https://code.google.com/apis/console/#project:406945030854:access - - NSString *scopes = @"https://www.googleapis.com/auth/userinfo.email"; - NSString *clientId = @"1051938716780.apps.googleusercontent.com"; - - // ispiro: Apparently the clientSecret parameter can be empty and auth still succeeds. - NSString *clientSecret = @""; - GTMOAuth2Authentication *keychainAuth = - [GTMOAuth2ViewControllerTouch - authForGoogleFromKeychainForName:@"PacoKeychain2" - clientID:clientId - clientSecret:clientSecret]; - if (keychainAuth && (keychainAuth.parameters)[@"refresh_token"]) { - self.auth = keychainAuth; + // If no data found in the new format, try to deserialize data from GTMOAuth2 + if (!authorization) { + // Tries to load the data serialized by GTMOAuth2 using old keychain name. + // If you created a new client id, be sure to use the *previous* client id and secret here. + authorization = + [GTMOAuth2KeychainCompatibility authForGoogleFromKeychainForName:oldKeyChainName + clientID:@"1051938716780.apps.googleusercontent.com" + clientSecret:@""]; + if (authorization) { + // Remove previously stored GTMOAuth2-formatted data. + [GTMOAuth2KeychainCompatibility removeAuthFromKeychainForName:oldKeyChainName]; + // Serialize to Keychain in GTMAppAuth format. + [GTMAppAuthFetcherAuthorization saveAuthorization:(GTMAppAuthFetcherAuthorization *)authorization + toKeychainForName:gtmAppAuthKeyChainName]; + if (completionHandler) { + completionHandler(nil); + } + } else { + NSURL *issuer = [NSURL URLWithString:kIssuer]; + NSURL *redirectURI = [NSURL URLWithString:kRedirectURI]; + + NSLog(@"Fetching configuration for issuer: %@", issuer); + + // discovers endpoints + [OIDAuthorizationService + discoverServiceConfigurationForIssuer:issuer + completion:^(OIDServiceConfiguration *_Nullable configuration, NSError *_Nullable error) { + + if (!configuration) { + NSLog(@"Error retrieving discovery document: %@", [error localizedDescription]); + self.auth = nil; + return; + } + + NSLog(@"Got configuration", nil); + + // builds authentication request + OIDAuthorizationRequest *request = + [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration + clientId:kClientID + scopes:@[OIDScopeEmail] + redirectURL:redirectURI + responseType:OIDResponseTypeCode + additionalParameters:nil]; + // performs authentication request + PacoAppDelegate *appDelegate = (PacoAppDelegate *)[[UIApplication sharedApplication] delegate]; + NSLog(@"Initiating authorization request with scope: %@", request.scope); + + UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController; + + appDelegate.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + presentingViewController:controller + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + if (authState) { + GTMAppAuthFetcherAuthorization *authorization = + [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState]; + + self.auth = authorization; + NSLog(@"Got authorization tokens. ", nil); //authState.lastTokenResponse.accessToken); + [GTMAppAuthFetcherAuthorization saveAuthorization:(GTMAppAuthFetcherAuthorization *)authorization + toKeychainForName:gtmAppAuthKeyChainName]; + NSLog(@"PACO OAUTH2 LOGIN AUTH SUCCEEDED [%@]", authorization.authState.refreshToken); + self.userLoggedIn = YES; + if (completionHandler) { + completionHandler(nil); + } + + } else { + self.auth = nil; + NSLog(@"Authorization error: %@", [error localizedDescription]); + NSLog(@"PACO OAUTH2 LOGIN AUTH FAILED [%@]", error); + self.userLoggedIn = NO; + } + }]; + }]; + + } + } else { + self.auth = authorization; if (completionHandler) { completionHandler(nil); } - return; } - - - _authUI = [[GTMOAuth2ViewControllerTouch alloc] - initWithScope:scopes - clientID:clientId - clientSecret:clientSecret - keychainItemName:@"PacoKeychain2" - completionHandler:^(GTMOAuth2ViewControllerTouch *viewController, - GTMOAuth2Authentication *auth, - NSError *error) { - BOOL result = [GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:@"PacoKeychain2" - authentication:auth]; - //assert(result); - // TODO(ispiro): If user presses cancel at the final screen, assert will fail. Should return to splash screen. - self.auth = auth; - if (auth && !error) { - [SSKeychain setPassword:@"" - forService:kPacoService - account:auth.userEmail]; - NSLog(@"PACO OAUTH2 LOGIN AUTH SUCCEEDED [%@]", auth.tokenURL.absoluteString); - self.userLoggedIn = YES; - } else { - NSLog(@"PACO OAUTH2 LOGIN AUTH FAILED [%@]", error); - self.userLoggedIn = NO; - } - if (completionHandler) { - completionHandler(nil); - } - // TODO(ispiro): Find a way to hide this window faster. - [[UIApplication sharedApplication].keyWindow.rootViewController - dismissViewControllerAnimated:NO completion:^{}]; - }]; - [[UIApplication sharedApplication].keyWindow.rootViewController - presentViewController:_authUI animated:NO completion:^{ - self.authUI = nil; - }]; } @end diff --git a/Paco-iOS/Paco/source/core/client/PacoClient.m b/Paco-iOS/Paco/source/core/client/PacoClient.m index c3caeee89..f1c5cd0e5 100644 --- a/Paco-iOS/Paco/source/core/client/PacoClient.m +++ b/Paco-iOS/Paco/source/core/client/PacoClient.m @@ -468,7 +468,7 @@ - (void)loginWithOAuth2CompletionHandler:(void (^)(NSError *))completionHandler completionHandler(nil); } }else{ - [self.authenticator authenticateWithOAuth2WithCompletionHandler:^(NSError *error) { + [self.authenticator authenticateWithGTMAppAuthWithCompletionHandler:^(NSError *error) { if (!error) { // Authorize the service. self.service.authenticator = self.authenticator; diff --git a/Paco-iOS/Paco/source/core/service/PacoService.m b/Paco-iOS/Paco/source/core/service/PacoService.m index 000e53a54..b81b593f3 100644 --- a/Paco-iOS/Paco/source/core/service/PacoService.m +++ b/Paco-iOS/Paco/source/core/service/PacoService.m @@ -15,10 +15,6 @@ #import "PacoService.h" - -#import "GTMHTTPFetcher.h" -#import "GTMHTTPFetcherLogging.h" -#import "GTMOAuth2Authentication.h" #import "PacoAuthenticator.h" #import "PacoDateUtility.h" #import "PacoModel.h" @@ -28,6 +24,10 @@ #import "PacoExperimentDefinition.h" #import "PacoEvent.h" +#import "GTMSessionFetcher.h" +#import "GTMSessionFetcherService.h" +#import "OIDError.h" + @implementation PacoService @@ -41,17 +41,6 @@ + (NSString *)stringFromData:(NSData *)data { return converted; } -- (void)authenticateRequest:(NSMutableURLRequest *)request - withFetcher:(GTMHTTPFetcher *)fetcher { - if (self.authenticator.auth) { - // OAuth2 - [fetcher setAuthorizer:self.authenticator.auth]; - - } else { - DDLogError(@"Error authenticating request."); - } -} - - (void)executePacoServiceCall:(NSMutableURLRequest *)request completionHandler:(void (^)(id, NSError *))completionHandler { NSString *version = [[NSBundle mainBundle] infoDictionary][(NSString*)kCFBundleVersionKey]; @@ -59,35 +48,42 @@ - (void)executePacoServiceCall:(NSMutableURLRequest *)request [request setValue:@"iOS" forHTTPHeaderField:@"http.useragent"]; [request setValue:version forHTTPHeaderField:@"paco.version"]; [request setValue:@"3.0" forHTTPHeaderField:@"pacoProtocol"]; - - // Authenticate - [GTMHTTPFetcher setLoggingEnabled:YES]; - GTMHTTPFetcher *fetcher = [[GTMHTTPFetcher alloc] initWithRequest:request]; - [self authenticateRequest:request withFetcher:fetcher]; - fetcher.delegateQueue = [NSOperationQueue mainQueue]; - - // Fetch + + + // Creates a GTMSessionFetcherService with the authorization. + // Normally you would save this service object and re-use it for all REST API calls. + GTMSessionFetcherService *fetcherService = [[GTMSessionFetcherService alloc] init]; + fetcherService.authorizer = self.authenticator.auth; + + GTMSessionFetcher *fetcher = [fetcherService fetcherWithRequest:request]; + [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - if (error) { - DDLogError(@"Service Call Failed [%@]", error); - } - // Convert to string and return. - id jsonObj = nil; - NSError *jsonError = nil; - if ([data length]) { - jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError]; - if (jsonError) { - DDLogError(@"JSON PARSE ERROR = %@\n", jsonError); - DDLogError(@"PROBABLY AN AUTH ERROR\n"); - DDLogError(@"JSON dump: %@\n", data); - - [[PacoClient sharedInstance] invalidateUserAccount]; - } + if (error) { + if ([error.domain isEqual:OIDOAuthTokenErrorDomain]) { + //self.authenticator.auth = nil; + NSLog(@"Authorization error during token refresh, clearing state. %@", + error); + // Other errors are assumed transient. + } else { + NSLog(@"Transient error during token refresh. %@", error); } - if (completionHandler) { - completionHandler(jsonObj, error ? error : jsonError); + return; + } + + id jsonObj = nil; + NSError *jsonError = nil; + if ([data length]) { + jsonObj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&jsonError]; + if (jsonError) { + DDLogError(@"JSON PARSE ERROR = %@\n", jsonError); + DDLogError(@"JSON dump: %@\n", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); } - }]; + } + if (completionHandler) { + completionHandler(jsonObj, error ? error : jsonError); + } + + }]; } //http request to load paginated experiment definitions @@ -232,7 +228,7 @@ - (void)submitEventList:(NSArray*)eventList withCompletionBlock:(void (^)(NSArra NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData - timeoutInterval:25]; + timeoutInterval:120]; [request setHTTPMethod:@"POST"]; // Serialize to JSON for the request body. diff --git a/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.h b/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.h index 71d091d20..835ffc296 100644 --- a/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.h +++ b/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.h @@ -18,4 +18,5 @@ @interface PacoMainViewController : UIViewController +@property BOOL stillAuthenticating; @end diff --git a/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.m b/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.m index e7335442d..0919c9cfa 100644 --- a/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.m +++ b/Paco-iOS/Paco/source/ui/MainScreen/PacoMainViewController.m @@ -20,11 +20,9 @@ #import "PacoLayout.h" #import "PacoMenuButton.h" #import "PacoRunningExperimentsViewController.h" -#import "PacoTitleView.h" #import "PacoClient.h" #import "PacoContactUsViewController.h" #import "PacoWebViewController.h" -#import "GoogleClientLogin.h" #import "JCNotificationCenter.h" #import "JCNotificationBannerPresenterSmokeStyle.h" #import "PacoPublicExperimentController.h" @@ -39,9 +37,9 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { - PacoTitleView *title = [PacoTitleView viewWithDefaultIconAndText:@"Paco"]; - self.navigationItem.titleView = title; - + NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"PacoTitleView" owner:nil options:nil]; + self.navigationItem.titleView = [nibContents lastObject]; + UIButton* infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight]; [infoButton addTarget:self action:@selector(onInfoSelect:) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:infoButton]; @@ -140,21 +138,25 @@ - (void)viewDidLoad { [view setNeedsLayout]; - [[PacoClient sharedInstance] loginWithCompletionBlock:^(NSError *error) { - NSString* message = [self welcomeMessage]; - if (error) { - message = [GoogleClientLogin descriptionForError:error.domain]; - if (0 == [message length]) {//just in case - message = NSLocalizedString(@"Something went wrong, please try again.", nil); + if (!_stillAuthenticating) { + [[PacoClient sharedInstance] loginWithCompletionBlock:^(NSError *error) { + NSString* message = [self welcomeMessage]; + if (error) { + if (0 == [error.description length]) {//just in case + message = NSLocalizedString(@"Something went wrong, please try again.", nil); + } + } else { + //[[PacoClient sharedInstance] uploadPendingEventsInBackground]; } - } - [JCNotificationCenter sharedCenter].presenter = [JCNotificationBannerPresenterSmokeStyle new]; - JCNotificationBanner* banner = [[JCNotificationBanner alloc] initWithTitle:@"" - message:message - timeout:3. - tapHandler:nil]; - [[JCNotificationCenter sharedCenter] enqueueNotification:banner]; - }]; + [JCNotificationCenter sharedCenter].presenter = [JCNotificationBannerPresenterSmokeStyle new]; + JCNotificationBanner* banner = [[JCNotificationBanner alloc] initWithTitle:@"" + message:message + timeout:3. + tapHandler:nil]; + [[JCNotificationCenter sharedCenter] enqueueNotification:banner]; + }]; + } + } - (NSString*)welcomeMessage { diff --git a/Paco-iOS/Paco/source/ui/OpenSourceLibScreen/PacoOpenSourceLibViewController.m b/Paco-iOS/Paco/source/ui/OpenSourceLibScreen/PacoOpenSourceLibViewController.m index 3225068aa..6e8fe9322 100644 --- a/Paco-iOS/Paco/source/ui/OpenSourceLibScreen/PacoOpenSourceLibViewController.m +++ b/Paco-iOS/Paco/source/ui/OpenSourceLibScreen/PacoOpenSourceLibViewController.m @@ -76,15 +76,13 @@ - (void)viewDidLoad { - (void)loadCreditsTableView { self.creditsArray = @[@"Google-Toolbox-For-Mac", - @"TouchEngine", - @"SSKeyChain", + @"CocoaPods", @"JCNotificationBannerPresenter", @"CocoaLumberjack", @"ParseKit"]; self.urlArray = @[@"https://code.google.com/p/google-toolbox-for-mac/", - @"https://code.google.com/p/touchengine/", - @"https://github.com/soffes/sskeychain", + @"https://cocoapods.org", @"https://github.com/jcoleman/JCNotificationBannerPresenter", @"https://github.com/CocoaLumberjack/CocoaLumberjack", @"https://code.google.com/p/parsekit/source/detail?r=1543"]; diff --git a/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.h b/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.h deleted file mode 100644 index ffea26aea..000000000 --- a/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright 2013 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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 PacoTitleView : UIView -@property (nonatomic, readonly, retain) UIImageView *icon; -@property (nonatomic, readonly, retain) UILabel *title; - -+ (PacoTitleView*)viewWithText:(NSString*)text; -+ (PacoTitleView*)viewWithDefaultIconAndText:(NSString*)text; - -@end diff --git a/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.m b/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.m deleted file mode 100644 index 2c5a057f9..000000000 --- a/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.m +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright 2013 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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 "PacoTitleView.h" - -#import "UIColor+Paco.h" -#import "UIFont+Paco.h" -#import "PacoLayout.h" - -@implementation PacoTitleView - - -+ (PacoTitleView*)viewWithText:(NSString*)text { - return [[PacoTitleView alloc] initWithText:text andIcon:nil]; -} - -+ (PacoTitleView*)viewWithDefaultIconAndText:(NSString*)text { - return [[PacoTitleView alloc] initWithText:text andIcon:@"paco32.png"]; -} - -- (id)initWithText:(NSString*)text andIcon:(NSString*)iconName{ - self = [super initWithFrame:CGRectZero]; - if (self) { - if (iconName) { - _icon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:iconName]]; - [self addSubview:_icon]; - [_icon sizeToFit]; - } - _title = [[UILabel alloc] initWithFrame:CGRectZero]; - _title.text = text; - _title.font = [UIFont pacoNavbarTitleFont]; - _title.textColor = [UIColor pacoDarkBlue]; - _title.backgroundColor = [UIColor clearColor]; - _title.adjustsFontSizeToFitWidth = YES; - _title.minimumScaleFactor = 0.8; - [self addSubview:_title]; - [_title sizeToFit]; - } - return self; -} - -- (CGSize)sizeThatFits:(CGSize)size { - CGFloat width = _title.frame.size.width + (_icon ? _icon.frame.size.width : 0) + 10; - return CGSizeMake(width > size.width ? size.width : (_icon ? width : 200), 30); -} - -- (void)layoutSubviews { - if (!_icon) { - _title.frame = [PacoLayout centerRect:_title.frame.size inRect:self.bounds]; - return; - } - - CGRect left, right; - CGRect bounds2 = self.frame; - bounds2.origin = CGPointZero; - bounds2.size = [self sizeThatFits:CGSizeMake(200,30)]; - CGRect frame = self.frame; - frame.origin.y = 8; - frame.size = bounds2.size; - self.frame = frame; - [PacoLayout splitHorizontalRect:bounds2 xOffset:(_icon.frame.size.width + 20) leftOut:&left rightOut:&right]; - CGRect iconFrame = [PacoLayout centerRect:_icon.frame.size inRect:left]; - CGRect titleFrame = [PacoLayout centerRect:_title.frame.size inRect:right]; - _icon.frame = iconFrame; - _title.frame = titleFrame; -} - -@end diff --git a/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.xib b/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.xib new file mode 100644 index 000000000..e122735e5 --- /dev/null +++ b/Paco-iOS/Paco/source/ui/UIComponents/PacoTitleView.xib @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paco-iOS/Paco/sourceImages/assets/splash_ios_tablet_1024x768@2x.png b/Paco-iOS/Paco/sourceImages/assets/splash_ios_tablet_1024x768@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..4236620197ae6d29e2f87e66b2a401595461b625 GIT binary patch literal 60117 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�vLh28+*ejBHd#z{8d@xZSx4jlKq}*&s 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 GH~$wkeo8w4 literal 0 HcmV?d00001 diff --git a/Paco-iOS/Paco/sourceImages/icons/icon_ios7_ipad_152.png b/Paco-iOS/Paco/sourceImages/icons/icon_ios7_ipad_152.png new file mode 100755 index 0000000000000000000000000000000000000000..500d1f716e9b68fc3de22803054468b1e346eb94 GIT binary patch literal 14403 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 0.7.0) + - GTMSessionFetcher (~> 1.1) + - GTMSessionFetcher (1.1.9): + - GTMSessionFetcher/Full (= 1.1.9) + - GTMSessionFetcher/Core (1.1.9) + - GTMSessionFetcher/Full (1.1.9): + - GTMSessionFetcher/Core (= 1.1.9) + +DEPENDENCIES: + - AppAuth + - GTMAppAuth + - GTMSessionFetcher + +SPEC CHECKSUMS: + AppAuth: c56d352b0d50bb34dbb302d7ba50b20aa6b6ae89 + GTMAppAuth: 4b7bdc1fefdf6a49f3d9fc1aa6123f0c7e9b6660 + GTMSessionFetcher: 5c046c76a1f859bc9c187e918f18e4fc7bb57b5e + +PODFILE CHECKSUM: c665a47779f733e33fedc48ca8e7aafbb602f3d3 + +COCOAPODS: 1.2.1 diff --git a/Paco-iOS/Pods/AppAuth/LICENSE b/Paco-iOS/Pods/AppAuth/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. diff --git a/Paco-iOS/Pods/AppAuth/README.md b/Paco-iOS/Pods/AppAuth/README.md new file mode 100644 index 000000000..82e9fbf13 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/README.md @@ -0,0 +1,327 @@ +# AppAuth for iOS and macOS + +[![Build Status](https://www.bitrise.io/app/8e4dbca635a964dc.svg?token=8rT4oJnhjUuFWH-QvXuJzg&branch=master)](https://www.bitrise.io/app/8e4dbca635a964dc) + +AppAuth for iOS and macOS is a client SDK for communicating with [OAuth 2.0] +(https://tools.ietf.org/html/rfc6749) and [OpenID Connect] +(http://openid.net/specs/openid-connect-core-1_0.html) providers. It strives to +directly map the requests and responses of those specifications, while following +the idiomatic style of the implementation language. In addition to mapping the +raw protocol flows, convenience methods are available to assist with common +tasks like performing an action with fresh tokens. + +It follows the best practices set out in [OAuth 2.0 for Native Apps] +(https://tools.ietf.org/html/draft-ietf-oauth-native-apps) +including using `SFSafariViewController` on iOS for the auth request. For this +reason, `UIWebView` is explicitly *not* supported due to usability and security +reasons. + +It also supports the [PKCE](https://tools.ietf.org/html/rfc7636) extension to +OAuth which was created to secure authorization codes in public clients when +custom URI scheme redirects are used. The library is friendly to other +extensions (standard or otherwise) with the ability to handle additional params +in all protocol requests and responses. + +## Specification + +### iOS + +#### Supported Versions + +AppAuth supports iOS 7 and above. + +iOS 9+ uses the in-app browser tab pattern +(via `SFSafariViewController`), and falls back to the system browser (mobile +Safari) on earlier versions. + +#### Authorization Server Requirements + +Both Custom URI Schemes (all supported versions of iOS) and Universal Links +(iOS 9+) can be used with the library. + +In general, AppAuth can work with any Authorization Server (AS) that supports +[native apps](https://tools.ietf.org/html/draft-ietf-oauth-native-apps), +either through custom URI scheme redirects, or universal links. +AS's that assume all clients are web-based or require clients to maintain +confidentiality of the client secrets may not work well. + +### macOS + +#### Supported Versions + +AppAuth supports macOS (OS X) 10.8 and above. + +#### Authorization Server Requirements + +AppAuth for macOS supports both custom schemes, a loopback HTTP redirects +via a small embedded server. + +In general, AppAuth can work with any Authorization Server (AS) that supports +[native apps](https://tools.ietf.org/html/draft-ietf-oauth-native-apps), +either through custom URI scheme, or loopback HTTP redirects. +AS's that assume all clients are web-based or require clients to maintain +confidentiality of the client secrets may not work well. + +## Try + +Want to try out AppAuth? Just run: + + pod try AppAuth + +Follow the instructions in [Example/README.md](Example/README.md) to configure +with your own OAuth client (you need to update 3 configuration points with your +client info to try the demo). + +## Setup + +If you use [CocoaPods](https://guides.cocoapods.org/using/getting-started.html), +simply add: + + pod 'AppAuth' + +To your `Podfile` and run `pod install`. Otherwise, add `AppAuth.xcodeproj` +into your workspace. + +## Auth Flow + +AppAuth supports both manual interaction with the Authorization Server +where you need to perform your own token exchanges, as well as convenience +methods that perform some of this logic for you. This example uses the +convenience method which returns either an `OIDAuthState` object, or an error. + +`OIDAuthState` is a class that keeps track of the authorization and token +requests and responses, and provides a convenience method to call an API with +fresh tokens. This is the only object that you need to serialize to retain the +authorization state of the session. + +### Configuration + +You can configure AppAuth by specifying the endpoints directly: + +```objc +NSURL *authorizationEndpoint = + [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/v2/auth"]; +NSURL *tokenEndpoint = + [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v4/token"]; + +OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] + initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint]; + +// perform the auth request... +``` + +Or through discovery: + +```objc +NSURL *issuer = [NSURL URLWithString:@"https://accounts.google.com"]; + +[OIDAuthorizationService discoverServiceConfigurationForIssuer:issuer + completion:^(OIDServiceConfiguration *_Nullable configuration, + NSError *_Nullable error) { + + if (!configuration) { + NSLog(@"Error retrieving discovery document: %@", + [error localizedDescription]); + return; + } + + // perform the auth request... +}]; +``` + +### Authorizing – iOS + +First you need to have a property in your AppDelegate to hold the session, in +order to continue the authorization flow from the redirect. + +```objc +// property of the app's AppDelegate +@property(nonatomic, strong, nullable) + id currentAuthorizationFlow; +``` + +And your main class, a property to store the auth state: + +```objc +// property of the containing class +@property(nonatomic, strong, nullable) OIDAuthState *authState; +``` + +Then, initiate the authorization request. By using the +`authStateByPresentingAuthorizationRequest` convenience method, the token +exchange will be performed automatically, and everything will be protected with +PKCE (if the server supports it). AppAuth also allows you to perform these +requests manually. See the `authNoCodeExchange` method in the included Example +app for a demonstration. + +```objc +// builds authentication request +OIDAuthorizationRequest *request = + [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration + clientId:kClientID + scopes:@[OIDScopeOpenID, + OIDScopeProfile] + redirectURL:KRedirectURI + responseType:OIDResponseTypeCode + additionalParameters:nil]; + +// performs authentication request +AppDelegate *appDelegate = + (AppDelegate *)[UIApplication sharedApplication].delegate; +appDelegate.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + presentingViewController:self + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + if (authState) { + NSLog(@"Got authorization tokens. Access token: %@", + authState.lastTokenResponse.accessToken); + [self setAuthState:authState]; + } else { + NSLog(@"Authorization error: %@", [error localizedDescription]); + [self setAuthState:nil]; + } +}]; +``` + +*Handling the Redirect* + +The authorization response URL is returned to the app via the iOS openURL +app delegate method, so you need to pipe this through to the current +authorization session (created in the previous session). + +```objc +- (BOOL)application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options { + // Sends the URL to the current authorization flow (if any) which will + // process it if it relates to an authorization response. + if ([_currentAuthorizationFlow resumeAuthorizationFlowWithURL:url]) { + _currentAuthorizationFlow = nil; + return YES; + } + + // Your additional URL handling (if any) goes here. + + return NO; +} +``` + +### Authorizing – MacOS + +On macOS, the most popular way to get the authorization response redirect is to +start a local HTTP server on the loopback interface (limited to incoming +requests from the user's machine only). When the authorization is complete, the +user is redirected to that local server, and the authorization response can be +processed by the app. AppAuth takes care of managing the local HTTP server +lifecycle for you. + +> #### :bulb: Alternative: Custom URI Schemes +> Custom URI schemes are also supported on macOS, but some browsers display +> an interstitial which reduces the usability. For an example on using custom +> URI schemes with macOS, See `Example-Mac`. + +To receive the authorization response using a local HTTP server, first you need +to have an instance variable in your main class to retain the HTTP redirect +handler. + +```objc +OIDRedirectHTTPHandler *_redirectHTTPHandler; +``` + +Then, as the port used by the local HTTP server varies, you need to start it +before building the authorization request in order to get the exact redirect +URI to use. + +```objc +static NSString *const kSuccessURLString = + @"http://openid.github.io/AppAuth-iOS/redirect/"; +NSURL *successURL = [NSURL URLWithString:kSuccessURLString]; + +// Starts a loopback HTTP redirect listener to receive the code. This needs to be started first, +// as the exact redirect URI (including port) must be passed in the authorization request. +_redirectHTTPHandler = [[OIDRedirectHTTPHandler alloc] initWithSuccessURL:successURL]; +NSURL *redirectURI = [_redirectHTTPHandler startHTTPListener:nil]; +``` + +Then, initiate the authorization request. By using the +`authStateByPresentingAuthorizationRequest` convenience method, the token +exchange will be performed automatically, and everything will be protected with +PKCE (if the server supports it). By assigning the return value to the +`OIDRedirectHTTPHandler`'s `currentAuthorizationFlow`, the authorization will +continue automatically once the user makes their choice. + +```objc +// builds authentication request +OIDAuthorizationRequest *request = + [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration + clientId:kClientID + clientSecret:kClientSecret + scopes:@[ OIDScopeOpenID ] + redirectURL:redirectURI + responseType:OIDResponseTypeCode + additionalParameters:nil]; +// performs authentication request +__weak __typeof(self) weakSelf = self; +_redirectHTTPHandler.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + // Brings this app to the foreground. + [[NSRunningApplication currentApplication] + activateWithOptions:(NSApplicationActivateAllWindows | + NSApplicationActivateIgnoringOtherApps)]; + + // Processes the authorization response. + if (authState) { + NSLog(@"Got authorization tokens. Access token: %@", + authState.lastTokenResponse.accessToken); + } else { + NSLog(@"Authorization error: %@", error.localizedDescription); + } + [weakSelf setAuthState:authState]; +}]; +``` + +### Making API Calls + +AppAuth gives you the raw token information, if you need it. However we +recommend that users of the `OIDAuthState` convenience wrapper use the provided +`performActionWithFreshTokens:` method to perform their API calls to avoid +needing to worry about token freshness. + +```objc +[_authState performActionWithFreshTokens:^(NSString *_Nonnull accessToken, + NSString *_Nonnull idToken, + NSError *_Nullable error) { + if (error) { + NSLog(@"Error fetching fresh tokens: %@", [error localizedDescription]); + return; + } + + // perform your API request using the tokens +}]; +``` + +## API Documentation + +Browse the [API documentation] +(http://openid.github.io/AppAuth-iOS/docs/latest/annotated.html). + +## Included Samples + +You can try out the iOS sample included in the source distribution by opening +`Example/Example.xcworkspace`. You can easily convert the Example +workspace to a Pod workspace by deleting the `AppAuth` project, and +[configuring the pod](#setup). You can also +[try out the sample via CocoaPods](#try). Be sure to follow the instructions in +[Example/README.md](Example/README.md) to configure your own OAuth client ID +for use with the example. + +You can try out the macOS sample included in the source distribution by +executing `pod install` in the `Example-Mac` folder, then opening +`Example-Mac.xcworkspace`. Be sure to follow the instructions in +[Example-Mac/README.md](Example-Mac/README.md) to configure your own OAuth +client ID for use with the example. diff --git a/Paco-iOS/Pods/AppAuth/Source/AppAuth.h b/Paco-iOS/Pods/AppAuth/Source/AppAuth.h new file mode 100644 index 000000000..d3e9e39a7 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/AppAuth.h @@ -0,0 +1,81 @@ +/*! @file AppAuth.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthState.h" +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDAuthorizationUICoordinator.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDGrantTypes.h" +#import "OIDResponseTypes.h" +#import "OIDScopes.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDServiceDiscovery.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" +#import "OIDTokenUtilities.h" + +#if TARGET_OS_TV +#elif TARGET_OS_WATCH +#elif TARGET_OS_IOS +#import "OIDAuthState+IOS.h" +#import "OIDAuthorizationService+IOS.h" +#import "OIDAuthorizationUICoordinatorIOS.h" +#elif TARGET_OS_MAC +#import "OIDAuthState+Mac.h" +#import "OIDAuthorizationService+Mac.h" +#import "OIDAuthorizationUICoordinatorMac.h" +#import "OIDRedirectHTTPHandler.h" +#else +#error "Platform Undefined" +#endif + + +/*! @mainpage AppAuth for iOS and macOS + + @section introduction Introduction + + AppAuth for iOS and macOS is a client SDK for communicating with [OAuth 2.0] + (https://tools.ietf.org/html/rfc6749) and [OpenID Connect] + (http://openid.net/specs/openid-connect-core-1_0.html) providers. It strives to + directly map the requests and responses of those specifications, while following + the idiomatic style of the implementation language. In addition to mapping the + raw protocol flows, convenience methods are available to assist with common + tasks like performing an action with fresh tokens. + + It follows the best practices set out in [OAuth 2.0 for Native Apps] + (https://tools.ietf.org/html/draft-ietf-oauth-native-apps) + including using `SFSafariViewController` for the auth request. For this reason, + `UIWebView` is explicitly *not* supported due to usability and security reasons. + + It also supports the [PKCE](https://tools.ietf.org/html/rfc7636) extension to + OAuth which was created to secure authorization codes in public clients when + custom URI scheme redirects are used. The library is friendly to other + extensions (standard or otherwise) with the ability to handle additional params + in all protocol requests and responses. + + Homepage: http://openid.github.io/AppAuth-iOS/
+ API Documentation: http://openid.github.io/AppAuth-iOS/docs/latest
+ Git Repository: https://github.com/openid/AppAuth-iOS
+ + */ diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthState.h b/Paco-iOS/Pods/AppAuth/Source/OIDAuthState.h new file mode 100644 index 000000000..9ba5836d6 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthState.h @@ -0,0 +1,238 @@ +/*! @file OIDAuthState.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDAuthorizationRequest; +@class OIDAuthorizationResponse; +@class OIDAuthState; +@class OIDTokenResponse; +@class OIDTokenRequest; +@protocol OIDAuthorizationFlowSession; +@protocol OIDAuthorizationUICoordinator; +@protocol OIDAuthStateChangeDelegate; +@protocol OIDAuthStateErrorDelegate; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents a block used to call an action with a fresh access token. + @param accessToken A valid access token if available. + @param idToken A valid ID token if available. + @param error The error if an error occurred. + */ +typedef void (^OIDAuthStateAction)(NSString *_Nullable accessToken, + NSString *_Nullable idToken, + NSError *_Nullable error); + +/*! @brief The method called when the @c + OIDAuthState.authStateByPresentingAuthorizationRequest:presentingViewController:callback: + method has completed or failed. + @param authState The auth state, if the authorization request succeeded. + @param error The error if an error occurred. + */ +typedef void (^OIDAuthStateAuthorizationCallback)(OIDAuthState *_Nullable authState, + NSError *_Nullable error); + +/*! @brief A convenience class that retains the auth state between @c OIDAuthorizationResponse%s + and @c OIDTokenResponse%s. + */ +@interface OIDAuthState : NSObject + +/*! @brief The most recent refresh token received from the server. + @discussion Rather than using this property directly, you should call + @c OIDAuthState.performActionWithFreshTokens:. + @remarks refresh_token + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *refreshToken; + +/*! @brief The scope of the current authorization grant. + @discussion This represents the latest scope returned by the server and may be a subset of the + scope that was initially granted. + @remarks scope + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief The most recent authorization response used to update the authorization state. For the + implicit flow, this will contain the latest access token. + */ +@property(nonatomic, readonly) OIDAuthorizationResponse *lastAuthorizationResponse; + +/*! @brief The most recent token response used to update this authorization state. This will + contain the latest access token. + */ +@property(nonatomic, readonly, nullable) OIDTokenResponse *lastTokenResponse; + +/*! @brief The authorization error that invalidated this @c OIDAuthState. + @discussion The authorization error encountered by @c OIDAuthState or set by the user via + @c OIDAuthState.updateWithAuthorizationError: that invalidated this @c OIDAuthState. + Authorization errors from @c OIDAuthState will always have a domain of + @c ::OIDOAuthAuthorizationErrorDomain or @c ::OIDOAuthTokenErrorDomain. Note: that after + unarchiving the @c OIDAuthState object, the \NSError_userInfo property of this error will + be nil. + */ +@property(nonatomic, readonly, nullable) NSError *authorizationError; + +/*! @brief Returns YES if the authorization state is not known to be invalid. + @discussion Returns YES if no OAuth errors have been received, and the last call resulted in a + successful access token or id token. This does not mean that the access is fresh - just + that it was valid the last time it was used. Note that network and other transient errors + do not invalidate the authorized state. If NO, you should authenticate the user again, + using a fresh authorization request. Invalid @c OIDAuthState objects may still be useful in + that case, to hint at the previously authorized user and streamline the re-authentication + experience. + */ +@property(nonatomic, readonly) BOOL isAuthorized; + +/*! @brief The @c OIDAuthStateChangeDelegate delegate. + @discussion Use the delegate to observe state changes (and update storage) as well as error + states. + */ +@property(nonatomic, weak, nullable) id stateChangeDelegate; + +/*! @brief The @c OIDAuthStateErrorDelegate delegate. + @discussion Use the delegate to observe state changes (and update storage) as well as error + states. + */ +@property(nonatomic, weak, nullable) id errorDelegate; + +/*! @brief Convenience method to create a @c OIDAuthState by presenting an authorization request + and performing the authorization code exchange in the case of code flow requests. + @param authorizationRequest The authorization request to present. + @param UICoordinator Generic authorization UI coordinator that can present an authorization + request. + @param callback The method called when the request has completed or failed. + @return A @c OIDAuthorizationFlowSession instance which will terminate when it + receives a @c OIDAuthorizationFlowSession.cancel message, or after processing a + @c OIDAuthorizationFlowSession.resumeAuthorizationFlowWithURL: message. + */ ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + UICoordinator:(id)UICoordinator + callback:(OIDAuthStateAuthorizationCallback)callback; + +/*! @internal + @brief Unavailable. Please use @c initWithAuthorizationResponse:. + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @brief Creates an auth state from an authorization response. + @param response The authorization response. + */ +- (nullable instancetype)initWithAuthorizationResponse: + (OIDAuthorizationResponse *)authorizationResponse; + +/*! @brief Creates an auth state from an authorization response. + @param response The authorization response. + */ +- (nullable instancetype)initWithAuthorizationResponse: + (OIDAuthorizationResponse *)authorizationResponse + tokenResponse:(nullable OIDTokenResponse *)tokenResponse; + +/*! @brief Updates the authorization state based on a new authorization response. + @param authorizationResponse The new authorization response to update the state with. + @param error Any error encountered when performing the authorization request. Errors in the + domain @c ::OIDOAuthAuthorizationErrorDomain are reflected in the auth state, other errors + are assumed to be transient, and ignored. + @discussion Typically called with the response from an incremental authorization request, + or if using the implicit flow. Will clear the @c #lastTokenResponse property. + */ +- (void)updateWithAuthorizationResponse:(nullable OIDAuthorizationResponse *)authorizationResponse + error:(nullable NSError *)error; + +/*! @brief Updates the authorization state based on a new token response. + @param tokenResponse The new token response to update the state from. + @param error Any error encountered when performing the authorization request. Errors in the + domain @c ::OIDOAuthTokenErrorDomain are reflected in the auth state, other errors + are assumed to be transient, and ignored. + @discussion Typically called with the response from an authorization code exchange, or a token + refresh. + */ +- (void)updateWithTokenResponse:(nullable OIDTokenResponse *)tokenResponse + error:(nullable NSError *)error; + +/*! @brief Updates the authorization state based on an authorization error. + @param authorizationError The authorization error. + @discussion Call this method if you receive an authorization error during an API call to + invalidate the authentication state of this @c OIDAuthState. Don't call with errors + unrelated to authorization, such as transient network errors. + The OIDAuthStateErrorDelegate.authState:didEncounterAuthorizationError: method of + @c #errorDelegate will be called with the error. + You may optionally use the convenience method + OIDErrorUtilities.resourceServerAuthorizationErrorWithCode:errorResponse:underlyingError: + to create \NSError objects for use here. + The latest error received is stored in @c #authorizationError. Note: that after unarchiving + this object, the \NSError_userInfo property of this error will be nil. + */ +- (void)updateWithAuthorizationError:(NSError *)authorizationError; + +/*! @brief Calls the block with a valid access token (refreshing it first, if needed), or if a + refresh was needed and failed, with the error that caused it to fail. + @param action The block to execute with a fresh token. This block will be executed on the main + thread. + */ +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action; + +/*! @brief Calls the block with a valid access token (refreshing it first, if needed), or if a + refresh was needed and failed, with the error that caused it to fail. + @param action The block to execute with a fresh token. This block will be executed on the main + thread. + @param additionalRefreshParameters Additional parameters for the token request if token is + refreshed. + */ +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action + additionalRefreshParameters: + (nullable NSDictionary *)additionalParameters; + +/*! @brief Forces a token refresh the next time @c OIDAuthState.performActionWithFreshTokens: is + called, even if the current tokens are considered valid. + */ +- (void)setNeedsTokenRefresh; + +/*! @brief Creates a token request suitable for refreshing an access token. + @return A @c OIDTokenRequest suitable for using a refresh token to obtain a new access token. + @discussion After performing the refresh, call @c OIDAuthState.updateWithTokenResponse:error: + to update the authorization state based on the response. Rather than doing the token refresh + yourself, you should use @c OIDAuthState.performActionWithFreshTokens:. + @see https://tools.ietf.org/html/rfc6749#section-1.5 + */ +- (nullable OIDTokenRequest *)tokenRefreshRequest; + +/*! @brief Creates a token request suitable for refreshing an access token. + @param additionalParameters Additional parameters for the token request. + @return A @c OIDTokenRequest suitable for using a refresh token to obtain a new access token. + @discussion After performing the refresh, call @c OIDAuthState.updateWithTokenResponse:error: + to update the authorization state based on the response. Rather than doing the token refresh + yourself, you should use @c OIDAuthState.performActionWithFreshTokens:. + @see https://tools.ietf.org/html/rfc6749#section-1.5 + */ +- (nullable OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters: + (nullable NSDictionary *)additionalParameters; + +/*! @brief Deprecated, use @c OIDAuthState.performActionWithFreshTokens:. + @discussion Calls the block with a valid access token (refreshing it first, if needed), or if a + refresh was needed and failed, with the error that caused it to fail. + @param action The block to execute with a fresh token. This block will be executed on the main + thread. + @deprecated Use @c OIDAuthState.performActionWithFreshTokens: which is equivalent. + */ +- (void)withFreshTokensPerformAction:(OIDAuthStateAction)action + __deprecated_msg("Use OIDAuthState.performActionWithFreshTokens:"); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthState.m b/Paco-iOS/Pods/AppAuth/Source/OIDAuthState.m new file mode 100644 index 000000000..337c94c73 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthState.m @@ -0,0 +1,499 @@ +/*! @file OIDAuthState.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthState.h" + +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDDefines.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" + +/*! @brief Key used to encode the @c refreshToken property for @c NSSecureCoding. + */ +static NSString *const kRefreshTokenKey = @"refreshToken"; + +/*! @brief Key used to encode the @c scope property for @c NSSecureCoding. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c lastAuthorizationResponse property for @c NSSecureCoding. + */ +static NSString *const kLastAuthorizationResponseKey = @"lastAuthorizationResponse"; + +/*! @brief Key used to encode the @c lastTokenResponse property for @c NSSecureCoding. + */ +static NSString *const kLastTokenResponseKey = @"lastTokenResponse"; + +/*! @brief Key used to encode the @c lastOAuthError property for @c NSSecureCoding. + */ +static NSString *const kAuthorizationErrorKey = @"authorizationError"; + +/*! @brief The exception thrown when a developer tries to create a refresh request from an + authorization request with no authorization code. + */ +static NSString *const kRefreshTokenRequestException = + @"Attempted to create a token refresh request from a token response with no refresh token."; + +/*! @brief Number of seconds the access token is refreshed before it actually expires. + */ +static const NSUInteger kExpiryTimeTolerance = 60; + +@interface OIDAuthState () + +/*! @brief The access token generated by the authorization server. + @discussion Rather than using this property directly, you should call + @c OIDAuthState.withFreshTokenPerformAction:. + */ +@property(nonatomic, readonly, nullable) NSString *accessToken; + +/*! @brief The approximate expiration date & time of the access token. + @discussion Rather than using this property directly, you should call + @c OIDAuthState.withFreshTokenPerformAction:. + */ +@property(nonatomic, readonly, nullable) NSDate *accessTokenExpirationDate; + +/*! @brief ID Token value associated with the authenticated session. + @discussion Rather than using this property directly, you should call + OIDAuthState.withFreshTokenPerformAction:. + */ +@property(nonatomic, readonly, nullable) NSString *idToken; + +/*! @brief Private method, called when the internal state changes. + */ +- (void)didChangeState; + +@end + + +@implementation OIDAuthState { + /*! @brief Array of pending actions (use @c _pendingActionsSyncObject to synchronize access). + */ + NSMutableArray *_pendingActions; + + /*! @brief Object for synchronizing access to @c pendingActions. + */ + id _pendingActionsSyncObject; + + /*! @brief If YES, tokens will be refreshed on the next API call regardless of expiry. + */ + BOOL _needsTokenRefresh; +} + +#pragma mark - Convenience initializers + ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + UICoordinator:(id)UICoordinator + callback:(OIDAuthStateAuthorizationCallback)callback { + // presents the authorization request + id authFlowSession = [OIDAuthorizationService + presentAuthorizationRequest:authorizationRequest + UICoordinator:UICoordinator + callback:^(OIDAuthorizationResponse *_Nullable authorizationResponse, + NSError *_Nullable authorizationError) { + // inspects response and processes further if needed (e.g. authorization + // code exchange) + if (authorizationResponse) { + if ([authorizationRequest.responseType + isEqualToString:OIDResponseTypeCode]) { + // if the request is for the code flow (NB. not hybrid), assumes the + // code is intended for this client, and performs the authorization + // code exchange + OIDTokenRequest *tokenExchangeRequest = + [authorizationResponse tokenExchangeRequest]; + [OIDAuthorizationService + performTokenRequest:tokenExchangeRequest + callback:^(OIDTokenResponse *_Nullable tokenResponse, + NSError *_Nullable tokenError) { + OIDAuthState *authState; + if (tokenResponse) { + authState = [[OIDAuthState alloc] + initWithAuthorizationResponse: + authorizationResponse + tokenResponse:tokenResponse]; + } + callback(authState, tokenError); + }]; + } else { + // implicit or hybrid flow (hybrid flow assumes code is not for this + // client) + OIDAuthState *authState = [[OIDAuthState alloc] + initWithAuthorizationResponse:authorizationResponse]; + callback(authState, authorizationError); + } + } else { + callback(nil, authorizationError); + } + }]; + return authFlowSession; +} + +#pragma mark - Initializers + +- (nullable instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithAuthorizationResponse:tokenResponse:)); + +/*! @brief Creates an auth state from an authorization response. + @param response The authorization response. + */ +- (nullable instancetype)initWithAuthorizationResponse: + (OIDAuthorizationResponse *)authorizationResponse { + return [self initWithAuthorizationResponse:authorizationResponse tokenResponse:nil]; +} + + +/*! @brief Designated initializer. + @param response The authorization response. + @discussion Creates an auth state from an authorization response and token response. + */ +- (nullable instancetype)initWithAuthorizationResponse: + (OIDAuthorizationResponse *)authorizationResponse + tokenResponse:(nullable OIDTokenResponse *)tokenResponse { + self = [super init]; + if (self) { + _pendingActionsSyncObject = [[NSObject alloc] init]; + [self updateWithAuthorizationResponse:authorizationResponse error:nil]; + + if (tokenResponse) { + [self updateWithTokenResponse:tokenResponse error:nil]; + } + } + return self; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, isAuthorized: %@, refreshToken: \"%@\", " + "scope: \"%@\", accessToken: \"%@\", " + "accessTokenExpirationDate: %@, idToken: \"%@\", " + "lastAuthorizationResponse: %@, lastTokenResponse: %@, " + "authorizationError: %@>", + NSStringFromClass([self class]), + self, + (self.isAuthorized) ? @"YES" : @"NO", + _refreshToken, + _scope, + self.accessToken, + self.accessTokenExpirationDate, + self.idToken, + _lastAuthorizationResponse, + _lastTokenResponse, + _authorizationError]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + _lastAuthorizationResponse = [aDecoder decodeObjectOfClass:[OIDAuthorizationResponse class] + forKey:kLastAuthorizationResponseKey]; + _lastTokenResponse = [aDecoder decodeObjectOfClass:[OIDTokenResponse class] + forKey:kLastTokenResponseKey]; + self = [self initWithAuthorizationResponse:_lastAuthorizationResponse + tokenResponse:_lastTokenResponse]; + if (self) { + _authorizationError = + [aDecoder decodeObjectOfClass:[NSError class] forKey:kAuthorizationErrorKey]; + _scope = [aDecoder decodeObjectOfClass:[NSString class] forKey:kScopeKey]; + _refreshToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:kRefreshTokenKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_lastAuthorizationResponse forKey:kLastAuthorizationResponseKey]; + [aCoder encodeObject:_lastTokenResponse forKey:kLastTokenResponseKey]; + if (_authorizationError) { + NSError *codingSafeAuthorizationError = [NSError errorWithDomain:_authorizationError.domain + code:_authorizationError.code + userInfo:nil]; + [aCoder encodeObject:codingSafeAuthorizationError forKey:kAuthorizationErrorKey]; + } + [aCoder encodeObject:_scope forKey:kScopeKey]; + [aCoder encodeObject:_refreshToken forKey:kRefreshTokenKey]; +} + +#pragma mark - Private convenience getters + +- (NSString *)accessToken { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.accessToken + : _lastAuthorizationResponse.accessToken; +} + +- (NSString *)tokenType { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.tokenType + : _lastAuthorizationResponse.tokenType; +} + +- (NSDate *)accessTokenExpirationDate { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.accessTokenExpirationDate + : _lastAuthorizationResponse.accessTokenExpirationDate; +} + +- (NSString *)idToken { + if (_authorizationError) { + return nil; + } + return _lastTokenResponse ? _lastTokenResponse.idToken + : _lastAuthorizationResponse.idToken; +} + +#pragma mark - Getters + +- (BOOL)isAuthorized { + return !self.authorizationError && (self.accessToken || self.idToken || self.refreshToken); +} + +#pragma mark - Updating the state + +- (void)updateWithAuthorizationResponse:(nullable OIDAuthorizationResponse *)authorizationResponse + error:(nullable NSError *)error { + // If the error is an OAuth authorization error, updates the state. Other errors are ignored. + if (error.domain == OIDOAuthAuthorizationErrorDomain) { + [self updateWithAuthorizationError:error]; + return; + } + if (!authorizationResponse) { + return; + } + + _lastAuthorizationResponse = authorizationResponse; + + // clears the last token response and refresh token as these now relate to an old authorization + // that is no longer relevant + _lastTokenResponse = nil; + _refreshToken = nil; + _authorizationError = nil; + + // if the response's scope is nil, it means that it equals that of the request + // see: https://tools.ietf.org/html/rfc6749#section-5.1 + _scope = (authorizationResponse.scope) ? authorizationResponse.scope + : authorizationResponse.request.scope; + + [self didChangeState]; +} + +- (void)updateWithTokenResponse:(nullable OIDTokenResponse *)tokenResponse + error:(nullable NSError *)error { + if (_authorizationError) { + // Calling updateWithTokenResponse while in an error state probably means the developer obtained + // a new token and did the exchange without also calling updateWithAuthorizationResponse. + // Attempts to handle gracefully, but warns the developer that this is unexpected. + NSLog(@"OIDAuthState:updateWithTokenResponse should not be called in an error state [%@] call" + "updateWithAuthorizationResponse with the result of the fresh authorization response" + "first", + _authorizationError); + + _authorizationError = nil; + } + + // If the error is an OAuth authorization error, updates the state. Other errors are ignored. + if (error.domain == OIDOAuthTokenErrorDomain) { + [self updateWithAuthorizationError:error]; + return; + } + if (!tokenResponse) { + return; + } + + _lastTokenResponse = tokenResponse; + + // updates the scope and refresh token if they are present on the TokenResponse. + // according to the spec, these may be changed by the server, including when refreshing the + // access token. See: https://tools.ietf.org/html/rfc6749#section-5.1 and + // https://tools.ietf.org/html/rfc6749#section-6 + if (tokenResponse.scope) { + _scope = tokenResponse.scope; + } + if (tokenResponse.refreshToken) { + _refreshToken = tokenResponse.refreshToken; + } + + [self didChangeState]; +} + +- (void)updateWithAuthorizationError:(NSError *)oauthError { + _authorizationError = oauthError; + + [self didChangeState]; + + [_errorDelegate authState:self didEncounterAuthorizationError:oauthError]; +} + +#pragma mark - OAuth Requests + +- (OIDTokenRequest *)tokenRefreshRequest { + return [self tokenRefreshRequestWithAdditionalParameters:nil]; +} + +- (OIDTokenRequest *)tokenRefreshRequestWithAdditionalParameters: + (NSDictionary *)additionalParameters { + + // TODO: Add unit test to confirm exception is thrown when expected + + if (!_refreshToken) { + [OIDErrorUtilities raiseException:kRefreshTokenRequestException]; + } + return [[OIDTokenRequest alloc] + initWithConfiguration:_lastAuthorizationResponse.request.configuration + grantType:OIDGrantTypeRefreshToken + authorizationCode:nil + redirectURL:_lastAuthorizationResponse.request.redirectURL + clientID:_lastAuthorizationResponse.request.clientID + clientSecret:_lastAuthorizationResponse.request.clientSecret + scope:_lastAuthorizationResponse.request.scope + refreshToken:_refreshToken + codeVerifier:nil + additionalParameters:additionalParameters]; +} + +#pragma mark - Stateful Actions + +- (void)didChangeState { + [_stateChangeDelegate didChangeState:self]; +} + +- (void)setNeedsTokenRefresh { + _needsTokenRefresh = YES; +} + +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action { + [self performActionWithFreshTokens:action additionalRefreshParameters:nil]; +} + +- (void)performActionWithFreshTokens:(OIDAuthStateAction)action + additionalRefreshParameters: + (nullable NSDictionary *)additionalParameters { + if ([self isTokenFresh]) { + // access token is valid within tolerance levels, perform action + dispatch_async(dispatch_get_main_queue(), ^() { + action(self.accessToken, self.idToken, nil); + }); + return; + } + + if (!_refreshToken) { + // no refresh token available and token has expired + NSError *tokenRefreshError = [ + OIDErrorUtilities errorWithCode:OIDErrorCodeTokenRefreshError + underlyingError:nil + description:@"Unable to refresh expired token without a refresh token."]; + dispatch_async(dispatch_get_main_queue(), ^() { + action(nil, nil, tokenRefreshError); + }); + return; + } + + // access token is expired, first refresh the token, then perform action + NSAssert(_pendingActionsSyncObject, @"_pendingActionsSyncObject cannot be nil"); + @synchronized(_pendingActionsSyncObject) { + // if a token is already in the process of being refreshed, adds to pending actions + if (_pendingActions) { + [_pendingActions addObject:action]; + return; + } + + // creates a list of pending actions, starting with this one + _pendingActions = [NSMutableArray arrayWithObject:action]; + } + + // refresh the tokens + OIDTokenRequest *tokenRefreshRequest = + [self tokenRefreshRequestWithAdditionalParameters:additionalParameters]; + [OIDAuthorizationService performTokenRequest:tokenRefreshRequest + callback:^(OIDTokenResponse *_Nullable response, + NSError *_Nullable error) { + dispatch_async(dispatch_get_main_queue(), ^() { + // update OIDAuthState based on response + if (response) { + _needsTokenRefresh = NO; + [self updateWithTokenResponse:response error:nil]; + } else { + if (error.domain == OIDOAuthTokenErrorDomain) { + _needsTokenRefresh = NO; + [self updateWithAuthorizationError:error]; + } else { + if ([_errorDelegate respondsToSelector: + @selector(authState:didEncounterTransientError:)]) { + [_errorDelegate authState:self didEncounterTransientError:error]; + } + } + } + + // nil the pending queue and process everything that was queued up + NSArray *actionsToProcess; + @synchronized(_pendingActionsSyncObject) { + actionsToProcess = _pendingActions; + _pendingActions = nil; + } + for (OIDAuthStateAction actionToProcess in actionsToProcess) { + actionToProcess(self.accessToken, self.idToken, error); + } + }); + }]; +} + +#pragma mark - Deprecated + +- (void)withFreshTokensPerformAction:(OIDAuthStateAction)action { + [self performActionWithFreshTokens:action additionalRefreshParameters:nil]; +} + +#pragma mark - + +/*! @fn isTokenFresh + @brief Determines whether a token refresh request must be made to refresh the tokens. + */ +- (BOOL)isTokenFresh { + if (_needsTokenRefresh) { + // forced refresh + return NO; + } + + if (!self.accessTokenExpirationDate) { + // if there is no expiration time but we have an access token, it is assumed to never expire + return !!self.accessToken; + } + + // has the token expired? + BOOL tokenFresh = [self.accessTokenExpirationDate timeIntervalSinceNow] > kExpiryTimeTolerance; + return tokenFresh; +} + +@end + + diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthStateChangeDelegate.h b/Paco-iOS/Pods/AppAuth/Source/OIDAuthStateChangeDelegate.h new file mode 100644 index 000000000..2570df131 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthStateChangeDelegate.h @@ -0,0 +1,39 @@ +/*! @file OIDAuthStateChangeDelegate.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDAuthState; + +NS_ASSUME_NONNULL_BEGIN + +/*! @protocol OIDAuthStateChangeDelegate + @brief Delegate of the OIDAuthState used to monitor various changes in state. + */ +@protocol OIDAuthStateChangeDelegate + +/*! @brief Called when the authorization state changes and any backing storage needs to be updated. + @param state The @c OIDAuthState that changed. + @discussion If you are storing the authorization state, you should update the storage when the + state changes. + */ +- (void)didChangeState:(OIDAuthState *)state; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthStateErrorDelegate.h b/Paco-iOS/Pods/AppAuth/Source/OIDAuthStateErrorDelegate.h new file mode 100644 index 000000000..91a9b1cd0 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthStateErrorDelegate.h @@ -0,0 +1,62 @@ +/*! @file OIDAuthStateErrorDelegate.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDAuthState; + +NS_ASSUME_NONNULL_BEGIN + +/*! @protocol OIDAuthStateErrorDelegate + @brief Delegate of the OIDAuthState used to monitor errors. + */ +@protocol OIDAuthStateErrorDelegate + +/*! @brief Called when an authentication occurs, which indicates the auth session is invalid. + @param state The @c OIDAuthState on which the error occurred. + @param error The authorization error. + @discussion This is a hard error (not a transient network issue) that indicates a problem with + the authorization. You should stop using the @c OIDAuthState when such an error is + encountered. If the \NSError_code is @c ::OIDErrorCodeOAuthInvalidGrant then + the session may be recoverable with user interaction (i.e. re-authentication). In all cases + you should consider the user unauthorized, and remove locally cached resources that require + that authorization. @c OIDAuthState will call this method automatically if it encounters + an OAuth error (that is, an HTTP 400 response with a valid OAuth error response) during + authorization or token refresh (such as performed automatically when using + @c OIDAuthState.performActionWithFreshTokens:). You can signal authorization errors with + @c OIDAuthState.updateWithAuthorizationError:. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +- (void)authState:(OIDAuthState *)state didEncounterAuthorizationError:(NSError *)error; + +@optional + +/*! @brief Called when a network or other transient error occurs. + @param state The @c OIDAuthState on which the error occurred. + @param error The transient error. + @discussion This is a soft error, typically network related. The @c OIDAuthState is likely + still valid, and should not be discarded. Retry the request using an incremental backoff + strategy. This is only called when using the @c OIDAuthState convenience methods such as + @c OIDAuthState.performActionWithFreshTokens:. If you are refreshing the tokens yourself + outside of @c OIDAuthState class, it will never be called. + */ +- (void)authState:(OIDAuthState *)state didEncounterTransientError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.h b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.h new file mode 100644 index 000000000..3e283672a --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.h @@ -0,0 +1,233 @@ +/*! @file OIDAuthorizationRequest.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +// These files only declare string constants useful for constructing a @c OIDAuthorizationRequest, +// so they are imported here for convenience. +#import "OIDResponseTypes.h" +#import "OIDScopes.h" + +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The @c code_challenge_method value for the S256 code challenge. + @see https://tools.ietf.org/html/rfc7636#section-4.3 + */ +extern NSString *const OIDOAuthorizationRequestCodeChallengeMethodS256; + + +/*! @brief Represents an authorization request. + @see https://tools.ietf.org/html/rfc6749#section-4 + @see https://tools.ietf.org/html/rfc6749#section-4.1.1 + */ +@interface OIDAuthorizationRequest : NSObject + +/*! @brief The service's configuration. + @remarks This configuration specifies how to connect to a particular OAuth provider. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @brief The expected response type. + @remarks response_type + @discussion Generally 'code' if pure OAuth, otherwise a space-delimited list of of response + types including 'code', 'token', and 'id_token' for OpenID Connect. + @see https://tools.ietf.org/html/rfc6749#section-3.1.1 + @see http://openid.net/specs/openid-connect-core-1_0.html#rfc.section.3 + */ +@property(nonatomic, readonly) NSString *responseType; + +/*! @brief The client identifier. + @remarks client_id + @see https://tools.ietf.org/html/rfc6749#section-2.2 + */ +@property(nonatomic, readonly) NSString *clientID; + +/*! @brief The client secret. + @remarks client_secret + @discussion The client secret is used to prove that identity of the client when exchaning an + authorization code for an access token. + The client secret is not passed in the authorizationRequestURL. It is only used when + exchanging the authorization code for an access token. + @see https://tools.ietf.org/html/rfc6749#section-2.3.1 + */ +@property(nonatomic, readonly, nullable) NSString *clientSecret; + +/*! @brief The value of the scope parameter is expressed as a list of space-delimited, + case-sensitive strings. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief The client's redirect URI. + @remarks redirect_uri + @see https://tools.ietf.org/html/rfc6749#section-3.1.2 + */ +@property(nonatomic, readonly, nullable) NSURL *redirectURL; + +/*! @brief An opaque value used by the client to maintain state between the request and callback. + @remarks state + @discussion If this value is not explicitly set, this library will automatically add state and + perform appropriate validation of the state in the authorization response. It is recommended + that the default implementation of this parameter be used wherever possible. Typically used + to prevent CSRF attacks, as recommended in RFC6819 Section 5.3.5. + @see https://tools.ietf.org/html/rfc6749#section-4.1.1 + @see https://tools.ietf.org/html/rfc6819#section-5.3.5 + */ +@property(nonatomic, readonly, nullable) NSString *state; + +/*! @brief The PKCE code verifier. + @remarks code_verifier + @discussion The code verifier itself is not included in the authorization request that is sent + on the wire, but needs to be in the token exchange request. + @c OIDAuthorizationResponse.tokenExchangeRequest will create a @c OIDTokenRequest that + includes this parameter automatically. + @see https://tools.ietf.org/html/rfc7636#section-4.1 + */ +@property(nonatomic, readonly, nullable) NSString *codeVerifier; + +/*! @brief The PKCE code challenge, derived from #codeVerifier. + @remarks code_challenge + @see https://tools.ietf.org/html/rfc7636#section-4.2 + */ +@property(nonatomic, readonly, nullable) NSString *codeChallenge; + +/*! @brief The method used to compute the @c #codeChallenge + @remarks code_challenge_method + @see https://tools.ietf.org/html/rfc7636#section-4.3 + */ +@property(nonatomic, readonly, nullable) NSString *codeChallengeMethod; + +/*! @brief The client's additional authorization parameters. + @see https://tools.ietf.org/html/rfc6749#section-3.1 + */ +@property(nonatomic, readonly, nullable) NSDictionary *additionalParameters; + +/*! @internal + @brief Unavailable. Please use + @c initWithConfiguration:clientId:scopes:redirectURL:additionalParameters:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Creates an authorization request with opinionated defaults (a secure @c state, and + PKCE with S256 as the @c code_challenge_method). + @param configuration The service's configuration. + @param clientID The client identifier. + @param scopes An array of scopes to combine into a single scope string per the OAuth2 spec. + @param redirectURL The client's redirect URI. + @param responseType The expected response type. + @param additionalParameters The client's additional authorization parameters. + @remarks This convenience initializer generates a state parameter and PKCE challenges + automatically. + */ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Creates an authorization request with opinionated defaults (a secure @c state, and + PKCE with S256 as the @c code_challenge_method). + @param configuration The service's configuration. + @param clientID The client identifier. + @param clientSecret The client secret. + @param scopes An array of scopes to combine into a single scope string per the OAuth2 spec. + @param redirectURL The client's redirect URI. + @param responseType The expected response type. + @param additionalParameters The client's additional authorization parameters. + @remarks This convenience initializer generates a state parameter and PKCE challenges + automatically. + */ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Designated initializer. + @param configuration The service's configuration. + @param clientID The client identifier. + @param scope A scope string per the OAuth2 spec (a space-delimited set of scopes). + @param redirectURL The client's redirect URI. + @param responseType The expected response type. + @param state An opaque value used by the client to maintain state between the request and + callback. + @param codeVerifier The PKCE code verifier. See @c OIDAuthorizationRequest.generateCodeVerifier. + @param codeChallenge The PKCE code challenge, calculated from the code verifier such as with + @c OIDAuthorizationRequest.codeChallengeS256ForVerifier:. + @param codeChallengeMethod The PKCE code challenge method. + ::OIDOAuthorizationRequestCodeChallengeMethodS256 when + @c OIDAuthorizationRequest.codeChallengeS256ForVerifier: is used to create the code + challenge. + @param additionalParameters The client's additional authorization parameters. + */ +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + redirectURL:(nullable NSURL *)redirectURL + responseType:(NSString *)responseType + state:(nullable NSString *)state + codeVerifier:(nullable NSString *)codeVerifier + codeChallenge:(nullable NSString *)codeChallenge + codeChallengeMethod:(nullable NSString *)codeChallengeMethod + additionalParameters:(nullable NSDictionary *)additionalParameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Constructs the request URI by adding the request parameters to the query component of the + authorization endpoint URI using the "application/x-www-form-urlencoded" format. + @return A URL representing the authorization request. + @see https://tools.ietf.org/html/rfc6749#section-4.1.1 + */ +- (NSURL *)authorizationRequestURL; + +/*! @brief Generates an OAuth state param using a random source. + @return The generated state. + @see https://tools.ietf.org/html/rfc6819#section-5.3.5 + */ ++ (nullable NSString *)generateState; + +/*! @brief Constructs a PKCE-compliant code verifier. + @return The generated code verifier. + @see https://tools.ietf.org/html/rfc7636#section-4.1 + */ ++ (nullable NSString *)generateCodeVerifier; + +/*! @brief Creates a PKCE S256 codeChallenge from the codeVerifier. + @param codeVerifier The code verifier from which the code challenge will be derived. + @return The generated code challenge. + @details Generate a secure code verifier to pass into this method with + @c OIDAuthorizationRequest.generateCodeVerifier. The matching @c #codeChallengeMethod for + @c #codeChallenge%s created by this method is + ::OIDOAuthorizationRequestCodeChallengeMethodS256. + @see https://tools.ietf.org/html/rfc7636#section-4.1 + */ ++ (nullable NSString *)codeChallengeS256ForVerifier:(nullable NSString *)codeVerifier; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.m b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.m new file mode 100644 index 000000000..e3deb1e71 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationRequest.m @@ -0,0 +1,300 @@ +/*! @file OIDAuthorizationRequest.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthorizationRequest.h" + +#import "OIDDefines.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDTokenUtilities.h" +#import "OIDURLQueryComponent.h" + +/*! @brief The key for the @c configuration property for @c NSSecureCoding + */ +static NSString *const kConfigurationKey = @"configuration"; + +/*! @brief Key used to encode the @c responseType property for @c NSSecureCoding, and on the URL + request. + */ +static NSString *const kResponseTypeKey = @"response_type"; + +/*! @brief Key used to encode the @c clientID property for @c NSSecureCoding, and on the URL + request. + */ +static NSString *const kClientIDKey = @"client_id"; + +/*! @brief Key used to encode the @c clientSecret property for @c NSSecureCoding. + */ +static NSString *const kClientSecretKey = @"client_secret"; + +/*! @brief Key used to encode the @c scope property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c redirectURL property for @c NSSecureCoding, and on the URL + request. + */ +static NSString *const kRedirectURLKey = @"redirect_uri"; + +/*! @brief Key used to encode the @c state property for @c NSSecureCoding, and on the URL request. + */ +static NSString *const kStateKey = @"state"; + +/*! @brief Key used to encode the @c codeVerifier property for @c NSSecureCoding. + */ +static NSString *const kCodeVerifierKey = @"code_verifier"; + +/*! @brief Key used to send the @c codeChallenge on the URL request. + */ +static NSString *const kCodeChallengeKey = @"code_challenge"; + +/*! @brief Key used to send the @c codeChallengeMethod on the URL request. + */ +static NSString *const kCodeChallengeMethodKey = @"code_challenge_method"; + +/*! @brief Key used to encode the @c additionalParameters property for + @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +/*! @brief Number of random bytes generated for the @ state. + */ +static NSUInteger const kStateSizeBytes = 32; + +/*! @brief Number of random bytes generated for the @ codeVerifier. + */ +static NSUInteger const kCodeVerifierBytes = 32; + +NSString *const OIDOAuthorizationRequestCodeChallengeMethodS256 = @"S256"; + +@implementation OIDAuthorizationRequest + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER( + @selector(initWithConfiguration: + clientId: + scopes: + redirectURL: + responseType: + additionalParameters:) + ); + +- (instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + state:(nullable NSString *)state + codeVerifier:(nullable NSString *)codeVerifier + codeChallenge:(nullable NSString *)codeChallenge + codeChallengeMethod:(nullable NSString *)codeChallengeMethod + additionalParameters:(nullable NSDictionary *)additionalParameters +{ + self = [super init]; + if (self) { + _configuration = [configuration copy]; + _clientID = [clientID copy]; + _clientSecret = [clientSecret copy]; + _scope = [scope copy]; + _redirectURL = [redirectURL copy]; + _responseType = [responseType copy]; + _state = [state copy]; + _codeVerifier = [codeVerifier copy]; + _codeChallenge = [codeChallenge copy]; + _codeChallengeMethod = [codeChallengeMethod copy]; + + _additionalParameters = + [[NSDictionary alloc] initWithDictionary:additionalParameters copyItems:YES]; + } + return self; +} + +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + clientSecret:(NSString *)clientSecret + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters { + + // generates PKCE code verifier and challenge + NSString *codeVerifier = [[self class] generateCodeVerifier]; + NSString *codeChallenge = [[self class] codeChallengeS256ForVerifier:codeVerifier]; + + return [self initWithConfiguration:configuration + clientId:clientID + clientSecret:clientSecret + scope:[OIDScopeUtilities scopesWithArray:scopes] + redirectURL:redirectURL + responseType:responseType + state:[[self class] generateState] + codeVerifier:codeVerifier + codeChallenge:codeChallenge + codeChallengeMethod:OIDOAuthorizationRequestCodeChallengeMethodS256 + additionalParameters:additionalParameters]; +} + +- (instancetype) + initWithConfiguration:(OIDServiceConfiguration *)configuration + clientId:(NSString *)clientID + scopes:(nullable NSArray *)scopes + redirectURL:(NSURL *)redirectURL + responseType:(NSString *)responseType + additionalParameters:(nullable NSDictionary *)additionalParameters { + return [self initWithConfiguration:configuration + clientId:clientID + clientSecret:nil + scopes:scopes + redirectURL:redirectURL + responseType:responseType + additionalParameters:additionalParameters]; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDServiceConfiguration *configuration = + [aDecoder decodeObjectOfClass:[OIDServiceConfiguration class] + forKey:kConfigurationKey]; + NSString *responseType = [aDecoder decodeObjectOfClass:[NSString class] forKey:kResponseTypeKey]; + NSString *clientID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientIDKey]; + NSString *clientSecret = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientSecretKey]; + NSString *scope = [aDecoder decodeObjectOfClass:[NSString class] forKey:kScopeKey]; + NSURL *redirectURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:kRedirectURLKey]; + NSString *state = [aDecoder decodeObjectOfClass:[NSString class] forKey:kStateKey]; + NSString *codeVerifier = [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeVerifierKey]; + NSString *codeChallenge = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeChallengeKey]; + NSString *codeChallengeMethod = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeChallengeMethodKey]; + NSSet *additionalParameterCodingClasses = [NSSet setWithArray:@[ + [NSDictionary class], + [NSString class] + ]]; + NSDictionary *additionalParameters = + [aDecoder decodeObjectOfClasses:additionalParameterCodingClasses + forKey:kAdditionalParametersKey]; + + self = [self initWithConfiguration:configuration + clientId:clientID + clientSecret:clientSecret + scope:scope + redirectURL:redirectURL + responseType:responseType + state:state + codeVerifier:codeVerifier + codeChallenge:codeChallenge + codeChallengeMethod:codeChallengeMethod + additionalParameters:additionalParameters]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_configuration forKey:kConfigurationKey]; + [aCoder encodeObject:_responseType forKey:kResponseTypeKey]; + [aCoder encodeObject:_clientID forKey:kClientIDKey]; + [aCoder encodeObject:_clientSecret forKey:kClientSecretKey]; + [aCoder encodeObject:_scope forKey:kScopeKey]; + [aCoder encodeObject:_redirectURL forKey:kRedirectURLKey]; + [aCoder encodeObject:_state forKey:kStateKey]; + [aCoder encodeObject:_codeVerifier forKey:kCodeVerifierKey]; + [aCoder encodeObject:_codeChallenge forKey:kCodeChallengeKey]; + [aCoder encodeObject:_codeChallengeMethod forKey:kCodeChallengeMethodKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, request: %@>", + NSStringFromClass([self class]), + self, + self.authorizationRequestURL]; +} + +#pragma mark - State and PKCE verifier/challenge generation Methods + ++ (nullable NSString *)generateCodeVerifier { + return [OIDTokenUtilities randomURLSafeStringWithSize:kCodeVerifierBytes]; +} + ++ (nullable NSString *)generateState { + return [OIDTokenUtilities randomURLSafeStringWithSize:kStateSizeBytes]; +} + ++ (nullable NSString *)codeChallengeS256ForVerifier:(NSString *)codeVerifier { + if (!codeVerifier) { + return nil; + } + // generates the code_challenge per spec https://tools.ietf.org/html/rfc7636#section-4.2 + // code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) + // NB. the ASCII conversion on the code_verifier entropy was done at time of generation. + NSData *sha256Verifier = [OIDTokenUtilities sha265:codeVerifier]; + return [OIDTokenUtilities encodeBase64urlNoPadding:sha256Verifier]; +} + +#pragma mark - + +- (NSURL *)authorizationRequestURL { + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] init]; + + // Required parameters. + [query addParameter:kResponseTypeKey value:_responseType]; + [query addParameter:kClientIDKey value:_clientID]; + + // Add any additional parameters the client has specified. + [query addParameters:_additionalParameters]; + + // Add optional parameters, as applicable. + if (_redirectURL) { + [query addParameter:kRedirectURLKey value:_redirectURL.absoluteString]; + } + if (_scope) { + [query addParameter:kScopeKey value:_scope]; + } + if (_state) { + [query addParameter:kStateKey value:_state]; + } + if (_codeChallenge) { + [query addParameter:kCodeChallengeKey value:_codeChallenge]; + } + if (_codeChallengeMethod) { + [query addParameter:kCodeChallengeMethodKey value:_codeChallengeMethod]; + } + + // Construct the URL: + return [query URLByReplacingQueryInURL:_configuration.authorizationEndpoint]; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.h b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.h new file mode 100644 index 000000000..79d59baa4 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.h @@ -0,0 +1,128 @@ +/*! @file OIDAuthorizationResponse.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDAuthorizationRequest; +@class OIDTokenRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents the response to an authorization request. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2 + @see https://tools.ietf.org/html/rfc6749#section-5.1 + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@interface OIDAuthorizationResponse : NSObject + +/*! @brief The request which was serviced. + */ +@property(nonatomic, readonly) OIDAuthorizationRequest *request; + +/*! @brief The authorization code generated by the authorization server. + @discussion Set when the response_type requested includes 'code'. + @remarks code + */ +@property(nonatomic, readonly, nullable) NSString *authorizationCode; + +/*! @brief REQUIRED if the "state" parameter was present in the client authorization request. The + exact value received from the client. + @remarks state + */ +@property(nonatomic, readonly, nullable) NSString *state; + +/*! @brief The access token generated by the authorization server. + @discussion Set when the response_type requested includes 'token'. + @remarks access_token + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *accessToken; + +/*! @brief The approximate expiration date & time of the access token. + @discussion Set when the response_type requested includes 'token'. + @remarks expires_in + @seealso OIDAuthorizationResponse.accessToken + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSDate *accessTokenExpirationDate; + +/*! @brief Typically "Bearer" when present. Otherwise, another token_type value that the Client has + negotiated with the Authorization Server. + @discussion Set when the response_type requested includes 'token'. + @remarks token_type + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *tokenType; + +/*! @brief ID Token value associated with the authenticated session. + @discussion Set when the response_type requested includes 'id_token'. + @remarks id_token + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *idToken; + +/*! @brief The scope of the access token. OPTIONAL, if identical to the scopes requested, otherwise, + REQUIRED. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief Additional parameters returned from the authorization server. + */ +@property(nonatomic, readonly, nullable) + NSDictionary *> *additionalParameters; + +/*! @internal + @brief Unavailable. Please use initWithParameters:. + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @brief Designated initializer. + @param request The serviced request. + @param parameters The decoded parameters returned from the Authorization Server. + @remarks Known parameters are extracted from the @c parameters parameter and the normative + properties are populated. Non-normative parameters are placed in the + @c #additionalParameters dictionary. + */ +- (nullable instancetype)initWithRequest:(OIDAuthorizationRequest *)request + parameters:(NSDictionary *> *)parameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Creates a token request suitable for exchanging an authorization code for an access + token. + @return A @c OIDTokenRequest suitable for exchanging an authorization code for an access + token. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (nullable OIDTokenRequest *)tokenExchangeRequest; + +/*! @brief Creates a token request suitable for exchanging an authorization code for an access + token. + @param additionalParameters Additional parameters for the token request. + @return A @c OIDTokenRequest suitable for exchanging an authorization code for an access + token. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (nullable OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters: + (nullable NSDictionary *)additionalParameters; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.m b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.m new file mode 100644 index 000000000..0738412dd --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationResponse.m @@ -0,0 +1,209 @@ +/*! @file OIDAuthorizationResponse.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthorizationResponse.h" + +#import "OIDAuthorizationRequest.h" +#import "OIDDefines.h" +#import "OIDError.h" +#import "OIDFieldMapping.h" +#import "OIDTokenRequest.h" + +/*! @brief The key for the @c authorizationCode property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kAuthorizationCodeKey = @"code"; + +/*! @brief The key for the @c state property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kStateKey = @"state"; + +/*! @brief The key for the @c accessToken property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kAccessTokenKey = @"access_token"; + +/*! @brief The key for the @c accessTokenExpirationDate property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kExpiresInKey = @"expires_in"; + +/*! @brief The key for the @c tokenType property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kTokenTypeKey = @"token_type"; + +/*! @brief The key for the @c idToken property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kIDTokenKey = @"id_token"; + +/*! @brief The key for the @c scope property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c additionalParameters property for @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +/*! @brief Key used to encode the @c request property for @c NSSecureCoding + */ +static NSString *const kRequestKey = @"request"; + +/*! @brief The exception thrown when a developer tries to create a token exchange request from an + authorization request with no authorization code. + */ +static NSString *const kTokenExchangeRequestException = + @"Attempted to create a token exchange request from an authorization response with no " + "authorization code."; + +@implementation OIDAuthorizationResponse + +/*! @brief Returns a mapping of incoming parameters to instance variables. + @return A mapping of incoming parameters to instance variables. + */ ++ (NSDictionary *)fieldMap { + static NSMutableDictionary *fieldMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + fieldMap = [NSMutableDictionary dictionary]; + fieldMap[kStateKey] = + [[OIDFieldMapping alloc] initWithName:@"_state" type:[NSString class]]; + fieldMap[kAuthorizationCodeKey] = + [[OIDFieldMapping alloc] initWithName:@"_authorizationCode" type:[NSString class]]; + fieldMap[kAccessTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessToken" type:[NSString class]]; + fieldMap[kExpiresInKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessTokenExpirationDate" + type:[NSDate class] + conversion:^id _Nullable(NSObject *_Nullable value) { + if (![value isKindOfClass:[NSNumber class]]) { + return value; + } + NSNumber *valueAsNumber = (NSNumber *)value; + return [NSDate dateWithTimeIntervalSinceNow:[valueAsNumber longLongValue]]; + }]; + fieldMap[kTokenTypeKey] = + [[OIDFieldMapping alloc] initWithName:@"_tokenType" type:[NSString class]]; + fieldMap[kIDTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_idToken" type:[NSString class]]; + fieldMap[kScopeKey] = + [[OIDFieldMapping alloc] initWithName:@"_scope" type:[NSString class]]; + }); + return fieldMap; +} + +#pragma mark - Initializers + +- (nullable instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithRequest:parameters:)); + +- (nullable instancetype)initWithRequest:(OIDAuthorizationRequest *)request + parameters:(NSDictionary *> *)parameters { + self = [super init]; + if (self) { + _request = [request copy]; + NSDictionary *> *additionalParameters = + [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap] + parameters:parameters + instance:self]; + _additionalParameters = additionalParameters; + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDAuthorizationRequest *request = + [aDecoder decodeObjectOfClass:[OIDAuthorizationRequest class] forKey:kRequestKey]; + self = [self initWithRequest:request parameters:@{ }]; + if (self) { + [OIDFieldMapping decodeWithCoder:aDecoder map:[[self class] fieldMap] instance:self]; + _additionalParameters = [aDecoder decodeObjectOfClasses:[OIDFieldMapping JSONTypes] + forKey:kAdditionalParametersKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_request forKey:kRequestKey]; + [OIDFieldMapping encodeWithCoder:aCoder map:[[self class] fieldMap] instance:self]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, authorizationCode: %@, state: \"%@\", accessToken: " + "\"%@\", accessTokenExpirationDate: %@, tokenType: %@, " + "idToken: \"%@\", scope: \"%@\", additionalParameters: %@, " + "request: %@>", + NSStringFromClass([self class]), + self, + _authorizationCode, + _state, + _accessToken, + _accessTokenExpirationDate, + _tokenType, + _idToken, + _scope, + _additionalParameters, + _request]; +} + +#pragma mark - + +- (OIDTokenRequest *)tokenExchangeRequest { + return [self tokenExchangeRequestWithAdditionalParameters:nil]; +} + +- (OIDTokenRequest *)tokenExchangeRequestWithAdditionalParameters: + (NSDictionary *)additionalParameters { + // TODO: add a unit test to confirm exception is thrown when expected and the request is created + // with the correct parameters. + if (!_authorizationCode) { + [NSException raise:kTokenExchangeRequestException + format:kTokenExchangeRequestException]; + } + return [[OIDTokenRequest alloc] initWithConfiguration:_request.configuration + grantType:OIDGrantTypeAuthorizationCode + authorizationCode:_authorizationCode + redirectURL:_request.redirectURL + clientID:_request.clientID + clientSecret:_request.clientSecret + scope:_scope + refreshToken:nil + codeVerifier:_request.codeVerifier + additionalParameters:additionalParameters]; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.h b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.h new file mode 100644 index 000000000..c71409220 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.h @@ -0,0 +1,156 @@ +/*! @file OIDAuthorizationService.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDAuthorization; +@class OIDAuthorizationRequest; +@class OIDAuthorizationResponse; +@class OIDServiceConfiguration; +@class OIDTokenRequest; +@class OIDTokenResponse; +@protocol OIDAuthorizationFlowSession; +@protocol OIDAuthorizationUICoordinator; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents the type of block used as a callback for creating a service configuration from + a remote OpenID Connect Discovery document. + @param configuration The service configuration, if available. + @param error The error if an error occurred. + */ +typedef void (^OIDDiscoveryCallback)(OIDServiceConfiguration *_Nullable configuration, + NSError *_Nullable error); + +/*! @brief Represents the type of block used as a callback for various methods of + @c OIDAuthorizationService. + @param authorizationResponse The authorization response, if available. + @param error The error if an error occurred. + */ +typedef void (^OIDAuthorizationCallback)(OIDAuthorizationResponse *_Nullable authorizationResponse, + NSError *_Nullable error); + +/*! @brief Represents the type of block used as a callback for various methods of + @c OIDAuthorizationService. + @param tokenResponse The token response, if available. + @param error The error if an error occurred. + */ +typedef void (^OIDTokenCallback)(OIDTokenResponse *_Nullable tokenResponse, + NSError *_Nullable error); + +/*! @brief Represents the type of dictionary used to specify additional querystring parameters + when making authorization or token endpoint requests. + */ +typedef NSDictionary *_Nullable OIDTokenEndpointParameters; + +/*! @brief Performs various OAuth and OpenID Connect related calls via the user agent or + \NSURLSession. + */ +@interface OIDAuthorizationService : NSObject + +/*! @brief The service's configuration. + @remarks Each authorization service is initialized with a configuration. This configuration + specifies how to connect to a particular OAuth provider. Clients should use separate + authorization service instances for each provider they wish to integrate with. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @internal + @brief Unavailable. This class should not be initialized. + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @brief Convenience method for creating an authorization service configuration from an OpenID + Connect compliant issuer URL. + @param issuerURL The service provider's OpenID Connect issuer. + @param completion A block which will be invoked when the authorization service configuration has + been created, or when an error has occurred. + @see https://openid.net/specs/openid-connect-discovery-1_0.html + */ ++ (void)discoverServiceConfigurationForIssuer:(NSURL *)issuerURL + completion:(OIDDiscoveryCallback)completion; + + +/*! @brief Convenience method for creating an authorization service configuration from an OpenID + Connect compliant identity provider's discovery document. + @param discoveryURL The URL of the service provider's OpenID Connect discovery document. + @param completion A block which will be invoked when the authorization service configuration has + been created, or when an error has occurred. + @see https://openid.net/specs/openid-connect-discovery-1_0.html + */ ++ (void)discoverServiceConfigurationForDiscoveryURL:(NSURL *)discoveryURL + completion:(OIDDiscoveryCallback)completion; + +/*! @brief Perform an authorization flow using a generic flow shim. + @param request The authorization request. + @param UICoordinator Generic authorization UI coordinator that can present an authorization + request. + @param callback The method called when the request has completed or failed. + @return A @c OIDAuthorizationFlowSession instance which will terminate when it + receives a @c OIDAuthorizationFlowSession.cancel message, or after processing a + @c OIDAuthorizationFlowSession.resumeAuthorizationFlowWithURL: message. + */ ++ (id) + presentAuthorizationRequest:(OIDAuthorizationRequest *)request + UICoordinator:(id)UICoordinator + callback:(OIDAuthorizationCallback)callback; + +/*! @brief Performs a token request. + @param request The token request. + @param callback The method called when the request has completed or failed. + */ ++ (void)performTokenRequest:(OIDTokenRequest *)request callback:(OIDTokenCallback)callback; + +@end + +/*! @brief Represents an in-flight authorization flow session. + */ +@protocol OIDAuthorizationFlowSession + +/*! @brief Cancels the code flow session, invoking the request's callback with a cancelled error. + @remarks Has no effect if called more than once, or after a + @c OIDAuthorizationFlowSession.resumeAuthorizationFlowWithURL: message was received. Will + cause an error with code: @c ::OIDErrorCodeProgramCanceledAuthorizationFlow to be passed to + the @c callback block passed to + @c OIDAuthorizationService.presentAuthorizationRequest:presentingViewController:callback: + */ +- (void)cancel; + +/*! @brief Clients should call this method with the result of the authorization code flow if it + becomes available. + @param URL The redirect URL invoked by the authorization server. + @discussion When the URL represented a valid authorization response, implementations + should clean up any left-over UI state from the authorization, for example by + closing the \SFSafariViewController or looback HTTP listener if those were used. + The completion block of the pending authorization request should then be invoked. + @remarks Has no effect if called more than once, or after a @c cancel message was received. + @return YES if the passed URL matches the expected redirect URL and was consumed, NO otherwise. + */ +- (BOOL)resumeAuthorizationFlowWithURL:(NSURL *)URL; + +/*! @brief @c OIDAuthorizationUICoordinator or clients should call this method when the + authorization flow failed with a non-OAuth error. + @param error The error that is the reason for the failure of this authorization flow. + @remarks Has no effect if called more than once, or after a @c cancel message was received. + */ +- (void)failAuthorizationFlowWithError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.m b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.m new file mode 100644 index 000000000..b9b2f2f72 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationService.m @@ -0,0 +1,354 @@ +/*! @file OIDAuthorizationService.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthorizationService.h" + +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationUICoordinator.h" +#import "OIDDefines.h" +#import "OIDErrorUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDServiceDiscovery.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" +#import "OIDURLQueryComponent.h" + +/*! @brief Path appended to an OpenID Connect issuer for discovery + @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig + */ +static NSString *const kOpenIDConfigurationWellKnownPath = @".well-known/openid-configuration"; + +/*! @brief The state authorization parameter. + */ +static NSString *const kStateParameter = @"state"; + +NS_ASSUME_NONNULL_BEGIN + +@interface OIDAuthorizationFlowSessionImplementation : NSObject + +- (instancetype)init NS_UNAVAILABLE; + +- (nullable instancetype)initWithRequest:(OIDAuthorizationRequest *)request + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation OIDAuthorizationFlowSessionImplementation { + OIDAuthorizationRequest *_request; + id _UICoordinator; + OIDAuthorizationCallback _pendingauthorizationFlowCallback; +} + +- (nullable instancetype)initWithRequest:(OIDAuthorizationRequest *)request { + self = [super init]; + if (self) { + _request = [request copy]; + } + return self; +} + +- (void)presentAuthorizationWithCoordinator:(id)UICoordinator + callback:(OIDAuthorizationCallback)authorizationFlowCallback { + _UICoordinator = UICoordinator; + _pendingauthorizationFlowCallback = authorizationFlowCallback; + NSURL *URL = [_request authorizationRequestURL]; + BOOL authorizationFlowStarted = [_UICoordinator presentAuthorizationWithURL:URL session:self]; + if (!authorizationFlowStarted) { + NSError *safariError = [OIDErrorUtilities errorWithCode:OIDErrorCodeSafariOpenError + underlyingError:nil + description:@"Unable to open Safari."]; + [self didFinishWithResponse:nil error:safariError]; + } +} + +- (void)cancel { + [_UICoordinator dismissAuthorizationAnimated:YES + completion:^{ + NSError *error = [OIDErrorUtilities + errorWithCode:OIDErrorCodeUserCanceledAuthorizationFlow + underlyingError:nil + description:nil]; + [self didFinishWithResponse:nil error:error]; + }]; +} + +- (BOOL)shouldHandleURL:(NSURL *)URL { + NSURL *standardizedURL = [URL standardizedURL]; + NSURL *standardizedRedirectURL = [_request.redirectURL standardizedURL]; + + return OIDIsEqualIncludingNil(standardizedURL.scheme, standardizedRedirectURL.scheme) && + OIDIsEqualIncludingNil(standardizedURL.user, standardizedRedirectURL.user) && + OIDIsEqualIncludingNil(standardizedURL.password, standardizedRedirectURL.password) && + OIDIsEqualIncludingNil(standardizedURL.host, standardizedRedirectURL.host) && + OIDIsEqualIncludingNil(standardizedURL.port, standardizedRedirectURL.port) && + OIDIsEqualIncludingNil(standardizedURL.path, standardizedRedirectURL.path); +} + +- (BOOL)resumeAuthorizationFlowWithURL:(NSURL *)URL { + // rejects URLs that don't match redirect (these may be completely unrelated to the authorization) + if (![self shouldHandleURL:URL]) { + return NO; + } + // checks for an invalid state + if (!_pendingauthorizationFlowCallback) { + [NSException raise:OIDOAuthExceptionInvalidAuthorizationFlow + format:@"%@", OIDOAuthExceptionInvalidAuthorizationFlow, nil]; + } + + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] initWithURL:URL]; + + NSError *error; + OIDAuthorizationResponse *response = nil; + + // checks for an OAuth error response as per RFC6749 Section 4.1.2.1 + if (query.dictionaryValue[OIDOAuthErrorFieldError]) { + error = [OIDErrorUtilities OAuthErrorWithDomain:OIDOAuthAuthorizationErrorDomain + OAuthResponse:query.dictionaryValue + underlyingError:nil]; + } + + // verifies that the state in the response matches the state in the request, or both are nil + if (!OIDIsEqualIncludingNil(_request.state, query.dictionaryValue[kStateParameter])) { + NSMutableDictionary *userInfo = [query.dictionaryValue mutableCopy]; + userInfo[NSLocalizedDescriptionKey] = + [NSString stringWithFormat:@"State mismatch, expecting %@ but got %@ in authorization " + "response %@", + _request.state, + response.state, + response]; + response = nil; + error = [NSError errorWithDomain:OIDOAuthAuthorizationErrorDomain + code:OIDErrorCodeOAuthAuthorizationClientError + userInfo:userInfo]; + } + + // no error, should be a valid OAuth 2.0 response + if (!error) { + response = [[OIDAuthorizationResponse alloc] initWithRequest:_request + parameters:query.dictionaryValue]; + } + + [_UICoordinator dismissAuthorizationAnimated:YES + completion:^{ + [self didFinishWithResponse:response error:error]; + }]; + + return YES; +} + +- (void)failAuthorizationFlowWithError:(NSError *)error { + [self didFinishWithResponse:nil error:error]; +} + +/*! @brief Invokes the pending callback and performs cleanup. + @param response The authorization response, if any to return to the callback. + @param error The error, if any, to return to the callback. + */ +- (void)didFinishWithResponse:(nullable OIDAuthorizationResponse *)response + error:(nullable NSError *)error { + OIDAuthorizationCallback callback = _pendingauthorizationFlowCallback; + _pendingauthorizationFlowCallback = nil; + _UICoordinator = nil; + if (callback) { + callback(response, error); + } +} + +@end + +@implementation OIDAuthorizationService + ++ (void)discoverServiceConfigurationForIssuer:(NSURL *)issuerURL + completion:(OIDDiscoveryCallback)completion { + NSURL *fullDiscoveryURL = + [issuerURL URLByAppendingPathComponent:kOpenIDConfigurationWellKnownPath]; + + return [[self class] discoverServiceConfigurationForDiscoveryURL:fullDiscoveryURL + completion:completion]; +} + ++ (void)discoverServiceConfigurationForDiscoveryURL:(NSURL *)discoveryURL + completion:(OIDDiscoveryCallback)completion { + + NSURLSession *session = [NSURLSession sharedSession]; + NSURLSessionDataTask *task = + [session dataTaskWithURL:discoveryURL + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + // If we got any sort of error, just report it. + if (error || !data) { + error = [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:error + description:error.localizedDescription]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + return; + } + + NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response; + + // Check for non-200 status codes. + // https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationResponse + if (urlResponse.statusCode != 200) { + NSError *URLResponseError = [OIDErrorUtilities HTTPErrorWithHTTPResponse:urlResponse + data:data]; + error = [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:URLResponseError + description:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + return; + } + + // Construct an OIDServiceDiscovery with the received JSON. + OIDServiceDiscovery *discovery = + [[OIDServiceDiscovery alloc] initWithJSONData:data error:&error]; + if (error || !discovery) { + error = [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:error + description:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + return; + } + + // Create our service configuration with the discovery document and return it. + OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] initWithDiscoveryDocument:discovery]; + dispatch_async(dispatch_get_main_queue(), ^{ + completion(configuration, nil); + }); + }]; + [task resume]; +} + +#pragma mark - Authorization Endpoint + ++ (id) + presentAuthorizationRequest:(OIDAuthorizationRequest *)request + UICoordinator:(id)UICoordinator + callback:(OIDAuthorizationCallback)callback { + OIDAuthorizationFlowSessionImplementation *flowSession = + [[OIDAuthorizationFlowSessionImplementation alloc] initWithRequest:request]; + [flowSession presentAuthorizationWithCoordinator:UICoordinator callback:callback]; + return flowSession; +} + +#pragma mark - Token Endpoint + ++ (void)performTokenRequest:(OIDTokenRequest *)request callback:(OIDTokenCallback)callback { + NSURLRequest *URLRequest = [request URLRequest]; + NSURLSession *session = [NSURLSession sharedSession]; + [[session dataTaskWithRequest:URLRequest + completionHandler:^(NSData *_Nullable data, + NSURLResponse *_Nullable response, + NSError *_Nullable error) { + if (error) { + // A network error or server error occurred. + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeNetworkError + underlyingError:error + description:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response; + NSInteger statusCode = HTTPURLResponse.statusCode; + if (statusCode != 200) { + // A server error occurred. + NSError *serverError = + [OIDErrorUtilities HTTPErrorWithHTTPResponse:HTTPURLResponse data:data]; + + // HTTP 400 may indicate an RFC6749 Section 5.2 error response. + // HTTP 429 may occur during polling for device-flow requests for the slow_down error + // https://tools.ietf.org/html/draft-ietf-oauth-device-flow-03#section-3.5 + if (statusCode == 400 || statusCode == 429) { + NSError *jsonDeserializationError; + NSDictionary *> *json = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonDeserializationError]; + + // if the HTTP 400 response parses as JSON and has an 'error' key, it's an OAuth error + // these errors are special as they indicate a problem with the authorization grant + if (json[OIDOAuthErrorFieldError]) { + NSError *oauthError = + [OIDErrorUtilities OAuthErrorWithDomain:OIDOAuthTokenErrorDomain + OAuthResponse:json + underlyingError:serverError]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, oauthError); + }); + return; + } + } + + // not an OAuth error, just a generic server error + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeServerError + underlyingError:serverError + description:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + NSError *jsonDeserializationError; + NSDictionary *> *json = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonDeserializationError]; + if (jsonDeserializationError) { + // A problem occurred deserializing the response/JSON. + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeJSONDeserializationError + underlyingError:jsonDeserializationError + description:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + OIDTokenResponse *tokenResponse = + [[OIDTokenResponse alloc] initWithRequest:request parameters:json]; + if (!tokenResponse) { + // A problem occurred constructing the token response from the JSON. + NSError *returnedError = + [OIDErrorUtilities errorWithCode:OIDErrorCodeTokenResponseConstructionError + underlyingError:jsonDeserializationError + description:nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + callback(nil, returnedError); + }); + return; + } + + // Success + dispatch_async(dispatch_get_main_queue(), ^{ + callback(tokenResponse, nil); + }); + }] resume]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationUICoordinator.h b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationUICoordinator.h new file mode 100644 index 000000000..a20de6b78 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDAuthorizationUICoordinator.h @@ -0,0 +1,51 @@ +/*! @file OIDAuthorizationUICoordinator.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +@protocol OIDAuthorizationFlowSession; + +NS_ASSUME_NONNULL_BEGIN + +/*! @protocol OIDAuthorizationUICoordinator + @brief An authorization UI coordinator that presents an authorization request. Clients may + provide custom implementations of an authorization UI coordinator to customize the way the + authorization request is presented to the user. + */ +@protocol OIDAuthorizationUICoordinator + +/*! @brief Presents the authorization UI for the given URL. + @param URL The URL that should be used when presenting the authorization UI. + @param session The @c OIDAuthorizationFlowSession instance that initiates presenting the + authorization UI. Concrete implementations of a @c OIDAuthorizationUICoordinator may call + resumeAuthorizationFlowWithURL or failAuthorizationFlowWithError on session to either + resume or fail the authorization. + @return YES If the authorization UI was successfully presented to the user. + */ +- (BOOL)presentAuthorizationWithURL:(NSURL *)URL session:(id)session; + +/*! @brief Dimisses the authorization UI and calls completion when the dismiss operation ends. + @param animated Wheter or not the dismiss operation should be animated. + @remarks Has no effect if no authorization UI is presented. + @param completion The block to be called when the dismiss operations ends + */ +- (void)dismissAuthorizationAnimated:(BOOL)animated completion:(void (^)(void))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDDefines.h b/Paco-iOS/Pods/AppAuth/Source/OIDDefines.h new file mode 100644 index 000000000..0dccf842a --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDDefines.h @@ -0,0 +1,44 @@ +/*! @file OIDDefines.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + */ + +/*! @def OIDIsEqualIncludingNil(x, y) + @brief Returns YES if x and y are equal by reference or value. + @discussion NOTE: parameters may be evaluated multiple times. Be careful if using this check + with expressions - especially if the expressions have side effects. + @param x An object. + @param y An object. + */ +#define OIDIsEqualIncludingNil(x, y) (((x) == (y)) || [(x) isEqual:(y)]) + +/*! @def OID_UNAVAILABLE_USE_INITIALIZER(designatedInitializer) + @brief Provides a template implementation for init-family methods which have been marked as + NS_UNAVILABLE. Stops the compiler from giving a warning when it's the super class' + designated initializer, and gives callers useful feedback telling them what the + new designated initializer is. + @remarks Takes a SEL as a parameter instead of a string so that we get compiler warnings if the + designated intializer's signature changes. + @param designatedInitializer A SEL referencing the designated initializer. + */ +#define OID_UNAVAILABLE_USE_INITIALIZER(designatedInitializer) { \ + NSString *reason = [NSString stringWithFormat:@"Called: %@\nDesignated Initializer:%@", \ + NSStringFromSelector(_cmd), \ + NSStringFromSelector(designatedInitializer)]; \ + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." \ + reason:reason \ + userInfo:nil]; \ +} diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDError.h b/Paco-iOS/Pods/AppAuth/Source/OIDError.h new file mode 100644 index 000000000..01afbfcb4 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDError.h @@ -0,0 +1,318 @@ +/*! @file OIDError.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The error domain for all NSErrors returned from the AppAuth library. + */ +extern NSString *const OIDGeneralErrorDomain; + +/*! @brief The error domain for OAuth specific errors on the authorization endpoint. + @discussion This error domain is used when the server responds to an authorization request + with an explicit OAuth error, as defined by RFC6749 Section 4.1.2.1. If the authorization + response is invalid and not explicitly an error response, another error domain will be used. + The error response parameter dictionary is available in the + \NSError_userInfo dictionary using the @c ::OIDOAuthErrorResponseErrorKey key. + The \NSError_code will be one of the @c ::OIDErrorCodeOAuthAuthorization enum values. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ +extern NSString *const OIDOAuthAuthorizationErrorDomain; + +/*! @brief The error domain for OAuth specific errors on the token endpoint. + @discussion This error domain is used when the server responds with HTTP 400 and an OAuth error, + as defined RFC6749 Section 5.2. If an HTTP 400 response does not parse as an OAuth error + (i.e. no 'error' field is present or the JSON is invalid), another error domain will be + used. The entire OAuth error response dictionary is available in the \NSError_userInfo + dictionary using the @c ::OIDOAuthErrorResponseErrorKey key. Unlike transient network + errors, errors in this domain invalidate the authentication state, and either indicate a + client error or require user interaction (i.e. reauthentication) to resolve. + The \NSError_code will be one of the @c ::OIDErrorCodeOAuthToken enum values. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthTokenErrorDomain; + +/*! @brief The error domain for authorization errors encountered out of band on the resource server. + */ +extern NSString *const OIDResourceServerAuthorizationErrorDomain; + +/*! @brief An error domain representing received HTTP errors. + */ +extern NSString *const OIDHTTPErrorDomain; + +/*! @brief An error key for the original OAuth error response (if any). + */ +extern NSString *const OIDOAuthErrorResponseErrorKey; + +/*! @brief The key of the 'error' response field in a RFC6749 Section 5.2 response. + @remark error + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthErrorFieldError; + +/*! @brief The key of the 'error_description' response field in a RFC6749 Section 5.2 response. + @remark error_description + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthErrorFieldErrorDescription; + +/*! @brief The key of the 'error_uri' response field in a RFC6749 Section 5.2 response. + @remark error_uri + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +extern NSString *const OIDOAuthErrorFieldErrorURI; + +/*! @brief The various error codes returned from the AppAuth library. + */ +typedef NS_ENUM(NSInteger, OIDErrorCode) { + /*! @brief Indicates a problem parsing an OpenID Connect Service Discovery document. + */ + OIDErrorCodeInvalidDiscoveryDocument = -2, + + /*! @brief Indicates the user manually canceled the OAuth authorization code flow. + */ + OIDErrorCodeUserCanceledAuthorizationFlow = -3, + + /*! @brief Indicates an OAuth authorization flow was programmatically cancelled. + */ + OIDErrorCodeProgramCanceledAuthorizationFlow = -4, + + /*! @brief Indicates a network error or server error occurred. + */ + OIDErrorCodeNetworkError = -5, + + /*! @brief Indicates a server error occurred. + */ + OIDErrorCodeServerError = -6, + + /*! @brief Indicates a problem occurred deserializing the response/JSON. + */ + OIDErrorCodeJSONDeserializationError = -7, + + /*! @brief Indicates a problem occurred constructing the token response from the JSON. + */ + OIDErrorCodeTokenResponseConstructionError = -8, + + /*! @brief @c UIApplication.openURL: returned NO when attempting to open the authorization + request in mobile Safari. + */ + OIDErrorCodeSafariOpenError = -9, + + /*! @brief @c NSWorkspace.openURL returned NO when attempting to open the authorization + request in the default browser. + */ + OIDErrorCodeBrowserOpenError = -10, + + /*! @brief Indicates a problem when trying to refresh the tokens. + */ + OIDErrorCodeTokenRefreshError = -11, + + +}; + +/*! @brief Enum of all possible OAuth error codes as defined by RFC6749 + @discussion Used by @c ::OIDErrorCodeOAuthAuthorization and @c ::OIDErrorCodeOAuthToken + which define endpoint-specific subsets of OAuth codes. Those enum types are down-castable + to this one. + @see https://tools.ietf.org/html/rfc6749#section-11.4 + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +typedef NS_ENUM(NSInteger, OIDErrorCodeOAuth) { + + /*! @remarks invalid_request + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidRequest = -2, + + /*! @remarks unauthorized_client + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthUnauthorizedClient = -3, + + /*! @remarks access_denied + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAccessDenied = -4, + + /*! @remarks unsupported_response_type + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthUnsupportedResponseType = -5, + + /*! @remarks invalid_scope + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidScope = -6, + + /*! @remarks server_error + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthServerError = -7, + + /*! @remarks temporarily_unavailable + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthTemporarilyUnavailable = -8, + + /*! @remarks invalid_client + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidClient = -9, + + /*! @remarks invalid_grant + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthInvalidGrant = -10, + + /*! @remarks unsupported_grant_type + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthUnsupportedGrantType = -11, + + /*! @brief An authorization error occurring on the client rather than the server. For example, + due to a state mismatch or misconfiguration. Should be treated as an unrecoverable + authorization error. + */ + OIDErrorCodeOAuthClientError = -0xEFFF, + + /*! @brief An OAuth error not known to this library + @discussion Indicates an OAuth error as per RFC6749, but the error code was not in our + list. It could be a custom error code, or one from an OAuth extension. See the "error" key + of the \NSError_userInfo property. Such errors are assumed to invalidate the + authentication state + */ + OIDErrorCodeOAuthOther = -0xF000, +}; + +/*! @brief The error codes for the @c ::OIDOAuthAuthorizationErrorDomain error domain + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ +typedef NS_ENUM(NSInteger, OIDErrorCodeOAuthAuthorization) { + /*! @remarks invalid_request + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationInvalidRequest = OIDErrorCodeOAuthInvalidRequest, + + /*! @remarks unauthorized_client + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationUnauthorizedClient = OIDErrorCodeOAuthUnauthorizedClient, + + /*! @remarks access_denied + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationAccessDenied = + OIDErrorCodeOAuthAccessDenied, + + /*! @remarks unsupported_response_type + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationUnsupportedResponseType = + OIDErrorCodeOAuthUnsupportedResponseType, + + /*! @brief Indicates a network error or server error occurred. + @remarks invalid_scope + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationAuthorizationInvalidScope = OIDErrorCodeOAuthInvalidScope, + + /*! @brief Indicates a server error occurred. + @remarks server_error + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationServerError = OIDErrorCodeOAuthServerError, + + /*! @remarks temporarily_unavailable + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationTemporarilyUnavailable = OIDErrorCodeOAuthTemporarilyUnavailable, + + /*! @brief An authorization error occurring on the client rather than the server. For example, + due to a state mismatch or client misconfiguration. Should be treated as an unrecoverable + authorization error. + */ + OIDErrorCodeOAuthAuthorizationClientError = OIDErrorCodeOAuthClientError, + + /*! @brief An authorization OAuth error not known to this library + @discussion this indicates an OAuth error as per RFC6749, but the error code was not in our + list. It could be a custom error code, or one from an OAuth extension. See the "error" key + of the \NSError_userInfo property. We assume such errors are not transient. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ + OIDErrorCodeOAuthAuthorizationOther = OIDErrorCodeOAuthOther, +}; + + +/*! @brief The error codes for the @c ::OIDOAuthTokenErrorDomain error domain + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ +typedef NS_ENUM(NSInteger, OIDErrorCodeOAuthToken) { + /*! @remarks invalid_request + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidRequest = OIDErrorCodeOAuthInvalidRequest, + + /*! @remarks invalid_client + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidClient = OIDErrorCodeOAuthInvalidClient, + + /*! @remarks invalid_grant + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidGrant = OIDErrorCodeOAuthInvalidGrant, + + /*! @remarks unauthorized_client + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenUnauthorizedClient = OIDErrorCodeOAuthUnauthorizedClient, + + /*! @remarks unsupported_grant_type + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenUnsupportedGrantType = OIDErrorCodeOAuthUnsupportedGrantType, + + /*! @remarks invalid_scope + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenInvalidScope = OIDErrorCodeOAuthInvalidScope, + + /*! @brief An unrecoverable token error occurring on the client rather than the server. + */ + OIDErrorCodeOAuthTokenClientError = OIDErrorCodeOAuthClientError, + + /*! @brief A token endpoint OAuth error not known to this library + @discussion this indicates an OAuth error as per RFC6749, but the error code was not in our + list. It could be a custom error code, or one from an OAuth extension. See the "error" key + of the \NSError_userInfo property. We assume such errors are not transient. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ + OIDErrorCodeOAuthTokenOther = OIDErrorCodeOAuthOther, +}; + +/*! @brief The exception text for the exception which occurs when a + @c OIDAuthorizationFlowSession receives a message after it has already completed. + */ +extern NSString *const OIDOAuthExceptionInvalidAuthorizationFlow; + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDError.m b/Paco-iOS/Pods/AppAuth/Source/OIDError.m new file mode 100644 index 000000000..4342af4c6 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDError.m @@ -0,0 +1,40 @@ +/*! @file OIDError.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDError.h" + +NSString *const OIDGeneralErrorDomain = @"org.openid.appauth.general"; + +NSString *const OIDOAuthTokenErrorDomain = @"org.openid.appauth.oauth_token"; + +NSString *const OIDOAuthAuthorizationErrorDomain = @"org.openid.appauth.oauth_authorization"; + +NSString *const OIDResourceServerAuthorizationErrorDomain = @"org.openid.appauth.resourceserver"; + +NSString *const OIDHTTPErrorDomain = @"org.openid.appauth.remote-http"; + +NSString *const OIDOAuthExceptionInvalidAuthorizationFlow = @"An OAuth redirect was sent to a " + "OIDAuthorizationFlowSession after it already completed."; + +NSString *const OIDOAuthErrorResponseErrorKey = @"OIDOAuthErrorResponseErrorKey"; + +NSString *const OIDOAuthErrorFieldError = @"error"; + +NSString *const OIDOAuthErrorFieldErrorDescription = @"error_description"; + +NSString *const OIDOAuthErrorFieldErrorURI = @"error_uri"; diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.h b/Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.h new file mode 100644 index 000000000..fb98a5579 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.h @@ -0,0 +1,107 @@ +/*! @file OIDErrorUtilities.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDError.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Convenience methods for creating standardized \NSError instances. + */ +@interface OIDErrorUtilities : NSObject + +/*! @brief Creates a standard \NSError from an @c ::OIDErrorCode and custom user info. + Automatically populates the localized error description. + @param code The error code. + @param underlyingError The underlying error which occurred, if applicable. + @param description A custom description, if applicable. + @return An \NSError representing the error code. + */ ++ (nullable NSError *)errorWithCode:(OIDErrorCode)code + underlyingError:(nullable NSError *)underlyingError + description:(nullable NSString *)description; + +/*! @brief Creates a standard \NSError from an @c ::OIDErrorCode and custom user info. + Automatically populates the localized error description. + @param OAuthErrorDomain The OAuth error domain. Must be @c ::OIDOAuthAuthorizationErrorDomain or + @c ::OIDOAuthTokenErrorDomain. + @param errorResponse The dictionary from an OAuth error response (as per RFC6749 Section 5.2). + @param underlyingError The underlying error which occurred, if applicable. + @return An \NSError representing the OAuth error. + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ ++ (nullable NSError *)OAuthErrorWithDomain:(NSString *)OAuthErrorDomain + OAuthResponse:(NSDictionary *)errorResponse + underlyingError:(nullable NSError *)underlyingError; + +/*! @brief Creates a \NSError indicating that the resource server responded with an authorization + error. + @param code Your error code. + @param errorResponse The resource server error response, if any. + @param underlyingError The underlying error which occurred, if applicable. + @return An \NSError representing the authorization error from the resource server. + */ ++ (nullable NSError *)resourceServerAuthorizationErrorWithCode:(NSInteger)code + errorResponse:(nullable NSDictionary *)errorResponse + underlyingError:(nullable NSError *)underlyingError; + + +/*! @brief Creates a standard \NSError from an \NSHTTPURLResponse. Automatically + populates the localized error description with the response data associated with the + \NSHTTPURLResponse, if available. + @param HTTPURLResponse The response which indicates an error occurred. + @param data The response data associated with the response which should be converted to an + @c NSString assuming a UTF-8 encoding, if available. + @return An \NSError representing the error. + */ ++ (nullable NSError *)HTTPErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPURLResponse + data:(nullable NSData *)data; + +/*! @brief Raises an exception with the given name as both the name, and the message. + @param name The name of the exception. + */ ++ (void)raiseException:(NSString *)name; + +/*! @brief Raises an exception with the given name and message. + @param name The name of the exception. + @param message The message of the exception. + */ ++ (void)raiseException:(NSString *)name message:(NSString *)message; + +/*! @brief Converts an OAuth error code into an @c ::OIDErrorCodeOAuth error code. + @param errorCode The OAuth error code. + @discussion Returns @c ::OIDErrorCodeOAuthOther if the string is not in AppAuth's list. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ ++ (OIDErrorCodeOAuth)OAuthErrorCodeFromString:(NSString *)errorCode; + +/*! @brief Returns true if the given error domain is an OAuth error domain. + @param errorDomain The error domain to test. + @discussion An OAuth error domain is used for errors returned per RFC6749 sections 4.1.2.1 and + 5.2. Other errors, such as network errors can also occur but they will not have an OAuth + error domain. + @see https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + @see https://tools.ietf.org/html/rfc6749#section-5.2 + */ ++ (BOOL)isOAuthErrorDomain:(NSString*)errorDomain; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.m b/Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.m new file mode 100644 index 000000000..126f9c1b8 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDErrorUtilities.m @@ -0,0 +1,160 @@ +/*! @file OIDErrorUtilities.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDErrorUtilities.h" + +@implementation OIDErrorUtilities + ++ (nullable NSError *)errorWithCode:(OIDErrorCode)code + underlyingError:(NSError *)underlyingError + description:(NSString *)description { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + if (description) { + userInfo[NSLocalizedDescriptionKey] = description; + } + // TODO: Populate localized description based on code. + NSError *error = [NSError errorWithDomain:OIDGeneralErrorDomain + code:code + userInfo:userInfo]; + return error; +} + ++ (BOOL)isOAuthErrorDomain:(NSString *)errorDomain { + return errorDomain == OIDOAuthAuthorizationErrorDomain + || errorDomain == OIDOAuthTokenErrorDomain; +} + ++ (nullable NSError *)resourceServerAuthorizationErrorWithCode:(NSInteger)code + errorResponse:(nullable NSDictionary *)errorResponse + underlyingError:(nullable NSError *)underlyingError { + // builds the userInfo dictionary with the full OAuth response and other information + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (errorResponse) { + userInfo[OIDOAuthErrorResponseErrorKey] = errorResponse; + } + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + NSError *error = [NSError errorWithDomain:OIDResourceServerAuthorizationErrorDomain + code:code + userInfo:userInfo]; + return error; +} + ++ (nullable NSError *)OAuthErrorWithDomain:(NSString *)oAuthErrorDomain + OAuthResponse:(NSDictionary *)errorResponse + underlyingError:(NSError *)underlyingError { + // not a valid OAuth error + if (![self isOAuthErrorDomain:oAuthErrorDomain] + || !errorResponse + || !errorResponse[OIDOAuthErrorFieldError]) { + return [[self class] errorWithCode:OIDErrorCodeNetworkError + underlyingError:underlyingError + description:underlyingError.localizedDescription]; + } + + // builds the userInfo dictionary with the full OAuth response and other information + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[OIDOAuthErrorResponseErrorKey] = errorResponse; + if (underlyingError) { + userInfo[NSUnderlyingErrorKey] = underlyingError; + } + + NSString *oauthErrorCodeString = errorResponse[OIDOAuthErrorFieldError]; + NSString *oauthErrorMessage = errorResponse[OIDOAuthErrorFieldErrorDescription]; + NSString *oauthErrorURI = errorResponse[OIDOAuthErrorFieldErrorURI]; + + // builds the error description, using the information supplied by the server if possible + NSMutableString *description = [NSMutableString string]; + [description appendString:oauthErrorCodeString]; + if (oauthErrorMessage) { + [description appendString:@": "]; + [description appendString:oauthErrorMessage]; + } + if (oauthErrorURI) { + if ([description length] > 0) { + [description appendString:@" - "]; + } + [description appendString:oauthErrorURI]; + } + if ([description length] == 0) { + // backup description + [description appendFormat:@"OAuth error: %@ - https://tools.ietf.org/html/rfc6749#section-5.2", + oauthErrorCodeString]; + } + userInfo[NSLocalizedDescriptionKey] = description; + + // looks up the error code based on the "error" response param + OIDErrorCodeOAuth code = [[self class] OAuthErrorCodeFromString:oauthErrorCodeString]; + + NSError *error = [NSError errorWithDomain:oAuthErrorDomain + code:code + userInfo:userInfo]; + return error; +} + ++ (nullable NSError *)HTTPErrorWithHTTPResponse:(NSHTTPURLResponse *)HTTPURLResponse + data:(nullable NSData *)data { + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (data) { + NSString *serverResponse = + [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + if (serverResponse) { + userInfo[NSLocalizedDescriptionKey] = serverResponse; + } + } + NSError *serverError = + [NSError errorWithDomain:OIDHTTPErrorDomain + code:HTTPURLResponse.statusCode + userInfo:userInfo]; + return serverError; +} + ++ (OIDErrorCodeOAuth)OAuthErrorCodeFromString:(NSString *)errorCode { + NSDictionary *errorCodes = @{ + @"invalid_request": @(OIDErrorCodeOAuthInvalidRequest), + @"unauthorized_client": @(OIDErrorCodeOAuthUnauthorizedClient), + @"access_denied": @(OIDErrorCodeOAuthAccessDenied), + @"unsupported_response_type": @(OIDErrorCodeOAuthUnsupportedResponseType), + @"invalid_scope": @(OIDErrorCodeOAuthInvalidScope), + @"server_error": @(OIDErrorCodeOAuthServerError), + @"temporarily_unavailable": @(OIDErrorCodeOAuthTemporarilyUnavailable), + @"invalid_client": @(OIDErrorCodeOAuthInvalidClient), + @"invalid_grant": @(OIDErrorCodeOAuthInvalidGrant), + @"unsupported_grant_type": @(OIDErrorCodeOAuthUnsupportedGrantType), + }; + NSNumber *code = errorCodes[errorCode]; + if (code) { + return [code integerValue]; + } else { + return OIDErrorCodeOAuthOther; + } +} + ++ (void)raiseException:(NSString *)name { + [[self class] raiseException:name message:name]; +} + ++ (void)raiseException:(NSString *)name message:(NSString *)message { + [NSException raise:name format:@"%@", message]; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.h b/Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.h new file mode 100644 index 000000000..0775ddef1 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.h @@ -0,0 +1,116 @@ +/*! @file OIDFieldMapping.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents a function which transforms incoming source values into instance variable + values. + */ +typedef _Nullable id(^OIDFieldMappingConversionFunction)(NSObject *_Nullable value); + +/*! @brief Describes the mapping of a key/value pair to an iVar with an optional conversion + function. + */ +@interface OIDFieldMapping : NSObject + +/*! @brief The name of the instance variable the field should be mapped to. + */ +@property(nonatomic, readonly) NSString *name; + +/*! @brief The type of the instance variable. + */ +@property(nonatomic, readonly) Class expectedType; + +/*! @brief An optional conversion function which specifies a transform from the incoming data to the + instance variable value. + */ +@property(nonatomic, readonly, nullable) OIDFieldMappingConversionFunction conversion; + +/*! @internal + @brief Unavailable. Please use initWithName:type:conversion:. + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @brief The designated initializer. + @param name The name of the instance variable the field should be mapped to. + @param type The type of the instance variable. + @param conversion An optional conversion function which specifies a transform from the incoming + data to the instance variable value. Used during the process performed by + @c OIDFieldMapping.remainingParametersWithMap:parameters:instance: but not during + encoding/decoding, since the encoded and decoded values should already be of the type + specified by the @c type parameter. + */ +- (nullable instancetype)initWithName:(NSString *)name + type:(Class)type + conversion:(nullable OIDFieldMappingConversionFunction)conversion + NS_DESIGNATED_INITIALIZER; + +/*! @brief A convenience initializer. + @param name The name of the instance variable the field should be mapped to. + @param type The type of the instance variable. + */ +- (nullable instancetype)initWithName:(NSString *)name + type:(Class)type; + +/*! @brief Performs a mapping of key/value pairs in an incoming parameters dictionary to instance + variables, returning a dictionary of parameter key/values which didn't map to instance + variables. + @param map A mapping of incoming keys to instance variables. + @param parameters Incoming key value pairs to map to an instance's variables. + @param instance The instance whose variables should be set based on the mapping. + @return A dictionary of parameter key/values which didn't map to instance variables. + */ ++ (NSDictionary *> *)remainingParametersWithMap: + (NSDictionary *)map + parameters:(NSDictionary *> *)parameters + instance:(id)instance; + +/*! @brief This helper method for @c NSCoding implementations performs a serialization of fields + defined in a field mapping. + @param aCoder An @c NSCoder instance to serialize instance variable values to. + @param map A mapping of keys to instance variables. + @param instance The instance whose variables should be serialized based on the mapping. + */ ++ (void)encodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance; + +/*! @brief This helper method for @c NSCoding implementations performs a deserialization of + fields defined in a field mapping. + @param aCoder An @c NSCoder instance from which to deserialize instance variable values from. + @param map A mapping of keys to instance variables. + @param instance The instance whose variables should be deserialized based on the mapping. + */ ++ (void)decodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance; + +/*! @brief Returns an @c NSSet of classes suitable for deserializing JSON content in an + @c NSSecureCoding context. + */ ++ (NSSet *)JSONTypes; + +/*! @brief Returns a function for converting an @c NSString to an @c NSURL. + */ ++ (OIDFieldMappingConversionFunction)URLConversion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.m b/Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.m new file mode 100644 index 000000000..dacac8226 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDFieldMapping.m @@ -0,0 +1,112 @@ +/*! @file OIDFieldMapping.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDFieldMapping.h" + +#import "OIDDefines.h" + +@implementation OIDFieldMapping + +- (nullable instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithName:type:conversion:)); + +- (nullable instancetype)initWithName:(NSString *)name + type:(Class)type { + return [self initWithName:name type:type conversion:nil]; +} + +- (nullable instancetype)initWithName:(NSString *)name + type:(Class)type + conversion:(nullable OIDFieldMappingConversionFunction)conversion { + self = [super init]; + if (self) { + _name = [name copy]; + _expectedType = type; + _conversion = conversion; + } + return self; +} + ++ (NSDictionary *> *)remainingParametersWithMap: + (NSDictionary *)map + parameters:(NSDictionary *> *)parameters + instance:(id)instance { + NSMutableDictionary *additionalParameters = [NSMutableDictionary dictionary]; + for (NSString *key in parameters) { + NSObject *value = [parameters[key] copy]; + OIDFieldMapping *mapping = map[key]; + // If the field doesn't appear in the mapping, we add it to the additional parameters + // dictionary. + if (!mapping) { + additionalParameters[key] = value; + continue; + } + // If the field mapping specifies a conversion function, apply the conversion to the value. + if (mapping.conversion) { + value = mapping.conversion(value); + } + // Check the type of the value and make sure it matches the type we expected. If it doesn't we + // add the value to the additional parameters dictionary but don't assign the instance variable. + if (![value isKindOfClass:mapping.expectedType]) { + additionalParameters[key] = value; + continue; + } + // Assign the instance variable. + [instance setValue:value forKey:mapping.name]; + } + return additionalParameters; +} + ++ (void)encodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance { + for (NSString *key in map) { + id value = [instance valueForKey:map[key].name]; + [aCoder encodeObject:value forKey:key]; + } +} + ++ (void)decodeWithCoder:(NSCoder *)aCoder + map:(NSDictionary *)map + instance:(id)instance { + for (NSString *key in map) { + OIDFieldMapping *mapping = map[key]; + id value = [aCoder decodeObjectOfClass:mapping.expectedType forKey:key]; + [instance setValue:value forKey:mapping.name]; + } +} + ++ (NSSet *)JSONTypes { + return [NSSet setWithArray:@[ + [NSDictionary class], + [NSArray class], + [NSString class], + [NSNumber class] + ]]; +} + ++ (OIDFieldMappingConversionFunction)URLConversion { + return ^id _Nullable(NSObject *_Nullable value) { + if ([value isKindOfClass:[NSString class]]) { + return [NSURL URLWithString:(NSString *)value]; + } + return value; + }; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.h b/Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.h new file mode 100644 index 000000000..6e6500473 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.h @@ -0,0 +1,40 @@ +/*! @file OIDGrantTypes.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +/*! @brief For exchanging an authorization code for an access token. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +extern NSString *const OIDGrantTypeAuthorizationCode; + +/*! @brief For refreshing an access token with a refresh token. + @see https://tools.ietf.org/html/rfc6749#section-6 + */ +extern NSString *const OIDGrantTypeRefreshToken; + +/*! @brief For obtaining an access token with a username and password. + @see https://tools.ietf.org/html/rfc6749#section-4.3.2 + */ +extern NSString *const OIDGrantTypePassword; + +/*! @brief For obtaining an access token from the token endpoint using client credentials. + @see https://tools.ietf.org/html/rfc6749#section-3.2.1 + @see https://tools.ietf.org/html/rfc6749#section-4.4.2 + */ +extern NSString *const OIDGrantTypeClientCredentials; diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.m b/Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.m new file mode 100644 index 000000000..2b1934370 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDGrantTypes.m @@ -0,0 +1,27 @@ +/*! @file OIDGrantTypes.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDGrantTypes.h" + +NSString *const OIDGrantTypeAuthorizationCode = @"authorization_code"; + +NSString *const OIDGrantTypeRefreshToken = @"refresh_token"; + +NSString *const OIDGrantTypePassword = @"password"; + +NSString *const OIDGrantTypeClientCredentials = @"client_credentials"; diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.h b/Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.h new file mode 100644 index 000000000..405ef9381 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.h @@ -0,0 +1,31 @@ +/*! @file OIDResponseTypes.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +/*! @brief A constant for the standard OAuth2 Response Type of 'code'. + */ +extern NSString *const OIDResponseTypeCode; + +/*! @brief A constant for the standard OAuth2 Response Type of 'token'. + */ +extern NSString *const OIDResponseTypeToken; + +/*! @brief A constant for the standard OAuth2 Response Type of 'id_token'. + */ +extern NSString *const OIDResponseTypeIDToken; diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.m b/Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.m new file mode 100644 index 000000000..78eaf187e --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDResponseTypes.m @@ -0,0 +1,25 @@ +/*! @file OIDResponseTypes.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDResponseTypes.h" + +NSString *const OIDResponseTypeCode = @"code"; + +NSString *const OIDResponseTypeToken = @"token"; + +NSString *const OIDResponseTypeIDToken = @"id_token"; diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.h b/Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.h new file mode 100644 index 000000000..c0a5190cb --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.h @@ -0,0 +1,48 @@ +/*! @file OIDScopeUtilities.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Provides convenience methods for dealing with scope strings. + */ +@interface OIDScopeUtilities : NSObject + +/*! @internal + @brief Unavailable. This class should not be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Converts an array of scope strings to a single scope string per the OAuth 2 spec. + @param scopes An array of scope strings. + @return A space-delimited string of scopes. + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ ++ (NSString *)scopesWithArray:(NSArray *)scopes; + +/*! @brief Converts an OAuth 2 spec-compliant scope string to an array of scopes. + @param scopes An OAuth 2 spec-compliant scope string. + @return An array of scope strings. + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ ++ (NSArray *)scopesArrayWithString:(NSString *)scopes; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.m b/Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.m new file mode 100644 index 000000000..a0bcb8c85 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDScopeUtilities.m @@ -0,0 +1,58 @@ +/*! @file OIDScopeUtilities.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDScopeUtilities.h" + +@implementation OIDScopeUtilities + +/*! @brief A character set with the characters NOT allowed in a scope name. + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ ++ (NSCharacterSet *)disallowedScopeCharacters { + static NSCharacterSet *disallowedCharacters; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableCharacterSet *allowedCharacters; + allowedCharacters = + [NSMutableCharacterSet characterSetWithRange:NSMakeRange(0x23, 0x5B - 0x23 + 1)]; + [allowedCharacters addCharactersInRange:NSMakeRange(0x5D, 0x7E - 0x5D + 1)]; + [allowedCharacters addCharactersInString:@"\x21"]; + disallowedCharacters = [allowedCharacters invertedSet]; + }); + return disallowedCharacters; +} + ++ (NSString *)scopesWithArray:(NSArray *)scopes { +#if !defined(NS_BLOCK_ASSERTIONS) + NSCharacterSet *disallowedCharacters = [self disallowedScopeCharacters]; + for (NSString *scope in scopes) { + NSAssert(scope.length, @"Found illegal empty scope string."); + NSAssert([scope rangeOfCharacterFromSet:disallowedCharacters].location == NSNotFound, + @"Found illegal character in scope string."); + } +#endif // !defined(NS_BLOCK_ASSERTIONS) + + NSString *scopeString = [scopes componentsJoinedByString:@" "]; + return scopeString; +} + ++ (NSArray *)scopesArrayWithString:(NSString *)scopes { + return [scopes componentsSeparatedByString:@" "]; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDScopes.h b/Paco-iOS/Pods/AppAuth/Source/OIDScopes.h new file mode 100644 index 000000000..da8bb189f --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDScopes.h @@ -0,0 +1,46 @@ +/*! @file OIDScopes.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +/*! @brief Scope that indicates this request is an OpenID Connect request. + @see http://openid.net/specs/openid-connect-core-1_0.html#AuthRequestValidation + */ +extern NSString *const OIDScopeOpenID; + +/*! @brief This scope value requests access to the End-User's default profile Claims, which are: + name, family_name, given_name, middle_name, nickname, preferred_username, profile, picture, + website, gender, birthdate, zoneinfo, locale, and updated_at. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopeProfile; + +/*! @brief This scope value requests access to the email and email_verified Claims. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopeEmail; + +/*! @brief This scope value requests access to the address Claim. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopeAddress; + +/*! @brief This scope value requests access to the phone_number and phone_number_verified Claims. + @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims + */ +extern NSString *const OIDScopePhone; diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDScopes.m b/Paco-iOS/Pods/AppAuth/Source/OIDScopes.m new file mode 100644 index 000000000..62dd707ec --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDScopes.m @@ -0,0 +1,29 @@ +/*! @file OIDScopes.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDScopes.h" + +NSString *const OIDScopeOpenID = @"openid"; + +NSString *const OIDScopeProfile = @"profile"; + +NSString *const OIDScopeEmail = @"email"; + +NSString *const OIDScopeAddress = @"address"; + +NSString *const OIDScopePhone = @"phone"; diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.h b/Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.h new file mode 100644 index 000000000..0d823b27c --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.h @@ -0,0 +1,68 @@ +/*! @file OIDServiceConfiguration.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDServiceConfiguration; +@class OIDServiceDiscovery; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The type of block called when a @c OIDServiceConfiguration has been created + by loading a @c OIDServiceDiscovery from an @c NSURL. + */ +typedef void (^OIDServiceConfigurationCreated) + (OIDServiceConfiguration *_Nullable serviceConfiguration, + NSError *_Nullable error); + +/*! @brief Represents the information needed to construct a @c OIDAuthorizationService. + */ +@interface OIDServiceConfiguration : NSObject + +/*! @brief The authorization endpoint URI. + */ +@property(nonatomic, readonly) NSURL *authorizationEndpoint; + +/*! @brief The token exchange and refresh endpoint URI. + */ +@property(nonatomic, readonly) NSURL *tokenEndpoint; + +/*! @brief The discovery document. + */ +@property(nonatomic, readonly, nullable) OIDServiceDiscovery *discoveryDocument; + +/*! @internal + @brief Unavailable. Please use @c initWithAuthorizationEndpoint:tokenEndpoint: or + @c initWithDiscoveryDocument:. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @param authorizationEndpoint The authorization endpoint URI. + @param tokenEndpoint The token exchange and refresh endpoint URI. + */ +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint; + +/*! @param discoveryDocument The discovery document from which to extract the required OAuth + configuration. + */ +- (instancetype)initWithDiscoveryDocument:(OIDServiceDiscovery *)discoveryDocument; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.m b/Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.m new file mode 100644 index 000000000..13530bb66 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDServiceConfiguration.m @@ -0,0 +1,132 @@ +/*! @file OIDServiceConfiguration.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDServiceConfiguration.h" + +#import "OIDDefines.h" +#import "OIDErrorUtilities.h" +#import "OIDServiceDiscovery.h" + +/*! @brief The key for the @c authorizationEndpoint property. + */ +static NSString *const kAuthorizationEndpointKey = @"authorizationEndpoint"; + +/*! @brief The key for the @c tokenEndpoint property. + */ +static NSString *const kTokenEndpointKey = @"tokenEndpoint"; + +/*! @brief The key for the @c discoveryDocument property. + */ +static NSString *const kDiscoveryDocumentKey = @"discoveryDocument"; + +NS_ASSUME_NONNULL_BEGIN + +@interface OIDServiceConfiguration () + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + discoveryDocument:(nullable OIDServiceDiscovery *)discoveryDocument + NS_DESIGNATED_INITIALIZER; + +@end + +@implementation OIDServiceConfiguration + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithAuthorizationEndpoint:tokenEndpoint:)); + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint + discoveryDocument:(nullable OIDServiceDiscovery *)discoveryDocument { + + self = [super init]; + if (self) { + _authorizationEndpoint = [authorizationEndpoint copy]; + _tokenEndpoint = [tokenEndpoint copy]; + _discoveryDocument = [discoveryDocument copy]; + } + return self; +} + +- (instancetype)initWithAuthorizationEndpoint:(NSURL *)authorizationEndpoint + tokenEndpoint:(NSURL *)tokenEndpoint { + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + discoveryDocument:nil]; +} + +- (instancetype)initWithDiscoveryDocument:(OIDServiceDiscovery *) discoveryDocument { + return [self initWithAuthorizationEndpoint:discoveryDocument.authorizationEndpoint + tokenEndpoint:discoveryDocument.tokenEndpoint + discoveryDocument:discoveryDocument]; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSURL *authorizationEndpoint = [aDecoder decodeObjectOfClass:[NSURL class] + forKey:kAuthorizationEndpointKey]; + NSURL *tokenEndpoint = [aDecoder decodeObjectOfClass:[NSURL class] + forKey:kTokenEndpointKey]; + // We don't accept nil authorizationEndpoints or tokenEndpoints. + if (!authorizationEndpoint || !tokenEndpoint) { + return nil; + } + + OIDServiceDiscovery *discoveryDocument = [aDecoder decodeObjectOfClass:[OIDServiceDiscovery class] + forKey:kDiscoveryDocumentKey]; + + return [self initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint + discoveryDocument:discoveryDocument]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_authorizationEndpoint forKey:kAuthorizationEndpointKey]; + [aCoder encodeObject:_tokenEndpoint forKey:kTokenEndpointKey]; + [aCoder encodeObject:_discoveryDocument forKey:kDiscoveryDocumentKey]; +} + +#pragma mark - description + +- (NSString *)description { + return [NSString stringWithFormat: + @"OIDServiceConfiguration authorizationEndpoint: %@, tokenEndpoint: %@, " + "discoveryDocument: [%@]", + _authorizationEndpoint, + _tokenEndpoint, + _discoveryDocument]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.h b/Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.h new file mode 100644 index 000000000..d0dbad207 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.h @@ -0,0 +1,352 @@ +/*! @file OIDServiceDiscovery.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents an OpenID Connect 1.0 Discovery Document + @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata + */ +@interface OIDServiceDiscovery : NSObject + +/*! @brief The decoded OpenID Connect 1.0 Discovery Document as a dictionary. + */ +@property(nonatomic, readonly) NSDictionary *discoveryDictionary; + +/*! @brief REQUIRED. URL using the @c https scheme with no query or fragment component that the OP + asserts as its Issuer Identifier. If Issuer discovery is supported, this value MUST be + identical to the issuer value returned by WebFinger. This also MUST be identical to the + @c iss Claim value in ID Tokens issued from this Issuer. + @remarks issuer + @seealso https://openid.net/specs/openid-connect-discovery-1_0.html#IssuerDiscovery + */ +@property(nonatomic, readonly) NSURL *issuer; + +/*! @brief REQUIRED. URL of the OP's OAuth 2.0 Authorization Endpoint. + @remarks authorization_endpoint + @seealso http://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint + */ +@property(nonatomic, readonly) NSURL *authorizationEndpoint; + +/*! @brief URL of the OP's OAuth 2.0 Token Endpoint. This is REQUIRED unless only the Implicit Flow + is used. + @remarks token_endpoint + @seealso http://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint + */ +@property(nonatomic, readonly) NSURL *tokenEndpoint; + +/*! @brief RECOMMENDED. URL of the OP's UserInfo Endpoint. This URL MUST use the https scheme and + MAY contain port, path, and query parameter components. + @remarks userinfo_endpoint + @seealso http://openid.net/specs/openid-connect-core-1_0.html#UserInfo + */ +@property(nonatomic, readonly, nullable) NSURL *userinfoEndpoint; + +/*! @brief REQUIRED. URL of the OP's JSON Web Key Set document. This contains the signing key(s) the + RP uses to validate signatures from the OP. The JWK Set MAY also contain the Server's + encryption key(s), which are used by RPs to encrypt requests to the Server. When both + signing and encryption keys are made available, a use (Key Use) parameter value is REQUIRED + for all keys in the referenced JWK Set to indicate each key's intended usage. Although some + algorithms allow the same key to be used for both signatures and encryption, doing so is NOT + RECOMMENDED, as it is less secure. The JWK x5c parameter MAY be used to provide X.509 + representations of keys provided. When used, the bare key values MUST still be present and + MUST match those in the certificate. + @remarks jwks_uri + @seealso http://tools.ietf.org/html/rfc7517 + */ +@property(nonatomic, readonly) NSURL *jwksURL; + +/*! @brief RECOMMENDED. URL of the OP's Dynamic Client Registration Endpoint. + @remarks registration_endpoint + @seealso http://openid.net/specs/openid-connect-registration-1_0.html + */ +@property(nonatomic, readonly, nullable) NSURL *registrationEndpoint; + +/*! @brief RECOMMENDED. JSON array containing a list of the OAuth 2.0 [RFC6749] scope values that + this server supports. The server MUST support the openid scope value. Servers MAY choose not + to advertise some supported scope values even when this parameter is used, although those + defined in [OpenID.Core] SHOULD be listed, if supported. + @remarks scopes_supported + @seealso http://tools.ietf.org/html/rfc6749#section-3.3 + */ +@property(nonatomic, readonly, nullable) NSArray *scopesSupported; + +/*! @brief REQUIRED. JSON array containing a list of the OAuth 2.0 @c response_type values that this + OP supports. Dynamic OpenID Providers MUST support the @c code, @c id_token, and the token + @c id_token Response Type values. + @remarks response_types_supported + */ +@property(nonatomic, readonly) NSArray *responseTypesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the OAuth 2.0 @c response_mode values that this + OP supports, as specified in OAuth 2.0 Multiple Response Type Encoding Practices. If + omitted, the default for Dynamic OpenID Providers is @c ["query", "fragment"]. + @remarks response_modes_supported + @seealso http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html + */ +@property(nonatomic, readonly, nullable) NSArray *responseModesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the OAuth 2.0 Grant Type values that this OP + supports. Dynamic OpenID Providers MUST support the @c authorization_code and @c implicit + Grant Type values and MAY support other Grant Types. If omitted, the default value is + @c ["authorization_code", "implicit"]. + @remarks grant_types_supported + */ +@property(nonatomic, readonly, nullable) NSArray *grantTypesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the Authentication Context Class References + that this OP supports. + @remarks acr_values_supported + */ +@property(nonatomic, readonly, nullable) NSArray *acrValuesSupported; + +/*! @brief REQUIRED. JSON array containing a list of the Subject Identifier types that this OP + supports. Valid types include @c pairwise and @c public. + @remarks subject_types_supported + */ +@property(nonatomic, readonly) NSArray *subjectTypesSupported; + +/*! @brief REQUIRED. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the OP for the ID Token to encode the Claims in a JWT. The algorithm @c RS256 + MUST be included. The value @c none MAY be supported, but MUST NOT be used unless the + Response Type used returns no ID Token from the Authorization Endpoint (such as when using + the Authorization Code Flow). + @remarks id_token_signing_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly) NSArray *IDTokenSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c alg values) + supported by the OP for the ID Token to encode the Claims in a JWT. + @remarks id_token_encryption_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *IDTokenEncryptionAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c enc values) + supported by the OP for the ID Token to encode the Claims in a JWT. + @remarks id_token_encryption_enc_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *IDTokenEncryptionEncodingValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the UserInfo Endpoint to encode the Claims in a JWT. The value none MAY be + included. + @remarks userinfo_signing_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7515 + @seealso https://tools.ietf.org/html/rfc7518 + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *userinfoSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (alg values) + supported by the UserInfo Endpoint to encode the Claims in a JWT. + @remarks userinfo_encryption_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7516 + @seealso https://tools.ietf.org/html/rfc7518 + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *userinfoEncryptionAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c enc values) + supported by the UserInfo Endpoint to encode the Claims in a JWT. + @remarks userinfo_encryption_enc_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *userinfoEncryptionEncodingValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the OP for Request Objects, which are described in Section 6.1 of OpenID + Connect Core 1.0. These algorithms are used both when the Request Object is passed by value + (using the request parameter) and when it is passed by reference (using the @c request_uri + parameter). Servers SHOULD support @c none and @c RS256. + @remarks request_object_signing_alg_values_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + */ +@property(nonatomic, readonly, nullable) + NSArray *requestObjectSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c alg values) + supported by the OP for Request Objects. These algorithms are used both when the Request + Object is passed by value and when it is passed by reference. + @remarks request_object_encryption_alg_values_supported + */ +@property(nonatomic, readonly, nullable) + NSArray *requestObjectEncryptionAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWE encryption algorithms (@c enc values) + supported by the OP for Request Objects. These algorithms are used both when the Request + Object is passed by value and when it is passed by reference. + @remarks request_object_encryption_enc_values_supported + */ +@property(nonatomic, readonly, nullable) + NSArray *requestObjectEncryptionEncodingValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of Client Authentication methods supported by this + Token Endpoint. The options are @c client_secret_post, @c client_secret_basic, + @c client_secret_jwt, and @c private_key_jwt, as described in Section 9 of OpenID Connect + Core 1.0. Other authentication methods MAY be defined by extensions. If omitted, the default + is @c client_secret_basic -- the HTTP Basic Authentication Scheme specified in Section 2.3.1 + of OAuth 2.0. + @remarks token_endpoint_auth_methods_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + @seealso http://tools.ietf.org/html/rfc6749#section-2.3.1 + */ +@property(nonatomic, readonly, nullable) NSArray *tokenEndpointAuthMethodsSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the JWS signing algorithms (@c alg values) + supported by the Token Endpoint for the signature on the JWT used to authenticate the Client + at the Token Endpoint for the @c private_key_jwt and @c client_secret_jwt authentication + methods. Servers SHOULD support @c RS256. The value @c none MUST NOT be used. + @remarks token_endpoint_auth_signing_alg_values_supported + @seealso https://tools.ietf.org/html/rfc7519 + */ +@property(nonatomic, readonly, nullable) + NSArray *tokenEndpointAuthSigningAlgorithmValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the @c display parameter values that the OpenID + Provider supports. These values are described in Section 3.1.2.1 of OpenID Connect Core 1.0. + @remarks display_values_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + */ +@property(nonatomic, readonly, nullable) NSArray *displayValuesSupported; + +/*! @brief OPTIONAL. JSON array containing a list of the Claim Types that the OpenID Provider + supports. These Claim Types are described in Section 5.6 of OpenID Connect Core 1.0. Values + defined by this specification are @c normal, @c aggregated, and @c distributed. If omitted, + the implementation supports only @c normal Claims. + @remarks claim_types_supported + @seealso http://openid.net/specs/openid-connect-core-1_0.html + */ +@property(nonatomic, readonly, nullable) NSArray *claimTypesSupported; + +/*! @brief RECOMMENDED. JSON array containing a list of the Claim Names of the Claims that the + OpenID Provider MAY be able to supply values for. Note that for privacy or other reasons, + this might not be an exhaustive list. + @remarks claims_supported + */ +@property(nonatomic, readonly, nullable) NSArray *claimsSupported; + +/*! @brief OPTIONAL. URL of a page containing human-readable information that developers might want + or need to know when using the OpenID Provider. In particular, if the OpenID Provider does + not support Dynamic Client Registration, then information on how to register Clients needs + to be provided in this documentation. + @remarks service_documentation + */ +@property(nonatomic, readonly, nullable) NSURL *serviceDocumentation; + +/*! @brief OPTIONAL. Languages and scripts supported for values in Claims being returned, + represented as a JSON array of BCP47 language tag values. Not all languages and scripts are + necessarily supported for all Claim values. + @remarks claims_locales_supported + @seealso http://tools.ietf.org/html/rfc5646 + */ +@property(nonatomic, readonly, nullable) NSArray *claimsLocalesSupported; + +/*! @brief OPTIONAL. Languages and scripts supported for the user interface, represented as a JSON + array of BCP47 language tag values. + @remarks ui_locales_supported + @seealso http://tools.ietf.org/html/rfc5646 + */ +@property(nonatomic, readonly, nullable) NSArray *UILocalesSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP supports use of the claims parameter, + with @c true indicating support. If omitted, the default value is @c false. + @remarks claims_parameter_supported + */ +@property(nonatomic, readonly) BOOL claimsParameterSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP supports use of the request parameter, + with @c true indicating support. If omitted, the default value is @c false. + @remarks request_parameter_supported + */ +@property(nonatomic, readonly) BOOL requestParameterSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP supports use of the @c request_uri + parameter, with true indicating support. If omitted, the default value is @c true. + @remarks request_uri_parameter_supported + */ +@property(nonatomic, readonly) BOOL requestURIParameterSupported; + +/*! @brief OPTIONAL. Boolean value specifying whether the OP requires any @c request_uri values used + to be pre-registered using the @c request_uris registration parameter. Pre-registration is + REQUIRED when the value is @c true. If omitted, the default value is @c false. + @remarks require_request_uri_registration + */ +@property(nonatomic, readonly) BOOL requireRequestURIRegistration; + +/*! @brief OPTIONAL. URL that the OpenID Provider provides to the person registering the Client to + read about the OP's requirements on how the Relying Party can use the data provided by the + OP. The registration process SHOULD display this URL to the person registering the Client if + it is given. + @remarks op_policy_uri + */ +@property(nonatomic, readonly, nullable) NSURL *OPPolicyURI; + +/*! @brief OPTIONAL. URL that the OpenID Provider provides to the person registering the Client to + read about OpenID Provider's terms of service. The registration process SHOULD display this + URL to the person registering the Client if it is given. + @remarks op_tos_uri + */ +@property(nonatomic, readonly, nullable) NSURL *OPTosURI; + +/*! @internal + @brief Unavailable. Please use @c initWithDictionary:error:, @c initWithJSON:error, or the + @c serviceDiscoveryWithURL:callback: factory method. + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @brief Decodes a OpenID Connect Discovery 1.0 JSON document. + @param serviceDiscoveryJSON An OpenID Connect Service Discovery document. + @param error If a required field is missing from the dictionary, an error with domain + @c ::OIDGeneralErrorDomain and code @c ::OIDErrorCodeInvalidDiscoveryDocument will be + returned. + */ +- (nullable instancetype)initWithJSON:(NSString *)serviceDiscoveryJSON + error:(NSError **_Nullable)error; + +/*! @brief Decodes a OpenID Connect Discovery 1.0 JSON document. + @param serviceDiscoveryJSONData An OpenID Connect Service Discovery document. + @param error If a required field is missing from the dictionary, an error with domain + @c ::OIDGeneralErrorDomain and code @c ::OIDErrorCodeInvalidDiscoveryDocument will be + returned. + */ +- (nullable instancetype)initWithJSONData:(NSData *)serviceDiscoveryJSONData + error:(NSError **_Nullable)error; + +/*! @brief Designated initializer. The dictionary keys should match the keys defined in the OpenID + Connect Discovery 1.0 standard for OpenID Provider Metadata. + @param serviceDiscoveryDictionary A dictionary representing an OpenID Connect Service Discovery + document. + @param error If a required field is missing from the dictionary, an error with domain + @c ::OIDGeneralErrorDomain and code @c ::OIDErrorCodeInvalidDiscoveryDocument will be + returned. + */ +- (nullable instancetype)initWithDictionary:(NSDictionary *)serviceDiscoveryDictionary + error:(NSError **_Nullable)error NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.m b/Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.m new file mode 100644 index 000000000..4159327b8 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDServiceDiscovery.m @@ -0,0 +1,350 @@ +/*! @file OIDServiceDiscovery.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDServiceDiscovery.h" + +#import "OIDDefines.h" +#import "OIDErrorUtilities.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! Field keys associated with an OpenID Connect Discovery Document. */ +static NSString *const kIssuerKey = @"issuer"; +static NSString *const kAuthorizationEndpointKey = @"authorization_endpoint"; +static NSString *const kTokenEndpointKey = @"token_endpoint"; +static NSString *const kUserinfoEndpointKey = @"userinfo_endpoint"; +static NSString *const kJWKSURLKey = @"jwks_uri"; +static NSString *const kRegistrationEndpointKey = @"registration_endpoint"; +static NSString *const kScopesSupportedKey = @"scopes_supported"; +static NSString *const kResponseTypesSupportedKey = @"response_types_supported"; +static NSString *const kResponseModesSupportedKey = @"response_modes_supported"; +static NSString *const kGrantTypesSupportedKey = @"grant_types_supported"; +static NSString *const kACRValuesSupportedKey = @"acr_values_supported"; +static NSString *const kSubjectTypesSupportedKey = @"subject_types_supported"; +static NSString *const kIDTokenSigningAlgorithmValuesSupportedKey = + @"id_token_signing_alg_values_supported"; +static NSString *const kIDTokenEncryptionAlgorithmValuesSupportedKey = + @"id_token_encryption_alg_values_supported"; +static NSString *const kIDTokenEncryptionEncodingValuesSupportedKey = + @"id_token_encryption_enc_values_supported"; +static NSString *const kUserinfoSigningAlgorithmValuesSupportedKey = + @"userinfo_signing_alg_values_supported"; +static NSString *const kUserinfoEncryptionAlgorithmValuesSupportedKey = + @"userinfo_encryption_alg_values_supported"; +static NSString *const kUserinfoEncryptionEncodingValuesSupportedKey = + @"userinfo_encryption_enc_values_supported"; +static NSString *const kRequestObjectSigningAlgorithmValuesSupportedKey = + @"request_object_signing_alg_values_supported"; +static NSString *const kRequestObjectEncryptionAlgorithmValuesSupportedKey = + @"request_object_encryption_alg_values_supported"; +static NSString *const kRequestObjectEncryptionEncodingValuesSupported = + @"request_object_encryption_enc_values_supported"; +static NSString *const kTokenEndpointAuthMethodsSupportedKey = + @"token_endpoint_auth_methods_supported"; +static NSString *const kTokenEndpointAuthSigningAlgorithmValuesSupportedKey = + @"token_endpoint_auth_signing_alg_values_supported"; +static NSString *const kDisplayValuesSupportedKey = @"display_values_supported"; +static NSString *const kClaimTypesSupportedKey = @"claim_types_supported"; +static NSString *const kClaimsSupportedKey = @"claims_supported"; +static NSString *const kServiceDocumentationKey = @"service_documentation"; +static NSString *const kClaimsLocalesSupportedKey = @"claims_locales_supported"; +static NSString *const kUILocalesSupportedKey = @"ui_locales_supported"; +static NSString *const kClaimsParameterSupportedKey = @"claims_parameter_supported"; +static NSString *const kRequestParameterSupportedKey = @"request_parameter_supported"; +static NSString *const kRequestURIParameterSupportedKey = @"request_uri_parameter_supported"; +static NSString *const kRequireRequestURIRegistrationKey = @"require_request_uri_registration"; +static NSString *const kOPPolicyURIKey = @"op_policy_uri"; +static NSString *const kOPTosURIKey = @"op_tos_uri"; + +@implementation OIDServiceDiscovery { + NSDictionary *_discoveryDictionary; +} + +- (nullable instancetype)init OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithDictionary:error:)); + +- (nullable instancetype)initWithJSON:(NSString *)serviceDiscoveryJSON error:(NSError **)error { + NSData *jsonData = [serviceDiscoveryJSON dataUsingEncoding:NSUTF8StringEncoding]; + return [self initWithJSONData:jsonData error:error]; +} + +- (nullable instancetype)initWithJSONData:(NSData *)serviceDiscoveryJSONData + error:(NSError **_Nullable)error { + NSError *jsonError; + NSDictionary *json = + [NSJSONSerialization JSONObjectWithData:serviceDiscoveryJSONData options:0 error:&jsonError]; + if (!json || jsonError) { + *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeJSONDeserializationError + underlyingError:jsonError + description:nil]; + return nil; + } + return [self initWithDictionary:json error:error]; +} + +- (nullable instancetype)initWithDictionary:(NSDictionary *)serviceDiscoveryDictionary + error:(NSError **_Nullable)error { + if (![[self class] dictionaryHasRequiredFields:serviceDiscoveryDictionary error:error]) { + return nil; + } + self = [super init]; + if (self) { + _discoveryDictionary = [serviceDiscoveryDictionary copy]; + } + return self; +} + +#pragma mark - + +/*! @brief Checks to see if the specified dictionary contains the required fields. + @discussion This test is not meant to provide semantic analysis of the document (eg. fields + where the value @c none is not an allowed option would not cause this method to fail if + their value was @c none.) We are just testing to make sure we can meet the nullability + contract we promised in the header. + */ ++ (BOOL)dictionaryHasRequiredFields:(NSDictionary *)dictionary + error:(NSError **_Nullable)error { + static NSString *const kMissingFieldErrorText = @"Missing field: %@"; + static NSString *const kInvalidURLFieldErrorText = @"Invalid URL: %@"; + + NSArray *requiredFields = @[ + kIssuerKey, + kAuthorizationEndpointKey, + kTokenEndpointKey, + kJWKSURLKey, + kResponseTypesSupportedKey, + kSubjectTypesSupportedKey, + kIDTokenSigningAlgorithmValuesSupportedKey + ]; + + for (NSString *field in requiredFields) { + if (!dictionary[field]) { + if (error) { + NSString *errorText = [NSString stringWithFormat:kMissingFieldErrorText, field]; + *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeInvalidDiscoveryDocument + underlyingError:nil + description:errorText]; + } + return NO; + } + } + + // Check required URL fields are valid URLs. + NSArray *requiredURLFields = @[ + kIssuerKey, + kTokenEndpointKey, + kJWKSURLKey + ]; + + for (NSString *field in requiredURLFields) { + if (![NSURL URLWithString:dictionary[field]]) { + if (error) { + NSString *errorText = [NSString stringWithFormat:kInvalidURLFieldErrorText, field]; + *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeInvalidDiscoveryDocument + underlyingError:nil + description:errorText]; + } + return NO; + } + } + + return YES; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSError *error; + NSDictionary *dictionary = [[NSDictionary alloc] initWithCoder:aDecoder]; + self = [self initWithDictionary:dictionary error:&error]; + if (error) { + return nil; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [_discoveryDictionary encodeWithCoder:aCoder]; +} + +#pragma mark - Properties + +- (NSDictionary *)discoveryDictionary { + return _discoveryDictionary; +} + +- (NSURL *)issuer { + return [NSURL URLWithString:_discoveryDictionary[kIssuerKey]]; +} + +- (NSURL *)authorizationEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kAuthorizationEndpointKey]]; +} + +- (NSURL *)tokenEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kTokenEndpointKey]]; +} + +- (nullable NSURL *)userinfoEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kUserinfoEndpointKey]]; +} + +- (NSURL *)jwksURL { + return [NSURL URLWithString:_discoveryDictionary[kJWKSURLKey]]; +} + +- (nullable NSURL *)registrationEndpoint { + return [NSURL URLWithString:_discoveryDictionary[kRegistrationEndpointKey]]; +} + +- (nullable NSArray *)scopesSupported { + return _discoveryDictionary[kScopesSupportedKey]; +} + +- (NSArray *)responseTypesSupported { + return _discoveryDictionary[kResponseTypesSupportedKey]; +} + +- (nullable NSArray *)responseModesSupported { + return _discoveryDictionary[kResponseModesSupportedKey]; +} + +- (nullable NSArray *)grantTypesSupported { + return _discoveryDictionary[kGrantTypesSupportedKey]; +} + +- (nullable NSArray *)acrValuesSupported { + return _discoveryDictionary[kACRValuesSupportedKey]; +} + +- (NSArray *)subjectTypesSupported { + return _discoveryDictionary[kSubjectTypesSupportedKey]; +} + +- (NSArray *) IDTokenSigningAlgorithmValuesSupported { + return _discoveryDictionary[kIDTokenSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)IDTokenEncryptionAlgorithmValuesSupported { + return _discoveryDictionary[kIDTokenEncryptionAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)IDTokenEncryptionEncodingValuesSupported { + return _discoveryDictionary[kIDTokenEncryptionEncodingValuesSupportedKey]; +} + +- (nullable NSArray *)userinfoSigningAlgorithmValuesSupported { + return _discoveryDictionary[kUserinfoSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)userinfoEncryptionAlgorithmValuesSupported { + return _discoveryDictionary[kUserinfoEncryptionAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)userinfoEncryptionEncodingValuesSupported { + return _discoveryDictionary[kUserinfoEncryptionEncodingValuesSupportedKey]; +} + +- (nullable NSArray *)requestObjectSigningAlgorithmValuesSupported { + return _discoveryDictionary[kRequestObjectSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *) requestObjectEncryptionAlgorithmValuesSupported { + return _discoveryDictionary[kRequestObjectEncryptionAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *) requestObjectEncryptionEncodingValuesSupported { + return _discoveryDictionary[kRequestObjectEncryptionEncodingValuesSupported]; +} + +- (nullable NSArray *)tokenEndpointAuthMethodsSupported { + return _discoveryDictionary[kTokenEndpointAuthMethodsSupportedKey]; +} + +- (nullable NSArray *)tokenEndpointAuthSigningAlgorithmValuesSupported { + return _discoveryDictionary[kTokenEndpointAuthSigningAlgorithmValuesSupportedKey]; +} + +- (nullable NSArray *)displayValuesSupported { + return _discoveryDictionary[kDisplayValuesSupportedKey]; +} + +- (nullable NSArray *)claimTypesSupported { + return _discoveryDictionary[kClaimTypesSupportedKey]; +} + +- (nullable NSArray *)claimsSupported { + return _discoveryDictionary[kClaimsSupportedKey]; +} + +- (nullable NSURL *)serviceDocumentation { + return [NSURL URLWithString:_discoveryDictionary[kServiceDocumentationKey]]; +} + +- (nullable NSArray *)claimsLocalesSupported { + return _discoveryDictionary[kClaimsLocalesSupportedKey]; +} + +- (nullable NSArray *)UILocalesSupported { + return _discoveryDictionary[kUILocalesSupportedKey]; +} + +- (BOOL)claimsParameterSupported { + return [_discoveryDictionary[kClaimsParameterSupportedKey] boolValue]; +} + +- (BOOL)requestParameterSupported { + return [_discoveryDictionary[kRequestParameterSupportedKey] boolValue]; +} + +- (BOOL)requestURIParameterSupported { + // Default is true/YES. + if (!_discoveryDictionary[kRequestURIParameterSupportedKey]) { + return YES; + } + return [_discoveryDictionary[kRequestURIParameterSupportedKey] boolValue]; +} + +- (BOOL)requireRequestURIRegistration { + return [_discoveryDictionary[kRequireRequestURIRegistrationKey] boolValue]; +} + +- (nullable NSURL *)OPPolicyURI { + return [NSURL URLWithString:_discoveryDictionary[kOPPolicyURIKey]]; +} + +- (nullable NSURL *)OPTosURI { + return [NSURL URLWithString:_discoveryDictionary[kOPTosURIKey]]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.h b/Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.h new file mode 100644 index 000000000..c252b99a2 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.h @@ -0,0 +1,158 @@ +/*! @file OIDTokenRequest.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +// This file only declares string constants useful for constructing a @c OIDTokenRequest, so it is +// imported here for convenience. +#import "OIDGrantTypes.h" + +@class OIDAuthorizationResponse; +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents a token request. + @see https://tools.ietf.org/html/rfc6749#section-3.2 + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@interface OIDTokenRequest : NSObject + +/*! @brief The service's configuration. + @remarks This configuration specifies how to connect to a particular OAuth provider. + Configurations may be created manually, or via an OpenID Connect Discovery Document. + */ +@property(nonatomic, readonly) OIDServiceConfiguration *configuration; + +/*! @brief The type of token being sent to the token endpoint, i.e. "authorization_code" for the + authorization code exchange, or "refresh_token" for an access token refresh request. + @remarks grant_type + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + @see https://www.google.com/url?sa=D&q=https%3A%2F%2Ftools.ietf.org%2Fhtml%2Frfc6749%23section-6 + */ +@property(nonatomic, readonly) NSString *grantType; + +/*! @brief The authorization code received from the authorization server. + @remarks code + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@property(nonatomic, readonly, nullable) NSString *authorizationCode; + +/*! @brief The client's redirect URI. + @remarks redirect_uri + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@property(nonatomic, readonly) NSURL *redirectURL; + +/*! @brief The client identifier. + @remarks client_id + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@property(nonatomic, readonly) NSString *clientID; + +/*! @brief The client secret. + @remarks client_secret + @see https://tools.ietf.org/html/rfc6749#section-2.3.1 + */ +@property(nonatomic, readonly, nullable) NSString *clientSecret; + +/*! @brief The value of the scope parameter is expressed as a list of space-delimited, + case-sensitive strings. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-3.3 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief The refresh token, which can be used to obtain new access tokens using the same + authorization grant. + @remarks refresh_token + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *refreshToken; + +/*! @brief The PKCE code verifier used to redeem the authorization code. + @remarks code_verifier + @see https://tools.ietf.org/html/rfc7636#section-4.3 + */ +@property(nonatomic, readonly, nullable) NSString *codeVerifier; + +/*! @brief The client's additional token request parameters. + */ +@property(nonatomic, readonly, nullable) NSDictionary *additionalParameters; + +/*! @internal + @brief Unavailable. Please use + initWithConfiguration:grantType:code:redirectURL:clientID:additionalParameters:. + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @param configuration The service's configuration. + @param grantType the type of token being sent to the token endpoint, i.e. "authorization_code" + for the authorization code exchange, or "refresh_token" for an access token refresh request. + @see OIDGrantTypes.h + @param code The authorization code received from the authorization server. + @param redirectURL The client's redirect URI. + @param clientID The client identifier. + @param scopes An array of scopes to combine into a single scope string per the OAuth2 spec. + @param refreshToken The refresh token. + @param additionalParameters The client's additional token request parameters. + */ +- (nullable instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scopes:(nullable NSArray *)scopes + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters; + +/*! @brief Designated initializer. + @param configuration The service's configuration. + @param grantType the type of token being sent to the token endpoint, i.e. "authorization_code" + for the authorization code exchange, or "refresh_token" for an access token refresh request. + @see OIDGrantTypes.h + @param code The authorization code received from the authorization server. + @param redirectURL The client's redirect URI. + @param clientID The client identifier. + @param scope The value of the scope parameter is expressed as a list of space-delimited, + case-sensitive strings. + @param refreshToken The refresh token. + @param additionalParameters The client's additional token request parameters. + */ +- (nullable instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters + NS_DESIGNATED_INITIALIZER; + +/*! @brief Constructs an @c NSURLRequest representing the token request. + @return An @c NSURLRequest representing the token request. + */ +- (NSURLRequest *)URLRequest; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.m b/Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.m new file mode 100644 index 000000000..8f4eb959a --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDTokenRequest.m @@ -0,0 +1,274 @@ +/*! @file OIDTokenRequest.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDTokenRequest.h" + +#import "OIDDefines.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDURLQueryComponent.h" + +/*! @brief The key for the @c configuration property for @c NSSecureCoding + */ +static NSString *const kConfigurationKey = @"configuration"; + +/*! @brief Key used to encode the @c grantType property for @c NSSecureCoding + */ +static NSString *const kGrantTypeKey = @"grant_type"; + +/*! @brief The key for the @c authorizationCode property for @c NSSecureCoding. + */ +static NSString *const kAuthorizationCodeKey = @"code"; + +/*! @brief Key used to encode the @c clientID property for @c NSSecureCoding + */ +static NSString *const kClientIDKey = @"client_id"; + +/*! @brief Key used to encode the @c clientSecret property for @c NSSecureCoding + */ +static NSString *const kClientSecretKey = @"client_secret"; + +/*! @brief Key used to encode the @c redirectURL property for @c NSSecureCoding + */ +static NSString *const kRedirectURLKey = @"redirect_uri"; + +/*! @brief Key used to encode the @c scopes property for @c NSSecureCoding + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c refreshToken property for @c NSSecureCoding + */ +static NSString *const kRefreshTokenKey = @"refresh_token"; + +/*! @brief Key used to encode the @c codeVerifier property for @c NSSecureCoding and to build the + request URL. + */ +static NSString *const kCodeVerifierKey = @"code_verifier"; + +/*! @brief Key used to encode the @c additionalParameters property for + @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +@implementation OIDTokenRequest + +- (instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER( + @selector(initWithConfiguration: + grantType: + authorizationCode: + redirectURL: + clientID: + clientSecret: + scope: + refreshToken: + codeVerifier: + additionalParameters:) + ); + +- (nullable instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scopes:(nullable NSArray *)scopes + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters { + return [self initWithConfiguration:configuration + grantType:grantType + authorizationCode:code + redirectURL:redirectURL + clientID:clientID + clientSecret:clientSecret + scope:[OIDScopeUtilities scopesWithArray:scopes] + refreshToken:refreshToken + codeVerifier:(NSString *)codeVerifier + additionalParameters:additionalParameters]; +} + +- (nullable instancetype)initWithConfiguration:(OIDServiceConfiguration *)configuration + grantType:(NSString *)grantType + authorizationCode:(nullable NSString *)code + redirectURL:(NSURL *)redirectURL + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret + scope:(nullable NSString *)scope + refreshToken:(nullable NSString *)refreshToken + codeVerifier:(nullable NSString *)codeVerifier + additionalParameters:(nullable NSDictionary *)additionalParameters { + self = [super init]; + if (self) { + _configuration = [configuration copy]; + _grantType = [grantType copy]; + _authorizationCode = [code copy]; + _redirectURL = [redirectURL copy]; + _clientID = [clientID copy]; + _clientSecret = [clientSecret copy]; + _scope = [scope copy]; + _refreshToken = [refreshToken copy]; + _codeVerifier = [codeVerifier copy]; + _additionalParameters = + [[NSDictionary alloc] initWithDictionary:additionalParameters copyItems:YES]; + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDServiceConfiguration *configuration = + [aDecoder decodeObjectOfClass:[OIDServiceConfiguration class] + forKey:kConfigurationKey]; + NSString *grantType = [aDecoder decodeObjectOfClass:[NSString class] forKey:kGrantTypeKey]; + NSString *code = [aDecoder decodeObjectOfClass:[NSString class] forKey:kAuthorizationCodeKey]; + NSString *clientID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientIDKey]; + NSString *clientSecret = [aDecoder decodeObjectOfClass:[NSString class] forKey:kClientSecretKey]; + NSString *scope = [aDecoder decodeObjectOfClass:[NSString class] forKey:kScopeKey]; + NSString *refreshToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:kRefreshTokenKey]; + NSString *codeVerifier = [aDecoder decodeObjectOfClass:[NSString class] forKey:kCodeVerifierKey]; + NSURL *redirectURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:kRedirectURLKey]; + NSSet *additionalParameterCodingClasses = [NSSet setWithArray:@[ + [NSDictionary class], + [NSString class] + ]]; + NSDictionary *additionalParameters = + [aDecoder decodeObjectOfClasses:additionalParameterCodingClasses + forKey:kAdditionalParametersKey]; + self = [self initWithConfiguration:configuration + grantType:grantType + authorizationCode:code + redirectURL:redirectURL + clientID:clientID + clientSecret:clientSecret + scope:scope + refreshToken:refreshToken + codeVerifier:codeVerifier + additionalParameters:additionalParameters]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_configuration forKey:kConfigurationKey]; + [aCoder encodeObject:_grantType forKey:kGrantTypeKey]; + [aCoder encodeObject:_authorizationCode forKey:kAuthorizationCodeKey]; + [aCoder encodeObject:_clientID forKey:kClientIDKey]; + [aCoder encodeObject:_clientSecret forKey:kClientSecretKey]; + [aCoder encodeObject:_redirectURL forKey:kRedirectURLKey]; + [aCoder encodeObject:_scope forKey:kScopeKey]; + [aCoder encodeObject:_refreshToken forKey:kRefreshTokenKey]; + [aCoder encodeObject:_codeVerifier forKey:kCodeVerifierKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + NSURLRequest *request = self.URLRequest; + NSString *requestBody = + [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding]; + return [NSString stringWithFormat:@"<%@: %p, request: >", + NSStringFromClass([self class]), + self, + request.URL, + requestBody]; +} + +#pragma mark - + +/*! @brief Constructs the request URI. + @return A URL representing the token request. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (NSURL *)tokenRequestURL { + return _configuration.tokenEndpoint; +} + +/*! @brief Constructs the request body data by combining the request parameters using the + "application/x-www-form-urlencoded" format. + @return The data to pass to the token request URL. + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +- (NSData *)tokenRequestBody { + OIDURLQueryComponent *query = [[OIDURLQueryComponent alloc] init]; + + // Add parameters, as applicable. + if (_grantType) { + [query addParameter:kGrantTypeKey value:_grantType]; + } + if (_scope) { + [query addParameter:kScopeKey value:_scope]; + } + if (_clientID) { + [query addParameter:kClientIDKey value:_clientID]; + } + if (_clientSecret) { + [query addParameter:kClientSecretKey value:_clientSecret]; + } + if (_redirectURL) { + [query addParameter:kRedirectURLKey value:_redirectURL.absoluteString]; + } + if (_refreshToken) { + [query addParameter:kRefreshTokenKey value:_refreshToken]; + } + if (_authorizationCode) { + [query addParameter:kAuthorizationCodeKey value:_authorizationCode]; + } + if (_codeVerifier) { + [query addParameter:kCodeVerifierKey value:_codeVerifier]; + } + + // Add any additional parameters the client has specified. + [query addParameters:_additionalParameters]; + + // Construct the body string: + NSString *bodyString = [query URLEncodedParameters]; + NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; + return body; +} + +- (NSURLRequest *)URLRequest { + static NSString *const kHTTPPost = @"POST"; + static NSString *const kHTTPContentTypeHeaderKey = @"Content-Type"; + static NSString *const kHTTPContentTypeHeaderValue = + @"application/x-www-form-urlencoded; charset=UTF-8"; + + NSURL *tokenRequestURL = [self tokenRequestURL]; + NSMutableURLRequest *URLRequest = [[NSURLRequest requestWithURL:tokenRequestURL] mutableCopy]; + URLRequest.HTTPMethod = kHTTPPost; + [URLRequest setValue:kHTTPContentTypeHeaderValue forHTTPHeaderField:kHTTPContentTypeHeaderKey]; + URLRequest.HTTPBody = [self tokenRequestBody]; + return URLRequest; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.h b/Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.h new file mode 100644 index 000000000..5a7cf550d --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.h @@ -0,0 +1,102 @@ +/*! @file OIDTokenResponse.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDTokenRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Represents the response to an token request. + @see https://tools.ietf.org/html/rfc6749#section-3.2 + @see https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +@interface OIDTokenResponse : NSObject + +/*! @brief The request which was serviced. + */ +@property(nonatomic, readonly) OIDTokenRequest *request; + +/*! @brief The access token generated by the authorization server. + @discussion Set when the response_type requested includes 'token'. + @remarks access_token + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *accessToken; + +/*! @brief The approximate expiration date & time of the access token. + @remarks expires_in + @seealso OIDTokenResponse.accessToken + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSDate *accessTokenExpirationDate; + +/*! @brief Typically "Bearer" when present. Otherwise, another token_type value that the Client has + negotiated with the Authorization Server. + @discussion Set when the response_type requested includes 'token'. + @remarks token_type + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *tokenType; + +/*! @brief ID Token value associated with the authenticated session. + @discussion Set when the response_type requested includes 'id_token'. + @remarks id_token + @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken + @see http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthResponse + */ +@property(nonatomic, readonly, nullable) NSString *idToken; + +/*! @brief The refresh token, which can be used to obtain new access tokens using the same + authorization grant + @remarks refresh_token + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *refreshToken; + +/*! @brief The scope of the access token. OPTIONAL, if identical to the scopes requested, otherwise, + REQUIRED. + @remarks scope + @see https://tools.ietf.org/html/rfc6749#section-5.1 + */ +@property(nonatomic, readonly, nullable) NSString *scope; + +/*! @brief Additional parameters returned from the token server. + */ +@property(nonatomic, readonly, nullable) + NSDictionary *> *additionalParameters; + +/*! @internal + @brief Unavailable. Please use initWithParameters:. + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @brief Designated initializer. + @param request The serviced request. + @param parameters The decoded parameters returned from the Authorization Server. + @remarks Known parameters are extracted from the @c parameters parameter and the normative + properties are populated. Non-normative parameters are placed in the + @c #additionalParameters dictionary. + */ +- (nullable instancetype)initWithRequest:(OIDTokenRequest *)request + parameters:(NSDictionary *> *)parameters + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.m b/Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.m new file mode 100644 index 000000000..2ad1a24a6 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDTokenResponse.m @@ -0,0 +1,168 @@ +/*! @file OIDTokenResponse.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDTokenResponse.h" + +#import "OIDDefines.h" +#import "OIDFieldMapping.h" +#import "OIDTokenRequest.h" + +/*! @brief Key used to encode the @c request property for @c NSSecureCoding + */ +static NSString *const kRequestKey = @"request"; + +/*! @brief The key for the @c accessToken property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kAccessTokenKey = @"access_token"; + +/*! @brief The key for the @c accessTokenExpirationDate property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kExpiresInKey = @"expires_in"; + +/*! @brief The key for the @c tokenType property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kTokenTypeKey = @"token_type"; + +/*! @brief The key for the @c idToken property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kIDTokenKey = @"id_token"; + +/*! @brief The key for the @c refreshToken property in the incoming parameters and for + @c NSSecureCoding. + */ +static NSString *const kRefreshTokenKey = @"refresh_token"; + +/*! @brief The key for the @c scope property in the incoming parameters and for @c NSSecureCoding. + */ +static NSString *const kScopeKey = @"scope"; + +/*! @brief Key used to encode the @c additionalParameters property for @c NSSecureCoding + */ +static NSString *const kAdditionalParametersKey = @"additionalParameters"; + +@implementation OIDTokenResponse + +/*! @brief Returns a mapping of incoming parameters to instance variables. + @return A mapping of incoming parameters to instance variables. + */ ++ (NSDictionary *)fieldMap { + static NSMutableDictionary *fieldMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + fieldMap = [NSMutableDictionary dictionary]; + fieldMap[kAccessTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessToken" type:[NSString class]]; + fieldMap[kExpiresInKey] = + [[OIDFieldMapping alloc] initWithName:@"_accessTokenExpirationDate" + type:[NSDate class] + conversion:^id _Nullable(NSObject *_Nullable value) { + if (![value isKindOfClass:[NSNumber class]]) { + return value; + } + NSNumber *valueAsNumber = (NSNumber *)value; + return [NSDate dateWithTimeIntervalSinceNow:[valueAsNumber longLongValue]]; + }]; + fieldMap[kTokenTypeKey] = + [[OIDFieldMapping alloc] initWithName:@"_tokenType" type:[NSString class]]; + fieldMap[kIDTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_idToken" type:[NSString class]]; + fieldMap[kRefreshTokenKey] = + [[OIDFieldMapping alloc] initWithName:@"_refreshToken" type:[NSString class]]; + fieldMap[kScopeKey] = + [[OIDFieldMapping alloc] initWithName:@"_scope" type:[NSString class]]; + }); + return fieldMap; +} + +#pragma mark - Initializers + +- (nullable instancetype)init + OID_UNAVAILABLE_USE_INITIALIZER(@selector(initWithRequest:parameters:)); + +- (nullable instancetype)initWithRequest:(OIDTokenRequest *)request + parameters:(NSDictionary *> *)parameters { + self = [super init]; + if (self) { + _request = [request copy]; + NSDictionary *> *additionalParameters = + [OIDFieldMapping remainingParametersWithMap:[[self class] fieldMap] + parameters:parameters + instance:self]; + _additionalParameters = additionalParameters; + } + return self; +} + +#pragma mark - NSCopying + +- (instancetype)copyWithZone:(nullable NSZone *)zone { + // The documentation for NSCopying specifically advises us to return a reference to the original + // instance in the case where instances are immutable (as ours is): + // "Implement NSCopying by retaining the original instead of creating a new copy when the class + // and its contents are immutable." + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDTokenRequest *request = + [aDecoder decodeObjectOfClass:[OIDTokenRequest class] forKey:kRequestKey]; + self = [self initWithRequest:request parameters:@{ }]; + if (self) { + [OIDFieldMapping decodeWithCoder:aDecoder map:[[self class] fieldMap] instance:self]; + _additionalParameters = [aDecoder decodeObjectOfClasses:[OIDFieldMapping JSONTypes] + forKey:kAdditionalParametersKey]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [OIDFieldMapping encodeWithCoder:aCoder map:[[self class] fieldMap] instance:self]; + [aCoder encodeObject:_request forKey:kRequestKey]; + [aCoder encodeObject:_additionalParameters forKey:kAdditionalParametersKey]; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, accessToken: \"%@\", accessTokenExpirationDate: %@, " + "tokenType: %@, idToken: \"%@\", refreshToken: \"%@\", " + "scope: \"%@\", additionalParameters: %@, request: %@>", + NSStringFromClass([self class]), + self, + _accessToken, + _accessTokenExpirationDate, + _tokenType, + _idToken, + _refreshToken, + _scope, + _additionalParameters, + _request]; +} + +#pragma mark - + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.h b/Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.h new file mode 100644 index 000000000..f13d937b0 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.h @@ -0,0 +1,55 @@ +/*! @file OIDTokenUtilities.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Provides data encoding/decoding methods, random string generators, etc. + */ +@interface OIDTokenUtilities : NSObject + +/*! @internal + @brief Unavailable. This class should not be initialized. + */ +- (instancetype)init NS_UNAVAILABLE; + +/*! @brief Base64url-nopadding encodes the given data. + @param data The input data. + @return The base64url encoded data as a NSString. + @discussion Base64url-nopadding is used in several identity specs such as PKCE and + OpenID Connect. + */ ++ (NSString *)encodeBase64urlNoPadding:(NSData *)data; + +/*! @brief Generates a URL-safe string of random data. + @param size The number of random bytes to encode. NB. the length of the output string will be + greater than the number of random bytes, due to the URL-safe encoding. + @return Random data encoded with base64url. + */ ++ (nullable NSString *)randomURLSafeStringWithSize:(NSUInteger)size; + +/*! @brief SHA256 hashes the input string. + @param inputString The input string. + @return The SHA256 data. + */ ++ (NSData *)sha265:(NSString *)inputString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.m b/Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.m new file mode 100644 index 000000000..fa08ddcb5 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDTokenUtilities.m @@ -0,0 +1,51 @@ +/*! @file OIDTokenUtilities.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDTokenUtilities.h" + +#import + +@implementation OIDTokenUtilities + ++ (NSString *)encodeBase64urlNoPadding:(NSData *)data { + NSString *base64string = [data base64EncodedStringWithOptions:0]; + // converts base64 to base64url + base64string = [base64string stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; + base64string = [base64string stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; + // strips padding + base64string = [base64string stringByReplacingOccurrencesOfString:@"=" withString:@""]; + return base64string; +} + ++ (nullable NSString *)randomURLSafeStringWithSize:(NSUInteger)size { + NSMutableData *randomData = [NSMutableData dataWithLength:size]; + int result = SecRandomCopyBytes(kSecRandomDefault, randomData.length, randomData.mutableBytes); + if (result != 0) { + return nil; + } + return [[self class] encodeBase64urlNoPadding:randomData]; +} + ++ (NSData *)sha265:(NSString *)inputString { + NSData *verifierData = [inputString dataUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *sha256Verifier = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(verifierData.bytes, (CC_LONG)verifierData.length, sha256Verifier.mutableBytes); + return sha256Verifier; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.h b/Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.h new file mode 100644 index 000000000..69f8c6eed --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.h @@ -0,0 +1,79 @@ +/*! @file OIDURLQueryComponent.h + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 OIDAuthorizationRequest; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief If set to YES, will force the iOS 7-only code for @c OIDURLQueryComponent to be used, + even on non-iOS 7 devices and simulators. Useful for testing the iOS 7 code paths on the + simulator. Defaults to NO. + */ +extern BOOL gOIDURLQueryComponentForceIOS7Handling; + +/*! @brief A utility class for creating and parsing URL query components. + */ +@interface OIDURLQueryComponent : NSObject + +/*! @brief The parameter names in the query. + */ +@property(nonatomic, readonly) NSArray *parameters; + +/*! @brief The parameters represented as a dictionary. + @remarks All values are @c NSString except for parameters which contain multiple values, in + which case the value is an @c NSArray *. + */ +@property(nonatomic, readonly) NSDictionary *> *dictionaryValue; + +/*! @brief Creates an @c OIDURLQueryComponent by parsing the query string in a URL. + @param URL The URL from which to extract a query component. + */ +- (nullable instancetype)initWithURL:(NSURL *)URL; + +/*! @brief The value (or values) for a named parameter in the query. + @param parameter The parameter name. Case sensitive. + @return The value (or values) for a named parameter in the query. + */ +- (NSArray *)valuesForParameter:(NSString *)parameter; + +/*! @brief Adds a parameter value to the query. + @param parameter The name of the parameter. Case sensitive. + @param value The value to add. + */ +- (void)addParameter:(NSString *)parameter value:(NSString *)value; + +/*! @brief Adds multiple parameters with associated values to the query. + @param parameters The parameter name value pairs to add to the query. + */ +- (void)addParameters:(NSDictionary *)parameters; + +/*! @param URL The URL to add the query component to. + @return The original URL with the query component replaced by the parameters from this query. + */ +- (NSURL *)URLByReplacingQueryInURL:(NSURL *)URL; + +/*! @brief Builds an x-www-form-urlencoded string representing the parameters. + @return The x-www-form-urlencoded string representing the parameters. + */ +- (NSString *)URLEncodedParameters; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.m b/Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.m new file mode 100644 index 000000000..2ed290a44 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/OIDURLQueryComponent.m @@ -0,0 +1,197 @@ +/*! @file OIDURLQueryComponent.m + @brief AppAuth iOS SDK + @copyright + Copyright 2015 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDURLQueryComponent.h" + +BOOL gOIDURLQueryComponentForceIOS7Handling = NO; + +/*! @brief String representing the set of characters that are valid for the URL query + (per @ NSCharacterSet.URLQueryAllowedCharacterSet), but are disallowed in URL query + parameters and values. + */ +static NSString *const kQueryStringParamAdditionalDisallowedCharacters = @"=&+"; + +@implementation OIDURLQueryComponent { + /*! @brief A dictionary of parameter names and values representing the contents of the query. + */ + NSMutableDictionary *> *_parameters; +} + +- (nullable instancetype)init { + self = [super init]; + if (self) { + _parameters = [NSMutableDictionary dictionary]; + } + return self; +} + +- (nullable instancetype)initWithURL:(NSURL *)URL { + self = [self init]; + if (self) { + if (!gOIDURLQueryComponentForceIOS7Handling && [NSURLQueryItem class]) { + // If NSURLQueryItem is available, use it for deconstructing the new URL. (iOS 8+) + NSURLComponents *components = + [NSURLComponents componentsWithURL:URL resolvingAgainstBaseURL:NO]; + NSArray *queryItems = components.queryItems; + for (NSURLQueryItem *queryItem in queryItems) { + [self addParameter:queryItem.name value:queryItem.value]; + } + } else { + // Fallback for iOS 7 + NSString *query = URL.query; + NSArray *queryParts = [query componentsSeparatedByString:@"&"]; + for (NSString *queryPart in queryParts) { + NSRange equalsRange = [queryPart rangeOfString:@"="]; + if (equalsRange.location == NSNotFound) { + continue; + } + NSString *name = [queryPart substringToIndex:equalsRange.location]; + name = name.stringByRemovingPercentEncoding; + NSString *value = [queryPart substringFromIndex:equalsRange.location + equalsRange.length]; + value = value.stringByRemovingPercentEncoding; + [self addParameter:name value:value]; + } + } + } + return self; +} + +- (NSArray *)parameters { + return _parameters.allKeys; +} + +- (NSDictionary *> *)dictionaryValue { + // This method will flatten arrays in our @c _parameters' values if only one value exists. + NSMutableDictionary *> *values = [NSMutableDictionary dictionary]; + for (NSString *parameter in _parameters.allKeys) { + NSArray *value = _parameters[parameter]; + if (value.count == 1) { + values[parameter] = [value.firstObject copy]; + } else { + values[parameter] = [value copy]; + } + } + return values; +} + +- (NSArray *)valuesForParameter:(NSString *)parameter { + return _parameters[parameter]; +} + +- (void)addParameter:(NSString *)parameter value:(NSString *)value { + NSMutableArray *parameterValues = _parameters[parameter]; + if (!parameterValues) { + parameterValues = [NSMutableArray array]; + _parameters[parameter] = parameterValues; + } + [parameterValues addObject:value]; +} + +- (void)addParameters:(NSDictionary *)parameters { + for (NSString *parameterName in parameters.allKeys) { + [self addParameter:parameterName value:parameters[parameterName]]; + } +} + +/*! @brief Builds a query items array that can be set to @c NSURLComponents.queryItems + @discussion The parameter names and values are NOT URL encoded. + @return An array of unencoded @c NSURLQueryItem objects. + */ +- (NSMutableArray *)queryItems { + NSMutableArray *queryParameters = [NSMutableArray array]; + for (NSString *parameterName in _parameters.allKeys) { + NSArray *values = _parameters[parameterName]; + for (NSString *value in values) { + NSURLQueryItem *item = [NSURLQueryItem queryItemWithName:parameterName value:value]; + [queryParameters addObject:item]; + } + } + return queryParameters; +} + +/*! @brief Builds a query string that can be set to @c NSURLComponents.percentEncodedQuery + @discussion This string is percent encoded, and shouldn't be used with + @c NSURLComponents.query. + @return An percentage encoded query string. + */ +- (NSString *)percentEncodedQueryString { + NSMutableArray *parameterizedValues = [NSMutableArray array]; + + // Starts with the standard URL-allowed character set. + NSMutableCharacterSet *allowedParamCharacters = + [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + // Removes additional characters we don't want to see in the query component. + [allowedParamCharacters removeCharactersInString:kQueryStringParamAdditionalDisallowedCharacters]; + + for (NSString *parameterName in _parameters.allKeys) { + NSString *encodedParameterName = + [parameterName stringByAddingPercentEncodingWithAllowedCharacters:allowedParamCharacters]; + + NSArray *values = _parameters[parameterName]; + for (NSString *value in values) { + NSString *encodedValue = + [value stringByAddingPercentEncodingWithAllowedCharacters:allowedParamCharacters]; + NSString *parameterizedValue = + [NSString stringWithFormat:@"%@=%@", encodedParameterName, encodedValue]; + [parameterizedValues addObject:parameterizedValue]; + } + } + + NSString *queryString = [parameterizedValues componentsJoinedByString:@"&"]; + return queryString; +} + +- (NSString *)URLEncodedParameters { + // If NSURLQueryItem is available, uses it for constructing the encoded parameters. (iOS 8+) + if (!gOIDURLQueryComponentForceIOS7Handling && [NSURLQueryItem class]) { + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.queryItems = [self queryItems]; + NSString *encodedQuery = components.percentEncodedQuery; + // NSURLComponents.percentEncodedQuery creates a validly escaped URL query component, but + // doesn't encode the '+' leading to potential ambiguity with application/x-www-form-urlencoded + // encoding. Percent encodes '+' to avoid this ambiguity. + encodedQuery = [encodedQuery stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; + return encodedQuery; + } + + // else, falls back to building query string manually (iOS 7) + return [self percentEncodedQueryString]; +} + +- (NSURL *)URLByReplacingQueryInURL:(NSURL *)URL { + NSURLComponents *components = + [NSURLComponents componentsWithURL:URL resolvingAgainstBaseURL:NO]; + + // Replaces encodedQuery component + NSString *queryString = [self URLEncodedParameters]; + components.percentEncodedQuery = queryString; + + NSURL *URLWithParameters = components.URL; + return URLWithParameters; +} + +#pragma mark - NSObject overrides + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, parameters: %@>", + NSStringFromClass([self class]), + self, + _parameters]; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.h b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.h new file mode 100644 index 000000000..80f162587 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.h @@ -0,0 +1,46 @@ +/*! @file OIDAuthState+IOS.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthState.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief iOS specific convenience methods for @c OIDAuthState. + */ +@interface OIDAuthState (IOS) + +/*! @brief Convenience method to create a @c OIDAuthState by presenting an authorization request + and performing the authorization code exchange in the case of code flow requests. + @param authorizationRequest The authorization request to present. + @param presentingViewController The view controller from which to present the + @c SFSafariViewController. + @param callback The method called when the request has completed or failed. + @return A @c OIDAuthorizationFlowSession instance which will terminate when it + receives a @c OIDAuthorizationFlowSession.cancel message, or after processing a + @c OIDAuthorizationFlowSession.resumeAuthorizationFlowWithURL: message. + */ ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthStateAuthorizationCallback)callback; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.m b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.m new file mode 100644 index 000000000..3e32a8be9 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthState+IOS.m @@ -0,0 +1,36 @@ +/*! @file OIDAuthState+IOS.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthState+IOS.h" + +#import "OIDAuthorizationUICoordinatorIOS.h" + +@implementation OIDAuthState (IOS) + ++ (id) + authStateByPresentingAuthorizationRequest:(OIDAuthorizationRequest *)authorizationRequest + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthStateAuthorizationCallback)callback { + OIDAuthorizationUICoordinatorIOS *coordinator = [[OIDAuthorizationUICoordinatorIOS alloc] + initWithPresentingViewController:presentingViewController]; + return [self authStateByPresentingAuthorizationRequest:authorizationRequest + UICoordinator:coordinator + callback:callback]; +} + +@end diff --git a/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.h b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.h new file mode 100644 index 000000000..3d76340e8 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.h @@ -0,0 +1,44 @@ +/*! @file OIDAuthorizationService+IOS.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthorizationService.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Provides iOS specific authorization request handling. + */ +@interface OIDAuthorizationService (IOS) + +/*! @brief Perform an authorization flow using \SFSafariViewController. + @param request The authorization request. + @param presentingViewController The view controller from which to present the + \SFSafariViewController. + @param callback The method called when the request has completed or failed. + @return A @c OIDAuthorizationFlowSession instance which will terminate when it + receives a @c OIDAuthorizationFlowSession.cancel message, or after processing a + @c OIDAuthorizationFlowSession.resumeAuthorizationFlowWithURL: message. + */ ++ (id) + presentAuthorizationRequest:(OIDAuthorizationRequest *)request + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthorizationCallback)callback; +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.m b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.m new file mode 100644 index 000000000..2a8d6da86 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationService+IOS.m @@ -0,0 +1,38 @@ +/*! @file OIDAuthorizationService+IOS.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthorizationService+IOS.h" + +#import "OIDAuthorizationUICoordinatorIOS.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation OIDAuthorizationService (IOS) + ++ (id) + presentAuthorizationRequest:(OIDAuthorizationRequest *)request + presentingViewController:(UIViewController *)presentingViewController + callback:(OIDAuthorizationCallback)callback { + OIDAuthorizationUICoordinatorIOS *coordinator = [[OIDAuthorizationUICoordinatorIOS alloc] + initWithPresentingViewController:presentingViewController]; + return [self presentAuthorizationRequest:request UICoordinator:coordinator callback:callback]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.h b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.h new file mode 100644 index 000000000..57c0d25d1 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.h @@ -0,0 +1,66 @@ +/*! @file OIDAuthorizationUICoordinator.h + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthorizationUICoordinator.h" + +@class SFSafariViewController; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Allows library consumers to bootstrap an @c SFSafariViewController as they see fit. + @remarks Useful for customizing tint colors and presentation styles. + */ +@protocol OIDSafariViewControllerFactory + +/*! @brief Creates and returns a new @c SFSafariViewController. + @param URL The URL which the @c SFSafariViewController should load initially. + */ +- (SFSafariViewController *)safariViewControllerWithURL:(NSURL *)URL; + +@end + +/*! @brief An iOS specific authorization UI Coordinator that uses a \SFSafariViewController to + present an authorization request. + */ +@interface OIDAuthorizationUICoordinatorIOS : NSObject + +/*! @brief Allows library consumers to change the @c OIDSafariViewControllerFactory used to create + new instances of @c SFSafariViewController. + @remarks Useful for customizing tint colors and presentation styles. + @param factory The @c OIDSafariViewControllerFactory to use for creating new instances of + @c SFSafariViewController. + */ ++ (void)setSafariViewControllerFactory:(id)factory; + +/*! @internal + @brief Unavailable. Please use @c initWithPresentingViewController: + */ +- (nullable instancetype)init NS_UNAVAILABLE; + +/*! @brief The designated initializer. + @param parentViewController The view controller from which to present the + \SFSafariViewController. + */ +- (nullable instancetype)initWithPresentingViewController:(UIViewController *)parentViewController + NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.m b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.m new file mode 100644 index 000000000..6bb2ac270 --- /dev/null +++ b/Paco-iOS/Pods/AppAuth/Source/iOS/OIDAuthorizationUICoordinatorIOS.m @@ -0,0 +1,154 @@ +/*! @file OIDAuthorizationUICoordinatorIOS.m + @brief AppAuth iOS SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "OIDAuthorizationUICoordinatorIOS.h" + +#import + +#import "OIDAuthorizationService.h" +#import "OIDErrorUtilities.h" + +NS_ASSUME_NONNULL_BEGIN + +/** @brief The global/shared Safari view controller factory. Responsible for creating all new + instances of @c SFSafariViewController. + */ +static id __nullable gSafariViewControllerFactory; + +/** @brief The default @c OIDSafariViewControllerFactory which creates new instances of + @c SFSafariViewController using known best practices. + */ +@interface OIDDefaultSafariViewControllerFactory : NSObject +@end + +@interface OIDAuthorizationUICoordinatorIOS () +@end + +@implementation OIDAuthorizationUICoordinatorIOS { + UIViewController *_presentingViewController; + + BOOL _authorizationFlowInProgress; + __weak id _session; + __weak SFSafariViewController *_safariVC; +} + +/** @brief Obtains the current @c OIDSafariViewControllerFactory; creating a new default instance if + required. + */ ++ (id)safariViewControllerFactory { + if (!gSafariViewControllerFactory) { + gSafariViewControllerFactory = [[OIDDefaultSafariViewControllerFactory alloc] init]; + } + return gSafariViewControllerFactory; +} + ++ (void)setSafariViewControllerFactory:(id)factory { + NSAssert(factory, @"Parameter: |factory| must be non-nil."); + gSafariViewControllerFactory = factory; +} + +- (nullable instancetype)initWithPresentingViewController: + (UIViewController *)presentingViewController { + self = [super init]; + if (self) { + _presentingViewController = presentingViewController; + } + return self; +} + +- (BOOL)presentAuthorizationWithURL:(NSURL *)URL session:(id)session { + if (_authorizationFlowInProgress) { + // TODO: Handle errors as authorization is already in progress. + return NO; + } + + _authorizationFlowInProgress = YES; + _session = session; + if ([SFSafariViewController class]) { + SFSafariViewController *safariVC = + [[[self class] safariViewControllerFactory] safariViewControllerWithURL:URL]; + safariVC.delegate = self; + _safariVC = safariVC; + [_presentingViewController presentViewController:safariVC animated:YES completion:nil]; + return YES; + } + BOOL openedSafari = [[UIApplication sharedApplication] openURL:URL]; + if (!openedSafari) { + [self cleanUp]; + NSError *safariError = [OIDErrorUtilities errorWithCode:OIDErrorCodeSafariOpenError + underlyingError:nil + description:@"Unable to open Safari."]; + [session failAuthorizationFlowWithError:safariError]; + } + return openedSafari; +} + +- (void)dismissAuthorizationAnimated:(BOOL)animated completion:(void (^)(void))completion { + if (!_authorizationFlowInProgress) { + // Ignore this call if there is no authorization flow in progress. + return; + } + SFSafariViewController *safariVC = _safariVC; + [self cleanUp]; + if (safariVC) { + [safariVC dismissViewControllerAnimated:YES completion:completion]; + } else { + if (completion) completion(); + } +} + +- (void)cleanUp { + // The weak references to |_safariVC| and |_session| are set to nil to avoid accidentally using + // them while not in an authorization flow. + _safariVC = nil; + _session = nil; + _authorizationFlowInProgress = NO; +} + +#pragma mark - SFSafariViewControllerDelegate + +- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller { + if (controller != _safariVC) { + // Ignore this call if the safari view controller do not match. + return; + } + if (!_authorizationFlowInProgress) { + // Ignore this call if there is no authorization flow in progress. + return; + } + id session = _session; + [self cleanUp]; + NSError *error = [OIDErrorUtilities errorWithCode:OIDErrorCodeProgramCanceledAuthorizationFlow + underlyingError:nil + description:nil]; + [session failAuthorizationFlowWithError:error]; +} + +@end + +@implementation OIDDefaultSafariViewControllerFactory + +- (SFSafariViewController *)safariViewControllerWithURL:(NSURL *)URL { + SFSafariViewController *safariViewController = + [[SFSafariViewController alloc] initWithURL:URL entersReaderIfAvailable:NO]; + return safariViewController; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMAppAuth/LICENSE b/Paco-iOS/Pods/GTMAppAuth/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. diff --git a/Paco-iOS/Pods/GTMAppAuth/README.md b/Paco-iOS/Pods/GTMAppAuth/README.md new file mode 100644 index 000000000..b3105126c --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/README.md @@ -0,0 +1,372 @@ +# GTMAppAuth for iOS and macOS + +GTMAppAuth enables you to use [AppAuth](http://openid.github.io/AppAuth-iOS) +with the +[Google Toolbox for Mac - Session Fetcher](https://github.com/google/gtm-session-fetcher) +and +[Google APIs Client Library for Objective-C For REST](https://github.com/google/google-api-objectivec-client-for-rest) +libraries by providing an implementation of `GTMFetcherAuthorizationProtocol` +for authorizing requests with AppAuth. + +GTMAppAuth is an alternative authorizer to GTMOAuth2. The key differentiator is +the use of the user's default browser for the authorization, which is more +secure, more usable (the user's session can be reused) and follows modern OAuth +[best practices for native apps](https://tools.ietf.org/html/draft-ietf-oauth-native-apps). +Compatibility methods for GTMOAuth2 are offered allowing you to migrate +from GTMOAuth2 to GTMAppAuth preserving previously serialized authorizations +(so users shouldn't need to re-authenticate). + +## Setup + +If you use [CocoaPods](https://guides.cocoapods.org/using/getting-started.html), +simply add: + + pod 'GTMAppAuth' + +To your `Podfile` and run `pod install`. + +## Usage + +### Configuration + +To configure GTMAppAuth with the OAuth endpoints for Google, you can use the +convenience method: + +```objc +OIDServiceConfiguration *configuration = + [GTMAppAuthFetcherAuthorization configurationForGoogle]; +``` + +Alternatively, you can configure GTMAppAuth by specifying the endpoints +directly: + +```objc +NSURL *authorizationEndpoint = + [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/v2/auth"]; +NSURL *tokenEndpoint = + [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v4/token"]; + +OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] + initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint]; + +// perform the auth request... +``` + +Or through discovery: + +```objc +NSURL *issuer = [NSURL URLWithString:@"https://accounts.google.com"]; + +[OIDAuthorizationService discoverServiceConfigurationForIssuer:issuer + completion:^(OIDServiceConfiguration *_Nullable configuration, + NSError *_Nullable error) { + if (!configuration) { + NSLog(@"Error retrieving discovery document: %@", + [error localizedDescription]); + return; + } + + // perform the auth request... +}]; +``` + +### Authorizing + +First, you need to have a way for your UIApplicationDelegate to continue the +authorization flow session from the incoming redirect URI. Typically you could +store the in-progress OIDAuthorizationFlowSession instance in a property: + +```objc +// property of the app's UIApplicationDelegate +@property(nonatomic, nullable) + id currentAuthorizationFlow; +``` + +And in a location accessible by all controllers that need authorization, a +property to store the authorization state: + +```objc +// property of the containing class +@property(nonatomic, nullable) GTMAppAuthFetcherAuthorization *authorization; +``` + +Then, initiate the authorization request. By using the +`authStateByPresentingAuthorizationRequest` method, the OAuth token +exchange will be performed automatically, and everything will be protected with +PKCE (if the server supports it). + +```objc +// builds authentication request +OIDAuthorizationRequest *request = + [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration + clientId:kClientID + clientSecret:kClientSecret + scopes:@[OIDScopeOpenID, OIDScopeProfile] + redirectURL:redirectURI + responseType:OIDResponseTypeCode + additionalParameters:nil]; +// performs authentication request +self.appDelegate.currentAuthorizationFlow = + [OIDAuthState authStateByPresentingAuthorizationRequest:request + callback:^(OIDAuthState *_Nullable authState, + NSError *_Nullable error) { + if (authState) { + // Creates the GTMAppAuthFetcherAuthorization from the OIDAuthState. + GTMAppAuthFetcherAuthorization *authorization = + [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState]; + + self.authorization = authorization; + NSLog(@"Got authorization tokens. Access token: %@", + authState.lastTokenResponse.accessToken); + } else { + NSLog(@"Authorization error: %@", [error localizedDescription]); + self.authorization = nil; + } +}]; +``` + +### Handling the Redirect + +The authorization response URL is returned to the app via the platform-specific +application delegate method, so you need to pipe this through to the current +authorization session (created in the previous session). + +#### macOS Custom URI Scheme Redirect Example + +```objc +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Other app initialization code ... + + // Register for GetURL events. + NSAppleEventManager *appleEventManager = + [NSAppleEventManager sharedAppleEventManager]; + [appleEventManager setEventHandler:self + andSelector:@selector(handleGetURLEvent:withReplyEvent:) + forEventClass:kInternetEventClass + andEventID:kAEGetURL]; +} + +- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event + withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + NSString *URLString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; + NSURL *URL = [NSURL URLWithString:URLString]; + [_currentAuthorizationFlow resumeAuthorizationFlowWithURL:URL]; +} +``` + +#### iOS Custom URI Scheme Redirect Example + +```objc +- (BOOL)application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options { + // Sends the URL to the current authorization flow (if any) which will + // process it if it relates to an authorization response. + if ([_currentAuthorizationFlow resumeAuthorizationFlowWithURL:url]) { + _currentAuthorizationFlow = nil; + return YES; + } + + // Your additional URL handling (if any) goes here. + + return NO; +} +``` + +### Making API Calls + +The goal of GTMAppAuth is to enable you to authorize HTTP requests with fresh +tokens following the Session Fetcher pattern, which you can do like so: + +```objc +// Creates a GTMSessionFetcherService with the authorization. +// Normally you would save this service object and re-use it for all REST API calls. +GTMSessionFetcherService *fetcherService = [[GTMSessionFetcherService alloc] init]; +fetcherService.authorizer = self.authorization; + +// Creates a fetcher for the API call. +NSURL *userinfoEndpoint = [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v3/userinfo"]; +GTMSessionFetcher *fetcher = [fetcherService fetcherWithURL:userinfoEndpoint]; +[fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + // Checks for an error. + if (error) { + // OIDOAuthTokenErrorDomain indicates an issue with the authorization. + if ([error.domain isEqual:OIDOAuthTokenErrorDomain]) { + self.authorization = nil; + NSLog(@"Authorization error during token refresh, clearing state. %@", + error); + // Other errors are assumed transient. + } else { + NSLog(@"Transient error during token refresh. %@", error); + } + return; + } + + // Parses the JSON response. + NSError *jsonError = nil; + id jsonDictionaryOrArray = + [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; + + // JSON error. + if (jsonError) { + NSLog(@"JSON decoding error %@", jsonError); + return; + } + + // Success response! + NSLog(@"Success: %@", jsonDictionaryOrArray); +}]; +``` + +### Serialization + +You can easily serialize `GTMAppAuthFetcherAuthorization` objects using the +included Keychain category. + +```objc +// Serialize to Keychain +[GTMAppAuthFetcherAuthorization saveAuthorization:_authorization + toKeychainForName:kGTMAppAuthExampleAuthorizerKey]; + +// Deserialize from Keychain +GTMAppAuthFetcherAuthorization* authorization = + [GTMAppAuthFetcherAuthorization authorizationFromKeychainForName:kGTMAppAuthExampleAuthorizerKey]; + +// Remove from Keychain +[GTMAppAuthFetcherAuthorization + removeAuthorizationFromKeychainForName:kGTMAppAuthExampleAuthorizerKey]; +``` + +### GTMOAuth2-compatible Serialization + +To assist the migration from GTMOAuth2 to GTMAppAuth, GTMOAuth2-compatible +serialization methods are provided in `GTMOAuth2KeychainCompatibility`. + +```objc +// Deserialize from Keychain +GTMAppAuthFetcherAuthorization *auth = + [GTMOAuth2KeychainCompatibility authForGoogleFromKeychainForName:kKeychainItemName + clientID:clientID + clientSecret:clientSecret]; + +// Remove from Keychain +[GTMOAuth2KeychainCompatibility removeAuthFromKeychainForName:kKeychainItemName]; +``` + +You can also serialize to GTMOAuth2 format, though this is discouraged (you +should serialize in GTMAppAuth format as described above). + +```objc +// Serialize to Keychain +[GTMOAuth2KeychainCompatibility saveAuthToKeychainForName:kKeychainItemName + authentication:authorization]; +``` + +## Included Samples + +Try out one of the included samples `Example-Mac` and `Example-iOS`. In the +folder run `pod install`, then open the `xcworkspace` file. + +Be sure to follow the instructions in +[Example-iOS/README.md](Example-iOS/README.md) or +[Example-macOS/README.md](Example-macOS/README.md) to configure your own OAuth +client ID for use with the example. + +## Differences with GTMOAuth2 + +### Authorization Method + +GTMAppAuth uses the browser to present the authorization request, while +GTMOAuth2 uses an embedded web-view. Migrating to GTMAppAuth will require you +to change how you authorize the user. Follow the instructions above to get the +authorization. You can then create a `GTMAppAuthFetcherAuthorization` object +with the `initWithAuthState:authState` initializer. + +Once you have the `GTMAppAuthFetcherAuthorization` you can continue to make REST +calls as before. + +### Error Handling + +GTMAppAuth's error handling is also different. There are no notifications, +instead you need to inspect NSError in the callback. If the error domain is +`OIDOAuthTokenErrorDomain`, it indicates an authorization error, you should +clear your authorization state and consider prompting the user to authorize +again. Other errors are generally considered transient, meaning that you should +retry the request after a delay. + +### Serialization + +The serialization format is different between GTMOAuth2 and GTMAppAuth, though +we have methods to help you migrate from one to the other without losing any +data. + +## Migrating from GTMOAuth2 + +### OAuth Client Registration + +Typically, GTMOAuth2 clients are registered with Google as type "Other". This is +correct for macOS, but on iOS clients should be registered with the type "iOS". + +If you're migrating an iOS client, in the *same project as your existing client*, +[register a new iOS client](https://console.developers.google.com/apis/credentials?project=_) +to be used with GTMAppAuth. + +### Changing your Authorization Flows + +Both GTMOAuth2 and GTMAppAuth support the `GTMFetcherAuthorizationProtocol` +allowing you to use the authorization with the session fetcher. Where you +previously had a property like `GTMOAuth2Authentication *authorization` change the +type to reference the protocol instead, i.e.: +`id authorization`. This allows you to switch +the authorization implementation under the hood to GTMAppAuth. + +Then, follow the instructions above to replace authorization request +(where you ask the user to grant access) with the GTMAppAuth approach. If you +created a new OAuth client, use that for these requests. + +### Serialization & Migrating Existing Grants + +GTMAppAuth has a different way to serialize the authorization. Change how you +serialize your `authorization` object using the new methods, e.g.: + +```objc +// Serialize to Keychain +[GTMAppAuthFetcherAuthorization saveAuthorization:(GTMAppAuthFetcherAuthorization *)authorization + toKeychainForName:kNewKeychainName]; +``` + +Be sure to use a *new* name for the keychain. Don't reuse your existing one! + +For deserializing, we can preserve all existing grants (so users who authorized +your app in GTMOAuth2 don't have to authorize it again). Remember that when +deserializing the old data you need to use your *old* keychain name, and +the old client id and client secret (if those changed). Pay particular care to +use the old details when deserializing the GTMOAuth2 keychain, and the new +details for all other GTMAppAuth calls. + +Keychain migration example: + +```objc +// Attempt to deserialize from Keychain in GTMAppAuth format. +id authorization = + [GTMAppAuthFetcherAuthorization authorizationFromKeychainForName:kNewKeychainName]; + +// If no data found in the new format, try to deserialize data from GTMOAuth2 +if (!authorization) { + // Tries to load the data serialized by GTMOAuth2 using old keychain name. + // If you created a new client id, be sure to use the *previous* client id and secret here. + authorization = + [GTMOAuth2KeychainCompatibility authForGoogleFromKeychainForName:kPreviousKeychainName + clientID:kPreviousClientID + clientSecret:kPreviousClientSecret]; + if (authorization) { + // Remove previously stored GTMOAuth2-formatted data. + [GTMOAuth2KeychainCompatibility removeAuthFromKeychainForName:kPreviousKeychainName]; + // Serialize to Keychain in GTMAppAuth format. + [GTMAppAuthFetcherAuthorization saveAuthorization:(GTMAppAuthFetcherAuthorization *)authorization + toKeychainForName:kNewKeychainName]; + } +} +``` diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuth.h b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuth.h new file mode 100644 index 000000000..644349ebb --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuth.h @@ -0,0 +1,30 @@ +/*! @file GTMAppAuth.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "GTMAppAuthFetcherAuthorization.h" +#import "GTMAppAuthFetcherAuthorization+Keychain.h" + +#if TARGET_OS_TV +#elif TARGET_OS_WATCH +#elif TARGET_OS_IOS +#import "GTMOAuth2KeychainCompatibility.h" +#elif TARGET_OS_MAC +#import "GTMOAuth2KeychainCompatibility.h" +#else +#warn "Platform Undefined" +#endif diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h new file mode 100644 index 000000000..69956322e --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.h @@ -0,0 +1,52 @@ +/*! @file GTMAppAuthFetcherAuthorization+Keychain.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "GTMAppAuthFetcherAuthorization.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Category to support serialization and deserialization of + @c GTMAppAuthFetcherAuthorization in the format used by GTMAppAuth. + */ +@interface GTMAppAuthFetcherAuthorization (Keychain) + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from data stored in the keychain + in GTMAppAuth format. + @param keychainItemName The keychain name. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authorizationFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Removes a stored authorization state. + @param keychainItemName The keychain name. + @return YES the tokens were removed successfully (or didn't exist). + */ ++ (BOOL)removeAuthorizationFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Saves the authorization state to the keychain, in GTMAppAuth format. + @param auth The authorization to save. + @param keychainItemName The keychain name. + @return YES when the state was saved successfully. + */ ++ (BOOL)saveAuthorization:(GTMAppAuthFetcherAuthorization *)auth + toKeychainForName:(NSString *)keychainItemName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m new file mode 100644 index 000000000..9fd76ef55 --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization+Keychain.m @@ -0,0 +1,46 @@ +/*! @file GTMAppAuthFetcherAuthorization+Keychain.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "GTMAppAuthFetcherAuthorization+Keychain.h" + +#import "GTMKeychain.h" + +@implementation GTMAppAuthFetcherAuthorization (Keychain) + ++ (GTMAppAuthFetcherAuthorization *)authorizationFromKeychainForName:(NSString *)keychainItemName { + NSData *passwordData = [GTMKeychain passwordDataFromKeychainForName:keychainItemName]; + if (!passwordData) { + return nil; + } + GTMAppAuthFetcherAuthorization *authorization = (GTMAppAuthFetcherAuthorization *) + [NSKeyedUnarchiver unarchiveObjectWithData:passwordData]; + return authorization; +} + ++ (BOOL)removeAuthorizationFromKeychainForName:(NSString *)keychainItemName { + return [GTMKeychain removePasswordFromKeychainForName:keychainItemName]; +} + ++ (BOOL)saveAuthorization:(GTMAppAuthFetcherAuthorization *)auth + toKeychainForName:(NSString *)keychainItemName { + NSData *authorizationData = [NSKeyedArchiver archivedDataWithRootObject:auth]; + return [GTMKeychain savePasswordDataToKeychainForName:keychainItemName + passwordData:authorizationData]; +} + +@end diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h new file mode 100644 index 000000000..2dc443953 --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.h @@ -0,0 +1,133 @@ +/*! @file GTMAppAuthFetcherAuthorization.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + */ + +#ifndef GTMAPPAUTH_USER_IMPORTS +#import +#else // GTMAPPAUTH_USER_IMPORTS +#import "GTMSessionFetcher.h" +#endif // GTMAPPAUTH_USER_IMPORTS + +@class OIDAuthState; +@class OIDServiceConfiguration; + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief The userInfo key for the @c NSURLRequest. + */ +extern NSString *const GTMAppAuthFetcherAuthorizationErrorRequestKey; + +/*! @brief The error domain for errors specific to the session fetcher authorization. + */ +extern NSString *const GTMAppAuthFetcherAuthorizationErrorDomain; + +/*! @brief Enum of all possible error codes in the @c ::GTMAppAuthFetcherAuthorizationErrorDomain + domain. + @discussion Note that these are GTMAppAuth-specific errors. When AppAuth errors are encountered, + those are returned instead. + */ +typedef NS_ENUM(NSInteger, GTMAppAuthFetcherAuthorizationError) { + GTMAppAuthFetcherAuthorizationErrorUnauthorizableRequest = -1004 +}; + +typedef void (^GTMAppAuthFetcherAuthorizationCompletion)(NSError *_Nullable error); + +/*! @brief An implementation of the @c GTMFetcherAuthorizationProtocol protocol for the AppAuth + library. + @discussion Enables you to use AppAuth with the GTM Session Fetcher library. + */ +@interface GTMAppAuthFetcherAuthorization : NSObject + +/*! @brief The AppAuth authentication state. + */ +@property(nonatomic, readonly) OIDAuthState *authState; + +/*! @brief Service identifier, for example "Google"; not used for authentication. + @discussion The provider name is just for allowing stored authorization to be associated + with the authorizing service. + */ +@property(nullable, nonatomic, readonly) NSString *serviceProvider; + +/*! @brief User ID from the ID Token. + * @discussion Note: Never send this value to your backend as an authentication token, rather send + * an ID Token and validate it. + */ +@property(nullable, nonatomic, readonly) NSString *userID; + +/*! @brief Email verified status; not used for authentication. + @discussion The verified string can be checked with -boolValue. If the result is false, then + the email address is listed with the account on the server, but the address has not been + confirmed as belonging to the owner of the account. + */ +@property(nullable, nonatomic, readonly) NSString *userEmailIsVerified; + +/*! @brief Creates a new @c GTMAppAuthFetcherAuthorization using the given @c OIDAuthState from + AppAuth. + @param authState The authorization state. + */ +- (instancetype)initWithAuthState:(OIDAuthState *)authState; + +/*! @brief Creates a new @c GTMAppAuthFetcherAuthorization using the given @c OIDAuthState from + AppAuth. + @param authState The authorization state. + @param serviceProvider An optional string to describe the service. + @param userID An optional string of the user ID. + @param userEmail An optional string of the user's email address. + @param userEmailIsVerified An optional string representation of a boolean to indicate that the + email address has been verified. Pass @"true" for @c YES, or @"false" for @c NO. + @discussion Designated initializer. + */ +- (instancetype)initWithAuthState:(OIDAuthState *)authState + serviceProvider:(nullable NSString *)serviceProvider + userID:(nullable NSString *)userID + userEmail:(nullable NSString *)userEmail + userEmailIsVerified:(nullable NSString *)userEmailIsVerified + NS_DESIGNATED_INITIALIZER; + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT +/*! @brief Convenience method to return an @c OIDServiceConfiguration for Google. + @return A @c OIDServiceConfiguration object setup with Google OAuth endpoints. + */ ++ (OIDServiceConfiguration *)configurationForGoogle; +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +/*! @brief Adds an authorization header to the given request, using the authorization state. + Refreshes the access token if needed. + @param request The request to authorize. + @param handler The block that is called after authorizing the request is attempted. If @c error + is non-nil, the authorization failed. Errors in the domain @c ::OIDOAuthTokenErrorDomain + indicate that the authorization itself is invalid, and will need to be re-obtained from the + user. Errors in the @c GTMAppAuthFetcherAuthorizationErrorDomain indicate another + unrecoverable errors. Errors in other domains may indicate a transitive error condition such + as a network error, and typically you do not need to reauthenticate the user on such errors. + @discussion The completion handler is scheduled on the main thread, unless the @c callbackQueue + property is set on the @c fetcherService in which case the handler is scheduled on that + queue. + */ +- (void)authorizeRequest:(nullable NSMutableURLRequest *)request + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)handler; + +/*! @brief Returns YES if the authorization state is currently valid. + @discussion Note that this doesn't guarantee that a request will get a valid authorization, as + the authorization state could become invalid on on the next token refresh. + */ +- (BOOL)canAuthorize; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m new file mode 100644 index 000000000..eff5dc95a --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMAppAuthFetcherAuthorization.m @@ -0,0 +1,518 @@ +/*! @file GTMAppAuthFetcherAuthorization.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "GTMAppAuthFetcherAuthorization.h" + +#import "AppAuth.h" + +#define GTMOAuth2AssertValidSelector GTMBridgeAssertValidSelector + +/*! @brief Provides a template implementation for init-family methods which have been marked as + NS_UNAVILABLE. Stops the compiler from giving a warning when it's the super class' + designated initializer, and gives callers useful feedback telling them what the + new designated initializer is. + @remarks Takes a SEL as a parameter instead of a string so that we get compiler warnings if the + designated initializer's signature changes. + @param designatedInitializer A SEL referencing the designated initializer. + */ +#define GTM_UNAVAILABLE_USE_INITIALIZER(designatedInitializer) { \ + NSString *reason = [NSString stringWithFormat:@"Called: %@\nDesignated Initializer:%@", \ + NSStringFromSelector(_cmd), \ + NSStringFromSelector(designatedInitializer)]; \ + @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." \ + reason:reason \ + userInfo:nil]; \ +} + +/*! @brief Key used to encode the @c authState property for @c NSSecureCoding. + */ +static NSString *const kAuthStateKey = @"authState"; + +/*! @brief Key used to encode the @c serviceProvider property for @c NSSecureCoding. + */ +static NSString *const kServiceProviderKey = @"serviceProvider"; + +/*! @brief Key used to encode the @c userID property for @c NSSecureCoding. + */ +static NSString *const kUserIDKey = @"userID"; + +/*! @brief Key used to encode the @c userEmail property for @c NSSecureCoding. + */ +static NSString *const kUserEmailKey = @"userEmail"; + +/*! @brief Key used to encode the @c userEmailIsVerified property for @c NSSecureCoding. + */ +static NSString *const kUserEmailIsVerifiedKey = @"userEmailIsVerified"; + +NSString *const GTMAppAuthFetcherAuthorizationErrorDomain = + @"kGTMAppAuthFetcherAuthorizationErrorDomain"; +NSString *const GTMAppAuthFetcherAuthorizationErrorRequestKey = @"request"; + +/*! @brief Internal wrapper class for requests needing authorization and their callbacks. + @discusssion Used to abstract away the detail of whether a callback or block is used. + */ +@interface GTMAppAuthFetcherAuthorizationArgs : NSObject + +/*! @brief The request to authorize. + * @discussion Not copied, as we are mutating the request. + */ +@property (nonatomic, strong) NSMutableURLRequest *request; + +/*! @brief The delegate on which @c selector is called on completion. + */ +@property (nonatomic, weak) id delegate; + +/*! @brief The selector called on the @c delegate object on completion. + */ +@property (nonatomic) SEL selector; + +/*! @brief The completion block when the block option was used. + */ +@property (nonatomic, strong) GTMAppAuthFetcherAuthorizationCompletion completionHandler; + +/*! @brief The error that happened during token refresh (if any). + */ +@property (nonatomic, strong) NSError *error; + ++ (GTMAppAuthFetcherAuthorizationArgs *)argsWithRequest:(NSMutableURLRequest *)req + delegate:(id)delegate + selector:(SEL)selector + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)completionHandler; + +@end + +@implementation GTMAppAuthFetcherAuthorizationArgs + +@synthesize request = _request; +@synthesize delegate = _delegate; +@synthesize selector = _selector; +@synthesize completionHandler = _completionHandler; +@synthesize error = _error; + ++ (GTMAppAuthFetcherAuthorizationArgs *)argsWithRequest:(NSMutableURLRequest *)req + delegate:(id)delegate + selector:(SEL)selector + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)completionHandler { + GTMAppAuthFetcherAuthorizationArgs *obj; + obj = [[GTMAppAuthFetcherAuthorizationArgs alloc] init]; + obj.request = req; + obj.delegate = delegate; + obj.selector = selector; + obj.completionHandler = completionHandler; + return obj; +} + +@end + +@implementation GTMAppAuthFetcherAuthorization { + /*! @brief Array of requests pending authorization headers. + */ + NSMutableArray *_authorizationQueue; +} + +@synthesize authState = _authState; +@synthesize serviceProvider = _serviceProvider; +@synthesize userID = _userID; +@synthesize userEmailIsVerified = _userEmailIsVerified; + +// GTMFetcherAuthorizationProtocol doesn't specify atomic/nonatomic for these properties. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wimplicit-atomic-properties" +@synthesize userEmail = _userEmail; +@synthesize shouldAuthorizeAllRequests = _shouldAuthorizeAllRequests; +@synthesize fetcherService = _fetcherService; +#pragma clang diagnostic pop + +#pragma mark - Initializers + +// Ignore warning about not calling the designated initializer. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-designated-initializers" +- (instancetype)init + GTM_UNAVAILABLE_USE_INITIALIZER(@selector(initWithAuthState:)); +#pragma clang diagnostic pop + +- (instancetype)initWithAuthState:(OIDAuthState *)authState { + return [self initWithAuthState:authState + serviceProvider:nil + userID:nil + userEmail:nil + userEmailIsVerified:nil]; +} + +- (instancetype)initWithAuthState:(OIDAuthState *)authState + serviceProvider:(nullable NSString *)serviceProvider + userID:(nullable NSString *)userID + userEmail:(nullable NSString *)userEmail + userEmailIsVerified:(nullable NSString *)userEmailIsVerified { + self = [super init]; + if (self) { + _authState = authState; + _authorizationQueue = [[NSMutableArray alloc] init]; + + _serviceProvider = [serviceProvider copy]; + _userID = [userID copy]; + _userEmail = [userEmail copy]; + _userEmailIsVerified = [userEmailIsVerified copy]; + + // Decodes the ID Token locally to extract the email address. + NSString *idToken = _authState.lastTokenResponse.idToken + ? : _authState.lastAuthorizationResponse.idToken; + if (idToken) { + NSDictionary *claimsDictionary = [[self class] extractIDTokenClaimsNoVerification:idToken]; + if (claimsDictionary) { + _userEmail = (NSString *)[claimsDictionary[@"email"] copy]; + _userEmailIsVerified = [(NSNumber *)claimsDictionary[@"email_verified"] stringValue]; + _userID = [claimsDictionary[@"sub"] copy]; + } + } + } + return self; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + OIDAuthState *authState = + [aDecoder decodeObjectOfClass:[OIDAuthState class] forKey:kAuthStateKey]; + NSString *serviceProvider = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kServiceProviderKey]; + NSString *userID = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserIDKey]; + NSString *userEmail = [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserEmailKey]; + NSString *userEmailIsVerified = + [aDecoder decodeObjectOfClass:[NSString class] forKey:kUserEmailIsVerifiedKey]; + + self = [self initWithAuthState:authState + serviceProvider:serviceProvider + userID:userID + userEmail:userEmail + userEmailIsVerified:userEmailIsVerified]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_authState forKey:kAuthStateKey]; + [aCoder encodeObject:_serviceProvider forKey:kServiceProviderKey]; + [aCoder encodeObject:_userID forKey:kUserIDKey]; + [aCoder encodeObject:_userEmail forKey:kUserEmailKey]; + [aCoder encodeObject:_userEmailIsVerified forKey:kUserEmailIsVerifiedKey]; +} + +# pragma mark - Convenience + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT ++ (OIDServiceConfiguration *)configurationForGoogle { + NSURL *authorizationEndpoint = + [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/v2/auth"]; + NSURL *tokenEndpoint = + [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v4/token"]; + + OIDServiceConfiguration *configuration = + [[OIDServiceConfiguration alloc] initWithAuthorizationEndpoint:authorizationEndpoint + tokenEndpoint:tokenEndpoint]; + return configuration; +} +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +# pragma mark - ID Token extraction + ++ (nullable NSDictionary *)extractIDTokenClaimsNoVerification:(NSString *)idToken { + NSArray *sections = [idToken componentsSeparatedByString:@"."]; + if (sections.count > 1) { + // Gets the JWT payload section. + NSMutableString *body = [sections[1] mutableCopy]; + + // Converts base64url to base64. + NSRange range = NSMakeRange(0, body.length); + [body replaceOccurrencesOfString:@"-" withString:@"+" options:NSLiteralSearch range:range]; + [body replaceOccurrencesOfString:@"_" withString:@"/" options:NSLiteralSearch range:range]; + + // Converts base64 no padding to base64 with padding + while (body.length % 4 != 0) { + [body appendString:@"="]; + } + + // Decodes base64 string. + NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:body options:0]; + + // Parses JSON. + NSError *error; + id object = [NSJSONSerialization JSONObjectWithData:decodedData options:0 error:&error]; + if (error) { + NSLog(@"Error %@ parsing token payload %@", error, body); + } + if ([object isKindOfClass:[NSDictionary class]]) { + return (NSDictionary *)object; + } + } + return nil; +} + +#pragma mark - GTMFetcherAuthorizationProtocol + +#pragma mark Authorizing Requests + +/*! @brief Authorizing with a completion block. + */ +- (void)authorizeRequest:(NSMutableURLRequest *)request + completionHandler:(GTMAppAuthFetcherAuthorizationCompletion)handler { + GTMAppAuthFetcherAuthorizationArgs *args = + [GTMAppAuthFetcherAuthorizationArgs argsWithRequest:request + delegate:nil + selector:NULL + completionHandler:handler]; + [self authorizeRequestArgs:args]; +} + +/*! @brief Authorizing with a callback selector. + @discussion Selector has the signature: + - (void)authentication:(GTMAppAuthFetcherAuthorization *)auth + request:(NSMutableURLRequest *)request + finishedWithError:(NSError *)error; + */ +- (void)authorizeRequest:(NSMutableURLRequest *)request + delegate:(id)delegate + didFinishSelector:(SEL)sel { + GTMOAuth2AssertValidSelector(delegate, sel, + @encode(GTMAppAuthFetcherAuthorization *), + @encode(NSMutableURLRequest *), + @encode(NSError *), 0); + + GTMAppAuthFetcherAuthorizationArgs *args; + args = [GTMAppAuthFetcherAuthorizationArgs argsWithRequest:request + delegate:delegate + selector:sel + completionHandler:nil]; + [self authorizeRequestArgs:args]; +} + +/*! @brief Internal routine common to delegate and block invocations to queue requests while + fresh tokens are obtained. + */ +- (void)authorizeRequestArgs:(GTMAppAuthFetcherAuthorizationArgs *)args { + // Adds requests to queue. + @synchronized(_authorizationQueue) { + [_authorizationQueue addObject:args]; + } + + // Obtains fresh tokens from AppAuth. + [_authState performActionWithFreshTokens:^(NSString *_Nullable accessToken, + NSString *_Nullable idToken, + NSError *_Nullable error) { + // Processes queue. + @synchronized(_authorizationQueue) { + for (GTMAppAuthFetcherAuthorizationArgs *fetcherArgs in _authorizationQueue) { + [self authorizeRequestImmediateArgs:fetcherArgs accessToken:accessToken error:error]; + } + [_authorizationQueue removeAllObjects]; + } + }]; +} + +/*! @brief Adds authorization headers to the given request, using the supplied access token, or + handles the error. + @param args The request argument group to authorize. + @param accessToken A currently valid access token. + @param error If accessToken is nil, the error which caused the token to be unavailable. + @return YES if the request was authorized with a valid access token. + */ +- (BOOL)authorizeRequestImmediateArgs:(GTMAppAuthFetcherAuthorizationArgs *)args + accessToken:(NSString *)accessToken + error:(NSError *)error { + // This authorization entry point never attempts to refresh the access token, + // but does call the completion routine + + NSMutableURLRequest *request = args.request; + + NSURL *requestURL = [request URL]; + NSString *scheme = [requestURL scheme]; + BOOL isAuthorizableRequest = + !requestURL + || (scheme && [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame) + || [requestURL isFileURL] + || self.shouldAuthorizeAllRequests; + if (!isAuthorizableRequest) { + // Request is not https, a local file, or nil, so may be insecure + // + // The NSError will be created below +#if DEBUG + NSLog(@"Cannot authorize request with scheme %@ (%@)", scheme, request); +#endif + } + + // Get the access token. + if (isAuthorizableRequest && accessToken && accessToken.length > 0) { + if (request) { + // Adds the authorization header to the request. + NSString *value = [NSString stringWithFormat:@"%@ %@", @"Bearer", accessToken]; + [request setValue:value forHTTPHeaderField:@"Authorization"]; + } + + // We've authorized the request, even if the previous refresh + // failed with an error + args.error = nil; + } else { + NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; + if (!userInfo) { + userInfo = [[NSMutableDictionary alloc] init]; + } + if (request) { + userInfo[GTMAppAuthFetcherAuthorizationErrorRequestKey] = request; + } + + if (!isAuthorizableRequest || !error) { + args.error = [NSError errorWithDomain:GTMAppAuthFetcherAuthorizationErrorDomain + code:GTMAppAuthFetcherAuthorizationErrorUnauthorizableRequest + userInfo:userInfo]; + } else { + // Passes through error domain & code from AppAuth, with additional userInfo args. + args.error = [NSError errorWithDomain:error.domain + code:error.code + userInfo:userInfo]; + } + } + + // Invoke any callbacks on the proper thread + if (args.delegate || args.completionHandler) { + // If the fetcher service provides a callback queue, we'll use that + // (or if it's nil, we'll use the main thread) for callbacks. + dispatch_queue_t callbackQueue = self.fetcherService.callbackQueue; + if (!callbackQueue) { + callbackQueue = dispatch_get_main_queue(); + } + dispatch_async(callbackQueue, ^{ + [self invokeCallbackArgs:args]; + }); + } + + BOOL didAuth = (args.error == nil); + return didAuth; +} + +/*! @brief Invokes the callback for the given authorization argument group. + @param args The request argument group to invoke following authorization or error. + */ +- (void)invokeCallbackArgs:(GTMAppAuthFetcherAuthorizationArgs *)args { + NSError *error = args.error; + id delegate = args.delegate; + SEL sel = args.selector; + + // If the selector callback method exists, invokes the selector. + if (delegate && sel) { + NSMutableURLRequest *request = args.request; + + NSMethodSignature *sig = [delegate methodSignatureForSelector:sel]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setSelector:sel]; + [invocation setTarget:delegate]; + GTMAppAuthFetcherAuthorization *authorization = self; + [invocation setArgument:&authorization atIndex:2]; + [invocation setArgument:&request atIndex:3]; + [invocation setArgument:&error atIndex:4]; + [invocation invoke]; + } + + // If a callback block exists, executes the block. + id handler = args.completionHandler; + if (handler) { + void (^authCompletionBlock)(NSError *) = handler; + authCompletionBlock(error); + } +} + +/*! @brief Removes all pending requests from the authorization queue. + */ +- (void)stopAuthorization { + @synchronized(_authorizationQueue) { + [_authorizationQueue removeAllObjects]; + } +} + +/*! @brief Attempts to remove a specific pending requests from the authorization queue. + @discussion Has no effect if the authorization already occurred. + */ +- (void)stopAuthorizationForRequest:(NSURLRequest *)request { + @synchronized(_authorizationQueue) { + NSUInteger argIndex = 0; + BOOL found = NO; + for (GTMAppAuthFetcherAuthorizationArgs *args in _authorizationQueue) { + // Checks pointer equality with given request, don't want to match equivalent requests. + if ([args request] == request) { + found = YES; + break; + } + argIndex++; + } + + if (found) { + [_authorizationQueue removeObjectAtIndex:argIndex]; + + // If the queue is now empty, go ahead and stop the fetcher. + if (_authorizationQueue.count == 0) { + [self stopAuthorization]; + } + } + } +} + +/*! @brief Returns YES if the given requests is in the pending authorization queue. + */ +- (BOOL)isAuthorizingRequest:(NSURLRequest *)request { + BOOL wasFound = NO; + @synchronized(_authorizationQueue) { + for (GTMAppAuthFetcherAuthorizationArgs *args in _authorizationQueue) { + // Checks pointer equality with given request, don't want to match equivalent requests. + if ([args request] == request) { + wasFound = YES; + break; + } + } + } + return wasFound; +} + +/*! @brief Returns YES if given request has an Authorization header. + */ +- (BOOL)isAuthorizedRequest:(NSURLRequest *)request { + NSString *authStr = [request valueForHTTPHeaderField:@"Authorization"]; + return (authStr.length > 0); +} + +/*! @brief Returns YES if the authorization state is currently valid. + @discussion Note that the state can become invalid immediately due to an error on token refresh. + */ +- (BOOL)canAuthorize { + return [_authState isAuthorized]; +} + +/*! @brief Forces a token refresh the next time a request is queued for authorization. + */ +- (BOOL)primeForRefresh { + if (_authState.refreshToken == nil) { + // Cannot refresh without a refresh token + return NO; + } + [_authState setNeedsTokenRefresh]; + return YES; +} + +@end diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMKeychain.h b/Paco-iOS/Pods/GTMAppAuth/Source/GTMKeychain.h new file mode 100644 index 000000000..760131908 --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMKeychain.h @@ -0,0 +1,62 @@ +/*! @file GTMKeychain.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Utility for saving and loading data to the keychain. + */ +@interface GTMKeychain : NSObject + +/*! @brief Saves the password string to the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @param password Password string to save. + @return YES when the password string was saved successfully. + */ ++ (BOOL)savePasswordToKeychainForName:(NSString *)keychainItemName password:(NSString *)password; + +/*! @brief Loads the password string from the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @return The password string at the given identifier, or nil. + */ ++ (nullable NSString *)passwordFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Saves the password data to the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @param passwordData Password data to save. + @return YES when the password data was saved successfully. + */ ++ (BOOL)savePasswordDataToKeychainForName:(NSString *)keychainItemName + passwordData:(NSData *)password; + +/*! @brief Loads the password data from the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @return The password data at the given identifier, or nil. + */ ++ (nullable NSData *)passwordDataFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Removes stored password string, such as when the user signs out. + @param keychainItemName Keychain name of the item. + @return YES if the password string was removed successfully (or didn't exist). + */ ++ (BOOL)removePasswordFromKeychainForName:(NSString *)keychainItemName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h b/Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h new file mode 100644 index 000000000..9fa123898 --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h @@ -0,0 +1,135 @@ +/*! @file GTMOAuth2Compatibility.h + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "GTMAppAuthFetcherAuthorization.h" + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief Class to support serialization and deserialization of @c GTMAppAuthFetcherAuthorization + in the format used by GTMOAuth2. + @discussion The methods of this class are capable of serializing and deserializing auth + objects in a way compatible with the serialization in @c GTMOAuth2ViewControllerTouch and + @c GTMOAuth2WindowController in GTMOAuth2. + */ +@interface GTMOAuth2KeychainCompatibility : NSObject + +/*! @brief Encodes the given @c GTMAppAuthFetcherAuthorization in a GTMOAuth2 compatible persistence + string using URL param key/value encoding. + @param authorization The @c GTMAppAuthFetcherAuthorization to serialize in GTMOAuth2 format. + @return The GTMOAuth2 persistence representation of this object. + */ ++ (NSString *)persistenceResponseStringForAuthorization: + (GTMAppAuthFetcherAuthorization *)authorization; + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from data stored in the keychain + in GTMOAuth2 format, at the supplied keychain identifier. + @param keychainItemName The keychain name. + @param serviceProvider An optional string to describe the service. + @param tokenURL The OAuth token endpoint URL. + @param redirectURI The OAuth redirect URI used when obtaining the original authorization. + @param clientID The OAuth client id. + @param clientSecret The OAuth client secret. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authorizeFromKeychainForName:(NSString *)keychainItemName + serviceProvider:(nullable NSString *)serviceProvider + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURI + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret; + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from a @c NSString + representation of the GTMOAuth2 keychain data. + @param persistenceString String representation of the GTMOAuth2 keychain data. + @param serviceProvider An optional string to describe the service. + @param tokenURL The OAuth token endpoint URL. + @param redirectURI The OAuth redirect URI used when obtaining the original authorization. + @param clientID The OAuth client id. + @param clientSecret The OAuth client secret. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authorizeFromPersistenceString:(NSString *)persistenceString + serviceProvider:(nullable NSString *)serviceProvider + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURI + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret; + +/*! @brief Removes stored tokens, such as when the user signs out. + @param keychainItemName The keychain name. + @return YES the tokens were removed successfully (or didn't exist). + */ ++ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName; + +/*! @brief Saves the authorization state to the keychain, in a GTMOAuth2 compatible manner. + @param keychainItemName The keychain name. + @return YES when the state was saved successfully. + */ ++ (BOOL)saveAuthToKeychainForName:(NSString *)keychainItemName + authentication:(GTMAppAuthFetcherAuthorization *)auth + __attribute__((deprecated( + "Use GTMAppAuthFetcherAuthorization::saveAuthorization:toKeychainForName:"))); + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +/*! @brief Attempts to create a @c GTMAppAuthFetcherAuthorization from data stored in the keychain + in GTMOAuth2 format, at the supplied keychain identifier. Uses Google OAuth provider + information. + @param keychainItemName The keychain name. + @param clientID The OAuth client id. + @param clientSecret The OAuth client secret. + @return A @c GTMAppAuthFetcherAuthorization object, or nil. + */ ++ (nullable GTMAppAuthFetcherAuthorization *) + authForGoogleFromKeychainForName:(NSString *)keychainItemName + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret; + +/*! @brief Returns Google's OAuth 2.0 authorization endpoint. + @return Returns Google's OAuth 2.0 authorization endpoint. + */ ++ (NSURL *)googleAuthorizationURL; + +/*! @brief Returns Google's OAuth 2.0 token endpoint. + @return Returns Google's OAuth 2.0 token endpoint. + */ ++ (NSURL *)googleTokenURL; + +/*! @brief Returns Google's OAuth 2.0 revocation endpoint. + @return Returns Google's OAuth 2.0 revocation endpoint. + */ ++ (NSURL *)googleRevocationURL; + +/*! @brief Returns Google's OAuth 2.0 userinfo endpoint. + @return Returns Google's OAuth 2.0 userinfo endpoint. + */ ++ (NSURL *)googleUserInfoURL; + +/*! @brief Returns Google's native OOB redirect URI. + @discussion This is a legacy redirect URI that was used with WebViews. + @return Returns Google's native OOB redirect URI. + */ ++ (NSString *)nativeClientRedirectURI; + +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +@end + +NS_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m b/Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m new file mode 100644 index 000000000..514359978 --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m @@ -0,0 +1,321 @@ +/*! @file GTMOAuth2Compatibility.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "GTMOAuth2KeychainCompatibility.h" + +#import "AppAuth.h" +#import "GTMKeychain.h" + +// standard OAuth keys +static NSString *const kOAuth2AccessTokenKey = @"access_token"; +static NSString *const kOAuth2RefreshTokenKey = @"refresh_token"; +static NSString *const kOAuth2ScopeKey = @"scope"; +static NSString *const kOAuth2ErrorKey = @"error"; +static NSString *const kOAuth2TokenTypeKey = @"token_type"; +static NSString *const kOAuth2ExpiresInKey = @"expires_in"; +static NSString *const kOAuth2CodeKey = @"code"; +static NSString *const kOAuth2AssertionKey = @"assertion"; +static NSString *const kOAuth2RefreshScopeKey = @"refreshScope"; + +// additional persistent keys +static NSString *const kServiceProviderKey = @"serviceProvider"; +static NSString *const kUserIDKey = @"userID"; +static NSString *const kUserEmailKey = @"email"; +static NSString *const kUserEmailIsVerifiedKey = @"isVerified"; + +// URI indicating an installed app is signing in. This is described at +// +// https://developers.google.com/identity/protocols/OAuth2InstalledApp#formingtheurl +// +static NSString *const kOOBString = @"urn:ietf:wg:oauth:2.0:oob"; + +static NSString *const kGTMOAuth2ServiceProviderGoogle = @"Google"; + +@implementation GTMOAuth2KeychainCompatibility + +// This returns a "response string" that can be passed later to +// setKeysForResponseString: to reuse an old access token in a new auth object ++ (NSString *)persistenceResponseStringForAuthorization: + (GTMAppAuthFetcherAuthorization *)authorization { + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + + NSString *refreshToken = authorization.authState.refreshToken; + NSString *accessToken = authorization.authState.lastTokenResponse.accessToken; + + // Any nil values will not set a dictionary entry + [dict setValue:refreshToken forKey:kOAuth2RefreshTokenKey]; + [dict setValue:accessToken forKey:kOAuth2AccessTokenKey]; + [dict setValue:authorization.serviceProvider forKey:kServiceProviderKey]; + [dict setValue:authorization.userID forKey:kUserIDKey]; + [dict setValue:authorization.userEmail forKey:kUserEmailKey]; + [dict setValue:authorization.userEmailIsVerified forKey:kUserEmailIsVerifiedKey]; + [dict setValue:authorization.authState.scope forKey:kOAuth2ScopeKey]; + + NSString *result = [self encodedQueryParametersForDictionary:dict]; + return result; +} + ++ (GTMAppAuthFetcherAuthorization *)authorizeFromKeychainForName:(NSString *)keychainItemName + serviceProvider:(nullable NSString *)serviceProvider + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURI + clientID:(NSString *)clientID + clientSecret:(nullable NSString *)clientSecret { + // Loads password string from keychain. + NSString *password = [GTMKeychain passwordFromKeychainForName:keychainItemName]; + + if (!password) { + return nil; + } + + GTMAppAuthFetcherAuthorization *authorization = + [self authorizeFromPersistenceString:password + serviceProvider:serviceProvider + tokenURL:tokenURL + redirectURI:redirectURI + clientID:clientID + clientSecret:clientSecret]; + return authorization; +} + ++ (GTMAppAuthFetcherAuthorization *)authorizeFromPersistenceString:(NSString *)persistenceString + serviceProvider:(NSString *)serviceProvider + tokenURL:(NSURL *)tokenURL + redirectURI:(NSString *)redirectURIString + clientID:(NSString *)clientID + clientSecret:(NSString *)clientSecret { + // Parses persistence data into NSDictionary. + NSDictionary *dict = [self dictionaryWithResponseString:persistenceString]; + + NSURL *redirectURI = (NSURL *)[NSURL URLWithString:redirectURIString]; + + // OIDAuthState is based on the request/response history. + // Creates history based on the data from the keychain, and client details passed in. + OIDServiceConfiguration *authConfig = + [[OIDServiceConfiguration alloc] initWithAuthorizationEndpoint:tokenURL tokenEndpoint:tokenURL]; + OIDAuthorizationRequest *authRequest = + [[OIDAuthorizationRequest alloc] initWithConfiguration:authConfig + clientId:clientID + clientSecret:clientSecret + scope:dict[kOAuth2ScopeKey] + redirectURL:redirectURI + responseType:@"token" + state:nil + codeVerifier:nil + codeChallenge:nil + codeChallengeMethod:nil + additionalParameters:nil]; + OIDAuthorizationResponse *authResponse = + [[OIDAuthorizationResponse alloc] initWithRequest:authRequest parameters:dict]; + OIDTokenRequest *tokenRequest = + [[OIDTokenRequest alloc] initWithConfiguration:authConfig + grantType:@"token" + authorizationCode:nil + redirectURL:redirectURI + clientID:clientID + clientSecret:clientSecret + scope:dict[kOAuth2ScopeKey] + refreshToken:dict[kOAuth2RefreshTokenKey] + codeVerifier:nil + additionalParameters:dict]; + OIDTokenResponse *tokenResponse = + [[OIDTokenResponse alloc] initWithRequest:tokenRequest parameters:dict]; + OIDAuthState *authState = [[OIDAuthState alloc] initWithAuthorizationResponse:authResponse + tokenResponse:tokenResponse]; + // We're not serializing the token expiry date, so the first refresh needs to be forced. + [authState setNeedsTokenRefresh]; + + GTMAppAuthFetcherAuthorization *authorizer = + [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState + serviceProvider:dict[kServiceProviderKey] + userID:dict[kUserIDKey] + userEmail:dict[kUserEmailKey] + userEmailIsVerified:dict[kUserEmailIsVerifiedKey]]; + return authorizer; +} + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + ++ (GTMAppAuthFetcherAuthorization *)authForGoogleFromKeychainForName:(NSString *)keychainItemName + clientID:(NSString *)clientID + clientSecret:(NSString *)clientSecret { + Class signInClass = self; + NSURL *tokenURL = [signInClass googleTokenURL]; + NSString *redirectURI = [signInClass nativeClientRedirectURI]; + + GTMAppAuthFetcherAuthorization *auth; + auth = [self authorizeFromKeychainForName:keychainItemName + serviceProvider:kGTMOAuth2ServiceProviderGoogle + tokenURL:tokenURL + redirectURI:redirectURI + clientID:clientID + clientSecret:clientSecret]; + return auth; +} + +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +/*! @brief Removes stored tokens, such as when the user signs out. + @return YES the tokens were removed successfully (or didn't exist). + */ ++ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName { + return [GTMKeychain removePasswordFromKeychainForName:keychainItemName]; +} + +/*! @brief Saves the authorization state to the keychain, in a GTMOAuth2 compatible manner. + @return YES when the state was saved successfully. + */ ++ (BOOL)saveAuthToKeychainForName:(NSString *)keychainItemName + authentication:(GTMAppAuthFetcherAuthorization *)auth { + [self removeAuthFromKeychainForName:keychainItemName]; + NSString *password = [self persistenceResponseStringForAuthorization:auth]; + + return [GTMKeychain savePasswordToKeychainForName:keychainItemName password:password]; +} + +#pragma mark Utility Routines + ++ (NSString *)encodedQueryParametersForDictionary:(NSDictionary *)dict { + // Make a string like "cat=fluffy&dog=spot" + NSMutableString *result = [NSMutableString string]; + NSArray *sortedKeys = + [[dict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + NSString *joiner = @""; + for (NSString *key in sortedKeys) { + NSString *value = [dict objectForKey:key]; + NSString *encodedValue = [self encodedOAuthValueForString:value]; + NSString *encodedKey = [self encodedOAuthValueForString:key]; + [result appendFormat:@"%@%@=%@", joiner, encodedKey, encodedValue]; + joiner = @"&"; + } + return result; +} + ++ (NSString *)encodedOAuthValueForString:(NSString *)originalString { + // For parameters, we'll explicitly leave spaces unescaped now, and replace + // them with +'s + NSString *const kForceEscape = @"!*'();:@&=+$,/?%#[]"; + +#if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_9) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) + // Builds targeting iOS 7/OS X 10.9 and higher only. + NSMutableCharacterSet *cs = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + [cs removeCharactersInString:kForceEscape]; + + return [originalString stringByAddingPercentEncodingWithAllowedCharacters:cs]; +#else + // Builds targeting iOS 6/OS X 10.8. + CFStringRef escapedStr = NULL; + if (originalString) { + escapedStr = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, + (CFStringRef)originalString, + NULL, + (CFStringRef)kForceEscape, + kCFStringEncodingUTF8); + } + + return (__bridge NSString *)escapedStr; +#endif +} + ++ (NSDictionary *)dictionaryWithResponseString:(NSString *)responseStr { + // Build a dictionary from a response string of the form + // "cat=fluffy&dog=spot". Missing or empty values are considered + // empty strings; keys and values are percent-decoded. + if (responseStr == nil) return nil; + + NSArray *items = [responseStr componentsSeparatedByString:@"&"]; + + NSMutableDictionary *responseDict = [NSMutableDictionary dictionaryWithCapacity:items.count]; + + for (NSString *item in items) { + NSString *key; + NSString *value = @""; + + NSRange equalsRange = [item rangeOfString:@"="]; + if (equalsRange.location != NSNotFound) { + // The parameter has at least one '=' + key = [item substringToIndex:equalsRange.location]; + + // There are characters after the '=' + if (equalsRange.location + 1 < item.length) { + value = [item substringFromIndex:(equalsRange.location + 1)]; + } + } else { + // The parameter has no '=' + key = item; + } + + NSString *plainKey = [self unencodedOAuthParameterForString:key]; + NSString *plainValue = [self unencodedOAuthParameterForString:value]; + + [responseDict setObject:plainValue forKey:plainKey]; + } + + return responseDict; +} + ++ (NSString *)unencodedOAuthParameterForString:(NSString *)str { +#if (!TARGET_OS_IPHONE \ + && defined(MAC_OS_X_VERSION_10_9) \ + && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9) \ + || (TARGET_OS_IPHONE \ + && defined(__IPHONE_7_0) \ + && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) + // On iOS 7, -stringByRemovingPercentEncoding incorrectly returns nil for an empty string. + if (str != nil && [str length] == 0) return @""; + + NSString *plainStr = [str stringByRemovingPercentEncoding]; + return plainStr; +#else + NSString *plainStr = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + return plainStr; +#endif +} + +#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +// Endpoint URLs are available at https://accounts.google.com/.well-known/openid-configuration + ++ (NSURL *)googleAuthorizationURL { + NSString *str = @"https://accounts.google.com/o/oauth2/v2/auth"; + return (NSURL *)[NSURL URLWithString:str]; +} + ++ (NSURL *)googleTokenURL { + NSString *str = @"https://www.googleapis.com/oauth2/v4/token"; + return (NSURL *)[NSURL URLWithString:str]; +} + ++ (NSURL *)googleRevocationURL { + NSString *urlStr = @"https://accounts.google.com/o/oauth2/revoke"; + return (NSURL *)[NSURL URLWithString:urlStr]; +} + ++ (NSURL *)googleUserInfoURL { + NSString *urlStr = @"https://www.googleapis.com/oauth2/v3/userinfo"; + return (NSURL *)[NSURL URLWithString:urlStr]; +} + ++ (NSString *)nativeClientRedirectURI { + return kOOBString; +} + +#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT + +@end diff --git a/Paco-iOS/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m b/Paco-iOS/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m new file mode 100644 index 000000000..78025e22c --- /dev/null +++ b/Paco-iOS/Pods/GTMAppAuth/Source/iOS/GTMKeychain_iOS.m @@ -0,0 +1,287 @@ +/*! @file GTMKeychain_iOS.m + @brief GTMAppAuth SDK + @copyright + Copyright 2016 Google Inc. All Rights Reserved. + @copydetails + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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 "GTMKeychain.h" + +#import + +typedef NS_ENUM(NSInteger, GTMAppAuthFetcherAuthorizationGTMAppAuthGTMOAuth2KeychainError) { + GTMAppAuthGTMOAuth2KeychainErrorBadArguments = -1301, + GTMAppAuthGTMOAuth2KeychainErrorNoPassword = -1302 +}; + +/*! @brief Keychain helper class. + */ +@interface GTMAppAuthGTMOAuth2Keychain : NSObject + ++ (GTMAppAuthGTMOAuth2Keychain *)defaultKeychain; + +// OK to pass nil for the error parameter. +- (NSString *)passwordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error; + +- (NSData *)passwordDataForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error; + +// OK to pass nil for the error parameter. +- (BOOL)removePasswordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error; + +// OK to pass nil for the error parameter. +// +// accessibility should be one of the constants for kSecAttrAccessible +// such as kSecAttrAccessibleWhenUnlocked +- (BOOL)setPassword:(NSString *)password + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error; + +- (BOOL)setPasswordData:(NSData *)passwordData + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error; + +// For unit tests: allow setting a mock object ++ (void)setDefaultKeychain:(GTMAppAuthGTMOAuth2Keychain *)keychain; + +@end + +NSString *const kGTMAppAuthFetcherAuthorizationGTMOAuth2ErrorDomain = @"com.google.GTMOAuth2"; +NSString *const kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain = + @"com.google.GTMOAuthKeychain"; +static NSString *const kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName = @"OAuth"; +static GTMAppAuthGTMOAuth2Keychain* gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain = nil; + +@implementation GTMKeychain + ++ (BOOL)removePasswordFromKeychainForName:(NSString *)keychainItemName { + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + return [keychain removePasswordForService:keychainItemName + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:nil]; +} + ++ (NSString *)passwordFromKeychainForName:(NSString *)keychainItemName { + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + NSError *error; + NSString *password = + [keychain passwordForService:keychainItemName + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:&error]; + return password; +} + ++ (BOOL)savePasswordToKeychainForName:(NSString *)keychainItemName password:(NSString *)password { + return [self savePasswordToKeychainForName:keychainItemName + password:password + accessibility:NULL + error:NULL]; +} + ++ (BOOL)savePasswordToKeychainForName:(NSString *)keychainItemName password:(NSString *)password + accessibility:(CFTypeRef)accessibility + error:(NSError **)error { + if (accessibility == NULL) { + accessibility = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + } + // make a response string containing the values we want to save + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + return [keychain setPassword:password + forService:keychainItemName + accessibility:accessibility + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:error]; +} + +/*! @brief Saves the password string to the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @param password Password string to save. + @return YES when the password string was saved successfully. + */ ++ (BOOL)savePasswordDataToKeychainForName:(NSString *)keychainItemName + passwordData:(NSData *)password { + CFTypeRef accessibility = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; + // make a response string containing the values we want to save + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + return [keychain setPasswordData:password + forService:keychainItemName + accessibility:accessibility + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:NULL]; +} + +/*! @brief Loads the password string from the keychain with the given identifier. + @param keychainItemName Keychain name of the item. + @return The password string at the given identifier, or nil. + */ ++ (NSData *)passwordDataFromKeychainForName:(NSString *)keychainItemName { + GTMAppAuthGTMOAuth2Keychain *keychain = [GTMAppAuthGTMOAuth2Keychain defaultKeychain]; + NSError *error; + NSData *password = + [keychain passwordDataForService:keychainItemName + account:kGTMAppAuthFetcherAuthorizationGTMOAuth2AccountName + error:&error]; + return password; +} + +@end + +#pragma mark GTMAppAuthGTMOAuth2Keychain + +@implementation GTMAppAuthGTMOAuth2Keychain + ++ (GTMAppAuthGTMOAuth2Keychain *)defaultKeychain { + static dispatch_once_t onceToken; + dispatch_once (&onceToken, ^{ + gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain = [[self alloc] init]; + }); + return gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain; +} + + +// For unit tests: allow setting a mock object ++ (void)setDefaultKeychain:(GTMAppAuthGTMOAuth2Keychain *)keychain { + if (gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain != keychain) { + gGTMAppAuthFetcherAuthorizationGTMOAuth2DefaultKeychain = keychain; + } +} + +- (NSString *)keyForService:(NSString *)service account:(NSString *)account { + return [NSString stringWithFormat:@"com.google.GTMOAuth.%@%@", service, account]; +} + ++ (NSMutableDictionary *)keychainQueryForService:(NSString *)service account:(NSString *)account { + NSMutableDictionary *query = + [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword, (id)kSecClass, + @"OAuth", (id)kSecAttrGeneric, + account, (id)kSecAttrAccount, + service, (id)kSecAttrService, + nil]; + return query; +} + +- (NSMutableDictionary *)keychainQueryForService:(NSString *)service account:(NSString *)account { + return [[self class] keychainQueryForService:service account:account]; +} + +// iPhone +- (NSString *)passwordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error { + NSData *passwordData = [self passwordDataForService:service account:account error:error]; + if (!passwordData) { + return nil; + } + NSString *result = [[NSString alloc] initWithData:passwordData + encoding:NSUTF8StringEncoding]; + return result; +} + +// iPhone +- (NSData *)passwordDataForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error { + OSStatus status = GTMAppAuthGTMOAuth2KeychainErrorBadArguments; + NSData *result = nil; + if (service.length > 0 && account.length > 0) { + CFDataRef passwordData = NULL; + NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; + [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; + [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; + + status = SecItemCopyMatching((CFDictionaryRef)keychainQuery, + (CFTypeRef *)&passwordData); + if (status == noErr && 0 < [(__bridge NSData *)passwordData length]) { + result = [(__bridge NSData *)passwordData copy]; + } + if (passwordData != NULL) { + CFRelease(passwordData); + } + } + if (status != noErr && error != NULL) { + *error = [NSError errorWithDomain:kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain + code:status + userInfo:nil]; + } + return result; +} + +// iPhone +- (BOOL)removePasswordForService:(NSString *)service + account:(NSString *)account + error:(NSError **)error { + OSStatus status = GTMAppAuthGTMOAuth2KeychainErrorBadArguments; + if (0 < [service length] && 0 < [account length]) { + NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; + status = SecItemDelete((CFDictionaryRef)keychainQuery); + } + if (status != noErr && error != NULL) { + *error = [NSError errorWithDomain:kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain + code:status + userInfo:nil]; + } + return status == noErr; +} + +// iPhone +- (BOOL)setPassword:(NSString *)password + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error { + NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding]; + return [self setPasswordData:passwordData + forService:service + accessibility:accessibility + account:account + error:error]; +} + +- (BOOL)setPasswordData:(NSData *)passwordData + forService:(NSString *)service + accessibility:(CFTypeRef)accessibility + account:(NSString *)account + error:(NSError **)error { + OSStatus status = GTMAppAuthGTMOAuth2KeychainErrorBadArguments; + if (0 < [service length] && 0 < [account length]) { + [self removePasswordForService:service account:account error:nil]; + if (0 < [passwordData length]) { + NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; + [keychainQuery setObject:passwordData forKey:(id)kSecValueData]; + + if (accessibility != NULL) { + [keychainQuery setObject:(__bridge id)accessibility + forKey:(id)kSecAttrAccessible]; + } + status = SecItemAdd((CFDictionaryRef)keychainQuery, NULL); + } + } + if (status != noErr && error != NULL) { + *error = [NSError errorWithDomain:kGTMAppAuthFetcherAuthorizationGTMOAuth2KeychainErrorDomain + code:status + userInfo:nil]; + } + return status == noErr; +} + +@end diff --git a/Paco-iOS/Pods/GTMSessionFetcher/LICENSE b/Paco-iOS/Pods/GTMSessionFetcher/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. diff --git a/Paco-iOS/Pods/GTMSessionFetcher/README.md b/Paco-iOS/Pods/GTMSessionFetcher/README.md new file mode 100644 index 000000000..478efde95 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/README.md @@ -0,0 +1,23 @@ +# Google Toolbox for Mac - Session Fetcher # + +**Project site**
+**Discussion group** + +[![Build Status](https://travis-ci.org/google/gtm-session-fetcher.svg?branch=master)](https://travis-ci.org/google/gtm-session-fetcher) + +`GTMSessionFetcher` makes it easy for Cocoa applications to perform http +operations. The fetcher is implemented as a wrapper on `NSURLSession`, so its +behavior is asynchronous and uses operating-system settings on iOS and Mac OS X. + +Features include: +- Simple to build; only one source/header file pair is required +- Simple to use: takes just two lines of code to fetch a request +- Supports upload and download sessions +- Flexible cookie storage +- Automatic retry on errors, with exponential backoff +- Support for generating multipart MIME upload streams +- Easy, convenient logging of http requests and responses +- Supports plug-in authentication such as with GTMAppAuth +- Easily testable; self-mocking +- Automatic rate limiting when created by the `GTMSessionFetcherService` factory class +- Fully independent of other projects diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h new file mode 100644 index 000000000..ec3c0125d --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.h @@ -0,0 +1,52 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +// The GTMGatherInput stream is an input stream implementation that is to be +// instantiated with an NSArray of NSData objects. It works in the traditional +// scatter/gather vector I/O model. Rather than allocating a big NSData object +// to hold all of the data and performing a copy into that object, the +// GTMGatherInputStream will maintain a reference to the NSArray and read from +// each NSData in turn as the read method is called. You should not alter the +// underlying set of NSData objects until all read operations on this input +// stream have completed. + +#import + +#ifndef GTM_NONNULL + #if defined(__has_attribute) + #if __has_attribute(nonnull) + #define GTM_NONNULL(x) __attribute__((nonnull x)) + #else + #define GTM_NONNULL(x) + #endif + #else + #define GTM_NONNULL(x) + #endif +#endif + +// Avoid multiple declaration of this class. +// +// Note: This should match the declaration of GTMGatherInputStream in GTMMIMEDocument.m + +#ifndef GTM_GATHERINPUTSTREAM_DECLARED +#define GTM_GATHERINPUTSTREAM_DECLARED + +@interface GTMGatherInputStream : NSInputStream + ++ (NSInputStream *)streamWithArray:(NSArray *)dataArray GTM_NONNULL((1)); + +@end + +#endif // GTM_GATHERINPUTSTREAM_DECLARED diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m new file mode 100644 index 000000000..0f65310ff --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMGatherInputStream.m @@ -0,0 +1,185 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMGatherInputStream.h" + +@implementation GTMGatherInputStream { + NSArray *_dataArray; // NSDatas that should be "gathered" and streamed. + NSUInteger _arrayIndex; // Index in the array of the current NSData. + long long _dataOffset; // Offset in the current NSData we are processing. + NSStreamStatus _streamStatus; + id __weak _delegate; // Stream delegate, defaults to self. +} + ++ (NSInputStream *)streamWithArray:(NSArray *)dataArray { + return [(GTMGatherInputStream *)[self alloc] initWithArray:dataArray]; +} + +- (instancetype)initWithArray:(NSArray *)dataArray { + self = [super init]; + if (self) { + _dataArray = dataArray; + _delegate = self; // An NSStream's default delegate should be self. + } + return self; +} + +#pragma mark - NSStream + +- (void)open { + _arrayIndex = 0; + _dataOffset = 0; + _streamStatus = NSStreamStatusOpen; +} + +- (void)close { + _streamStatus = NSStreamStatusClosed; +} + +- (id)delegate { + return _delegate; +} + +- (void)setDelegate:(id)delegate { + if (delegate == nil) { + _delegate = self; + } else { + _delegate = delegate; + } +} + +- (id)propertyForKey:(NSString *)key { + if ([key isEqual:NSStreamFileCurrentOffsetKey]) { + return @([self absoluteOffset]); + } + return nil; +} + +- (BOOL)setProperty:(id)property forKey:(NSString *)key { + if ([key isEqual:NSStreamFileCurrentOffsetKey]) { + NSNumber *absoluteOffsetNumber = property; + [self setAbsoluteOffset:absoluteOffsetNumber.longLongValue]; + return YES; + } + return NO; +} + +- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { +} + +- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { +} + +- (NSStreamStatus)streamStatus { + return _streamStatus; +} + +- (NSError *)streamError { + return nil; +} + +#pragma mark - NSInputStream + +- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len { + NSInteger bytesRead = 0; + NSUInteger bytesRemaining = len; + + // Read bytes from the currently-indexed array. + while ((bytesRemaining > 0) && (_arrayIndex < _dataArray.count)) { + NSData *data = [_dataArray objectAtIndex:_arrayIndex]; + + NSUInteger dataLen = data.length; + NSUInteger dataBytesLeft = dataLen - (NSUInteger)_dataOffset; + + NSUInteger bytesToCopy = MIN(bytesRemaining, dataBytesLeft); + NSRange range = NSMakeRange((NSUInteger) _dataOffset, bytesToCopy); + + [data getBytes:(buffer + bytesRead) range:range]; + + bytesRead += bytesToCopy; + _dataOffset += bytesToCopy; + bytesRemaining -= bytesToCopy; + + if (_dataOffset == (long long)dataLen) { + _dataOffset = 0; + _arrayIndex++; + } + } + if (_arrayIndex >= _dataArray.count) { + _streamStatus = NSStreamStatusAtEnd; + } + return bytesRead; +} + +- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len { + return NO; // We don't support this style of reading. +} + +- (BOOL)hasBytesAvailable { + // If we return no, the read never finishes, even if we've already delivered all the bytes. + return YES; +} + +#pragma mark - NSStreamDelegate + +- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { + id delegate = _delegate; + if (delegate != self) { + [delegate stream:self handleEvent:streamEvent]; + } +} + +#pragma mark - Private + +- (long long)absoluteOffset { + long long absoluteOffset = 0; + NSUInteger index = 0; + for (NSData *data in _dataArray) { + if (index >= _arrayIndex) { + break; + } + absoluteOffset += data.length; + ++index; + } + absoluteOffset += _dataOffset; + return absoluteOffset; +} + +- (void)setAbsoluteOffset:(long long)absoluteOffset { + if (absoluteOffset < 0) { + absoluteOffset = 0; + } + _arrayIndex = 0; + _dataOffset = absoluteOffset; + for (NSData *data in _dataArray) { + long long dataLen = (long long) data.length; + if (dataLen > _dataOffset) { + break; + } + _arrayIndex++; + _dataOffset -= dataLen; + } + if (_arrayIndex == _dataArray.count) { + if (_dataOffset > 0) { + _dataOffset = 0; + } + } +} + +@end diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h new file mode 100644 index 000000000..451e13239 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.h @@ -0,0 +1,148 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +// This is a simple class to create or parse a MIME document. + +// To create a MIME document, allocate a new GTMMIMEDocument and start adding parts. +// When you are done adding parts, call generateInputStream or generateDispatchData. +// +// A good reference for MIME is http://en.wikipedia.org/wiki/MIME + +#import + +#ifndef GTM_NONNULL + #if defined(__has_attribute) + #if __has_attribute(nonnull) + #define GTM_NONNULL(x) __attribute__((nonnull x)) + #else + #define GTM_NONNULL(x) + #endif + #else + #define GTM_NONNULL(x) + #endif +#endif + +#ifndef GTM_DECLARE_GENERICS + #if __has_feature(objc_generics) + #define GTM_DECLARE_GENERICS 1 + #else + #define GTM_DECLARE_GENERICS 0 + #endif +#endif + +#ifndef GTM_NSArrayOf + #if GTM_DECLARE_GENERICS + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #else + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #endif // GTM_DECLARE_GENERICS +#endif // GTM_NSArrayOf + + +// GTMMIMEDocumentPart represents a part of a MIME document. +// +// +[GTMMIMEDocument MIMEPartsWithBoundary:data:] returns an array of these. +@interface GTMMIMEDocumentPart : NSObject + +@property(nonatomic, readonly) GTM_NSDictionaryOf(NSString *, NSString *) *headers; +@property(nonatomic, readonly) NSData *headerData; +@property(nonatomic, readonly) NSData *body; +@property(nonatomic, readonly) NSUInteger length; + ++ (instancetype)partWithHeaders:(NSDictionary *)headers body:(NSData *)body; + +@end + +@interface GTMMIMEDocument : NSObject + +// Get or set the unique boundary for the parts that have been added. +// +// When creating a MIME document from parts, this is typically calculated +// automatically after all parts have been added. +@property(nonatomic, copy) NSString *boundary; + +#pragma mark - Methods for Creating a MIME Document + ++ (instancetype)MIMEDocument; + +// Adds a new part to this mime document with the given headers and body. +// The headers keys and values should be NSStrings. +// Adding a part may cause the boundary string to change. +- (void)addPartWithHeaders:(GTM_NSDictionaryOf(NSString *, NSString *) *)headers + body:(NSData *)body GTM_NONNULL((1,2)); + +// An inputstream that can be used to efficiently read the contents of the MIME document. +// +// Any parameter may be null if the result is not wanted. +- (void)generateInputStream:(NSInputStream **)outStream + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary; + +// A dispatch_data_t with the contents of the MIME document. +// +// Note: dispatch_data_t is one-way toll-free bridged so the result +// may be cast directly to NSData *. +// +// Any parameter may be null if the result is not wanted. +- (void)generateDispatchData:(dispatch_data_t *)outDispatchData + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary; + +// Utility method for making a header section, including trailing newlines. ++ (NSData *)dataWithHeaders:(GTM_NSDictionaryOf(NSString *, NSString *) *)headers; + +#pragma mark - Methods for Parsing a MIME Document + +// Method for parsing out an array of MIME parts from a MIME document. +// +// Returns an array of GTMMIMEDocumentParts. Returns nil if no part can +// be found. ++ (GTM_NSArrayOf(GTMMIMEDocumentPart *) *)MIMEPartsWithBoundary:(NSString *)boundary + data:(NSData *)fullDocumentData; + +// Utility method for efficiently searching possibly discontiguous NSData +// for occurrences of target byte. This method does not "flatten" an NSData +// that is composed of discontiguous blocks. +// +// The byte offsets of non-overlapping occurrences of the target are returned as +// NSNumbers in the array. ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets; + +// Utility method to parse header bytes into an NSDictionary. ++ (GTM_NSDictionaryOf(NSString *, NSString *) *)headersWithData:(NSData *)data; + +// ------ UNIT TESTING ONLY BELOW ------ + +// Internal methods, exposed for unit testing only. +- (void)seedRandomWith:(u_int32_t)seed; + ++ (NSUInteger)findBytesWithNeedle:(const unsigned char *)needle + needleLength:(NSUInteger)needleLength + haystack:(const unsigned char *)haystack + haystackLength:(NSUInteger)haystackLength + foundOffset:(NSUInteger *)foundOffset; + ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets + foundBlockNumbers:(GTM_NSArrayOf(NSNumber *) **)outFoundBlockNumbers; + +@end diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m new file mode 100644 index 000000000..7b21c30f9 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMMIMEDocument.m @@ -0,0 +1,629 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMMIMEDocument.h" + +// Avoid a hard dependency on GTMGatherInputStream. +#ifndef GTM_GATHERINPUTSTREAM_DECLARED +#define GTM_GATHERINPUTSTREAM_DECLARED + +@interface GTMGatherInputStream : NSInputStream + ++ (NSInputStream *)streamWithArray:(NSArray *)dataArray GTM_NONNULL((1)); + +@end +#endif // GTM_GATHERINPUTSTREAM_DECLARED + +// FindBytes +// +// Helper routine to search for the existence of a set of bytes (needle) within +// a presumed larger set of bytes (haystack). Can find the first part of the +// needle at the very end of the haystack. +// +// Returns the needle length on complete success, the number of bytes matched +// if a partial needle was found at the end of the haystack, and 0 on failure. +static NSUInteger FindBytes(const unsigned char *needle, NSUInteger needleLen, + const unsigned char *haystack, NSUInteger haystackLen, + NSUInteger *foundOffset); + +// SearchDataForBytes +// +// This implements the functionality of the +searchData: methods below. See the documentation +// for those methods. +static void SearchDataForBytes(NSData *data, const void *targetBytes, NSUInteger targetLength, + NSMutableArray *foundOffsets, NSMutableArray *foundBlockNumbers); + +@implementation GTMMIMEDocumentPart { + NSDictionary *_headers; + NSData *_headerData; // Header content including the ending "\r\n". + NSData *_bodyData; +} + +@synthesize headers = _headers, + headerData = _headerData, + body = _bodyData; + +@dynamic length; + ++ (instancetype)partWithHeaders:(NSDictionary *)headers body:(NSData *)body { + return [[self alloc] initWithHeaders:headers body:body]; +} + +- (instancetype)initWithHeaders:(NSDictionary *)headers body:(NSData *)body { + self = [super init]; + if (self) { + _bodyData = body; + _headers = headers; + } + return self; +} + +// Returns true if the part's header or data contain the given set of bytes. +// +// NOTE: We assume that the 'bytes' we are checking for do not contain "\r\n", +// so we don't need to check the concatenation of the header and body bytes. +- (BOOL)containsBytes:(const unsigned char *)bytes length:(NSUInteger)length { + // This uses custom search code rather than strcpy because the encoded data may contain + // null values. + NSData *headerData = self.headerData; + return (FindBytes(bytes, length, headerData.bytes, headerData.length, NULL) == length || + FindBytes(bytes, length, _bodyData.bytes, _bodyData.length, NULL) == length); +} + +- (NSData *)headerData { + if (!_headerData) { + _headerData = [GTMMIMEDocument dataWithHeaders:_headers]; + } + return _headerData; +} + +- (NSData *)body { + return _bodyData; +} + +- (NSUInteger)length { + return _headerData.length + _bodyData.length; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p (headers %tu keys, body %tu bytes)", + [self class], self, _headers.count, _bodyData.length]; +} + +- (BOOL)isEqual:(GTMMIMEDocumentPart *)other { + if (self == other) return YES; + if (![other isKindOfClass:[GTMMIMEDocumentPart class]]) return NO; + return ((_bodyData == other->_bodyData || [_bodyData isEqual:other->_bodyData]) + && (_headers == other->_headers || [_headers isEqual:other->_headers])); +} + +- (NSUInteger)hash { + return _bodyData.hash | _headers.hash; +} + +@end + +@implementation GTMMIMEDocument { + NSMutableArray *_parts; // Ordered array of GTMMIMEDocumentParts. + unsigned long long _length; // Length in bytes of the document. + NSString *_boundary; + u_int32_t _randomSeed; // For testing. +} + ++ (instancetype)MIMEDocument { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _parts = [[NSMutableArray alloc] init]; + } + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p (%tu parts)", + [self class], self, _parts.count]; +} + +#pragma mark - Joining Parts + +// Adds a new part to this mime document with the given headers and body. +- (void)addPartWithHeaders:(NSDictionary *)headers body:(NSData *)body { + GTMMIMEDocumentPart *part = [GTMMIMEDocumentPart partWithHeaders:headers body:body]; + [_parts addObject:part]; + _boundary = nil; +} + +// For unit testing only, seeds the random number generator so that we will +// have reproducible boundary strings. +- (void)seedRandomWith:(u_int32_t)seed { + _randomSeed = seed; + _boundary = nil; +} + +- (u_int32_t)random { + if (_randomSeed) { + // For testing only. + return _randomSeed++; + } else { + return arc4random(); + } +} + +// Computes the mime boundary to use. This should only be called +// after all the desired document parts have been added since it must compute +// a boundary that does not exist in the document data. +- (NSString *)boundary { + if (_boundary) { + return _boundary; + } + + // Use an easily-readable boundary string. + NSString *const kBaseBoundary = @"END_OF_PART"; + + _boundary = kBaseBoundary; + + // If the boundary isn't unique, append random numbers, up to 10 attempts; + // if that's still not unique, use a random number sequence instead, and call it good. + BOOL didCollide = NO; + + const int maxTries = 10; // Arbitrarily chosen maximum attempts. + for (int tries = 0; tries < maxTries; ++tries) { + + NSData *data = [_boundary dataUsingEncoding:NSUTF8StringEncoding]; + const void *dataBytes = data.bytes; + NSUInteger dataLen = data.length; + + for (GTMMIMEDocumentPart *part in _parts) { + didCollide = [part containsBytes:dataBytes length:dataLen]; + if (didCollide) break; + } + + if (!didCollide) break; // We're fine, no more attempts needed. + + // Try again with a random number appended. + _boundary = [NSString stringWithFormat:@"%@_%08x", kBaseBoundary, [self random]]; + } + + if (didCollide) { + // Fallback... two random numbers. + _boundary = [NSString stringWithFormat:@"%08x_tedborg_%08x", [self random], [self random]]; + } + return _boundary; +} + +- (void)setBoundary:(NSString *)str { + _boundary = [str copy]; +} + +// Internal method. +- (void)generateDataArray:(NSMutableArray *)dataArray + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary { + + // The input stream is of the form: + // --boundary + // [part_1_headers] + // [part_1_data] + // --boundary + // [part_2_headers] + // [part_2_data] + // --boundary-- + + // First we set up our boundary NSData objects. + NSString *boundary = self.boundary; + + NSString *mainBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary]; + NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary]; + + NSData *mainBoundaryData = [mainBoundary dataUsingEncoding:NSUTF8StringEncoding]; + NSData *endBoundaryData = [endBoundary dataUsingEncoding:NSUTF8StringEncoding]; + + // Now we add them all in proper order to our dataArray. + unsigned long long length = 0; + + for (GTMMIMEDocumentPart *part in _parts) { + [dataArray addObject:mainBoundaryData]; + [dataArray addObject:part.headerData]; + [dataArray addObject:part.body]; + + length += part.length + mainBoundaryData.length; + } + + [dataArray addObject:endBoundaryData]; + length += endBoundaryData.length; + + if (outLength) *outLength = length; + if (outBoundary) *outBoundary = boundary; +} + +- (void)generateInputStream:(NSInputStream **)outStream + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary { + NSMutableArray *dataArray = outStream ? [NSMutableArray array] : nil; + [self generateDataArray:dataArray + length:outLength + boundary:outBoundary]; + + if (outStream) { + Class streamClass = NSClassFromString(@"GTMGatherInputStream"); + NSAssert(streamClass != nil, @"GTMGatherInputStream not available."); + + *outStream = [streamClass streamWithArray:dataArray]; + } +} + +- (void)generateDispatchData:(dispatch_data_t *)outDispatchData + length:(unsigned long long *)outLength + boundary:(NSString **)outBoundary { + NSMutableArray *dataArray = outDispatchData ? [NSMutableArray array] : nil; + [self generateDataArray:dataArray + length:outLength + boundary:outBoundary]; + + if (outDispatchData) { + // Create an empty data accumulator. + dispatch_data_t dataAccumulator; + + dispatch_queue_t bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + + for (NSData *partData in dataArray) { + __block NSData *immutablePartData = [partData copy]; + dispatch_data_t newDataPart = + dispatch_data_create(immutablePartData.bytes, immutablePartData.length, bgQueue, ^{ + // We want the data retained until this block executes. + immutablePartData = nil; + }); + + if (dataAccumulator == nil) { + // First part. + dataAccumulator = newDataPart; + } else { + // Append the additional part. + dataAccumulator = dispatch_data_create_concat(dataAccumulator, newDataPart); + } + } + *outDispatchData = dataAccumulator; + } +} + ++ (NSData *)dataWithHeaders:(NSDictionary *)headers { + // Generate the header data by coalescing the dictionary as lines of "key: value\r\n". + NSMutableString* headerString = [NSMutableString string]; + + // Sort the header keys so we have a deterministic order for unit testing. + SEL sortSel = @selector(caseInsensitiveCompare:); + NSArray *sortedKeys = [headers.allKeys sortedArrayUsingSelector:sortSel]; + + for (NSString *key in sortedKeys) { + NSString *value = [headers objectForKey:key]; + +#if DEBUG + // Look for troublesome characters in the header keys & values. + NSCharacterSet *badKeyChars = [NSCharacterSet characterSetWithCharactersInString:@":\r\n"]; + NSCharacterSet *badValueChars = [NSCharacterSet characterSetWithCharactersInString:@"\r\n"]; + + NSRange badRange = [key rangeOfCharacterFromSet:badKeyChars]; + NSAssert(badRange.location == NSNotFound, @"invalid key: %@", key); + + badRange = [value rangeOfCharacterFromSet:badValueChars]; + NSAssert(badRange.location == NSNotFound, @"invalid value: %@", value); +#endif + + [headerString appendFormat:@"%@: %@\r\n", key, value]; + } + // Headers end with an extra blank line. + [headerString appendString:@"\r\n"]; + + NSData *result = [headerString dataUsingEncoding:NSUTF8StringEncoding]; + return result; +} + +#pragma mark - Separating Parts + ++ (NSArray *)MIMEPartsWithBoundary:(NSString *)boundary + data:(NSData *)fullDocumentData { + // In MIME documents, the boundary is preceded by CRLF and two dashes, and followed + // at the end by two dashes. + NSData *boundaryData = [boundary dataUsingEncoding:NSUTF8StringEncoding]; + NSUInteger boundaryLength = boundaryData.length; + + NSMutableArray *foundBoundaryOffsets; + [self searchData:fullDocumentData + targetBytes:boundaryData.bytes + targetLength:boundaryLength + foundOffsets:&foundBoundaryOffsets]; + + // According to rfc1341, ignore anything before the first boundary, or after the last, though two + // dashes are expected to follow the last boundary. + if (foundBoundaryOffsets.count < 2) { + return nil; + } + + // Wrap the full document data with a dispatch_data_t for more efficient slicing + // and dicing. + dispatch_data_t dataWrapper; + if ([fullDocumentData conformsToProtocol:@protocol(OS_dispatch_data)]) { + dataWrapper = (dispatch_data_t)fullDocumentData; + } else { + // A no-op self invocation on fullDocumentData will keep it retained until the block is invoked. + dispatch_queue_t bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dataWrapper = dispatch_data_create(fullDocumentData.bytes, + fullDocumentData.length, + bgQueue, ^{ [fullDocumentData self]; }); + } + NSMutableArray *parts; + NSInteger previousBoundaryOffset = -1; + NSInteger partCounter = -1; + NSInteger numberOfPartsWithHeaders = 0; + for (NSNumber *currentBoundaryOffset in foundBoundaryOffsets) { + ++partCounter; + if (previousBoundaryOffset == -1) { + // This is the first boundary. + previousBoundaryOffset = currentBoundaryOffset.integerValue; + continue; + } else { + // Create a part data subrange between the previous boundary and this one. + // + // The last four bytes before a boundary are CRLF--. + // The first two bytes following a boundary are either CRLF or, for the last boundary, --. + NSInteger previousPartDataStartOffset = + previousBoundaryOffset + (NSInteger)boundaryLength + 2; + NSInteger previousPartDataEndOffset = currentBoundaryOffset.integerValue - 4; + NSInteger previousPartDataLength = previousPartDataEndOffset - previousPartDataStartOffset; + + if (previousPartDataLength < 2) { + // The preceding part was too short to be useful. +#if DEBUG + NSLog(@"MIME part %zd has %zd bytes", partCounter - 1, previousPartDataLength); +#endif + } else { + if (!parts) parts = [NSMutableArray array]; + + dispatch_data_t partData = + dispatch_data_create_subrange(dataWrapper, + (size_t)previousPartDataStartOffset, (size_t)previousPartDataLength); + // Scan the part data for the separator between headers and body. After the CRLF, + // either the headers start immediately, or there's another CRLF and there are no headers. + // + // We need to map the part data to get the first two bytes. (Or we could cast it to + // NSData and get the bytes pointer of that.) If we're concerned that a single part + // data may be expensive to map, we could make a subrange here for just the first two bytes, + // and map that two-byte subrange. + const void *partDataBuffer; + size_t partDataBufferSize; + dispatch_data_t mappedPartData NS_VALID_UNTIL_END_OF_SCOPE = + dispatch_data_create_map(partData, &partDataBuffer, &partDataBufferSize); + dispatch_data_t bodyData; + NSDictionary *headers; + BOOL hasAnotherCRLF = (((char *)partDataBuffer)[0] == '\r' + && ((char *)partDataBuffer)[1] == '\n'); + mappedPartData = nil; + + if (hasAnotherCRLF) { + // There are no headers; skip the CRLF to get to the body, and leave headers nil. + bodyData = dispatch_data_create_subrange(partData, 2, (size_t)previousPartDataLength - 2); + } else { + // There are part headers. They are separated from body data by CRLFCRLF. + NSArray *crlfOffsets; + [self searchData:(NSData *)partData + targetBytes:"\r\n\r\n" + targetLength:4 + foundOffsets:&crlfOffsets]; + if (crlfOffsets.count == 0) { +#if DEBUG + // We could not distinguish body and headers. + NSLog(@"MIME part %zd lacks a header separator: %@", partCounter - 1, + [[NSString alloc] initWithData:(NSData *)partData encoding:NSUTF8StringEncoding]); +#endif + } else { + NSInteger headerSeparatorOffset = ((NSNumber *)crlfOffsets.firstObject).integerValue; + dispatch_data_t headerData = + dispatch_data_create_subrange(partData, 0, (size_t)headerSeparatorOffset); + headers = [self headersWithData:(NSData *)headerData]; + + bodyData = dispatch_data_create_subrange(partData, (size_t)headerSeparatorOffset + 4, + (size_t)(previousPartDataLength - (headerSeparatorOffset + 4))); + + numberOfPartsWithHeaders++; + } // crlfOffsets.count == 0 + } // hasAnotherCRLF + GTMMIMEDocumentPart *part = [GTMMIMEDocumentPart partWithHeaders:headers + body:(NSData *)bodyData]; + [parts addObject:part]; + } // previousPartDataLength < 2 + previousBoundaryOffset = currentBoundaryOffset.integerValue; + } + } +#if DEBUG + // In debug builds, warn if a reasonably long document lacks any CRLF characters. + if (numberOfPartsWithHeaders == 0) { + NSUInteger length = fullDocumentData.length; + if (length > 20) { // Reasonably long. + NSMutableArray *foundCRLFs; + [self searchData:fullDocumentData + targetBytes:"\r\n" + targetLength:2 + foundOffsets:&foundCRLFs]; + if (foundCRLFs.count == 0) { + // Parts were logged above (due to lacking header separators.) + NSLog(@"Warning: MIME document lacks any headers (may have wrong line endings)"); + } + } + } +#endif // DEBUG + return parts; +} + +// Efficiently search the supplied data for the target bytes. +// +// This uses enumerateByteRangesUsingBlock: to scan for bytes. It can find +// the target even if it spans multiple separate byte ranges. +// +// Returns an array of found byte offset values, as NSNumbers. ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets { + NSMutableArray *foundOffsets = [NSMutableArray array]; + SearchDataForBytes(data, targetBytes, targetLength, foundOffsets, NULL); + *outFoundOffsets = foundOffsets; +} + + +// This version of searchData: also returns the block numbers (0-based) where the +// target was found, used for testing that the supplied dispatch_data buffer +// has not been flattened. ++ (void)searchData:(NSData *)data + targetBytes:(const void *)targetBytes + targetLength:(NSUInteger)targetLength + foundOffsets:(GTM_NSArrayOf(NSNumber *) **)outFoundOffsets + foundBlockNumbers:(GTM_NSArrayOf(NSNumber *) **)outFoundBlockNumbers { + NSMutableArray *foundOffsets = [NSMutableArray array]; + NSMutableArray *foundBlockNumbers = [NSMutableArray array]; + + SearchDataForBytes(data, targetBytes, targetLength, foundOffsets, foundBlockNumbers); + *outFoundOffsets = foundOffsets; + *outFoundBlockNumbers = foundBlockNumbers; +} + +static void SearchDataForBytes(NSData *data, const void *targetBytes, NSUInteger targetLength, + NSMutableArray *foundOffsets, NSMutableArray *foundBlockNumbers) { + __block NSUInteger priorPartialMatchAmount = 0; + __block NSInteger priorPartialMatchStartingBlockNumber = -1; + __block NSInteger blockNumber = -1; + + [data enumerateByteRangesUsingBlock:^(const void *bytes, + NSRange byteRange, + BOOL *stop) { + // Search for the first character in the current range. + const void *ptr = bytes; + NSInteger remainingInCurrentRange = (NSInteger)byteRange.length; + ++blockNumber; + + if (priorPartialMatchAmount > 0) { + NSUInteger amountRemainingToBeMatched = targetLength - priorPartialMatchAmount; + NSUInteger remainingFoundOffset; + NSUInteger amountMatched = FindBytes(targetBytes + priorPartialMatchAmount, + amountRemainingToBeMatched, + ptr, (NSUInteger)remainingInCurrentRange, &remainingFoundOffset); + if (amountMatched == 0 || remainingFoundOffset > 0) { + // No match of the rest of the prior partial match in this range. + } else if (amountMatched < amountRemainingToBeMatched) { + // Another partial match; we're done with this range. + priorPartialMatchAmount = priorPartialMatchAmount + amountMatched; + return; + } else { + // The offset is in an earlier range. + NSUInteger offset = byteRange.location - priorPartialMatchAmount; + [foundOffsets addObject:@(offset)]; + [foundBlockNumbers addObject:@(priorPartialMatchStartingBlockNumber)]; + priorPartialMatchStartingBlockNumber = -1; + } + priorPartialMatchAmount = 0; + } + + while (remainingInCurrentRange > 0) { + NSUInteger offsetFromPtr; + NSUInteger amountMatched = FindBytes(targetBytes, targetLength, ptr, + (NSUInteger)remainingInCurrentRange, &offsetFromPtr); + if (amountMatched == 0) { + // No match in this range. + return; + } + if (amountMatched < targetLength) { + // Found a partial target. If there's another range, we'll check for the rest. + priorPartialMatchAmount = amountMatched; + priorPartialMatchStartingBlockNumber = blockNumber; + return; + } + // Found the full target. + NSUInteger globalOffset = byteRange.location + (NSUInteger)(ptr - bytes) + offsetFromPtr; + + [foundOffsets addObject:@(globalOffset)]; + [foundBlockNumbers addObject:@(blockNumber)]; + + ptr += targetLength + offsetFromPtr; + remainingInCurrentRange -= (targetLength + offsetFromPtr); + } + }]; +} + +// Internal method only for testing; this calls through the static method. ++ (NSUInteger)findBytesWithNeedle:(const unsigned char *)needle + needleLength:(NSUInteger)needleLength + haystack:(const unsigned char *)haystack + haystackLength:(NSUInteger)haystackLength + foundOffset:(NSUInteger *)foundOffset { + return FindBytes(needle, needleLength, haystack, haystackLength, foundOffset); +} + +// Utility method to parse header bytes into an NSDictionary. ++ (NSDictionary *)headersWithData:(NSData *)data { + NSString *headersString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + if (!headersString) return nil; + + NSMutableDictionary *headers = [NSMutableDictionary dictionary]; + NSScanner *scanner = [NSScanner scannerWithString:headersString]; + // The scanner is skipping leading whitespace and newline characters by default. + NSCharacterSet *newlineCharacters = [NSCharacterSet newlineCharacterSet]; + NSString *key; + NSString *value; + while ([scanner scanUpToString:@":" intoString:&key] + && [scanner scanString:@":" intoString:NULL] + && [scanner scanUpToCharactersFromSet:newlineCharacters intoString:&value]) { + [headers setObject:value forKey:key]; + // Discard the trailing newline. + [scanner scanCharactersFromSet:newlineCharacters intoString:NULL]; + } + return headers; +} + +@end + +// Return how much of the needle was found in the haystack. +// +// If the result is less than needleLen, then the beginning of the needle +// was found at the end of the haystack. +static NSUInteger FindBytes(const unsigned char* needle, NSUInteger needleLen, + const unsigned char* haystack, NSUInteger haystackLen, + NSUInteger *foundOffset) { + const unsigned char *ptr = haystack; + NSInteger remain = (NSInteger)haystackLen; + // Assume memchr is an efficient way to find a match for the first + // byte of the needle, and memcmp is an efficient way to compare a + // range of bytes. + while (remain > 0 && (ptr = memchr(ptr, needle[0], (size_t)remain)) != 0) { + // The first character is present. + NSUInteger offset = (NSUInteger)(ptr - haystack); + remain = (NSInteger)(haystackLen - offset); + + NSUInteger amountToCompare = MIN((NSUInteger)remain, needleLen); + if (memcmp(ptr, needle, amountToCompare) == 0) { + if (foundOffset) *foundOffset = offset; + return amountToCompare; + } + ptr++; + remain--; + } + if (foundOffset) *foundOffset = 0; + return 0; +} diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h new file mode 100644 index 000000000..4e306428a --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.h @@ -0,0 +1,49 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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 + +#ifndef GTM_NONNULL + #if defined(__has_attribute) + #if __has_attribute(nonnull) + #define GTM_NONNULL(x) __attribute__((nonnull x)) + #else + #define GTM_NONNULL(x) + #endif + #else + #define GTM_NONNULL(x) + #endif +#endif + + +@interface GTMReadMonitorInputStream : NSInputStream + ++ (instancetype)inputStreamWithStream:(NSInputStream *)input GTM_NONNULL((1)); + +- (instancetype)initWithStream:(NSInputStream *)input GTM_NONNULL((1)); + +// The read monitor selector is called when bytes have been read. It should have this signature: +// +// - (void)inputStream:(GTMReadMonitorInputStream *)stream +// readIntoBuffer:(uint8_t *)buffer +// length:(int64_t)length; + +@property(atomic, weak) id readDelegate; +@property(atomic, assign) SEL readSelector; + +// Modes for invoking callbacks, when necessary. +@property(atomic, strong) NSArray *runLoopModes; + +@end diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m new file mode 100644 index 000000000..53a01728b --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMReadMonitorInputStream.m @@ -0,0 +1,187 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMReadMonitorInputStream.h" + +@implementation GTMReadMonitorInputStream { + NSInputStream *_inputStream; // Encapsulated stream that does the work. + + NSThread *_thread; // Thread in which this object was created. + NSArray *_runLoopModes; // Modes for calling callbacks, when necessary. +} + + +@synthesize readDelegate = _readDelegate; +@synthesize readSelector = _readSelector; +@synthesize runLoopModes = _runLoopModes; + +// We'll forward all unhandled messages to the NSInputStream class or to the encapsulated input +// stream. This is needed for all messages sent to NSInputStream which aren't handled by our +// superclass; that includes various private run loop calls. ++ (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { + return [NSInputStream methodSignatureForSelector:selector]; +} + ++ (void)forwardInvocation:(NSInvocation*)invocation { + [invocation invokeWithTarget:[NSInputStream class]]; +} + +- (BOOL)respondsToSelector:(SEL)selector { + return [_inputStream respondsToSelector:selector]; +} + +- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { + return [_inputStream methodSignatureForSelector:selector]; +} + +- (void)forwardInvocation:(NSInvocation*)invocation { + [invocation invokeWithTarget:_inputStream]; +} + +#pragma mark - + ++ (instancetype)inputStreamWithStream:(NSInputStream *)input { + return [[self alloc] initWithStream:input]; +} + +- (instancetype)initWithStream:(NSInputStream *)input { + self = [super init]; + if (self) { + _inputStream = input; + _thread = [NSThread currentThread]; + } + return self; +} + +- (instancetype)init { + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +#pragma mark - + +- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len { + // Read from the encapsulated stream. + NSInteger numRead = [_inputStream read:buffer maxLength:len]; + if (numRead > 0) { + if (_readDelegate && _readSelector) { + // Call the read selector with the buffer and number of bytes actually read into it. + BOOL isOnOriginalThread = [_thread isEqual:[NSThread currentThread]]; + if (isOnOriginalThread) { + // Invoke immediately. + NSData *data = [NSData dataWithBytesNoCopy:buffer + length:(NSUInteger)numRead + freeWhenDone:NO]; + [self invokeReadSelectorWithBuffer:data]; + } else { + // Copy the buffer into an NSData to be retained by the performSelector, + // and invoke on the proper thread. + SEL sel = @selector(invokeReadSelectorWithBuffer:); + NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numRead]; + if (_runLoopModes) { + [self performSelector:sel + onThread:_thread + withObject:data + waitUntilDone:NO + modes:_runLoopModes]; + } else { + [self performSelector:sel + onThread:_thread + withObject:data + waitUntilDone:NO]; + } + } + } + } + return numRead; +} + +- (void)invokeReadSelectorWithBuffer:(NSData *)data { + const void *buffer = data.bytes; + int64_t length = (int64_t)data.length; + + id argSelf = self; + id readDelegate = _readDelegate; + if (readDelegate) { + NSMethodSignature *signature = [readDelegate methodSignatureForSelector:_readSelector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setSelector:_readSelector]; + [invocation setTarget:readDelegate]; + [invocation setArgument:&argSelf atIndex:2]; + [invocation setArgument:&buffer atIndex:3]; + [invocation setArgument:&length atIndex:4]; + [invocation invoke]; + } +} + +- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len { + return [_inputStream getBuffer:buffer length:len]; +} + +- (BOOL)hasBytesAvailable { + return [_inputStream hasBytesAvailable]; +} + +#pragma mark Standard messages + +// Pass expected messages to our encapsulated stream. +// +// We want our encapsulated NSInputStream to handle the standard messages; +// we don't want the superclass to handle them. +- (void)open { + [_inputStream open]; +} + +- (void)close { + [_inputStream close]; +} + +- (id)delegate { + return [_inputStream delegate]; +} + +- (void)setDelegate:(id)delegate { + [_inputStream setDelegate:delegate]; +} + +- (id)propertyForKey:(NSString *)key { + return [_inputStream propertyForKey:key]; +} + +- (BOOL)setProperty:(id)property forKey:(NSString *)key { + return [_inputStream setProperty:property forKey:key]; +} + +- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { + [_inputStream scheduleInRunLoop:aRunLoop forMode:mode]; +} + +- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { + [_inputStream removeFromRunLoop:aRunLoop forMode:mode]; +} + +- (NSStreamStatus)streamStatus { + return [_inputStream streamStatus]; +} + +- (NSError *)streamError { + return [_inputStream streamError]; +} + +@end diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h new file mode 100644 index 000000000..a649cf0e0 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.h @@ -0,0 +1,1308 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +// GTMSessionFetcher is a wrapper around NSURLSession for http operations. +// +// What does this offer on top of of NSURLSession? +// +// - Block-style callbacks for useful functionality like progress rather +// than delegate methods. +// - Out-of-process uploads and downloads using NSURLSession, including +// management of fetches after relaunch. +// - Integration with GTMAppAuth for invisible management and refresh of +// authorization tokens. +// - Pretty-printed http logging. +// - Cookies handling that does not interfere with or get interfered with +// by WebKit cookies or on Mac by Safari and other apps. +// - Credentials handling for the http operation. +// - Rate-limiting and cookie grouping when fetchers are created with +// GTMSessionFetcherService. +// +// If the bodyData or bodyFileURL property is set, then a POST request is assumed. +// +// Each fetcher is assumed to be for a one-shot fetch request; don't reuse the object +// for a second fetch. +// +// The fetcher will be self-retained as long as a connection is pending. +// +// To keep user activity private, URLs must have an https scheme (unless the property +// allowedInsecureSchemes is set to permit the scheme.) +// +// Callbacks will be released when the fetch completes or is stopped, so there is no need +// to use weak self references in the callback blocks. +// +// Sample usage: +// +// _fetcherService = [[GTMSessionFetcherService alloc] init]; +// +// GTMSessionFetcher *myFetcher = [_fetcherService fetcherWithURLString:myURLString]; +// myFetcher.retryEnabled = YES; +// myFetcher.comment = @"First profile image"; +// +// // Optionally specify a file URL or NSData for the request body to upload. +// myFetcher.bodyData = [postString dataUsingEncoding:NSUTF8StringEncoding]; +// +// [myFetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { +// if (error != nil) { +// // Server status code or network error. +// // +// // If the domain is kGTMSessionFetcherStatusDomain then the error code +// // is a failure status from the server. +// } else { +// // Fetch succeeded. +// } +// }]; +// +// There is also a beginFetch call that takes a pointer and selector for the completion handler; +// a pointer and selector is a better style when the callback is a substantial, separate method. +// +// NOTE: Fetches may retrieve data from the server even though the server +// returned an error, so the criteria for success is a non-nil error. +// The completion handler is called when the server status is >= 300 with an NSError +// having domain kGTMSessionFetcherStatusDomain and code set to the server status. +// +// Status codes are at +// +// +// Background session support: +// +// Out-of-process uploads and downloads may be created by setting the fetcher's +// useBackgroundSession property. Data to be uploaded should be provided via +// the uploadFileURL property; the download destination should be specified with +// the destinationFileURL. NOTE: Background upload files should be in a location +// that will be valid even after the device is restarted, so the file should not +// be uploaded from a system temporary or cache directory. +// +// Background session transfers are slower, and should typically be used only +// for very large downloads or uploads (hundreds of megabytes). +// +// When background sessions are used in iOS apps, the application delegate must +// pass through the parameters from UIApplicationDelegate's +// application:handleEventsForBackgroundURLSession:completionHandler: to the +// fetcher class. +// +// When the application has been relaunched, it may also create a new fetcher +// instance to handle completion of the transfers. +// +// - (void)application:(UIApplication *)application +// handleEventsForBackgroundURLSession:(NSString *)identifier +// completionHandler:(void (^)())completionHandler { +// // Application was re-launched on completing an out-of-process download. +// +// // Pass the URLSession info related to this re-launch to the fetcher class. +// [GTMSessionFetcher application:application +// handleEventsForBackgroundURLSession:identifier +// completionHandler:completionHandler]; +// +// // Get a fetcher related to this re-launch and re-hook up a completionHandler to it. +// GTMSessionFetcher *fetcher = [GTMSessionFetcher fetcherWithSessionIdentifier:identifier]; +// NSURL *destinationFileURL = fetcher.destinationFileURL; +// fetcher.completionHandler = ^(NSData *data, NSError *error) { +// [self downloadCompletedToFile:destinationFileURL error:error]; +// }; +// } +// +// +// Threading and queue support: +// +// Networking always happens on a background thread; there is no advantage to +// changing thread or queue to create or start a fetcher. +// +// Callbacks are run on the main thread; alternatively, the app may set the +// fetcher's callbackQueue to a dispatch queue. +// +// Once the fetcher's beginFetch method has been called, the fetcher's methods and +// properties may be accessed from any thread. +// +// Downloading to disk: +// +// To have downloaded data saved directly to disk, specify a file URL for the +// destinationFileURL property. +// +// HTTP methods and headers: +// +// Alternative HTTP methods, like PUT, and custom headers can be specified by +// creating the fetcher with an appropriate NSMutableURLRequest. +// +// +// Caching: +// +// The fetcher avoids caching. That is best for API requests, but may hurt +// repeat fetches of static data. Apps may enable a persistent disk cache by +// customizing the config: +// +// fetcher.configurationBlock = ^(GTMSessionFetcher *configFetcher, +// NSURLSessionConfiguration *config) { +// config.URLCache = [NSURLCache sharedURLCache]; +// }; +// +// Or use the standard system config to share cookie storage with web views +// and to enable disk caching: +// +// fetcher.configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +// +// +// Cookies: +// +// There are three supported mechanisms for remembering cookies between fetches. +// +// By default, a standalone GTMSessionFetcher uses a mutable array held +// statically to track cookies for all instantiated fetchers. This avoids +// cookies being set by servers for the application from interfering with +// Safari and WebKit cookie settings, and vice versa. +// The fetcher cookies are lost when the application quits. +// +// To rely instead on WebKit's global NSHTTPCookieStorage, set the fetcher's +// cookieStorage property: +// myFetcher.cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; +// +// To share cookies with other apps, use the method introduced in iOS 9/OS X 10.11: +// myFetcher.cookieStorage = +// [NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier:kMyCompanyContainedID]; +// +// To ignore existing cookies and only have cookies related to the single fetch +// be applied, make a temporary cookie storage object: +// myFetcher.cookieStorage = [[GTMSessionCookieStorage alloc] init]; +// +// Note: cookies set while following redirects will be sent to the server, as +// the redirects are followed by the fetcher. +// +// To completely disable cookies, similar to setting cookieStorageMethod to +// kGTMHTTPFetcherCookieStorageMethodNone, adjust the session configuration +// appropriately in the fetcher or fetcher service: +// fetcher.configurationBlock = ^(GTMSessionFetcher *configFetcher, +// NSURLSessionConfiguration *config) { +// config.HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicyNever; +// config.HTTPShouldSetCookies = NO; +// }; +// +// If the fetcher is created from a GTMSessionFetcherService object +// then the cookie storage mechanism is set to use the cookie storage in the +// service object rather than the static storage. Disabling cookies in the +// session configuration set on a service object will disable cookies for all +// fetchers created from that GTMSessionFetcherService object, since the session +// configuration is propagated to the fetcher. +// +// +// Monitoring data transfers. +// +// The fetcher supports a variety of properties for progress monitoring +// progress with callback blocks. +// GTMSessionFetcherSendProgressBlock sendProgressBlock +// GTMSessionFetcherReceivedProgressBlock receivedProgressBlock +// GTMSessionFetcherDownloadProgressBlock downloadProgressBlock +// +// If supplied by the server, the anticipated total download size is available +// as [[myFetcher response] expectedContentLength] (and may be -1 for unknown +// download sizes.) +// +// +// Automatic retrying of fetches +// +// The fetcher can optionally create a timer and reattempt certain kinds of +// fetch failures (status codes 408, request timeout; 502, gateway failure; +// 503, service unavailable; 504, gateway timeout; networking errors +// NSURLErrorTimedOut and NSURLErrorNetworkConnectionLost.) The user may +// set a retry selector to customize the type of errors which will be retried. +// +// Retries are done in an exponential-backoff fashion (that is, after 1 second, +// 2, 4, 8, and so on.) +// +// Enabling automatic retries looks like this: +// myFetcher.retryEnabled = YES; +// +// With retries enabled, the completion callbacks are called only +// when no more retries will be attempted. Calling the fetcher's stopFetching +// method will terminate the retry timer, without the finished or failure +// selectors being invoked. +// +// Optionally, the client may set the maximum retry interval: +// myFetcher.maxRetryInterval = 60.0; // in seconds; default is 60 seconds +// // for downloads, 600 for uploads +// +// Servers should never send a 400 or 500 status for errors that are retryable +// by clients, as those values indicate permanent failures. In nearly all +// cases, the default standard retry behavior is correct for clients, and no +// custom client retry behavior is needed or appropriate. Servers that send +// non-retryable status codes and expect the client to retry the request are +// faulty. +// +// Still, the client may provide a block to determine if a status code or other +// error should be retried. The block returns YES to set the retry timer or NO +// to fail without additional fetch attempts. +// +// The retry method may return the |suggestedWillRetry| argument to get the +// default retry behavior. Server status codes are present in the +// error argument, and have the domain kGTMSessionFetcherStatusDomain. The +// user's method may look something like this: +// +// myFetcher.retryBlock = ^(BOOL suggestedWillRetry, NSError *error, +// GTMSessionFetcherRetryResponse response) { +// // Perhaps examine error.domain and error.code, or fetcher.retryCount +// // +// // Respond with YES to start the retry timer, NO to proceed to the failure +// // callback, or suggestedWillRetry to get default behavior for the +// // current error domain and code values. +// response(suggestedWillRetry); +// }; + + +#import + +#if TARGET_OS_IPHONE +#import +#endif +#if TARGET_OS_WATCH +#import +#endif + +// By default it is stripped from non DEBUG builds. Developers can override +// this in their project settings. +#ifndef STRIP_GTM_FETCH_LOGGING + #if !DEBUG + #define STRIP_GTM_FETCH_LOGGING 1 + #else + #define STRIP_GTM_FETCH_LOGGING 0 + #endif +#endif + +// Logs in debug builds. +#ifndef GTMSESSION_LOG_DEBUG + #if DEBUG + #define GTMSESSION_LOG_DEBUG(...) NSLog(__VA_ARGS__) + #else + #define GTMSESSION_LOG_DEBUG(...) do { } while (0) + #endif +#endif + +// Asserts in debug builds (or logs in debug builds if GTMSESSION_ASSERT_AS_LOG +// or NS_BLOCK_ASSERTIONS are defined.) +#ifndef GTMSESSION_ASSERT_DEBUG + #if DEBUG && !defined(NS_BLOCK_ASSERTIONS) && !GTMSESSION_ASSERT_AS_LOG + #undef GTMSESSION_ASSERT_AS_LOG + #define GTMSESSION_ASSERT_AS_LOG 1 + #endif + + #if DEBUG && !GTMSESSION_ASSERT_AS_LOG + #define GTMSESSION_ASSERT_DEBUG(...) NSAssert(__VA_ARGS__) + #elif DEBUG + #define GTMSESSION_ASSERT_DEBUG(pred, ...) if (!(pred)) { NSLog(__VA_ARGS__); } + #else + #define GTMSESSION_ASSERT_DEBUG(pred, ...) do { } while (0) + #endif +#endif + +// Asserts in debug builds, logs in release builds (or logs in debug builds if +// GTMSESSION_ASSERT_AS_LOG is defined.) +#ifndef GTMSESSION_ASSERT_DEBUG_OR_LOG + #if DEBUG && !GTMSESSION_ASSERT_AS_LOG + #define GTMSESSION_ASSERT_DEBUG_OR_LOG(...) NSAssert(__VA_ARGS__) + #else + #define GTMSESSION_ASSERT_DEBUG_OR_LOG(pred, ...) if (!(pred)) { NSLog(__VA_ARGS__); } + #endif +#endif + +// Macro useful for examining messages from NSURLSession during debugging. +#if 0 +#define GTM_LOG_SESSION_DELEGATE(...) GTMSESSION_LOG_DEBUG(__VA_ARGS__) +#else +#define GTM_LOG_SESSION_DELEGATE(...) +#endif + +#ifndef GTM_NULLABLE + #if __has_feature(nullability) // Available starting in Xcode 6.3 + #define GTM_NULLABLE_TYPE __nullable + #define GTM_NONNULL_TYPE __nonnull + #define GTM_NULLABLE nullable + #define GTM_NONNULL_DECL nonnull // GTM_NONNULL is used by GTMDefines.h + #define GTM_NULL_RESETTABLE null_resettable + + #define GTM_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN + #define GTM_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END + #else + #define GTM_NULLABLE_TYPE + #define GTM_NONNULL_TYPE + #define GTM_NULLABLE + #define GTM_NONNULL_DECL + #define GTM_NULL_RESETTABLE + #define GTM_ASSUME_NONNULL_BEGIN + #define GTM_ASSUME_NONNULL_END + #endif // __has_feature(nullability) +#endif // GTM_NULLABLE + +#if (TARGET_OS_TV \ + || TARGET_OS_WATCH \ + || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)) +#define GTMSESSION_DEPRECATE_ON_2016_SDKS(_MSG) __attribute__((deprecated("" _MSG))) +#else +#define GTMSESSION_DEPRECATE_ON_2016_SDKS(_MSG) +#endif + +#ifndef GTM_DECLARE_GENERICS + #if __has_feature(objc_generics) + #define GTM_DECLARE_GENERICS 1 + #else + #define GTM_DECLARE_GENERICS 0 + #endif +#endif + +#ifndef GTM_NSArrayOf + #if GTM_DECLARE_GENERICS + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #else + #define GTM_NSArrayOf(value) NSArray + #define GTM_NSDictionaryOf(key, value) NSDictionary + #endif // __has_feature(objc_generics) +#endif // GTM_NSArrayOf + +// For iOS, the fetcher can declare itself a background task to allow fetches +// to finish when the app leaves the foreground. +// +// (This is unrelated to providing a background configuration, which allows +// out-of-process uploads and downloads.) +// +// To disallow use of background tasks during fetches, the target should define +// GTM_BACKGROUND_TASK_FETCHING to 0, or alternatively may set the +// skipBackgroundTask property to YES. +#if TARGET_OS_IPHONE && !TARGET_OS_WATCH && !defined(GTM_BACKGROUND_TASK_FETCHING) + #define GTM_BACKGROUND_TASK_FETCHING 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if (TARGET_OS_TV \ + || TARGET_OS_WATCH \ + || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0)) + #ifndef GTM_USE_SESSION_FETCHER + #define GTM_USE_SESSION_FETCHER 1 + #endif +#endif + +#if !defined(GTMBridgeFetcher) + // These bridge macros should be identical in GTMHTTPFetcher.h and GTMSessionFetcher.h + #if GTM_USE_SESSION_FETCHER + // Macros to new fetcher class. + #define GTMBridgeFetcher GTMSessionFetcher + #define GTMBridgeFetcherService GTMSessionFetcherService + #define GTMBridgeFetcherServiceProtocol GTMSessionFetcherServiceProtocol + #define GTMBridgeAssertValidSelector GTMSessionFetcherAssertValidSelector + #define GTMBridgeCookieStorage GTMSessionCookieStorage + #define GTMBridgeCleanedUserAgentString GTMFetcherCleanedUserAgentString + #define GTMBridgeSystemVersionString GTMFetcherSystemVersionString + #define GTMBridgeApplicationIdentifier GTMFetcherApplicationIdentifier + #define kGTMBridgeFetcherStatusDomain kGTMSessionFetcherStatusDomain + #define kGTMBridgeFetcherStatusBadRequest GTMSessionFetcherStatusBadRequest + #else + // Macros to old fetcher class. + #define GTMBridgeFetcher GTMHTTPFetcher + #define GTMBridgeFetcherService GTMHTTPFetcherService + #define GTMBridgeFetcherServiceProtocol GTMHTTPFetcherServiceProtocol + #define GTMBridgeAssertValidSelector GTMAssertSelectorNilOrImplementedWithArgs + #define GTMBridgeCookieStorage GTMCookieStorage + #define GTMBridgeCleanedUserAgentString GTMCleanedUserAgentString + #define GTMBridgeSystemVersionString GTMSystemVersionString + #define GTMBridgeApplicationIdentifier GTMApplicationIdentifier + #define kGTMBridgeFetcherStatusDomain kGTMHTTPFetcherStatusDomain + #define kGTMBridgeFetcherStatusBadRequest kGTMHTTPFetcherStatusBadRequest + #endif // GTM_USE_SESSION_FETCHER +#endif + +GTM_ASSUME_NONNULL_BEGIN + +// Notifications +// +// Fetch started and stopped, and fetch retry delay started and stopped. +extern NSString *const kGTMSessionFetcherStartedNotification; +extern NSString *const kGTMSessionFetcherStoppedNotification; +extern NSString *const kGTMSessionFetcherRetryDelayStartedNotification; +extern NSString *const kGTMSessionFetcherRetryDelayStoppedNotification; + +// Completion handler notification. This is intended for use by code capturing +// and replaying fetch requests and results for testing. For fetches where +// destinationFileURL or accumulateDataBlock is set for the fetcher, the data +// will be nil for successful fetches. +// +// This notification is posted on the main thread. +extern NSString *const kGTMSessionFetcherCompletionInvokedNotification; +extern NSString *const kGTMSessionFetcherCompletionDataKey; +extern NSString *const kGTMSessionFetcherCompletionErrorKey; + +// Constants for NSErrors created by the fetcher (excluding server status errors, +// and error objects originating in the OS.) +extern NSString *const kGTMSessionFetcherErrorDomain; + +// The fetcher turns server error status values (3XX, 4XX, 5XX) into NSErrors +// with domain kGTMSessionFetcherStatusDomain. +// +// Any server response body data accompanying the status error is added to the +// userInfo dictionary with key kGTMSessionFetcherStatusDataKey. +extern NSString *const kGTMSessionFetcherStatusDomain; +extern NSString *const kGTMSessionFetcherStatusDataKey; + +// When a fetch fails with an error, these keys are included in the error userInfo +// dictionary if retries were attempted. +extern NSString *const kGTMSessionFetcherNumberOfRetriesDoneKey; +extern NSString *const kGTMSessionFetcherElapsedIntervalWithRetriesKey; + +// Background session support requires access to NSUserDefaults. +// If [NSUserDefaults standardUserDefaults] doesn't yield the correct NSUserDefaults for your usage, +// ie for an App Extension, then implement this class/method to return the correct NSUserDefaults. +// https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW6 +@interface GTMSessionFetcherUserDefaultsFactory : NSObject + ++ (NSUserDefaults *)fetcherUserDefaults; + +@end + +#ifdef __cplusplus +} +#endif + +typedef NS_ENUM(NSInteger, GTMSessionFetcherError) { + GTMSessionFetcherErrorDownloadFailed = -1, + GTMSessionFetcherErrorUploadChunkUnavailable = -2, + GTMSessionFetcherErrorBackgroundExpiration = -3, + GTMSessionFetcherErrorBackgroundFetchFailed = -4, + GTMSessionFetcherErrorInsecureRequest = -5, + GTMSessionFetcherErrorTaskCreationFailed = -6, +}; + +typedef NS_ENUM(NSInteger, GTMSessionFetcherStatus) { + // Standard http status codes. + GTMSessionFetcherStatusNotModified = 304, + GTMSessionFetcherStatusBadRequest = 400, + GTMSessionFetcherStatusUnauthorized = 401, + GTMSessionFetcherStatusForbidden = 403, + GTMSessionFetcherStatusPreconditionFailed = 412 +}; + +#ifdef __cplusplus +extern "C" { +#endif + +@class GTMSessionCookieStorage; +@class GTMSessionFetcher; + +// The configuration block is for modifying the NSURLSessionConfiguration only. +// DO NOT change any fetcher properties in the configuration block. +typedef void (^GTMSessionFetcherConfigurationBlock)(GTMSessionFetcher *fetcher, + NSURLSessionConfiguration *configuration); +typedef void (^GTMSessionFetcherSystemCompletionHandler)(void); +typedef void (^GTMSessionFetcherCompletionHandler)(NSData * GTM_NULLABLE_TYPE data, + NSError * GTM_NULLABLE_TYPE error); +typedef void (^GTMSessionFetcherBodyStreamProviderResponse)(NSInputStream *bodyStream); +typedef void (^GTMSessionFetcherBodyStreamProvider)(GTMSessionFetcherBodyStreamProviderResponse response); +typedef void (^GTMSessionFetcherDidReceiveResponseDispositionBlock)(NSURLSessionResponseDisposition disposition); +typedef void (^GTMSessionFetcherDidReceiveResponseBlock)(NSURLResponse *response, + GTMSessionFetcherDidReceiveResponseDispositionBlock dispositionBlock); +typedef void (^GTMSessionFetcherChallengeDispositionBlock)(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential); +typedef void (^GTMSessionFetcherChallengeBlock)(GTMSessionFetcher *fetcher, + NSURLAuthenticationChallenge *challenge, + GTMSessionFetcherChallengeDispositionBlock dispositionBlock); +typedef void (^GTMSessionFetcherWillRedirectResponse)(NSURLRequest * GTM_NULLABLE_TYPE redirectedRequest); +typedef void (^GTMSessionFetcherWillRedirectBlock)(NSHTTPURLResponse *redirectResponse, + NSURLRequest *redirectRequest, + GTMSessionFetcherWillRedirectResponse response); +typedef void (^GTMSessionFetcherAccumulateDataBlock)(NSData * GTM_NULLABLE_TYPE buffer); +typedef void (^GTMSessionFetcherSimulateByteTransferBlock)(NSData * GTM_NULLABLE_TYPE buffer, + int64_t bytesWritten, + int64_t totalBytesWritten, + int64_t totalBytesExpectedToWrite); +typedef void (^GTMSessionFetcherReceivedProgressBlock)(int64_t bytesWritten, + int64_t totalBytesWritten); +typedef void (^GTMSessionFetcherDownloadProgressBlock)(int64_t bytesWritten, + int64_t totalBytesWritten, + int64_t totalBytesExpectedToWrite); +typedef void (^GTMSessionFetcherSendProgressBlock)(int64_t bytesSent, + int64_t totalBytesSent, + int64_t totalBytesExpectedToSend); +typedef void (^GTMSessionFetcherWillCacheURLResponseResponse)(NSCachedURLResponse * GTM_NULLABLE_TYPE cachedResponse); +typedef void (^GTMSessionFetcherWillCacheURLResponseBlock)(NSCachedURLResponse *proposedResponse, + GTMSessionFetcherWillCacheURLResponseResponse responseBlock); +typedef void (^GTMSessionFetcherRetryResponse)(BOOL shouldRetry); +typedef void (^GTMSessionFetcherRetryBlock)(BOOL suggestedWillRetry, + NSError * GTM_NULLABLE_TYPE error, + GTMSessionFetcherRetryResponse response); + +typedef void (^GTMSessionFetcherTestResponse)(NSHTTPURLResponse * GTM_NULLABLE_TYPE response, + NSData * GTM_NULLABLE_TYPE data, + NSError * GTM_NULLABLE_TYPE error); +typedef void (^GTMSessionFetcherTestBlock)(GTMSessionFetcher *fetcherToTest, + GTMSessionFetcherTestResponse testResponse); + +void GTMSessionFetcherAssertValidSelector(id GTM_NULLABLE_TYPE obj, SEL GTM_NULLABLE_TYPE sel, ...); + +// Utility functions for applications self-identifying to servers via a +// user-agent header + +// The "standard" user agent includes the application identifier, taken from the bundle, +// followed by a space and the system version string. Pass nil to use +mainBundle as the source +// of the bundle identifier. +// +// Applications may use this as a starting point for their own user agent strings, perhaps +// with additional sections appended. Use GTMFetcherCleanedUserAgentString() below to +// clean up any string being added to the user agent. +NSString *GTMFetcherStandardUserAgentString(NSBundle * GTM_NULLABLE_TYPE bundle); + +// Make a generic name and version for the current application, like +// com.example.MyApp/1.2.3 relying on the bundle identifier and the +// CFBundleShortVersionString or CFBundleVersion. +// +// The bundle ID may be overridden as the base identifier string by +// adding to the bundle's Info.plist a "GTMUserAgentID" key. +// +// If no bundle ID or override is available, the process name preceded +// by "proc_" is used. +NSString *GTMFetcherApplicationIdentifier(NSBundle * GTM_NULLABLE_TYPE bundle); + +// Make an identifier like "MacOSX/10.7.1" or "iPod_Touch/4.1 hw/iPod1_1" +NSString *GTMFetcherSystemVersionString(void); + +// Make a parseable user-agent identifier from the given string, replacing whitespace +// and commas with underscores, and removing other characters that may interfere +// with parsing of the full user-agent string. +// +// For example, @"[My App]" would become @"My_App" +NSString *GTMFetcherCleanedUserAgentString(NSString *str); + +// Grab the data from an input stream. Since streams cannot be assumed to be rewindable, +// this may be destructive; the caller can try to rewind the stream (by setting the +// NSStreamFileCurrentOffsetKey property) or can just use the NSData to make a new +// NSInputStream. This function is intended to facilitate testing rather than be used in +// production. +// +// This function operates synchronously on the current thread. Depending on how the +// input stream is implemented, it may be appropriate to dispatch to a different +// queue before calling this function. +// +// Failure is indicated by a returned data value of nil. +NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NSError **outError); + +#ifdef __cplusplus +} // extern "C" +#endif + + +#if !GTM_USE_SESSION_FETCHER +@protocol GTMHTTPFetcherServiceProtocol; +#endif + +// This protocol allows abstract references to the fetcher service, primarily for +// fetchers (which may be compiled without the fetcher service class present.) +// +// Apps should not need to use this protocol. +@protocol GTMSessionFetcherServiceProtocol +// This protocol allows us to call into the service without requiring +// GTMSessionFetcherService sources in this project + +@property(atomic, strong) dispatch_queue_t callbackQueue; + +- (BOOL)fetcherShouldBeginFetching:(GTMSessionFetcher *)fetcher; +- (void)fetcherDidCreateSession:(GTMSessionFetcher *)fetcher; +- (void)fetcherDidBeginFetching:(GTMSessionFetcher *)fetcher; +- (void)fetcherDidStop:(GTMSessionFetcher *)fetcher; + +- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request; +- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher; + +@property(atomic, assign) BOOL reuseSession; +- (GTM_NULLABLE NSURLSession *)session; +- (GTM_NULLABLE NSURLSession *)sessionForFetcherCreation; +- (GTM_NULLABLE id)sessionDelegate; +- (GTM_NULLABLE NSDate *)stoppedAllFetchersDate; + +// Methods for compatibility with the old GTMHTTPFetcher. +@property(readonly, strong, GTM_NULLABLE) NSOperationQueue *delegateQueue; + +@end // @protocol GTMSessionFetcherServiceProtocol + +#ifndef GTM_FETCHER_AUTHORIZATION_PROTOCOL +#define GTM_FETCHER_AUTHORIZATION_PROTOCOL 1 +@protocol GTMFetcherAuthorizationProtocol +@required +// This protocol allows us to call the authorizer without requiring its sources +// in this project. +- (void)authorizeRequest:(GTM_NULLABLE NSMutableURLRequest *)request + delegate:(id)delegate + didFinishSelector:(SEL)sel; + +- (void)stopAuthorization; + +- (void)stopAuthorizationForRequest:(NSURLRequest *)request; + +- (BOOL)isAuthorizingRequest:(NSURLRequest *)request; + +- (BOOL)isAuthorizedRequest:(NSURLRequest *)request; + +@property(strong, readonly, GTM_NULLABLE) NSString *userEmail; + +@optional + +// Indicate if authorization may be attempted. Even if this succeeds, +// authorization may fail if the user's permissions have been revoked. +@property(readonly) BOOL canAuthorize; + +// For development only, allow authorization of non-SSL requests, allowing +// transmission of the bearer token unencrypted. +@property(assign) BOOL shouldAuthorizeAllRequests; + +- (void)authorizeRequest:(GTM_NULLABLE NSMutableURLRequest *)request + completionHandler:(void (^)(NSError * GTM_NULLABLE_TYPE error))handler; + +#if GTM_USE_SESSION_FETCHER +@property (weak, GTM_NULLABLE) id fetcherService; +#else +@property (weak, GTM_NULLABLE) id fetcherService; +#endif + +- (BOOL)primeForRefresh; + +@end +#endif // GTM_FETCHER_AUTHORIZATION_PROTOCOL + +#if TARGET_OS_IPHONE +// A protocol for an alternative target for messages from GTMSessionFetcher to UIApplication. +// Set the target using +[GTMSessionFetcher setSubstituteUIApplication:] +@protocol GTMUIApplicationProtocol +- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(nullable NSString *)taskName + expirationHandler:(void(^ __nullable)(void))handler; +- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier; +@end +#endif + +#pragma mark - + +// GTMSessionFetcher objects are used for async retrieval of an http get or post +// +// See additional comments at the beginning of this file +@interface GTMSessionFetcher : NSObject + +// Create a fetcher +// +// fetcherWithRequest will return an autoreleased fetcher, but if +// the connection is successfully created, the connection should retain the +// fetcher for the life of the connection as well. So the caller doesn't have +// to retain the fetcher explicitly unless they want to be able to cancel it. ++ (instancetype)fetcherWithRequest:(GTM_NULLABLE NSURLRequest *)request; + +// Convenience methods that make a request, like +fetcherWithRequest ++ (instancetype)fetcherWithURL:(NSURL *)requestURL; ++ (instancetype)fetcherWithURLString:(NSString *)requestURLString; + +// Methods for creating fetchers to continue previous fetches. ++ (instancetype)fetcherWithDownloadResumeData:(NSData *)resumeData; ++ (GTM_NULLABLE instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier; + +// Returns an array of currently active fetchers for background sessions, +// both restarted and newly created ones. ++ (GTM_NSArrayOf(GTMSessionFetcher *) *)fetchersForBackgroundSessions; + +// Designated initializer. +// +// Applications should create fetchers with a "fetcherWith..." method on a fetcher +// service or a class method, not with this initializer. +// +// The configuration should typically be nil. Applications needing to customize +// the configuration may do so by setting the configurationBlock property. +- (instancetype)initWithRequest:(GTM_NULLABLE NSURLRequest *)request + configuration:(GTM_NULLABLE NSURLSessionConfiguration *)configuration; + +// The fetcher's request. This may not be set after beginFetch has been invoked. The request +// may change due to redirects. +@property(strong, GTM_NULLABLE) NSURLRequest *request; + +// Set a header field value on the request. Header field value changes will not +// affect a fetch after the fetch has begun. +- (void)setRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field; + +// The fetcher's request (deprecated.) +// +// Exposing a mutable object in the interface was convenient but a bad design decision due +// to thread-safety requirements. Clients should use the request property and +// setRequestValue:forHTTPHeaderField: instead. +@property(atomic, readonly, GTM_NULLABLE) NSMutableURLRequest *mutableRequest + GTMSESSION_DEPRECATE_ON_2016_SDKS("use 'request' or '-setRequestValue:forHTTPHeaderField:'"); + +// Data used for resuming a download task. +@property(atomic, readonly, GTM_NULLABLE) NSData *downloadResumeData; + +// The configuration; this must be set before the fetch begins. If no configuration is +// set or inherited from the fetcher service, then the fetcher uses an ephemeral config. +// +// NOTE: This property should typically be nil. Applications needing to customize +// the configuration should do so by setting the configurationBlock property. +// That allows the fetcher to pick an appropriate base configuration, with the +// application setting only the configuration properties it needs to customize. +@property(atomic, strong, GTM_NULLABLE) NSURLSessionConfiguration *configuration; + +// A block the client may use to customize the configuration used to create the session. +// +// This is called synchronously, either on the thread that begins the fetch or, during a retry, +// on the main thread. The configuration block may be called repeatedly if multiple fetchers are +// created. +// +// The configuration block is for modifying the NSURLSessionConfiguration only. +// DO NOT change any fetcher properties in the configuration block. Fetcher properties +// may be set in the fetcher service prior to fetcher creation, or on the fetcher prior +// to invoking beginFetch. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherConfigurationBlock configurationBlock; + +// A session is created as needed by the fetcher. A fetcher service object +// may maintain sessions for multiple fetches to the same host. +@property(atomic, strong, GTM_NULLABLE) NSURLSession *session; + +// The task in flight. +@property(atomic, readonly, GTM_NULLABLE) NSURLSessionTask *sessionTask; + +// The background session identifier. +@property(atomic, readonly, GTM_NULLABLE) NSString *sessionIdentifier; + +// Indicates a fetcher created to finish a background session task. +@property(atomic, readonly) BOOL wasCreatedFromBackgroundSession; + +// Additional user-supplied data to encode into the session identifier. Since session identifier +// length limits are unspecified, this should be kept small. Key names beginning with an underscore +// are reserved for use by the fetcher. +@property(atomic, strong, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSString *) *sessionUserInfo; + +// The human-readable description to be assigned to the task. +@property(atomic, copy, GTM_NULLABLE) NSString *taskDescription; + +// The priority assigned to the task, if any. Use NSURLSessionTaskPriorityLow, +// NSURLSessionTaskPriorityDefault, or NSURLSessionTaskPriorityHigh. +@property(atomic, assign) float taskPriority; + +// The fetcher encodes information used to resume a session in the session identifier. +// This method, intended for internal use returns the encoded information. The sessionUserInfo +// dictionary is stored as identifier metadata. +- (GTM_NULLABLE GTM_NSDictionaryOf(NSString *, NSString *) *)sessionIdentifierMetadata; + +#if TARGET_OS_IPHONE +// The app should pass to this method the completion handler passed in the app delegate method +// application:handleEventsForBackgroundURLSession:completionHandler: ++ (void)application:(UIApplication *)application + handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(GTMSessionFetcherSystemCompletionHandler)completionHandler; +#endif + +// Indicate that a newly created session should be a background session. +// A new session identifier will be created by the fetcher. +// +// Warning: The only thing background sessions are for is rare download +// of huge, batched files of data. And even just for those, there's a lot +// of pain and hackery needed to get transfers to actually happen reliably +// with background sessions. +// +// Don't try to upload or download in many background sessions, since the system +// will impose an exponentially increasing time penalty to prevent the app from +// getting too much background execution time. +// +// References: +// +// "Moving to Fewer, Larger Transfers" +// https://forums.developer.apple.com/thread/14853 +// +// "NSURLSession’s Resume Rate Limiter" +// https://forums.developer.apple.com/thread/14854 +// +// "Background Session Task state persistence" +// https://forums.developer.apple.com/thread/11554 +// +@property(assign) BOOL useBackgroundSession; + +// Indicates if the fetcher was started using a background session. +@property(atomic, readonly, getter=isUsingBackgroundSession) BOOL usingBackgroundSession; + +// Indicates if uploads should use an upload task. This is always set for file or stream-provider +// bodies, but may be set explicitly for NSData bodies. +@property(atomic, assign) BOOL useUploadTask; + +// Indicates that the fetcher is using a session that may be shared with other fetchers. +@property(atomic, readonly) BOOL canShareSession; + +// By default, the fetcher allows only secure (https) schemes unless this +// property is set, or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. +// +// For example, during debugging when fetching from a development server that lacks SSL support, +// this may be set to @[ @"http" ], or when the fetcher is used to retrieve local files, +// this may be set to @[ @"file" ]. +// +// This should be left as nil for release builds to avoid creating the opportunity for +// leaking private user behavior and data. If a server is providing insecure URLs +// for fetching by the client app, report the problem as server security & privacy bug. +// +// For builds with the iOS 9/OS X 10.11 and later SDKs, this property is required only when +// the app specifies NSAppTransportSecurity/NSAllowsArbitraryLoads in the main bundle's Info.plist. +@property(atomic, copy, GTM_NULLABLE) GTM_NSArrayOf(NSString *) *allowedInsecureSchemes; + +// By default, the fetcher prohibits localhost requests unless this property is set, +// or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. +// +// For localhost requests, the URL scheme is not checked when this property is set. +// +// For builds with the iOS 9/OS X 10.11 and later SDKs, this property is required only when +// the app specifies NSAppTransportSecurity/NSAllowsArbitraryLoads in the main bundle's Info.plist. +@property(atomic, assign) BOOL allowLocalhostRequest; + +// By default, the fetcher requires valid server certs. This may be bypassed +// temporarily for development against a test server with an invalid cert. +@property(atomic, assign) BOOL allowInvalidServerCertificates; + +// Cookie storage object for this fetcher. If nil, the fetcher will use a static cookie +// storage instance shared among fetchers. If this fetcher was created by a fetcher service +// object, it will be set to use the service object's cookie storage. See Cookies section above for +// the full discussion. +// +// Because as of Jan 2014 standalone instances of NSHTTPCookieStorage do not actually +// store any cookies (Radar 15735276) we use our own subclass, GTMSessionCookieStorage, +// to hold cookies in memory. +@property(atomic, strong, GTM_NULLABLE) NSHTTPCookieStorage *cookieStorage; + +// Setting the credential is optional; it is used if the connection receives +// an authentication challenge. +@property(atomic, strong, GTM_NULLABLE) NSURLCredential *credential; + +// Setting the proxy credential is optional; it is used if the connection +// receives an authentication challenge from a proxy. +@property(atomic, strong, GTM_NULLABLE) NSURLCredential *proxyCredential; + +// If body data, body file URL, or body stream provider is not set, then a GET request +// method is assumed. +@property(atomic, strong, GTM_NULLABLE) NSData *bodyData; + +// File to use as the request body. This forces use of an upload task. +@property(atomic, strong, GTM_NULLABLE) NSURL *bodyFileURL; + +// Length of body to send, expected or actual. +@property(atomic, readonly) int64_t bodyLength; + +// The body stream provider may be called repeatedly to provide a body. +// Setting a body stream provider forces use of an upload task. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherBodyStreamProvider bodyStreamProvider; + +// Object to add authorization to the request, if needed. +// +// This may not be changed once beginFetch has been invoked. +@property(atomic, strong, GTM_NULLABLE) id authorizer; + +// The service object that created and monitors this fetcher, if any. +@property(atomic, strong) id service; + +// The host, if any, used to classify this fetcher in the fetcher service. +@property(atomic, copy, GTM_NULLABLE) NSString *serviceHost; + +// The priority, if any, used for starting fetchers in the fetcher service. +// +// Lower values are higher priority; the default is 0, and values may +// be negative or positive. This priority affects only the start order of +// fetchers that are being delayed by a fetcher service when the running fetchers +// exceeds the service's maxRunningFetchersPerHost. A priority of NSIntegerMin will +// exempt this fetcher from delay. +@property(atomic, assign) NSInteger servicePriority; + +// The delegate's optional didReceiveResponse block may be used to inspect or alter +// the session task response. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherDidReceiveResponseBlock didReceiveResponseBlock; + +// The delegate's optional challenge block may be used to inspect or alter +// the session task challenge. +// +// If this block is not set, the fetcher's default behavior for the NSURLSessionTask +// didReceiveChallenge: delegate method is to use the fetcher's respondToChallenge: method +// which relies on the fetcher's credential and proxyCredential properties. +// +// Warning: This may be called repeatedly if the challenge fails. Check +// challenge.previousFailureCount to identify repeated invocations. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherChallengeBlock challengeBlock; + +// The delegate's optional willRedirect block may be used to inspect or alter +// the redirection. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherWillRedirectBlock willRedirectBlock; + +// The optional send progress block reports body bytes uploaded. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherSendProgressBlock sendProgressBlock; + +// The optional accumulate block may be set by clients wishing to accumulate data +// themselves rather than let the fetcher append each buffer to an NSData. +// +// When this is called with nil data (such as on redirect) the client +// should empty its accumulation buffer. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherAccumulateDataBlock accumulateDataBlock; + +// The optional received progress block may be used to monitor data +// received from a data task. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherReceivedProgressBlock receivedProgressBlock; + +// The delegate's optional downloadProgress block may be used to monitor download +// progress in writing to disk. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherDownloadProgressBlock downloadProgressBlock; + +// The delegate's optional willCacheURLResponse block may be used to alter the cached +// NSURLResponse. The user may prevent caching by passing nil to the block's response. +// +// This is called on the callback queue. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherWillCacheURLResponseBlock willCacheURLResponseBlock; + +// Enable retrying; see comments at the top of this file. Setting +// retryEnabled=YES resets the min and max retry intervals. +@property(atomic, assign, getter=isRetryEnabled) BOOL retryEnabled; + +// Retry block is optional for retries. +// +// If present, this block should call the response block with YES to cause a retry or NO to end the +// fetch. +// See comments at the top of this file. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherRetryBlock retryBlock; + +// Retry intervals must be strictly less than maxRetryInterval, else +// they will be limited to maxRetryInterval and no further retries will +// be attempted. Setting maxRetryInterval to 0.0 will reset it to the +// default value, 60 seconds for downloads and 600 seconds for uploads. +@property(atomic, assign) NSTimeInterval maxRetryInterval; + +// Starting retry interval. Setting minRetryInterval to 0.0 will reset it +// to a random value between 1.0 and 2.0 seconds. Clients should normally not +// set this except for unit testing. +@property(atomic, assign) NSTimeInterval minRetryInterval; + +// Multiplier used to increase the interval between retries, typically 2.0. +// Clients should not need to set this. +@property(atomic, assign) double retryFactor; + +// Number of retries attempted. +@property(atomic, readonly) NSUInteger retryCount; + +// Interval delay to precede next retry. +@property(atomic, readonly) NSTimeInterval nextRetryInterval; + +#if GTM_BACKGROUND_TASK_FETCHING +// Skip use of a UIBackgroundTask, thus requiring fetches to complete when the app is in the +// foreground. +// +// Targets should define GTM_BACKGROUND_TASK_FETCHING to 0 to avoid use of a UIBackgroundTask +// on iOS to allow fetches to complete in the background. This property is available when +// it's not practical to set the preprocessor define. +@property(atomic, assign) BOOL skipBackgroundTask; +#endif // GTM_BACKGROUND_TASK_FETCHING + +// Begin fetching the request +// +// The delegate may optionally implement the callback or pass nil for the selector or handler. +// +// The delegate and all callback blocks are retained between the beginFetch call until after the +// finish callback, or until the fetch is stopped. +// +// An error is passed to the callback for server statuses 300 or +// higher, with the status stored as the error object's code. +// +// finishedSEL has a signature like: +// - (void)fetcher:(GTMSessionFetcher *)fetcher +// finishedWithData:(NSData *)data +// error:(NSError *)error; +// +// If the application has specified a destinationFileURL or an accumulateDataBlock +// for the fetcher, the data parameter passed to the callback will be nil. + +- (void)beginFetchWithDelegate:(GTM_NULLABLE id)delegate + didFinishSelector:(GTM_NULLABLE SEL)finishedSEL; + +- (void)beginFetchWithCompletionHandler:(GTM_NULLABLE GTMSessionFetcherCompletionHandler)handler; + +// Returns YES if this fetcher is in the process of fetching a URL. +@property(atomic, readonly, getter=isFetching) BOOL fetching; + +// Cancel the fetch of the request that's currently in progress. The completion handler +// will not be called. +- (void)stopFetching; + +// A block to be called when the fetch completes. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherCompletionHandler completionHandler; + +// A block to be called if download resume data becomes available. +@property(atomic, strong, GTM_NULLABLE) void (^resumeDataBlock)(NSData *); + +// Return the status code from the server response. +@property(atomic, readonly) NSInteger statusCode; + +// Return the http headers from the response. +@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSString *) *responseHeaders; + +// The response, once it's been received. +@property(atomic, strong, readonly, GTM_NULLABLE) NSURLResponse *response; + +// Bytes downloaded so far. +@property(atomic, readonly) int64_t downloadedLength; + +// Buffer of currently-downloaded data, if available. +@property(atomic, readonly, strong, GTM_NULLABLE) NSData *downloadedData; + +// Local path to which the downloaded file will be moved. +// +// If a file already exists at the path, it will be overwritten. +// Will create the enclosing folders if they are not present. +@property(atomic, strong, GTM_NULLABLE) NSURL *destinationFileURL; + +// The time this fetcher originally began fetching. This is useful as a time +// barrier for ignoring irrelevant fetch notifications or callbacks. +@property(atomic, strong, readonly, GTM_NULLABLE) NSDate *initialBeginFetchDate; + +// userData is retained solely for the convenience of the client. +@property(atomic, strong, GTM_NULLABLE) id userData; + +// Stored property values are retained solely for the convenience of the client. +@property(atomic, copy, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, id) *properties; + +- (void)setProperty:(GTM_NULLABLE id)obj forKey:(NSString *)key; // Pass nil for obj to remove the property. +- (GTM_NULLABLE id)propertyForKey:(NSString *)key; + +- (void)addPropertiesFromDictionary:(GTM_NSDictionaryOf(NSString *, id) *)dict; + +// Comments are useful for logging, so are strongly recommended for each fetcher. +@property(atomic, copy, GTM_NULLABLE) NSString *comment; + +- (void)setCommentWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); + +// Log of request and response, if logging is enabled +@property(atomic, copy, GTM_NULLABLE) NSString *log; + +// Callbacks are run on this queue. If none is supplied, the main queue is used. +@property(atomic, strong, GTM_NULL_RESETTABLE) dispatch_queue_t callbackQueue; + +// The queue used internally by the session to invoke its delegate methods in the fetcher. +// +// Application callbacks are always called by the fetcher on the callbackQueue above, +// not on this queue. Apps should generally not change this queue. +// +// The default delegate queue is the main queue. +// +// This value is ignored after the session has been created, so this +// property should be set in the fetcher service rather in the fetcher as it applies +// to a shared session. +@property(atomic, strong, GTM_NULL_RESETTABLE) NSOperationQueue *sessionDelegateQueue; + +// Spin the run loop or sleep the thread, discarding events, until the fetch has completed. +// +// This is only for use in testing or in tools without a user interface. +// +// Note: Synchronous fetches should never be used by shipping apps; they are +// sufficient reason for rejection from the app store. +// +// Returns NO if timed out. +- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds; + +// Test block is optional for testing. +// +// If present, this block will cause the fetcher to skip starting the session, and instead +// use the test block response values when calling the completion handler and delegate code. +// +// Test code can set this on the fetcher or on the fetcher service. For testing libraries +// that use a fetcher without exposing either the fetcher or the fetcher service, the global +// method setGlobalTestBlock: will set the block for all fetchers that do not have a test +// block set. +// +// The test code can pass nil for all response parameters to indicate that the fetch +// should proceed. +// +// Applications can exclude test block support by setting GTM_DISABLE_FETCHER_TEST_BLOCK. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherTestBlock testBlock; + ++ (void)setGlobalTestBlock:(GTM_NULLABLE GTMSessionFetcherTestBlock)block; + +// When using the testBlock, |testBlockAccumulateDataChunkCount| is the desired number of chunks to +// divide the response data into if the client has streaming enabled. The data will be divided up to +// |testBlockAccumulateDataChunkCount| chunks; however, the exact amount may vary depending on the +// size of the response data (e.g. a 1-byte response can only be divided into one chunk). +@property(atomic, readwrite) NSUInteger testBlockAccumulateDataChunkCount; + +#if TARGET_OS_IPHONE +// For testing or to override UIApplication invocations, apps may specify an alternative +// target for messages to UIApplication. ++ (void)setSubstituteUIApplication:(nullable id)substituteUIApplication; ++ (nullable id)substituteUIApplication; +#endif // TARGET_OS_IPHONE + +// Exposed for testing. ++ (GTMSessionCookieStorage *)staticCookieStorage; ++ (BOOL)appAllowsInsecureRequests; + +#if STRIP_GTM_FETCH_LOGGING +// If logging is stripped, provide a stub for the main method +// for controlling logging. ++ (void)setLoggingEnabled:(BOOL)flag; ++ (BOOL)isLoggingEnabled; + +#else + +// These methods let an application log specific body text, such as the text description of a binary +// request or response. The application should set the fetcher to defer response body logging until +// the response has been received and the log response body has been set by the app. For example: +// +// fetcher.logRequestBody = [binaryObject stringDescription]; +// fetcher.deferResponseBodyLogging = YES; +// [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { +// if (error == nil) { +// fetcher.logResponseBody = [[[MyThing alloc] initWithData:data] stringDescription]; +// } +// fetcher.deferResponseBodyLogging = NO; +// }]; + +@property(atomic, copy, GTM_NULLABLE) NSString *logRequestBody; +@property(atomic, assign) BOOL deferResponseBodyLogging; +@property(atomic, copy, GTM_NULLABLE) NSString *logResponseBody; + +// Internal logging support. +@property(atomic, readonly) NSData *loggedStreamData; +@property(atomic, assign) BOOL hasLoggedError; +@property(atomic, strong, GTM_NULLABLE) NSURL *redirectedFromURL; +- (void)appendLoggedStreamData:(NSData *)dataToAdd; +- (void)clearLoggedStreamData; + +#endif // STRIP_GTM_FETCH_LOGGING + +@end + +@interface GTMSessionFetcher (BackwardsCompatibilityOnly) +// Clients using GTMSessionFetcher should set the cookie storage explicitly themselves. +// This method is just for compatibility with the old GTMHTTPFetcher class. +- (void)setCookieStorageMethod:(NSInteger)method; +@end + +// Until we can just instantiate NSHTTPCookieStorage for local use, we'll +// implement all the public methods ourselves. This stores cookies only in +// memory. Additional methods are provided for testing. +// +// iOS 9/OS X 10.11 added +[NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier:] +// which may also be used to create cookie storage. +@interface GTMSessionCookieStorage : NSHTTPCookieStorage + +// Add the array off cookies to the storage, replacing duplicates. +// Also removes expired cookies from the storage. +- (void)setCookies:(GTM_NULLABLE GTM_NSArrayOf(NSHTTPCookie *) *)cookies; + +- (void)removeAllCookies; + +@end + +// Macros to monitor synchronization blocks in debug builds. +// These report problems using GTMSessionCheckDebug. +// +// GTMSessionMonitorSynchronized Start monitoring a top-level-only +// @sync scope. +// GTMSessionMonitorRecursiveSynchronized Start monitoring a top-level or +// recursive @sync scope. +// GTMSessionCheckSynchronized Verify that the current execution +// is inside a @sync scope. +// GTMSessionCheckNotSynchronized Verify that the current execution +// is not inside a @sync scope. +// +// Example usage: +// +// - (void)myExternalMethod { +// @synchronized(self) { +// GTMSessionMonitorSynchronized(self) +// +// - (void)myInternalMethod { +// GTMSessionCheckSynchronized(self); +// +// - (void)callMyCallbacks { +// GTMSessionCheckNotSynchronized(self); +// +// GTMSessionCheckNotSynchronized is available for verifying the code isn't +// in a deadlockable @sync state when posting notifications and invoking +// callbacks. Don't use GTMSessionCheckNotSynchronized immediately before a +// @sync scope; the normal recursiveness check of GTMSessionMonitorSynchronized +// can catch those. + +#ifdef __OBJC__ +#if DEBUG + #define __GTMSessionMonitorSynchronizedVariableInner(varname, counter) \ + varname ## counter + #define __GTMSessionMonitorSynchronizedVariable(varname, counter) \ + __GTMSessionMonitorSynchronizedVariableInner(varname, counter) + + #define GTMSessionMonitorSynchronized(obj) \ + NS_VALID_UNTIL_END_OF_SCOPE id \ + __GTMSessionMonitorSynchronizedVariable(__monitor, __COUNTER__) = \ + [[GTMSessionSyncMonitorInternal alloc] initWithSynchronizationObject:obj \ + allowRecursive:NO \ + functionName:__func__] + + #define GTMSessionMonitorRecursiveSynchronized(obj) \ + NS_VALID_UNTIL_END_OF_SCOPE id \ + __GTMSessionMonitorSynchronizedVariable(__monitor, __COUNTER__) = \ + [[GTMSessionSyncMonitorInternal alloc] initWithSynchronizationObject:obj \ + allowRecursive:YES \ + functionName:__func__] + + #define GTMSessionCheckSynchronized(obj) { \ + GTMSESSION_ASSERT_DEBUG( \ + [GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ + @"GTMSessionCheckSynchronized(" #obj ") failed: not sync'd" \ + @" on " #obj " in %s. Call stack:\n%@", \ + __func__, [NSThread callStackSymbols]); \ + } + + #define GTMSessionCheckNotSynchronized(obj) { \ + GTMSESSION_ASSERT_DEBUG( \ + ![GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ + @"GTMSessionCheckNotSynchronized(" #obj ") failed: was sync'd" \ + @" on " #obj " in %s by %@. Call stack:\n%@", __func__, \ + [GTMSessionSyncMonitorInternal functionsHoldingSynchronizationOnObject:obj], \ + [NSThread callStackSymbols]); \ + } + +// GTMSessionSyncMonitorInternal is a private class that keeps track of the +// beginning and end of synchronized scopes. +// +// This class should not be used directly, but only via the +// GTMSessionMonitorSynchronized macro. +@interface GTMSessionSyncMonitorInternal : NSObject +- (instancetype)initWithSynchronizationObject:(id)object + allowRecursive:(BOOL)allowRecursive + functionName:(const char *)functionName; +// Return the names of the functions that hold sync on the object, or nil if none. ++ (NSArray *)functionsHoldingSynchronizationOnObject:(id)object; +@end + +#else + #define GTMSessionMonitorSynchronized(obj) do { } while (0) + #define GTMSessionMonitorRecursiveSynchronized(obj) do { } while (0) + #define GTMSessionCheckSynchronized(obj) do { } while (0) + #define GTMSessionCheckNotSynchronized(obj) do { } while (0) +#endif // !DEBUG +#endif // __OBJC__ + + +GTM_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m new file mode 100644 index 000000000..e3f52d873 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcher.m @@ -0,0 +1,4549 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMSessionFetcher.h" + +#import + +#ifndef STRIP_GTM_FETCH_LOGGING + #error GTMSessionFetcher headers should have defaulted this if it wasn't already defined. +#endif + +GTM_ASSUME_NONNULL_BEGIN + +NSString *const kGTMSessionFetcherStartedNotification = @"kGTMSessionFetcherStartedNotification"; +NSString *const kGTMSessionFetcherStoppedNotification = @"kGTMSessionFetcherStoppedNotification"; +NSString *const kGTMSessionFetcherRetryDelayStartedNotification = @"kGTMSessionFetcherRetryDelayStartedNotification"; +NSString *const kGTMSessionFetcherRetryDelayStoppedNotification = @"kGTMSessionFetcherRetryDelayStoppedNotification"; + +NSString *const kGTMSessionFetcherCompletionInvokedNotification = @"kGTMSessionFetcherCompletionInvokedNotification"; +NSString *const kGTMSessionFetcherCompletionDataKey = @"data"; +NSString *const kGTMSessionFetcherCompletionErrorKey = @"error"; + +NSString *const kGTMSessionFetcherErrorDomain = @"com.google.GTMSessionFetcher"; +NSString *const kGTMSessionFetcherStatusDomain = @"com.google.HTTPStatus"; +NSString *const kGTMSessionFetcherStatusDataKey = @"data"; // data returned with a kGTMSessionFetcherStatusDomain error + +NSString *const kGTMSessionFetcherNumberOfRetriesDoneKey = @"kGTMSessionFetcherNumberOfRetriesDoneKey"; +NSString *const kGTMSessionFetcherElapsedIntervalWithRetriesKey = @"kGTMSessionFetcherElapsedIntervalWithRetriesKey"; + +static NSString *const kGTMSessionIdentifierPrefix = @"com.google.GTMSessionFetcher"; +static NSString *const kGTMSessionIdentifierDestinationFileURLMetadataKey = @"_destURL"; +static NSString *const kGTMSessionIdentifierBodyFileURLMetadataKey = @"_bodyURL"; + +// The default max retry interview is 10 minutes for uploads (POST/PUT/PATCH), +// 1 minute for downloads. +static const NSTimeInterval kUnsetMaxRetryInterval = -1.0; +static const NSTimeInterval kDefaultMaxDownloadRetryInterval = 60.0; +static const NSTimeInterval kDefaultMaxUploadRetryInterval = 60.0 * 10.; + +#ifdef GTMSESSION_PERSISTED_DESTINATION_KEY +// Projects using unique class names should also define a unique persisted destination key. +static NSString * const kGTMSessionFetcherPersistedDestinationKey = + GTMSESSION_PERSISTED_DESTINATION_KEY; +#else +static NSString * const kGTMSessionFetcherPersistedDestinationKey = + @"com.google.GTMSessionFetcher.downloads"; +#endif + +GTM_ASSUME_NONNULL_END + +// +// GTMSessionFetcher +// + +#if 0 +#define GTM_LOG_BACKGROUND_SESSION(...) GTMSESSION_LOG_DEBUG(__VA_ARGS__) +#else +#define GTM_LOG_BACKGROUND_SESSION(...) +#endif + +#ifndef GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY + #if (TARGET_OS_TV \ + || TARGET_OS_WATCH \ + || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0)) + #define GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY 1 + #endif +#endif + +@interface GTMSessionFetcher () + +@property(atomic, strong, readwrite, GTM_NULLABLE) NSData *downloadedData; +@property(atomic, strong, readwrite, GTM_NULLABLE) NSData *downloadResumeData; + +#if GTM_BACKGROUND_TASK_FETCHING +// Should always be accessed within an @synchranized(self). +@property(assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskIdentifier; +#endif + +@property(atomic, readwrite, getter=isUsingBackgroundSession) BOOL usingBackgroundSession; + +@end + +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMSessionFetcher (GTMSessionFetcherLoggingInternal) +- (void)logFetchWithError:(NSError *)error; +- (void)logNowWithError:(GTM_NULLABLE NSError *)error; +- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream; +- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: + (GTMSessionFetcherBodyStreamProvider)streamProvider; +@end +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +GTM_ASSUME_NONNULL_BEGIN + +static NSTimeInterval InitialMinRetryInterval(void) { + return 1.0 + ((double)(arc4random_uniform(0x0FFFF)) / (double) 0x0FFFF); +} + +static BOOL IsLocalhost(NSString * GTM_NULLABLE_TYPE host) { + // We check if there's host, and then make the comparisons. + if (host == nil) return NO; + return ([host caseInsensitiveCompare:@"localhost"] == NSOrderedSame + || [host isEqual:@"::1"] + || [host isEqual:@"127.0.0.1"]); +} + +static GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE gGlobalTestBlock; + +@implementation GTMSessionFetcher { + NSMutableURLRequest *_request; // after beginFetch, changed only in delegate callbacks + BOOL _useUploadTask; // immutable after beginFetch + NSURL *_bodyFileURL; // immutable after beginFetch + GTMSessionFetcherBodyStreamProvider _bodyStreamProvider; // immutable after beginFetch + NSURLSession *_session; + BOOL _shouldInvalidateSession; // immutable after beginFetch + NSURLSession *_sessionNeedingInvalidation; + NSURLSessionConfiguration *_configuration; + NSURLSessionTask *_sessionTask; + NSString *_taskDescription; + float _taskPriority; + NSURLResponse *_response; + NSString *_sessionIdentifier; + BOOL _wasCreatedFromBackgroundSession; + BOOL _didCreateSessionIdentifier; + NSString *_sessionIdentifierUUID; + BOOL _userRequestedBackgroundSession; + BOOL _usingBackgroundSession; + NSMutableData * GTM_NULLABLE_TYPE _downloadedData; + NSError *_downloadFinishedError; + NSData *_downloadResumeData; // immutable after construction + NSURL *_destinationFileURL; + int64_t _downloadedLength; + NSURLCredential *_credential; // username & password + NSURLCredential *_proxyCredential; // credential supplied to proxy servers + BOOL _isStopNotificationNeeded; // set when start notification has been sent + BOOL _isUsingTestBlock; // set when a test block was provided (remains set when the block is released) + id _userData; // retained, if set by caller + NSMutableDictionary *_properties; // more data retained for caller + dispatch_queue_t _callbackQueue; + dispatch_group_t _callbackGroup; // read-only after creation + NSOperationQueue *_delegateQueue; // immutable after beginFetch + + id _authorizer; // immutable after beginFetch + + // The service object that created and monitors this fetcher, if any. + id _service; // immutable; set by the fetcher service upon creation + NSString *_serviceHost; + NSInteger _servicePriority; // immutable after beginFetch + BOOL _hasStoppedFetching; // counterpart to _initialBeginFetchDate + BOOL _userStoppedFetching; + + BOOL _isRetryEnabled; // user wants auto-retry + NSTimer *_retryTimer; + NSUInteger _retryCount; + NSTimeInterval _maxRetryInterval; // default 60 (download) or 600 (upload) seconds + NSTimeInterval _minRetryInterval; // random between 1 and 2 seconds + NSTimeInterval _retryFactor; // default interval multiplier is 2 + NSTimeInterval _lastRetryInterval; + NSDate *_initialBeginFetchDate; // date that beginFetch was first invoked; immutable after initial beginFetch + NSDate *_initialRequestDate; // date of first request to the target server (ignoring auth) + BOOL _hasAttemptedAuthRefresh; // accessed only in shouldRetryNowForStatus: + + NSString *_comment; // comment for log + NSString *_log; +#if !STRIP_GTM_FETCH_LOGGING + NSMutableData *_loggedStreamData; + NSURL *_redirectedFromURL; + NSString *_logRequestBody; + NSString *_logResponseBody; + BOOL _hasLoggedError; + BOOL _deferResponseBodyLogging; +#endif +} + +#if !GTMSESSION_UNIT_TESTING ++ (void)load { + [self fetchersForBackgroundSessions]; +} +#endif + ++ (instancetype)fetcherWithRequest:(GTM_NULLABLE NSURLRequest *)request { + return [[self alloc] initWithRequest:request configuration:nil]; +} + ++ (instancetype)fetcherWithURL:(NSURL *)requestURL { + return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; +} + ++ (instancetype)fetcherWithURLString:(NSString *)requestURLString { + return [self fetcherWithURL:(NSURL *)[NSURL URLWithString:requestURLString]]; +} + ++ (instancetype)fetcherWithDownloadResumeData:(NSData *)resumeData { + GTMSessionFetcher *fetcher = [self fetcherWithRequest:nil]; + fetcher.comment = @"Resuming download"; + fetcher.downloadResumeData = resumeData; + return fetcher; +} + ++ (GTM_NULLABLE instancetype)fetcherWithSessionIdentifier:(NSString *)sessionIdentifier { + GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); + NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; + GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; + if (!fetcher && [sessionIdentifier hasPrefix:kGTMSessionIdentifierPrefix]) { + fetcher = [self fetcherWithRequest:nil]; + [fetcher setSessionIdentifier:sessionIdentifier]; + [sessionIdentifierToFetcherMap setObject:fetcher forKey:sessionIdentifier]; + fetcher->_wasCreatedFromBackgroundSession = YES; + [fetcher setCommentWithFormat:@"Resuming %@", + fetcher && fetcher->_sessionIdentifierUUID ? fetcher->_sessionIdentifierUUID : @"?"]; + } + return fetcher; +} + ++ (NSMapTable *)sessionIdentifierToFetcherMap { + // TODO: What if a service is involved in creating the fetcher? Currently, when re-creating + // fetchers, if a service was involved, it is not re-created. Should the service maintain a map? + static NSMapTable *gSessionIdentifierToFetcherMap = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gSessionIdentifierToFetcherMap = [NSMapTable strongToWeakObjectsMapTable]; + }); + return gSessionIdentifierToFetcherMap; +} + +#if !GTM_ALLOW_INSECURE_REQUESTS ++ (BOOL)appAllowsInsecureRequests { + // If the main bundle Info.plist key NSAppTransportSecurity is present, and it specifies + // NSAllowsArbitraryLoads, then we need to explicitly enforce secure schemes. +#if GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY + static BOOL allowsInsecureRequests; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *mainBundle = [NSBundle mainBundle]; + NSDictionary *appTransportSecurity = + [mainBundle objectForInfoDictionaryKey:@"NSAppTransportSecurity"]; + allowsInsecureRequests = + [[appTransportSecurity objectForKey:@"NSAllowsArbitraryLoads"] boolValue]; + }); + return allowsInsecureRequests; +#else + // For builds targeting iOS 8 or 10.10 and earlier, we want to require fetcher + // security checks. + return YES; +#endif // GTM_TARGET_SUPPORTS_APP_TRANSPORT_SECURITY +} +#else // GTM_ALLOW_INSECURE_REQUESTS ++ (BOOL)appAllowsInsecureRequests { + return YES; +} +#endif // !GTM_ALLOW_INSECURE_REQUESTS + + +- (instancetype)init { + return [self initWithRequest:nil configuration:nil]; +} + +- (instancetype)initWithRequest:(NSURLRequest *)request { + return [self initWithRequest:request configuration:nil]; +} + +- (instancetype)initWithRequest:(GTM_NULLABLE NSURLRequest *)request + configuration:(GTM_NULLABLE NSURLSessionConfiguration *)configuration { + self = [super init]; + if (self) { + if (![NSURLSession class]) { + Class oldFetcherClass = NSClassFromString(@"GTMHTTPFetcher"); + if (oldFetcherClass && request) { + self = [[oldFetcherClass alloc] initWithRequest:(NSURLRequest *)request]; + } else { + self = nil; + } + return self; + } +#if GTM_BACKGROUND_TASK_FETCHING + _backgroundTaskIdentifier = UIBackgroundTaskInvalid; +#endif + _request = [request mutableCopy]; + _configuration = configuration; + + NSData *bodyData = request.HTTPBody; + if (bodyData) { + _bodyLength = (int64_t)bodyData.length; + } else { + _bodyLength = NSURLSessionTransferSizeUnknown; + } + + _callbackQueue = dispatch_get_main_queue(); + _callbackGroup = dispatch_group_create(); + _delegateQueue = [NSOperationQueue mainQueue]; + + _minRetryInterval = InitialMinRetryInterval(); + _maxRetryInterval = kUnsetMaxRetryInterval; + + _taskPriority = -1.0f; // Valid values if set are 0.0...1.0. + + _testBlockAccumulateDataChunkCount = 1; + +#if !STRIP_GTM_FETCH_LOGGING + // Encourage developers to set the comment property or use + // setCommentWithFormat: by providing a default string. + _comment = @"(No fetcher comment set)"; +#endif + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + // disallow use of fetchers in a copy property + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (NSString *)description { + NSString *requestStr = self.request.URL.description; + if (requestStr.length == 0) { + if (self.downloadResumeData.length > 0) { + requestStr = @""; + } else if (_wasCreatedFromBackgroundSession) { + requestStr = @""; + } else { + requestStr = @""; + } + } + return [NSString stringWithFormat:@"%@ %p (%@)", [self class], self, requestStr]; +} + +- (void)dealloc { + GTMSESSION_ASSERT_DEBUG(!_isStopNotificationNeeded, + @"unbalanced fetcher notification for %@", _request.URL); + [self forgetSessionIdentifierForFetcherWithoutSyncCheck]; + + // Note: if a session task or a retry timer was pending, then this instance + // would be retained by those so it wouldn't be getting dealloc'd, + // hence we don't need to stopFetch here +} + +#pragma mark - + +// Begin fetching the URL (or begin a retry fetch). The delegate is retained +// for the duration of the fetch connection. + +- (void)beginFetchWithCompletionHandler:(GTM_NULLABLE GTMSessionFetcherCompletionHandler)handler { + GTMSessionCheckNotSynchronized(self); + + _completionHandler = [handler copy]; + + // The user may have called setDelegate: earlier if they want to use other + // delegate-style callbacks during the fetch; otherwise, the delegate is nil, + // which is fine. + [self beginFetchMayDelay:YES mayAuthorize:YES]; +} + +- (GTMSessionFetcherCompletionHandler)completionHandlerWithTarget:(GTM_NULLABLE_TYPE id)target + didFinishSelector:(GTM_NULLABLE_TYPE SEL)finishedSelector { + GTMSessionFetcherAssertValidSelector(target, finishedSelector, @encode(GTMSessionFetcher *), + @encode(NSData *), @encode(NSError *), 0); + GTMSessionFetcherCompletionHandler completionHandler = ^(NSData *data, NSError *error) { + if (target && finishedSelector) { + id selfArg = self; // Placate ARC. + NSMethodSignature *sig = [target methodSignatureForSelector:finishedSelector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setSelector:(SEL)finishedSelector]; + [invocation setTarget:target]; + [invocation setArgument:&selfArg atIndex:2]; + [invocation setArgument:&data atIndex:3]; + [invocation setArgument:&error atIndex:4]; + [invocation invoke]; + } + }; + return completionHandler; +} + +- (void)beginFetchWithDelegate:(GTM_NULLABLE_TYPE id)target + didFinishSelector:(GTM_NULLABLE_TYPE SEL)finishedSelector { + GTMSessionCheckNotSynchronized(self); + + GTMSessionFetcherCompletionHandler handler = [self completionHandlerWithTarget:target + didFinishSelector:finishedSelector]; + [self beginFetchWithCompletionHandler:handler]; +} + +- (void)beginFetchMayDelay:(BOOL)mayDelay + mayAuthorize:(BOOL)mayAuthorize { + // This is the internal entry point for re-starting fetches. + GTMSessionCheckNotSynchronized(self); + + NSMutableURLRequest *fetchRequest = _request; // The request property is now externally immutable. + NSURL *fetchRequestURL = fetchRequest.URL; + NSString *priorSessionIdentifier = self.sessionIdentifier; + + // A utility block for creating error objects when we fail to start the fetch. + NSError *(^beginFailureError)(NSInteger) = ^(NSInteger code){ + NSString *urlString = fetchRequestURL.absoluteString; + NSDictionary *userInfo = @{ + NSURLErrorFailingURLStringErrorKey : (urlString ? urlString : @"(missing URL)") + }; + return [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:code + userInfo:userInfo]; + }; + + // Catch delegate queue maxConcurrentOperationCount values other than 1, particularly + // NSOperationQueueDefaultMaxConcurrentOperationCount (-1), to avoid the additional complexity + // of simultaneous or out-of-order delegate callbacks. + GTMSESSION_ASSERT_DEBUG(_delegateQueue.maxConcurrentOperationCount == 1, + @"delegate queue %@ should support one concurrent operation, not %zd", + _delegateQueue.name, _delegateQueue.maxConcurrentOperationCount); + + if (!_initialBeginFetchDate) { + // This ivar is set only here on the initial beginFetch so need not be synchronized. + _initialBeginFetchDate = [[NSDate alloc] init]; + } + + if (self.sessionTask != nil) { + // If cached fetcher returned through fetcherWithSessionIdentifier:, then it's + // already begun, but don't consider this a failure, since the user need not know this. + if (self.sessionIdentifier != nil) { + return; + } + GTMSESSION_ASSERT_DEBUG(NO, @"Fetch object %@ being reused; this should never happen", self); + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorDownloadFailed)]; + return; + } + + if (fetchRequestURL == nil && !_downloadResumeData && !priorSessionIdentifier) { + GTMSESSION_ASSERT_DEBUG(NO, @"Beginning a fetch requires a request with a URL"); + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorDownloadFailed)]; + return; + } + + // We'll respect the user's request for a background session (unless this is + // an upload fetcher, which does its initial request foreground.) + self.usingBackgroundSession = self.useBackgroundSession && [self canFetchWithBackgroundSession]; + + NSURL *bodyFileURL = self.bodyFileURL; + if (bodyFileURL) { + NSError *fileCheckError; + if (![bodyFileURL checkResourceIsReachableAndReturnError:&fileCheckError]) { + // This assert fires when the file being uploaded no longer exists once + // the fetcher is ready to start the upload. + GTMSESSION_ASSERT_DEBUG_OR_LOG(0, @"Body file is unreachable: %@\n %@", + bodyFileURL.path, fileCheckError); + [self failToBeginFetchWithError:fileCheckError]; + return; + } + } + + NSString *requestScheme = fetchRequestURL.scheme; + BOOL isDataRequest = [requestScheme isEqual:@"data"]; + if (isDataRequest) { + // NSURLSession does not support data URLs in background sessions. +#if DEBUG + if (priorSessionIdentifier || self.sessionIdentifier) { + GTMSESSION_LOG_DEBUG(@"Converting background to foreground session for %@", + fetchRequest); + } +#endif + [self setSessionIdentifierInternal:nil]; + self.useBackgroundSession = NO; + } + +#if GTM_ALLOW_INSECURE_REQUESTS + BOOL shouldCheckSecurity = NO; +#else + BOOL shouldCheckSecurity = (fetchRequestURL != nil + && !isDataRequest + && [[self class] appAllowsInsecureRequests]); +#endif + + if (shouldCheckSecurity) { + // Allow https only for requests, unless overridden by the client. + // + // Non-https requests may too easily be snooped, so we disallow them by default. + // + // file: and data: schemes are usually safe if they are hardcoded in the client or provided + // by a trusted source, but since it's fairly rare to need them, it's safest to make clients + // explicitly whitelist them. + BOOL isSecure = + requestScheme != nil && [requestScheme caseInsensitiveCompare:@"https"] == NSOrderedSame; + if (!isSecure) { + BOOL allowRequest = NO; + NSString *host = fetchRequestURL.host; + + // Check schemes first. A file scheme request may be allowed here, or as a localhost request. + for (NSString *allowedScheme in _allowedInsecureSchemes) { + if (requestScheme != nil && + [requestScheme caseInsensitiveCompare:allowedScheme] == NSOrderedSame) { + allowRequest = YES; + break; + } + } + if (!allowRequest) { + // Check for localhost requests. Security checks only occur for non-https requests, so + // this check won't happen for an https request to localhost. + BOOL isLocalhostRequest = (host.length == 0 && [fetchRequestURL isFileURL]) || IsLocalhost(host); + if (isLocalhostRequest) { + if (self.allowLocalhostRequest) { + allowRequest = YES; + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"Fetch request for localhost but fetcher" + @" allowLocalhostRequest is not set: %@", fetchRequestURL); + } + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"Insecure fetch request has a scheme (%@)" + @" not found in fetcher allowedInsecureSchemes (%@): %@", + requestScheme, _allowedInsecureSchemes ?: @" @[] ", fetchRequestURL); + } + } + + if (!allowRequest) { +#if !DEBUG + NSLog(@"Insecure fetch disallowed for %@", fetchRequestURL.description ?: @"nil request URL"); +#endif + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorInsecureRequest)]; + return; + } + } // !isSecure + } // (requestURL != nil) && !isDataRequest + + if (self.cookieStorage == nil) { + self.cookieStorage = [[self class] staticCookieStorage]; + } + + BOOL isRecreatingSession = (self.sessionIdentifier != nil) && (fetchRequest == nil); + + self.canShareSession = !isRecreatingSession && !self.usingBackgroundSession; + + if (!self.session && self.canShareSession) { + self.session = [_service sessionForFetcherCreation]; + // If _session is nil, then the service's session creation semaphore will block + // until this fetcher invokes fetcherDidCreateSession: below, so this *must* invoke + // that method, even if the session fails to be created. + } + + if (!self.session) { + // Create a session. + if (!_configuration) { + if (priorSessionIdentifier || self.usingBackgroundSession) { + NSString *sessionIdentifier = priorSessionIdentifier; + if (!sessionIdentifier) { + sessionIdentifier = [self createSessionIdentifierWithMetadata:nil]; + } + NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIdentifierToFetcherMap]; + [sessionIdentifierToFetcherMap setObject:self forKey:self.sessionIdentifier]; + +#if (TARGET_OS_TV \ + || TARGET_OS_WATCH \ + || (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)) + // iOS 8/10.10 builds require the new backgroundSessionConfiguration method name. + _configuration = + [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionIdentifier]; +#elif (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0) + // Do a runtime check to avoid a deprecation warning about using + // +backgroundSessionConfiguration: on iOS 8. + if ([NSURLSessionConfiguration respondsToSelector:@selector(backgroundSessionConfigurationWithIdentifier:)]) { + // Running on iOS 8+/OS X 10.10+. + _configuration = + [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionIdentifier]; + } else { + // Running on iOS 7/OS X 10.9. + _configuration = + [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier]; + } +#else + // Building with an SDK earlier than iOS 8/OS X 10.10. + _configuration = + [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier]; +#endif + self.usingBackgroundSession = YES; + self.canShareSession = NO; + } else { + _configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + } +#if !GTM_ALLOW_INSECURE_REQUESTS + _configuration.TLSMinimumSupportedProtocol = kTLSProtocol12; +#endif + } // !_configuration + _configuration.HTTPCookieStorage = self.cookieStorage; + + if (_configurationBlock) { + _configurationBlock(self, _configuration); + } + + id delegate = [_service sessionDelegate]; + if (!delegate || !self.canShareSession) { + delegate = self; + } + self.session = [NSURLSession sessionWithConfiguration:_configuration + delegate:delegate + delegateQueue:self.sessionDelegateQueue]; + GTMSESSION_ASSERT_DEBUG(self.session, @"Couldn't create session"); + + // Tell the service about the session created by this fetcher. This also signals the + // service's semaphore to allow other fetchers to request this session. + [_service fetcherDidCreateSession:self]; + + // If this assertion fires, the client probably tried to use a session identifier that was + // already used. The solution is to make the client use a unique identifier (or better yet let + // the session fetcher assign the identifier). + GTMSESSION_ASSERT_DEBUG(self.session.delegate == delegate, @"Couldn't assign delegate."); + + if (self.session) { + BOOL isUsingSharedDelegate = (delegate != self); + if (!isUsingSharedDelegate) { + _shouldInvalidateSession = YES; + } + } + } + + if (isRecreatingSession) { + _shouldInvalidateSession = YES; + + // Let's make sure there are tasks still running or if not that we get a callback from a + // completed one; otherwise, we assume the tasks failed. + // This is the observed behavior perhaps 25% of the time within the Simulator running 7.0.3 on + // exiting the app after starting an upload and relaunching the app if we manage to relaunch + // after the task has completed, but before the system relaunches us in the background. + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, + NSArray *downloadTasks) { + if (dataTasks.count == 0 && uploadTasks.count == 0 && downloadTasks.count == 0) { + double const kDelayInSeconds = 1.0; // We should get progress indication or completion soon + dispatch_time_t checkForFeedbackDelay = + dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kDelayInSeconds * NSEC_PER_SEC)); + dispatch_after(checkForFeedbackDelay, dispatch_get_main_queue(), ^{ + if (!self.sessionTask && !fetchRequest) { + // If our task and/or request haven't been restored, then we assume task feedback lost. + [self removePersistedBackgroundSessionFromDefaults]; + NSError *sessionError = + [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:GTMSessionFetcherErrorBackgroundFetchFailed + userInfo:nil]; + [self failToBeginFetchWithError:sessionError]; + } + }); + } + }]; + return; + } + + self.downloadedData = nil; + self.downloadedLength = 0; + + if (_servicePriority == NSIntegerMin) { + mayDelay = NO; + } + if (mayDelay && _service) { + BOOL shouldFetchNow = [_service fetcherShouldBeginFetching:self]; + if (!shouldFetchNow) { + // The fetch is deferred, but will happen later. + // + // If this session is held by the fetcher service, clear the session now so that we don't + // assume it's still valid after the fetcher is restarted. + if (self.canShareSession) { + self.session = nil; + } + return; + } + } + + NSString *effectiveHTTPMethod = [fetchRequest valueForHTTPHeaderField:@"X-HTTP-Method-Override"]; + if (effectiveHTTPMethod == nil) { + effectiveHTTPMethod = fetchRequest.HTTPMethod; + } + BOOL isEffectiveHTTPGet = (effectiveHTTPMethod == nil + || [effectiveHTTPMethod isEqual:@"GET"]); + + BOOL needsUploadTask = (self.useUploadTask || self.bodyFileURL || self.bodyStreamProvider); + if (_bodyData || self.bodyStreamProvider || fetchRequest.HTTPBodyStream) { + if (isEffectiveHTTPGet) { + fetchRequest.HTTPMethod = @"POST"; + isEffectiveHTTPGet = NO; + } + + if (_bodyData) { + if (!needsUploadTask) { + fetchRequest.HTTPBody = _bodyData; + } +#if !STRIP_GTM_FETCH_LOGGING + } else if (fetchRequest.HTTPBodyStream) { + if ([self respondsToSelector:@selector(loggedInputStreamForInputStream:)]) { + fetchRequest.HTTPBodyStream = + [self performSelector:@selector(loggedInputStreamForInputStream:) + withObject:fetchRequest.HTTPBodyStream]; + } +#endif + } + } + + // We authorize after setting up the http method and body in the request + // because OAuth 1 may need to sign the request body + if (mayAuthorize && _authorizer && !isDataRequest) { + BOOL isAuthorized = [_authorizer isAuthorizedRequest:fetchRequest]; + if (!isAuthorized) { + // Authorization needed. + // + // If this session is held by the fetcher service, clear the session now so that we don't + // assume it's still valid after authorization completes. + if (self.canShareSession) { + self.session = nil; + } + + // Authorizing the request will recursively call this beginFetch:mayDelay: + // or failToBeginFetchWithError:. + [self authorizeRequest]; + return; + } + } + + // set the default upload or download retry interval, if necessary + if ([self isRetryEnabled] && self.maxRetryInterval <= 0) { + if (isEffectiveHTTPGet || [effectiveHTTPMethod isEqual:@"HEAD"]) { + [self setMaxRetryInterval:kDefaultMaxDownloadRetryInterval]; + } else { + [self setMaxRetryInterval:kDefaultMaxUploadRetryInterval]; + } + } + + // finally, start the connection + NSURLSessionTask *newSessionTask; + BOOL needsDataAccumulator = NO; + if (_downloadResumeData) { + newSessionTask = [_session downloadTaskWithResumeData:_downloadResumeData]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed downloadTaskWithResumeData for %@, resume data %tu bytes", + _session, _downloadResumeData.length); + } else if (_destinationFileURL && !isDataRequest) { + newSessionTask = [_session downloadTaskWithRequest:fetchRequest]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, @"Failed downloadTaskWithRequest for %@, %@", + _session, fetchRequest); + } else if (needsUploadTask) { + if (bodyFileURL) { + newSessionTask = [_session uploadTaskWithRequest:fetchRequest + fromFile:bodyFileURL]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed uploadTaskWithRequest for %@, %@, file %@", + _session, fetchRequest, bodyFileURL.path); + } else if (self.bodyStreamProvider) { + newSessionTask = [_session uploadTaskWithStreamedRequest:fetchRequest]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed uploadTaskWithStreamedRequest for %@, %@", + _session, fetchRequest); + } else { + GTMSESSION_ASSERT_DEBUG_OR_LOG(_bodyData != nil, + @"Upload task needs body data, %@", fetchRequest); + newSessionTask = [_session uploadTaskWithRequest:fetchRequest + fromData:(NSData * GTM_NONNULL_TYPE)_bodyData]; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, + @"Failed uploadTaskWithRequest for %@, %@, body data %tu bytes", + _session, fetchRequest, _bodyData.length); + } + needsDataAccumulator = YES; + } else { + newSessionTask = [_session dataTaskWithRequest:fetchRequest]; + needsDataAccumulator = YES; + GTMSESSION_ASSERT_DEBUG_OR_LOG(newSessionTask, @"Failed dataTaskWithRequest for %@, %@", + _session, fetchRequest); + } + self.sessionTask = newSessionTask; + + if (!newSessionTask) { + // We shouldn't get here; if we're here, an earlier assertion should have fired to explain + // which session task creation failed. + [self failToBeginFetchWithError:beginFailureError(GTMSessionFetcherErrorTaskCreationFailed)]; + return; + } + + if (needsDataAccumulator && _accumulateDataBlock == nil) { + self.downloadedData = [NSMutableData data]; + } + if (_taskDescription) { + newSessionTask.taskDescription = _taskDescription; + } + if (_taskPriority >= 0) { +#if TARGET_OS_TV || TARGET_OS_WATCH + BOOL hasTaskPriority = YES; +#elif (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) + BOOL hasTaskPriority = YES; +#else + BOOL hasTaskPriority = [newSessionTask respondsToSelector:@selector(setPriority:)]; +#endif + if (hasTaskPriority) { + newSessionTask.priority = _taskPriority; + } + } + +#if GTM_DISABLE_FETCHER_TEST_BLOCK + GTMSESSION_ASSERT_DEBUG(_testBlock == nil && gGlobalTestBlock == nil, @"test blocks disabled"); + _testBlock = nil; +#else + if (!_testBlock) { + if (gGlobalTestBlock) { + // Note that the test block may pass nil for all of its response parameters, + // indicating that the fetch should actually proceed. This is useful when the + // global test block has been set, and the app is only testing a specific + // fetcher. The block simulation code will then resume the task. + _testBlock = gGlobalTestBlock; + } + } + _isUsingTestBlock = (_testBlock != nil); +#endif // GTM_DISABLE_FETCHER_TEST_BLOCK + +#if GTM_BACKGROUND_TASK_FETCHING + id app = [[self class] fetcherUIApplication]; + // Background tasks seem to interfere with out-of-process uploads and downloads. + if (app && !self.skipBackgroundTask && !self.useBackgroundSession) { + // Tell UIApplication that we want to continue even when the app is in the + // background. +#if DEBUG + NSString *bgTaskName = [NSString stringWithFormat:@"%@-%@", + [self class], fetchRequest.URL.host]; +#else + NSString *bgTaskName = @"GTMSessionFetcher"; +#endif + __block UIBackgroundTaskIdentifier bgTaskID = [app beginBackgroundTaskWithName:bgTaskName + expirationHandler:^{ + // Background task expiration callback - this block is always invoked by + // UIApplication on the main thread. + if (bgTaskID != UIBackgroundTaskInvalid) { + @synchronized(self) { + if (bgTaskID == self.backgroundTaskIdentifier) { + self.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + } + [app endBackgroundTask:bgTaskID]; + } + }]; + @synchronized(self) { + self.backgroundTaskIdentifier = bgTaskID; + } + } +#endif + + if (!_initialRequestDate) { + _initialRequestDate = [[NSDate alloc] init]; + } + + // We don't expect to reach here even on retry or auth until a stop notification has been sent + // for the previous task, but we should ensure that we don't unbalance that. + GTMSESSION_ASSERT_DEBUG(!_isStopNotificationNeeded, @"Start notification without a prior stop"); + [self sendStopNotificationIfNeeded]; + + [self addPersistedBackgroundSessionToDefaults]; + + [self setStopNotificationNeeded:YES]; + + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherStartedNotification + userInfo:nil + requireAsync:NO]; + + // The service needs to know our task if it is serving as NSURLSession delegate. + [_service fetcherDidBeginFetching:self]; + + if (_testBlock) { +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + [self simulateFetchForTestBlock]; +#endif + } else { + // We resume the session task after posting the notification since the + // delegate callbacks may happen immediately if the fetch is started off + // the main thread or the session delegate queue is on a background thread, + // and we don't want to post a start notification after a premature finish + // of the session task. + [newSessionTask resume]; + } +} + +NSData * GTM_NULLABLE_TYPE GTMDataFromInputStream(NSInputStream *inputStream, NSError **outError) { + NSMutableData *data = [NSMutableData data]; + + [inputStream open]; + NSInteger numberOfBytesRead = 0; + while ([inputStream hasBytesAvailable]) { + uint8_t buffer[512]; + numberOfBytesRead = [inputStream read:buffer maxLength:sizeof(buffer)]; + if (numberOfBytesRead > 0) { + [data appendBytes:buffer length:(NSUInteger)numberOfBytesRead]; + } else { + break; + } + } + [inputStream close]; + NSError *streamError = inputStream.streamError; + + if (streamError) { + data = nil; + } + if (outError) { + *outError = streamError; + } + return data; +} + +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + +- (void)simulateFetchForTestBlock { + // This is invoked on the same thread as the beginFetch method was. + // + // Callbacks will all occur on the callback queue. + _testBlock(self, ^(NSURLResponse *response, NSData *responseData, NSError *error) { + // Callback from test block. + if (response == nil && responseData == nil && error == nil) { + // Assume the fetcher should execute rather than be tested. + _testBlock = nil; + _isUsingTestBlock = NO; + [_sessionTask resume]; + return; + } + + GTMSessionFetcherBodyStreamProvider bodyStreamProvider = self.bodyStreamProvider; + if (bodyStreamProvider) { + bodyStreamProvider(^(NSInputStream *bodyStream){ + // Read from the input stream into an NSData buffer. We'll drain the stream + // explicitly on a background queue. + [self invokeOnCallbackQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) + afterUserStopped:NO + block:^{ + NSError *streamError; + NSData *streamedData = GTMDataFromInputStream(bodyStream, &streamError); + + dispatch_async(dispatch_get_main_queue(), ^{ + // Continue callbacks on the main thread, since serial behavior + // is more reliable for tests. + [self simulateDataCallbacksForTestBlockWithBodyData:streamedData + response:response + responseData:responseData + error:(error ?: streamError)]; + }); + }]; + }); + } else { + // No input stream; use the supplied data or file URL. + NSURL *bodyFileURL = self.bodyFileURL; + if (bodyFileURL) { + NSError *readError; + _bodyData = [NSData dataWithContentsOfURL:bodyFileURL + options:NSDataReadingMappedIfSafe + error:&readError]; + error = readError; + } + + // No stream provider. + + // In real fetches, nothing happens until the run loop spins, so apps have leeway to + // set callbacks after they call beginFetch. We'll mirror that fetcher behavior by + // delaying callbacks here at least to the next spin of the run loop. That keeps + // immediate, synchronous setting of callback blocks after beginFetch working in tests. + dispatch_async(dispatch_get_main_queue(), ^{ + [self simulateDataCallbacksForTestBlockWithBodyData:_bodyData + response:response + responseData:responseData + error:error]; + }); + } + }); +} + +- (void)simulateByteTransferReportWithDataLength:(int64_t)totalDataLength + block:(GTMSessionFetcherSendProgressBlock)block { + // This utility method simulates transfer progress with up to three callbacks. + // It is used to call back to any of the progress blocks. + int64_t sendReportSize = totalDataLength / 3 + 1; + int64_t totalSent = 0; + while (totalSent < totalDataLength) { + int64_t bytesRemaining = totalDataLength - totalSent; + sendReportSize = MIN(sendReportSize, bytesRemaining); + totalSent += sendReportSize; + [self invokeOnCallbackQueueUnlessStopped:^{ + block(sendReportSize, totalSent, totalDataLength); + }]; + } +} + +- (void)simulateDataCallbacksForTestBlockWithBodyData:(NSData * GTM_NULLABLE_TYPE)bodyData + response:(NSURLResponse *)response + responseData:(NSData *)suppliedData + error:(NSError *)suppliedError { + __block NSData *responseData = suppliedData; + __block NSError *responseError = suppliedError; + + // This method does the test simulation of callbacks once the upload + // and download data are known. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Get copies of ivars we'll access in async invocations. This simulation assumes + // they won't change during fetcher execution. + NSURL *destinationFileURL = _destinationFileURL; + GTMSessionFetcherWillRedirectBlock willRedirectBlock = _willRedirectBlock; + GTMSessionFetcherDidReceiveResponseBlock didReceiveResponseBlock = _didReceiveResponseBlock; + GTMSessionFetcherSendProgressBlock sendProgressBlock = _sendProgressBlock; + GTMSessionFetcherDownloadProgressBlock downloadProgressBlock = _downloadProgressBlock; + GTMSessionFetcherAccumulateDataBlock accumulateDataBlock = _accumulateDataBlock; + GTMSessionFetcherReceivedProgressBlock receivedProgressBlock = _receivedProgressBlock; + GTMSessionFetcherWillCacheURLResponseBlock willCacheURLResponseBlock = + _willCacheURLResponseBlock; + + // Simulate receipt of redirection. + if (willRedirectBlock) { + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + willRedirectBlock((NSHTTPURLResponse *)response, _request, + ^(NSURLRequest *redirectRequest) { + // For simulation, we'll assume the app will just continue. + }); + }]; + } + + // If the fetcher has a challenge block, simulate a challenge. + // + // It might be nice to eventually let the user determine which testBlock + // fetches get challenged rather than always executing the supplied + // challenge block. + if (_challengeBlock) { + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + if (_challengeBlock) { + NSURL *requestURL = _request.URL; + NSString *host = requestURL.host; + NSURLProtectionSpace *pspace = + [[NSURLProtectionSpace alloc] initWithHost:host + port:requestURL.port.integerValue + protocol:requestURL.scheme + realm:nil + authenticationMethod:NSURLAuthenticationMethodHTTPBasic]; + id unusedSender = + (id)[NSNull null]; + NSURLAuthenticationChallenge *challenge = + [[NSURLAuthenticationChallenge alloc] initWithProtectionSpace:pspace + proposedCredential:nil + previousFailureCount:0 + failureResponse:nil + error:nil + sender:unusedSender]; + _challengeBlock(self, challenge, ^(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential){ + // We could change the responseData and responseError based on the disposition, + // but it's easier for apps to just supply the expected data and error + // directly to the test block. So this simulation ignores the disposition. + }); + } + }]; + } + + // Simulate receipt of an initial response. + if (response && didReceiveResponseBlock) { + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + didReceiveResponseBlock(response, ^(NSURLSessionResponseDisposition desiredDisposition) { + // For simulation, we'll assume the disposition is to continue. + }); + }]; + } + + // Simulate reporting send progress. + if (sendProgressBlock) { + [self simulateByteTransferReportWithDataLength:(int64_t)bodyData.length + block:^(int64_t bytesSent, + int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + // This is invoked on the callback queue unless stopped. + sendProgressBlock(bytesSent, totalBytesSent, totalBytesExpectedToSend); + }]; + } + + if (destinationFileURL) { + // Simulate download to file progress. + if (downloadProgressBlock) { + [self simulateByteTransferReportWithDataLength:(int64_t)responseData.length + block:^(int64_t bytesDownloaded, + int64_t totalBytesDownloaded, + int64_t totalBytesExpectedToDownload) { + // This is invoked on the callback queue unless stopped. + downloadProgressBlock(bytesDownloaded, totalBytesDownloaded, + totalBytesExpectedToDownload); + }]; + } + + NSError *writeError; + [responseData writeToURL:destinationFileURL + options:NSDataWritingAtomic + error:&writeError]; + if (writeError) { + // Tell the test code that writing failed. + responseError = writeError; + } + } else { + // Simulate download to NSData progress. + if ((accumulateDataBlock || receivedProgressBlock) && responseData) { + [self simulateByteTransferWithData:responseData + block:^(NSData *data, + int64_t bytesReceived, + int64_t totalBytesReceived, + int64_t totalBytesExpectedToReceive) { + // This is invoked on the callback queue unless stopped. + if (accumulateDataBlock) { + accumulateDataBlock(data); + } + + if (receivedProgressBlock) { + receivedProgressBlock(bytesReceived, totalBytesReceived); + } + }]; + } + + if (!accumulateDataBlock) { + _downloadedData = [responseData mutableCopy]; + } + + if (willCacheURLResponseBlock) { + // Simulate letting the client inspect and alter the cached response. + NSData *cachedData = responseData ?: [[NSData alloc] init]; // Always have non-nil data. + NSCachedURLResponse *cachedResponse = + [[NSCachedURLResponse alloc] initWithResponse:response + data:cachedData]; + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:YES + block:^{ + willCacheURLResponseBlock(cachedResponse, ^(NSCachedURLResponse *responseToCache){ + // The app may provide an alternative response, or nil to defeat caching. + }); + }]; + } + } + _response = response; + } // @synchronized(self) + + NSOperationQueue *queue = self.sessionDelegateQueue; + [queue addOperationWithBlock:^{ + // Rather than invoke failToBeginFetchWithError: we want to simulate completion of + // a connection that started and ended, so we'll call down to finishWithError: + NSInteger status = responseError ? responseError.code : 200; + if (status >= 200 && status <= 399) { + [self finishWithError:nil shouldRetry:NO]; + } else { + [self shouldRetryNowForStatus:status + error:responseError + forceAssumeRetry:NO + response:^(BOOL shouldRetry) { + [self finishWithError:responseError shouldRetry:shouldRetry]; + }]; + } + }]; +} + +- (void)simulateByteTransferWithData:(NSData *)responseData + block:(GTMSessionFetcherSimulateByteTransferBlock)transferBlock { + // This utility method simulates transfering data to the client. It divides the data into at most + // "chunkCount" chunks and then passes each chunk along with a progress update to transferBlock. + // This function can be used with accumulateDataBlock or receivedProgressBlock. + + NSUInteger chunkCount = MAX(self.testBlockAccumulateDataChunkCount, (NSUInteger) 1); + NSUInteger totalDataLength = responseData.length; + NSUInteger sendDataSize = totalDataLength / chunkCount + 1; + NSUInteger totalSent = 0; + while (totalSent < totalDataLength) { + NSUInteger bytesRemaining = totalDataLength - totalSent; + sendDataSize = MIN(sendDataSize, bytesRemaining); + NSData *chunkData = [responseData subdataWithRange:NSMakeRange(totalSent, sendDataSize)]; + totalSent += sendDataSize; + [self invokeOnCallbackQueueUnlessStopped:^{ + transferBlock(chunkData, + (int64_t)sendDataSize, + (int64_t)totalSent, + (int64_t)totalDataLength); + }]; + } +} + +#endif // !GTM_DISABLE_FETCHER_TEST_BLOCK + +- (void)setSessionTask:(NSURLSessionTask *)sessionTask { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_sessionTask != sessionTask) { + _sessionTask = sessionTask; + if (_sessionTask) { + // Request could be nil on restoring this fetcher from a background session. + if (!_request) { + _request = [_sessionTask.originalRequest mutableCopy]; + } + } + } + } // @synchronized(self) +} + +- (NSURLSessionTask * GTM_NULLABLE_TYPE)sessionTask { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _sessionTask; + } // @synchronized(self) +} + ++ (NSUserDefaults *)fetcherUserDefaults { + static NSUserDefaults *gFetcherUserDefaults = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + Class fetcherUserDefaultsClass = NSClassFromString(@"GTMSessionFetcherUserDefaultsFactory"); + if (fetcherUserDefaultsClass) { + gFetcherUserDefaults = [fetcherUserDefaultsClass fetcherUserDefaults]; + } else { + gFetcherUserDefaults = [NSUserDefaults standardUserDefaults]; + } + }); + return gFetcherUserDefaults; +} + +- (void)addPersistedBackgroundSessionToDefaults { + NSString *sessionIdentifier = self.sessionIdentifier; + if (!sessionIdentifier) { + return; + } + NSArray *oldBackgroundSessions = [[self class] activePersistedBackgroundSessions]; + if ([oldBackgroundSessions containsObject:_sessionIdentifier]) { + return; + } + NSMutableArray *newBackgroundSessions = + [NSMutableArray arrayWithArray:oldBackgroundSessions]; + [newBackgroundSessions addObject:sessionIdentifier]; + GTM_LOG_BACKGROUND_SESSION(@"Add to background sessions: %@", newBackgroundSessions); + + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + [userDefaults setObject:newBackgroundSessions + forKey:kGTMSessionFetcherPersistedDestinationKey]; + [userDefaults synchronize]; +} + +- (void)removePersistedBackgroundSessionFromDefaults { + NSString *sessionIdentifier = self.sessionIdentifier; + if (!sessionIdentifier) return; + + NSArray *oldBackgroundSessions = [[self class] activePersistedBackgroundSessions]; + if (!oldBackgroundSessions) { + return; + } + NSMutableArray *newBackgroundSessions = + [NSMutableArray arrayWithArray:oldBackgroundSessions]; + NSUInteger sessionIndex = [newBackgroundSessions indexOfObject:sessionIdentifier]; + if (sessionIndex == NSNotFound) { + return; + } + [newBackgroundSessions removeObjectAtIndex:sessionIndex]; + GTM_LOG_BACKGROUND_SESSION(@"Remove from background sessions: %@", newBackgroundSessions); + + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + if (newBackgroundSessions.count == 0) { + [userDefaults removeObjectForKey:kGTMSessionFetcherPersistedDestinationKey]; + } else { + [userDefaults setObject:newBackgroundSessions + forKey:kGTMSessionFetcherPersistedDestinationKey]; + } + [userDefaults synchronize]; +} + ++ (GTM_NULLABLE NSArray *)activePersistedBackgroundSessions { + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + NSArray *oldBackgroundSessions = + [userDefaults arrayForKey:kGTMSessionFetcherPersistedDestinationKey]; + if (oldBackgroundSessions.count == 0) { + return nil; + } + NSMutableArray *activeBackgroundSessions = nil; + NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; + for (NSString *sessionIdentifier in oldBackgroundSessions) { + GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; + if (fetcher) { + if (!activeBackgroundSessions) { + activeBackgroundSessions = [[NSMutableArray alloc] init]; + } + [activeBackgroundSessions addObject:sessionIdentifier]; + } + } + return activeBackgroundSessions; +} + ++ (NSArray *)fetchersForBackgroundSessions { + NSUserDefaults *userDefaults = [[self class] fetcherUserDefaults]; + NSArray *backgroundSessions = + [userDefaults arrayForKey:kGTMSessionFetcherPersistedDestinationKey]; + NSMapTable *sessionIdentifierToFetcherMap = [self sessionIdentifierToFetcherMap]; + NSMutableArray *fetchers = [NSMutableArray array]; + for (NSString *sessionIdentifier in backgroundSessions) { + GTMSessionFetcher *fetcher = [sessionIdentifierToFetcherMap objectForKey:sessionIdentifier]; + if (!fetcher) { + fetcher = [self fetcherWithSessionIdentifier:sessionIdentifier]; + GTMSESSION_ASSERT_DEBUG(fetcher != nil, + @"Unexpected invalid session identifier: %@", sessionIdentifier); + [fetcher beginFetchWithCompletionHandler:nil]; + } + GTM_LOG_BACKGROUND_SESSION(@"%@ restoring session %@ by creating fetcher %@ %p", + [self class], sessionIdentifier, fetcher, fetcher); + if (fetcher != nil) { + [fetchers addObject:fetcher]; + } + } + return fetchers; +} + +#if TARGET_OS_IPHONE ++ (void)application:(UIApplication *)application + handleEventsForBackgroundURLSession:(NSString *)identifier + completionHandler:(GTMSessionFetcherSystemCompletionHandler)completionHandler { + GTMSessionFetcher *fetcher = [self fetcherWithSessionIdentifier:identifier]; + if (fetcher != nil) { + fetcher.systemCompletionHandler = completionHandler; + } else { + GTM_LOG_BACKGROUND_SESSION(@"%@ did not create background session identifier: %@", + [self class], identifier); + } +} +#endif + +- (NSString * GTM_NULLABLE_TYPE)sessionIdentifier { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _sessionIdentifier; + } // @synchronized(self) +} + +- (void)setSessionIdentifier:(NSString *)sessionIdentifier { + GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(!_session, @"Unable to set session identifier after session created"); + _sessionIdentifier = [sessionIdentifier copy]; + _usingBackgroundSession = YES; + _canShareSession = NO; + [self restoreDefaultStateForSessionIdentifierMetadata]; + } // @synchronized(self) +} + +- (void)setSessionIdentifierInternal:(GTM_NULLABLE NSString *)sessionIdentifier { + // This internal method only does a synchronized set of the session identifier. + // It does not have side effects on the background session, shared session, or + // session identifier metadata. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _sessionIdentifier = [sessionIdentifier copy]; + } // @synchronized(self) +} + +- (NSDictionary * GTM_NULLABLE_TYPE)sessionUserInfo { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_sessionUserInfo == nil) { + // We'll return the metadata dictionary with internal keys removed. This avoids the user + // re-using the userInfo dictionary later and accidentally including the internal keys. + NSMutableDictionary *metadata = [[self sessionIdentifierMetadataUnsynchronized] mutableCopy]; + NSSet *keysToRemove = [metadata keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) { + return [key hasPrefix:@"_"]; + }]; + [metadata removeObjectsForKeys:[keysToRemove allObjects]]; + if (metadata.count > 0) { + _sessionUserInfo = metadata; + } + } + return _sessionUserInfo; + } // @synchronized(self) +} + +- (void)setSessionUserInfo:(NSDictionary * GTM_NULLABLE_TYPE)dictionary { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(_sessionIdentifier == nil, @"Too late to assign userInfo"); + _sessionUserInfo = dictionary; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSDictionary *)sessionIdentifierDefaultMetadata { + GTMSessionCheckSynchronized(self); + + NSMutableDictionary *defaultUserInfo = [[NSMutableDictionary alloc] init]; + if (_destinationFileURL) { + defaultUserInfo[kGTMSessionIdentifierDestinationFileURLMetadataKey] = + [_destinationFileURL absoluteString]; + } + if (_bodyFileURL) { + defaultUserInfo[kGTMSessionIdentifierBodyFileURLMetadataKey] = [_bodyFileURL absoluteString]; + } + return (defaultUserInfo.count > 0) ? defaultUserInfo : nil; +} + +- (void)restoreDefaultStateForSessionIdentifierMetadata { + GTMSessionCheckSynchronized(self); + + NSDictionary *metadata = [self sessionIdentifierMetadataUnsynchronized]; + NSString *destinationFileURLString = metadata[kGTMSessionIdentifierDestinationFileURLMetadataKey]; + if (destinationFileURLString) { + _destinationFileURL = [NSURL URLWithString:destinationFileURLString]; + GTM_LOG_BACKGROUND_SESSION(@"Restoring destination file URL: %@", _destinationFileURL); + } + NSString *bodyFileURLString = metadata[kGTMSessionIdentifierBodyFileURLMetadataKey]; + if (bodyFileURLString) { + _bodyFileURL = [NSURL URLWithString:bodyFileURLString]; + GTM_LOG_BACKGROUND_SESSION(@"Restoring body file URL: %@", _bodyFileURL); + } +} + +- (NSDictionary * GTM_NULLABLE_TYPE)sessionIdentifierMetadata { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [self sessionIdentifierMetadataUnsynchronized]; + } +} + +- (NSDictionary * GTM_NULLABLE_TYPE)sessionIdentifierMetadataUnsynchronized { + GTMSessionCheckSynchronized(self); + + // Session Identifier format: "com.google.__ + if (!_sessionIdentifier) { + return nil; + } + NSScanner *metadataScanner = [NSScanner scannerWithString:_sessionIdentifier]; + [metadataScanner setCharactersToBeSkipped:nil]; + NSString *metadataString; + NSString *uuid; + if ([metadataScanner scanUpToString:@"_" intoString:NULL] && + [metadataScanner scanString:@"_" intoString:NULL] && + [metadataScanner scanUpToString:@"_" intoString:&uuid] && + [metadataScanner scanString:@"_" intoString:NULL] && + [metadataScanner scanUpToString:@"\n" intoString:&metadataString]) { + _sessionIdentifierUUID = uuid; + NSData *metadataData = [metadataString dataUsingEncoding:NSUTF8StringEncoding]; + NSError *error; + NSDictionary *metadataDict = + [NSJSONSerialization JSONObjectWithData:metadataData + options:0 + error:&error]; + GTM_LOG_BACKGROUND_SESSION(@"User Info from session identifier: %@ %@", + metadataDict, error ? error : @""); + return metadataDict; + } + return nil; +} + +- (NSString *)createSessionIdentifierWithMetadata:(NSDictionary * GTM_NULLABLE_TYPE)metadataToInclude { + NSString *result; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Session Identifier format: "com.google.__ + GTMSESSION_ASSERT_DEBUG(!_sessionIdentifier, @"Session identifier already created"); + _sessionIdentifierUUID = [[NSUUID UUID] UUIDString]; + _sessionIdentifier = + [NSString stringWithFormat:@"%@_%@", kGTMSessionIdentifierPrefix, _sessionIdentifierUUID]; + // Start with user-supplied keys so they cannot accidentally override the fetcher's keys. + NSMutableDictionary *metadataDict = + [NSMutableDictionary dictionaryWithDictionary:(NSDictionary * GTM_NONNULL_TYPE)_sessionUserInfo]; + + if (metadataToInclude) { + [metadataDict addEntriesFromDictionary:(NSDictionary *)metadataToInclude]; + } + NSDictionary *defaultMetadataDict = [self sessionIdentifierDefaultMetadata]; + if (defaultMetadataDict) { + [metadataDict addEntriesFromDictionary:defaultMetadataDict]; + } + if (metadataDict.count > 0) { + NSData *metadataData = [NSJSONSerialization dataWithJSONObject:metadataDict + options:0 + error:NULL]; + GTMSESSION_ASSERT_DEBUG(metadataData != nil, + @"Session identifier user info failed to convert to JSON"); + if (metadataData.length > 0) { + NSString *metadataString = [[NSString alloc] initWithData:metadataData + encoding:NSUTF8StringEncoding]; + _sessionIdentifier = + [_sessionIdentifier stringByAppendingFormat:@"_%@", metadataString]; + } + } + _didCreateSessionIdentifier = YES; + result = _sessionIdentifier; + } // @synchronized(self) + return result; +} + +- (void)failToBeginFetchWithError:(NSError *)error { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _hasStoppedFetching = YES; + } + + if (error == nil) { + error = [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:GTMSessionFetcherErrorDownloadFailed + userInfo:nil]; + } + + [self invokeFetchCallbacksOnCallbackQueueWithData:nil + error:error]; + [self releaseCallbacks]; + + [_service fetcherDidStop:self]; + + self.authorizer = nil; +} + ++ (GTMSessionCookieStorage *)staticCookieStorage { + static GTMSessionCookieStorage *gCookieStorage = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gCookieStorage = [[GTMSessionCookieStorage alloc] init]; + }); + return gCookieStorage; +} + +#if GTM_BACKGROUND_TASK_FETCHING + +- (void)endBackgroundTask { + // Whenever the connection stops or background execution expires, + // we need to tell UIApplication we're done. + UIBackgroundTaskIdentifier bgTaskID; + @synchronized(self) { + bgTaskID = self.backgroundTaskIdentifier; + if (bgTaskID != UIBackgroundTaskInvalid) { + self.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + } + + if (bgTaskID != UIBackgroundTaskInvalid) { + id app = [[self class] fetcherUIApplication]; + [app endBackgroundTask:bgTaskID]; + } +} + +#endif // GTM_BACKGROUND_TASK_FETCHING + +- (void)authorizeRequest { + GTMSessionCheckNotSynchronized(self); + + id authorizer = self.authorizer; + SEL asyncAuthSel = @selector(authorizeRequest:delegate:didFinishSelector:); + if ([authorizer respondsToSelector:asyncAuthSel]) { + SEL callbackSel = @selector(authorizer:request:finishedWithError:); + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + [authorizer authorizeRequest:mutableRequest + delegate:self + didFinishSelector:callbackSel]; + } else { + GTMSESSION_ASSERT_DEBUG(authorizer == nil, @"invalid authorizer for fetch"); + + // No authorizing possible, and authorizing happens only after any delay; + // just begin fetching + [self beginFetchMayDelay:NO + mayAuthorize:NO]; + } +} + +- (void)authorizer:(id)auth + request:(NSMutableURLRequest *)authorizedRequest + finishedWithError:(NSError *)error { + GTMSessionCheckNotSynchronized(self); + + if (error != nil) { + // We can't fetch without authorization + [self failToBeginFetchWithError:error]; + } else { + @synchronized(self) { + _request = authorizedRequest; + } + [self beginFetchMayDelay:NO + mayAuthorize:NO]; + } +} + + +- (BOOL)canFetchWithBackgroundSession { + // Subclasses may override. + return YES; +} + +// Returns YES if the fetcher has been started and has not yet stopped. +// +// Fetching includes waiting for authorization or for retry, waiting to be allowed by the +// service object to start the request, and actually fetching the request. +- (BOOL)isFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [self isFetchingUnsynchronized]; + } +} + +- (BOOL)isFetchingUnsynchronized { + GTMSessionCheckSynchronized(self); + + BOOL hasBegun = (_initialBeginFetchDate != nil); + return hasBegun && !_hasStoppedFetching; +} + +- (NSURLResponse * GTM_NULLABLE_TYPE)response { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURLResponse *response = [self responseUnsynchronized]; + return response; + } // @synchronized(self) +} + +- (NSURLResponse * GTM_NULLABLE_TYPE)responseUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSURLResponse *response = _sessionTask.response; + if (!response) response = _response; + return response; +} + +- (NSInteger)statusCode { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSInteger statusCode = [self statusCodeUnsynchronized]; + return statusCode; + } // @synchronized(self) +} + +- (NSInteger)statusCodeUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSURLResponse *response = [self responseUnsynchronized]; + NSInteger statusCode; + + if ([response respondsToSelector:@selector(statusCode)]) { + statusCode = [(NSHTTPURLResponse *)response statusCode]; + } else { + // Default to zero, in hopes of hinting "Unknown" (we can't be + // sure that things are OK enough to use 200). + statusCode = 0; + } + return statusCode; +} + +- (NSDictionary * GTM_NULLABLE_TYPE)responseHeaders { + GTMSessionCheckNotSynchronized(self); + + NSURLResponse *response = self.response; + if ([response respondsToSelector:@selector(allHeaderFields)]) { + NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; + return headers; + } + return nil; +} + +- (NSDictionary * GTM_NULLABLE_TYPE)responseHeadersUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSURLResponse *response = [self responseUnsynchronized]; + if ([response respondsToSelector:@selector(allHeaderFields)]) { + NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; + return headers; + } + return nil; +} + +- (void)releaseCallbacks { + // Avoid releasing blocks in the sync section since objects dealloc'd by + // the blocks being released may call back into the fetcher or fetcher + // service. + dispatch_queue_t NS_VALID_UNTIL_END_OF_SCOPE holdCallbackQueue; + GTMSessionFetcherCompletionHandler NS_VALID_UNTIL_END_OF_SCOPE holdCompletionHandler; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + holdCallbackQueue = _callbackQueue; + holdCompletionHandler = _completionHandler; + + _callbackQueue = nil; + _completionHandler = nil; // Setter overridden in upload. Setter assumed to be used externally. + } + + // Set local callback pointers to nil here rather than let them release at the end of the scope + // to make any problems due to the blocks being released be a bit more obvious in a stack trace. + holdCallbackQueue = nil; + holdCompletionHandler = nil; + + self.configurationBlock = nil; + self.didReceiveResponseBlock = nil; + self.challengeBlock = nil; + self.willRedirectBlock = nil; + self.sendProgressBlock = nil; + self.receivedProgressBlock = nil; + self.downloadProgressBlock = nil; + self.accumulateDataBlock = nil; + self.willCacheURLResponseBlock = nil; + self.retryBlock = nil; + self.testBlock = nil; + self.resumeDataBlock = nil; +} + +- (void)forgetSessionIdentifierForFetcher { + GTMSessionCheckSynchronized(self); + [self forgetSessionIdentifierForFetcherWithoutSyncCheck]; +} + +- (void)forgetSessionIdentifierForFetcherWithoutSyncCheck { + // This should be called inside a @synchronized block (except during dealloc.) + if (_sessionIdentifier) { + NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIdentifierToFetcherMap]; + [sessionIdentifierToFetcherMap removeObjectForKey:_sessionIdentifier]; + _sessionIdentifier = nil; + _didCreateSessionIdentifier = NO; + } +} + +// External stop method +- (void)stopFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Prevent enqueued callbacks from executing. + _userStoppedFetching = YES; + } // @synchronized(self) + [self stopFetchReleasingCallbacks:YES]; +} + +// Cancel the fetch of the URL that's currently in progress. +// +// If shouldReleaseCallbacks is NO then the fetch will be retried so the callbacks +// need to still be retained. +- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks { + [self removePersistedBackgroundSessionFromDefaults]; + + id service; + NSMutableURLRequest *request; + + // If the task or the retry timer is all that's retaining the fetcher, + // we want to be sure this instance survives stopping at least long enough for + // the stack to unwind. + __autoreleasing GTMSessionFetcher *holdSelf = self; + + BOOL hasCanceledTask = NO; + + [holdSelf destroyRetryTimer]; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _hasStoppedFetching = YES; + + service = _service; + request = _request; + + if (_sessionTask) { + // In case cancelling the task or session calls this recursively, we want + // to ensure that we'll only release the task and delegate once, + // so first set _sessionTask to nil + // + // This may be called in a callback from the task, so use autorelease to avoid + // releasing the task in its own callback. + __autoreleasing NSURLSessionTask *oldTask = _sessionTask; + if (!_isUsingTestBlock) { + _response = _sessionTask.response; + } + _sessionTask = nil; + + if ([oldTask state] != NSURLSessionTaskStateCompleted) { + // For download tasks, when the fetch is stopped, we may provide resume data that can + // be used to create a new session. + BOOL mayResume = (_resumeDataBlock + && [oldTask respondsToSelector:@selector(cancelByProducingResumeData:)]); + if (!mayResume) { + [oldTask cancel]; + // A side effect of stopping the task is that URLSession:task:didCompleteWithError: + // will be invoked asynchronously on the delegate queue. + } else { + void (^resumeBlock)(NSData *) = _resumeDataBlock; + _resumeDataBlock = nil; + + // Save callbackQueue since releaseCallbacks clears it. + dispatch_queue_t callbackQueue = _callbackQueue; + dispatch_group_enter(_callbackGroup); + [(NSURLSessionDownloadTask *)oldTask cancelByProducingResumeData:^(NSData *resumeData) { + [self invokeOnCallbackQueue:callbackQueue + afterUserStopped:YES + block:^{ + resumeBlock(resumeData); + dispatch_group_leave(_callbackGroup); + }]; + }]; + } + hasCanceledTask = YES; + } + } + + // If the task was canceled, wait until the URLSession:task:didCompleteWithError: to call + // finishTasksAndInvalidate, since calling it immediately tends to crash, see radar 18471901. + if (_session) { + BOOL shouldInvalidate = _shouldInvalidateSession; +#if TARGET_OS_IPHONE + // Don't invalidate if we've got a systemCompletionHandler, since + // URLSessionDidFinishEventsForBackgroundURLSession: won't be called if invalidated. + shouldInvalidate = shouldInvalidate && !self.systemCompletionHandler; +#endif + if (shouldInvalidate) { + __autoreleasing NSURLSession *oldSession = _session; + _session = nil; + + if (!hasCanceledTask) { + [oldSession finishTasksAndInvalidate]; + } else { + _sessionNeedingInvalidation = oldSession; + } + } + } + } // @synchronized(self) + + // send the stopped notification + [self sendStopNotificationIfNeeded]; + + [_authorizer stopAuthorizationForRequest:request]; + + if (shouldReleaseCallbacks) { + [self releaseCallbacks]; + + self.authorizer = nil; + } + + [service fetcherDidStop:self]; + +#if GTM_BACKGROUND_TASK_FETCHING + [self endBackgroundTask]; +#endif +} + +- (void)setStopNotificationNeeded:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _isStopNotificationNeeded = flag; + } // @synchronized(self) +} + +- (void)sendStopNotificationIfNeeded { + BOOL sendNow = NO; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_isStopNotificationNeeded) { + _isStopNotificationNeeded = NO; + sendNow = YES; + } + } // @synchronized(self) + + if (sendNow) { + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherStoppedNotification + userInfo:nil + requireAsync:NO]; + } +} + +- (void)retryFetch { + [self stopFetchReleasingCallbacks:NO]; + + GTMSessionFetcherCompletionHandler completionHandler; + + // A retry will need a configuration with a fresh session identifier. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_sessionIdentifier && _didCreateSessionIdentifier) { + [self forgetSessionIdentifierForFetcher]; + _configuration = nil; + } + + if (_canShareSession) { + // Force a grab of the current session from the fetcher service in case + // the service's old one has become invalid. + _session = nil; + } + + completionHandler = _completionHandler; + } // @synchronized(self) + + [self beginFetchWithCompletionHandler:completionHandler]; +} + +- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { + // Uncovered in upload fetcher testing, because the chunk fetcher is being waited on, and gets + // released by the upload code. The uploader just holds onto it with an ivar, and that gets + // nilled in the chunk fetcher callback. + // Used once in while loop just to avoid unused variable compiler warning. + __autoreleasing GTMSessionFetcher *holdSelf = self; + + NSDate *giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; + + BOOL shouldSpinRunLoop = ([NSThread isMainThread] && + (!self.callbackQueue + || self.callbackQueue == dispatch_get_main_queue())); + BOOL expired = NO; + + // Loop until the callbacks have been called and released, and until + // the connection is no longer pending, until there are no callback dispatches + // in flight, or until the timeout has expired. + int64_t delta = (int64_t)(100 * NSEC_PER_MSEC); // 100 ms + while (1) { + BOOL isTaskInProgress = (holdSelf->_sessionTask + && [_sessionTask state] != NSURLSessionTaskStateCompleted); + BOOL needsToCallCompletion = (_completionHandler != nil); + BOOL isCallbackInProgress = (_callbackGroup + && dispatch_group_wait(_callbackGroup, dispatch_time(DISPATCH_TIME_NOW, delta))); + + if (!isTaskInProgress && !needsToCallCompletion && !isCallbackInProgress) break; + + expired = ([giveUpDate timeIntervalSinceNow] < 0); + if (expired) { + GTMSESSION_LOG_DEBUG(@"GTMSessionFetcher waitForCompletionWithTimeout:%0.1f expired -- " + @"%@%@%@", timeoutInSeconds, + isTaskInProgress ? @"taskInProgress " : @"", + needsToCallCompletion ? @"needsToCallCompletion " : @"", + isCallbackInProgress ? @"isCallbackInProgress" : @""); + break; + } + + // Run the current run loop 1/1000 of a second to give the networking + // code a chance to work + const NSTimeInterval kSpinInterval = 0.001; + if (shouldSpinRunLoop) { + NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:kSpinInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; + } else { + [NSThread sleepForTimeInterval:kSpinInterval]; + } + } + return !expired; +} + ++ (void)setGlobalTestBlock:(GTMSessionFetcherTestBlock GTM_NULLABLE_TYPE)block { +#if GTM_DISABLE_FETCHER_TEST_BLOCK + GTMSESSION_ASSERT_DEBUG(block == nil, @"test blocks disabled"); +#endif + gGlobalTestBlock = [block copy]; +} + +#if TARGET_OS_IPHONE + +static GTM_NULLABLE_TYPE id gSubstituteUIApp; + ++ (void)setSubstituteUIApplication:(nullable id)app { + gSubstituteUIApp = app; +} + ++ (nullable id)substituteUIApplication { + return gSubstituteUIApp; +} + ++ (nullable id)fetcherUIApplication { + id app = gSubstituteUIApp; + if (app) return app; + + // iOS App extensions should not call [UIApplication sharedApplication], even + // if UIApplication responds to it. + + static Class applicationClass = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + BOOL isAppExtension = [[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]; + if (!isAppExtension) { + Class cls = NSClassFromString(@"UIApplication"); + if (cls && [cls respondsToSelector:NSSelectorFromString(@"sharedApplication")]) { + applicationClass = cls; + } + } + }); + + if (applicationClass) { + app = (id)[applicationClass sharedApplication]; + } + return app; +} +#endif // TARGET_OS_IPHONE + +#pragma mark NSURLSession Delegate Methods + +// NSURLSession documentation indicates that redirectRequest can be passed to the handler +// but empirically redirectRequest lacks the HTTP body, so passing it will break POSTs. +// Instead, we construct a new request, a copy of the original, with overrides from the +// redirect. + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +willPerformHTTPRedirection:(NSHTTPURLResponse *)redirectResponse + newRequest:(NSURLRequest *)redirectRequest + completionHandler:(void (^)(NSURLRequest * GTM_NULLABLE_TYPE))handler { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ willPerformHTTPRedirection:%@ newRequest:%@", + [self class], self, session, task, redirectResponse, redirectRequest); + + if ([self userStoppedFetching]) { + handler(nil); + return; + } + if (redirectRequest && redirectResponse) { + // Copy the original request, including the body. + NSURLRequest *originalRequest = self.request; + NSMutableURLRequest *newRequest = [originalRequest mutableCopy]; + + // Disallow scheme changes (say, from https to http). + NSURL *originalRequestURL = originalRequest.URL; + NSURL *redirectRequestURL = redirectRequest.URL; + + NSString *originalScheme = originalRequestURL.scheme; + NSString *redirectScheme = redirectRequestURL.scheme; + + if (originalScheme != nil + && [originalScheme caseInsensitiveCompare:@"http"] == NSOrderedSame + && redirectScheme != nil + && [redirectScheme caseInsensitiveCompare:@"https"] == NSOrderedSame) { + // Allow the change from http to https. + } else { + // Disallow any other scheme changes. + redirectScheme = originalScheme; + } + // The new requests's URL overrides the original's URL. + NSURLComponents *components = [NSURLComponents componentsWithURL:redirectRequestURL + resolvingAgainstBaseURL:NO]; + components.scheme = redirectScheme; + NSURL *newURL = components.URL; + [newRequest setURL:newURL]; + + // Any headers in the redirect override headers in the original. + NSDictionary *redirectHeaders = redirectRequest.allHTTPHeaderFields; + for (NSString *key in redirectHeaders) { + NSString *value = [redirectHeaders objectForKey:key]; + [newRequest setValue:value forHTTPHeaderField:key]; + } + + redirectRequest = newRequest; + + // Log the response we just received + [self setResponse:redirectResponse]; + [self logNowWithError:nil]; + + GTMSessionFetcherWillRedirectBlock willRedirectBlock = self.willRedirectBlock; + if (willRedirectBlock) { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + willRedirectBlock(redirectResponse, redirectRequest, ^(NSURLRequest *clientRequest) { + + // Update the request for future logging. + [self updateMutableRequest:[clientRequest mutableCopy]]; + + handler(clientRequest); + }); + }]; + } // @synchronized(self) + return; + } + // Continues here if the client did not provide a redirect block. + + // Update the request for future logging. + [self updateMutableRequest:[redirectRequest mutableCopy]]; + } + handler(redirectRequest); +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))handler { + [self setSessionTask:dataTask]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didReceiveResponse:%@", + [self class], self, session, dataTask, response); + void (^accumulateAndFinish)(NSURLSessionResponseDisposition) = + ^(NSURLSessionResponseDisposition dispositionValue) { + // This method is called when the server has determined that it + // has enough information to create the NSURLResponse + // it can be called multiple times, for example in the case of a + // redirect, so each time we reset the data. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + BOOL hadPreviousData = _downloadedLength > 0; + + [_downloadedData setLength:0]; + _downloadedLength = 0; + + if (hadPreviousData && (dispositionValue != NSURLSessionResponseCancel)) { + // Tell the accumulate block to discard prior data. + GTMSessionFetcherAccumulateDataBlock accumulateBlock = _accumulateDataBlock; + if (accumulateBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + accumulateBlock(nil); + }]; + } + } + } // @synchronized(self) + handler(dispositionValue); + }; + + GTMSessionFetcherDidReceiveResponseBlock receivedResponseBlock; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + receivedResponseBlock = _didReceiveResponseBlock; + if (receivedResponseBlock) { + // We will ultimately need to call back to NSURLSession's handler with the disposition value + // for this delegate method even if the user has stopped the fetcher. + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + receivedResponseBlock(response, ^(NSURLSessionResponseDisposition desiredDisposition) { + accumulateAndFinish(desiredDisposition); + }); + }]; + } + } // @synchronized(self) + + if (receivedResponseBlock == nil) { + accumulateAndFinish(NSURLSessionResponseAllow); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didBecomeDownloadTask:%@", + [self class], self, session, dataTask, downloadTask); + [self setSessionTask:downloadTask]; +} + + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential))handler { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didReceiveChallenge:%@", + [self class], self, session, task, challenge); + + GTMSessionFetcherChallengeBlock challengeBlock = self.challengeBlock; + if (challengeBlock) { + // The fetcher user has provided custom challenge handling. + // + // We will ultimately need to call back to NSURLSession's handler with the disposition value + // for this delegate method even if the user has stopped the fetcher. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + challengeBlock(self, challenge, handler); + }]; + } + } else { + // No challenge block was provided by the client. + [self respondToChallenge:challenge + completionHandler:handler]; + } +} + +- (void)respondToChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, + NSURLCredential * GTM_NULLABLE_TYPE credential))handler { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSInteger previousFailureCount = [challenge previousFailureCount]; + if (previousFailureCount <= 2) { + NSURLProtectionSpace *protectionSpace = [challenge protectionSpace]; + NSString *authenticationMethod = [protectionSpace authenticationMethod]; + if ([authenticationMethod isEqual:NSURLAuthenticationMethodServerTrust]) { + // SSL. + // + // Background sessions seem to require an explicit check of the server trust object + // rather than default handling. + SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; + if (serverTrust == NULL) { + // No server trust information is available. + handler(NSURLSessionAuthChallengePerformDefaultHandling, nil); + } else { + // Server trust information is available. + void (^callback)(SecTrustRef, BOOL) = ^(SecTrustRef trustRef, BOOL allow){ + if (allow) { + NSURLCredential *trustCredential = [NSURLCredential credentialForTrust:trustRef]; + handler(NSURLSessionAuthChallengeUseCredential, trustCredential); + } else { + GTMSESSION_LOG_DEBUG(@"Cancelling authentication challenge for %@", _request.URL); + handler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); + } + }; + if (_allowInvalidServerCertificates) { + callback(serverTrust, YES); + } else { + [[self class] evaluateServerTrust:serverTrust + forRequest:_request + completionHandler:callback]; + } + } + return; + } + + NSURLCredential *credential = _credential; + + if ([[challenge protectionSpace] isProxy] && _proxyCredential != nil) { + credential = _proxyCredential; + } + + if (credential) { + handler(NSURLSessionAuthChallengeUseCredential, credential); + } else { + // The credential is still nil; tell the OS to use the default handling. This is needed + // for things that can come out of the keychain (proxies, client certificates, etc.). + // + // Note: Looking up a credential with NSURLCredentialStorage's + // defaultCredentialForProtectionSpace: is *not* the same invoking the handler with + // NSURLSessionAuthChallengePerformDefaultHandling. In the case of + // NSURLAuthenticationMethodClientCertificate, you can get nil back from + // NSURLCredentialStorage, while using this code path instead works. + handler(NSURLSessionAuthChallengePerformDefaultHandling, nil); + } + + } else { + // We've failed auth 3 times. The completion handler will be called with code + // NSURLErrorCancelled. + handler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); + } + } // @synchronized(self) +} + +// Validate the certificate chain. +// +// This may become a public method if it appears to be useful to users. ++ (void)evaluateServerTrust:(SecTrustRef)serverTrust + forRequest:(NSURLRequest *)request + completionHandler:(void (^)(SecTrustRef trustRef, BOOL allow))handler { + // Retain the trust object to avoid a SecTrustEvaluate() crash on iOS 7. + CFRetain(serverTrust); + + // Evaluate the certificate chain. + // + // The delegate queue may be the main thread. Trust evaluation could cause some + // blocking network activity, so we must evaluate async, as documented at + // https://developer.apple.com/library/ios/technotes/tn2232/ + // + // We must also avoid multiple uses of the trust object, per docs: + // "It is not safe to call this function concurrently with any other function that uses + // the same trust management object, or to re-enter this function for the same trust + // management object." + // + // SecTrustEvaluateAsync both does sync execution of Evaluate and calls back on the + // queue passed to it, according to at sources in + // http://www.opensource.apple.com/source/libsecurity_keychain/libsecurity_keychain-55050.9/lib/SecTrust.cpp + // It would require a global serial queue to ensure the evaluate happens only on a + // single thread at a time, so we'll stick with using SecTrustEvaluate on a background + // thread. + dispatch_queue_t evaluateBackgroundQueue = + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + dispatch_async(evaluateBackgroundQueue, ^{ + // It looks like the implementation of SecTrustEvaluate() on Mac grabs a global lock, + // so it may be redundant for us to also lock, but it's easy to synchronize here + // anyway. + SecTrustResultType trustEval = kSecTrustResultInvalid; + BOOL shouldAllow; + OSStatus trustError; + @synchronized([GTMSessionFetcher class]) { + GTMSessionMonitorSynchronized([GTMSessionFetcher class]); + + trustError = SecTrustEvaluate(serverTrust, &trustEval); + } + if (trustError != errSecSuccess) { + GTMSESSION_LOG_DEBUG(@"Error %d evaluating trust for %@", + (int)trustError, request); + shouldAllow = NO; + } else { + // Having a trust level "unspecified" by the user is the usual result, described at + // https://developer.apple.com/library/mac/qa/qa1360 + if (trustEval == kSecTrustResultUnspecified + || trustEval == kSecTrustResultProceed) { + shouldAllow = YES; + } else { + shouldAllow = NO; + GTMSESSION_LOG_DEBUG(@"Challenge SecTrustResultType %u for %@, properties: %@", + trustEval, request.URL.host, + CFBridgingRelease(SecTrustCopyProperties(serverTrust))); + } + } + handler(serverTrust, shouldAllow); + + CFRelease(serverTrust); + }); +} + +- (void)invokeOnCallbackQueueUnlessStopped:(void (^)(void))block { + [self invokeOnCallbackQueueAfterUserStopped:NO + block:block]; +} + +- (void)invokeOnCallbackQueueAfterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block { + GTMSessionCheckSynchronized(self); + + [self invokeOnCallbackUnsynchronizedQueueAfterUserStopped:afterStopped + block:block]; +} + +- (void)invokeOnCallbackUnsynchronizedQueueAfterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block { + // testBlock simulation code may not be synchronizing when this is invoked. + [self invokeOnCallbackQueue:_callbackQueue + afterUserStopped:afterStopped + block:block]; +} + +- (void)invokeOnCallbackQueue:(dispatch_queue_t)callbackQueue + afterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block { + if (callbackQueue) { + dispatch_group_async(_callbackGroup, callbackQueue, ^{ + if (!afterStopped) { + NSDate *serviceStoppedAllDate = [_service stoppedAllFetchersDate]; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Avoid a race between stopFetching and the callback. + if (_userStoppedFetching) { + return; + } + + // Also avoid calling back if the service has stopped all fetchers + // since this one was created. The fetcher may have stopped before + // stopAllFetchers was invoked, so _userStoppedFetching wasn't set, + // but the app still won't expect the callback to fire after + // the service's stopAllFetchers was invoked. + if (serviceStoppedAllDate + && [_initialBeginFetchDate compare:serviceStoppedAllDate] != NSOrderedDescending) { + // stopAllFetchers was called after this fetcher began. + return; + } + } // @synchronized(self) + } + block(); + }); + } +} + +- (void)invokeFetchCallbacksOnCallbackQueueWithData:(GTM_NULLABLE NSData *)data + error:(GTM_NULLABLE NSError *)error { + // Callbacks will be released in the method stopFetchReleasingCallbacks: + GTMSessionFetcherCompletionHandler handler; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + handler = _completionHandler; + + if (handler) { + [self invokeOnCallbackQueueUnlessStopped:^{ + handler(data, error); + + // Post a notification, primarily to allow code to collect responses for + // testing. + // + // The observing code is not likely on the fetcher's callback + // queue, so this posts explicitly to the main queue. + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (data) { + userInfo[kGTMSessionFetcherCompletionDataKey] = data; + } + if (error) { + userInfo[kGTMSessionFetcherCompletionErrorKey] = error; + } + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherCompletionInvokedNotification + userInfo:userInfo + requireAsync:NO]; + }]; + } + } // @synchronized(self) +} + +- (void)postNotificationOnMainThreadWithName:(NSString *)noteName + userInfo:(GTM_NULLABLE NSDictionary *)userInfo + requireAsync:(BOOL)requireAsync { + dispatch_block_t postBlock = ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:noteName + object:self + userInfo:userInfo]; + }; + + if ([NSThread isMainThread] && !requireAsync) { + // Post synchronously for compatibility with older code using the fetcher. + + // Avoid calling out to other code from inside a sync block to avoid risk + // of a deadlock or of recursive sync. + GTMSessionCheckNotSynchronized(self); + + postBlock(); + } else { + dispatch_async(dispatch_get_main_queue(), postBlock); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)uploadTask + needNewBodyStream:(void (^)(NSInputStream * GTM_NULLABLE_TYPE bodyStream))completionHandler { + [self setSessionTask:uploadTask]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ needNewBodyStream:", + [self class], self, session, uploadTask); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSessionFetcherBodyStreamProvider provider = _bodyStreamProvider; +#if !STRIP_GTM_FETCH_LOGGING + if ([self respondsToSelector:@selector(loggedStreamProviderForStreamProvider:)]) { + provider = [self performSelector:@selector(loggedStreamProviderForStreamProvider:) + withObject:provider]; + } +#endif + if (provider) { + [self invokeOnCallbackQueueUnlessStopped:^{ + provider(completionHandler); + }]; + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"NSURLSession expects a stream provider"); + + completionHandler(nil); + } + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didSendBodyData:%lld" + @" totalBytesSent:%lld totalBytesExpectedToSend:%lld", + [self class], self, session, task, bytesSent, totalBytesSent, + totalBytesExpectedToSend); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (!_sendProgressBlock) { + return; + } + // We won't hold on to send progress block; it's ok to not send it if the upload finishes. + [self invokeOnCallbackQueueUnlessStopped:^{ + GTMSessionFetcherSendProgressBlock progressBlock; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + progressBlock = _sendProgressBlock; + } + if (progressBlock) { + progressBlock(bytesSent, totalBytesSent, totalBytesExpectedToSend); + } + }]; + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data { + [self setSessionTask:dataTask]; + NSUInteger bufferLength = data.length; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ didReceiveData:%p (%llu bytes)", + [self class], self, session, dataTask, data, + (unsigned long long)bufferLength); + if (bufferLength == 0) { + // Observed on completing an out-of-process upload. + return; + } + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSessionFetcherAccumulateDataBlock accumulateBlock = _accumulateDataBlock; + if (accumulateBlock) { + // Let the client accumulate the data. + _downloadedLength += bufferLength; + [self invokeOnCallbackQueueUnlessStopped:^{ + accumulateBlock(data); + }]; + } else if (!_userStoppedFetching) { + // Append to the mutable data buffer unless the fetch has been cancelled. + + // Resumed upload tasks may not yet have a data buffer. + if (_downloadedData == nil) { + // Using NSClassFromString for iOS 6 compatibility. + GTMSESSION_ASSERT_DEBUG( + ![dataTask isKindOfClass:NSClassFromString(@"NSURLSessionDownloadTask")], + @"Resumed download tasks should not receive data bytes"); + _downloadedData = [[NSMutableData alloc] init]; + } + + [_downloadedData appendData:data]; + _downloadedLength = (int64_t)_downloadedData.length; + + // We won't hold on to receivedProgressBlock here; it's ok to not send + // it if the transfer finishes. + if (_receivedProgressBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + GTMSessionFetcherReceivedProgressBlock progressBlock; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + progressBlock = _receivedProgressBlock; + } + if (progressBlock) { + progressBlock((int64_t)bufferLength, _downloadedLength); + } + }]; + } + } + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ dataTask:%@ willCacheResponse:%@ %@", + [self class], self, session, dataTask, + proposedResponse, proposedResponse.response); + GTMSessionFetcherWillCacheURLResponseBlock callback; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + callback = _willCacheURLResponseBlock; + + if (callback) { + [self invokeOnCallbackQueueAfterUserStopped:YES + block:^{ + callback(proposedResponse, completionHandler); + }]; + } + } // @synchronized(self) + if (!callback) { + completionHandler(proposedResponse); + } +} + + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didWriteData:%lld" + @" bytesWritten:%lld totalBytesExpectedToWrite:%lld", + [self class], self, session, downloadTask, bytesWritten, + totalBytesWritten, totalBytesExpectedToWrite); + [self setSessionTask:downloadTask]; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if ((totalBytesExpectedToWrite != NSURLSessionTransferSizeUnknown) && + (totalBytesExpectedToWrite < totalBytesWritten)) { + // Have observed cases were bytesWritten == totalBytesExpectedToWrite, + // but totalBytesWritten > totalBytesExpectedToWrite, so setting to unkown in these cases. + totalBytesExpectedToWrite = NSURLSessionTransferSizeUnknown; + } + // We won't hold on to download progress block during the enqueue; + // it's ok to not send it if the upload finishes. + + [self invokeOnCallbackQueueUnlessStopped:^{ + GTMSessionFetcherDownloadProgressBlock progressBlock; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + progressBlock = _downloadProgressBlock; + } + if (progressBlock) { + progressBlock(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } + }]; + } // @synchronized(self) +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didResumeAtOffset:%lld" + @" expectedTotalBytes:%lld", + [self class], self, session, downloadTask, fileOffset, + expectedTotalBytes); + [self setSessionTask:downloadTask]; +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)downloadLocationURL { + // Download may have relaunched app, so update _sessionTask. + [self setSessionTask:downloadTask]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ downloadTask:%@ didFinishDownloadingToURL:%@", + [self class], self, session, downloadTask, downloadLocationURL); + NSNumber *fileSizeNum; + [downloadLocationURL getResourceValue:&fileSizeNum + forKey:NSURLFileSizeKey + error:NULL]; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURL *destinationURL = _destinationFileURL; + + _downloadedLength = fileSizeNum.longLongValue; + + // Overwrite any previous file at the destination URL. + NSFileManager *fileMgr = [NSFileManager defaultManager]; + NSError *removeError; + if (![fileMgr removeItemAtURL:destinationURL error:&removeError] + && removeError.code != NSFileNoSuchFileError) { + GTMSESSION_LOG_DEBUG(@"Could not remove previous file at %@ due to %@", + downloadLocationURL.path, removeError); + } + + NSInteger statusCode = [self statusCodeUnsynchronized]; + if (statusCode < 200 || statusCode > 399) { + // In OS X 10.11, the response body is written to a file even on a server + // status error. For convenience of the fetcher client, we'll skip saving the + // downloaded body to the destination URL so that clients do not need to know + // to delete the file following fetch errors. A downside of this is that + // the server may have included error details in the response body, and + // abandoning the downloaded file here means that the details from the + // body are not available to the fetcher client. + GTMSESSION_LOG_DEBUG(@"Abandoning download due to status %zd, file %@", + statusCode, downloadLocationURL.path); + } else { + NSError *moveError; + NSURL *destinationFolderURL = [destinationURL URLByDeletingLastPathComponent]; + BOOL didMoveDownload = NO; + if ([fileMgr createDirectoryAtURL:destinationFolderURL + withIntermediateDirectories:YES + attributes:nil + error:&moveError]) { + didMoveDownload = [fileMgr moveItemAtURL:downloadLocationURL + toURL:destinationURL + error:&moveError]; + } + if (!didMoveDownload) { + _downloadFinishedError = moveError; + } + GTM_LOG_BACKGROUND_SESSION(@"%@ %p Moved download from \"%@\" to \"%@\" %@", + [self class], self, + downloadLocationURL.path, destinationURL.path, + error ? error : @""); + } + } // @synchronized(self) +} + +/* Sent as the last message related to a specific task. Error may be + * nil, which implies that no error occurred and this task is complete. + */ +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error { + [self setSessionTask:task]; + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ task:%@ didCompleteWithError:%@", + [self class], self, session, task, error); + + NSInteger status = self.statusCode; + BOOL forceAssumeRetry = NO; + BOOL succeeded = NO; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + // The task is never resumed when a testBlock is used. When the session is destroyed, + // we should ignore the callback, since the testBlock support code itself invokes + // shouldRetryNowForStatus: and finishWithError:shouldRetry: + if (_isUsingTestBlock) return; +#endif + + if (error == nil) { + error = _downloadFinishedError; + } + succeeded = (error == nil && status >= 0 && status < 300); + if (succeeded) { + // Succeeded. + _bodyLength = task.countOfBytesSent; + } + } // @synchronized(self) + + if (succeeded) { + [self finishWithError:nil shouldRetry:NO]; + return; + } + // For background redirects, no delegate method is called, so we cannot restore a stripped + // Authorization header, so if a 403 ("Forbidden") was generated due to a missing OAuth 2 header, + // set the current request's URL to the redirected URL, so we in effect restore the Authorization + // header. + if ((status == 403) && self.usingBackgroundSession) { + NSURL *redirectURL = self.response.URL; + NSURLRequest *request = self.request; + if (![request.URL isEqual:redirectURL]) { + NSString *authorizationHeader = [request.allHTTPHeaderFields objectForKey:@"Authorization"]; + if (authorizationHeader != nil) { + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + mutableRequest.URL = redirectURL; + [self updateMutableRequest:mutableRequest]; + // Avoid assuming the session is still valid. + self.session = nil; + forceAssumeRetry = YES; + } + } + } + + // If invalidating the session was deferred in stopFetchReleasingCallbacks: then do it now. + NSURLSession *oldSession = self.sessionNeedingInvalidation; + if (oldSession) { + [self setSessionNeedingInvalidation:NULL]; + [oldSession finishTasksAndInvalidate]; + } + + // Failed. + [self shouldRetryNowForStatus:status + error:error + forceAssumeRetry:forceAssumeRetry + response:^(BOOL shouldRetry) { + [self finishWithError:error shouldRetry:shouldRetry]; + }]; +} + +#if TARGET_OS_IPHONE +- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSessionDidFinishEventsForBackgroundURLSession:%@", + [self class], self, session); + [self removePersistedBackgroundSessionFromDefaults]; + + GTMSessionFetcherSystemCompletionHandler handler; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + handler = self.systemCompletionHandler; + self.systemCompletionHandler = nil; + } // @synchronized(self) + if (handler) { + GTM_LOG_BACKGROUND_SESSION(@"%@ %p Calling system completionHandler", [self class], self); + handler(); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURLSession *oldSession = _session; + _session = nil; + if (_shouldInvalidateSession) { + [oldSession finishTasksAndInvalidate]; + } + } // @synchronized(self) + } +} +#endif + +- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(GTM_NULLABLE NSError *)error { + // This may happen repeatedly for retries. On authentication callbacks, the retry + // may begin before the prior session sends the didBecomeInvalid delegate message. + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ didBecomeInvalidWithError:%@", + [self class], self, session, error); + if (session == (NSURLSession *)self.session) { + GTM_LOG_SESSION_DELEGATE(@" Unexpected retained invalid session: %@", session); + self.session = nil; + } +} + +- (void)finishWithError:(GTM_NULLABLE NSError *)error shouldRetry:(BOOL)shouldRetry { + [self removePersistedBackgroundSessionFromDefaults]; + + BOOL shouldStopFetching = YES; + NSData *downloadedData = nil; +#if !STRIP_GTM_FETCH_LOGGING + BOOL shouldDeferLogging = NO; +#endif + BOOL shouldBeginRetryTimer = NO; + NSInteger status = [self statusCode]; + NSURL *destinationURL = self.destinationFileURL; + + BOOL fetchSucceeded = (error == nil && status >= 0 && status < 300); + +#if !STRIP_GTM_FETCH_LOGGING + if (!fetchSucceeded) { + if (!shouldDeferLogging && !self.hasLoggedError) { + [self logNowWithError:error]; + self.hasLoggedError = YES; + } + } +#endif // !STRIP_GTM_FETCH_LOGGING + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + +#if !STRIP_GTM_FETCH_LOGGING + shouldDeferLogging = _deferResponseBodyLogging; +#endif + if (fetchSucceeded) { + // Success + if ((_downloadedData.length > 0) && (destinationURL != nil)) { + // Overwrite any previous file at the destination URL. + NSFileManager *fileMgr = [NSFileManager defaultManager]; + [fileMgr removeItemAtURL:destinationURL + error:NULL]; + NSURL *destinationFolderURL = [destinationURL URLByDeletingLastPathComponent]; + BOOL didMoveDownload = NO; + if ([fileMgr createDirectoryAtURL:destinationFolderURL + withIntermediateDirectories:YES + attributes:nil + error:&error]) { + didMoveDownload = [_downloadedData writeToURL:destinationURL + options:NSDataWritingAtomic + error:&error]; + } + if (didMoveDownload) { + _downloadedData = nil; + } else { + _downloadFinishedError = error; + } + } + downloadedData = _downloadedData; + } else { + // Unsuccessful with error or status over 300. Retry or notify the delegate of failure + if (shouldRetry) { + // Retrying. + shouldBeginRetryTimer = YES; + shouldStopFetching = NO; + } else { + if (error == nil) { + // Create an error. + NSDictionary *userInfo = nil; + if (_downloadedData.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : _downloadedData }; + } + error = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain + code:status + userInfo:userInfo]; + } else { + // If the error had resume data, and the client supplied a resume block, pass the + // data to the client. + void (^resumeBlock)(NSData *) = _resumeDataBlock; + _resumeDataBlock = nil; + if (resumeBlock) { + NSData *resumeData = [error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData]; + if (resumeData) { + [self invokeOnCallbackQueueAfterUserStopped:YES block:^{ + resumeBlock(resumeData); + }]; + } + } + } + if (_downloadedData.length > 0) { + downloadedData = _downloadedData; + } + // If the error occurred after retries, report the number and duration of the + // retries. This provides a clue to a developer looking at the error description + // that the fetcher did retry before failing with this error. + if (_retryCount > 0) { + NSMutableDictionary *userInfoWithRetries = + [NSMutableDictionary dictionaryWithDictionary:(NSDictionary *)error.userInfo]; + NSTimeInterval timeSinceInitialRequest = -[_initialRequestDate timeIntervalSinceNow]; + [userInfoWithRetries setObject:@(timeSinceInitialRequest) + forKey:kGTMSessionFetcherElapsedIntervalWithRetriesKey]; + [userInfoWithRetries setObject:@(_retryCount) + forKey:kGTMSessionFetcherNumberOfRetriesDoneKey]; + error = [NSError errorWithDomain:(NSString *)error.domain + code:error.code + userInfo:userInfoWithRetries]; + } + } + } + } // @synchronized(self) + + if (shouldBeginRetryTimer) { + [self beginRetryTimer]; + } + + // We want to send the stop notification before calling the delegate's + // callback selector, since the callback selector may release all of + // the fetcher properties that the client is using to track the fetches. + // + // We'll also stop now so that, to any observers watching the notifications, + // it doesn't look like our wait for a retry (which may be long, + // 30 seconds or more) is part of the network activity. + [self sendStopNotificationIfNeeded]; + + if (shouldStopFetching) { + [self invokeFetchCallbacksOnCallbackQueueWithData:downloadedData + error:error]; + // The upload subclass doesn't want to release callbacks until upload chunks have completed. + BOOL shouldRelease = [self shouldReleaseCallbacksUponCompletion]; + [self stopFetchReleasingCallbacks:shouldRelease]; + } + +#if !STRIP_GTM_FETCH_LOGGING + // _hasLoggedError is only set by this method + if (!shouldDeferLogging && !_hasLoggedError) { + [self logNowWithError:error]; + } +#endif +} + +- (BOOL)shouldReleaseCallbacksUponCompletion { + // A subclass can override this to keep callbacks around after the + // connection has finished successfully + return YES; +} + +- (void)logNowWithError:(GTM_NULLABLE NSError *)error { + GTMSessionCheckNotSynchronized(self); + + // If the logging category is available, then log the current request, + // response, data, and error + if ([self respondsToSelector:@selector(logFetchWithError:)]) { + [self performSelector:@selector(logFetchWithError:) withObject:error]; + } +} + +#pragma mark Retries + +- (BOOL)isRetryError:(NSError *)error { + struct RetryRecord { + __unsafe_unretained NSString *const domain; + NSInteger code; + }; + + struct RetryRecord retries[] = { + { kGTMSessionFetcherStatusDomain, 408 }, // request timeout + { kGTMSessionFetcherStatusDomain, 502 }, // failure gatewaying to another server + { kGTMSessionFetcherStatusDomain, 503 }, // service unavailable + { kGTMSessionFetcherStatusDomain, 504 }, // request timeout + { NSURLErrorDomain, NSURLErrorTimedOut }, + { NSURLErrorDomain, NSURLErrorNetworkConnectionLost }, + { nil, 0 } + }; + + // NSError's isEqual always returns false for equal but distinct instances + // of NSError, so we have to compare the domain and code values explicitly + NSString *domain = error.domain; + NSInteger code = error.code; + for (int idx = 0; retries[idx].domain != nil; idx++) { + if (code == retries[idx].code && [domain isEqual:retries[idx].domain]) { + return YES; + } + } + return NO; +} + +// shouldRetryNowForStatus:error: responds with YES if the user has enabled retries +// and the status or error is one that is suitable for retrying. "Suitable" +// means either the isRetryError:'s list contains the status or error, or the +// user's retry block is present and returns YES when called, or the +// authorizer may be able to fix. +- (void)shouldRetryNowForStatus:(NSInteger)status + error:(NSError *)error + forceAssumeRetry:(BOOL)forceAssumeRetry + response:(GTMSessionFetcherRetryResponse)response { + // Determine if a refreshed authorizer may avoid an authorization error + BOOL willRetry = NO; + + // We assume _authorizer is immutable after beginFetch, and _hasAttemptedAuthRefresh is modified + // only in this method, and this method is invoked on the serial delegate queue. + // + // We want to avoid calling the authorizer from inside a sync block. + BOOL isFirstAuthError = (_authorizer != nil + && !_hasAttemptedAuthRefresh + && status == GTMSessionFetcherStatusUnauthorized); // 401 + + BOOL hasPrimed = NO; + if (isFirstAuthError) { + if ([_authorizer respondsToSelector:@selector(primeForRefresh)]) { + hasPrimed = [_authorizer primeForRefresh]; + } + } + + BOOL shouldRetryForAuthRefresh = NO; + if (hasPrimed) { + shouldRetryForAuthRefresh = YES; + _hasAttemptedAuthRefresh = YES; + [self updateRequestValue:nil forHTTPHeaderField:@"Authorization"]; + } + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + BOOL shouldDoRetry = [self isRetryEnabledUnsynchronized]; + if (shouldDoRetry && ![self hasRetryAfterInterval]) { + + // Determine if we're doing exponential backoff retries + shouldDoRetry = [self nextRetryIntervalUnsynchronized] < _maxRetryInterval; + + if (shouldDoRetry) { + // If an explicit max retry interval was set, we expect repeated backoffs to take + // up to roughly twice that for repeated fast failures. If the initial attempt is + // already more than 3 times the max retry interval, then failures have taken a long time + // (such as from network timeouts) so don't retry again to avoid the app becoming + // unexpectedly unresponsive. + if (_maxRetryInterval > 0) { + NSTimeInterval maxAllowedIntervalBeforeRetry = _maxRetryInterval * 3; + NSTimeInterval timeSinceInitialRequest = -[_initialRequestDate timeIntervalSinceNow]; + if (timeSinceInitialRequest > maxAllowedIntervalBeforeRetry) { + shouldDoRetry = NO; + } + } + } + } + BOOL canRetry = shouldRetryForAuthRefresh || forceAssumeRetry || shouldDoRetry; + if (canRetry) { + NSDictionary *userInfo = nil; + if (_downloadedData.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : _downloadedData }; + } + NSError *statusError = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain + code:status + userInfo:userInfo]; + if (error == nil) { + error = statusError; + } + willRetry = shouldRetryForAuthRefresh || + forceAssumeRetry || + [self isRetryError:error] || + ((error != statusError) && [self isRetryError:statusError]); + + // If the user has installed a retry callback, consult that. + GTMSessionFetcherRetryBlock retryBlock = _retryBlock; + if (retryBlock) { + [self invokeOnCallbackQueueUnlessStopped:^{ + retryBlock(willRetry, error, response); + }]; + return; + } + } + } // @synchronized(self) + response(willRetry); +} + +- (BOOL)hasRetryAfterInterval { + GTMSessionCheckSynchronized(self); + + NSDictionary *responseHeaders = [self responseHeadersUnsynchronized]; + NSString *retryAfterValue = [responseHeaders valueForKey:@"Retry-After"]; + return (retryAfterValue != nil); +} + +- (NSTimeInterval)retryAfterInterval { + GTMSessionCheckSynchronized(self); + + NSDictionary *responseHeaders = [self responseHeadersUnsynchronized]; + NSString *retryAfterValue = [responseHeaders valueForKey:@"Retry-After"]; + if (retryAfterValue == nil) { + return 0; + } + // Retry-After formatted as HTTP-date | delta-seconds + // Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + NSDateFormatter *rfc1123DateFormatter = [[NSDateFormatter alloc] init]; + rfc1123DateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; + rfc1123DateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; + rfc1123DateFormatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss z"; + NSDate *retryAfterDate = [rfc1123DateFormatter dateFromString:retryAfterValue]; + NSTimeInterval retryAfterInterval = (retryAfterDate != nil) ? + retryAfterDate.timeIntervalSinceNow : retryAfterValue.intValue; + retryAfterInterval = MAX(0, retryAfterInterval); + return retryAfterInterval; +} + +- (void)beginRetryTimer { + if (![NSThread isMainThread]) { + // Defer creating and starting the timer until we're on the main thread to ensure it has + // a run loop. + dispatch_group_async(_callbackGroup, dispatch_get_main_queue(), ^{ + [self beginRetryTimer]; + }); + return; + } + + [self destroyRetryTimer]; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSTimeInterval nextInterval = [self nextRetryIntervalUnsynchronized]; + NSTimeInterval maxInterval = _maxRetryInterval; + NSTimeInterval newInterval = MIN(nextInterval, (maxInterval > 0 ? maxInterval : DBL_MAX)); + NSTimeInterval newIntervalTolerance = (newInterval / 10) > 1.0 ?: 1.0; + + _lastRetryInterval = newInterval; + + _retryTimer = [NSTimer timerWithTimeInterval:newInterval + target:self + selector:@selector(retryTimerFired:) + userInfo:nil + repeats:NO]; + _retryTimer.tolerance = newIntervalTolerance; + [[NSRunLoop mainRunLoop] addTimer:_retryTimer + forMode:NSDefaultRunLoopMode]; + } // @synchronized(self) + + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherRetryDelayStartedNotification + userInfo:nil + requireAsync:NO]; +} + +- (void)retryTimerFired:(NSTimer *)timer { + [self destroyRetryTimer]; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _retryCount++; + } // @synchronized(self) + + NSOperationQueue *queue = self.sessionDelegateQueue; + [queue addOperationWithBlock:^{ + [self retryFetch]; + }]; +} + +- (void)destroyRetryTimer { + BOOL shouldNotify = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_retryTimer) { + [_retryTimer invalidate]; + _retryTimer = nil; + shouldNotify = YES; + } + } + + if (shouldNotify) { + [self postNotificationOnMainThreadWithName:kGTMSessionFetcherRetryDelayStoppedNotification + userInfo:nil + requireAsync:NO]; + } +} + +- (NSUInteger)retryCount { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _retryCount; + } // @synchronized(self) +} + +- (NSTimeInterval)nextRetryInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSTimeInterval interval = [self nextRetryIntervalUnsynchronized]; + return interval; + } // @synchronized(self) +} + +- (NSTimeInterval)nextRetryIntervalUnsynchronized { + GTMSessionCheckSynchronized(self); + + NSInteger statusCode = [self statusCodeUnsynchronized]; + if ((statusCode == 503) && [self hasRetryAfterInterval]) { + NSTimeInterval secs = [self retryAfterInterval]; + return secs; + } + // The next wait interval is the factor (2.0) times the last interval, + // but never less than the minimum interval. + NSTimeInterval secs = _lastRetryInterval * _retryFactor; + if (_maxRetryInterval > 0) { + secs = MIN(secs, _maxRetryInterval); + } + secs = MAX(secs, _minRetryInterval); + + return secs; +} + +- (NSTimer *)retryTimer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _retryTimer; + } // @synchronized(self) +} + +- (BOOL)isRetryEnabled { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _isRetryEnabled; + } // @synchronized(self) +} + +- (BOOL)isRetryEnabledUnsynchronized { + GTMSessionCheckSynchronized(self); + + return _isRetryEnabled; +} + +- (void)setRetryEnabled:(BOOL)flag { + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (flag && !_isRetryEnabled) { + // We defer initializing these until the user calls setRetryEnabled + // to avoid using the random number generator if it's not needed. + // However, this means min and max intervals for this fetcher are reset + // as a side effect of calling setRetryEnabled. + // + // Make an initial retry interval random between 1.0 and 2.0 seconds + _minRetryInterval = InitialMinRetryInterval(); + _maxRetryInterval = kUnsetMaxRetryInterval; + _retryFactor = 2.0; + _lastRetryInterval = 0.0; + } + _isRetryEnabled = flag; + } // @synchronized(self) +}; + +- (NSTimeInterval)maxRetryInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _maxRetryInterval; + } // @synchronized(self) +} + +- (void)setMaxRetryInterval:(NSTimeInterval)secs { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (secs > 0) { + _maxRetryInterval = secs; + } else { + _maxRetryInterval = kUnsetMaxRetryInterval; + } + } // @synchronized(self) +} + +- (double)minRetryInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _minRetryInterval; + } // @synchronized(self) +} + +- (void)setMinRetryInterval:(NSTimeInterval)secs { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (secs > 0) { + _minRetryInterval = secs; + } else { + // Set min interval to a random value between 1.0 and 2.0 seconds + // so that if multiple clients start retrying at the same time, they'll + // repeat at different times and avoid overloading the server + _minRetryInterval = InitialMinRetryInterval(); + } + } // @synchronized(self) + +} + +#pragma mark iOS System Completion Handlers + +#if TARGET_OS_IPHONE +static NSMutableDictionary *gSystemCompletionHandlers = nil; + +- (GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler { + return [[self class] systemCompletionHandlerForSessionIdentifier:_sessionIdentifier]; +} + +- (void)setSystemCompletionHandler:(GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler { + [[self class] setSystemCompletionHandler:systemCompletionHandler + forSessionIdentifier:_sessionIdentifier]; +} + ++ (void)setSystemCompletionHandler:(GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandler + forSessionIdentifier:(NSString *)sessionIdentifier { + if (!sessionIdentifier) { + NSLog(@"%s with nil identifier", __PRETTY_FUNCTION__); + return; + } + + @synchronized([GTMSessionFetcher class]) { + if (gSystemCompletionHandlers == nil && systemCompletionHandler != nil) { + gSystemCompletionHandlers = [[NSMutableDictionary alloc] init]; + } + // Use setValue: to remove the object if completionHandler is nil. + [gSystemCompletionHandlers setValue:systemCompletionHandler + forKey:sessionIdentifier]; + } +} + ++ (GTM_NULLABLE GTMSessionFetcherSystemCompletionHandler)systemCompletionHandlerForSessionIdentifier:(NSString *)sessionIdentifier { + if (!sessionIdentifier) { + return nil; + } + @synchronized([GTMSessionFetcher class]) { + return [gSystemCompletionHandlers objectForKey:sessionIdentifier]; + } +} +#endif // TARGET_OS_IPHONE + +#pragma mark Getters and Setters + +@synthesize downloadResumeData = _downloadResumeData, + configuration = _configuration, + configurationBlock = _configurationBlock, + sessionTask = _sessionTask, + wasCreatedFromBackgroundSession = _wasCreatedFromBackgroundSession, + sessionUserInfo = _sessionUserInfo, + taskDescription = _taskDescription, + taskPriority = _taskPriority, + usingBackgroundSession = _usingBackgroundSession, + canShareSession = _canShareSession, + completionHandler = _completionHandler, + credential = _credential, + proxyCredential = _proxyCredential, + bodyData = _bodyData, + bodyLength = _bodyLength, + service = _service, + serviceHost = _serviceHost, + accumulateDataBlock = _accumulateDataBlock, + receivedProgressBlock = _receivedProgressBlock, + downloadProgressBlock = _downloadProgressBlock, + resumeDataBlock = _resumeDataBlock, + didReceiveResponseBlock = _didReceiveResponseBlock, + challengeBlock = _challengeBlock, + willRedirectBlock = _willRedirectBlock, + sendProgressBlock = _sendProgressBlock, + willCacheURLResponseBlock = _willCacheURLResponseBlock, + retryBlock = _retryBlock, + retryFactor = _retryFactor, + allowedInsecureSchemes = _allowedInsecureSchemes, + allowLocalhostRequest = _allowLocalhostRequest, + allowInvalidServerCertificates = _allowInvalidServerCertificates, + cookieStorage = _cookieStorage, + callbackQueue = _callbackQueue, + initialBeginFetchDate = _initialBeginFetchDate, + testBlock = _testBlock, + testBlockAccumulateDataChunkCount = _testBlockAccumulateDataChunkCount, + comment = _comment, + log = _log; + +#if !STRIP_GTM_FETCH_LOGGING +@synthesize redirectedFromURL = _redirectedFromURL, + logRequestBody = _logRequestBody, + logResponseBody = _logResponseBody, + hasLoggedError = _hasLoggedError; +#endif + +#if GTM_BACKGROUND_TASK_FETCHING +@synthesize backgroundTaskIdentifier = _backgroundTaskIdentifier, + skipBackgroundTask = _skipBackgroundTask; +#endif + +- (GTM_NULLABLE NSURLRequest *)request { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_request copy]; + } // @synchronized(self) +} + +- (void)setRequest:(GTM_NULLABLE NSURLRequest *)request { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (![self isFetchingUnsynchronized]) { + _request = [request mutableCopy]; + } else { + GTMSESSION_ASSERT_DEBUG(0, @"request may not be set after beginFetch has been invoked"); + } + } // @synchronized(self) +} + +- (GTM_NULLABLE NSMutableURLRequest *)mutableRequestForTesting { + // Allow tests only to modify the request, useful during retries. + return _request; +} + +- (GTM_NULLABLE NSMutableURLRequest *)mutableRequest { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_LOG_DEBUG(@"[GTMSessionFetcher mutableRequest] is deprecated; use -request or" + @" -setRequestValue:forHTTPHeaderField:"); + + return _request; + } // @synchronized(self) +} + +- (void)setMutableRequest:(GTM_NULLABLE NSMutableURLRequest *)request { + GTMSESSION_LOG_DEBUG(@"[GTMSessionFetcher setMutableRequest:] is deprecated; use -request or" + @" -setRequestValue:forHTTPHeaderField:"); + + GTMSESSION_ASSERT_DEBUG(![self isFetching], + @"mutableRequest should not change after beginFetch has been invoked"); + [self updateMutableRequest:request]; +} + +// Internal method for updating the request property such as on redirects. +- (void)updateMutableRequest:(GTM_NULLABLE NSMutableURLRequest *)request { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _request = request; + } // @synchronized(self) +} + +// Set a header field value on the request. Header field value changes will not +// affect a fetch after the fetch has begun. +- (void)setRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field { + if (![self isFetching]) { + [self updateRequestValue:value forHTTPHeaderField:field]; + } else { + GTMSESSION_ASSERT_DEBUG(0, @"request may not be set after beginFetch has been invoked"); + } +} + +// Internal method for updating request headers. +- (void)updateRequestValue:(GTM_NULLABLE NSString *)value forHTTPHeaderField:(NSString *)field { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [_request setValue:value forHTTPHeaderField:field]; + } // @synchronized(self) +} + +- (void)setResponse:(GTM_NULLABLE NSURLResponse *)response { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _response = response; + } // @synchronized(self) +} + +- (int64_t)bodyLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_bodyLength == NSURLSessionTransferSizeUnknown) { + if (_bodyData) { + _bodyLength = (int64_t)_bodyData.length; + } else if (_bodyFileURL) { + NSNumber *fileSizeNum = nil; + NSError *fileSizeError = nil; + if ([_bodyFileURL getResourceValue:&fileSizeNum + forKey:NSURLFileSizeKey + error:&fileSizeError]) { + _bodyLength = [fileSizeNum longLongValue]; + } + } + } + return _bodyLength; + } // @synchronized(self) +} + +- (BOOL)useUploadTask { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _useUploadTask; + } // @synchronized(self) +} + +- (void)setUseUploadTask:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (flag != _useUploadTask) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"useUploadTask should not change after beginFetch has been invoked"); + _useUploadTask = flag; + } + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURL *)bodyFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _bodyFileURL; + } // @synchronized(self) +} + +- (void)setBodyFileURL:(GTM_NULLABLE NSURL *)fileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // The comparison here is a trivial optimization and forgiveness for any client that + // repeatedly sets the property, so it just uses pointer comparison rather than isEqual:. + if (fileURL != _bodyFileURL) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"fileURL should not change after beginFetch has been invoked"); + + _bodyFileURL = fileURL; + } + } // @synchronized(self) +} + +- (GTM_NULLABLE GTMSessionFetcherBodyStreamProvider)bodyStreamProvider { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _bodyStreamProvider; + } // @synchronized(self) +} + +- (void)setBodyStreamProvider:(GTM_NULLABLE GTMSessionFetcherBodyStreamProvider)block { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"stream provider should not change after beginFetch has been invoked"); + + _bodyStreamProvider = [block copy]; + } // @synchronized(self) +} + +- (GTM_NULLABLE id)authorizer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _authorizer; + } // @synchronized(self) +} + +- (void)setAuthorizer:(GTM_NULLABLE id)authorizer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (authorizer != _authorizer) { + if ([self isFetchingUnsynchronized]) { + GTMSESSION_ASSERT_DEBUG(0, @"authorizer should not change after beginFetch has been invoked"); + } else { + _authorizer = authorizer; + } + } + } // @synchronized(self) +} + +- (GTM_NULLABLE NSData *)downloadedData { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _downloadedData; + } // @synchronized(self) +} + +- (void)setDownloadedData:(GTM_NULLABLE NSData *)data { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _downloadedData = [data mutableCopy]; + } // @synchronized(self) +} + +- (int64_t)downloadedLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _downloadedLength; + } // @synchronized(self) +} + +- (void)setDownloadedLength:(int64_t)length { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _downloadedLength = length; + } // @synchronized(self) +} + +- (dispatch_queue_t GTM_NONNULL_TYPE)callbackQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _callbackQueue; + } // @synchronized(self) +} + +- (void)setCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _callbackQueue = queue ?: dispatch_get_main_queue(); + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _session; + } // @synchronized(self) +} + +- (NSInteger)servicePriority { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _servicePriority; + } // @synchronized(self) +} + +- (void)setServicePriority:(NSInteger)value { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (value != _servicePriority) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"servicePriority should not change after beginFetch has been invoked"); + + _servicePriority = value; + } + } // @synchronized(self) +} + + +- (void)setSession:(GTM_NULLABLE NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _session = session; + } // @synchronized(self) +} + +- (BOOL)canShareSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _canShareSession; + } // @synchronized(self) +} + +- (void)setCanShareSession:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _canShareSession = flag; + } // @synchronized(self) +} + +- (BOOL)useBackgroundSession { + // This reflects if the user requested a background session, not necessarily + // if one was created. That is tracked with _usingBackgroundSession. + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _userRequestedBackgroundSession; + } // @synchronized(self) +} + +- (void)setUseBackgroundSession:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (flag != _userRequestedBackgroundSession) { + GTMSESSION_ASSERT_DEBUG(![self isFetchingUnsynchronized], + @"useBackgroundSession should not change after beginFetch has been invoked"); + + _userRequestedBackgroundSession = flag; + } + } // @synchronized(self) +} + +- (BOOL)isUsingBackgroundSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _usingBackgroundSession; + } // @synchronized(self) +} + +- (void)setUsingBackgroundSession:(BOOL)flag { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _usingBackgroundSession = flag; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURLSession *)sessionNeedingInvalidation { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _sessionNeedingInvalidation; + } // @synchronized(self) +} + +- (void)setSessionNeedingInvalidation:(GTM_NULLABLE NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _sessionNeedingInvalidation = session; + } // @synchronized(self) +} + +- (NSOperationQueue * GTM_NONNULL_TYPE)sessionDelegateQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateQueue; + } // @synchronized(self) +} + +- (void)setSessionDelegateQueue:(NSOperationQueue * GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (queue != _delegateQueue) { + if ([self isFetchingUnsynchronized]) { + GTMSESSION_ASSERT_DEBUG(0, @"sessionDelegateQueue should not change after fetch begins"); + } else { + _delegateQueue = queue ?: [NSOperationQueue mainQueue]; + } + } + } // @synchronized(self) +} + +- (BOOL)userStoppedFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _userStoppedFetching; + } // @synchronized(self) +} + +- (GTM_NULLABLE id)userData { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _userData; + } // @synchronized(self) +} + +- (void)setUserData:(GTM_NULLABLE id)theObj { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _userData = theObj; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSURL *)destinationFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _destinationFileURL; + } // @synchronized(self) +} + +- (void)setDestinationFileURL:(GTM_NULLABLE NSURL *)destinationFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (((_destinationFileURL == nil) && (destinationFileURL == nil)) || + [_destinationFileURL isEqual:destinationFileURL]) { + return; + } + if (_sessionIdentifier) { + // This is something we don't expect to happen in production. + // However if it ever happen, leave a system log. + NSLog(@"%@: Destination File URL changed from (%@) to (%@) after session identifier has " + @"been created.", + [self class], _destinationFileURL, destinationFileURL); +#if DEBUG + // On both the simulator and devices, the path can change to the download file, but the name + // shouldn't change. Technically, this isn't supported in the fetcher, but the change of + // URL is expected to happen only across development runs through Xcode. + NSString *oldFilename = [_destinationFileURL lastPathComponent]; + NSString *newFilename = [destinationFileURL lastPathComponent]; + #pragma unused(oldFilename) + #pragma unused(newFilename) + GTMSESSION_ASSERT_DEBUG([oldFilename isEqualToString:newFilename], + @"Destination File URL cannot be changed after session identifier has been created"); +#endif + } + _destinationFileURL = destinationFileURL; + } // @synchronized(self) +} + +- (void)setProperties:(GTM_NULLABLE NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _properties = [dict mutableCopy]; + } // @synchronized(self) +} + +- (GTM_NULLABLE NSDictionary *)properties { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _properties; + } // @synchronized(self) +} + +- (void)setProperty:(GTM_NULLABLE id)obj forKey:(NSString *)key { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_properties == nil && obj != nil) { + _properties = [[NSMutableDictionary alloc] init]; + } + [_properties setValue:obj forKey:key]; + } // @synchronized(self) +} + +- (GTM_NULLABLE id)propertyForKey:(NSString *)key { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_properties objectForKey:key]; + } // @synchronized(self) +} + +- (void)addPropertiesFromDictionary:(NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_properties == nil && dict != nil) { + [self setProperties:[dict mutableCopy]]; + } else { + [_properties addEntriesFromDictionary:dict]; + } + } // @synchronized(self) +} + +- (void)setCommentWithFormat:(id)format, ... { +#if !STRIP_GTM_FETCH_LOGGING + NSString *result = format; + if (format) { + va_list argList; + va_start(argList, format); + + result = [[NSString alloc] initWithFormat:format + arguments:argList]; + va_end(argList); + } + [self setComment:result]; +#endif +} + +#if !STRIP_GTM_FETCH_LOGGING +- (NSData *)loggedStreamData { + return _loggedStreamData; +} + +- (void)appendLoggedStreamData:dataToAdd { + if (!_loggedStreamData) { + _loggedStreamData = [NSMutableData data]; + } + [_loggedStreamData appendData:dataToAdd]; +} + +- (void)clearLoggedStreamData { + _loggedStreamData = nil; +} + +- (void)setDeferResponseBodyLogging:(BOOL)deferResponseBodyLogging { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (deferResponseBodyLogging != _deferResponseBodyLogging) { + _deferResponseBodyLogging = deferResponseBodyLogging; + if (!deferResponseBodyLogging && !self.hasLoggedError) { + [_delegateQueue addOperationWithBlock:^{ + [self logNowWithError:nil]; + }]; + } + } + } // @synchronized(self) +} + +- (BOOL)deferResponseBodyLogging { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _deferResponseBodyLogging; + } // @synchronized(self) +} + +#else ++ (void)setLoggingEnabled:(BOOL)flag { +} + ++ (BOOL)isLoggingEnabled { + return NO; +} +#endif // STRIP_GTM_FETCH_LOGGING + +@end + +@implementation GTMSessionFetcher (BackwardsCompatibilityOnly) + +- (void)setCookieStorageMethod:(NSInteger)method { + // For backwards compatibility with the old fetcher, we'll support the old constants. + // + // Clients using the GTMSessionFetcher class should set the cookie storage explicitly + // themselves. + NSHTTPCookieStorage *storage = nil; + switch(method) { + case 0: // kGTMHTTPFetcherCookieStorageMethodStatic + // nil storage will use [[self class] staticCookieStorage] when the fetch begins. + break; + case 1: // kGTMHTTPFetcherCookieStorageMethodFetchHistory + // Do nothing; use whatever was set by the fetcher service. + return; + case 2: // kGTMHTTPFetcherCookieStorageMethodSystemDefault + storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; + break; + case 3: // kGTMHTTPFetcherCookieStorageMethodNone + // Create temporary storage for this fetcher only. + storage = [[GTMSessionCookieStorage alloc] init]; + break; + default: + GTMSESSION_ASSERT_DEBUG(0, @"Invalid cookie storage method: %d", (int)method); + } + self.cookieStorage = storage; +} + +@end + +@implementation GTMSessionCookieStorage { + NSMutableArray *_cookies; + NSHTTPCookieAcceptPolicy _policy; +} + +- (id)init { + self = [super init]; + if (self != nil) { + _cookies = [[NSMutableArray alloc] init]; + } + return self; +} + +- (GTM_NULLABLE NSArray *)cookies { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_cookies copy]; + } // @synchronized(self) +} + +- (void)setCookie:(NSHTTPCookie *)cookie { + if (!cookie) return; + if (_policy == NSHTTPCookieAcceptPolicyNever) return; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self internalSetCookie:cookie]; + } // @synchronized(self) +} + +// Note: this should only be called from inside a @synchronized(self) block. +- (void)internalSetCookie:(NSHTTPCookie *)newCookie { + GTMSessionCheckSynchronized(self); + + if (_policy == NSHTTPCookieAcceptPolicyNever) return; + + BOOL isValidCookie = (newCookie.name.length > 0 + && newCookie.domain.length > 0 + && newCookie.path.length > 0); + GTMSESSION_ASSERT_DEBUG(isValidCookie, @"invalid cookie: %@", newCookie); + + if (isValidCookie) { + // Remove the cookie if it's currently in the array. + NSHTTPCookie *oldCookie = [self cookieMatchingCookie:newCookie]; + if (oldCookie) { + [_cookies removeObjectIdenticalTo:oldCookie]; + } + + if (![[self class] hasCookieExpired:newCookie]) { + [_cookies addObject:newCookie]; + } + } +} + +// Add all cookies in the new cookie array to the storage, +// replacing stored cookies as appropriate. +// +// Side effect: removes expired cookies from the storage array. +- (void)setCookies:(GTM_NULLABLE NSArray *)newCookies { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self removeExpiredCookies]; + + for (NSHTTPCookie *newCookie in newCookies) { + [self internalSetCookie:newCookie]; + } + } // @synchronized(self) +} + +- (void)setCookies:(NSArray *)cookies forURL:(GTM_NULLABLE NSURL *)URL mainDocumentURL:(GTM_NULLABLE NSURL *)mainDocumentURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_policy == NSHTTPCookieAcceptPolicyNever) { + return; + } + + if (_policy == NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain) { + NSString *mainHost = mainDocumentURL.host; + NSString *associatedHost = URL.host; + if (!mainHost || ![associatedHost hasSuffix:mainHost]) { + return; + } + } + } // @synchronized(self) + [self setCookies:cookies]; +} + +- (void)deleteCookie:(NSHTTPCookie *)cookie { + if (!cookie) return; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSHTTPCookie *foundCookie = [self cookieMatchingCookie:cookie]; + if (foundCookie) { + [_cookies removeObjectIdenticalTo:foundCookie]; + } + } // @synchronized(self) +} + +// Retrieve all cookies appropriate for the given URL, considering +// domain, path, cookie name, expiration, security setting. +// Side effect: removed expired cookies from the storage array. +- (GTM_NULLABLE NSArray *)cookiesForURL:(NSURL *)theURL { + NSMutableArray *foundCookies = nil; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self removeExpiredCookies]; + + // We'll prepend "." to the desired domain, since we want the + // actual domain "nytimes.com" to still match the cookie domain + // ".nytimes.com" when we check it below with hasSuffix. + NSString *host = theURL.host.lowercaseString; + NSString *path = theURL.path; + NSString *scheme = [theURL scheme]; + + NSString *requestingDomain = nil; + BOOL isLocalhostRetrieval = NO; + + if (IsLocalhost(host)) { + isLocalhostRetrieval = YES; + } else { + if (host.length > 0) { + requestingDomain = [@"." stringByAppendingString:host]; + } + } + + for (NSHTTPCookie *storedCookie in _cookies) { + NSString *cookieDomain = storedCookie.domain.lowercaseString; + NSString *cookiePath = storedCookie.path; + BOOL cookieIsSecure = [storedCookie isSecure]; + + BOOL isDomainOK; + + if (isLocalhostRetrieval) { + // Prior to 10.5.6, the domain stored into NSHTTPCookies for localhost + // is "localhost.local" + isDomainOK = (IsLocalhost(cookieDomain) + || [cookieDomain isEqual:@"localhost.local"]); + } else { + // Ensure we're matching exact domain names. We prepended a dot to the + // requesting domain, so we can also prepend one here if needed before + // checking if the request contains the cookie domain. + if (![cookieDomain hasPrefix:@"."]) { + cookieDomain = [@"." stringByAppendingString:cookieDomain]; + } + isDomainOK = [requestingDomain hasSuffix:cookieDomain]; + } + + BOOL isPathOK = [cookiePath isEqual:@"/"] || [path hasPrefix:cookiePath]; + BOOL isSecureOK = (!cookieIsSecure + || [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame); + + if (isDomainOK && isPathOK && isSecureOK) { + if (foundCookies == nil) { + foundCookies = [NSMutableArray array]; + } + [foundCookies addObject:storedCookie]; + } + } + } // @synchronized(self) + return foundCookies; +} + +// Override methods from the NSHTTPCookieStorage (NSURLSessionTaskAdditions) category. +- (void)storeCookies:(NSArray *)cookies forTask:(NSURLSessionTask *)task { + NSURLRequest *currentRequest = task.currentRequest; + [self setCookies:cookies forURL:currentRequest.URL mainDocumentURL:nil]; +} + +- (void)getCookiesForTask:(NSURLSessionTask *)task + completionHandler:(void (^)(GTM_NSArrayOf(NSHTTPCookie *) *))completionHandler { + if (completionHandler) { + NSURLRequest *currentRequest = task.currentRequest; + NSURL *currentRequestURL = currentRequest.URL; + NSArray *cookies = [self cookiesForURL:currentRequestURL]; + completionHandler(cookies); + } +} + +// Return a cookie from the array with the same name, domain, and path as the +// given cookie, or else return nil if none found. +// +// Both the cookie being tested and all cookies in the storage array should +// be valid (non-nil name, domains, paths). +// +// Note: this should only be called from inside a @synchronized(self) block +- (GTM_NULLABLE NSHTTPCookie *)cookieMatchingCookie:(NSHTTPCookie *)cookie { + GTMSessionCheckSynchronized(self); + + NSString *name = cookie.name; + NSString *domain = cookie.domain; + NSString *path = cookie.path; + + GTMSESSION_ASSERT_DEBUG(name && domain && path, + @"Invalid stored cookie (name:%@ domain:%@ path:%@)", name, domain, path); + + for (NSHTTPCookie *storedCookie in _cookies) { + if ([storedCookie.name isEqual:name] + && [storedCookie.domain isEqual:domain] + && [storedCookie.path isEqual:path]) { + return storedCookie; + } + } + return nil; +} + +// Internal routine to remove any expired cookies from the array, excluding +// cookies with nil expirations. +// +// Note: this should only be called from inside a @synchronized(self) block +- (void)removeExpiredCookies { + GTMSessionCheckSynchronized(self); + + // Count backwards since we're deleting items from the array + for (NSInteger idx = (NSInteger)_cookies.count - 1; idx >= 0; idx--) { + NSHTTPCookie *storedCookie = [_cookies objectAtIndex:(NSUInteger)idx]; + if ([[self class] hasCookieExpired:storedCookie]) { + [_cookies removeObjectAtIndex:(NSUInteger)idx]; + } + } +} + ++ (BOOL)hasCookieExpired:(NSHTTPCookie *)cookie { + NSDate *expiresDate = [cookie expiresDate]; + if (expiresDate == nil) { + // Cookies seem to have a Expires property even when the expiresDate method returns nil. + id expiresVal = [[cookie properties] objectForKey:NSHTTPCookieExpires]; + if ([expiresVal isKindOfClass:[NSDate class]]) { + expiresDate = expiresVal; + } + } + BOOL hasExpired = (expiresDate != nil && [expiresDate timeIntervalSinceNow] < 0); + return hasExpired; +} + +- (void)removeAllCookies { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [_cookies removeAllObjects]; + } // @synchronized(self) +} + +- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _policy; + } // @synchronized(self) +} + +- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)cookieAcceptPolicy { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _policy = cookieAcceptPolicy; + } // @synchronized(self) +} + +@end + +void GTMSessionFetcherAssertValidSelector(id GTM_NULLABLE_TYPE obj, SEL GTM_NULLABLE_TYPE sel, ...) { + // Verify that the object's selector is implemented with the proper + // number and type of arguments +#if DEBUG + va_list argList; + va_start(argList, sel); + + if (obj && sel) { + // Check that the selector is implemented + if (![obj respondsToSelector:sel]) { + NSLog(@"\"%@\" selector \"%@\" is unimplemented or misnamed", + NSStringFromClass([(id)obj class]), + NSStringFromSelector((SEL)sel)); + NSCAssert(0, @"callback selector unimplemented or misnamed"); + } else { + const char *expectedArgType; + unsigned int argCount = 2; // skip self and _cmd + NSMethodSignature *sig = [obj methodSignatureForSelector:sel]; + + // Check that each expected argument is present and of the correct type + while ((expectedArgType = va_arg(argList, const char*)) != 0) { + + if ([sig numberOfArguments] > argCount) { + const char *foundArgType = [sig getArgumentTypeAtIndex:argCount]; + + if (0 != strncmp(foundArgType, expectedArgType, strlen(expectedArgType))) { + NSLog(@"\"%@\" selector \"%@\" argument %d should be type %s", + NSStringFromClass([(id)obj class]), + NSStringFromSelector((SEL)sel), (argCount - 2), expectedArgType); + NSCAssert(0, @"callback selector argument type mistake"); + } + } + argCount++; + } + + // Check that the proper number of arguments are present in the selector + if (argCount != [sig numberOfArguments]) { + NSLog(@"\"%@\" selector \"%@\" should have %d arguments", + NSStringFromClass([(id)obj class]), + NSStringFromSelector((SEL)sel), (argCount - 2)); + NSCAssert(0, @"callback selector arguments incorrect"); + } + } + } + + va_end(argList); +#endif +} + +NSString *GTMFetcherCleanedUserAgentString(NSString *str) { + // Reference http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html + // and http://www-archive.mozilla.org/build/user-agent-strings.html + + if (str == nil) return @""; + + NSMutableString *result = [NSMutableString stringWithString:str]; + + // Replace spaces and commas with underscores + [result replaceOccurrencesOfString:@" " + withString:@"_" + options:0 + range:NSMakeRange(0, result.length)]; + [result replaceOccurrencesOfString:@"," + withString:@"_" + options:0 + range:NSMakeRange(0, result.length)]; + + // Delete http token separators and remaining whitespace + static NSCharacterSet *charsToDelete = nil; + if (charsToDelete == nil) { + // Make a set of unwanted characters + NSString *const kSeparators = @"()<>@;:\\\"/[]?={}"; + + NSMutableCharacterSet *mutableChars = + [[NSCharacterSet whitespaceAndNewlineCharacterSet] mutableCopy]; + [mutableChars addCharactersInString:kSeparators]; + charsToDelete = [mutableChars copy]; // hang on to an immutable copy + } + + while (1) { + NSRange separatorRange = [result rangeOfCharacterFromSet:charsToDelete]; + if (separatorRange.location == NSNotFound) break; + + [result deleteCharactersInRange:separatorRange]; + }; + + return result; +} + +NSString *GTMFetcherSystemVersionString(void) { + static NSString *sSavedSystemString; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // The Xcode 8 SDKs finally cleaned up this mess by providing TARGET_OS_OSX + // and TARGET_OS_IOS, but to build with older SDKs, those don't exist and + // instead one has to rely on TARGET_OS_MAC (which is true for iOS, watchOS, + // and tvOS) and TARGET_OS_IPHONE (which is true for iOS, watchOS, tvOS). So + // one has to order these carefully so you pick off the specific things + // first. + // If the code can ever assume Xcode 8 or higher (even when building for + // older OSes), then + // TARGET_OS_MAC -> TARGET_OS_OSX + // TARGET_OS_IPHONE -> TARGET_OS_IOS + // TARGET_IPHONE_SIMULATOR -> TARGET_OS_SIMULATOR +#if TARGET_OS_WATCH + // watchOS - WKInterfaceDevice + + WKInterfaceDevice *currentDevice = [WKInterfaceDevice currentDevice]; + + NSString *rawModel = [currentDevice model]; + NSString *model = GTMFetcherCleanedUserAgentString(rawModel); + + NSString *systemVersion = [currentDevice systemVersion]; + +#if TARGET_OS_SIMULATOR + NSString *hardwareModel = @"sim"; +#else + NSString *hardwareModel; + struct utsname unameRecord; + if (uname(&unameRecord) == 0) { + NSString *machineName = @(unameRecord.machine); + hardwareModel = GTMFetcherCleanedUserAgentString(machineName); + } + if (hardwareModel.length == 0) { + hardwareModel = @"unk"; + } +#endif + + sSavedSystemString = [[NSString alloc] initWithFormat:@"%@/%@ hw/%@", + model, systemVersion, hardwareModel]; + // Example: Apple_Watch/3.0 hw/Watch1_2 +#elif TARGET_OS_TV || TARGET_OS_IPHONE + // iOS and tvOS have UIDevice, use that. + UIDevice *currentDevice = [UIDevice currentDevice]; + + NSString *rawModel = [currentDevice model]; + NSString *model = GTMFetcherCleanedUserAgentString(rawModel); + + NSString *systemVersion = [currentDevice systemVersion]; + +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_SIMULATOR + NSString *hardwareModel = @"sim"; +#else + NSString *hardwareModel; + struct utsname unameRecord; + if (uname(&unameRecord) == 0) { + NSString *machineName = @(unameRecord.machine); + hardwareModel = GTMFetcherCleanedUserAgentString(machineName); + } + if (hardwareModel.length == 0) { + hardwareModel = @"unk"; + } +#endif + + sSavedSystemString = [[NSString alloc] initWithFormat:@"%@/%@ hw/%@", + model, systemVersion, hardwareModel]; + // Example: iPod_Touch/2.2 hw/iPod1_1 + // Example: Apple_TV/9.2 hw/AppleTV5,3 +#elif TARGET_OS_MAC + // Mac build + NSProcessInfo *procInfo = [NSProcessInfo processInfo]; +#if !defined(MAC_OS_X_VERSION_10_10) + BOOL hasOperatingSystemVersion = NO; +#elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10 + BOOL hasOperatingSystemVersion = + [procInfo respondsToSelector:@selector(operatingSystemVersion)]; +#else + BOOL hasOperatingSystemVersion = YES; +#endif + NSString *versString; + if (hasOperatingSystemVersion) { +#if defined(MAC_OS_X_VERSION_10_10) + // A reference to NSOperatingSystemVersion requires the 10.10 SDK. + NSOperatingSystemVersion version = procInfo.operatingSystemVersion; + versString = [NSString stringWithFormat:@"%zd.%zd.%zd", + version.majorVersion, version.minorVersion, version.patchVersion]; +#else +#pragma unused(procInfo) +#endif + } else { + // With Gestalt inexplicably deprecated in 10.8, we're reduced to reading + // the system plist file. + NSString *const kPath = @"/System/Library/CoreServices/SystemVersion.plist"; + NSDictionary *plist = [NSDictionary dictionaryWithContentsOfFile:kPath]; + versString = [plist objectForKey:@"ProductVersion"]; + if (versString.length == 0) { + versString = @"10.?.?"; + } + } + + sSavedSystemString = [[NSString alloc] initWithFormat:@"MacOSX/%@", versString]; +#elif defined(_SYS_UTSNAME_H) + // Foundation-only build + struct utsname unameRecord; + uname(&unameRecord); + + sSavedSystemString = [NSString stringWithFormat:@"%s/%s", + unameRecord.sysname, unameRecord.release]; // "Darwin/8.11.1" +#else +#error No branch taken for a default user agent +#endif + }); + return sSavedSystemString; +} + +NSString *GTMFetcherStandardUserAgentString(NSBundle * GTM_NULLABLE_TYPE bundle) { + NSString *result = [NSString stringWithFormat:@"%@ %@", + GTMFetcherApplicationIdentifier(bundle), + GTMFetcherSystemVersionString()]; + return result; +} + +NSString *GTMFetcherApplicationIdentifier(NSBundle * GTM_NULLABLE_TYPE bundle) { + @synchronized([GTMSessionFetcher class]) { + static NSMutableDictionary *sAppIDMap = nil; + + // If there's a bundle ID, use that; otherwise, use the process name + if (bundle == nil) { + bundle = [NSBundle mainBundle]; + } + NSString *bundleID = [bundle bundleIdentifier]; + if (bundleID == nil) { + bundleID = @""; + } + + NSString *identifier = [sAppIDMap objectForKey:bundleID]; + if (identifier) return identifier; + + // Apps may add a string to the info.plist to uniquely identify different builds. + identifier = [bundle objectForInfoDictionaryKey:@"GTMUserAgentID"]; + if (identifier.length == 0) { + if (bundleID.length > 0) { + identifier = bundleID; + } else { + // Fall back on the procname, prefixed by "proc" to flag that it's + // autogenerated and perhaps unreliable + NSString *procName = [[NSProcessInfo processInfo] processName]; + identifier = [NSString stringWithFormat:@"proc_%@", procName]; + } + } + + // Clean up whitespace and special characters + identifier = GTMFetcherCleanedUserAgentString(identifier); + + // If there's a version number, append that + NSString *version = [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; + if (version.length == 0) { + version = [bundle objectForInfoDictionaryKey:@"CFBundleVersion"]; + } + + // Clean up whitespace and special characters + version = GTMFetcherCleanedUserAgentString(version); + + // Glue the two together (cleanup done above or else cleanup would strip the + // slash) + if (version.length > 0) { + identifier = [identifier stringByAppendingFormat:@"/%@", version]; + } + + if (sAppIDMap == nil) { + sAppIDMap = [[NSMutableDictionary alloc] init]; + } + [sAppIDMap setObject:identifier forKey:bundleID]; + return identifier; + } +} + +#if DEBUG +@implementation GTMSessionSyncMonitorInternal { + NSValue *_objectKey; // The synchronize target object. + const char *_functionName; // The function containing the monitored sync block. +} + +- (instancetype)initWithSynchronizationObject:(id)object + allowRecursive:(BOOL)allowRecursive + functionName:(const char *)functionName { + self = [super init]; + if (self) { + Class threadKey = [GTMSessionSyncMonitorInternal class]; + _objectKey = [NSValue valueWithNonretainedObject:object]; + _functionName = functionName; + + NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; + NSMutableDictionary *counters = threadDict[threadKey]; + if (counters == nil) { + counters = [NSMutableDictionary dictionary]; + threadDict[(id)threadKey] = counters; + } + NSCountedSet *functionNamesCounter = counters[_objectKey]; + NSUInteger numberOfSyncingFunctions = functionNamesCounter.count; + + if (!allowRecursive) { + BOOL isTopLevelSyncScope = (numberOfSyncingFunctions == 0); + NSArray *stack = [NSThread callStackSymbols]; + GTMSESSION_ASSERT_DEBUG(isTopLevelSyncScope, + @"*** Recursive sync on %@ at %s; previous sync at %@\n%@", + [object class], functionName, functionNamesCounter.allObjects, + [stack subarrayWithRange:NSMakeRange(1, stack.count - 1)]); + } + + if (!functionNamesCounter) { + functionNamesCounter = [NSCountedSet set]; + counters[_objectKey] = functionNamesCounter; + } + [functionNamesCounter addObject:@(functionName)]; + } + return self; +} + +- (void)dealloc { + Class threadKey = [GTMSessionSyncMonitorInternal class]; + + NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; + NSMutableDictionary *counters = threadDict[threadKey]; + NSCountedSet *functionNamesCounter = counters[_objectKey]; + NSString *functionNameStr = @(_functionName); + NSUInteger numberOfSyncsByThisFunction = [functionNamesCounter countForObject:functionNameStr]; + NSArray *stack = [NSThread callStackSymbols]; + GTMSESSION_ASSERT_DEBUG(numberOfSyncsByThisFunction > 0, @"Sync not found on %@ at %s\n%@", + [_objectKey.nonretainedObjectValue class], _functionName, + [stack subarrayWithRange:NSMakeRange(1, stack.count - 1)]); + [functionNamesCounter removeObject:functionNameStr]; + if (functionNamesCounter.count == 0) { + [counters removeObjectForKey:_objectKey]; + } +} + ++ (NSArray *)functionsHoldingSynchronizationOnObject:(id)object { + Class threadKey = [GTMSessionSyncMonitorInternal class]; + NSValue *localObjectKey = [NSValue valueWithNonretainedObject:object]; + + NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; + NSMutableDictionary *counters = threadDict[threadKey]; + NSCountedSet *functionNamesCounter = counters[localObjectKey]; + return functionNamesCounter.count > 0 ? functionNamesCounter.allObjects : nil; +} +@end +#endif // DEBUG +GTM_ASSUME_NONNULL_END diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.h b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h similarity index 65% rename from Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.h rename to Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h index 93ca24c19..bc0a65c0a 100644 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.h +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.h @@ -1,10 +1,10 @@ -/* Copyright (c) 2010 Google Inc. +/* Copyright 2014 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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, @@ -13,13 +13,13 @@ * limitations under the License. */ -#import "GTMHTTPFetcher.h" +#import "GTMSessionFetcher.h" // GTM HTTP Logging // -// All traffic using GTMHTTPFetcher can be easily logged. Call +// All traffic using GTMSessionFetcher can be easily logged. Call // -// [GTMHTTPFetcher setLoggingEnabled:YES]; +// [GTMSessionFetcher setLoggingEnabled:YES]; // // to begin generating log files. // @@ -52,7 +52,7 @@ #if !STRIP_GTM_FETCH_LOGGING -@interface GTMHTTPFetcher (GTMHTTPFetcherLogging) +@interface GTMSessionFetcher (GTMSessionFetcherLogging) // Note: the default logs directory is ~/Desktop/GTMHTTPDebugLogs; it will be // created as needed. If a custom directory is set, the directory should @@ -61,43 +61,47 @@ + (NSString *)loggingDirectory; // client apps can turn logging on and off -+ (void)setLoggingEnabled:(BOOL)flag; ++ (void)setLoggingEnabled:(BOOL)isLoggingEnabled; + (BOOL)isLoggingEnabled; // client apps can turn off logging to a file if they want to only check // the fetcher's log property -+ (void)setLoggingToFileEnabled:(BOOL)flag; ++ (void)setLoggingToFileEnabled:(BOOL)isLoggingToFileEnabled; + (BOOL)isLoggingToFileEnabled; // client apps can optionally specify process name and date string used in // log file names -+ (void)setLoggingProcessName:(NSString *)str; ++ (void)setLoggingProcessName:(NSString *)processName; + (NSString *)loggingProcessName; -+ (void)setLoggingDateStamp:(NSString *)str; ++ (void)setLoggingDateStamp:(NSString *)dateStamp; + (NSString *)loggingDateStamp; +// client apps can specify the directory for the log for this specific run, +// typically to match the directory used by another fetcher class, like: +// +// [GTMSessionFetcher setLogDirectoryForCurrentRun:[GTMHTTPFetcher logDirectoryForCurrentRun]]; +// +// Setting this overrides the logging directory, process name, and date stamp when writing +// the log file. ++ (void)setLogDirectoryForCurrentRun:(NSString *)logDirectoryForCurrentRun; ++ (NSString *)logDirectoryForCurrentRun; + +// Prunes old log directories that have not been modified since the provided date. +// This will not delete the current run's log directory. ++ (void)deleteLogDirectoriesOlderThanDate:(NSDate *)date; + // internal; called by fetcher - (void)logFetchWithError:(NSError *)error; -- (BOOL)logCapturePostStream; +- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream; +- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: + (GTMSessionFetcherBodyStreamProvider)streamProvider; // internal; accessors useful for viewing logs + (NSString *)processNameLogPrefix; + (NSString *)symlinkNameSuffix; + (NSString *)htmlFileName; -// Applications may provide alternative body strings to be displayed in the -// log, such as for binary requests or responses. If deferring is turned -// on, the response log will not be sent until deferring is turned off, -// allowing the application to write the response body after the response -// data has been parsed. -- (void)setLogRequestBody:(NSString *)bodyString; -- (NSString *)logRequestBody; -- (void)setLogResponseBody:(NSString *)bodyString; -- (NSString *)logResponseBody; -- (void)setShouldDeferResponseBodyLogging:(BOOL)flag; -- (BOOL)shouldDeferResponseBodyLogging; - @end #endif // !STRIP_GTM_FETCH_LOGGING diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m new file mode 100644 index 000000000..02b46b608 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherLogging.m @@ -0,0 +1,976 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#include +#include + +#import "GTMSessionFetcherLogging.h" + +#ifndef STRIP_GTM_FETCH_LOGGING + #error GTMSessionFetcher headers should have defaulted this if it wasn't already defined. +#endif + +#if !STRIP_GTM_FETCH_LOGGING + +// Sensitive credential strings are replaced in logs with _snip_ +// +// Apps that must see the contents of sensitive tokens can set this to 1 +#ifndef SKIP_GTM_FETCH_LOGGING_SNIPPING +#define SKIP_GTM_FETCH_LOGGING_SNIPPING 0 +#endif + +// If GTMReadMonitorInputStream is available, it can be used for +// capturing uploaded streams of data +// +// We locally declare methods of GTMReadMonitorInputStream so we +// do not need to import the header, as some projects may not have it available +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMReadMonitorInputStream : NSInputStream + ++ (instancetype)inputStreamWithStream:(NSInputStream *)input; + +@property (assign) id readDelegate; +@property (assign) SEL readSelector; + +@end +#else +@class GTMReadMonitorInputStream; +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +@interface GTMSessionFetcher (GTMHTTPFetcherLoggingUtilities) + ++ (NSString *)headersStringForDictionary:(NSDictionary *)dict; ++ (NSString *)snipSubstringOfString:(NSString *)originalStr + betweenStartString:(NSString *)startStr + endString:(NSString *)endStr; +- (void)inputStream:(GTMReadMonitorInputStream *)stream + readIntoBuffer:(void *)buffer + length:(int64_t)length; + +@end + +@implementation GTMSessionFetcher (GTMSessionFetcherLogging) + +// fetchers come and fetchers go, but statics are forever +static BOOL gIsLoggingEnabled = NO; +static BOOL gIsLoggingToFile = YES; +static NSString *gLoggingDirectoryPath = nil; +static NSString *gLogDirectoryForCurrentRun = nil; +static NSString *gLoggingDateStamp = nil; +static NSString *gLoggingProcessName = nil; + ++ (void)setLoggingDirectory:(NSString *)path { + gLoggingDirectoryPath = [path copy]; +} + ++ (NSString *)loggingDirectory { + if (!gLoggingDirectoryPath) { + NSArray *paths = nil; +#if TARGET_IPHONE_SIMULATOR + // default to a directory called GTMHTTPDebugLogs into a sandbox-safe + // directory that a developer can find easily, the application home + paths = @[ NSHomeDirectory() ]; +#elif TARGET_OS_IPHONE + // Neither ~/Desktop nor ~/Home is writable on an actual iOS, watchOS, or tvOS device. + // Put it in ~/Documents. + paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +#else + // default to a directory called GTMHTTPDebugLogs in the desktop folder + paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES); +#endif + + NSString *desktopPath = paths.firstObject; + if (desktopPath) { + NSString *const kGTMLogFolderName = @"GTMHTTPDebugLogs"; + NSString *logsFolderPath = [desktopPath stringByAppendingPathComponent:kGTMLogFolderName]; + + NSFileManager *fileMgr = [NSFileManager defaultManager]; + BOOL isDir; + BOOL doesFolderExist = [fileMgr fileExistsAtPath:logsFolderPath isDirectory:&isDir]; + if (!doesFolderExist) { + // make the directory + doesFolderExist = [fileMgr createDirectoryAtPath:logsFolderPath + withIntermediateDirectories:YES + attributes:nil + error:NULL]; + } + if (doesFolderExist) { + // it's there; store it in the global + gLoggingDirectoryPath = [logsFolderPath copy]; + } + } + } + return gLoggingDirectoryPath; +} + ++ (void)setLogDirectoryForCurrentRun:(NSString *)logDirectoryForCurrentRun { + // Set the path for this run's logs. + gLogDirectoryForCurrentRun = [logDirectoryForCurrentRun copy]; +} + ++ (NSString *)logDirectoryForCurrentRun { + // make a directory for this run's logs, like SyncProto_logs_10-16_01-56-58PM + if (gLogDirectoryForCurrentRun) return gLogDirectoryForCurrentRun; + + NSString *parentDir = [self loggingDirectory]; + NSString *logNamePrefix = [self processNameLogPrefix]; + NSString *dateStamp = [self loggingDateStamp]; + NSString *dirName = [NSString stringWithFormat:@"%@%@", logNamePrefix, dateStamp]; + NSString *logDirectory = [parentDir stringByAppendingPathComponent:dirName]; + + if (gIsLoggingToFile) { + NSFileManager *fileMgr = [NSFileManager defaultManager]; + // Be sure that the first time this app runs, it's not writing to a preexisting folder + static BOOL gShouldReuseFolder = NO; + if (!gShouldReuseFolder) { + gShouldReuseFolder = YES; + NSString *origLogDir = logDirectory; + for (int ctr = 2; ctr < 20; ++ctr) { + if (![fileMgr fileExistsAtPath:logDirectory]) break; + + // append a digit + logDirectory = [origLogDir stringByAppendingFormat:@"_%d", ctr]; + } + } + if (![fileMgr createDirectoryAtPath:logDirectory + withIntermediateDirectories:YES + attributes:nil + error:NULL]) return nil; + } + gLogDirectoryForCurrentRun = logDirectory; + + return gLogDirectoryForCurrentRun; +} + ++ (void)setLoggingEnabled:(BOOL)isLoggingEnabled { + gIsLoggingEnabled = isLoggingEnabled; +} + ++ (BOOL)isLoggingEnabled { + return gIsLoggingEnabled; +} + ++ (void)setLoggingToFileEnabled:(BOOL)isLoggingToFileEnabled { + gIsLoggingToFile = isLoggingToFileEnabled; +} + ++ (BOOL)isLoggingToFileEnabled { + return gIsLoggingToFile; +} + ++ (void)setLoggingProcessName:(NSString *)processName { + gLoggingProcessName = [processName copy]; +} + ++ (NSString *)loggingProcessName { + // get the process name (once per run) replacing spaces with underscores + if (!gLoggingProcessName) { + NSString *procName = [[NSProcessInfo processInfo] processName]; + gLoggingProcessName = [procName stringByReplacingOccurrencesOfString:@" " withString:@"_"]; + } + return gLoggingProcessName; +} + ++ (void)setLoggingDateStamp:(NSString *)dateStamp { + gLoggingDateStamp = [dateStamp copy]; +} + ++ (NSString *)loggingDateStamp { + // We'll pick one date stamp per run, so a run that starts at a later second + // will get a unique results html file + if (!gLoggingDateStamp) { + // produce a string like 08-21_01-41-23PM + + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + [formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; + [formatter setDateFormat:@"M-dd_hh-mm-ssa"]; + + gLoggingDateStamp = [formatter stringFromDate:[NSDate date]]; + } + return gLoggingDateStamp; +} + ++ (NSString *)processNameLogPrefix { + static NSString *gPrefix = nil; + if (!gPrefix) { + NSString *processName = [self loggingProcessName]; + gPrefix = [[NSString alloc] initWithFormat:@"%@_log_", processName]; + } + return gPrefix; +} + ++ (NSString *)symlinkNameSuffix { + return @"_log_newest.html"; +} + ++ (NSString *)htmlFileName { + return @"aperçu_http_log.html"; +} + ++ (void)deleteLogDirectoriesOlderThanDate:(NSDate *)cutoffDate { + NSFileManager *fileMgr = [NSFileManager defaultManager]; + NSURL *parentDir = [NSURL fileURLWithPath:[[self class] loggingDirectory]]; + NSURL *logDirectoryForCurrentRun = + [NSURL fileURLWithPath:[[self class] logDirectoryForCurrentRun]]; + NSError *error; + NSArray *contents = [fileMgr contentsOfDirectoryAtURL:parentDir + includingPropertiesForKeys:@[ NSURLContentModificationDateKey ] + options:0 + error:&error]; + for (NSURL *itemURL in contents) { + if ([itemURL isEqual:logDirectoryForCurrentRun]) continue; + + NSDate *modDate; + if ([itemURL getResourceValue:&modDate + forKey:NSURLContentModificationDateKey + error:&error]) { + if ([modDate compare:cutoffDate] == NSOrderedAscending) { + if (![fileMgr removeItemAtURL:itemURL error:&error]) { + NSLog(@"deleteLogDirectoriesOlderThanDate failed to delete %@: %@", + itemURL.path, error); + } + } + } else { + NSLog(@"deleteLogDirectoriesOlderThanDate failed to get mod date of %@: %@", + itemURL.path, error); + } + } +} + +// formattedStringFromData returns a prettyprinted string for XML or JSON input, +// and a plain string for other input data +- (NSString *)formattedStringFromData:(NSData *)inputData + contentType:(NSString *)contentType + JSON:(NSDictionary **)outJSON { + if (!inputData) return nil; + + // if the content type is JSON and we have the parsing class available, use that + if ([contentType hasPrefix:@"application/json"] && inputData.length > 5) { + // convert from JSON string to NSObjects and back to a formatted string + NSMutableDictionary *obj = [NSJSONSerialization JSONObjectWithData:inputData + options:NSJSONReadingMutableContainers + error:NULL]; + if (obj) { + if (outJSON) *outJSON = obj; + if ([obj isKindOfClass:[NSMutableDictionary class]]) { + // for security and privacy, omit OAuth 2 response access and refresh tokens + if ([obj valueForKey:@"refresh_token"] != nil) { + [obj setObject:@"_snip_" forKey:@"refresh_token"]; + } + if ([obj valueForKey:@"access_token"] != nil) { + [obj setObject:@"_snip_" forKey:@"access_token"]; + } + } + NSData *data = [NSJSONSerialization dataWithJSONObject:obj + options:NSJSONWritingPrettyPrinted + error:NULL]; + if (data) { + NSString *jsonStr = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + return jsonStr; + } + } + } + +#if !TARGET_OS_IPHONE && !GTM_SKIP_LOG_XMLFORMAT + // verify that this data starts with the bytes indicating XML + + NSString *const kXMLLintPath = @"/usr/bin/xmllint"; + static BOOL gHasCheckedAvailability = NO; + static BOOL gIsXMLLintAvailable = NO; + + if (!gHasCheckedAvailability) { + gIsXMLLintAvailable = [[NSFileManager defaultManager] fileExistsAtPath:kXMLLintPath]; + gHasCheckedAvailability = YES; + } + if (gIsXMLLintAvailable + && inputData.length > 5 + && strncmp(inputData.bytes, " 0) { + // success + inputData = formattedData; + } + } +#else + // we can't call external tasks on the iPhone; leave the XML unformatted +#endif + + NSString *dataStr = [[NSString alloc] initWithData:inputData + encoding:NSUTF8StringEncoding]; + return dataStr; +} + +// stringFromStreamData creates a string given the supplied data +// +// If NSString can create a UTF-8 string from the data, then that is returned. +// +// Otherwise, this routine tries to find a MIME boundary at the beginning of the data block, and +// uses that to break up the data into parts. Each part will be used to try to make a UTF-8 string. +// For parts that fail, a replacement string showing the part header and <> is supplied +// in place of the binary data. + +- (NSString *)stringFromStreamData:(NSData *)data + contentType:(NSString *)contentType { + + if (!data) return nil; + + // optimistically, see if the whole data block is UTF-8 + NSString *streamDataStr = [self formattedStringFromData:data + contentType:contentType + JSON:NULL]; + if (streamDataStr) return streamDataStr; + + // Munge a buffer by replacing non-ASCII bytes with underscores, and turn that munged buffer an + // NSString. That gives us a string we can use with NSScanner. + NSMutableData *mutableData = [NSMutableData dataWithData:data]; + unsigned char *bytes = (unsigned char *)mutableData.mutableBytes; + + for (unsigned int idx = 0; idx < mutableData.length; ++idx) { + if (bytes[idx] > 0x7F || bytes[idx] == 0) { + bytes[idx] = '_'; + } + } + + NSString *mungedStr = [[NSString alloc] initWithData:mutableData + encoding:NSUTF8StringEncoding]; + if (mungedStr) { + + // scan for the boundary string + NSString *boundary = nil; + NSScanner *scanner = [NSScanner scannerWithString:mungedStr]; + + if ([scanner scanUpToString:@"\r\n" intoString:&boundary] + && [boundary hasPrefix:@"--"]) { + + // we found a boundary string; use it to divide the string into parts + NSArray *mungedParts = [mungedStr componentsSeparatedByString:boundary]; + + // look at each munged part in the original string, and try to convert those into UTF-8 + NSMutableArray *origParts = [NSMutableArray array]; + NSUInteger offset = 0; + for (NSString *mungedPart in mungedParts) { + NSUInteger partSize = mungedPart.length; + NSData *origPartData = [data subdataWithRange:NSMakeRange(offset, partSize)]; + NSString *origPartStr = [[NSString alloc] initWithData:origPartData + encoding:NSUTF8StringEncoding]; + if (origPartStr) { + // we could make this original part into UTF-8; use the string + [origParts addObject:origPartStr]; + } else { + // this part can't be made into UTF-8; scan the header, if we can + NSString *header = nil; + NSScanner *headerScanner = [NSScanner scannerWithString:mungedPart]; + if (![headerScanner scanUpToString:@"\r\n\r\n" intoString:&header]) { + // we couldn't find a header + header = @""; + } + // make a part string with the header and <> + NSString *binStr = [NSString stringWithFormat:@"\r%@\r<<%lu bytes>>\r", + header, (long)(partSize - header.length)]; + [origParts addObject:binStr]; + } + offset += partSize + boundary.length; + } + // rejoin the original parts + streamDataStr = [origParts componentsJoinedByString:boundary]; + } + } + if (!streamDataStr) { + // give up; just make a string showing the uploaded bytes + streamDataStr = [NSString stringWithFormat:@"<<%u bytes>>", (unsigned int)data.length]; + } + return streamDataStr; +} + +// logFetchWithError is called following a successful or failed fetch attempt +// +// This method does all the work for appending to and creating log files + +- (void)logFetchWithError:(NSError *)error { + if (![[self class] isLoggingEnabled]) return; + NSString *logDirectory = [[self class] logDirectoryForCurrentRun]; + if (!logDirectory) return; + NSString *processName = [[self class] loggingProcessName]; + + // TODO: add Javascript to display response data formatted in hex + + // each response's NSData goes into its own xml or txt file, though all responses for this run of + // the app share a main html file. This counter tracks all fetch responses for this app run. + // + // we'll use a local variable since this routine may be reentered while waiting for XML formatting + // to be completed by an external task + static int gResponseCounter = 0; + int responseCounter = ++gResponseCounter; + + NSURLResponse *response = [self response]; + NSDictionary *responseHeaders = [self responseHeaders]; + NSString *responseDataStr = nil; + NSDictionary *responseJSON = nil; + + // if there's response data, decide what kind of file to put it in based on the first bytes of the + // file or on the mime type supplied by the server + NSString *responseMIMEType = [response MIMEType]; + BOOL isResponseImage = NO; + + // file name for an image data file + NSString *responseDataFileName = nil; + + int64_t responseDataLength = self.downloadedLength; + if (responseDataLength > 0) { + NSData *downloadedData = self.downloadedData; + if (downloadedData == nil + && responseDataLength > 0 + && responseDataLength < 20000 + && self.destinationFileURL) { + // There's a download file that's not too big, so get the data to display from the downloaded + // file. + NSURL *destinationURL = self.destinationFileURL; + downloadedData = [NSData dataWithContentsOfURL:destinationURL]; + } + NSString *responseType = [responseHeaders valueForKey:@"Content-Type"]; + responseDataStr = [self formattedStringFromData:downloadedData + contentType:responseType + JSON:&responseJSON]; + NSString *responseDataExtn = nil; + NSData *dataToWrite = nil; + if (responseDataStr) { + // we were able to make a UTF-8 string from the response data + if ([responseMIMEType isEqual:@"application/atom+xml"] + || [responseMIMEType hasSuffix:@"/xml"]) { + responseDataExtn = @"xml"; + dataToWrite = [responseDataStr dataUsingEncoding:NSUTF8StringEncoding]; + } + } else if ([responseMIMEType isEqual:@"image/jpeg"]) { + responseDataExtn = @"jpg"; + dataToWrite = downloadedData; + isResponseImage = YES; + } else if ([responseMIMEType isEqual:@"image/gif"]) { + responseDataExtn = @"gif"; + dataToWrite = downloadedData; + isResponseImage = YES; + } else if ([responseMIMEType isEqual:@"image/png"]) { + responseDataExtn = @"png"; + dataToWrite = downloadedData; + isResponseImage = YES; + } else { + // add more non-text types here + } + // if we have an extension, save the raw data in a file with that extension + if (responseDataExtn && dataToWrite) { + // generate a response file base name like + NSString *responseBaseName = [NSString stringWithFormat:@"fetch_%d_response", responseCounter]; + responseDataFileName = [responseBaseName stringByAppendingPathExtension:responseDataExtn]; + NSString *responseDataFilePath = [logDirectory stringByAppendingPathComponent:responseDataFileName]; + + NSError *downloadedError = nil; + if (gIsLoggingToFile && ![dataToWrite writeToFile:responseDataFilePath + options:0 + error:&downloadedError]) { + NSLog(@"%@ logging write error:%@ (%@)", [self class], downloadedError, responseDataFileName); + } + } + } + // we'll have one main html file per run of the app + NSString *htmlName = [[self class] htmlFileName]; + NSString *htmlPath =[logDirectory stringByAppendingPathComponent:htmlName]; + + // if the html file exists (from logging previous fetches) we don't need + // to re-write the header or the scripts + NSFileManager *fileMgr = [NSFileManager defaultManager]; + BOOL didFileExist = [fileMgr fileExistsAtPath:htmlPath]; + + NSMutableString* outputHTML = [NSMutableString string]; + + // we need a header to say we'll have UTF-8 text + if (!didFileExist) { + [outputHTML appendFormat:@"%@ HTTP fetch log %@", + processName, [[self class] loggingDateStamp]]; + } + // now write the visible html elements + NSString *copyableFileName = [NSString stringWithFormat:@"fetch_%d.txt", responseCounter]; + + NSDate *now = [NSDate date]; + // write the date & time, the comment, and the link to the plain-text (copyable) log + [outputHTML appendFormat:@"%@      ", now]; + + NSString *comment = [self comment]; + if (comment.length > 0) { + [outputHTML appendFormat:@"%@      ", comment]; + } + [outputHTML appendFormat:@"
request/response log
", copyableFileName]; + NSTimeInterval elapsed = -self.initialBeginFetchDate.timeIntervalSinceNow; + [outputHTML appendFormat:@"elapsed: %5.3fsec
", elapsed]; + + // write the request URL + NSURLRequest *request = self.request; + NSString *requestMethod = request.HTTPMethod; + NSURL *requestURL = request.URL; + + // Save the request URL for next time in case this redirects. + NSString *redirectedFromURLString = [self.redirectedFromURL absoluteString]; + self.redirectedFromURL = [requestURL copy]; + if (redirectedFromURLString) { + [outputHTML appendFormat:@"redirected from %@
", + redirectedFromURLString]; + } + [outputHTML appendFormat:@"request: %@ %@
\n", requestMethod, requestURL]; + + // write the request headers + NSDictionary *requestHeaders = request.allHTTPHeaderFields; + NSUInteger numberOfRequestHeaders = requestHeaders.count; + if (numberOfRequestHeaders > 0) { + // Indicate if the request is authorized; warn if the request is authorized but non-SSL + NSString *auth = [requestHeaders objectForKey:@"Authorization"]; + NSString *headerDetails = @""; + if (auth) { + BOOL isInsecure = [[requestURL scheme] isEqual:@"http"]; + if (isInsecure) { + // 26A0 = ⚠ + headerDetails = + @"   authorized, non-SSL "; + } else { + headerDetails = @"   authorized"; + } + } + NSString *cookiesHdr = [requestHeaders objectForKey:@"Cookie"]; + if (cookiesHdr) { + headerDetails = [headerDetails stringByAppendingString:@"   cookies"]; + } + NSString *matchHdr = [requestHeaders objectForKey:@"If-Match"]; + if (matchHdr) { + headerDetails = [headerDetails stringByAppendingString:@"   if-match"]; + } + matchHdr = [requestHeaders objectForKey:@"If-None-Match"]; + if (matchHdr) { + headerDetails = [headerDetails stringByAppendingString:@"   if-none-match"]; + } + [outputHTML appendFormat:@"   headers: %d %@
", + (int)numberOfRequestHeaders, headerDetails]; + } else { + [outputHTML appendFormat:@"   headers: none
"]; + } + // write the request post data + NSData *bodyData = nil; + NSData *loggedStreamData = self.loggedStreamData; + if (loggedStreamData) { + bodyData = loggedStreamData; + } else { + bodyData = self.bodyData; + if (bodyData == nil) { + bodyData = self.request.HTTPBody; + } + } + uint64_t bodyDataLength = bodyData.length; + + if (bodyData.length == 0) { + // If the data is in a body upload file URL, read that in if it's not huge. + NSURL *bodyFileURL = self.bodyFileURL; + if (bodyFileURL) { + NSNumber *fileSizeNum = nil; + NSError *fileSizeError = nil; + if ([bodyFileURL getResourceValue:&fileSizeNum + forKey:NSURLFileSizeKey + error:&fileSizeError]) { + bodyDataLength = [fileSizeNum unsignedLongLongValue]; + if (bodyDataLength > 0 && bodyDataLength < 50000) { + bodyData = [NSData dataWithContentsOfURL:bodyFileURL + options:NSDataReadingUncached + error:&fileSizeError]; + } + } + } + } + NSString *bodyDataStr = nil; + NSString *postType = [requestHeaders valueForKey:@"Content-Type"]; + + if (bodyDataLength > 0) { + [outputHTML appendFormat:@"   data: %llu bytes, %@
\n", + bodyDataLength, postType ? postType : @"(no type)"]; + NSString *logRequestBody = self.logRequestBody; + if (logRequestBody) { + bodyDataStr = [logRequestBody copy]; + self.logRequestBody = nil; + } else { + bodyDataStr = [self stringFromStreamData:bodyData + contentType:postType]; + if (bodyDataStr) { + // remove OAuth 2 client secret and refresh token + bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr + betweenStartString:@"client_secret=" + endString:@"&"]; + bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr + betweenStartString:@"refresh_token=" + endString:@"&"]; + // remove ClientLogin password + bodyDataStr = [[self class] snipSubstringOfString:bodyDataStr + betweenStartString:@"&Passwd=" + endString:@"&"]; + } + } + } else { + // no post data + } + // write the response status, MIME type, URL + NSInteger status = [self statusCode]; + if (response) { + NSString *statusString = @""; + if (status != 0) { + if (status == 200 || status == 201) { + statusString = [NSString stringWithFormat:@"%ld", (long)status]; + + // report any JSON-RPC error + if ([responseJSON isKindOfClass:[NSDictionary class]]) { + NSDictionary *jsonError = [responseJSON objectForKey:@"error"]; + if ([jsonError isKindOfClass:[NSDictionary class]]) { + NSString *jsonCode = [[jsonError valueForKey:@"code"] description]; + NSString *jsonMessage = [jsonError valueForKey:@"message"]; + if (jsonCode || jsonMessage) { + // 2691 = ⚑ + NSString *const jsonErrFmt = + @"   JSON error: %@ %@  ⚑"; + statusString = [statusString stringByAppendingFormat:jsonErrFmt, + jsonCode ? jsonCode : @"", + jsonMessage ? jsonMessage : @""]; + } + } + } + } else { + // purple for anything other than 200 or 201 + NSString *flag = status >= 400 ? @" ⚑" : @""; // 2691 = ⚑ + NSString *explanation = [NSHTTPURLResponse localizedStringForStatusCode:status]; + NSString *const statusFormat = @"%ld %@ %@"; + statusString = [NSString stringWithFormat:statusFormat, (long)status, explanation, flag]; + } + } + // show the response URL only if it's different from the request URL + NSString *responseURLStr = @""; + NSURL *responseURL = response.URL; + + if (responseURL && ![responseURL isEqual:request.URL]) { + NSString *const responseURLFormat = + @"response URL: %@
\n"; + responseURLStr = [NSString stringWithFormat:responseURLFormat, [responseURL absoluteString]]; + } + [outputHTML appendFormat:@"response:  status %@
\n%@", + statusString, responseURLStr]; + // Write the response headers + NSUInteger numberOfResponseHeaders = responseHeaders.count; + if (numberOfResponseHeaders > 0) { + // Indicate if the server is setting cookies + NSString *cookiesSet = [responseHeaders valueForKey:@"Set-Cookie"]; + NSString *cookiesStr = + cookiesSet ? @"  sets cookies" : @""; + // Indicate if the server is redirecting + NSString *location = [responseHeaders valueForKey:@"Location"]; + BOOL isRedirect = status >= 300 && status <= 399 && location != nil; + NSString *redirectsStr = + isRedirect ? @"  redirects" : @""; + [outputHTML appendFormat:@"   headers: %d %@ %@
\n", + (int)numberOfResponseHeaders, cookiesStr, redirectsStr]; + } else { + [outputHTML appendString:@"   headers: none
\n"]; + } + } + // error + if (error) { + [outputHTML appendFormat:@"Error: %@
\n", error.description]; + } + // Write the response data + if (responseDataFileName) { + if (isResponseImage) { + // Make a small inline image that links to the full image file + [outputHTML appendFormat:@"   data: %lld bytes, %@
", + responseDataLength, responseMIMEType]; + NSString *const fmt = + @"image\n"; + [outputHTML appendFormat:fmt, responseDataFileName, responseDataFileName]; + } else { + // The response data was XML; link to the xml file + NSString *const fmt = + @"   data: %lld bytes, %@   %@\n"; + [outputHTML appendFormat:fmt, responseDataLength, responseMIMEType, + responseDataFileName, [responseDataFileName pathExtension]]; + } + } else { + // The response data was not an image; just show the length and MIME type + [outputHTML appendFormat:@"   data: %lld bytes, %@\n", + responseDataLength, responseMIMEType ? responseMIMEType : @"(no response type)"]; + } + // Make a single string of the request and response, suitable for copying + // to the clipboard and pasting into a bug report + NSMutableString *copyable = [NSMutableString string]; + if (comment) { + [copyable appendFormat:@"%@\n\n", comment]; + } + [copyable appendFormat:@"%@ elapsed: %5.3fsec\n", now, elapsed]; + if (redirectedFromURLString) { + [copyable appendFormat:@"Redirected from %@\n", redirectedFromURLString]; + } + [copyable appendFormat:@"Request: %@ %@\n", requestMethod, requestURL]; + if (requestHeaders.count > 0) { + [copyable appendFormat:@"Request headers:\n%@\n", + [[self class] headersStringForDictionary:requestHeaders]]; + } + if (bodyDataLength > 0) { + [copyable appendFormat:@"Request body: (%llu bytes)\n", bodyDataLength]; + if (bodyDataStr) { + [copyable appendFormat:@"%@\n", bodyDataStr]; + } + [copyable appendString:@"\n"]; + } + if (response) { + [copyable appendFormat:@"Response: status %d\n", (int) status]; + [copyable appendFormat:@"Response headers:\n%@\n", + [[self class] headersStringForDictionary:responseHeaders]]; + [copyable appendFormat:@"Response body: (%lld bytes)\n", responseDataLength]; + if (responseDataLength > 0) { + NSString *logResponseBody = self.logResponseBody; + if (logResponseBody) { + // The user has provided the response body text. + responseDataStr = [logResponseBody copy]; + self.logResponseBody = nil; + } + if (responseDataStr != nil) { + [copyable appendFormat:@"%@\n", responseDataStr]; + } else { + // Even though it's redundant, we'll put in text to indicate that all the bytes are binary. + if (self.destinationFileURL) { + [copyable appendFormat:@"<<%lld bytes>> to file %@\n", + responseDataLength, self.destinationFileURL.path]; + } else { + [copyable appendFormat:@"<<%lld bytes>>\n", responseDataLength]; + } + } + } + } + if (error) { + [copyable appendFormat:@"Error: %@\n", error]; + } + // Save to log property before adding the separator + self.log = copyable; + + [copyable appendString:@"-----------------------------------------------------------\n"]; + + // Write the copyable version to another file (linked to at the top of the html file, above) + // + // Ideally, something to just copy this to the clipboard like + // Copy here." + // would work everywhere, but it only works in Safari as of 8/2010 + if (gIsLoggingToFile) { + NSString *parentDir = [[self class] loggingDirectory]; + NSString *copyablePath = [logDirectory stringByAppendingPathComponent:copyableFileName]; + NSError *copyableError = nil; + if (![copyable writeToFile:copyablePath + atomically:NO + encoding:NSUTF8StringEncoding + error:©ableError]) { + // Error writing to file + NSLog(@"%@ logging write error:%@ (%@)", [self class], copyableError, copyablePath); + } + [outputHTML appendString:@"


"]; + + // Append the HTML to the main output file + const char* htmlBytes = outputHTML.UTF8String; + NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:htmlPath + append:YES]; + [stream open]; + [stream write:(const uint8_t *) htmlBytes maxLength:strlen(htmlBytes)]; + [stream close]; + + // Make a symlink to the latest html + NSString *const symlinkNameSuffix = [[self class] symlinkNameSuffix]; + NSString *symlinkName = [processName stringByAppendingString:symlinkNameSuffix]; + NSString *symlinkPath = [parentDir stringByAppendingPathComponent:symlinkName]; + + [fileMgr removeItemAtPath:symlinkPath error:NULL]; + [fileMgr createSymbolicLinkAtPath:symlinkPath + withDestinationPath:htmlPath + error:NULL]; +#if TARGET_OS_IPHONE + static BOOL gReportedLoggingPath = NO; + if (!gReportedLoggingPath) { + gReportedLoggingPath = YES; + NSLog(@"GTMSessionFetcher logging to \"%@\"", parentDir); + } +#endif + } +} + +- (NSInputStream *)loggedInputStreamForInputStream:(NSInputStream *)inputStream { + if (!inputStream) return nil; + if (![GTMSessionFetcher isLoggingEnabled]) return inputStream; + + [self clearLoggedStreamData]; // Clear any previous data. + Class monitorClass = NSClassFromString(@"GTMReadMonitorInputStream"); + if (!monitorClass) { + NSString const *str = @"<>"; + NSData *stringData = [str dataUsingEncoding:NSUTF8StringEncoding]; + [self appendLoggedStreamData:stringData]; + return inputStream; + } + inputStream = [monitorClass inputStreamWithStream:inputStream]; + + GTMReadMonitorInputStream *readMonitorInputStream = (GTMReadMonitorInputStream *)inputStream; + [readMonitorInputStream setReadDelegate:self]; + SEL readSel = @selector(inputStream:readIntoBuffer:length:); + [readMonitorInputStream setReadSelector:readSel]; + + return inputStream; +} + +- (GTMSessionFetcherBodyStreamProvider)loggedStreamProviderForStreamProvider: + (GTMSessionFetcherBodyStreamProvider)streamProvider { + if (!streamProvider) return nil; + if (![GTMSessionFetcher isLoggingEnabled]) return streamProvider; + + [self clearLoggedStreamData]; // Clear any previous data. + Class monitorClass = NSClassFromString(@"GTMReadMonitorInputStream"); + if (!monitorClass) { + NSString const *str = @"<>"; + NSData *stringData = [str dataUsingEncoding:NSUTF8StringEncoding]; + [self appendLoggedStreamData:stringData]; + return streamProvider; + } + GTMSessionFetcherBodyStreamProvider loggedStreamProvider = + ^(GTMSessionFetcherBodyStreamProviderResponse response) { + streamProvider(^(NSInputStream *bodyStream) { + bodyStream = [self loggedInputStreamForInputStream:bodyStream]; + response(bodyStream); + }); + }; + return loggedStreamProvider; +} + +@end + +@implementation GTMSessionFetcher (GTMSessionFetcherLoggingUtilities) + +- (void)inputStream:(GTMReadMonitorInputStream *)stream + readIntoBuffer:(void *)buffer + length:(int64_t)length { + // append the captured data + NSData *data = [NSData dataWithBytesNoCopy:buffer + length:(NSUInteger)length + freeWhenDone:NO]; + [self appendLoggedStreamData:data]; +} + +#pragma mark Fomatting Utilities + ++ (NSString *)snipSubstringOfString:(NSString *)originalStr + betweenStartString:(NSString *)startStr + endString:(NSString *)endStr { +#if SKIP_GTM_FETCH_LOGGING_SNIPPING + return originalStr; +#else + if (!originalStr) return nil; + + // Find the start string, and replace everything between it + // and the end string (or the end of the original string) with "_snip_" + NSRange startRange = [originalStr rangeOfString:startStr]; + if (startRange.location == NSNotFound) return originalStr; + + // We found the start string + NSUInteger originalLength = originalStr.length; + NSUInteger startOfTarget = NSMaxRange(startRange); + NSRange targetAndRest = NSMakeRange(startOfTarget, originalLength - startOfTarget); + NSRange endRange = [originalStr rangeOfString:endStr + options:0 + range:targetAndRest]; + NSRange replaceRange; + if (endRange.location == NSNotFound) { + // Found no end marker so replace to end of string + replaceRange = targetAndRest; + } else { + // Replace up to the endStr + replaceRange = NSMakeRange(startOfTarget, endRange.location - startOfTarget); + } + NSString *result = [originalStr stringByReplacingCharactersInRange:replaceRange + withString:@"_snip_"]; + return result; +#endif // SKIP_GTM_FETCH_LOGGING_SNIPPING +} + ++ (NSString *)headersStringForDictionary:(NSDictionary *)dict { + // Format the dictionary in http header style, like + // Accept: application/json + // Cache-Control: no-cache + // Content-Type: application/json; charset=utf-8 + // + // Pad the key names, but not beyond 16 chars, since long custom header + // keys just create too much whitespace + NSArray *keys = [dict.allKeys sortedArrayUsingSelector:@selector(compare:)]; + + NSMutableString *str = [NSMutableString string]; + for (NSString *key in keys) { + NSString *value = [dict valueForKey:key]; + if ([key isEqual:@"Authorization"]) { + // Remove OAuth 1 token + value = [[self class] snipSubstringOfString:value + betweenStartString:@"oauth_token=\"" + endString:@"\""]; + + // Remove OAuth 2 bearer token (draft 16, and older form) + value = [[self class] snipSubstringOfString:value + betweenStartString:@"Bearer " + endString:@"\n"]; + value = [[self class] snipSubstringOfString:value + betweenStartString:@"OAuth " + endString:@"\n"]; + + // Remove Google ClientLogin + value = [[self class] snipSubstringOfString:value + betweenStartString:@"GoogleLogin auth=" + endString:@"\n"]; + } + [str appendFormat:@" %@: %@\n", key, value]; + } + return str; +} + +@end + +#endif // !STRIP_GTM_FETCH_LOGGING diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h new file mode 100644 index 000000000..a696ac7e4 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.h @@ -0,0 +1,190 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +// For best performance and convenient usage, fetchers should be generated by a common +// GTMSessionFetcherService instance, like +// +// _fetcherService = [[GTMSessionFetcherService alloc] init]; +// GTMSessionFetcher* myFirstFetcher = [_fetcherService fetcherWithRequest:request1]; +// GTMSessionFetcher* mySecondFetcher = [_fetcherService fetcherWithRequest:request2]; + +#import "GTMSessionFetcher.h" + +GTM_ASSUME_NONNULL_BEGIN + +// Notifications. + +// This notification indicates a reusable session has become invalid. It is intended mainly for the +// service's unit tests. +// +// The notification object is the fetcher service. +// The invalid session is provided via the userInfo kGTMSessionFetcherServiceSessionKey key. +extern NSString *const kGTMSessionFetcherServiceSessionBecameInvalidNotification; +extern NSString *const kGTMSessionFetcherServiceSessionKey; + +@interface GTMSessionFetcherService : NSObject + +// Queues of delayed and running fetchers. Each dictionary contains arrays +// of GTMSessionFetcher *fetchers, keyed by NSString *host +@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *delayedFetchersByHost; +@property(atomic, strong, readonly, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, NSArray *) *runningFetchersByHost; + +// A max value of 0 means no fetchers should be delayed. +// The default limit is 10 simultaneous fetchers targeting each host. +// This does not apply to fetchers whose useBackgroundSession property is YES. Since services are +// not resurrected on an app relaunch, delayed fetchers would effectively be abandoned. +@property(atomic, assign) NSUInteger maxRunningFetchersPerHost; + +// Properties to be applied to each fetcher; see GTMSessionFetcher.h for descriptions +@property(atomic, strong, GTM_NULLABLE) NSURLSessionConfiguration *configuration; +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherConfigurationBlock configurationBlock; +@property(atomic, strong, GTM_NULLABLE) NSHTTPCookieStorage *cookieStorage; +@property(atomic, strong, GTM_NULL_RESETTABLE) dispatch_queue_t callbackQueue; +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherChallengeBlock challengeBlock; +@property(atomic, strong, GTM_NULLABLE) NSURLCredential *credential; +@property(atomic, strong) NSURLCredential *proxyCredential; +@property(atomic, copy, GTM_NULLABLE) GTM_NSArrayOf(NSString *) *allowedInsecureSchemes; +@property(atomic, assign) BOOL allowLocalhostRequest; +@property(atomic, assign) BOOL allowInvalidServerCertificates; +@property(atomic, assign, getter=isRetryEnabled) BOOL retryEnabled; +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherRetryBlock retryBlock; +@property(atomic, assign) NSTimeInterval maxRetryInterval; +@property(atomic, assign) NSTimeInterval minRetryInterval; +@property(atomic, copy, GTM_NULLABLE) GTM_NSDictionaryOf(NSString *, id) *properties; + +#if GTM_BACKGROUND_TASK_FETCHING +@property(atomic, assign) BOOL skipBackgroundTask; +#endif + +// A default useragent of GTMFetcherStandardUserAgentString(nil) will be given to each fetcher +// created by this service unless the request already has a user-agent header set. +// This default will be added starting with builds with the SDKs for OS X 10.11 and iOS 9. +// +// To use the configuration's default user agent, set this property to nil. +@property(atomic, copy, GTM_NULLABLE) NSString *userAgent; + +// The authorizer to attach to the created fetchers. If a specific fetcher should +// not authorize its requests, the fetcher's authorizer property may be set to nil +// before the fetch begins. +@property(atomic, strong, GTM_NULLABLE) id authorizer; + +// Delegate queue used by the session when calling back to the fetcher. The default +// is the main queue. Changing this does not affect the queue used to call back to the +// application; that is specified by the callbackQueue property above. +@property(atomic, strong, GTM_NULL_RESETTABLE) NSOperationQueue *sessionDelegateQueue; + +// When enabled, indicates the same session should be used by subsequent fetchers. +// +// This is enabled by default. +@property(atomic, assign) BOOL reuseSession; + +// Sets the delay until an unused session is invalidated. +// The default interval is 60 seconds. +// +// If the interval is set to 0, then any reused session is not invalidated except by +// explicitly invoking -resetSession. Be aware that setting the interval to 0 thus +// causes the session's delegate to be retained until the session is explicitly reset. +@property(atomic, assign) NSTimeInterval unusedSessionTimeout; + +// If shouldReuseSession is enabled, this will force creation of a new session when future +// fetchers begin. +- (void)resetSession; + +// Create a fetcher +// +// These methods will return a fetcher. If successfully created, the connection +// will hold a strong reference to it for the life of the connection as well. +// So the caller doesn't have to hold onto the fetcher explicitly unless they +// want to be able to monitor or cancel it. +- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request; +- (GTMSessionFetcher *)fetcherWithURL:(NSURL *)requestURL; +- (GTMSessionFetcher *)fetcherWithURLString:(NSString *)requestURLString; + +// Common method for fetcher creation. +// +// -fetcherWithRequest:fetcherClass: may be overridden to customize creation of +// fetchers. This is the ONLY method in the GTMSessionFetcher library intended to +// be overridden. +- (id)fetcherWithRequest:(NSURLRequest *)request + fetcherClass:(Class)fetcherClass; + +- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher; + +- (NSUInteger)numberOfFetchers; // running + delayed fetchers +- (NSUInteger)numberOfRunningFetchers; +- (NSUInteger)numberOfDelayedFetchers; + +// Return a list of all running or delayed fetchers. This includes fetchers created +// by the service which have been started and have not yet stopped. +// +// Returns an array of fetcher objects, or nil if none. +- (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchers; + +// Search for running or delayed fetchers with the specified URL. +// +// Returns an array of fetcher objects found, or nil if none found. +- (GTM_NULLABLE GTM_NSArrayOf(GTMSessionFetcher *) *)issuedFetchersWithRequestURL:(NSURL *)requestURL; + +- (void)stopAllFetchers; + +// Methods for use by the fetcher class only. +- (GTM_NULLABLE NSURLSession *)session; +- (GTM_NULLABLE NSURLSession *)sessionForFetcherCreation; +- (GTM_NULLABLE id)sessionDelegate; +- (GTM_NULLABLE NSDate *)stoppedAllFetchersDate; + +// The testBlock can inspect its fetcher parameter's request property to +// determine which fetcher is being faked. +@property(atomic, copy, GTM_NULLABLE) GTMSessionFetcherTestBlock testBlock; + +@end + +@interface GTMSessionFetcherService (TestingSupport) + +// Convenience method to create a fetcher service for testing. +// +// Fetchers generated by this mock fetcher service will not perform any +// network operation, but will invoke callbacks and provide the supplied data +// or error to the completion handler. +// +// You can make more customized mocks by setting the test block property of the service +// or fetcher; the test block can inspect the fetcher's request or other properties. +// +// See the description of the testBlock property below. ++ (instancetype)mockFetcherServiceWithFakedData:(GTM_NULLABLE NSData *)fakedDataOrNil + fakedError:(GTM_NULLABLE NSError *)fakedErrorOrNil; + +// Spin the run loop and discard events (or, if not on the main thread, just sleep the thread) +// until all running and delayed fetchers have completed. +// +// This is only for use in testing or in tools without a user interface. +// +// Synchronous fetches should never be done by shipping apps; they are +// sufficient reason for rejection from the app store. +// +// Returns NO if timed out. +- (BOOL)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds; + +@end + +@interface GTMSessionFetcherService (BackwardsCompatibilityOnly) + +// Clients using GTMSessionFetcher should set the cookie storage explicitly themselves. +// This method is just for compatibility with the old fetcher. +@property(atomic, assign) NSInteger cookieStorageMethod; + +@end + +GTM_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m new file mode 100644 index 000000000..fc6e6d964 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionFetcherService.m @@ -0,0 +1,1352 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMSessionFetcherService.h" + +NSString *const kGTMSessionFetcherServiceSessionBecameInvalidNotification + = @"kGTMSessionFetcherServiceSessionBecameInvalidNotification"; +NSString *const kGTMSessionFetcherServiceSessionKey + = @"kGTMSessionFetcherServiceSessionKey"; + +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMSessionFetcher (ServiceMethods) +- (BOOL)beginFetchMayDelay:(BOOL)mayDelay + mayAuthorize:(BOOL)mayAuthorize; +@end +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +@interface GTMSessionFetcherService () + +@property(atomic, strong, readwrite) NSDictionary *delayedFetchersByHost; +@property(atomic, strong, readwrite) NSDictionary *runningFetchersByHost; + +@end + +// Since NSURLSession doesn't support a separate delegate per task (!), instances of this +// class serve as a session delegate trampoline. +// +// This class maps a session's tasks to fetchers, and resends delegate messages to the task's +// fetcher. +@interface GTMSessionFetcherSessionDelegateDispatcher : NSObject + +// The session for the tasks in this dispatcher's task-to-fetcher map. +@property(atomic) NSURLSession *session; + +// The timer interval for invalidating a session that has no active tasks. +@property(atomic) NSTimeInterval discardInterval; + +// The current discard timer. +@property(atomic, readonly) NSTimer *discardTimer; + + +- (instancetype)initWithParentService:(GTMSessionFetcherService *)parentService + sessionDiscardInterval:(NSTimeInterval)discardInterval; + +- (void)setFetcher:(GTMSessionFetcher *)fetcher + forTask:(NSURLSessionTask *)task; +- (void)removeFetcher:(GTMSessionFetcher *)fetcher; + +// Before using a session, tells the delegate dispatcher to stop the discard timer. +- (void)startSessionUsage; + +// When abandoning a delegate dispatcher, we want to avoid the session retaining +// the delegate after tasks complete. +- (void)abandon; + +@end + + +@implementation GTMSessionFetcherService { + NSMutableDictionary *_delayedFetchersByHost; + NSMutableDictionary *_runningFetchersByHost; + NSUInteger _maxRunningFetchersPerHost; + + // When this ivar is nil, the service will not reuse sessions. + GTMSessionFetcherSessionDelegateDispatcher *_delegateDispatcher; + + // Fetchers will wait on this if another fetcher is creating the shared NSURLSession. + dispatch_semaphore_t _sessionCreationSemaphore; + + dispatch_queue_t _callbackQueue; + NSOperationQueue *_delegateQueue; + NSHTTPCookieStorage *_cookieStorage; + NSString *_userAgent; + NSTimeInterval _timeout; + + NSURLCredential *_credential; // Username & password. + NSURLCredential *_proxyCredential; // Credential supplied to proxy servers. + + NSInteger _cookieStorageMethod; + + id _authorizer; + + // For waitForCompletionOfAllFetchersWithTimeout: we need to wait on stopped fetchers since + // they've not yet finished invoking their queued callbacks. This array is nil except when + // waiting on fetchers. + NSMutableArray *_stoppedFetchersToWaitFor; + + // For fetchers that enqueued their callbacks before stopAllFetchers was called on the service, + // set a barrier so the callbacks know to bail out. + NSDate *_stoppedAllFetchersDate; +} + +@synthesize maxRunningFetchersPerHost = _maxRunningFetchersPerHost, + configuration = _configuration, + configurationBlock = _configurationBlock, + cookieStorage = _cookieStorage, + userAgent = _userAgent, + challengeBlock = _challengeBlock, + credential = _credential, + proxyCredential = _proxyCredential, + allowedInsecureSchemes = _allowedInsecureSchemes, + allowLocalhostRequest = _allowLocalhostRequest, + allowInvalidServerCertificates = _allowInvalidServerCertificates, + retryEnabled = _retryEnabled, + retryBlock = _retryBlock, + maxRetryInterval = _maxRetryInterval, + minRetryInterval = _minRetryInterval, + properties = _properties, + unusedSessionTimeout = _unusedSessionTimeout, + testBlock = _testBlock; + +#if GTM_BACKGROUND_TASK_FETCHING +@synthesize skipBackgroundTask = _skipBackgroundTask; +#endif + +- (instancetype)init { + self = [super init]; + if (self) { + _delayedFetchersByHost = [[NSMutableDictionary alloc] init]; + _runningFetchersByHost = [[NSMutableDictionary alloc] init]; + _maxRunningFetchersPerHost = 10; + _cookieStorageMethod = -1; + _unusedSessionTimeout = 60.0; + _delegateDispatcher = + [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self + sessionDiscardInterval:_unusedSessionTimeout]; + _callbackQueue = dispatch_get_main_queue(); + + _delegateQueue = [[NSOperationQueue alloc] init]; + _delegateQueue.maxConcurrentOperationCount = 1; + _delegateQueue.name = @"com.google.GTMSessionFetcher.NSURLSessionDelegateQueue"; + + _sessionCreationSemaphore = dispatch_semaphore_create(1); + + // Starting with the SDKs for OS X 10.11/iOS 9, the service has a default useragent. + // Apps can remove this and get the default system "CFNetwork" useragent by setting the + // fetcher service's userAgent property to nil. +#if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_11) \ + || (TARGET_OS_IPHONE && defined(__IPHONE_9_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0) + _userAgent = GTMFetcherStandardUserAgentString(nil); +#endif + } + return self; +} + +- (void)dealloc { + [self detachAuthorizer]; + [_delegateDispatcher abandon]; +} + +#pragma mark Generate a new fetcher + +// Clients may override this method. Clients should not override any other library methods. +- (id)fetcherWithRequest:(NSURLRequest *)request + fetcherClass:(Class)fetcherClass { + GTMSessionFetcher *fetcher = [[fetcherClass alloc] initWithRequest:request + configuration:self.configuration]; + fetcher.callbackQueue = self.callbackQueue; + fetcher.sessionDelegateQueue = self.sessionDelegateQueue; + fetcher.challengeBlock = self.challengeBlock; + fetcher.credential = self.credential; + fetcher.proxyCredential = self.proxyCredential; + fetcher.authorizer = self.authorizer; + fetcher.cookieStorage = self.cookieStorage; + fetcher.allowedInsecureSchemes = self.allowedInsecureSchemes; + fetcher.allowLocalhostRequest = self.allowLocalhostRequest; + fetcher.allowInvalidServerCertificates = self.allowInvalidServerCertificates; + fetcher.configurationBlock = self.configurationBlock; + fetcher.retryEnabled = self.retryEnabled; + fetcher.retryBlock = self.retryBlock; + fetcher.maxRetryInterval = self.maxRetryInterval; + fetcher.minRetryInterval = self.minRetryInterval; + fetcher.properties = self.properties; + fetcher.service = self; + if (self.cookieStorageMethod >= 0) { + [fetcher setCookieStorageMethod:self.cookieStorageMethod]; + } + +#if GTM_BACKGROUND_TASK_FETCHING + fetcher.skipBackgroundTask = self.skipBackgroundTask; +#endif + + NSString *userAgent = self.userAgent; + if (userAgent.length > 0 + && [request valueForHTTPHeaderField:@"User-Agent"] == nil) { + [fetcher setRequestValue:userAgent + forHTTPHeaderField:@"User-Agent"]; + } + fetcher.testBlock = self.testBlock; + + return fetcher; +} + +- (GTMSessionFetcher *)fetcherWithRequest:(NSURLRequest *)request { + return [self fetcherWithRequest:request + fetcherClass:[GTMSessionFetcher class]]; +} + +- (GTMSessionFetcher *)fetcherWithURL:(NSURL *)requestURL { + return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; +} + +- (GTMSessionFetcher *)fetcherWithURLString:(NSString *)requestURLString { + NSURL *url = [NSURL URLWithString:requestURLString]; + return [self fetcherWithURL:url]; +} + +// Returns a session for the fetcher's host, or nil. +- (NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSURLSession *session = _delegateDispatcher.session; + return session; + } +} + +// Returns a session for the fetcher's host, or nil. For shared sessions, this +// waits on a semaphore, blocking other fetchers while the caller creates the +// session if needed. +- (NSURLSession *)sessionForFetcherCreation { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + if (!_delegateDispatcher) { + // This fetcher is creating a non-shared session, so skip the semaphore usage. + return nil; + } + } + + // Wait if another fetcher is currently creating a session; avoid waiting + // inside the @synchronized block, as that can deadlock. + dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Before getting the NSURLSession for task creation, it is + // important to invalidate and nil out the session discard timer; otherwise + // the session can be invalidated between when it is returned to the + // fetcher, and when the fetcher attempts to create its NSURLSessionTask. + [_delegateDispatcher startSessionUsage]; + + NSURLSession *session = _delegateDispatcher.session; + if (session) { + // The calling fetcher will receive a preexisting session, so + // we can allow other fetchers to create a session. + dispatch_semaphore_signal(_sessionCreationSemaphore); + } else { + // No existing session was obtained, so the calling fetcher will create the session; + // it *must* invoke fetcherDidCreateSession: to signal the dispatcher's semaphore after + // the session has been created (or fails to be created) to avoid a hang. + } + return session; + } +} + +- (id)sessionDelegate { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateDispatcher; + } +} + +#pragma mark Queue Management + +- (void)addRunningFetcher:(GTMSessionFetcher *)fetcher + forHost:(NSString *)host { + // Add to the array of running fetchers for this host, creating the array if needed. + NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; + if (runningForHost == nil) { + runningForHost = [NSMutableArray arrayWithObject:fetcher]; + [_runningFetchersByHost setObject:runningForHost forKey:host]; + } else { + [runningForHost addObject:fetcher]; + } +} + +- (void)addDelayedFetcher:(GTMSessionFetcher *)fetcher + forHost:(NSString *)host { + // Add to the array of delayed fetchers for this host, creating the array if needed. + NSMutableArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; + if (delayedForHost == nil) { + delayedForHost = [NSMutableArray arrayWithObject:fetcher]; + [_delayedFetchersByHost setObject:delayedForHost forKey:host]; + } else { + [delayedForHost addObject:fetcher]; + } +} + +- (BOOL)isDelayingFetcher:(GTMSessionFetcher *)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSString *host = fetcher.request.URL.host; + if (host == nil) { + return NO; + } + NSArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; + NSUInteger idx = [delayedForHost indexOfObjectIdenticalTo:fetcher]; + BOOL isDelayed = (delayedForHost != nil) && (idx != NSNotFound); + return isDelayed; + } +} + +- (BOOL)fetcherShouldBeginFetching:(GTMSessionFetcher *)fetcher { + // Entry point from the fetcher + NSURL *requestURL = fetcher.request.URL; + NSString *host = requestURL.host; + + // Addresses "file:///path" case where localhost is the implicit host. + if (host.length == 0 && [requestURL isFileURL]) { + host = @"localhost"; + } + + if (host.length == 0) { + // Data URIs legitimately have no host, reject other hostless URLs. + GTMSESSION_ASSERT_DEBUG([[requestURL scheme] isEqual:@"data"], @"%@ lacks host", fetcher); + return YES; + } + + BOOL shouldBeginResult; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; + if (runningForHost != nil + && [runningForHost indexOfObjectIdenticalTo:fetcher] != NSNotFound) { + GTMSESSION_ASSERT_DEBUG(NO, @"%@ was already running", fetcher); + return YES; + } + + BOOL shouldRunNow = (fetcher.usingBackgroundSession + || _maxRunningFetchersPerHost == 0 + || _maxRunningFetchersPerHost > + [[self class] numberOfNonBackgroundSessionFetchers:runningForHost]); + if (shouldRunNow) { + [self addRunningFetcher:fetcher forHost:host]; + shouldBeginResult = YES; + } else { + [self addDelayedFetcher:fetcher forHost:host]; + shouldBeginResult = NO; + } + } // @synchronized(self) + + // We'll save the host that serves as the key for this fetcher's array + // to avoid any chance of the underlying request changing, stranding + // the fetcher in the wrong array + fetcher.serviceHost = host; + + return shouldBeginResult; +} + +- (void)startFetcher:(GTMSessionFetcher *)fetcher { + [fetcher beginFetchMayDelay:NO + mayAuthorize:YES]; +} + +// Internal utility. Returns a fetcher's delegate if it's a dispatcher, or nil if the fetcher +// is its own delegate and has no dispatcher. +- (GTMSessionFetcherSessionDelegateDispatcher *)delegateDispatcherForFetcher:(GTMSessionFetcher *)fetcher { + GTMSessionCheckNotSynchronized(self); + + NSURLSession *fetcherSession = fetcher.session; + if (fetcherSession) { + id fetcherDelegate = fetcherSession.delegate; + BOOL hasDispatcher = (fetcherDelegate != nil && fetcherDelegate != fetcher); + if (hasDispatcher) { + GTMSESSION_ASSERT_DEBUG([fetcherDelegate isKindOfClass:[GTMSessionFetcherSessionDelegateDispatcher class]], + @"Fetcher delegate class: %@", [fetcherDelegate class]); + return (GTMSessionFetcherSessionDelegateDispatcher *)fetcherDelegate; + } + } + return nil; +} + +- (void)fetcherDidCreateSession:(GTMSessionFetcher *)fetcher { + if (fetcher.canShareSession) { + NSURLSession *fetcherSession = fetcher.session; + GTMSESSION_ASSERT_DEBUG(fetcherSession != nil, @"Fetcher missing its session: %@", fetcher); + + GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = + [self delegateDispatcherForFetcher:fetcher]; + if (delegateDispatcher) { + GTMSESSION_ASSERT_DEBUG(delegateDispatcher.session == nil, + @"Fetcher made an extra session: %@", fetcher); + + // Save this fetcher's session. + delegateDispatcher.session = fetcherSession; + + // Allow other fetchers to request this session now. + dispatch_semaphore_signal(_sessionCreationSemaphore); + } + } +} + +- (void)fetcherDidBeginFetching:(GTMSessionFetcher *)fetcher { + // If this fetcher has a separate delegate with a shared session, then + // this fetcher should be added to the delegate's map of tasks to fetchers. + GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = + [self delegateDispatcherForFetcher:fetcher]; + if (delegateDispatcher) { + GTMSESSION_ASSERT_DEBUG(fetcher.canShareSession, + @"Inappropriate shared session: %@", fetcher); + + // There should already be a session, from this or a previous fetcher. + // + // Sanity check that the fetcher's session is the delegate's shared session. + NSURLSession *sharedSession = delegateDispatcher.session; + NSURLSession *fetcherSession = fetcher.session; + GTMSESSION_ASSERT_DEBUG(sharedSession != nil, @"Missing delegate session: %@", fetcher); + GTMSESSION_ASSERT_DEBUG(fetcherSession == sharedSession, + @"Inconsistent session: %@ %@ (shared: %@)", + fetcher, fetcherSession, sharedSession); + + if (sharedSession != nil && fetcherSession == sharedSession) { + NSURLSessionTask *task = fetcher.sessionTask; + GTMSESSION_ASSERT_DEBUG(task != nil, @"Missing session task: %@", fetcher); + + if (task) { + [delegateDispatcher setFetcher:fetcher + forTask:task]; + } + } + } +} + +- (void)stopFetcher:(GTMSessionFetcher *)fetcher { + [fetcher stopFetching]; +} + +- (void)fetcherDidStop:(GTMSessionFetcher *)fetcher { + // Entry point from the fetcher + NSString *host = fetcher.serviceHost; + if (!host) { + // fetcher has been stopped previously + return; + } + + // This removeFetcher: invocation is a fallback; typically, fetchers are removed from the task + // map when the task completes. + GTMSessionFetcherSessionDelegateDispatcher *delegateDispatcher = + [self delegateDispatcherForFetcher:fetcher]; + [delegateDispatcher removeFetcher:fetcher]; + + NSMutableArray *fetchersToStart; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // If a test is waiting for all fetchers to stop, it needs to wait for this one + // to invoke its callbacks on the callback queue. + [_stoppedFetchersToWaitFor addObject:fetcher]; + + NSMutableArray *runningForHost = [_runningFetchersByHost objectForKey:host]; + [runningForHost removeObject:fetcher]; + + NSMutableArray *delayedForHost = [_delayedFetchersByHost objectForKey:host]; + [delayedForHost removeObject:fetcher]; + + while (delayedForHost.count > 0 + && [[self class] numberOfNonBackgroundSessionFetchers:runningForHost] + < _maxRunningFetchersPerHost) { + // Start another delayed fetcher running, scanning for the minimum + // priority value, defaulting to FIFO for equal priorities + GTMSessionFetcher *nextFetcher = nil; + for (GTMSessionFetcher *delayedFetcher in delayedForHost) { + if (nextFetcher == nil + || delayedFetcher.servicePriority < nextFetcher.servicePriority) { + nextFetcher = delayedFetcher; + } + } + + if (nextFetcher) { + [self addRunningFetcher:nextFetcher forHost:host]; + runningForHost = [_runningFetchersByHost objectForKey:host]; + + [delayedForHost removeObjectIdenticalTo:nextFetcher]; + + if (!fetchersToStart) { + fetchersToStart = [NSMutableArray array]; + } + [fetchersToStart addObject:nextFetcher]; + } + } + + if (runningForHost.count == 0) { + // None left; remove the empty array + [_runningFetchersByHost removeObjectForKey:host]; + } + + if (delayedForHost.count == 0) { + [_delayedFetchersByHost removeObjectForKey:host]; + } + } // @synchronized(self) + + // Start fetchers outside of the synchronized block to avoid a deadlock. + for (GTMSessionFetcher *nextFetcher in fetchersToStart) { + [self startFetcher:nextFetcher]; + } + + // The fetcher is no longer in the running or the delayed array, + // so remove its host and thread properties + fetcher.serviceHost = nil; +} + +- (NSUInteger)numberOfFetchers { + NSUInteger running = [self numberOfRunningFetchers]; + NSUInteger delayed = [self numberOfDelayedFetchers]; + return running + delayed; +} + +- (NSUInteger)numberOfRunningFetchers { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSUInteger sum = 0; + for (NSString *host in _runningFetchersByHost) { + NSArray *fetchers = [_runningFetchersByHost objectForKey:host]; + sum += fetchers.count; + } + return sum; + } +} + +- (NSUInteger)numberOfDelayedFetchers { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSUInteger sum = 0; + for (NSString *host in _delayedFetchersByHost) { + NSArray *fetchers = [_delayedFetchersByHost objectForKey:host]; + sum += fetchers.count; + } + return sum; + } +} + +- (NSArray *)issuedFetchers { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSMutableArray *allFetchers = [NSMutableArray array]; + void (^accumulateFetchers)(id, id, BOOL *) = ^(NSString *host, + NSArray *fetchersForHost, + BOOL *stop) { + [allFetchers addObjectsFromArray:fetchersForHost]; + }; + [_runningFetchersByHost enumerateKeysAndObjectsUsingBlock:accumulateFetchers]; + [_delayedFetchersByHost enumerateKeysAndObjectsUsingBlock:accumulateFetchers]; + + GTMSESSION_ASSERT_DEBUG(allFetchers.count == [NSSet setWithArray:allFetchers].count, + @"Fetcher appears multiple times\n running: %@\n delayed: %@", + _runningFetchersByHost, _delayedFetchersByHost); + + return allFetchers.count > 0 ? allFetchers : nil; + } +} + +- (NSArray *)issuedFetchersWithRequestURL:(NSURL *)requestURL { + NSString *host = requestURL.host; + if (host.length == 0) return nil; + + NSURL *targetURL = [requestURL absoluteURL]; + + NSArray *allFetchers = [self issuedFetchers]; + NSIndexSet *indexes = [allFetchers indexesOfObjectsPassingTest:^BOOL(GTMSessionFetcher *fetcher, + NSUInteger idx, + BOOL *stop) { + NSURL *fetcherURL = [fetcher.request.URL absoluteURL]; + return [fetcherURL isEqual:targetURL]; + }]; + + NSArray *result = nil; + if (indexes.count > 0) { + result = [allFetchers objectsAtIndexes:indexes]; + } + return result; +} + +- (void)stopAllFetchers { + NSArray *delayedFetchersByHost; + NSArray *runningFetchersByHost; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Set the time barrier so fetchers know not to call back even if + // the stop calls below occur after the fetchers naturally + // stopped and so were removed from _runningFetchersByHost, + // but while the callbacks were already enqueued before stopAllFetchers + // was invoked. + _stoppedAllFetchersDate = [[NSDate alloc] init]; + + // Remove fetchers from the delayed list to avoid fetcherDidStop: from + // starting more fetchers running as a side effect of stopping one + delayedFetchersByHost = _delayedFetchersByHost.allValues; + [_delayedFetchersByHost removeAllObjects]; + + runningFetchersByHost = _runningFetchersByHost.allValues; + [_runningFetchersByHost removeAllObjects]; + } + + for (NSArray *delayedForHost in delayedFetchersByHost) { + for (GTMSessionFetcher *fetcher in delayedForHost) { + [self stopFetcher:fetcher]; + } + } + + for (NSArray *runningForHost in runningFetchersByHost) { + for (GTMSessionFetcher *fetcher in runningForHost) { + [self stopFetcher:fetcher]; + } + } +} + +- (NSDate *)stoppedAllFetchersDate { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _stoppedAllFetchersDate; + } +} + +#pragma mark Accessors + +- (BOOL)reuseSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateDispatcher != nil; + } +} + +- (void)setReuseSession:(BOOL)shouldReuse { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + BOOL wasReusing = (_delegateDispatcher != nil); + if (shouldReuse != wasReusing) { + [self abandonDispatcher]; + if (shouldReuse) { + _delegateDispatcher = + [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self + sessionDiscardInterval:_unusedSessionTimeout]; + } else { + _delegateDispatcher = nil; + } + } + } +} + +- (void)resetSession { + GTMSessionCheckNotSynchronized(self); + dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + [self resetSessionInternal]; + } + + dispatch_semaphore_signal(_sessionCreationSemaphore); +} + +- (void)resetSessionInternal { + GTMSessionCheckSynchronized(self); + + // The old dispatchers may be retained as delegates of any ongoing sessions by those sessions. + if (_delegateDispatcher) { + [self abandonDispatcher]; + _delegateDispatcher = + [[GTMSessionFetcherSessionDelegateDispatcher alloc] initWithParentService:self + sessionDiscardInterval:_unusedSessionTimeout]; + } +} + +- (void)resetSessionForDispatcherDiscardTimer:(NSTimer *)timer { + GTMSessionCheckNotSynchronized(self); + + dispatch_semaphore_wait(_sessionCreationSemaphore, DISPATCH_TIME_FOREVER); + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_delegateDispatcher.discardTimer == timer) { + // If the delegate dispatcher's current discardTimer is the same object as the timer + // that fired, no fetcher has recently attempted to start using the session by calling + // startSessionUsage, which invalidates and nils out the timer. + [self resetSessionInternal]; + } else { + // A fetcher has invalidated the timer between its triggering and now, potentially + // meaning a fetcher has requested access to the NSURLSession, and may be in the process + // of starting a new task. The dispatcher should not be abandoned, as this can lead + // to a race condition between calling -finishTasksAndInvalidate on the NSURLSession + // and the fetcher attempting to create a new task. + } + } + + dispatch_semaphore_signal(_sessionCreationSemaphore); +} + +- (NSTimeInterval)unusedSessionTimeout { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _unusedSessionTimeout; + } +} + +- (void)setUnusedSessionTimeout:(NSTimeInterval)timeout { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _unusedSessionTimeout = timeout; + _delegateDispatcher.discardInterval = timeout; + } +} + +// This method should be called inside of @synchronized(self) +- (void)abandonDispatcher { + GTMSessionCheckSynchronized(self); + [_delegateDispatcher abandon]; +} + +- (NSDictionary *)runningFetchersByHost { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_runningFetchersByHost copy]; + } +} + +- (void)setRunningFetchersByHost:(NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _runningFetchersByHost = [dict mutableCopy]; + } +} + +- (NSDictionary *)delayedFetchersByHost { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_delayedFetchersByHost copy]; + } +} + +- (void)setDelayedFetchersByHost:(NSDictionary *)dict { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delayedFetchersByHost = [dict mutableCopy]; + } +} + +- (id)authorizer { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _authorizer; + } +} + +- (void)setAuthorizer:(id)obj { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (obj != _authorizer) { + [self detachAuthorizer]; + } + + _authorizer = obj; + } + + // Use the fetcher service for the authorization fetches if the auth + // object supports fetcher services + if ([obj respondsToSelector:@selector(setFetcherService:)]) { +#if GTM_USE_SESSION_FETCHER + [obj setFetcherService:self]; +#else + [obj setFetcherService:(id)self]; +#endif + } +} + +// This should be called inside a @synchronized(self) block except during dealloc. +- (void)detachAuthorizer { + // This method is called by the fetcher service's dealloc and setAuthorizer: + // methods; do not override. + // + // The fetcher service retains the authorizer, and the authorizer has a + // weak pointer to the fetcher service (a non-zeroing pointer for + // compatibility with iOS 4 and Mac OS X 10.5/10.6.) + // + // When this fetcher service no longer uses the authorizer, we want to remove + // the authorizer's dependence on the fetcher service. Authorizers can still + // function without a fetcher service. + if ([_authorizer respondsToSelector:@selector(fetcherService)]) { + id authFetcherService = [_authorizer fetcherService]; + if (authFetcherService == self) { + [_authorizer setFetcherService:nil]; + } + } +} + +- (dispatch_queue_t GTM_NONNULL_TYPE)callbackQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _callbackQueue; + } // @synchronized(self) +} + +- (void)setCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _callbackQueue = queue ?: dispatch_get_main_queue(); + } // @synchronized(self) +} + +- (NSOperationQueue * GTM_NONNULL_TYPE)sessionDelegateQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateQueue; + } // @synchronized(self) +} + +- (void)setSessionDelegateQueue:(NSOperationQueue * GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateQueue = queue ?: [NSOperationQueue mainQueue]; + } // @synchronized(self) +} + +- (NSOperationQueue *)delegateQueue { + // Provided for compatibility with the old fetcher service. The gtm-oauth2 code respects + // any custom delegate queue for calling the app. + return nil; +} + ++ (NSUInteger)numberOfNonBackgroundSessionFetchers:(NSArray *)fetchers { + NSUInteger sum = 0; + for (GTMSessionFetcher *fetcher in fetchers) { + if (!fetcher.usingBackgroundSession) { + ++sum; + } + } + return sum; +} + +@end + +@implementation GTMSessionFetcherService (TestingSupport) + ++ (instancetype)mockFetcherServiceWithFakedData:(NSData *)fakedDataOrNil + fakedError:(NSError *)fakedErrorOrNil { +#if !GTM_DISABLE_FETCHER_TEST_BLOCK + NSURL *url = [NSURL URLWithString:@"http://example.invalid"]; + NSHTTPURLResponse *fakedResponse = + [[NSHTTPURLResponse alloc] initWithURL:url + statusCode:(fakedErrorOrNil ? 500 : 200) + HTTPVersion:@"HTTP/1.1" + headerFields:nil]; + GTMSessionFetcherService *service = [[self alloc] init]; + service.allowedInsecureSchemes = @[ @"http" ]; + service.testBlock = ^(GTMSessionFetcher *fetcherToTest, + GTMSessionFetcherTestResponse testResponse) { + testResponse(fakedResponse, fakedDataOrNil, fakedErrorOrNil); + }; + return service; +#else + GTMSESSION_ASSERT_DEBUG(0, @"Test blocks disabled"); + return nil; +#endif // GTM_DISABLE_FETCHER_TEST_BLOCK +} + +#pragma mark Synchronous Wait for Unit Testing + +- (BOOL)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds { + NSDate *giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; + _stoppedFetchersToWaitFor = [NSMutableArray array]; + + BOOL shouldSpinRunLoop = [NSThread isMainThread]; + const NSTimeInterval kSpinInterval = 0.001; + BOOL didTimeOut = NO; + while (([self numberOfFetchers] > 0 || _stoppedFetchersToWaitFor.count > 0)) { + didTimeOut = [giveUpDate timeIntervalSinceNow] < 0; + if (didTimeOut) break; + + GTMSessionFetcher *stoppedFetcher = _stoppedFetchersToWaitFor.firstObject; + if (stoppedFetcher) { + [_stoppedFetchersToWaitFor removeObject:stoppedFetcher]; + [stoppedFetcher waitForCompletionWithTimeout:10.0 * kSpinInterval]; + } + + if (shouldSpinRunLoop) { + NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:kSpinInterval]; + [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; + } else { + [NSThread sleepForTimeInterval:kSpinInterval]; + } + } + _stoppedFetchersToWaitFor = nil; + + return !didTimeOut; +} + +@end + +@implementation GTMSessionFetcherService (BackwardsCompatibilityOnly) + +- (NSInteger)cookieStorageMethod { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _cookieStorageMethod; + } +} + +- (void)setCookieStorageMethod:(NSInteger)cookieStorageMethod { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _cookieStorageMethod = cookieStorageMethod; + } +} + +@end + +@implementation GTMSessionFetcherSessionDelegateDispatcher { + __weak GTMSessionFetcherService *_parentService; + NSURLSession *_session; + + // The task map maps NSURLSessionTasks to GTMSessionFetchers + NSMutableDictionary *_taskToFetcherMap; + // The discard timer will invalidate sessions after the session's last task completes. + NSTimer *_discardTimer; + NSTimeInterval _discardInterval; +} + +@synthesize discardInterval = _discardInterval, + session = _session; + +- (instancetype)init { + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + +- (instancetype)initWithParentService:(GTMSessionFetcherService *)parentService + sessionDiscardInterval:(NSTimeInterval)discardInterval { + self = [super init]; + if (self) { + _discardInterval = discardInterval; + _parentService = parentService; + } + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ %p %@ %@", + [self class], self, + _session ?: @"", + _taskToFetcherMap.count > 0 ? _taskToFetcherMap : @""]; +} + +- (NSTimer *)discardTimer { + GTMSessionCheckNotSynchronized(self); + @synchronized(self) { + return _discardTimer; + } +} + +// This method should be called inside of a @synchronized(self) block. +- (void)startDiscardTimer { + GTMSessionCheckSynchronized(self); + [_discardTimer invalidate]; + _discardTimer = nil; + if (_discardInterval > 0) { + _discardTimer = [NSTimer timerWithTimeInterval:_discardInterval + target:self + selector:@selector(discardTimerFired:) + userInfo:nil + repeats:NO]; + [_discardTimer setTolerance:(_discardInterval / 10)]; + [[NSRunLoop mainRunLoop] addTimer:_discardTimer forMode:NSRunLoopCommonModes]; + } +} + +// This method should be called inside of a @synchronized(self) block. +- (void)destroyDiscardTimer { + GTMSessionCheckSynchronized(self); + [_discardTimer invalidate]; + _discardTimer = nil; +} + +- (void)discardTimerFired:(NSTimer *)timer { + GTMSessionFetcherService *service; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + NSUInteger numberOfTasks = _taskToFetcherMap.count; + if (numberOfTasks == 0) { + service = _parentService; + } + } + + // Inform the service that the discard timer has fired, and should check whether the + // service can abandon us. -resetSession cannot be called directly, as there is a + // race condition that must be guarded against with the NSURLSession being returned + // from sessionForFetcherCreation outside other locks. The service can take steps + // to prevent resetting the session if that has occurred. + // + // The service must be called from outside the @synchronized block. + [service resetSessionForDispatcherDiscardTimer:timer]; +} + +- (void)abandon { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self destroySessionAndTimer]; + } +} + +- (void)startSessionUsage { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [self destroyDiscardTimer]; + } +} + +// This method should be called inside of a @synchronized(self) block. +- (void)destroySessionAndTimer { + GTMSessionCheckSynchronized(self); + [self destroyDiscardTimer]; + + // Break any retain cycle from the session holding the delegate. + [_session finishTasksAndInvalidate]; + + // Immediately clear the session so no new task may be issued with it. + // + // The _taskToFetcherMap needs to stay valid until the outstanding tasks finish. + _session = nil; +} + +- (void)setFetcher:(GTMSessionFetcher *)fetcher forTask:(NSURLSessionTask *)task { + GTMSESSION_ASSERT_DEBUG(fetcher != nil, @"missing fetcher"); + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_taskToFetcherMap == nil) { + _taskToFetcherMap = [[NSMutableDictionary alloc] init]; + } + + if (fetcher) { + [_taskToFetcherMap setObject:fetcher forKey:task]; + [self destroyDiscardTimer]; + } + } +} + +- (void)removeFetcher:(GTMSessionFetcher *)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + // Typically, a fetcher should be removed when its task invokes + // URLSession:task:didCompleteWithError:. + // + // When fetching with a testBlock, though, the task completed delegate + // method may not be invoked, requiring cleanup here. + NSArray *tasks = [_taskToFetcherMap allKeysForObject:fetcher]; + GTMSESSION_ASSERT_DEBUG(tasks.count <= 1, @"fetcher task not unmapped: %@", tasks); + [_taskToFetcherMap removeObjectsForKeys:tasks]; + + if (_taskToFetcherMap.count == 0) { + [self startDiscardTimer]; + } + } +} + +// This helper method provides synchronized access to the task map for the delegate +// methods below. +- (id)fetcherForTask:(NSURLSessionTask *)task { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return [_taskToFetcherMap objectForKey:task]; + } +} + +- (void)removeTaskFromMap:(NSURLSessionTask *)task { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + [_taskToFetcherMap removeObjectForKey:task]; + } +} + +- (void)setSession:(NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _session = session; + } +} + +- (NSURLSession *)session { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _session; + } +} + +- (NSTimeInterval)discardInterval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _discardInterval; + } +} + +- (void)setDiscardInterval:(NSTimeInterval)interval { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _discardInterval = interval; + } +} + +// NSURLSessionDelegate protocol methods. + +// - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session; +// +// TODO(seh): How do we route this to an appropriate fetcher? + + +- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error { + GTM_LOG_SESSION_DELEGATE(@"%@ %p URLSession:%@ didBecomeInvalidWithError:%@", + [self class], self, session, error); + NSDictionary *localTaskToFetcherMap; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _session = nil; + + localTaskToFetcherMap = [_taskToFetcherMap copy]; + } + + // Any "suspended" tasks may not have received callbacks from NSURLSession when the session + // completes; we'll call them now. + [localTaskToFetcherMap enumerateKeysAndObjectsUsingBlock:^(NSURLSessionTask *task, + GTMSessionFetcher *fetcher, + BOOL *stop) { + if (fetcher.session == session) { + // Our delegate method URLSession:task:didCompleteWithError: will rely on + // _taskToFetcherMap so that should still contain this fetcher. + NSError *canceledError = [NSError errorWithDomain:NSURLErrorDomain + code:NSURLErrorCancelled + userInfo:nil]; + [self URLSession:session task:task didCompleteWithError:canceledError]; + } else { + GTMSESSION_ASSERT_DEBUG(0, @"Unexpected session in fetcher: %@ has %@ (expected %@)", + fetcher, fetcher.session, session); + } + }]; + + // Our tests rely on this notification to know the session discard timer fired. + NSDictionary *userInfo = @{ kGTMSessionFetcherServiceSessionKey : session }; + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc postNotificationName:kGTMSessionFetcherServiceSessionBecameInvalidNotification + object:_parentService + userInfo:userInfo]; +} + + +#pragma mark - NSURLSessionTaskDelegate + +// NSURLSessionTaskDelegate protocol methods. +// +// We won't test here if the fetcher responds to these since we only want this +// class to implement the same delegate methods the fetcher does (so NSURLSession's +// tests for respondsToSelector: will have the same result whether the session +// delegate is the fetcher or this dispatcher.) + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +willPerformHTTPRedirection:(NSHTTPURLResponse *)response + newRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLRequest *))completionHandler { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task +willPerformHTTPRedirection:response + newRequest:request + completionHandler:completionHandler]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))handler { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task + didReceiveChallenge:challenge + completionHandler:handler]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + needNewBodyStream:(void (^)(NSInputStream *bodyStream))handler { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task + needNewBodyStream:handler]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { + id fetcher = [self fetcherForTask:task]; + [fetcher URLSession:session + task:task + didSendBodyData:bytesSent + totalBytesSent:totalBytesSent +totalBytesExpectedToSend:totalBytesExpectedToSend]; +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error { + id fetcher = [self fetcherForTask:task]; + + // This is the usual way tasks are removed from the task map. + [self removeTaskFromMap:task]; + + [fetcher URLSession:session + task:task + didCompleteWithError:error]; +} + +// NSURLSessionDataDelegate protocol methods. + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition))handler { + id fetcher = [self fetcherForTask:dataTask]; + [fetcher URLSession:session + dataTask:dataTask + didReceiveResponse:response + completionHandler:handler]; +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask { + id fetcher = [self fetcherForTask:dataTask]; + GTMSESSION_ASSERT_DEBUG(fetcher != nil, @"Missing fetcher for %@", dataTask); + [self removeTaskFromMap:dataTask]; + if (fetcher) { + GTMSESSION_ASSERT_DEBUG([fetcher isKindOfClass:[GTMSessionFetcher class]], + @"Expecting GTMSessionFetcher"); + [self setFetcher:(GTMSessionFetcher *)fetcher forTask:downloadTask]; + } + + [fetcher URLSession:session + dataTask:dataTask +didBecomeDownloadTask:downloadTask]; +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data { + id fetcher = [self fetcherForTask:dataTask]; + [fetcher URLSession:session + dataTask:dataTask + didReceiveData:data]; +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *))handler { + id fetcher = [self fetcherForTask:dataTask]; + [fetcher URLSession:session + dataTask:dataTask + willCacheResponse:proposedResponse + completionHandler:handler]; +} + +// NSURLSessionDownloadDelegate protocol methods. + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location { + id fetcher = [self fetcherForTask:downloadTask]; + [fetcher URLSession:session + downloadTask:downloadTask +didFinishDownloadingToURL:location]; +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalWritten +totalBytesExpectedToWrite:(int64_t)totalExpected { + id fetcher = [self fetcherForTask:downloadTask]; + [fetcher URLSession:session + downloadTask:downloadTask + didWriteData:bytesWritten + totalBytesWritten:totalWritten +totalBytesExpectedToWrite:totalExpected]; +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes { + id fetcher = [self fetcherForTask:downloadTask]; + [fetcher URLSession:session + downloadTask:downloadTask + didResumeAtOffset:fileOffset + expectedTotalBytes:expectedTotalBytes]; +} + +@end diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h new file mode 100644 index 000000000..51372f2fd --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.h @@ -0,0 +1,128 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +// GTMSessionUploadFetcher implements Google's resumable upload protocol. + +// +// This subclass of GTMSessionFetcher simulates the series of fetches +// needed for chunked upload as a single fetch operation. +// +// Protocol document: TBD +// +// To the client, the only fetcher that exists is this class; the subsidiary +// fetchers needed for uploading chunks are not visible (though the most recent +// chunk fetcher may be accessed via the -activeFetcher or -chunkFetcher methods, and +// -responseHeaders and -statusCode reflect results from the most recent chunk +// fetcher.) +// +// Chunk fetchers are discarded as soon as they have completed. +// + +// Note: Unlike the fetcher superclass, the methods of GTMSessionUploadFetcher should +// only be used from the main thread until further work is done to make this subclass +// thread-safe. + +#import "GTMSessionFetcher.h" +#import "GTMSessionFetcherService.h" + +GTM_ASSUME_NONNULL_BEGIN + +// Unless an application knows it needs a smaller chunk size, it should use the standard +// chunk size, which sends the entire file as a single chunk to minimize upload overhead. +extern int64_t const kGTMSessionUploadFetcherStandardChunkSize; + +// When uploading requires data buffer allocations (such as uploading from an NSData or +// an NSFileHandle) this is the maximum buffer size that will be created by the fetcher. +extern int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize; + +// Notification that the upload location URL was provided by the server. +extern NSString *const kGTMSessionFetcherUploadLocationObtainedNotification; + +// Block to provide data during uploads. +// +// Response data may be allocated with dataWithBytesNoCopy:length:freeWhenDone: for efficiency, +// and released after the response block returns. +// +// Pass nil as the data (and optionally an NSError) for a failure. +typedef void (^GTMSessionUploadFetcherDataProviderResponse)(NSData * GTM_NULLABLE_TYPE data, + NSError * GTM_NULLABLE_TYPE error); +typedef void (^GTMSessionUploadFetcherDataProvider)(int64_t offset, int64_t length, + GTMSessionUploadFetcherDataProviderResponse response); + +@interface GTMSessionUploadFetcher : GTMSessionFetcher + +// Create an upload fetcher specifying either the request or the resume location URL, +// then set an upload data source using one of these: +// +// setUploadFileURL: +// setUploadDataLength:provider: +// setUploadFileHandle: +// setUploadData: + ++ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil; + ++ (instancetype)uploadFetcherWithLocation:(NSURL * GTM_NULLABLE_TYPE)uploadLocationURL + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTM_NULLABLE GTMSessionFetcherService *)fetcherServiceOrNil; + +- (void)setUploadDataLength:(int64_t)fullLength + provider:(GTM_NULLABLE GTMSessionUploadFetcherDataProvider)block; + ++ (NSArray *)uploadFetchersForBackgroundSessions; ++ (GTM_NULLABLE instancetype)uploadFetcherForSessionIdentifier:(NSString *)sessionIdentifier; + +- (void)pauseFetching; +- (void)resumeFetching; +- (BOOL)isPaused; + +@property(atomic, strong, GTM_NULLABLE) NSURL *uploadLocationURL; +@property(atomic, strong, GTM_NULLABLE) NSData *uploadData; +@property(atomic, strong, GTM_NULLABLE) NSURL *uploadFileURL; +@property(atomic, strong, GTM_NULLABLE) NSFileHandle *uploadFileHandle; +@property(atomic, copy, readonly, GTM_NULLABLE) GTMSessionUploadFetcherDataProvider uploadDataProvider; +@property(atomic, copy) NSString *uploadMIMEType; +@property(atomic, assign) int64_t chunkSize; +@property(atomic, readonly, assign) int64_t currentOffset; + +// The fetcher for the current data chunk, if any +@property(atomic, strong, GTM_NULLABLE) GTMSessionFetcher *chunkFetcher; + +// The active fetcher is the current chunk fetcher, or the upload fetcher itself +// if no chunk fetcher has yet been created. +@property(atomic, readonly) GTMSessionFetcher *activeFetcher; + +// The last request made by an active fetcher. Useful for testing. +@property(atomic, readonly, GTM_NULLABLE) NSURLRequest *lastChunkRequest; + +// The status code from the most recently-completed fetch. +@property(atomic, assign) NSInteger statusCode; + +// Exposed for testing only. +@property(atomic, readonly, GTM_NULLABLE) dispatch_queue_t delegateCallbackQueue; +@property(atomic, readonly, GTM_NULLABLE) GTMSessionFetcherCompletionHandler delegateCompletionHandler; + +@end + +@interface GTMSessionFetcher (GTMSessionUploadFetcherMethods) + +@property(readonly, GTM_NULLABLE) GTMSessionUploadFetcher *parentUploadFetcher; + +@end + +GTM_ASSUME_NONNULL_END diff --git a/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m new file mode 100644 index 000000000..a5ae0dcd6 --- /dev/null +++ b/Paco-iOS/Pods/GTMSessionFetcher/Source/GTMSessionUploadFetcher.m @@ -0,0 +1,1804 @@ +/* Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file 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. + */ + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "GTMSessionUploadFetcher.h" + +static NSString *const kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey = @"_upChunk"; +static NSString *const kGTMSessionIdentifierUploadFileURLMetadataKey = @"_upFileURL"; +static NSString *const kGTMSessionIdentifierUploadFileLengthMetadataKey = @"_upFileLen"; +static NSString *const kGTMSessionIdentifierUploadLocationURLMetadataKey = @"_upLocURL"; +static NSString *const kGTMSessionIdentifierUploadMIMETypeMetadataKey = @"_uploadMIME"; +static NSString *const kGTMSessionIdentifierUploadChunkSizeMetadataKey = @"_upChSize"; +static NSString *const kGTMSessionIdentifierUploadCurrentOffsetMetadataKey = @"_upOffset"; + +static NSString *const kGTMSessionHeaderXGoogUploadChunkGranularity = @"X-Goog-Upload-Chunk-Granularity"; +static NSString *const kGTMSessionHeaderXGoogUploadCommand = @"X-Goog-Upload-Command"; +static NSString *const kGTMSessionHeaderXGoogUploadContentLength = @"X-Goog-Upload-Content-Length"; +static NSString *const kGTMSessionHeaderXGoogUploadContentType = @"X-Goog-Upload-Content-Type"; +static NSString *const kGTMSessionHeaderXGoogUploadOffset = @"X-Goog-Upload-Offset"; +static NSString *const kGTMSessionHeaderXGoogUploadProtocol = @"X-Goog-Upload-Protocol"; +static NSString *const kGTMSessionHeaderXGoogUploadSizeReceived = @"X-Goog-Upload-Size-Received"; +static NSString *const kGTMSessionHeaderXGoogUploadStatus = @"X-Goog-Upload-Status"; +static NSString *const kGTMSessionHeaderXGoogUploadURL = @"X-Goog-Upload-URL"; + +// Property of chunk fetchers identifying the parent upload fetcher. Non-retained NSValue. +static NSString *const kGTMSessionUploadFetcherChunkParentKey = @"_uploadFetcherChunkParent"; + +int64_t const kGTMSessionUploadFetcherStandardChunkSize = (int64_t)LLONG_MAX; + +#if TARGET_OS_IPHONE +int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize = 10 * 1024 * 1024; // 10 MB for iOS, watchOS, tvOS +#else +int64_t const kGTMSessionUploadFetcherMaximumDemandBufferSize = 100 * 1024 * 1024; // 100 MB for macOS +#endif + +typedef NS_ENUM(NSUInteger, GTMSessionUploadFetcherStatus) { + kStatusUnknown, + kStatusActive, + kStatusFinal, + kStatusCancelled, +}; + +NSString *const kGTMSessionFetcherUploadLocationObtainedNotification = + @"kGTMSessionFetcherUploadLocationObtainedNotification"; + +#if !GTMSESSION_BUILD_COMBINED_SOURCES +@interface GTMSessionFetcher (ProtectedMethods) + +// Access to non-public method on the parent fetcher class. +- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks; +- (void)createSessionIdentifierWithMetadata:(NSDictionary *)metadata; +- (GTMSessionFetcherCompletionHandler)completionHandlerWithTarget:(id)target + didFinishSelector:(SEL)finishedSelector; +- (void)invokeOnCallbackQueue:(dispatch_queue_t)callbackQueue + afterUserStopped:(BOOL)afterStopped + block:(void (^)(void))block; +- (NSTimer *)retryTimer; + +@property(readwrite, strong) NSData *downloadedData; +- (void)releaseCallbacks; + +- (NSInteger)statusCodeUnsynchronized; + +@end +#endif // !GTMSESSION_BUILD_COMBINED_SOURCES + +@interface GTMSessionUploadFetcher () + +// Changing readonly to readwrite. +@property(atomic, strong, readwrite) NSURLRequest *lastChunkRequest; +@property(atomic, readwrite, assign) int64_t currentOffset; + +// Internal properties. +@property(strong, atomic, GTM_NULLABLE) GTMSessionFetcher *fetcherInFlight; // Synchronized on self. + +@property(assign, atomic, getter=isSubdataGenerating) BOOL subdataGenerating; +@property(assign, atomic) BOOL shouldInitiateOffsetQuery; +@property(assign, atomic) int64_t uploadGranularity; + +@end + +@implementation GTMSessionUploadFetcher { + GTMSessionFetcher *_chunkFetcher; + + // We'll call through to the delegate's completion handler. + GTMSessionFetcherCompletionHandler _delegateCompletionHandler; + dispatch_queue_t _delegateCallbackQueue; + + // The initial fetch's body length and bytes actually sent are + // needed for calculating progress during subsequent chunk uploads + int64_t _initialBodyLength; + int64_t _initialBodySent; + + // The upload server address for the chunks of this upload session. + NSURL *_uploadLocationURL; + + // _uploadData, _uploadDataProvider, or _uploadFileHandle may be set, but only one. + NSData *_uploadData; + NSFileHandle *_uploadFileHandle; + GTMSessionUploadFetcherDataProvider _uploadDataProvider; + NSURL *_uploadFileURL; + int64_t _uploadFileLength; + NSString *_uploadMIMEType; + int64_t _chunkSize; + int64_t _uploadGranularity; + BOOL _isPaused; + BOOL _isRestartedUpload; + BOOL _shouldInitiateOffsetQuery; + + // Tied to useBackgroundSession property, since this property is applicable to chunk fetchers. + BOOL _useBackgroundSessionOnChunkFetchers; + + // We keep the latest offset into the upload data just for progress reporting. + int64_t _currentOffset; + + NSDictionary *_recentChunkReponseHeaders; + NSInteger _recentChunkStatusCode; + + // For waiting, we need to know the fetcher in flight, if any, and if subdata generation + // is in progress. + GTMSessionFetcher *_fetcherInFlight; + BOOL _isSubdataGenerating; +} + ++ (void)load { + [self uploadFetchersForBackgroundSessions]; +} + ++ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTMSessionFetcherService *)fetcherService { + GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:request + fetcherService:fetcherService]; + [fetcher setLocationURL:nil + uploadMIMEType:uploadMIMEType + chunkSize:chunkSize]; + return fetcher; +} + ++ (instancetype)uploadFetcherWithLocation:(NSURL * GTM_NULLABLE_TYPE)uploadLocationURL + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize + fetcherService:(GTMSessionFetcherService *)fetcherService { + GTMSessionUploadFetcher *fetcher = [self uploadFetcherWithRequest:nil + fetcherService:fetcherService]; + [fetcher setLocationURL:uploadLocationURL + uploadMIMEType:uploadMIMEType + chunkSize:chunkSize]; + return fetcher; +} + ++ (instancetype)uploadFetcherForSessionIdentifierMetadata:(NSDictionary *)metadata { + GTMSESSION_ASSERT_DEBUG( + [metadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] boolValue], + @"Session identifier metadata is not for an upload fetcher: %@", metadata); + + NSNumber *uploadFileLengthNum = metadata[kGTMSessionIdentifierUploadFileLengthMetadataKey]; + GTMSESSION_ASSERT_DEBUG(uploadFileLengthNum != nil, + @"Session metadata missing an UploadFileSize"); + if (uploadFileLengthNum == nil) return nil; + + int64_t uploadFileLength = [uploadFileLengthNum longLongValue]; + GTMSESSION_ASSERT_DEBUG(uploadFileLength >= 0, @"Session metadata UploadFileSize is unknown"); + + NSString *uploadFileURLString = metadata[kGTMSessionIdentifierUploadFileURLMetadataKey]; + GTMSESSION_ASSERT_DEBUG(uploadFileURLString, @"Session metadata missing an UploadFileURL"); + if (uploadFileURLString == nil) return nil; + + NSURL *uploadFileURL = [NSURL URLWithString:uploadFileURLString]; + // There used to be a call here to NSURL checkResourceIsReachableAndReturnError: to check for the + // existence of the file (also tried NSFileManager fileExistsAtPath:). We've determined + // empirically that the check can fail at startup even when the upload file does in fact exist. + // For now, we'll go ahead and restore the background upload fetcher. If the file doesn't exist, + // it will fail later. + + NSString *uploadLocationURLString = metadata[kGTMSessionIdentifierUploadLocationURLMetadataKey]; + NSURL *uploadLocationURL = + uploadLocationURLString ? [NSURL URLWithString:uploadLocationURLString] : nil; + + NSString *uploadMIMEType = + metadata[kGTMSessionIdentifierUploadMIMETypeMetadataKey]; + int64_t uploadChunkSize = + [metadata[kGTMSessionIdentifierUploadChunkSizeMetadataKey] longLongValue]; + if (uploadChunkSize <= 0) { + uploadChunkSize = kGTMSessionUploadFetcherStandardChunkSize; + } + int64_t currentOffset = + [metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] longLongValue]; + GTMSESSION_ASSERT_DEBUG(currentOffset <= uploadFileLength, + @"CurrentOffset (%lld) exceeds UploadFileSize (%lld)", + currentOffset, uploadFileLength); + if (currentOffset > uploadFileLength) return nil; + + GTMSessionUploadFetcher *uploadFetcher = [self uploadFetcherWithLocation:uploadLocationURL + uploadMIMEType:uploadMIMEType + chunkSize:uploadChunkSize + fetcherService:nil]; + // Set the upload file length before setting the upload file URL tries to determine the length. + [uploadFetcher setUploadFileLength:uploadFileLength]; + + uploadFetcher.uploadFileURL = uploadFileURL; + uploadFetcher.sessionUserInfo = metadata; + uploadFetcher.useBackgroundSession = YES; + uploadFetcher.currentOffset = currentOffset; + uploadFetcher.allowedInsecureSchemes = @[ @"http" ]; // Allowed on restored upload fetcher. + return uploadFetcher; +} + ++ (instancetype)uploadFetcherWithRequest:(NSURLRequest *)request + fetcherService:(GTMSessionFetcherService *)fetcherService { + // Internal utility method for instantiating fetchers + GTMSessionUploadFetcher *fetcher; + if ([fetcherService isKindOfClass:[GTMSessionFetcherService class]]) { + fetcher = [fetcherService fetcherWithRequest:request + fetcherClass:self]; + } else { + fetcher = [self fetcherWithRequest:request]; + } + fetcher.useBackgroundSession = YES; + return fetcher; +} + ++ (NSPointerArray *)uploadFetcherPointerArrayForBackgroundSessions { + static NSPointerArray *gUploadFetcherPointerArrayForBackgroundSessions = nil; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gUploadFetcherPointerArrayForBackgroundSessions = [NSPointerArray weakObjectsPointerArray]; + }); + return gUploadFetcherPointerArrayForBackgroundSessions; +} + ++ (instancetype)uploadFetcherForSessionIdentifier:(NSString *)sessionIdentifier { + GTMSESSION_ASSERT_DEBUG(sessionIdentifier != nil, @"Invalid session identifier"); + NSArray *uploadFetchersForBackgroundSessions = [self uploadFetchersForBackgroundSessions]; + for (GTMSessionUploadFetcher *uploadFetcher in uploadFetchersForBackgroundSessions) { + if ([uploadFetcher.chunkFetcher.sessionIdentifier isEqual:sessionIdentifier]) { + return uploadFetcher; + } + } + return nil; +} + ++ (NSArray *)uploadFetchersForBackgroundSessions { + // Collect the background session upload fetchers that are still in memory. + NSPointerArray *uploadFetcherPointerArray = [self uploadFetcherPointerArrayForBackgroundSessions]; + [uploadFetcherPointerArray compact]; + NSMutableSet *restoredSessionIdentifiers = [[NSMutableSet alloc] init]; + NSMutableArray *uploadFetchers = [[NSMutableArray alloc] init]; + for (GTMSessionUploadFetcher *uploadFetcher in uploadFetcherPointerArray) { + NSString *sessionIdentifier = uploadFetcher.chunkFetcher.sessionIdentifier; + if (sessionIdentifier) { + [restoredSessionIdentifiers addObject:sessionIdentifier]; + [uploadFetchers addObject:uploadFetcher]; + } + } + + // The system may have other ongoing background upload sessions. Restore upload fetchers for those + // too. + NSArray *fetchers = [GTMSessionFetcher fetchersForBackgroundSessions]; + for (GTMSessionFetcher *fetcher in fetchers) { + NSString *sessionIdentifier = fetcher.sessionIdentifier; + if (!sessionIdentifier || [restoredSessionIdentifiers containsObject:sessionIdentifier]) { + continue; + } + NSDictionary *sessionIdentifierMetadata = [fetcher sessionIdentifierMetadata]; + if (sessionIdentifierMetadata == nil) { + continue; + } + if (![sessionIdentifierMetadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] boolValue]) { + continue; + } + GTMSessionUploadFetcher *uploadFetcher = + [self uploadFetcherForSessionIdentifierMetadata:sessionIdentifierMetadata]; + if (uploadFetcher == nil) { + // Something went wrong with this upload fetcher, so kill the restored chunk fetcher. + [fetcher stopFetching]; + continue; + } + [uploadFetchers addObject:uploadFetcher]; + uploadFetcher->_chunkFetcher = fetcher; + uploadFetcher->_fetcherInFlight = fetcher; + [uploadFetcher attachSendProgressBlockToChunkFetcher:fetcher]; + fetcher.completionHandler = + [fetcher completionHandlerWithTarget:uploadFetcher + didFinishSelector:@selector(chunkFetcher:finishedWithData:error:)]; + + GTMSESSION_LOG_DEBUG(@"%@ restoring upload fetcher %@ for chunk fetcher %@", + [self class], uploadFetcher, fetcher); + } + return uploadFetchers; +} + +- (void)setUploadData:(NSData *)data { + BOOL changed = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadData != data) { + _uploadData = data; + changed = YES; + } + } + if (changed) { + [self setupRequestHeaders]; + } +} + +- (NSData *)uploadData { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadData; + } +} + +- (void)setUploadFileHandle:(NSFileHandle *)fh { + BOOL changed = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadFileHandle != fh) { + _uploadFileHandle = fh; + changed = YES; + } + } + if (changed) { + [self setupRequestHeaders]; + } +} + +- (NSFileHandle *)uploadFileHandle { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadFileHandle; + } +} + +- (void)setUploadFileURL:(NSURL *)uploadURL { + BOOL changed = NO; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadFileURL != uploadURL) { + _uploadFileURL = uploadURL; + changed = YES; + } + } + if (changed) { + [self setupRequestHeaders]; + } +} + +- (NSURL *)uploadFileURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadFileURL; + } +} + +- (void)setUploadFileLength:(int64_t)fullLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _uploadFileLength = fullLength; + } +} + +- (void)setUploadDataLength:(int64_t)fullLength + provider:(GTMSessionUploadFetcherDataProvider)block { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _uploadDataProvider = [block copy]; + _uploadFileLength = fullLength; + } + [self setupRequestHeaders]; +} + +- (GTMSessionUploadFetcherDataProvider)uploadDataProvider { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadDataProvider; + } +} + + +- (void)setUploadMIMEType:(NSString *)uploadMIMEType { + GTMSESSION_ASSERT_DEBUG(0, @"TODO: disallow setUploadMIMEType by making declaration readonly"); + // (and uploadMIMEType, chunksize, currentOffset) + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _uploadMIMEType = uploadMIMEType; + } +} + +- (NSString *)uploadMIMEType { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadMIMEType; + } +} + +- (void)setChunkSize:(int64_t)chunkSize { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _chunkSize = chunkSize; + } +} + +- (int64_t)chunkSize { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _chunkSize; + } +} + +- (void)setupRequestHeaders { + GTMSessionCheckNotSynchronized(self); + +#if DEBUG + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + int hasData = (_uploadData != nil) ? 1 : 0; + int hasFileHandle = (_uploadFileHandle != nil) ? 1 : 0; + int hasFileURL = (_uploadFileURL != nil) ? 1 : 0; + int hasUploadDataProvider = (_uploadDataProvider != nil) ? 1 : 0; + int numberOfSources = hasData + hasFileHandle + hasFileURL + hasUploadDataProvider; + #pragma unused(numberOfSources) + GTMSESSION_ASSERT_DEBUG(numberOfSources == 1, + @"Need just one upload source (%d)", numberOfSources); + } // @synchronized(self) +#endif + + // Add our custom headers to the initial request indicating the data + // type and total size to be delivered later in the chunk requests. + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + + GTMSESSION_ASSERT_DEBUG((mutableRequest == nil) != (_uploadLocationURL == nil), + @"Request and location are mutually exclusive"); + if (!mutableRequest) return; + + NSNumber *lengthNum = @([self fullUploadLength]); + [mutableRequest setValue:@"resumable" + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadProtocol]; + [mutableRequest setValue:@"start" + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + [mutableRequest setValue:_uploadMIMEType + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentType]; + [mutableRequest setValue:lengthNum.stringValue + forHTTPHeaderField:kGTMSessionHeaderXGoogUploadContentLength]; + + NSString *method = mutableRequest.HTTPMethod; + if (method == nil || [method caseInsensitiveCompare:@"GET"] == NSOrderedSame) { + [mutableRequest setHTTPMethod:@"POST"]; + } + + // Ensure the user agent header identifies this to the upload server as a + // GTMSessionUploadFetcher client. The /1 can be incremented in the unlikely circumstance + // we need to make a bug fix in the client that the server can recognize. + NSString *const kUserAgentStub = @"(GTMSUF/1)"; + NSString *userAgent = [mutableRequest valueForHTTPHeaderField:@"User-Agent"]; + if (userAgent == nil + || [userAgent rangeOfString:kUserAgentStub].location == NSNotFound) { + if (userAgent.length == 0) { + userAgent = GTMFetcherStandardUserAgentString(nil); + } + userAgent = [userAgent stringByAppendingFormat:@" %@", kUserAgentStub]; + [mutableRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + } + [self setRequest:mutableRequest]; +} + +- (void)setLocationURL:(NSURL * GTM_NULLABLE_TYPE)location + uploadMIMEType:(NSString *)uploadMIMEType + chunkSize:(int64_t)chunkSize { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + GTMSESSION_ASSERT_DEBUG(chunkSize > 0, @"chunk size is zero"); + + // When resuming an upload, set the known upload target URL. + _uploadLocationURL = location; + + _uploadMIMEType = uploadMIMEType; + _chunkSize = chunkSize; + + // Indicate that we've not yet determined the file handle's length + _uploadFileLength = -1; + + // Indicate that we've not yet determined the upload fetcher status + _recentChunkStatusCode = -1; + + // If this is restarting an upload begun by another fetcher, + // the location is specified but the request is nil + _isRestartedUpload = (location != nil); + } // @synchronized(self) +} + +- (int64_t)fullUploadLength { + int64_t result; + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_uploadData) { + result = (int64_t)_uploadData.length; + } else { + if (_uploadFileLength == -1) { + if (_uploadFileHandle) { + // First time through, seek to end to determine file length + _uploadFileLength = (int64_t)[_uploadFileHandle seekToEndOfFile]; + } else if (_uploadDataProvider) { + // _uploadFileLength is set when the _uploadDataProvider is set. + GTMSESSION_ASSERT_DEBUG(_uploadFileLength >= 0, @"No uploadDataProvider length set"); + } else { + NSNumber *filesizeNum; + NSError *valueError; + if ([_uploadFileURL getResourceValue:&filesizeNum + forKey:NSURLFileSizeKey + error:&valueError]) { + _uploadFileLength = filesizeNum.longLongValue; + } else { + GTMSESSION_ASSERT_DEBUG(NO, @"Cannot get file size: %@\n %@", + valueError, _uploadFileURL.path); + _uploadFileLength = 0; + } + } + } + result = _uploadFileLength; + } + } // @synchronized(self) + return result; +} + +// Make a subdata of the upload data. +- (void)generateChunkSubdataWithOffset:(int64_t)offset + length:(int64_t)length + response:(GTMSessionUploadFetcherDataProviderResponse)response { + GTMSessionUploadFetcherDataProvider uploadDataProvider = self.uploadDataProvider; + if (uploadDataProvider) { + uploadDataProvider(offset, length, response); + return; + } + + NSData *uploadData = self.uploadData; + if (uploadData) { + // NSData provided. + NSData *resultData; + if (offset == 0 && length == (int64_t)uploadData.length) { + resultData = uploadData; + } else { + int64_t dataLength = (int64_t)uploadData.length; + // Ensure our range is valid. b/18007814 + if (offset + length > dataLength) { + NSString *errorMessage = [NSString stringWithFormat: + @"Range invalid for upload data. offset: %lld\tlength: %lld\tdataLength: %lld", + offset, length, dataLength]; + GTMSESSION_ASSERT_DEBUG(NO, @"%@", errorMessage); + response(nil, [self uploadChunkUnavailableErrorWithDescription:errorMessage]); + return; + } + NSRange range = NSMakeRange((NSUInteger)offset, (NSUInteger)length); + resultData = [uploadData subdataWithRange:range]; + } + response(resultData, nil); + return; + } + NSURL *uploadFileURL = self.uploadFileURL; + if (uploadFileURL) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self generateChunkSubdataFromFileURL:uploadFileURL + offset:offset + length:length + response:response]; + }); + return; + } + GTMSESSION_ASSERT_DEBUG(_uploadFileHandle, @"Unexpectedly missing upload data package"); + NSFileHandle *uploadFileHandle = self.uploadFileHandle; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self generateChunkSubdataFromFileHandle:uploadFileHandle + offset:offset + length:length + response:response]; + }); +} + +- (void)generateChunkSubdataFromFileHandle:(NSFileHandle *)fileHandle + offset:(int64_t)offset + length:(int64_t)length + response:(GTMSessionUploadFetcherDataProviderResponse)response { + NSData *resultData; + NSError *error; + @try { + [fileHandle seekToFileOffset:(unsigned long long)offset]; + resultData = [fileHandle readDataOfLength:(NSUInteger)length]; + } + @catch (NSException *exception) { + GTMSESSION_ASSERT_DEBUG(NO, @"uploadFileHandle failed to read, %@", exception); + error = [self uploadChunkUnavailableErrorWithDescription:exception.description]; + } + // The response always re-dispatches to the main thread, so we skip doing that here. + response(resultData, error); +} + +- (void)generateChunkSubdataFromFileURL:(NSURL *)fileURL + offset:(int64_t)offset + length:(int64_t)length + response:(GTMSessionUploadFetcherDataProviderResponse)response { + GTMSessionCheckNotSynchronized(self); + + NSData *resultData; + NSError *error; + int64_t fullUploadLength = [self fullUploadLength]; + NSData *mappedData = + [NSData dataWithContentsOfURL:fileURL + options:NSDataReadingMappedAlways + NSDataReadingUncached + error:&error]; + if (!mappedData) { + // We could not create an NSData by memory-mapping the file. +#if TARGET_IPHONE_SIMULATOR + // NSTemporaryDirectory() can differ in the simulator between app restarts, + // yet the contents for the new path remains unchanged, so try the latest temp path. + if ([error.domain isEqual:NSCocoaErrorDomain] && (error.code == NSFileReadNoSuchFileError)) { + NSString *filename = [fileURL lastPathComponent]; + NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:filename]; + NSURL *newFileURL = [NSURL fileURLWithPath:filePath]; + if (![newFileURL isEqual:fileURL]) { + [self generateChunkSubdataFromFileURL:newFileURL + offset:offset + length:length + response:response]; + return; + } + } +#endif + + // If the file is just too large to create an NSData for, or if for some other reason we can't + // map it, create an NSFileHandle instead to read a subset into an NSData. +#if DEBUG + NSNumber *fileSizeNum; + BOOL hasFileSize = [fileURL getResourceValue:&fileSizeNum forKey:NSURLFileSizeKey error:NULL]; + GTMSESSION_LOG_DEBUG(@"Note: uploadFileURL is falling back to creating upload chunks by reading" + @" an NSFileHandle since uploadFileURL failed to map the upload file," + @" file size %@, %@", + hasFileSize ? fileSizeNum : @"unknown", error); +#endif + + NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:fileURL + error:&error]; + if (fileHandle != nil) { + [self generateChunkSubdataFromFileHandle:fileHandle + offset:offset + length:length + response:response]; + return; + } + GTMSESSION_ASSERT_DEBUG(NO, @"uploadFileURL failed to read, %@", error); + // Fall through with the error. + } else { + // Successfully created an NSData by memory-mapping the file. + if (offset > 0 || length < fullUploadLength) { + NSRange range = NSMakeRange((NSUInteger)offset, (NSUInteger)length); + resultData = [mappedData subdataWithRange:range]; + } else { + resultData = mappedData; + } + } + // The response always re-dispatches to the main thread, so we skip re-dispatching here. + response(resultData, error); +} + +- (NSError *)uploadChunkUnavailableErrorWithDescription:(NSString *)description { + // The description in the userInfo is intended as a clue to programmers, not + // for client code to examine or rely on. + NSDictionary *userInfo = @{ @"description" : description }; + return [NSError errorWithDomain:kGTMSessionFetcherErrorDomain + code:GTMSessionFetcherErrorUploadChunkUnavailable + userInfo:userInfo]; +} + +- (NSError *)prematureFailureErrorWithUserInfo:(NSDictionary *)userInfo { + // An error for if we get an unexpected status from the upload server or + // otherwise cannot continue. This is an issue beyond the upload protocol; + // there's no way the client can do anything useful except give up. + NSError *error = [NSError errorWithDomain:kGTMSessionFetcherStatusDomain + code:501 // Not implemented + userInfo:userInfo]; + return error; +} + ++ (GTMSessionUploadFetcherStatus)uploadStatusFromResponseHeaders:(NSDictionary *)responseHeaders { + NSString *statusString = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus]; + if ([statusString isEqual:@"active"]) { + return kStatusActive; + } + if ([statusString isEqual:@"final"]) { + return kStatusFinal; + } + if ([statusString isEqual:@"cancelled"]) { + return kStatusCancelled; + } + return kStatusUnknown; +} + +#pragma mark Method overrides affecting the initial fetch only + +- (void)setCompletionHandler:(GTMSessionFetcherCompletionHandler)handler { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateCompletionHandler = handler; + } +} + +- (void)setDelegateCallbackQueue:(dispatch_queue_t GTM_NULLABLE_TYPE)queue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateCallbackQueue = queue; + } +} + +- (dispatch_queue_t GTM_NULLABLE_TYPE)delegateCallbackQueue { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _delegateCallbackQueue; + } +} + +- (BOOL)isRestartedUpload { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _isRestartedUpload; + } +} + +- (GTMSessionFetcher * GTM_NULLABLE_TYPE)chunkFetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _chunkFetcher; + } +} + +- (void)setChunkFetcher:(GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _chunkFetcher = fetcher; + } +} + +- (void)setFetcherInFlight:(GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _fetcherInFlight = fetcher; + } +} + +- (GTMSessionFetcher * GTM_NULLABLE_TYPE)fetcherInFlight { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _fetcherInFlight; + } +} + +- (void)beginFetchWithCompletionHandler:(GTMSessionFetcherCompletionHandler)handler { + GTMSessionCheckNotSynchronized(self); + + [self setInitialBodyLength:[self bodyLength]]; + + // We'll hold onto the superclass's callback queue so we can invoke the handler + // even after the superclass has released the queue and its callback handler, as + // happens during auth failure. + [self setDelegateCallbackQueue:self.callbackQueue]; + self.completionHandler = handler; + + if ([self isRestartedUpload]) { + // When restarting an upload, we know the destination location for chunk fetches, + // but we need to query to find the initial offset. + if (![self isPaused]) { + [self sendQueryForUploadOffsetWithFetcherProperties:self.properties]; + } + return; + } + // We don't want to call into the client's completion block immediately + // after the finish of the initial connection (the delegate is called only + // when uploading finishes), so we substitute our own completion block to be + // called when the initial connection finishes + GTMSESSION_ASSERT_DEBUG(self.fetcherInFlight == nil, @"unexpected fetcher in flight: %@", + self.fetcherInFlight); + + self.fetcherInFlight = self; + [super beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + self.fetcherInFlight = nil; + // callback + + BOOL hasTestBlock = (self.testBlock != nil); + if (![self isRestartedUpload] && !hasTestBlock) { + if (error == nil) { + [self beginChunkFetches]; + } else { + if ([self retryTimer] == nil) { + [self invokeFinalCallbackWithData:nil + error:error + shouldInvalidateLocation:YES]; + } + } + } else { + // If there was no initial request, then this fetch is resuming some + // other uploadFetcher's initial request, and the superclass's connection + // is never used, so at this point we call the user's actual completion + // block. + if (!hasTestBlock) { + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:YES]; + } else { + // There was a test block, so we won't do chunk fetches, but we simulate obtaining + // the data to be uploaded from the upload data provider block or the file handle, + // and then call back. + [self generateChunkSubdataWithOffset:0 + length:[self fullUploadLength] + response:^(NSData *generateData, NSError *generateError) { + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:YES]; + }]; + } + } + }]; +} + +- (void)beginChunkFetches { + GTMSessionCheckNotSynchronized(self); + +#if DEBUG + // The initial response of the resumable upload protocol should have an + // empty body + // + // This assert typically happens because the upload create/edit link URL was + // not supplied with the request, and the server is thus expecting a non- + // resumable request/response. + if (self.downloadedData.length > 0) { + NSData *downloadedData = self.downloadedData; + NSString *str = [[NSString alloc] initWithData:downloadedData + encoding:NSUTF8StringEncoding]; + #pragma unused(str) + GTMSESSION_ASSERT_DEBUG(NO, @"unexpected response data (uploading to the wrong URL?)\n%@", str); + } +#endif + + // We need to get the upload URL from the location header to continue. + NSDictionary *responseHeaders = [self responseHeaders]; + + [self retrieveUploadChunkGranularityFromResponseHeaders:responseHeaders]; + + GTMSessionUploadFetcherStatus uploadStatus = + [[self class] uploadStatusFromResponseHeaders:responseHeaders]; + GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown, + @"beginChunkFetches has unexpected upload status for headers %@", responseHeaders); + + BOOL isPrematureStop = (uploadStatus == kStatusFinal) || (uploadStatus == kStatusCancelled); + + NSString *uploadLocationURLStr = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadURL]; + BOOL hasUploadLocation = (uploadLocationURLStr.length > 0); + + if (isPrematureStop || !hasUploadLocation) { + GTMSESSION_ASSERT_DEBUG(NO, @"Premature failure: upload-status:\"%@\" location:%@", + [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus], uploadLocationURLStr); + // We cannot continue since we do not know the location to use + // as our upload destination. + NSDictionary *userInfo = nil; + NSData *downloadedData = self.downloadedData; + if (downloadedData.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : downloadedData }; + } + NSError *failureError = [self prematureFailureErrorWithUserInfo:userInfo]; + [self invokeFinalCallbackWithData:nil + error:failureError + shouldInvalidateLocation:YES]; + return; + } + + self.uploadLocationURL = [NSURL URLWithString:uploadLocationURLStr]; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc postNotificationName:kGTMSessionFetcherUploadLocationObtainedNotification + object:self]; + + // we've now sent all of the initial post body data, so we need to include + // its size in future progress indicator callbacks + [self setInitialBodySent:[self initialBodyLength]]; + + // just in case the user paused us during the initial fetch... + if (![self isPaused]) { + [self uploadNextChunkWithOffset:0]; + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent + totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { + // Overrides the superclass. + [self invokeDelegateWithDidSendBytes:bytesSent + totalBytesSent:totalBytesSent + totalBytesExpectedToSend:totalBytesExpectedToSend + [self fullUploadLength]]; +} + +- (BOOL)shouldReleaseCallbacksUponCompletion { + // Overrides the superclass. + + // We don't want the superclass to release the delegate and callback + // blocks once the initial fetch has finished + // + // This is invoked for only successful completion of the connection; + // an error always will invoke and release the callbacks + return NO; +} + +- (void)invokeFinalCallbackWithData:(NSData *)data + error:(NSError *)error + shouldInvalidateLocation:(BOOL)shouldInvalidateLocation { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (shouldInvalidateLocation) { + _uploadLocationURL = nil; + } + + dispatch_queue_t queue = _delegateCallbackQueue; + GTMSessionFetcherCompletionHandler handler = _delegateCompletionHandler; + if (queue && handler) { + [self invokeOnCallbackQueue:queue + afterUserStopped:NO + block:^{ + handler(data, error); + }]; + } + } // @synchronized(self) + + [self releaseUploadAndBaseCallbacks]; +} + +- (void)releaseUploadAndBaseCallbacks { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _delegateCallbackQueue = nil; + _delegateCompletionHandler = nil; + _uploadDataProvider = nil; + } + + // Release the base class's callbacks, too, if needed. + [self releaseCallbacks]; +} + +- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks { + GTMSessionCheckNotSynchronized(self); + + // Clear _fetcherInFlight when stopped. Moved from stopFetching, since that's a public method, + // where this method does the work. Fixes issue clearing value when retryBlock included. + GTMSessionFetcher *fetcherInFlight = self.fetcherInFlight; + if (fetcherInFlight == self) { + self.fetcherInFlight = nil; + } + + [super stopFetchReleasingCallbacks:shouldReleaseCallbacks]; + + if (shouldReleaseCallbacks) { + [self releaseUploadAndBaseCallbacks]; + } +} + +#pragma mark Chunk fetching methods + +- (void)uploadNextChunkWithOffset:(int64_t)offset { + // use the properties in each chunk fetcher + NSDictionary *props = [self properties]; + + [self uploadNextChunkWithOffset:offset + fetcherProperties:props]; +} + +- (void)sendQueryForUploadOffsetWithFetcherProperties:(NSDictionary *)props { + GTMSessionFetcher *queryFetcher = [self uploadFetcherWithProperties:props + isQueryFetch:YES]; + queryFetcher.bodyData = [NSData data]; + + NSString *originalComment = self.comment; + [queryFetcher setCommentWithFormat:@"%@ (query offset)", + originalComment ? originalComment : @"upload"]; + + [queryFetcher setRequestValue:@"query" forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + + self.fetcherInFlight = queryFetcher; + [queryFetcher beginFetchWithDelegate:self + didFinishSelector:@selector(queryFetcher:finishedWithData:error:)]; +} + +- (void)queryFetcher:(GTMSessionFetcher *)queryFetcher + finishedWithData:(NSData *)data + error:(NSError *)error { + self.fetcherInFlight = nil; + + NSDictionary *responseHeaders = [queryFetcher responseHeaders]; + NSString *sizeReceivedHeader; + + GTMSessionUploadFetcherStatus uploadStatus = + [[self class] uploadStatusFromResponseHeaders:responseHeaders]; + GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown || error != nil, + @"query fetcher completion has unexpected upload status for headers %@", responseHeaders); + + if (error == nil) { + sizeReceivedHeader = [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadSizeReceived]; + + if (uploadStatus == kStatusCancelled || + (uploadStatus == kStatusActive && sizeReceivedHeader == nil)) { + NSDictionary *userInfo = nil; + if (data.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; + } + error = [self prematureFailureErrorWithUserInfo:userInfo]; + } + } + + if (error == nil) { + int64_t offset = [sizeReceivedHeader longLongValue]; + int64_t fullUploadLength = [self fullUploadLength]; + if (offset >= fullUploadLength || uploadStatus == kStatusFinal) { + // Handle we're done + [self chunkFetcher:queryFetcher finishedWithData:data error:nil]; + } else { + [self retrieveUploadChunkGranularityFromResponseHeaders:responseHeaders]; + [self uploadNextChunkWithOffset:offset]; + } + } else { + // Handle query error + [self chunkFetcher:queryFetcher finishedWithData:data error:error]; + } +} + +- (void)sendCancelUploadWithFetcherProperties:(NSDictionary *)props { + GTMSessionFetcher *cancelFetcher = [self uploadFetcherWithProperties:props + isQueryFetch:YES]; + cancelFetcher.bodyData = [NSData data]; + + NSString *originalComment = self.comment; + [cancelFetcher setCommentWithFormat:@"%@ (cancel)", + originalComment ? originalComment : @"upload"]; + + [cancelFetcher setRequestValue:@"cancel" forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + + self.fetcherInFlight = cancelFetcher; + [cancelFetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { + self.fetcherInFlight = nil; + if (error) { + GTMSESSION_LOG_DEBUG(@"cancelFetcher %@", error); + } + }]; +} + +- (void)uploadNextChunkWithOffset:(int64_t)offset + fetcherProperties:(NSDictionary *)props { + GTMSessionCheckNotSynchronized(self); + + // Example chunk headers: + // X-Goog-Upload-Command: upload, finalize + // X-Goog-Upload-Offset: 0 + // Content-Length: 2000000 + // Content-Type: image/jpeg + // + // {bytes 0-1999999} + + // The chunk upload URL requires no authentication header. + GTMSessionFetcher *chunkFetcher = [self uploadFetcherWithProperties:props + isQueryFetch:NO]; + [self attachSendProgressBlockToChunkFetcher:chunkFetcher]; + + BOOL isUploadingFileURL = (self.uploadFileURL != nil); + + // Upload another chunk, meeting server-required granularity. + int64_t chunkSize = self.chunkSize; + + int64_t fullUploadLength = [self fullUploadLength]; + + BOOL isUploadingFullFile = (offset == 0 && chunkSize >= fullUploadLength); + if (!isUploadingFileURL || !isUploadingFullFile) { + // We're not uploading the entire file and given the file URL. Since we'll be + // allocating a subdata block for a chunk, we need to bound it to something that + // won't blow the process's memory. + if (chunkSize > kGTMSessionUploadFetcherMaximumDemandBufferSize) { + chunkSize = kGTMSessionUploadFetcherMaximumDemandBufferSize; + } + } + + int64_t granularity = self.uploadGranularity; + if (granularity > 0) { + if (chunkSize < granularity) { + chunkSize = granularity; + } else { + chunkSize = chunkSize - (chunkSize % granularity); + } + } + + GTMSESSION_ASSERT_DEBUG(offset < fullUploadLength || fullUploadLength == 0, + @"offset %lld exceeds data length %lld", offset, fullUploadLength); + + if (granularity > 0) { + offset = offset - (offset % granularity); + } + + // If the chunk size is bigger than the remaining data, or else + // it's close enough in size to the remaining data that we'd rather + // avoid having a whole extra http fetch for the leftover bit, then make + // this chunk size exactly match the remaining data size + NSString *command; + int64_t thisChunkSize = chunkSize; + + BOOL isChunkTooBig = (thisChunkSize >= (fullUploadLength - offset)); + BOOL isChunkAlmostBigEnough = (fullUploadLength - offset - 2500 < thisChunkSize); + BOOL isFinalChunk = isChunkTooBig || isChunkAlmostBigEnough; + if (isFinalChunk) { + thisChunkSize = fullUploadLength - offset; + if (thisChunkSize > 0) { + command = @"upload, finalize"; + } else { + command = @"finalize"; + } + } else { + command = @"upload"; + } + NSString *lengthStr = @(thisChunkSize).stringValue; + NSString *offsetStr = @(offset).stringValue; + + [chunkFetcher setRequestValue:command forHTTPHeaderField:kGTMSessionHeaderXGoogUploadCommand]; + [chunkFetcher setRequestValue:lengthStr forHTTPHeaderField:@"Content-Length"]; + [chunkFetcher setRequestValue:offsetStr forHTTPHeaderField:kGTMSessionHeaderXGoogUploadOffset]; + + // Append the range of bytes in this chunk to the fetcher comment. + NSString *baseComment = self.comment; + [chunkFetcher setCommentWithFormat:@"%@ (%lld-%lld)", + baseComment ? baseComment : @"upload", offset, MAX(0, offset + thisChunkSize - 1)]; + + // The chunk size may have changed, so determine again if we're uploading the full file. + isUploadingFullFile = (offset == 0 && thisChunkSize >= fullUploadLength); + if (isUploadingFullFile && isUploadingFileURL) { + // The data is the full upload file URL. + chunkFetcher.bodyFileURL = self.uploadFileURL; + [self beginChunkFetcher:chunkFetcher + offset:offset]; + } else { + // Make an NSData for the subset for this upload chunk. + self.subdataGenerating = YES; + [self generateChunkSubdataWithOffset:offset + length:thisChunkSize + response:^(NSData *chunkData, NSError *chunkError) { + // The subdata methods may leave us on a background thread. + dispatch_async(dispatch_get_main_queue(), ^{ + self.subdataGenerating = NO; + if (chunkData == nil) { + NSError *responseError = chunkError; + if (!responseError) { + responseError = [self uploadChunkUnavailableErrorWithDescription:@"chunkData is nil"]; + } + [self invokeFinalCallbackWithData:nil + error:responseError + shouldInvalidateLocation:YES]; + return; + } + + BOOL didWriteFile = NO; + if (isUploadingFileURL) { + // Make a temporary file with the data subset. + NSString *tempName = + [NSString stringWithFormat:@"GTMUpload_temp_%@", [[NSUUID UUID] UUIDString]]; + NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:tempName]; + NSError *writeError; + didWriteFile = [chunkData writeToFile:tempPath + options:NSDataWritingAtomic + error:&writeError]; + if (didWriteFile) { + chunkFetcher.bodyFileURL = [NSURL fileURLWithPath:tempPath]; + } else { + GTMSESSION_LOG_DEBUG(@"writeToFile failed: %@\n%@", writeError, tempPath); + } + } + if (!didWriteFile) { + chunkFetcher.bodyData = [chunkData copy]; + } + [self beginChunkFetcher:chunkFetcher + offset:offset]; + }); + }]; + } +} + +- (void)beginChunkFetcher:(GTMSessionFetcher *)chunkFetcher + offset:(int64_t)offset { + + // Track the current offset for progress reporting + self.currentOffset = offset; + + // Hang on to the fetcher in case we need to cancel it. We set these before beginning the + // chunk fetch so the observers notified of chunk fetches can inspect the upload fetcher to + // match to the chunk. + self.chunkFetcher = chunkFetcher; + self.fetcherInFlight = chunkFetcher; + + // Update the last chunk request, including any request headers. + self.lastChunkRequest = chunkFetcher.request; + + [chunkFetcher beginFetchWithDelegate:self + didFinishSelector:@selector(chunkFetcher:finishedWithData:error:)]; +} + +- (void)attachSendProgressBlockToChunkFetcher:(GTMSessionFetcher *)chunkFetcher { + chunkFetcher.sendProgressBlock = ^(int64_t bytesSent, int64_t totalBytesSent, + int64_t totalBytesExpectedToSend) { + // The total bytes expected include the initial body and the full chunked + // data, independent of how big this fetcher's chunk is. + int64_t initialBodySent = [self bodyLength]; // TODO(grobbins) use [self initialBodySent] + int64_t totalSent = initialBodySent + self.currentOffset + totalBytesSent; + int64_t totalExpected = initialBodySent + [self fullUploadLength]; + + [self invokeDelegateWithDidSendBytes:bytesSent + totalBytesSent:totalSent + totalBytesExpectedToSend:totalExpected]; + }; +} + +- (NSDictionary *)uploadSessionIdentifierMetadata { + NSMutableDictionary *metadata = [NSMutableDictionary dictionary]; + metadata[kGTMSessionIdentifierIsUploadChunkFetcherMetadataKey] = @YES; + GTMSESSION_ASSERT_DEBUG(self.uploadFileURL, + @"Invalid upload fetcher to create session identifier for metadata"); + metadata[kGTMSessionIdentifierUploadFileURLMetadataKey] = [self.uploadFileURL absoluteString]; + metadata[kGTMSessionIdentifierUploadFileLengthMetadataKey] = @([self fullUploadLength]); + + if (self.uploadLocationURL) { + metadata[kGTMSessionIdentifierUploadLocationURLMetadataKey] = + [self.uploadLocationURL absoluteString]; + } + if (self.uploadMIMEType) { + metadata[kGTMSessionIdentifierUploadMIMETypeMetadataKey] = self.uploadMIMEType; + } + metadata[kGTMSessionIdentifierUploadChunkSizeMetadataKey] = @(self.chunkSize); + metadata[kGTMSessionIdentifierUploadCurrentOffsetMetadataKey] = @(self.currentOffset); + return metadata; +} + +- (GTMSessionFetcher *)uploadFetcherWithProperties:(NSDictionary *)properties + isQueryFetch:(BOOL)isQueryFetch { + GTMSessionCheckNotSynchronized(self); + + // Common code to make a request for a query command or for a chunk upload. + NSURL *uploadLocationURL = self.uploadLocationURL; + NSMutableURLRequest *chunkRequest = [NSMutableURLRequest requestWithURL:uploadLocationURL]; + [chunkRequest setHTTPMethod:@"PUT"]; + + // copy the user-agent from the original connection + NSURLRequest *origRequest = self.request; + NSString *userAgent = [origRequest valueForHTTPHeaderField:@"User-Agent"]; + if (userAgent.length > 0) { + [chunkRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + } + // To avoid timeouts when debugging, copy the timeout of the initial fetcher. + NSTimeInterval origTimeout = [origRequest timeoutInterval]; + [chunkRequest setTimeoutInterval:origTimeout]; + + // + // Make a new chunk fetcher. + // + GTMSessionFetcher *chunkFetcher = [GTMSessionFetcher fetcherWithRequest:chunkRequest]; + chunkFetcher.callbackQueue = self.callbackQueue; + chunkFetcher.sessionUserInfo = self.sessionUserInfo; + chunkFetcher.configurationBlock = self.configurationBlock; + chunkFetcher.allowedInsecureSchemes = self.allowedInsecureSchemes; + chunkFetcher.allowLocalhostRequest = self.allowLocalhostRequest; + chunkFetcher.allowInvalidServerCertificates = self.allowInvalidServerCertificates; + chunkFetcher.useUploadTask = !isQueryFetch; + + if (self.uploadFileURL && !isQueryFetch && self.useBackgroundSession) { + [chunkFetcher createSessionIdentifierWithMetadata:[self uploadSessionIdentifierMetadata]]; + } + + // Give the chunk fetcher the same properties as the previous chunk fetcher + chunkFetcher.properties = [properties mutableCopy]; + [chunkFetcher setProperty:[NSValue valueWithNonretainedObject:self] + forKey:kGTMSessionUploadFetcherChunkParentKey]; + + // copy other fetcher settings to the new fetcher + chunkFetcher.retryEnabled = self.retryEnabled; + chunkFetcher.maxRetryInterval = self.maxRetryInterval; + + if ([self isRetryEnabled]) { + // We interpose our own retry method both so we can change the request to ask the server to + // tell us where to resume the chunk. + chunkFetcher.retryBlock = ^(BOOL suggestedWillRetry, NSError *chunkError, + GTMSessionFetcherRetryResponse response){ + void (^finish)(BOOL) = ^(BOOL shouldRetry){ + // We'll retry by sending an offset query. + if (shouldRetry) { + self.shouldInitiateOffsetQuery = !isQueryFetch; + + // We don't know what our actual offset is anymore, but the server will tell us. + self.currentOffset = 0; + } + // We don't actually want to retry this specific fetcher. + response(NO); + }; + + GTMSessionFetcherRetryBlock retryBlock = self.retryBlock; + if (retryBlock) { + // Ask the client, then call the finish block above. + retryBlock(suggestedWillRetry, chunkError, finish); + } else { + finish(suggestedWillRetry); + } + }; + } + + return chunkFetcher; +} + +- (void)chunkFetcher:(GTMSessionFetcher *)chunkFetcher + finishedWithData:(NSData *)data + error:(NSError *)error { + BOOL hasDestroyedOldChunkFetcher = NO; + self.fetcherInFlight = nil; + + NSDictionary *responseHeaders = [chunkFetcher responseHeaders]; + GTMSessionUploadFetcherStatus uploadStatus = + [[self class] uploadStatusFromResponseHeaders:responseHeaders]; + GTMSESSION_ASSERT_DEBUG(uploadStatus != kStatusUnknown + || error != nil + || self.wasCreatedFromBackgroundSession, + @"chunk fetcher completion has kStatusUnknown upload status for headers %@ fetcher %@", + responseHeaders, self); + BOOL isUploadStatusStopped = (uploadStatus == kStatusFinal || uploadStatus == kStatusCancelled); + + // Check if the fetcher was actually querying. If it failed, do not retry, + // as it would enter an infinite retry loop. + NSString *uploadCommand = + chunkFetcher.request.allHTTPHeaderFields[kGTMSessionHeaderXGoogUploadCommand]; + BOOL isQueryFetch = [uploadCommand isEqual:@"query"]; + + int64_t previousContentLength = + [[chunkFetcher.request valueForHTTPHeaderField:@"Content-Length"] longLongValue]; + // The Content-Length header may not be present if the chunk fetcher was recreated from + // a background session. + BOOL hasKnownChunkSize = (previousContentLength > 0); + BOOL needsQuery = (!hasKnownChunkSize && !isUploadStatusStopped); + + if (error || (needsQuery && !isQueryFetch)) { + NSInteger status = error.code; + + // Status 4xx indicates a bad offset in the Google upload protocol. However, do not retry status + // 404 per spec, nor if the upload size appears to have been zero (since the server will just + // keep asking us to retry.) + if (self.shouldInitiateOffsetQuery || + (needsQuery && !isQueryFetch) || + ([error.domain isEqual:kGTMSessionFetcherStatusDomain] && + status >= 400 && status <= 499 && + status != 404 && + uploadStatus == kStatusActive && + previousContentLength > 0)) { + self.shouldInitiateOffsetQuery = NO; + [self destroyChunkFetcher]; + hasDestroyedOldChunkFetcher = YES; + [self sendQueryForUploadOffsetWithFetcherProperties:chunkFetcher.properties]; + } else { + // Some unexpected status has occurred; handle it as we would a regular + // object fetcher failure. + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:NO]; + } + } else { + // The chunk has uploaded successfully. + int64_t newOffset = self.currentOffset + previousContentLength; +#if DEBUG + // Verify that if we think all of the uploading data has been sent, the server responded with + // the "final" upload status. + BOOL hasUploadAllData = (newOffset == [self fullUploadLength]); + BOOL isFinalStatus = (uploadStatus == kStatusFinal); + #pragma unused(hasUploadAllData,isFinalStatus) + GTMSESSION_ASSERT_DEBUG(hasUploadAllData == isFinalStatus || !hasKnownChunkSize, + @"uploadStatus:%@ newOffset:%zd (%lld + %zd) fullUploadLength:%lld" + @" chunkFetcher:%@ requestHeaders:%@ responseHeaders:%@", + [responseHeaders objectForKey:kGTMSessionHeaderXGoogUploadStatus], + newOffset, self.currentOffset, previousContentLength, + [self fullUploadLength], + chunkFetcher, chunkFetcher.request.allHTTPHeaderFields, + responseHeaders); +#endif + if (isUploadStatusStopped) { + // This was the last chunk. + if (error == nil && uploadStatus == kStatusCancelled) { + // Report cancelled status as an error. + NSDictionary *userInfo = nil; + if (data.length > 0) { + userInfo = @{ kGTMSessionFetcherStatusDataKey : data }; + } + data = nil; + error = [self prematureFailureErrorWithUserInfo:userInfo]; + } else { + // The upload is in final status. + // + // Take the chunk fetcher's data as the superclass data. + self.downloadedData = data; + self.statusCode = chunkFetcher.statusCode; + } + + // we're done + [self invokeFinalCallbackWithData:data + error:error + shouldInvalidateLocation:YES]; + } else { + // Start the next chunk. + self.currentOffset = newOffset; + + // We want to destroy this chunk fetcher before creating the next one, but + // we want to pass on its properties + NSDictionary *props = [chunkFetcher properties]; + + // We no longer need to be able to cancel this chunkFetcher. Destroy it + // before we create a new chunk fetcher. + [self destroyChunkFetcher]; + hasDestroyedOldChunkFetcher = YES; + + [self uploadNextChunkWithOffset:newOffset + fetcherProperties:props]; + } + } + if (!hasDestroyedOldChunkFetcher) { + [self destroyChunkFetcher]; + } +} + +- (void)destroyChunkFetcher { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_fetcherInFlight == _chunkFetcher) { + _fetcherInFlight = nil; + } + + [_chunkFetcher stopFetching]; + + NSURL *chunkFileURL = _chunkFetcher.bodyFileURL; + BOOL wasTemporaryUploadFile = ![chunkFileURL isEqual:_uploadFileURL]; + if (wasTemporaryUploadFile) { + NSError *error; + [[NSFileManager defaultManager] removeItemAtURL:chunkFileURL + error:&error]; + if (error) { + GTMSESSION_LOG_DEBUG(@"removingItemAtURL failed: %@\n%@", error, chunkFileURL); + } + } + + _recentChunkReponseHeaders = _chunkFetcher.responseHeaders; + + // To avoid retain cycles, remove all properties except the parent identifier. + _chunkFetcher.properties = + @{ kGTMSessionUploadFetcherChunkParentKey : [NSValue valueWithNonretainedObject:self] }; + + _chunkFetcher.retryBlock = nil; + _chunkFetcher.sendProgressBlock = nil; + _chunkFetcher = nil; + } // @synchronized(self) +} + +// This method calculates the proper values to pass to the client's send progress block. +// +// The actual total bytes sent include the initial body sent, plus the +// offset into the batched data prior to the current chunk fetcher + +- (void)invokeDelegateWithDidSendBytes:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent + totalBytesExpectedToSend:(int64_t)totalBytesExpected { + GTMSessionCheckNotSynchronized(self); + + // Ensure the chunk fetcher survives the callback in case the user pauses the upload process. + __block GTMSessionFetcher *holdFetcher = self.chunkFetcher; + + [self invokeOnCallbackQueue:self.delegateCallbackQueue + afterUserStopped:NO + block:^{ + GTMSessionFetcherSendProgressBlock sendProgressBlock = self.sendProgressBlock; + if (sendProgressBlock) { + sendProgressBlock(bytesSent, totalBytesSent, totalBytesExpected); + } + holdFetcher = nil; + }]; +} + +- (void)retrieveUploadChunkGranularityFromResponseHeaders:(NSDictionary *)responseHeaders { + GTMSessionCheckNotSynchronized(self); + + // Standard granularity for Google uploads is 256K. + NSString *chunkGranularityHeader = + [responseHeaders objectForKey:@"X-Goog-Upload-Chunk-Granularity"]; + self.uploadGranularity = chunkGranularityHeader.longLongValue; +} + +#pragma mark - + +- (BOOL)isPaused { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _isPaused; + } // @synchronized(self) +} + +- (void)pauseFetching { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _isPaused = YES; + } // @synchronized(self) + + // Pausing just means stopping the current chunk from uploading; + // when we resume, we will send a query request to the server to + // figure out what bytes to resume sending. + // + // We won't try to cancel the initial data upload, but rather will check + // for being paused in beginChunkFetches. + [self destroyChunkFetcher]; +} + +- (void)resumeFetching { + BOOL wasPaused; + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + wasPaused = _isPaused; + _isPaused = NO; + } // @synchronized(self) + + if (wasPaused) { + [self sendQueryForUploadOffsetWithFetcherProperties:self.properties]; + } +} + +- (void)stopFetching { + // Overrides the superclass + [self destroyChunkFetcher]; + + // If we think the server is waiting for more data, then tell it there won't be more. + if (self.uploadLocationURL) { + [self sendCancelUploadWithFetcherProperties:[self properties]]; + self.uploadLocationURL = nil; + } + + [super stopFetching]; +} + +#pragma mark - + +// Public properties. +@synthesize currentOffset = _currentOffset, + delegateCompletionHandler = _delegateCompletionHandler, + chunkFetcher = _chunkFetcher, + lastChunkRequest = _lastChunkRequest, + subdataGenerating = _subdataGenerating, + shouldInitiateOffsetQuery = _shouldInitiateOffsetQuery, + uploadGranularity = _uploadGranularity; + +// Internal properties. +@dynamic fetcherInFlight; +@dynamic activeFetcher; +@dynamic statusCode; +@dynamic delegateCallbackQueue; + ++ (void)removePointer:(void *)pointer fromPointerArray:(NSPointerArray *)pointerArray { + for (NSUInteger index = 0, count = pointerArray.count; index < count; ++index) { + void *pointerAtIndex = [pointerArray pointerAtIndex:index]; + if (pointerAtIndex == pointer) { + [pointerArray removePointerAtIndex:index]; + return; + } + } +} + +- (BOOL)useBackgroundSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _useBackgroundSessionOnChunkFetchers; + } // @synchronized(self +} + +- (void)setUseBackgroundSession:(BOOL)useBackgroundSession { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_useBackgroundSessionOnChunkFetchers != useBackgroundSession) { + _useBackgroundSessionOnChunkFetchers = useBackgroundSession; + NSPointerArray *uploadFetcherPointerArrayForBackgroundSessions = + [[self class] uploadFetcherPointerArrayForBackgroundSessions]; + if (_useBackgroundSessionOnChunkFetchers) { + [uploadFetcherPointerArrayForBackgroundSessions addPointer:(__bridge void *)self]; + } else { + [[self class] removePointer:(__bridge void *)self + fromPointerArray:uploadFetcherPointerArrayForBackgroundSessions]; + } + } + } // @synchronized(self +} + +- (BOOL)canFetchWithBackgroundSession { + // The initial upload fetcher is always a foreground session; the + // useBackgroundSession property will apply only to chunk fetchers, + // not to queries. + return NO; +} + +- (NSDictionary *)responseHeaders { + GTMSessionCheckNotSynchronized(self); + // Overrides the superclass + + // If asked for the fetcher's response, use the most recent chunk fetcher's response, + // since the original request's response lacks useful information like the actual + // Content-Type. + NSDictionary *dict = self.chunkFetcher.responseHeaders; + if (dict) { + return dict; + } + + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + if (_recentChunkReponseHeaders) { + return _recentChunkReponseHeaders; + } + } // @synchronized(self + + // No chunk fetcher yet completed, so return whatever we have from the initial fetch. + return [super responseHeaders]; +} + +- (NSInteger)statusCodeUnsynchronized { + GTMSessionCheckSynchronized(self); + + if (_recentChunkStatusCode != -1) { + // Overrides the superclass to indicate status appropriate to the initial + // or latest chunk fetch + return _recentChunkStatusCode; + } else { + return [super statusCodeUnsynchronized]; + } +} + + +- (void)setStatusCode:(NSInteger)val { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _recentChunkStatusCode = val; + } +} + +- (int64_t)initialBodyLength { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _initialBodyLength; + } +} + +- (void)setInitialBodyLength:(int64_t)length { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _initialBodyLength = length; + } +} + +- (int64_t)initialBodySent { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _initialBodySent; + } +} + +- (void)setInitialBodySent:(int64_t)length { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _initialBodySent = length; + } +} + +- (NSURL *)uploadLocationURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + return _uploadLocationURL; + } +} + +- (void)setUploadLocationURL:(NSURL *)locationURL { + @synchronized(self) { + GTMSessionMonitorSynchronized(self); + + _uploadLocationURL = locationURL; + } +} + +- (GTMSessionFetcher *)activeFetcher { + GTMSessionFetcher *result = self.fetcherInFlight; + if (result) return result; + + return self; +} + +- (BOOL)isFetching { + // If there is an active chunk fetcher, then the upload fetcher is considered + // to still be fetching. + if (self.fetcherInFlight != nil) return YES; + + return [super isFetching]; +} + +- (BOOL)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { + NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; + + while (self.fetcherInFlight || self.subdataGenerating) { + if ([timeoutDate timeIntervalSinceNow] < 0) return NO; + + if (self.subdataGenerating) { + // Allow time for subdata generation. + NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:0.001]; + [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; + } else { + // Wait for any chunk or query fetchers that still have pending callbacks or + // notifications. + BOOL timedOut; + + if (self.fetcherInFlight == self) { + timedOut = ![super waitForCompletionWithTimeout:timeoutInSeconds]; + } else { + timedOut = ![self.fetcherInFlight waitForCompletionWithTimeout:timeoutInSeconds]; + } + if (timedOut) return NO; + } + } + return YES; +} + +@end + +@implementation GTMSessionFetcher (GTMSessionUploadFetcherMethods) + +- (GTMSessionUploadFetcher *)parentUploadFetcher { + NSValue *property = [self propertyForKey:kGTMSessionUploadFetcherChunkParentKey]; + if (!property) return nil; + + GTMSessionUploadFetcher *uploadFetcher = property.nonretainedObjectValue; + + GTMSESSION_ASSERT_DEBUG([uploadFetcher isKindOfClass:[GTMSessionUploadFetcher class]], + @"Unexpected parent upload fetcher class: %@", [uploadFetcher class]); + return uploadFetcher; +} + +@end diff --git a/Paco-iOS/Pods/Manifest.lock b/Paco-iOS/Pods/Manifest.lock new file mode 100644 index 000000000..d8a5d07a9 --- /dev/null +++ b/Paco-iOS/Pods/Manifest.lock @@ -0,0 +1,24 @@ +PODS: + - AppAuth (0.7.1) + - GTMAppAuth (0.5.0): + - AppAuth (~> 0.7.0) + - GTMSessionFetcher (~> 1.1) + - GTMSessionFetcher (1.1.9): + - GTMSessionFetcher/Full (= 1.1.9) + - GTMSessionFetcher/Core (1.1.9) + - GTMSessionFetcher/Full (1.1.9): + - GTMSessionFetcher/Core (= 1.1.9) + +DEPENDENCIES: + - AppAuth + - GTMAppAuth + - GTMSessionFetcher + +SPEC CHECKSUMS: + AppAuth: c56d352b0d50bb34dbb302d7ba50b20aa6b6ae89 + GTMAppAuth: 4b7bdc1fefdf6a49f3d9fc1aa6123f0c7e9b6660 + GTMSessionFetcher: 5c046c76a1f859bc9c187e918f18e4fc7bb57b5e + +PODFILE CHECKSUM: c665a47779f733e33fedc48ca8e7aafbb602f3d3 + +COCOAPODS: 1.2.1 diff --git a/Paco-iOS/Pods/Pods.xcodeproj/project.pbxproj b/Paco-iOS/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 000000000..6426f39b7 --- /dev/null +++ b/Paco-iOS/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1206 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 04FE4B8DF889CDC972F9DDB10B4309F2 /* OIDServiceDiscovery.h in Headers */ = {isa = PBXBuildFile; fileRef = 375C7DDCFF8094416317A1F78C0C945C /* OIDServiceDiscovery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0897A26B3804CF0309918D2AF586634C /* OIDAuthorizationService.h in Headers */ = {isa = PBXBuildFile; fileRef = 63455CFDF6D04D12FDFFAEE532CC9F6E /* OIDAuthorizationService.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0D1B02523FAD4FEA08532986C2CC4D9E /* OIDTokenUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 68A279939DD415BC8CF3F46B06514C55 /* OIDTokenUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0D4ADE285EF78D3A06163A71A6445013 /* OIDAuthorizationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 89DEED8030ED39FD47A4E20B2C847F86 /* OIDAuthorizationService.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 13A8FA59BBD37888DAF84309AF8E38E9 /* OIDScopeUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B9774BCDA3BBCE6B205C4AA5A96A41F /* OIDScopeUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 13F08C9FFA156E469A237C814BA78B9A /* GTMSessionFetcher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5150A5E46D228CD1521517156771C294 /* GTMSessionFetcher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14263EAA67C8A8CA4A2B48B7100B637E /* Pods-Paco-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D1FCC6F5352506E792EECF9C5628D0E3 /* Pods-Paco-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1547A2BE902B31084257BA060D3574CA /* GTMAppAuth-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D53412410D74B04597223B92323B1440 /* GTMAppAuth-dummy.m */; }; + 19862760A53F3A6CA4E9067DA0139873 /* Pods-Paco-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C2D2AF3C3C1CDF9D3B20A77590688B72 /* Pods-Paco-dummy.m */; }; + 1A29B9533EBED91F61FACEE36967AFED /* GTMAppAuthFetcherAuthorization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CB2CF71592703FABB023BA59DCB2597 /* GTMAppAuthFetcherAuthorization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1AD85EA85FBBF6FAEB77DD550510C129 /* OIDAuthorizationRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = CAD16928502F4F55913677A189704C45 /* OIDAuthorizationRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1BA66882265D3E2F6DEAB16CEED26995 /* OIDAuthState.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E66263F7F6CD4ACC9A470FF6F78017B /* OIDAuthState.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1D2434AB7550BCA92BA72756EB19EA98 /* GTMKeychain_iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = C14505F278CD4F7A6A3FCB739A8ECB3E /* GTMKeychain_iOS.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1DBDE74E7234F7F13CB7B03DBDB6943C /* OIDAuthorizationResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD1CA6F54346736C2C1FCFE917A95BB /* OIDAuthorizationResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1E18489D34047F312C152B31425F582F /* OIDAuthorizationService+IOS.h in Headers */ = {isa = PBXBuildFile; fileRef = DFB005A72D69B6B7EABDABB1E88655F8 /* OIDAuthorizationService+IOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 226F07E34ED202CDD7C7F44C39A6C3F9 /* GTMAppAuthFetcherAuthorization+Keychain.h in Headers */ = {isa = PBXBuildFile; fileRef = D26D99FDCB4D9801024FACF74F21FE7B /* GTMAppAuthFetcherAuthorization+Keychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 255EBA8DEE85FE7DED245F4A102C1E62 /* GTMReadMonitorInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = FA1D03E0948398398A3A16B820B1DA64 /* GTMReadMonitorInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2660617C2C498739B46226290949E95C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7913DC9B69DD1D3964FBA164783509BA /* Foundation.framework */; }; + 2B63606B0F2C3304BA96032CF8146D7C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3230C62D1ACEA3C291D2A940D4BCB1FA /* Security.framework */; }; + 2E43631F412FBF781740B299FD1ADD59 /* OIDServiceDiscovery.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E4E44554DBDB983ACF4650955C9FCC6 /* OIDServiceDiscovery.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3123B6E28D40FD4096EE2C5198B7D5E6 /* OIDFieldMapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 63F9A90BC50DA5A31590E8B310C742F6 /* OIDFieldMapping.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 342F900F20D11C76722E8AF404C4472C /* GTMSessionUploadFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 5304ABCF7CC87CA09372FBAEE1217767 /* GTMSessionUploadFetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3BC4EC25BB6F740A9838D434E61F8D19 /* GTMOAuth2KeychainCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 56D50B6AE74F5BEBED5D65D58EBCE861 /* GTMOAuth2KeychainCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C05DF646F6067AE76ED2B2707392109 /* OIDResponseTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = C9C46140D880D6988E43D8E0D4BBFD73 /* OIDResponseTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3DE044FE8D403D23E7B5F122E7A8D39D /* OIDAuthorizationResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = CE0B9513B9FAB8667288E046C769D14D /* OIDAuthorizationResponse.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3DF76B9F9186685EC9CAA507869229AA /* AppAuth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D7E8CD2295D27D85E86452FEFDF8C29 /* AppAuth.framework */; }; + 3EC50952B6EF2E750AE2D40DD9CED6B4 /* OIDError.h in Headers */ = {isa = PBXBuildFile; fileRef = 033828E9F739061ABB0CD148F8DD1464 /* OIDError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3F4E8D45F39FE16C1C1B186F62C590A9 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3230C62D1ACEA3C291D2A940D4BCB1FA /* Security.framework */; }; + 42024D4D8FF7CE2F399C987DB77A6B69 /* GTMSessionUploadFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 272FEEABF1FEDCC62FC45B7834FB7657 /* GTMSessionUploadFetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 426B9B1010FD474F3413B7B2AD4A0709 /* OIDDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F8B9AB9204B82825009951CE3999341 /* OIDDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 445174A094F252E5237E9A4E4D0672A4 /* OIDTokenRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 64F2583E4879DDF971B154C556ACC18D /* OIDTokenRequest.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 453D96A62E3FBB4BE3E12F23A3EB2A09 /* GTMAppAuth.h in Headers */ = {isa = PBXBuildFile; fileRef = 52600E8E58A7AF664609726A67C8346C /* GTMAppAuth.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 458793DCB8A819F91488A99ABDEE8EB0 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE75BFBB21B41BAE5645EEC8A13A7352 /* SafariServices.framework */; }; + 489DA103EBDA06A4E5F26F1A7D23315E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B4AA34F81886ED5DEA8F972E0E75F10 /* SystemConfiguration.framework */; }; + 4FA537437D014D26081F0A200E42E8D7 /* GTMSessionFetcherService.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A81018DA512037BBDAFE34FCC9ABAC8 /* GTMSessionFetcherService.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 547E49212790E32BF7785C73E946475D /* GTMMIMEDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 49A516AF90D0109B7E9E61A5EDE08A62 /* GTMMIMEDocument.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 550A0254DC3B4C648FB1A9D8121CB728 /* OIDURLQueryComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 202F5DC2942FCBFA2D6D433E9F21C96C /* OIDURLQueryComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6B42CE645116C6EF7729C037835427FC /* GTMSessionFetcherService.h in Headers */ = {isa = PBXBuildFile; fileRef = 6946FC57D765C7E3C752733FFF4BE7E7 /* GTMSessionFetcherService.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6D8B8CFB7E83A8CA0B809FDBEB4A47C2 /* OIDError.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C3416A5D56E3F173392F0F15D4F28 /* OIDError.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 73A31127AD73F6377798FE097D131CA9 /* GTMSessionFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = CB91E17F6A4CB1C04A11A18CBF150299 /* GTMSessionFetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 748248840E5671419F2DC48D0771B385 /* GTMReadMonitorInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = AB21958B56BDE59D9716A5A40371064D /* GTMReadMonitorInputStream.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7896642E95A419F50D4CB35328226EAE /* GTMSessionFetcherLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = D69843FF00BEDAB2732040BD839B5BF5 /* GTMSessionFetcherLogging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 79D65A3B66B05DE9E521580E8D80E219 /* GTMAppAuth-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E0350B74ADC0F8BD1DB3D4BBB6B6CA84 /* GTMAppAuth-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7A75848963423CABE76715841215F587 /* OIDScopes.m in Sources */ = {isa = PBXBuildFile; fileRef = 42EB5A9C39D3D84B6F1B6FCCBA2E9D40 /* OIDScopes.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 831BCE3FB4505EADD68B4710897F2EBD /* GTMGatherInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = E6A55F3CADD407F51B351E9EEF0F2B82 /* GTMGatherInputStream.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 855F3C5D3D9DD7B1DC76C2F23BB15C7F /* OIDAuthorizationUICoordinatorIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 66460CC526EA7E68C0B70107D5CAB52A /* OIDAuthorizationUICoordinatorIOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8A49B374D458711BCFAFC14CBEF468B9 /* OIDGrantTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = E14392158D250569564E07CD4AB2EC0D /* OIDGrantTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8C065922E821A04F5646393CECA0480F /* GTMSessionFetcher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 58BA9E6DD44A9AFCC1AB320BA7F8883D /* GTMSessionFetcher-dummy.m */; }; + 8C1D6E61F8BC5C4DF16764609C831D39 /* AppAuth.h in Headers */ = {isa = PBXBuildFile; fileRef = 97792B2D7AB722B03A55FB03221E7073 /* AppAuth.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8DAE14D02A9CDCA2A37FB8663616D52E /* OIDTokenResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DE246AAED9D6D8CBB31055CFBFD85EC /* OIDTokenResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8DF27A4C9B970CD0A1383C04516DBF3C /* OIDAuthStateErrorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E9535007AD24552B7E98AEDEFF133E6 /* OIDAuthStateErrorDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 95FF8657E90CC8AB09546A3F28191513 /* GTMSessionFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = D194073227644378587F98E07E22D0FE /* GTMSessionFetcherLogging.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 97019F23C62401D00CB9092967FE6BA1 /* OIDServiceConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B705CE4C794EE0BEA96A0477F37CF59 /* OIDServiceConfiguration.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 981D75064EE46576327BC6AB5EED0B50 /* OIDGrantTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = B8CA0A1990BF67E574CEE2DB4D9F2D23 /* OIDGrantTypes.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 988551E340F39E9DDF2F0D0A37697025 /* OIDAuthState+IOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 73ED76485105C934414FC518238A5BBA /* OIDAuthState+IOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B284B633436E76EE5B54F22C585DE09 /* GTMGatherInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 900EFC7D2DA62CD97F4ACD702402511F /* GTMGatherInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D3116436BD43AD6F1377E42D25376C4 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */ = {isa = PBXBuildFile; fileRef = DD444C88012D2F6FAE84D9550BB0EF4B /* GTMAppAuthFetcherAuthorization+Keychain.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A4D092754C00EFE99B711BC5A7BFA1E4 /* OIDAuthorizationRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = C73B72198FEEF813588DEEC1FC1E8C61 /* OIDAuthorizationRequest.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A5D95128D92A21426818F15534A55F87 /* OIDScopes.h in Headers */ = {isa = PBXBuildFile; fileRef = 9687DA15623AB55FA6F6ABC8EA39462C /* OIDScopes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A85F9D92F3A2E727F577B226FD0F1C67 /* OIDAuthState+IOS.m in Sources */ = {isa = PBXBuildFile; fileRef = F604877DB3E7B3F56DC4288126E3FA8D /* OIDAuthState+IOS.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A9895734D64C7E6DC6FD0F3A9FAD585E /* GTMOAuth2KeychainCompatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 587036783B41E4F706BE8F843BE0F01E /* GTMOAuth2KeychainCompatibility.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + AB3698270F8A3150361547937E6FAAB6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7913DC9B69DD1D3964FBA164783509BA /* Foundation.framework */; }; + ADFBD87F7A0E559CDC45046C19E2BFFA /* OIDScopeUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E374F62E549B83FCB006E3218FDC26B /* OIDScopeUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B71DB8CCBF93A0737DA9E5F2FCE256A4 /* OIDAuthorizationUICoordinatorIOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 0814A830E538EA1DFEB08764DBFCBA9F /* OIDAuthorizationUICoordinatorIOS.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BBF4EDA4ED288153AE21D05F16F9EF53 /* GTMAppAuthFetcherAuthorization.h in Headers */ = {isa = PBXBuildFile; fileRef = E07241835B7905672CDA3658CEB28709 /* GTMAppAuthFetcherAuthorization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7D1DA312042623733A0944227C1F48 /* SafariServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE75BFBB21B41BAE5645EEC8A13A7352 /* SafariServices.framework */; }; + C1EDD4B78D81BD3E32E4F75AD3731C80 /* OIDAuthState.h in Headers */ = {isa = PBXBuildFile; fileRef = 26B3C8EC9CC2B4F921871C8F9990D6CF /* OIDAuthState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C66DF94893571FFFC3D18360A57029F0 /* OIDAuthorizationUICoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = FCC3F2C54FE772C769F267129A73176B /* OIDAuthorizationUICoordinator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C747B9FFA800FC0593BBB37CB06BE6C1 /* GTMKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = D2754DFE752318982123E2DB433BDE72 /* GTMKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C74FBC64C6F6693F1F27E1A37B63A5DA /* OIDErrorUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 053CCFF1E6CEBC2A729259D3C49DDA9D /* OIDErrorUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CC01F710ADECFF21C80CD635CCAC0D4B /* OIDServiceConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = DDFDCB828A435969C1BD570646121286 /* OIDServiceConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CCFB094368B5345A86D7D44850313D2C /* OIDErrorUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = F268693D17447A20315FD47D1F4083B3 /* OIDErrorUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D70DD8B1042EA6582C7E84B4578AEFEB /* OIDTokenUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2BA724C5B3B353D0A664A12CFAADD /* OIDTokenUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D85F0BB3FF73D05B3FAA19CBFF350F05 /* OIDAuthStateChangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B266D572236D795F81E72F163C8A6659 /* OIDAuthStateChangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D8C453620219B0AC299BA9FA765E6003 /* OIDFieldMapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 6143AF90655C1B173206C25159611901 /* OIDFieldMapping.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D8EF474E1E5A1F8AF6C0191245B91A1B /* OIDURLQueryComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CCA4AA35A5C7C84F2855AE386D458C9 /* OIDURLQueryComponent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DA3D6056B026A60BC084830BEA82D0AF /* GTMSessionFetcher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0300BA24DF53F632FFE8858D06256AAC /* GTMSessionFetcher.framework */; }; + DC25CE95F2F1A02BC9FAF78590C15E72 /* OIDTokenRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = AA2C4E5885B991C2A7FFC07DE78DE904 /* OIDTokenRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC7DD5E5E320B449E658957BE75F147F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7913DC9B69DD1D3964FBA164783509BA /* Foundation.framework */; }; + E41651F835F25741B73DC31E1FD93C69 /* AppAuth-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 149FA635DFA5F502B7E5EEEDAD232B7D /* AppAuth-dummy.m */; }; + E4BD9365CB59C3786D727EED1508316E /* OIDResponseTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = C40BB6E400A26455BF192D3DE9CD349C /* OIDResponseTypes.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E91F9A4BA5D8957F697D099FFB2F3424 /* OIDTokenResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 94400C1670EFAB4DD7C5A06C34E0BDE9 /* OIDTokenResponse.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + EC422826EE444A7E5343F97366AB2244 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7913DC9B69DD1D3964FBA164783509BA /* Foundation.framework */; }; + EF539B12034051C27D021FE541A31600 /* GTMSessionFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E8F664CC131087A42E85EC286F50FF6 /* GTMSessionFetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F07647738909A3B29A44E33E63FC9F16 /* OIDAuthorizationService+IOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 283251715BAE8BD44435BE7B4CF851BC /* OIDAuthorizationService+IOS.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F84E02BC0092D6F89AE53914666769E1 /* AppAuth-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 11B00A3C40A1E3CAC28CF7173A83A284 /* AppAuth-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FF028FF4F8EB620939BE52B7EBABA355 /* GTMMIMEDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 77488C3AE29F66A2DD169A7A0B8E9132 /* GTMMIMEDocument.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 5C1E171E52B0C3159400DB12221A5D44 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 53F6FDC13F620DEF25DC511D8B05C851; + remoteInfo = AppAuth; + }; + 647DCA78031140F7F7D91B499B7A52EF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C665EB3E404B4D22FC56B866BD32E74F; + remoteInfo = GTMSessionFetcher; + }; + A2D198D08D70F04175CFE2BE9ACD28CB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 998731B0C21D3DB32F5A1AECC0AC2721; + remoteInfo = GTMAppAuth; + }; + AD38F83A38C4B937C5F5C1A73FCFBCF3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 53F6FDC13F620DEF25DC511D8B05C851; + remoteInfo = AppAuth; + }; + D9EFFA527DFFA69CC49EE421456D8D8E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C665EB3E404B4D22FC56B866BD32E74F; + remoteInfo = GTMSessionFetcher; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0120206A8FF53C886C50D90170895BCE /* Pods-Paco-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Paco-resources.sh"; sourceTree = ""; }; + 0300BA24DF53F632FFE8858D06256AAC /* GTMSessionFetcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GTMSessionFetcher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 033828E9F739061ABB0CD148F8DD1464 /* OIDError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDError.h; path = Source/OIDError.h; sourceTree = ""; }; + 053CCFF1E6CEBC2A729259D3C49DDA9D /* OIDErrorUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDErrorUtilities.m; path = Source/OIDErrorUtilities.m; sourceTree = ""; }; + 076A0E88DBC3FAAA62F74D546C98A69A /* GTMSessionFetcher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = GTMSessionFetcher.modulemap; sourceTree = ""; }; + 0814A830E538EA1DFEB08764DBFCBA9F /* OIDAuthorizationUICoordinatorIOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationUICoordinatorIOS.m; path = Source/iOS/OIDAuthorizationUICoordinatorIOS.m; sourceTree = ""; }; + 0B9774BCDA3BBCE6B205C4AA5A96A41F /* OIDScopeUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDScopeUtilities.h; path = Source/OIDScopeUtilities.h; sourceTree = ""; }; + 0E9535007AD24552B7E98AEDEFF133E6 /* OIDAuthStateErrorDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthStateErrorDelegate.h; path = Source/OIDAuthStateErrorDelegate.h; sourceTree = ""; }; + 0FD1CA6F54346736C2C1FCFE917A95BB /* OIDAuthorizationResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationResponse.h; path = Source/OIDAuthorizationResponse.h; sourceTree = ""; }; + 11B00A3C40A1E3CAC28CF7173A83A284 /* AppAuth-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AppAuth-umbrella.h"; sourceTree = ""; }; + 13EF6E71296C7218D7E1BE66CE06A48A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 141AD2DDDB8351799E53BB553944F383 /* AppAuth.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppAuth.xcconfig; sourceTree = ""; }; + 149A77A4DBC464E76D1BEDD412391260 /* Pods-Paco-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Paco-acknowledgements.plist"; sourceTree = ""; }; + 149FA635DFA5F502B7E5EEEDAD232B7D /* AppAuth-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AppAuth-dummy.m"; sourceTree = ""; }; + 19F85B128AFFE15CA245DF15B79B091E /* Pods-Paco.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Paco.release.xcconfig"; sourceTree = ""; }; + 1B705CE4C794EE0BEA96A0477F37CF59 /* OIDServiceConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDServiceConfiguration.m; path = Source/OIDServiceConfiguration.m; sourceTree = ""; }; + 1CA011FF44771AE399909E798657E01D /* GTMAppAuth.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMAppAuth.xcconfig; sourceTree = ""; }; + 202F5DC2942FCBFA2D6D433E9F21C96C /* OIDURLQueryComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDURLQueryComponent.h; path = Source/OIDURLQueryComponent.h; sourceTree = ""; }; + 269664272B64A2BCBD6ECBD99AF74AC4 /* AppAuth.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = AppAuth.modulemap; sourceTree = ""; }; + 26B3C8EC9CC2B4F921871C8F9990D6CF /* OIDAuthState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthState.h; path = Source/OIDAuthState.h; sourceTree = ""; }; + 272FEEABF1FEDCC62FC45B7834FB7657 /* GTMSessionUploadFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionUploadFetcher.h; path = Source/GTMSessionUploadFetcher.h; sourceTree = ""; }; + 283251715BAE8BD44435BE7B4CF851BC /* OIDAuthorizationService+IOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OIDAuthorizationService+IOS.m"; path = "Source/iOS/OIDAuthorizationService+IOS.m"; sourceTree = ""; }; + 2B4AA34F81886ED5DEA8F972E0E75F10 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 2D7E8CD2295D27D85E86452FEFDF8C29 /* AppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2E374F62E549B83FCB006E3218FDC26B /* OIDScopeUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDScopeUtilities.m; path = Source/OIDScopeUtilities.m; sourceTree = ""; }; + 2F8B9AB9204B82825009951CE3999341 /* OIDDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDDefines.h; path = Source/OIDDefines.h; sourceTree = ""; }; + 3230C62D1ACEA3C291D2A940D4BCB1FA /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 375C7DDCFF8094416317A1F78C0C945C /* OIDServiceDiscovery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDServiceDiscovery.h; path = Source/OIDServiceDiscovery.h; sourceTree = ""; }; + 3CB2CF71592703FABB023BA59DCB2597 /* GTMAppAuthFetcherAuthorization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMAppAuthFetcherAuthorization.m; path = Source/GTMAppAuthFetcherAuthorization.m; sourceTree = ""; }; + 3E66263F7F6CD4ACC9A470FF6F78017B /* OIDAuthState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthState.m; path = Source/OIDAuthState.m; sourceTree = ""; }; + 3ED390BB7B6E7AB1E9C3BBA283009B2B /* GTMSessionFetcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GTMSessionFetcher.framework; path = GTMSessionFetcher.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 42EB5A9C39D3D84B6F1B6FCCBA2E9D40 /* OIDScopes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDScopes.m; path = Source/OIDScopes.m; sourceTree = ""; }; + 485019302B864BC20566A5F7BAB51B22 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 49A516AF90D0109B7E9E61A5EDE08A62 /* GTMMIMEDocument.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMMIMEDocument.m; path = Source/GTMMIMEDocument.m; sourceTree = ""; }; + 4AC8EB1132110E0C7EF942132C746860 /* Pods-Paco-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Paco-acknowledgements.markdown"; sourceTree = ""; }; + 50A985A40E6F1913AE9748EF943518AF /* AppAuth-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AppAuth-prefix.pch"; sourceTree = ""; }; + 5150A5E46D228CD1521517156771C294 /* GTMSessionFetcher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMSessionFetcher-umbrella.h"; sourceTree = ""; }; + 52600E8E58A7AF664609726A67C8346C /* GTMAppAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMAppAuth.h; path = Source/GTMAppAuth.h; sourceTree = ""; }; + 5304ABCF7CC87CA09372FBAEE1217767 /* GTMSessionUploadFetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionUploadFetcher.m; path = Source/GTMSessionUploadFetcher.m; sourceTree = ""; }; + 56D50B6AE74F5BEBED5D65D58EBCE861 /* GTMOAuth2KeychainCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMOAuth2KeychainCompatibility.h; path = Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.h; sourceTree = ""; }; + 587036783B41E4F706BE8F843BE0F01E /* GTMOAuth2KeychainCompatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMOAuth2KeychainCompatibility.m; path = Source/GTMOAuth2KeychainCompatibility/GTMOAuth2KeychainCompatibility.m; sourceTree = ""; }; + 58BA9E6DD44A9AFCC1AB320BA7F8883D /* GTMSessionFetcher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GTMSessionFetcher-dummy.m"; sourceTree = ""; }; + 5CB2BA724C5B3B353D0A664A12CFAADD /* OIDTokenUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDTokenUtilities.m; path = Source/OIDTokenUtilities.m; sourceTree = ""; }; + 5DE246AAED9D6D8CBB31055CFBFD85EC /* OIDTokenResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDTokenResponse.h; path = Source/OIDTokenResponse.h; sourceTree = ""; }; + 6143AF90655C1B173206C25159611901 /* OIDFieldMapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDFieldMapping.m; path = Source/OIDFieldMapping.m; sourceTree = ""; }; + 63455CFDF6D04D12FDFFAEE532CC9F6E /* OIDAuthorizationService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationService.h; path = Source/OIDAuthorizationService.h; sourceTree = ""; }; + 63F9A90BC50DA5A31590E8B310C742F6 /* OIDFieldMapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDFieldMapping.h; path = Source/OIDFieldMapping.h; sourceTree = ""; }; + 64F2583E4879DDF971B154C556ACC18D /* OIDTokenRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDTokenRequest.m; path = Source/OIDTokenRequest.m; sourceTree = ""; }; + 66460CC526EA7E68C0B70107D5CAB52A /* OIDAuthorizationUICoordinatorIOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationUICoordinatorIOS.h; path = Source/iOS/OIDAuthorizationUICoordinatorIOS.h; sourceTree = ""; }; + 68A279939DD415BC8CF3F46B06514C55 /* OIDTokenUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDTokenUtilities.h; path = Source/OIDTokenUtilities.h; sourceTree = ""; }; + 6946FC57D765C7E3C752733FFF4BE7E7 /* GTMSessionFetcherService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherService.h; path = Source/GTMSessionFetcherService.h; sourceTree = ""; }; + 6A446BD3F07C1E721D3002146B260DB6 /* Pods-Paco.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Paco.debug.xcconfig"; sourceTree = ""; }; + 6A81018DA512037BBDAFE34FCC9ABAC8 /* GTMSessionFetcherService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcherService.m; path = Source/GTMSessionFetcherService.m; sourceTree = ""; }; + 6CCA4AA35A5C7C84F2855AE386D458C9 /* OIDURLQueryComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDURLQueryComponent.m; path = Source/OIDURLQueryComponent.m; sourceTree = ""; }; + 6E4E44554DBDB983ACF4650955C9FCC6 /* OIDServiceDiscovery.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDServiceDiscovery.m; path = Source/OIDServiceDiscovery.m; sourceTree = ""; }; + 6E8F664CC131087A42E85EC286F50FF6 /* GTMSessionFetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcher.m; path = Source/GTMSessionFetcher.m; sourceTree = ""; }; + 7339935E270AC81C7E3530A07439629F /* AppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AppAuth.framework; path = AppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 73ED76485105C934414FC518238A5BBA /* OIDAuthState+IOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OIDAuthState+IOS.h"; path = "Source/iOS/OIDAuthState+IOS.h"; sourceTree = ""; }; + 77488C3AE29F66A2DD169A7A0B8E9132 /* GTMMIMEDocument.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMMIMEDocument.h; path = Source/GTMMIMEDocument.h; sourceTree = ""; }; + 7913DC9B69DD1D3964FBA164783509BA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 89618343D0C231973F4A5C6F4A28BB97 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 89DEED8030ED39FD47A4E20B2C847F86 /* OIDAuthorizationService.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationService.m; path = Source/OIDAuthorizationService.m; sourceTree = ""; }; + 900EFC7D2DA62CD97F4ACD702402511F /* GTMGatherInputStream.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMGatherInputStream.h; path = Source/GTMGatherInputStream.h; sourceTree = ""; }; + 91F6ECB2DBEDACB96ECFB893C93C529A /* GTMSessionFetcher.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GTMSessionFetcher.xcconfig; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 94400C1670EFAB4DD7C5A06C34E0BDE9 /* OIDTokenResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDTokenResponse.m; path = Source/OIDTokenResponse.m; sourceTree = ""; }; + 9687DA15623AB55FA6F6ABC8EA39462C /* OIDScopes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDScopes.h; path = Source/OIDScopes.h; sourceTree = ""; }; + 97792B2D7AB722B03A55FB03221E7073 /* AppAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AppAuth.h; path = Source/AppAuth.h; sourceTree = ""; }; + 9B29E431B8F86498A840C1820E9D1B14 /* Pods_Paco.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Paco.framework; path = "Pods-Paco.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + A41F1AC66D55F42B54354AC887B28908 /* GTMAppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GTMAppAuth.framework; path = GTMAppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AA2C4E5885B991C2A7FFC07DE78DE904 /* OIDTokenRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDTokenRequest.h; path = Source/OIDTokenRequest.h; sourceTree = ""; }; + AB21958B56BDE59D9716A5A40371064D /* GTMReadMonitorInputStream.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMReadMonitorInputStream.m; path = Source/GTMReadMonitorInputStream.m; sourceTree = ""; }; + B266D572236D795F81E72F163C8A6659 /* OIDAuthStateChangeDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthStateChangeDelegate.h; path = Source/OIDAuthStateChangeDelegate.h; sourceTree = ""; }; + B8CA0A1990BF67E574CEE2DB4D9F2D23 /* OIDGrantTypes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDGrantTypes.m; path = Source/OIDGrantTypes.m; sourceTree = ""; }; + BD37E7A2EB0FBBFDD34A61D0A8119677 /* GTMAppAuth-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMAppAuth-prefix.pch"; sourceTree = ""; }; + BE75BFBB21B41BAE5645EEC8A13A7352 /* SafariServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SafariServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SafariServices.framework; sourceTree = DEVELOPER_DIR; }; + BFA011652B437DCB315BF3C3E12897DE /* GTMSessionFetcher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMSessionFetcher-prefix.pch"; sourceTree = ""; }; + C14505F278CD4F7A6A3FCB739A8ECB3E /* GTMKeychain_iOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMKeychain_iOS.m; path = Source/iOS/GTMKeychain_iOS.m; sourceTree = ""; }; + C2D2AF3C3C1CDF9D3B20A77590688B72 /* Pods-Paco-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Paco-dummy.m"; sourceTree = ""; }; + C40BB6E400A26455BF192D3DE9CD349C /* OIDResponseTypes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDResponseTypes.m; path = Source/OIDResponseTypes.m; sourceTree = ""; }; + C73B72198FEEF813588DEEC1FC1E8C61 /* OIDAuthorizationRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationRequest.m; path = Source/OIDAuthorizationRequest.m; sourceTree = ""; }; + C9C46140D880D6988E43D8E0D4BBFD73 /* OIDResponseTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDResponseTypes.h; path = Source/OIDResponseTypes.h; sourceTree = ""; }; + CAD16928502F4F55913677A189704C45 /* OIDAuthorizationRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationRequest.h; path = Source/OIDAuthorizationRequest.h; sourceTree = ""; }; + CB91E17F6A4CB1C04A11A18CBF150299 /* GTMSessionFetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcher.h; path = Source/GTMSessionFetcher.h; sourceTree = ""; }; + CBF00FDDFFD45BD1DA018FAD51FA1CFC /* Pods-Paco-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Paco-frameworks.sh"; sourceTree = ""; }; + CE0B9513B9FAB8667288E046C769D14D /* OIDAuthorizationResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDAuthorizationResponse.m; path = Source/OIDAuthorizationResponse.m; sourceTree = ""; }; + CE2BF8D24AFF9CC8974205CF8036904A /* GTMAppAuth.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = GTMAppAuth.modulemap; sourceTree = ""; }; + D194073227644378587F98E07E22D0FE /* GTMSessionFetcherLogging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMSessionFetcherLogging.m; path = Source/GTMSessionFetcherLogging.m; sourceTree = ""; }; + D1FCC6F5352506E792EECF9C5628D0E3 /* Pods-Paco-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Paco-umbrella.h"; sourceTree = ""; }; + D26D99FDCB4D9801024FACF74F21FE7B /* GTMAppAuthFetcherAuthorization+Keychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "GTMAppAuthFetcherAuthorization+Keychain.h"; path = "Source/GTMAppAuthFetcherAuthorization+Keychain.h"; sourceTree = ""; }; + D2754DFE752318982123E2DB433BDE72 /* GTMKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMKeychain.h; path = Source/GTMKeychain.h; sourceTree = ""; }; + D53412410D74B04597223B92323B1440 /* GTMAppAuth-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GTMAppAuth-dummy.m"; sourceTree = ""; }; + D69843FF00BEDAB2732040BD839B5BF5 /* GTMSessionFetcherLogging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMSessionFetcherLogging.h; path = Source/GTMSessionFetcherLogging.h; sourceTree = ""; }; + DD444C88012D2F6FAE84D9550BB0EF4B /* GTMAppAuthFetcherAuthorization+Keychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "GTMAppAuthFetcherAuthorization+Keychain.m"; path = "Source/GTMAppAuthFetcherAuthorization+Keychain.m"; sourceTree = ""; }; + DDFDCB828A435969C1BD570646121286 /* OIDServiceConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDServiceConfiguration.h; path = Source/OIDServiceConfiguration.h; sourceTree = ""; }; + DFB005A72D69B6B7EABDABB1E88655F8 /* OIDAuthorizationService+IOS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "OIDAuthorizationService+IOS.h"; path = "Source/iOS/OIDAuthorizationService+IOS.h"; sourceTree = ""; }; + E0350B74ADC0F8BD1DB3D4BBB6B6CA84 /* GTMAppAuth-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GTMAppAuth-umbrella.h"; sourceTree = ""; }; + E07241835B7905672CDA3658CEB28709 /* GTMAppAuthFetcherAuthorization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMAppAuthFetcherAuthorization.h; path = Source/GTMAppAuthFetcherAuthorization.h; sourceTree = ""; }; + E14392158D250569564E07CD4AB2EC0D /* OIDGrantTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDGrantTypes.h; path = Source/OIDGrantTypes.h; sourceTree = ""; }; + E5CA89CB5032AB69A562DA933BF5CFCE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E6A55F3CADD407F51B351E9EEF0F2B82 /* GTMGatherInputStream.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GTMGatherInputStream.m; path = Source/GTMGatherInputStream.m; sourceTree = ""; }; + F03DB0868A6F2928F5B004811B716C22 /* Pods-Paco.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Paco.modulemap"; sourceTree = ""; }; + F268693D17447A20315FD47D1F4083B3 /* OIDErrorUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDErrorUtilities.h; path = Source/OIDErrorUtilities.h; sourceTree = ""; }; + F604877DB3E7B3F56DC4288126E3FA8D /* OIDAuthState+IOS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "OIDAuthState+IOS.m"; path = "Source/iOS/OIDAuthState+IOS.m"; sourceTree = ""; }; + F92C3416A5D56E3F173392F0F15D4F28 /* OIDError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = OIDError.m; path = Source/OIDError.m; sourceTree = ""; }; + FA1D03E0948398398A3A16B820B1DA64 /* GTMReadMonitorInputStream.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GTMReadMonitorInputStream.h; path = Source/GTMReadMonitorInputStream.h; sourceTree = ""; }; + FCC3F2C54FE772C769F267129A73176B /* OIDAuthorizationUICoordinator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = OIDAuthorizationUICoordinator.h; path = Source/OIDAuthorizationUICoordinator.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 036EDA244A5C125BC0AB43768BFA8F35 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2660617C2C498739B46226290949E95C /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 39CFA73041FCEE6EC27B030755DCAAC3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EC422826EE444A7E5343F97366AB2244 /* Foundation.framework in Frameworks */, + 3F4E8D45F39FE16C1C1B186F62C590A9 /* Security.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9DF15C87226E44BF5463E100252D6101 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3DF76B9F9186685EC9CAA507869229AA /* AppAuth.framework in Frameworks */, + DC7DD5E5E320B449E658957BE75F147F /* Foundation.framework in Frameworks */, + DA3D6056B026A60BC084830BEA82D0AF /* GTMSessionFetcher.framework in Frameworks */, + BC7D1DA312042623733A0944227C1F48 /* SafariServices.framework in Frameworks */, + 2B63606B0F2C3304BA96032CF8146D7C /* Security.framework in Frameworks */, + 489DA103EBDA06A4E5F26F1A7D23315E /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A5B184DEAE747D9FC762B59357862417 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AB3698270F8A3150361547937E6FAAB6 /* Foundation.framework in Frameworks */, + 458793DCB8A819F91488A99ABDEE8EB0 /* SafariServices.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0B306B82CAA0C4C9A1E83AEDA2CDBA5D /* Products */ = { + isa = PBXGroup; + children = ( + 7339935E270AC81C7E3530A07439629F /* AppAuth.framework */, + A41F1AC66D55F42B54354AC887B28908 /* GTMAppAuth.framework */, + 3ED390BB7B6E7AB1E9C3BBA283009B2B /* GTMSessionFetcher.framework */, + 9B29E431B8F86498A840C1820E9D1B14 /* Pods_Paco.framework */, + ); + name = Products; + sourceTree = ""; + }; + 23AD62A5F1E89C605FEB506FD5632A05 /* iOS */ = { + isa = PBXGroup; + children = ( + 7913DC9B69DD1D3964FBA164783509BA /* Foundation.framework */, + BE75BFBB21B41BAE5645EEC8A13A7352 /* SafariServices.framework */, + 3230C62D1ACEA3C291D2A940D4BCB1FA /* Security.framework */, + 2B4AA34F81886ED5DEA8F972E0E75F10 /* SystemConfiguration.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 3114B152F89D59258D7C9990E20DC8FE /* GTMAppAuth */ = { + isa = PBXGroup; + children = ( + 52600E8E58A7AF664609726A67C8346C /* GTMAppAuth.h */, + E07241835B7905672CDA3658CEB28709 /* GTMAppAuthFetcherAuthorization.h */, + 3CB2CF71592703FABB023BA59DCB2597 /* GTMAppAuthFetcherAuthorization.m */, + D26D99FDCB4D9801024FACF74F21FE7B /* GTMAppAuthFetcherAuthorization+Keychain.h */, + DD444C88012D2F6FAE84D9550BB0EF4B /* GTMAppAuthFetcherAuthorization+Keychain.m */, + D2754DFE752318982123E2DB433BDE72 /* GTMKeychain.h */, + C14505F278CD4F7A6A3FCB739A8ECB3E /* GTMKeychain_iOS.m */, + 56D50B6AE74F5BEBED5D65D58EBCE861 /* GTMOAuth2KeychainCompatibility.h */, + 587036783B41E4F706BE8F843BE0F01E /* GTMOAuth2KeychainCompatibility.m */, + 4DE19E20380B8173427BCBC3A6258724 /* Support Files */, + ); + name = GTMAppAuth; + path = GTMAppAuth; + sourceTree = ""; + }; + 4DE19E20380B8173427BCBC3A6258724 /* Support Files */ = { + isa = PBXGroup; + children = ( + CE2BF8D24AFF9CC8974205CF8036904A /* GTMAppAuth.modulemap */, + 1CA011FF44771AE399909E798657E01D /* GTMAppAuth.xcconfig */, + D53412410D74B04597223B92323B1440 /* GTMAppAuth-dummy.m */, + BD37E7A2EB0FBBFDD34A61D0A8119677 /* GTMAppAuth-prefix.pch */, + E0350B74ADC0F8BD1DB3D4BBB6B6CA84 /* GTMAppAuth-umbrella.h */, + E5CA89CB5032AB69A562DA933BF5CFCE /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/GTMAppAuth"; + sourceTree = ""; + }; + 57EE6E224C471BA5C5FDB62E0FA51985 /* Support Files */ = { + isa = PBXGroup; + children = ( + 076A0E88DBC3FAAA62F74D546C98A69A /* GTMSessionFetcher.modulemap */, + 91F6ECB2DBEDACB96ECFB893C93C529A /* GTMSessionFetcher.xcconfig */, + 58BA9E6DD44A9AFCC1AB320BA7F8883D /* GTMSessionFetcher-dummy.m */, + BFA011652B437DCB315BF3C3E12897DE /* GTMSessionFetcher-prefix.pch */, + 5150A5E46D228CD1521517156771C294 /* GTMSessionFetcher-umbrella.h */, + 13EF6E71296C7218D7E1BE66CE06A48A /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/GTMSessionFetcher"; + sourceTree = ""; + }; + 5DAE5F786CA22495FF11AB3784CE5E97 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2D7E8CD2295D27D85E86452FEFDF8C29 /* AppAuth.framework */, + 0300BA24DF53F632FFE8858D06256AAC /* GTMSessionFetcher.framework */, + 23AD62A5F1E89C605FEB506FD5632A05 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 611472FEDC48798D334369F9225B29C7 /* Core */ = { + isa = PBXGroup; + children = ( + CB91E17F6A4CB1C04A11A18CBF150299 /* GTMSessionFetcher.h */, + 6E8F664CC131087A42E85EC286F50FF6 /* GTMSessionFetcher.m */, + D69843FF00BEDAB2732040BD839B5BF5 /* GTMSessionFetcherLogging.h */, + D194073227644378587F98E07E22D0FE /* GTMSessionFetcherLogging.m */, + 6946FC57D765C7E3C752733FFF4BE7E7 /* GTMSessionFetcherService.h */, + 6A81018DA512037BBDAFE34FCC9ABAC8 /* GTMSessionFetcherService.m */, + 272FEEABF1FEDCC62FC45B7834FB7657 /* GTMSessionUploadFetcher.h */, + 5304ABCF7CC87CA09372FBAEE1217767 /* GTMSessionUploadFetcher.m */, + ); + name = Core; + sourceTree = ""; + }; + 782A9462A9A937348C6A6968D37BFA9D /* Support Files */ = { + isa = PBXGroup; + children = ( + 269664272B64A2BCBD6ECBD99AF74AC4 /* AppAuth.modulemap */, + 141AD2DDDB8351799E53BB553944F383 /* AppAuth.xcconfig */, + 149FA635DFA5F502B7E5EEEDAD232B7D /* AppAuth-dummy.m */, + 50A985A40E6F1913AE9748EF943518AF /* AppAuth-prefix.pch */, + 11B00A3C40A1E3CAC28CF7173A83A284 /* AppAuth-umbrella.h */, + 485019302B864BC20566A5F7BAB51B22 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/AppAuth"; + sourceTree = ""; + }; + 7A4C73E435EEA5EC22B3F000D820592F /* Pods-Paco */ = { + isa = PBXGroup; + children = ( + 89618343D0C231973F4A5C6F4A28BB97 /* Info.plist */, + F03DB0868A6F2928F5B004811B716C22 /* Pods-Paco.modulemap */, + 4AC8EB1132110E0C7EF942132C746860 /* Pods-Paco-acknowledgements.markdown */, + 149A77A4DBC464E76D1BEDD412391260 /* Pods-Paco-acknowledgements.plist */, + C2D2AF3C3C1CDF9D3B20A77590688B72 /* Pods-Paco-dummy.m */, + CBF00FDDFFD45BD1DA018FAD51FA1CFC /* Pods-Paco-frameworks.sh */, + 0120206A8FF53C886C50D90170895BCE /* Pods-Paco-resources.sh */, + D1FCC6F5352506E792EECF9C5628D0E3 /* Pods-Paco-umbrella.h */, + 6A446BD3F07C1E721D3002146B260DB6 /* Pods-Paco.debug.xcconfig */, + 19F85B128AFFE15CA245DF15B79B091E /* Pods-Paco.release.xcconfig */, + ); + name = "Pods-Paco"; + path = "Target Support Files/Pods-Paco"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 5DAE5F786CA22495FF11AB3784CE5E97 /* Frameworks */, + CA41948F98F4FC269D8F4ADC5323B690 /* Pods */, + 0B306B82CAA0C4C9A1E83AEDA2CDBA5D /* Products */, + BA9ECE4F5EFBA43F9003D3730B5EFCDB /* Targets Support Files */, + ); + sourceTree = ""; + }; + 9450EC1BF1AC142753FEEE807DE5F46E /* GTMSessionFetcher */ = { + isa = PBXGroup; + children = ( + 611472FEDC48798D334369F9225B29C7 /* Core */, + CE609F1D0F0E9D1EB19F7726DF8EE6C1 /* Full */, + 57EE6E224C471BA5C5FDB62E0FA51985 /* Support Files */, + ); + name = GTMSessionFetcher; + path = GTMSessionFetcher; + sourceTree = ""; + }; + A8EF8624149D3249B4399D63FD5361BA /* AppAuth */ = { + isa = PBXGroup; + children = ( + 97792B2D7AB722B03A55FB03221E7073 /* AppAuth.h */, + CAD16928502F4F55913677A189704C45 /* OIDAuthorizationRequest.h */, + C73B72198FEEF813588DEEC1FC1E8C61 /* OIDAuthorizationRequest.m */, + 0FD1CA6F54346736C2C1FCFE917A95BB /* OIDAuthorizationResponse.h */, + CE0B9513B9FAB8667288E046C769D14D /* OIDAuthorizationResponse.m */, + 63455CFDF6D04D12FDFFAEE532CC9F6E /* OIDAuthorizationService.h */, + 89DEED8030ED39FD47A4E20B2C847F86 /* OIDAuthorizationService.m */, + DFB005A72D69B6B7EABDABB1E88655F8 /* OIDAuthorizationService+IOS.h */, + 283251715BAE8BD44435BE7B4CF851BC /* OIDAuthorizationService+IOS.m */, + FCC3F2C54FE772C769F267129A73176B /* OIDAuthorizationUICoordinator.h */, + 66460CC526EA7E68C0B70107D5CAB52A /* OIDAuthorizationUICoordinatorIOS.h */, + 0814A830E538EA1DFEB08764DBFCBA9F /* OIDAuthorizationUICoordinatorIOS.m */, + 26B3C8EC9CC2B4F921871C8F9990D6CF /* OIDAuthState.h */, + 3E66263F7F6CD4ACC9A470FF6F78017B /* OIDAuthState.m */, + 73ED76485105C934414FC518238A5BBA /* OIDAuthState+IOS.h */, + F604877DB3E7B3F56DC4288126E3FA8D /* OIDAuthState+IOS.m */, + B266D572236D795F81E72F163C8A6659 /* OIDAuthStateChangeDelegate.h */, + 0E9535007AD24552B7E98AEDEFF133E6 /* OIDAuthStateErrorDelegate.h */, + 2F8B9AB9204B82825009951CE3999341 /* OIDDefines.h */, + 033828E9F739061ABB0CD148F8DD1464 /* OIDError.h */, + F92C3416A5D56E3F173392F0F15D4F28 /* OIDError.m */, + F268693D17447A20315FD47D1F4083B3 /* OIDErrorUtilities.h */, + 053CCFF1E6CEBC2A729259D3C49DDA9D /* OIDErrorUtilities.m */, + 63F9A90BC50DA5A31590E8B310C742F6 /* OIDFieldMapping.h */, + 6143AF90655C1B173206C25159611901 /* OIDFieldMapping.m */, + E14392158D250569564E07CD4AB2EC0D /* OIDGrantTypes.h */, + B8CA0A1990BF67E574CEE2DB4D9F2D23 /* OIDGrantTypes.m */, + C9C46140D880D6988E43D8E0D4BBFD73 /* OIDResponseTypes.h */, + C40BB6E400A26455BF192D3DE9CD349C /* OIDResponseTypes.m */, + 9687DA15623AB55FA6F6ABC8EA39462C /* OIDScopes.h */, + 42EB5A9C39D3D84B6F1B6FCCBA2E9D40 /* OIDScopes.m */, + 0B9774BCDA3BBCE6B205C4AA5A96A41F /* OIDScopeUtilities.h */, + 2E374F62E549B83FCB006E3218FDC26B /* OIDScopeUtilities.m */, + DDFDCB828A435969C1BD570646121286 /* OIDServiceConfiguration.h */, + 1B705CE4C794EE0BEA96A0477F37CF59 /* OIDServiceConfiguration.m */, + 375C7DDCFF8094416317A1F78C0C945C /* OIDServiceDiscovery.h */, + 6E4E44554DBDB983ACF4650955C9FCC6 /* OIDServiceDiscovery.m */, + AA2C4E5885B991C2A7FFC07DE78DE904 /* OIDTokenRequest.h */, + 64F2583E4879DDF971B154C556ACC18D /* OIDTokenRequest.m */, + 5DE246AAED9D6D8CBB31055CFBFD85EC /* OIDTokenResponse.h */, + 94400C1670EFAB4DD7C5A06C34E0BDE9 /* OIDTokenResponse.m */, + 68A279939DD415BC8CF3F46B06514C55 /* OIDTokenUtilities.h */, + 5CB2BA724C5B3B353D0A664A12CFAADD /* OIDTokenUtilities.m */, + 202F5DC2942FCBFA2D6D433E9F21C96C /* OIDURLQueryComponent.h */, + 6CCA4AA35A5C7C84F2855AE386D458C9 /* OIDURLQueryComponent.m */, + 782A9462A9A937348C6A6968D37BFA9D /* Support Files */, + ); + name = AppAuth; + path = AppAuth; + sourceTree = ""; + }; + BA9ECE4F5EFBA43F9003D3730B5EFCDB /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 7A4C73E435EEA5EC22B3F000D820592F /* Pods-Paco */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + CA41948F98F4FC269D8F4ADC5323B690 /* Pods */ = { + isa = PBXGroup; + children = ( + A8EF8624149D3249B4399D63FD5361BA /* AppAuth */, + 3114B152F89D59258D7C9990E20DC8FE /* GTMAppAuth */, + 9450EC1BF1AC142753FEEE807DE5F46E /* GTMSessionFetcher */, + ); + name = Pods; + sourceTree = ""; + }; + CE609F1D0F0E9D1EB19F7726DF8EE6C1 /* Full */ = { + isa = PBXGroup; + children = ( + 900EFC7D2DA62CD97F4ACD702402511F /* GTMGatherInputStream.h */, + E6A55F3CADD407F51B351E9EEF0F2B82 /* GTMGatherInputStream.m */, + 77488C3AE29F66A2DD169A7A0B8E9132 /* GTMMIMEDocument.h */, + 49A516AF90D0109B7E9E61A5EDE08A62 /* GTMMIMEDocument.m */, + FA1D03E0948398398A3A16B820B1DA64 /* GTMReadMonitorInputStream.h */, + AB21958B56BDE59D9716A5A40371064D /* GTMReadMonitorInputStream.m */, + ); + name = Full; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 01D10CFEB30E37A1241A231C6B1CA782 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 14263EAA67C8A8CA4A2B48B7100B637E /* Pods-Paco-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7F2E9E53855806568E72EE49154B542F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 79D65A3B66B05DE9E521580E8D80E219 /* GTMAppAuth-umbrella.h in Headers */, + 453D96A62E3FBB4BE3E12F23A3EB2A09 /* GTMAppAuth.h in Headers */, + 226F07E34ED202CDD7C7F44C39A6C3F9 /* GTMAppAuthFetcherAuthorization+Keychain.h in Headers */, + BBF4EDA4ED288153AE21D05F16F9EF53 /* GTMAppAuthFetcherAuthorization.h in Headers */, + C747B9FFA800FC0593BBB37CB06BE6C1 /* GTMKeychain.h in Headers */, + 3BC4EC25BB6F740A9838D434E61F8D19 /* GTMOAuth2KeychainCompatibility.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 92D0AD81CB7CE16E04DD3B59C791C8D4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B284B633436E76EE5B54F22C585DE09 /* GTMGatherInputStream.h in Headers */, + FF028FF4F8EB620939BE52B7EBABA355 /* GTMMIMEDocument.h in Headers */, + 255EBA8DEE85FE7DED245F4A102C1E62 /* GTMReadMonitorInputStream.h in Headers */, + 13F08C9FFA156E469A237C814BA78B9A /* GTMSessionFetcher-umbrella.h in Headers */, + 73A31127AD73F6377798FE097D131CA9 /* GTMSessionFetcher.h in Headers */, + 7896642E95A419F50D4CB35328226EAE /* GTMSessionFetcherLogging.h in Headers */, + 6B42CE645116C6EF7729C037835427FC /* GTMSessionFetcherService.h in Headers */, + 42024D4D8FF7CE2F399C987DB77A6B69 /* GTMSessionUploadFetcher.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FCC04571BAB847A89D51C4D94615A2A1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F84E02BC0092D6F89AE53914666769E1 /* AppAuth-umbrella.h in Headers */, + 8C1D6E61F8BC5C4DF16764609C831D39 /* AppAuth.h in Headers */, + 1AD85EA85FBBF6FAEB77DD550510C129 /* OIDAuthorizationRequest.h in Headers */, + 1DBDE74E7234F7F13CB7B03DBDB6943C /* OIDAuthorizationResponse.h in Headers */, + 1E18489D34047F312C152B31425F582F /* OIDAuthorizationService+IOS.h in Headers */, + 0897A26B3804CF0309918D2AF586634C /* OIDAuthorizationService.h in Headers */, + C66DF94893571FFFC3D18360A57029F0 /* OIDAuthorizationUICoordinator.h in Headers */, + 855F3C5D3D9DD7B1DC76C2F23BB15C7F /* OIDAuthorizationUICoordinatorIOS.h in Headers */, + 988551E340F39E9DDF2F0D0A37697025 /* OIDAuthState+IOS.h in Headers */, + C1EDD4B78D81BD3E32E4F75AD3731C80 /* OIDAuthState.h in Headers */, + D85F0BB3FF73D05B3FAA19CBFF350F05 /* OIDAuthStateChangeDelegate.h in Headers */, + 8DF27A4C9B970CD0A1383C04516DBF3C /* OIDAuthStateErrorDelegate.h in Headers */, + 426B9B1010FD474F3413B7B2AD4A0709 /* OIDDefines.h in Headers */, + 3EC50952B6EF2E750AE2D40DD9CED6B4 /* OIDError.h in Headers */, + CCFB094368B5345A86D7D44850313D2C /* OIDErrorUtilities.h in Headers */, + 3123B6E28D40FD4096EE2C5198B7D5E6 /* OIDFieldMapping.h in Headers */, + 8A49B374D458711BCFAFC14CBEF468B9 /* OIDGrantTypes.h in Headers */, + 3C05DF646F6067AE76ED2B2707392109 /* OIDResponseTypes.h in Headers */, + A5D95128D92A21426818F15534A55F87 /* OIDScopes.h in Headers */, + 13A8FA59BBD37888DAF84309AF8E38E9 /* OIDScopeUtilities.h in Headers */, + CC01F710ADECFF21C80CD635CCAC0D4B /* OIDServiceConfiguration.h in Headers */, + 04FE4B8DF889CDC972F9DDB10B4309F2 /* OIDServiceDiscovery.h in Headers */, + DC25CE95F2F1A02BC9FAF78590C15E72 /* OIDTokenRequest.h in Headers */, + 8DAE14D02A9CDCA2A37FB8663616D52E /* OIDTokenResponse.h in Headers */, + 0D1B02523FAD4FEA08532986C2CC4D9E /* OIDTokenUtilities.h in Headers */, + 550A0254DC3B4C648FB1A9D8121CB728 /* OIDURLQueryComponent.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 53F6FDC13F620DEF25DC511D8B05C851 /* AppAuth */ = { + isa = PBXNativeTarget; + buildConfigurationList = 24BAC270C6F051FBBFDE777EEB9D98E5 /* Build configuration list for PBXNativeTarget "AppAuth" */; + buildPhases = ( + 9165463CAB6ADC4A8E2C97B7500001A8 /* Sources */, + A5B184DEAE747D9FC762B59357862417 /* Frameworks */, + FCC04571BAB847A89D51C4D94615A2A1 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AppAuth; + productName = AppAuth; + productReference = 7339935E270AC81C7E3530A07439629F /* AppAuth.framework */; + productType = "com.apple.product-type.framework"; + }; + 998731B0C21D3DB32F5A1AECC0AC2721 /* GTMAppAuth */ = { + isa = PBXNativeTarget; + buildConfigurationList = AEBF9D39845E24C56E1978EB78EBD7A6 /* Build configuration list for PBXNativeTarget "GTMAppAuth" */; + buildPhases = ( + 85891994FCF8BC037C5566AF38EB4B0D /* Sources */, + 9DF15C87226E44BF5463E100252D6101 /* Frameworks */, + 7F2E9E53855806568E72EE49154B542F /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 95372E27C0911E66F5CEECA7B11EEDCA /* PBXTargetDependency */, + 4ED86225CFCA588ECEB722A8534DC2A3 /* PBXTargetDependency */, + ); + name = GTMAppAuth; + productName = GTMAppAuth; + productReference = A41F1AC66D55F42B54354AC887B28908 /* GTMAppAuth.framework */; + productType = "com.apple.product-type.framework"; + }; + C665EB3E404B4D22FC56B866BD32E74F /* GTMSessionFetcher */ = { + isa = PBXNativeTarget; + buildConfigurationList = A5E5841D32E7249B3964A72A1096EBB8 /* Build configuration list for PBXNativeTarget "GTMSessionFetcher" */; + buildPhases = ( + B52D4093904ABA250580FA3D910E453B /* Sources */, + 39CFA73041FCEE6EC27B030755DCAAC3 /* Frameworks */, + 92D0AD81CB7CE16E04DD3B59C791C8D4 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = GTMSessionFetcher; + productName = GTMSessionFetcher; + productReference = 3ED390BB7B6E7AB1E9C3BBA283009B2B /* GTMSessionFetcher.framework */; + productType = "com.apple.product-type.framework"; + }; + F965C96C077F1A948F66ACA60DCCDFA8 /* Pods-Paco */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3332BCD539DE55034487DBAA18D02C6C /* Build configuration list for PBXNativeTarget "Pods-Paco" */; + buildPhases = ( + 549CCE5D7410EF9A78DADBD92EC674BA /* Sources */, + 036EDA244A5C125BC0AB43768BFA8F35 /* Frameworks */, + 01D10CFEB30E37A1241A231C6B1CA782 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + CECE4AAE5A2C2CC19D29E06B6F8A9C1E /* PBXTargetDependency */, + A81097C713CB86802206E3035ACB9CC4 /* PBXTargetDependency */, + 0CD440725A0C2962237EF0BBF8800C04 /* PBXTargetDependency */, + ); + name = "Pods-Paco"; + productName = "Pods-Paco"; + productReference = 9B29E431B8F86498A840C1820E9D1B14 /* Pods_Paco.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 0B306B82CAA0C4C9A1E83AEDA2CDBA5D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 53F6FDC13F620DEF25DC511D8B05C851 /* AppAuth */, + 998731B0C21D3DB32F5A1AECC0AC2721 /* GTMAppAuth */, + C665EB3E404B4D22FC56B866BD32E74F /* GTMSessionFetcher */, + F965C96C077F1A948F66ACA60DCCDFA8 /* Pods-Paco */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 549CCE5D7410EF9A78DADBD92EC674BA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 19862760A53F3A6CA4E9067DA0139873 /* Pods-Paco-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 85891994FCF8BC037C5566AF38EB4B0D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1547A2BE902B31084257BA060D3574CA /* GTMAppAuth-dummy.m in Sources */, + 9D3116436BD43AD6F1377E42D25376C4 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */, + 1A29B9533EBED91F61FACEE36967AFED /* GTMAppAuthFetcherAuthorization.m in Sources */, + 1D2434AB7550BCA92BA72756EB19EA98 /* GTMKeychain_iOS.m in Sources */, + A9895734D64C7E6DC6FD0F3A9FAD585E /* GTMOAuth2KeychainCompatibility.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9165463CAB6ADC4A8E2C97B7500001A8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E41651F835F25741B73DC31E1FD93C69 /* AppAuth-dummy.m in Sources */, + A4D092754C00EFE99B711BC5A7BFA1E4 /* OIDAuthorizationRequest.m in Sources */, + 3DE044FE8D403D23E7B5F122E7A8D39D /* OIDAuthorizationResponse.m in Sources */, + F07647738909A3B29A44E33E63FC9F16 /* OIDAuthorizationService+IOS.m in Sources */, + 0D4ADE285EF78D3A06163A71A6445013 /* OIDAuthorizationService.m in Sources */, + B71DB8CCBF93A0737DA9E5F2FCE256A4 /* OIDAuthorizationUICoordinatorIOS.m in Sources */, + A85F9D92F3A2E727F577B226FD0F1C67 /* OIDAuthState+IOS.m in Sources */, + 1BA66882265D3E2F6DEAB16CEED26995 /* OIDAuthState.m in Sources */, + 6D8B8CFB7E83A8CA0B809FDBEB4A47C2 /* OIDError.m in Sources */, + C74FBC64C6F6693F1F27E1A37B63A5DA /* OIDErrorUtilities.m in Sources */, + D8C453620219B0AC299BA9FA765E6003 /* OIDFieldMapping.m in Sources */, + 981D75064EE46576327BC6AB5EED0B50 /* OIDGrantTypes.m in Sources */, + E4BD9365CB59C3786D727EED1508316E /* OIDResponseTypes.m in Sources */, + 7A75848963423CABE76715841215F587 /* OIDScopes.m in Sources */, + ADFBD87F7A0E559CDC45046C19E2BFFA /* OIDScopeUtilities.m in Sources */, + 97019F23C62401D00CB9092967FE6BA1 /* OIDServiceConfiguration.m in Sources */, + 2E43631F412FBF781740B299FD1ADD59 /* OIDServiceDiscovery.m in Sources */, + 445174A094F252E5237E9A4E4D0672A4 /* OIDTokenRequest.m in Sources */, + E91F9A4BA5D8957F697D099FFB2F3424 /* OIDTokenResponse.m in Sources */, + D70DD8B1042EA6582C7E84B4578AEFEB /* OIDTokenUtilities.m in Sources */, + D8EF474E1E5A1F8AF6C0191245B91A1B /* OIDURLQueryComponent.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B52D4093904ABA250580FA3D910E453B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 831BCE3FB4505EADD68B4710897F2EBD /* GTMGatherInputStream.m in Sources */, + 547E49212790E32BF7785C73E946475D /* GTMMIMEDocument.m in Sources */, + 748248840E5671419F2DC48D0771B385 /* GTMReadMonitorInputStream.m in Sources */, + 8C065922E821A04F5646393CECA0480F /* GTMSessionFetcher-dummy.m in Sources */, + EF539B12034051C27D021FE541A31600 /* GTMSessionFetcher.m in Sources */, + 95FF8657E90CC8AB09546A3F28191513 /* GTMSessionFetcherLogging.m in Sources */, + 4FA537437D014D26081F0A200E42E8D7 /* GTMSessionFetcherService.m in Sources */, + 342F900F20D11C76722E8AF404C4472C /* GTMSessionUploadFetcher.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0CD440725A0C2962237EF0BBF8800C04 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMSessionFetcher; + target = C665EB3E404B4D22FC56B866BD32E74F /* GTMSessionFetcher */; + targetProxy = D9EFFA527DFFA69CC49EE421456D8D8E /* PBXContainerItemProxy */; + }; + 4ED86225CFCA588ECEB722A8534DC2A3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMSessionFetcher; + target = C665EB3E404B4D22FC56B866BD32E74F /* GTMSessionFetcher */; + targetProxy = 647DCA78031140F7F7D91B499B7A52EF /* PBXContainerItemProxy */; + }; + 95372E27C0911E66F5CEECA7B11EEDCA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AppAuth; + target = 53F6FDC13F620DEF25DC511D8B05C851 /* AppAuth */; + targetProxy = AD38F83A38C4B937C5F5C1A73FCFBCF3 /* PBXContainerItemProxy */; + }; + A81097C713CB86802206E3035ACB9CC4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = GTMAppAuth; + target = 998731B0C21D3DB32F5A1AECC0AC2721 /* GTMAppAuth */; + targetProxy = A2D198D08D70F04175CFE2BE9ACD28CB /* PBXContainerItemProxy */; + }; + CECE4AAE5A2C2CC19D29E06B6F8A9C1E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AppAuth; + target = 53F6FDC13F620DEF25DC511D8B05C851 /* AppAuth */; + targetProxy = 5C1E171E52B0C3159400DB12221A5D44 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1F58D15C0AD9C3624DEC156A3E5BF148 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 141AD2DDDB8351799E53BB553944F383 /* AppAuth.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/AppAuth/AppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AppAuth/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/AppAuth/AppAuth.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = AppAuth; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 318C7CD3BDAA8A4F0526B8F79C7F6AD5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1CA011FF44771AE399909E798657E01D /* GTMAppAuth.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMAppAuth/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/GTMAppAuth/GTMAppAuth.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = GTMAppAuth; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 42587B5EC6B73D6CC1CDFDE5671891CF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 19F85B128AFFE15CA245DF15B79B091E /* Pods-Paco.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Paco/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Paco/Pods-Paco.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Paco; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 484202E5D995CC81716F3E6C33CF15E9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 91F6ECB2DBEDACB96ECFB893C93C529A /* GTMSessionFetcher.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMSessionFetcher/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/GTMSessionFetcher/GTMSessionFetcher.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = GTMSessionFetcher; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4E487F173E6C9664F4E9E26B9635D23C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "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 = 9.0; + ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 5095AD76B3CAADF2CA49F6A354D9E52B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6A446BD3F07C1E721D3002146B260DB6 /* Pods-Paco.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Paco/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Paco/Pods-Paco.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Paco; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 649A0ADDBD5C82B18A94CD99F045FCD1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1CA011FF44771AE399909E798657E01D /* GTMAppAuth.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMAppAuth/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/GTMAppAuth/GTMAppAuth.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = GTMAppAuth; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 6E50CE3E886BF27E42404DF0AE6E4F53 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 91F6ECB2DBEDACB96ECFB893C93C529A /* GTMSessionFetcher.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GTMSessionFetcher/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/GTMSessionFetcher/GTMSessionFetcher.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = GTMSessionFetcher; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + BDD0139D6EB93FA375F887ABD62DAB2E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + 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_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + 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 = 9.0; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + F07E6331E4937000D1A40DBF0F447643 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 141AD2DDDB8351799E53BB553944F383 /* AppAuth.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/AppAuth/AppAuth-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AppAuth/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/AppAuth/AppAuth.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = AppAuth; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 24BAC270C6F051FBBFDE777EEB9D98E5 /* Build configuration list for PBXNativeTarget "AppAuth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F07E6331E4937000D1A40DBF0F447643 /* Debug */, + 1F58D15C0AD9C3624DEC156A3E5BF148 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4E487F173E6C9664F4E9E26B9635D23C /* Debug */, + BDD0139D6EB93FA375F887ABD62DAB2E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3332BCD539DE55034487DBAA18D02C6C /* Build configuration list for PBXNativeTarget "Pods-Paco" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5095AD76B3CAADF2CA49F6A354D9E52B /* Debug */, + 42587B5EC6B73D6CC1CDFDE5671891CF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A5E5841D32E7249B3964A72A1096EBB8 /* Build configuration list for PBXNativeTarget "GTMSessionFetcher" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 484202E5D995CC81716F3E6C33CF15E9 /* Debug */, + 6E50CE3E886BF27E42404DF0AE6E4F53 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AEBF9D39845E24C56E1978EB78EBD7A6 /* Build configuration list for PBXNativeTarget "GTMAppAuth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 318C7CD3BDAA8A4F0526B8F79C7F6AD5 /* Debug */, + 649A0ADDBD5C82B18A94CD99F045FCD1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/AppAuth.xcscheme b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/AppAuth.xcscheme new file mode 100644 index 000000000..7c6789929 --- /dev/null +++ b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/AppAuth.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMAppAuth.xcscheme b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMAppAuth.xcscheme new file mode 100644 index 000000000..0c8e9494b --- /dev/null +++ b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMAppAuth.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMSessionFetcher.xcscheme b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMSessionFetcher.xcscheme new file mode 100644 index 000000000..678400a2a --- /dev/null +++ b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/GTMSessionFetcher.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/Pods-Paco.xcscheme b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/Pods-Paco.xcscheme new file mode 100644 index 000000000..fcb14dcb1 --- /dev/null +++ b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/Pods-Paco.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/xcschememanagement.plist b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..94f509ccd --- /dev/null +++ b/Paco-iOS/Pods/Pods.xcodeproj/xcuserdata/bobevans.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,52 @@ + + + + + SchemeUserState + + AppAuth.xcscheme + + isShown + + + GTMAppAuth.xcscheme + + isShown + + + GTMSessionFetcher.xcscheme + + isShown + + + Pods-Paco.xcscheme + + isShown + + + + SuppressBuildableAutocreation + + 53F6FDC13F620DEF25DC511D8B05C851 + + primary + + + 998731B0C21D3DB32F5A1AECC0AC2721 + + primary + + + C665EB3E404B4D22FC56B866BD32E74F + + primary + + + F965C96C077F1A948F66ACA60DCCDFA8 + + primary + + + + + diff --git a/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-dummy.m b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-dummy.m new file mode 100644 index 000000000..0f45668e3 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_AppAuth : NSObject +@end +@implementation PodsDummy_AppAuth +@end diff --git a/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch new file mode 100644 index 000000000..beb2a2441 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h new file mode 100644 index 000000000..02fab43d6 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth-umbrella.h @@ -0,0 +1,41 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "AppAuth.h" +#import "OIDAuthorizationRequest.h" +#import "OIDAuthorizationResponse.h" +#import "OIDAuthorizationService.h" +#import "OIDAuthorizationUICoordinator.h" +#import "OIDAuthState.h" +#import "OIDAuthStateChangeDelegate.h" +#import "OIDAuthStateErrorDelegate.h" +#import "OIDDefines.h" +#import "OIDError.h" +#import "OIDErrorUtilities.h" +#import "OIDFieldMapping.h" +#import "OIDGrantTypes.h" +#import "OIDResponseTypes.h" +#import "OIDScopes.h" +#import "OIDScopeUtilities.h" +#import "OIDServiceConfiguration.h" +#import "OIDServiceDiscovery.h" +#import "OIDTokenRequest.h" +#import "OIDTokenResponse.h" +#import "OIDTokenUtilities.h" +#import "OIDURLQueryComponent.h" +#import "OIDAuthorizationService+IOS.h" +#import "OIDAuthorizationUICoordinatorIOS.h" +#import "OIDAuthState+IOS.h" + +FOUNDATION_EXPORT double AppAuthVersionNumber; +FOUNDATION_EXPORT const unsigned char AppAuthVersionString[]; + diff --git a/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.modulemap b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.modulemap new file mode 100644 index 000000000..9299d0a39 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.modulemap @@ -0,0 +1,6 @@ +framework module AppAuth { + umbrella header "AppAuth-umbrella.h" + + export * + module * { export * } +} diff --git a/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.xcconfig b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.xcconfig new file mode 100644 index 000000000..8952a227a --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/AppAuth/AppAuth.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/AppAuth +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +GCC_TREAT_WARNINGS_AS_ERRORS = YES +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = -framework "SafariServices" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/AppAuth +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Paco-iOS/Pods/Target Support Files/AppAuth/Info.plist b/Paco-iOS/Pods/Target Support Files/AppAuth/Info.plist new file mode 100644 index 000000000..cc1a0c65f --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/AppAuth/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.7.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m new file mode 100644 index 000000000..04b91f318 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_GTMAppAuth : NSObject +@end +@implementation PodsDummy_GTMAppAuth +@end diff --git a/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch new file mode 100644 index 000000000..beb2a2441 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h new file mode 100644 index 000000000..4ab5f86a3 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth-umbrella.h @@ -0,0 +1,21 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "GTMAppAuth.h" +#import "GTMAppAuthFetcherAuthorization+Keychain.h" +#import "GTMAppAuthFetcherAuthorization.h" +#import "GTMKeychain.h" +#import "GTMOAuth2KeychainCompatibility.h" + +FOUNDATION_EXPORT double GTMAppAuthVersionNumber; +FOUNDATION_EXPORT const unsigned char GTMAppAuthVersionString[]; + diff --git a/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap new file mode 100644 index 000000000..b23c8d072 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.modulemap @@ -0,0 +1,6 @@ +framework module GTMAppAuth { + umbrella header "GTMAppAuth-umbrella.h" + + export * + module * { export * } +} diff --git a/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.xcconfig b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.xcconfig new file mode 100644 index 000000000..3c244ab71 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/GTMAppAuth.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GTMAppAuth +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AppAuth" "$PODS_CONFIGURATION_BUILD_DIR/GTMSessionFetcher" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = -framework "SafariServices" -framework "Security" -framework "SystemConfiguration" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GTMAppAuth +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Paco-iOS/Pods/Target Support Files/GTMAppAuth/Info.plist b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/Info.plist new file mode 100644 index 000000000..324eeb2de --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMAppAuth/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.5.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m new file mode 100644 index 000000000..13d68b3fc --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_GTMSessionFetcher : NSObject +@end +@implementation PodsDummy_GTMSessionFetcher +@end diff --git a/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch new file mode 100644 index 000000000..beb2a2441 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h new file mode 100644 index 000000000..b9e0b3de3 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher-umbrella.h @@ -0,0 +1,23 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "GTMSessionFetcher.h" +#import "GTMSessionFetcherLogging.h" +#import "GTMSessionFetcherService.h" +#import "GTMSessionUploadFetcher.h" +#import "GTMGatherInputStream.h" +#import "GTMMIMEDocument.h" +#import "GTMReadMonitorInputStream.h" + +FOUNDATION_EXPORT double GTMSessionFetcherVersionNumber; +FOUNDATION_EXPORT const unsigned char GTMSessionFetcherVersionString[]; + diff --git a/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap new file mode 100644 index 000000000..5121a4dc0 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.modulemap @@ -0,0 +1,6 @@ +framework module GTMSessionFetcher { + umbrella header "GTMSessionFetcher-umbrella.h" + + export * + module * { export * } +} diff --git a/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.xcconfig b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.xcconfig new file mode 100644 index 000000000..087f15f8e --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/GTMSessionFetcher.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GTMSessionFetcher +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = -framework "Security" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/GTMSessionFetcher +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/Info.plist b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/Info.plist new file mode 100644 index 000000000..05bf6cb44 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/GTMSessionFetcher/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.1.9 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Info.plist b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Info.plist new file mode 100644 index 000000000..2243fe6e2 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.markdown b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.markdown new file mode 100644 index 000000000..5aa6beb89 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.markdown @@ -0,0 +1,621 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AppAuth + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + + +## GTMAppAuth + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + + +## GTMSessionFetcher + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.plist b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.plist new file mode 100644 index 000000000..da8a61a64 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-acknowledgements.plist @@ -0,0 +1,665 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + + License + Apache License, Version 2.0 + Title + AppAuth + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + + License + Apache License, Version 2.0 + Title + GTMAppAuth + Type + PSGroupSpecifier + + + FooterText + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file 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. + + License + Apache + Title + GTMSessionFetcher + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-dummy.m b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-dummy.m new file mode 100644 index 000000000..89a4bb31c --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Paco : NSObject +@end +@implementation PodsDummy_Pods_Paco +@end diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-frameworks.sh b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-frameworks.sh new file mode 100755 index 000000000..c59326b09 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-frameworks.sh @@ -0,0 +1,103 @@ +#!/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() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_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}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | 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}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/AppAuth/AppAuth.framework" + install_framework "$BUILT_PRODUCTS_DIR/GTMAppAuth/GTMAppAuth.framework" + install_framework "$BUILT_PRODUCTS_DIR/GTMSessionFetcher/GTMSessionFetcher.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/AppAuth/AppAuth.framework" + install_framework "$BUILT_PRODUCTS_DIR/GTMAppAuth/GTMAppAuth.framework" + install_framework "$BUILT_PRODUCTS_DIR/GTMSessionFetcher/GTMSessionFetcher.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-resources.sh b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-resources.sh new file mode 100755 index 000000000..aed060f04 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-resources.sh @@ -0,0 +1,102 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +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" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + 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 + # 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 != "${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 "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-umbrella.h b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-umbrella.h new file mode 100644 index 000000000..977ebd9c7 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_PacoVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_PacoVersionString[]; + diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.debug.xcconfig b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.debug.xcconfig new file mode 100644 index 000000000..6d5c364ac --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.debug.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AppAuth" "$PODS_CONFIGURATION_BUILD_DIR/GTMAppAuth" "$PODS_CONFIGURATION_BUILD_DIR/GTMSessionFetcher" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AppAuth/AppAuth.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GTMAppAuth/GTMAppAuth.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AppAuth" -framework "GTMAppAuth" -framework "GTMSessionFetcher" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.modulemap b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.modulemap new file mode 100644 index 000000000..bc3fa2571 --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.modulemap @@ -0,0 +1,6 @@ +framework module Pods_Paco { + umbrella header "Pods-Paco-umbrella.h" + + export * + module * { export * } +} diff --git a/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.release.xcconfig b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.release.xcconfig new file mode 100644 index 000000000..6d5c364ac --- /dev/null +++ b/Paco-iOS/Pods/Target Support Files/Pods-Paco/Pods-Paco.release.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AppAuth" "$PODS_CONFIGURATION_BUILD_DIR/GTMAppAuth" "$PODS_CONFIGURATION_BUILD_DIR/GTMSessionFetcher" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/AppAuth/AppAuth.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GTMAppAuth/GTMAppAuth.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GTMSessionFetcher/GTMSessionFetcher.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "AppAuth" -framework "GTMAppAuth" -framework "GTMSessionFetcher" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h b/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h deleted file mode 100644 index 93d4efabf..000000000 --- a/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMGarbageCollection.h +++ /dev/null @@ -1,72 +0,0 @@ -// -// GTMGarbageCollection.h -// -// Copyright 2007-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file 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 "GTMDefines.h" - -// This allows us to easily move our code from GC to non GC. -// They are no-ops unless we are require Leopard or above. -// See -// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/index.html -// and -// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html#//apple_ref/doc/uid/TP40006687-SW1 -// for details. - -#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) && !GTM_IPHONE_SDK -// General use would be to call this through GTMCFAutorelease -// but there may be a reason the you want to make something collectable -// but not autoreleased, especially in pure GC code where you don't -// want to bother with the nop autorelease. Done as a define instead of an -// inline so that tools like Clang's scan-build don't report code as leaking. -#define GTMNSMakeCollectable(cf) ((id)NSMakeCollectable(cf)) - -// GTMNSMakeUncollectable is for global maps, etc. that we don't -// want released ever. You should still retain these in non-gc code. -GTM_INLINE void GTMNSMakeUncollectable(id object) { - [[NSGarbageCollector defaultCollector] disableCollectorForPointer:object]; -} - -// Hopefully no code really needs this, but GTMIsGarbageCollectionEnabled is -// a common way to check at runtime if GC is on. -// There are some places where GC doesn't work w/ things w/in Apple's -// frameworks, so this is here so GTM unittests and detect it, and not run -// individual tests to work around bugs in Apple's frameworks. -GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) { - return ([NSGarbageCollector defaultCollector] != nil); -} - -#else - -#define GTMNSMakeCollectable(cf) ((id)(cf)) - -GTM_INLINE void GTMNSMakeUncollectable(id object) { -} - -GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) { - return NO; -} - -#endif - -// GTMCFAutorelease makes a CF object collectable in GC mode, or adds it -// to the autorelease pool in non-GC mode. Either way it is taken care -// of. Done as a define instead of an inline so that tools like Clang's -// scan-build don't report code as leaking. -#define GTMCFAutorelease(cf) ([GTMNSMakeCollectable(cf) autorelease]) - diff --git a/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h b/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h deleted file mode 100644 index d4c7e09a2..000000000 --- a/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// GTMNSString+URLArguments.h -// -// Copyright 2006-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file 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 - -/// Utilities for encoding and decoding URL arguments. -@interface NSString (GTMNSStringURLArgumentsAdditions) - -/// Returns a string that is escaped properly to be a URL argument. -// -/// This differs from stringByAddingPercentEscapesUsingEncoding: in that it -/// will escape all the reserved characters (per RFC 3986 -/// ) which -/// stringByAddingPercentEscapesUsingEncoding would leave. -/// -/// This will also escape '%', so this should not be used on a string that has -/// already been escaped unless double-escaping is the desired result. -- (NSString*)gtm_stringByEscapingForURLArgument; - -/// Returns the unescaped version of a URL argument -// -/// This has the same behavior as stringByReplacingPercentEscapesUsingEncoding:, -/// except that it will also convert '+' to space. -- (NSString*)gtm_stringByUnescapingFromURLArgument; - -@end diff --git a/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m b/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m deleted file mode 100644 index 46d2c99ed..000000000 --- a/Paco-iOS/vendor/google-toolbox-for-mac/Foundation/GTMNSString+URLArguments.m +++ /dev/null @@ -1,45 +0,0 @@ -// -// GTMNSString+URLArguments.m -// -// Copyright 2006-2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file 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 "GTMNSString+URLArguments.h" -#import "GTMGarbageCollection.h" - -@implementation NSString (GTMNSStringURLArgumentsAdditions) - -- (NSString*)gtm_stringByEscapingForURLArgument { - // Encode all the reserved characters, per RFC 3986 - // () - CFStringRef escaped = - CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, - (CFStringRef)self, - NULL, - (CFStringRef)@"!*'();:@&=+$,/?%#[]", - kCFStringEncodingUTF8); - return GTMCFAutorelease(escaped); -} - -- (NSString*)gtm_stringByUnescapingFromURLArgument { - NSMutableString *resultString = [NSMutableString stringWithString:self]; - [resultString replaceOccurrencesOfString:@"+" - withString:@" " - options:NSLiteralSearch - range:NSMakeRange(0, [resultString length])]; - return [resultString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; -} - -@end diff --git a/Paco-iOS/vendor/google-toolbox-for-mac/GTMDefines.h b/Paco-iOS/vendor/google-toolbox-for-mac/GTMDefines.h deleted file mode 100644 index b970d69c8..000000000 --- a/Paco-iOS/vendor/google-toolbox-for-mac/GTMDefines.h +++ /dev/null @@ -1,444 +0,0 @@ -// -// GTMDefines.h -// -// Copyright 2008 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file 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. -// - -// ============================================================================ - -#include -#include - -#ifdef __OBJC__ -#include -#endif // __OBJC__ - -#if TARGET_OS_IPHONE -#include -#endif // TARGET_OS_IPHONE - -// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs -#ifndef MAC_OS_X_VERSION_10_5 - #define MAC_OS_X_VERSION_10_5 1050 -#endif -#ifndef MAC_OS_X_VERSION_10_6 - #define MAC_OS_X_VERSION_10_6 1060 -#endif -#ifndef MAC_OS_X_VERSION_10_7 - #define MAC_OS_X_VERSION_10_7 1070 -#endif - -// Not all __IPHONE_X macros defined in past SDKs -#ifndef __IPHONE_3_0 - #define __IPHONE_3_0 30000 -#endif -#ifndef __IPHONE_3_1 - #define __IPHONE_3_1 30100 -#endif -#ifndef __IPHONE_3_2 - #define __IPHONE_3_2 30200 -#endif -#ifndef __IPHONE_4_0 - #define __IPHONE_4_0 40000 -#endif -#ifndef __IPHONE_4_3 - #define __IPHONE_4_3 40300 -#endif -#ifndef __IPHONE_5_0 - #define __IPHONE_5_0 50000 -#endif - -// ---------------------------------------------------------------------------- -// CPP symbols that can be overridden in a prefix to control how the toolbox -// is compiled. -// ---------------------------------------------------------------------------- - - -// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and -// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens -// when a validation fails. If you implement your own validators, you may want -// to control their internals using the same macros for consistency. -#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT - #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0 -#endif - -// Give ourselves a consistent way to do inlines. Apple's macros even use -// a few different actual definitions, so we're based off of the foundation -// one. -#if !defined(GTM_INLINE) - #if (defined (__GNUC__) && (__GNUC__ == 4)) || defined (__clang__) - #define GTM_INLINE static __inline__ __attribute__((always_inline)) - #else - #define GTM_INLINE static __inline__ - #endif -#endif - -// Give ourselves a consistent way of doing externs that links up nicely -// when mixing objc and objc++ -#if !defined (GTM_EXTERN) - #if defined __cplusplus - #define GTM_EXTERN extern "C" - #define GTM_EXTERN_C_BEGIN extern "C" { - #define GTM_EXTERN_C_END } - #else - #define GTM_EXTERN extern - #define GTM_EXTERN_C_BEGIN - #define GTM_EXTERN_C_END - #endif -#endif - -// Give ourselves a consistent way of exporting things if we have visibility -// set to hidden. -#if !defined (GTM_EXPORT) - #define GTM_EXPORT __attribute__((visibility("default"))) -#endif - -// Give ourselves a consistent way of declaring something as unused. This -// doesn't use __unused because that is only supported in gcc 4.2 and greater. -#if !defined (GTM_UNUSED) -#define GTM_UNUSED(x) ((void)(x)) -#endif - -// _GTMDevLog & _GTMDevAssert -// -// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for -// developer level errors. This implementation simply macros to NSLog/NSAssert. -// It is not intended to be a general logging/reporting system. -// -// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert -// for a little more background on the usage of these macros. -// -// _GTMDevLog log some error/problem in debug builds -// _GTMDevAssert assert if conditon isn't met w/in a method/function -// in all builds. -// -// To replace this system, just provide different macro definitions in your -// prefix header. Remember, any implementation you provide *must* be thread -// safe since this could be called by anything in what ever situtation it has -// been placed in. -// - -// We only define the simple macros if nothing else has defined this. -#ifndef _GTMDevLog - -#ifdef DEBUG - #define _GTMDevLog(...) NSLog(__VA_ARGS__) -#else - #define _GTMDevLog(...) do { } while (0) -#endif - -#endif // _GTMDevLog - -#ifndef _GTMDevAssert -// we directly invoke the NSAssert handler so we can pass on the varargs -// (NSAssert doesn't have a macro we can use that takes varargs) -#if !defined(NS_BLOCK_ASSERTIONS) - #define _GTMDevAssert(condition, ...) \ - do { \ - if (!(condition)) { \ - [[NSAssertionHandler currentHandler] \ - handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \ - file:[NSString stringWithUTF8String:__FILE__] \ - lineNumber:__LINE__ \ - description:__VA_ARGS__]; \ - } \ - } while(0) -#else // !defined(NS_BLOCK_ASSERTIONS) - #define _GTMDevAssert(condition, ...) do { } while (0) -#endif // !defined(NS_BLOCK_ASSERTIONS) - -#endif // _GTMDevAssert - -// _GTMCompileAssert -// _GTMCompileAssert is an assert that is meant to fire at compile time if you -// want to check things at compile instead of runtime. For example if you -// want to check that a wchar is 4 bytes instead of 2 you would use -// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X) -// Note that the second "arg" is not in quotes, and must be a valid processor -// symbol in it's own right (no spaces, punctuation etc). - -// Wrapping this in an #ifndef allows external groups to define their own -// compile time assert scheme. -#ifndef _GTMCompileAssert - // We got this technique from here: - // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html - - #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg - #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg) - #define _GTMCompileAssert(test, msg) \ - typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] -#endif // _GTMCompileAssert - -// ---------------------------------------------------------------------------- -// CPP symbols defined based on the project settings so the GTM code has -// simple things to test against w/o scattering the knowledge of project -// setting through all the code. -// ---------------------------------------------------------------------------- - -// Provide a single constant CPP symbol that all of GTM uses for ifdefing -// iPhone code. -#if TARGET_OS_IPHONE // iPhone SDK - // For iPhone specific stuff - #define GTM_IPHONE_SDK 1 - #if TARGET_IPHONE_SIMULATOR - #define GTM_IPHONE_SIMULATOR 1 - #else - #define GTM_IPHONE_DEVICE 1 - #endif // TARGET_IPHONE_SIMULATOR - // By default, GTM has provided it's own unittesting support, define this - // to use the support provided by Xcode, especially for the Xcode4 support - // for unittesting. - #ifndef GTM_IPHONE_USE_SENTEST - #define GTM_IPHONE_USE_SENTEST 0 - #endif -#else - // For MacOS specific stuff - #define GTM_MACOS_SDK 1 -#endif - -// Some of our own availability macros -#if GTM_MACOS_SDK -#define GTM_AVAILABLE_ONLY_ON_IPHONE UNAVAILABLE_ATTRIBUTE -#define GTM_AVAILABLE_ONLY_ON_MACOS -#else -#define GTM_AVAILABLE_ONLY_ON_IPHONE -#define GTM_AVAILABLE_ONLY_ON_MACOS UNAVAILABLE_ATTRIBUTE -#endif - -// Provide a symbol to include/exclude extra code for GC support. (This mainly -// just controls the inclusion of finalize methods). -#ifndef GTM_SUPPORT_GC - #if GTM_IPHONE_SDK - // iPhone never needs GC - #define GTM_SUPPORT_GC 0 - #else - // We can't find a symbol to tell if GC is supported/required, so best we - // do on Mac targets is include it if we're on 10.5 or later. - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - #define GTM_SUPPORT_GC 0 - #else - #define GTM_SUPPORT_GC 1 - #endif - #endif -#endif - -// To simplify support for 64bit (and Leopard in general), we provide the type -// defines for non Leopard SDKs -#if !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) - // NSInteger/NSUInteger and Max/Mins - #ifndef NSINTEGER_DEFINED - #if __LP64__ || NS_BUILD_32_LIKE_64 - typedef long NSInteger; - typedef unsigned long NSUInteger; - #else - typedef int NSInteger; - typedef unsigned int NSUInteger; - #endif - #define NSIntegerMax LONG_MAX - #define NSIntegerMin LONG_MIN - #define NSUIntegerMax ULONG_MAX - #define NSINTEGER_DEFINED 1 - #endif // NSINTEGER_DEFINED - // CGFloat - #ifndef CGFLOAT_DEFINED - #if defined(__LP64__) && __LP64__ - // This really is an untested path (64bit on Tiger?) - typedef double CGFloat; - #define CGFLOAT_MIN DBL_MIN - #define CGFLOAT_MAX DBL_MAX - #define CGFLOAT_IS_DOUBLE 1 - #else /* !defined(__LP64__) || !__LP64__ */ - typedef float CGFloat; - #define CGFLOAT_MIN FLT_MIN - #define CGFLOAT_MAX FLT_MAX - #define CGFLOAT_IS_DOUBLE 0 - #endif /* !defined(__LP64__) || !__LP64__ */ - #define CGFLOAT_DEFINED 1 - #endif // CGFLOAT_DEFINED -#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - -// Some support for advanced clang static analysis functionality -// See http://clang-analyzer.llvm.org/annotations.html -#ifndef __has_feature // Optional. - #define __has_feature(x) 0 // Compatibility with non-clang compilers. -#endif - -#ifndef NS_RETURNS_RETAINED - #if __has_feature(attribute_ns_returns_retained) - #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) - #else - #define NS_RETURNS_RETAINED - #endif -#endif - -#ifndef NS_RETURNS_NOT_RETAINED - #if __has_feature(attribute_ns_returns_not_retained) - #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) - #else - #define NS_RETURNS_NOT_RETAINED - #endif -#endif - -#ifndef CF_RETURNS_RETAINED - #if __has_feature(attribute_cf_returns_retained) - #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) - #else - #define CF_RETURNS_RETAINED - #endif -#endif - -#ifndef CF_RETURNS_NOT_RETAINED - #if __has_feature(attribute_cf_returns_not_retained) - #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained)) - #else - #define CF_RETURNS_NOT_RETAINED - #endif -#endif - -#ifndef NS_CONSUMED - #if __has_feature(attribute_ns_consumed) - #define NS_CONSUMED __attribute__((ns_consumed)) - #else - #define NS_CONSUMED - #endif -#endif - -#ifndef CF_CONSUMED - #if __has_feature(attribute_cf_consumed) - #define CF_CONSUMED __attribute__((cf_consumed)) - #else - #define CF_CONSUMED - #endif -#endif - -#ifndef NS_CONSUMES_SELF - #if __has_feature(attribute_ns_consumes_self) - #define NS_CONSUMES_SELF __attribute__((ns_consumes_self)) - #else - #define NS_CONSUMES_SELF - #endif -#endif - -// Defined on 10.6 and above. -#ifndef NS_FORMAT_ARGUMENT - #define NS_FORMAT_ARGUMENT(A) -#endif - -// Defined on 10.6 and above. -#ifndef NS_FORMAT_FUNCTION - #define NS_FORMAT_FUNCTION(F,A) -#endif - -// Defined on 10.6 and above. -#ifndef CF_FORMAT_ARGUMENT - #define CF_FORMAT_ARGUMENT(A) -#endif - -// Defined on 10.6 and above. -#ifndef CF_FORMAT_FUNCTION - #define CF_FORMAT_FUNCTION(F,A) -#endif - -#ifndef GTM_NONNULL - #define GTM_NONNULL(x) __attribute__((nonnull(x))) -#endif - -// Invalidates the initializer from which it's called. -#ifndef GTMInvalidateInitializer - #if __has_feature(objc_arc) - #define GTMInvalidateInitializer() \ - do { \ - [self class]; /* Avoid warning of dead store to |self|. */ \ - _GTMDevAssert(NO, @"Invalid initializer."); \ - return nil; \ - } while (0) - #else - #define GTMInvalidateInitializer() \ - do { \ - [self release]; \ - _GTMDevAssert(NO, @"Invalid initializer."); \ - return nil; \ - } while (0) - #endif -#endif - -#ifdef __OBJC__ - -// Declared here so that it can easily be used for logging tracking if -// necessary. See GTMUnitTestDevLog.h for details. -@class NSString; -GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...) NS_FORMAT_FUNCTION(1, 2); - -// Macro to allow you to create NSStrings out of other macros. -// #define FOO foo -// NSString *fooString = GTM_NSSTRINGIFY(FOO); -#if !defined (GTM_NSSTRINGIFY) - #define GTM_NSSTRINGIFY_INNER(x) @#x - #define GTM_NSSTRINGIFY(x) GTM_NSSTRINGIFY_INNER(x) -#endif - -// Macro to allow fast enumeration when building for 10.5 or later, and -// reliance on NSEnumerator for 10.4. Remember, NSDictionary w/ FastEnumeration -// does keys, so pick the right thing, nothing is done on the FastEnumeration -// side to be sure you're getting what you wanted. -#ifndef GTM_FOREACH_OBJECT - #if TARGET_OS_IPHONE || !(MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) - #define GTM_FOREACH_ENUMEREE(element, enumeration) \ - for (element in enumeration) - #define GTM_FOREACH_OBJECT(element, collection) \ - for (element in collection) - #define GTM_FOREACH_KEY(element, collection) \ - for (element in collection) - #else - #define GTM_FOREACH_ENUMEREE(element, enumeration) \ - for (NSEnumerator *_ ## element ## _enum = enumeration; \ - (element = [_ ## element ## _enum nextObject]) != nil; ) - #define GTM_FOREACH_OBJECT(element, collection) \ - GTM_FOREACH_ENUMEREE(element, [collection objectEnumerator]) - #define GTM_FOREACH_KEY(element, collection) \ - GTM_FOREACH_ENUMEREE(element, [collection keyEnumerator]) - #endif -#endif - -// ============================================================================ - -// To simplify support for both Leopard and Snow Leopard we declare -// the Snow Leopard protocols that we need here. -#if !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) -#define GTM_10_6_PROTOCOLS_DEFINED 1 -@protocol NSConnectionDelegate -@end -@protocol NSAnimationDelegate -@end -@protocol NSImageDelegate -@end -@protocol NSTabViewDelegate -@end -#endif // !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) - -// GTM_SEL_STRING is for specifying selector (usually property) names to KVC -// or KVO methods. -// In debug it will generate warnings for undeclared selectors if -// -Wunknown-selector is turned on. -// In release it will have no runtime overhead. -#ifndef GTM_SEL_STRING - #ifdef DEBUG - #define GTM_SEL_STRING(selName) NSStringFromSelector(@selector(selName)) - #else - #define GTM_SEL_STRING(selName) @#selName - #endif // DEBUG -#endif // GTM_SEL_STRING - -#endif // __OBJC__ diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.h deleted file mode 100644 index 280ff97df..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - - -// The GTMGatherInput stream is an input stream implementation that is to be -// instantiated with an NSArray of NSData objects. It works in the traditional -// scatter/gather vector I/O model. Rather than allocating a big NSData object -// to hold all of the data and performing a copy into that object, the -// GTMGatherInputStream will maintain a reference to the NSArray and read from -// each NSData in turn as the read method is called. You should not alter the -// underlying set of NSData objects until all read operations on this input -// stream have completed. - -#import - -#if defined(GTL_TARGET_NAMESPACE) - // we need NSInteger for the 10.4 SDK, or we're using target namespace macros - #import "GTLDefines.h" -#elif defined(GDATA_TARGET_NAMESPACE) - #import "GDataDefines.h" -#endif - -// Define only for Mac OS X 10.6+ or iPhone OS 4.0+. -#undef GTM_NSSTREAM_DELEGATE -#if (TARGET_OS_MAC && !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)) || \ - (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 40000)) - #define GTM_NSSTREAM_DELEGATE -#else - #define GTM_NSSTREAM_DELEGATE -#endif - -@interface GTMGatherInputStream : NSInputStream GTM_NSSTREAM_DELEGATE { - - NSArray* dataArray_; // NSDatas that should be "gathered" and streamed. - NSUInteger arrayIndex_; // Index in the array of the current NSData. - long long dataOffset_; // Offset in the current NSData we are processing. - - id delegate_; // WEAK, stream delegate, defaults to self - - // Since various undocumented methods get called on a stream, we'll - // use a 1-byte dummy stream object to handle all unexpected messages. - // Actual reads from the stream we will perform using the data array, not - // from the dummy stream. - NSInputStream* dummyStream_; - NSData* dummyData_; -} - -+ (NSInputStream *)streamWithArray:(NSArray *)dataArray; - -- (id)initWithArray:(NSArray *)dataArray; - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.m deleted file mode 100644 index 771398226..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMGatherInputStream.m +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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 "GTMGatherInputStream.h" - -@implementation GTMGatherInputStream - -+ (NSInputStream *)streamWithArray:(NSArray *)dataArray { - return [[[self alloc] initWithArray:dataArray] autorelease]; -} - -- (id)initWithArray:(NSArray *)dataArray { - self = [super init]; - if (self) { - dataArray_ = [dataArray retain]; - arrayIndex_ = 0; - dataOffset_ = 0; - - [self setDelegate:self]; // An NSStream's default delegate should be self. - - // We use a dummy input stream to handle all the various undocumented - // messages the system sends to an input stream. - // - // Contrary to documentation, inputStreamWithData neither copies nor - // retains the data in Mac OS X 10.4, so we must retain it. - // (Radar 5167591) - - dummyData_ = [[NSData alloc] initWithBytes:"x" length:1]; - dummyStream_ = [[NSInputStream alloc] initWithData:dummyData_]; - } - return self; -} - -- (void)dealloc { - [dataArray_ release]; - [dummyStream_ release]; - [dummyData_ release]; - - [super dealloc]; -} - -- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len { - - NSInteger bytesRead = 0; - NSUInteger bytesRemaining = len; - - // read bytes from the currently-indexed array - while ((bytesRemaining > 0) && (arrayIndex_ < [dataArray_ count])) { - - NSData* data = [dataArray_ objectAtIndex:arrayIndex_]; - - NSUInteger dataLen = [data length]; - NSUInteger dataBytesLeft = dataLen - (NSUInteger)dataOffset_; - - NSUInteger bytesToCopy = MIN(bytesRemaining, dataBytesLeft); - NSRange range = NSMakeRange((NSUInteger) dataOffset_, bytesToCopy); - - [data getBytes:(buffer + bytesRead) range:range]; - - bytesRead += bytesToCopy; - dataOffset_ += bytesToCopy; - bytesRemaining -= bytesToCopy; - - if (dataOffset_ == (long long)dataLen) { - dataOffset_ = 0; - arrayIndex_++; - } - } - - if (bytesRead == 0) { - // We are at the end our our stream, so we read all of the data on our - // dummy input stream to make sure it is in the "fully read" state. - uint8_t leftOverBytes[2]; - (void) [dummyStream_ read:leftOverBytes maxLength:sizeof(leftOverBytes)]; - } - - return bytesRead; -} - -- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len { - return NO; // We don't support this style of reading. -} - -- (BOOL)hasBytesAvailable { - // if we return no, the read never finishes, even if we've already - // delivered all the bytes - return YES; -} - -#pragma mark - - -// Pass other expected messages on to the dummy input stream - -- (void)open { - [dummyStream_ open]; -} - -- (void)close { - [dummyStream_ close]; - - // 10.4's NSURLConnection tends to retain streams needlessly, - // so we'll free up the data array right away - [dataArray_ release]; - dataArray_ = nil; -} - -- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { - if (delegate_ != self) { - [delegate_ stream:self handleEvent:streamEvent]; - } -} - -- (id)delegate { - return delegate_; -} - -- (void)setDelegate:(id)delegate { - if (delegate == nil) { - delegate_ = self; - [dummyStream_ setDelegate:nil]; - } else { - delegate_ = delegate; - [dummyStream_ setDelegate:self]; - } -} - -- (id)propertyForKey:(NSString *)key { - return [dummyStream_ propertyForKey:key]; -} - -- (BOOL)setProperty:(id)property forKey:(NSString *)key { - return [dummyStream_ setProperty:property forKey:key]; -} - -- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { - [dummyStream_ scheduleInRunLoop:aRunLoop forMode:mode]; -} - -- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { - [dummyStream_ removeFromRunLoop:aRunLoop forMode:mode]; -} - -- (NSStreamStatus)streamStatus { - return [dummyStream_ streamStatus]; -} -- (NSError *)streamError { - return [dummyStream_ streamError]; -} - -#pragma mark - - -// We'll forward all unexpected messages to our dummy stream - -+ (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { - return [NSInputStream methodSignatureForSelector:selector]; -} - -+ (void)forwardInvocation:(NSInvocation*)invocation { - [invocation invokeWithTarget:[NSInputStream class]]; -} - -- (BOOL)respondsToSelector:(SEL)selector { - return [dummyStream_ respondsToSelector:selector]; -} - -- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { - return [dummyStream_ methodSignatureForSelector:selector]; -} - -- (void)forwardInvocation:(NSInvocation*)invocation { - -#if 0 - // uncomment this section to see the messages the NSInputStream receives - SEL selector; - NSString *selName; - - selector=[invocation selector]; - selName=NSStringFromSelector(selector); - NSLog(@"-forwardInvocation: %@",selName); -#endif - - [invocation invokeWithTarget:dummyStream_]; -} - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.h deleted file mode 100755 index 9c7eed963..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.h +++ /dev/null @@ -1,175 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPFetchHistory.h -// - -// -// Users of the GTMHTTPFetcher class may optionally create and set a fetch -// history object. The fetch history provides "memory" between subsequent -// fetches, including: -// -// - For fetch responses with Etag headers, the fetch history -// remembers the response headers. Future fetcher requests to the same URL -// will be given an "If-None-Match" header, telling the server to return -// a 304 Not Modified status if the response is unchanged, reducing the -// server load and network traffic. -// -// - Optionally, the fetch history can cache the ETagged data that was returned -// in the responses that contained Etag headers. If a later fetch -// results in a 304 status, the fetcher will return the cached ETagged data -// to the client along with a 200 status, hiding the 304. -// -// - The fetch history can track cookies. -// - -#pragma once - -#import - -#import "GTMHTTPFetcher.h" - -// default data cache size for when we're caching responses to handle "not -// modified" errors for the client - -#ifdef __cplusplus -extern "C" { -#endif - -extern const NSUInteger kGTMDefaultETaggedDataCacheMemoryCapacity; - -#ifdef __cplusplus -} -#endif - -// forward declarations -@class GTMURLCache; -@class GTMCookieStorage; - -@interface GTMHTTPFetchHistory : NSObject { - @private - GTMURLCache *etaggedDataCache_; - BOOL shouldRememberETags_; - BOOL shouldCacheETaggedData_; // if NO, then only headers are cached - GTMCookieStorage *cookieStorage_; -} - -// With caching enabled, previously-cached data will be returned instead of -// 304 Not Modified responses when repeating a fetch of an URL that previously -// included an ETag header in its response -@property (assign) BOOL shouldRememberETags; // default: NO -@property (assign) BOOL shouldCacheETaggedData; // default: NO - -// the default ETag data cache capacity is kGTMDefaultETaggedDataCacheMemoryCapacity -@property (assign) NSUInteger memoryCapacity; - -@property (retain) GTMCookieStorage *cookieStorage; - -- (id)initWithMemoryCapacity:(NSUInteger)totalBytes - shouldCacheETaggedData:(BOOL)shouldCacheETaggedData; - -- (void)updateRequest:(NSMutableURLRequest *)request isHTTPGet:(BOOL)isHTTPGet; - -- (void)clearETaggedDataCache; -- (void)clearHistory; - -- (void)removeAllCookies; - -@end - - -// GTMURLCache and GTMCachedURLResponse have interfaces similar to their -// NSURLCache counterparts, in hopes that someday the NSURLCache versions -// can be used. But in 10.5.8, those are not reliable enough except when -// used with +setSharedURLCache. Our goal here is just to cache -// responses for handling If-None-Match requests that return -// "Not Modified" responses, not for replacing the general URL -// caches. - -@interface GTMCachedURLResponse : NSObject { - @private - NSURLResponse *response_; - NSData *data_; - NSDate *useDate_; // date this response was last saved or used - NSDate *reservationDate_; // date this response's ETag was used -} - -@property (readonly) NSURLResponse* response; -@property (readonly) NSData* data; - -// date the response was saved or last accessed -@property (retain) NSDate *useDate; - -// date the response's ETag header was last used for a fetch request -@property (retain) NSDate *reservationDate; - -- (id)initWithResponse:(NSURLResponse *)response data:(NSData *)data; -@end - -@interface GTMURLCache : NSObject { - NSMutableDictionary *responses_; // maps request URL to GTMCachedURLResponse - NSUInteger memoryCapacity_; // capacity of NSDatas in the responses - NSUInteger totalDataSize_; // sum of sizes of NSDatas of all responses - NSTimeInterval reservationInterval_; // reservation expiration interval -} - -@property (assign) NSUInteger memoryCapacity; - -- (id)initWithMemoryCapacity:(NSUInteger)totalBytes; - -- (GTMCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request; -- (void)storeCachedResponse:(GTMCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request; -- (void)removeCachedResponseForRequest:(NSURLRequest *)request; -- (void)removeAllCachedResponses; - -// for unit testing -- (void)setReservationInterval:(NSTimeInterval)secs; -- (NSDictionary *)responses; -- (NSUInteger)totalDataSize; -@end - -@interface GTMCookieStorage : NSObject { - @private - // The cookie storage object manages an array holding cookies, but the array - // is allocated externally (it may be in a fetcher object or the static - // fetcher cookie array.) See the fetcher's setCookieStorageMethod: - // for allocation of this object and assignment of its cookies array. - NSMutableArray *cookies_; -} - -// add all NSHTTPCookies in the supplied array to the storage array, -// replacing cookies in the storage array as appropriate -// Side effect: removes expired cookies from the storage array -- (void)setCookies:(NSArray *)newCookies; - -// retrieve all cookies appropriate for the given URL, considering -// domain, path, cookie name, expiration, security setting. -// Side effect: removes expired cookies from the storage array -- (NSArray *)cookiesForURL:(NSURL *)theURL; - -// return a cookie with the same name, domain, and path as the -// given cookie, or else return nil if none found -// -// Both the cookie being tested and all stored cookies should -// be valid (non-nil name, domains, paths) -- (NSHTTPCookie *)cookieMatchingCookie:(NSHTTPCookie *)cookie; - -// remove any expired cookies, excluding cookies with nil expirations -- (void)removeExpiredCookies; - -- (void)removeAllCookies; - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.m deleted file mode 100755 index cc78ea61b..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetchHistory.m +++ /dev/null @@ -1,612 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPFetchHistory.m -// - -#import "GTMHTTPFetchHistory.h" - -static const NSTimeInterval kCachedURLReservationInterval = 60.0; // 1 minute -static NSString* const kGTMIfNoneMatchHeader = @"If-None-Match"; -static NSString* const kGTMETagHeader = @"Etag"; - -#if GTM_IPHONE -// iPhone: up to 1MB memory -const NSUInteger kGTMDefaultETaggedDataCacheMemoryCapacity = 1 * 1024 * 1024; -#else -// Mac OS X: up to 15MB memory -const NSUInteger kGTMDefaultETaggedDataCacheMemoryCapacity = 15 * 1024 * 1024; -#endif - - -@implementation GTMCookieStorage - -- (id)init { - self = [super init]; - if (self != nil) { - cookies_ = [[NSMutableArray alloc] init]; - } - return self; -} - -- (void)dealloc { - [cookies_ release]; - [super dealloc]; -} - -// Add all cookies in the new cookie array to the storage, -// replacing stored cookies as appropriate. -// -// Side effect: removes expired cookies from the storage array. -- (void)setCookies:(NSArray *)newCookies { - - @synchronized(cookies_) { - [self removeExpiredCookies]; - - for (NSHTTPCookie *newCookie in newCookies) { - if ([[newCookie name] length] > 0 - && [[newCookie domain] length] > 0 - && [[newCookie path] length] > 0) { - - // remove the cookie if it's currently in the array - NSHTTPCookie *oldCookie = [self cookieMatchingCookie:newCookie]; - if (oldCookie) { - [cookies_ removeObjectIdenticalTo:oldCookie]; - } - - // make sure the cookie hasn't already expired - NSDate *expiresDate = [newCookie expiresDate]; - if ((!expiresDate) || [expiresDate timeIntervalSinceNow] > 0) { - [cookies_ addObject:newCookie]; - } - - } else { - NSAssert1(NO, @"Cookie incomplete: %@", newCookie); - } - } - } -} - -- (void)deleteCookie:(NSHTTPCookie *)cookie { - @synchronized(cookies_) { - NSHTTPCookie *foundCookie = [self cookieMatchingCookie:cookie]; - if (foundCookie) { - [cookies_ removeObjectIdenticalTo:foundCookie]; - } - } -} - -// Retrieve all cookies appropriate for the given URL, considering -// domain, path, cookie name, expiration, security setting. -// Side effect: removed expired cookies from the storage array. -- (NSArray *)cookiesForURL:(NSURL *)theURL { - - NSMutableArray *foundCookies = nil; - - @synchronized(cookies_) { - [self removeExpiredCookies]; - - // We'll prepend "." to the desired domain, since we want the - // actual domain "nytimes.com" to still match the cookie domain - // ".nytimes.com" when we check it below with hasSuffix. - NSString *host = [[theURL host] lowercaseString]; - NSString *path = [theURL path]; - NSString *scheme = [theURL scheme]; - - NSString *domain = nil; - BOOL isLocalhostRetrieval = NO; - - if ([host isEqual:@"localhost"]) { - isLocalhostRetrieval = YES; - } else { - if (host) { - domain = [@"." stringByAppendingString:host]; - } - } - - NSUInteger numberOfCookies = [cookies_ count]; - for (NSUInteger idx = 0; idx < numberOfCookies; idx++) { - - NSHTTPCookie *storedCookie = [cookies_ objectAtIndex:idx]; - - NSString *cookieDomain = [[storedCookie domain] lowercaseString]; - NSString *cookiePath = [storedCookie path]; - BOOL cookieIsSecure = [storedCookie isSecure]; - - BOOL isDomainOK; - - if (isLocalhostRetrieval) { - // prior to 10.5.6, the domain stored into NSHTTPCookies for localhost - // is "localhost.local" - isDomainOK = [cookieDomain isEqual:@"localhost"] - || [cookieDomain isEqual:@"localhost.local"]; - } else { - isDomainOK = [domain hasSuffix:cookieDomain]; - } - - BOOL isPathOK = [cookiePath isEqual:@"/"] || [path hasPrefix:cookiePath]; - BOOL isSecureOK = (!cookieIsSecure) || [scheme isEqual:@"https"]; - - if (isDomainOK && isPathOK && isSecureOK) { - if (foundCookies == nil) { - foundCookies = [NSMutableArray arrayWithCapacity:1]; - } - [foundCookies addObject:storedCookie]; - } - } - } - return foundCookies; -} - -// Return a cookie from the array with the same name, domain, and path as the -// given cookie, or else return nil if none found. -// -// Both the cookie being tested and all cookies in the storage array should -// be valid (non-nil name, domains, paths). -// -// Note: this should only be called from inside a @synchronized(cookies_) block -- (NSHTTPCookie *)cookieMatchingCookie:(NSHTTPCookie *)cookie { - - NSUInteger numberOfCookies = [cookies_ count]; - NSString *name = [cookie name]; - NSString *domain = [cookie domain]; - NSString *path = [cookie path]; - - NSAssert3(name && domain && path, @"Invalid cookie (name:%@ domain:%@ path:%@)", - name, domain, path); - - for (NSUInteger idx = 0; idx < numberOfCookies; idx++) { - - NSHTTPCookie *storedCookie = [cookies_ objectAtIndex:idx]; - - if ([[storedCookie name] isEqual:name] - && [[storedCookie domain] isEqual:domain] - && [[storedCookie path] isEqual:path]) { - - return storedCookie; - } - } - return nil; -} - - -// Internal routine to remove any expired cookies from the array, excluding -// cookies with nil expirations. -// -// Note: this should only be called from inside a @synchronized(cookies_) block -- (void)removeExpiredCookies { - - // count backwards since we're deleting items from the array - for (NSInteger idx = (NSInteger)[cookies_ count] - 1; idx >= 0; idx--) { - - NSHTTPCookie *storedCookie = [cookies_ objectAtIndex:(NSUInteger)idx]; - - NSDate *expiresDate = [storedCookie expiresDate]; - if (expiresDate && [expiresDate timeIntervalSinceNow] < 0) { - [cookies_ removeObjectAtIndex:(NSUInteger)idx]; - } - } -} - -- (void)removeAllCookies { - @synchronized(cookies_) { - [cookies_ removeAllObjects]; - } -} -@end - -// -// GTMCachedURLResponse -// - -@implementation GTMCachedURLResponse - -@synthesize response = response_; -@synthesize data = data_; -@synthesize reservationDate = reservationDate_; -@synthesize useDate = useDate_; - -- (id)initWithResponse:(NSURLResponse *)response data:(NSData *)data { - self = [super init]; - if (self != nil) { - response_ = [response retain]; - data_ = [data retain]; - useDate_ = [[NSDate alloc] init]; - } - return self; -} - -- (void)dealloc { - [response_ release]; - [data_ release]; - [useDate_ release]; - [reservationDate_ release]; - [super dealloc]; -} - -- (NSString *)description { - NSString *reservationStr = reservationDate_ ? - [NSString stringWithFormat:@" resDate:%@", reservationDate_] : @""; - - return [NSString stringWithFormat:@"%@ %p: {bytes:%@ useDate:%@%@}", - [self class], self, - data_ ? [NSNumber numberWithInt:(int)[data_ length]] : nil, - useDate_, - reservationStr]; -} - -- (NSComparisonResult)compareUseDate:(GTMCachedURLResponse *)other { - return [useDate_ compare:[other useDate]]; -} - -@end - -// -// GTMURLCache -// - -@implementation GTMURLCache - -@dynamic memoryCapacity; - -- (id)init { - return [self initWithMemoryCapacity:kGTMDefaultETaggedDataCacheMemoryCapacity]; -} - -- (id)initWithMemoryCapacity:(NSUInteger)totalBytes { - self = [super init]; - if (self != nil) { - memoryCapacity_ = totalBytes; - - responses_ = [[NSMutableDictionary alloc] initWithCapacity:5]; - - reservationInterval_ = kCachedURLReservationInterval; - } - return self; -} - -- (void)dealloc { - [responses_ release]; - [super dealloc]; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"%@ %p: {responses:%@}", - [self class], self, [responses_ allValues]]; -} - -// Setters/getters - -- (void)pruneCacheResponses { - // Internal routine to remove the least-recently-used responses when the - // cache has grown too large - if (memoryCapacity_ >= totalDataSize_) return; - - // Sort keys by date - SEL sel = @selector(compareUseDate:); - NSArray *sortedKeys = [responses_ keysSortedByValueUsingSelector:sel]; - - // The least-recently-used keys are at the beginning of the sorted array; - // remove those (except ones still reserved) until the total data size is - // reduced sufficiently - for (NSURL *key in sortedKeys) { - GTMCachedURLResponse *response = [responses_ objectForKey:key]; - - NSDate *resDate = [response reservationDate]; - BOOL isResponseReserved = (resDate != nil) - && ([resDate timeIntervalSinceNow] > -reservationInterval_); - - if (!isResponseReserved) { - // We can remove this response from the cache - NSUInteger storedSize = [[response data] length]; - totalDataSize_ -= storedSize; - [responses_ removeObjectForKey:key]; - } - - // If we've removed enough response data, then we're done - if (memoryCapacity_ >= totalDataSize_) break; - } -} - -- (void)storeCachedResponse:(GTMCachedURLResponse *)cachedResponse - forRequest:(NSURLRequest *)request { - @synchronized(self) { - // Remove any previous entry for this request - [self removeCachedResponseForRequest:request]; - - // cache this one only if it's not bigger than our cache - NSUInteger storedSize = [[cachedResponse data] length]; - if (storedSize < memoryCapacity_) { - - NSURL *key = [request URL]; - [responses_ setObject:cachedResponse forKey:key]; - totalDataSize_ += storedSize; - - [self pruneCacheResponses]; - } - } -} - -- (GTMCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request { - GTMCachedURLResponse *response; - - @synchronized(self) { - NSURL *key = [request URL]; - response = [[[responses_ objectForKey:key] retain] autorelease]; - - // Touch the date to indicate this was recently retrieved - [response setUseDate:[NSDate date]]; - } - return response; -} - -- (void)removeCachedResponseForRequest:(NSURLRequest *)request { - @synchronized(self) { - NSURL *key = [request URL]; - totalDataSize_ -= [[[responses_ objectForKey:key] data] length]; - [responses_ removeObjectForKey:key]; - } -} - -- (void)removeAllCachedResponses { - @synchronized(self) { - [responses_ removeAllObjects]; - totalDataSize_ = 0; - } -} - -- (NSUInteger)memoryCapacity { - return memoryCapacity_; -} - -- (void)setMemoryCapacity:(NSUInteger)totalBytes { - @synchronized(self) { - BOOL didShrink = (totalBytes < memoryCapacity_); - memoryCapacity_ = totalBytes; - - if (didShrink) { - [self pruneCacheResponses]; - } - } -} - -// Methods for unit testing. -- (void)setReservationInterval:(NSTimeInterval)secs { - reservationInterval_ = secs; -} - -- (NSDictionary *)responses { - return responses_; -} - -- (NSUInteger)totalDataSize { - return totalDataSize_; -} - -@end - -// -// GTMHTTPFetchHistory -// - -@interface GTMHTTPFetchHistory () -- (NSString *)cachedETagForRequest:(NSURLRequest *)request; -- (void)removeCachedDataForRequest:(NSURLRequest *)request; -@end - -@implementation GTMHTTPFetchHistory - -@synthesize cookieStorage = cookieStorage_; - -@dynamic shouldRememberETags; -@dynamic shouldCacheETaggedData; -@dynamic memoryCapacity; - -- (id)init { - return [self initWithMemoryCapacity:kGTMDefaultETaggedDataCacheMemoryCapacity - shouldCacheETaggedData:NO]; -} - -- (id)initWithMemoryCapacity:(NSUInteger)totalBytes - shouldCacheETaggedData:(BOOL)shouldCacheETaggedData { - self = [super init]; - if (self != nil) { - etaggedDataCache_ = [[GTMURLCache alloc] initWithMemoryCapacity:totalBytes]; - shouldRememberETags_ = shouldCacheETaggedData; - shouldCacheETaggedData_ = shouldCacheETaggedData; - cookieStorage_ = [[GTMCookieStorage alloc] init]; - } - return self; -} - -- (void)dealloc { - [etaggedDataCache_ release]; - [cookieStorage_ release]; - [super dealloc]; -} - -- (void)updateRequest:(NSMutableURLRequest *)request isHTTPGet:(BOOL)isHTTPGet { - @synchronized(self) { - if ([self shouldRememberETags]) { - // If this URL is in the history, and no ETag has been set, then - // set the ETag header field - - // If we have a history, we're tracking across fetches, so we don't - // want to pull results from any other cache - [request setCachePolicy:NSURLRequestReloadIgnoringCacheData]; - - if (isHTTPGet) { - // We'll only add an ETag if there's no ETag specified in the user's - // request - NSString *specifiedETag = [request valueForHTTPHeaderField:kGTMIfNoneMatchHeader]; - if (specifiedETag == nil) { - // No ETag: extract the previous ETag for this request from the - // fetch history, and add it to the request - NSString *cachedETag = [self cachedETagForRequest:request]; - - if (cachedETag != nil) { - [request addValue:cachedETag forHTTPHeaderField:kGTMIfNoneMatchHeader]; - } - } else { - // Has an ETag: remove any stored response in the fetch history - // for this request, as the If-None-Match header could lead to - // a 304 Not Modified, and we want that error delivered to the - // user since they explicitly specified the ETag - [self removeCachedDataForRequest:request]; - } - } - } - } -} - -- (void)updateFetchHistoryWithRequest:(NSURLRequest *)request - response:(NSURLResponse *)response - downloadedData:(NSData *)downloadedData { - @synchronized(self) { - if (![self shouldRememberETags]) return; - - if (![response respondsToSelector:@selector(allHeaderFields)]) return; - - NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; - - if (statusCode != kGTMHTTPFetcherStatusNotModified) { - // Save this ETag string for successful results (<300) - // If there's no last modified string, clear the dictionary - // entry for this URL. Also cache or delete the data, if appropriate - // (when etaggedDataCache is non-nil.) - NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; - NSString* etag = [headers objectForKey:kGTMETagHeader]; - - if (etag != nil && statusCode < 300) { - - // we want to cache responses for the headers, even if the client - // doesn't want the response body data caches - NSData *dataToStore = shouldCacheETaggedData_ ? downloadedData : nil; - - GTMCachedURLResponse *cachedResponse; - cachedResponse = [[[GTMCachedURLResponse alloc] initWithResponse:response - data:dataToStore] autorelease]; - [etaggedDataCache_ storeCachedResponse:cachedResponse - forRequest:request]; - } else { - [etaggedDataCache_ removeCachedResponseForRequest:request]; - } - } - } -} - -- (NSString *)cachedETagForRequest:(NSURLRequest *)request { - // Internal routine. - GTMCachedURLResponse *cachedResponse; - cachedResponse = [etaggedDataCache_ cachedResponseForRequest:request]; - - NSURLResponse *response = [cachedResponse response]; - NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; - NSString *cachedETag = [headers objectForKey:kGTMETagHeader]; - if (cachedETag) { - // Since the request having an ETag implies this request is about - // to be fetched again, reserve the cached response to ensure that - // that it will be around at least until the fetch completes. - // - // When the fetch completes, either the cached response will be replaced - // with a new response, or the cachedDataForRequest: method below will - // clear the reservation. - [cachedResponse setReservationDate:[NSDate date]]; - } - return cachedETag; -} - -- (NSData *)cachedDataForRequest:(NSURLRequest *)request { - @synchronized(self) { - GTMCachedURLResponse *cachedResponse; - cachedResponse = [etaggedDataCache_ cachedResponseForRequest:request]; - - NSData *cachedData = [cachedResponse data]; - - // Since the data for this cached request is being obtained from the cache, - // we can clear the reservation as the fetch has completed. - [cachedResponse setReservationDate:nil]; - - return cachedData; - } -} - -- (void)removeCachedDataForRequest:(NSURLRequest *)request { - @synchronized(self) { - [etaggedDataCache_ removeCachedResponseForRequest:request]; - } -} - -- (void)clearETaggedDataCache { - @synchronized(self) { - [etaggedDataCache_ removeAllCachedResponses]; - } -} - -- (void)clearHistory { - @synchronized(self) { - [self clearETaggedDataCache]; - [cookieStorage_ removeAllCookies]; - } -} - -- (void)removeAllCookies { - @synchronized(self) { - [cookieStorage_ removeAllCookies]; - } -} - -- (BOOL)shouldRememberETags { - return shouldRememberETags_; -} - -- (void)setShouldRememberETags:(BOOL)flag { - BOOL wasRemembering = shouldRememberETags_; - shouldRememberETags_ = flag; - - if (wasRemembering && !flag) { - // Free up the cache memory - [self clearETaggedDataCache]; - } -} - -- (BOOL)shouldCacheETaggedData { - return shouldCacheETaggedData_; -} - -- (void)setShouldCacheETaggedData:(BOOL)flag { - BOOL wasCaching = shouldCacheETaggedData_; - shouldCacheETaggedData_ = flag; - - if (flag) { - self.shouldRememberETags = YES; - } - - if (wasCaching && !flag) { - // users expect turning off caching to free up the cache memory - [self clearETaggedDataCache]; - } -} - -- (NSUInteger)memoryCapacity { - return [etaggedDataCache_ memoryCapacity]; -} - -- (void)setMemoryCapacity:(NSUInteger)totalBytes { - [etaggedDataCache_ setMemoryCapacity:totalBytes]; -} - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.h deleted file mode 100755 index 8cf612126..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.h +++ /dev/null @@ -1,847 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPFetcher.h -// - -// This is essentially a wrapper around NSURLConnection for POSTs and GETs. -// If setPostData: is called, then POST is assumed. -// -// When would you use this instead of NSURLConnection? -// -// - When you just want the result from a GET, POST, or PUT -// - When you want the "standard" behavior for connections (redirection handling -// an so on) -// - When you want automatic retry on failures -// - When you want to avoid cookie collisions with Safari and other applications -// - When you are fetching resources with ETags and want to avoid the overhead -// of repeated fetches of unchanged data -// - When you need to set a credential for the http operation -// -// This is assumed to be a one-shot fetch request; don't reuse the object -// for a second fetch. -// -// The fetcher may be created auto-released, in which case it will release -// itself after the fetch completion callback. The fetcher is implicitly -// retained as long as a connection is pending. -// -// But if you may need to cancel the fetcher, retain it and have the delegate -// release the fetcher in the callbacks. -// -// Sample usage: -// -// NSURLRequest *request = [NSURLRequest requestWithURL:myURL]; -// GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request]; -// -// // optional upload body data -// [myFetcher setPostData:[postString dataUsingEncoding:NSUTF8StringEncoding]]; -// -// [myFetcher beginFetchWithDelegate:self -// didFinishSelector:@selector(myFetcher:finishedWithData:error:)]; -// -// Upon fetch completion, the callback selector is invoked; it should have -// this signature (you can use any callback method name you want so long as -// the signature matches this): -// -// - (void)myFetcher:(GTMHTTPFetcher *)fetcher finishedWithData:(NSData *)retrievedData error:(NSError *)error; -// -// The block callback version looks like: -// -// [myFetcher beginFetchWithCompletionHandler:^(NSData *retrievedData, NSError *error) { -// if (error != nil) { -// // status code or network error -// } else { -// // succeeded -// } -// }]; - -// -// NOTE: Fetches may retrieve data from the server even though the server -// returned an error. The failure selector is called when the server -// status is >= 300, with an NSError having domain -// kGTMHTTPFetcherStatusDomain and code set to the server status. -// -// Status codes are at -// -// -// Threading and queue support: -// -// Callbacks require either that the thread used to start the fetcher have a run -// loop spinning (typically the main thread), or that an NSOperationQueue be -// provided upon which the delegate callbacks will be called. Starting with -// iOS 6 and Mac OS X 10.7, clients may simply create an operation queue for -// callbacks on a background thread: -// -// NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease]; -// [queue setMaxConcurrentOperationCount:1]; -// fetcher.delegateQueue = queue; -// -// or specify the main queue for callbacks on the main thread: -// -// fetcher.delegateQueue = [NSOperationQueue mainQueue]; -// -// The client may also re-dispatch from the callbacks and notifications to -// a known dispatch queue: -// -// [myFetcher beginFetchWithCompletionHandler:^(NSData *retrievedData, NSError *error) { -// if (error == nil) { -// dispatch_async(myDispatchQueue, ^{ -// ... -// }); -// } -// }]; -// -// -// -// Downloading to disk: -// -// To have downloaded data saved directly to disk, specify either a path for the -// downloadPath property, or a file handle for the downloadFileHandle property. -// When downloading to disk, callbacks will be passed a nil for the NSData* -// arguments. -// -// -// HTTP methods and headers: -// -// Alternative HTTP methods, like PUT, and custom headers can be specified by -// creating the fetcher with an appropriate NSMutableURLRequest -// -// -// Proxies: -// -// Proxy handling is invisible so long as the system has a valid credential in -// the keychain, which is normally true (else most NSURL-based apps would have -// difficulty.) But when there is a proxy authetication error, the the fetcher -// will call the failedWithError: method with the NSURLChallenge in the error's -// userInfo. The error method can get the challenge info like this: -// -// NSURLAuthenticationChallenge *challenge -// = [[error userInfo] objectForKey:kGTMHTTPFetcherErrorChallengeKey]; -// BOOL isProxyChallenge = [[challenge protectionSpace] isProxy]; -// -// If a proxy error occurs, you can ask the user for the proxy username/password -// and call fetcher's setProxyCredential: to provide those for the -// next attempt to fetch. -// -// -// Cookies: -// -// There are three supported mechanisms for remembering cookies between fetches. -// -// By default, GTMHTTPFetcher uses a mutable array held statically to track -// cookies for all instantiated fetchers. This avoids server cookies being set -// by servers for the application from interfering with Safari cookie settings, -// and vice versa. The fetcher cookies are lost when the application quits. -// -// To rely instead on WebKit's global NSHTTPCookieStorage, call -// setCookieStorageMethod: with kGTMHTTPFetcherCookieStorageMethodSystemDefault. -// -// If the fetcher is created from a GTMHTTPFetcherService object -// then the cookie storage mechanism is set to use the cookie storage in the -// service object rather than the static storage. -// -// -// Fetching for periodic checks: -// -// The fetcher object tracks ETag headers from responses and -// provide an "If-None-Match" header. This allows the server to save -// bandwidth by providing a status message instead of repeated response -// data. -// -// To get this behavior, create the fetcher from an GTMHTTPFetcherService object -// and look for a fetch callback error with code 304 -// (kGTMHTTPFetcherStatusNotModified) like this: -// -// - (void)myFetcher:(GTMHTTPFetcher *)fetcher finishedWithData:(NSData *)data error:(NSError *)error { -// if ([error code] == kGTMHTTPFetcherStatusNotModified) { -// // |data| is empty; use the data from the previous finishedWithData: for this URL -// } else { -// // handle other server status code -// } -// } -// -// -// Monitoring received data -// -// The optional received data selector can be set with setReceivedDataSelector: -// and should have the signature -// -// - (void)myFetcher:(GTMHTTPFetcher *)fetcher receivedData:(NSData *)dataReceivedSoFar; -// -// The number bytes received so far is available as [fetcher downloadedLength]. -// This number may go down if a redirect causes the download to begin again from -// a new server. -// -// If supplied by the server, the anticipated total download size is available -// as [[myFetcher response] expectedContentLength] (and may be -1 for unknown -// download sizes.) -// -// -// Automatic retrying of fetches -// -// The fetcher can optionally create a timer and reattempt certain kinds of -// fetch failures (status codes 408, request timeout; 503, service unavailable; -// 504, gateway timeout; networking errors NSURLErrorTimedOut and -// NSURLErrorNetworkConnectionLost.) The user may set a retry selector to -// customize the type of errors which will be retried. -// -// Retries are done in an exponential-backoff fashion (that is, after 1 second, -// 2, 4, 8, and so on.) -// -// Enabling automatic retries looks like this: -// [myFetcher setRetryEnabled:YES]; -// -// With retries enabled, the success or failure callbacks are called only -// when no more retries will be attempted. Calling the fetcher's stopFetching -// method will terminate the retry timer, without the finished or failure -// selectors being invoked. -// -// Optionally, the client may set the maximum retry interval: -// [myFetcher setMaxRetryInterval:60.0]; // in seconds; default is 60 seconds -// // for downloads, 600 for uploads -// -// Also optionally, the client may provide a callback selector to determine -// if a status code or other error should be retried. -// [myFetcher setRetrySelector:@selector(myFetcher:willRetry:forError:)]; -// -// If set, the retry selector should have the signature: -// -(BOOL)fetcher:(GTMHTTPFetcher *)fetcher willRetry:(BOOL)suggestedWillRetry forError:(NSError *)error -// and return YES to set the retry timer or NO to fail without additional -// fetch attempts. -// -// The retry method may return the |suggestedWillRetry| argument to get the -// default retry behavior. Server status codes are present in the -// error argument, and have the domain kGTMHTTPFetcherStatusDomain. The -// user's method may look something like this: -// -// -(BOOL)myFetcher:(GTMHTTPFetcher *)fetcher willRetry:(BOOL)suggestedWillRetry forError:(NSError *)error { -// -// // perhaps examine [error domain] and [error code], or [fetcher retryCount] -// // -// // return YES to start the retry timer, NO to proceed to the failure -// // callback, or |suggestedWillRetry| to get default behavior for the -// // current error domain and code values. -// return suggestedWillRetry; -// } - - - -#pragma once - -#import - -#if defined(GTL_TARGET_NAMESPACE) - // we're using target namespace macros - #import "GTLDefines.h" -#elif defined(GDATA_TARGET_NAMESPACE) - #import "GDataDefines.h" -#else - #if TARGET_OS_IPHONE - #ifndef GTM_FOUNDATION_ONLY - #define GTM_FOUNDATION_ONLY 1 - #endif - #ifndef GTM_IPHONE - #define GTM_IPHONE 1 - #endif - #endif -#endif - -#if TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 40000) - #define GTM_BACKGROUND_FETCHING 1 -#endif - -#ifndef GTM_ALLOW_INSECURE_REQUESTS - // For builds prior to the iOS 8/10.10 SDKs, default to ignoring insecure requests for backwards - // compatibility unless the project has smartly set GTM_ALLOW_INSECURE_REQUESTS explicitly. - #if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_10) \ - || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0) - #define GTM_ALLOW_INSECURE_REQUESTS 0 - #else - #define GTM_ALLOW_INSECURE_REQUESTS 1 - #endif -#endif - -#if !defined(GTMBridgeFetcher) - // These bridge macros should be identical in GTMHTTPFetcher.h and GTMSessionFetcher.h - #if GTM_USE_SESSION_FETCHER - // Macros to new fetcher class. - #define GTMBridgeFetcher GTMSessionFetcher - #define GTMBridgeFetcherService GTMSessionFetcherService - #define GTMBridgeFetcherServiceProtocol GTMSessionFetcherServiceProtocol - #define GTMBridgeAssertValidSelector GTMSessionFetcherAssertValidSelector - #define GTMBridgeCookieStorage GTMSessionCookieStorage - #define GTMBridgeCleanedUserAgentString GTMFetcherCleanedUserAgentString - #define GTMBridgeSystemVersionString GTMFetcherSystemVersionString - #define GTMBridgeApplicationIdentifier GTMFetcherApplicationIdentifier - #define kGTMBridgeFetcherStatusDomain kGTMSessionFetcherStatusDomain - #define kGTMBridgeFetcherStatusBadRequest kGTMSessionFetcherStatusBadRequest - #else - // Macros to old fetcher class. - #define GTMBridgeFetcher GTMHTTPFetcher - #define GTMBridgeFetcherService GTMHTTPFetcherService - #define GTMBridgeFetcherServiceProtocol GTMHTTPFetcherServiceProtocol - #define GTMBridgeAssertValidSelector GTMAssertSelectorNilOrImplementedWithArgs - #define GTMBridgeCookieStorage GTMCookieStorage - #define GTMBridgeCleanedUserAgentString GTMCleanedUserAgentString - #define GTMBridgeSystemVersionString GTMSystemVersionString - #define GTMBridgeApplicationIdentifier GTMApplicationIdentifier - #define kGTMBridgeFetcherStatusDomain kGTMHTTPFetcherStatusDomain - #define kGTMBridgeFetcherStatusBadRequest kGTMHTTPFetcherStatusBadRequest - #endif // GTM_USE_SESSION_FETCHER -#endif // !defined(GTMBridgeFetcher) - -#ifdef __cplusplus -extern "C" { -#endif - -// notifications -// -// fetch started and stopped, and fetch retry delay started and stopped -extern NSString *const kGTMHTTPFetcherStartedNotification; -extern NSString *const kGTMHTTPFetcherStoppedNotification; -extern NSString *const kGTMHTTPFetcherRetryDelayStartedNotification; -extern NSString *const kGTMHTTPFetcherRetryDelayStoppedNotification; - -// callback constants - -extern NSString *const kGTMHTTPFetcherErrorDomain; -extern NSString *const kGTMHTTPFetcherStatusDomain; -extern NSString *const kGTMHTTPFetcherErrorChallengeKey; -extern NSString *const kGTMHTTPFetcherStatusDataKey; // data returned with a kGTMHTTPFetcherStatusDomain error - -#ifdef __cplusplus -} -#endif - -enum { - kGTMHTTPFetcherErrorDownloadFailed = -1, - kGTMHTTPFetcherErrorAuthenticationChallengeFailed = -2, - kGTMHTTPFetcherErrorChunkUploadFailed = -3, - kGTMHTTPFetcherErrorFileHandleException = -4, - kGTMHTTPFetcherErrorBackgroundExpiration = -6, - - // The code kGTMHTTPFetcherErrorAuthorizationFailed (-5) has been removed; - // look for status 401 instead. - - kGTMHTTPFetcherStatusNotModified = 304, - kGTMHTTPFetcherStatusBadRequest = 400, - kGTMHTTPFetcherStatusUnauthorized = 401, - kGTMHTTPFetcherStatusForbidden = 403, - kGTMHTTPFetcherStatusPreconditionFailed = 412 -}; - -// cookie storage methods -enum { - kGTMHTTPFetcherCookieStorageMethodStatic = 0, - kGTMHTTPFetcherCookieStorageMethodFetchHistory = 1, - kGTMHTTPFetcherCookieStorageMethodSystemDefault = 2, - kGTMHTTPFetcherCookieStorageMethodNone = 3 -}; - -#ifdef __cplusplus -extern "C" { -#endif - -void GTMAssertSelectorNilOrImplementedWithArgs(id obj, SEL sel, ...); - -// Utility functions for applications self-identifying to servers via a -// user-agent header - -// Make a proper app name without whitespace from the given string, removing -// whitespace and other characters that may be special parsed marks of -// the full user-agent string. -NSString *GTMCleanedUserAgentString(NSString *str); - -// Make an identifier like "MacOSX/10.7.1" or "iPod_Touch/4.1 hw/iPod1_1" -NSString *GTMSystemVersionString(void); - -// Make a generic name and version for the current application, like -// com.example.MyApp/1.2.3 relying on the bundle identifier and the -// CFBundleShortVersionString or CFBundleVersion. -// -// The bundle ID may be overridden as the base identifier string by -// adding to the bundle's Info.plist a "GTMUserAgentID" key. -// -// If no bundle ID or override is available, the process name preceded -// by "proc_" is used. -NSString *GTMApplicationIdentifier(NSBundle *bundle); - -#ifdef __cplusplus -} // extern "C" -#endif - -@class GTMHTTPFetcher; - -@protocol GTMCookieStorageProtocol -// This protocol allows us to call into the service without requiring -// GTMCookieStorage sources in this project -// -// The public interface for cookie handling is the GTMCookieStorage class, -// accessible from a fetcher service object's fetchHistory or from the fetcher's -// +staticCookieStorage method. -- (NSArray *)cookiesForURL:(NSURL *)theURL; -- (void)setCookies:(NSArray *)newCookies; -@end - -@protocol GTMHTTPFetchHistoryProtocol -// This protocol allows us to call the fetch history object without requiring -// GTMHTTPFetchHistory sources in this project -- (void)updateRequest:(NSMutableURLRequest *)request isHTTPGet:(BOOL)isHTTPGet; -- (BOOL)shouldCacheETaggedData; -- (NSData *)cachedDataForRequest:(NSURLRequest *)request; -- (id )cookieStorage; -- (void)updateFetchHistoryWithRequest:(NSURLRequest *)request - response:(NSURLResponse *)response - downloadedData:(NSData *)downloadedData; -- (void)removeCachedDataForRequest:(NSURLRequest *)request; -@end - -#if GTM_USE_SESSION_FETCHER -@protocol GTMSessionFetcherServiceProtocol; -#endif - -@protocol GTMHTTPFetcherServiceProtocol -// This protocol allows us to call into the service without requiring -// GTMHTTPFetcherService sources in this project - -@property (retain) NSOperationQueue *delegateQueue; - -- (BOOL)fetcherShouldBeginFetching:(GTMHTTPFetcher *)fetcher; -- (void)fetcherDidStop:(GTMHTTPFetcher *)fetcher; - -- (GTMHTTPFetcher *)fetcherWithRequest:(NSURLRequest *)request; -- (BOOL)isDelayingFetcher:(GTMHTTPFetcher *)fetcher; -@end - -#if !defined(GTM_FETCHER_AUTHORIZATION_PROTOCOL) -#define GTM_FETCHER_AUTHORIZATION_PROTOCOL 1 -@protocol GTMFetcherAuthorizationProtocol -@required -// This protocol allows us to call the authorizer without requiring its sources -// in this project. -- (void)authorizeRequest:(NSMutableURLRequest *)request - delegate:(id)delegate - didFinishSelector:(SEL)sel; - -- (void)stopAuthorization; - -- (void)stopAuthorizationForRequest:(NSURLRequest *)request; - -- (BOOL)isAuthorizingRequest:(NSURLRequest *)request; - -- (BOOL)isAuthorizedRequest:(NSURLRequest *)request; - -@property (retain, readonly) NSString *userEmail; - -@optional - -// Indicate if authorization may be attempted. Even if this succeeds, -// authorization may fail if the user's permissions have been revoked. -@property (readonly) BOOL canAuthorize; - -// For development only, allow authorization of non-SSL requests, allowing -// transmission of the bearer token unencrypted. -@property (assign) BOOL shouldAuthorizeAllRequests; - -#if NS_BLOCKS_AVAILABLE -- (void)authorizeRequest:(NSMutableURLRequest *)request - completionHandler:(void (^)(NSError *error))handler; -#endif - -#if GTM_USE_SESSION_FETCHER -@property (assign) id fetcherService; // WEAK -#else -@property (assign) id fetcherService; // WEAK -#endif - -- (BOOL)primeForRefresh; - -@end -#endif // !defined(GTM_FETCHER_AUTHORIZATION_PROTOCOL) - - -// GTMHTTPFetcher objects are used for async retrieval of an http get or post -// -// See additional comments at the beginning of this file -@interface GTMHTTPFetcher : NSObject { - @protected - NSMutableURLRequest *request_; - NSURLConnection *connection_; - NSMutableData *downloadedData_; - NSString *downloadPath_; - NSString *temporaryDownloadPath_; - NSFileHandle *downloadFileHandle_; - unsigned long long downloadedLength_; - NSArray *allowedInsecureSchemes_; - BOOL allowLocalhostRequest_; - NSURLCredential *credential_; // username & password - NSURLCredential *proxyCredential_; // credential supplied to proxy servers - NSData *postData_; - NSInputStream *postStream_; - NSMutableData *loggedStreamData_; - NSURLResponse *response_; // set in connection:didReceiveResponse: - id delegate_; - SEL finishedSel_; // should by implemented by delegate - SEL sentDataSel_; // optional, set with setSentDataSelector - SEL receivedDataSel_; // optional, set with setReceivedDataSelector -#if NS_BLOCKS_AVAILABLE - void (^completionBlock_)(NSData *, NSError *); - void (^receivedDataBlock_)(NSData *); - void (^sentDataBlock_)(NSInteger, NSInteger, NSInteger); - BOOL (^retryBlock_)(BOOL, NSError *); -#elif !__LP64__ - // placeholders: for 32-bit builds, keep the size of the object's ivar section - // the same with and without blocks - id completionPlaceholder_; - id receivedDataPlaceholder_; - id sentDataPlaceholder_; - id retryPlaceholder_; -#endif - BOOL hasConnectionEnded_; // set if the connection need not be cancelled - BOOL isCancellingChallenge_; // set only when cancelling an auth challenge - BOOL isStopNotificationNeeded_; // set when start notification has been sent - BOOL shouldFetchInBackground_; -#if GTM_BACKGROUND_FETCHING - NSUInteger backgroundTaskIdentifer_; // UIBackgroundTaskIdentifier -#endif - id userData_; // retained, if set by caller - NSMutableDictionary *properties_; // more data retained for caller - NSArray *runLoopModes_; // optional - NSOperationQueue *delegateQueue_; // optional; available iOS 6/10.7 and later - id fetchHistory_; // if supplied by the caller, used for Last-Modified-Since checks and cookies - NSInteger cookieStorageMethod_; // constant from above - id cookieStorage_; - - id authorizer_; - - // the service object that created and monitors this fetcher, if any - id service_; - NSString *serviceHost_; - NSInteger servicePriority_; - NSThread *thread_; - - BOOL isRetryEnabled_; // user wants auto-retry - SEL retrySel_; // optional; set with setRetrySelector - NSTimer *retryTimer_; - NSUInteger retryCount_; - NSTimeInterval maxRetryInterval_; // default 600 seconds - NSTimeInterval minRetryInterval_; // random between 1 and 2 seconds - NSTimeInterval retryFactor_; // default interval multiplier is 2 - NSTimeInterval lastRetryInterval_; - NSDate *initialRequestDate_; - BOOL hasAttemptedAuthRefresh_; - - NSString *comment_; // comment for log - NSString *log_; -#if !STRIP_GTM_FETCH_LOGGING - NSURL *redirectedFromURL_; - NSString *logRequestBody_; - NSString *logResponseBody_; - BOOL hasLoggedError_; - BOOL shouldDeferResponseBodyLogging_; -#endif -} - -// Create a fetcher -// -// fetcherWithRequest will return an autoreleased fetcher, but if -// the connection is successfully created, the connection should retain the -// fetcher for the life of the connection as well. So the caller doesn't have -// to retain the fetcher explicitly unless they want to be able to cancel it. -+ (GTMHTTPFetcher *)fetcherWithRequest:(NSURLRequest *)request; - -// Convenience methods that make a request, like +fetcherWithRequest -+ (GTMHTTPFetcher *)fetcherWithURL:(NSURL *)requestURL; -+ (GTMHTTPFetcher *)fetcherWithURLString:(NSString *)requestURLString; - -// Designated initializer -- (id)initWithRequest:(NSURLRequest *)request; - -// Fetcher request -// -// The underlying request is mutable and may be modified by the caller -@property (retain) NSMutableURLRequest *mutableRequest; - -// By default, the fetcher allows only secure (https) schemes unless this -// property is set, or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. -// -// For example, during debugging when fetching from a development server that lacks SSL support, -// this may be set to @[ @"http" ], or when the fetcher is used to retrieve local files, -// this may be set to @[ @"file" ]. -// -// This should be left as nil for release builds to avoid creating the opportunity for -// leaking private user behavior and data. If a server is providing insecure URLs -// for fetching by the client app, report the problem as server security & privacy bug. -@property(copy) NSArray *allowedInsecureSchemes; - -// By default, the fetcher prohibits localhost requests unless this property is set, -// or the GTM_ALLOW_INSECURE_REQUESTS build flag is set. -// -// For localhost requests, the URL scheme is not checked when this property is set. -@property(assign) BOOL allowLocalhostRequest; - -// Setting the credential is optional; it is used if the connection receives -// an authentication challenge -@property (retain) NSURLCredential *credential; - -// Setting the proxy credential is optional; it is used if the connection -// receives an authentication challenge from a proxy -@property (retain) NSURLCredential *proxyCredential; - -// If post data or stream is not set, then a GET retrieval method is assumed -@property (retain) NSData *postData; -@property (retain) NSInputStream *postStream; - -// The default cookie storage method is kGTMHTTPFetcherCookieStorageMethodStatic -// without a fetch history set, and kGTMHTTPFetcherCookieStorageMethodFetchHistory -// with a fetch history set -// -// Applications needing control of cookies across a sequence of fetches should -// create fetchers from a GTMHTTPFetcherService object (which encapsulates -// fetch history) for a well-defined cookie store -@property (assign) NSInteger cookieStorageMethod; - -+ (id )staticCookieStorage; - -// Object to add authorization to the request, if needed -@property (retain) id authorizer; - -// The service object that created and monitors this fetcher, if any -@property (retain) id service; - -// The host, if any, used to classify this fetcher in the fetcher service -@property (copy) NSString *serviceHost; - -// The priority, if any, used for starting fetchers in the fetcher service -// -// Lower values are higher priority; the default is 0, and values may -// be negative or positive. This priority affects only the start order of -// fetchers that are being delayed by a fetcher service. -@property (assign) NSInteger servicePriority; - -// The thread used to run this fetcher in the fetcher service when no operation -// queue is provided. -@property (retain) NSThread *thread; - -// The delegate is retained during the connection -@property (retain) id delegate; - -// On iOS 4 and later, the fetch may optionally continue while the app is in the -// background until finished or stopped by OS expiration -// -// The default value is NO -// -// For Mac OS X, background fetches are always supported, and this property -// is ignored -@property (assign) BOOL shouldFetchInBackground; - -// The delegate's optional sentData selector may be used to monitor upload -// progress. It should have a signature like: -// - (void)myFetcher:(GTMHTTPFetcher *)fetcher -// didSendBytes:(NSInteger)bytesSent -// totalBytesSent:(NSInteger)totalBytesSent -// totalBytesExpectedToSend:(NSInteger)totalBytesExpectedToSend; -// -// +doesSupportSentDataCallback indicates if this delegate method is supported -+ (BOOL)doesSupportSentDataCallback; - -@property (assign) SEL sentDataSelector; - -// The delegate's optional receivedData selector may be used to monitor download -// progress. It should have a signature like: -// - (void)myFetcher:(GTMHTTPFetcher *)fetcher -// receivedData:(NSData *)dataReceivedSoFar; -// -// The dataReceived argument will be nil when downloading to a path or to a -// file handle. -// -// Applications should not use this method to accumulate the received data; -// the callback method or block supplied to the beginFetch call will have -// the complete NSData received. -@property (assign) SEL receivedDataSelector; - -#if NS_BLOCKS_AVAILABLE -// The full interface to the block is provided rather than just a typedef for -// its parameter list in order to get more useful code completion in the Xcode -// editor -@property (copy) void (^sentDataBlock)(NSInteger bytesSent, NSInteger totalBytesSent, NSInteger bytesExpectedToSend); - -// The dataReceived argument will be nil when downloading to a path or to -// a file handle -@property (copy) void (^receivedDataBlock)(NSData *dataReceivedSoFar); -#endif - -// retrying; see comments at the top of the file. Calling -// setRetryEnabled(YES) resets the min and max retry intervals. -@property (assign, getter=isRetryEnabled) BOOL retryEnabled; - -// Retry selector or block is optional for retries. -// -// If present, it should have the signature: -// -(BOOL)fetcher:(GTMHTTPFetcher *)fetcher willRetry:(BOOL)suggestedWillRetry forError:(NSError *)error -// and return YES to cause a retry. See comments at the top of this file. -@property (assign) SEL retrySelector; - -#if NS_BLOCKS_AVAILABLE -@property (copy) BOOL (^retryBlock)(BOOL suggestedWillRetry, NSError *error); -#endif - -// Retry intervals must be strictly less than maxRetryInterval, else -// they will be limited to maxRetryInterval and no further retries will -// be attempted. Setting maxRetryInterval to 0.0 will reset it to the -// default value, 600 seconds. - -@property (assign) NSTimeInterval maxRetryInterval; - -// Starting retry interval. Setting minRetryInterval to 0.0 will reset it -// to a random value between 1.0 and 2.0 seconds. Clients should normally not -// call this except for unit testing. -@property (assign) NSTimeInterval minRetryInterval; - -// Multiplier used to increase the interval between retries, typically 2.0. -// Clients should not need to call this. -@property (assign) double retryFactor; - -// Number of retries attempted -@property (readonly) NSUInteger retryCount; - -// interval delay to precede next retry -@property (readonly) NSTimeInterval nextRetryInterval; - -// Begin fetching the request -// -// The delegate can optionally implement the finished selectors or pass NULL -// for it. -// -// Returns YES if the fetch is initiated. The delegate is retained between -// the beginFetch call until after the finish callback. -// -// An error is passed to the callback for server statuses 300 or -// higher, with the status stored as the error object's code. -// -// finishedSEL has a signature like: -// - (void)fetcher:(GTMHTTPFetcher *)fetcher finishedWithData:(NSData *)data error:(NSError *)error; -// -// If the application has specified a downloadPath or downloadFileHandle -// for the fetcher, the data parameter passed to the callback will be nil. - -- (BOOL)beginFetchWithDelegate:(id)delegate - didFinishSelector:(SEL)finishedSEL; - -#if NS_BLOCKS_AVAILABLE -- (BOOL)beginFetchWithCompletionHandler:(void (^)(NSData *data, NSError *error))handler; -#endif - - -// Returns YES if this is in the process of fetching a URL -- (BOOL)isFetching; - -// Cancel the fetch of the request that's currently in progress -- (void)stopFetching; - -// Return the status code from the server response -@property (readonly) NSInteger statusCode; - -// Return the http headers from the response -@property (retain, readonly) NSDictionary *responseHeaders; - -// The response, once it's been received -@property (retain) NSURLResponse *response; - -// Bytes downloaded so far -@property (readonly) unsigned long long downloadedLength; - -// Buffer of currently-downloaded data -@property (readonly, retain) NSData *downloadedData; - -// Path in which to non-atomically create a file for storing the downloaded data -// -// The path must be set before fetching begins. The download file handle -// will be created for the path, and can be used to monitor progress. If a file -// already exists at the path, it will be overwritten. -@property (copy) NSString *downloadPath; - -// If downloadFileHandle is set, data received is immediately appended to -// the file handle rather than being accumulated in the downloadedData property -// -// The file handle supplied must allow writing and support seekToFileOffset:, -// and must be set before fetching begins. Setting a download path will -// override the file handle property. -@property (retain) NSFileHandle *downloadFileHandle; - -// The optional fetchHistory object is used for a sequence of fetchers to -// remember ETags, cache ETagged data, and store cookies. Typically, this -// is set by a GTMFetcherService object when it creates a fetcher. -// -// Side effect: setting fetch history implicitly calls setCookieStorageMethod: -@property (retain) id fetchHistory; - -// userData is retained for the convenience of the caller -@property (retain) id userData; - -// Stored property values are retained for the convenience of the caller -@property (copy) NSMutableDictionary *properties; - -- (void)setProperty:(id)obj forKey:(NSString *)key; // pass nil obj to remove property -- (id)propertyForKey:(NSString *)key; - -- (void)addPropertiesFromDictionary:(NSDictionary *)dict; - -// Comments are useful for logging -@property (copy) NSString *comment; - -- (void)setCommentWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); - -// Log of request and response, if logging is enabled -@property (copy) NSString *log; - -// Callbacks can be invoked on an operation queue rather than via the run loop, -// starting on 10.7 and iOS 6. If a delegate queue is supplied. the run loop -// modes are ignored. If no delegateQueue is supplied, and run loop modes are -// not supplied, and the fetcher is started off of the main thread, then a -// delegateQueue of [NSOperationQueue mainQueue] is assumed. -@property (retain) NSOperationQueue *delegateQueue; - -// Using the fetcher while a modal dialog is displayed requires setting the -// run-loop modes to include NSModalPanelRunLoopMode -@property (retain) NSArray *runLoopModes; - -// Users who wish to replace GTMHTTPFetcher's use of NSURLConnection -// can do so globally here. The replacement should be a subclass of -// NSURLConnection. -+ (Class)connectionClass; -+ (void)setConnectionClass:(Class)theClass; - -// -// Method for compatibility with GTMSessionFetcher -// -@property (retain) NSData *bodyData; - -// Spin the run loop, discarding events, until the fetch has completed -// -// This is only for use in testing or in tools without a user interface. -// -// Synchronous fetches should never be done by shipping apps; they are -// sufficient reason for rejection from the app store. -- (void)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds; - -#if STRIP_GTM_FETCH_LOGGING -// if logging is stripped, provide a stub for the main method -// for controlling logging -+ (void)setLoggingEnabled:(BOOL)flag; -#endif // STRIP_GTM_FETCH_LOGGING - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.m deleted file mode 100755 index 99e189258..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.m +++ /dev/null @@ -1,2156 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPFetcher.m -// - -#import "GTMHTTPFetcher.h" - -#if GTM_BACKGROUND_FETCHING -#import -#endif - -#import - -static id gGTMFetcherStaticCookieStorage = nil; -static Class gGTMFetcherConnectionClass = nil; - - -NSString *const kGTMHTTPFetcherStartedNotification = @"kGTMHTTPFetcherStartedNotification"; -NSString *const kGTMHTTPFetcherStoppedNotification = @"kGTMHTTPFetcherStoppedNotification"; -NSString *const kGTMHTTPFetcherRetryDelayStartedNotification = @"kGTMHTTPFetcherRetryDelayStartedNotification"; -NSString *const kGTMHTTPFetcherRetryDelayStoppedNotification = @"kGTMHTTPFetcherRetryDelayStoppedNotification"; - -NSString *const kGTMHTTPFetcherErrorDomain = @"com.google.GTMHTTPFetcher"; -NSString *const kGTMHTTPFetcherStatusDomain = @"com.google.HTTPStatus"; -NSString *const kGTMHTTPFetcherErrorChallengeKey = @"challenge"; -NSString *const kGTMHTTPFetcherStatusDataKey = @"data"; // data returned with a kGTMHTTPFetcherStatusDomain error - -// The default max retry interview is 10 minutes for uploads (POST/PUT/PATCH), -// 1 minute for downloads. -static const NSTimeInterval kUnsetMaxRetryInterval = -1; -static const NSTimeInterval kDefaultMaxDownloadRetryInterval = 60.0; -static const NSTimeInterval kDefaultMaxUploadRetryInterval = 60.0 * 10.; - -// delegateQueue callback parameters -static NSString *const kCallbackTarget = @"target"; -static NSString *const kCallbackSelector = @"sel"; -static NSString *const kCallbackBlock = @"block"; -static NSString *const kCallbackData = @"data"; -static NSString *const kCallbackError = @"error"; - -// -// GTMHTTPFetcher -// - -@interface GTMHTTPFetcher () - -@property (copy) NSString *temporaryDownloadPath; -@property (retain) id cookieStorage; -@property (readwrite, retain) NSData *downloadedData; -#if NS_BLOCKS_AVAILABLE -@property (copy) void (^completionBlock)(NSData *, NSError *); -#endif - -- (BOOL)beginFetchMayDelay:(BOOL)mayDelay - mayAuthorize:(BOOL)mayAuthorize; -- (void)failToBeginFetchWithError:(NSError *)error; -- (void)failToBeginFetchDeferWithError:(NSError *)error; - -#if GTM_BACKGROUND_FETCHING -- (void)endBackgroundTask; -- (void)backgroundFetchExpired; -#endif - -- (BOOL)authorizeRequest; -- (void)authorizer:(id )auth - request:(NSMutableURLRequest *)request - finishedWithError:(NSError *)error; - -- (NSString *)createTempDownloadFilePathForPath:(NSString *)targetPath; -- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks; -- (BOOL)shouldReleaseCallbacksUponCompletion; - -- (void)addCookiesToRequest:(NSMutableURLRequest *)request; -- (void)handleCookiesForResponse:(NSURLResponse *)response; - -- (void)invokeFetchCallbacksWithData:(NSData *)data - error:(NSError *)error; -- (void)invokeFetchCallbacksWithTarget:(id)target - selector:(SEL)sel - block:(id)block - data:(NSData *)data - error:(NSError *)error; -- (void)invokeFetchCallback:(SEL)sel - target:(id)target - data:(NSData *)data - error:(NSError *)error; -- (void)invokeFetchCallbacksOnDelegateQueueWithData:(NSData *)data - error:(NSError *)error; -- (void)invokeOnQueueWithDictionary:(NSDictionary *)dict; -- (void)releaseCallbacks; - -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; - -- (BOOL)shouldRetryNowForStatus:(NSInteger)status error:(NSError *)error; -- (void)destroyRetryTimer; -- (void)beginRetryTimer; -- (void)primeRetryTimerWithNewTimeInterval:(NSTimeInterval)secs; -- (void)sendStopNotificationIfNeeded; -- (void)retryFetch; -- (void)retryTimerFired:(NSTimer *)timer; -@end - -@interface GTMHTTPFetcher (GTMHTTPFetcherLoggingInternal) -- (void)setupStreamLogging; -- (void)logFetchWithError:(NSError *)error; -- (void)logNowWithError:(NSError *)error; -@end - -@implementation GTMHTTPFetcher - -+ (GTMHTTPFetcher *)fetcherWithRequest:(NSURLRequest *)request { - return [[[[self class] alloc] initWithRequest:request] autorelease]; -} - -+ (GTMHTTPFetcher *)fetcherWithURL:(NSURL *)requestURL { - return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; -} - -+ (GTMHTTPFetcher *)fetcherWithURLString:(NSString *)requestURLString { - return [self fetcherWithURL:[NSURL URLWithString:requestURLString]]; -} - -+ (void)initialize { - // initialize is guaranteed by the runtime to be called in a - // thread-safe manner - if (!gGTMFetcherStaticCookieStorage) { - Class cookieStorageClass = NSClassFromString(@"GTMCookieStorage"); - if (cookieStorageClass) { - gGTMFetcherStaticCookieStorage = [[cookieStorageClass alloc] init]; - } - } -} - -- (id)init { - return [self initWithRequest:nil]; -} - -- (id)initWithRequest:(NSURLRequest *)request { - self = [super init]; - if (self) { - request_ = [request mutableCopy]; - - if (gGTMFetcherStaticCookieStorage != nil) { - // The user has compiled with the cookie storage class available; - // default to static cookie storage, so our cookies are independent - // of the cookies of other apps. - [self setCookieStorageMethod:kGTMHTTPFetcherCookieStorageMethodStatic]; - } else { - // Default to system default cookie storage - [self setCookieStorageMethod:kGTMHTTPFetcherCookieStorageMethodSystemDefault]; - } -#if !STRIP_GTM_FETCH_LOGGING - // Encourage developers to set the comment property or use - // setCommentWithFormat: by providing a default string. - comment_ = @"(No fetcher comment set)"; -#endif - } - return self; -} - -- (id)copyWithZone:(NSZone *)zone { - // disallow use of fetchers in a copy property - [self doesNotRecognizeSelector:_cmd]; - return nil; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"%@ %p (%@)", - [self class], self, [self.mutableRequest URL]]; -} - -#if !GTM_IPHONE -- (void)finalize { - [self stopFetchReleasingCallbacks:YES]; // releases connection_, destroys timers - [super finalize]; -} -#endif - -- (void)dealloc { -#if DEBUG - NSAssert(!isStopNotificationNeeded_, - @"unbalanced fetcher notification for %@", [request_ URL]); -#endif - - // Note: if a connection or a retry timer was pending, then this instance - // would be retained by those so it wouldn't be getting dealloc'd, - // hence we don't need to stopFetch here - [request_ release]; - [connection_ release]; - [downloadedData_ release]; - [downloadPath_ release]; - [temporaryDownloadPath_ release]; - [downloadFileHandle_ release]; - [credential_ release]; - [proxyCredential_ release]; - [postData_ release]; - [postStream_ release]; - [loggedStreamData_ release]; - [response_ release]; -#if NS_BLOCKS_AVAILABLE - [completionBlock_ release]; - [receivedDataBlock_ release]; - [sentDataBlock_ release]; - [retryBlock_ release]; -#endif - [userData_ release]; - [properties_ release]; - [delegateQueue_ release]; - [runLoopModes_ release]; - [fetchHistory_ release]; - [cookieStorage_ release]; - [authorizer_ release]; - [service_ release]; - [serviceHost_ release]; - [thread_ release]; - [retryTimer_ release]; - [initialRequestDate_ release]; - [comment_ release]; - [log_ release]; -#if !STRIP_GTM_FETCH_LOGGING - [redirectedFromURL_ release]; - [logRequestBody_ release]; - [logResponseBody_ release]; -#endif - - [super dealloc]; -} - -#pragma mark - - -// Begin fetching the URL (or begin a retry fetch). The delegate is retained -// for the duration of the fetch connection. - -- (BOOL)beginFetchWithDelegate:(id)delegate - didFinishSelector:(SEL)finishedSelector { - GTMAssertSelectorNilOrImplementedWithArgs(delegate, finishedSelector, @encode(GTMHTTPFetcher *), @encode(NSData *), @encode(NSError *), 0); - GTMAssertSelectorNilOrImplementedWithArgs(delegate, receivedDataSel_, @encode(GTMHTTPFetcher *), @encode(NSData *), 0); - GTMAssertSelectorNilOrImplementedWithArgs(delegate, retrySel_, @encode(GTMHTTPFetcher *), @encode(BOOL), @encode(NSError *), 0); - - // We'll retain the delegate only during the outstanding connection (similar - // to what Cocoa does with performSelectorOnMainThread:) and during - // authorization or delays, since the app would crash - // if the delegate was released before the fetch calls back - [self setDelegate:delegate]; - finishedSel_ = finishedSelector; - - return [self beginFetchMayDelay:YES - mayAuthorize:YES]; -} - -- (BOOL)beginFetchMayDelay:(BOOL)mayDelay - mayAuthorize:(BOOL)mayAuthorize { - // This is the internal entry point for re-starting fetches - NSError *error = nil; - - if (connection_ != nil) { - NSAssert1(connection_ != nil, @"fetch object %@ being reused; this should never happen", self); - goto CannotBeginFetch; - } - - NSURL *requestURL = [request_ URL]; - if (request_ == nil || requestURL == nil) { - NSAssert(request_ != nil, @"beginFetchWithDelegate requires a request with a URL"); - goto CannotBeginFetch; - } - -#if !GTM_ALLOW_INSECURE_REQUESTS - if (requestURL != nil) { - // Allow https only for requests, unless overridden by the client. - // - // Non-https requests may too easily be snooped, so we disallow them by default. - // - // file: and data: schemes are usually safe if they are hardcoded in the client or provided - // by a trusted source, but since it's fairly rare to need them, it's safest to make clients - // explicitly whitelist them. - NSString *requestScheme = [requestURL scheme]; - BOOL isSecure = ([requestScheme caseInsensitiveCompare:@"https"] == NSOrderedSame); - if (!isSecure) { - BOOL allowRequest = NO; - NSString *host = [requestURL host]; - BOOL isLocalhost = ([host caseInsensitiveCompare:@"localhost"] == NSOrderedSame - || [host isEqual:@"::1"] - || [host isEqual:@"127.0.0.1"]); - if (isLocalhost) { - if (allowLocalhostRequest_) { - allowRequest = YES; - } else { - // To fetch from localhost, the fetcher must specifically have the allowLocalhostRequest - // property set. -#if DEBUG - NSAssert(NO, @"Fetch request for localhost but fetcher allowLocalhostRequest" - @" is not set: %@", requestURL); -#else - NSLog(@"Localhost fetch disallowed for %@", requestURL); -#endif - } - } else { - // Not localhost; check schemes. - for (NSString *allowedScheme in allowedInsecureSchemes_) { - if ([requestScheme caseInsensitiveCompare:allowedScheme] == NSOrderedSame) { - allowRequest = YES; - break; - } - } - if (!allowRequest) { - // To make a request other than https:, the client must specify an array for the - // allowedInsecureSchemes property. -#if DEBUG - NSAssert(NO, @"Insecure fetch request has a scheme (%@)" - @" not found in fetcher allowedInsecureSchemes (%@): %@", - requestScheme, allowedInsecureSchemes_, requestURL); -#else - NSLog(@"Fetch disallowed for %@", requestURL); -#endif - } - } - if (!allowRequest) { - goto CannotBeginFetch; - } - } // !isSecure - } // requestURL != nil -#endif // GTM_ALLOW_INSECURE_REQUESTS - - self.downloadedData = nil; - downloadedLength_ = 0; - - if (mayDelay && service_) { - BOOL shouldFetchNow = [service_ fetcherShouldBeginFetching:self]; - if (!shouldFetchNow) { - // the fetch is deferred, but will happen later - return YES; - } - } - - NSString *effectiveHTTPMethod = [request_ valueForHTTPHeaderField:@"X-HTTP-Method-Override"]; - if (effectiveHTTPMethod == nil) { - effectiveHTTPMethod = [request_ HTTPMethod]; - } - BOOL isEffectiveHTTPGet = (effectiveHTTPMethod == nil - || [effectiveHTTPMethod isEqual:@"GET"]); - - if (postData_ || postStream_) { - if (isEffectiveHTTPGet) { - [request_ setHTTPMethod:@"POST"]; - isEffectiveHTTPGet = NO; - } - - if (postData_) { - [request_ setHTTPBody:postData_]; - } else { - if ([self respondsToSelector:@selector(setupStreamLogging)]) { - [self performSelector:@selector(setupStreamLogging)]; - } - - [request_ setHTTPBodyStream:postStream_]; - } - } - - // We authorize after setting up the http method and body in the request - // because OAuth 1 may need to sign the request body - if (mayAuthorize && authorizer_) { - BOOL isAuthorized = [authorizer_ isAuthorizedRequest:request_]; - if (!isAuthorized) { - // authorization needed - return [self authorizeRequest]; - } - } - - [fetchHistory_ updateRequest:request_ isHTTPGet:isEffectiveHTTPGet]; - - // set the default upload or download retry interval, if necessary - if (isRetryEnabled_ - && maxRetryInterval_ <= kUnsetMaxRetryInterval) { - if (isEffectiveHTTPGet || [effectiveHTTPMethod isEqual:@"HEAD"]) { - [self setMaxRetryInterval:kDefaultMaxDownloadRetryInterval]; - } else { - [self setMaxRetryInterval:kDefaultMaxUploadRetryInterval]; - } - } - - [self addCookiesToRequest:request_]; - - if (downloadPath_ != nil) { - // downloading to a path, so create a temporary file and a file handle for - // downloading - NSString *tempPath = [self createTempDownloadFilePathForPath:downloadPath_]; - - BOOL didCreate = [[NSData data] writeToFile:tempPath - options:0 - error:&error]; - if (!didCreate) goto CannotBeginFetch; - - [self setTemporaryDownloadPath:tempPath]; - - NSFileHandle *fh = [NSFileHandle fileHandleForWritingAtPath:tempPath]; - if (fh == nil) goto CannotBeginFetch; - - [self setDownloadFileHandle:fh]; - } - - // finally, start the connection - - Class connectionClass = [[self class] connectionClass]; - - NSOperationQueue *delegateQueue = delegateQueue_; - if (delegateQueue && - ![connectionClass instancesRespondToSelector:@selector(setDelegateQueue:)]) { - // NSURLConnection has no setDelegateQueue: on iOS 4 and Mac OS X 10.5. - delegateQueue = nil; - self.delegateQueue = nil; - } else if (delegateQueue == nil && runLoopModes_ == nil && ![NSThread isMainThread]) { - // Neither a delegate queue nor runLoopModes were supplied, and we're not on the - // main thread, so assume the user really wants callbacks and provide a queue. - // - // We don't have a way to verify that this thread has a run loop spinning, but - // it's fairly rare that a background thread does have one. A client that - // does want to rely on spinning a run loop should specify run loop modes. - delegateQueue = [NSOperationQueue mainQueue]; - self.delegateQueue = delegateQueue; - } - -#if DEBUG && TARGET_OS_IPHONE - BOOL isPreIOS6 = (NSFoundationVersionNumber <= 890.1); - if (isPreIOS6 && delegateQueue) { - NSLog(@"GTMHTTPFetcher delegateQueue not safe in iOS 5"); - } -#endif - - if (downloadFileHandle_ != nil) { - // Downloading to a file, so downloadedData_ remains nil. - } else { - self.downloadedData = [NSMutableData data]; - } - - hasConnectionEnded_ = NO; - if ([runLoopModes_ count] == 0 && delegateQueue == nil) { - // No custom callback modes or queue were specified, so start the connection - // on the current run loop in the current mode - connection_ = [[connectionClass connectionWithRequest:request_ - delegate:self] retain]; - } else { - // Specify callbacks be on an operation queue or on the current run loop - // in the specified modes - connection_ = [[connectionClass alloc] initWithRequest:request_ - delegate:self - startImmediately:NO]; - if (delegateQueue) { - [connection_ performSelector:@selector(setDelegateQueue:) - withObject:delegateQueue]; - } else if (runLoopModes_) { - NSRunLoop *rl = [NSRunLoop currentRunLoop]; - for (NSString *mode in runLoopModes_) { - [connection_ scheduleInRunLoop:rl forMode:mode]; - } - } - [connection_ start]; - } - - if (!connection_) { - NSAssert(connection_ != nil, @"beginFetchWithDelegate could not create a connection"); - self.downloadedData = nil; - goto CannotBeginFetch; - } - -#if GTM_BACKGROUND_FETCHING - backgroundTaskIdentifer_ = 0; // UIBackgroundTaskInvalid is 0 on iOS 4 - if (shouldFetchInBackground_) { - // For iOS 3 compatibility, ensure that UIApp supports backgrounding - UIApplication *app = [UIApplication sharedApplication]; - if ([app respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) { - // Tell UIApplication that we want to continue even when the app is in the - // background. - NSThread *thread = delegateQueue_ ? nil : [NSThread currentThread]; - backgroundTaskIdentifer_ = [app beginBackgroundTaskWithExpirationHandler:^{ - // Background task expiration callback - this block is always invoked by - // UIApplication on the main thread. - if (thread) { - // Run the user's callbacks on the thread used to start the - // fetch. - [self performSelector:@selector(backgroundFetchExpired) - onThread:thread - withObject:nil - waitUntilDone:YES]; - } else { - // backgroundFetchExpired invokes callbacks on the provided delegate - // queue. - [self backgroundFetchExpired]; - } - }]; - } - } -#endif - - if (!initialRequestDate_) { - initialRequestDate_ = [[NSDate alloc] init]; - } - -#if DEBUG - // For testing only, look for a property indicating the fetch should immediately fail. - if ([self propertyForKey:@"_CannotBeginFetch"] != nil) { - goto CannotBeginFetch; - } -#endif - - // Once connection_ is non-nil we can send the start notification - isStopNotificationNeeded_ = YES; - NSNotificationCenter *defaultNC = [NSNotificationCenter defaultCenter]; - [defaultNC postNotificationName:kGTMHTTPFetcherStartedNotification - object:self]; - return YES; - -CannotBeginFetch: - [self failToBeginFetchDeferWithError:error]; - return NO; -} - -- (void)failToBeginFetchDeferWithError:(NSError *)error { - if (delegateQueue_) { - // Deferring will happen by the callback being invoked on the specified - // queue. - [self failToBeginFetchWithError:error]; - } else { - // No delegate queue has been specified, so put the callback - // on an appropriate run loop. - NSArray *modes = (runLoopModes_ ? runLoopModes_ : - [NSArray arrayWithObject:NSRunLoopCommonModes]); - [self performSelector:@selector(failToBeginFetchWithError:) - onThread:[NSThread currentThread] - withObject:error - waitUntilDone:NO - modes:modes]; - } -} - -- (void)failToBeginFetchWithError:(NSError *)error { - if (error == nil) { - error = [NSError errorWithDomain:kGTMHTTPFetcherErrorDomain - code:kGTMHTTPFetcherErrorDownloadFailed - userInfo:nil]; - } - - [[self retain] autorelease]; // In case the callback releases us - - [self invokeFetchCallbacksOnDelegateQueueWithData:nil - error:error]; - - [self releaseCallbacks]; - - [service_ fetcherDidStop:self]; - - self.authorizer = nil; - - if (temporaryDownloadPath_) { - [[NSFileManager defaultManager] removeItemAtPath:temporaryDownloadPath_ - error:NULL]; - self.temporaryDownloadPath = nil; - } -} - -#if GTM_BACKGROUND_FETCHING -- (void)backgroundFetchExpired { - // On background expiration, we stop the fetch and invoke the callbacks - NSError *error = [NSError errorWithDomain:kGTMHTTPFetcherErrorDomain - code:kGTMHTTPFetcherErrorBackgroundExpiration - userInfo:nil]; - [self invokeFetchCallbacksOnDelegateQueueWithData:nil - error:error]; - @synchronized(self) { - // Stopping the fetch here will indirectly call endBackgroundTask - [self stopFetchReleasingCallbacks:NO]; - - [self releaseCallbacks]; - self.authorizer = nil; - } -} - -- (void)endBackgroundTask { - @synchronized(self) { - // Whenever the connection stops or background execution expires, - // we need to tell UIApplication we're done - if (backgroundTaskIdentifer_) { - // If backgroundTaskIdentifer_ is non-zero, we know we're on iOS 4 - UIApplication *app = [UIApplication sharedApplication]; - [app endBackgroundTask:backgroundTaskIdentifer_]; - - backgroundTaskIdentifer_ = 0; - } - } -} -#endif // GTM_BACKGROUND_FETCHING - -- (BOOL)authorizeRequest { - id authorizer = self.authorizer; - SEL asyncAuthSel = @selector(authorizeRequest:delegate:didFinishSelector:); - if ([authorizer respondsToSelector:asyncAuthSel]) { - SEL callbackSel = @selector(authorizer:request:finishedWithError:); - [authorizer authorizeRequest:request_ - delegate:self - didFinishSelector:callbackSel]; - return YES; - } else { - NSAssert(authorizer == nil, @"invalid authorizer for fetch"); - - // No authorizing possible, and authorizing happens only after any delay; - // just begin fetching - return [self beginFetchMayDelay:NO - mayAuthorize:NO]; - } -} - -- (void)authorizer:(id )auth - request:(NSMutableURLRequest *)request - finishedWithError:(NSError *)error { - if (error != nil) { - // We can't fetch without authorization - [self failToBeginFetchDeferWithError:error]; - } else { - [self beginFetchMayDelay:NO - mayAuthorize:NO]; - } -} - -#if NS_BLOCKS_AVAILABLE -- (BOOL)beginFetchWithCompletionHandler:(void (^)(NSData *data, NSError *error))handler { - self.completionBlock = handler; - - // The user may have called setDelegate: earlier if they want to use other - // delegate-style callbacks during the fetch; otherwise, the delegate is nil, - // which is fine. - return [self beginFetchWithDelegate:[self delegate] - didFinishSelector:nil]; -} -#endif - -- (NSString *)createTempDownloadFilePathForPath:(NSString *)targetPath { - NSString *tempDir = nil; - -#if (!TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)) - // Find an appropriate directory for the download, ideally on the same disk - // as the final target location so the temporary file won't have to be moved - // to a different disk. - // - // Available in SDKs for 10.6 and iOS 4 - // - // Oct 2011: We previously also used URLForDirectory for - // (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 40000)) - // but that is returning a non-temporary directory for iOS, unfortunately - - SEL sel = @selector(URLForDirectory:inDomain:appropriateForURL:create:error:); - if ([NSFileManager instancesRespondToSelector:sel]) { - NSError *error = nil; - NSURL *targetURL = [NSURL fileURLWithPath:targetPath]; - NSFileManager *fileMgr = [NSFileManager defaultManager]; - - NSURL *tempDirURL = [fileMgr URLForDirectory:NSItemReplacementDirectory - inDomain:NSUserDomainMask - appropriateForURL:targetURL - create:YES - error:&error]; - tempDir = [tempDirURL path]; - } -#endif - - if (tempDir == nil) { - tempDir = NSTemporaryDirectory(); - } - - static unsigned int counter = 0; - NSString *name = [NSString stringWithFormat:@"gtmhttpfetcher_%u_%u", - ++counter, (unsigned int) arc4random()]; - NSString *result = [tempDir stringByAppendingPathComponent:name]; - return result; -} - -- (void)addCookiesToRequest:(NSMutableURLRequest *)request { - // Get cookies for this URL from our storage array, if - // we have a storage array - if (cookieStorageMethod_ != kGTMHTTPFetcherCookieStorageMethodSystemDefault - && cookieStorageMethod_ != kGTMHTTPFetcherCookieStorageMethodNone) { - - NSArray *cookies = [cookieStorage_ cookiesForURL:[request URL]]; - if ([cookies count] > 0) { - - NSDictionary *headerFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies]; - NSString *cookieHeader = [headerFields objectForKey:@"Cookie"]; // key used in header dictionary - if (cookieHeader) { - [request addValue:cookieHeader forHTTPHeaderField:@"Cookie"]; // header name - } - } - } -} - -// Returns YES if this is in the process of fetching a URL, or waiting to -// retry, or waiting for authorization, or waiting to be issued by the -// service object -- (BOOL)isFetching { - if (connection_ != nil || retryTimer_ != nil) return YES; - - BOOL isAuthorizing = [authorizer_ isAuthorizingRequest:request_]; - if (isAuthorizing) return YES; - - BOOL isDelayed = [service_ isDelayingFetcher:self]; - return isDelayed; -} - -// Returns the status code set in connection:didReceiveResponse: -- (NSInteger)statusCode { - - NSInteger statusCode; - - if (response_ != nil - && [response_ respondsToSelector:@selector(statusCode)]) { - - statusCode = [(NSHTTPURLResponse *)response_ statusCode]; - } else { - // Default to zero, in hopes of hinting "Unknown" (we can't be - // sure that things are OK enough to use 200). - statusCode = 0; - } - return statusCode; -} - -- (NSDictionary *)responseHeaders { - if (response_ != nil - && [response_ respondsToSelector:@selector(allHeaderFields)]) { - - NSDictionary *headers = [(NSHTTPURLResponse *)response_ allHeaderFields]; - return headers; - } - return nil; -} - -- (void)releaseCallbacks { - [delegate_ autorelease]; - delegate_ = nil; - - [delegateQueue_ autorelease]; - delegateQueue_ = nil; - -#if NS_BLOCKS_AVAILABLE - self.completionBlock = nil; - self.sentDataBlock = nil; - self.receivedDataBlock = nil; - self.retryBlock = nil; -#endif -} - -// Cancel the fetch of the URL that's currently in progress. -- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks { - id service; - - // if the connection or the retry timer is all that's retaining the fetcher, - // we want to be sure this instance survives stopping at least long enough for - // the stack to unwind - [[self retain] autorelease]; - - [self destroyRetryTimer]; - - @synchronized(self) { - service = [[service_ retain] autorelease]; - - if (connection_) { - // in case cancelling the connection calls this recursively, we want - // to ensure that we'll only release the connection and delegate once, - // so first set connection_ to nil - NSURLConnection* oldConnection = connection_; - connection_ = nil; - - if (!hasConnectionEnded_) { - [oldConnection cancel]; - } - - // this may be called in a callback from the connection, so use autorelease - [oldConnection autorelease]; - } - } // @synchronized(self) - - // send the stopped notification - [self sendStopNotificationIfNeeded]; - - @synchronized(self) { - [authorizer_ stopAuthorizationForRequest:request_]; - - if (shouldReleaseCallbacks) { - [self releaseCallbacks]; - - self.authorizer = nil; - } - - if (temporaryDownloadPath_) { - [[NSFileManager defaultManager] removeItemAtPath:temporaryDownloadPath_ - error:NULL]; - self.temporaryDownloadPath = nil; - } - } // @synchronized(self) - - [service fetcherDidStop:self]; - -#if GTM_BACKGROUND_FETCHING - [self endBackgroundTask]; -#endif -} - -// External stop method -- (void)stopFetching { - [self stopFetchReleasingCallbacks:YES]; -} - -- (void)sendStopNotificationIfNeeded { - BOOL sendNow = NO; - @synchronized(self) { - if (isStopNotificationNeeded_) { - isStopNotificationNeeded_ = NO; - sendNow = YES; - } - } - - if (sendNow) { - NSNotificationCenter *defaultNC = [NSNotificationCenter defaultCenter]; - [defaultNC postNotificationName:kGTMHTTPFetcherStoppedNotification - object:self]; - } -} - -- (void)retryFetch { - [self stopFetchReleasingCallbacks:NO]; - - [self beginFetchWithDelegate:delegate_ - didFinishSelector:finishedSel_]; -} - -- (void)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { - NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; - - // Loop until the callbacks have been called and released, and until - // the connection is no longer pending, or until the timeout has expired - BOOL isMainThread = [NSThread isMainThread]; - - while ((!hasConnectionEnded_ -#if NS_BLOCKS_AVAILABLE - || completionBlock_ != nil -#endif - || delegate_ != nil) - && [giveUpDate timeIntervalSinceNow] > 0) { - - // Run the current run loop 1/1000 of a second to give the networking - // code a chance to work - if (isMainThread || delegateQueue_ == nil) { - NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:0.001]; - [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; - } else { - [NSThread sleepForTimeInterval:0.001]; - } - } -} - -#pragma mark NSURLConnection Delegate Methods - -// -// NSURLConnection Delegate Methods -// - -// This method just says "follow all redirects", which _should_ be the default behavior, -// According to file:///Developer/ADC%20Reference%20Library/documentation/Cocoa/Conceptual/URLLoadingSystem -// but the redirects were not being followed until I added this method. May be -// a bug in the NSURLConnection code, or the documentation. -// -// In OS X 10.4.8 and earlier, the redirect request doesn't -// get the original's headers and body. This causes POSTs to fail. -// So we construct a new request, a copy of the original, with overrides from the -// redirect. -// -// Docs say that if redirectResponse is nil, just return the redirectRequest. - -- (NSURLRequest *)connection:(NSURLConnection *)connection - willSendRequest:(NSURLRequest *)redirectRequest - redirectResponse:(NSURLResponse *)redirectResponse { - @synchronized(self) { - if (redirectRequest && redirectResponse) { - // save cookies from the response - [self handleCookiesForResponse:redirectResponse]; - - NSMutableURLRequest *newRequest = [[request_ mutableCopy] autorelease]; - // copy the URL - NSURL *redirectURL = [redirectRequest URL]; - NSURL *url = [newRequest URL]; - - // disallow scheme changes (say, from https to http) - NSString *redirectScheme = [url scheme]; - NSString *newScheme = [redirectURL scheme]; - NSString *newResourceSpecifier = [redirectURL resourceSpecifier]; - - if ([redirectScheme caseInsensitiveCompare:@"http"] == NSOrderedSame - && newScheme != nil - && [newScheme caseInsensitiveCompare:@"https"] == NSOrderedSame) { - - // allow the change from http to https - redirectScheme = newScheme; - } - - NSString *newUrlString = [NSString stringWithFormat:@"%@:%@", - redirectScheme, newResourceSpecifier]; - - NSURL *newURL = [NSURL URLWithString:newUrlString]; - [newRequest setURL:newURL]; - - // any headers in the redirect override headers in the original. - NSDictionary *redirectHeaders = [redirectRequest allHTTPHeaderFields]; - for (NSString *key in redirectHeaders) { - NSString *value = [redirectHeaders objectForKey:key]; - [newRequest setValue:value forHTTPHeaderField:key]; - } - - [self addCookiesToRequest:newRequest]; - - redirectRequest = newRequest; - - // log the response we just received - [self setResponse:redirectResponse]; - [self logNowWithError:nil]; - - // update the request for future logging - NSMutableURLRequest *mutable = [[redirectRequest mutableCopy] autorelease]; - [self setMutableRequest:mutable]; - } - return redirectRequest; - } // @synchronized(self) -} - -- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { - @synchronized(self) { - // This method is called when the server has determined that it - // has enough information to create the NSURLResponse - // it can be called multiple times, for example in the case of a - // redirect, so each time we reset the data. - [downloadedData_ setLength:0]; - [downloadFileHandle_ truncateFileAtOffset:0]; - downloadedLength_ = 0; - - [self setResponse:response]; - - // Save cookies from the response - [self handleCookiesForResponse:response]; - } -} - - -// handleCookiesForResponse: handles storage of cookies for responses passed to -// connection:willSendRequest:redirectResponse: and connection:didReceiveResponse: -- (void)handleCookiesForResponse:(NSURLResponse *)response { - - if (cookieStorageMethod_ == kGTMHTTPFetcherCookieStorageMethodSystemDefault - || cookieStorageMethod_ == kGTMHTTPFetcherCookieStorageMethodNone) { - - // do nothing special for NSURLConnection's default storage mechanism - // or when we're ignoring cookies - - } else if ([response respondsToSelector:@selector(allHeaderFields)]) { - - // grab the cookies from the header as NSHTTPCookies and store them either - // into our static array or into the fetchHistory - - NSDictionary *responseHeaderFields = [(NSHTTPURLResponse *)response allHeaderFields]; - if (responseHeaderFields) { - - NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:responseHeaderFields - forURL:[response URL]]; - if ([cookies count] > 0) { - [cookieStorage_ setCookies:cookies]; - } - } - } -} - --(void)connection:(NSURLConnection *)connection -didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { - @synchronized(self) { - if ([challenge previousFailureCount] <= 2) { - - NSURLCredential *credential = credential_; - - if ([[challenge protectionSpace] isProxy] && proxyCredential_ != nil) { - credential = proxyCredential_; - } - - // Here, if credential is still nil, then we *could* try to get it from - // NSURLCredentialStorage's defaultCredentialForProtectionSpace:. - // We don't, because we're assuming: - // - // - for server credentials, we only want ones supplied by the program - // calling http fetcher - // - for proxy credentials, if one were necessary and available in the - // keychain, it would've been found automatically by NSURLConnection - // and this challenge delegate method never would've been called - // anyway - - if (credential) { - // try the credential - [[challenge sender] useCredential:credential - forAuthenticationChallenge:challenge]; - return; - } - } // @synchronized(self) - - // If we don't have credentials, or we've already failed auth 3x, - // report the error, putting the challenge as a value in the userInfo - // dictionary. -#if DEBUG - NSAssert(!isCancellingChallenge_, @"isCancellingChallenge_ unexpected"); -#endif - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:challenge - forKey:kGTMHTTPFetcherErrorChallengeKey]; - NSError *error = [NSError errorWithDomain:kGTMHTTPFetcherErrorDomain - code:kGTMHTTPFetcherErrorAuthenticationChallengeFailed - userInfo:userInfo]; - - // cancelAuthenticationChallenge seems to indirectly call - // connection:didFailWithError: now, though that isn't documented - // - // We'll use an ivar to make the indirect invocation of the - // delegate method do nothing. - isCancellingChallenge_ = YES; - [[challenge sender] cancelAuthenticationChallenge:challenge]; - isCancellingChallenge_ = NO; - - [self connection:connection didFailWithError:error]; - } -} - -- (void)invokeFetchCallbacksWithData:(NSData *)data - error:(NSError *)error { - // To avoid deadlocks, this should not be called inside of @synchronized(self) - id target; - SEL sel; -#if NS_BLOCKS_AVAILABLE - void (^block)(NSData *, NSError *); -#else - id block = nil; -#endif - - // If -stopFetching is called in another thread directly after this @synchronized stanza finishes - // on this thread, then target and block could be released before being used in this method. So - // retain each until this method is done with them. - @synchronized(self) { - target = [[delegate_ retain] autorelease]; - sel = finishedSel_; -#if NS_BLOCKS_AVAILABLE - block = [[completionBlock_ retain] autorelease]; -#endif - } - [self invokeFetchCallbacksWithTarget:target - selector:sel - block:block - data:data - error:error]; -} - -- (void)invokeFetchCallbacksWithTarget:(id)target - selector:(SEL)sel - block:(id)block - data:(NSData *)data - error:(NSError *)error { - [[self retain] autorelease]; // In case the callback releases us - - [self invokeFetchCallback:sel - target:target - data:data - error:error]; - -#if NS_BLOCKS_AVAILABLE - if (block) { - ((void (^)(NSData *, NSError *))block)(data, error); - } -#endif -} - -- (void)invokeFetchCallback:(SEL)sel - target:(id)target - data:(NSData *)data - error:(NSError *)error { - // This method is available to subclasses which may provide a customized - // target pointer. - if (target && sel) { - NSMethodSignature *sig = [target methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:target]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&data atIndex:3]; - [invocation setArgument:&error atIndex:4]; - [invocation invoke]; - } -} - -- (void)invokeFetchCallbacksOnDelegateQueueWithData:(NSData *)data - error:(NSError *)error { - // This is called by methods that are not already on the delegateQueue - // (as NSURLConnection callbacks should already be, but other failures - // are not.) - if (!delegateQueue_) { - [self invokeFetchCallbacksWithData:data error:error]; - } - - // Values may be nil. - NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:2]; - [dict setValue:data forKey:kCallbackData]; - [dict setValue:error forKey:kCallbackError]; - - // If -stopFetching is called in another thread directly after this @synchronized stanza finishes - // on this thread, then target and block could be released before being used in this method. So - // retain each until this method is done with them. - @synchronized(self) { - id target = delegate_; - NSString *sel = finishedSel_ ? NSStringFromSelector(finishedSel_) : nil; -#if NS_BLOCKS_AVAILABLE - void (^block)(NSData *, NSError *) = completionBlock_; -#else - id block = nil; -#endif - [dict setValue:target forKey:kCallbackTarget]; - [dict setValue:sel forKey:kCallbackSelector]; - [dict setValue:block forKey:kCallbackBlock]; - } - - NSInvocationOperation *op = - [[[NSInvocationOperation alloc] initWithTarget:self - selector:@selector(invokeOnQueueWithDictionary:) - object:dict] autorelease]; - [delegateQueue_ addOperation:op]; -} - -- (void)invokeOnQueueWithDictionary:(NSDictionary *)dict { - id target = [dict objectForKey:kCallbackTarget]; - NSString *selStr = [dict objectForKey:kCallbackSelector]; - SEL sel = selStr ? NSSelectorFromString(selStr) : NULL; - id block = [dict objectForKey:kCallbackBlock]; - - NSData *data = [dict objectForKey:kCallbackData]; - NSError *error = [dict objectForKey:kCallbackError]; - - [self invokeFetchCallbacksWithTarget:target - selector:sel - block:block - data:data - error:error]; -} - -- (void)invokeSentDataCallback:(SEL)sel - target:(id)target - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten - totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { - if (target && sel) { - NSMethodSignature *sig = [target methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:target]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&bytesWritten atIndex:3]; - [invocation setArgument:&totalBytesWritten atIndex:4]; - [invocation setArgument:&totalBytesExpectedToWrite atIndex:5]; - [invocation invoke]; - } -} - -- (BOOL)invokeRetryCallback:(SEL)sel - target:(id)target - willRetry:(BOOL)willRetry - error:(NSError *)error { - if (target && sel) { - NSMethodSignature *sig = [target methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:target]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&willRetry atIndex:3]; - [invocation setArgument:&error atIndex:4]; - [invocation invoke]; - - [invocation getReturnValue:&willRetry]; - } - return willRetry; -} - -- (void)connection:(NSURLConnection *)connection - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten -totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { - @synchronized(self) { - SEL sel = [self sentDataSelector]; - [self invokeSentDataCallback:sel - target:delegate_ - didSendBodyData:bytesWritten - totalBytesWritten:totalBytesWritten - totalBytesExpectedToWrite:totalBytesExpectedToWrite]; - -#if NS_BLOCKS_AVAILABLE - if (sentDataBlock_) { - sentDataBlock_(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); - } -#endif - } -} - -- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { - @synchronized(self) { -#if DEBUG - NSAssert(!hasConnectionEnded_, @"Connection received data after ending"); - - // The download file handle should be set or the data object allocated - // before the fetch is started. - NSAssert((downloadFileHandle_ == nil) != (downloadedData_ == nil), - @"received data accumulates as either NSData (%d) or" - @" NSFileHandle (%d)", - (downloadedData_ != nil), (downloadFileHandle_ != nil)); -#endif - // Hopefully, we'll never see this execute out-of-order, receiving data - // after we've received the finished or failed callback. - if (hasConnectionEnded_) return; - - if (downloadFileHandle_ != nil) { - // Append to file - @try { - [downloadFileHandle_ writeData:data]; - - downloadedLength_ = [downloadFileHandle_ offsetInFile]; - } - @catch (NSException *exc) { - // Couldn't write to file, probably due to a full disk - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[exc reason] - forKey:NSLocalizedDescriptionKey]; - NSError *error = [NSError errorWithDomain:kGTMHTTPFetcherStatusDomain - code:kGTMHTTPFetcherErrorFileHandleException - userInfo:userInfo]; - [self connection:connection didFailWithError:error]; - return; - } - } else { - // append to mutable data - [downloadedData_ appendData:data]; - - downloadedLength_ = [downloadedData_ length]; - } - - if (receivedDataSel_) { - [delegate_ performSelector:receivedDataSel_ - withObject:self - withObject:downloadedData_]; - } - -#if NS_BLOCKS_AVAILABLE - if (receivedDataBlock_) { - receivedDataBlock_(downloadedData_); - } -#endif - } // @synchronized(self) -} - -// For error 304's ("Not Modified") where we've cached the data, return -// status 200 ("OK") to the caller (but leave the fetcher status as 304) -// and copy the cached data. -// -// For other errors or if there's no cached data, just return the actual status. -- (NSData *)cachedDataForStatus { - if ([self statusCode] == kGTMHTTPFetcherStatusNotModified - && [fetchHistory_ shouldCacheETaggedData]) { - NSData *cachedData = [fetchHistory_ cachedDataForRequest:request_]; - return cachedData; - } - return nil; -} - -- (NSInteger)statusAfterHandlingNotModifiedError { - NSInteger status = [self statusCode]; - NSData *cachedData = [self cachedDataForStatus]; - if (cachedData) { - // Forge the status to pass on to the delegate - status = 200; - - // Copy our stored data - if (downloadFileHandle_ != nil) { - @try { - // Downloading to a file handle won't save to the cache (the data is - // likely inappropriately large for caching), but will still read from - // the cache, on the unlikely chance that the response was Not Modified - // and the URL response was indeed present in the cache. - [downloadFileHandle_ truncateFileAtOffset:0]; - [downloadFileHandle_ writeData:cachedData]; - downloadedLength_ = [downloadFileHandle_ offsetInFile]; - } - @catch (NSException *) { - // Failed to write data, likely due to lack of disk space - status = kGTMHTTPFetcherErrorFileHandleException; - } - } else { - [downloadedData_ setData:cachedData]; - downloadedLength_ = [cachedData length]; - } - } - return status; -} - -- (void)connectionDidFinishLoading:(NSURLConnection *)connection { - BOOL shouldStopFetching = YES; - BOOL shouldSendStopNotification = NO; - NSError *error = nil; - NSData *downloadedData; -#if !STRIP_GTM_FETCH_LOGGING - BOOL shouldDeferLogging = NO; -#endif - BOOL shouldBeginRetryTimer = NO; - - @synchronized(self) { - // We no longer need to cancel the connection - hasConnectionEnded_ = YES; - - // Skip caching ETagged results when the data is being saved to a file - if (downloadFileHandle_ == nil) { - [fetchHistory_ updateFetchHistoryWithRequest:request_ - response:response_ - downloadedData:downloadedData_]; - } else { - [fetchHistory_ removeCachedDataForRequest:request_]; - } - - [[self retain] autorelease]; // in case the callback releases us - - NSInteger status = [self statusCode]; - if ([self cachedDataForStatus] != nil) { -#if !STRIP_GTM_FETCH_LOGGING - // Log the pre-cache response. - [self logNowWithError:nil]; - hasLoggedError_ = YES; -#endif - status = [self statusAfterHandlingNotModifiedError]; - } - - shouldSendStopNotification = YES; - - if (status >= 0 && status < 300) { - // success - if (downloadPath_) { - // Avoid deleting the downloaded file when the fetch stops - [downloadFileHandle_ closeFile]; - self.downloadFileHandle = nil; - - NSFileManager *fileMgr = [NSFileManager defaultManager]; - [fileMgr removeItemAtPath:downloadPath_ - error:NULL]; - - if ([fileMgr moveItemAtPath:temporaryDownloadPath_ - toPath:downloadPath_ - error:&error]) { - self.temporaryDownloadPath = nil; - } - } - } else { - // unsuccessful -#if !STRIP_GTM_FETCH_LOGGING - if (!hasLoggedError_) { - [self logNowWithError:nil]; - hasLoggedError_ = YES; - } -#endif - // Status over 300; retry or notify the delegate of failure - if ([self shouldRetryNowForStatus:status error:nil]) { - // retrying - shouldBeginRetryTimer = YES; - shouldStopFetching = NO; - } else { - NSDictionary *userInfo = nil; - if ([downloadedData_ length] > 0) { - userInfo = [NSDictionary dictionaryWithObject:downloadedData_ - forKey:kGTMHTTPFetcherStatusDataKey]; - } - error = [NSError errorWithDomain:kGTMHTTPFetcherStatusDomain - code:status - userInfo:userInfo]; - } - } - downloadedData = downloadedData_; -#if !STRIP_GTM_FETCH_LOGGING - shouldDeferLogging = shouldDeferResponseBodyLogging_; -#endif - } // @synchronized(self) - - if (shouldBeginRetryTimer) { - [self beginRetryTimer]; - } - - if (shouldSendStopNotification) { - // We want to send the stop notification before calling the delegate's - // callback selector, since the callback selector may release all of - // the fetcher properties that the client is using to track the fetches. - // - // We'll also stop now so that, to any observers watching the notifications, - // it doesn't look like our wait for a retry (which may be long, - // 30 seconds or more) is part of the network activity. - [self sendStopNotificationIfNeeded]; - } - - if (shouldStopFetching) { - // Call the callbacks (outside of the @synchronized to avoid deadlocks.) - [self invokeFetchCallbacksWithData:downloadedData - error:error]; - BOOL shouldRelease = [self shouldReleaseCallbacksUponCompletion]; - [self stopFetchReleasingCallbacks:shouldRelease]; - } - -#if !STRIP_GTM_FETCH_LOGGING - @synchronized(self) { - if (!shouldDeferLogging && !hasLoggedError_) { - [self logNowWithError:nil]; - } - } -#endif -} - -- (BOOL)shouldReleaseCallbacksUponCompletion { - // A subclass can override this to keep callbacks around after the - // connection has finished successfully - return YES; -} - -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { - @synchronized(self) { - // Prevent the failure callback from being called twice, since the stopFetch - // call below (either the explicit one at the end of this method, or the - // implicit one when the retry occurs) will release the delegate. - if (connection_ == nil) return; - - // If this method was invoked indirectly by cancellation of an authentication - // challenge, defer this until it is called again with the proper error object - if (isCancellingChallenge_) return; - - // We no longer need to cancel the connection - hasConnectionEnded_ = YES; - - [self logNowWithError:error]; - } - - // See comment about sendStopNotificationIfNeeded - // in connectionDidFinishLoading: - [self sendStopNotificationIfNeeded]; - - if ([self shouldRetryNowForStatus:0 error:error]) { - [self beginRetryTimer]; - } else { - [[self retain] autorelease]; // in case the callback releases us - - [self invokeFetchCallbacksWithData:nil - error:error]; - - [self stopFetchReleasingCallbacks:YES]; - } -} - -- (void)logNowWithError:(NSError *)error { - // If the logging category is available, then log the current request, - // response, data, and error - if ([self respondsToSelector:@selector(logFetchWithError:)]) { - [self performSelector:@selector(logFetchWithError:) withObject:error]; - } -} - -#pragma mark Retries - -- (BOOL)isRetryError:(NSError *)error { - - struct retryRecord { - NSString *const domain; - int code; - }; - - struct retryRecord retries[] = { - { kGTMHTTPFetcherStatusDomain, 408 }, // request timeout - { kGTMHTTPFetcherStatusDomain, 503 }, // service unavailable - { kGTMHTTPFetcherStatusDomain, 504 }, // request timeout - { NSURLErrorDomain, NSURLErrorTimedOut }, - { NSURLErrorDomain, NSURLErrorNetworkConnectionLost }, - { nil, 0 } - }; - - // NSError's isEqual always returns false for equal but distinct instances - // of NSError, so we have to compare the domain and code values explicitly - - for (int idx = 0; retries[idx].domain != nil; idx++) { - - if ([[error domain] isEqual:retries[idx].domain] - && [error code] == retries[idx].code) { - - return YES; - } - } - return NO; -} - - -// shouldRetryNowForStatus:error: returns YES if the user has enabled retries -// and the status or error is one that is suitable for retrying. "Suitable" -// means either the isRetryError:'s list contains the status or error, or the -// user's retrySelector: is present and returns YES when called, or the -// authorizer may be able to fix. -- (BOOL)shouldRetryNowForStatus:(NSInteger)status - error:(NSError *)error { - // Determine if a refreshed authorizer may avoid an authorization error - BOOL shouldRetryForAuthRefresh = NO; - BOOL isFirstAuthError = (authorizer_ != nil) - && !hasAttemptedAuthRefresh_ - && (status == kGTMHTTPFetcherStatusUnauthorized); // 401 - - if (isFirstAuthError) { - if ([authorizer_ respondsToSelector:@selector(primeForRefresh)]) { - BOOL hasPrimed = [authorizer_ primeForRefresh]; - if (hasPrimed) { - shouldRetryForAuthRefresh = YES; - hasAttemptedAuthRefresh_ = YES; - [request_ setValue:nil forHTTPHeaderField:@"Authorization"]; - } - } - } - - // Determine if we're doing exponential backoff retries - BOOL shouldDoIntervalRetry = [self isRetryEnabled] - && ([self nextRetryInterval] < [self maxRetryInterval]); - - if (shouldDoIntervalRetry) { - // If an explicit max retry interval was set, we expect repeated backoffs to take - // up to roughly twice that for repeated fast failures. If the initial attempt is - // already more than 3 times the max retry interval, then failures have taken a long time - // (such as from network timeouts) so don't retry again to avoid the app becoming - // unexpectedly unresponsive. - if (maxRetryInterval_ > kUnsetMaxRetryInterval) { - NSTimeInterval maxAllowedIntervalBeforeRetry = maxRetryInterval_ * 3; - NSTimeInterval timeSinceInitialRequest = -[initialRequestDate_ timeIntervalSinceNow]; - if (timeSinceInitialRequest > maxAllowedIntervalBeforeRetry) { - shouldDoIntervalRetry = NO; - } - } - } - - BOOL willRetry = NO; - BOOL canRetry = shouldRetryForAuthRefresh || shouldDoIntervalRetry; - if (canRetry) { - // Check if this is a retryable error - if (error == nil) { - // Make an error for the status - NSDictionary *userInfo = nil; - if ([downloadedData_ length] > 0) { - userInfo = [NSDictionary dictionaryWithObject:downloadedData_ - forKey:kGTMHTTPFetcherStatusDataKey]; - } - error = [NSError errorWithDomain:kGTMHTTPFetcherStatusDomain - code:status - userInfo:userInfo]; - } - - willRetry = shouldRetryForAuthRefresh || [self isRetryError:error]; - - // If the user has installed a retry callback, consult that - willRetry = [self invokeRetryCallback:retrySel_ - target:delegate_ - willRetry:willRetry - error:error]; -#if NS_BLOCKS_AVAILABLE - if (retryBlock_) { - willRetry = retryBlock_(willRetry, error); - } -#endif - } - return willRetry; -} - -- (void)beginRetryTimer { - @synchronized(self) { - if (delegateQueue_ != nil && ![NSThread isMainThread]) { - // A delegate queue is set, so the thread we're running on may not - // have a run loop. We'll defer creating and starting the timer - // until we're on the main thread to ensure it has a run loop. - // (If we weren't supporting 10.5, we could use dispatch_after instead - // of an NSTimer.) - [self performSelectorOnMainThread:_cmd - withObject:nil - waitUntilDone:NO]; - return; - } - } - - NSTimeInterval nextInterval = [self nextRetryInterval]; - NSTimeInterval maxInterval = [self maxRetryInterval]; - NSTimeInterval newInterval = MIN(nextInterval, maxInterval); - - [self primeRetryTimerWithNewTimeInterval:newInterval]; - - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:kGTMHTTPFetcherRetryDelayStartedNotification - object:self]; -} - -- (void)primeRetryTimerWithNewTimeInterval:(NSTimeInterval)secs { - - [self destroyRetryTimer]; - - @synchronized(self) { - lastRetryInterval_ = secs; - - retryTimer_ = [NSTimer timerWithTimeInterval:secs - target:self - selector:@selector(retryTimerFired:) - userInfo:nil - repeats:NO]; - [retryTimer_ retain]; - - NSRunLoop *timerRL = (self.delegateQueue ? - [NSRunLoop mainRunLoop] : [NSRunLoop currentRunLoop]); - [timerRL addTimer:retryTimer_ - forMode:NSDefaultRunLoopMode]; - } -} - -- (void)retryTimerFired:(NSTimer *)timer { - [self destroyRetryTimer]; - - @synchronized(self) { - retryCount_++; - - [self retryFetch]; - } -} - -- (void)destroyRetryTimer { - BOOL shouldNotify = NO; - @synchronized(self) { - if (retryTimer_) { - [retryTimer_ invalidate]; - [retryTimer_ autorelease]; - retryTimer_ = nil; - shouldNotify = YES; - } - } // @synchronized(self) - - if (shouldNotify) { - NSNotificationCenter *defaultNC = [NSNotificationCenter defaultCenter]; - [defaultNC postNotificationName:kGTMHTTPFetcherRetryDelayStoppedNotification - object:self]; - } -} - -- (NSUInteger)retryCount { - return retryCount_; -} - -- (NSTimeInterval)nextRetryInterval { - // The next wait interval is the factor (2.0) times the last interval, - // but never less than the minimum interval. - NSTimeInterval secs = lastRetryInterval_ * retryFactor_; - secs = MIN(secs, maxRetryInterval_); - secs = MAX(secs, minRetryInterval_); - - return secs; -} - -- (BOOL)isRetryEnabled { - return isRetryEnabled_; -} - -- (void)setRetryEnabled:(BOOL)flag { - - if (flag && !isRetryEnabled_) { - // We defer initializing these until the user calls setRetryEnabled - // to avoid using the random number generator if it's not needed. - // However, this means min and max intervals for this fetcher are reset - // as a side effect of calling setRetryEnabled. - // - // Make an initial retry interval random between 1.0 and 2.0 seconds - [self setMinRetryInterval:0.0]; - [self setMaxRetryInterval:kUnsetMaxRetryInterval]; - [self setRetryFactor:2.0]; - lastRetryInterval_ = 0.0; - } - isRetryEnabled_ = flag; -}; - -- (NSTimeInterval)maxRetryInterval { - return maxRetryInterval_; -} - -- (void)setMaxRetryInterval:(NSTimeInterval)secs { - if (secs > 0) { - maxRetryInterval_ = secs; - } else { - maxRetryInterval_ = kUnsetMaxRetryInterval; - } -} - -- (double)minRetryInterval { - return minRetryInterval_; -} - -- (void)setMinRetryInterval:(NSTimeInterval)secs { - if (secs > 0) { - minRetryInterval_ = secs; - } else { - // Set min interval to a random value between 1.0 and 2.0 seconds - // so that if multiple clients start retrying at the same time, they'll - // repeat at different times and avoid overloading the server - minRetryInterval_ = 1.0 + ((double)(arc4random() & 0x0FFFF) / (double) 0x0FFFF); - } -} - -#pragma mark Getters and Setters - -@dynamic cookieStorageMethod, - retryEnabled, - maxRetryInterval, - minRetryInterval, - retryCount, - nextRetryInterval, - statusCode, - responseHeaders, - fetchHistory, - userData, - properties; - -@synthesize mutableRequest = request_, - allowedInsecureSchemes = allowedInsecureSchemes_, - allowLocalhostRequest = allowLocalhostRequest_, - credential = credential_, - proxyCredential = proxyCredential_, - postData = postData_, - postStream = postStream_, - delegate = delegate_, - authorizer = authorizer_, - service = service_, - serviceHost = serviceHost_, - servicePriority = servicePriority_, - thread = thread_, - sentDataSelector = sentDataSel_, - receivedDataSelector = receivedDataSel_, - retrySelector = retrySel_, - retryFactor = retryFactor_, - response = response_, - downloadedLength = downloadedLength_, - downloadedData = downloadedData_, - downloadPath = downloadPath_, - temporaryDownloadPath = temporaryDownloadPath_, - downloadFileHandle = downloadFileHandle_, - delegateQueue = delegateQueue_, - runLoopModes = runLoopModes_, - comment = comment_, - log = log_, - cookieStorage = cookieStorage_; - -#if NS_BLOCKS_AVAILABLE -@synthesize completionBlock = completionBlock_, - sentDataBlock = sentDataBlock_, - receivedDataBlock = receivedDataBlock_, - retryBlock = retryBlock_; -#endif - -@synthesize shouldFetchInBackground = shouldFetchInBackground_; - -- (NSInteger)cookieStorageMethod { - return cookieStorageMethod_; -} - -- (void)setCookieStorageMethod:(NSInteger)method { - - cookieStorageMethod_ = method; - - if (method == kGTMHTTPFetcherCookieStorageMethodSystemDefault) { - // System default - [request_ setHTTPShouldHandleCookies:YES]; - - // No need for a cookie storage object - self.cookieStorage = nil; - - } else { - // Not system default - [request_ setHTTPShouldHandleCookies:NO]; - - if (method == kGTMHTTPFetcherCookieStorageMethodStatic) { - // Store cookies in the static array - NSAssert(gGTMFetcherStaticCookieStorage != nil, - @"cookie storage requires GTMHTTPFetchHistory"); - - self.cookieStorage = gGTMFetcherStaticCookieStorage; - } else if (method == kGTMHTTPFetcherCookieStorageMethodFetchHistory) { - // store cookies in the fetch history - self.cookieStorage = [fetchHistory_ cookieStorage]; - } else { - // kGTMHTTPFetcherCookieStorageMethodNone - ignore cookies - self.cookieStorage = nil; - } - } -} - -+ (id )staticCookieStorage { - return gGTMFetcherStaticCookieStorage; -} - -+ (BOOL)doesSupportSentDataCallback { -#if GTM_IPHONE - // NSURLConnection's didSendBodyData: delegate support appears to be - // available starting in iPhone OS 3.0 - return (NSFoundationVersionNumber >= 678.47); -#else - // Per WebKit's MaxFoundationVersionWithoutdidSendBodyDataDelegate - // - // Indicates if NSURLConnection will invoke the didSendBodyData: delegate - // method - return (NSFoundationVersionNumber > 677.21); -#endif -} - -- (id )fetchHistory { - return fetchHistory_; -} - -- (void)setFetchHistory:(id )fetchHistory { - [fetchHistory_ autorelease]; - fetchHistory_ = [fetchHistory retain]; - - if (fetchHistory_ != nil) { - // set the fetch history's cookie array to be the cookie store - [self setCookieStorageMethod:kGTMHTTPFetcherCookieStorageMethodFetchHistory]; - - } else { - // The fetch history was removed - if (cookieStorageMethod_ == kGTMHTTPFetcherCookieStorageMethodFetchHistory) { - // Fall back to static storage - [self setCookieStorageMethod:kGTMHTTPFetcherCookieStorageMethodStatic]; - } - } -} - -- (id)userData { - @synchronized(self) { - return [[userData_ retain] autorelease]; - } -} - -- (void)setUserData:(id)theObj { - @synchronized(self) { - [userData_ autorelease]; - userData_ = [theObj retain]; - } -} - -- (void)setProperties:(NSMutableDictionary *)dict { - @synchronized(self) { - [properties_ autorelease]; - - // This copies rather than retains the parameter for compatiblity with - // an earlier version that took an immutable parameter and copied it. - properties_ = [dict mutableCopy]; - } -} - -- (NSMutableDictionary *)properties { - @synchronized(self) { - return [[properties_ retain] autorelease]; - } -} - -- (void)setProperty:(id)obj forKey:(NSString *)key { - @synchronized(self) { - if (properties_ == nil && obj != nil) { - [self setProperties:[NSMutableDictionary dictionary]]; - } - [properties_ setValue:obj forKey:key]; - } -} - -- (id)propertyForKey:(NSString *)key { - @synchronized(self) { - return [[[properties_ objectForKey:key] retain] autorelease]; - } -} - -- (void)addPropertiesFromDictionary:(NSDictionary *)dict { - @synchronized(self) { - if (properties_ == nil && dict != nil) { - [self setProperties:[[dict mutableCopy] autorelease]]; - } else { - [properties_ addEntriesFromDictionary:dict]; - } - } -} - -- (NSData *)bodyData { - return self.postData; -} - -- (void)setBodyData:(NSData *)postData { - self.postData = postData; -} - -- (void)setCommentWithFormat:(id)format, ... { -#if !STRIP_GTM_FETCH_LOGGING - NSString *result = format; - if (format) { - va_list argList; - va_start(argList, format); - - result = [[[NSString alloc] initWithFormat:format - arguments:argList] autorelease]; - va_end(argList); - } - [self setComment:result]; -#endif -} - -+ (Class)connectionClass { - if (gGTMFetcherConnectionClass == nil) { - gGTMFetcherConnectionClass = [NSURLConnection class]; - } - return gGTMFetcherConnectionClass; -} - -+ (void)setConnectionClass:(Class)theClass { - gGTMFetcherConnectionClass = theClass; -} - -#if STRIP_GTM_FETCH_LOGGING -+ (void)setLoggingEnabled:(BOOL)flag { -} -#endif // STRIP_GTM_FETCH_LOGGING - -@end - -void GTMAssertSelectorNilOrImplementedWithArgs(id obj, SEL sel, ...) { - - // Verify that the object's selector is implemented with the proper - // number and type of arguments -#if DEBUG - va_list argList; - va_start(argList, sel); - - if (obj && sel) { - // Check that the selector is implemented - if (![obj respondsToSelector:sel]) { - NSLog(@"\"%@\" selector \"%@\" is unimplemented or misnamed", - NSStringFromClass([obj class]), - NSStringFromSelector(sel)); - NSCAssert(0, @"callback selector unimplemented or misnamed"); - } else { - const char *expectedArgType; - unsigned int argCount = 2; // skip self and _cmd - NSMethodSignature *sig = [obj methodSignatureForSelector:sel]; - - // Check that each expected argument is present and of the correct type - while ((expectedArgType = va_arg(argList, const char*)) != 0) { - - if ([sig numberOfArguments] > argCount) { - const char *foundArgType = [sig getArgumentTypeAtIndex:argCount]; - - if(0 != strncmp(foundArgType, expectedArgType, strlen(expectedArgType))) { - NSLog(@"\"%@\" selector \"%@\" argument %d should be type %s", - NSStringFromClass([obj class]), - NSStringFromSelector(sel), (argCount - 2), expectedArgType); - NSCAssert(0, @"callback selector argument type mistake"); - } - } - argCount++; - } - - // Check that the proper number of arguments are present in the selector - if (argCount != [sig numberOfArguments]) { - NSLog( @"\"%@\" selector \"%@\" should have %d arguments", - NSStringFromClass([obj class]), - NSStringFromSelector(sel), (argCount - 2)); - NSCAssert(0, @"callback selector arguments incorrect"); - } - } - } - - va_end(argList); -#endif -} - -NSString *GTMCleanedUserAgentString(NSString *str) { - // Reference http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html - // and http://www-archive.mozilla.org/build/user-agent-strings.html - - if (str == nil) return nil; - - NSMutableString *result = [NSMutableString stringWithString:str]; - - // Replace spaces and commas with underscores - [result replaceOccurrencesOfString:@" " - withString:@"_" - options:0 - range:NSMakeRange(0, [result length])]; - [result replaceOccurrencesOfString:@"," - withString:@"_" - options:0 - range:NSMakeRange(0, [result length])]; - - // Delete http token separators and remaining whitespace - static NSCharacterSet *charsToDelete = nil; - if (charsToDelete == nil) { - // Make a set of unwanted characters - NSString *const kSeparators = @"()<>@;:\\\"/[]?={}"; - - NSMutableCharacterSet *mutableChars; - mutableChars = [[[NSCharacterSet whitespaceAndNewlineCharacterSet] mutableCopy] autorelease]; - [mutableChars addCharactersInString:kSeparators]; - charsToDelete = [mutableChars copy]; // hang on to an immutable copy - } - - while (1) { - NSRange separatorRange = [result rangeOfCharacterFromSet:charsToDelete]; - if (separatorRange.location == NSNotFound) break; - - [result deleteCharactersInRange:separatorRange]; - }; - - return result; -} - -NSString *GTMSystemVersionString(void) { - NSString *systemString = @""; - -#if TARGET_OS_MAC && !TARGET_OS_IPHONE - // Mac build - static NSString *savedSystemString = nil; - if (savedSystemString == nil) { - // With Gestalt inexplicably deprecated in 10.8, we're reduced to reading - // the system plist file. - NSString *const kPath = @"/System/Library/CoreServices/SystemVersion.plist"; - NSDictionary *plist = [NSDictionary dictionaryWithContentsOfFile:kPath]; - NSString *versString = [plist objectForKey:@"ProductVersion"]; - if ([versString length] == 0) { - versString = @"10.?.?"; - } - savedSystemString = [[NSString alloc] initWithFormat:@"MacOSX/%@", versString]; - } - systemString = savedSystemString; -#elif TARGET_OS_IPHONE - // Compiling against the iPhone SDK - - static NSString *savedSystemString = nil; - if (savedSystemString == nil) { - // Avoid the slowness of calling currentDevice repeatedly on the iPhone - UIDevice* currentDevice = [UIDevice currentDevice]; - - NSString *model = [currentDevice model]; - NSString *cleanedModel = GTMCleanedUserAgentString(model); - NSString *systemVersion = [currentDevice systemVersion]; - -#if TARGET_IPHONE_SIMULATOR - NSString *hardwareModel = @"sim"; -#else - NSString *hardwareModel; - struct utsname unameRecord; - if (uname(&unameRecord) == 0) { - NSString *machineName = [NSString stringWithCString:unameRecord.machine - encoding:NSUTF8StringEncoding]; - hardwareModel = GTMCleanedUserAgentString(machineName); - } else { - hardwareModel = @"unk"; - } -#endif - savedSystemString = [[NSString alloc] initWithFormat:@"%@/%@ hw/%@", - cleanedModel, systemVersion, hardwareModel]; - // Example: iPod_Touch/2.2 hw/iPod1_1 - } - systemString = savedSystemString; - -#elif (GTL_IPHONE || GDATA_IPHONE) - // Compiling iOS libraries against the Mac SDK - systemString = @"iPhone/x.x"; - -#elif defined(_SYS_UTSNAME_H) - // Foundation-only build - struct utsname unameRecord; - uname(&unameRecord); - - systemString = [NSString stringWithFormat:@"%s/%s", - unameRecord.sysname, unameRecord.release]; // "Darwin/8.11.1" -#endif - - return systemString; -} - -// Return a generic name and version for the current application; this avoids -// anonymous server transactions. -NSString *GTMApplicationIdentifier(NSBundle *bundle) { - @synchronized([GTMHTTPFetcher class]) { - static NSMutableDictionary *sAppIDMap = nil; - - // If there's a bundle ID, use that; otherwise, use the process name - if (bundle == nil) { - bundle = [NSBundle mainBundle]; - } - NSString *bundleID = [bundle bundleIdentifier]; - if (bundleID == nil) { - bundleID = @""; - } - - NSString *identifier = [sAppIDMap objectForKey:bundleID]; - if (identifier) return identifier; - - // Apps may add a string to the info.plist to uniquely identify different builds. - identifier = [bundle objectForInfoDictionaryKey:@"GTMUserAgentID"]; - if ([identifier length] == 0) { - if ([bundleID length] > 0) { - identifier = bundleID; - } else { - // Fall back on the procname, prefixed by "proc" to flag that it's - // autogenerated and perhaps unreliable - NSString *procName = [[NSProcessInfo processInfo] processName]; - identifier = [NSString stringWithFormat:@"proc_%@", procName]; - } - } - - // Clean up whitespace and special characters - identifier = GTMCleanedUserAgentString(identifier); - - // If there's a version number, append that - NSString *version = [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - if ([version length] == 0) { - version = [bundle objectForInfoDictionaryKey:@"CFBundleVersion"]; - } - - // Clean up whitespace and special characters - version = GTMCleanedUserAgentString(version); - - // Glue the two together (cleanup done above or else cleanup would strip the - // slash) - if ([version length] > 0) { - identifier = [identifier stringByAppendingFormat:@"/%@", version]; - } - - if (sAppIDMap == nil) { - sAppIDMap = [[NSMutableDictionary alloc] init]; - } - [sAppIDMap setObject:identifier forKey:bundleID]; - return identifier; - } -} diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.xcodeproj/project.pbxproj b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.xcodeproj/project.pbxproj deleted file mode 100644 index e78c9d4ae..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcher.xcodeproj/project.pbxproj +++ /dev/null @@ -1,461 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 4F2FCAC41267882800A74543 /* GTMHTTPFetcherUtilityTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F2FCAC31267882800A74543 /* GTMHTTPFetcherUtilityTest.m */; }; - 4F3471FB11DD58D700CB050E /* GTMGatherInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F211DD58D700CB050E /* GTMGatherInputStream.m */; }; - 4F3471FC11DD58D700CB050E /* GTMHTTPFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F411DD58D700CB050E /* GTMHTTPFetcher.m */; }; - 4F3471FD11DD58D700CB050E /* GTMHTTPFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F611DD58D700CB050E /* GTMHTTPFetcherLogging.m */; }; - 4F3471FE11DD58D700CB050E /* GTMHTTPUploadFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F811DD58D700CB050E /* GTMHTTPUploadFetcher.m */; }; - 4F3471FF11DD58D700CB050E /* GTMMIMEDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471FA11DD58D700CB050E /* GTMMIMEDocument.m */; }; - 4F74D93811E68BFB00F2D927 /* GTMHTTPFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F411DD58D700CB050E /* GTMHTTPFetcher.m */; }; - 4F74D93A11E68BFB00F2D927 /* GTMHTTPFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F611DD58D700CB050E /* GTMHTTPFetcherLogging.m */; }; - 4F74D93C11E68BFB00F2D927 /* GTMHTTPUploadFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F811DD58D700CB050E /* GTMHTTPUploadFetcher.m */; }; - 4F74D93E11E68BFB00F2D927 /* GTMGatherInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471F211DD58D700CB050E /* GTMGatherInputStream.m */; }; - 4F74D94011E68BFB00F2D927 /* GTMMIMEDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F3471FA11DD58D700CB050E /* GTMMIMEDocument.m */; }; - 4F74D94A11E68C1500F2D927 /* GTMMIMEDocumentTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F74D94911E68C1500F2D927 /* GTMMIMEDocumentTest.m */; }; - 4F74D9FF11E6A18100F2D927 /* GTMHTTPFetcherTestServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F74D9FE11E6A18100F2D927 /* GTMHTTPFetcherTestServer.m */; }; - 4F74DA0411E6A19B00F2D927 /* GTMHTTPServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F74DA0311E6A19B00F2D927 /* GTMHTTPServer.m */; }; - 4F74DAF811E7C7C900F2D927 /* GTMHTTPFetcherFetchingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F74DAF711E7C7C900F2D927 /* GTMHTTPFetcherFetchingTest.m */; }; - 4F74DAFC11E7C7CF00F2D927 /* GTMHTTPFetcherCachingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F74DAFB11E7C7CF00F2D927 /* GTMHTTPFetcherCachingTest.m */; }; - 4F74DB4411E7CF4200F2D927 /* gettysburgaddress.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4F74DB4311E7CF4200F2D927 /* gettysburgaddress.txt */; }; - 4F8DB2BE13FC9AE30001DD6C /* GTMReadMonitorInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8DB2BD13FC9AE30001DD6C /* GTMReadMonitorInputStream.m */; }; - 4F8DB2BF13FC9AE30001DD6C /* GTMReadMonitorInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8DB2BD13FC9AE30001DD6C /* GTMReadMonitorInputStream.m */; }; - 4F8DB32213FC9CB70001DD6C /* GTMReadMonitorInputStreamTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8DB32113FC9CB70001DD6C /* GTMReadMonitorInputStreamTest.m */; }; - 4F92DBC51379E9CB0071BAC1 /* GTMHTTPFetcherServiceTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F92DBC41379E9CB0071BAC1 /* GTMHTTPFetcherServiceTest.m */; }; - 4FC6EF351852B270007D0854 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FC6EF341852B270007D0854 /* XCTest.framework */; }; - 4FCC71F711EBF5970097924C /* GTMGatherInputStreamTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FCC71F611EBF5970097924C /* GTMGatherInputStreamTest.m */; }; - 4FCC75E511EE6B1C0097924C /* GTMHTTPFetcherService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FCC75E411EE6B1C0097924C /* GTMHTTPFetcherService.m */; }; - 4FCC75E611EE6B1C0097924C /* GTMHTTPFetcherService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FCC75E411EE6B1C0097924C /* GTMHTTPFetcherService.m */; }; - 4FCC787A11EFA6030097924C /* GTMHTTPFetchHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FCC787911EFA6030097924C /* GTMHTTPFetchHistory.m */; }; - 4FCC787B11EFA6030097924C /* GTMHTTPFetchHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FCC787911EFA6030097924C /* GTMHTTPFetchHistory.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 4F2FCAC31267882800A74543 /* GTMHTTPFetcherUtilityTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetcherUtilityTest.m; path = Tests/GTMHTTPFetcherUtilityTest.m; sourceTree = ""; }; - 4F3471F111DD58D700CB050E /* GTMGatherInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMGatherInputStream.h; sourceTree = ""; }; - 4F3471F211DD58D700CB050E /* GTMGatherInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMGatherInputStream.m; sourceTree = ""; }; - 4F3471F311DD58D700CB050E /* GTMHTTPFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetcher.h; sourceTree = ""; }; - 4F3471F411DD58D700CB050E /* GTMHTTPFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetcher.m; sourceTree = ""; }; - 4F3471F511DD58D700CB050E /* GTMHTTPFetcherLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetcherLogging.h; sourceTree = ""; }; - 4F3471F611DD58D700CB050E /* GTMHTTPFetcherLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetcherLogging.m; sourceTree = ""; }; - 4F3471F711DD58D700CB050E /* GTMHTTPUploadFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPUploadFetcher.h; sourceTree = ""; }; - 4F3471F811DD58D700CB050E /* GTMHTTPUploadFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPUploadFetcher.m; sourceTree = ""; }; - 4F3471F911DD58D700CB050E /* GTMMIMEDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMMIMEDocument.h; sourceTree = ""; }; - 4F3471FA11DD58D700CB050E /* GTMMIMEDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMMIMEDocument.m; sourceTree = ""; }; - 4F74D92F11E68BD300F2D927 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 4F74D93011E68BD300F2D927 /* UnitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "UnitTests-Info.plist"; sourceTree = ""; }; - 4F74D94911E68C1500F2D927 /* GTMMIMEDocumentTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMMIMEDocumentTest.m; path = Tests/GTMMIMEDocumentTest.m; sourceTree = ""; }; - 4F74D9FE11E6A18100F2D927 /* GTMHTTPFetcherTestServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetcherTestServer.m; path = Tests/GTMHTTPFetcherTestServer.m; sourceTree = ""; }; - 4F74DA0211E6A19B00F2D927 /* GTMHTTPServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMHTTPServer.h; path = Tests/GTMHTTPServer.h; sourceTree = ""; }; - 4F74DA0311E6A19B00F2D927 /* GTMHTTPServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPServer.m; path = Tests/GTMHTTPServer.m; sourceTree = ""; }; - 4F74DAF711E7C7C900F2D927 /* GTMHTTPFetcherFetchingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetcherFetchingTest.m; path = Tests/GTMHTTPFetcherFetchingTest.m; sourceTree = ""; }; - 4F74DAFB11E7C7CF00F2D927 /* GTMHTTPFetcherCachingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetcherCachingTest.m; path = Tests/GTMHTTPFetcherCachingTest.m; sourceTree = ""; }; - 4F74DB4311E7CF4200F2D927 /* gettysburgaddress.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = gettysburgaddress.txt; path = Tests/Data/gettysburgaddress.txt; sourceTree = ""; }; - 4F8D22D81253E0960095BBF5 /* ReleaseNotes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReleaseNotes.txt; sourceTree = ""; }; - 4F8DB2BD13FC9AE30001DD6C /* GTMReadMonitorInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMReadMonitorInputStream.m; sourceTree = ""; }; - 4F8DB2C013FC9AE90001DD6C /* GTMReadMonitorInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMReadMonitorInputStream.h; sourceTree = ""; }; - 4F8DB32113FC9CB70001DD6C /* GTMReadMonitorInputStreamTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMReadMonitorInputStreamTest.m; path = Tests/GTMReadMonitorInputStreamTest.m; sourceTree = SOURCE_ROOT; }; - 4F92DBC41379E9CB0071BAC1 /* GTMHTTPFetcherServiceTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetcherServiceTest.m; path = Tests/GTMHTTPFetcherServiceTest.m; sourceTree = ""; }; - 4FC6EF341852B270007D0854 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 4FCC71F611EBF5970097924C /* GTMGatherInputStreamTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMGatherInputStreamTest.m; path = Tests/GTMGatherInputStreamTest.m; sourceTree = ""; }; - 4FCC75E411EE6B1C0097924C /* GTMHTTPFetcherService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetcherService.m; sourceTree = ""; }; - 4FCC75E711EE6B230097924C /* GTMHTTPFetcherService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetcherService.h; sourceTree = ""; }; - 4FCC787911EFA6030097924C /* GTMHTTPFetchHistory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMHTTPFetchHistory.m; sourceTree = ""; }; - 4FCC787C11EFA6090097924C /* GTMHTTPFetchHistory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMHTTPFetchHistory.h; sourceTree = ""; }; - D2AAC07E0554694100DB518D /* libGTMHTTPFetcher.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGTMHTTPFetcher.a; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4F74D92C11E68BD300F2D927 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4FC6EF351852B270007D0854 /* XCTest.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* libGTMHTTPFetcher.a */, - 4F74D92F11E68BD300F2D927 /* UnitTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* OAuthTouchStaticLibrary */ = { - isa = PBXGroup; - children = ( - 4FC6EF341852B270007D0854 /* XCTest.framework */, - 4F74D91D11E68AD600F2D927 /* Sources */, - 4F74D94711E68C0B00F2D927 /* Tests */, - 034768DFFF38A50411DB9C8B /* Products */, - 4F8D22D81253E0960095BBF5 /* ReleaseNotes.txt */, - 4F74D93011E68BD300F2D927 /* UnitTests-Info.plist */, - ); - name = OAuthTouchStaticLibrary; - sourceTree = ""; - }; - 4F74D91D11E68AD600F2D927 /* Sources */ = { - isa = PBXGroup; - children = ( - 4F3471F311DD58D700CB050E /* GTMHTTPFetcher.h */, - 4F3471F411DD58D700CB050E /* GTMHTTPFetcher.m */, - 4FCC787C11EFA6090097924C /* GTMHTTPFetchHistory.h */, - 4FCC787911EFA6030097924C /* GTMHTTPFetchHistory.m */, - 4FCC75E711EE6B230097924C /* GTMHTTPFetcherService.h */, - 4FCC75E411EE6B1C0097924C /* GTMHTTPFetcherService.m */, - 4F3471F511DD58D700CB050E /* GTMHTTPFetcherLogging.h */, - 4F3471F611DD58D700CB050E /* GTMHTTPFetcherLogging.m */, - 4F3471F711DD58D700CB050E /* GTMHTTPUploadFetcher.h */, - 4F3471F811DD58D700CB050E /* GTMHTTPUploadFetcher.m */, - 4F3471F111DD58D700CB050E /* GTMGatherInputStream.h */, - 4F3471F211DD58D700CB050E /* GTMGatherInputStream.m */, - 4F3471F911DD58D700CB050E /* GTMMIMEDocument.h */, - 4F3471FA11DD58D700CB050E /* GTMMIMEDocument.m */, - 4F8DB2C013FC9AE90001DD6C /* GTMReadMonitorInputStream.h */, - 4F8DB2BD13FC9AE30001DD6C /* GTMReadMonitorInputStream.m */, - ); - name = Sources; - sourceTree = ""; - }; - 4F74D94711E68C0B00F2D927 /* Tests */ = { - isa = PBXGroup; - children = ( - 4F74DAF711E7C7C900F2D927 /* GTMHTTPFetcherFetchingTest.m */, - 4F92DBC41379E9CB0071BAC1 /* GTMHTTPFetcherServiceTest.m */, - 4F74DAFB11E7C7CF00F2D927 /* GTMHTTPFetcherCachingTest.m */, - 4F2FCAC31267882800A74543 /* GTMHTTPFetcherUtilityTest.m */, - 4FCC71F611EBF5970097924C /* GTMGatherInputStreamTest.m */, - 4F74D94911E68C1500F2D927 /* GTMMIMEDocumentTest.m */, - 4F8DB32113FC9CB70001DD6C /* GTMReadMonitorInputStreamTest.m */, - 4FCC71A911EBEFBF0097924C /* Server */, - 4F74DB4111E7CF3500F2D927 /* Data */, - ); - name = Tests; - sourceTree = ""; - }; - 4F74DB4111E7CF3500F2D927 /* Data */ = { - isa = PBXGroup; - children = ( - 4F74DB4311E7CF4200F2D927 /* gettysburgaddress.txt */, - ); - name = Data; - sourceTree = ""; - }; - 4FCC71A911EBEFBF0097924C /* Server */ = { - isa = PBXGroup; - children = ( - 4F74DA0211E6A19B00F2D927 /* GTMHTTPServer.h */, - 4F74DA0311E6A19B00F2D927 /* GTMHTTPServer.m */, - 4F74D9FE11E6A18100F2D927 /* GTMHTTPFetcherTestServer.m */, - ); - name = Server; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 4F74D92E11E68BD300F2D927 /* UnitTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4F74D93411E68BD300F2D927 /* Build configuration list for PBXNativeTarget "UnitTests" */; - buildPhases = ( - 4F74D92A11E68BD300F2D927 /* Resources */, - 4F74D92B11E68BD300F2D927 /* Sources */, - 4F74D92C11E68BD300F2D927 /* Frameworks */, - 4F74D92D11E68BD300F2D927 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = UnitTests; - productName = UnitTests; - productReference = 4F74D92F11E68BD300F2D927 /* UnitTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - D2AAC07D0554694100DB518D /* GTMHTTPFetcherLib */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "GTMHTTPFetcherLib" */; - buildPhases = ( - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GTMHTTPFetcherLib; - productName = OAuthTouchStaticLibrary; - productReference = D2AAC07E0554694100DB518D /* libGTMHTTPFetcher.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0500; - }; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "GTMHTTPFetcher" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* OAuthTouchStaticLibrary */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* GTMHTTPFetcherLib */, - 4F74D92E11E68BD300F2D927 /* UnitTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4F74D92A11E68BD300F2D927 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F74DB4411E7CF4200F2D927 /* gettysburgaddress.txt in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 4F74D92D11E68BD300F2D927 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4F74D92B11E68BD300F2D927 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F74D93811E68BFB00F2D927 /* GTMHTTPFetcher.m in Sources */, - 4F74D93A11E68BFB00F2D927 /* GTMHTTPFetcherLogging.m in Sources */, - 4F74D93C11E68BFB00F2D927 /* GTMHTTPUploadFetcher.m in Sources */, - 4F74D93E11E68BFB00F2D927 /* GTMGatherInputStream.m in Sources */, - 4F74D94011E68BFB00F2D927 /* GTMMIMEDocument.m in Sources */, - 4F74D94A11E68C1500F2D927 /* GTMMIMEDocumentTest.m in Sources */, - 4F74D9FF11E6A18100F2D927 /* GTMHTTPFetcherTestServer.m in Sources */, - 4F74DA0411E6A19B00F2D927 /* GTMHTTPServer.m in Sources */, - 4F74DAF811E7C7C900F2D927 /* GTMHTTPFetcherFetchingTest.m in Sources */, - 4F74DAFC11E7C7CF00F2D927 /* GTMHTTPFetcherCachingTest.m in Sources */, - 4FCC71F711EBF5970097924C /* GTMGatherInputStreamTest.m in Sources */, - 4FCC75E511EE6B1C0097924C /* GTMHTTPFetcherService.m in Sources */, - 4FCC787A11EFA6030097924C /* GTMHTTPFetchHistory.m in Sources */, - 4F2FCAC41267882800A74543 /* GTMHTTPFetcherUtilityTest.m in Sources */, - 4F92DBC51379E9CB0071BAC1 /* GTMHTTPFetcherServiceTest.m in Sources */, - 4F8DB2BE13FC9AE30001DD6C /* GTMReadMonitorInputStream.m in Sources */, - 4F8DB32213FC9CB70001DD6C /* GTMReadMonitorInputStreamTest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F3471FB11DD58D700CB050E /* GTMGatherInputStream.m in Sources */, - 4F3471FC11DD58D700CB050E /* GTMHTTPFetcher.m in Sources */, - 4F3471FD11DD58D700CB050E /* GTMHTTPFetcherLogging.m in Sources */, - 4F3471FE11DD58D700CB050E /* GTMHTTPUploadFetcher.m in Sources */, - 4F3471FF11DD58D700CB050E /* GTMMIMEDocument.m in Sources */, - 4FCC75E611EE6B1C0097924C /* GTMHTTPFetcherService.m in Sources */, - 4FCC787B11EFA6030097924C /* GTMHTTPFetchHistory.m in Sources */, - 4F8DB2BF13FC9AE30001DD6C /* GTMReadMonitorInputStream.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = GTMHTTPFetcher; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = GTMHTTPFetcher; - SDKROOT = iphoneos; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "-DDEBUG=1"; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = macosx; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - GCC_C_LANGUAGE_STANDARD = c99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = macosx; - }; - name = Release; - }; - 4F74D93211E68BD300F2D927 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; - INFOPLIST_FILE = "UnitTests-Info.plist"; - INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - OTHER_LDFLAGS = ( - "-framework", - Cocoa, - ); - PRODUCT_NAME = UnitTests; - RUN_CLANG_STATIC_ANALYZER = YES; - }; - name = Debug; - }; - 4F74D93311E68BD300F2D927 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(DEVELOPER_FRAMEWORKS_DIR)", - ); - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h"; - INFOPLIST_FILE = "UnitTests-Info.plist"; - INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; - OTHER_LDFLAGS = ( - "-framework", - Cocoa, - ); - PRODUCT_NAME = UnitTests; - RUN_CLANG_STATIC_ANALYZER = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "GTMHTTPFetcherLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "GTMHTTPFetcher" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4F74D93411E68BD300F2D927 /* Build configuration list for PBXNativeTarget "UnitTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4F74D93211E68BD300F2D927 /* Debug */, - 4F74D93311E68BD300F2D927 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.h deleted file mode 100644 index 65494120e..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (c) 2013 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -#if !STRIP_GTM_FETCH_LOGGING && !STRIP_GTM_HTTPLOGVIEWCONTROLLER - -#import - -// GTMHTTPFetcherLogViewController allows browsing of GTMHTTPFetcher's logs on -// the iOS device. Logging must have been enabled with -// -// [GTMHTTPFetcher setLoggingEnabled:YES]; -// -// A table will display one entry for each run of the app, with the most recent -// run's log listed first. A simple web view is used to browse the contents of -// an individual run's log. -// -// To use, push the view controller onto your app's navigation controller. -// -// GTMHTTPFetcherLogViewController *logViewController = -// [[[GTMHTTPFetcherLogViewController alloc] init] autorelease]; -// [navController pushViewController:logViewController -// animated:YES]; -// -// Apps without a UINavigationController may use controllerWithTarget:selector: -// convenience method to make one. For example: -// -// UINavigationController *nc = -// [GTMHTTPFetcherLogViewController controllerWithTarget:self -// selector:@selector(logsDone:)]; -// [self presentViewController:nc animated:YES completion:NULL]; -// -// - (void)logsDone:(UINavigationController *)navController { -// [self dismissViewControllerAnimated:YES completion:NULL]; -// } - -@interface GTMHTTPFetcherLogViewController : UITableViewController - -/// Sets whether to automatically scroll to the bottom of a run's log when viewed, to show the most -/// recent entry (a run log's entries are written in chronological order). Default is NO. -- (void)setOpensScrolledToEnd:(BOOL)opensScrolledToEnd; - -// This optional convenience method created a nav controller for use -// by apps that do not have a standard UINavigationController, as shown -// in the code snippet above. -// -// The selector should be for a method with a signature matching -// - (void)logsDone:(UINavigationController *)navController -// -// The target and selector may be nil. -+ (UINavigationController *)controllerWithTarget:(id)target - selector:(SEL)selector; -@end - -#endif diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.m deleted file mode 100644 index 43b313383..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogViewController.m +++ /dev/null @@ -1,275 +0,0 @@ -/* Copyright (c) 2013 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -#if defined(__has_feature) && __has_feature(objc_arc) -#error "This file uses manual reference counting. Compile with -fno-objc-arc" -#endif - -#import "GTMHTTPFetcherLogViewController.h" - -#if !STRIP_GTM_FETCH_LOGGING && !STRIP_GTM_HTTPLOGVIEWCONTROLLER - -#import - -#import "GTMHTTPFetcher.h" -#import "GTMHTTPFetcherLogging.h" - -static NSString *const kHTTPLogsCell = @"kGTMHTTPLogsCell"; - -// A minimal controller will be used to wrap a web view for displaying the -// log files. -@interface GTMHTTPFetcherLoggingWebViewController : UIViewController -- (id)initWithURL:(NSURL *)htmlURL title:(NSString *)title opensScrolledToEnd:(BOOL)opensScrolled; -@end - -#pragma mark - Table View Controller - -@interface GTMHTTPFetcherLogViewController () -@property (nonatomic, copy) void (^callbackBlock)(void); -@end - -@implementation GTMHTTPFetcherLogViewController { - NSArray *logsFolderURLs_; - BOOL opensScrolledToEnd_; -} - -@synthesize callbackBlock = callbackBlock_; - -- (instancetype)initWithStyle:(UITableViewStyle)style { - self = [super initWithStyle:style]; - if (self) { - self.title = @"HTTP Logs"; - - // Find all folders containing logs. - NSError *error; - NSFileManager *fm = [NSFileManager defaultManager]; - NSString *logsFolderPath = [GTMHTTPFetcher loggingDirectory]; - NSString *processName = [GTMHTTPFetcher loggingProcessName]; - - NSURL *logsURL = [NSURL fileURLWithPath:logsFolderPath]; - NSMutableArray *mutableURLs = - [[fm contentsOfDirectoryAtURL:logsURL - includingPropertiesForKeys:@[ NSURLCreationDateKey ] - options:0 - error:&error] mutableCopy]; - - // Remove non-log files that lack the process name prefix, - // and remove the "newest" symlink. - NSString *symlinkSuffix = [GTMHTTPFetcher symlinkNameSuffix]; - NSIndexSet *nonLogIndexes = [mutableURLs indexesOfObjectsPassingTest: - ^BOOL(id obj, NSUInteger idx, BOOL *stop) { - NSString *name = [obj lastPathComponent]; - return (![name hasPrefix:processName] - || [name hasSuffix:symlinkSuffix]); - }]; - [mutableURLs removeObjectsAtIndexes:nonLogIndexes]; - - // Sort to put the newest logs at the top of the list. - [mutableURLs sortUsingComparator:^NSComparisonResult(NSURL *url1, - NSURL *url2) { - NSDate *date1, *date2; - [url1 getResourceValue:&date1 forKey:NSURLCreationDateKey error:NULL]; - [url2 getResourceValue:&date2 forKey:NSURLCreationDateKey error:NULL]; - return [date2 compare:date1]; - }]; - logsFolderURLs_ = mutableURLs; - } - return self; -} - -- (void)dealloc { - [logsFolderURLs_ release]; - [super dealloc]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - // Avoid silent failure if this was not added to a UINavigationController. - // - // The method +controllerWithTarget:selector: can be used to create a - // temporary UINavigationController. - NSAssert(self.navigationController != nil, @"Need a UINavigationController"); -} - -- (void)setOpensScrolledToEnd:(BOOL)opensScrolledToEnd { - opensScrolledToEnd_ = opensScrolledToEnd; -} - -#pragma mark - - -- (NSString *)shortenedNameForURL:(NSURL *)url { - // Remove "Processname_log_" from the start of the file name. - NSString *name = [url lastPathComponent]; - NSString *prefix = [GTMHTTPFetcher processNameLogPrefix]; - if ([name hasPrefix:prefix]) { - name = [name substringFromIndex:[prefix length]]; - } - return name; -} - -#pragma mark - Table view data source - -- (NSInteger)tableView:(UITableView *)tableView - numberOfRowsInSection:(NSInteger)section { - return [logsFolderURLs_ count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = - [tableView dequeueReusableCellWithIdentifier:kHTTPLogsCell]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:kHTTPLogsCell] autorelease]; - [cell.textLabel setAdjustsFontSizeToFitWidth:YES]; - } - - NSURL *url = [logsFolderURLs_ objectAtIndex:indexPath.row]; - cell.textLabel.text = [self shortenedNameForURL:url]; - - return cell; -} - -#pragma mark - Table view delegate - -- (void)tableView:(UITableView *)tableView - didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - NSURL *folderURL = [logsFolderURLs_ objectAtIndex:indexPath.row]; - NSString *htmlName = [GTMHTTPFetcher htmlFileName]; - NSURL *htmlURL = [folderURL URLByAppendingPathComponent:htmlName]; - - // Show the webview controller. - NSString *title = [self shortenedNameForURL:folderURL]; - UIViewController *webViewController = - [[[GTMHTTPFetcherLoggingWebViewController alloc] initWithURL:htmlURL - title:title - opensScrolledToEnd:opensScrolledToEnd_] autorelease]; - - UINavigationController *navController = [self navigationController]; - [navController pushViewController:webViewController animated:YES]; - - [tableView deselectRowAtIndexPath:indexPath animated:YES]; -} - -#pragma mark - - -+ (UINavigationController *)controllerWithTarget:(id)target - selector:(SEL)selector { - UINavigationController *navController = - [[[UINavigationController alloc] init] autorelease]; - GTMHTTPFetcherLogViewController *logViewController = - [[[GTMHTTPFetcherLogViewController alloc] init] autorelease]; - UIBarButtonItem *barButtonItem = - [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:logViewController - action:@selector(doneButtonClicked:)] autorelease]; - logViewController.navigationItem.leftBarButtonItem = barButtonItem; - - // Make a block to capture the callback and nav controller. - void (^block)(void) = ^{ - if (target && selector) { - [target performSelector:selector withObject:navController]; - } - }; - logViewController.callbackBlock = block; - - navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; - - [navController pushViewController:logViewController animated:NO]; - return navController; -} - -- (void)doneButtonClicked:(UIBarButtonItem *)barButtonItem { - void (^block)() = self.callbackBlock; - block(); - self.callbackBlock = nil; -} - -@end - -#pragma mark - Minimal WebView Controller - -@implementation GTMHTTPFetcherLoggingWebViewController { - BOOL opensScrolledToEnd_; - NSURL *htmlURL_; -} - -- (instancetype)initWithURL:(NSURL *)htmlURL - title:(NSString *)title - opensScrolledToEnd:(BOOL)opensScrolledToEnd { - self = [super initWithNibName:nil bundle:nil]; - if (self) { - self.title = title; - htmlURL_ = [htmlURL retain]; - opensScrolledToEnd_ = opensScrolledToEnd; - } - return self; -} - -- (void)dealloc { - [htmlURL_ release]; - [super dealloc]; -} - -- (void)loadView { - UIWebView *webView = [[UIWebView alloc] init]; - webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth - | UIViewAutoresizingFlexibleHeight); - webView.delegate = self; - self.view = webView; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - NSURLRequest *request = [NSURLRequest requestWithURL:htmlURL_]; - [[self webView] loadRequest:request]; -} - -- (void)didTapBackButton:(UIButton *)button { - [[self webView] goBack]; -} - -- (UIWebView *)webView { - return (UIWebView *)self.view; -} - -#pragma mark - WebView delegate - -- (void)webViewDidFinishLoad:(UIWebView *)webView { - if (opensScrolledToEnd_) { - // Scroll to the bottom, because the most recent entry is at the end. - NSString* javascript = [NSString stringWithFormat:@"window.scrollBy(0, %ld);", NSIntegerMax]; - [[self webView] stringByEvaluatingJavaScriptFromString:javascript]; - opensScrolledToEnd_ = NO; - } - - // Instead of the nav controller's back button, provide a simple - // webview back button when it's needed. - BOOL canGoBack = [webView canGoBack]; - UIBarButtonItem *backItem = nil; - if (canGoBack) { - // This hides the nav back button. - backItem = [[[UIBarButtonItem alloc] initWithTitle:@"⏎" - style:UIBarButtonItemStylePlain - target:self - action:@selector(didTapBackButton:)] autorelease]; - } - self.navigationItem.leftBarButtonItem = backItem; -} - -@end - -#endif // !STRIP_GTM_FETCH_LOGGING && !STRIP_GTM_HTTPLOGVIEWCONTROLLER diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.m deleted file mode 100644 index 54a4d95d6..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherLogging.m +++ /dev/null @@ -1,1134 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -#if !STRIP_GTM_FETCH_LOGGING - -#include -#include - -#import "GTMHTTPFetcherLogging.h" - -// Sensitive credential strings are replaced in logs with _snip_ -// -// Apps that must see the contents of sensitive tokens can set this to 1 -#ifndef SKIP_GTM_FETCH_LOGGING_SNIPPING -#define SKIP_GTM_FETCH_LOGGING_SNIPPING 0 -#endif - -// If GTMReadMonitorInputStream is available, it can be used for -// capturing uploaded streams of data -// -// We locally declare methods of GTMReadMonitorInputStream so we -// do not need to import the header, as some projects may not have it available -#ifndef GTM_NSSTREAM_DELEGATE -@interface GTMReadMonitorInputStream : NSInputStream -+ (id)inputStreamWithStream:(NSInputStream *)input; -@property (assign) id readDelegate; -@property (assign) SEL readSelector; -@property (retain) NSArray *runLoopModes; -@end -#endif - -// If GTMNSJSONSerialization is available, it is used for formatting JSON -#if (TARGET_OS_MAC && !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED < 1070)) || \ - (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED < 50000)) -@interface GTMNSJSONSerialization : NSObject -+ (NSData *)dataWithJSONObject:(id)obj options:(NSUInteger)opt error:(NSError **)error; -+ (id)JSONObjectWithData:(NSData *)data options:(NSUInteger)opt error:(NSError **)error; -@end -#endif - -// Otherwise, if SBJSON is available, it is used for formatting JSON -@interface GTMFetcherSBJSON -- (void)setHumanReadable:(BOOL)flag; -- (NSString*)stringWithObject:(id)value error:(NSError**)error; -- (id)objectWithString:(NSString*)jsonrep error:(NSError**)error; -@end - -@interface GTMHTTPFetcher (GTMHTTPFetcherLoggingUtilities) -+ (NSString *)headersStringForDictionary:(NSDictionary *)dict; - -- (void)inputStream:(GTMReadMonitorInputStream *)stream - readIntoBuffer:(void *)buffer - length:(NSUInteger)length; - -// internal file utilities for logging -+ (BOOL)fileOrDirExistsAtPath:(NSString *)path; -+ (BOOL)makeDirectoryUpToPath:(NSString *)path; -+ (BOOL)removeItemAtPath:(NSString *)path; -+ (BOOL)createSymbolicLinkAtPath:(NSString *)newPath - withDestinationPath:(NSString *)targetPath; - -+ (NSString *)snipSubstringOfString:(NSString *)originalStr - betweenStartString:(NSString *)startStr - endString:(NSString *)endStr; - -+ (id)JSONObjectWithData:(NSData *)data; -+ (id)stringWithJSONObject:(id)obj; -@end - -@implementation GTMHTTPFetcher (GTMHTTPFetcherLogging) - -// fetchers come and fetchers go, but statics are forever -static BOOL gIsLoggingEnabled = NO; -static BOOL gIsLoggingToFile = YES; -static NSString *gLoggingDirectoryPath = nil; -static NSString *gLoggingDateStamp = nil; -static NSString* gLoggingProcessName = nil; - -+ (void)setLoggingDirectory:(NSString *)path { - [gLoggingDirectoryPath autorelease]; - gLoggingDirectoryPath = [path copy]; -} - -+ (NSString *)loggingDirectory { - - if (!gLoggingDirectoryPath) { - NSArray *arr = nil; -#if GTM_IPHONE && TARGET_IPHONE_SIMULATOR - // default to a directory called GTMHTTPDebugLogs into a sandbox-safe - // directory that a developer can find easily, the application home - arr = [NSArray arrayWithObject:NSHomeDirectory()]; -#elif GTM_IPHONE - // Neither ~/Desktop nor ~/Home is writable on an actual iPhone device. - // Put it in ~/Documents. - arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, - NSUserDomainMask, YES); -#else - // default to a directory called GTMHTTPDebugLogs in the desktop folder - arr = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, - NSUserDomainMask, YES); -#endif - - if ([arr count] > 0) { - NSString *const kGTMLogFolderName = @"GTMHTTPDebugLogs"; - - NSString *desktopPath = [arr objectAtIndex:0]; - NSString *logsFolderPath = [desktopPath stringByAppendingPathComponent:kGTMLogFolderName]; - - BOOL doesFolderExist = [[self class] fileOrDirExistsAtPath:logsFolderPath]; - - if (!doesFolderExist) { - // make the directory - doesFolderExist = [self makeDirectoryUpToPath:logsFolderPath]; - } - - if (doesFolderExist) { - // it's there; store it in the global - gLoggingDirectoryPath = [logsFolderPath copy]; - } - } - } - return gLoggingDirectoryPath; -} - -+ (void)setLoggingEnabled:(BOOL)flag { - gIsLoggingEnabled = flag; -} - -+ (BOOL)isLoggingEnabled { - return gIsLoggingEnabled; -} - -+ (void)setLoggingToFileEnabled:(BOOL)flag { - gIsLoggingToFile = flag; -} - -+ (BOOL)isLoggingToFileEnabled { - return gIsLoggingToFile; -} - -+ (void)setLoggingProcessName:(NSString *)str { - [gLoggingProcessName release]; - gLoggingProcessName = [str copy]; -} - -+ (NSString *)loggingProcessName { - - // get the process name (once per run) replacing spaces with underscores - if (!gLoggingProcessName) { - - NSString *procName = [[NSProcessInfo processInfo] processName]; - NSMutableString *loggingProcessName; - loggingProcessName = [[NSMutableString alloc] initWithString:procName]; - - [loggingProcessName replaceOccurrencesOfString:@" " - withString:@"_" - options:0 - range:NSMakeRange(0, [loggingProcessName length])]; - gLoggingProcessName = loggingProcessName; - } - return gLoggingProcessName; -} - -+ (void)setLoggingDateStamp:(NSString *)str { - [gLoggingDateStamp release]; - gLoggingDateStamp = [str copy]; -} - -+ (NSString *)loggingDateStamp { - // we'll pick one date stamp per run, so a run that starts at a later second - // will get a unique results html file - if (!gLoggingDateStamp) { - // produce a string like 08-21_01-41-23PM - - NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; - [formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; - [formatter setDateFormat:@"M-dd_hh-mm-ssa"]; - - gLoggingDateStamp = [[formatter stringFromDate:[NSDate date]] retain] ; - } - return gLoggingDateStamp; -} - -+ (NSString *)processNameLogPrefix { - static NSString *prefix = nil; - if (!prefix) { - NSString *processName = [[self class] loggingProcessName]; - prefix = [[NSString alloc] initWithFormat:@"%@_log_", processName]; - } - return prefix; -} - -+ (NSString *)symlinkNameSuffix { - return @"_log_newest.html"; -} - -+ (NSString *)htmlFileName { - return @"aperçu_http_log.html"; -} - -// formattedStringFromData returns a prettyprinted string for XML or JSON input, -// and a plain string for other input data -- (NSString *)formattedStringFromData:(NSData *)inputData - contentType:(NSString *)contentType - JSON:(NSDictionary **)outJSON { - if (inputData == nil) return nil; - - // if the content type is JSON and we have the parsing class available, - // use that - if ([contentType hasPrefix:@"application/json"] - && [inputData length] > 5) { - // convert from JSON string to NSObjects and back to a formatted string - NSMutableDictionary *obj = [[self class] JSONObjectWithData:inputData]; - if (obj) { - if (outJSON) *outJSON = obj; - if ([obj isKindOfClass:[NSMutableDictionary class]]) { - // for security and privacy, omit OAuth 2 response access and refresh - // tokens - if ([obj valueForKey:@"refresh_token"] != nil) { - [obj setObject:@"_snip_" forKey:@"refresh_token"]; - } - if ([obj valueForKey:@"access_token"] != nil) { - [obj setObject:@"_snip_" forKey:@"access_token"]; - } - } - NSString *formatted = [[self class] stringWithJSONObject:obj]; - if (formatted) return formatted; - } - } - -#if !GTM_FOUNDATION_ONLY && !GTM_SKIP_LOG_XMLFORMAT - // verify that this data starts with the bytes indicating XML - - NSString *const kXMLLintPath = @"/usr/bin/xmllint"; - static BOOL hasCheckedAvailability = NO; - static BOOL isXMLLintAvailable; - - if (!hasCheckedAvailability) { - isXMLLintAvailable = [[self class] fileOrDirExistsAtPath:kXMLLintPath]; - hasCheckedAvailability = YES; - } - - if (isXMLLintAvailable - && [inputData length] > 5 - && strncmp([inputData bytes], " 0) { - // success - inputData = formattedData; - } - } -#else - // we can't call external tasks on the iPhone; leave the XML unformatted -#endif - - NSString *dataStr = [[[NSString alloc] initWithData:inputData - encoding:NSUTF8StringEncoding] autorelease]; - return dataStr; -} - -- (void)setupStreamLogging { - // if logging is enabled, it needs a buffer to accumulate data from any - // NSInputStream used for uploading. Logging will wrap the input - // stream with a stream that lets us keep a copy the data being read. - if ([GTMHTTPFetcher isLoggingEnabled] - && loggedStreamData_ == nil - && postStream_ != nil) { - loggedStreamData_ = [[NSMutableData alloc] init]; - - BOOL didCapture = [self logCapturePostStream]; - if (!didCapture) { - // upload stream logging requires the class - // GTMReadMonitorInputStream be available - NSString const *str = @"<>"; - [loggedStreamData_ setData:[str dataUsingEncoding:NSUTF8StringEncoding]]; - } - } -} - -- (void)setLogRequestBody:(NSString *)bodyString { - @synchronized(self) { - [logRequestBody_ release]; - logRequestBody_ = [bodyString copy]; - } -} - -- (NSString *)logRequestBody { - @synchronized(self) { - return logRequestBody_; - } -} - -- (void)setLogResponseBody:(NSString *)bodyString { - @synchronized(self) { - [logResponseBody_ release]; - logResponseBody_ = [bodyString copy]; - } -} - -- (NSString *)logResponseBody { - @synchronized(self) { - return logResponseBody_; - } -} - -- (void)setShouldDeferResponseBodyLogging:(BOOL)flag { - @synchronized(self) { - if (flag != shouldDeferResponseBodyLogging_) { - shouldDeferResponseBodyLogging_ = flag; - if (!flag && !hasLoggedError_) { - [self performSelectorOnMainThread:@selector(logFetchWithError:) - withObject:nil - waitUntilDone:NO]; - } - } - } -} - -- (BOOL)shouldDeferResponseBodyLogging { - @synchronized(self) { - return shouldDeferResponseBodyLogging_; - } -} - -// stringFromStreamData creates a string given the supplied data -// -// If NSString can create a UTF-8 string from the data, then that is returned. -// -// Otherwise, this routine tries to find a MIME boundary at the beginning of -// the data block, and uses that to break up the data into parts. Each part -// will be used to try to make a UTF-8 string. For parts that fail, a -// replacement string showing the part header and <> is supplied -// in place of the binary data. - -- (NSString *)stringFromStreamData:(NSData *)data - contentType:(NSString *)contentType { - - if (data == nil) return nil; - - // optimistically, see if the whole data block is UTF-8 - NSString *streamDataStr = [self formattedStringFromData:data - contentType:contentType - JSON:NULL]; - if (streamDataStr) return streamDataStr; - - // Munge a buffer by replacing non-ASCII bytes with underscores, - // and turn that munged buffer an NSString. That gives us a string - // we can use with NSScanner. - NSMutableData *mutableData = [NSMutableData dataWithData:data]; - unsigned char *bytes = [mutableData mutableBytes]; - - for (unsigned int idx = 0; idx < [mutableData length]; idx++) { - if (bytes[idx] > 0x7F || bytes[idx] == 0) { - bytes[idx] = '_'; - } - } - - NSString *mungedStr = [[[NSString alloc] initWithData:mutableData - encoding:NSUTF8StringEncoding] autorelease]; - if (mungedStr != nil) { - - // scan for the boundary string - NSString *boundary = nil; - NSScanner *scanner = [NSScanner scannerWithString:mungedStr]; - - if ([scanner scanUpToString:@"\r\n" intoString:&boundary] - && [boundary hasPrefix:@"--"]) { - - // we found a boundary string; use it to divide the string into parts - NSArray *mungedParts = [mungedStr componentsSeparatedByString:boundary]; - - // look at each of the munged parts in the original string, and try to - // convert those into UTF-8 - NSMutableArray *origParts = [NSMutableArray array]; - NSUInteger offset = 0; - for (NSString *mungedPart in mungedParts) { - NSUInteger partSize = [mungedPart length]; - - NSRange range = NSMakeRange(offset, partSize); - NSData *origPartData = [data subdataWithRange:range]; - - NSString *origPartStr = [[[NSString alloc] initWithData:origPartData - encoding:NSUTF8StringEncoding] autorelease]; - if (origPartStr) { - // we could make this original part into UTF-8; use the string - [origParts addObject:origPartStr]; - } else { - // this part can't be made into UTF-8; scan the header, if we can - NSString *header = nil; - NSScanner *headerScanner = [NSScanner scannerWithString:mungedPart]; - if (![headerScanner scanUpToString:@"\r\n\r\n" intoString:&header]) { - // we couldn't find a header - header = @""; - } - - // make a part string with the header and <> - NSString *binStr = [NSString stringWithFormat:@"\r%@\r<<%lu bytes>>\r", - header, (long)(partSize - [header length])]; - [origParts addObject:binStr]; - } - offset += partSize + [boundary length]; - } - - // rejoin the original parts - streamDataStr = [origParts componentsJoinedByString:boundary]; - } - } - - if (!streamDataStr) { - // give up; just make a string showing the uploaded bytes - streamDataStr = [NSString stringWithFormat:@"<<%u bytes>>", - (unsigned int)[data length]]; - } - return streamDataStr; -} - -// logFetchWithError is called following a successful or failed fetch attempt -// -// This method does all the work for appending to and creating log files - -- (void)logFetchWithError:(NSError *)error { - - if (![[self class] isLoggingEnabled]) return; - - // TODO: (grobbins) add Javascript to display response data formatted in hex - - NSString *parentDir = [[self class] loggingDirectory]; - NSString *processName = [[self class] loggingProcessName]; - NSString *dateStamp = [[self class] loggingDateStamp]; - NSString *logNamePrefix = [[self class] processNameLogPrefix]; - - // make a directory for this run's logs, like - // SyncProto_logs_10-16_01-56-58PM - NSString *dirName = [NSString stringWithFormat:@"%@%@", - logNamePrefix, dateStamp]; - NSString *logDirectory = [parentDir stringByAppendingPathComponent:dirName]; - - if (gIsLoggingToFile) { - // be sure that the first time this app runs, it's not writing to - // a preexisting folder - static BOOL shouldReuseFolder = NO; - if (!shouldReuseFolder) { - shouldReuseFolder = YES; - NSString *origLogDir = logDirectory; - for (int ctr = 2; ctr < 20; ctr++) { - if (![[self class] fileOrDirExistsAtPath:logDirectory]) break; - - // append a digit - logDirectory = [origLogDir stringByAppendingFormat:@"_%d", ctr]; - } - } - if (![[self class] makeDirectoryUpToPath:logDirectory]) return; - } - // each response's NSData goes into its own xml or txt file, though all - // responses for this run of the app share a main html file. This - // counter tracks all fetch responses for this run of the app. - // - // we'll use a local variable since this routine may be reentered while - // waiting for XML formatting to be completed by an external task - static int zResponseCounter = 0; - int responseCounter = ++zResponseCounter; - - // file name for an image data file - NSString *responseDataFileName = nil; - NSUInteger responseDataLength; - if (downloadFileHandle_) { - responseDataLength = (NSUInteger) [downloadFileHandle_ offsetInFile]; - } else { - responseDataLength = [downloadedData_ length]; - } - - NSURLResponse *response = [self response]; - NSDictionary *responseHeaders = [self responseHeaders]; - - NSString *responseBaseName = nil; - NSString *responseDataStr = nil; - NSDictionary *responseJSON = nil; - - // if there's response data, decide what kind of file to put it in based - // on the first bytes of the file or on the mime type supplied by the server - NSString *responseMIMEType = [response MIMEType]; - BOOL isResponseImage = NO; - NSData *dataToWrite = nil; - - if (responseDataLength > 0) { - NSString *responseDataExtn = nil; - - // generate a response file base name like - responseBaseName = [NSString stringWithFormat:@"fetch_%d_response", - responseCounter]; - - NSString *responseType = [responseHeaders valueForKey:@"Content-Type"]; - responseDataStr = [self formattedStringFromData:downloadedData_ - contentType:responseType - JSON:&responseJSON]; - if (responseDataStr) { - // we were able to make a UTF-8 string from the response data - if ([responseMIMEType isEqual:@"application/atom+xml"] - || [responseMIMEType hasSuffix:@"/xml"]) { - responseDataExtn = @"xml"; - dataToWrite = [responseDataStr dataUsingEncoding:NSUTF8StringEncoding]; - } - } else if ([responseMIMEType isEqual:@"image/jpeg"]) { - responseDataExtn = @"jpg"; - dataToWrite = downloadedData_; - isResponseImage = YES; - } else if ([responseMIMEType isEqual:@"image/gif"]) { - responseDataExtn = @"gif"; - dataToWrite = downloadedData_; - isResponseImage = YES; - } else if ([responseMIMEType isEqual:@"image/png"]) { - responseDataExtn = @"png"; - dataToWrite = downloadedData_; - isResponseImage = YES; - } else { - // add more non-text types here - } - - // if we have an extension, save the raw data in a file with that - // extension - if (responseDataExtn && dataToWrite) { - responseDataFileName = [responseBaseName stringByAppendingPathExtension:responseDataExtn]; - NSString *responseDataFilePath = [logDirectory stringByAppendingPathComponent:responseDataFileName]; - - NSError *downloadedError = nil; - if (gIsLoggingToFile - && ![dataToWrite writeToFile:responseDataFilePath - options:0 - error:&downloadedError]) { - NSLog(@"%@ logging write error:%@ (%@)", - [self class], downloadedError, responseDataFileName); - } - } - } - - // we'll have one main html file per run of the app - NSString *htmlName = [[self class] htmlFileName]; - NSString *htmlPath =[logDirectory stringByAppendingPathComponent:htmlName]; - - // if the html file exists (from logging previous fetches) we don't need - // to re-write the header or the scripts - BOOL didFileExist = [[self class] fileOrDirExistsAtPath:htmlPath]; - - NSMutableString* outputHTML = [NSMutableString string]; - NSURLRequest *request = [self mutableRequest]; - - // we need a header to say we'll have UTF-8 text - if (!didFileExist) { - [outputHTML appendFormat:@"%@ HTTP fetch log %@", - processName, dateStamp]; - } - - // now write the visible html elements - NSString *copyableFileName = [NSString stringWithFormat:@"fetch_%d.txt", - responseCounter]; - - // write the date & time, the comment, and the link to the plain-text - // (copyable) log - NSString *const dateLineFormat = @"%@      "; - [outputHTML appendFormat:dateLineFormat, [NSDate date]]; - - NSString *comment = [self comment]; - if (comment) { - NSString *const commentFormat = @"%@      "; - [outputHTML appendFormat:commentFormat, comment]; - } - - NSString *const reqRespFormat = @"request/response log
"; - [outputHTML appendFormat:reqRespFormat, copyableFileName]; - - // write the request URL - NSString *requestMethod = [request HTTPMethod]; - NSURL *requestURL = [request URL]; - - NSURL *redirectedFromHost = [[[redirectedFromURL_ host] copy] autorelease]; - // Save the request URL for next time in case this redirects. - [redirectedFromURL_ release]; - redirectedFromURL_ = [requestURL copy]; - if (redirectedFromHost) { - [outputHTML appendFormat:@"redirected from %@
", - redirectedFromHost]; - } - - [outputHTML appendFormat:@"request: %@ %@
\n", - requestMethod, requestURL]; - - // write the request headers - NSDictionary *requestHeaders = [request allHTTPHeaderFields]; - NSUInteger numberOfRequestHeaders = [requestHeaders count]; - if (numberOfRequestHeaders > 0) { - // Indicate if the request is authorized; warn if the request is - // authorized but non-SSL - NSString *auth = [requestHeaders objectForKey:@"Authorization"]; - NSString *headerDetails = @""; - if (auth) { - headerDetails = @"   authorized"; - BOOL isInsecure = [[requestURL scheme] isEqual:@"http"]; - if (isInsecure) { - headerDetails = @"   authorized, non-SSL" - " "; // 26A0 = ⚠ - } - } - NSString *cookiesHdr = [requestHeaders objectForKey:@"Cookie"]; - if (cookiesHdr) { - headerDetails = [headerDetails stringByAppendingString: - @"   cookies"]; - } - NSString *matchHdr = [requestHeaders objectForKey:@"If-Match"]; - if (matchHdr) { - headerDetails = [headerDetails stringByAppendingString: - @"   if-match"]; - } - matchHdr = [requestHeaders objectForKey:@"If-None-Match"]; - if (matchHdr) { - headerDetails = [headerDetails stringByAppendingString: - @"   if-none-match"]; - } - [outputHTML appendFormat:@"   headers: %d %@
", - (int)numberOfRequestHeaders, headerDetails]; - } else { - [outputHTML appendFormat:@"   headers: none
"]; - } - - // write the request post data, toggleable - NSData *postData; - if (loggedStreamData_) { - postData = loggedStreamData_; - } else if (postData_) { - postData = postData_; - } else { - postData = [request_ HTTPBody]; - } - - NSString *postDataStr = nil; - NSUInteger postDataLength = [postData length]; - NSString *postType = [requestHeaders valueForKey:@"Content-Type"]; - - if (postDataLength > 0) { - [outputHTML appendFormat:@"   data: %d bytes, %@
\n", - (int)postDataLength, postType ? postType : @""]; - - if (logRequestBody_) { - postDataStr = [[logRequestBody_ copy] autorelease]; - [logRequestBody_ release]; - logRequestBody_ = nil; - } else { - postDataStr = [self stringFromStreamData:postData - contentType:postType]; - if (postDataStr) { - // remove OAuth 2 client secret and refresh token - postDataStr = [[self class] snipSubstringOfString:postDataStr - betweenStartString:@"client_secret=" - endString:@"&"]; - - postDataStr = [[self class] snipSubstringOfString:postDataStr - betweenStartString:@"refresh_token=" - endString:@"&"]; - - // remove ClientLogin password - postDataStr = [[self class] snipSubstringOfString:postDataStr - betweenStartString:@"&Passwd=" - endString:@"&"]; - } - } - } else { - // no post data - } - - // write the response status, MIME type, URL - NSInteger status = [self statusCode]; - if (response) { - NSString *statusString = @""; - if (status != 0) { - if (status == 200 || status == 201) { - statusString = [NSString stringWithFormat:@"%ld", (long)status]; - - // report any JSON-RPC error - if ([responseJSON isKindOfClass:[NSDictionary class]]) { - NSDictionary *jsonError = [responseJSON objectForKey:@"error"]; - if ([jsonError isKindOfClass:[NSDictionary class]]) { - NSString *jsonCode = [[jsonError valueForKey:@"code"] description]; - NSString *jsonMessage = [jsonError valueForKey:@"message"]; - if (jsonCode || jsonMessage) { - NSString *const jsonErrFmt = @"   JSON error: %@ %@  ⚑"; // 2691 = ⚑ - statusString = [statusString stringByAppendingFormat:jsonErrFmt, - jsonCode ? jsonCode : @"", - jsonMessage ? jsonMessage : @""]; - } - } - } - } else { - // purple for anything other than 200 or 201 - NSString *flag = (status >= 400 ? @" ⚑" : @""); // 2691 = ⚑ - NSString *const statusFormat = @"%ld %@"; - statusString = [NSString stringWithFormat:statusFormat, - (long)status, flag]; - } - } - - // show the response URL only if it's different from the request URL - NSString *responseURLStr = @""; - NSURL *responseURL = [response URL]; - - if (responseURL && ![responseURL isEqual:[request URL]]) { - NSString *const responseURLFormat = @"response URL:" - " %@
\n"; - responseURLStr = [NSString stringWithFormat:responseURLFormat, - [responseURL absoluteString]]; - } - - [outputHTML appendFormat:@"response:  status %@
\n%@", - statusString, responseURLStr]; - - // Write the response headers - NSUInteger numberOfResponseHeaders = [responseHeaders count]; - if (numberOfResponseHeaders > 0) { - // Indicate if the server is setting cookies - NSString *cookiesSet = [responseHeaders valueForKey:@"Set-Cookie"]; - NSString *cookiesStr = (cookiesSet ? @"  " - "sets cookies" : @""); - // Indicate if the server is redirecting - NSString *location = [responseHeaders valueForKey:@"Location"]; - BOOL isRedirect = (status >= 300 && status <= 399 && location != nil); - NSString *redirectsStr = (isRedirect ? @"  " - "redirects" : @""); - - [outputHTML appendFormat:@"   headers: %d %@ %@
\n", - (int)numberOfResponseHeaders, cookiesStr, redirectsStr]; - } else { - [outputHTML appendString:@"   headers: none
\n"]; - } - } - - // error - if (error) { - [outputHTML appendFormat:@"Error: %@
\n", [error description]]; - } - - // Write the response data - if (responseDataFileName) { - NSString *escapedResponseFile = [responseDataFileName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - if (isResponseImage) { - // Make a small inline image that links to the full image file - [outputHTML appendFormat:@"   data: %d bytes, %@
", - (int)responseDataLength, responseMIMEType]; - NSString *const fmt = @"image\n"; - [outputHTML appendFormat:fmt, - escapedResponseFile, escapedResponseFile]; - } else { - // The response data was XML; link to the xml file - NSString *const fmt = @"   data: %d bytes, " - "%@   %@\n"; - [outputHTML appendFormat:fmt, - (int)responseDataLength, responseMIMEType, - escapedResponseFile, [escapedResponseFile pathExtension]]; - } - } else { - // The response data was not an image; just show the length and MIME type - [outputHTML appendFormat:@"   data: %d bytes, %@\n", - (int)responseDataLength, responseMIMEType]; - } - - // Make a single string of the request and response, suitable for copying - // to the clipboard and pasting into a bug report - NSMutableString *copyable = [NSMutableString string]; - if (comment) { - [copyable appendFormat:@"%@\n\n", comment]; - } - [copyable appendFormat:@"%@\n", [NSDate date]]; - if (redirectedFromHost) { - [copyable appendFormat:@"Redirected from %@\n", redirectedFromHost]; - } - [copyable appendFormat:@"Request: %@ %@\n", requestMethod, requestURL]; - if ([requestHeaders count] > 0) { - [copyable appendFormat:@"Request headers:\n%@\n", - [[self class] headersStringForDictionary:requestHeaders]]; - } - - if (postDataLength > 0) { - [copyable appendFormat:@"Request body: (%u bytes)\n", - (unsigned int) postDataLength]; - if (postDataStr) { - [copyable appendFormat:@"%@\n", postDataStr]; - } - [copyable appendString:@"\n"]; - } - - if (response) { - [copyable appendFormat:@"Response: status %d\n", (int) status]; - [copyable appendFormat:@"Response headers:\n%@\n", - [[self class] headersStringForDictionary:responseHeaders]]; - [copyable appendFormat:@"Response body: (%u bytes)\n", - (unsigned int) responseDataLength]; - if (responseDataLength > 0) { - if (logResponseBody_) { - responseDataStr = [[logResponseBody_ copy] autorelease]; - [logResponseBody_ release]; - logResponseBody_ = nil; - } - if (responseDataStr != nil) { - [copyable appendFormat:@"%@\n", responseDataStr]; - } else if (status >= 400 && [temporaryDownloadPath_ length] > 0) { - // Try to read in the saved data, which is probably a server error - // message - NSStringEncoding enc; - responseDataStr = [NSString stringWithContentsOfFile:temporaryDownloadPath_ - usedEncoding:&enc - error:NULL]; - if ([responseDataStr length] > 0) { - [copyable appendFormat:@"%@\n", responseDataStr]; - } else { - [copyable appendFormat:@"<<%u bytes to file>>\n", - (unsigned int) responseDataLength]; - } - } else { - // Even though it's redundant, we'll put in text to indicate that all - // the bytes are binary - [copyable appendFormat:@"<<%u bytes>>\n", - (unsigned int) responseDataLength]; - } - } - } - - if (error) { - [copyable appendFormat:@"Error: %@\n", error]; - } - - // Save to log property before adding the separator - self.log = copyable; - - [copyable appendString:@"-----------------------------------------------------------\n"]; - - - // Write the copyable version to another file (linked to at the top of the - // html file, above) - // - // Ideally, something to just copy this to the clipboard like - // Copy here." - // would work everywhere, but it only works in Safari as of 8/2010 - if (gIsLoggingToFile) { - NSString *copyablePath = [logDirectory stringByAppendingPathComponent:copyableFileName]; - NSError *copyableError = nil; - if (![copyable writeToFile:copyablePath - atomically:NO - encoding:NSUTF8StringEncoding - error:©ableError]) { - // Error writing to file - NSLog(@"%@ logging write error:%@ (%@)", - [self class], copyableError, copyablePath); - } - - [outputHTML appendString:@"


"]; - - // Append the HTML to the main output file - const char* htmlBytes = [outputHTML UTF8String]; - NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:htmlPath - append:YES]; - [stream open]; - [stream write:(const uint8_t *) htmlBytes maxLength:strlen(htmlBytes)]; - [stream close]; - - // Make a symlink to the latest html - NSString *const symlinkNameSuffix = [[self class] symlinkNameSuffix]; - NSString *symlinkName = [processName stringByAppendingString:symlinkNameSuffix]; - NSString *symlinkPath = [parentDir stringByAppendingPathComponent:symlinkName]; - - [[self class] removeItemAtPath:symlinkPath]; - [[self class] createSymbolicLinkAtPath:symlinkPath - withDestinationPath:htmlPath]; - -#if GTM_IPHONE - static BOOL gReportedLoggingPath = NO; - if (!gReportedLoggingPath) { - gReportedLoggingPath = YES; - NSLog(@"GTMHTTPFetcher logging to \"%@\"", parentDir); - } -#endif - } -} - -- (BOOL)logCapturePostStream { - // This is called when beginning a fetch. The caller should have already - // verified that logging is enabled, and should have allocated - // loggedStreamData_ as a mutable object. - - // If the class GTMReadMonitorInputStream is not available, bail now, since - // we cannot capture this upload stream - Class monitorClass = NSClassFromString(@"GTMReadMonitorInputStream"); - if (!monitorClass) return NO; - - // If we're logging, we need to wrap the upload stream with our monitor - // stream that will call us back with the bytes being read from the stream - - // Our wrapper will retain the old post stream - [postStream_ autorelease]; - - postStream_ = [monitorClass inputStreamWithStream:postStream_]; - [postStream_ retain]; - - [(GTMReadMonitorInputStream *)postStream_ setReadDelegate:self]; - [(GTMReadMonitorInputStream *)postStream_ setRunLoopModes:[self runLoopModes]]; - - SEL readSel = @selector(inputStream:readIntoBuffer:length:); - [(GTMReadMonitorInputStream *)postStream_ setReadSelector:readSel]; - - return YES; -} - -@end - -@implementation GTMHTTPFetcher (GTMHTTPFetcherLoggingUtilities) - -- (void)inputStream:(GTMReadMonitorInputStream *)stream - readIntoBuffer:(void *)buffer - length:(NSUInteger)length { - // append the captured data - [loggedStreamData_ appendBytes:buffer length:length]; -} - -#pragma mark Internal file routines - -// We implement plain Unix versions of NSFileManager methods to avoid -// NSFileManager's issues with being used from multiple threads - -+ (BOOL)fileOrDirExistsAtPath:(NSString *)path { - struct stat buffer; - int result = stat([path fileSystemRepresentation], &buffer); - return (result == 0); -} - -+ (BOOL)makeDirectoryUpToPath:(NSString *)path { - int result = 0; - - // Recursively create the parent directory of the requested path - NSString *parent = [path stringByDeletingLastPathComponent]; - if (![self fileOrDirExistsAtPath:parent]) { - result = [self makeDirectoryUpToPath:parent]; - } - - // Make the leaf directory - if (result == 0 && ![self fileOrDirExistsAtPath:path]) { - result = mkdir([path fileSystemRepresentation], S_IRWXU); // RWX for owner - } - return (result == 0); -} - -+ (BOOL)removeItemAtPath:(NSString *)path { - int result = unlink([path fileSystemRepresentation]); - return (result == 0); -} - -+ (BOOL)createSymbolicLinkAtPath:(NSString *)newPath - withDestinationPath:(NSString *)targetPath { - int result = symlink([targetPath fileSystemRepresentation], - [newPath fileSystemRepresentation]); - return (result == 0); -} - -#pragma mark Fomatting Utilities - -+ (NSString *)snipSubstringOfString:(NSString *)originalStr - betweenStartString:(NSString *)startStr - endString:(NSString *)endStr { -#if SKIP_GTM_FETCH_LOGGING_SNIPPING - return originalStr; -#else - if (originalStr == nil) return nil; - - // Find the start string, and replace everything between it - // and the end string (or the end of the original string) with "_snip_" - NSRange startRange = [originalStr rangeOfString:startStr]; - if (startRange.location == NSNotFound) return originalStr; - - // We found the start string - NSUInteger originalLength = [originalStr length]; - NSUInteger startOfTarget = NSMaxRange(startRange); - NSRange targetAndRest = NSMakeRange(startOfTarget, - originalLength - startOfTarget); - NSRange endRange = [originalStr rangeOfString:endStr - options:0 - range:targetAndRest]; - NSRange replaceRange; - if (endRange.location == NSNotFound) { - // Found no end marker so replace to end of string - replaceRange = targetAndRest; - } else { - // Replace up to the endStr - replaceRange = NSMakeRange(startOfTarget, - endRange.location - startOfTarget); - } - - NSString *result = [originalStr stringByReplacingCharactersInRange:replaceRange - withString:@"_snip_"]; - return result; -#endif // SKIP_GTM_FETCH_LOGGING_SNIPPING -} - -+ (NSString *)headersStringForDictionary:(NSDictionary *)dict { - // Format the dictionary in http header style, like - // Accept: application/json - // Cache-Control: no-cache - // Content-Type: application/json; charset=utf-8 - // - // Pad the key names, but not beyond 16 chars, since long custom header - // keys just create too much whitespace - NSArray *keys = [[dict allKeys] sortedArrayUsingSelector:@selector(compare:)]; - - NSMutableString *str = [NSMutableString string]; - for (NSString *key in keys) { - NSString *value = [dict valueForKey:key]; - if ([key isEqual:@"Authorization"]) { - // Remove OAuth 1 token - value = [[self class] snipSubstringOfString:value - betweenStartString:@"oauth_token=\"" - endString:@"\""]; - - // Remove OAuth 2 bearer token (draft 16, and older form) - value = [[self class] snipSubstringOfString:value - betweenStartString:@"Bearer " - endString:@"\n"]; - value = [[self class] snipSubstringOfString:value - betweenStartString:@"OAuth " - endString:@"\n"]; - - // Remove Google ClientLogin - value = [[self class] snipSubstringOfString:value - betweenStartString:@"GoogleLogin auth=" - endString:@"\n"]; - } - [str appendFormat:@" %@: %@\n", key, value]; - } - return str; -} - -+ (id)JSONObjectWithData:(NSData *)data { - Class serializer = NSClassFromString(@"NSJSONSerialization"); - if (serializer) { - const NSUInteger kOpts = (1UL << 0); // NSJSONReadingMutableContainers - NSMutableDictionary *obj; - obj = [serializer JSONObjectWithData:data - options:kOpts - error:NULL]; - return obj; - } else { - // Try SBJsonParser or SBJSON - Class jsonParseClass = NSClassFromString(@"SBJsonParser"); - if (!jsonParseClass) { - jsonParseClass = NSClassFromString(@"SBJSON"); - } - if (jsonParseClass) { - GTMFetcherSBJSON *parser = [[[jsonParseClass alloc] init] autorelease]; - NSString *jsonStr = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - if (jsonStr) { - NSMutableDictionary *obj = [parser objectWithString:jsonStr error:NULL]; - return obj; - } - } - } - return nil; -} - -+ (id)stringWithJSONObject:(id)obj { - Class serializer = NSClassFromString(@"NSJSONSerialization"); - if (serializer) { - const NSUInteger kOpts = (1UL << 0); // NSJSONWritingPrettyPrinted - NSData *data; - data = [serializer dataWithJSONObject:obj - options:kOpts - error:NULL]; - if (data) { - NSString *jsonStr = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - return jsonStr; - } - } else { - // Try SBJsonParser or SBJSON - Class jsonWriterClass = NSClassFromString(@"SBJsonWriter"); - if (!jsonWriterClass) { - jsonWriterClass = NSClassFromString(@"SBJSON"); - } - if (jsonWriterClass) { - GTMFetcherSBJSON *writer = [[[jsonWriterClass alloc] init] autorelease]; - [writer setHumanReadable:YES]; - NSString *jsonStr = [writer stringWithObject:obj error:NULL]; - return jsonStr; - } - } - return nil; -} - -@end - -#endif // !STRIP_GTM_FETCH_LOGGING diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.h deleted file mode 100755 index 94912b6da..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.h +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPFetcherService.h -// - -// The fetcher service class maintains a history to be used by a sequence -// of fetchers objects generated by the service. -// -// Fetchers that do not need to share a history may be generated independently, -// like -// -// GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request]; -// -// Fetchers that should share cookies or an ETagged data cache should be -// generated by a common GTMHTTPFetcherService instance, like -// -// GTMHTTPFetcherService *myFetcherService = [[GTMHTTPFetcherService alloc] init]; -// GTMHTTPFetcher* myFirstFetcher = [myFetcherService fetcherWithRequest:request1]; -// GTMHTTPFetcher* mySecondFetcher = [myFetcherService fetcherWithRequest:request2]; - -#import "GTMHTTPFetcher.h" -#import "GTMHTTPFetchHistory.h" - -@interface GTMHTTPFetcherService : NSObject { - @private - NSMutableDictionary *delayedHosts_; - NSMutableDictionary *runningHosts_; - NSUInteger maxRunningFetchersPerHost_; - - GTMHTTPFetchHistory *fetchHistory_; - NSOperationQueue *delegateQueue_; - NSArray *runLoopModes_; - NSString *userAgent_; - NSTimeInterval timeout_; - NSURLCredential *credential_; // username & password - NSURLCredential *proxyCredential_; // credential supplied to proxy servers - NSInteger cookieStorageMethod_; - - NSArray *allowedInsecureSchemes_; - BOOL allowLocalhostRequest_; - - BOOL shouldFetchInBackground_; - - id authorizer_; -} - -// Create a fetcher -// -// These methods will return an autoreleased fetcher, but if -// the fetcher is successfully created, the connection will retain the -// fetcher for the life of the connection as well. So the caller doesn't have -// to retain the fetcher explicitly unless they want to be able to monitor -// or cancel it. -- (GTMHTTPFetcher *)fetcherWithRequest:(NSURLRequest *)request; -- (GTMHTTPFetcher *)fetcherWithURL:(NSURL *)requestURL; -- (GTMHTTPFetcher *)fetcherWithURLString:(NSString *)requestURLString; -- (id)fetcherWithRequest:(NSURLRequest *)request - fetcherClass:(Class)fetcherClass; - -// Queues of delayed and running fetchers. Each dictionary contains arrays -// of fetchers, keyed by host -// -// A max value of 0 means no fetchers should be delayed. -// -// The default limit is 10 simultaneous fetchers targeting each host. -@property (assign) NSUInteger maxRunningFetchersPerHost; -@property (retain, readonly) NSDictionary *delayedHosts; -@property (retain, readonly) NSDictionary *runningHosts; - -- (BOOL)isDelayingFetcher:(GTMHTTPFetcher *)fetcher; - -- (NSUInteger)numberOfFetchers; // running + delayed fetchers -- (NSUInteger)numberOfRunningFetchers; -- (NSUInteger)numberOfDelayedFetchers; - -// Search for running or delayed fetchers with the specified URL. -// -// Returns an array of fetcher objects found, or nil if none found. -- (NSArray *)issuedFetchersWithRequestURL:(NSURL *)requestURL; - -- (void)stopAllFetchers; - -// Properties to be applied to each fetcher; -// see GTMHTTPFetcher.h for descriptions -@property (copy) NSString *userAgent; -@property (assign) NSTimeInterval timeout; -@property (retain) NSOperationQueue *delegateQueue; -@property (retain) NSArray *runLoopModes; -@property (retain) NSURLCredential *credential; -@property (retain) NSURLCredential *proxyCredential; -@property (assign) BOOL shouldFetchInBackground; -@property (copy) NSArray *allowedInsecureSchemes; -@property (assign) BOOL allowLocalhostRequest; - -// Fetch history -@property (retain) GTMHTTPFetchHistory *fetchHistory; - -@property (assign) NSInteger cookieStorageMethod; -@property (assign) BOOL shouldRememberETags; // default: NO -@property (assign) BOOL shouldCacheETaggedData; // default: NO - -- (void)clearETaggedDataCache; -- (void)clearHistory; - -@property (nonatomic, retain) id authorizer; - -// Spin the run loop, discarding events, until all running and delayed fetchers -// have completed -// -// This is only for use in testing or in tools without a user interface. -// -// Synchronous fetches should never be done by shipping apps; they are -// sufficient reason for rejection from the app store. -- (void)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds; - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.m deleted file mode 100755 index 4a00e5810..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPFetcherService.m +++ /dev/null @@ -1,507 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPFetcherService.m -// - -#import "GTMHTTPFetcherService.h" - -@interface GTMHTTPFetcher (ServiceMethods) -- (BOOL)beginFetchMayDelay:(BOOL)mayDelay - mayAuthorize:(BOOL)mayAuthorize; -@end - -@interface GTMHTTPFetcherService () -@property (retain, readwrite) NSDictionary *delayedHosts; -@property (retain, readwrite) NSDictionary *runningHosts; - -- (void)detachAuthorizer; -@end - -@implementation GTMHTTPFetcherService - -@synthesize maxRunningFetchersPerHost = maxRunningFetchersPerHost_, - userAgent = userAgent_, - timeout = timeout_, - delegateQueue = delegateQueue_, - runLoopModes = runLoopModes_, - credential = credential_, - proxyCredential = proxyCredential_, - cookieStorageMethod = cookieStorageMethod_, - shouldFetchInBackground = shouldFetchInBackground_, - allowedInsecureSchemes = allowedInsecureSchemes_, - allowLocalhostRequest = allowLocalhostRequest_, - fetchHistory = fetchHistory_; - -- (id)init { - self = [super init]; - if (self) { - fetchHistory_ = [[GTMHTTPFetchHistory alloc] init]; - delayedHosts_ = [[NSMutableDictionary alloc] init]; - runningHosts_ = [[NSMutableDictionary alloc] init]; - cookieStorageMethod_ = kGTMHTTPFetcherCookieStorageMethodFetchHistory; - - maxRunningFetchersPerHost_ = 10; -} - return self; -} - -- (void)dealloc { - [self detachAuthorizer]; - - [delayedHosts_ release]; - [runningHosts_ release]; - [fetchHistory_ release]; - [userAgent_ release]; - [delegateQueue_ release]; - [runLoopModes_ release]; - [credential_ release]; - [proxyCredential_ release]; - [authorizer_ release]; - - [super dealloc]; -} - -#pragma mark Generate a new fetcher - -- (id)fetcherWithRequest:(NSURLRequest *)request - fetcherClass:(Class)fetcherClass { - GTMHTTPFetcher *fetcher = [fetcherClass fetcherWithRequest:request]; - - fetcher.fetchHistory = self.fetchHistory; - fetcher.delegateQueue = self.delegateQueue; - fetcher.runLoopModes = self.runLoopModes; - fetcher.cookieStorageMethod = self.cookieStorageMethod; - fetcher.credential = self.credential; - fetcher.proxyCredential = self.proxyCredential; - fetcher.shouldFetchInBackground = self.shouldFetchInBackground; - fetcher.allowedInsecureSchemes = self.allowedInsecureSchemes; - fetcher.allowLocalhostRequest = self.allowLocalhostRequest; - fetcher.authorizer = self.authorizer; - fetcher.service = self; - - NSString *userAgent = self.userAgent; - if ([userAgent length] > 0 - && [request valueForHTTPHeaderField:@"User-Agent"] == nil) { - [fetcher.mutableRequest setValue:userAgent - forHTTPHeaderField:@"User-Agent"]; - } - - NSTimeInterval timeout = self.timeout; - if (timeout > 0.0) { - [fetcher.mutableRequest setTimeoutInterval:timeout]; - } - - return fetcher; -} - -- (GTMHTTPFetcher *)fetcherWithRequest:(NSURLRequest *)request { - return [self fetcherWithRequest:request - fetcherClass:[GTMHTTPFetcher class]]; -} - -- (GTMHTTPFetcher *)fetcherWithURL:(NSURL *)requestURL { - return [self fetcherWithRequest:[NSURLRequest requestWithURL:requestURL]]; -} - -- (GTMHTTPFetcher *)fetcherWithURLString:(NSString *)requestURLString { - return [self fetcherWithURL:[NSURL URLWithString:requestURLString]]; -} - -#pragma mark Queue Management - -- (void)addRunningFetcher:(GTMHTTPFetcher *)fetcher - forHost:(NSString *)host { - // Add to the array of running fetchers for this host, creating the array - // if needed - NSMutableArray *runningForHost = [runningHosts_ objectForKey:host]; - if (runningForHost == nil) { - runningForHost = [NSMutableArray arrayWithObject:fetcher]; - [runningHosts_ setObject:runningForHost forKey:host]; - } else { - [runningForHost addObject:fetcher]; - } -} - -- (void)addDelayedFetcher:(GTMHTTPFetcher *)fetcher - forHost:(NSString *)host { - // Add to the array of delayed fetchers for this host, creating the array - // if needed - NSMutableArray *delayedForHost = [delayedHosts_ objectForKey:host]; - if (delayedForHost == nil) { - delayedForHost = [NSMutableArray arrayWithObject:fetcher]; - [delayedHosts_ setObject:delayedForHost forKey:host]; - } else { - [delayedForHost addObject:fetcher]; - } -} - -- (BOOL)isDelayingFetcher:(GTMHTTPFetcher *)fetcher { - @synchronized(self) { - NSString *host = [[[fetcher mutableRequest] URL] host]; - NSArray *delayedForHost = [delayedHosts_ objectForKey:host]; - NSUInteger idx = [delayedForHost indexOfObjectIdenticalTo:fetcher]; - BOOL isDelayed = (delayedForHost != nil) && (idx != NSNotFound); - return isDelayed; - } -} - -- (BOOL)fetcherShouldBeginFetching:(GTMHTTPFetcher *)fetcher { - // Entry point from the fetcher - @synchronized(self) { - NSURL *requestURL = [[fetcher mutableRequest] URL]; - NSString *host = [requestURL host]; - - // Addresses "file:///path" case where localhost is the implicit host. - if ([host length] == 0 && [requestURL isFileURL]) { - host = @"localhost"; - } - - if ([host length] == 0) { -#if DEBUG - // Data URIs legitimately have no host, reject other hostless URLs. - NSAssert1([[requestURL scheme] isEqual:@"data"], @"%@ lacks host", fetcher); -#endif - return YES; - } - - NSMutableArray *runningForHost = [runningHosts_ objectForKey:host]; - if (runningForHost != nil - && [runningForHost indexOfObjectIdenticalTo:fetcher] != NSNotFound) { -#if DEBUG - NSAssert1(0, @"%@ was already running", fetcher); -#endif - return YES; - } - - // We'll save the host that serves as the key for this fetcher's array - // to avoid any chance of the underlying request changing, stranding - // the fetcher in the wrong array - fetcher.serviceHost = host; - fetcher.thread = [NSThread currentThread]; - - if (maxRunningFetchersPerHost_ == 0 - || maxRunningFetchersPerHost_ > [runningForHost count]) { - [self addRunningFetcher:fetcher forHost:host]; - return YES; - } else { - [self addDelayedFetcher:fetcher forHost:host]; - return NO; - } - } - return YES; -} - -// Fetcher start and stop methods, invoked on the appropriate thread for -// the fetcher -- (void)performSelector:(SEL)sel onStartThreadForFetcher:(GTMHTTPFetcher *)fetcher { - NSOperationQueue *delegateQueue = fetcher.delegateQueue; - NSThread *thread = fetcher.thread; - if (delegateQueue != nil || [thread isEqual:[NSThread currentThread]]) { - // The fetcher should run on the thread we're on now, or there's a delegate - // queue specified so it doesn't matter what thread the fetcher is started - // on, since it will call back on the queue. - [self performSelector:sel withObject:fetcher]; - } else { - // Fetcher must run on a specified thread (and that thread must have a - // run loop.) - [self performSelector:sel - onThread:thread - withObject:fetcher - waitUntilDone:NO]; - } -} - -- (void)startFetcherOnCurrentThread:(GTMHTTPFetcher *)fetcher { - [fetcher beginFetchMayDelay:NO - mayAuthorize:YES]; -} - -- (void)startFetcher:(GTMHTTPFetcher *)fetcher { - [self performSelector:@selector(startFetcherOnCurrentThread:) - onStartThreadForFetcher:fetcher]; -} - -- (void)stopFetcherOnCurrentThread:(GTMHTTPFetcher *)fetcher { - [fetcher stopFetching]; -} - -- (void)stopFetcher:(GTMHTTPFetcher *)fetcher { - [self performSelector:@selector(stopFetcherOnCurrentThread:) - onStartThreadForFetcher:fetcher]; -} - -- (void)fetcherDidStop:(GTMHTTPFetcher *)fetcher { - // Entry point from the fetcher - @synchronized(self) { - NSString *host = fetcher.serviceHost; - if (!host) { - // fetcher has been stopped previously - return; - } - - NSMutableArray *runningForHost = [runningHosts_ objectForKey:host]; - [runningForHost removeObject:fetcher]; - - NSMutableArray *delayedForHost = [delayedHosts_ objectForKey:host]; - [delayedForHost removeObject:fetcher]; - - while ([delayedForHost count] > 0 - && [runningForHost count] < maxRunningFetchersPerHost_) { - // Start another delayed fetcher running, scanning for the minimum - // priority value, defaulting to FIFO for equal priorities - GTMHTTPFetcher *nextFetcher = nil; - for (GTMHTTPFetcher *delayedFetcher in delayedForHost) { - if (nextFetcher == nil - || delayedFetcher.servicePriority < nextFetcher.servicePriority) { - nextFetcher = delayedFetcher; - } - } - - if (nextFetcher) { - [self addRunningFetcher:nextFetcher forHost:host]; - runningForHost = [runningHosts_ objectForKey:host]; - - [delayedForHost removeObjectIdenticalTo:nextFetcher]; - [self startFetcher:nextFetcher]; - } - } - - if ([runningForHost count] == 0) { - // None left; remove the empty array - [runningHosts_ removeObjectForKey:host]; - } - - if ([delayedForHost count] == 0) { - [delayedHosts_ removeObjectForKey:host]; - } - - // The fetcher is no longer in the running or the delayed array, - // so remove its host and thread properties - fetcher.serviceHost = nil; - fetcher.thread = nil; - } -} - -- (NSUInteger)numberOfFetchers { - @synchronized(self) { - NSUInteger running = [self numberOfRunningFetchers]; - NSUInteger delayed = [self numberOfDelayedFetchers]; - return running + delayed; - } -} - -- (NSUInteger)numberOfRunningFetchers { - @synchronized(self) { - NSUInteger sum = 0; - for (NSString *host in runningHosts_) { - NSArray *fetchers = [runningHosts_ objectForKey:host]; - sum += [fetchers count]; - } - return sum; - } -} - -- (NSUInteger)numberOfDelayedFetchers { - @synchronized(self) { - NSUInteger sum = 0; - for (NSString *host in delayedHosts_) { - NSArray *fetchers = [delayedHosts_ objectForKey:host]; - sum += [fetchers count]; - } - return sum; - } -} - -- (NSArray *)issuedFetchersWithRequestURL:(NSURL *)requestURL { - @synchronized(self) { - NSMutableArray *array = nil; - NSString *host = [requestURL host]; - if ([host length] == 0) return nil; - - NSURL *absRequestURL = [requestURL absoluteURL]; - - NSArray *runningForHost = [runningHosts_ objectForKey:host]; - for (GTMHTTPFetcher *fetcher in runningForHost) { - NSURL *fetcherURL = [[[fetcher mutableRequest] URL] absoluteURL]; - if ([fetcherURL isEqual:absRequestURL]) { - if (array == nil) { - array = [NSMutableArray array]; - } - [array addObject:fetcher]; - } - } - - NSArray *delayedForHost = [delayedHosts_ objectForKey:host]; - for (GTMHTTPFetcher *fetcher in delayedForHost) { - NSURL *fetcherURL = [[[fetcher mutableRequest] URL] absoluteURL]; - if ([fetcherURL isEqual:absRequestURL]) { - if (array == nil) { - array = [NSMutableArray array]; - } - [array addObject:fetcher]; - } - } - return array; - } -} - -- (void)stopAllFetchers { - @synchronized(self) { - // Remove fetchers from the delayed list to avoid fetcherDidStop: from - // starting more fetchers running as a side effect of stopping one - NSArray *delayedForHosts = [delayedHosts_ allValues]; - [delayedHosts_ removeAllObjects]; - - for (NSArray *delayedForHost in delayedForHosts) { - for (GTMHTTPFetcher *fetcher in delayedForHost) { - [self stopFetcher:fetcher]; - } - } - - NSArray *runningForHosts = [runningHosts_ allValues]; - [runningHosts_ removeAllObjects]; - - for (NSArray *runningForHost in runningForHosts) { - for (GTMHTTPFetcher *fetcher in runningForHost) { - [self stopFetcher:fetcher]; - } - } - } -} - -#pragma mark Fetch History Settings - -// Turn on data caching to receive a copy of previously-retrieved objects. -// Otherwise, fetches may return status 304 (No Change) rather than actual data -- (void)setShouldCacheETaggedData:(BOOL)flag { - self.fetchHistory.shouldCacheETaggedData = flag; -} - -- (BOOL)shouldCacheETaggedData { - return self.fetchHistory.shouldCacheETaggedData; -} - -- (void)setETaggedDataCacheCapacity:(NSUInteger)totalBytes { - self.fetchHistory.memoryCapacity = totalBytes; -} - -- (NSUInteger)ETaggedDataCacheCapacity { - return self.fetchHistory.memoryCapacity; -} - -- (void)setShouldRememberETags:(BOOL)flag { - self.fetchHistory.shouldRememberETags = flag; -} - -- (BOOL)shouldRememberETags { - return self.fetchHistory.shouldRememberETags; -} - -// reset the ETag cache to avoid getting a Not Modified status -// based on prior queries -- (void)clearETaggedDataCache { - [self.fetchHistory clearETaggedDataCache]; -} - -- (void)clearHistory { - [self clearETaggedDataCache]; - [self.fetchHistory removeAllCookies]; -} - -#pragma mark Synchronous Wait for Unit Testing - -- (void)waitForCompletionOfAllFetchersWithTimeout:(NSTimeInterval)timeoutInSeconds { - NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds]; - BOOL isMainThread = [NSThread isMainThread]; - - while ([self numberOfFetchers] > 0 - && [giveUpDate timeIntervalSinceNow] > 0) { - // Run the current run loop 1/1000 of a second to give the networking - // code a chance to work - if (isMainThread || delegateQueue_ == nil) { - NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:0.001]; - [[NSRunLoop currentRunLoop] runUntilDate:stopDate]; - } else { - // Sleep on the delegate queue's background thread. - [NSThread sleepForTimeInterval:0.001]; - } - } -} - -#pragma mark Accessors - -- (NSDictionary *)runningHosts { - return runningHosts_; -} - -- (void)setRunningHosts:(NSDictionary *)dict { - [runningHosts_ autorelease]; - runningHosts_ = [dict mutableCopy]; -} - -- (NSDictionary *)delayedHosts { - return delayedHosts_; -} - -- (void)setDelayedHosts:(NSDictionary *)dict { - [delayedHosts_ autorelease]; - delayedHosts_ = [dict mutableCopy]; -} - -- (id )authorizer { - return authorizer_; -} - -- (void)setAuthorizer:(id )obj { - if (obj != authorizer_) { - [self detachAuthorizer]; - } - - [authorizer_ autorelease]; - authorizer_ = [obj retain]; - - // Use the fetcher service for the authorization fetches if the auth - // object supports fetcher services - if ([authorizer_ respondsToSelector:@selector(setFetcherService:)]) { -#if GTM_USE_SESSION_FETCHER - [authorizer_ setFetcherService:(id)self]; -#else - [authorizer_ setFetcherService:self]; -#endif - } -} - -- (void)detachAuthorizer { - // This method is called by the fetcher service's dealloc and setAuthorizer: - // methods; do not override. - // - // The fetcher service retains the authorizer, and the authorizer has a - // weak pointer to the fetcher service (a non-zeroing pointer for - // compatibility with iOS 4 and Mac OS X 10.5/10.6.) - // - // When this fetcher service no longer uses the authorizer, we want to remove - // the authorizer's dependence on the fetcher service. Authorizers can still - // function without a fetcher service. - if ([authorizer_ respondsToSelector:@selector(fetcherService)]) { - id authFetcherService = [authorizer_ fetcherService]; - if (authFetcherService == self) { - [authorizer_ setFetcherService:nil]; - } - } -} - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.h deleted file mode 100755 index b0ce3b6ad..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.h +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPUploadFetcher.h -// - -#if (!GDATA_REQUIRE_SERVICE_INCLUDES) || GDATA_INCLUDE_DOCS_SERVICE || \ - GDATA_INCLUDE_YOUTUBE_SERVICE || GDATA_INCLUDE_PHOTOS_SERVICE - -// -// This subclass of GTMHTTPFetcher simulates the series of fetches -// needed for chunked upload as a single fetch operation. -// -// Protocol document: -// http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal -// -// To the client, the only fetcher that exists is this class; the subsidiary -// fetchers needed for uploading chunks are not visible (though the most recent -// chunk fetcher may be accessed via the -activeFetcher method, and -// -responseHeaders and -statusCode reflect results from the most recent chunk -// fetcher.) -// -// Chunk fetchers are discarded as soon as they have completed. -// - -#pragma once - -#import "GTMHTTPFetcher.h" -#import "GTMHTTPFetcherService.h" - -// async retrieval of an http get or post -@interface GTMHTTPUploadFetcher : GTMHTTPFetcher { - GTMHTTPFetcher *chunkFetcher_; - - // we'll call through to the delegate's sentData and finished selectors - SEL delegateSentDataSEL_; - SEL delegateFinishedSEL_; - - BOOL needsManualProgress_; - - // the initial fetch's body length and bytes actually sent are - // needed for calculating progress during subsequent chunk uploads - NSUInteger initialBodyLength_; - NSUInteger initialBodySent_; - - NSURL *locationURL_; -#if NS_BLOCKS_AVAILABLE - void (^locationChangeBlock_)(NSURL *); -#elif !__LP64__ - // placeholders: for 32-bit builds, keep the size of the object's ivar section - // the same with and without blocks -#ifndef __clang_analyzer__ - id locationChangePlaceholder_; -#endif -#endif - - // uploadData_ or uploadFileHandle_ may be set, but not both - NSData *uploadData_; - NSFileHandle *uploadFileHandle_; - NSInteger uploadFileHandleLength_; - NSString *uploadMIMEType_; - NSUInteger chunkSize_; - BOOL isPaused_; - BOOL isRestartedUpload_; - - // we keep the latest offset into the upload data just for - // progress reporting - NSUInteger currentOffset_; - - // we store the response headers and status code for the most recent - // chunk fetcher - NSDictionary *responseHeaders_; - NSInteger statusCode_; -} - -+ (GTMHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request - uploadData:(NSData *)data - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize - fetcherService:(GTMHTTPFetcherService *)fetcherServiceOrNil; - -+ (GTMHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request - uploadFileHandle:(NSFileHandle *)fileHandle - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize - fetcherService:(GTMHTTPFetcherService *)fetcherServiceOrNil; - -+ (GTMHTTPUploadFetcher *)uploadFetcherWithLocation:(NSURL *)locationURL - uploadFileHandle:(NSFileHandle *)fileHandle - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize - fetcherService:(GTMHTTPFetcherService *)fetcherServiceOrNil; -- (void)pauseFetching; -- (void)resumeFetching; -- (BOOL)isPaused; - -@property (retain) NSURL *locationURL; -@property (retain) NSData *uploadData; -@property (retain) NSFileHandle *uploadFileHandle; -@property (copy) NSString *uploadMIMEType; -@property (assign) NSUInteger chunkSize; -@property (assign) NSUInteger currentOffset; - -#if NS_BLOCKS_AVAILABLE -// When the upload location changes, the optional locationChangeBlock will be -// called. It will be called with nil once upload succeeds or can no longer -// be attempted. -@property (copy) void (^locationChangeBlock)(NSURL *locationURL); -#endif - -// the fetcher for the current data chunk, if any -@property (retain) GTMHTTPFetcher *chunkFetcher; - -// the active fetcher is the last chunk fetcher, or the upload fetcher itself -// if no chunk fetcher has yet been created -@property (readonly) GTMHTTPFetcher *activeFetcher; - -// the response headers from the most recently-completed fetch -@property (retain) NSDictionary *responseHeaders; - -// the status code from the most recently-completed fetch -@property (assign) NSInteger statusCode; - -@end - -#endif // #if !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.m deleted file mode 100755 index a7cea247a..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMHTTPUploadFetcher.m +++ /dev/null @@ -1,947 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMHTTPUploadFetcher.m -// - -#if (!GDATA_REQUIRE_SERVICE_INCLUDES) || GDATA_INCLUDE_DOCS_SERVICE || \ - GDATA_INCLUDE_YOUTUBE_SERVICE || GDATA_INCLUDE_PHOTOS_SERVICE - -#import "GTMHTTPUploadFetcher.h" - -static NSUInteger const kQueryServerForOffset = NSUIntegerMax; - -@interface GTMHTTPFetcher (ProtectedMethods) -@property (readwrite, retain) NSData *downloadedData; -- (void)releaseCallbacks; -- (void)stopFetchReleasingCallbacks:(BOOL)shouldReleaseCallbacks; -- (void)connectionDidFinishLoading:(NSURLConnection *)connection; -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; -@end - -@interface GTMHTTPUploadFetcher () -+ (GTMHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request - fetcherService:(GTMHTTPFetcherService *)fetcherService; -- (void)setLocationURL:(NSURL *)location - uploadData:(NSData *)data - uploadFileHandle:(NSFileHandle *)fileHandle - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize; - -- (void)uploadNextChunkWithOffset:(NSUInteger)offset; -- (void)uploadNextChunkWithOffset:(NSUInteger)offset - fetcherProperties:(NSMutableDictionary *)props; -- (void)destroyChunkFetcher; - -- (void)handleResumeIncompleteStatusForChunkFetcher:(GTMHTTPFetcher *)chunkFetcher; - -- (void)uploadFetcher:(GTMHTTPFetcher *)fetcher - didSendBytes:(NSInteger)bytesSent - totalBytesSent:(NSInteger)totalBytesSent -totalBytesExpectedToSend:(NSInteger)totalBytesExpected; - -- (void)reportProgressManually; - -- (NSUInteger)fullUploadLength; - --(BOOL)chunkFetcher:(GTMHTTPFetcher *)chunkFetcher - willRetry:(BOOL)willRetry - forError:(NSError *)error; - -- (void)chunkFetcher:(GTMHTTPFetcher *)chunkFetcher - finishedWithData:(NSData *)data - error:(NSError *)error; -@end - -@interface GTMHTTPUploadFetcher (PrivateMethods) -// private methods of the superclass -- (void)invokeSentDataCallback:(SEL)sel - target:(id)target - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten - totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; - -- (void)invokeFetchCallback:(SEL)sel - target:(id)target - data:(NSData *)data - error:(NSError *)error; - -- (BOOL)invokeRetryCallback:(SEL)sel - target:(id)target - willRetry:(BOOL)willRetry - error:(NSError *)error; -@end - -@implementation GTMHTTPUploadFetcher - -+ (GTMHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request - uploadData:(NSData *)data - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize - fetcherService:(GTMHTTPFetcherService *)fetcherService { - GTMHTTPUploadFetcher *fetcher = [self uploadFetcherWithRequest:request - fetcherService:fetcherService]; - [fetcher setLocationURL:nil - uploadData:data - uploadFileHandle:nil - uploadMIMEType:uploadMIMEType - chunkSize:chunkSize]; - return fetcher; -} - -+ (GTMHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request - uploadFileHandle:(NSFileHandle *)fileHandle - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize - fetcherService:(GTMHTTPFetcherService *)fetcherService { - GTMHTTPUploadFetcher *fetcher = [self uploadFetcherWithRequest:request - fetcherService:fetcherService]; - [fetcher setLocationURL:nil - uploadData:nil - uploadFileHandle:fileHandle - uploadMIMEType:uploadMIMEType - chunkSize:chunkSize]; - return fetcher; -} - -+ (GTMHTTPUploadFetcher *)uploadFetcherWithLocation:(NSURL *)locationURL - uploadFileHandle:(NSFileHandle *)fileHandle - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize - fetcherService:(GTMHTTPFetcherService *)fetcherService { - GTMHTTPUploadFetcher *fetcher = [self uploadFetcherWithRequest:nil - fetcherService:fetcherService]; - [fetcher setLocationURL:locationURL - uploadData:nil - uploadFileHandle:fileHandle - uploadMIMEType:uploadMIMEType - chunkSize:chunkSize]; - return fetcher; -} - -+ (GTMHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request - fetcherService:(GTMHTTPFetcherService *)fetcherService { - // Internal utility method for instantiating fetchers - GTMHTTPUploadFetcher *fetcher; - if (fetcherService) { - fetcher = [fetcherService fetcherWithRequest:request - fetcherClass:self]; - } else { - fetcher = (GTMHTTPUploadFetcher *) [self fetcherWithRequest:request]; - } - return fetcher; -} - -- (void)setLocationURL:(NSURL *)location - uploadData:(NSData *)data - uploadFileHandle:(NSFileHandle *)fileHandle - uploadMIMEType:(NSString *)uploadMIMEType - chunkSize:(NSUInteger)chunkSize { -#if DEBUG - NSAssert((data == nil) != (fileHandle == nil), - @"upload data and fileHandle are mutually exclusive"); - NSAssert((self.mutableRequest == nil) != (location == nil), - @"request and location are mutually exclusive"); - NSAssert(chunkSize > 0,@"chunk size is zero"); - NSAssert(chunkSize != NSUIntegerMax, @"chunk size is sentinel value"); -#endif - [self setLocationURL:location]; - [self setUploadData:data]; - [self setUploadFileHandle:fileHandle]; - [self setUploadMIMEType:uploadMIMEType]; - [self setChunkSize:chunkSize]; - - // indicate that we've not yet determined the file handle's length - uploadFileHandleLength_ = -1; - - // indicate that we've not yet determined the upload fetcher status - statusCode_ = -1; - - // if this is restarting an upload begun by another fetcher, - // the location is specified but the request is nil - isRestartedUpload_ = (location != nil); - - // add our custom headers to the initial request indicating the data - // type and total size to be delivered later in the chunk requests - NSMutableURLRequest *mutableReq = [self mutableRequest]; - - NSNumber *lengthNum = [NSNumber numberWithUnsignedInteger:[self fullUploadLength]]; - [mutableReq setValue:[lengthNum stringValue] - forHTTPHeaderField:@"X-Upload-Content-Length"]; - - [mutableReq setValue:uploadMIMEType - forHTTPHeaderField:@"X-Upload-Content-Type"]; -} - -- (void)dealloc { - [self releaseCallbacks]; - - [chunkFetcher_ release]; - [locationURL_ release]; -#if NS_BLOCKS_AVAILABLE - [locationChangeBlock_ release]; -#endif - [uploadData_ release]; - [uploadFileHandle_ release]; - [uploadMIMEType_ release]; - [responseHeaders_ release]; - [super dealloc]; -} - -#pragma mark - - -- (NSUInteger)fullUploadLength { - if (uploadData_) { - return [uploadData_ length]; - } else { - if (uploadFileHandleLength_ == -1) { - // first time through, seek to end to determine file length - uploadFileHandleLength_ = (NSInteger) [uploadFileHandle_ seekToEndOfFile]; - } - return (NSUInteger)uploadFileHandleLength_; - } -} - -- (NSData *)uploadSubdataWithOffset:(NSUInteger)offset - length:(NSUInteger)length { - NSData *resultData = nil; - - if (uploadData_) { - NSRange range = NSMakeRange(offset, length); - resultData = [uploadData_ subdataWithRange:range]; - } else { - @try { - [uploadFileHandle_ seekToFileOffset:offset]; - resultData = [uploadFileHandle_ readDataOfLength:length]; - } - @catch (NSException *exception) { - NSLog(@"uploadFileHandle exception: %@", exception); - } - } - - return resultData; -} - -#pragma mark Method overrides affecting the initial fetch only - -- (BOOL)beginFetchWithDelegate:(id)delegate - didFinishSelector:(SEL)finishedSEL { - - GTMAssertSelectorNilOrImplementedWithArgs(delegate, finishedSEL, - @encode(GTMHTTPFetcher *), @encode(NSData *), @encode(NSError *), 0); - - // replace the finishedSEL with our own, since the initial finish callback - // is just the beginning of the upload experience - delegateFinishedSEL_ = finishedSEL; - - // if the client is running early 10.5 or iPhone 2, we may need to manually - // send progress indication since NSURLConnection won't be calling back - // to us during uploads - needsManualProgress_ = ![GTMHTTPFetcher doesSupportSentDataCallback]; - - initialBodyLength_ = [[self postData] length]; - - if (isRestartedUpload_) { - if (![self isPaused]) { - if (delegate) { - [self setDelegate:delegate]; - finishedSel_ = finishedSEL; - } - [self uploadNextChunkWithOffset:kQueryServerForOffset]; - } - return YES; - } - - // we don't need a finish selector since we're overriding - // -connectionDidFinishLoading - return [super beginFetchWithDelegate:delegate - didFinishSelector:NULL]; -} - -#if NS_BLOCKS_AVAILABLE -- (BOOL)beginFetchWithCompletionHandler:(void (^)(NSData *data, NSError *error))handler { - // we don't want to call into the delegate's completion block immediately - // after the finish of the initial connection (the delegate is called only - // when uploading finishes), so we substitute our own completion block to be - // called when the initial connection finishes - void (^holdBlock)(NSData *data, NSError *error) = [[handler copy] autorelease]; - - BOOL flag = [super beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - // callback - if (!isRestartedUpload_) { - if (error == nil) { - // swap in the actual completion block now, as it will be called later - // when the upload chunks have completed - [completionBlock_ autorelease]; - completionBlock_ = [holdBlock copy]; - } else { - // pass the error on to the actual completion block - holdBlock(nil, error); - } - } else { - // If there was no initial request, then this fetch is resuming some - // other uploadFetcher's initial request, and the superclass's connection - // is never used, so at this point we call the user's actual completion - // block. - holdBlock(data, error); - } - }]; - return flag; -} -#endif - -- (void)connection:(NSURLConnection *)connection - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten -totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { - - // ignore this callback if we're doing manual progress, mainly so that - // we won't see duplicate progress callbacks when testing with - // doesSupportSentDataCallback turned off - if (needsManualProgress_) return; - - [self uploadFetcher:self - didSendBytes:bytesWritten - totalBytesSent:totalBytesWritten -totalBytesExpectedToSend:totalBytesExpectedToWrite]; -} - -- (BOOL)shouldReleaseCallbacksUponCompletion { - // we don't want the superclass to release the delegate and callback - // blocks once the initial fetch has finished - // - // this is invoked for only successful completion of the connection; - // an error always will invoke and release the callbacks - return NO; -} - -- (void)invokeFinalCallbacksWithData:(NSData *)data - error:(NSError *)error - shouldInvalidateLocation:(BOOL)shouldInvalidateLocation { - // avoid issues due to being released indirectly by a callback - [[self retain] autorelease]; - - if (shouldInvalidateLocation) { - [self setLocationURL:nil]; - } - - if (delegate_ && delegateFinishedSEL_) { - [self invokeFetchCallback:delegateFinishedSEL_ - target:delegate_ - data:data - error:error]; - } - -#if NS_BLOCKS_AVAILABLE - if (completionBlock_) { - completionBlock_(data, error); - } - - [self setLocationChangeBlock:nil]; -#endif - - [self releaseCallbacks]; -} - -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { - // handle failure of the initial fetch as a simple fetcher failure, including - // calling the delegate, and allowing retry to happen if appropriate - SEL prevSel = finishedSel_; // should be null - finishedSel_ = delegateFinishedSEL_; - [super connection:connection didFailWithError:error]; - - // If retry later happens and succeeds, it shouldn't message the delegate - // since we'll continue to chunk uploads. - finishedSel_ = prevSel; -} - -- (void)connectionDidFinishLoading:(NSURLConnection *)connection { - - // we land here once the initial fetch sending the initial POST body - // has completed - - // let the superclass end its connection - [super connectionDidFinishLoading:connection]; - - NSInteger statusCode = [super statusCode]; - [self setStatusCode:statusCode]; - - NSData *downloadedData = [self downloadedData]; - - // we need to get the upload URL from the location header to continue - NSDictionary *responseHeaders = [self responseHeaders]; - NSString *locationURLStr = [responseHeaders objectForKey:@"Location"]; - - NSError *error = nil; - - if (statusCode >= 300) { - if (retryTimer_) return; - - error = [NSError errorWithDomain:kGTMHTTPFetcherStatusDomain - code:statusCode - userInfo:nil]; - } else if ([downloadedData length] > 0) { - // The initial response of the resumable upload protocol should have an - // empty body - // - // This problem typically happens because the upload create/edit link URL was - // not supplied with the request, and the server is thus expecting a non- - // resumable request/response. It may also happen if an error JSON error body - // is returned. - // - // We'll consider this status 501 Not Implemented rather than try to parse - // the body to determine the actual error, but will provide the data - // as userInfo for clients to inspect. - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:downloadedData - forKey:kGTMHTTPFetcherStatusDataKey]; - error = [NSError errorWithDomain:kGTMHTTPFetcherStatusDomain - code:501 - userInfo:userInfo]; - } else { -#if DEBUG - NSAssert([locationURLStr length] > 0, @"need upload location hdr"); -#endif - - if ([locationURLStr length] == 0) { - // we cannot continue since we do not know the location to use - // as our upload destination - // - // we'll consider this status 501 Not Implemented - error = [NSError errorWithDomain:kGTMHTTPFetcherStatusDomain - code:501 - userInfo:nil]; - } - } - - if (error) { - [self invokeFinalCallbacksWithData:downloadedData - error:error - shouldInvalidateLocation:YES]; - return; - } - - [self setLocationURL:[NSURL URLWithString:locationURLStr]]; - - // we've now sent all of the initial post body data, so we need to include - // its size in future progress indicator callbacks - initialBodySent_ = initialBodyLength_; - - if (needsManualProgress_) { - [self reportProgressManually]; - } - - // just in case the user paused us during the initial fetch... - if (![self isPaused]) { - [self uploadNextChunkWithOffset:0]; - } -} - -- (void)retryFetch { - // Override the fetcher's retryFetch to retry with the saved delegateFinishedSEL_. - [self stopFetchReleasingCallbacks:NO]; - - [self beginFetchWithDelegate:delegate_ - didFinishSelector:delegateFinishedSEL_]; -} - -#pragma mark Chunk fetching methods - -- (void)uploadNextChunkWithOffset:(NSUInteger)offset { - // use the properties in each chunk fetcher - NSMutableDictionary *props = [self properties]; - - [self uploadNextChunkWithOffset:offset - fetcherProperties:props]; -} - -- (void)uploadNextChunkWithOffset:(NSUInteger)offset - fetcherProperties:(NSMutableDictionary *)props { - // upload another chunk - NSUInteger chunkSize = [self chunkSize]; - - NSString *rangeStr, *lengthStr; - NSData *chunkData; - - NSUInteger dataLen = [self fullUploadLength]; - - if (offset == kQueryServerForOffset) { - // resuming, so we'll initially send an empty data block and wait for the - // server to tell us where the current offset really is - chunkData = [NSData data]; - rangeStr = [NSString stringWithFormat:@"bytes */%llu", - (unsigned long long)dataLen]; - lengthStr = @"0"; - offset = 0; - } else { - // uploading the next data chunk - if (dataLen == 0) { -#if DEBUG - NSAssert(offset == 0, @"offset %llu for empty data length", (unsigned long long)offset); -#endif - chunkData = [NSData data]; - rangeStr = @"bytes */0"; - lengthStr = @"0"; - } else { -#if DEBUG - NSAssert(offset < dataLen , @"offset %llu exceeds data length %llu", - (unsigned long long)offset, (unsigned long long)dataLen); -#endif - NSUInteger thisChunkSize = chunkSize; - - // if the chunk size is bigger than the remaining data, or else - // it's close enough in size to the remaining data that we'd rather - // avoid having a whole extra http fetch for the leftover bit, then make - // this chunk size exactly match the remaining data size - BOOL isChunkTooBig = (thisChunkSize + offset > dataLen); - BOOL isChunkAlmostBigEnough = (dataLen - offset < thisChunkSize + 2500); - - if (isChunkTooBig || isChunkAlmostBigEnough) { - thisChunkSize = dataLen - offset; - } - - chunkData = [self uploadSubdataWithOffset:offset - length:thisChunkSize]; - - rangeStr = [NSString stringWithFormat:@"bytes %llu-%llu/%llu", - (unsigned long long)offset, - (unsigned long long)(offset + thisChunkSize - 1), - (unsigned long long)dataLen]; - lengthStr = [NSString stringWithFormat:@"%llu", - (unsigned long long)thisChunkSize]; - } - } - - // track the current offset for progress reporting - [self setCurrentOffset:offset]; - - // - // make the request for fetching - // - - // the chunk upload URL requires no authentication header - NSURL *locURL = [self locationURL]; - NSMutableURLRequest *chunkRequest = [NSMutableURLRequest requestWithURL:locURL]; - - [chunkRequest setHTTPMethod:@"PUT"]; - - // copy the user-agent from the original connection - NSURLRequest *origRequest = [self mutableRequest]; - NSString *userAgent = [origRequest valueForHTTPHeaderField:@"User-Agent"]; - if ([userAgent length] > 0) { - [chunkRequest setValue:userAgent forHTTPHeaderField:@"User-Agent"]; - } - - [chunkRequest setValue:rangeStr forHTTPHeaderField:@"Content-Range"]; - [chunkRequest setValue:lengthStr forHTTPHeaderField:@"Content-Length"]; - - NSString *uploadMIMEType = [self uploadMIMEType]; - [chunkRequest setValue:uploadMIMEType forHTTPHeaderField:@"Content-Type"]; - - // - // make a new fetcher - // - GTMHTTPFetcher *chunkFetcher; - - chunkFetcher = [GTMHTTPFetcher fetcherWithRequest:chunkRequest]; - [chunkFetcher setDelegateQueue:[self delegateQueue]]; - [chunkFetcher setRunLoopModes:[self runLoopModes]]; - [chunkFetcher setAllowedInsecureSchemes:[self allowedInsecureSchemes]]; - [chunkFetcher setAllowLocalhostRequest:[self allowLocalhostRequest]]; - - // if the upload fetcher has a comment, use the same comment for chunks - NSString *baseComment = [self comment]; - if (baseComment) { - [chunkFetcher setCommentWithFormat:@"%@ (%@)", baseComment, rangeStr]; - } - - // give the chunk fetcher the same properties as the previous chunk fetcher - [chunkFetcher setProperties:props]; - - // post the appropriate subset of the full data - [chunkFetcher setPostData:chunkData]; - - // copy other fetcher settings to the new fetcher - [chunkFetcher setRetryEnabled:[self isRetryEnabled]]; - [chunkFetcher setMaxRetryInterval:[self maxRetryInterval]]; - [chunkFetcher setSentDataSelector:[self sentDataSelector]]; - [chunkFetcher setCookieStorageMethod:[self cookieStorageMethod]]; - - if ([self isRetryEnabled]) { - // we interpose our own retry method both so the sender is the upload - // fetcher, and so we can change the request to ask the server to - // tell us where to resume the chunk - [chunkFetcher setRetrySelector:@selector(chunkFetcher:willRetry:forError:)]; - } - - [self setMutableRequest:chunkRequest]; - - // when fetching chunks, a 308 status means "upload more chunks", but - // success (200 or 201 status) and other failures are no different than - // for the regular object fetchers - BOOL didFetch = [chunkFetcher beginFetchWithDelegate:self - didFinishSelector:@selector(chunkFetcher:finishedWithData:error:)]; - if (!didFetch) { - // something went horribly wrong, like the chunk upload URL is invalid - NSError *error = [NSError errorWithDomain:kGTMHTTPFetcherErrorDomain - code:kGTMHTTPFetcherErrorChunkUploadFailed - userInfo:nil]; - - [self invokeFinalCallbacksWithData:nil - error:error - shouldInvalidateLocation:YES]; - [self destroyChunkFetcher]; - } else { - // hang on to the fetcher in case we need to cancel it - [self setChunkFetcher:chunkFetcher]; - } -} - -- (void)reportProgressManually { - // reportProgressManually should be called only when there's no - // NSURLConnection support for sent data callbacks - - // the user wants upload progress, and there's no support in NSURLConnection - // for it, so we'll provide it here after each chunk - // - // the progress will be based on the uploadData and currentOffset, - // so we can pass zeros - [self uploadFetcher:self - didSendBytes:0 - totalBytesSent:0 -totalBytesExpectedToSend:0]; -} - -- (void)chunkFetcher:(GTMHTTPFetcher *)chunkFetcher finishedWithData:(NSData *)data error:(NSError *)error { - [self setStatusCode:[chunkFetcher statusCode]]; - [self setResponseHeaders:[chunkFetcher responseHeaders]]; - - if (error) { - int status = (int)[error code]; - - // status 308 is "resume incomplete", meaning we should get the offset - // from the Range header and upload the next chunk - // - // any other status really is an error - if (status == 308) { - [self handleResumeIncompleteStatusForChunkFetcher:chunkFetcher]; - return; - } else { - // some unexpected status has occurred; handle it as we would a regular - // object fetcher failure - error = [NSError errorWithDomain:kGTMHTTPFetcherStatusDomain - code:status - userInfo:nil]; - [self invokeFinalCallbacksWithData:data - error:error - shouldInvalidateLocation:NO]; - [self destroyChunkFetcher]; - return; - } - } else { - // the final chunk has uploaded successfully - #if DEBUG && !defined(NS_BLOCK_ASSERTIONS) - NSInteger status = [chunkFetcher statusCode]; - NSAssert1(status == 200 || status == 201, - @"unexpected chunks status %d", (int)status); - #endif // DEBUG && !defined(NS_BLOCK_ASSERTIONS) - - // take the chunk fetcher's data as our own - self.downloadedData = data; - - if (needsManualProgress_) { - // do a final upload progress report, indicating all of the chunk data - // has been sent - NSUInteger fullDataLength = [self fullUploadLength] + initialBodyLength_; - [self setCurrentOffset:fullDataLength]; - - [self reportProgressManually]; - } - - // we're done - [self invokeFinalCallbacksWithData:data - error:error - shouldInvalidateLocation:YES]; - - [self destroyChunkFetcher]; - } -} - -- (void)handleResumeIncompleteStatusForChunkFetcher:(GTMHTTPFetcher *)chunkFetcher { - - NSDictionary *responseHeaders = [chunkFetcher responseHeaders]; - - // parse the Range header from the server, since that tells us where we really - // want the next chunk to begin. - // - // lack of a range header means the server has no bytes stored for this upload - NSString *rangeStr = [responseHeaders objectForKey:@"Range"]; - NSUInteger newOffset = 0; - if (rangeStr != nil) { - // parse a content-range, like "bytes=0-999", to find where our new - // offset for uploading from the data really is (at the end of the - // range) - NSScanner *scanner = [NSScanner scannerWithString:rangeStr]; - long long rangeStart = 0, rangeEnd = 0; - if ([scanner scanString:@"bytes=" intoString:nil] - && [scanner scanLongLong:&rangeStart] - && [scanner scanString:@"-" intoString:nil] - && [scanner scanLongLong:&rangeEnd]) { - newOffset = (NSUInteger)rangeEnd + 1; - } - } - - [self setCurrentOffset:newOffset]; - - if (needsManualProgress_) { - [self reportProgressManually]; - } - - // if the response specifies a location, use that for future chunks - NSString *locationURLStr = [responseHeaders objectForKey:@"Location"]; - if ([locationURLStr length] > 0) { - [self setLocationURL:[NSURL URLWithString:locationURLStr]]; - } - - // we want to destroy this chunk fetcher before creating the next one, but - // we want to pass on its properties - NSMutableDictionary *props = [[[chunkFetcher properties] retain] autorelease]; - - // we no longer need to be able to cancel this chunkFetcher - [self destroyChunkFetcher]; - - // We may in the future handle Retry-After and ETag headers per - // http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal - // but they are not currently sent by the upload server - - [self uploadNextChunkWithOffset:newOffset - fetcherProperties:props]; -} - - --(BOOL)chunkFetcher:(GTMHTTPFetcher *)chunkFetcher willRetry:(BOOL)willRetry forError:(NSError *)error { - if ([error code] == 308 - && [[error domain] isEqual:kGTMHTTPFetcherStatusDomain]) { - // 308 is a normal chunk fethcher response, not an error - // that needs to be retried - return NO; - } - - if (delegate_ && retrySel_) { - - // call the client with the upload fetcher as the sender (not the chunk - // fetcher) to find out if it wants to retry - willRetry = [self invokeRetryCallback:retrySel_ - target:delegate_ - willRetry:willRetry - error:error]; - } - -#if NS_BLOCKS_AVAILABLE - if (retryBlock_) { - willRetry = retryBlock_(willRetry, error); - } -#endif - - if (willRetry) { - // change the request being retried into a query to the server to - // tell us where to resume - NSMutableURLRequest *chunkRequest = [chunkFetcher mutableRequest]; - - NSUInteger dataLen = [self fullUploadLength]; - NSString *rangeStr = [NSString stringWithFormat:@"bytes */%llu", - (unsigned long long)dataLen]; - - [chunkRequest setValue:rangeStr forHTTPHeaderField:@"Content-Range"]; - [chunkRequest setValue:@"0" forHTTPHeaderField:@"Content-Length"]; - [chunkFetcher setPostData:[NSData data]]; - - // we don't know what our actual offset is anymore, but the server - // will tell us - [self setCurrentOffset:0]; - } - - return willRetry; -} - -- (void)destroyChunkFetcher { - [chunkFetcher_ stopFetching]; - [chunkFetcher_ setProperties:nil]; - [chunkFetcher_ autorelease]; - chunkFetcher_ = nil; -} - -// the chunk fetchers use this as their sentData method -- (void)uploadFetcher:(GTMHTTPFetcher *)chunkFetcher - didSendBytes:(NSInteger)bytesSent - totalBytesSent:(NSInteger)totalBytesSent -totalBytesExpectedToSend:(NSInteger)totalBytesExpected { - // the actual total bytes sent include the initial XML sent, plus the - // offset into the batched data prior to this fetcher - totalBytesSent += initialBodySent_ + currentOffset_; - - // the total bytes expected include the initial XML and the full chunked - // data, independent of how big this fetcher's chunk is - totalBytesExpected = (NSInteger)(initialBodyLength_ + [self fullUploadLength]); - - if (delegate_ && delegateSentDataSEL_) { - // ensure the chunk fetcher survives the callback in case the user pauses - // the upload process - [[chunkFetcher retain] autorelease]; - - [self invokeSentDataCallback:delegateSentDataSEL_ - target:delegate_ - didSendBodyData:bytesSent - totalBytesWritten:totalBytesSent - totalBytesExpectedToWrite:totalBytesExpected]; - } - -#if NS_BLOCKS_AVAILABLE - if (sentDataBlock_) { - sentDataBlock_(bytesSent, totalBytesSent, totalBytesExpected); - } -#endif -} - -#pragma mark - - -- (BOOL)isPaused { - return isPaused_; -} - -- (void)pauseFetching { - isPaused_ = YES; - - // pausing just means stopping the current chunk from uploading; - // when we resume, the magic offset value will force us to send - // a request to the server to figure out what bytes to start sending - // - // we won't try to cancel the initial data upload, but rather will look for - // the magic offset value in -connectionDidFinishLoading before - // creating first initial chunk fetcher, just in case the user - // paused during the initial data upload - [self destroyChunkFetcher]; -} - -- (void)resumeFetching { - if (isPaused_) { - isPaused_ = NO; - - [self uploadNextChunkWithOffset:kQueryServerForOffset]; - } -} - -- (void)stopFetching { - // overrides the superclass - [self destroyChunkFetcher]; - - [super stopFetching]; -} - -#pragma mark - - -@synthesize uploadData = uploadData_, - uploadFileHandle = uploadFileHandle_, - uploadMIMEType = uploadMIMEType_, - chunkSize = chunkSize_, - currentOffset = currentOffset_, - chunkFetcher = chunkFetcher_; - -#if NS_BLOCKS_AVAILABLE -@synthesize locationChangeBlock = locationChangeBlock_; -#endif - -@dynamic activeFetcher; -@dynamic responseHeaders; -@dynamic statusCode; - -- (NSDictionary *)responseHeaders { - // overrides the superclass - - // if asked for the fetcher's response, use the most recent fetcher - if (responseHeaders_) { - return responseHeaders_; - } else { - // no chunk fetcher yet completed, so return whatever we have from the - // initial fetch - return [super responseHeaders]; - } -} - -- (void)setResponseHeaders:(NSDictionary *)dict { - [responseHeaders_ autorelease]; - responseHeaders_ = [dict retain]; -} - -- (NSInteger)statusCode { - if (statusCode_ != -1) { - // overrides the superclass to indicate status appropriate to the initial - // or latest chunk fetch - return statusCode_; - } else { - return [super statusCode]; - } -} - -- (void)setStatusCode:(NSInteger)val { - statusCode_ = val; -} - -- (SEL)sentDataSelector { - // overrides the superclass -#if NS_BLOCKS_AVAILABLE - BOOL hasSentDataBlock = (sentDataBlock_ != NULL); -#else - BOOL hasSentDataBlock = NO; -#endif - if ((delegateSentDataSEL_ || hasSentDataBlock) && !needsManualProgress_) { - return @selector(uploadFetcher:didSendBytes:totalBytesSent:totalBytesExpectedToSend:); - } else { - return NULL; - } -} - -- (void)setSentDataSelector:(SEL)theSelector { - // overrides the superclass - delegateSentDataSEL_ = theSelector; -} - -- (GTMHTTPFetcher *)activeFetcher { - if (chunkFetcher_) { - return chunkFetcher_; - } else { - return self; - } -} - -- (NSURL *)locationURL { - return locationURL_; -} - -- (void)setLocationURL:(NSURL *)url { - if (url != locationURL_) { - [locationURL_ release]; - locationURL_ = [url retain]; - -#if NS_BLOCKS_AVAILABLE - if (locationChangeBlock_) { - locationChangeBlock_(url); - } -#endif - } -} -@end - -#endif // #if !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.h deleted file mode 100644 index 62b037b04..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - - -// This is a simple class to create a MIME document. To use, allocate -// a new GTMMIMEDocument and start adding parts as necessary. When you are -// done adding parts, call generateInputStream to get an NSInputStream -// containing the contents of your MIME document. -// -// A good reference for MIME is http://en.wikipedia.org/wiki/MIME - -#import - -#if defined(GTL_TARGET_NAMESPACE) - // we're using target namespace macros - #import "GTLDefines.h" -#elif defined(GDATA_TARGET_NAMESPACE) - #import "GDataDefines.h" -#endif - -@interface GTMMIMEDocument : NSObject { - NSMutableArray* parts_; // Contains an ordered set of MimeParts - unsigned long long length_; // Length in bytes of the document. - u_int32_t randomSeed_; // for testing -} - -+ (GTMMIMEDocument *)MIMEDocument; - -// Adds a new part to this mime document with the given headers and body. The -// headers keys and values should be NSStrings -- (void)addPartWithHeaders:(NSDictionary *)headers - body:(NSData *)body; - -// An inputstream that can be used to efficiently read the contents of the -// mime document. -- (void)generateInputStream:(NSInputStream **)outStream - length:(unsigned long long*)outLength - boundary:(NSString **)outBoundary; - -// ------ UNIT TESTING ONLY BELOW ------ - -// For unittesting only, seeds the random number generator -- (void)seedRandomWith:(u_int32_t)seed; - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.m deleted file mode 100644 index 38b9c25bd..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMMIMEDocument.m +++ /dev/null @@ -1,281 +0,0 @@ -/* Copyright (c) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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 "GTMMIMEDocument.h" -#import "GTMGatherInputStream.h" - -// memsrch -// -// Helper routine to search for the existence of a set of bytes (needle) within -// a presumed larger set of bytes (haystack). -// -static BOOL memsrch(const unsigned char* needle, NSUInteger needle_len, - const unsigned char* haystack, NSUInteger haystack_len); - -@interface GTMMIMEPart : NSObject { - NSData* headerData_; // Header content including the ending "\r\n". - NSData* bodyData_; // The body data. -} - -+ (GTMMIMEPart *)partWithHeaders:(NSDictionary *)headers body:(NSData *)body; -- (id)initWithHeaders:(NSDictionary *)headers body:(NSData *)body; -- (BOOL)containsBytes:(const unsigned char *)bytes length:(NSUInteger)length; -- (NSData *)header; -- (NSData *)body; -- (NSUInteger)length; -@end - -@implementation GTMMIMEPart - -+ (GTMMIMEPart *)partWithHeaders:(NSDictionary *)headers body:(NSData *)body { - - return [[[self alloc] initWithHeaders:headers - body:body] autorelease]; -} - -- (id)initWithHeaders:(NSDictionary *)headers - body:(NSData *)body { - - if ((self = [super init]) != nil) { - - bodyData_ = [body retain]; - - // generate the header data by coalescing the dictionary as - // lines of "key: value\r\m" - NSMutableString* headerString = [NSMutableString string]; - - // sort the header keys so we have a deterministic order for - // unit testing - SEL sortSel = @selector(caseInsensitiveCompare:); - NSArray *sortedKeys = [[headers allKeys] sortedArrayUsingSelector:sortSel]; - - for (NSString *key in sortedKeys) { - NSString* value = [headers objectForKey:key]; - -#if DEBUG && !defined(NS_BLOCK_ASSERTIONS) - // look for troublesome characters in the header keys & values - static NSCharacterSet *badChars = nil; - if (!badChars) { - badChars = [[NSCharacterSet characterSetWithCharactersInString:@":\r\n"] retain]; - } - - NSRange badRange = [key rangeOfCharacterFromSet:badChars]; - NSAssert1(badRange.location == NSNotFound, @"invalid key: %@", key); - - badRange = [value rangeOfCharacterFromSet:badChars]; - NSAssert1(badRange.location == NSNotFound, @"invalid value: %@", value); -#endif // DEBUG && !defined(NS_BLOCK_ASSERTIONS) - - [headerString appendFormat:@"%@: %@\r\n", key, value]; - } - - // headers end with an extra blank line - [headerString appendString:@"\r\n"]; - - headerData_ = [[headerString dataUsingEncoding:NSUTF8StringEncoding] retain]; - } - return self; -} - -- (void) dealloc { - [headerData_ release]; - [bodyData_ release]; - [super dealloc]; -} - -// Returns true if the parts contents contain the given set of bytes. -// -// NOTE: We assume that the 'bytes' we are checking for do not contain "\r\n", -// so we don't need to check the concatenation of the header and body bytes. -- (BOOL)containsBytes:(const unsigned char*)bytes length:(NSUInteger)length { - - // This uses custom memsrch() rather than strcpy because the encoded data may - // contain null values. - return memsrch(bytes, length, [headerData_ bytes], [headerData_ length]) || - memsrch(bytes, length, [bodyData_ bytes], [bodyData_ length]); -} - -- (NSData *)header { - return headerData_; -} - -- (NSData *)body { - return bodyData_; -} - -- (NSUInteger)length { - return [headerData_ length] + [bodyData_ length]; -} -@end - -@implementation GTMMIMEDocument - -+ (GTMMIMEDocument *)MIMEDocument { - return [[[self alloc] init] autorelease]; -} - -- (id)init { - if ((self = [super init]) != nil) { - - parts_ = [[NSMutableArray alloc] init]; - - // Seed the random number generator used to generate mime boundaries - srandomdev(); - } - return self; -} - -- (void)dealloc { - [parts_ release]; - [super dealloc]; -} - -// Adds a new part to this mime document with the given headers and body. -- (void)addPartWithHeaders:(NSDictionary *)headers - body:(NSData *)body { - - GTMMIMEPart* part = [GTMMIMEPart partWithHeaders:headers body:body]; - [parts_ addObject:part]; -} - -// For unit testing only, seeds the random number generator so that we will -// have reproducible boundary strings. -- (void)seedRandomWith:(u_int32_t)seed { - randomSeed_ = seed; -} - -- (u_int32_t)random { - if (randomSeed_) { - // for testing only - return randomSeed_++; - } else { - return arc4random(); - } -} - -// Computes the mime boundary to use. This should only be called -// after all the desired document parts have been added since it must compute -// a boundary that does not exist in the document data. -- (NSString *)uniqueBoundary { - - // use an easily-readable boundary string - NSString *const kBaseBoundary = @"END_OF_PART"; - - NSString *boundary = kBaseBoundary; - - // if the boundary isn't unique, append random numbers, up to 10 attempts; - // if that's still not unique, use a random number sequence instead, - // and call it good - BOOL didCollide = NO; - - const int maxTries = 10; // Arbitrarily chosen maximum attempts. - for (int tries = 0; tries < maxTries; ++tries) { - - NSData *data = [boundary dataUsingEncoding:NSUTF8StringEncoding]; - const void *dataBytes = [data bytes]; - NSUInteger dataLen = [data length]; - - for (GTMMIMEPart *part in parts_) { - didCollide = [part containsBytes:dataBytes length:dataLen]; - if (didCollide) break; - } - - if (!didCollide) break; // we're fine, no more attempts needed - - // try again with a random number appended - boundary = [NSString stringWithFormat:@"%@_%08x", kBaseBoundary, - [self random]]; - } - - if (didCollide) { - // fallback... two random numbers - boundary = [NSString stringWithFormat:@"%08x_tedborg_%08x", - [self random], [self random]]; - } - - return boundary; -} - -- (void)generateInputStream:(NSInputStream **)outStream - length:(unsigned long long*)outLength - boundary:(NSString **)outBoundary { - - // The input stream is of the form: - // --boundary - // [part_1_headers] - // [part_1_data] - // --boundary - // [part_2_headers] - // [part_2_data] - // --boundary-- - - // First we set up our boundary NSData objects. - NSString *boundary = [self uniqueBoundary]; - - NSString *mainBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary]; - NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary]; - - NSData *mainBoundaryData = [mainBoundary dataUsingEncoding:NSUTF8StringEncoding]; - NSData *endBoundaryData = [endBoundary dataUsingEncoding:NSUTF8StringEncoding]; - - // Now we add them all in proper order to our dataArray. - NSMutableArray* dataArray = [NSMutableArray array]; - unsigned long long length = 0; - - for (GTMMIMEPart* part in parts_) { - [dataArray addObject:mainBoundaryData]; - [dataArray addObject:[part header]]; - [dataArray addObject:[part body]]; - - length += [part length] + [mainBoundaryData length]; - } - - [dataArray addObject:endBoundaryData]; - length += [endBoundaryData length]; - - if (outLength) *outLength = length; - if (outStream) *outStream = [GTMGatherInputStream streamWithArray:dataArray]; - if (outBoundary) *outBoundary = boundary; -} - -@end - - -// memsrch - Return YES if needle is found in haystack, else NO. -static BOOL memsrch(const unsigned char* needle, NSUInteger needleLen, - const unsigned char* haystack, NSUInteger haystackLen) { - - // This is a simple approach. We start off by assuming that both memchr() and - // memcmp are implemented efficiently on the given platform. We search for an - // instance of the first char of our needle in the haystack. If the remaining - // size could fit our needle, then we memcmp to see if it occurs at this point - // in the haystack. If not, we move on to search for the first char again, - // starting from the next character in the haystack. - const unsigned char* ptr = haystack; - NSUInteger remain = haystackLen; - while ((ptr = memchr(ptr, needle[0], remain)) != 0) { - remain = haystackLen - (NSUInteger)(ptr - haystack); - if (remain < needleLen) { - return NO; - } - if (memcmp(ptr, needle, needleLen) == 0) { - return YES; - } - ptr++; - remain--; - } - return NO; -} diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.h b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.h deleted file mode 100644 index 9e4b3f78d..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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 - - -// Define only for Mac OS X 10.6+ or iPhone OS 4.0+. -#ifndef GTM_NSSTREAM_DELEGATE - #if (TARGET_OS_MAC && !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)) || \ - (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED >= 40000)) - #define GTM_NSSTREAM_DELEGATE - #else - #define GTM_NSSTREAM_DELEGATE - #endif -#endif // !defined(GTM_NSSTREAM_DELEGATE) - -#ifdef GTM_TARGET_NAMESPACE - // we're using target namespace macros - #import "GTMDefines.h" -#endif - -@interface GTMReadMonitorInputStream : NSInputStream GTM_NSSTREAM_DELEGATE { - @protected - NSInputStream *inputStream_; // encapsulated stream that does the work - - NSThread *thread_; // thread in which this object was created - NSArray *runLoopModes_; // modes for calling callbacks, when necessary - - @private - id readDelegate_; - SEL readSelector_; -} - -// length is passed to the progress callback; it may be zero -// if the progress callback can handle that -+ (id)inputStreamWithStream:(NSInputStream *)input; - -- (id)initWithStream:(NSInputStream *)input; - -// The read monitor selector is called when bytes have been read. It should -// have a signature matching -// -// - (void)inputStream:(GTMReadMonitorInputStream *)stream -// readIntoBuffer:(uint8_t *)buffer -// length:(NSUInteger)length; - -@property (assign) id readDelegate; // WEAK -@property (assign) SEL readSelector; - -// Modes for invoking callbacks, when necessary -@property (retain) NSArray *runLoopModes; - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.m b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.m deleted file mode 100644 index 4a85de50b..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/GTMReadMonitorInputStream.m +++ /dev/null @@ -1,189 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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 "GTMReadMonitorInputStream.h" - -@interface GTMReadMonitorInputStream () -- (void)invokeReadSelectorWithBuffer:(NSData *)data; -@end - -@implementation GTMReadMonitorInputStream - -@synthesize readDelegate = readDelegate_; -@synthesize readSelector = readSelector_; -@synthesize runLoopModes = runLoopModes_; - -// We'll forward all unhandled messages to the NSInputStream class -// or to the encapsulated input stream. This is needed -// for all messages sent to NSInputStream which aren't -// handled by our superclass; that includes various private run -// loop calls. -+ (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { - return [NSInputStream methodSignatureForSelector:selector]; -} - -+ (void)forwardInvocation:(NSInvocation*)invocation { - [invocation invokeWithTarget:[NSInputStream class]]; -} - -- (BOOL)respondsToSelector:(SEL)selector { - return [inputStream_ respondsToSelector:selector]; -} - -- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { - return [inputStream_ methodSignatureForSelector:selector]; -} - -- (void)forwardInvocation:(NSInvocation*)invocation { - [invocation invokeWithTarget:inputStream_]; -} - -#pragma mark - - -+ (id)inputStreamWithStream:(NSInputStream *)input { - return [[[self alloc] initWithStream:input] autorelease]; -} - -- (id)initWithStream:(NSInputStream *)input { - self = [super init]; - if (self) { - inputStream_ = [input retain]; - thread_ = [[NSThread currentThread] retain]; - } - return self; -} - -- (id)init { - return [self initWithStream:nil]; -} - -- (void)dealloc { - [inputStream_ release]; - [thread_ release]; - [runLoopModes_ release]; - [super dealloc]; -} - -#pragma mark - - -- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len { - // Read from the encapsulated stream - NSInteger numRead = [inputStream_ read:buffer maxLength:len]; - if (numRead > 0) { - - BOOL isOnOriginalThread = [thread_ isEqual:[NSThread currentThread]]; - - if (readDelegate_ && readSelector_) { - // call the read selector with the buffer and number of bytes actually - // read into it - SEL sel = @selector(invokeReadSelectorWithBuffer:); - - if (isOnOriginalThread) { - // invoke immediately - NSData *data = [NSData dataWithBytesNoCopy:buffer - length:(NSUInteger)numRead - freeWhenDone:NO]; - [self performSelector:sel withObject:data]; - } else { - // copy the buffer into an NSData to be retained by the - // performSelector, and invoke on the proper thread - NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numRead]; - if (runLoopModes_) { - [self performSelector:sel - onThread:thread_ - withObject:data - waitUntilDone:NO - modes:runLoopModes_]; - } else { - [self performSelector:sel - onThread:thread_ - withObject:data - waitUntilDone:NO]; - } - } - } - } - - return numRead; -} - -- (void)invokeReadSelectorWithBuffer:(NSData *)data { - const void *buffer = [data bytes]; - NSUInteger length = [data length]; - - NSMethodSignature *signature = [readDelegate_ methodSignatureForSelector:readSelector_]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; - [invocation setSelector:readSelector_]; - [invocation setTarget:readDelegate_]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&buffer atIndex:3]; - [invocation setArgument:&length atIndex:4]; - [invocation invoke]; -} - -- (BOOL)getBuffer:(uint8_t **)buffer length:(NSUInteger *)len { - return [inputStream_ getBuffer:buffer length:len]; -} - -- (BOOL)hasBytesAvailable { - return [inputStream_ hasBytesAvailable]; -} - -#pragma mark Standard messages - -// Pass expected messages to our encapsulated stream. -// -// We want our encapsulated NSInputStream to handle the standard messages; -// we don't want the superclass to handle them. -- (void)open { - [inputStream_ open]; -} - -- (void)close { - [inputStream_ close]; -} - -- (id)delegate { - return [inputStream_ delegate]; -} - -- (void)setDelegate:(id)delegate { - [inputStream_ setDelegate:delegate]; -} - -- (id)propertyForKey:(NSString *)key { - return [inputStream_ propertyForKey:key]; -} -- (BOOL)setProperty:(id)property forKey:(NSString *)key { - return [inputStream_ setProperty:property forKey:key]; -} - -- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { - [inputStream_ scheduleInRunLoop:aRunLoop forMode:mode]; -} - -- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode { - [inputStream_ removeFromRunLoop:aRunLoop forMode:mode]; -} - -- (NSStreamStatus)streamStatus { - return [inputStream_ streamStatus]; -} - -- (NSError *)streamError { - return [inputStream_ streamError]; -} - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/ReleaseNotes.txt b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/ReleaseNotes.txt deleted file mode 100644 index cb2d97063..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/ReleaseNotes.txt +++ /dev/null @@ -1,84 +0,0 @@ -GTM HTTP Fetcher Release Notes - -Project site: http://code.google.com/p/gtm-http-fetcher/ -Discussion group: http://groups.google.com/group/google-toolbox-for-mac - -28-September-2012 - -Added delegateQueue support to fetcher and fetcher service, allowing fetches -to begin on a thread without a run loop and to invoke callbacks on the main -thread or a background thread, beginning with iOS 6 and Mac OS X 10.7. - - -9-January-2012 - -Fetcher now includes user-agent string utility functions - -Fetcher service has properties for request userAgent and timeout - - -22-November-2011 - -Fetchers now support a servicePriority property which affects the order in -which the fetcher service object dequeues delayed fetchers - - -1-November-2011 - -On status 401 results when using an authorizer, the fetcher will attempt a -single retry if the authorizer implements a primeForRefresh method - - -7-October-2011 - -Changed isFetching method to return YES during service and authorization delays - - -9-September-2011 - -Added support for creating an upload fetcher from a location URL to allow -restarting uploads with a new upload fetcher instance - - -18-August-2011 - -Added GTMReadMonitorInputStream for logging uploaded NSInputStreams - - -8-July-2011 - -Added shouldFetchInBackground property (thanks justin a) - - -24-Mar-2011 - -Added authorizer support - - -7-Feb-2011 - -Made cookies set by a redirect immediately available in the new request (thanks ehoracek) -Added getter for static cookie storage - - -16-Nov-2010 - -Added fetcher comment property for logging - - -27-Oct-2010 - -Added downloadPath and downloadFileHandle properties -Added waitForCompletionWithTimeout: -Renamed GTMAssertSelectorNilOrImplementedWithArgs() - - -4-Oct-2010 - -Ensure that delegate is nil when not retained. - - -Release 1.0.0 -9-Sept-2010 - -Initial public release. diff --git a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/UnitTests-Info.plist b/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/UnitTests-Info.plist deleted file mode 100644 index c285a472c..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/HTTPFetcher/UnitTests-Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.yourcompany.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/JSON.h b/Paco-iOS/vendor/gtm-oauth2/JSON/JSON.h deleted file mode 100644 index db3c516db..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/JSON.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (C) 2009-2010 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @mainpage A strict JSON parser and generator for Objective-C - - JSON (JavaScript Object Notation) is a lightweight data-interchange - format. This framework provides two apis for parsing and generating - JSON. One standard object-based and a higher level api consisting of - categories added to existing Objective-C classes. - - This framework does its best to be as strict as possible, both in what it accepts and what it generates. For example, it does not support trailing commas in arrays or objects. Nor does it support embedded comments, or anything else not in the JSON specification. This is considered a feature. - - @section Links - - @li Project home page. - @li Online version of the API documentation. - -*/ - - -// This setting of 1 is best if you copy the source into your project. -// The build transforms the 1 to a 0 when building the framework and static lib. - -#if 1 - -#import "SBJsonParser.h" -#import "SBJsonWriter.h" -#import "NSObject+SBJSON.h" -#import "NSString+SBJSON.h" - -#else - -#import -#import -#import -#import - -#endif diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.h b/Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.h deleted file mode 100644 index 8e9620e68..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - - -/** - @brief Adds JSON generation to Foundation classes - - This is a category on NSObject that adds methods for returning JSON representations - of standard objects to the objects themselves. This means you can call the - -JSONRepresentation method on an NSArray object and it'll do what you want. - */ -@interface NSObject (NSObject_SBJSON) - -/** - @brief Returns a string containing the receiver encoded in JSON. - - This method is added as a category on NSObject but is only actually - supported for the following objects: - @li NSDictionary - @li NSArray - */ -- (NSString *)JSONRepresentation; - -@end - diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.m b/Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.m deleted file mode 100644 index 30570b593..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/NSObject+SBJSON.m +++ /dev/null @@ -1,44 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import "NSObject+SBJSON.h" -#import "SBJsonWriter.h" - -@implementation NSObject (NSObject_SBJSON) - -- (NSString *)JSONRepresentation { - SBJsonWriter *jsonWriter = [SBJsonWriter new]; - NSString *json = [jsonWriter stringWithObject:self]; - if (!json) - NSLog(@"-JSONRepresentation failed. Error trace is: %@", [jsonWriter errorTrace]); - [jsonWriter release]; - return json; -} - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.h b/Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.h deleted file mode 100644 index 029aa309d..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -/** - @brief Adds JSON parsing methods to NSString - -This is a category on NSString that adds methods for parsing the target string. -*/ -@interface NSString (NSString_SBJSON) - -/** - @brief Returns the NSDictionary or NSArray represented by the current string's JSON representation. - - Returns the dictionary or array represented in the receiver, or nil on error. - - Returns the NSDictionary or NSArray represented by the current string's JSON representation. - */ -- (id)JSONValue; - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.m b/Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.m deleted file mode 100644 index bb132e1eb..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/NSString+SBJSON.m +++ /dev/null @@ -1,45 +0,0 @@ -/* - Copyright (C) 2007-2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import "NSString+SBJSON.h" -#import "SBJsonParser.h" - -@implementation NSString (NSString_SBJSON) - -- (id)JSONValue -{ - SBJsonParser *jsonParser = [SBJsonParser new]; - id repr = [jsonParser objectWithString:self]; - if (!repr) - NSLog(@"-JSONValue failed. Error trace is: %@", [jsonParser errorTrace]); - [jsonParser release]; - return repr; -} - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.h b/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.h deleted file mode 100644 index 7b108440f..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -extern NSString * SBJSONErrorDomain; - - -enum { - EUNSUPPORTED = 1, - EPARSENUM, - EPARSE, - EFRAGMENT, - ECTRL, - EUNICODE, - EDEPTH, - EESCAPE, - ETRAILCOMMA, - ETRAILGARBAGE, - EEOF, - EINPUT -}; - -/** - @brief Common base class for parsing & writing. - - This class contains the common error-handling code and option between the parser/writer. - */ -@interface SBJsonBase : NSObject { - NSMutableArray *errorTrace; - -@protected - NSUInteger depth, maxDepth; -} - -/** - @brief The maximum recursing depth. - - Defaults to 512. If the input is nested deeper than this the input will be deemed to be - malicious and the parser returns nil, signalling an error. ("Nested too deep".) You can - turn off this security feature by setting the maxDepth value to 0. - */ -@property NSUInteger maxDepth; - -/** - @brief Return an error trace, or nil if there was no errors. - - Note that this method returns the trace of the last method that failed. - You need to check the return value of the call you're making to figure out - if the call actually failed, before you know call this method. - */ - @property(copy,readonly) NSArray* errorTrace; - -/// @internal for use in subclasses to add errors to the stack trace -- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str; - -/// @internal for use in subclasess to clear the error before a new parsing attempt -- (void)clearErrorTrace; - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.m b/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.m deleted file mode 100644 index 6684325d1..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonBase.m +++ /dev/null @@ -1,78 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import "SBJsonBase.h" -NSString * SBJSONErrorDomain = @"org.brautaset.JSON.ErrorDomain"; - - -@implementation SBJsonBase - -@synthesize errorTrace; -@synthesize maxDepth; - -- (id)init { - self = [super init]; - if (self) - self.maxDepth = 512; - return self; -} - -- (void)dealloc { - [errorTrace release]; - [super dealloc]; -} - -- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str { - NSDictionary *userInfo; - if (!errorTrace) { - errorTrace = [NSMutableArray new]; - userInfo = [NSDictionary dictionaryWithObject:str forKey:NSLocalizedDescriptionKey]; - - } else { - userInfo = [NSDictionary dictionaryWithObjectsAndKeys: - str, NSLocalizedDescriptionKey, - [errorTrace lastObject], NSUnderlyingErrorKey, - nil]; - } - - NSError *error = [NSError errorWithDomain:SBJSONErrorDomain code:code userInfo:userInfo]; - - [self willChangeValueForKey:@"errorTrace"]; - [errorTrace addObject:error]; - [self didChangeValueForKey:@"errorTrace"]; -} - -- (void)clearErrorTrace { - [self willChangeValueForKey:@"errorTrace"]; - [errorTrace release]; - errorTrace = nil; - [self didChangeValueForKey:@"errorTrace"]; -} - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.h b/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.h deleted file mode 100644 index feaccd863..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "SBJsonBase.h" - -/** - @brief The JSON parser class. - - JSON is mapped to Objective-C types in the following way: - - @li Null -> NSNull - @li String -> NSMutableString - @li Array -> NSMutableArray - @li Object -> NSMutableDictionary - @li Boolean -> NSNumber (initialised with -initWithBool:) - @li Number -> (NSNumber | NSDecimalNumber) - - Since Objective-C doesn't have a dedicated class for boolean values, these turns into NSNumber - instances. These are initialised with the -initWithBool: method, and - round-trip back to JSON properly. (They won't silently suddenly become 0 or 1; they'll be - represented as 'true' and 'false' again.) - - As an optimisation short JSON integers turn into NSNumber instances, while complex ones turn into NSDecimalNumber instances. - We can thus avoid any loss of precision as JSON allows ridiculously large numbers. - - */ -@interface SBJsonParser : SBJsonBase { - -@private - const char *c; -} - -/** - @brief Return the object represented by the given string - - Returns the object represented by the passed-in string or nil on error. The returned object can be - a string, number, boolean, null, array or dictionary. - - @param repr the json string to parse - */ -- (id)objectWithString:(NSString *)repr; - -/** - @brief Return the object represented by the given string - - Returns the object represented by the passed-in string or nil on error. The returned object can be - a string, number, boolean, null, array or dictionary. - - @param jsonText the json string to parse - @param error pointer to an NSError object to populate on error - */ - -- (id)objectWithString:(NSString*)jsonText - error:(NSError**)error; - - -@end - - diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.m b/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.m deleted file mode 100644 index 222ef7038..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonParser.m +++ /dev/null @@ -1,516 +0,0 @@ -/* - Copyright (C) 2009,2010 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import "SBJsonParser.h" - -@interface SBJsonParser () - -- (BOOL)scanValue:(NSObject **)o; - -- (BOOL)scanRestOfArray:(NSMutableArray **)o; -- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o; -- (BOOL)scanRestOfNull:(NSNull **)o; -- (BOOL)scanRestOfFalse:(NSNumber **)o; -- (BOOL)scanRestOfTrue:(NSNumber **)o; -- (BOOL)scanRestOfString:(NSMutableString **)o; - -// Cannot manage without looking at the first digit -- (BOOL)scanNumber:(NSNumber **)o; - -- (BOOL)scanHexQuad:(unichar *)x; -- (BOOL)scanUnicodeChar:(unichar *)x; - -- (BOOL)scanIsAtEnd; - -@end - -#define skipWhitespace(c) while (isspace(*c)) c++ -#define skipDigits(c) while (isdigit(*c)) c++ - - -@implementation SBJsonParser - -static char ctrl[0x22]; - - -+ (void)initialize { - ctrl[0] = '\"'; - ctrl[1] = '\\'; - for (int i = 1; i < 0x20; i++) - ctrl[i+1] = i; - ctrl[0x21] = 0; -} - -- (id)objectWithString:(NSString *)repr { - [self clearErrorTrace]; - - if (!repr) { - [self addErrorWithCode:EINPUT description:@"Input was 'nil'"]; - return nil; - } - - depth = 0; - c = [repr UTF8String]; - - id o; - if (![self scanValue:&o]) { - return nil; - } - - // We found some valid JSON. But did it also contain something else? - if (![self scanIsAtEnd]) { - [self addErrorWithCode:ETRAILGARBAGE description:@"Garbage after JSON"]; - return nil; - } - - NSAssert1(o, @"Should have a valid object from %@", repr); - - // Check that the object we've found is a valid JSON container. - if (![o isKindOfClass:[NSDictionary class]] && ![o isKindOfClass:[NSArray class]]) { - [self addErrorWithCode:EFRAGMENT description:@"Valid fragment, but not JSON"]; - return nil; - } - - return o; -} - -- (id)objectWithString:(NSString*)repr error:(NSError**)error { - id tmp = [self objectWithString:repr]; - if (tmp) - return tmp; - - if (error) - *error = [self.errorTrace lastObject]; - return nil; -} - - -/* - In contrast to the public methods, it is an error to omit the error parameter here. - */ -- (BOOL)scanValue:(NSObject **)o -{ - skipWhitespace(c); - - switch (*c++) { - case '{': - return [self scanRestOfDictionary:(NSMutableDictionary **)o]; - break; - case '[': - return [self scanRestOfArray:(NSMutableArray **)o]; - break; - case '"': - return [self scanRestOfString:(NSMutableString **)o]; - break; - case 'f': - return [self scanRestOfFalse:(NSNumber **)o]; - break; - case 't': - return [self scanRestOfTrue:(NSNumber **)o]; - break; - case 'n': - return [self scanRestOfNull:(NSNull **)o]; - break; - case '-': - case '0'...'9': - c--; // cannot verify number correctly without the first character - return [self scanNumber:(NSNumber **)o]; - break; - case '+': - [self addErrorWithCode:EPARSENUM description: @"Leading + disallowed in number"]; - return NO; - break; - case 0x0: - [self addErrorWithCode:EEOF description:@"Unexpected end of string"]; - return NO; - break; - default: - [self addErrorWithCode:EPARSE description: @"Unrecognised leading character"]; - return NO; - break; - } - - NSAssert(0, @"Should never get here"); - return NO; -} - -- (BOOL)scanRestOfTrue:(NSNumber **)o -{ - if (!strncmp(c, "rue", 3)) { - c += 3; - *o = [NSNumber numberWithBool:YES]; - return YES; - } - [self addErrorWithCode:EPARSE description:@"Expected 'true'"]; - return NO; -} - -- (BOOL)scanRestOfFalse:(NSNumber **)o -{ - if (!strncmp(c, "alse", 4)) { - c += 4; - *o = [NSNumber numberWithBool:NO]; - return YES; - } - [self addErrorWithCode:EPARSE description: @"Expected 'false'"]; - return NO; -} - -- (BOOL)scanRestOfNull:(NSNull **)o { - if (!strncmp(c, "ull", 3)) { - c += 3; - *o = [NSNull null]; - return YES; - } - [self addErrorWithCode:EPARSE description: @"Expected 'null'"]; - return NO; -} - -- (BOOL)scanRestOfArray:(NSMutableArray **)o { - if (maxDepth && ++depth > maxDepth) { - [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; - return NO; - } - - *o = [NSMutableArray arrayWithCapacity:8]; - - for (; *c ;) { - id v; - - skipWhitespace(c); - if (*c == ']' && c++) { - depth--; - return YES; - } - - if (![self scanValue:&v]) { - [self addErrorWithCode:EPARSE description:@"Expected value while parsing array"]; - return NO; - } - - [*o addObject:v]; - - skipWhitespace(c); - if (*c == ',' && c++) { - skipWhitespace(c); - if (*c == ']') { - [self addErrorWithCode:ETRAILCOMMA description: @"Trailing comma disallowed in array"]; - return NO; - } - } - } - - [self addErrorWithCode:EEOF description: @"End of input while parsing array"]; - return NO; -} - -- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o -{ - if (maxDepth && ++depth > maxDepth) { - [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; - return NO; - } - - *o = [NSMutableDictionary dictionaryWithCapacity:7]; - - for (; *c ;) { - id k, v; - - skipWhitespace(c); - if (*c == '}' && c++) { - depth--; - return YES; - } - - if (!(*c == '\"' && c++ && [self scanRestOfString:&k])) { - [self addErrorWithCode:EPARSE description: @"Object key string expected"]; - return NO; - } - - skipWhitespace(c); - if (*c != ':') { - [self addErrorWithCode:EPARSE description: @"Expected ':' separating key and value"]; - return NO; - } - - c++; - if (![self scanValue:&v]) { - NSString *string = [NSString stringWithFormat:@"Object value expected for key: %@", k]; - [self addErrorWithCode:EPARSE description: string]; - return NO; - } - - [*o setObject:v forKey:k]; - - skipWhitespace(c); - if (*c == ',' && c++) { - skipWhitespace(c); - if (*c == '}') { - [self addErrorWithCode:ETRAILCOMMA description: @"Trailing comma disallowed in object"]; - return NO; - } - } - } - - [self addErrorWithCode:EEOF description: @"End of input while parsing object"]; - return NO; -} - -- (BOOL)scanRestOfString:(NSMutableString **)o -{ - // if the string has no control characters in it, return it in one go, without any temporary allocations. - size_t len = strcspn(c, ctrl); - if (len && *(c + len) == '\"') - { - *o = [[[NSMutableString alloc] initWithBytes:(char*)c length:len encoding:NSUTF8StringEncoding] autorelease]; - c += len + 1; - return YES; - } - - *o = [NSMutableString stringWithCapacity:16]; - do { - // First see if there's a portion we can grab in one go. - // Doing this caused a massive speedup on the long string. - len = strcspn(c, ctrl); - if (len) { - // check for - id t = [[NSString alloc] initWithBytesNoCopy:(char*)c - length:len - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - if (t) { - [*o appendString:t]; - [t release]; - c += len; - } - } - - if (*c == '"') { - c++; - return YES; - - } else if (*c == '\\') { - unichar uc = *++c; - switch (uc) { - case '\\': - case '/': - case '"': - break; - - case 'b': uc = '\b'; break; - case 'n': uc = '\n'; break; - case 'r': uc = '\r'; break; - case 't': uc = '\t'; break; - case 'f': uc = '\f'; break; - - case 'u': - c++; - if (![self scanUnicodeChar:&uc]) { - [self addErrorWithCode:EUNICODE description: @"Broken unicode character"]; - return NO; - } - c--; // hack. - break; - default: - [self addErrorWithCode:EESCAPE description: [NSString stringWithFormat:@"Illegal escape sequence '0x%x'", uc]]; - return NO; - break; - } - CFStringAppendCharacters((CFMutableStringRef)*o, &uc, 1); - c++; - - } else if (*c < 0x20) { - [self addErrorWithCode:ECTRL description: [NSString stringWithFormat:@"Unescaped control character '0x%x'", *c]]; - return NO; - - } else { - NSLog(@"should not be able to get here"); - } - } while (*c); - - [self addErrorWithCode:EEOF description:@"Unexpected EOF while parsing string"]; - return NO; -} - -- (BOOL)scanUnicodeChar:(unichar *)x -{ - unichar hi, lo; - - if (![self scanHexQuad:&hi]) { - [self addErrorWithCode:EUNICODE description: @"Missing hex quad"]; - return NO; - } - - if (hi >= 0xd800) { // high surrogate char? - if (hi < 0xdc00) { // yes - expect a low char - - if (!(*c == '\\' && ++c && *c == 'u' && ++c && [self scanHexQuad:&lo])) { - [self addErrorWithCode:EUNICODE description: @"Missing low character in surrogate pair"]; - return NO; - } - - if (lo < 0xdc00 || lo >= 0xdfff) { - [self addErrorWithCode:EUNICODE description:@"Invalid low surrogate char"]; - return NO; - } - - hi = (hi - 0xd800) * 0x400 + (lo - 0xdc00) + 0x10000; - - } else if (hi < 0xe000) { - [self addErrorWithCode:EUNICODE description:@"Invalid high character in surrogate pair"]; - return NO; - } - } - - *x = hi; - return YES; -} - -- (BOOL)scanHexQuad:(unichar *)x -{ - *x = 0; - for (int i = 0; i < 4; i++) { - unichar uc = *c; - c++; - int d = (uc >= '0' && uc <= '9') - ? uc - '0' : (uc >= 'a' && uc <= 'f') - ? (uc - 'a' + 10) : (uc >= 'A' && uc <= 'F') - ? (uc - 'A' + 10) : -1; - if (d == -1) { - [self addErrorWithCode:EUNICODE description:@"Missing hex digit in quad"]; - return NO; - } - *x *= 16; - *x += d; - } - return YES; -} - -- (BOOL)scanNumber:(NSNumber **)o -{ - BOOL simple = YES; - - const char *ns = c; - - // The logic to test for validity of the number formatting is relicensed - // from JSON::XS with permission from its author Marc Lehmann. - // (Available at the CPAN: http://search.cpan.org/dist/JSON-XS/ .) - - if ('-' == *c) - c++; - - if ('0' == *c && c++) { - if (isdigit(*c)) { - [self addErrorWithCode:EPARSENUM description: @"Leading 0 disallowed in number"]; - return NO; - } - - } else if (!isdigit(*c) && c != ns) { - [self addErrorWithCode:EPARSENUM description: @"No digits after initial minus"]; - return NO; - - } else { - skipDigits(c); - } - - // Fractional part - if ('.' == *c && c++) { - simple = NO; - if (!isdigit(*c)) { - [self addErrorWithCode:EPARSENUM description: @"No digits after decimal point"]; - return NO; - } - skipDigits(c); - } - - // Exponential part - if ('e' == *c || 'E' == *c) { - simple = NO; - c++; - - if ('-' == *c || '+' == *c) - c++; - - if (!isdigit(*c)) { - [self addErrorWithCode:EPARSENUM description: @"No digits after exponent"]; - return NO; - } - skipDigits(c); - } - - // If we are only reading integers, don't go through the expense of creating an NSDecimal. - // This ends up being a very large perf win. - if (simple) { - BOOL negate = NO; - long long val = 0; - const char *d = ns; - - if (*d == '-') { - negate = YES; - d++; - } - - while (isdigit(*d)) { - val *= 10; - if (val < 0) - goto longlong_overflow; - val += *d - '0'; - if (val < 0) - goto longlong_overflow; - d++; - } - - *o = [NSNumber numberWithLongLong:negate ? -val : val]; - return YES; - - } else { - // jumped to by simple branch, if an overflow occured - longlong_overflow:; - - id str = [[NSString alloc] initWithBytesNoCopy:(char*)ns - length:c - ns - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - [str autorelease]; - if (str && (*o = [NSDecimalNumber decimalNumberWithString:str])) - return YES; - - [self addErrorWithCode:EPARSENUM description: @"Failed creating decimal instance"]; - return NO; - } -} - -- (BOOL)scanIsAtEnd -{ - skipWhitespace(c); - return !*c; -} - - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.h b/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.h deleted file mode 100644 index ae1a597bb..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "SBJsonBase.h" - -/** - @brief The JSON writer class. - - Objective-C types are mapped to JSON types in the following way: - - @li NSNull -> Null - @li NSString -> String - @li NSArray -> Array - @li NSDictionary -> Object - @li NSNumber (-initWithBool:) -> Boolean - @li NSNumber -> Number - - In JSON the keys of an object must be strings. NSDictionary keys need - not be, but attempting to convert an NSDictionary with non-string keys - into JSON will throw an exception. - - NSNumber instances created with the +initWithBool: method are - converted into the JSON boolean "true" and "false" values, and vice - versa. Any other NSNumber instances are converted to a JSON number the - way you would expect. - - */ -@interface SBJsonWriter : SBJsonBase { - -@private - BOOL sortKeys, humanReadable; -} - -/** - @brief Whether we are generating human-readable (multiline) JSON. - - Set whether or not to generate human-readable JSON. The default is NO, which produces - JSON without any whitespace. (Except inside strings.) If set to YES, generates human-readable - JSON with linebreaks after each array value and dictionary key/value pair, indented two - spaces per nesting level. - */ -@property BOOL humanReadable; - -/** - @brief Whether or not to sort the dictionary keys in the output. - - If this is set to YES, the dictionary keys in the JSON output will be in sorted order. - (This is useful if you need to compare two structures, for example.) The default is NO. - */ -@property BOOL sortKeys; - -/** - @brief Return JSON representation (or fragment) for the given object. - - Returns a string containing JSON representation of the passed in value, or nil on error. - If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error. - - @param value any instance that can be represented as a JSON fragment - - */ -- (NSString*)stringWithObject:(id)value; - -/** - @brief Return JSON representation (or fragment) for the given object. - - Returns a string containing JSON representation of the passed in value, or nil on error. - If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error. - - @param value any instance that can be represented as a JSON fragment - @param error pointer to object to be populated with NSError on failure - - */- (NSString*)stringWithObject:(id)value - error:(NSError**)error; - - -@end - -/** - @brief Allows generation of JSON for otherwise unsupported classes. - - If you have a custom class that you want to create a JSON representation for you can implement - this method in your class. It should return a representation of your object defined - in terms of objects that can be translated into JSON. For example, a Person - object might implement it like this: - - @code - - (id)proxyForJson { - return [NSDictionary dictionaryWithObjectsAndKeys: - name, @"name", - phone, @"phone", - email, @"email", - nil]; - } - @endcode - - */ -@interface NSObject (SBProxyForJson) -- (id)proxyForJson; -@end - diff --git a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.m b/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.m deleted file mode 100644 index 83e8a202b..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/JSON/SBJsonWriter.m +++ /dev/null @@ -1,239 +0,0 @@ -/* - Copyright (C) 2009 Stig Brautaset. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the author nor the names of its contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import "SBJsonWriter.h" - -@interface SBJsonWriter () - -- (BOOL)appendValue:(id)fragment into:(NSMutableString*)json; -- (BOOL)appendArray:(NSArray*)fragment into:(NSMutableString*)json; -- (BOOL)appendDictionary:(NSDictionary*)fragment into:(NSMutableString*)json; -- (BOOL)appendString:(NSString*)fragment into:(NSMutableString*)json; - -- (NSString*)indent; - -@end - -@implementation SBJsonWriter - -@synthesize sortKeys; -@synthesize humanReadable; - -static NSMutableCharacterSet *kEscapeChars; - -+ (void)initialize { - kEscapeChars = [[NSMutableCharacterSet characterSetWithRange: NSMakeRange(0,32)] retain]; - [kEscapeChars addCharactersInString: @"\"\\"]; -} - -- (NSString*)stringWithObject:(id)value { - [self clearErrorTrace]; - - if ([value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSArray class]]) { - depth = 0; - NSMutableString *json = [NSMutableString stringWithCapacity:128]; - if ([self appendValue:value into:json]) - return json; - } - - if ([value respondsToSelector:@selector(proxyForJson)]) { - NSString *tmp = [self stringWithObject:[value proxyForJson]]; - if (tmp) - return tmp; - } - - [self addErrorWithCode:EFRAGMENT description:@"Not valid type for JSON"]; - return nil; -} - -- (NSString*)stringWithObject:(id)value error:(NSError**)error { - NSString *tmp = [self stringWithObject:value]; - if (tmp) - return tmp; - - if (error) - *error = [self.errorTrace lastObject]; - return nil; -} - -- (NSString*)indent { - return [@"\n" stringByPaddingToLength:1 + 2 * depth withString:@" " startingAtIndex:0]; -} - -- (BOOL)appendValue:(id)fragment into:(NSMutableString*)json { - if ([fragment isKindOfClass:[NSDictionary class]]) { - if (![self appendDictionary:fragment into:json]) - return NO; - - } else if ([fragment isKindOfClass:[NSArray class]]) { - if (![self appendArray:fragment into:json]) - return NO; - - } else if ([fragment isKindOfClass:[NSString class]]) { - if (![self appendString:fragment into:json]) - return NO; - - } else if ([fragment isKindOfClass:[NSNumber class]]) { - if ('c' == *[fragment objCType]) { - [json appendString:[fragment boolValue] ? @"true" : @"false"]; - } else if ([fragment isEqualToNumber:(NSNumber*)kCFNumberNaN]) { - [self addErrorWithCode:EUNSUPPORTED description:@"NaN is not a valid number in JSON"]; - return NO; - - } else if (isinf([fragment doubleValue])) { - [self addErrorWithCode:EUNSUPPORTED description:@"Infinity is not a valid number in JSON"]; - return NO; - - } else { - [json appendString:[fragment stringValue]]; - } - } else if ([fragment isKindOfClass:[NSNull class]]) { - [json appendString:@"null"]; - } else if ([fragment respondsToSelector:@selector(proxyForJson)]) { - [self appendValue:[fragment proxyForJson] into:json]; - - } else { - [self addErrorWithCode:EUNSUPPORTED description:[NSString stringWithFormat:@"JSON serialisation not supported for %@", [fragment class]]]; - return NO; - } - return YES; -} - -- (BOOL)appendArray:(NSArray*)fragment into:(NSMutableString*)json { - if (maxDepth && ++depth > maxDepth) { - [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; - return NO; - } - [json appendString:@"["]; - - BOOL addComma = NO; - for (id value in fragment) { - if (addComma) - [json appendString:@","]; - else - addComma = YES; - - if ([self humanReadable]) - [json appendString:[self indent]]; - - if (![self appendValue:value into:json]) { - return NO; - } - } - - depth--; - if ([self humanReadable] && [fragment count]) - [json appendString:[self indent]]; - [json appendString:@"]"]; - return YES; -} - -- (BOOL)appendDictionary:(NSDictionary*)fragment into:(NSMutableString*)json { - if (maxDepth && ++depth > maxDepth) { - [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; - return NO; - } - [json appendString:@"{"]; - - NSString *colon = [self humanReadable] ? @" : " : @":"; - BOOL addComma = NO; - NSArray *keys = [fragment allKeys]; - if (self.sortKeys) - keys = [keys sortedArrayUsingSelector:@selector(compare:)]; - - for (id value in keys) { - if (addComma) - [json appendString:@","]; - else - addComma = YES; - - if ([self humanReadable]) - [json appendString:[self indent]]; - - if (![value isKindOfClass:[NSString class]]) { - [self addErrorWithCode:EUNSUPPORTED description: @"JSON object key must be string"]; - return NO; - } - - if (![self appendString:value into:json]) - return NO; - - [json appendString:colon]; - if (![self appendValue:[fragment objectForKey:value] into:json]) { - [self addErrorWithCode:EUNSUPPORTED description:[NSString stringWithFormat:@"Unsupported value for key %@ in object", value]]; - return NO; - } - } - - depth--; - if ([self humanReadable] && [fragment count]) - [json appendString:[self indent]]; - [json appendString:@"}"]; - return YES; -} - -- (BOOL)appendString:(NSString*)fragment into:(NSMutableString*)json { - - [json appendString:@"\""]; - - NSRange esc = [fragment rangeOfCharacterFromSet:kEscapeChars]; - if ( !esc.length ) { - // No special chars -- can just add the raw string: - [json appendString:fragment]; - - } else { - NSUInteger length = [fragment length]; - for (NSUInteger i = 0; i < length; i++) { - unichar uc = [fragment characterAtIndex:i]; - switch (uc) { - case '"': [json appendString:@"\\\""]; break; - case '\\': [json appendString:@"\\\\"]; break; - case '\t': [json appendString:@"\\t"]; break; - case '\n': [json appendString:@"\\n"]; break; - case '\r': [json appendString:@"\\r"]; break; - case '\b': [json appendString:@"\\b"]; break; - case '\f': [json appendString:@"\\f"]; break; - default: - if (uc < 0x20) { - [json appendFormat:@"\\u%04x", uc]; - } else { - CFStringAppendCharacters((CFMutableStringRef)json, &uc, 1); - } - break; - - } - } - } - - [json appendString:@"\""]; - return YES; -} - - -@end diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2.xcodeproj/project.pbxproj b/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2.xcodeproj/project.pbxproj deleted file mode 100644 index 8ee3f1f7a..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2.xcodeproj/project.pbxproj +++ /dev/null @@ -1,686 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 4F24484B121F2E5C00FEE1DA /* GTMOAuth2Authentication.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244848121F2E5C00FEE1DA /* GTMOAuth2Authentication.m */; }; - 4F24484C121F2E5C00FEE1DA /* GTMOAuth2SignIn.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F24484A121F2E5C00FEE1DA /* GTMOAuth2SignIn.m */; }; - 4F24491A121F370000FEE1DA /* GTMHTTPFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244919121F370000FEE1DA /* GTMHTTPFetcher.m */; }; - 4F724A9012248CF5001A4AD0 /* GTMOAuth2Authentication.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244848121F2E5C00FEE1DA /* GTMOAuth2Authentication.m */; }; - 4F724A9212248CF5001A4AD0 /* GTMOAuth2SignIn.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F24484A121F2E5C00FEE1DA /* GTMOAuth2SignIn.m */; }; - 4F724A9412248CF5001A4AD0 /* GTMHTTPFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244919121F370000FEE1DA /* GTMHTTPFetcher.m */; }; - 4F724AB812248D6B001A4AD0 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F724AB512248D6B001A4AD0 /* Security.framework */; }; - 4F724ABA12248D6B001A4AD0 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F724AB712248D6B001A4AD0 /* SystemConfiguration.framework */; }; - 4F724BAB12248F75001A4AD0 /* GTMHTTPFetchHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F724BA912248F75001A4AD0 /* GTMHTTPFetchHistory.m */; }; - 4F724BB012248F81001A4AD0 /* GTMHTTPFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F724BAE12248F81001A4AD0 /* GTMHTTPFetcherLogging.m */; }; - 4F8D436B133972F5000B4396 /* GTMOAuth2Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4F8D436A133972F5000B4396 /* GTMOAuth2Window.xib */; }; - 4F8D437E1339735D000B4396 /* GTMOAuth2ViewControllerTouch.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8D437C1339735D000B4396 /* GTMOAuth2ViewControllerTouch.m */; }; - 4F94D2D012288B8A00BC78AA /* GTMHTTPFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F244918121F370000FEE1DA /* GTMHTTPFetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F94D2D112288B8A00BC78AA /* GTMHTTPFetcherLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F724BAD12248F81001A4AD0 /* GTMHTTPFetcherLogging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F94D2D212288B8A00BC78AA /* GTMHTTPFetchHistory.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F724BA812248F75001A4AD0 /* GTMHTTPFetchHistory.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F94D2D312288B8A00BC78AA /* GTMOAuth2Authentication.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F244847121F2E5C00FEE1DA /* GTMOAuth2Authentication.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F94D2D812288B8A00BC78AA /* GTMOAuth2SignIn.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F244849121F2E5C00FEE1DA /* GTMOAuth2SignIn.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F94D2D912288B8A00BC78AA /* GTMOAuth2WindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F7249FA122485EE001A4AD0 /* GTMOAuth2WindowController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F94D33E1228944800BC78AA /* GTMOAuth2WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F7249FB122485EE001A4AD0 /* GTMOAuth2WindowController.m */; }; - 4FC754F113E77E25006A0C26 /* GTMOAuth2Authentication.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244848121F2E5C00FEE1DA /* GTMOAuth2Authentication.m */; }; - 4FC754F213E77E25006A0C26 /* GTMOAuth2SignIn.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F24484A121F2E5C00FEE1DA /* GTMOAuth2SignIn.m */; }; - 4FC754F313E77E25006A0C26 /* GTMHTTPFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244919121F370000FEE1DA /* GTMHTTPFetcher.m */; }; - 4FC754F413E77E25006A0C26 /* GTMOAuth2ViewControllerTouch.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8D437C1339735D000B4396 /* GTMOAuth2ViewControllerTouch.m */; }; - 4FC754FD13E77E2B006A0C26 /* GTMHTTPFetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F244918121F370000FEE1DA /* GTMHTTPFetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FC754FE13E77E2B006A0C26 /* GTMHTTPFetcherLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F724BAD12248F81001A4AD0 /* GTMHTTPFetcherLogging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FC754FF13E77E2B006A0C26 /* GTMHTTPFetchHistory.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F724BA812248F75001A4AD0 /* GTMHTTPFetchHistory.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FC7550013E77E2B006A0C26 /* GTMOAuth2Authentication.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F244847121F2E5C00FEE1DA /* GTMOAuth2Authentication.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FC7550113E77E2B006A0C26 /* GTMOAuth2SignIn.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F244849121F2E5C00FEE1DA /* GTMOAuth2SignIn.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FC7550213E77E2B006A0C26 /* GTMOAuth2WindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F7249FA122485EE001A4AD0 /* GTMOAuth2WindowController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FC7550513E77E2B006A0C26 /* GTMOAuth2Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4F8D436A133972F5000B4396 /* GTMOAuth2Window.xib */; }; - 4FC7550713E77E2B006A0C26 /* GTMOAuth2Authentication.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244848121F2E5C00FEE1DA /* GTMOAuth2Authentication.m */; }; - 4FC7550813E77E2B006A0C26 /* GTMOAuth2SignIn.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F24484A121F2E5C00FEE1DA /* GTMOAuth2SignIn.m */; }; - 4FC7550913E77E2B006A0C26 /* GTMHTTPFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F244919121F370000FEE1DA /* GTMHTTPFetcher.m */; }; - 4FC7550A13E77E2B006A0C26 /* GTMHTTPFetchHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F724BA912248F75001A4AD0 /* GTMHTTPFetchHistory.m */; }; - 4FC7550B13E77E2B006A0C26 /* GTMHTTPFetcherLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F724BAE12248F81001A4AD0 /* GTMHTTPFetcherLogging.m */; }; - 4FC7550C13E77E2B006A0C26 /* GTMOAuth2WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F7249FB122485EE001A4AD0 /* GTMOAuth2WindowController.m */; }; - 4FC7550F13E77E2B006A0C26 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F724AB512248D6B001A4AD0 /* Security.framework */; }; - 4FC7551013E77E2B006A0C26 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F724AB712248D6B001A4AD0 /* SystemConfiguration.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 4F244847121F2E5C00FEE1DA /* GTMOAuth2Authentication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2Authentication.h; sourceTree = ""; }; - 4F244848121F2E5C00FEE1DA /* GTMOAuth2Authentication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2Authentication.m; sourceTree = ""; }; - 4F244849121F2E5C00FEE1DA /* GTMOAuth2SignIn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMOAuth2SignIn.h; sourceTree = ""; }; - 4F24484A121F2E5C00FEE1DA /* GTMOAuth2SignIn.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMOAuth2SignIn.m; sourceTree = ""; }; - 4F244918121F370000FEE1DA /* GTMHTTPFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMHTTPFetcher.h; path = ../HTTPFetcher/GTMHTTPFetcher.h; sourceTree = SOURCE_ROOT; }; - 4F244919121F370000FEE1DA /* GTMHTTPFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetcher.m; path = ../HTTPFetcher/GTMHTTPFetcher.m; sourceTree = SOURCE_ROOT; }; - 4F3A8DBE125A61910080EB6C /* ReleaseNotes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReleaseNotes.txt; sourceTree = ""; }; - 4F7249FA122485EE001A4AD0 /* GTMOAuth2WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMOAuth2WindowController.h; path = Mac/GTMOAuth2WindowController.h; sourceTree = ""; }; - 4F7249FB122485EE001A4AD0 /* GTMOAuth2WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMOAuth2WindowController.m; path = Mac/GTMOAuth2WindowController.m; sourceTree = ""; }; - 4F724AB512248D6B001A4AD0 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; - 4F724AB612248D6B001A4AD0 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 4F724AB712248D6B001A4AD0 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = ""; }; - 4F724BA812248F75001A4AD0 /* GTMHTTPFetchHistory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMHTTPFetchHistory.h; path = ../HTTPFetcher/GTMHTTPFetchHistory.h; sourceTree = SOURCE_ROOT; }; - 4F724BA912248F75001A4AD0 /* GTMHTTPFetchHistory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetchHistory.m; path = ../HTTPFetcher/GTMHTTPFetchHistory.m; sourceTree = SOURCE_ROOT; }; - 4F724BAD12248F81001A4AD0 /* GTMHTTPFetcherLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMHTTPFetcherLogging.h; path = ../HTTPFetcher/GTMHTTPFetcherLogging.h; sourceTree = SOURCE_ROOT; }; - 4F724BAE12248F81001A4AD0 /* GTMHTTPFetcherLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMHTTPFetcherLogging.m; path = ../HTTPFetcher/GTMHTTPFetcherLogging.m; sourceTree = SOURCE_ROOT; }; - 4F8D436A133972F5000B4396 /* GTMOAuth2Window.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = GTMOAuth2Window.xib; path = Mac/GTMOAuth2Window.xib; sourceTree = ""; }; - 4F8D437B1339735D000B4396 /* GTMOAuth2ViewControllerTouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMOAuth2ViewControllerTouch.h; path = Touch/GTMOAuth2ViewControllerTouch.h; sourceTree = ""; }; - 4F8D437C1339735D000B4396 /* GTMOAuth2ViewControllerTouch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMOAuth2ViewControllerTouch.m; path = Touch/GTMOAuth2ViewControllerTouch.m; sourceTree = ""; }; - 4F8D437D1339735D000B4396 /* GTMOAuth2ViewTouch.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = GTMOAuth2ViewTouch.xib; path = Touch/GTMOAuth2ViewTouch.xib; sourceTree = ""; }; - 4FC754FA13E77E25006A0C26 /* libOAuthTouch2NG.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libOAuthTouch2NG.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 4FF2B2F9133BC54600D75613 /* GTMOAuth2Framework-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GTMOAuth2Framework-Info.plist"; path = "Mac/GTMOAuth2Framework-Info.plist"; sourceTree = ""; }; - D2AAC07E0554694100DB518D /* libOAuthTouch2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libOAuthTouch2.a; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 4F724A6F12248B19001A4AD0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F724AB812248D6B001A4AD0 /* Security.framework in Frameworks */, - 4F724ABA12248D6B001A4AD0 /* SystemConfiguration.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4FC754F613E77E25006A0C26 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4FC7550E13E77E2B006A0C26 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4FC7550F13E77E2B006A0C26 /* Security.framework in Frameworks */, - 4FC7551013E77E2B006A0C26 /* SystemConfiguration.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07C0554694100DB518D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DFFF38A50411DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - D2AAC07E0554694100DB518D /* libOAuthTouch2.a */, - 4FC754FA13E77E25006A0C26 /* libOAuthTouch2NG.a */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* OAuthTouchStaticLibrary */ = { - isa = PBXGroup; - children = ( - 4F7249C012248423001A4AD0 /* Sources */, - 034768DFFF38A50411DB9C8B /* Products */, - 4F724AA112248D35001A4AD0 /* Libraries */, - 4F3A8DBE125A61910080EB6C /* ReleaseNotes.txt */, - ); - name = OAuthTouchStaticLibrary; - sourceTree = ""; - }; - 4F7249C012248423001A4AD0 /* Sources */ = { - isa = PBXGroup; - children = ( - 4F244847121F2E5C00FEE1DA /* GTMOAuth2Authentication.h */, - 4F244848121F2E5C00FEE1DA /* GTMOAuth2Authentication.m */, - 4F244849121F2E5C00FEE1DA /* GTMOAuth2SignIn.h */, - 4F24484A121F2E5C00FEE1DA /* GTMOAuth2SignIn.m */, - 4F7249F2122485AC001A4AD0 /* Touch */, - 4F7249F3122485B2001A4AD0 /* Mac */, - 4F724BA712248F62001A4AD0 /* HTTPFetcher */, - ); - name = Sources; - sourceTree = ""; - }; - 4F7249F2122485AC001A4AD0 /* Touch */ = { - isa = PBXGroup; - children = ( - 4F8D437B1339735D000B4396 /* GTMOAuth2ViewControllerTouch.h */, - 4F8D437C1339735D000B4396 /* GTMOAuth2ViewControllerTouch.m */, - 4F8D437D1339735D000B4396 /* GTMOAuth2ViewTouch.xib */, - ); - name = Touch; - sourceTree = ""; - }; - 4F7249F3122485B2001A4AD0 /* Mac */ = { - isa = PBXGroup; - children = ( - 4F8D436A133972F5000B4396 /* GTMOAuth2Window.xib */, - 4F7249FA122485EE001A4AD0 /* GTMOAuth2WindowController.h */, - 4F7249FB122485EE001A4AD0 /* GTMOAuth2WindowController.m */, - 4FF2B2F9133BC54600D75613 /* GTMOAuth2Framework-Info.plist */, - ); - name = Mac; - sourceTree = ""; - }; - 4F724AA112248D35001A4AD0 /* Libraries */ = { - isa = PBXGroup; - children = ( - 4F724AB612248D6B001A4AD0 /* SenTestingKit.framework */, - 4F724AB512248D6B001A4AD0 /* Security.framework */, - 4F724AB712248D6B001A4AD0 /* SystemConfiguration.framework */, - ); - name = Libraries; - sourceTree = ""; - }; - 4F724BA712248F62001A4AD0 /* HTTPFetcher */ = { - isa = PBXGroup; - children = ( - 4F244918121F370000FEE1DA /* GTMHTTPFetcher.h */, - 4F244919121F370000FEE1DA /* GTMHTTPFetcher.m */, - 4F724BA812248F75001A4AD0 /* GTMHTTPFetchHistory.h */, - 4F724BA912248F75001A4AD0 /* GTMHTTPFetchHistory.m */, - 4F724BAD12248F81001A4AD0 /* GTMHTTPFetcherLogging.h */, - 4F724BAE12248F81001A4AD0 /* GTMHTTPFetcherLogging.m */, - ); - name = HTTPFetcher; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 4F724A6C12248B19001A4AD0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F94D2D012288B8A00BC78AA /* GTMHTTPFetcher.h in Headers */, - 4F94D2D112288B8A00BC78AA /* GTMHTTPFetcherLogging.h in Headers */, - 4F94D2D212288B8A00BC78AA /* GTMHTTPFetchHistory.h in Headers */, - 4F94D2D312288B8A00BC78AA /* GTMOAuth2Authentication.h in Headers */, - 4F94D2D812288B8A00BC78AA /* GTMOAuth2SignIn.h in Headers */, - 4F94D2D912288B8A00BC78AA /* GTMOAuth2WindowController.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4FC754FC13E77E2B006A0C26 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 4FC754FD13E77E2B006A0C26 /* GTMHTTPFetcher.h in Headers */, - 4FC754FE13E77E2B006A0C26 /* GTMHTTPFetcherLogging.h in Headers */, - 4FC754FF13E77E2B006A0C26 /* GTMHTTPFetchHistory.h in Headers */, - 4FC7550013E77E2B006A0C26 /* GTMOAuth2Authentication.h in Headers */, - 4FC7550113E77E2B006A0C26 /* GTMOAuth2SignIn.h in Headers */, - 4FC7550213E77E2B006A0C26 /* GTMOAuth2WindowController.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 4F724A7012248B19001A4AD0 /* GTMOAuth2.framework */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4F724A7412248B19001A4AD0 /* Build configuration list for PBXNativeTarget "GTMOAuth2.framework" */; - buildPhases = ( - 4F724A6C12248B19001A4AD0 /* Headers */, - 4F724A6D12248B19001A4AD0 /* Resources */, - 4F724A6E12248B19001A4AD0 /* Sources */, - 4F724A6F12248B19001A4AD0 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GTMOAuth2.framework; - productName = OAuth.framework; - productType = "com.apple.product-type.framework"; - }; - 4FC754EF13E77E25006A0C26 /* OAuthTouchNonGoogleStaticLib */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4FC754F713E77E25006A0C26 /* Build configuration list for PBXNativeTarget "OAuthTouchNonGoogleStaticLib" */; - buildPhases = ( - 4FC754F013E77E25006A0C26 /* Sources */, - 4FC754F613E77E25006A0C26 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = OAuthTouchNonGoogleStaticLib; - productName = OAuthTouchStaticLibrary; - productReference = 4FC754FA13E77E25006A0C26 /* libOAuthTouch2NG.a */; - productType = "com.apple.product-type.library.static"; - }; - 4FC754FB13E77E2B006A0C26 /* GTMOAuth2NonGoogle.framework */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4FC7551113E77E2B006A0C26 /* Build configuration list for PBXNativeTarget "GTMOAuth2NonGoogle.framework" */; - buildPhases = ( - 4FC754FC13E77E2B006A0C26 /* Headers */, - 4FC7550413E77E2B006A0C26 /* Resources */, - 4FC7550613E77E2B006A0C26 /* Sources */, - 4FC7550E13E77E2B006A0C26 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GTMOAuth2NonGoogle.framework; - productName = OAuth.framework; - productType = "com.apple.product-type.framework"; - }; - D2AAC07D0554694100DB518D /* OAuthTouchStaticLib */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "OAuthTouchStaticLib" */; - buildPhases = ( - D2AAC07B0554694100DB518D /* Sources */, - D2AAC07C0554694100DB518D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = OAuthTouchStaticLib; - productName = OAuthTouchStaticLibrary; - productReference = D2AAC07E0554694100DB518D /* libOAuthTouch2.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "GTMOAuth2" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 1; - knownRegions = ( - English, - Japanese, - French, - German, - ); - mainGroup = 0867D691FE84028FC02AAC07 /* OAuthTouchStaticLibrary */; - productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - D2AAC07D0554694100DB518D /* OAuthTouchStaticLib */, - 4FC754EF13E77E25006A0C26 /* OAuthTouchNonGoogleStaticLib */, - 4F724A7012248B19001A4AD0 /* GTMOAuth2.framework */, - 4FC754FB13E77E2B006A0C26 /* GTMOAuth2NonGoogle.framework */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 4F724A6D12248B19001A4AD0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F8D436B133972F5000B4396 /* GTMOAuth2Window.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4FC7550413E77E2B006A0C26 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4FC7550513E77E2B006A0C26 /* GTMOAuth2Window.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 4F724A6E12248B19001A4AD0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F724A9012248CF5001A4AD0 /* GTMOAuth2Authentication.m in Sources */, - 4F724A9212248CF5001A4AD0 /* GTMOAuth2SignIn.m in Sources */, - 4F724A9412248CF5001A4AD0 /* GTMHTTPFetcher.m in Sources */, - 4F724BAB12248F75001A4AD0 /* GTMHTTPFetchHistory.m in Sources */, - 4F724BB012248F81001A4AD0 /* GTMHTTPFetcherLogging.m in Sources */, - 4F94D33E1228944800BC78AA /* GTMOAuth2WindowController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4FC754F013E77E25006A0C26 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4FC754F113E77E25006A0C26 /* GTMOAuth2Authentication.m in Sources */, - 4FC754F213E77E25006A0C26 /* GTMOAuth2SignIn.m in Sources */, - 4FC754F313E77E25006A0C26 /* GTMHTTPFetcher.m in Sources */, - 4FC754F413E77E25006A0C26 /* GTMOAuth2ViewControllerTouch.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4FC7550613E77E2B006A0C26 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4FC7550713E77E2B006A0C26 /* GTMOAuth2Authentication.m in Sources */, - 4FC7550813E77E2B006A0C26 /* GTMOAuth2SignIn.m in Sources */, - 4FC7550913E77E2B006A0C26 /* GTMHTTPFetcher.m in Sources */, - 4FC7550A13E77E2B006A0C26 /* GTMHTTPFetchHistory.m in Sources */, - 4FC7550B13E77E2B006A0C26 /* GTMHTTPFetcherLogging.m in Sources */, - 4FC7550C13E77E2B006A0C26 /* GTMOAuth2WindowController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D2AAC07B0554694100DB518D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4F24484B121F2E5C00FEE1DA /* GTMOAuth2Authentication.m in Sources */, - 4F24484C121F2E5C00FEE1DA /* GTMOAuth2SignIn.m in Sources */, - 4F24491A121F370000FEE1DA /* GTMHTTPFetcher.m in Sources */, - 4F8D437E1339735D000B4396 /* GTMOAuth2ViewControllerTouch.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 1DEB921F08733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = OAuthTouch2; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 1DEB922008733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; - "ARCHS[sdk=iphoneos*]" = ( - armv6, - armv7, - ); - GCC_MODEL_TUNING = G5; - INSTALL_PATH = /usr/local/lib; - PRODUCT_NAME = OAuthTouch2; - SDKROOT = iphoneos; - }; - name = Release; - }; - 1DEB922308733DC00010E9CD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; - GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VALUE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - OTHER_CFLAGS = "-DDEBUG=1"; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = macosx; - }; - name = Debug; - }; - 1DEB922408733DC00010E9CD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - GCC_C_LANGUAGE_STANDARD = c99; - GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; - GCC_WARN_ABOUT_MISSING_NEWLINE = YES; - GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; - GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_SHADOW = YES; - GCC_WARN_SIGN_COMPARE = YES; - GCC_WARN_STRICT_SELECTOR_MATCH = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNKNOWN_PRAGMAS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_LABEL = YES; - GCC_WARN_UNUSED_VALUE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = macosx; - }; - name = Release; - }; - 4F724A7212248B19001A4AD0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", - ); - FRAMEWORK_VERSION = A; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; - INFOPLIST_FILE = "Mac/GTMOAuth2Framework-Info.plist"; - INSTALL_PATH = "$(HOME)/Library/Frameworks"; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = GTMOAuth2; - SDKROOT = macosx; - }; - name = Debug; - }; - 4F724A7312248B19001A4AD0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", - ); - FRAMEWORK_VERSION = A; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; - INFOPLIST_FILE = "Mac/GTMOAuth2Framework-Info.plist"; - INSTALL_PATH = "$(HOME)/Library/Frameworks"; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = GTMOAuth2; - SDKROOT = macosx; - ZERO_LINK = NO; - }; - name = Release; - }; - 4FC754F813E77E25006A0C26 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - INSTALL_PATH = /usr/local/lib; - OTHER_CFLAGS = ( - "-DGTM_OAUTH2_SKIP_GOOGLE_SUPPORT=1", - "$(inherited)", - ); - PRODUCT_NAME = OAuthTouch2NG; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 4FC754F913E77E25006A0C26 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; - GCC_MODEL_TUNING = G5; - INSTALL_PATH = /usr/local/lib; - OTHER_CFLAGS = "-DGTM_OAUTH2_SKIP_GOOGLE_SUPPORT=1"; - PRODUCT_NAME = OAuthTouch2NG; - SDKROOT = iphoneos; - }; - name = Release; - }; - 4FC7551213E77E2B006A0C26 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", - ); - FRAMEWORK_VERSION = A; - GCC_DYNAMIC_NO_PIC = NO; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; - INFOPLIST_FILE = "Mac/GTMOAuth2Framework-Info.plist"; - INSTALL_PATH = "$(HOME)/Library/Frameworks"; - OTHER_CFLAGS = ( - "-DGTM_OAUTH2_SKIP_GOOGLE_SUPPORT=1", - "$(inherited)", - ); - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = GTMOAuth2; - SDKROOT = macosx; - }; - name = Debug; - }; - 4FC7551313E77E2B006A0C26 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", - ); - FRAMEWORK_VERSION = A; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; - INFOPLIST_FILE = "Mac/GTMOAuth2Framework-Info.plist"; - INSTALL_PATH = "$(HOME)/Library/Frameworks"; - OTHER_CFLAGS = "-DGTM_OAUTH2_SKIP_GOOGLE_SUPPORT=1"; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = GTMOAuth2; - SDKROOT = macosx; - ZERO_LINK = NO; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "OAuthTouchStaticLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB921F08733DC00010E9CD /* Debug */, - 1DEB922008733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "GTMOAuth2" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1DEB922308733DC00010E9CD /* Debug */, - 1DEB922408733DC00010E9CD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4F724A7412248B19001A4AD0 /* Build configuration list for PBXNativeTarget "GTMOAuth2.framework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4F724A7212248B19001A4AD0 /* Debug */, - 4F724A7312248B19001A4AD0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4FC754F713E77E25006A0C26 /* Build configuration list for PBXNativeTarget "OAuthTouchNonGoogleStaticLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4FC754F813E77E25006A0C26 /* Debug */, - 4FC754F913E77E25006A0C26 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4FC7551113E77E2B006A0C26 /* Build configuration list for PBXNativeTarget "GTMOAuth2NonGoogle.framework" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4FC7551213E77E2B006A0C26 /* Debug */, - 4FC7551313E77E2B006A0C26 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.h b/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.h deleted file mode 100644 index 02b9ce2e8..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.h +++ /dev/null @@ -1,362 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -// This class implements the OAuth 2 protocol for authorizing requests. -// http://tools.ietf.org/html/draft-ietf-oauth-v2 - -#import - -#if GTM_USE_SESSION_FETCHER - #import "GTMSessionFetcher.h" -#else - #import "GTMHTTPFetcher.h" -#endif // GTM_USE_SESSION_FETCHER - -#define GTMOAuth2Fetcher GTMBridgeFetcher -#define GTMOAuth2FetcherService GTMBridgeFetcherService -#define GTMOAuth2FetcherServiceProtocol GTMBridgeFetcherServiceProtocol -#define GTMOAuth2AssertValidSelector GTMBridgeAssertValidSelector -#define GTMOAuth2CookieStorage GTMBridgeCookieStorage -#define kGTMOAuth2FetcherStatusDomain kGTMBridgeFetcherStatusDomain -#define kGTMOAuth2StatusBadRequest kGTMBridgeFetcherStatusBadRequest - - -// Until all OAuth 2 providers are up to the same spec, we'll provide a crude -// way here to override the "Bearer" string in the Authorization header -#ifndef GTM_OAUTH2_BEARER -#define GTM_OAUTH2_BEARER "Bearer" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// Service provider name allows stored authorization to be associated with -// the authorizing service -extern NSString *const kGTMOAuth2ServiceProviderGoogle; - -// -// GTMOAuth2SignIn constants, included here for use by clients -// -extern NSString *const kGTMOAuth2ErrorDomain; - -// Error userInfo keys -extern NSString *const kGTMOAuth2ErrorMessageKey; -extern NSString *const kGTMOAuth2ErrorRequestKey; -extern NSString *const kGTMOAuth2ErrorJSONKey; - -enum { - // Error code indicating that the window was prematurely closed - kGTMOAuth2ErrorWindowClosed = -1000, - kGTMOAuth2ErrorAuthorizationFailed = -1001, - kGTMOAuth2ErrorTokenExpired = -1002, - kGTMOAuth2ErrorTokenUnavailable = -1003, - kGTMOAuth2ErrorUnauthorizableRequest = -1004 -}; - - -// Notifications for token fetches -extern NSString *const kGTMOAuth2FetchStarted; -extern NSString *const kGTMOAuth2FetchStopped; - -extern NSString *const kGTMOAuth2FetcherKey; -extern NSString *const kGTMOAuth2FetchTypeKey; -extern NSString *const kGTMOAuth2FetchTypeToken; -extern NSString *const kGTMOAuth2FetchTypeRefresh; -extern NSString *const kGTMOAuth2FetchTypeAssertion; -extern NSString *const kGTMOAuth2FetchTypeUserInfo; - -// Token-issuance errors -extern NSString *const kGTMOAuth2ErrorKey; -extern NSString *const kGTMOAuth2ErrorObjectKey; - -extern NSString *const kGTMOAuth2ErrorInvalidRequest; -extern NSString *const kGTMOAuth2ErrorInvalidClient; -extern NSString *const kGTMOAuth2ErrorInvalidGrant; -extern NSString *const kGTMOAuth2ErrorUnauthorizedClient; -extern NSString *const kGTMOAuth2ErrorUnsupportedGrantType; -extern NSString *const kGTMOAuth2ErrorInvalidScope; - -// Notification that sign-in has completed, and token fetches will begin (useful -// for displaying interstitial messages after the window has closed) -extern NSString *const kGTMOAuth2UserSignedIn; - -// Notification for token changes -extern NSString *const kGTMOAuth2AccessTokenRefreshed; -extern NSString *const kGTMOAuth2RefreshTokenChanged; -extern NSString *const kGTMOAuth2AccessTokenRefreshFailed; - -// Notification for WebView loading -extern NSString *const kGTMOAuth2WebViewStartedLoading; -extern NSString *const kGTMOAuth2WebViewStoppedLoading; -extern NSString *const kGTMOAuth2WebViewKey; -extern NSString *const kGTMOAuth2WebViewStopKindKey; -extern NSString *const kGTMOAuth2WebViewFinished; -extern NSString *const kGTMOAuth2WebViewFailed; -extern NSString *const kGTMOAuth2WebViewCancelled; - -// Notification for network loss during html sign-in display -extern NSString *const kGTMOAuth2NetworkLost; -extern NSString *const kGTMOAuth2NetworkFound; - -#ifdef __cplusplus -} -#endif - -@interface GTMOAuth2Authentication : NSObject { - @private - NSString *clientID_; - NSString *clientSecret_; - NSString *redirectURI_; - NSMutableDictionary *parameters_; - - // authorization parameters - NSURL *tokenURL_; - NSDate *expirationDate_; - - NSString *authorizationTokenKey_; - - NSDictionary *additionalTokenRequestParameters_; - NSDictionary *additionalGrantTypeRequestParameters_; - - // queue of requests for authorization waiting for a valid access token - GTMOAuth2Fetcher *refreshFetcher_; - NSMutableArray *authorizationQueue_; - - id fetcherService_; // WEAK - - Class parserClass_; - - BOOL shouldAuthorizeAllRequests_; - - // arbitrary data retained for the user - id userData_; - NSMutableDictionary *properties_; -} - -// OAuth2 standard protocol parameters -// -// These should be the plain strings; any needed escaping will be provided by -// the library. - -// Request properties -@property (copy) NSString *clientID; -@property (copy) NSString *clientSecret; -@property (copy) NSString *redirectURI; -@property (retain) NSString *scope; -@property (retain) NSString *tokenType; -@property (retain) NSString *assertion; -@property (retain) NSString *refreshScope; - -// Apps may optionally add parameters here to be provided to the token -// endpoint on token requests and refreshes. -@property (retain) NSDictionary *additionalTokenRequestParameters; - -// Apps may optionally add parameters here to be provided to the token -// endpoint on specific token requests and refreshes, keyed by the grant_type. -// For example, if a different "type" parameter is required for obtaining -// the auth code and on refresh, this might be: -// -// viewController.authentication.additionalGrantTypeRequestParameters = @{ -// @"authorization_code" : @{ @"type" : @"code" }, -// @"refresh_token" : @{ @"type" : @"refresh" } -// }; -@property (retain) NSDictionary *additionalGrantTypeRequestParameters; - -// Response properties -@property (retain) NSMutableDictionary *parameters; - -@property (retain) NSString *accessToken; -@property (retain) NSString *refreshToken; -@property (retain) NSNumber *expiresIn; -@property (retain) NSString *code; -@property (retain) NSString *errorString; - -// URL for obtaining access tokens -@property (copy) NSURL *tokenURL; - -// Calculated expiration date (expiresIn seconds added to the -// time the access token was received.) -@property (copy) NSDate *expirationDate; - -// Service identifier, like "Google"; not used for authentication -// -// The provider name is just for allowing stored authorization to be associated -// with the authorizing service. -@property (copy) NSString *serviceProvider; - -// User ID; not used for authentication -@property (retain) NSString *userID; - -// User email and verified status; not used for authentication -// -// The verified string can be checked with -boolValue. If the result is false, -// then the email address is listed with the account on the server, but the -// address has not been confirmed as belonging to the owner of the account. -@property (retain) NSString *userEmail; -@property (retain) NSString *userEmailIsVerified; - -// Property indicating if this auth has a refresh or access token so is suitable -// for authorizing a request. This does not guarantee that the token is valid. -@property (readonly) BOOL canAuthorize; - -// Property indicating if this object will authorize plain http request -// (as well as any non-https requests.) Default is NO, only requests with the -// scheme https are authorized, since security may be compromised if tokens -// are sent over the wire using an unencrypted protocol like http. -@property (assign) BOOL shouldAuthorizeAllRequests; - -// userData is retained for the convenience of the caller -@property (retain) id userData; - -// Stored property values are retained for the convenience of the caller -@property (retain) NSDictionary *properties; - -// Property for the optional fetcher service instance to be used to create -// fetchers -// -// Fetcher service objects retain authorizations, so this is weak to avoid -// circular retains. -@property (assign) id fetcherService; // WEAK - -// Alternative JSON parsing class; this should implement the -// GTMOAuth2ParserClass informal protocol. If this property is -// not set, the class SBJSON must be available in the runtime. -@property (assign) Class parserClass; - -// Key for the response parameter used for the authorization header; by default, -// "access_token" is used, but some servers may expect alternatives, like -// "id_token". -@property (copy) NSString *authorizationTokenKey; - -// Convenience method for creating an authentication object -+ (id)authenticationWithServiceProvider:(NSString *)serviceProvider - tokenURL:(NSURL *)tokenURL - redirectURI:(NSString *)redirectURI - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret; - -// Clear out any authentication values, prepare for a new request fetch -- (void)reset; - -// Main authorization entry points -// -// These will refresh the access token, if necessary, add the access token to -// the request, then invoke the callback. -// -// The request argument may be nil to just force a refresh of the access token, -// if needed. -// -// NOTE: To avoid accidental leaks of bearer tokens, the request must -// be for a URL with the scheme https unless the shouldAuthorizeAllRequests -// property is set. - -// The finish selector should have a signature matching -// - (void)authentication:(GTMOAuth2Authentication *)auth -// request:(NSMutableURLRequest *)request -// finishedWithError:(NSError *)error; - -- (void)authorizeRequest:(NSMutableURLRequest *)request - delegate:(id)delegate - didFinishSelector:(SEL)sel; - -#if NS_BLOCKS_AVAILABLE -- (void)authorizeRequest:(NSMutableURLRequest *)request - completionHandler:(void (^)(NSError *error))handler; -#endif - -// Synchronous entry point; authorizing this way cannot refresh an expired -// access token -- (BOOL)authorizeRequest:(NSMutableURLRequest *)request; - -// If the authentication is waiting for a refresh to complete, spin the run -// loop, discarding events, until the fetch has completed -// -// This is only for use in testing or in tools without a user interface. -- (void)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds; - - -////////////////////////////////////////////////////////////////////////////// -// -// Internal properties and methods for use by GTMOAuth2SignIn -// - -// Pending fetcher to get a new access token, if any -@property (retain) GTMOAuth2Fetcher *refreshFetcher; - -// Check if a request is queued up to be authorized -- (BOOL)isAuthorizingRequest:(NSURLRequest *)request; - -// Check if a request appears to be authorized -- (BOOL)isAuthorizedRequest:(NSURLRequest *)request; - -// Stop any pending refresh fetch. This will also cancel the authorization -// for all fetch requests pending authorization. -- (void)stopAuthorization; - -// Prevents authorization callback for a given request. -- (void)stopAuthorizationForRequest:(NSURLRequest *)request; - -// OAuth fetch user-agent header value -- (NSString *)userAgent; - -// Parse and set token and token secret from response data -- (void)setKeysForResponseString:(NSString *)str; -- (void)setKeysForResponseDictionary:(NSDictionary *)dict; - -// Persistent token string for keychain storage -// -// We'll use the format "refresh_token=foo&serviceProvider=bar" so we can -// easily alter what portions of the auth data are stored -// -// Use these methods for serialization -- (NSString *)persistenceResponseString; -- (void)setKeysForPersistenceResponseString:(NSString *)str; - -// method to begin fetching an access token, used by the sign-in object -- (GTMOAuth2Fetcher *)beginTokenFetchWithDelegate:(id)delegate - didFinishSelector:(SEL)finishedSel; - -// Entry point to post a notification about a fetcher currently used for -// obtaining or refreshing a token; the sign-in object will also use this -// to indicate when the user's email address is being fetched. -// -// Fetch type constants are above under "notifications for token fetches" -- (void)notifyFetchIsRunning:(BOOL)isStarting - fetcher:(GTMOAuth2Fetcher *)fetcher - type:(NSString *)fetchType; - -// Arbitrary key-value properties retained for the user -- (void)setProperty:(id)obj forKey:(NSString *)key; -- (id)propertyForKey:(NSString *)key; - -// -// Utilities -// - -+ (NSString *)encodedOAuthValueForString:(NSString *)str; - -+ (NSString *)encodedQueryParametersForDictionary:(NSDictionary *)dict; - -+ (NSDictionary *)dictionaryWithResponseString:(NSString *)responseStr; - -+ (NSDictionary *)dictionaryWithJSONData:(NSData *)data; - -+ (NSString *)scopeWithStrings:(NSString *)firstStr, ... NS_REQUIRES_NIL_TERMINATION; -@end - -#endif // GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.m b/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.m deleted file mode 100644 index 8dcae26c6..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2Authentication.m +++ /dev/null @@ -1,1321 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -#import "GTMOAuth2Authentication.h" - -// Extern strings - -NSString *const kGTMOAuth2ServiceProviderGoogle = @"Google"; - -NSString *const kGTMOAuth2ErrorDomain = @"com.google.GTMOAuth2"; - -NSString *const kGTMOAuth2ErrorMessageKey = @"error"; -NSString *const kGTMOAuth2ErrorRequestKey = @"request"; -NSString *const kGTMOAuth2ErrorJSONKey = @"json"; - -// Notifications -NSString *const kGTMOAuth2FetchStarted = @"kGTMOAuth2FetchStarted"; -NSString *const kGTMOAuth2FetchStopped = @"kGTMOAuth2FetchStopped"; - -NSString *const kGTMOAuth2FetcherKey = @"fetcher"; -NSString *const kGTMOAuth2FetchTypeKey = @"FetchType"; -NSString *const kGTMOAuth2FetchTypeToken = @"token"; -NSString *const kGTMOAuth2FetchTypeRefresh = @"refresh"; -NSString *const kGTMOAuth2FetchTypeAssertion = @"assertion"; -NSString *const kGTMOAuth2FetchTypeUserInfo = @"userInfo"; - -NSString *const kGTMOAuth2ErrorKey = @"error"; -NSString *const kGTMOAuth2ErrorObjectKey = @"kGTMOAuth2ErrorObjectKey"; - -NSString *const kGTMOAuth2ErrorInvalidRequest = @"invalid_request"; -NSString *const kGTMOAuth2ErrorInvalidClient = @"invalid_client"; -NSString *const kGTMOAuth2ErrorInvalidGrant = @"invalid_grant"; -NSString *const kGTMOAuth2ErrorUnauthorizedClient = @"unauthorized_client"; -NSString *const kGTMOAuth2ErrorUnsupportedGrantType = @"unsupported_grant_type"; -NSString *const kGTMOAuth2ErrorInvalidScope = @"invalid_scope"; - -NSString *const kGTMOAuth2UserSignedIn = @"kGTMOAuth2UserSignedIn"; - -NSString *const kGTMOAuth2AccessTokenRefreshed = @"kGTMOAuth2AccessTokenRefreshed"; -NSString *const kGTMOAuth2RefreshTokenChanged = @"kGTMOAuth2RefreshTokenChanged"; -NSString *const kGTMOAuth2AccessTokenRefreshFailed = @"kGTMOAuth2AccessTokenRefreshFailed"; - -NSString *const kGTMOAuth2WebViewStartedLoading = @"kGTMOAuth2WebViewStartedLoading"; -NSString *const kGTMOAuth2WebViewStoppedLoading = @"kGTMOAuth2WebViewStoppedLoading"; -NSString *const kGTMOAuth2WebViewKey = @"kGTMOAuth2WebViewKey"; -NSString *const kGTMOAuth2WebViewStopKindKey = @"kGTMOAuth2WebViewStopKindKey"; -NSString *const kGTMOAuth2WebViewFinished = @"finished"; -NSString *const kGTMOAuth2WebViewFailed = @"failed"; -NSString *const kGTMOAuth2WebViewCancelled = @"cancelled"; - -NSString *const kGTMOAuth2NetworkLost = @"kGTMOAuthNetworkLost"; -NSString *const kGTMOAuth2NetworkFound = @"kGTMOAuthNetworkFound"; - -// standard OAuth keys -static NSString *const kOAuth2AccessTokenKey = @"access_token"; -static NSString *const kOAuth2RefreshTokenKey = @"refresh_token"; -static NSString *const kOAuth2ScopeKey = @"scope"; -static NSString *const kOAuth2ErrorKey = @"error"; -static NSString *const kOAuth2TokenTypeKey = @"token_type"; -static NSString *const kOAuth2ExpiresInKey = @"expires_in"; -static NSString *const kOAuth2CodeKey = @"code"; -static NSString *const kOAuth2AssertionKey = @"assertion"; -static NSString *const kOAuth2RefreshScopeKey = @"refreshScope"; - -// additional persistent keys -static NSString *const kServiceProviderKey = @"serviceProvider"; -static NSString *const kUserIDKey = @"userID"; -static NSString *const kUserEmailKey = @"email"; -static NSString *const kUserEmailIsVerifiedKey = @"isVerified"; - -// fetcher keys -static NSString *const kTokenFetchDelegateKey = @"delegate"; -static NSString *const kTokenFetchSelectorKey = @"sel"; - -// If GTMNSJSONSerialization is available, it is used for formatting JSON -#if (TARGET_OS_MAC && !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED < 1070)) || \ - (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED < 50000)) -@interface GTMNSJSONSerialization : NSObject -+ (id)JSONObjectWithData:(NSData *)data options:(NSUInteger)opt error:(NSError **)error; -@end -#endif - -@interface GTMOAuth2ParserClass : NSObject -// just enough of SBJSON to be able to parse -- (id)objectWithString:(NSString*)repr error:(NSError**)error; -@end - -// wrapper class for requests needing authorization and their callbacks -@interface GTMOAuth2AuthorizationArgs : NSObject { - @private - NSMutableURLRequest *request_; - id delegate_; - SEL sel_; - id completionHandler_; - NSThread *thread_; - NSError *error_; -} - -@property (retain) NSMutableURLRequest *request; -@property (retain) id delegate; -@property (assign) SEL selector; -@property (copy) id completionHandler; -@property (retain) NSThread *thread; -@property (retain) NSError *error; - -+ (GTMOAuth2AuthorizationArgs *)argsWithRequest:(NSMutableURLRequest *)req - delegate:(id)delegate - selector:(SEL)sel - completionHandler:(id)completionHandler - thread:(NSThread *)thread; -@end - -@implementation GTMOAuth2AuthorizationArgs - -@synthesize request = request_, - delegate = delegate_, - selector = sel_, - completionHandler = completionHandler_, - thread = thread_, - error = error_; - -+ (GTMOAuth2AuthorizationArgs *)argsWithRequest:(NSMutableURLRequest *)req - delegate:(id)delegate - selector:(SEL)sel - completionHandler:(id)completionHandler - thread:(NSThread *)thread { - GTMOAuth2AuthorizationArgs *obj; - obj = [[[GTMOAuth2AuthorizationArgs alloc] init] autorelease]; - obj.request = req; - obj.delegate = delegate; - obj.selector = sel; - obj.completionHandler = completionHandler; - obj.thread = thread; - return obj; -} - -- (void)dealloc { - [request_ release]; - [delegate_ release]; - [completionHandler_ release]; - [thread_ release]; - [error_ release]; - - [super dealloc]; -} -@end - - -@interface GTMOAuth2Authentication () - -@property (retain) NSMutableArray *authorizationQueue; -@property (readonly) NSString *authorizationToken; - -- (void)setKeysForResponseJSONData:(NSData *)data; - -- (BOOL)authorizeRequestArgs:(GTMOAuth2AuthorizationArgs *)args; - -- (BOOL)authorizeRequestImmediateArgs:(GTMOAuth2AuthorizationArgs *)args; - -- (BOOL)shouldRefreshAccessToken; - -- (void)updateExpirationDate; - -- (void)tokenFetcher:(GTMOAuth2Fetcher *)fetcher - finishedWithData:(NSData *)data - error:(NSError *)error; - -- (void)auth:(GTMOAuth2Authentication *)auth -finishedRefreshWithFetcher:(GTMOAuth2Fetcher *)fetcher - error:(NSError *)error; - -- (void)invokeCallbackArgs:(GTMOAuth2AuthorizationArgs *)args; - -+ (void)invokeDelegate:(id)delegate - selector:(SEL)sel - object:(id)obj1 - object:(id)obj2 - object:(id)obj3; - -+ (NSString *)unencodedOAuthParameterForString:(NSString *)str; -+ (NSString *)encodedQueryParametersForDictionary:(NSDictionary *)dict; - -+ (NSDictionary *)dictionaryWithResponseData:(NSData *)data; - -@end - -@implementation GTMOAuth2Authentication - -@synthesize clientID = clientID_, - clientSecret = clientSecret_, - redirectURI = redirectURI_, - parameters = parameters_, - authorizationTokenKey = authorizationTokenKey_, - tokenURL = tokenURL_, - expirationDate = expirationDate_, - additionalTokenRequestParameters = additionalTokenRequestParameters_, - additionalGrantTypeRequestParameters = additionalGrantTypeRequestParameters_, - refreshFetcher = refreshFetcher_, - fetcherService = fetcherService_, - parserClass = parserClass_, - shouldAuthorizeAllRequests = shouldAuthorizeAllRequests_, - userData = userData_, - properties = properties_, - authorizationQueue = authorizationQueue_; - -// Response parameters -@dynamic accessToken, - refreshToken, - code, - assertion, - refreshScope, - errorString, - tokenType, - scope, - expiresIn, - serviceProvider, - userEmail, - userEmailIsVerified; - -@dynamic canAuthorize; - -+ (id)authenticationWithServiceProvider:(NSString *)serviceProvider - tokenURL:(NSURL *)tokenURL - redirectURI:(NSString *)redirectURI - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret { - GTMOAuth2Authentication *obj = [[[self alloc] init] autorelease]; - obj.serviceProvider = serviceProvider; - obj.tokenURL = tokenURL; - obj.redirectURI = redirectURI; - obj.clientID = clientID; - obj.clientSecret = clientSecret; - return obj; -} - -- (id)init { - self = [super init]; - if (self) { - authorizationQueue_ = [[NSMutableArray alloc] init]; - parameters_ = [[NSMutableDictionary alloc] init]; - } - return self; -} - -- (NSString *)description { - NSArray *props = [NSArray arrayWithObjects:@"accessToken", @"refreshToken", - @"code", @"assertion", @"expirationDate", @"errorString", - nil]; - NSMutableString *valuesStr = [NSMutableString string]; - NSString *separator = @""; - for (NSString *prop in props) { - id result = [self valueForKey:prop]; - if (result) { - [valuesStr appendFormat:@"%@%@=\"%@\"", separator, prop, result]; - separator = @", "; - } - } - - return [NSString stringWithFormat:@"%@ %p: {%@}", - [self class], self, valuesStr]; -} - -- (void)dealloc { - [clientID_ release]; - [clientSecret_ release]; - [redirectURI_ release]; - [parameters_ release]; - [authorizationTokenKey_ release]; - [tokenURL_ release]; - [expirationDate_ release]; - [additionalTokenRequestParameters_ release]; - [additionalGrantTypeRequestParameters_ release]; - [refreshFetcher_ release]; - [authorizationQueue_ release]; - [userData_ release]; - [properties_ release]; - - [super dealloc]; -} - -#pragma mark - - -- (void)setKeysForResponseDictionary:(NSDictionary *)dict { - if (dict == nil) return; - - // If a new code or access token is being set, remove the old expiration - NSString *newCode = [dict objectForKey:kOAuth2CodeKey]; - NSString *newAccessToken = [dict objectForKey:kOAuth2AccessTokenKey]; - if (newCode || newAccessToken) { - self.expiresIn = nil; - } - - BOOL didRefreshTokenChange = NO; - NSString *refreshToken = [dict objectForKey:kOAuth2RefreshTokenKey]; - if (refreshToken) { - NSString *priorRefreshToken = self.refreshToken; - - if (priorRefreshToken != refreshToken - && (priorRefreshToken == nil - || ![priorRefreshToken isEqual:refreshToken])) { - didRefreshTokenChange = YES; - } - } - - [self.parameters addEntriesFromDictionary:dict]; - [self updateExpirationDate]; - - if (didRefreshTokenChange) { - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:kGTMOAuth2RefreshTokenChanged - object:self - userInfo:nil]; - } - // NSLog(@"keys set ----------------------------\n%@", dict); -} - -- (void)setKeysForResponseString:(NSString *)str { - NSDictionary *dict = [[self class] dictionaryWithResponseString:str]; - [self setKeysForResponseDictionary:dict]; -} - -- (void)setKeysForResponseJSONData:(NSData *)data { - NSDictionary *dict = [[self class] dictionaryWithJSONData:data]; - [self setKeysForResponseDictionary:dict]; -} - -+ (NSDictionary *)dictionaryWithJSONData:(NSData *)data { - NSMutableDictionary *obj = nil; - NSError *error = nil; - - Class serializer = NSClassFromString(@"NSJSONSerialization"); - if (serializer) { - const NSUInteger kOpts = (1UL << 0); // NSJSONReadingMutableContainers - obj = [serializer JSONObjectWithData:data - options:kOpts - error:&error]; -#if DEBUG - if (error) { - NSString *str = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - NSLog(@"NSJSONSerialization error %@ parsing %@", - error, str); - } -#endif - return obj; - } else { - // try SBJsonParser or SBJSON - Class jsonParseClass = NSClassFromString(@"SBJsonParser"); - if (!jsonParseClass) { - jsonParseClass = NSClassFromString(@"SBJSON"); - } - if (jsonParseClass) { - GTMOAuth2ParserClass *parser = [[[jsonParseClass alloc] init] autorelease]; - NSString *jsonStr = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - if (jsonStr) { - obj = [parser objectWithString:jsonStr error:&error]; -#if DEBUG - if (error) { - NSLog(@"%@ error %@ parsing %@", NSStringFromClass(jsonParseClass), - error, jsonStr); - } -#endif - return obj; - } - } else { -#if DEBUG - NSAssert(0, @"GTMOAuth2Authentication: No parser available"); -#endif - } - } - return nil; -} - -#pragma mark Authorizing Requests - -// General entry point for authorizing requests - -#if NS_BLOCKS_AVAILABLE -// Authorizing with a completion block -- (void)authorizeRequest:(NSMutableURLRequest *)request - completionHandler:(void (^)(NSError *error))handler { - - GTMOAuth2AuthorizationArgs *args; - args = [GTMOAuth2AuthorizationArgs argsWithRequest:request - delegate:nil - selector:NULL - completionHandler:handler - thread:[NSThread currentThread]]; - [self authorizeRequestArgs:args]; -} -#endif - -// Authorizing with a callback selector -// -// Selector has the signature -// - (void)authentication:(GTMOAuth2Authentication *)auth -// request:(NSMutableURLRequest *)request -// finishedWithError:(NSError *)error; -- (void)authorizeRequest:(NSMutableURLRequest *)request - delegate:(id)delegate - didFinishSelector:(SEL)sel { - GTMOAuth2AssertValidSelector(delegate, sel, - @encode(GTMOAuth2Authentication *), - @encode(NSMutableURLRequest *), - @encode(NSError *), 0); - - GTMOAuth2AuthorizationArgs *args; - args = [GTMOAuth2AuthorizationArgs argsWithRequest:request - delegate:delegate - selector:sel - completionHandler:nil - thread:[NSThread currentThread]]; - [self authorizeRequestArgs:args]; -} - -// Internal routine common to delegate and block invocations -- (BOOL)authorizeRequestArgs:(GTMOAuth2AuthorizationArgs *)args { - BOOL didAttempt = NO; - - @synchronized(authorizationQueue_) { - - BOOL shouldRefresh = [self shouldRefreshAccessToken]; - - if (shouldRefresh) { - NSLog(@"Should refresh. Thread: %@\n", [NSThread currentThread].description); - // attempt to refresh now; once we have a fresh access token, we will - // authorize the request and call back to the user - didAttempt = YES; - - if (self.refreshFetcher == nil) { - // there's not already a refresh pending - SEL finishedSel = @selector(auth:finishedRefreshWithFetcher:error:); - self.refreshFetcher = [self beginTokenFetchWithDelegate:self - didFinishSelector:finishedSel]; - if (self.refreshFetcher) { - [authorizationQueue_ addObject:args]; - } - } else { - // there's already a refresh pending - [authorizationQueue_ addObject:args]; - } - } - - if (!shouldRefresh || self.refreshFetcher == nil) { - // we're not fetching a new access token, so we can authorize the request - // now - didAttempt = [self authorizeRequestImmediateArgs:args]; - } - } - return didAttempt; -} - -- (void)auth:(GTMOAuth2Authentication *)auth -finishedRefreshWithFetcher:(GTMOAuth2Fetcher *)fetcher - error:(NSError *)error { - @synchronized(authorizationQueue_) { - NSLog(@"auth:FinishedRefreshWithFetcher:error done. Thread: %@\n", [NSThread currentThread].description); - - // If there's an error, we want to try using the old access token anyway, - // in case it's a backend problem preventing refresh, in which case - // access tokens past their expiration date may still work - - self.refreshFetcher = nil; - - // Swap in a new auth queue in case the callbacks try to immediately auth - // another request - NSArray *pendingAuthQueue = [NSArray arrayWithArray:authorizationQueue_]; - [authorizationQueue_ removeAllObjects]; - - BOOL hasAccessToken = ([self.accessToken length] > 0); - - NSString *noteName; - NSDictionary *userInfo = nil; - if (hasAccessToken && error == nil) { - // Successful refresh. - noteName = kGTMOAuth2AccessTokenRefreshed; - userInfo = nil; - } else { - // Google's OAuth 2 implementation returns a 400 with JSON body - // containing error key "invalid_grant" to indicate the refresh token - // is invalid or has been revoked by the user. We'll promote the - // JSON error key's value for easy inspection by the observer. - noteName = kGTMOAuth2AccessTokenRefreshFailed; - NSString *jsonErr = nil; - if ([error code] == kGTMOAuth2StatusBadRequest) { - NSDictionary *json = [[error userInfo] objectForKey:kGTMOAuth2ErrorJSONKey]; - jsonErr = [json objectForKey:kGTMOAuth2ErrorMessageKey]; - } - // error and jsonErr may be nil - userInfo = [NSMutableDictionary dictionary]; - [userInfo setValue:error forKey:kGTMOAuth2ErrorObjectKey]; - [userInfo setValue:jsonErr forKey:kGTMOAuth2ErrorMessageKey]; - } - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:noteName - object:self - userInfo:userInfo]; - - for (GTMOAuth2AuthorizationArgs *args in pendingAuthQueue) { - if (!hasAccessToken && args.error == nil) { - args.error = error; - } - - [self authorizeRequestImmediateArgs:args]; - } - } -} - -- (BOOL)isAuthorizingRequest:(NSURLRequest *)request { - BOOL wasFound = NO; - @synchronized(authorizationQueue_) { - for (GTMOAuth2AuthorizationArgs *args in authorizationQueue_) { - if ([args request] == request) { - wasFound = YES; - break; - } - } - } - return wasFound; -} - -- (BOOL)isAuthorizedRequest:(NSURLRequest *)request { - NSString *authStr = [request valueForHTTPHeaderField:@"Authorization"]; - return ([authStr length] > 0); -} - -- (void)stopAuthorization { - @synchronized(authorizationQueue_) { - [authorizationQueue_ removeAllObjects]; - - [self.refreshFetcher stopFetching]; - self.refreshFetcher = nil; - } -} - -- (void)stopAuthorizationForRequest:(NSURLRequest *)request { - @synchronized(authorizationQueue_) { - NSUInteger argIndex = 0; - BOOL found = NO; - for (GTMOAuth2AuthorizationArgs *args in authorizationQueue_) { - if ([args request] == request) { - found = YES; - break; - } - argIndex++; - } - - if (found) { - [authorizationQueue_ removeObjectAtIndex:argIndex]; - - // If the queue is now empty, go ahead and stop the fetcher. - if ([authorizationQueue_ count] == 0) { - [self stopAuthorization]; - } - } - } -} - -- (BOOL)authorizeRequestImmediateArgs:(GTMOAuth2AuthorizationArgs *)args { - // This authorization entry point never attempts to refresh the access token, - // but does call the completion routine - - NSMutableURLRequest *request = args.request; - - NSURL *requestURL = [request URL]; - NSString *scheme = [requestURL scheme]; - BOOL isAuthorizableRequest = self.shouldAuthorizeAllRequests - || [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame - || [requestURL isFileURL]; - if (!isAuthorizableRequest) { - // Request is not https, so may be insecure - // - // The NSError will be created below -#if DEBUG - NSLog(@"Cannot authorize request with scheme %@ (%@)", scheme, request); -#endif - } - - // Get the access token. - NSString *accessToken = self.authorizationToken; - if (isAuthorizableRequest && [accessToken length] > 0) { - if (request) { - // we have a likely valid access token - NSString *value = [NSString stringWithFormat:@"%s %@", - GTM_OAUTH2_BEARER, accessToken]; - [request setValue:value forHTTPHeaderField:@"Authorization"]; - } - - // We've authorized the request, even if the previous refresh - // failed with an error - args.error = nil; - } else if (args.error == nil) { - NSDictionary *userInfo = nil; - if (request) { - userInfo = [NSDictionary dictionaryWithObject:request - forKey:kGTMOAuth2ErrorRequestKey]; - } - NSInteger code = (isAuthorizableRequest ? - kGTMOAuth2ErrorAuthorizationFailed : - kGTMOAuth2ErrorUnauthorizableRequest); - args.error = [NSError errorWithDomain:kGTMOAuth2ErrorDomain - code:code - userInfo:userInfo]; - } - - // Invoke any callbacks on the proper thread - if (args.delegate || args.completionHandler) { - NSThread *targetThread = args.thread; - NSThread *currentThread = [NSThread currentThread]; - BOOL isSameThread = [targetThread isEqual:currentThread]; - - if (isSameThread) { - [self invokeCallbackArgs:args]; - } else { - SEL sel = @selector(invokeCallbackArgs:); - NSOperationQueue *delegateQueue = self.fetcherService.delegateQueue; - if (delegateQueue) { - NSInvocationOperation *op; - op = [[[NSInvocationOperation alloc] initWithTarget:self - selector:sel - object:args] autorelease]; - [delegateQueue addOperation:op]; - } else { - NSLog(@"sel: %@\n thread: %@\n error: %@\n request:%@\n args.selector:%@\n args.delegate:%d\n ", NSStringFromSelector(sel), targetThread, args.error, args.request.description, - NSStringFromSelector(args.selector), (args.delegate == nil)); - [self performSelector:sel - onThread:targetThread - withObject:args - waitUntilDone:NO]; - } - } - } - - BOOL didAuth = (args.error == nil); - return didAuth; -} - -- (void)invokeCallbackArgs:(GTMOAuth2AuthorizationArgs *)args { - // Invoke the callbacks - NSError *error = args.error; - - id delegate = args.delegate; - SEL sel = args.selector; - if (delegate && sel) { - NSMutableURLRequest *request = args.request; - - NSMethodSignature *sig = [delegate methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:delegate]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&request atIndex:3]; - [invocation setArgument:&error atIndex:4]; - [invocation invoke]; - } - -#if NS_BLOCKS_AVAILABLE - id handler = args.completionHandler; - if (handler) { - void (^authCompletionBlock)(NSError *) = handler; - authCompletionBlock(error); - } -#endif -} - -- (BOOL)authorizeRequest:(NSMutableURLRequest *)request { - // Entry point for synchronous authorization mechanisms - GTMOAuth2AuthorizationArgs *args; - args = [GTMOAuth2AuthorizationArgs argsWithRequest:request - delegate:nil - selector:NULL - completionHandler:nil - thread:[NSThread currentThread]]; - return [self authorizeRequestImmediateArgs:args]; -} - -- (BOOL)canAuthorize { - NSString *token = self.refreshToken; - if (token == nil) { - // For services which do not support refresh tokens, we'll just check - // the access token. - token = self.authorizationToken; - } - BOOL canAuth = [token length] > 0; - return canAuth; -} - -- (BOOL)shouldRefreshAccessToken { - // We should refresh the access token when it's missing or nearly expired - // and we have a refresh token - BOOL shouldRefresh = NO; - NSString *accessToken = self.accessToken; - NSString *refreshToken = self.refreshToken; - NSString *assertion = self.assertion; - NSString *code = self.code; - - BOOL hasRefreshToken = ([refreshToken length] > 0); - BOOL hasAccessToken = ([accessToken length] > 0); - BOOL hasAssertion = ([assertion length] > 0); - BOOL hasCode = ([code length] > 0); - - // Determine if we need to refresh the access token - if (hasRefreshToken || hasAssertion || hasCode) { - if (!hasAccessToken) { - shouldRefresh = YES; - } else { - // We'll consider the token expired if it expires 60 seconds from now - // or earlier - NSDate *expirationDate = self.expirationDate; - NSTimeInterval timeToExpire = [expirationDate timeIntervalSinceNow]; - if (expirationDate == nil || timeToExpire < 60.0) { - // access token has expired, or will in a few seconds - shouldRefresh = YES; - } - } - } - return shouldRefresh; -} - -- (void)waitForCompletionWithTimeout:(NSTimeInterval)timeoutInSeconds { - // If there is a refresh fetcher pending, wait for it. - // - // This is only intended for unit test or for use in command-line tools. - GTMOAuth2Fetcher *fetcher = self.refreshFetcher; - [fetcher waitForCompletionWithTimeout:timeoutInSeconds]; -} - -#pragma mark Token Fetch - -- (NSString *)userAgent { - NSBundle *bundle = [NSBundle mainBundle]; - NSString *appID = [bundle bundleIdentifier]; - - NSString *version = [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - if (version == nil) { - version = [bundle objectForInfoDictionaryKey:@"CFBundleVersion"]; - } - - if (appID && version) { - appID = [appID stringByAppendingFormat:@"/%@", version]; - } - - NSString *userAgent = @"gtm-oauth2"; - if (appID) { - userAgent = [userAgent stringByAppendingFormat:@" %@", appID]; - } - return userAgent; -} - -- (GTMOAuth2Fetcher *)beginTokenFetchWithDelegate:(id)delegate - didFinishSelector:(SEL)finishedSel { - - NSMutableDictionary *paramsDict = [NSMutableDictionary dictionary]; - - NSString *fetchType; - - NSString *refreshToken = self.refreshToken; - NSString *code = self.code; - NSString *assertion = self.assertion; - NSString *grantType = nil; - - if (refreshToken) { - // We have a refresh token - grantType = @"refresh_token"; - [paramsDict setObject:refreshToken forKey:@"refresh_token"]; - - NSString *refreshScope = self.refreshScope; - if ([refreshScope length] > 0) { - [paramsDict setObject:refreshScope forKey:@"scope"]; - } - - fetchType = kGTMOAuth2FetchTypeRefresh; - } else if (code) { - // We have a code string - grantType = @"authorization_code"; - [paramsDict setObject:code forKey:@"code"]; - - NSString *redirectURI = self.redirectURI; - if ([redirectURI length] > 0) { - [paramsDict setObject:redirectURI forKey:@"redirect_uri"]; - } - - NSString *scope = self.scope; - if ([scope length] > 0) { - [paramsDict setObject:scope forKey:@"scope"]; - } - - fetchType = kGTMOAuth2FetchTypeToken; - } else if (assertion) { - // We have an assertion string - grantType = @"http://oauth.net/grant_type/jwt/1.0/bearer"; - [paramsDict setObject:assertion forKey:@"assertion"]; - fetchType = kGTMOAuth2FetchTypeAssertion; - } else { -#if DEBUG - NSAssert(0, @"unexpected lack of code or refresh token for fetching"); -#endif - return nil; - } - [paramsDict setObject:grantType forKey:@"grant_type"]; - - NSString *clientID = self.clientID; - if ([clientID length] > 0) { - [paramsDict setObject:clientID forKey:@"client_id"]; - } - - NSString *clientSecret = self.clientSecret; - if ([clientSecret length] > 0) { - [paramsDict setObject:clientSecret forKey:@"client_secret"]; - } - - NSDictionary *additionalParams = self.additionalTokenRequestParameters; - if (additionalParams) { - [paramsDict addEntriesFromDictionary:additionalParams]; - } - NSDictionary *grantTypeParams = - [self.additionalGrantTypeRequestParameters objectForKey:grantType]; - if (grantTypeParams) { - [paramsDict addEntriesFromDictionary:grantTypeParams]; - } - - NSString *paramStr = [[self class] encodedQueryParametersForDictionary:paramsDict]; - NSData *paramData = [paramStr dataUsingEncoding:NSUTF8StringEncoding]; - - NSURL *tokenURL = self.tokenURL; - - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:tokenURL]; - [request setValue:@"application/x-www-form-urlencoded" - forHTTPHeaderField:@"Content-Type"]; - - NSString *userAgent = [self userAgent]; - [request setValue:userAgent forHTTPHeaderField:@"User-Agent"]; - - GTMOAuth2Fetcher *fetcher; - id fetcherService = self.fetcherService; - if (fetcherService) { - fetcher = (GTMOAuth2Fetcher *)[fetcherService fetcherWithRequest:request]; - - // Don't use an authorizer for an auth token fetch - fetcher.authorizer = nil; - } else { - fetcher = [GTMOAuth2Fetcher fetcherWithRequest:request]; - } - -#if !STRIP_GTM_FETCH_LOGGING - // The user email address is known at token refresh time, not during the initial code exchange. - NSString *userEmail = [self userEmail]; - NSString *forStr = userEmail ? [NSString stringWithFormat:@"for \"%@\"", userEmail] : @""; - [fetcher setCommentWithFormat:@"GTMOAuth2 %@ fetch to %@ %@", fetchType, [tokenURL host], forStr]; -#endif - - fetcher.bodyData = paramData; - fetcher.retryEnabled = YES; - fetcher.maxRetryInterval = 15.0; - - // Fetcher properties will retain the delegate - [fetcher setProperty:delegate forKey:kTokenFetchDelegateKey]; - if (finishedSel) { - NSString *selStr = NSStringFromSelector(finishedSel); - [fetcher setProperty:selStr forKey:kTokenFetchSelectorKey]; - } - - [fetcher beginFetchWithDelegate:self - didFinishSelector:@selector(tokenFetcher:finishedWithData:error:)]; - - [self notifyFetchIsRunning:YES fetcher:fetcher type:fetchType]; - return fetcher; -} - -- (void)tokenFetcher:(GTMOAuth2Fetcher *)fetcher - finishedWithData:(NSData *)data - error:(NSError *)error { - [self notifyFetchIsRunning:NO fetcher:fetcher type:nil]; - - NSDictionary *responseHeaders = [fetcher responseHeaders]; - NSString *responseType = [responseHeaders valueForKey:@"Content-Type"]; - BOOL isResponseJSON = [responseType hasPrefix:@"application/json"]; - BOOL hasData = ([data length] > 0); - - if (error) { - // Failed. If the error body is JSON, parse it and add it to the error's - // userInfo dictionary. - if (hasData) { - if (isResponseJSON) { - NSDictionary *errorJson = [[self class] dictionaryWithJSONData:data]; - if ([errorJson count] > 0) { -#if DEBUG - NSLog(@"Error %@\nError data:\n%@", error, errorJson); -#endif - // Add the JSON error body to the userInfo of the error - NSMutableDictionary *userInfo; - userInfo = [NSMutableDictionary dictionaryWithObject:errorJson - forKey:kGTMOAuth2ErrorJSONKey]; - NSDictionary *prevUserInfo = [error userInfo]; - if (prevUserInfo) { - [userInfo addEntriesFromDictionary:prevUserInfo]; - } - error = [NSError errorWithDomain:[error domain] - code:[error code] - userInfo:userInfo]; - } - } - } - } else { - // Succeeded; we have the requested token. -#if DEBUG - NSAssert(hasData, @"data missing in token response"); -#endif - - if (hasData) { - if (isResponseJSON) { - [self setKeysForResponseJSONData:data]; - } else { - // Support for legacy token servers that return form-urlencoded data - NSString *dataStr = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - [self setKeysForResponseString:dataStr]; - } - -#if DEBUG - // Watch for token exchanges that return a non-bearer or unlabeled token - NSString *tokenType = [self tokenType]; - if (tokenType == nil - || [tokenType caseInsensitiveCompare:@"bearer"] != NSOrderedSame) { - NSLog(@"GTMOAuth2: Unexpected token type: %@", tokenType); - } -#endif - } - } - - id delegate = [fetcher propertyForKey:kTokenFetchDelegateKey]; - SEL sel = NULL; - NSString *selStr = [fetcher propertyForKey:kTokenFetchSelectorKey]; - if (selStr) sel = NSSelectorFromString(selStr); - - [[self class] invokeDelegate:delegate - selector:sel - object:self - object:fetcher - object:error]; - - // Prevent a circular reference from retaining the delegate - [fetcher setProperty:nil forKey:kTokenFetchDelegateKey]; -} - -#pragma mark Fetch Notifications - -- (void)notifyFetchIsRunning:(BOOL)isStarting - fetcher:(GTMOAuth2Fetcher *)fetcher - type:(NSString *)fetchType { - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - - NSString *name = (isStarting ? kGTMOAuth2FetchStarted : kGTMOAuth2FetchStopped); - NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: - fetcher, kGTMOAuth2FetcherKey, - fetchType, kGTMOAuth2FetchTypeKey, // fetchType may be nil - nil]; - [nc postNotificationName:name - object:self - userInfo:dict]; -} - -#pragma mark Persistent Response Strings - -- (void)setKeysForPersistenceResponseString:(NSString *)str { - // All persistence keys can be set directly as if returned by a server - [self setKeysForResponseString:str]; -} - -// This returns a "response string" that can be passed later to -// setKeysForResponseString: to reuse an old access token in a new auth object -- (NSString *)persistenceResponseString { - NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:4]; - - NSString *refreshToken = self.refreshToken; - NSString *accessToken = nil; - if (refreshToken == nil) { - // We store the access token only for services that do not support refresh - // tokens; otherwise, we assume the access token is too perishable to - // be worth storing - accessToken = self.accessToken; - } - - // Any nil values will not set a dictionary entry - [dict setValue:refreshToken forKey:kOAuth2RefreshTokenKey]; - [dict setValue:accessToken forKey:kOAuth2AccessTokenKey]; - [dict setValue:self.serviceProvider forKey:kServiceProviderKey]; - [dict setValue:self.userID forKey:kUserIDKey]; - [dict setValue:self.userEmail forKey:kUserEmailKey]; - [dict setValue:self.userEmailIsVerified forKey:kUserEmailIsVerifiedKey]; - [dict setValue:self.scope forKey:kOAuth2ScopeKey]; - - NSString *result = [[self class] encodedQueryParametersForDictionary:dict]; - return result; -} - -- (BOOL)primeForRefresh { - if (self.refreshToken == nil) { - // Cannot refresh without a refresh token - return NO; - } - self.accessToken = nil; - self.expiresIn = nil; - self.expirationDate = nil; - self.errorString = nil; - return YES; -} - -- (void)reset { - // Reset all per-authorization values - self.code = nil; - self.accessToken = nil; - self.refreshToken = nil; - self.assertion = nil; - self.expiresIn = nil; - self.errorString = nil; - self.expirationDate = nil; - self.userEmail = nil; - self.userEmailIsVerified = nil; - self.authorizationTokenKey = nil; -} - -#pragma mark Accessors for Response Parameters - -- (NSString *)authorizationToken { - // The token used for authorization is typically the access token unless - // the user has specified that an alternative parameter be used. - NSString *authorizationToken; - NSString *authTokenKey = self.authorizationTokenKey; - if (authTokenKey != nil) { - authorizationToken = [self.parameters objectForKey:authTokenKey]; - } else { - authorizationToken = self.accessToken; - } - return authorizationToken; -} - -- (NSString *)accessToken { - return [self.parameters objectForKey:kOAuth2AccessTokenKey]; -} - -- (void)setAccessToken:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2AccessTokenKey]; -} - -- (NSString *)refreshToken { - return [self.parameters objectForKey:kOAuth2RefreshTokenKey]; -} - -- (void)setRefreshToken:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2RefreshTokenKey]; -} - -- (NSString *)code { - return [self.parameters objectForKey:kOAuth2CodeKey]; -} - -- (void)setCode:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2CodeKey]; -} - -- (NSString *)assertion { - return [self.parameters objectForKey:kOAuth2AssertionKey]; -} - -- (void)setAssertion:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2AssertionKey]; -} - -- (NSString *)refreshScope { - return [self.parameters objectForKey:kOAuth2RefreshScopeKey]; -} - -- (void)setRefreshScope:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2RefreshScopeKey]; -} - -- (NSString *)errorString { - return [self.parameters objectForKey:kOAuth2ErrorKey]; -} - -- (void)setErrorString:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2ErrorKey]; -} - -- (NSString *)tokenType { - return [self.parameters objectForKey:kOAuth2TokenTypeKey]; -} - -- (void)setTokenType:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2TokenTypeKey]; -} - -- (NSString *)scope { - return [self.parameters objectForKey:kOAuth2ScopeKey]; -} - -- (void)setScope:(NSString *)str { - [self.parameters setValue:str forKey:kOAuth2ScopeKey]; -} - -- (NSNumber *)expiresIn { - id value = [self.parameters objectForKey:kOAuth2ExpiresInKey]; - if ([value isKindOfClass:[NSString class]]) { - value = [NSNumber numberWithInteger:[value integerValue]]; - } - return value; -} - -- (void)setExpiresIn:(NSNumber *)num { - [self.parameters setValue:num forKey:kOAuth2ExpiresInKey]; - [self updateExpirationDate]; -} - -- (void)updateExpirationDate { - // Update our absolute expiration time to something close to when - // the server expects the expiration - NSDate *date = nil; - NSNumber *expiresIn = self.expiresIn; - if (expiresIn) { - unsigned long deltaSeconds = [expiresIn unsignedLongValue]; - if (deltaSeconds > 0) { - date = [NSDate dateWithTimeIntervalSinceNow:deltaSeconds]; - } - } - self.expirationDate = date; -} - -// -// Keys custom to this class, not part of OAuth 2 -// - -- (NSString *)serviceProvider { - return [self.parameters objectForKey:kServiceProviderKey]; -} - -- (void)setServiceProvider:(NSString *)str { - [self.parameters setValue:str forKey:kServiceProviderKey]; -} - -- (NSString *)userID { - return [self.parameters objectForKey:kUserIDKey]; -} - -- (void)setUserID:(NSString *)str { - [self.parameters setValue:str forKey:kUserIDKey]; -} - -- (NSString *)userEmail { - return [self.parameters objectForKey:kUserEmailKey]; -} - -- (void)setUserEmail:(NSString *)str { - [self.parameters setValue:str forKey:kUserEmailKey]; -} - -- (NSString *)userEmailIsVerified { - return [self.parameters objectForKey:kUserEmailIsVerifiedKey]; -} - -- (void)setUserEmailIsVerified:(NSString *)str { - [self.parameters setValue:str forKey:kUserEmailIsVerifiedKey]; -} - -#pragma mark User Properties - -- (void)setProperty:(id)obj forKey:(NSString *)key { - if (obj == nil) { - // User passed in nil, so delete the property - [properties_ removeObjectForKey:key]; - } else { - // Be sure the property dictionary exists - if (properties_ == nil) { - [self setProperties:[NSMutableDictionary dictionary]]; - } - [properties_ setObject:obj forKey:key]; - } -} - -- (id)propertyForKey:(NSString *)key { - id obj = [properties_ objectForKey:key]; - - // Be sure the returned pointer has the life of the autorelease pool, - // in case self is released immediately - return [[obj retain] autorelease]; -} - -#pragma mark Utility Routines - -+ (NSString *)encodedOAuthValueForString:(NSString *)str { - CFStringRef originalString = (CFStringRef) str; - CFStringRef leaveUnescaped = NULL; - CFStringRef forceEscaped = CFSTR("!*'();:@&=+$,/?%#[]"); - - CFStringRef escapedStr = NULL; - if (str) { - escapedStr = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, - originalString, - leaveUnescaped, - forceEscaped, - kCFStringEncodingUTF8); - [(id)CFMakeCollectable(escapedStr) autorelease]; - } - - return (NSString *)escapedStr; -} - -+ (NSString *)encodedQueryParametersForDictionary:(NSDictionary *)dict { - // Make a string like "cat=fluffy@dog=spot" - NSMutableString *result = [NSMutableString string]; - NSArray *sortedKeys = [[dict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; - NSString *joiner = @""; - for (NSString *key in sortedKeys) { - NSString *value = [dict objectForKey:key]; - NSString *encodedValue = [self encodedOAuthValueForString:value]; - NSString *encodedKey = [self encodedOAuthValueForString:key]; - [result appendFormat:@"%@%@=%@", joiner, encodedKey, encodedValue]; - joiner = @"&"; - } - return result; -} - -+ (void)invokeDelegate:(id)delegate - selector:(SEL)sel - object:(id)obj1 - object:(id)obj2 - object:(id)obj3 { - if (delegate && sel) { - NSMethodSignature *sig = [delegate methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:delegate]; - [invocation setArgument:&obj1 atIndex:2]; - [invocation setArgument:&obj2 atIndex:3]; - [invocation setArgument:&obj3 atIndex:4]; - [invocation invoke]; - } -} - -+ (NSString *)unencodedOAuthParameterForString:(NSString *)str { - NSString *plainStr = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - return plainStr; -} - -+ (NSDictionary *)dictionaryWithResponseString:(NSString *)responseStr { - // Build a dictionary from a response string of the form - // "cat=fluffy&dog=spot". Missing or empty values are considered - // empty strings; keys and values are percent-decoded. - if (responseStr == nil) return nil; - - NSArray *items = [responseStr componentsSeparatedByString:@"&"]; - - NSMutableDictionary *responseDict = [NSMutableDictionary dictionaryWithCapacity:[items count]]; - - for (NSString *item in items) { - NSString *key = nil; - NSString *value = @""; - - NSRange equalsRange = [item rangeOfString:@"="]; - if (equalsRange.location != NSNotFound) { - // The parameter has at least one '=' - key = [item substringToIndex:equalsRange.location]; - - // There are characters after the '=' - value = [item substringFromIndex:(equalsRange.location + 1)]; - } else { - // The parameter has no '=' - key = item; - } - - NSString *plainKey = [[self class] unencodedOAuthParameterForString:key]; - NSString *plainValue = [[self class] unencodedOAuthParameterForString:value]; - - [responseDict setObject:plainValue forKey:plainKey]; - } - - return responseDict; -} - -+ (NSDictionary *)dictionaryWithResponseData:(NSData *)data { - NSString *responseStr = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - NSDictionary *dict = [self dictionaryWithResponseString:responseStr]; - return dict; -} - -+ (NSString *)scopeWithStrings:(NSString *)str, ... { - // concatenate the strings, joined by a single space - NSString *result = @""; - NSString *joiner = @""; - if (str) { - va_list argList; - va_start(argList, str); - while (str) { - result = [result stringByAppendingFormat:@"%@%@", joiner, str]; - joiner = @" "; - str = va_arg(argList, id); - } - va_end(argList); - } - return result; -} - -@end - -#endif // GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.h b/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.h deleted file mode 100644 index f9accbfd2..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.h +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// This sign-in object opens and closes the web view window as needed for -// users to sign in. For signing in to Google, it also obtains -// the authenticated user's email address. -// -// Typically, this will be managed for the application by -// GTMOAuth2ViewControllerTouch or GTMOAuth2WindowController, so this -// class's interface is interesting only if -// you are creating your own window controller for sign-in. -// -// -// Delegate methods implemented by the window controller -// -// The window controller implements two methods for use by the sign-in object, -// the webRequestSelector and the finishedSelector: -// -// webRequestSelector has a signature matching -// - (void)signIn:(GTMOAuth2SignIn *)signIn displayRequest:(NSURLRequest *)request -// -// The web request selector will be invoked with a request to be displayed, or -// nil to close the window when the final callback request has been encountered. -// -// -// finishedSelector has a signature matching -// - (void)signin:(GTMOAuth2SignIn *)signin finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error -// -// The finished selector will be invoked when sign-in has completed, except -// when explicitly canceled by calling cancelSigningIn -// - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -#import -#import - -// GTMHTTPFetcher brings in GTLDefines/GDataDefines -#if GTM_USE_SESSION_FETCHER -#import "GTMSessionFetcher.h" -#else -#import "GTMHTTPFetcher.h" -#endif - -#import "GTMOAuth2Authentication.h" - -@interface GTMOAuth2SignIn : NSObject { - @private - GTMOAuth2Authentication *auth_; - - // the endpoint for displaying the sign-in page - NSURL *authorizationURL_; - NSDictionary *additionalAuthorizationParameters_; - - id delegate_; - SEL webRequestSelector_; - SEL finishedSelector_; - - BOOL hasHandledCallback_; - - GTMOAuth2Fetcher *pendingFetcher_; - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - BOOL shouldFetchGoogleUserEmail_; - BOOL shouldFetchGoogleUserProfile_; - NSDictionary *userProfile_; -#endif - - SCNetworkReachabilityRef reachabilityRef_; - NSTimer *networkLossTimer_; - NSTimeInterval networkLossTimeoutInterval_; - BOOL hasNotifiedNetworkLoss_; - - id userData_; -} - -@property (nonatomic, retain) GTMOAuth2Authentication *authentication; - -@property (nonatomic, retain) NSURL *authorizationURL; -@property (nonatomic, retain) NSDictionary *additionalAuthorizationParameters; - -// The delegate is released when signing in finishes or is cancelled -@property (nonatomic, retain) id delegate; -@property (nonatomic, assign) SEL webRequestSelector; -@property (nonatomic, assign) SEL finishedSelector; - -@property (nonatomic, retain) id userData; - -// By default, signing in to Google will fetch the user's email, but will not -// fetch the user's profile. -// -// The email is saved in the auth object. -// The profile is available immediately after sign-in. -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -@property (nonatomic, assign) BOOL shouldFetchGoogleUserEmail; -@property (nonatomic, assign) BOOL shouldFetchGoogleUserProfile; -@property (nonatomic, retain, readonly) NSDictionary *userProfile; -#endif - -// The default timeout for an unreachable network during display of the -// sign-in page is 30 seconds; set this to 0 to have no timeout -@property (nonatomic, assign) NSTimeInterval networkLossTimeoutInterval; - -// The delegate is retained until sign-in has completed or been canceled -// -// designated initializer -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - delegate:(id)delegate - webRequestSelector:(SEL)webRequestSelector - finishedSelector:(SEL)finishedSelector; - -// A default authentication object for signing in to Google services -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (GTMOAuth2Authentication *)standardGoogleAuthenticationForScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret; -#endif - -#pragma mark Methods used by the Window Controller - -// Start the sequence of fetches and sign-in window display for sign-in -- (BOOL)startSigningIn; - -// Stop any pending fetches, and close the window (but don't call the -// delegate's finishedSelector) -- (void)cancelSigningIn; - -// Window controllers must tell the sign-in object about any redirect -// requested by the web view, and any changes in the webview window title -// -// If these return YES then the event was handled by the -// sign-in object (typically by closing the window) and should be ignored by -// the window controller's web view - -- (BOOL)requestRedirectedToRequest:(NSURLRequest *)redirectedRequest; -- (BOOL)titleChanged:(NSString *)title; -- (BOOL)cookiesChanged:(NSHTTPCookieStorage *)cookieStorage; -- (BOOL)loadFailedWithError:(NSError *)error; - -// Window controllers must tell the sign-in object if the window was closed -// prematurely by the user (but not by the sign-in object); this calls the -// delegate's finishedSelector -- (void)windowWasClosed; - -// Start the sequences for signing in with an authorization code. The -// authentication must contain an authorization code, otherwise the process -// will fail. -- (void)authCodeObtained; - -#pragma mark - - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -// Revocation of an authorized token from Google -+ (void)revokeTokenForGoogleAuthentication:(GTMOAuth2Authentication *)auth; - -// Create a fetcher for obtaining the user's Google email address or profile, -// according to the current auth scopes. -// -// The auth object must have been created with appropriate scopes. -// -// The fetcher's response data can be parsed with NSJSONSerialization. -+ (GTMOAuth2Fetcher *)userInfoFetcherWithAuth:(GTMOAuth2Authentication *)auth; -#endif - -#pragma mark - - -// Standard authentication values -+ (NSString *)nativeClientRedirectURI; -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (NSURL *)googleAuthorizationURL; -+ (NSURL *)googleTokenURL; -+ (NSURL *)googleUserInfoURL; -#endif - -@end - -#endif // #if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.m b/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.m deleted file mode 100644 index 472b0b0d0..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/GTMOAuth2SignIn.m +++ /dev/null @@ -1,971 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -#import "GTMOAuth2SignIn.h" - -// we'll default to timing out if the network becomes unreachable for more -// than 30 seconds when the sign-in page is displayed -static const NSTimeInterval kDefaultNetworkLossTimeoutInterval = 30.0; - -// URI indicating an installed app is signing in. This is described at -// -// http://code.google.com/apis/accounts/docs/OAuth2.html#IA -// -NSString *const kOOBString = @"urn:ietf:wg:oauth:2.0:oob"; - - -@interface GTMOAuth2SignIn () -@property (assign) BOOL hasHandledCallback; -@property (retain) GTMOAuth2Fetcher *pendingFetcher; -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -@property (nonatomic, retain, readwrite) NSDictionary *userProfile; -#endif - -- (void)invokeFinalCallbackWithError:(NSError *)error; - -- (BOOL)startWebRequest; -+ (NSMutableURLRequest *)mutableURLRequestWithURL:(NSURL *)oldURL - paramString:(NSString *)paramStr; -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -- (void)addScopeForGoogleUserInfo; -- (void)fetchGoogleUserInfo; -#endif -- (void)finishSignInWithError:(NSError *)error; - -- (void)auth:(GTMOAuth2Authentication *)auth -finishedWithFetcher:(GTMOAuth2Fetcher *)fetcher - error:(NSError *)error; - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -- (void)infoFetcher:(GTMOAuth2Fetcher *)fetcher - finishedWithData:(NSData *)data - error:(NSError *)error; -+ (NSData *)decodeWebSafeBase64:(NSString *)base64Str; -- (void)updateGoogleUserInfoWithData:(NSData *)data; -#endif - -- (void)closeTheWindow; - -- (void)startReachabilityCheck; -- (void)stopReachabilityCheck; -- (void)reachabilityTarget:(SCNetworkReachabilityRef)reachabilityRef - changedFlags:(SCNetworkConnectionFlags)flags; -- (void)reachabilityTimerFired:(NSTimer *)timer; -@end - -@implementation GTMOAuth2SignIn - -@synthesize authentication = auth_; - -@synthesize authorizationURL = authorizationURL_; -@synthesize additionalAuthorizationParameters = additionalAuthorizationParameters_; - -@synthesize delegate = delegate_; -@synthesize webRequestSelector = webRequestSelector_; -@synthesize finishedSelector = finishedSelector_; -@synthesize hasHandledCallback = hasHandledCallback_; -@synthesize pendingFetcher = pendingFetcher_; -@synthesize userData = userData_; - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -@synthesize shouldFetchGoogleUserEmail = shouldFetchGoogleUserEmail_; -@synthesize shouldFetchGoogleUserProfile = shouldFetchGoogleUserProfile_; -@synthesize userProfile = userProfile_; -#endif - -@synthesize networkLossTimeoutInterval = networkLossTimeoutInterval_; - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (NSURL *)googleAuthorizationURL { - NSString *str = @"https://accounts.google.com/o/oauth2/auth"; - return [NSURL URLWithString:str]; -} - -+ (NSURL *)googleTokenURL { - NSString *str = @"https://accounts.google.com/o/oauth2/token"; - return [NSURL URLWithString:str]; -} - -+ (NSURL *)googleRevocationURL { - NSString *urlStr = @"https://accounts.google.com/o/oauth2/revoke"; - return [NSURL URLWithString:urlStr]; -} - -+ (NSURL *)googleUserInfoURL { -#if GTM_OAUTH2_USES_OPENIDCONNECT - NSString *urlStr = @" https://www.googleapis.com/plus/v1/people/me/openIdConnect"; -#else - NSString *urlStr = @"https://www.googleapis.com/oauth2/v3/userinfo"; -#endif - return [NSURL URLWithString:urlStr]; -} -#endif - -+ (NSString *)nativeClientRedirectURI { - return kOOBString; -} - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (GTMOAuth2Authentication *)standardGoogleAuthenticationForScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret { - NSString *redirectURI = [self nativeClientRedirectURI]; - NSURL *tokenURL = [self googleTokenURL]; - - GTMOAuth2Authentication *auth; - auth = [GTMOAuth2Authentication authenticationWithServiceProvider:kGTMOAuth2ServiceProviderGoogle - tokenURL:tokenURL - redirectURI:redirectURI - clientID:clientID - clientSecret:clientSecret]; - auth.scope = scope; - - return auth; -} - - -- (void)addScopeForGoogleUserInfo { -#if GTM_OAUTH2_USES_OPENIDCONNECT - NSString *const emailScope = @"email"; - NSString *const profileScope = @"profile"; - BOOL (^hasScope)(NSString *, NSString *) = ^(NSString *scopesString, NSString *scope) { - // For one-word scopes, we need an exact match rather than a substring match. - NSArray *words = [scopesString componentsSeparatedByString:@" "]; - return [words containsObject:scope]; - }; -#else - NSString *const emailScope = @"https://www.googleapis.com/auth/userinfo.email"; - NSString *const profileScope = @"https://www.googleapis.com/auth/userinfo.profile"; - BOOL (^hasScope)(NSString *, NSString *) = ^BOOL(NSString *scopesString, NSString *scope) { - return [scopesString rangeOfString:scope].location != NSNotFound; - }; -#endif // GTM_OAUTH2_USES_OPENIDCONNECT - - GTMOAuth2Authentication *auth = self.authentication; - if (self.shouldFetchGoogleUserEmail) { - NSString *scopeStrings = auth.scope; - if (!hasScope(scopeStrings, emailScope)) { - scopeStrings = [GTMOAuth2Authentication scopeWithStrings:scopeStrings, emailScope, nil]; - auth.scope = scopeStrings; - } - } - - if (self.shouldFetchGoogleUserProfile) { - NSString *scopeStrings = auth.scope; - if (!hasScope(scopeStrings, profileScope)) { - scopeStrings = [GTMOAuth2Authentication scopeWithStrings:scopeStrings, profileScope, nil]; - auth.scope = scopeStrings; - } - } -} -#endif - -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - delegate:(id)delegate - webRequestSelector:(SEL)webRequestSelector - finishedSelector:(SEL)finishedSelector { - // check the selectors on debug builds - GTMOAuth2AssertValidSelector(delegate, webRequestSelector, - @encode(GTMOAuth2SignIn *), @encode(NSURLRequest *), 0); - GTMOAuth2AssertValidSelector(delegate, finishedSelector, - @encode(GTMOAuth2SignIn *), @encode(GTMOAuth2Authentication *), - @encode(NSError *), 0); - - // designated initializer - self = [super init]; - if (self) { - auth_ = [auth retain]; - authorizationURL_ = [authorizationURL retain]; - delegate_ = [delegate retain]; - webRequestSelector_ = webRequestSelector; - finishedSelector_ = finishedSelector; - - // for Google authentication, we want to automatically fetch user info -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - NSString *host = [authorizationURL host]; - if ([host hasSuffix:@".google.com"]) { - shouldFetchGoogleUserEmail_ = YES; - } -#endif - - // default timeout for a lost internet connection while the server - // UI is displayed is 30 seconds - networkLossTimeoutInterval_ = kDefaultNetworkLossTimeoutInterval; - } - return self; -} - -- (void)dealloc { - [self stopReachabilityCheck]; - - [auth_ release]; - [authorizationURL_ release]; - [additionalAuthorizationParameters_ release]; - [delegate_ release]; - [pendingFetcher_ release]; -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - [userProfile_ release]; -#endif - [userData_ release]; - - [super dealloc]; -} - -#pragma mark Sign-in Sequence Methods - -// stop any pending fetches, and close the window (but don't call the -// delegate's finishedSelector) -- (void)cancelSigningIn { - [self.pendingFetcher stopFetching]; - self.pendingFetcher = nil; - - [self.authentication stopAuthorization]; - - [self closeTheWindow]; - - [delegate_ autorelease]; - delegate_ = nil; -} - -// -// This is the entry point to begin the sequence -// - display the authentication web page, and monitor redirects -// - exchange the code for an access token and a refresh token -// - for Google sign-in, fetch the user's email address -// - tell the delegate we're finished -// -- (BOOL)startSigningIn { - // For signing in to Google, append the scope for obtaining the authenticated - // user email and profile, as appropriate -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - [self addScopeForGoogleUserInfo]; -#endif - - // start the authorization - return [self startWebRequest]; -} - -- (NSMutableDictionary *)parametersForWebRequest { - GTMOAuth2Authentication *auth = self.authentication; - NSString *clientID = auth.clientID; - NSString *redirectURI = auth.redirectURI; - - BOOL hasClientID = ([clientID length] > 0); - BOOL hasRedirect = ([redirectURI length] > 0 - || redirectURI == [[self class] nativeClientRedirectURI]); - if (!hasClientID || !hasRedirect) { -#if DEBUG - NSAssert(hasClientID, @"GTMOAuth2SignIn: clientID needed"); - NSAssert(hasRedirect, @"GTMOAuth2SignIn: redirectURI needed"); -#endif - return nil; - } - - // invoke the UI controller's web request selector to display - // the authorization page - - // add params to the authorization URL - NSString *scope = auth.scope; - if ([scope length] == 0) scope = nil; - - NSMutableDictionary *paramsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: - @"code", @"response_type", - clientID, @"client_id", - scope, @"scope", // scope may be nil - nil]; - if (redirectURI) { - [paramsDict setObject:redirectURI forKey:@"redirect_uri"]; - } - return paramsDict; -} - -- (BOOL)startWebRequest { - NSMutableDictionary *paramsDict = [self parametersForWebRequest]; - - NSDictionary *additionalParams = self.additionalAuthorizationParameters; - if (additionalParams) { - [paramsDict addEntriesFromDictionary:additionalParams]; - } - - NSString *paramStr = [GTMOAuth2Authentication encodedQueryParametersForDictionary:paramsDict]; - - NSURL *authorizationURL = self.authorizationURL; - NSMutableURLRequest *request; - request = [[self class] mutableURLRequestWithURL:authorizationURL - paramString:paramStr]; - - [delegate_ performSelector:self.webRequestSelector - withObject:self - withObject:request]; - - // at this point, we're waiting on the server-driven html UI, so - // we want notification if we lose connectivity to the web server - [self startReachabilityCheck]; - return YES; -} - -// utility for making a request from an old URL with some additional parameters -+ (NSMutableURLRequest *)mutableURLRequestWithURL:(NSURL *)oldURL - paramString:(NSString *)paramStr { - if ([paramStr length] == 0) { - return [NSMutableURLRequest requestWithURL:oldURL]; - } - - NSString *query = [oldURL query]; - if ([query length] > 0) { - query = [query stringByAppendingFormat:@"&%@", paramStr]; - } else { - query = paramStr; - } - - NSString *portStr = @""; - NSString *oldPort = [[oldURL port] stringValue]; - if ([oldPort length] > 0) { - portStr = [@":" stringByAppendingString:oldPort]; - } - - NSString *qMark = [query length] > 0 ? @"?" : @""; - NSString *newURLStr = [NSString stringWithFormat:@"%@://%@%@%@%@%@", - [oldURL scheme], [oldURL host], portStr, - [oldURL path], qMark, query]; - NSURL *newURL = [NSURL URLWithString:newURLStr]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:newURL]; - return request; -} - -// entry point for the window controller to tell us that the window -// prematurely closed -- (void)windowWasClosed { - [self stopReachabilityCheck]; - - NSError *error = [NSError errorWithDomain:kGTMOAuth2ErrorDomain - code:kGTMOAuth2ErrorWindowClosed - userInfo:nil]; - [self invokeFinalCallbackWithError:error]; -} - -// internal method to tell the window controller to close the window -- (void)closeTheWindow { - [self stopReachabilityCheck]; - - // a nil request means the window should be closed - [delegate_ performSelector:self.webRequestSelector - withObject:self - withObject:nil]; -} - -// entry point for the window controller to tell us what web page has been -// requested -// -// When the request is for the callback URL, this method invokes -// authCodeObtained and returns YES -- (BOOL)requestRedirectedToRequest:(NSURLRequest *)redirectedRequest { - // for Google's installed app sign-in protocol, we'll look for the - // end-of-sign-in indicator in the titleChanged: method below - NSString *redirectURI = self.authentication.redirectURI; - if (redirectURI == nil) return NO; - - // when we're searching for the window title string, then we can ignore - // redirects - NSString *standardURI = [[self class] nativeClientRedirectURI]; - if (standardURI != nil && [redirectURI isEqual:standardURI]) return NO; - - // compare the redirectURI, which tells us when the web sign-in is done, - // to the actual redirection - NSURL *redirectURL = [NSURL URLWithString:redirectURI]; - NSURL *requestURL = [redirectedRequest URL]; - - // avoid comparing to nil host and path values (such as when redirected to - // "about:blank") - NSString *requestHost = [requestURL host]; - NSString *requestPath = [requestURL path]; - BOOL isCallback; - if (requestHost && requestPath) { - isCallback = [[redirectURL host] isEqual:[requestURL host]] - && [[redirectURL path] isEqual:[requestURL path]]; - } else if (requestURL) { - // handle "about:blank" - isCallback = [redirectURL isEqual:requestURL]; - } else { - isCallback = NO; - } - - if (!isCallback) { - // tell the caller that this request is nothing interesting - return NO; - } - - // we've reached the callback URL - - // try to get the access code - if (!self.hasHandledCallback) { - NSString *responseStr = [[redirectedRequest URL] query]; - [self.authentication setKeysForResponseString:responseStr]; - -#if DEBUG - NSAssert([self.authentication.code length] > 0 - || [self.authentication.errorString length] > 0, - @"response lacks auth code or error"); -#endif - - [self authCodeObtained]; - } - // tell the delegate that we did handle this request - return YES; -} - -// entry point for the window controller to tell us when a new page title has -// been loadded -// -// When the title indicates sign-in has completed, this method invokes -// authCodeObtained and returns YES -- (BOOL)titleChanged:(NSString *)title { - // return YES if the OAuth flow ending title was detected - - // right now we're just looking for a parameter list following the last space - // in the title string, but hopefully we'll eventually get something better - // from the server to search for - NSRange paramsRange = [title rangeOfString:@" " - options:NSBackwardsSearch]; - NSUInteger spaceIndex = paramsRange.location; - if (spaceIndex != NSNotFound) { - NSString *responseStr = [title substringFromIndex:(spaceIndex + 1)]; - - NSDictionary *dict = [GTMOAuth2Authentication dictionaryWithResponseString:responseStr]; - - NSString *code = [dict objectForKey:@"code"]; - NSString *error = [dict objectForKey:@"error"]; - if ([code length] > 0 || [error length] > 0) { - - if (!self.hasHandledCallback) { - [self.authentication setKeysForResponseDictionary:dict]; - - [self authCodeObtained]; - } - return YES; - } - } - return NO; -} - -- (BOOL)cookiesChanged:(NSHTTPCookieStorage *)cookieStorage { - // We're ignoring these. - return NO; -}; - -// entry point for the window controller to tell us when a load has failed -// in the webview -// -// if the initial authorization URL fails, bail out so the user doesn't -// see an empty webview -- (BOOL)loadFailedWithError:(NSError *)error { - NSURL *authorizationURL = self.authorizationURL; - NSURL *failedURL = [[error userInfo] valueForKey:@"NSErrorFailingURLKey"]; // NSURLErrorFailingURLErrorKey defined in 10.6 - - BOOL isAuthURL = [[failedURL host] isEqual:[authorizationURL host]] - && [[failedURL path] isEqual:[authorizationURL path]]; - - if (isAuthURL) { - // We can assume that we have no pending fetchers, since we only - // handle failure to load the initial authorization URL - [self closeTheWindow]; - [self invokeFinalCallbackWithError:error]; - return YES; - } - return NO; -} - -- (void)authCodeObtained { - // the callback page was requested, or the authenticate code was loaded - // into a page's title, so exchange the auth code for access & refresh tokens - // and tell the window to close - - // avoid duplicate signals that the callback point has been reached - self.hasHandledCallback = YES; - - // If the signin was request for exchanging an authentication token to a - // refresh token, there is no window to close. - if (self.webRequestSelector) { - [self closeTheWindow]; - } else { - // For signing in to Google, append the scope for obtaining the - // authenticated user email and profile, as appropriate. This is usually - // done by the startSigningIn method, but this method is not called when - // exchanging an authentication token for a refresh token. -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - [self addScopeForGoogleUserInfo]; -#endif - } - - NSError *error = nil; - - GTMOAuth2Authentication *auth = self.authentication; - NSString *code = auth.code; - if ([code length] > 0) { - // exchange the code for a token - SEL sel = @selector(auth:finishedWithFetcher:error:); - GTMOAuth2Fetcher *fetcher = [auth beginTokenFetchWithDelegate:self - didFinishSelector:sel]; - if (fetcher == nil) { - error = [NSError errorWithDomain:kGTMOAuth2FetcherStatusDomain - code:-1 - userInfo:nil]; - } else { - self.pendingFetcher = fetcher; - } - - // notify the app so it can put up a post-sign in, pre-token exchange UI - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:kGTMOAuth2UserSignedIn - object:self - userInfo:nil]; - } else { - // the callback lacked an auth code - NSString *errStr = auth.errorString; - NSDictionary *userInfo = nil; - if ([errStr length] > 0) { - userInfo = [NSDictionary dictionaryWithObject:errStr - forKey:kGTMOAuth2ErrorMessageKey]; - } - - error = [NSError errorWithDomain:kGTMOAuth2ErrorDomain - code:kGTMOAuth2ErrorAuthorizationFailed - userInfo:userInfo]; - } - - if (error) { - [self finishSignInWithError:error]; - } -} - -- (void)auth:(GTMOAuth2Authentication *)auth -finishedWithFetcher:(GTMOAuth2Fetcher *)fetcher - error:(NSError *)error { - self.pendingFetcher = nil; - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - if (error == nil - && (self.shouldFetchGoogleUserEmail || self.shouldFetchGoogleUserProfile) - && [self.authentication.serviceProvider isEqual:kGTMOAuth2ServiceProviderGoogle]) { - // fetch the user's information from the Google server - [self fetchGoogleUserInfo]; - } else { - // we're not authorizing with Google, so we're done - [self finishSignInWithError:error]; - } -#else - [self finishSignInWithError:error]; -#endif -} - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (GTMOAuth2Fetcher *)userInfoFetcherWithAuth:(GTMOAuth2Authentication *)auth { - // create a fetcher for obtaining the user's email or profile - NSURL *infoURL = [[self class] googleUserInfoURL]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:infoURL]; - - if ([auth respondsToSelector:@selector(userAgent)]) { - NSString *userAgent = [auth userAgent]; - [request setValue:userAgent forHTTPHeaderField:@"User-Agent"]; - } - [request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"]; - - GTMOAuth2Fetcher *fetcher; - id fetcherService = nil; - if ([auth respondsToSelector:@selector(fetcherService)]) { - fetcherService = auth.fetcherService; - }; - if (fetcherService) { - fetcher = (GTMOAuth2Fetcher *)[fetcherService fetcherWithRequest:request]; - } else { - fetcher = [GTMOAuth2Fetcher fetcherWithRequest:request]; - } - fetcher.authorizer = auth; - fetcher.retryEnabled = YES; - fetcher.maxRetryInterval = 15.0; -#if !STRIP_GTM_FETCH_LOGGING - // The user email address is known at token refresh time, not during the initial code exchange. - NSString *userEmail = auth.userEmail; - NSString *forStr = userEmail ? [NSString stringWithFormat:@"for \"%@\"", userEmail] : @""; - [fetcher setCommentWithFormat:@"GTMOAuth2 user info %@", forStr]; -#endif - return fetcher; -} - -- (void)fetchGoogleUserInfo { - if (!self.shouldFetchGoogleUserProfile) { - // If we only need email and user ID, not the full profile, and we have an - // id_token, it may have the email and user ID so we won't need to fetch - // them. - GTMOAuth2Authentication *auth = self.authentication; - NSString *idToken = [auth.parameters objectForKey:@"id_token"]; - if ([idToken length] > 0) { - // The id_token has three dot-delimited parts. The second is the - // JSON profile. - // - // http://www.tbray.org/ongoing/When/201x/2013/04/04/ID-Tokens - NSArray *parts = [idToken componentsSeparatedByString:@"."]; - if ([parts count] == 3) { - NSString *part2 = [parts objectAtIndex:1]; - if ([part2 length] > 0) { - NSData *data = [[self class] decodeWebSafeBase64:part2]; - if ([data length] > 0) { - [self updateGoogleUserInfoWithData:data]; - if ([[auth userID] length] > 0 && [[auth userEmail] length] > 0) { - // We obtained user ID and email from the ID token. - [self finishSignInWithError:nil]; - return; - } - } - } - } - } - } - - // Fetch the email and profile from the userinfo endpoint. - GTMOAuth2Authentication *auth = self.authentication; - GTMOAuth2Fetcher *fetcher = [[self class] userInfoFetcherWithAuth:auth]; - [fetcher beginFetchWithDelegate:self - didFinishSelector:@selector(infoFetcher:finishedWithData:error:)]; - - self.pendingFetcher = fetcher; - - [auth notifyFetchIsRunning:YES - fetcher:fetcher - type:kGTMOAuth2FetchTypeUserInfo]; -} - -- (void)infoFetcher:(GTMOAuth2Fetcher *)fetcher - finishedWithData:(NSData *)data - error:(NSError *)error { - GTMOAuth2Authentication *auth = self.authentication; - [auth notifyFetchIsRunning:NO - fetcher:fetcher - type:nil]; - - self.pendingFetcher = nil; - - if (error) { -#if DEBUG - if (data) { - NSString *dataStr = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - NSLog(@"infoFetcher error: %@\n%@", error, dataStr); - } -#endif - } else { - // We have the authenticated user's info - [self updateGoogleUserInfoWithData:data]; - } - [self finishSignInWithError:error]; -} - -- (void)updateGoogleUserInfoWithData:(NSData *)data { - if (!data) return; - - GTMOAuth2Authentication *auth = self.authentication; - NSDictionary *profileDict = [[auth class] dictionaryWithJSONData:data]; - if (profileDict) { - // Profile dictionary keys mostly conform to - // http://openid.net/specs/openid-connect-messages-1_0.html#StandardClaims - - self.userProfile = profileDict; - - // Save the ID into the auth object - NSString *subjectID = [profileDict objectForKey:@"sub"]; - [auth setUserID:subjectID]; - - // Save the email into the auth object - NSString *email = [profileDict objectForKey:@"email"]; - [auth setUserEmail:email]; - -#if DEBUG - NSAssert([subjectID length] > 0 && [email length] > 0, - @"profile lacks userID or userEmail: %@", profileDict); -#endif - - // The email_verified key is a boolean NSNumber in the userinfo - // endpoint response, but it is a string like "true" in the id_token. - // We want to consistently save it as a string of the boolean value, - // like @"1". - id verified = [profileDict objectForKey:@"email_verified"]; - if ([verified isKindOfClass:[NSString class]]) { - verified = [NSNumber numberWithBool:[verified boolValue]]; - } - - [auth setUserEmailIsVerified:[verified stringValue]]; - } -} - -#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - -- (void)finishSignInWithError:(NSError *)error { - [self invokeFinalCallbackWithError:error]; -} - -// convenience method for making the final call to our delegate -- (void)invokeFinalCallbackWithError:(NSError *)error { - if (delegate_ && finishedSelector_) { - GTMOAuth2Authentication *auth = self.authentication; - - NSMethodSignature *sig = [delegate_ methodSignatureForSelector:finishedSelector_]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:finishedSelector_]; - [invocation setTarget:delegate_]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&auth atIndex:3]; - [invocation setArgument:&error atIndex:4]; - [invocation invoke]; - } - - // we'll no longer send messages to the delegate - // - // we want to autorelease it rather than assign to the property in case - // the delegate is below us in the call stack - [delegate_ autorelease]; - delegate_ = nil; -} - -#pragma mark Reachability monitoring - -static void ReachabilityCallBack(SCNetworkReachabilityRef target, - SCNetworkConnectionFlags flags, - void *info) { - // pass the flags to the signIn object - GTMOAuth2SignIn *signIn = (GTMOAuth2SignIn *)info; - - [signIn reachabilityTarget:target - changedFlags:flags]; -} - -- (void)startReachabilityCheck { - // the user may set the timeout to 0 to skip the reachability checking - // during display of the sign-in page - if (networkLossTimeoutInterval_ <= 0.0 || reachabilityRef_ != NULL) { - return; - } - - // create a reachability target from the authorization URL, add our callback, - // and schedule it on the run loop so we'll be notified if the network drops - NSURL *url = self.authorizationURL; - const char* host = [[url host] UTF8String]; - reachabilityRef_ = SCNetworkReachabilityCreateWithName(kCFAllocatorSystemDefault, - host); - if (reachabilityRef_) { - BOOL isScheduled = NO; - SCNetworkReachabilityContext ctx = { 0, self, NULL, NULL, NULL }; - - if (SCNetworkReachabilitySetCallback(reachabilityRef_, - ReachabilityCallBack, &ctx)) { - if (SCNetworkReachabilityScheduleWithRunLoop(reachabilityRef_, - CFRunLoopGetCurrent(), - kCFRunLoopDefaultMode)) { - isScheduled = YES; - } - } - - if (!isScheduled) { - CFRelease(reachabilityRef_); - reachabilityRef_ = NULL; - } - } -} - -- (void)destroyUnreachabilityTimer { - [networkLossTimer_ invalidate]; - [networkLossTimer_ autorelease]; - networkLossTimer_ = nil; -} - -- (void)reachabilityTarget:(SCNetworkReachabilityRef)reachabilityRef - changedFlags:(SCNetworkConnectionFlags)flags { - BOOL isConnected = (flags & kSCNetworkFlagsReachable) != 0 - && (flags & kSCNetworkFlagsConnectionRequired) == 0; - - if (isConnected) { - // server is again reachable - [self destroyUnreachabilityTimer]; - - if (hasNotifiedNetworkLoss_) { - // tell the user that the network has been found - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:kGTMOAuth2NetworkFound - object:self - userInfo:nil]; - hasNotifiedNetworkLoss_ = NO; - } - } else { - // the server has become unreachable; start the timer, if necessary - if (networkLossTimer_ == nil - && networkLossTimeoutInterval_ > 0 - && !hasNotifiedNetworkLoss_) { - SEL sel = @selector(reachabilityTimerFired:); - networkLossTimer_ = [[NSTimer scheduledTimerWithTimeInterval:networkLossTimeoutInterval_ - target:self - selector:sel - userInfo:nil - repeats:NO] retain]; - } - } -} - -- (void)reachabilityTimerFired:(NSTimer *)timer { - // the user may call [[notification object] cancelSigningIn] to - // dismiss the sign-in - if (!hasNotifiedNetworkLoss_) { - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:kGTMOAuth2NetworkLost - object:self - userInfo:nil]; - hasNotifiedNetworkLoss_ = YES; - } - - [self destroyUnreachabilityTimer]; -} - -- (void)stopReachabilityCheck { - [self destroyUnreachabilityTimer]; - - if (reachabilityRef_) { - SCNetworkReachabilityUnscheduleFromRunLoop(reachabilityRef_, - CFRunLoopGetCurrent(), - kCFRunLoopDefaultMode); - SCNetworkReachabilitySetCallback(reachabilityRef_, NULL, NULL); - - CFRelease(reachabilityRef_); - reachabilityRef_ = NULL; - } -} - -#pragma mark Token Revocation - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (void)revokeTokenForGoogleAuthentication:(GTMOAuth2Authentication *)auth { - if (auth.refreshToken != nil - && auth.canAuthorize - && [auth.serviceProvider isEqual:kGTMOAuth2ServiceProviderGoogle]) { - - // create a signed revocation request for this authentication object - NSURL *url = [self googleRevocationURL]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; - [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; - - NSString *token = auth.refreshToken; - NSString *encoded = [GTMOAuth2Authentication encodedOAuthValueForString:token]; - if (encoded != nil) { - NSString *body = [@"token=" stringByAppendingString:encoded]; - - [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; - [request setHTTPMethod:@"POST"]; - - NSString *userAgent = [auth userAgent]; - [request setValue:userAgent forHTTPHeaderField:@"User-Agent"]; - - // there's nothing to be done if revocation succeeds or fails - GTMOAuth2Fetcher *fetcher; - id fetcherService = auth.fetcherService; - if (fetcherService) { - fetcher = (GTMOAuth2Fetcher *)[fetcherService fetcherWithRequest:request]; - } else { - fetcher = [GTMOAuth2Fetcher fetcherWithRequest:request]; - } - [fetcher setCommentWithFormat:@"GTMOAuth2 revoke token for %@", auth.userEmail]; - - // Use a completion handler fetch for better debugging, but only if we're - // guaranteed that blocks are available in the runtime -#if (!TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1060)) || \ - (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MIN_REQUIRED >= 40000)) - // Blocks are available - [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) { - #if DEBUG - if (error) { - NSString *errStr = [[[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding] autorelease]; - NSLog(@"revoke error: %@", errStr); - } - #endif // DEBUG - }]; -#else - // Blocks may not be available - [fetcher beginFetchWithDelegate:nil didFinishSelector:NULL]; -#endif - } - } - [auth reset]; -} - - -// Based on Cyrus Najmabadi's elegent little encoder and decoder from -// http://www.cocoadev.com/index.pl?BaseSixtyFour and on GTLBase64 - -+ (NSData *)decodeWebSafeBase64:(NSString *)base64Str { - static char decodingTable[128]; - static BOOL hasInited = NO; - - if (!hasInited) { - char webSafeEncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - memset(decodingTable, 0, 128); - for (unsigned int i = 0; i < sizeof(webSafeEncodingTable); i++) { - decodingTable[(unsigned int) webSafeEncodingTable[i]] = (char)i; - } - hasInited = YES; - } - - // The input string should be plain ASCII. - const char *cString = [base64Str cStringUsingEncoding:NSASCIIStringEncoding]; - if (cString == nil) return nil; - - NSInteger inputLength = (NSInteger)strlen(cString); - // Input length is not being restricted to multiples of 4. - if (inputLength == 0) return [NSData data]; - - while (inputLength > 0 && cString[inputLength - 1] == '=') { - inputLength--; - } - - NSInteger outputLength = inputLength * 3 / 4; - NSMutableData* data = [NSMutableData dataWithLength:(NSUInteger)outputLength]; - uint8_t *output = [data mutableBytes]; - - NSInteger inputPoint = 0; - NSInteger outputPoint = 0; - char *table = decodingTable; - - while (inputPoint < inputLength - 1) { - int i0 = cString[inputPoint++]; - int i1 = cString[inputPoint++]; - int i2 = inputPoint < inputLength ? cString[inputPoint++] : 'A'; // 'A' will decode to \0 - int i3 = inputPoint < inputLength ? cString[inputPoint++] : 'A'; - - output[outputPoint++] = (uint8_t)((table[i0] << 2) | (table[i1] >> 4)); - if (outputPoint < outputLength) { - output[outputPoint++] = (uint8_t)(((table[i1] & 0xF) << 4) | (table[i2] >> 2)); - } - if (outputPoint < outputLength) { - output[outputPoint++] = (uint8_t)(((table[i2] & 0x3) << 6) | table[i3]); - } - } - - return data; -} - -#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - -@end - -#endif // #if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2Framework-Info.plist b/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2Framework-Info.plist deleted file mode 100644 index 4433570ee..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2Framework-Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.google.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.h b/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.h deleted file mode 100644 index fb28d1350..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.h +++ /dev/null @@ -1,336 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// GTMOAuth2WindowController -// -// This window controller for Mac handles sign-in via OAuth2 to Google or -// other services. -// -// This controller is not reusable; create a new instance of this controller -// every time the user will sign in. -// -// Sample usage for signing in to a Google service: -// -// static NSString *const kKeychainItemName = @”My App: Google Plus”; -// NSString *scope = @"https://www.googleapis.com/auth/plus.me"; -// -// -// GTMOAuth2WindowController *windowController; -// windowController = [[[GTMOAuth2WindowController alloc] initWithScope:scope -// clientID:clientID -// clientSecret:clientSecret -// keychainItemName:kKeychainItemName -// resourceBundle:nil] autorelease]; -// -// [windowController signInSheetModalForWindow:mMainWindow -// delegate:self -// finishedSelector:@selector(windowController:finishedWithAuth:error:)]; -// -// The finished selector should have a signature matching this: -// -// - (void)windowController:(GTMOAuth2WindowController *)windowController -// finishedWithAuth:(GTMOAuth2Authentication *)auth -// error:(NSError *)error { -// if (error != nil) { -// // sign in failed -// } else { -// // sign in succeeded -// // -// // with the GTL library, pass the authentication to the service object, -// // like -// // [[self contactService] setAuthorizer:auth]; -// // -// // or use it to sign a request directly, like -// // BOOL isAuthorizing = [self authorizeRequest:request -// // delegate:self -// // didFinishSelector:@selector(auth:finishedWithError:)]; -// } -// } -// -// To sign in to services other than Google, use the longer init method, -// as shown in the sample application -// -// If the network connection is lost for more than 30 seconds while the sign-in -// html is displayed, the notification kGTLOAuthNetworkLost will be sent. - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -#include - -#if !TARGET_OS_IPHONE - -#import -#import - -// GTMHTTPFetcher.h brings in GTLDefines/GDataDefines -#if GTM_USE_SESSION_FETCHER -#import "GTMSessionFetcher.h" -#else -#import "GTMHTTPFetcher.h" -#import "GTMHTTPFetchHistory.h" // for GTMCookieStorage -#endif - -#import "GTMOAuth2SignIn.h" -#import "GTMOAuth2Authentication.h" - -@class GTMOAuth2SignIn; - -@interface GTMOAuth2WindowController : NSWindowController { - @private - // IBOutlets - NSButton *keychainCheckbox_; - WebView *webView_; - NSButton *webCloseButton_; - NSButton *webBackButton_; - - // the object responsible for the sign-in networking sequence; it holds - // onto the authentication object as well - GTMOAuth2SignIn *signIn_; - - // the page request to load when awakeFromNib occurs - NSURLRequest *initialRequest_; - - // local storage for WebKit cookies so they're not shared with Safari - GTMOAuth2CookieStorage *cookieStorage_; - - // the user we're calling back - // - // the delegate is retained only until the callback is invoked - // or the sign-in is canceled - id delegate_; - SEL finishedSelector_; - -#if NS_BLOCKS_AVAILABLE - void (^completionBlock_)(GTMOAuth2Authentication *, NSError *); -#elif !__LP64__ - // placeholders: for 32-bit builds, keep the size of the object's ivar section - // the same with and without blocks -#ifndef __clang_analyzer__ - id completionPlaceholder_; -#endif -#endif - - // flag allowing application to quit during display of sign-in sheet on 10.6 - // and later - BOOL shouldAllowApplicationTermination_; - - // delegate method for handling URLs to be opened in external windows - SEL externalRequestSelector_; - - BOOL isWindowShown_; - - // paranoid flag to ensure we only close once during the sign-in sequence - BOOL hasDoneFinalRedirect_; - - // paranoid flag to ensure we only call the user back once - BOOL hasCalledFinished_; - - // if non-nil, we display as a sheet on the specified window - NSWindow *sheetModalForWindow_; - - // if non-empty, the name of the application and service used for the - // keychain item - NSString *keychainItemName_; - - // if non-nil, the html string to be displayed immediately upon opening - // of the web view - NSString *initialHTMLString_; - - // if true, we allow default WebView handling of cookies, so the - // same user remains signed in each time the dialog is displayed - BOOL shouldPersistUser_; - - // user-defined data - id userData_; - NSMutableDictionary *properties_; -} - -// User interface elements -@property (nonatomic, assign) IBOutlet NSButton *keychainCheckbox; -@property (nonatomic, assign) IBOutlet WebView *webView; -@property (nonatomic, assign) IBOutlet NSButton *webCloseButton; -@property (nonatomic, assign) IBOutlet NSButton *webBackButton; - -// The application and service name to use for saving the auth tokens -// to the keychain -@property (nonatomic, copy) NSString *keychainItemName; - -// If true, the sign-in will remember which user was last signed in -// -// Defaults to false, so showing the sign-in window will always ask for -// the username and password, rather than skip to the grant authorization -// page. During development, it may be convenient to set this to true -// to speed up signing in. -@property (nonatomic, assign) BOOL shouldPersistUser; - -// Optional html string displayed immediately upon opening the web view -// -// This string is visible just until the sign-in web page loads, and -// may be used for a "Loading..." type of message -@property (nonatomic, copy) NSString *initialHTMLString; - -// The default timeout for an unreachable network during display of the -// sign-in page is 30 seconds, after which the notification -// kGTLOAuthNetworkLost is sent; set this to 0 to have no timeout -@property (nonatomic, assign) NSTimeInterval networkLossTimeoutInterval; - -// On 10.6 and later, the sheet can allow application termination by calling -// NSWindow's setPreventsApplicationTerminationWhenModal: -@property (nonatomic, assign) BOOL shouldAllowApplicationTermination; - -// Selector for a delegate method to handle requests sent to an external -// browser. -// -// Selector should have a signature matching -// - (void)windowController:(GTMOAuth2WindowController *)controller -// opensRequest:(NSURLRequest *)request; -// -// The controller's default behavior is to use NSWorkspace's openURL: -@property (nonatomic, assign) SEL externalRequestSelector; - -// The underlying object to hold authentication tokens and authorize http -// requests -@property (nonatomic, retain, readonly) GTMOAuth2Authentication *authentication; - -// The underlying object which performs the sign-in networking sequence -@property (nonatomic, retain, readonly) GTMOAuth2SignIn *signIn; - -// Any arbitrary data object the user would like the controller to retain -@property (nonatomic, retain) id userData; - -// Stored property values are retained for the convenience of the caller -- (void)setProperty:(id)obj forKey:(NSString *)key; -- (id)propertyForKey:(NSString *)key; - -@property (nonatomic, retain) NSDictionary *properties; - -- (IBAction)closeWindow:(id)sender; - -// Create a controller for authenticating to Google services -// -// scope is the requested scope of authorization -// (like "http://www.google.com/m8/feeds") -// -// keychainItemName is used for storing the token on the keychain, -// and is required for the "remember for later" checkbox to be shown; -// keychainItemName should be like "My Application: Google Contacts" -// (or set to nil if no persistent keychain storage is desired) -// -// resourceBundle may be nil if the window is in the main bundle's nib -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (id)controllerWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName // may be nil - resourceBundle:(NSBundle *)bundle; // may be nil - -- (id)initWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - resourceBundle:(NSBundle *)bundle; -#endif - -// Create a controller for authenticating to non-Google services, taking -// explicit endpoint URLs and an authentication object -+ (id)controllerWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName // may be nil - resourceBundle:(NSBundle *)bundle; // may be nil - -// This is the designated initializer -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - resourceBundle:(NSBundle *)bundle; - -// Entry point to begin displaying the sign-in window -// -// the finished selector should have a signature matching -// - (void)windowController:(GTMOAuth2WindowController *)windowController -// finishedWithAuth:(GTMOAuth2Authentication *)auth -// error:(NSError *)error { -// -// Once the finished method has been invoked with no error, the auth object -// may be used to authorize requests (refreshing the access token, if necessary, -// and adding the auth header) like: -// -// [authorizer authorizeRequest:myNSMutableURLRequest] -// delegate:self -// didFinishSelector:@selector(auth:finishedWithError:)]; -// -// or can be stored in a GTL service object like -// GTLServiceGoogleContact *service = [self contactService]; -// [service setAuthorizer:auth]; -// -// The delegate is retained only until the finished selector is invoked or -// the sign-in is canceled -- (void)signInSheetModalForWindow:(NSWindow *)parentWindowOrNil - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector; - -#if NS_BLOCKS_AVAILABLE -- (void)signInSheetModalForWindow:(NSWindow *)parentWindowOrNil - completionHandler:(void (^)(GTMOAuth2Authentication *auth, NSError *error))handler; -#endif - -- (void)cancelSigningIn; - -// Subclasses may override authNibName to specify a custom name -+ (NSString *)authNibName; - -// apps may replace the sign-in class with their own subclass of it -+ (Class)signInClass; -+ (void)setSignInClass:(Class)theClass; - -// Revocation of an authorized token from Google -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (void)revokeTokenForGoogleAuthentication:(GTMOAuth2Authentication *)auth; -#endif - -// Keychain -// -// The keychain checkbox is shown if the keychain application service -// name (typically set in the initWithScope: method) is non-empty -// - -// Create an authentication object for Google services from the access -// token and secret stored in the keychain; if no token is available, return -// an unauthorized auth object -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (GTMOAuth2Authentication *)authForGoogleFromKeychainForName:(NSString *)keychainItemName - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret; -#endif - -// Add tokens from the keychain, if available, to the authentication object -// -// returns YES if the authentication object was authorized from the keychain -+ (BOOL)authorizeFromKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)auth; - -// Method for deleting the stored access token and secret, useful for "signing -// out" -+ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName; - -// Method for saving the stored access token and secret; typically, this method -// is used only by the window controller -+ (BOOL)saveAuthToKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)auth; -@end - -#endif // #if !TARGET_OS_IPHONE - -#endif // #if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.m b/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.m deleted file mode 100644 index 02ae99b24..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/Mac/GTMOAuth2WindowController.m +++ /dev/null @@ -1,728 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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 - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -#if !TARGET_OS_IPHONE - -#import "GTMOAuth2WindowController.h" - -@interface GTMOAuth2WindowController () -@property (nonatomic, retain) GTMOAuth2SignIn *signIn; -@property (nonatomic, copy) NSURLRequest *initialRequest; -@property (nonatomic, retain) GTMOAuth2CookieStorage *cookieStorage; -@property (nonatomic, retain) NSWindow *sheetModalForWindow; - -- (void)signInCommonForWindow:(NSWindow *)parentWindowOrNil; -- (void)setupSheetTerminationHandling; -- (void)destroyWindow; -- (void)handlePrematureWindowClose; -- (BOOL)shouldUseKeychain; -- (void)signIn:(GTMOAuth2SignIn *)signIn displayRequest:(NSURLRequest *)request; -- (void)signIn:(GTMOAuth2SignIn *)signIn finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error; -- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - -- (void)handleCookiesForResponse:(NSURLResponse *)response; -- (NSURLRequest *)addCookiesToRequest:(NSURLRequest *)request; -@end - -const char *kKeychainAccountName = "OAuth"; - -@implementation GTMOAuth2WindowController - -// IBOutlets -@synthesize keychainCheckbox = keychainCheckbox_, - webView = webView_, - webCloseButton = webCloseButton_, - webBackButton = webBackButton_; - -// regular ivars -@synthesize signIn = signIn_, - initialRequest = initialRequest_, - cookieStorage = cookieStorage_, - sheetModalForWindow = sheetModalForWindow_, - keychainItemName = keychainItemName_, - initialHTMLString = initialHTMLString_, - shouldAllowApplicationTermination = shouldAllowApplicationTermination_, - externalRequestSelector = externalRequestSelector_, - shouldPersistUser = shouldPersistUser_, - userData = userData_, - properties = properties_; - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -// Create a controller for authenticating to Google services -+ (id)controllerWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - resourceBundle:(NSBundle *)bundle { - return [[[self alloc] initWithScope:scope - clientID:clientID - clientSecret:clientSecret - keychainItemName:keychainItemName - resourceBundle:bundle] autorelease]; -} - -- (id)initWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - resourceBundle:(NSBundle *)bundle { - Class signInClass = [[self class] signInClass]; - GTMOAuth2Authentication *auth; - auth = [signInClass standardGoogleAuthenticationForScope:scope - clientID:clientID - clientSecret:clientSecret]; - NSURL *authorizationURL = [signInClass googleAuthorizationURL]; - return [self initWithAuthentication:auth - authorizationURL:authorizationURL - keychainItemName:keychainItemName - resourceBundle:bundle]; -} -#endif - -// Create a controller for authenticating to any service -+ (id)controllerWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - resourceBundle:(NSBundle *)bundle { - return [[[self alloc] initWithAuthentication:auth - authorizationURL:authorizationURL - keychainItemName:keychainItemName - resourceBundle:bundle] autorelease]; -} - -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - resourceBundle:(NSBundle *)bundle { - if (bundle == nil) { - bundle = [NSBundle mainBundle]; - } - - NSString *nibName = [[self class] authNibName]; - NSString *nibPath = [bundle pathForResource:nibName - ofType:@"nib"]; - - self = [super initWithWindowNibPath:nibPath - owner:self]; - if (self != nil) { - // use the supplied auth and OAuth endpoint URLs - Class signInClass = [[self class] signInClass]; - signIn_ = [[signInClass alloc] initWithAuthentication:auth - authorizationURL:authorizationURL - delegate:self - webRequestSelector:@selector(signIn:displayRequest:) - finishedSelector:@selector(signIn:finishedWithAuth:error:)]; - keychainItemName_ = [keychainItemName copy]; - - // create local, temporary storage for WebKit cookies - cookieStorage_ = [[GTMOAuth2CookieStorage alloc] init]; - } - return self; -} - -- (void)dealloc { - [signIn_ release]; - [initialRequest_ release]; - [cookieStorage_ release]; - [delegate_ release]; -#if NS_BLOCKS_AVAILABLE - [completionBlock_ release]; -#endif - [sheetModalForWindow_ release]; - [keychainItemName_ release]; - [initialHTMLString_ release]; - [userData_ release]; - [properties_ release]; - - [super dealloc]; -} - -- (void)awakeFromNib { - // load the requested initial sign-in page - [self.webView setResourceLoadDelegate:self]; - [self.webView setPolicyDelegate:self]; - - // the app may prefer some html other than blank white to be displayed - // before the sign-in web page loads - NSString *html = self.initialHTMLString; - if ([html length] > 0) { - [[self.webView mainFrame] loadHTMLString:html baseURL:nil]; - } - - // hide the keychain checkbox if we're not supporting keychain - BOOL hideKeychainCheckbox = ![self shouldUseKeychain]; - - const NSTimeInterval kJanuary2011 = 1293840000; - BOOL isDateValid = ([[NSDate date] timeIntervalSince1970] > kJanuary2011); - if (isDateValid) { - // start the asynchronous load of the sign-in web page - [[self.webView mainFrame] performSelector:@selector(loadRequest:) - withObject:self.initialRequest - afterDelay:0.01 - inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; - } else { - // clock date is invalid, so signing in would fail with an unhelpful error - // from the server. Warn the user in an html string showing a watch icon, - // question mark, and the system date and time. Hopefully this will clue - // in brighter users, or at least let them make a useful screenshot to show - // to developers. - // - // Even better is for apps to check the system clock and show some more - // helpful, localized instructions for users; this is really a fallback. - NSString *const htmlTemplate = @"

" - @"⌚ ?
System Clock Incorrect
%@" - @"
"; - NSString *errHTML = [NSString stringWithFormat:htmlTemplate, [NSDate date]]; - - [[webView_ mainFrame] loadHTMLString:errHTML baseURL:nil]; - hideKeychainCheckbox = YES; - } - -#if DEBUG - // Verify that Javascript is enabled - BOOL hasJS = [[webView_ preferences] isJavaScriptEnabled]; - NSAssert(hasJS, @"GTMOAuth2: Javascript is required"); -#endif - - [keychainCheckbox_ setHidden:hideKeychainCheckbox]; -} - -+ (NSString *)authNibName { - // subclasses may override this to specify a custom nib name - return @"GTMOAuth2Window"; -} - -#pragma mark - - -- (void)signInSheetModalForWindow:(NSWindow *)parentWindowOrNil - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector { - // check the selector on debug builds - GTMOAuth2AssertValidSelector(delegate, finishedSelector, - @encode(GTMOAuth2WindowController *), @encode(GTMOAuth2Authentication *), - @encode(NSError *), 0); - - delegate_ = [delegate retain]; - finishedSelector_ = finishedSelector; - - [self signInCommonForWindow:parentWindowOrNil]; -} - -#if NS_BLOCKS_AVAILABLE -- (void)signInSheetModalForWindow:(NSWindow *)parentWindowOrNil - completionHandler:(void (^)(GTMOAuth2Authentication *, NSError *))handler { - completionBlock_ = [handler copy]; - - [self signInCommonForWindow:parentWindowOrNil]; -} -#endif - -- (void)signInCommonForWindow:(NSWindow *)parentWindowOrNil { - self.sheetModalForWindow = parentWindowOrNil; - hasDoneFinalRedirect_ = NO; - hasCalledFinished_ = NO; - - [self.signIn startSigningIn]; -} - -- (void)cancelSigningIn { - // The user has explicitly asked us to cancel signing in - // (so no further callback is required) - hasCalledFinished_ = YES; - - [delegate_ autorelease]; - delegate_ = nil; - -#if NS_BLOCKS_AVAILABLE - [completionBlock_ autorelease]; - completionBlock_ = nil; -#endif - - // The signIn object's cancel method will close the window - [self.signIn cancelSigningIn]; - hasDoneFinalRedirect_ = YES; -} - -- (IBAction)closeWindow:(id)sender { - // dismiss the window/sheet before we call back the client - [self destroyWindow]; - [self handlePrematureWindowClose]; -} - -#pragma mark SignIn callbacks - -- (void)signIn:(GTMOAuth2SignIn *)signIn displayRequest:(NSURLRequest *)request { - // this is the signIn object's webRequest method, telling the controller - // to either display the request in the webview, or close the window - // - // All web requests and all window closing goes through this routine - -#if DEBUG - if ((isWindowShown_ && request != nil) - || (!isWindowShown_ && request == nil)) { - NSLog(@"Window state unexpected for request %@", [request URL]); - return; - } -#endif - - if (request != nil) { - // display the request - self.initialRequest = request; - - NSWindow *parentWindow = self.sheetModalForWindow; - if (parentWindow) { - [self setupSheetTerminationHandling]; - - NSWindow *sheet = [self window]; - [NSApp beginSheet:sheet - modalForWindow:parentWindow - modalDelegate:self - didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) - contextInfo:nil]; - } else { - // modeless - [self showWindow:self]; - } - isWindowShown_ = YES; - } else { - // request was nil - [self destroyWindow]; - } -} - -- (void)setupSheetTerminationHandling { - NSWindow *sheet = [self window]; - - SEL sel = @selector(setPreventsApplicationTerminationWhenModal:); - if ([sheet respondsToSelector:sel]) { - // setPreventsApplicationTerminationWhenModal is available in NSWindow - // on 10.6 and later - BOOL boolVal = !self.shouldAllowApplicationTermination; - NSMethodSignature *sig = [sheet methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:sheet]; - [invocation setArgument:&boolVal atIndex:2]; - [invocation invoke]; - } -} - -- (void)destroyWindow { - // no request; close the window - - // Avoid more callbacks after the close happens, as the window - // controller may be gone. - [self.webView stopLoading:nil]; - - NSWindow *parentWindow = self.sheetModalForWindow; - if (parentWindow) { - [NSApp endSheet:[self window]]; - } else { - // defer closing the window, in case we're responding to some window event - [[self window] performSelector:@selector(close) - withObject:nil - afterDelay:0.1 - inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; - - } - isWindowShown_ = NO; -} - -- (void)handlePrematureWindowClose { - if (!hasDoneFinalRedirect_) { - // tell the sign-in object to tell the user's finished method - // that we're done - [self.signIn windowWasClosed]; - hasDoneFinalRedirect_ = YES; - } -} - -- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { - [sheet orderOut:self]; - - self.sheetModalForWindow = nil; -} - -- (void)signIn:(GTMOAuth2SignIn *)signIn finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error { - if (!hasCalledFinished_) { - hasCalledFinished_ = YES; - - if (error == nil) { - BOOL shouldUseKeychain = [self shouldUseKeychain]; - if (shouldUseKeychain) { - BOOL canAuthorize = auth.canAuthorize; - BOOL isKeychainChecked = ([keychainCheckbox_ state] == NSOnState); - - NSString *keychainItemName = self.keychainItemName; - - if (isKeychainChecked && canAuthorize) { - // save the auth params in the keychain - [[self class] saveAuthToKeychainForName:keychainItemName - authentication:auth]; - } else { - // remove the auth params from the keychain - [[self class] removeAuthFromKeychainForName:keychainItemName]; - } - } - } - - if (delegate_ && finishedSelector_) { - SEL sel = finishedSelector_; - NSMethodSignature *sig = [delegate_ methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:delegate_]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&auth atIndex:3]; - [invocation setArgument:&error atIndex:4]; - [invocation invoke]; - } - - [delegate_ autorelease]; - delegate_ = nil; - -#if NS_BLOCKS_AVAILABLE - if (completionBlock_) { - completionBlock_(auth, error); - - // release the block here to avoid a retain loop on the controller - [completionBlock_ autorelease]; - completionBlock_ = nil; - } -#endif - } -} - -static Class gSignInClass = Nil; - -+ (Class)signInClass { - if (gSignInClass == Nil) { - gSignInClass = [GTMOAuth2SignIn class]; - } - return gSignInClass; -} - -+ (void)setSignInClass:(Class)theClass { - gSignInClass = theClass; -} - -#pragma mark Token Revocation - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (void)revokeTokenForGoogleAuthentication:(GTMOAuth2Authentication *)auth { - [[self signInClass] revokeTokenForGoogleAuthentication:auth]; -} -#endif - -#pragma mark WebView methods - -- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource { - // override WebKit's cookie storage with our own to avoid cookie persistence - // across sign-ins and interaction with the Safari browser's sign-in state - [self handleCookiesForResponse:redirectResponse]; - request = [self addCookiesToRequest:request]; - - if (!hasDoneFinalRedirect_) { - hasDoneFinalRedirect_ = [self.signIn requestRedirectedToRequest:request]; - if (hasDoneFinalRedirect_) { - // signIn has told the window to close - return nil; - } - } - return request; -} - -- (void)webView:(WebView *)sender resource:(id)identifier didReceiveResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)dataSource { - // override WebKit's cookie storage with our own - [self handleCookiesForResponse:response]; -} - -- (void)webView:(WebView *)sender resource:(id)identifier didFinishLoadingFromDataSource:(WebDataSource *)dataSource { - NSString *title = [sender stringByEvaluatingJavaScriptFromString:@"document.title"]; - if ([title length] > 0) { - [self.signIn titleChanged:title]; - } - - [signIn_ cookiesChanged:(NSHTTPCookieStorage *)cookieStorage_]; -} - -- (void)webView:(WebView *)sender resource:(id)identifier didFailLoadingWithError:(NSError *)error fromDataSource:(WebDataSource *)dataSource { - [self.signIn loadFailedWithError:error]; -} - -- (void)windowWillClose:(NSNotification *)note { - if (isWindowShown_) { - [self handlePrematureWindowClose]; - } - isWindowShown_ = NO; -} - -- (void)webView:(WebView *)webView -decidePolicyForNewWindowAction:(NSDictionary *)actionInformation - request:(NSURLRequest *)request - newFrameName:(NSString *)frameName -decisionListener:(id)listener { - SEL sel = self.externalRequestSelector; - if (sel) { - [delegate_ performSelector:sel - withObject:self - withObject:request]; - } else { - // default behavior is to open the URL in NSWorkspace's default browser - NSURL *url = [request URL]; - [[NSWorkspace sharedWorkspace] openURL:url]; - } - [listener ignore]; -} - -#pragma mark Cookie management - -// Rather than let the WebView use Safari's default cookie storage, we intercept -// requests and response to segregate and later discard cookies from signing in. -// -// This allows the application to actually sign out by discarding the auth token -// rather than the user being kept signed in by the cookies. - -- (void)handleCookiesForResponse:(NSURLResponse *)response { - if (self.shouldPersistUser) { - // we'll let WebKit handle the cookies; they'll persist across apps - // and across runs of this app - return; - } - - if ([response respondsToSelector:@selector(allHeaderFields)]) { - // grab the cookies from the header as NSHTTPCookies and store them locally - NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; - if (headers) { - NSURL *url = [response URL]; - NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:headers - forURL:url]; - if ([cookies count] > 0) { - [cookieStorage_ setCookies:cookies]; - } - } - } -} - -- (NSURLRequest *)addCookiesToRequest:(NSURLRequest *)request { - if (self.shouldPersistUser) { - // we'll let WebKit handle the cookies; they'll persist across apps - // and across runs of this app - return request; - } - - // override WebKit's usual automatic storage of cookies - NSMutableURLRequest *mutableRequest = [[request mutableCopy] autorelease]; - [mutableRequest setHTTPShouldHandleCookies:NO]; - - // add our locally-stored cookies for this URL, if any - NSArray *cookies = [cookieStorage_ cookiesForURL:[request URL]]; - if ([cookies count] > 0) { - NSDictionary *headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies]; - NSString *cookieHeader = [headers objectForKey:@"Cookie"]; - if (cookieHeader) { - [mutableRequest setValue:cookieHeader forHTTPHeaderField:@"Cookie"]; - } - } - return mutableRequest; -} - -#pragma mark Keychain support - -+ (NSString *)prefsKeyForName:(NSString *)keychainItemName { - NSString *result = [@"OAuth2: " stringByAppendingString:keychainItemName]; - return result; -} - -+ (BOOL)saveAuthToKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)auth { - - [self removeAuthFromKeychainForName:keychainItemName]; - - // don't save unless we have a token that can really authorize requests - if (!auth.canAuthorize) return NO; - - // make a response string containing the values we want to save - NSString *password = [auth persistenceResponseString]; - - SecKeychainRef defaultKeychain = NULL; - SecKeychainItemRef *dontWantItemRef= NULL; - const char *utf8ServiceName = [keychainItemName UTF8String]; - const char *utf8Password = [password UTF8String]; - - OSStatus err = SecKeychainAddGenericPassword(defaultKeychain, - (UInt32) strlen(utf8ServiceName), utf8ServiceName, - (UInt32) strlen(kKeychainAccountName), kKeychainAccountName, - (UInt32) strlen(utf8Password), utf8Password, - dontWantItemRef); - BOOL didSucceed = (err == noErr); - if (didSucceed) { - // write to preferences that we have a keychain item (so we know later - // that we can read from the keychain without raising a permissions dialog) - NSString *prefKey = [self prefsKeyForName:keychainItemName]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - [defaults setBool:YES forKey:prefKey]; - } - - return didSucceed; -} - -+ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName { - - SecKeychainRef defaultKeychain = NULL; - SecKeychainItemRef itemRef = NULL; - const char *utf8ServiceName = [keychainItemName UTF8String]; - - // we don't really care about the password here, we just want to - // get the SecKeychainItemRef so we can delete it. - OSStatus err = SecKeychainFindGenericPassword (defaultKeychain, - (UInt32) strlen(utf8ServiceName), utf8ServiceName, - (UInt32) strlen(kKeychainAccountName), kKeychainAccountName, - 0, NULL, // ignore password - &itemRef); - if (err != noErr) { - // failure to find is success - return YES; - } else { - // found something, so delete it - err = SecKeychainItemDelete(itemRef); - CFRelease(itemRef); - - // remove our preference key - NSString *prefKey = [self prefsKeyForName:keychainItemName]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - [defaults removeObjectForKey:prefKey]; - - return (err == noErr); - } -} - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (GTMOAuth2Authentication *)authForGoogleFromKeychainForName:(NSString *)keychainItemName - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret { - Class signInClass = [self signInClass]; - NSURL *tokenURL = [signInClass googleTokenURL]; - NSString *redirectURI = [signInClass nativeClientRedirectURI]; - - GTMOAuth2Authentication *auth; - auth = [GTMOAuth2Authentication authenticationWithServiceProvider:kGTMOAuth2ServiceProviderGoogle - tokenURL:tokenURL - redirectURI:redirectURI - clientID:clientID - clientSecret:clientSecret]; - - [GTMOAuth2WindowController authorizeFromKeychainForName:keychainItemName - authentication:auth]; - return auth; -} -#endif - -+ (BOOL)authorizeFromKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)newAuth { - [newAuth setAccessToken:nil]; - - // before accessing the keychain, check preferences to verify that we've - // previously saved a token to the keychain (so we don't needlessly raise - // a keychain access permission dialog) - NSString *prefKey = [self prefsKeyForName:keychainItemName]; - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - BOOL flag = [defaults boolForKey:prefKey]; - if (!flag) { - return NO; - } - - BOOL didGetTokens = NO; - - SecKeychainRef defaultKeychain = NULL; - const char *utf8ServiceName = [keychainItemName UTF8String]; - SecKeychainItemRef *dontWantItemRef = NULL; - - void *passwordBuff = NULL; - UInt32 passwordBuffLength = 0; - - OSStatus err = SecKeychainFindGenericPassword(defaultKeychain, - (UInt32) strlen(utf8ServiceName), utf8ServiceName, - (UInt32) strlen(kKeychainAccountName), kKeychainAccountName, - &passwordBuffLength, &passwordBuff, - dontWantItemRef); - if (err == noErr && passwordBuff != NULL) { - - NSString *password = [[[NSString alloc] initWithBytes:passwordBuff - length:passwordBuffLength - encoding:NSUTF8StringEncoding] autorelease]; - - // free the password buffer that was allocated above - SecKeychainItemFreeContent(NULL, passwordBuff); - - if (password != nil) { - [newAuth setKeysForResponseString:password]; - didGetTokens = YES; - } - } - return didGetTokens; -} - -#pragma mark User Properties - -- (void)setProperty:(id)obj forKey:(NSString *)key { - if (obj == nil) { - // User passed in nil, so delete the property - [properties_ removeObjectForKey:key]; - } else { - // Be sure the property dictionary exists - if (properties_ == nil) { - [self setProperties:[NSMutableDictionary dictionary]]; - } - [properties_ setObject:obj forKey:key]; - } -} - -- (id)propertyForKey:(NSString *)key { - id obj = [properties_ objectForKey:key]; - - // Be sure the returned pointer has the life of the autorelease pool, - // in case self is released immediately - return [[obj retain] autorelease]; -} - -#pragma mark Accessors - -- (GTMOAuth2Authentication *)authentication { - return self.signIn.authentication; -} - -- (void)setNetworkLossTimeoutInterval:(NSTimeInterval)val { - self.signIn.networkLossTimeoutInterval = val; -} - -- (NSTimeInterval)networkLossTimeoutInterval { - return self.signIn.networkLossTimeoutInterval; -} - -- (BOOL)shouldUseKeychain { - NSString *name = self.keychainItemName; - return ([name length] > 0); -} - -@end - -#endif // #if !TARGET_OS_IPHONE - -#endif // #if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/ReleaseNotes.txt b/Paco-iOS/vendor/gtm-oauth2/Source/ReleaseNotes.txt deleted file mode 100644 index d4816a8e6..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/ReleaseNotes.txt +++ /dev/null @@ -1,132 +0,0 @@ -GTM OAuth 2 Release Notes - -Project site: http://code.google.com/p/gtm-oauth2/ -Discussion group: http://groups.google.com/group/gtm-oauth2 - -7-August-2012 - -Replaced initial html delay fix with a pending request mechanism. - -26-July-2012 - -Added popViewBlock property to GTMOAuth2ViewControllerTouch to allow -dismissing the view when it lacks a navigation controller. - - -13-April-2012 - -Support setting keychain accessibility for iOS. - - -4-April-2012 - -Add scope to persistenceResponseString so applications can inspect -the prior scope after loading the token from the keychain. - - -3-April-2012 - -Now pulls version 2.3.2 of SBJSON sources from github. - - -14-March-2012 - -Added notification on access token refresh. - - -7-October-2011 - -Added notifications for starting and stopping loads of UIWebView. - - -30-September-2011 - -Add brief delay to view controller to allow initial html to load. - - -21-September-2011 - -Added additionalTokenRequestParameters property to the authorization object. - -Updated the domain for clearing cookies when signing into Google services. - - -7-September-2011 - -Add support for token servers providing url-encoded responses (thanks ivo) - - -25-August-2011 - -Added convenience methods for creating autoreleased controllers. - - -24-August-2011 - -Fixed sign-in when Mac window controller displays as a standalone -modal window (thanks mirko) - - -2-August-2011 - -Projects may now define GTM_OAUTH2_SKIP_GOOGLE_SUPPORT to exclude -Google-specific code. The GTMOAuth2 project file also now includes -"non-Google" targets for building without Google-specific code. - - -18-July-2011 - -The authorization header now uses the "Bearer" prefix. - - -12-July-2011 - -Added an additionalAuthorizationParameters property to the SignIn class, used -by the sample apps to specify a display language for the sign-in pages. - - -20-June-2011 - -To avoid accidental leakage of tokens, the authentication object now -returns kGTMOAuth2ErrorUnauthorizableRequest when attempting to authorize -requests with schemes other than https. The property -shouldAuthorizeAllRequests can be set to override this and allow any -request to be authorized. - - -1-June-2011 - -Added Mac window controller property shouldAllowApplicationTermination - -Added user properties to window & view controllers. - -Fetchers may now optionally be created by a GTMHTTPFetcherService instance. - - -24-May-2011 - -Mac window controller now opens pop-up window links in an external browser -by default, and provides an externalRequestSelector property to let -the client provide custom handling. - - -4-May-2011 - -Addded support for services which provide access tokens, but no -refresh tokens. - - -Release 1.0.0 -6-April-2011 - -Initial public release. - - -JSON notes: - -This library currently relies on version 2.1.1 of SBJSON: - -http://json-framework.googlecode.com/svn/tags/2.1.1/Source/ - -The latest version of SBJSON is avaiilable at http://stig.github.com/json-framework/ - diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.h b/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.h deleted file mode 100644 index 8670b03cb..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.h +++ /dev/null @@ -1,398 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMOAuth2ViewControllerTouch.h -// -// This view controller for iPhone handles sign-in via OAuth to Google or -// other services. -// -// This controller is not reusable; create a new instance of this controller -// every time the user will sign in. -// - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -#import - -#if TARGET_OS_IPHONE - -#import - -#import "GTMOAuth2Authentication.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern NSString *const kGTMOAuth2KeychainErrorDomain; - -// Notifications that the view controller is swapping out and back in cookies. -// Apps may use this to avoid relying on the cookie store while view controller -// has them swapped out. -extern NSString *const kGTMOAuth2CookiesWillSwapOut; -extern NSString *const kGTMOAuth2CookiesDidSwapIn; - -#ifdef __cplusplus -} -#endif - -@class GTMOAuth2SignIn; -@class GTMOAuth2ViewControllerTouch; - -typedef void (^GTMOAuth2ViewControllerCompletionHandler)(GTMOAuth2ViewControllerTouch *viewController, GTMOAuth2Authentication *auth, NSError *error); - -@interface GTMOAuth2ViewControllerTouch : UIViewController { - @private - UIButton *backButton_; - UIButton *forwardButton_; - UIActivityIndicatorView *initialActivityIndicator_; - UIView *navButtonsView_; - UIBarButtonItem *rightBarButtonItem_; - UIWebView *webView_; - - // The object responsible for the sign-in networking sequence; it holds - // onto the authentication object as well. - GTMOAuth2SignIn *signIn_; - - // the page request to load when awakeFromNib occurs - NSURLRequest *request_; - - // The user we're calling back - // - // The delegate is retained only until the callback is invoked - // or the sign-in is canceled - id delegate_; - SEL finishedSelector_; - -#if NS_BLOCKS_AVAILABLE - GTMOAuth2ViewControllerCompletionHandler completionBlock_; - - void (^popViewBlock_)(void); -#endif - - NSString *keychainItemName_; - CFTypeRef keychainItemAccessibility_; - - // if non-nil, the html string to be displayed immediately upon opening - // of the web view - NSString *initialHTMLString_; - - // set to 1 or -1 if the user sets the showsInitialActivityIndicator - // property - int mustShowActivityIndicator_; - - // if non-nil, the URL for which cookies will be deleted when the - // browser view is dismissed - NSURL *browserCookiesURL_; - - id userData_; - NSMutableDictionary *properties_; - -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 - // We delegate the decision to our owning NavigationController (if any). - // But, the NavigationController will call us back, and ask us. - // BOOL keeps us from infinite looping. - BOOL isInsideShouldAutorotateToInterfaceOrientation_; -#endif - - // YES, when view first shown in this signIn session. - BOOL isViewShown_; - - // YES, after the view has fully transitioned in. - BOOL didViewAppear_; - - // YES between sends of start and stop notifications - BOOL hasNotifiedWebViewStartedLoading_; - - // To prevent us from calling our delegate's selector more than once. - BOOL hasCalledFinished_; - - // Set in a webView callback. - BOOL hasDoneFinalRedirect_; - - // Set during the pop initiated by the sign-in object; otherwise, - // viewWillDisappear indicates that some external change of the view - // has stopped the sign-in. - BOOL didDismissSelf_; - - // Work around default cookie policy bug in iOS 7; see comments in viewWillAppear. - NSHTTPCookieAcceptPolicy savedCookiePolicy_; -} - -// the application and service name to use for saving the auth tokens -// to the keychain -@property (nonatomic, copy) NSString *keychainItemName; - -// the keychain item accessibility is a system constant for use -// with kSecAttrAccessible. -// -// Since it's a system constant, we do not need to retain it. -@property (nonatomic, assign) CFTypeRef keychainItemAccessibility; - -// optional html string displayed immediately upon opening the web view -// -// This string is visible just until the sign-in web page loads, and -// may be used for a "Loading..." type of message or to set the -// initial view color -@property (nonatomic, copy) NSString *initialHTMLString; - -// an activity indicator shows during initial webview load when no initial HTML -// string is specified, but the activity indicator can be forced to be shown -// with this property -@property (nonatomic, assign) BOOL showsInitialActivityIndicator; - -// the underlying object to hold authentication tokens and authorize http -// requests -@property (nonatomic, retain, readonly) GTMOAuth2Authentication *authentication; - -// the underlying object which performs the sign-in networking sequence -@property (nonatomic, retain, readonly) GTMOAuth2SignIn *signIn; - -// user interface elements -@property (nonatomic, retain) IBOutlet UIButton *backButton; -@property (nonatomic, retain) IBOutlet UIButton *forwardButton; -@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *initialActivityIndicator; -@property (nonatomic, retain) IBOutlet UIView *navButtonsView; -@property (nonatomic, retain) IBOutlet UIBarButtonItem *rightBarButtonItem; -@property (nonatomic, retain) IBOutlet UIWebView *webView; - -#if NS_BLOCKS_AVAILABLE -// An optional block to be called when the view should be popped. If not set, -// the view controller will use its navigation controller to pop the view. -@property (nonatomic, copy) void (^popViewBlock)(void); -#endif - -// the default timeout for an unreachable network during display of the -// sign-in page is 30 seconds; set this to 0 to have no timeout -@property (nonatomic, assign) NSTimeInterval networkLossTimeoutInterval; - -// if set, cookies are deleted for this URL when the view is hidden -// -// This is now vestigial and ignored; all cookies are temporarily removed -// from cookie storage when sign-in begins. -@property (nonatomic, retain) NSURL *browserCookiesURL; - -// userData is retained for the convenience of the caller -@property (nonatomic, retain) id userData; - -// Stored property values are retained for the convenience of the caller -- (void)setProperty:(id)obj forKey:(NSString *)key; -- (id)propertyForKey:(NSString *)key; - -@property (nonatomic, retain) NSDictionary *properties; - -// Method for creating a controller to authenticate to Google services -// -// scope is the requested scope of authorization -// (like "http://www.google.com/m8/feeds") -// -// keychain item name is used for storing the token on the keychain, -// keychainItemName should be like "My Application: Google Latitude" -// (or set to nil if no persistent keychain storage is desired) -// -// the delegate is retained only until the finished selector is invoked -// or the sign-in is canceled -// -// If you don't like the default nibName and bundle, you can change them -// using the UIViewController properties once you've made one of these. -// -// finishedSelector is called after authentication completes. It should follow -// this signature. -// -// - (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController -// finishedWithAuth:(GTMOAuth2Authentication *)auth -// error:(NSError *)error; -// -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (id)controllerWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector; - -- (id)initWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector; - -#if NS_BLOCKS_AVAILABLE -+ (id)controllerWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler; - -- (id)initWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler; -#endif -#endif - -// Create a controller for authenticating to non-Google services, taking -// explicit endpoint URLs and an authentication object -+ (id)controllerWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName // may be nil - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector; - -// This is the designated initializer -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector; - -#if NS_BLOCKS_AVAILABLE -+ (id)controllerWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName // may be nil - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler; - -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler; -#endif - -// subclasses may override authNibName to specify a custom name -+ (NSString *)authNibName; - -// subclasses may override authNibBundle to specify a custom bundle -+ (NSBundle *)authNibBundle; - -// subclasses may override setUpNavigation to provide their own navigation -// controls -- (void)setUpNavigation; - -// Swaps out the system cookies. The default implementation saves the system -// cookies and then switches to the cookies used for sign-in, initally empty. -// -// subclasses may override swapOutCookies to implement their own cookie -// management scheme. -- (void)swapOutCookies; - -// Swaps in the system cookies that were swapped out. The default implementation -// saves the cookies used for sign-in and then restores the system cookies -// that were saved in |swapOutCookies|. -// -// subclasses may override swapInCookies to implement their own cookie -// management scheme. -- (void)swapInCookies; - -// apps may replace the sign-in class with their own subclass of it -+ (Class)signInClass; -+ (void)setSignInClass:(Class)theClass; - -- (void)cancelSigningIn; - -// revocation of an authorized token from Google -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (void)revokeTokenForGoogleAuthentication:(GTMOAuth2Authentication *)auth; -#endif - -// -// Keychain -// - -// create an authentication object for Google services from the access -// token and secret stored in the keychain; if no token is available, return -// an unauthorized auth object. OK to pass NULL for the error parameter. -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (GTMOAuth2Authentication *)authForGoogleFromKeychainForName:(NSString *)keychainItemName - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - error:(NSError **)error; -// Equivalent to calling the method above with a NULL error parameter. -+ (GTMOAuth2Authentication *)authForGoogleFromKeychainForName:(NSString *)keychainItemName - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret; -#endif - -// add tokens from the keychain, if available, to the authentication object -// -// returns YES if the authentication object was authorized from the keychain -+ (BOOL)authorizeFromKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)auth - error:(NSError **)error; - -// method for deleting the stored access token and secret, useful for "signing -// out" -+ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName; - -// method for saving the stored access token and secret -// -// returns YES if the save was successful. OK to pass NULL for the error -// parameter. -+ (BOOL)saveParamsToKeychainForName:(NSString *)keychainItemName - accessibility:(CFTypeRef)accessibility - authentication:(GTMOAuth2Authentication *)auth - error:(NSError **)error; - -// older version, defaults to kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly -+ (BOOL)saveParamsToKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)auth; - -@end - -// To function, GTMOAuth2ViewControllerTouch needs a certain amount of access -// to the iPhone's keychain. To keep things simple, its keychain access is -// broken out into a helper class. We declare it here in case you'd like to use -// it too, to store passwords. - -enum { - kGTMOAuth2KeychainErrorBadArguments = -1301, - kGTMOAuth2KeychainErrorNoPassword = -1302 -}; - - -@interface GTMOAuth2Keychain : NSObject - -+ (GTMOAuth2Keychain *)defaultKeychain; - -// OK to pass nil for the error parameter. -- (NSString *)passwordForService:(NSString *)service - account:(NSString *)account - error:(NSError **)error; - -// OK to pass nil for the error parameter. -- (BOOL)removePasswordForService:(NSString *)service - account:(NSString *)account - error:(NSError **)error; - -// OK to pass nil for the error parameter. -// -// accessibility should be one of the constants for kSecAttrAccessible -// such as kSecAttrAccessibleWhenUnlocked -- (BOOL)setPassword:(NSString *)password - forService:(NSString *)service - accessibility:(CFTypeRef)accessibility - account:(NSString *)account - error:(NSError **)error; - -// For unit tests: allow setting a mock object -+ (void)setDefaultKeychain:(GTMOAuth2Keychain *)keychain; - -@end - -#endif // TARGET_OS_IPHONE - -#endif // #if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.m b/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.m deleted file mode 100644 index 976e6cf71..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewControllerTouch.m +++ /dev/null @@ -1,1104 +0,0 @@ -/* Copyright (c) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file 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. - */ - -// -// GTMOAuth2ViewControllerTouch.m -// - -#import -#import - -#if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES - -#if TARGET_OS_IPHONE - -#import "GTMOAuth2ViewControllerTouch.h" - -#import "GTMOAuth2SignIn.h" -#import "GTMOAuth2Authentication.h" - -NSString *const kGTMOAuth2KeychainErrorDomain = @"com.google.GTMOAuthKeychain"; - -NSString *const kGTMOAuth2CookiesWillSwapOut = @"kGTMOAuth2CookiesWillSwapOut"; -NSString *const kGTMOAuth2CookiesDidSwapIn = @"kGTMOAuth2CookiesDidSwapIn"; - -static NSString * const kGTMOAuth2AccountName = @"OAuth"; -static GTMOAuth2Keychain* gGTMOAuth2DefaultKeychain = nil; - -@interface GTMOAuth2ViewControllerTouch() -@property (nonatomic, copy) NSURLRequest *request; -@property (nonatomic, copy) NSArray *systemCookies; -@property (nonatomic, copy) NSArray *signInCookies; -@end - -@implementation GTMOAuth2ViewControllerTouch - -// IBOutlets -@synthesize request = request_, - systemCookies = systemCookies_, - signInCookies = signInCookies_, - backButton = backButton_, - forwardButton = forwardButton_, - navButtonsView = navButtonsView_, - rightBarButtonItem = rightBarButtonItem_, - webView = webView_, - initialActivityIndicator = initialActivityIndicator_; - -@synthesize keychainItemName = keychainItemName_, - keychainItemAccessibility = keychainItemAccessibility_, - initialHTMLString = initialHTMLString_, - browserCookiesURL = browserCookiesURL_, - signIn = signIn_, - userData = userData_, - properties = properties_; - -#if NS_BLOCKS_AVAILABLE -@synthesize popViewBlock = popViewBlock_; -#endif - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (id)controllerWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector { - return [[[self alloc] initWithScope:scope - clientID:clientID - clientSecret:clientSecret - keychainItemName:keychainItemName - delegate:delegate - finishedSelector:finishedSelector] autorelease]; -} - -- (id)initWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector { - // convenient entry point for Google authentication - - Class signInClass = [[self class] signInClass]; - - GTMOAuth2Authentication *auth; - auth = [signInClass standardGoogleAuthenticationForScope:scope - clientID:clientID - clientSecret:clientSecret]; - NSURL *authorizationURL = [signInClass googleAuthorizationURL]; - return [self initWithAuthentication:auth - authorizationURL:authorizationURL - keychainItemName:keychainItemName - delegate:delegate - finishedSelector:finishedSelector]; -} - -#if NS_BLOCKS_AVAILABLE - -+ (id)controllerWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler { - return [[[self alloc] initWithScope:scope - clientID:clientID - clientSecret:clientSecret - keychainItemName:keychainItemName - completionHandler:handler] autorelease]; -} - -- (id)initWithScope:(NSString *)scope - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - keychainItemName:(NSString *)keychainItemName - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler { - // convenient entry point for Google authentication - - Class signInClass = [[self class] signInClass]; - - GTMOAuth2Authentication *auth; - auth = [signInClass standardGoogleAuthenticationForScope:scope - clientID:clientID - clientSecret:clientSecret]; - NSURL *authorizationURL = [signInClass googleAuthorizationURL]; - self = [self initWithAuthentication:auth - authorizationURL:authorizationURL - keychainItemName:keychainItemName - delegate:nil - finishedSelector:NULL]; - if (self) { - completionBlock_ = [handler copy]; - } - return self; -} - -#endif // NS_BLOCKS_AVAILABLE -#endif // !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT - -+ (id)controllerWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector { - return [[[self alloc] initWithAuthentication:auth - authorizationURL:authorizationURL - keychainItemName:keychainItemName - delegate:delegate - finishedSelector:finishedSelector] autorelease]; -} - -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - delegate:(id)delegate - finishedSelector:(SEL)finishedSelector { - - NSString *nibName = [[self class] authNibName]; - NSBundle *nibBundle = [[self class] authNibBundle]; - - self = [super initWithNibName:nibName bundle:nibBundle]; - if (self != nil) { - delegate_ = [delegate retain]; - finishedSelector_ = finishedSelector; - - Class signInClass = [[self class] signInClass]; - - // use the supplied auth and OAuth endpoint URLs - signIn_ = [[signInClass alloc] initWithAuthentication:auth - authorizationURL:authorizationURL - delegate:self - webRequestSelector:@selector(signIn:displayRequest:) - finishedSelector:@selector(signIn:finishedWithAuth:error:)]; - - [self setKeychainItemName:keychainItemName]; - - savedCookiePolicy_ = (NSHTTPCookieAcceptPolicy)NSUIntegerMax; - } - return self; -} - -#if NS_BLOCKS_AVAILABLE -+ (id)controllerWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler { - return [[[self alloc] initWithAuthentication:auth - authorizationURL:authorizationURL - keychainItemName:keychainItemName - completionHandler:handler] autorelease]; -} - -- (id)initWithAuthentication:(GTMOAuth2Authentication *)auth - authorizationURL:(NSURL *)authorizationURL - keychainItemName:(NSString *)keychainItemName - completionHandler:(GTMOAuth2ViewControllerCompletionHandler)handler { - // fall back to the non-blocks init - self = [self initWithAuthentication:auth - authorizationURL:authorizationURL - keychainItemName:keychainItemName - delegate:nil - finishedSelector:NULL]; - if (self) { - completionBlock_ = [handler copy]; - } - return self; -} -#endif - -- (void)dealloc { - [webView_ setDelegate:nil]; - - [backButton_ release]; - [forwardButton_ release]; - [initialActivityIndicator_ release]; - [navButtonsView_ release]; - [rightBarButtonItem_ release]; - [webView_ stopLoading]; - [webView_ release]; - [signIn_ release]; - [request_ release]; - [systemCookies_ release]; - [signInCookies_ release]; - [delegate_ release]; -#if NS_BLOCKS_AVAILABLE - [completionBlock_ release]; - [popViewBlock_ release]; -#endif - [keychainItemName_ release]; - [initialHTMLString_ release]; - [browserCookiesURL_ release]; - [userData_ release]; - [properties_ release]; - - [super dealloc]; -} - -+ (NSString *)authNibName { - // subclasses may override this to specify a custom nib name - return @"GTMOAuth2ViewTouch"; -} - -+ (NSBundle *)authNibBundle { - // subclasses may override this to specify a custom nib bundle - return nil; -} - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (GTMOAuth2Authentication *)authForGoogleFromKeychainForName:(NSString *)keychainItemName - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret { - return [self authForGoogleFromKeychainForName:keychainItemName - clientID:clientID - clientSecret:clientSecret - error:NULL]; -} - -+ (GTMOAuth2Authentication *)authForGoogleFromKeychainForName:(NSString *)keychainItemName - clientID:(NSString *)clientID - clientSecret:(NSString *)clientSecret - error:(NSError **)error { - Class signInClass = [self signInClass]; - NSURL *tokenURL = [signInClass googleTokenURL]; - NSString *redirectURI = [signInClass nativeClientRedirectURI]; - - GTMOAuth2Authentication *auth; - auth = [GTMOAuth2Authentication authenticationWithServiceProvider:kGTMOAuth2ServiceProviderGoogle - tokenURL:tokenURL - redirectURI:redirectURI - clientID:clientID - clientSecret:clientSecret]; - [[self class] authorizeFromKeychainForName:keychainItemName - authentication:auth - error:error]; - return auth; -} - -#endif - -+ (BOOL)authorizeFromKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)newAuth - error:(NSError **)error { - newAuth.accessToken = nil; - - BOOL didGetTokens = NO; - GTMOAuth2Keychain *keychain = [GTMOAuth2Keychain defaultKeychain]; - NSString *password = [keychain passwordForService:keychainItemName - account:kGTMOAuth2AccountName - error:error]; - if (password != nil) { - [newAuth setKeysForResponseString:password]; - didGetTokens = YES; - } - return didGetTokens; -} - -+ (BOOL)removeAuthFromKeychainForName:(NSString *)keychainItemName { - GTMOAuth2Keychain *keychain = [GTMOAuth2Keychain defaultKeychain]; - return [keychain removePasswordForService:keychainItemName - account:kGTMOAuth2AccountName - error:nil]; -} - -+ (BOOL)saveParamsToKeychainForName:(NSString *)keychainItemName - authentication:(GTMOAuth2Authentication *)auth { - return [self saveParamsToKeychainForName:keychainItemName - accessibility:NULL - authentication:auth - error:NULL]; -} - -+ (BOOL)saveParamsToKeychainForName:(NSString *)keychainItemName - accessibility:(CFTypeRef)accessibility - authentication:(GTMOAuth2Authentication *)auth - error:(NSError **)error { - [self removeAuthFromKeychainForName:keychainItemName]; - // don't save unless we have a token that can really authorize requests - if (![auth canAuthorize]) { - if (error) { - *error = [NSError errorWithDomain:kGTMOAuth2ErrorDomain - code:kGTMOAuth2ErrorTokenUnavailable - userInfo:nil]; - } - return NO; - } - - if (accessibility == NULL - && &kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly != NULL) { - accessibility = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly; - } - - // make a response string containing the values we want to save - NSString *password = [auth persistenceResponseString]; - GTMOAuth2Keychain *keychain = [GTMOAuth2Keychain defaultKeychain]; - return [keychain setPassword:password - forService:keychainItemName - accessibility:accessibility - account:kGTMOAuth2AccountName - error:error]; -} - -- (void)loadView { - NSString *nibPath = nil; - NSBundle *nibBundle = [self nibBundle]; - if (nibBundle == nil) { - nibBundle = [NSBundle mainBundle]; - } - NSString *nibName = self.nibName; - if (nibName != nil) { - nibPath = [nibBundle pathForResource:nibName ofType:@"nib"]; - } - if (nibPath != nil && [[NSFileManager defaultManager] fileExistsAtPath:nibPath]) { - [super loadView]; - } else { - // One of the requirements of loadView is that a valid view object is set to - // self.view upon completion. Otherwise, subclasses that attempt to - // access self.view after calling [super loadView] will enter an infinite - // loop due to the fact that UIViewController's -view accessor calls - // loadView when self.view is nil. - self.view = [[[UIView alloc] init] autorelease]; - -#if DEBUG - NSLog(@"missing %@.nib", nibName); -#endif - } -} - - -- (void)viewDidLoad { - [super viewDidLoad]; - [self setUpNavigation]; -} - -- (void)setUpNavigation { - rightBarButtonItem_.customView = navButtonsView_; - self.navigationItem.rightBarButtonItem = rightBarButtonItem_; -} - -- (void)popView { -#if NS_BLOCKS_AVAILABLE - void (^popViewBlock)() = self.popViewBlock; -#else - id popViewBlock = nil; -#endif - - if (popViewBlock || self.navigationController.topViewController == self) { - if (!self.view.hidden) { - // Set the flag to our viewWillDisappear method so it knows - // this is a disappearance initiated by the sign-in object, - // not the user cancelling via the navigation controller - didDismissSelf_ = YES; - - if (popViewBlock) { -#if NS_BLOCKS_AVAILABLE - popViewBlock(); - self.popViewBlock = nil; -#endif - } else { - [self.navigationController popViewControllerAnimated:YES]; - } - self.view.hidden = YES; - } - } -} - -- (void)notifyWithName:(NSString *)name - webView:(UIWebView *)webView - kind:(NSString *)kind { - BOOL isStarting = [name isEqual:kGTMOAuth2WebViewStartedLoading]; - if (hasNotifiedWebViewStartedLoading_ == isStarting) { - // Duplicate notification - // - // UIWebView's delegate methods are so unbalanced that there's little - // point trying to keep a count, as it could easily end up stuck greater - // than zero. - // - // We don't really have a way to track the starts and stops of - // subframe loads, too, as the webView in the notification is always - // for the topmost request. - return; - } - hasNotifiedWebViewStartedLoading_ = isStarting; - - // Notification for webview load starting and stopping - NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: - webView, kGTMOAuth2WebViewKey, - kind, kGTMOAuth2WebViewStopKindKey, // kind may be nil - nil]; - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:name - object:self - userInfo:dict]; -} - -- (void)cancelSigningIn { - // The application has explicitly asked us to cancel signing in - // (so no further callback is required) - hasCalledFinished_ = YES; - - [delegate_ autorelease]; - delegate_ = nil; - -#if NS_BLOCKS_AVAILABLE - [completionBlock_ autorelease]; - completionBlock_ = nil; -#endif - - // The sign-in object's cancel method will close the window - [signIn_ cancelSigningIn]; - hasDoneFinalRedirect_ = YES; -} - -static Class gSignInClass = Nil; - -+ (Class)signInClass { - if (gSignInClass == Nil) { - gSignInClass = [GTMOAuth2SignIn class]; - } - return gSignInClass; -} - -+ (void)setSignInClass:(Class)theClass { - gSignInClass = theClass; -} - -#pragma mark Token Revocation - -#if !GTM_OAUTH2_SKIP_GOOGLE_SUPPORT -+ (void)revokeTokenForGoogleAuthentication:(GTMOAuth2Authentication *)auth { - [[self signInClass] revokeTokenForGoogleAuthentication:auth]; -} -#endif - -#pragma mark Browser Cookies - -- (GTMOAuth2Authentication *)authentication { - return self.signIn.authentication; -} - -- (void)swapOutCookies { - // Switch to the cookie set used for sign-in, initially empty. - self.systemCookies = [self swapBrowserCookies:self.signInCookies]; -} - -- (void)swapInCookies { - // Switch back to the saved system cookies. - self.signInCookies = [self swapBrowserCookies:self.systemCookies]; -} - -- (NSArray *)swapBrowserCookies:(NSArray *)newCookies { - NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - - NSHTTPCookieAcceptPolicy savedPolicy = [cookieStorage cookieAcceptPolicy]; - [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; - - NSArray *priorCookies = [[[cookieStorage cookies] copy] autorelease]; - for (NSHTTPCookie *cookie in priorCookies) { - [cookieStorage deleteCookie:cookie]; - } - for (NSHTTPCookie *cookie in newCookies) { - [cookieStorage setCookie:cookie]; - } - - [cookieStorage setCookieAcceptPolicy:savedPolicy]; - - return priorCookies; -} - -#pragma mark Accessors - -- (void)setNetworkLossTimeoutInterval:(NSTimeInterval)val { - signIn_.networkLossTimeoutInterval = val; -} - -- (NSTimeInterval)networkLossTimeoutInterval { - return signIn_.networkLossTimeoutInterval; -} - -- (BOOL)shouldUseKeychain { - NSString *name = self.keychainItemName; - return ([name length] > 0); -} - -- (BOOL)showsInitialActivityIndicator { - return (mustShowActivityIndicator_ == 1 || initialHTMLString_ == nil); -} - -- (void)setShowsInitialActivityIndicator:(BOOL)flag { - mustShowActivityIndicator_ = (flag ? 1 : -1); -} - -#pragma mark User Properties - -- (void)setProperty:(id)obj forKey:(NSString *)key { - if (obj == nil) { - // User passed in nil, so delete the property - [properties_ removeObjectForKey:key]; - } else { - // Be sure the property dictionary exists - if (properties_ == nil) { - [self setProperties:[NSMutableDictionary dictionary]]; - } - [properties_ setObject:obj forKey:key]; - } -} - -- (id)propertyForKey:(NSString *)key { - id obj = [properties_ objectForKey:key]; - - // Be sure the returned pointer has the life of the autorelease pool, - // in case self is released immediately - return [[obj retain] autorelease]; -} - -#pragma mark SignIn callbacks - -- (void)signIn:(GTMOAuth2SignIn *)signIn displayRequest:(NSURLRequest *)request { - // This is the signIn object's webRequest method, telling the controller - // to either display the request in the webview, or if the request is nil, - // to close the window. - // - // All web requests and all window closing goes through this routine - -#if DEBUG - if (self.navigationController) { - if (self.navigationController.topViewController != self && request != nil) { - NSLog(@"Unexpected: Request to show, when already on top. request %@", [request URL]); - } else if(self.navigationController.topViewController != self && request == nil) { - NSLog(@"Unexpected: Request to pop, when not on top. request nil"); - } - } -#endif - - if (request != nil) { - const NSTimeInterval kJanuary2011 = 1293840000; - BOOL isDateValid = ([[NSDate date] timeIntervalSince1970] > kJanuary2011); - if (isDateValid) { - // Display the request. - self.request = request; - // The app may prefer some html other than blank white to be displayed - // before the sign-in web page loads. - // The first fetch might be slow, so the client programmer may want - // to show a local "loading" message. - // On iOS 5+, UIWebView will ignore loadHTMLString: if it's followed by - // a loadRequest: call, so if there is a "loading" message we defer - // the loadRequest: until after after we've drawn the "loading" message. - // - // If there is no initial html string, we show the activity indicator - // unless the user set showsInitialActivityIndicator to NO; if there - // is an initial html string, we hide the indicator unless the user set - // showsInitialActivityIndicator to YES. - NSString *html = self.initialHTMLString; - if ([html length] > 0) { - [initialActivityIndicator_ setHidden:(mustShowActivityIndicator_ < 1)]; - [self.webView loadHTMLString:html baseURL:nil]; - } else { - [initialActivityIndicator_ setHidden:(mustShowActivityIndicator_ < 0)]; - [self.webView loadRequest:request]; - } - } else { - // clock date is invalid, so signing in would fail with an unhelpful error - // from the server. Warn the user in an html string showing a watch icon, - // question mark, and the system date and time. Hopefully this will clue - // in brighter users, or at least give them a clue when they report the - // problem to developers. - // - // Even better is for apps to check the system clock and show some more - // helpful, localized instructions for users; this is really a fallback. - NSString *const html = @"
" - @"⌚ ?
System Clock Incorrect
%@" - @"
"; - NSString *errHTML = [NSString stringWithFormat:html, [NSDate date]]; - - [[self webView] loadHTMLString:errHTML baseURL:nil]; - } - } else { - // request was nil. - [self popView]; - } -} - -- (void)signIn:(GTMOAuth2SignIn *)signIn - finishedWithAuth:(GTMOAuth2Authentication *)auth - error:(NSError *)error { - if (!hasCalledFinished_) { - hasCalledFinished_ = YES; - - if (error == nil) { - if (self.shouldUseKeychain) { - NSString *keychainItemName = self.keychainItemName; - if (auth.canAuthorize) { - // save the auth params in the keychain - CFTypeRef accessibility = self.keychainItemAccessibility; - [[self class] saveParamsToKeychainForName:keychainItemName - accessibility:accessibility - authentication:auth - error:NULL]; - } else { - // remove the auth params from the keychain - [[self class] removeAuthFromKeychainForName:keychainItemName]; - } - } - } - - if (delegate_ && finishedSelector_) { - SEL sel = finishedSelector_; - NSMethodSignature *sig = [delegate_ methodSignatureForSelector:sel]; - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; - [invocation setSelector:sel]; - [invocation setTarget:delegate_]; - [invocation setArgument:&self atIndex:2]; - [invocation setArgument:&auth atIndex:3]; - [invocation setArgument:&error atIndex:4]; - [invocation invoke]; - } - - [delegate_ autorelease]; - delegate_ = nil; - -#if NS_BLOCKS_AVAILABLE - if (completionBlock_) { - completionBlock_(self, auth, error); - - // release the block here to avoid a retain loop on the controller - [completionBlock_ autorelease]; - completionBlock_ = nil; - } -#endif - } -} - -- (void)moveWebViewFromUnderNavigationBar { - CGRect dontCare; - CGRect webFrame = self.view.bounds; - UINavigationBar *navigationBar = self.navigationController.navigationBar; - CGRectDivide(webFrame, &dontCare, &webFrame, - navigationBar.frame.size.height, CGRectMinYEdge); - [self.webView setFrame:webFrame]; -} - -// isTranslucent is defined in iPhoneOS 3.0 on. -- (BOOL)isNavigationBarTranslucent { - UINavigationBar *navigationBar = [[self navigationController] navigationBar]; - BOOL isTranslucent = - ([navigationBar respondsToSelector:@selector(isTranslucent)] && - [navigationBar isTranslucent]); - return isTranslucent; -} - -#pragma mark - -#pragma mark Protocol implementations - -- (void)viewWillAppear:(BOOL)animated { - // See the comment on clearBrowserCookies in viewWillDisappear. - [[NSNotificationCenter defaultCenter] postNotificationName:kGTMOAuth2CookiesWillSwapOut - object:self - userInfo:nil]; - [self swapOutCookies]; - - if (!isViewShown_) { - isViewShown_ = YES; - if ([self isNavigationBarTranslucent]) { - [self moveWebViewFromUnderNavigationBar]; - } - if (![signIn_ startSigningIn]) { - // Can't start signing in. We must pop our view. - // UIWebview needs time to stabilize. Animations need time to complete. - // We remove ourself from the view stack after that. - [self performSelector:@selector(popView) - withObject:nil - afterDelay:0.5 - inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; - } - - // Work around iOS 7.0 bug described in https://devforums.apple.com/thread/207323 by temporarily - // setting our cookie storage policy to be permissive enough to keep the sign-in server - // satisfied, just in case the app inherited from Safari a policy that blocks all cookies. - NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - NSHTTPCookieAcceptPolicy policy = [storage cookieAcceptPolicy]; - if (policy == NSHTTPCookieAcceptPolicyNever) { - savedCookiePolicy_ = policy; - [storage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain]; - } - } - - [super viewWillAppear:animated]; -} - -- (void)viewDidAppear:(BOOL)animated { - didViewAppear_ = YES; - [super viewDidAppear:animated]; -} - -- (void)viewWillDisappear:(BOOL)animated { - if (![self isBeingObscured:self]) { - if (!didDismissSelf_) { - // We won't receive further webview delegate messages, so be sure the - // started loading notification is balanced, if necessary - [self notifyWithName:kGTMOAuth2WebViewStoppedLoading - webView:self.webView - kind:kGTMOAuth2WebViewCancelled]; - - // We are not popping ourselves, so presumably we are being popped by the - // navigation controller; tell the sign-in object to close up shop - // - // this will indirectly call our signIn:finishedWithAuth:error: method - // for us - [signIn_ windowWasClosed]; - -#if NS_BLOCKS_AVAILABLE - self.popViewBlock = nil; -#endif - } - - if (savedCookiePolicy_ != (NSHTTPCookieAcceptPolicy)NSUIntegerMax) { - NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - [storage setCookieAcceptPolicy:savedCookiePolicy_]; - savedCookiePolicy_ = (NSHTTPCookieAcceptPolicy)NSUIntegerMax; - } - } - - [self swapInCookies]; - [[NSNotificationCenter defaultCenter] postNotificationName:kGTMOAuth2CookiesDidSwapIn - object:self - userInfo:nil]; - [super viewWillDisappear:animated]; -} - -- (BOOL)isBeingObscured:(UIViewController *)vc { - // Check if this view controller, or an ancestor, is being disappearing because - // of being obscured by another view. - if ([vc isBeingDismissed] || [vc isMovingFromParentViewController]) { - return NO; - } - UIViewController *parentVC = vc.parentViewController; - if (parentVC) { - return [self isBeingObscured:parentVC]; - } - return YES; -} - -- (void)viewDidLayoutSubviews { - // We don't call super's version of this method because - // -[UIViewController viewDidLayoutSubviews] is documented as a no-op, that - // didn't exist before iOS 5. - [initialActivityIndicator_ setCenter:[webView_ center]]; -} - -- (BOOL)webView:(UIWebView *)webView - shouldStartLoadWithRequest:(NSURLRequest *)request - navigationType:(UIWebViewNavigationType)navigationType { - - if (!hasDoneFinalRedirect_) { - hasDoneFinalRedirect_ = [signIn_ requestRedirectedToRequest:request]; - if (hasDoneFinalRedirect_) { - // signIn has told the view to close - return NO; - } - } - return YES; -} - -- (void)updateUI { - [backButton_ setEnabled:[[self webView] canGoBack]]; - [forwardButton_ setEnabled:[[self webView] canGoForward]]; -} - -- (void)webViewDidStartLoad:(UIWebView *)webView { - [self notifyWithName:kGTMOAuth2WebViewStartedLoading - webView:webView - kind:nil]; - [self updateUI]; -} - -- (void)webViewDidFinishLoad:(UIWebView *)webView { - [self notifyWithName:kGTMOAuth2WebViewStoppedLoading - webView:webView - kind:kGTMOAuth2WebViewFinished]; - - NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; - if ([title length] > 0) { - [signIn_ titleChanged:title]; - } else { -#if DEBUG && !defined(NS_BLOCK_ASSERTIONS) - // Verify that Javascript is enabled - NSString *result = [webView stringByEvaluatingJavaScriptFromString:@"1+1"]; - NSAssert([result integerValue] == 2, @"GTMOAuth2: Javascript is required"); -#endif // DEBUG && !defined(NS_BLOCK_ASSERTIONS) - } - - if (self.request && [self.initialHTMLString length] > 0) { - // The request was pending. - [self setInitialHTMLString:nil]; - [self.webView loadRequest:self.request]; - } else { - [initialActivityIndicator_ setHidden:YES]; - [signIn_ cookiesChanged:[NSHTTPCookieStorage sharedHTTPCookieStorage]]; - - [self updateUI]; - } -} - -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { - [self notifyWithName:kGTMOAuth2WebViewStoppedLoading - webView:webView - kind:kGTMOAuth2WebViewFailed]; - - // Tell the sign-in object that a load failed; if it was the authorization - // URL, it will pop the view and return an error to the delegate. - if (didViewAppear_) { - BOOL isUserInterruption = ([error code] == NSURLErrorCancelled - && [[error domain] isEqual:NSURLErrorDomain]); - if (isUserInterruption) { - // Ignore this error: - // Users report that this error occurs when clicking too quickly on the - // accept button, before the page has completely loaded. Ignoring - // this error seems to provide a better experience than does immediately - // cancelling sign-in. - // - // This error also occurs whenever UIWebView is sent the stopLoading - // message, so if we ever send that message intentionally, we need to - // revisit this bypass. - return; - } - - [signIn_ loadFailedWithError:error]; - } else { - // UIWebview needs time to stabilize. Animations need time to complete. - [signIn_ performSelector:@selector(loadFailedWithError:) - withObject:error - afterDelay:0.5 - inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]]; - } -} - -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 -// When running on a device with an OS version < 6, this gets called. -// -// Since it is never called in iOS 6 or greater, if your min deployment -// target is iOS6 or greater, then you don't need to have this method compiled -// into your app. -// -// When running on a device with an OS version 6 or greater, this code is -// not called. - (NSUInteger)supportedInterfaceOrientations; would be called, -// if it existed. Since it is absent, -// Allow the default orientations: All for iPad, all but upside down for iPhone. -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - BOOL value = YES; - if (!isInsideShouldAutorotateToInterfaceOrientation_) { - isInsideShouldAutorotateToInterfaceOrientation_ = YES; - UIViewController *navigationController = [self navigationController]; - if (navigationController != nil) { - value = [navigationController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; - } else { - value = [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; - } - isInsideShouldAutorotateToInterfaceOrientation_ = NO; - } - return value; -} -#endif - - -@end - - -#pragma mark Common Code - -@implementation GTMOAuth2Keychain - -+ (GTMOAuth2Keychain *)defaultKeychain { - if (gGTMOAuth2DefaultKeychain == nil) { - gGTMOAuth2DefaultKeychain = [[self alloc] init]; - } - return gGTMOAuth2DefaultKeychain; -} - - -// For unit tests: allow setting a mock object -+ (void)setDefaultKeychain:(GTMOAuth2Keychain *)keychain { - if (gGTMOAuth2DefaultKeychain != keychain) { - [gGTMOAuth2DefaultKeychain release]; - gGTMOAuth2DefaultKeychain = [keychain retain]; - } -} - -- (NSString *)keyForService:(NSString *)service account:(NSString *)account { - return [NSString stringWithFormat:@"com.google.GTMOAuth.%@%@", service, account]; -} - -// The Keychain API isn't available on the iPhone simulator in SDKs before 3.0, -// so, on early simulators we use a fake API, that just writes, unencrypted, to -// NSUserDefaults. -#if TARGET_IPHONE_SIMULATOR && __IPHONE_OS_VERSION_MAX_ALLOWED < 30000 -#pragma mark Simulator - -// Simulator - just simulated, not secure. -- (NSString *)passwordForService:(NSString *)service account:(NSString *)account error:(NSError **)error { - NSString *result = nil; - if (0 < [service length] && 0 < [account length]) { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *key = [self keyForService:service account:account]; - result = [defaults stringForKey:key]; - if (result == nil && error != NULL) { - *error = [NSError errorWithDomain:kGTMOAuth2KeychainErrorDomain - code:kGTMOAuth2KeychainErrorNoPassword - userInfo:nil]; - } - } else if (error != NULL) { - *error = [NSError errorWithDomain:kGTMOAuth2KeychainErrorDomain - code:kGTMOAuth2KeychainErrorBadArguments - userInfo:nil]; - } - return result; - -} - - -// Simulator - just simulated, not secure. -- (BOOL)removePasswordForService:(NSString *)service account:(NSString *)account error:(NSError **)error { - BOOL didSucceed = NO; - if (0 < [service length] && 0 < [account length]) { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *key = [self keyForService:service account:account]; - [defaults removeObjectForKey:key]; - [defaults synchronize]; - } else if (error != NULL) { - *error = [NSError errorWithDomain:kGTMOAuth2KeychainErrorDomain - code:kGTMOAuth2KeychainErrorBadArguments - userInfo:nil]; - } - return didSucceed; -} - -// Simulator - just simulated, not secure. -- (BOOL)setPassword:(NSString *)password - forService:(NSString *)service - accessibility:(CFTypeRef)accessibility - account:(NSString *)account - error:(NSError **)error { - BOOL didSucceed = NO; - if (0 < [password length] && 0 < [service length] && 0 < [account length]) { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSString *key = [self keyForService:service account:account]; - [defaults setObject:password forKey:key]; - [defaults synchronize]; - didSucceed = YES; - } else if (error != NULL) { - *error = [NSError errorWithDomain:kGTMOAuth2KeychainErrorDomain - code:kGTMOAuth2KeychainErrorBadArguments - userInfo:nil]; - } - return didSucceed; -} - -#else // ! TARGET_IPHONE_SIMULATOR -#pragma mark Device - -+ (NSMutableDictionary *)keychainQueryForService:(NSString *)service account:(NSString *)account { - NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys: - (id)kSecClassGenericPassword, (id)kSecClass, - @"OAuth", (id)kSecAttrGeneric, - account, (id)kSecAttrAccount, - service, (id)kSecAttrService, - nil]; - return query; -} - -- (NSMutableDictionary *)keychainQueryForService:(NSString *)service account:(NSString *)account { - return [[self class] keychainQueryForService:service account:account]; -} - - - -// iPhone -- (NSString *)passwordForService:(NSString *)service account:(NSString *)account error:(NSError **)error { - OSStatus status = kGTMOAuth2KeychainErrorBadArguments; - NSString *result = nil; - if (0 < [service length] && 0 < [account length]) { - CFDataRef passwordData = NULL; - NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; - [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; - [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; - - status = SecItemCopyMatching((CFDictionaryRef)keychainQuery, - (CFTypeRef *)&passwordData); - if (status == noErr && 0 < [(NSData *)passwordData length]) { - result = [[[NSString alloc] initWithData:(NSData *)passwordData - encoding:NSUTF8StringEncoding] autorelease]; - } - if (passwordData != NULL) { - CFRelease(passwordData); - } - } - if (status != noErr && error != NULL) { - *error = [NSError errorWithDomain:kGTMOAuth2KeychainErrorDomain - code:status - userInfo:nil]; - } - return result; -} - - -// iPhone -- (BOOL)removePasswordForService:(NSString *)service account:(NSString *)account error:(NSError **)error { - OSStatus status = kGTMOAuth2KeychainErrorBadArguments; - if (0 < [service length] && 0 < [account length]) { - NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; - status = SecItemDelete((CFDictionaryRef)keychainQuery); - } - if (status != noErr && error != NULL) { - *error = [NSError errorWithDomain:kGTMOAuth2KeychainErrorDomain - code:status - userInfo:nil]; - } - return status == noErr; -} - -// iPhone -- (BOOL)setPassword:(NSString *)password - forService:(NSString *)service - accessibility:(CFTypeRef)accessibility - account:(NSString *)account - error:(NSError **)error { - OSStatus status = kGTMOAuth2KeychainErrorBadArguments; - if (0 < [service length] && 0 < [account length]) { - [self removePasswordForService:service account:account error:nil]; - if (0 < [password length]) { - NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; - NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding]; - [keychainQuery setObject:passwordData forKey:(id)kSecValueData]; - - if (accessibility != NULL && &kSecAttrAccessible != NULL) { - [keychainQuery setObject:(id)accessibility - forKey:(id)kSecAttrAccessible]; - } - status = SecItemAdd((CFDictionaryRef)keychainQuery, NULL); - } - } - if (status != noErr && error != NULL) { - *error = [NSError errorWithDomain:kGTMOAuth2KeychainErrorDomain - code:status - userInfo:nil]; - } - return status == noErr; -} - -#endif // ! TARGET_IPHONE_SIMULATOR - -@end - -#endif // TARGET_OS_IPHONE - -#endif // #if GTM_INCLUDE_OAUTH2 || !GDATA_REQUIRE_SERVICE_INCLUDES diff --git a/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewTouch.xib b/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewTouch.xib deleted file mode 100644 index 4f91fa4ad..000000000 --- a/Paco-iOS/vendor/gtm-oauth2/Source/Touch/GTMOAuth2ViewTouch.xib +++ /dev/null @@ -1,494 +0,0 @@ - - - - 1024 - 12C60 - 2840 - 1187.34 - 625.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1926 - - - YES - IBProxyObject - IBUIActivityIndicatorView - IBUIBarButtonItem - IBUIButton - IBUINavigationItem - IBUIView - IBUIWebView - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - OAuth - IBCocoaTouchFramework - - - IBCocoaTouchFramework - 1 - - - - 292 - - YES - - - 292 - {30, 30} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - {0, -2} - - - 3 - MQA - - - 2 - MC41OTYwNzg0NiAwLjY4NjI3NDUzIDAuOTUyOTQxMjQgMC42MDAwMDAwMgA - - - - 3 - MC41AA - - - Helvetica-Bold - Helvetica - 2 - 24 - - - Helvetica-Bold - 24 - 16 - - - - - 292 - {{30, 0}, {30, 30}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - {0, -2} - - - - 2 - MC41ODQzMTM3NSAwLjY3NDUwOTgyIDAuOTUyOTQxMjQgMC42MDAwMDAwMgA - - - - - - - - {60, 30} - - - - - 3 - MSAwAA - - NO - NO - - 3 - 3 - - IBCocoaTouchFramework - - - - 274 - - YES - - - 274 - {320, 460} - - - - - 1 - MSAxIDEAA - - YES - YES - IBCocoaTouchFramework - 1 - YES - - - - 301 - {{150, 115}, {20, 20}} - - - - _NS:9 - NO - IBCocoaTouchFramework - NO - YES - 2 - - - {320, 460} - - - - - 3 - MQA - - 2 - - - IBCocoaTouchFramework - - - - - YES - - - rightBarButtonItem - - - - 20 - - - - navButtonsView - - - - 22 - - - - backButton - - - - 25 - - - - forwardButton - - - - 26 - - - - view - - - - 28 - - - - webView - - - - 29 - - - - initialActivityIndicator - - - - 33 - - - - delegate - - - - 9 - - - - rightBarButtonItem - - - - 14 - - - - goBack - - - 7 - - 18 - - - - goForward - - - 7 - - 19 - - - - - YES - - 0 - - YES - - - - - - -1 - - - File's Owner - - - -2 - - - - - 6 - - - YES - - - - - 10 - - - - - 15 - - - YES - - - - - - - 16 - - - - - 17 - - - - - 27 - - - YES - - - - - - - 4 - - - - - 31 - - - - - - - YES - - YES - -1.CustomClassName - -1.IBPluginDependency - -2.CustomClassName - -2.IBPluginDependency - 10.IBPluginDependency - 15.IBPluginDependency - 16.IBPluginDependency - 17.IBPluginDependency - 27.IBPluginDependency - 31.IBPluginDependency - 4.IBPluginDependency - 6.IBPluginDependency - - - YES - GTMOAuth2ViewControllerTouch - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - - - - YES - - - - - 33 - - - - YES - - GTMOAuth2ViewControllerTouch - UIViewController - - YES - - YES - backButton - forwardButton - initialActivityIndicator - navButtonsView - rightBarButtonItem - webView - - - YES - UIButton - UIButton - UIActivityIndicatorView - UIView - UIBarButtonItem - UIWebView - - - - YES - - YES - backButton - forwardButton - initialActivityIndicator - navButtonsView - rightBarButtonItem - webView - - - YES - - backButton - UIButton - - - forwardButton - UIButton - - - initialActivityIndicator - UIActivityIndicatorView - - - navButtonsView - UIView - - - rightBarButtonItem - UIBarButtonItem - - - webView - UIWebView - - - - - IBProjectSource - ./Classes/GTMOAuth2ViewControllerTouch.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 1926 - - diff --git a/Paco-iOS/vendor/sskeychain/SSKeychain.h b/Paco-iOS/vendor/sskeychain/SSKeychain.h deleted file mode 100755 index ae9360cf0..000000000 --- a/Paco-iOS/vendor/sskeychain/SSKeychain.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - Copyright (c) 2010-2013 Sam Soffes. - - 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 "SSKeychainQuery.h" - -/** - Error code specific to SSKeychain that can be returned in NSError objects. - For codes returned by the operating system, refer to SecBase.h for your - platform. - */ -typedef enum { - - /** Some of the arguments were invalid. */ - SSKeychainErrorBadArguments = -1001, - -} SSKeychainErrorCode; - -/** SSKeychain error domain */ -extern NSString *const kSSKeychainErrorDomain; - -/** Account name. */ -extern NSString *const kSSKeychainAccountKey; - -/** - Time the item was created. - - The value will be a string. - */ -extern NSString *const kSSKeychainCreatedAtKey; - -/** Item class. */ -extern NSString *const kSSKeychainClassKey; - -/** Item description. */ -extern NSString *const kSSKeychainDescriptionKey; - -/** Item label. */ -extern NSString *const kSSKeychainLabelKey; - -/** Time the item was last modified. - - The value will be a string. - */ -extern NSString *const kSSKeychainLastModifiedKey; - -/** Where the item was created. */ -extern NSString *const kSSKeychainWhereKey; - -/** - Simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system - Keychain on Mac OS X and iOS. - - This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. - SSKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](http://sstoolk.it). - */ -@interface SSKeychain : NSObject - -#pragma mark - Classic methods - -/** - Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't have a - password for the given parameters. - - @param serviceName The service for which to return the corresponding password. - - @param account The account for which to return the corresponding password. - - @return Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't - have a password for the given parameters. - */ -+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account; -+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error; - - -/** - Deletes a password from the Keychain. - - @param serviceName The service for which to delete the corresponding password. - - @param account The account for which to delete the corresponding password. - - @return Returns `YES` on success, or `NO` on failure. - */ -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account; -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error; - - -/** - Sets a password in the Keychain. - - @param password The password to store in the Keychain. - - @param serviceName The service for which to set the corresponding password. - - @param account The account for which to set the corresponding password. - - @return Returns `YES` on success, or `NO` on failure. - */ -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account; -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error; - - -/** - Returns an array containing the Keychain's accounts, or `nil` if the Keychain has no accounts. - - See the `NSString` constants declared in SSKeychain.h for a list of keys that can be used when accessing the - dictionaries returned by this method. - - @return An array of dictionaries containing the Keychain's accounts, or `nil` if the Keychain doesn't have any - accounts. The order of the objects in the array isn't defined. - */ -+ (NSArray *)allAccounts; - - -/** - Returns an array containing the Keychain's accounts for a given service, or `nil` if the Keychain doesn't have any - accounts for the given service. - - See the `NSString` constants declared in SSKeychain.h for a list of keys that can be used when accessing the - dictionaries returned by this method. - - @param serviceName The service for which to return the corresponding accounts. - - @return An array of dictionaries containing the Keychain's accountsfor a given `serviceName`, or `nil` if the Keychain - doesn't have any accounts for the given `serviceName`. The order of the objects in the array isn't defined. - */ -+ (NSArray *)accountsForService:(NSString *)serviceName; - - -#pragma mark - Configuration - -#if __IPHONE_4_0 && TARGET_OS_IPHONE -/** - Returns the accessibility type for all future passwords saved to the Keychain. - - @return Returns the accessibility type. - - The return value will be `NULL` or one of the "Keychain Item Accessibility - Constants" used for determining when a keychain item should be readable. - - @see setAccessibilityType - */ -+ (CFTypeRef)accessibilityType; - -/** - Sets the accessibility type for all future passwords saved to the Keychain. - - @param accessibilityType One of the "Keychain Item Accessibility Constants" - used for determining when a keychain item should be readable. - - If the value is `NULL` (the default), the Keychain default will be used. - - @see accessibilityType - */ -+ (void)setAccessibilityType:(CFTypeRef)accessibilityType; -#endif - -@end diff --git a/Paco-iOS/vendor/sskeychain/SSKeychain.m b/Paco-iOS/vendor/sskeychain/SSKeychain.m deleted file mode 100755 index 33d5f70ec..000000000 --- a/Paco-iOS/vendor/sskeychain/SSKeychain.m +++ /dev/null @@ -1,109 +0,0 @@ -/* - Copyright (c) 2010-2013 Sam Soffes. - - 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 "SSKeychain.h" - -NSString *const kSSKeychainErrorDomain = @"com.samsoffes.sskeychain"; -NSString *const kSSKeychainAccountKey = @"acct"; -NSString *const kSSKeychainCreatedAtKey = @"cdat"; -NSString *const kSSKeychainClassKey = @"labl"; -NSString *const kSSKeychainDescriptionKey = @"desc"; -NSString *const kSSKeychainLabelKey = @"labl"; -NSString *const kSSKeychainLastModifiedKey = @"mdat"; -NSString *const kSSKeychainWhereKey = @"svce"; - -#if __IPHONE_4_0 && TARGET_OS_IPHONE - static CFTypeRef SSKeychainAccessibilityType = NULL; -#endif - -@implementation SSKeychain - -+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account { - return [self passwordForService:serviceName account:account error:nil]; -} - - -+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { - SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - [query fetch:error]; - return query.password; -} - - -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account { - return [self deletePasswordForService:serviceName account:account error:nil]; -} - - -+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { - SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - return [query deleteItem:error]; -} - - -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account { - return [self setPassword:password forService:serviceName account:account error:nil]; -} - - -+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error { - SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; - query.service = serviceName; - query.account = account; - query.password = password; - return [query save:error]; -} - - -+ (NSArray *)allAccounts { - return [self accountsForService:nil]; -} - - -+ (NSArray *)accountsForService:(NSString *)serviceName { - SSKeychainQuery *query = [[SSKeychainQuery alloc] init]; - query.service = serviceName; - return [query fetchAll:nil]; -} - - -#if __IPHONE_4_0 && TARGET_OS_IPHONE -+ (CFTypeRef)accessibilityType { - return SSKeychainAccessibilityType; -} - - -+ (void)setAccessibilityType:(CFTypeRef)accessibilityType { - CFRetain(accessibilityType); - if (SSKeychainAccessibilityType) { - CFRelease(SSKeychainAccessibilityType); - } - SSKeychainAccessibilityType = accessibilityType; -} -#endif - -@end diff --git a/Paco-iOS/vendor/sskeychain/SSKeychainQuery.h b/Paco-iOS/vendor/sskeychain/SSKeychainQuery.h deleted file mode 100755 index b5f50d0bb..000000000 --- a/Paco-iOS/vendor/sskeychain/SSKeychainQuery.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - Copyright (c) 2010-2013 Sam Soffes. - - 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 - -#ifdef __IPHONE_7_0 - #define SSKEYCHAIN_SYNCHRONIZABLE_AVAILABLE 1 -#endif - -#ifdef __MAC_10_9 - #define SSKEYCHAIN_SYNCHRONIZABLE_AVAILABLE 1 -#endif - -/** - Simple interface for querying or modifying keychain items. - */ -@interface SSKeychainQuery : NSObject - -/** kSecAttrAccount */ -@property (nonatomic, copy) NSString *account; - -/** kSecAttrService */ -@property (nonatomic, copy) NSString *service; - -/** kSecAttrLabel */ -@property (nonatomic, copy) NSString *label; - -#if __IPHONE_3_0 && TARGET_OS_IPHONE -/** kSecAttrAccessGroup (only used on iOS) */ -@property (nonatomic, copy) NSString *accessGroup; -#endif - -#ifdef SSKEYCHAIN_SYNCHRONIZABLE_AVAILABLE -/** kSecAttrSynchronizable */ -@property (nonatomic, getter = isSynchronizable) BOOL synchronizable; -#endif - -/** Root storage for password information */ -@property (nonatomic, copy) NSData *passwordData; - -/** - This property automatically transitions between an object and the value of - `passwordData` using NSKeyedArchiver and NSKeyedUnarchiver. - */ -@property (nonatomic, copy) id passwordObject; - -/** - Convenience accessor for setting and getting a password string. Passes through - to `passwordData` using UTF-8 string encoding. - */ -@property (nonatomic, copy) NSString *password; - -/** - Save the receiver's attributes as a keychain item. Existing items with the - given account, service, and access group will first be deleted. - - @param error Populated should an error occur. - - @return `YES` if saving was successful, `NO` otherwise. - */ -- (BOOL)save:(NSError **)error; - -/** - Dete keychain items that match the given account, service, and access group. - - @param error Populated should an error occur. - - @return `YES` if saving was successful, `NO` otherwise. - */ -- (BOOL)deleteItem:(NSError **)error; - -/** - Fetch all keychain items that match the given account, service, and access - group. The values of `password` and `passwordData` are ignored when fetching. - - @param error Populated should an error occur. - - @return An array of dictionaries that represent all matching keychain items or - `nil` should an error occur. - The order of the items is not determined. - */ -- (NSArray *)fetchAll:(NSError **)error; - -/** - Fetch the keychain item that matches the given account, service, and access - group. The `password` and `passwordData` properties will be populated unless - an error occurs. The values of `password` and `passwordData` are ignored when - fetching. - - @param error Populated should an error occur. - - @return `YES` if fetching was successful, `NO` otherwise. - */ -- (BOOL)fetch:(NSError **)error; - -@end diff --git a/Paco-iOS/vendor/sskeychain/SSKeychainQuery.m b/Paco-iOS/vendor/sskeychain/SSKeychainQuery.m deleted file mode 100755 index f950641d6..000000000 --- a/Paco-iOS/vendor/sskeychain/SSKeychainQuery.m +++ /dev/null @@ -1,267 +0,0 @@ -/* - Copyright (c) 2010-2013 Sam Soffes. - - 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 "SSKeychainQuery.h" -#import "SSKeychain.h" - -@implementation SSKeychainQuery - -@synthesize account = _account; -@synthesize service = _service; -@synthesize label = _label; -@synthesize passwordData = _passwordData; - -#if __IPHONE_3_0 && TARGET_OS_IPHONE -@synthesize accessGroup = _accessGroup; -#endif - -#ifdef SSKEYCHAIN_SYNCHRONIZABLE_AVAILABLE -@synthesize synchronizable = _synchronizable; -#endif - -#pragma mark - Public - -- (BOOL)save:(NSError *__autoreleasing *)error { - OSStatus status = SSKeychainErrorBadArguments; - if (!self.service || !self.account || !self.passwordData) { - if (error) { - *error = [[self class] errorWithCode:status]; - } - return NO; - } - - [self deleteItem:nil]; - - NSMutableDictionary *query = [self query]; - [query setObject:self.passwordData forKey:(__bridge id)kSecValueData]; - if (self.label) { - [query setObject:self.label forKey:(__bridge id)kSecAttrLabel]; - } -#if __IPHONE_4_0 && TARGET_OS_IPHONE - CFTypeRef accessibilityType = [SSKeychain accessibilityType]; - if (accessibilityType) { - [query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible]; - } -#endif - status = SecItemAdd((__bridge CFDictionaryRef)query, NULL); - - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; - } - - return (status == errSecSuccess); -} - - -- (BOOL)deleteItem:(NSError *__autoreleasing *)error { - OSStatus status = SSKeychainErrorBadArguments; - if (!self.service || !self.account) { - if (error) { - *error = [[self class] errorWithCode:status]; - } - return NO; - } - - NSMutableDictionary *query = [self query]; -#if TARGET_OS_IPHONE - status = SecItemDelete((__bridge CFDictionaryRef)query); -#else - CFTypeRef result = NULL; - [query setObject:@YES forKey:(__bridge id)kSecReturnRef]; - status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); - if (status == errSecSuccess) { - status = SecKeychainItemDelete((SecKeychainItemRef)result); - CFRelease(result); - } -#endif - - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; - } - - return (status == errSecSuccess); -} - - -- (NSArray *)fetchAll:(NSError *__autoreleasing *)error { - OSStatus status = SSKeychainErrorBadArguments; - NSMutableDictionary *query = [self query]; - [query setObject:@YES forKey:(__bridge id)kSecReturnAttributes]; - [query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit]; - - CFTypeRef result = NULL; - status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; - return nil; - } - - return (__bridge NSArray *)result; -} - - -- (BOOL)fetch:(NSError *__autoreleasing *)error { - OSStatus status = SSKeychainErrorBadArguments; - if (!self.service || !self.account) { - if (error) { - *error = [[self class] errorWithCode:status]; - } - return NO; - } - - CFTypeRef result = NULL; - NSMutableDictionary *query = [self query]; - [query setObject:@YES forKey:(__bridge_transfer id)kSecReturnData]; - [query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; - status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result); - - if (status != errSecSuccess && error != NULL) { - *error = [[self class] errorWithCode:status]; - return NO; - } - - self.passwordData = (__bridge_transfer NSData *)result; - return YES; -} - - -#pragma mark - Accessors - -- (void)setPasswordObject:(id)object { - self.passwordData = [NSKeyedArchiver archivedDataWithRootObject:object]; -} - - -- (id)passwordObject { - if ([self.passwordData length]) { - return [NSKeyedUnarchiver unarchiveObjectWithData:self.passwordData]; - } - return nil; -} - - -- (void)setPassword:(NSString *)password { - self.passwordData = [password dataUsingEncoding:NSUTF8StringEncoding]; -} - - -- (NSString *)password { - if ([self.passwordData length]) { - return [[NSString alloc] initWithData:self.passwordData encoding:NSUTF8StringEncoding]; - } - return nil; -} - - -#pragma mark - Private - -- (NSMutableDictionary *)query { - NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:3]; - [dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; - - if (self.service) { - [dictionary setObject:self.service forKey:(__bridge id)kSecAttrService]; - } - - if (self.account) { - [dictionary setObject:self.account forKey:(__bridge id)kSecAttrAccount]; - } - -#if __IPHONE_3_0 && TARGET_OS_IPHONE -#if !(TARGET_IPHONE_SIMULATOR) - if (self.accessGroup) { - [dictionary setObject:self.accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; - } -#endif -#endif - -#ifdef SSKEYCHAIN_SYNCHRONIZABLE_AVAILABLE - if (self.isSynchronizable) { - [dictionary setObject:@YES forKey:(__bridge id)(kSecAttrSynchronizable)]; - } -#endif - - return dictionary; -} - - -+ (NSError *)errorWithCode:(OSStatus) code { - NSString *message = nil; - switch (code) { - case errSecSuccess: return nil; - case SSKeychainErrorBadArguments: message = NSLocalizedStringFromTable(@"SSKeychainErrorBadArguments", @"SSKeychain", nil); break; - -#if TARGET_OS_IPHONE - case errSecUnimplemented: { - message = NSLocalizedStringFromTable(@"errSecUnimplemented", @"SSKeychain", nil); - break; - } - case errSecParam: { - message = NSLocalizedStringFromTable(@"errSecParam", @"SSKeychain", nil); - break; - } - case errSecAllocate: { - message = NSLocalizedStringFromTable(@"errSecAllocate", @"SSKeychain", nil); - break; - } - case errSecNotAvailable: { - message = NSLocalizedStringFromTable(@"errSecNotAvailable", @"SSKeychain", nil); - break; - } - case errSecDuplicateItem: { - message = NSLocalizedStringFromTable(@"errSecDuplicateItem", @"SSKeychain", nil); - break; - } - case errSecItemNotFound: { - message = NSLocalizedStringFromTable(@"errSecItemNotFound", @"SSKeychain", nil); - break; - } - case errSecInteractionNotAllowed: { - message = NSLocalizedStringFromTable(@"errSecInteractionNotAllowed", @"SSKeychain", nil); - break; - } - case errSecDecode: { - message = NSLocalizedStringFromTable(@"errSecDecode", @"SSKeychain", nil); - break; - } - case errSecAuthFailed: { - message = NSLocalizedStringFromTable(@"errSecAuthFailed", @"SSKeychain", nil); - break; - } - default: { - message = NSLocalizedStringFromTable(@"errSecDefault", @"SSKeychain", nil); - } -#else - default: - message = (__bridge_transfer NSString *)SecCopyErrorMessageString(code, NULL); -#endif - } - - NSDictionary *userInfo = nil; - if (message != nil) { - userInfo = @{ NSLocalizedDescriptionKey : message }; - } - return [NSError errorWithDomain:kSSKeychainErrorDomain code:code userInfo:userInfo]; -} - -@end diff --git a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.h b/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.h deleted file mode 100644 index 699ad5830..000000000 --- a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// GoogleAppEngineAuth.h -// whaleops -// -// Created by cameron ring on 2/26/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import -#import "GoogleClientLogin.h" - - -// GoogleAppEngineAuth is a GoogleClientLoginDelegate because we need to do some more work after getting the auth -// cookie to get the app engine auth cookie -@interface GoogleAppEngineAuth : NSObject { - - id m_delegate; - GoogleClientLogin *m_googleClientLogin; - NSURL *m_appURL; - BOOL m_useDevServer; -} - - -// Delegate is a weak pointer. If the delegate can go away before this class, you need to clear -// the delegate in the delegate's dealloc method -@property (nonatomic, assign) id delegate; - --(id)initWithDelegate:(id)delegate andAppURL:(NSURL *)appURL; - - -// Try to auth with the passed-in credentials for Google App Engine: -// username User's full email address. It must include the domain (i.e. johndoe@gmail.com). -// password User's password -// source Short string identifying your application, for logging purposes. This string should take the form: -// "companyName-applicationName-versionID". -// captcha (optional) String entered by the user as an answer to a CAPTCHA challenge. -// captchaToken (optional) Token representing the specific CAPTCHA challenge. Google supplies this token and the CAPTCHA image URL -// in a login failed response with the error code "CaptchaRequired". - --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password withSource:(NSString *)source; --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password andCaptcha:(NSString *)captcha - andCaptchaToken:(NSString *)captchaToken withSource:(NSString *)source; - -@end diff --git a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.m b/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.m deleted file mode 100644 index 915b812a7..000000000 --- a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleAppEngineAuth.m +++ /dev/null @@ -1,175 +0,0 @@ -// -// GoogleAppEngineAuth.m -// whaleops -// -// Created by cameron ring on 2/26/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "GoogleAppEngineAuth.h" -#import "GTMNSString+URLArguments.h" -#import - -@interface GoogleAppEngineAuth (private) - --(void)authForDevServerWith:(NSString *)username; --(NSString *)userIdForUsername:(NSString *)username; - -@end - - -@implementation GoogleAppEngineAuth -@synthesize delegate = m_delegate; - --(id)initWithDelegate:(id)delegate andAppURL:(NSURL *)appURL { - - if (!(self = [super init])) - return self; - - m_googleClientLogin = [[GoogleClientLogin alloc] initWithDelegate:self]; - m_delegate = delegate; - - m_appURL = [appURL retain]; - - m_useDevServer = [[appURL host] isEqualToString:@"localhost"]; - - return self; -} - --(void)dealloc { - [m_appURL release]; - [m_googleClientLogin setDelegate:nil]; - [m_googleClientLogin release]; - [super dealloc]; -} - --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password withSource:(NSString *)source { - - [self authWithUsername:username andPassword:password andCaptcha:nil andCaptchaToken:nil withSource:source]; -} - --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password andCaptcha:(NSString *)captcha - andCaptchaToken:(NSString *)captchaToken withSource:(NSString *)source { - - if (m_useDevServer) { - [self authForDevServerWith:username]; - return; - } - - // ah is the service for app engine, apparently - [m_googleClientLogin authWithUsername:username andPassword:password andCaptcha:captcha andCaptchaToken:captchaToken - forService:@"ah" withSource:source]; - -} - - -////////////////////////////////////////////////////////////////////////////////////////////////// -// MARK: GoogleClientLoginDelegate methods - --(void)authSucceeded:(NSString *)authKey { - - // request correct cookie - NSURL *cookieURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/_ah/login?continue=%@/&auth=%@", - m_appURL, - m_appURL, - [authKey gtm_stringByEscapingForURLArgument] - ] - ]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:cookieURL]; - [request setHTTPMethod:@"GET"]; - - [NSURLConnection connectionWithRequest:request delegate:self]; -} - --(void)authFailed:(NSString *)error { - [m_delegate authFailed:error]; -} - --(void)authCaptchaTestNeededFor:(NSString *)captchaToken withCaptchaURL:(NSURL *)captchaURL { - [m_delegate authCaptchaTestNeededFor:captchaToken withCaptchaURL:captchaURL]; -} - -////////////////////////////////////////////////////////////////////////////////////////////////// -// MARK: NSURLConnection delegate methods - --(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { - - if (![response isKindOfClass:[NSHTTPURLResponse class]]) { - [m_delegate authFailed:@"UnknownClientError"]; - [connection cancel]; - return; - } - - // no need to read body - [connection cancel]; - - NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[response URL]]; - - // iterate over cookies looking for ACSID - for (NSHTTPCookie *cookie in cookies) { - if (!([[cookie name] isEqualToString:@"ACSID"] || [[cookie name] isEqualToString:@"SACSID"])) - continue; - - [m_delegate authSucceeded:[cookie value]]; - return; - } - - [m_delegate authFailed:@"UnknownAppEngineClientError"]; -} - --(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { - -} - --(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { - NSString *msg = [NSString stringWithFormat:@"Connection Error (%@)", [error localizedDescription]]; - [m_delegate authFailed:msg]; -} - --(void)connectionDidFinishLoading:(NSURLConnection *)connection { - -} - -////////////////////////////////////////////////////////////////////////////////////////////////// -// MARK: Private methods - -// only used when generating a cookie for authing against the dev server --(NSString *)userIdForUsername:(NSString *)username { - const char *cStr = [username UTF8String]; - unsigned char result[CC_MD5_DIGEST_LENGTH]; - - CC_MD5(cStr, strlen(cStr), result); - return [NSString - stringWithFormat: @"1%02d%02d%02d%02d%02d%02d%02d%02d", - result[0], result[1], - result[2], result[3], - result[4], result[5], - result[6], result[7], - result[8], result[9], - result[10], result[11], - result[12], result[13], - result[14], result[15] - ]; - -} - -// if we're authing against the dev server, just set the right cookie --(void)authForDevServerWith:(NSString *)username { - - NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - - NSString *value = [NSString stringWithFormat:@"%@:False:%@", username, [self userIdForUsername:username]]; - - NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys: - @"dev_appserver_login", NSHTTPCookieName, - value, NSHTTPCookieValue, - @"/", NSHTTPCookiePath, - @"localhost", NSHTTPCookieDomain, - nil]; - - [m_delegate authSucceeded:value]; - - [cookieJar setCookie:[NSHTTPCookie cookieWithProperties:properties]]; -} - -@end diff --git a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.h b/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.h deleted file mode 100644 index e352a8d98..000000000 --- a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// GoogleClientLogin.h -// -// Created by cameron ring on 2/26/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// -// This class implements the client side of Google'a ClientLogin API. For more information: -// http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html -// - -#import - -@protocol GoogleClientLoginDelegate - --(void)authSucceeded:(NSString *)authKey; --(void)authFailed:(NSString *)error; --(void)authCaptchaTestNeededFor:(NSString *)captchaToken withCaptchaURL:(NSURL *)captchaURL; - -@end - - -@interface GoogleClientLogin : NSObject { - - id m_delegate; - NSMutableData *m_receivedData; - NSUInteger m_statusCode; -} - -// Delegate is a weak pointer. If the delegate can go away before this class, you need to clear -// the delegate in the delegate's dealloc method -@property (nonatomic, assign) id delegate; - -+ (NSString *)descriptionForError:(NSString *)error; - --(id)initWithDelegate:(id)delegate; - - -// Try to auth with the passed-in credentials for a particular service: -// username User's full email address. It must include the domain (i.e. johndoe@gmail.com). -// password User's password -// service Name of the Google service you're requesting authorization for. Each service using the Authorization service -// is assigned a name value; for example, the name associated with Google Calendar is 'cl'. This parameter is -// required when accessing services based on Google Data APIs. For specific service names, refer to the service -// documentation. -// source Short string identifying your application, for logging purposes. This string should take the form: -// "companyName-applicationName-versionID". -// captcha (optional) String entered by the user as an answer to a CAPTCHA challenge. -// captchaToken (optional) Token representing the specific CAPTCHA challenge. Google supplies this token and the CAPTCHA image URL -// in a login failed response with the error code "CaptchaRequired". - --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password forService:(NSString *)service - withSource:(NSString *)source; - --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password andCaptcha:(NSString *)captcha - andCaptchaToken:(NSString *)captchaToken forService:(NSString *)service withSource:(NSString *)source; - -@end diff --git a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.m b/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.m deleted file mode 100644 index 761a16adc..000000000 --- a/Paco-iOS/vendor/touchengine/iPhone/GoogleAppEngineAuthGithub/GoogleClientLogin.m +++ /dev/null @@ -1,197 +0,0 @@ -// -// GoogleClientLogin.m -// whaleops -// -// Created by cameron ring on 2/26/10. -// Copyright 2010 __MyCompanyName__. All rights reserved. -// - -#import "GoogleClientLogin.h" -#import "GTMNSString+URLArguments.h" - - -#define CAPTCHA_PREFIX @"http://www.google.com/accounts/" -#define UNKNOWN_CLIENT_ERROR @"UnknownClientError" -#define CONNECTION_ERROR @"ConnetionError" - -@interface GoogleClientLogin (private) - --(void)handleAuthResponse:(NSString *)response; --(NSDictionary *)parseResponseBody:(NSString *)body; - -@end - - -@implementation GoogleClientLogin -@synthesize delegate = m_delegate; - --(id)initWithDelegate:(id)delegate { - if (!(self = [super init])) - return self; - - // weak pointer to delegate - m_delegate = delegate; - - return self; -} - --(void)dealloc { - [m_receivedData release]; - [super dealloc]; -} - --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password forService:(NSString *)service - withSource:(NSString *)source { - [self authWithUsername:username andPassword:password andCaptcha:nil andCaptchaToken:nil forService:service - withSource:source]; -} - --(void)authWithUsername:(NSString *)username andPassword:(NSString *)password andCaptcha:(NSString *)captcha - andCaptchaToken:(NSString *)captchaToken forService:(NSString *)service withSource:(NSString *)source { - - NSString *content = [NSString stringWithFormat:@"accountType=HOSTED_OR_GOOGLE&Email=%@&Passwd=%@&service=%@&source=%@", - [username gtm_stringByEscapingForURLArgument], - [password gtm_stringByEscapingForURLArgument], - [service gtm_stringByEscapingForURLArgument], - [source gtm_stringByEscapingForURLArgument]]; - - if (captcha && captchaToken) { - content = [NSString stringWithFormat:@"%@&logintoken=%@&logincaptcha=%@", - content, - [captchaToken gtm_stringByEscapingForURLArgument], - [captcha gtm_stringByEscapingForURLArgument]]; - } - - NSURL *authURL = [NSURL URLWithString:@"https://www.google.com/accounts/ClientLogin"]; - - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:authURL]; - [request setHTTPMethod:@"POST"]; - [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"]; - [request setHTTPBody:[content dataUsingEncoding:NSASCIIStringEncoding]]; - - [NSURLConnection connectionWithRequest:request delegate:self]; -} - -+ (NSString *)descriptionForError:(NSString *)error { - - if ([error isEqualToString:CONNECTION_ERROR]) { - return @"There was an error communication with the server"; - } else if ([error isEqualToString:@"BadAuthentication"]) { - return @"Invalid username or password"; - } else if ([error isEqualToString:@"NotVerified"]) { - return @"That email address has not been validated. You must verify that address with your Google account before continuing"; - } else if ([error isEqualToString:@"TermsNotAgreed"]) { - return @"You have not agreed to the terms yet. You must sign in to your Google account on the web before continuing"; - } else if ([error isEqualToString:@"CaptchaRequired"]) { - return @"A CAPTCHA is required."; - } else if ([error isEqualToString:@"Unknown"]) { - return @"There was an unknown error"; - } else if ([error isEqualToString:@"AccountDeleted"]) { - return @"That account has been deleted"; - } else if ([error isEqualToString:@"AccountDisabled"]) { - return @"That account has been disabled"; - } else if ([error isEqualToString:@"ServiceDisabled"]) { - return @"Your access to that service has been disabled"; - } else if ([error isEqualToString:@"ServiceUnavailable"]) { - return @"That service is currently unavailable. Please try again later"; - } - - return @"There was an unknown error (client)"; -} - -////////////////////////////////////////////////////////////////////////////////////////////////// -// MARK: NSURLConnection delegate methods - --(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { - - if (![response isKindOfClass:[NSHTTPURLResponse class]]) - return; - - NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; - - m_statusCode = [httpResponse statusCode]; - - [m_receivedData release]; - m_receivedData = [[NSMutableData alloc] init]; -} - --(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { - [m_receivedData appendData:data]; -} - --(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { - [m_delegate authFailed:CONNECTION_ERROR]; -} - --(void)connectionDidFinishLoading:(NSURLConnection *)connection { - - // process the body - NSString *body = [[NSString alloc] initWithData:m_receivedData encoding:NSUTF8StringEncoding]; - - [self handleAuthResponse:body]; - - [body release]; - [m_receivedData release]; - m_receivedData = nil; -} - - -////////////////////////////////////////////////////////////////////////////////////////////////// -// MARK: Private method - --(void)handleAuthResponse:(NSString *)response { - - NSDictionary *keys = [self parseResponseBody:response]; - - if (m_statusCode == 200) { - NSString *auth = [keys objectForKey:@"Auth"]; - - if ([auth length]) { - [m_delegate authSucceeded:auth]; - return; - } - } - - NSString *error = [keys objectForKey:@"Error"]; - - if ((m_statusCode != 403) || ![error length]) { - [m_delegate authFailed:UNKNOWN_CLIENT_ERROR]; - return; - } - - if (![error isEqualToString:@"CaptchaRequired"]) { - // a regular error - [m_delegate authFailed:error]; - return; - } - - // we need to show a captcha - NSString *captchaToken = [keys objectForKey:@"CaptchaToken"]; - NSString *captchaPath = [keys objectForKey:@"CaptchaUrl"]; - - NSURL *captchaURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", CAPTCHA_PREFIX, captchaPath]]; - - [m_delegate authCaptchaTestNeededFor:captchaToken withCaptchaURL:captchaURL]; -} - --(NSDictionary *)parseResponseBody:(NSString *)body { - - NSMutableDictionary *keys = [NSMutableDictionary dictionary]; - NSArray *lines = [body componentsSeparatedByString:@"\n"]; - for (NSString *line in lines) { - - NSRange separatorRange = [line rangeOfString:@"="]; - - if (separatorRange.location == NSNotFound) - break; - - NSString *key = [line substringToIndex:separatorRange.location]; - NSString *value = [line substringFromIndex:separatorRange.location + separatorRange.length]; - [keys setObject:value forKey:key]; - } - - return keys; -} - - -@end From ca5eb098cde8879915a5609478b2f6c57b8a36bd Mon Sep 17 00:00:00 2001 From: Bob Evans Date: Wed, 26 Apr 2017 14:47:41 -0700 Subject: [PATCH 13/13] add new cocoapods user dir and DerivedData to ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index b7629a8f1..c3946b3fd 100644 --- a/.gitignore +++ b/.gitignore @@ -39,5 +39,7 @@ Paco-Server/ear/reportworker/WEB-INF/lib/shared.jar Paco-iOS/Paco.xcodeproj/project.xcworkspace/xcuserdata/* Paco-iOS/Paco.xcodeproj/project.xcworkspace/xcshareddata/* Paco-iOS/Paco.xcodeproj/xcuserdata/* +Paco-iOS/Paco.xcworkspace/xcuserdata/* Paco-iOS/ParseKit/ParseKit.xcodeproj/xcuserdata/* Paco-iOS/ParseKit/lib/OCMock/OCMock.xcodeproj/xcuserdata/* +Paco-iOS/DerivedData/* \ No newline at end of file

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 nOLsdD!j6zyZ4dG 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