Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

more or less completed full session validation code, with rough examp…

…le in demo app
  • Loading branch information...
commit 535498bc5493f5ff4465faca4a6d766adb9e9c79 1 parent 383b0a5
Matt Patenaude authored
View
16 Controller.h
@@ -28,21 +28,35 @@
#import <Last.fm/Last.fm.h>
+// Forward declarations
+@class UIController;
+
@interface Controller : NSObject<LFWebServiceDelegate> {
+ IBOutlet UIController *uiController;
+
IBOutlet NSButton *authButton;
IBOutlet NSProgressIndicator *authSpinner;
+
+ BOOL authorizationPending;
}
// Application delegate methods
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
+- (void)applicationDidBecomeActive:(NSNotification *)aNotification;
// Authorization methods
+- (void)connectWithStoredCredentials;
- (IBAction)connectWithLastFM:(id)sender;
- (IBAction)completeAuthorization:(id)sender;
- (IBAction)openManagementPage:(id)sender;
// Web service delegate methods
- (void)sessionNeedsAuthorizationViaURL:(NSURL *)theURL;
-- (void)sessionStartedWithKey:(NSString *)theKey user:(NSString *)theUser;
+- (void)sessionAuthorizationStillPending;
+- (void)sessionAuthorizationFailed;
+- (void)sessionCreatedWithKey:(NSString *)theKey user:(NSString *)theUser;
+
+- (void)sessionValidatedForUser:(NSString *)theUser;
+- (void)sessionInvalidForUser:(NSString *)theUser;
@end
View
113 Controller.m
@@ -25,14 +25,28 @@
//
#import "Controller.h"
+#import "UIController.h"
#import <Last.fm/Last.fm.h>
+#import "EMKeychainProxy.h"
+#import "EMKeychainItem.h"
@implementation Controller
+#pragma mark Initializers
++ (void)initialize
+{
+ NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], @"LastFMConfigured", @"", @"LastFMUsername", nil];
+ [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
+}
+
#pragma mark Application delegate methods
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
+ // We'll use this variable for when we need to switch back and
+ // forth between the web browser
+ authorizationPending = NO;
+
// First, let's setup the web service object
// You can obtain the API key and shared secret on your API info page
// - http://www.last.fm/api/account
@@ -53,26 +67,53 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
// First, we'll check to see if we have one. If we do,
// we'll set it, then test it. Otherwise, we'll wait for
// someone to click the "Connect" button.
+ [self connectWithStoredCredentials];
+}
+- (void)applicationDidBecomeActive:(NSNotification *)aNotification
+{
+ // If we have a pending authorization, this is our
+ // cue to start trying to validate it
+ if (authorizationPending)
+ {
+ authorizationPending = NO;
+ [self completeAuthorization:aNotification];
+ }
}
#pragma mark Authorization methods
+- (void)connectWithStoredCredentials
+{
+ if ([[NSUserDefaults standardUserDefaults] boolForKey:@"LastFMConfigured"])
+ {
+ NSString *theUser = [[NSUserDefaults standardUserDefaults] objectForKey:@"LastFMUsername"];
+
+ NSString *keychainService = [NSString stringWithFormat:@"Last.fm (%@)", [[NSBundle mainBundle] bundleIdentifier]];
+ EMGenericKeychainItem *keyItem = [[EMKeychainProxy sharedProxy] genericKeychainItemForService:keychainService withUsername:theUser];
+ if (keyItem)
+ {
+ LFWebService *lastfm = [LFWebService sharedWebService];
+ [lastfm setSessionUser:theUser];
+ [lastfm setSessionKey:[keyItem password]];
+
+ [lastfm validateSessionCredentials];
+
+ // Adjust the UI
+ [uiController showAuthValidatingPane];
+ }
+ }
+}
- (IBAction)connectWithLastFM:(id)sender
{
// This means we're going to force establish a new Last.fm session
[[LFWebService sharedWebService] establishNewSession];
- // While we're waiting, let's make it not clickable, and show an animation
- [authButton setEnabled:NO];
- [authSpinner startAnimation:self];
+ // Adjust the UI to show status
+ [uiController showAuthPreAuthPane];
}
- (IBAction)completeAuthorization:(id)sender
{
// And now we finish authorization
[[LFWebService sharedWebService] finishSessionAuthorization];
-
- // While we're waiting, let's make it not clickable, and show an animation
- [authButton setEnabled:NO];
- [authSpinner startAnimation:self];
}
- (IBAction)openManagementPage:(id)sender
{
@@ -83,26 +124,58 @@ - (IBAction)openManagementPage:(id)sender
#pragma mark Web service delegate methods
- (void)sessionNeedsAuthorizationViaURL:(NSURL *)theURL
{
- // OK, so the first stage is done; what we need to do
- // now is reprogram the button to "Complete" authorization,
+ // OK, so the first stage is done; we'll update the
+ // UI to match the current status,
// then open up the web browser to have the user allow our demo app
// access
- [authButton setTitle:@"Complete Authorization"];
- [authButton sizeToFit];
- [authButton setAction:@selector(completeAuthorization:)];
- [authButton setEnabled:YES];
- [authSpinner stopAnimation:self];
+ [uiController showAuthWaitingPane];
[[NSWorkspace sharedWorkspace] openURL:theURL];
+ authorizationPending = YES;
+}
+- (void)sessionAuthorizationStillPending
+{
+ // We tried to authorize the session, but the user
+ // isn't done in the web browser yet. Wait 5 seconds,
+ // then try again.
+
+ [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(completeAuthorization:) userInfo:nil repeats:NO];
}
-- (void)sessionStartedWithKey:(NSString *)theKey user:(NSString *)theUser
+- (void)sessionAuthorizationFailed
{
+ // We failed. Epically.
+ [uiController showAuthConnectPane];
+}
+- (void)sessionCreatedWithKey:(NSString *)theKey user:(NSString *)theUser
+{
+ // The session key will be valid for future uses -- it never
+ // expires unless explicitly revoked by the Last.fm user.
+ // Therefore, we can store the user as a default, and then store
+ // the key in the Keychain for future use.
+
+ [[NSUserDefaults standardUserDefaults] setObject:theUser forKey:@"LastFMUsername"];
+ [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"LastFMConfigured"];
+
+ NSString *keychainService = [NSString stringWithFormat:@"Last.fm (%@)", [[NSBundle mainBundle] bundleIdentifier]];
+ EMGenericKeychainItem *keyItem = [[EMKeychainProxy sharedProxy] genericKeychainItemForService:keychainService withUsername:theUser];
+ if (keyItem)
+ [keyItem setPassword:theKey];
+ else
+ [[EMKeychainProxy sharedProxy] addGenericKeychainItemForService:keychainService withUsername:theUser password:theKey];
+
// Hooray! we're up and running
- [authButton setTitle:@"Manage Last.fm Access"];
- [authButton sizeToFit];
- [authButton setAction:@selector(openManagementPage:)];
- [authButton setEnabled:YES];
- [authSpinner stopAnimation:self];
+ [uiController showAuthConnectedPane];
+}
+
+- (void)sessionValidatedForUser:(NSString *)theUser
+{
+ // Hooray! we're up and running
+ [uiController showAuthConnectedPane];
+}
+- (void)sessionInvalidForUser:(NSString *)theUser
+{
+ // We failed. Epically.
+ [uiController showAuthConnectPane];
}
@end
View
306 English.lproj/MainMenu.xib
@@ -1313,7 +1313,7 @@
<int key="NSCellFlags">68288064</int>
<int key="NSCellFlags2">272630784</int>
<string key="NSContents">Authorization</string>
- <object class="NSFont" key="NSSupport">
+ <object class="NSFont" key="NSSupport" id="414615820">
<string key="NSName">LucidaGrande-Bold</string>
<double key="NSSize">13</double>
<int key="NSfFlags">16</int>
@@ -1339,33 +1339,33 @@
</object>
</object>
</object>
- <object class="NSTextField" id="674161286">
+ <object class="NSTextField" id="1022939725">
<reference key="NSNextResponder" ref="414427165"/>
<int key="NSvFlags">268</int>
- <string key="NSFrame">{{29, 174}, {434, 51}}</string>
+ <string key="NSFrame">{{29, 174}, {406, 51}}</string>
<reference key="NSSuperview" ref="414427165"/>
<bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="135691014">
+ <object class="NSTextFieldCell" key="NSCell" id="478613190">
<int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">272629760</int>
- <string key="NSContents">In order to allow an application access to your account, you first have to authorize it. If you haven't yet authorized this demo app, you'll see a Connect button below.</string>
+ <int key="NSCellFlags2">1346371584</int>
+ <string key="NSContents">In order to use Last.fm within this application, you first need to connect it with your account. Click the button below to get started.</string>
<object class="NSFont" key="NSSupport">
<string key="NSName">LucidaGrande</string>
<double key="NSSize">13</double>
<int key="NSfFlags">16</int>
</object>
- <reference key="NSControlView" ref="674161286"/>
+ <reference key="NSControlView" ref="1022939725"/>
<reference key="NSBackgroundColor" ref="1049192776"/>
<reference key="NSTextColor" ref="1036418474"/>
</object>
</object>
- <object class="NSButton" id="244685893">
+ <object class="NSButton" id="67580701">
<reference key="NSNextResponder" ref="414427165"/>
- <int key="NSvFlags">269</int>
- <string key="NSFrame">{{153, 129}, {174, 32}}</string>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{145, 126}, {174, 32}}</string>
<reference key="NSSuperview" ref="414427165"/>
<bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="276113291">
+ <object class="NSButtonCell" key="NSCell" id="961614834">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents">Connect with Last.fm</string>
@@ -1374,7 +1374,7 @@
<double key="NSSize">13</double>
<int key="NSfFlags">1044</int>
</object>
- <reference key="NSControlView" ref="244685893"/>
+ <reference key="NSControlView" ref="67580701"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
@@ -1383,11 +1383,27 @@
<int key="NSPeriodicInterval">25</int>
</object>
</object>
- <object class="NSProgressIndicator" id="138179731">
+ <object class="NSTextField" id="784266248">
+ <reference key="NSNextResponder" ref="414427165"/>
+ <int key="NSvFlags">-2147483380</int>
+ <string key="NSFrame">{{109, 137}, {221, 17}}</string>
+ <reference key="NSSuperview" ref="414427165"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="46702443">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Making Authorization Request…</string>
+ <reference key="NSSupport" ref="414615820"/>
+ <reference key="NSControlView" ref="784266248"/>
+ <reference key="NSBackgroundColor" ref="1049192776"/>
+ <reference key="NSTextColor" ref="1036418474"/>
+ </object>
+ </object>
+ <object class="NSProgressIndicator" id="834564291">
<reference key="NSNextResponder" ref="414427165"/>
<int key="NSvFlags">1292</int>
<object class="NSPSMatrix" key="NSDrawMatrix"/>
- <string key="NSFrame">{{329, 138}, {16, 16}}</string>
+ <string key="NSFrame">{{335, 136}, {16, 16}}</string>
<reference key="NSSuperview" ref="414427165"/>
<int key="NSpiFlags">28938</int>
<double key="NSMaxValue">100</double>
@@ -1402,6 +1418,9 @@
<object class="NSCustomObject" id="152045297">
<string key="NSClassName">Controller</string>
</object>
+ <object class="NSCustomObject" id="187476266">
+ <string key="NSClassName">UIController</string>
+ </object>
</object>
<object class="IBObjectContainer" key="IBDocument.Objects">
<object class="NSMutableArray" key="connectionRecords">
@@ -2071,28 +2090,52 @@
<int key="connectionID">814</int>
</object>
<object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">connectWithLastFM:</string>
- <reference key="source" ref="152045297"/>
- <reference key="destination" ref="244685893"/>
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">authConnectButton</string>
+ <reference key="source" ref="187476266"/>
+ <reference key="destination" ref="67580701"/>
</object>
- <int key="connectionID">822</int>
+ <int key="connectionID">876</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
- <string key="label">authButton</string>
- <reference key="source" ref="152045297"/>
- <reference key="destination" ref="244685893"/>
+ <string key="label">authInstructionText</string>
+ <reference key="source" ref="187476266"/>
+ <reference key="destination" ref="1022939725"/>
</object>
- <int key="connectionID">823</int>
+ <int key="connectionID">877</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">authSpinner</string>
+ <reference key="source" ref="187476266"/>
+ <reference key="destination" ref="834564291"/>
+ </object>
+ <int key="connectionID">878</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">authStatus</string>
+ <reference key="source" ref="187476266"/>
+ <reference key="destination" ref="784266248"/>
+ </object>
+ <int key="connectionID">879</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">uiController</string>
<reference key="source" ref="152045297"/>
- <reference key="destination" ref="138179731"/>
+ <reference key="destination" ref="187476266"/>
</object>
- <int key="connectionID">825</int>
+ <int key="connectionID">880</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">connectWithLastFM:</string>
+ <reference key="source" ref="152045297"/>
+ <reference key="destination" ref="67580701"/>
+ </object>
+ <int key="connectionID">881</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
@@ -2433,9 +2476,10 @@
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="838325125"/>
- <reference ref="674161286"/>
- <reference ref="244685893"/>
- <reference ref="138179731"/>
+ <reference ref="1022939725"/>
+ <reference ref="67580701"/>
+ <reference ref="784266248"/>
+ <reference ref="834564291"/>
</object>
<reference key="parent" ref="513744381"/>
</object>
@@ -3164,37 +3208,57 @@
<reference key="parent" ref="838325125"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">815</int>
- <reference key="object" ref="674161286"/>
+ <int key="objectID">846</int>
+ <reference key="object" ref="187476266"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">UI</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">869</int>
+ <reference key="object" ref="1022939725"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="135691014"/>
+ <reference ref="478613190"/>
</object>
<reference key="parent" ref="414427165"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">816</int>
- <reference key="object" ref="135691014"/>
- <reference key="parent" ref="674161286"/>
+ <int key="objectID">870</int>
+ <reference key="object" ref="67580701"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="961614834"/>
+ </object>
+ <reference key="parent" ref="414427165"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">819</int>
- <reference key="object" ref="244685893"/>
+ <int key="objectID">871</int>
+ <reference key="object" ref="784266248"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="276113291"/>
+ <reference ref="46702443"/>
</object>
<reference key="parent" ref="414427165"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">820</int>
- <reference key="object" ref="276113291"/>
- <reference key="parent" ref="244685893"/>
+ <int key="objectID">872</int>
+ <reference key="object" ref="834564291"/>
+ <reference key="parent" ref="414427165"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">824</int>
- <reference key="object" ref="138179731"/>
- <reference key="parent" ref="414427165"/>
+ <int key="objectID">873</int>
+ <reference key="object" ref="46702443"/>
+ <reference key="parent" ref="784266248"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">874</int>
+ <reference key="object" ref="961614834"/>
+ <reference key="parent" ref="67580701"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">875</int>
+ <reference key="object" ref="478613190"/>
+ <reference key="parent" ref="1022939725"/>
</object>
</object>
</object>
@@ -3413,15 +3477,17 @@
<string>81.editorWindowContentRectSynchronizationRect</string>
<string>812.IBPluginDependency</string>
<string>813.IBPluginDependency</string>
- <string>815.IBPluginDependency</string>
- <string>816.IBPluginDependency</string>
- <string>819.IBPluginDependency</string>
<string>82.IBPluginDependency</string>
<string>82.ImportedFromIB2</string>
- <string>820.IBPluginDependency</string>
- <string>824.IBPluginDependency</string>
<string>83.IBPluginDependency</string>
<string>83.ImportedFromIB2</string>
+ <string>869.IBPluginDependency</string>
+ <string>870.IBPluginDependency</string>
+ <string>871.IBPluginDependency</string>
+ <string>872.IBPluginDependency</string>
+ <string>873.IBPluginDependency</string>
+ <string>874.IBPluginDependency</string>
+ <string>875.IBPluginDependency</string>
<string>92.IBPluginDependency</string>
<string>92.ImportedFromIB2</string>
</object>
@@ -3639,14 +3705,16 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="1"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1"/>
</object>
@@ -3667,7 +3735,7 @@
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">827</int>
+ <int key="maxID">881</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -3696,11 +3764,13 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<string>authButton</string>
<string>authSpinner</string>
+ <string>uiController</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>NSProgressIndicator</string>
+ <string>UIController</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@@ -3708,6 +3778,31 @@
<string key="minorKey">Controller.h</string>
</object>
</object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>authConnectButton</string>
+ <string>authInstructionText</string>
+ <string>authSpinner</string>
+ <string>authStatus</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSButton</string>
+ <string>NSTextField</string>
+ <string>NSProgressIndicator</string>
+ <string>NSTextField</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">UIController.h</string>
+ </object>
+ </object>
</object>
<object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -4153,76 +4248,6 @@
</object>
</object>
<object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebDownload.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebEditingDelegate.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebFrameLoadDelegate.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebJavaPlugIn.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebPlugin.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebPluginContainer.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebPolicyDelegate.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebResourceLoadDelegate.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebScriptObject.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
- <string key="className">NSObject</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebUIDelegate.h</string>
- </object>
- </object>
- <object class="IBPartialClassDescription">
<string key="className">NSProgressIndicator</string>
<string key="superclassName">NSView</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@@ -4327,45 +4352,6 @@
<string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string>
</object>
</object>
- <object class="IBPartialClassDescription">
- <string key="className">WebView</string>
- <string key="superclassName">NSView</string>
- <object class="NSMutableDictionary" key="actions">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>goBack:</string>
- <string>goForward:</string>
- <string>makeTextLarger:</string>
- <string>makeTextSmaller:</string>
- <string>makeTextStandardSize:</string>
- <string>reload:</string>
- <string>reloadFromOrigin:</string>
- <string>stopLoading:</string>
- <string>takeStringURLFrom:</string>
- <string>toggleContinuousSpellChecking:</string>
- <string>toggleSmartInsertDelete:</string>
- </object>
- <object class="NSMutableArray" key="dict.values">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- <string>id</string>
- </object>
- </object>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
- <string key="majorKey">IBFrameworkSource</string>
- <string key="minorKey">WebKit.framework/Headers/WebView.h</string>
- </object>
- </object>
</object>
</object>
<int key="IBDocument.localizationMode">0</int>
View
3  LFRequest.h
@@ -34,7 +34,8 @@ typedef enum _LFRequestType {
LFRequestLove = 3,
LFRequestBan = 4,
LFRequestGetToken = 5,
- LFRequestGetSession = 6
+ LFRequestGetSession = 6,
+ LFRequestValidateSession = 7
} LFRequestType;
// Forward declarations
View
1  LFRequestTypes.h
@@ -30,3 +30,4 @@
#import "LFBanRequest.h"
#import "LFGetTokenRequest.h"
#import "LFGetSessionRequest.h"
+#import "LFValidateSessionRequest.h"
View
40 LFValidateSessionRequest.h
@@ -0,0 +1,40 @@
+//
+// LFValidateSessionRequest.h
+// Last.fm
+//
+// Created by Matt Patenaude on 11/8/09.
+// Copyright (C) 2009 {13bold}.
+//
+// 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 <Cocoa/Cocoa.h>
+#import "LFRequest.h"
+
+
+@interface LFValidateSessionRequest : LFRequest {
+
+}
+
+// Overridden methods
+- (id)initWithTrack:(LFTrack *)theTrack;
+- (void)dispatch;
+- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection;
+
+@end
View
95 LFValidateSessionRequest.m
@@ -0,0 +1,95 @@
+//
+// LFValidateSessionRequest.m
+// Last.fm
+//
+// Created by Matt Patenaude on 11/8/09.
+// Copyright 2009 __MyCompanyName__. All rights reserved.
+//
+
+#import "LFValidateSessionRequest.h"
+
+
+@implementation LFValidateSessionRequest
+
+#pragma mark Overridden methods
+- (id)initWithTrack:(LFTrack *)theTrack
+{
+ if (self = [super initWithTrack:theTrack])
+ {
+ requestType = LFRequestValidateSession;
+ }
+ return self;
+}
+- (void)dispatch
+{
+ NSDictionary *params = [[NSDictionary alloc] initWithObjectsAndKeys:
+ @"user.getInfo", @"method",
+ [delegate sessionKey], @"sk",
+ [delegate APIKey], @"api_key",
+ nil];
+
+ NSURL *theURL = [self URLWithParameters:params sign:YES];
+ [params release];
+
+ NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL];
+
+ if (connection)
+ {
+ [connection release];
+ connection = nil;
+ }
+ connection = [[NSURLConnection connectionWithRequest:theRequest delegate:self] retain];
+}
+- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection
+{
+ NSError *err;
+ NSXMLDocument *theResponse = [[NSXMLDocument alloc] initWithData:responseData options:0 error:&err];
+
+ if (err)
+ {
+ if (delegate && [delegate respondsToSelector:@selector(request:failedWithError:)])
+ [delegate request:self failedWithError:err];
+ return;
+ }
+
+ NSXMLElement *root = [theResponse rootElement];
+ NSString *status = [[[root attributeForName:@"status"] stringValue] lowercaseString];
+
+ if ([status isEqualToString:@"ok"])
+ {
+ NSString *username = [[[[[root elementsForName:@"user"] objectAtIndex:0] elementsForName:@"name"] objectAtIndex:0] stringValue];
+
+ if ([[username lowercaseString] isEqualToString:[[delegate sessionUser] lowercaseString]])
+ {
+ if (delegate && [delegate respondsToSelector:@selector(requestSucceeded:)])
+ [delegate requestSucceeded:self];
+ }
+ else
+ {
+ // valid session but for a different user, sounds suspicious
+ // Last.fm does not presently allow you to change your username
+ // we're going to fail here, just to be on the safe side
+ if (delegate && [delegate respondsToSelector:@selector(request:failedWithError:)])
+ [delegate request:self failedWithError:[NSError errorWithDomain:@"LFMFramework" code:0 userInfo:[NSDictionary dictionaryWithObject:@"An unknown error occurred." forKey:NSLocalizedDescriptionKey]]];
+ }
+
+ }
+ else if ([status isEqualToString:@"failed"])
+ {
+ NSXMLElement *errorNode = [[root elementsForName:@"error"] objectAtIndex:0];
+ NSError *theError = [NSError errorWithDomain:@"Last.fm" code:[[[errorNode attributeForName:@"code"] objectValue] integerValue] userInfo:[NSDictionary dictionaryWithObject:[errorNode stringValue] forKey:NSLocalizedDescriptionKey]];
+ if (delegate && [delegate respondsToSelector:@selector(request:failedWithError:)])
+ [delegate request:self failedWithError:theError];
+ }
+ else
+ {
+ if (delegate && [delegate respondsToSelector:@selector(request:failedWithError:)])
+ [delegate request:self failedWithError:[NSError errorWithDomain:@"LFMFramework" code:0 userInfo:[NSDictionary dictionaryWithObject:@"An unknown error occurred." forKey:NSLocalizedDescriptionKey]]];
+ }
+
+ [theResponse release];
+ [connection release];
+ connection = nil;
+}
+
+@end
View
5 LFWebService.h
@@ -59,10 +59,13 @@
@property(copy) NSString *sessionUser;
@property(retain,readonly) LFTrack *currentTrack;
-// Session methods
+// Session methods (new sessions)
- (NSString *)establishNewSession;
- (NSString *)finishSessionAuthorization;
+// Session methods (existing sessions)
+- (NSString *)validateSessionCredentials;
+
// Track methods
- (NSString *)startPlayingTrack:(LFTrack *)theTrack;
- (NSString *)scrobbleTrackIfNecessary:(LFTrack *)theTrack;
View
108 LFWebService.m
@@ -76,7 +76,7 @@ - (void)dealloc
@synthesize sessionUser;
@synthesize currentTrack;
-#pragma mark Session methods
+#pragma mark Session methods (new sessions)
- (NSString *)establishNewSession
{
if (pendingToken)
@@ -105,6 +105,15 @@ - (NSString *)finishSessionAuthorization
return [theRequest identifier];
}
+#pragma mark Session methods (existing sessions)
+- (NSString *)validateSessionCredentials
+{
+ LFValidateSessionRequest *theRequest = [LFValidateSessionRequest request];
+ [requestQueue insertObject:theRequest atIndex:0];
+ [self dispatchNextRequestIfPossible];
+ return [theRequest identifier];
+}
+
#pragma mark Track methods
- (NSString *)startPlayingTrack:(LFTrack *)theTrack
{
@@ -206,8 +215,15 @@ - (void)requestSucceeded:(LFRequest *)theRequest
}
sessionKey = [[(LFGetSessionRequest *)theRequest sessionKey] copy];
- if (delegate && [delegate respondsToSelector:@selector(sessionStartedWithKey:user:)])
- [delegate sessionStartedWithKey:sessionKey user:sessionUser];
+ if (delegate && [delegate respondsToSelector:@selector(sessionCreatedWithKey:user:)])
+ [delegate sessionCreatedWithKey:sessionKey user:sessionUser];
+
+ shouldProceed = YES;
+ }
+ else if (r == LFRequestValidateSession)
+ {
+ if (delegate && [delegate respondsToSelector:@selector(sessionValidatedForUser:)])
+ [delegate sessionValidatedForUser:sessionUser];
shouldProceed = YES;
}
@@ -232,7 +248,91 @@ - (void)request:(LFRequest *)theRequest failedWithError:(NSError *)theError
// if it's not a communication error, but it's a "this request will never work" error, remove, dispatch
// if it's a communication error, leave it in the queue, but don't dispatch
- NSLog(@"%@", [theError description]);
+ LFRequestType r = [theRequest requestType];
+ if (r == LFRequestNowPlaying)
+ {
+ if (![[theError domain] isEqualToString:@"Last.fm"])
+ {
+ NSLog(@"Last.fm.framework: error, %@", [theError localizedDescription]);
+ if (delegate && [delegate respondsToSelector:@selector(nowPlayingFailedForTrack:error:willRetry:)])
+ [delegate nowPlayingFailedForTrack:[theRequest track] error:theError willRetry:YES];
+ }
+ else
+ {
+
+ }
+ }
+ else if (r == LFRequestScrobble)
+ {
+ if (![[theError domain] isEqualToString:@"Last.fm"])
+ {
+ NSLog(@"Last.fm.framework: error, %@", [theError localizedDescription]);
+ if (delegate && [delegate respondsToSelector:@selector(scrobbleFailedForTrack:error:willRetry:)])
+ [delegate scrobbleFailedForTrack:[theRequest track] error:theError willRetry:YES];
+ }
+ else
+ {
+
+ }
+ }
+ else if (r == LFRequestLove)
+ {
+ if (![[theError domain] isEqualToString:@"Last.fm"])
+ {
+ NSLog(@"Last.fm.framework: error, %@", [theError localizedDescription]);
+ if (delegate && [delegate respondsToSelector:@selector(loveFailedForTrack:error:willRetry:)])
+ [delegate loveFailedForTrack:[theRequest track] error:theError willRetry:YES];
+ }
+ else
+ {
+
+ }
+ }
+ else if (r == LFRequestBan)
+ {
+ if (![[theError domain] isEqualToString:@"Last.fm"])
+ {
+ NSLog(@"Last.fm.framework: error, %@", [theError localizedDescription]);
+ if (delegate && [delegate respondsToSelector:@selector(banFailedForTrack:error:willRetry:)])
+ [delegate banFailedForTrack:[theRequest track] error:theError willRetry:YES];
+ }
+ else
+ {
+
+ }
+ }
+ else if (r == LFRequestGetToken)
+ {
+
+ }
+ else if (r == LFRequestGetSession)
+ {
+ if (![[theError domain] isEqualToString:@"Last.fm"] || [theError code] != 14)
+ {
+ NSLog(@"Last.fm.framework: error, %@", [theError localizedDescription]);
+ if (delegate && [delegate respondsToSelector:@selector(sessionAuthorizationFailed)])
+ [delegate sessionAuthorizationFailed];
+ }
+ else if ([theError code] == 14) // token not yet authorized
+ {
+ if (delegate && [delegate respondsToSelector:@selector(sessionAuthorizationStillPending)])
+ [delegate sessionAuthorizationStillPending];
+ }
+
+ [requestQueue removeObject:theRequest];
+ }
+ else if (r == LFRequestValidateSession)
+ {
+ if (delegate && [delegate respondsToSelector:@selector(sessionInvalidForUser:)])
+ [delegate sessionInvalidForUser:sessionUser];
+
+ [requestQueue removeObject:theRequest];
+ }
+ else
+ {
+ NSLog(@"Last.fm.framework: error, %@", [theError description]);
+ shouldProceed = YES;
+ }
if (shouldProceed)
[self dispatchNextRequestIfPossible];
View
10 LFWebServiceDelegate.h
@@ -36,9 +36,15 @@
- (void)requestSucceeded:(NSString *)identifier;
- (void)request:(NSString *)identifier failedWithError:(NSError *)theError;
-// Session management
+// Session management (new sessions)
- (void)sessionNeedsAuthorizationViaURL:(NSURL *)theURL;
-- (void)sessionStartedWithKey:(NSString *)theKey user:(NSString *)theUser;
+- (void)sessionAuthorizationStillPending;
+- (void)sessionAuthorizationFailed;
+- (void)sessionCreatedWithKey:(NSString *)theKey user:(NSString *)theUser;
+
+// Session management (existing sessions)
+- (void)sessionValidatedForUser:(NSString *)theUser;
+- (void)sessionInvalidForUser:(NSString *)theUser;
// Track responses
- (void)nowPlayingSucceededForTrack:(LFTrack *)theTrack;
View
84 Last.fm.xcodeproj/matt.mode1v3
@@ -229,6 +229,8 @@
<key>Layout</key>
<array>
<dict>
+ <key>BecomeActive</key>
+ <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
@@ -270,14 +272,13 @@
<string>32C88DFF0371C24200C91783</string>
<string>089C1665FE841158C02AAC07</string>
<string>0867D69AFE84028FC02AAC07</string>
- <string>1058C7B0FEA5585E11CA2CBB</string>
<string>1C37FBAC04509CD000000102</string>
<string>1C37FABC05509CD000000102</string>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
- <integer>2</integer>
+ <integer>3</integer>
<integer>1</integer>
<integer>0</integer>
</array>
@@ -313,14 +314,12 @@
<key>Dock</key>
<array>
<dict>
- <key>BecomeActive</key>
- <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20306471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
- <string>Controller.h</string>
+ <string>Controller.m</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@@ -328,11 +327,11 @@
<key>PBXProjectModuleGUID</key>
<string>1CE0B20406471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
- <string>Controller.h</string>
+ <string>Controller.m</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
- <string>C9684F8E10A74218003816A7</string>
+ <string>C96852C210A75FF6003816A7</string>
<key>history</key>
<array>
<string>C9CD586410A35D4D00AB1952</string>
@@ -340,39 +339,43 @@
<string>C9CD587010A35D4D00AB1952</string>
<string>C9CD587110A35D4D00AB1952</string>
<string>C9370C0B10A4C636007B8438</string>
- <string>C969716510A500CF00A9FFAD</string>
<string>C96971B710A5076800A9FFAD</string>
<string>C96971B910A5076800A9FFAD</string>
<string>C969720D10A50E9D00A9FFAD</string>
<string>C969724710A5145400A9FFAD</string>
- <string>C96972A010A51A1700A9FFAD</string>
<string>C96972A210A51A1700A9FFAD</string>
- <string>C96972A610A51A1700A9FFAD</string>
<string>C96972A910A51A1700A9FFAD</string>
<string>C969730710A51DCF00A9FFAD</string>
- <string>C969736E10A526FE00A9FFAD</string>
- <string>C969736F10A526FE00A9FFAD</string>
<string>C969737010A526FE00A9FFAD</string>
<string>C969737110A526FE00A9FFAD</string>
- <string>C969737210A526FE00A9FFAD</string>
<string>C969737310A526FE00A9FFAD</string>
<string>C969737410A526FE00A9FFAD</string>
- <string>C969737610A526FE00A9FFAD</string>
- <string>C99C42C410A5D0B200BE9911</string>
<string>C99C42C510A5D0B200BE9911</string>
<string>C99C42CB10A5D1A100BE9911</string>
- <string>C99C42CC10A5D1A100BE9911</string>
<string>C99C42DA10A5D3A100BE9911</string>
- <string>C99C42DB10A5D3A100BE9911</string>
- <string>C99C42DC10A5D3A100BE9911</string>
- <string>C9684F8010A74212003816A7</string>
- <string>C9684F8110A74212003816A7</string>
<string>C9684F8210A74212003816A7</string>
- <string>C9684F8310A74212003816A7</string>
- <string>C9684F8410A74212003816A7</string>
<string>C9684F8510A74212003816A7</string>
<string>C9684F8610A74212003816A7</string>
- <string>C9684F8710A74212003816A7</string>
+ <string>C968524C10A75711003816A7</string>
+ <string>C968524D10A75711003816A7</string>
+ <string>C968524E10A75711003816A7</string>
+ <string>C968524F10A75711003816A7</string>
+ <string>C968525010A75711003816A7</string>
+ <string>C968525110A75711003816A7</string>
+ <string>C968525210A75711003816A7</string>
+ <string>C968525310A75711003816A7</string>
+ <string>C968525410A75711003816A7</string>
+ <string>C968525510A75711003816A7</string>
+ <string>C968525610A75711003816A7</string>
+ <string>C968525810A75711003816A7</string>
+ <string>C968525910A75711003816A7</string>
+ <string>C968525A10A75711003816A7</string>
+ <string>C968525B10A75711003816A7</string>
+ <string>C968526510A75788003816A7</string>
+ <string>C968526F10A757DF003816A7</string>
+ <string>C968527C10A7593C003816A7</string>
+ <string>C96852B910A75FB4003816A7</string>
+ <string>C96852BA10A75FB4003816A7</string>
</array>
</dict>
<key>SplitCount</key>
@@ -570,7 +573,14 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
+ <string>C96852C310A75FF6003816A7</string>
+ <string>C96852C410A75FF6003816A7</string>
+ <string>C968529D10A75D62003816A7</string>
+ <string>C968529E10A75D62003816A7</string>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <string>1CD10A99069EF8BA00B06720</string>
<string>C9D5C79A10A28A6800AFCF8A</string>
+ <string>1C78EAAD065D492600B07095</string>
<string>/Users/matt/Last.fm/Last.fm.xcodeproj</string>
</array>
<key>WindowString</key>
@@ -595,7 +605,7 @@
<key>PBXProjectModuleGUID</key>
<string>1CD0528F0623707200166675</string>
<key>PBXProjectModuleLabel</key>
- <string></string>
+ <string>EMKeychainItem.m</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
@@ -612,6 +622,8 @@
<string>218pt</string>
</dict>
<dict>
+ <key>BecomeActive</key>
+ <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@@ -773,13 +785,13 @@
<key>TableOfContents</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
- <string>C970536210A5372C00A07DF8</string>
+ <string>C9684FA810A74847003816A7</string>
<string>1C162984064C10D400B95A72</string>
- <string>C970536310A5372C00A07DF8</string>
- <string>C970536410A5372C00A07DF8</string>
- <string>C970536510A5372C00A07DF8</string>
- <string>C970536610A5372C00A07DF8</string>
- <string>C970536710A5372C00A07DF8</string>
+ <string>C9684FA910A74847003816A7</string>
+ <string>C9684FAA10A74847003816A7</string>
+ <string>C9684FAB10A74847003816A7</string>
+ <string>C9684FAC10A74847003816A7</string>
+ <string>C9684FAD10A74847003816A7</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.debugV3</string>
@@ -811,7 +823,7 @@
<key>PBXProjectModuleGUID</key>
<string>1CDD528C0622207200134675</string>
<key>PBXProjectModuleLabel</key>
- <string></string>
+ <string>Controller.m</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
@@ -869,8 +881,8 @@
<key>TableOfContents</key>
<array>
<string>1C530D57069F1CE1000CFCEE</string>
- <string>C9684F7E10A741B9003816A7</string>
- <string>C9684F7F10A741B9003816A7</string>
+ <string>C968523A10A75086003816A7</string>
+ <string>C968523B10A75086003816A7</string>
<string>1CDD528C0622207200134675</string>
<string>1CD0528E0623707200166675</string>
</array>
@@ -898,6 +910,8 @@
<key>Dock</key>
<array>
<dict>
+ <key>BecomeActive</key>
+ <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@@ -933,7 +947,7 @@
<key>TableOfContents</key>
<array>
<string>1C78EAAD065D492600B07095</string>
- <string>C970536810A5372C00A07DF8</string>
+ <string>C968529B10A75D62003816A7</string>
<string>1C78EAAC065D492600B07095</string>
</array>
<key>ToolbarConfiguration</key>
@@ -943,7 +957,7 @@
<key>WindowToolGUID</key>
<string>1C78EAAD065D492600B07095</string>
<key>WindowToolIsVisible</key>
- <false/>
+ <true/>
</dict>
<dict>
<key>Identifier</key>
View
1,173 Last.fm.xcodeproj/matt.pbxuser
@@ -5,7 +5,7 @@
activeExecutable = C9D5C78A10A28A2500AFCF8A /* Last.fm Demo */;
activeTarget = C9D5C78810A28A2500AFCF8A /* Last.fm Demo */;
addToTargets = (
- C9D5C78810A28A2500AFCF8A /* Last.fm Demo */,
+ 8DC2EF4F0486A6940098B216 /* Last.fm */,
);
codeSenseManager = C9D5C78010A289D500AFCF8A /* Code sense */;
executables = (
@@ -70,6 +70,103 @@
C9684F8610A74212003816A7 = C9684F8610A74212003816A7 /* PBXTextBookmark */;
C9684F8710A74212003816A7 = C9684F8710A74212003816A7 /* PBXTextBookmark */;
C9684F8E10A74218003816A7 /* PBXTextBookmark */ = C9684F8E10A74218003816A7 /* PBXTextBookmark */;
+ C9684FA510A74847003816A7 /* PBXTextBookmark */ = C9684FA510A74847003816A7 /* PBXTextBookmark */;
+ C9684FA610A74847003816A7 /* PBXTextBookmark */ = C9684FA610A74847003816A7 /* PBXTextBookmark */;
+ C9684FA710A74847003816A7 /* PBXTextBookmark */ = C9684FA710A74847003816A7 /* PBXTextBookmark */;
+ C9684FAE10A7486E003816A7 /* PBXTextBookmark */ = C9684FAE10A7486E003816A7 /* PBXTextBookmark */;
+ C9684FAF10A7486E003816A7 /* PBXTextBookmark */ = C9684FAF10A7486E003816A7 /* PBXTextBookmark */;
+ C9684FB010A7486E003816A7 /* PBXTextBookmark */ = C9684FB010A7486E003816A7 /* PBXTextBookmark */;
+ C9684FB110A7486E003816A7 /* PBXTextBookmark */ = C9684FB110A7486E003816A7 /* PBXTextBookmark */;
+ C9684FB210A74891003816A7 /* PBXTextBookmark */ = C9684FB210A74891003816A7 /* PBXTextBookmark */;
+ C9684FB310A74891003816A7 /* PBXTextBookmark */ = C9684FB310A74891003816A7 /* PBXTextBookmark */;
+ C9684FB410A74891003816A7 /* PBXTextBookmark */ = C9684FB410A74891003816A7 /* PBXTextBookmark */;
+ C9684FB510A74891003816A7 /* PBXTextBookmark */ = C9684FB510A74891003816A7 /* PBXTextBookmark */;
+ C9684FB610A748C5003816A7 /* PBXTextBookmark */ = C9684FB610A748C5003816A7 /* PBXTextBookmark */;
+ C9684FB710A74903003816A7 /* PBXTextBookmark */ = C9684FB710A74903003816A7 /* PBXTextBookmark */;
+ C9684FB810A74910003816A7 /* PBXTextBookmark */ = C9684FB810A74910003816A7 /* PBXTextBookmark */;
+ C9684FB910A7493C003816A7 /* PBXTextBookmark */ = C9684FB910A7493C003816A7 /* PBXTextBookmark */;
+ C9684FBA10A749E9003816A7 /* PBXTextBookmark */ = C9684FBA10A749E9003816A7 /* PBXTextBookmark */;
+ C9684FBB10A74A66003816A7 /* PBXTextBookmark */ = C9684FBB10A74A66003816A7 /* PBXTextBookmark */;
+ C9684FC010A74E3D003816A7 /* XCBuildMessageTextBookmark */ = C9684FC010A74E3D003816A7 /* XCBuildMessageTextBookmark */;
+ C9684FC110A74E3D003816A7 /* PBXTextBookmark */ = C9684FC110A74E3D003816A7 /* PBXTextBookmark */;
+ C9684FC210A74E44003816A7 /* PBXTextBookmark */ = C9684FC210A74E44003816A7 /* PBXTextBookmark */;
+ C9684FC310A74E44003816A7 /* PBXTextBookmark */ = C9684FC310A74E44003816A7 /* PBXTextBookmark */;
+ C9684FC410A74E44003816A7 /* PBXTextBookmark */ = C9684FC410A74E44003816A7 /* PBXTextBookmark */;
+ C9684FC510A74E44003816A7 /* XCBuildMessageTextBookmark */ = C9684FC510A74E44003816A7 /* XCBuildMessageTextBookmark */;
+ C9684FC610A74E44003816A7 /* PBXTextBookmark */ = C9684FC610A74E44003816A7 /* PBXTextBookmark */;
+ C968523410A74EAD003816A7 /* PBXTextBookmark */ = C968523410A74EAD003816A7 /* PBXTextBookmark */;
+ C968523510A74EAD003816A7 /* PBXTextBookmark */ = C968523510A74EAD003816A7 /* PBXTextBookmark */;
+ C968523610A75086003816A7 /* PBXTextBookmark */ = C968523610A75086003816A7 /* PBXTextBookmark */;
+ C968523810A75086003816A7 /* PBXTextBookmark */ = C968523810A75086003816A7 /* PBXTextBookmark */;
+ C968523910A75086003816A7 /* PBXTextBookmark */ = C968523910A75086003816A7 /* PBXTextBookmark */;
+ C968523C10A750A2003816A7 /* PBXTextBookmark */ = C968523C10A750A2003816A7 /* PBXTextBookmark */;
+ C968523D10A750A2003816A7 /* PBXTextBookmark */ = C968523D10A750A2003816A7 /* PBXTextBookmark */;
+ C968523E10A750A2003816A7 /* PBXTextBookmark */ = C968523E10A750A2003816A7 /* PBXTextBookmark */;
+ C968523F10A750A2003816A7 /* PBXTextBookmark */ = C968523F10A750A2003816A7 /* PBXTextBookmark */;
+ C968524010A750A2003816A7 /* PBXTextBookmark */ = C968524010A750A2003816A7 /* PBXTextBookmark */;
+ C968524110A750A2003816A7 /* PBXTextBookmark */ = C968524110A750A2003816A7 /* PBXTextBookmark */;
+ C968524A10A753F7003816A7 /* PBXBookmark */ = C968524A10A753F7003816A7 /* PBXBookmark */;
+ C968524B10A75705003816A7 /* PBXBookmark */ = C968524B10A75705003816A7 /* PBXBookmark */;
+ C968524C10A75711003816A7 /* PBXTextBookmark */ = C968524C10A75711003816A7 /* PBXTextBookmark */;
+ C968524D10A75711003816A7 /* PBXTextBookmark */ = C968524D10A75711003816A7 /* PBXTextBookmark */;
+ C968524E10A75711003816A7 /* PBXTextBookmark */ = C968524E10A75711003816A7 /* PBXTextBookmark */;
+ C968524F10A75711003816A7 /* PBXTextBookmark */ = C968524F10A75711003816A7 /* PBXTextBookmark */;
+ C968525010A75711003816A7 /* PBXTextBookmark */ = C968525010A75711003816A7 /* PBXTextBookmark */;
+ C968525110A75711003816A7 /* PBXTextBookmark */ = C968525110A75711003816A7 /* PBXTextBookmark */;
+ C968525210A75711003816A7 /* PBXTextBookmark */ = C968525210A75711003816A7 /* PBXTextBookmark */;
+ C968525310A75711003816A7 /* PBXTextBookmark */ = C968525310A75711003816A7 /* PBXTextBookmark */;
+ C968525410A75711003816A7 /* PBXTextBookmark */ = C968525410A75711003816A7 /* PBXTextBookmark */;
+ C968525510A75711003816A7 /* PBXTextBookmark */ = C968525510A75711003816A7 /* PBXTextBookmark */;
+ C968525610A75711003816A7 /* PBXTextBookmark */ = C968525610A75711003816A7 /* PBXTextBookmark */;
+ C968525710A75711003816A7 /* PBXTextBookmark */ = C968525710A75711003816A7 /* PBXTextBookmark */;
+ C968525810A75711003816A7 /* PBXTextBookmark */ = C968525810A75711003816A7 /* PBXTextBookmark */;
+ C968525910A75711003816A7 /* PBXTextBookmark */ = C968525910A75711003816A7 /* PBXTextBookmark */;
+ C968525A10A75711003816A7 /* PBXTextBookmark */ = C968525A10A75711003816A7 /* PBXTextBookmark */;
+ C968525B10A75711003816A7 /* PBXTextBookmark */ = C968525B10A75711003816A7 /* PBXTextBookmark */;
+ C968525C10A75711003816A7 /* PBXTextBookmark */ = C968525C10A75711003816A7 /* PBXTextBookmark */;
+ C968525D10A75711003816A7 /* PBXTextBookmark */ = C968525D10A75711003816A7 /* PBXTextBookmark */;
+ C968526010A75711003816A7 /* PBXTextBookmark */ = C968526010A75711003816A7 /* PBXTextBookmark */;
+ C968526310A75711003816A7 /* PBXTextBookmark */ = C968526310A75711003816A7 /* PBXTextBookmark */;
+ C968526510A75788003816A7 /* PBXTextBookmark */ = C968526510A75788003816A7 /* PBXTextBookmark */;
+ C968526610A75788003816A7 /* PBXTextBookmark */ = C968526610A75788003816A7 /* PBXTextBookmark */;
+ C968526710A75788003816A7 /* PBXTextBookmark */ = C968526710A75788003816A7 /* PBXTextBookmark */;
+ C968526810A75788003816A7 /* PBXTextBookmark */ = C968526810A75788003816A7 /* PBXTextBookmark */;
+ C968526910A75788003816A7 /* PBXTextBookmark */ = C968526910A75788003816A7 /* PBXTextBookmark */;
+ C968526A10A7579C003816A7 /* PBXTextBookmark */ = C968526A10A7579C003816A7 /* PBXTextBookmark */;
+ C968526B10A7579C003816A7 /* PBXTextBookmark */ = C968526B10A7579C003816A7 /* PBXTextBookmark */;
+ C968526C10A7579C003816A7 /* PBXTextBookmark */ = C968526C10A7579C003816A7 /* PBXTextBookmark */;
+ C968526D10A7579C003816A7 /* PBXTextBookmark */ = C968526D10A7579C003816A7 /* PBXTextBookmark */;
+ C968526E10A757A4003816A7 /* PBXBookmark */ = C968526E10A757A4003816A7 /* PBXBookmark */;
+ C968526F10A757DF003816A7 /* PBXTextBookmark */ = C968526F10A757DF003816A7 /* PBXTextBookmark */;
+ C968527010A757DF003816A7 /* PBXTextBookmark */ = C968527010A757DF003816A7 /* PBXTextBookmark */;
+ C968527110A757DF003816A7 /* PBXTextBookmark */ = C968527110A757DF003816A7 /* PBXTextBookmark */;
+ C968527410A757DF003816A7 /* PBXTextBookmark */ = C968527410A757DF003816A7 /* PBXTextBookmark */;
+ C968527510A757DF003816A7 /* PBXTextBookmark */ = C968527510A757DF003816A7 /* PBXTextBookmark */;
+ C968527610A75848003816A7 /* PBXTextBookmark */ = C968527610A75848003816A7 /* PBXTextBookmark */;
+ C968527710A75848003816A7 /* PBXTextBookmark */ = C968527710A75848003816A7 /* PBXTextBookmark */;
+ C968527810A75848003816A7 /* PBXTextBookmark */ = C968527810A75848003816A7 /* PBXTextBookmark */;
+ C968527910A758F7003816A7 /* PBXTextBookmark */ = C968527910A758F7003816A7 /* PBXTextBookmark */;
+ C968527A10A758F7003816A7 /* PBXTextBookmark */ = C968527A10A758F7003816A7 /* PBXTextBookmark */;
+ C968527B10A758F7003816A7 /* PBXTextBookmark */ = C968527B10A758F7003816A7 /* PBXTextBookmark */;
+ C968527C10A7593C003816A7 /* PBXTextBookmark */ = C968527C10A7593C003816A7 /* PBXTextBookmark */;
+ C968527D10A7593C003816A7 /* PBXTextBookmark */ = C968527D10A7593C003816A7 /* PBXTextBookmark */;
+ C968527E10A7593C003816A7 /* PBXTextBookmark */ = C968527E10A7593C003816A7 /* PBXTextBookmark */;
+ C968527F10A7593C003816A7 /* PBXTextBookmark */ = C968527F10A7593C003816A7 /* PBXTextBookmark */;
+ C968528010A7593C003816A7 /* PBXTextBookmark */ = C968528010A7593C003816A7 /* PBXTextBookmark */;
+ C968528710A75A77003816A7 /* PBXTextBookmark */ = C968528710A75A77003816A7 /* PBXTextBookmark */;
+ C968528810A75A77003816A7 /* PBXTextBookmark */ = C968528810A75A77003816A7 /* PBXTextBookmark */;
+ C968528910A75ABC003816A7 /* PBXBookmark */ = C968528910A75ABC003816A7 /* PBXBookmark */;
+ C968528B10A75B38003816A7 /* PBXTextBookmark */ = C968528B10A75B38003816A7 /* PBXTextBookmark */;
+ C968528E10A75B38003816A7 /* PBXTextBookmark */ = C968528E10A75B38003816A7 /* PBXTextBookmark */;
+ C968529A10A75D62003816A7 /* PBXTextBookmark */ = C968529A10A75D62003816A7 /* PBXTextBookmark */;
+ C96852A910A75DFF003816A7 /* PBXTextBookmark */ = C96852A910A75DFF003816A7 /* PBXTextBookmark */;
+ C96852B110A75E82003816A7 /* PBXTextBookmark */ = C96852B110A75E82003816A7 /* PBXTextBookmark */;
+ C96852B210A75E82003816A7 /* PBXTextBookmark */ = C96852B210A75E82003816A7 /* PBXTextBookmark */;
+ C96852B410A75F15003816A7 /* PBXTextBookmark */ = C96852B410A75F15003816A7 /* PBXTextBookmark */;
+ C96852B910A75FB4003816A7 /* PBXTextBookmark */ = C96852B910A75FB4003816A7 /* PBXTextBookmark */;
+ C96852BA10A75FB4003816A7 /* PBXTextBookmark */ = C96852BA10A75FB4003816A7 /* PBXTextBookmark */;
+ C96852BB10A75FB4003816A7 /* PBXTextBookmark */ = C96852BB10A75FB4003816A7 /* PBXTextBookmark */;
+ C96852C210A75FF6003816A7 /* PBXTextBookmark */ = C96852C210A75FF6003816A7 /* PBXTextBookmark */;
C969716510A500CF00A9FFAD = C969716510A500CF00A9FFAD /* PBXTextBookmark */;
C96971B710A5076800A9FFAD = C96971B710A5076800A9FFAD /* PBXTextBookmark */;
C96971B910A5076800A9FFAD = C96971B910A5076800A9FFAD /* PBXTextBookmark */;
@@ -134,21 +231,22 @@
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {781, 975}}";
sepNavSelRange = "{0, 0}";
- sepNavVisRange = "{0, 1112}";
+ sepNavVisRange = "{0, 1111}";
};
};
C9684F7710A7414B003816A7 /* EMKeychainItem.m */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {781, 3146}}";
- sepNavSelRange = "{0, 0}";
- sepNavVisRange = "{0, 1138}";
+ sepNavIntBoundsRect = "{{0, 0}, {1244, 3120}}";
+ sepNavSelRange = "{6575, 0}";
+ sepNavVisRange = "{6249, 713}";
};
};
C9684F7810A7414B003816A7 /* EMKeychainProxy.h */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {781, 871}}";
+ sepNavIntBoundsRect = "{{0, 0}, {867, 910}}";
sepNavSelRange = "{0, 0}";
- sepNavVisRange = "{0, 1129}";
+ sepNavVisRange = "{1278, 1138}";
+ sepNavWindowFrame = "{{15, 265}, {926, 608}}";
};
};
C9684F7910A7414B003816A7 /* EMKeychainProxy.m */ = {
@@ -163,7 +261,7 @@
fRef = C9CD582410A3302200AB1952 /* LFWebService.m */;
name = "LFWebService.m: 127";
rLen = 0;
- rLoc = 3415;
+ rLoc = 3724;
rType = 0;
vrLen = 712;
vrLoc = 2995;
@@ -248,6 +346,974 @@
vrLen = 1204;
vrLoc = 0;
};
+ C9684FA210A7483E003816A7 /* UIController.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {867, 585}}";
+ sepNavSelRange = "{1272, 0}";
+ sepNavVisRange = "{115, 1493}";
+ sepNavWindowFrame = "{{55, 242}, {926, 608}}";
+ };
+ };
+ C9684FA310A7483E003816A7 /* UIController.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {1552, 962}}";
+ sepNavSelRange = "{2772, 0}";
+ sepNavVisRange = "{1236, 1551}";
+ sepNavWindowFrame = "{{61, 223}, {926, 608}}";
+ };
+ };
+ C9684FA510A74847003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A010A28B0000AFCF8A /* Controller.h */;
+ name = "Controller.h: 6";
+ rLen = 0;
+ rLoc = 109;
+ rType = 0;
+ vrLen = 622;
+ vrLoc = 1207;
+ };
+ C9684FA610A74847003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ rLen = 0;
+ rLoc = 9223372036854777201;
+ rType = 0;
+ };
+ C9684FA710A74847003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 9";
+ rLen = 0;
+ rLoc = 1233;
+ rType = 0;
+ vrLen = 214;
+ vrLoc = 0;
+ };
+ C9684FAE10A7486E003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A010A28B0000AFCF8A /* Controller.h */;
+ name = "Controller.h: 6";
+ rLen = 1129;
+ rLoc = 77;
+ rType = 0;
+ vrLen = 1205;
+ vrLoc = 3;
+ };
+ C9684FAF10A7486E003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 25";
+ rLen = 0;
+ rLoc = 1208;
+ rType = 0;
+ vrLen = 1206;
+ vrLoc = 3;
+ };
+ C9684FB010A7486E003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 1";
+ rLen = 0;
+ rLoc = 0;
+ rType = 0;
+ vrLen = 204;
+ vrLoc = 0;
+ };
+ C9684FB110A7486E003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 25";
+ rLen = 0;
+ rLoc = 1208;
+ rType = 0;
+ vrLen = 1206;
+ vrLoc = 0;
+ };
+ C9684FB210A74891003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 25";
+ rLen = 0;
+ rLoc = 1208;
+ rType = 0;
+ vrLen = 994;
+ vrLoc = 278;
+ };
+ C9684FB310A74891003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A010A28B0000AFCF8A /* Controller.h */;
+ name = "Controller.h: 12";
+ rLen = 0;
+ rLoc = 444;
+ rType = 0;
+ vrLen = 622;
+ vrLoc = 1207;
+ };
+ C9684FB410A74891003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 25";
+ rLen = 0;
+ rLoc = 1208;
+ rType = 0;
+ vrLen = 923;
+ vrLoc = 359;
+ };
+ C9684FB510A74891003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 31";
+ rLen = 0;
+ rLoc = 1434;
+ rType = 0;
+ vrLen = 959;
+ vrLoc = 359;
+ };
+ C9684FB610A748C5003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 35";
+ rLen = 0;
+ rLoc = 1434;
+ rType = 0;
+ vrLen = 983;
+ vrLoc = 437;
+ };
+ C9684FB710A74903003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 41";
+ rLen = 0;
+ rLoc = 1434;
+ rType = 0;
+ vrLen = 613;
+ vrLoc = 953;
+ };
+ C9684FB810A74910003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 41";
+ rLen = 0;
+ rLoc = 1434;
+ rType = 0;
+ vrLen = 662;
+ vrLoc = 953;
+ };
+ C9684FB910A7493C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 36";
+ rLen = 0;
+ rLoc = 1285;
+ rType = 0;
+ vrLen = 694;
+ vrLoc = 953;
+ };
+ C9684FBA10A749E9003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 36";
+ rLen = 0;
+ rLoc = 1285;
+ rType = 0;
+ vrLen = 748;
+ vrLoc = 953;
+ };
+ C9684FBB10A74A66003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 32";
+ rLen = 0;
+ rLoc = 1355;
+ rType = 0;
+ vrLen = 866;
+ vrLoc = 577;
+ };
+ C9684FC010A74E3D003816A7 /* XCBuildMessageTextBookmark */ = {
+ isa = PBXTextBookmark;
+ comments = "Cast to pointer from integer of different size";
+ fRef = C9684F7710A7414B003816A7 /* EMKeychainItem.m */;
+ fallbackIsa = XCBuildMessageTextBookmark;
+ rLen = 1;
+ rLoc = 245;
+ rType = 1;
+ };
+ C9684FC110A74E3D003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684F7710A7414B003816A7 /* EMKeychainItem.m */;
+ name = "EMKeychainItem.m: 246";
+ rLen = 0;
+ rLoc = 6703;
+ rType = 0;
+ vrLen = 497;
+ vrLoc = 6249;
+ };
+ C9684FC210A74E44003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 866;
+ vrLoc = 577;
+ };
+ C9684FC310A74E44003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A010A28B0000AFCF8A /* Controller.h */;
+ name = "Controller.h: 12";
+ rLen = 0;
+ rLoc = 444;
+ rType = 0;
+ vrLen = 625;
+ vrLoc = 1204;
+ };
+ C9684FC410A74E44003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 124";
+ rLen = 0;
+ rLoc = 6083;
+ rType = 0;
+ vrLen = 1053;
+ vrLoc = 3918;
+ };
+ C9684FC510A74E44003816A7 /* XCBuildMessageTextBookmark */ = {
+ isa = PBXTextBookmark;
+ comments = "Cast to pointer from integer of different size";
+ fRef = C9684F7710A7414B003816A7 /* EMKeychainItem.m */;
+ fallbackIsa = XCBuildMessageTextBookmark;
+ rLen = 1;
+ rLoc = 245;
+ rType = 1;
+ };
+ C9684FC610A74E44003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684F7710A7414B003816A7 /* EMKeychainItem.m */;
+ name = "EMKeychainItem.m: 241";
+ rLen = 0;
+ rLoc = 6575;
+ rType = 0;
+ vrLen = 713;
+ vrLoc = 6249;
+ };
+ C968523410A74EAD003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684F7710A7414B003816A7 /* EMKeychainItem.m */;
+ name = "EMKeychainItem.m: 241";
+ rLen = 0;
+ rLoc = 6575;
+ rType = 0;
+ vrLen = 713;
+ vrLoc = 6249;
+ };
+ C968523510A74EAD003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 123";
+ rLen = 0;
+ rLoc = 6081;
+ rType = 0;
+ vrLen = 1053;
+ vrLoc = 3918;
+ };
+ C968523610A75086003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684F7710A7414B003816A7 /* EMKeychainItem.m */;
+ name = "EMKeychainItem.m: 246";
+ rLen = 0;
+ rLoc = 6703;
+ rType = 0;
+ vrLen = 481;
+ vrLoc = 6249;
+ };
+ C968523810A75086003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ rLen = 22;
+ rLoc = 5162;
+ rType = 0;
+ };
+ C968523910A75086003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 124";
+ rLen = 22;
+ rLoc = 5162;
+ rType = 0;
+ vrLen = 561;
+ vrLoc = 4342;
+ };
+ C968523C10A750A2003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD584C10A3553500AB1952 /* LFRequest.h */;
+ name = "LFRequest.h: 38";
+ rLen = 0;
+ rLoc = 1470;
+ rType = 0;
+ vrLen = 689;
+ vrLoc = 870;
+ };
+ C968523D10A750A2003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 120";
+ rLen = 0;
+ rLoc = 4635;
+ rType = 0;
+ vrLen = 1217;
+ vrLoc = 4146;
+ };
+ C968523E10A750A2003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A010A28B0000AFCF8A /* Controller.h */;
+ name = "Controller.h: 40";
+ rLen = 0;
+ rLoc = 1729;
+ rType = 0;
+ vrLen = 659;
+ vrLoc = 1208;
+ };
+ C968523F10A750A2003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD582410A3302200AB1952 /* LFWebService.m */;
+ name = "LFWebService.m: 129";
+ rLen = 0;
+ rLoc = 3806;
+ rType = 0;
+ vrLen = 770;
+ vrLoc = 3052;
+ };
+ C968524010A750A2003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 43";
+ rLen = 0;
+ rLoc = 1890;
+ rType = 0;
+ vrLen = 1054;
+ vrLoc = 1245;
+ };
+ C968524110A750A2003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 43";
+ rLen = 0;
+ rLoc = 1890;
+ rType = 0;
+ vrLen = 1054;
+ vrLoc = 1245;
+ };
+ C968524410A7514F003816A7 /* LFValidateSessionRequest.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {781, 533}}";
+ sepNavSelRange = "{1320, 0}";
+ sepNavVisRange = "{724, 756}";
+ };
+ };
+ C968524510A7514F003816A7 /* LFValidateSessionRequest.m */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {1678, 1248}}";
+ sepNavSelRange = "{2306, 0}";
+ sepNavVisRange = "{0, 436}";
+ };
+ };
+ C968524A10A753F7003816A7 /* PBXBookmark */ = {
+ isa = PBXBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ };
+ C968524B10A75705003816A7 /* PBXBookmark */ = {
+ isa = PBXBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ };
+ C968524C10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 908;
+ vrLoc = 1245;
+ };
+ C968524D10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C96971A010A5044400A9FFAD /* LFRequestTypes.h */;
+ name = "LFRequestTypes.h: 33";
+ rLen = 0;
+ rLoc = 1423;
+ rType = 0;
+ vrLen = 1063;
+ vrLoc = 361;
+ };
+ C968524E10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD584D10A3553500AB1952 /* LFRequest.m */;
+ name = "LFRequest.m: 77";
+ rLen = 0;
+ rLoc = 2155;
+ rType = 0;
+ vrLen = 445;
+ vrLoc = 1484;
+ };
+ C968524F10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD584C10A3553500AB1952 /* LFRequest.h */;
+ name = "LFRequest.h: 38";
+ rLen = 0;
+ rLoc = 1470;
+ rType = 0;
+ vrLen = 498;
+ vrLoc = 1207;
+ };
+ C968525010A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C969719010A5038A00A9FFAD /* LFBanRequest.h */;
+ name = "LFBanRequest.h: 32";
+ rLen = 0;
+ rLoc = 1296;
+ rType = 0;
+ vrLen = 739;
+ vrLoc = 717;
+ };
+ C968525110A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C969718410A5037500A9FFAD /* LFNowPlayingRequest.h */;
+ name = "LFNowPlayingRequest.h: 35";
+ rLen = 149;
+ rLoc = 1314;
+ rType = 0;
+ vrLen = 751;
+ vrLoc = 719;
+ };
+ C968525210A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C969718510A5037500A9FFAD /* LFNowPlayingRequest.m */;
+ name = "LFNowPlayingRequest.m: 43";
+ rLen = 0;
+ rLoc = 1485;
+ rType = 0;
+ vrLen = 439;
+ vrLoc = 1250;
+ };
+ C968525310A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD582410A3302200AB1952 /* LFWebService.m */;
+ name = "LFWebService.m: 318";
+ rLen = 0;
+ rLoc = 9177;
+ rType = 0;
+ vrLen = 779;
+ vrLoc = 6019;
+ };
+ C968525410A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C969719410A5039700A9FFAD /* LFGetTokenRequest.h */;
+ name = "LFGetTokenRequest.h: 39";
+ rLen = 0;
+ rLoc = 1446;
+ rType = 0;
+ vrLen = 582;
+ vrLoc = 958;
+ };
+ C968525510A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C969719510A5039700A9FFAD /* LFGetTokenRequest.m */;
+ name = "LFGetTokenRequest.m: 51";
+ rLen = 461;
+ rLoc = 1577;
+ rType = 0;
+ vrLen = 608;
+ vrLoc = 1501;
+ };
+ C968525610A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C968524410A7514F003816A7 /* LFValidateSessionRequest.h */;
+ name = "LFValidateSessionRequest.h: 32";
+ rLen = 0;
+ rLoc = 1320;
+ rType = 0;
+ vrLen = 756;
+ vrLoc = 724;
+ };
+ C968525710A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C968524510A7514F003816A7 /* LFValidateSessionRequest.m */;
+ name = "LFValidateSessionRequest.m: 49";
+ rLen = 0;
+ rLoc = 3184;
+ rType = 0;
+ vrLen = 629;
+ vrLoc = 616;
+ };
+ C968525810A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684F7610A7414B003816A7 /* EMKeychainItem.h */;
+ name = "EMKeychainItem.h: 1";
+ rLen = 0;
+ rLoc = 0;
+ rType = 0;
+ vrLen = 1111;
+ vrLoc = 0;
+ };
+ C968525910A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684F7710A7414B003816A7 /* EMKeychainItem.m */;
+ name = "EMKeychainItem.m: 241";
+ rLen = 0;
+ rLoc = 6575;
+ rType = 0;
+ vrLen = 713;
+ vrLoc = 6249;
+ };
+ C968525A10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A610A28B3500AFCF8A /* LFTrack.m */;
+ name = "LFTrack.m: 25";
+ rLen = 0;
+ rLoc = 1203;
+ rType = 0;
+ vrLen = 538;
+ vrLoc = 1704;
+ };
+ C968525B10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD582310A3302200AB1952 /* LFWebService.h */;
+ name = "LFWebService.h: 60";
+ rLen = 0;
+ rLoc = 1871;
+ rType = 0;
+ vrLen = 738;
+ vrLoc = 1569;
+ };
+ C968525C10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A010A28B0000AFCF8A /* Controller.h */;
+ name = "Controller.h: 40";
+ rLen = 0;
+ rLoc = 1729;
+ rType = 0;
+ vrLen = 660;
+ vrLoc = 1207;
+ };
+ C968525D10A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 91";
+ rLen = 0;
+ rLoc = 4006;
+ rType = 0;
+ vrLen = 887;
+ vrLoc = 2637;
+ };
+ C968526010A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 38";
+ rLen = 0;
+ rLoc = 1460;
+ rType = 0;
+ vrLen = 1458;
+ vrLoc = 3;
+ };
+ C968526310A75711003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968526510A75788003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A010A28B0000AFCF8A /* Controller.h */;
+ name = "Controller.h: 32";
+ rLen = 0;
+ rLoc = 1306;
+ rType = 0;
+ vrLen = 585;
+ vrLoc = 1108;
+ };
+ C968526610A75788003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 909;
+ vrLoc = 572;
+ };
+ C968526710A75788003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 91";
+ rLen = 0;
+ rLoc = 4006;
+ rType = 0;
+ vrLen = 887;
+ vrLoc = 2637;
+ };
+ C968526810A75788003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 28";
+ rLen = 0;
+ rLoc = 1255;
+ rType = 0;
+ vrLen = 905;
+ vrLoc = 509;
+ };
+ C968526910A75788003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968526A10A7579C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 28";
+ rLen = 0;
+ rLoc = 1255;
+ rType = 0;
+ vrLen = 905;
+ vrLoc = 509;
+ };
+ C968526B10A7579C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 904;
+ vrLoc = 577;
+ };
+ C968526C10A7579C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 35";
+ rLen = 0;
+ rLoc = 1597;
+ rType = 0;
+ vrLen = 346;
+ vrLoc = 1110;
+ };
+ C968526D10A7579C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968526E10A757A4003816A7 /* PBXBookmark */ = {
+ isa = PBXBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ };
+ C968526F10A757DF003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 580;
+ vrLoc = 1028;
+ };
+ C968527010A757DF003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 35";
+ rLen = 0;
+ rLoc = 1597;
+ rType = 0;
+ vrLen = 346;
+ vrLoc = 1110;
+ };
+ C968527110A757DF003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 42";
+ rLen = 0;
+ rLoc = 1631;
+ rType = 0;
+ vrLen = 499;
+ vrLoc = 1237;
+ };
+ C968527410A757DF003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 1496;
+ vrLoc = 112;
+ };
+ C968527510A757DF003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968527610A75848003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 46";
+ rLen = 0;
+ rLoc = 1970;
+ rType = 0;
+ vrLen = 756;
+ vrLoc = 1319;
+ };
+ C968527710A75848003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 1496;
+ vrLoc = 112;
+ };
+ C968527810A75848003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968527910A758F7003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 57";
+ rLen = 0;
+ rLoc = 2699;
+ rType = 0;
+ vrLen = 802;
+ vrLoc = 1844;
+ };
+ C968527A10A758F7003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 1496;
+ vrLoc = 112;
+ };
+ C968527B10A758F7003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968527C10A7593C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA310A7483E003816A7 /* UIController.m */;
+ name = "UIController.m: 66";
+ rLen = 0;
+ rLoc = 2772;
+ rType = 0;
+ vrLen = 717;
+ vrLoc = 2221;
+ };
+ C968527D10A7593C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 28";
+ rLen = 0;
+ rLoc = 1255;
+ rType = 0;
+ vrLen = 844;
+ vrLoc = 570;
+ };
+ C968527E10A7593C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 28";
+ rLen = 0;
+ rLoc = 1255;
+ rType = 0;
+ vrLen = 844;
+ vrLoc = 570;
+ };
+ C968527F10A7593C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9684FA210A7483E003816A7 /* UIController.h */;
+ name = "UIController.h: 30";
+ rLen = 0;
+ rLoc = 1272;
+ rType = 0;
+ vrLen = 1496;
+ vrLoc = 112;
+ };
+ C968528010A7593C003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968528710A75A77003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 78";
+ rLen = 0;
+ rLoc = 2982;
+ rType = 0;
+ vrLen = 947;
+ vrLoc = 2467;
+ };
+ C968528810A75A77003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD589D10A367BA00AB1952 /* LFWebServiceDelegate.h */;
+ name = "LFWebServiceDelegate.h: 41";
+ rLen = 0;
+ rLoc = 1743;
+ rType = 0;
+ vrLen = 1426;
+ vrLoc = 1036;
+ };
+ C968528910A75ABC003816A7 /* PBXBookmark */ = {
+ isa = PBXBookmark;
+ fRef = C9CD582410A3302200AB1952 /* LFWebService.m */;
+ };
+ C968528B10A75B38003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 138";
+ rLen = 0;
+ rLoc = 5151;
+ rType = 0;
+ vrLen = 739;
+ vrLoc = 4388;
+ };
+ C968528E10A75B38003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9CD582410A3302200AB1952 /* LFWebService.m */;
+ name = "LFWebService.m: 321";
+ rLen = 0;
+ rLoc = 8950;
+ rType = 0;
+ vrLen = 972;
+ vrLoc = 7942;
+ };
+ C968529A10A75D62003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 146";
+ rLen = 0;
+ rLoc = 5151;
+ rType = 0;
+ vrLen = 788;
+ vrLoc = 2934;
+ };
+ C96852A910A75DFF003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 98";
+ rLen = 0;
+ rLoc = 3692;
+ rType = 0;
+ vrLen = 783;
+ vrLoc = 2983;
+ };
+ C96852B110A75E82003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C9D5C7A110A28B0000AFCF8A /* Controller.m */;
+ name = "Controller.m: 98";
+ rLen = 0;
+ rLoc = 3692;
+ rType = 0;
+ vrLen = 826;
+ vrLoc = 2983;
+ };
+ C96852B210A75E82003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C968524510A7514F003816A7 /* LFValidateSessionRequest.m */;
+ name = "LFValidateSessionRequest.m: 60";
+ rLen = 0;
+ rLoc = 1695;
+ rType = 0;
+ vrLen = 1043;
+ vrLoc = 1139;
+ };
+ C96852B410A75F15003816A7 /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = C968524510A7514F003816A7 /* LFValidateSessionRequest.m */;
+ name = "LFValidateSessionRequest.m: 70";
+ rLen = 0;
+ rLoc = 2306;
+ rType = 0;
</