Ben Copsey

Moved cookie support over to NSHTTPCookie

1 -//  
2 -// ASIHTTPCookie.h  
3 -// asi-http-request  
4 -//  
5 -// Created by Ben Copsey on 25/08/2008.  
6 -// Copyright 2008 All-Seeing Interactive. All rights reserved.  
7 -//  
8 -  
9 -#import <Cocoa/Cocoa.h>  
10 -  
11 -  
12 -@interface ASIHTTPCookie : NSObject {  
13 - NSString *name;  
14 - NSString *value;  
15 - NSDate *expires;  
16 - NSString *path;  
17 - NSString *domain;  
18 - BOOL requiresHTTPS;  
19 -}  
20 -  
21 -- (void)setValue:(NSString *)newValue forProperty:(NSString *)property;  
22 -  
23 -+ (NSMutableArray *)cookiesFromHeader:(NSString *)header;  
24 -+ (NSString *)urlEncodedValue:(NSString *)string;  
25 -+ (NSString *)urlDecodedValue:(NSString *)string;  
26 -  
27 -@property (retain) NSString *name;  
28 -@property (retain) NSString *value;  
29 -@property (retain) NSDate *expires;  
30 -@property (retain) NSString *path;  
31 -@property (retain) NSString *domain;  
32 -@property (assign) BOOL requiresHTTPS;  
33 -  
34 -@end  
1 -//  
2 -// ASIHTTPCookie.m  
3 -// asi-http-request  
4 -//  
5 -// Created by Ben Copsey on 25/08/2008.  
6 -// Copyright 2008 All-Seeing Interactive. All rights reserved.  
7 -//  
8 -  
9 -#import "ASIHTTPCookie.h"  
10 -  
11 -@implementation ASIHTTPCookie  
12 -  
13 -- (void)setValue:(NSString *)newValue forProperty:(NSString *)property  
14 -{  
15 - NSString *prop = [property lowercaseString];  
16 - if ([prop isEqualToString:@"expires"]) {  
17 - [self setExpires:[NSDate dateWithNaturalLanguageString:newValue]];  
18 - return;  
19 - } else if ([prop isEqualToString:@"domain"]) {  
20 - [self setDomain:newValue];  
21 - return;  
22 - } else if ([prop isEqualToString:@"path"]) {  
23 - [self setPath:newValue];  
24 - return;  
25 - } else if ([prop isEqualToString:@"secure"]) {  
26 - [self setRequiresHTTPS:[newValue isEqualToString:@"1"]];  
27 - return;  
28 - }  
29 - if (![self name] && ![self value]) {  
30 - [self setName:property];  
31 - [self setValue:newValue];  
32 - }  
33 -}  
34 -  
35 -  
36 -// I know this looks like a really ugly way to parse the Set-Cookie header, but I'd guess this is probably one of the simplest methods!  
37 -// You can't rely on a comma being a cookie delimeter, since it's quite likely that the expiry date for a cookie will contain a comma  
38 -  
39 -  
40 -+ (NSMutableArray *)cookiesFromHeader:(NSString *)header  
41 -{  
42 - NSMutableArray *cookies = [[[NSMutableArray alloc] init] autorelease];  
43 - ASIHTTPCookie *cookie = [[[ASIHTTPCookie alloc] init] autorelease];  
44 -  
45 - NSArray *parts = [header componentsSeparatedByString:@"="];  
46 - int i;  
47 - NSString *name;  
48 - NSString *value;  
49 - NSArray *components;  
50 - NSString *newKey;  
51 - NSString *terminator;  
52 - for (i=0; i<[parts count]; i++) {  
53 - NSString *part = [parts objectAtIndex:i];  
54 - if (i == 0) {  
55 - name = part;  
56 - continue;  
57 - } else if (i == [parts count]-1) {  
58 - [cookie setValue:[ASIHTTPCookie urlDecodedValue:part] forProperty:name];  
59 - [cookies addObject:cookie];  
60 - continue;  
61 - }  
62 - components = [part componentsSeparatedByString:@" "];  
63 - newKey = [components lastObject];  
64 - value = [part substringWithRange:NSMakeRange(0,[part length]-[newKey length]-2)];  
65 - [cookie setValue:[ASIHTTPCookie urlDecodedValue:value] forProperty:name];  
66 -  
67 - terminator = [part substringWithRange:NSMakeRange([part length]-[newKey length]-2,1)];  
68 - if ([terminator isEqualToString:@","]) {  
69 - [cookies addObject:cookie];  
70 - cookie = [[[ASIHTTPCookie alloc] init] autorelease];  
71 - }  
72 - name = newKey;  
73 - }  
74 -  
75 - return cookies;  
76 -  
77 -}  
78 -  
79 -+ (NSString *)urlDecodedValue:(NSString *)string  
80 -{  
81 - NSMutableString *s = [NSMutableString stringWithString:[string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];  
82 - //Also swap plus signs for spaces  
83 - [s replaceOccurrencesOfString:@"+" withString:@" " options:NSLiteralSearch range:NSMakeRange(0, [s length])];  
84 - return [NSString stringWithString:s];  
85 -}  
86 -  
87 -+ (NSString *)urlEncodedValue:(NSString *)string  
88 -{  
89 - return [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
90 -}  
91 -  
92 -@synthesize name;  
93 -@synthesize value;  
94 -@synthesize expires;  
95 -@synthesize path;  
96 -@synthesize domain;  
97 -@synthesize requiresHTTPS;  
98 -@end  
99 -  
100 -  
@@ -39,7 +39,7 @@ @@ -39,7 +39,7 @@
39 NSMutableArray *requestCookies; 39 NSMutableArray *requestCookies;
40 40
41 //Will be populated with Cookies 41 //Will be populated with Cookies
42 - NSMutableArray *responseCookies; 42 + NSArray *responseCookies;
43 43
44 //If use cokie persistance is true, network requests will present valid cookies from previous requests 44 //If use cokie persistance is true, network requests will present valid cookies from previous requests
45 BOOL useCookiePersistance; 45 BOOL useCookiePersistance;
@@ -224,17 +224,13 @@ @@ -224,17 +224,13 @@
224 // Remove credentials from the keychain 224 // Remove credentials from the keychain
225 + (void)removeCredentialsForHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm; 225 + (void)removeCredentialsForHost:(NSString *)host port:(int)port protocol:(NSString *)protocol realm:(NSString *)realm;
226 226
227 -// Store cookies for a particular request in the session 227 +// We keep track of any cookies we accept, so that we can remove them from the persistent store later
228 -+ (void)recordCookiesInSessionForRequest:(ASIHTTPRequest *)request;  
229 -  
230 + (void)setSessionCookies:(NSMutableArray *)newSessionCookies; 228 + (void)setSessionCookies:(NSMutableArray *)newSessionCookies;
231 + (NSMutableArray *)sessionCookies; 229 + (NSMutableArray *)sessionCookies;
232 230
233 // Dump all session data (authentication and cookies) 231 // Dump all session data (authentication and cookies)
234 + (void)clearSession; 232 + (void)clearSession;
235 233
236 -  
237 -  
238 @property (retain) NSString *username; 234 @property (retain) NSString *username;
239 @property (retain) NSString *password; 235 @property (retain) NSString *password;
240 @property (retain) NSString *domain; 236 @property (retain) NSString *domain;
@@ -253,7 +249,7 @@ @@ -253,7 +249,7 @@
253 @property (assign,readonly) BOOL complete; 249 @property (assign,readonly) BOOL complete;
254 @property (retain) NSDictionary *responseHeaders; 250 @property (retain) NSDictionary *responseHeaders;
255 @property (retain) NSMutableArray *requestCookies; 251 @property (retain) NSMutableArray *requestCookies;
256 -@property (retain) NSMutableArray *responseCookies; 252 +@property (retain) NSArray *responseCookies;
257 @property (assign) BOOL useCookiePersistance; 253 @property (assign) BOOL useCookiePersistance;
258 @property (retain) NSDictionary *requestCredentials; 254 @property (retain) NSDictionary *requestCredentials;
259 @property (assign) int responseStatusCode; 255 @property (assign) int responseStatusCode;
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 // See: http://developer.apple.com/samplecode/ImageClient/listing37.html 11 // See: http://developer.apple.com/samplecode/ImageClient/listing37.html
12 12
13 #import "ASIHTTPRequest.h" 13 #import "ASIHTTPRequest.h"
14 -#import "ASIHTTPCookie.h" 14 +#import "NSHTTPCookieAdditions.h"
15 15
16 static NSString *NetworkRequestErrorDomain = @"com.Your-Company.Your-Product.NetworkError."; 16 static NSString *NetworkRequestErrorDomain = @"com.Your-Company.Your-Product.NetworkError.";
17 17
@@ -168,47 +168,23 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -168,47 +168,23 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
168 //Set your own boundary string only if really obsessive. We don't bother to check if post data contains the boundary, since it's pretty unlikely that it does. 168 //Set your own boundary string only if really obsessive. We don't bother to check if post data contains the boundary, since it's pretty unlikely that it does.
169 NSString *stringBoundary = @"0xKhTmLbOuNdArY"; 169 NSString *stringBoundary = @"0xKhTmLbOuNdArY";
170 170
171 - //Add cookies from session 171 + //Add cookies from the persistant (mac os global) store
172 - if (useCookiePersistance && [[ASIHTTPRequest sessionCookies] count] > 0) { 172 + if (useCookiePersistance) {
173 - ASIHTTPCookie *requestCookie; 173 + NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:url];
174 - ASIHTTPCookie *storedCookie; 174 + if (cookies) {
175 - for (storedCookie in sessionCookies) { 175 + [requestCookies addObjectsFromArray:cookies];
176 - BOOL foundExistingCookie = NO;  
177 - //Look for existing cookies in the request - these will always take precedence over session stored cookies  
178 - for (requestCookie in requestCookies) {  
179 - if ([[requestCookie domain] isEqualToString:[storedCookie domain]]) {  
180 - if ([[requestCookie path] isEqualToString:[storedCookie path]] || (![requestCookie path] && ![storedCookie path])) {  
181 - if ([[requestCookie name] isEqualToString:[storedCookie name]]) {  
182 - foundExistingCookie = YES;  
183 - break;  
184 - }  
185 - }  
186 - }  
187 - }  
188 - if (!foundExistingCookie) {  
189 - [requestCookies addObject:storedCookie];  
190 - }  
191 } 176 }
192 } 177 }
193 178
194 //Apply request cookies 179 //Apply request cookies
195 if ([requestCookies count] > 0) { 180 if ([requestCookies count] > 0) {
196 - ASIHTTPCookie *cookie; 181 + NSHTTPCookie *cookie;
197 NSString *cookieHeader = nil; 182 NSString *cookieHeader = nil;
198 for (cookie in requestCookies) { 183 for (cookie in requestCookies) {
199 - //Ensure the cookie is valid for this request  
200 - if ([[[url host] substringWithRange:NSMakeRange([[url host] length]-[[cookie domain] length],[[cookie domain] length])] isEqualToString:[cookie domain]]) {  
201 - if ([[[url path] substringWithRange:NSMakeRange(0,[[cookie path] length])] isEqualToString:[cookie path]]) {  
202 - if (![cookie requiresHTTPS] || [[url port] intValue] == 443) {  
203 - if (![cookie expires] || [[cookie expires] timeIntervalSinceNow] > 0) {  
204 if (!cookieHeader) { 184 if (!cookieHeader) {
205 - cookieHeader = [NSString stringWithFormat: @"%@=%@",[cookie name],[ASIHTTPCookie urlEncodedValue:[cookie value]]]; 185 + cookieHeader = [NSString stringWithFormat: @"%@=%@",[cookie name],[cookie encodedValue]];
206 } else { 186 } else {
207 - cookieHeader = [NSString stringWithFormat: @"%@; %@=%@",cookieHeader,[cookie name],[ASIHTTPCookie urlEncodedValue:[cookie value]]]; 187 + cookieHeader = [NSString stringWithFormat: @"%@; %@=%@",cookieHeader,[cookie name],[cookie encodedValue]];
208 - }  
209 - }  
210 - }  
211 - }  
212 } 188 }
213 } 189 }
214 if (cookieHeader) { 190 if (cookieHeader) {
@@ -475,11 +451,20 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -475,11 +451,20 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
475 } 451 }
476 452
477 //Handle cookies 453 //Handle cookies
478 - NSString *cookieHeader = [responseHeaders valueForKey:@"Set-Cookie"]; 454 + NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:responseHeaders forURL:url];
479 - if (cookieHeader) { 455 + [self setResponseCookies:cookies];
480 - [self setResponseCookies:[ASIHTTPCookie cookiesFromHeader:cookieHeader]]; 456 +
481 if (useCookiePersistance) { 457 if (useCookiePersistance) {
482 - [ASIHTTPRequest recordCookiesInSessionForRequest:self]; 458 + //Store cookies in global persistent store
  459 + [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:url mainDocumentURL:nil];
  460 +
  461 + //We also keep any cookies in the sessionCookies array, so that we have a reference to them if we need to remove them later
  462 + if (!sessionCookies) {
  463 + [ASIHTTPRequest setSessionCookies:[[[NSMutableArray alloc] init] autorelease]];
  464 + NSHTTPCookie *cookie;
  465 + for (cookie in cookies) {
  466 + [[ASIHTTPRequest sessionCookies] addObject:cookie];
  467 + }
483 } 468 }
484 } 469 }
485 470
@@ -829,37 +814,6 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -829,37 +814,6 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
829 814
830 } 815 }
831 816
832 -+ (void)recordCookiesInSessionForRequest:(ASIHTTPRequest *)request  
833 -{  
834 - if (!sessionCookies) {  
835 - [self setSessionCookies:[[[NSMutableArray alloc] init] autorelease]];  
836 - }  
837 - ASIHTTPCookie *newCookie;  
838 - ASIHTTPCookie *storedCookie;  
839 - for (newCookie in [request responseCookies]) {  
840 - //If we didn't get a domain for the cookie, let's add the one from this request, so we aren't sending cookies from the wrong server later on  
841 - if (![newCookie domain]) {  
842 - [newCookie setDomain:[[request url] host]];  
843 - }  
844 - int i = 0;  
845 - BOOL foundExistingCookie = NO;  
846 - for (storedCookie in sessionCookies) {  
847 - if ([[storedCookie domain] isEqualToString:[newCookie domain]]) {  
848 - if ([[storedCookie path] isEqualToString:[newCookie path]] || (![storedCookie path] && ![newCookie path])) {  
849 - if ([[storedCookie name] isEqualToString:[newCookie name]]) {  
850 - foundExistingCookie = YES;  
851 - [sessionCookies replaceObjectAtIndex:i withObject:newCookie];  
852 - break;  
853 - }  
854 - }  
855 - }  
856 - i++;  
857 - }  
858 - if (!foundExistingCookie) {  
859 - [sessionCookies addObject:newCookie];  
860 - }  
861 - }  
862 -}  
863 817
864 + (NSMutableArray *)sessionCookies 818 + (NSMutableArray *)sessionCookies
865 { 819 {
@@ -868,6 +822,11 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -868,6 +822,11 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
868 822
869 + (void)setSessionCookies:(NSMutableArray *)newSessionCookies 823 + (void)setSessionCookies:(NSMutableArray *)newSessionCookies
870 { 824 {
  825 + //Remove existing cookies from the persistent store
  826 + NSHTTPCookie *cookie;
  827 + for (cookie in newSessionCookies) {
  828 + [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
  829 + }
871 [sessionCookies release]; 830 [sessionCookies release];
872 sessionCookies = [newSessionCookies retain]; 831 sessionCookies = [newSessionCookies retain];
873 } 832 }
@@ -881,6 +840,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy @@ -881,6 +840,7 @@ static void ReadStreamClientCallBack(CFReadStreamRef readStream, CFStreamEventTy
881 } 840 }
882 841
883 842
  843 +
884 @synthesize username; 844 @synthesize username;
885 @synthesize password; 845 @synthesize password;
886 @synthesize domain; 846 @synthesize domain;
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 8
9 #import "ASIHTTPRequestTests.h" 9 #import "ASIHTTPRequestTests.h"
10 #import "ASIHTTPRequest.h" 10 #import "ASIHTTPRequest.h"
11 -#import "ASIHTTPCookie.h" 11 +#import "NSHTTPCookieAdditions.h"
12 12
13 @implementation ASIHTTPRequestTests 13 @implementation ASIHTTPRequestTests
14 14
@@ -120,24 +120,6 @@ More tests needed for: @@ -120,24 +120,6 @@ More tests needed for:
120 { 120 {
121 BOOL success; 121 BOOL success;
122 122
123 - //Firstly, let's make sure cocoa still parses cookie dates correctly using the three examples at http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3  
124 - NSString *dte = @"Sun, 06 Nov 1994 08:49:37 GMT";  
125 -  
126 - NSDate *date = [NSDate dateWithNaturalLanguageString:dte];  
127 - NSDate *referenceDate = [NSDate dateWithString:@"1994-11-06 08:49:37 +0000"];  
128 - success = [date isEqualToDate:referenceDate];  
129 - STAssertTrue(success,@"Date parse 1 failed");  
130 -  
131 - dte = @"Sunday, 06-Nov-94 08:49:37 GMT";  
132 - date = [NSDate dateWithNaturalLanguageString:dte];  
133 - success = [date isEqualToDate:referenceDate];  
134 - STAssertTrue(success,@"Date parse 2 failed");  
135 -  
136 - dte = @"Sun Nov 6 08:49:37 1994";  
137 - date = [NSDate dateWithNaturalLanguageString:dte];  
138 - success = [date isEqualToDate:referenceDate];  
139 - STAssertTrue(success,@"Date parse 3 failed");  
140 -  
141 NSURL *url = [[[NSURL alloc] initWithString:@"http://allseeing-i.com/asi-http-request/tests/set_cookie"] autorelease]; 123 NSURL *url = [[[NSURL alloc] initWithString:@"http://allseeing-i.com/asi-http-request/tests/set_cookie"] autorelease];
142 ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease]; 124 ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];
143 [request setUseCookiePersistance:YES]; 125 [request setUseCookiePersistance:YES];
@@ -149,14 +131,15 @@ More tests needed for: @@ -149,14 +131,15 @@ More tests needed for:
149 NSArray *cookies = [request responseCookies]; 131 NSArray *cookies = [request responseCookies];
150 STAssertNotNil(cookies,@"Failed to store cookie data in responseCookies"); 132 STAssertNotNil(cookies,@"Failed to store cookie data in responseCookies");
151 133
152 - ASIHTTPCookie *cookie = nil; 134 + NSHTTPCookie *cookie = nil;
153 BOOL foundCookie = NO; 135 BOOL foundCookie = NO;
154 for (cookie in cookies) { 136 for (cookie in cookies) {
155 if ([[cookie name] isEqualToString:@"ASIHTTPRequestTestCookie"]) { 137 if ([[cookie name] isEqualToString:@"ASIHTTPRequestTestCookie"]) {
156 foundCookie = YES; 138 foundCookie = YES;
157 - success = [[cookie value] isEqualToString:@"This is the value"]; 139 + NSLog(@"%@",cookie);
  140 + success = [[cookie decodedValue] isEqualToString:@"This is the value"];
158 STAssertTrue(success,@"Failed to store the correct value for a cookie"); 141 STAssertTrue(success,@"Failed to store the correct value for a cookie");
159 - success = [[cookie domain] isEqualToString:@"allseeing-i.com"]; 142 + success = [[cookie domain] isEqualToString:@".allseeing-i.com"];
160 STAssertTrue(success,@"Failed to store the correct domain for a cookie"); 143 STAssertTrue(success,@"Failed to store the correct domain for a cookie");
161 success = [[cookie path] isEqualToString:@"/asi-http-request/tests"]; 144 success = [[cookie path] isEqualToString:@"/asi-http-request/tests"];
162 STAssertTrue(success,@"Failed to store the correct path for a cookie"); 145 STAssertTrue(success,@"Failed to store the correct path for a cookie");
@@ -26,7 +26,7 @@ @@ -26,7 +26,7 @@
26 26
27 - (IBAction)simpleURLFetch:(id)sender 27 - (IBAction)simpleURLFetch:(id)sender
28 { 28 {
29 - ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://allseeing-i.com"]] autorelease]; 29 + ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"http://asi/"]] autorelease];
30 30
31 //Customise our user agent, for no real reason 31 //Customise our user agent, for no real reason
32 [request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"]; 32 [request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"];
  1 +//
  2 +// NSHTTPCookieAdditions.h
  3 +// asi-http-request
  4 +//
  5 +// Created by Ben Copsey on 12/09/2008.
  6 +// Copyright 2008 All-Seeing Interactive. All rights reserved.
  7 +//
  8 +
  9 +#import <Cocoa/Cocoa.h>
  10 +
  11 +@interface NSHTTPCookie (ValueEncodingAdditions)
  12 +
  13 +- (NSString *)encodedValue;
  14 +- (NSString *)decodedValue;
  15 +
  16 +@end
  1 +//
  2 +// NSHTTPCookieAdditions.m
  3 +// asi-http-request
  4 +//
  5 +// Created by Ben Copsey on 12/09/2008.
  6 +// Copyright 2008 All-Seeing Interactive. All rights reserved.
  7 +//
  8 +
  9 +#import "NSHTTPCookieAdditions.h"
  10 +
  11 +@implementation NSHTTPCookie (ValueEncodingAdditions)
  12 +
  13 +- (NSString *)decodedValue
  14 +{
  15 + NSMutableString *s = [NSMutableString stringWithString:[[self value] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
  16 + //Also swap plus signs for spaces
  17 + [s replaceOccurrencesOfString:@"+" withString:@" " options:NSLiteralSearch range:NSMakeRange(0, [s length])];
  18 + return [NSString stringWithString:s];
  19 +}
  20 +
  21 +- (NSString *)encodedValue
  22 +{
  23 + return [[self value] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  24 +}
  25 +
  26 +@end
  27 +
  28 +
@@ -279,13 +279,13 @@ @@ -279,13 +279,13 @@
279 <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key> 279 <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
280 <array> 280 <array>
281 <array> 281 <array>
282 - <integer>4</integer> 282 + <integer>11</integer>
283 - <integer>2</integer> 283 + <integer>5</integer>
284 <integer>0</integer> 284 <integer>0</integer>
285 </array> 285 </array>
286 </array> 286 </array>
287 <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key> 287 <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
288 - <string>{{0, 0}, {312, 861}}</string> 288 + <string>{{0, 0}, {312, 917}}</string>
289 </dict> 289 </dict>
290 <key>PBXTopSmartGroupGIDs</key> 290 <key>PBXTopSmartGroupGIDs</key>
291 <array/> 291 <array/>
@@ -297,14 +297,14 @@ @@ -297,14 +297,14 @@
297 <key>GeometryConfiguration</key> 297 <key>GeometryConfiguration</key>
298 <dict> 298 <dict>
299 <key>Frame</key> 299 <key>Frame</key>
300 - <string>{{0, 0}, {329, 879}}</string> 300 + <string>{{0, 0}, {329, 935}}</string>
301 <key>GroupTreeTableConfiguration</key> 301 <key>GroupTreeTableConfiguration</key>
302 <array> 302 <array>
303 <string>MainColumn</string> 303 <string>MainColumn</string>
304 <real>312</real> 304 <real>312</real>
305 </array> 305 </array>
306 <key>RubberWindowFrame</key> 306 <key>RubberWindowFrame</key>
307 - <string>120 130 1647 920 0 0 1920 1178 </string> 307 + <string>224 81 1432 976 0 0 1920 1178 </string>
308 </dict> 308 </dict>
309 <key>Module</key> 309 <key>Module</key>
310 <string>PBXSmartGroupTreeModule</string> 310 <string>PBXSmartGroupTreeModule</string>
@@ -322,7 +322,7 @@ @@ -322,7 +322,7 @@
322 <key>PBXProjectModuleGUID</key> 322 <key>PBXProjectModuleGUID</key>
323 <string>1CE0B20306471E060097A5F4</string> 323 <string>1CE0B20306471E060097A5F4</string>
324 <key>PBXProjectModuleLabel</key> 324 <key>PBXProjectModuleLabel</key>
325 - <string>ASIHTTPRequestTests.m</string> 325 + <string>ASIHTTPRequest.m</string>
326 <key>PBXSplitModuleInNavigatorKey</key> 326 <key>PBXSplitModuleInNavigatorKey</key>
327 <dict> 327 <dict>
328 <key>Split0</key> 328 <key>Split0</key>
@@ -330,11 +330,11 @@ @@ -330,11 +330,11 @@
330 <key>PBXProjectModuleGUID</key> 330 <key>PBXProjectModuleGUID</key>
331 <string>1CE0B20406471E060097A5F4</string> 331 <string>1CE0B20406471E060097A5F4</string>
332 <key>PBXProjectModuleLabel</key> 332 <key>PBXProjectModuleLabel</key>
333 - <string>ASIHTTPRequestTests.m</string> 333 + <string>ASIHTTPRequest.m</string>
334 <key>_historyCapacity</key> 334 <key>_historyCapacity</key>
335 <integer>0</integer> 335 <integer>0</integer>
336 <key>bookmark</key> 336 <key>bookmark</key>
337 - <string>B500B5BA0E635E0E00744D82</string> 337 + <string>B5CF37350E7A8D040050CBA7</string>
338 <key>history</key> 338 <key>history</key>
339 <array> 339 <array>
340 <string>B5731B8B0E4310180008024F</string> 340 <string>B5731B8B0E4310180008024F</string>
@@ -344,16 +344,17 @@ @@ -344,16 +344,17 @@
344 <string>B5F3B7370E43683600E001FD</string> 344 <string>B5F3B7370E43683600E001FD</string>
345 <string>B567EF5C0E4EE4FC001E238F</string> 345 <string>B567EF5C0E4EE4FC001E238F</string>
346 <string>B567EF5D0E4EE4FC001E238F</string> 346 <string>B567EF5D0E4EE4FC001E238F</string>
347 - <string>B5B3BF120E63470F0071D39F</string>  
348 - <string>B5B3BF150E63470F0071D39F</string>  
349 - <string>B5B3BF190E63470F0071D39F</string>  
350 - <string>B5B3BF5D0E634B5D0071D39F</string>  
351 <string>B500B54C0E635A3200744D82</string> 347 <string>B500B54C0E635A3200744D82</string>
352 - <string>B500B57E0E635BC700744D82</string> 348 + <string>B5CF35640E7A7B2C0050CBA7</string>
353 - <string>B500B57F0E635BC700744D82</string> 349 + <string>B5CF36FC0E7A8C380050CBA7</string>
354 - <string>B500B5800E635BC700744D82</string> 350 + <string>B5CF36FE0E7A8C380050CBA7</string>
355 - <string>B500B5810E635BC700744D82</string> 351 + <string>B5CF36FF0E7A8C380050CBA7</string>
356 - <string>B500B5910E635CE900744D82</string> 352 + <string>B5CF37000E7A8C380050CBA7</string>
  353 + <string>B5CF37010E7A8C380050CBA7</string>
  354 + <string>B5CF37100E7A8C7F0050CBA7</string>
  355 + <string>B5CF37110E7A8C7F0050CBA7</string>
  356 + <string>B5CF37120E7A8C7F0050CBA7</string>
  357 + <string>B5CF36FB0E7A8C380050CBA7</string>
357 </array> 358 </array>
358 <key>prevStack</key> 359 <key>prevStack</key>
359 <array> 360 <array>
@@ -374,6 +375,87 @@ @@ -374,6 +375,87 @@
374 <string>B567EF630E4EE4FC001E238F</string> 375 <string>B567EF630E4EE4FC001E238F</string>
375 <string>B5B3BC690E62DA0E0071D39F</string> 376 <string>B5B3BC690E62DA0E0071D39F</string>
376 <string>B5B3BC6C0E62DA0E0071D39F</string> 377 <string>B5B3BC6C0E62DA0E0071D39F</string>
  378 + <string>B5CF35450E7A73EC0050CBA7</string>
  379 + <string>B5CF35460E7A73EC0050CBA7</string>
  380 + <string>B5CF35470E7A73EC0050CBA7</string>
  381 + <string>B5CF35680E7A7B2C0050CBA7</string>
  382 + <string>B5CF35690E7A7B2C0050CBA7</string>
  383 + <string>B5CF356A0E7A7B2C0050CBA7</string>
  384 + <string>B5CF356B0E7A7B2C0050CBA7</string>
  385 + <string>B5CF356C0E7A7B2C0050CBA7</string>
  386 + <string>B5CF356D0E7A7B2C0050CBA7</string>
  387 + <string>B5CF356F0E7A7B2C0050CBA7</string>
  388 + <string>B5CF35700E7A7B2C0050CBA7</string>
  389 + <string>B5CF357D0E7A7C790050CBA7</string>
  390 + <string>B5CF358E0E7A7F470050CBA7</string>
  391 + <string>B5CF35A90E7A84A00050CBA7</string>
  392 + <string>B5CF35AA0E7A84A00050CBA7</string>
  393 + <string>B5CF35AB0E7A84A00050CBA7</string>
  394 + <string>B5CF35AC0E7A84A00050CBA7</string>
  395 + <string>B5CF35AD0E7A84A00050CBA7</string>
  396 + <string>B5CF35AE0E7A84A00050CBA7</string>
  397 + <string>B5CF35AF0E7A84A00050CBA7</string>
  398 + <string>B5CF35B00E7A84A00050CBA7</string>
  399 + <string>B5CF35B10E7A84A00050CBA7</string>
  400 + <string>B5CF35B20E7A84A00050CBA7</string>
  401 + <string>B5CF35B30E7A84A00050CBA7</string>
  402 + <string>B5CF35B40E7A84A00050CBA7</string>
  403 + <string>B5CF35B50E7A84A00050CBA7</string>
  404 + <string>B5CF35B60E7A84A00050CBA7</string>
  405 + <string>B5CF35B70E7A84A00050CBA7</string>
  406 + <string>B5CF35B80E7A84A00050CBA7</string>
  407 + <string>B5CF35B90E7A84A00050CBA7</string>
  408 + <string>B5CF35CC0E7A85360050CBA7</string>
  409 + <string>B5CF35CD0E7A85360050CBA7</string>
  410 + <string>B5CF35CE0E7A85360050CBA7</string>
  411 + <string>B5CF35E20E7A85A50050CBA7</string>
  412 + <string>B5CF35EC0E7A85E00050CBA7</string>
  413 + <string>B5CF36770E7A88A60050CBA7</string>
  414 + <string>B5CF36780E7A88A60050CBA7</string>
  415 + <string>B5CF36790E7A88A60050CBA7</string>
  416 + <string>B5CF367A0E7A88A60050CBA7</string>
  417 + <string>B5CF367B0E7A88A60050CBA7</string>
  418 + <string>B5CF367C0E7A88A60050CBA7</string>
  419 + <string>B5CF367D0E7A88A60050CBA7</string>
  420 + <string>B5CF367E0E7A88A60050CBA7</string>
  421 + <string>B5CF367F0E7A88A60050CBA7</string>
  422 + <string>B5CF36800E7A88A60050CBA7</string>
  423 + <string>B5CF36810E7A88A60050CBA7</string>
  424 + <string>B5CF36820E7A88A60050CBA7</string>
  425 + <string>B5CF36830E7A88A60050CBA7</string>
  426 + <string>B5CF36840E7A88A60050CBA7</string>
  427 + <string>B5CF36850E7A88A60050CBA7</string>
  428 + <string>B5CF36860E7A88A60050CBA7</string>
  429 + <string>B5CF36870E7A88A60050CBA7</string>
  430 + <string>B5CF36880E7A88A60050CBA7</string>
  431 + <string>B5CF36890E7A88A60050CBA7</string>
  432 + <string>B5CF368A0E7A88A60050CBA7</string>
  433 + <string>B5CF368B0E7A88A60050CBA7</string>
  434 + <string>B5CF368C0E7A88A60050CBA7</string>
  435 + <string>B5CF368D0E7A88A60050CBA7</string>
  436 + <string>B5CF368E0E7A88A60050CBA7</string>
  437 + <string>B5CF368F0E7A88A60050CBA7</string>
  438 + <string>B5CF36900E7A88A60050CBA7</string>
  439 + <string>B5CF36910E7A88A60050CBA7</string>
  440 + <string>B5CF36BE0E7A89F10050CBA7</string>
  441 + <string>B5CF36BF0E7A89F10050CBA7</string>
  442 + <string>B5CF36C80E7A8A610050CBA7</string>
  443 + <string>B5CF36EC0E7A8B440050CBA7</string>
  444 + <string>B5CF37030E7A8C380050CBA7</string>
  445 + <string>B5CF37040E7A8C380050CBA7</string>
  446 + <string>B5CF37050E7A8C380050CBA7</string>
  447 + <string>B5CF37060E7A8C380050CBA7</string>
  448 + <string>B5CF37070E7A8C380050CBA7</string>
  449 + <string>B5CF37080E7A8C380050CBA7</string>
  450 + <string>B5CF37090E7A8C380050CBA7</string>
  451 + <string>B5CF370A0E7A8C380050CBA7</string>
  452 + <string>B5CF370B0E7A8C380050CBA7</string>
  453 + <string>B5CF370C0E7A8C380050CBA7</string>
  454 + <string>B5CF370D0E7A8C380050CBA7</string>
  455 + <string>B5CF370E0E7A8C380050CBA7</string>
  456 + <string>B5CF37130E7A8C7F0050CBA7</string>
  457 + <string>B5CF37140E7A8C7F0050CBA7</string>
  458 + <string>B5CF37150E7A8C7F0050CBA7</string>
377 </array> 459 </array>
378 </dict> 460 </dict>
379 <key>SplitCount</key> 461 <key>SplitCount</key>
@@ -385,14 +467,14 @@ @@ -385,14 +467,14 @@
385 <key>GeometryConfiguration</key> 467 <key>GeometryConfiguration</key>
386 <dict> 468 <dict>
387 <key>Frame</key> 469 <key>Frame</key>
388 - <string>{{0, 0}, {1313, 780}}</string> 470 + <string>{{0, 0}, {1098, 836}}</string>
389 <key>RubberWindowFrame</key> 471 <key>RubberWindowFrame</key>
390 - <string>120 130 1647 920 0 0 1920 1178 </string> 472 + <string>224 81 1432 976 0 0 1920 1178 </string>
391 </dict> 473 </dict>
392 <key>Module</key> 474 <key>Module</key>
393 <string>PBXNavigatorGroup</string> 475 <string>PBXNavigatorGroup</string>
394 <key>Proportion</key> 476 <key>Proportion</key>
395 - <string>780pt</string> 477 + <string>836pt</string>
396 </dict> 478 </dict>
397 <dict> 479 <dict>
398 <key>ContentConfiguration</key> 480 <key>ContentConfiguration</key>
@@ -405,9 +487,9 @@ @@ -405,9 +487,9 @@
405 <key>GeometryConfiguration</key> 487 <key>GeometryConfiguration</key>
406 <dict> 488 <dict>
407 <key>Frame</key> 489 <key>Frame</key>
408 - <string>{{0, 785}, {1313, 94}}</string> 490 + <string>{{0, 841}, {1098, 94}}</string>
409 <key>RubberWindowFrame</key> 491 <key>RubberWindowFrame</key>
410 - <string>120 130 1647 920 0 0 1920 1178 </string> 492 + <string>224 81 1432 976 0 0 1920 1178 </string>
411 </dict> 493 </dict>
412 <key>Module</key> 494 <key>Module</key>
413 <string>XCDetailModule</string> 495 <string>XCDetailModule</string>
@@ -416,7 +498,7 @@ @@ -416,7 +498,7 @@
416 </dict> 498 </dict>
417 </array> 499 </array>
418 <key>Proportion</key> 500 <key>Proportion</key>
419 - <string>1313pt</string> 501 + <string>1098pt</string>
420 </dict> 502 </dict>
421 </array> 503 </array>
422 <key>Name</key> 504 <key>Name</key>
@@ -431,9 +513,9 @@ @@ -431,9 +513,9 @@
431 </array> 513 </array>
432 <key>TableOfContents</key> 514 <key>TableOfContents</key>
433 <array> 515 <array>
434 - <string>B500B5930E635CE900744D82</string> 516 + <string>B5CF35490E7A73EC0050CBA7</string>
435 <string>1CE0B1FE06471DED0097A5F4</string> 517 <string>1CE0B1FE06471DED0097A5F4</string>
436 - <string>B500B5940E635CE900744D82</string> 518 + <string>B5CF354A0E7A73EC0050CBA7</string>
437 <string>1CE0B20306471E060097A5F4</string> 519 <string>1CE0B20306471E060097A5F4</string>
438 <string>1CE0B20506471E060097A5F4</string> 520 <string>1CE0B20506471E060097A5F4</string>
439 </array> 521 </array>
@@ -567,15 +649,16 @@ @@ -567,15 +649,16 @@
567 <integer>5</integer> 649 <integer>5</integer>
568 <key>WindowOrderList</key> 650 <key>WindowOrderList</key>
569 <array> 651 <array>
570 - <string>B500B5A20E635CFE00744D82</string> 652 + <string>1C530D57069F1CE1000CFCEE</string>
571 - <string>B500B5A30E635CFE00744D82</string> 653 + <string>B5CF35540E7A73EC0050CBA7</string>
  654 + <string>B5CF35550E7A73EC0050CBA7</string>
572 <string>B5ABC8410E24CDE70072F422</string> 655 <string>B5ABC8410E24CDE70072F422</string>
573 - <string>1CD10A99069EF8BA00B06720</string>  
574 <string>1C78EAAD065D492600B07095</string> 656 <string>1C78EAAD065D492600B07095</string>
  657 + <string>1CD10A99069EF8BA00B06720</string>
575 <string>/Users/ben/asi-http-request/asi-http-request.xcodeproj</string> 658 <string>/Users/ben/asi-http-request/asi-http-request.xcodeproj</string>
576 </array> 659 </array>
577 <key>WindowString</key> 660 <key>WindowString</key>
578 - <string>120 130 1647 920 0 0 1920 1178 </string> 661 + <string>224 81 1432 976 0 0 1920 1178 </string>
579 <key>WindowToolsV3</key> 662 <key>WindowToolsV3</key>
580 <array> 663 <array>
581 <dict> 664 <dict>
@@ -591,6 +674,8 @@ @@ -591,6 +674,8 @@
591 <key>Dock</key> 674 <key>Dock</key>
592 <array> 675 <array>
593 <dict> 676 <dict>
  677 + <key>BecomeActive</key>
  678 + <true/>
594 <key>ContentConfiguration</key> 679 <key>ContentConfiguration</key>
595 <dict> 680 <dict>
596 <key>PBXProjectModuleGUID</key> 681 <key>PBXProjectModuleGUID</key>
@@ -603,18 +688,16 @@ @@ -603,18 +688,16 @@
603 <key>GeometryConfiguration</key> 688 <key>GeometryConfiguration</key>
604 <dict> 689 <dict>
605 <key>Frame</key> 690 <key>Frame</key>
606 - <string>{{0, 0}, {1440, 536}}</string> 691 + <string>{{0, 0}, {1279, 533}}</string>
607 <key>RubberWindowFrame</key> 692 <key>RubberWindowFrame</key>
608 - <string>259 150 1440 818 0 0 1920 1178 </string> 693 + <string>329 218 1279 815 0 0 1920 1178 </string>
609 </dict> 694 </dict>
610 <key>Module</key> 695 <key>Module</key>
611 <string>PBXNavigatorGroup</string> 696 <string>PBXNavigatorGroup</string>
612 <key>Proportion</key> 697 <key>Proportion</key>
613 - <string>536pt</string> 698 + <string>533pt</string>
614 </dict> 699 </dict>
615 <dict> 700 <dict>
616 - <key>BecomeActive</key>  
617 - <true/>  
618 <key>ContentConfiguration</key> 701 <key>ContentConfiguration</key>
619 <dict> 702 <dict>
620 <key>PBXProjectModuleGUID</key> 703 <key>PBXProjectModuleGUID</key>
@@ -629,9 +712,9 @@ @@ -629,9 +712,9 @@
629 <key>GeometryConfiguration</key> 712 <key>GeometryConfiguration</key>
630 <dict> 713 <dict>
631 <key>Frame</key> 714 <key>Frame</key>
632 - <string>{{0, 541}, {1440, 236}}</string> 715 + <string>{{0, 538}, {1279, 236}}</string>
633 <key>RubberWindowFrame</key> 716 <key>RubberWindowFrame</key>
634 - <string>259 150 1440 818 0 0 1920 1178 </string> 717 + <string>329 218 1279 815 0 0 1920 1178 </string>
635 </dict> 718 </dict>
636 <key>Module</key> 719 <key>Module</key>
637 <string>PBXBuildResultsModule</string> 720 <string>PBXBuildResultsModule</string>
@@ -640,7 +723,7 @@ @@ -640,7 +723,7 @@
640 </dict> 723 </dict>
641 </array> 724 </array>
642 <key>Proportion</key> 725 <key>Proportion</key>
643 - <string>777pt</string> 726 + <string>774pt</string>
644 </dict> 727 </dict>
645 </array> 728 </array>
646 <key>Name</key> 729 <key>Name</key>
@@ -654,14 +737,14 @@ @@ -654,14 +737,14 @@
654 <key>TableOfContents</key> 737 <key>TableOfContents</key>
655 <array> 738 <array>
656 <string>B5ABC8410E24CDE70072F422</string> 739 <string>B5ABC8410E24CDE70072F422</string>
657 - <string>B500B5950E635CE900744D82</string> 740 + <string>B5CF354B0E7A73EC0050CBA7</string>
658 <string>1CD0528F0623707200166675</string> 741 <string>1CD0528F0623707200166675</string>
659 <string>XCMainBuildResultsModuleGUID</string> 742 <string>XCMainBuildResultsModuleGUID</string>
660 </array> 743 </array>
661 <key>ToolbarConfiguration</key> 744 <key>ToolbarConfiguration</key>
662 <string>xcode.toolbar.config.buildV3</string> 745 <string>xcode.toolbar.config.buildV3</string>
663 <key>WindowString</key> 746 <key>WindowString</key>
664 - <string>259 150 1440 818 0 0 1920 1178 </string> 747 + <string>329 218 1279 815 0 0 1920 1178 </string>
665 <key>WindowToolGUID</key> 748 <key>WindowToolGUID</key>
666 <string>B5ABC8410E24CDE70072F422</string> 749 <string>B5ABC8410E24CDE70072F422</string>
667 <key>WindowToolIsVisible</key> 750 <key>WindowToolIsVisible</key>
@@ -740,6 +823,8 @@ @@ -740,6 +823,8 @@
740 <array> 823 <array>
741 <string>Name</string> 824 <string>Name</string>
742 <real>151</real> 825 <real>151</real>
  826 + <string>Type</string>
  827 + <real>84</real>
743 <string>Value</string> 828 <string>Value</string>
744 <real>85</real> 829 <real>85</real>
745 <string>Summary</string> 830 <string>Summary</string>
@@ -748,10 +833,10 @@ @@ -748,10 +833,10 @@
748 <key>Frame</key> 833 <key>Frame</key>
749 <string>{{713, 0}, {851, 339}}</string> 834 <string>{{713, 0}, {851, 339}}</string>
750 <key>RubberWindowFrame</key> 835 <key>RubberWindowFrame</key>
751 - <string>60 308 1564 676 0 0 1920 1178 </string> 836 + <string>179 278 1564 676 0 0 1920 1178 </string>
752 </dict> 837 </dict>
753 <key>RubberWindowFrame</key> 838 <key>RubberWindowFrame</key>
754 - <string>60 308 1564 676 0 0 1920 1178 </string> 839 + <string>179 278 1564 676 0 0 1920 1178 </string>
755 </dict> 840 </dict>
756 <key>Module</key> 841 <key>Module</key>
757 <string>PBXDebugSessionModule</string> 842 <string>PBXDebugSessionModule</string>
@@ -774,18 +859,18 @@ @@ -774,18 +859,18 @@
774 <key>TableOfContents</key> 859 <key>TableOfContents</key>
775 <array> 860 <array>
776 <string>1CD10A99069EF8BA00B06720</string> 861 <string>1CD10A99069EF8BA00B06720</string>
777 - <string>B500B5960E635CE900744D82</string> 862 + <string>B5CF354C0E7A73EC0050CBA7</string>
778 <string>1C162984064C10D400B95A72</string> 863 <string>1C162984064C10D400B95A72</string>
779 - <string>B500B5970E635CE900744D82</string> 864 + <string>B5CF354D0E7A73EC0050CBA7</string>
780 - <string>B500B5980E635CE900744D82</string> 865 + <string>B5CF354E0E7A73EC0050CBA7</string>
781 - <string>B500B5990E635CE900744D82</string> 866 + <string>B5CF354F0E7A73EC0050CBA7</string>
782 - <string>B500B59A0E635CE900744D82</string> 867 + <string>B5CF35500E7A73EC0050CBA7</string>
783 - <string>B500B59B0E635CE900744D82</string> 868 + <string>B5CF35510E7A73EC0050CBA7</string>
784 </array> 869 </array>
785 <key>ToolbarConfiguration</key> 870 <key>ToolbarConfiguration</key>
786 <string>xcode.toolbar.config.debugV3</string> 871 <string>xcode.toolbar.config.debugV3</string>
787 <key>WindowString</key> 872 <key>WindowString</key>
788 - <string>60 308 1564 676 0 0 1920 1178 </string> 873 + <string>179 278 1564 676 0 0 1920 1178 </string>
789 <key>WindowToolGUID</key> 874 <key>WindowToolGUID</key>
790 <string>1CD10A99069EF8BA00B06720</string> 875 <string>1CD10A99069EF8BA00B06720</string>
791 <key>WindowToolIsVisible</key> 876 <key>WindowToolIsVisible</key>
@@ -807,14 +892,12 @@ @@ -807,14 +892,12 @@
807 <key>Dock</key> 892 <key>Dock</key>
808 <array> 893 <array>
809 <dict> 894 <dict>
810 - <key>BecomeActive</key>  
811 - <true/>  
812 <key>ContentConfiguration</key> 895 <key>ContentConfiguration</key>
813 <dict> 896 <dict>
814 <key>PBXProjectModuleGUID</key> 897 <key>PBXProjectModuleGUID</key>
815 <string>1CDD528C0622207200134675</string> 898 <string>1CDD528C0622207200134675</string>
816 <key>PBXProjectModuleLabel</key> 899 <key>PBXProjectModuleLabel</key>
817 - <string>ASIHTTPCookie.m</string> 900 + <string></string>
818 <key>StatusBarVisibility</key> 901 <key>StatusBarVisibility</key>
819 <true/> 902 <true/>
820 </dict> 903 </dict>
@@ -835,6 +918,8 @@ @@ -835,6 +918,8 @@
835 <string>212pt</string> 918 <string>212pt</string>
836 </dict> 919 </dict>
837 <dict> 920 <dict>
  921 + <key>BecomeActive</key>
  922 + <true/>
838 <key>ContentConfiguration</key> 923 <key>ContentConfiguration</key>
839 <dict> 924 <dict>
840 <key>PBXProjectModuleGUID</key> 925 <key>PBXProjectModuleGUID</key>
@@ -870,8 +955,8 @@ @@ -870,8 +955,8 @@
870 <key>TableOfContents</key> 955 <key>TableOfContents</key>
871 <array> 956 <array>
872 <string>1C530D57069F1CE1000CFCEE</string> 957 <string>1C530D57069F1CE1000CFCEE</string>
873 - <string>B5B3BE4F0E633CE50071D39F</string> 958 + <string>B5CF35C20E7A84E30050CBA7</string>
874 - <string>B5B3BE500E633CE50071D39F</string> 959 + <string>B5CF35C30E7A84E30050CBA7</string>
875 <string>1CDD528C0622207200134675</string> 960 <string>1CDD528C0622207200134675</string>
876 <string>1CD0528E0623707200166675</string> 961 <string>1CD0528E0623707200166675</string>
877 </array> 962 </array>
@@ -911,18 +996,18 @@ @@ -911,18 +996,18 @@
911 <key>GeometryConfiguration</key> 996 <key>GeometryConfiguration</key>
912 <dict> 997 <dict>
913 <key>Frame</key> 998 <key>Frame</key>
914 - <string>{{0, 0}, {985, 866}}</string> 999 + <string>{{0, 0}, {1211, 827}}</string>
915 <key>RubberWindowFrame</key> 1000 <key>RubberWindowFrame</key>
916 - <string>433 271 985 907 0 0 1920 1178 </string> 1001 + <string>562 242 1211 868 0 0 1920 1178 </string>
917 </dict> 1002 </dict>
918 <key>Module</key> 1003 <key>Module</key>
919 <string>PBXDebugCLIModule</string> 1004 <string>PBXDebugCLIModule</string>
920 <key>Proportion</key> 1005 <key>Proportion</key>
921 - <string>866pt</string> 1006 + <string>827pt</string>
922 </dict> 1007 </dict>
923 </array> 1008 </array>
924 <key>Proportion</key> 1009 <key>Proportion</key>
925 - <string>866pt</string> 1010 + <string>827pt</string>
926 </dict> 1011 </dict>
927 </array> 1012 </array>
928 <key>Name</key> 1013 <key>Name</key>
@@ -936,13 +1021,13 @@ @@ -936,13 +1021,13 @@
936 <key>TableOfContents</key> 1021 <key>TableOfContents</key>
937 <array> 1022 <array>
938 <string>1C78EAAD065D492600B07095</string> 1023 <string>1C78EAAD065D492600B07095</string>
939 - <string>B500B5A00E635CFE00744D82</string> 1024 + <string>B5CF35520E7A73EC0050CBA7</string>
940 <string>1C78EAAC065D492600B07095</string> 1025 <string>1C78EAAC065D492600B07095</string>
941 </array> 1026 </array>
942 <key>ToolbarConfiguration</key> 1027 <key>ToolbarConfiguration</key>
943 <string>xcode.toolbar.config.consoleV3</string> 1028 <string>xcode.toolbar.config.consoleV3</string>
944 <key>WindowString</key> 1029 <key>WindowString</key>
945 - <string>433 271 985 907 0 0 1920 1178 </string> 1030 + <string>562 242 1211 868 0 0 1920 1178 </string>
946 <key>WindowToolGUID</key> 1031 <key>WindowToolGUID</key>
947 <string>1C78EAAD065D492600B07095</string> 1032 <string>1C78EAAD065D492600B07095</string>
948 <key>WindowToolIsVisible</key> 1033 <key>WindowToolIsVisible</key>
This diff could not be displayed because it is too large.
This diff was suppressed by a .gitattributes entry.