diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6320170 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate \ No newline at end of file diff --git a/AllFeedDatasource.swift b/AllFeedDatasource.swift new file mode 100644 index 0000000..71c3ac3 --- /dev/null +++ b/AllFeedDatasource.swift @@ -0,0 +1,55 @@ +// +// AllFeedDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class AllFeedDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + var parent : UITableViewController + + init(tableView : UITableView, parent : UITableViewController) { + self.items = ["a","a", "a","a"] + self.parent = parent + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "VineFeedCell", bundle: nil), forCellReuseIdentifier: "VineFeed") + self.tableView.registerNib(UINib(nibName: "TwitterTweetCell", bundle: nil), forCellReuseIdentifier: "TwitterTweet") + self.tableView.registerNib(UINib(nibName: "TumblrPhotoCell", bundle: nil), forCellReuseIdentifier: "TumblrPhoto") + self.tableView.registerNib(UINib(nibName: "InstagramFeedCell", bundle: nil), forCellReuseIdentifier: "InstagramFeed") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + // Configure the cell... + + var cell : UITableViewCell! + if (indexPath.row == 1) { + cell = tableView.dequeueReusableCellWithIdentifier("VineFeed", forIndexPath: indexPath) + } else if (indexPath.row == 0) { + let currentCell = tableView.dequeueReusableCellWithIdentifier("TwitterTweet", forIndexPath: indexPath) as! TwitterTweetCellController + currentCell.retweetTextHeight.constant = CGFloat(0) + currentCell.parent = self.parent + cell = currentCell + } else if (indexPath.row == 2) { + cell = tableView.dequeueReusableCellWithIdentifier("TumblrPhoto", forIndexPath: indexPath) + } else if (indexPath.row == 3) { + cell = tableView.dequeueReusableCellWithIdentifier("InstagramFeed", forIndexPath: indexPath) + } + // Configure the cell... + return cell + } +} diff --git a/AllFeedTableViewController.swift b/AllFeedTableViewController.swift new file mode 100644 index 0000000..16ce4b3 --- /dev/null +++ b/AllFeedTableViewController.swift @@ -0,0 +1,82 @@ +// +// AllFeedTableViewController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class AllFeedTableViewController: UITableViewController { + + var dataSource : AllFeedDatasource! + + override func viewDidLoad() { + super.viewDidLoad() + + dataSource = AllFeedDatasource(tableView: self.tableView, parent: self) + self.tableView.dataSource = dataSource + + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + self.tableView.allowsSelection = false + + self.tableView.registerNib(UINib(nibName: "VineFeedCell", bundle: nil), forCellReuseIdentifier: "VineFeed") + self.tableView.registerNib(UINib(nibName: "TwitterTweetCell", bundle: nil), forCellReuseIdentifier: "TwitterTweet") + self.tableView.registerNib(UINib(nibName: "TumblrPhotoCell", bundle: nil), forCellReuseIdentifier: "TumblrPhoto") + self.tableView.registerNib(UINib(nibName: "InstagramFeedCell", bundle: nil), forCellReuseIdentifier: "InstagramFeed") + + } + + + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/CommentCell.xib b/CommentCell.xib new file mode 100644 index 0000000..9ba9161 --- /dev/null +++ b/CommentCell.xib @@ -0,0 +1,110 @@ + + + + + + + + + + HelveticaNeue-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CommentCellController.swift b/CommentCellController.swift new file mode 100644 index 0000000..b810e5d --- /dev/null +++ b/CommentCellController.swift @@ -0,0 +1,31 @@ +// +// CommentCellController.swift +// comblie +// +// Created by Cal on 11/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class CommentCellController: UITableViewCell { + + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postUsername: UILabel! + @IBOutlet weak var postComment: UILabel! + @IBOutlet weak var postTime: UILabel! + + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/CommentsController.swift b/CommentsController.swift new file mode 100644 index 0000000..b49d268 --- /dev/null +++ b/CommentsController.swift @@ -0,0 +1,203 @@ +// +// CommentsController.swift +// comblie +// +// Created by Cal on 11/7/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class CommentsController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate { + + //MARK: Properties + @IBOutlet weak var topTableView: UITableView! + @IBOutlet weak var topTableHeight: NSLayoutConstraint! + @IBOutlet weak var tableView: UITableView! + @IBOutlet weak var likesText: UILabel! + @IBOutlet weak var commentBox: UITextField! + @IBOutlet weak var bottomSpacing: NSLayoutConstraint! + + var postHeight : CGFloat! + var cell : UITableViewCell! + + override func viewDidLoad() { + super.viewDidLoad() + + //UITableView + + //Set delegate controls and datasource + self.tableView.delegate = self + self.tableView.dataSource = self + self.topTableView.delegate = self + self.topTableView.dataSource = self + + //Register XIBs for cell reuse + self.topTableView.registerNib(UINib(nibName: "FacebookStatusCell", bundle: nil), forCellReuseIdentifier: "FacebookStatus") + self.topTableView.registerNib(UINib(nibName: "TwitterTweetCell", bundle: nil), forCellReuseIdentifier: "TwitterTweet") + self.topTableView.registerNib(UINib(nibName: "TwitterPhotoCell", bundle: nil), forCellReuseIdentifier: "TwitterPhoto") + self.topTableView.registerNib(UINib(nibName: "TumblrPhotoCell", bundle: nil), forCellReuseIdentifier: "TumblrPhoto") + self.topTableView.registerNib(UINib(nibName: "TumblrBlogCell", bundle: nil), forCellReuseIdentifier: "TumblrBlog") + self.topTableView.registerNib(UINib(nibName: "InstagramFeedCell", bundle: nil), forCellReuseIdentifier: "InstagramFeed") + self.tableView.registerNib(UINib(nibName: "CommentCell", bundle: nil), forCellReuseIdentifier: "Comment") + + //Styles Tableviews and sets autoheight + self.tableView.estimatedRowHeight = 44 + self.tableView.rowHeight = UITableViewAutomaticDimension + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + + self.topTableView.estimatedRowHeight = 44 + self.topTableView.rowHeight = UITableViewAutomaticDimension + self.topTableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.topTableHeight.constant = self.postHeight + self.registerForKeyboardNotifications() + + configureLikesText() + styleTextField() + } + + //MARK: Actions + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + //UITableView + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 1 + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + if tableView == self.topTableView { + return 1 + } else { + return 3 + } + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + //For top table view + if tableView == self.topTableView { + let currentCell = self.topTableView.dequeueReusableCellWithIdentifier("InstagramFeed", forIndexPath: indexPath) as! InstagramFeedCellController + currentCell.likeCommentBox.alpha = CGFloat(1) + currentCell.postTime.removeFromSuperview() + currentCell.playButton.alpha = CGFloat(0) + currentCell.userInteractionEnabled = false + cell = currentCell + + } + //For comments table view + else { + cell = self.tableView.dequeueReusableCellWithIdentifier("Comment", forIndexPath: indexPath) + } + return cell + } + + //Other + func styleTextField() { + + let spacerViewLeft = UIView(frame:CGRect(x:0, y:0, width:5, height:self.commentBox.frame.height)); + self.commentBox.leftViewMode = UITextFieldViewMode.Always + self.commentBox.leftView = spacerViewLeft + + + // Remove auto correct + self.commentBox.autocorrectionType = .No + // Set the delegate for listening + self.commentBox.delegate = self + + } + + func configureLikesText() { + var user = "Sara Sampaio " + var userMutableString = NSMutableAttributedString() + userMutableString = NSMutableAttributedString(string: user, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Medium", + size: 10.5)!]) + + var sectionOne = "and " + var sectionOneMutableString = NSMutableAttributedString() + sectionOneMutableString = NSMutableAttributedString(string: sectionOne, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Roman", + size: 10.5)!]) + + var othersCount = "21,653 others " + var othersCountMutableString = NSMutableAttributedString() + othersCountMutableString = NSMutableAttributedString(string: othersCount, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Medium", + size: 10.5)!]) + + var sectionTwo = "liked this." + var sectionTwoMutableString = NSMutableAttributedString() + sectionTwoMutableString = NSMutableAttributedString(string: sectionTwo, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Roman", + size: 10.5)!]) + + userMutableString.appendAttributedString(sectionOneMutableString) + userMutableString.appendAttributedString(othersCountMutableString) + userMutableString.appendAttributedString(sectionTwoMutableString) + self.likesText.attributedText = userMutableString + } + + // Dynamic keyboard & textfield + + // Allows the return button to dismiss the keyboard + func textFieldShouldReturn(textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + + // Call this method somewhere in your view controller setup code. + func registerForKeyboardNotifications() { + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, + selector: "keyboardWillBeShown:", + name: UIKeyboardWillShowNotification, + object: nil) + notificationCenter.addObserver(self, + selector: "keyboardWillBeHidden:", + name: UIKeyboardWillHideNotification, + object: nil) + } + + // Called when the UIKeyboardDidShowNotification is sent. + func keyboardWillBeShown(sender: NSNotification) { + + let info: NSDictionary = sender.userInfo! + let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue + let keyboardSize: CGSize = value.CGRectValue().size + + // MOVE THE CONTENT UP FOR THE KEYBOARD + moveForKeyboard(keyboardSize.height) + + } + + // Called when the UIKeyboardWillHideNotification is sent + func keyboardWillBeHidden(sender: NSNotification) { + hideAfterKeyboard() + } + + func moveForKeyboard(keySize : CGFloat) { + bottomSpacing.constant = keySize + UIView.animateWithDuration(0) { + self.view.layoutIfNeeded() + } + } + + func hideAfterKeyboard() { + bottomSpacing.constant = CGFloat(0.0) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/ConversationCell.xib b/ConversationCell.xib new file mode 100644 index 0000000..e700cc3 --- /dev/null +++ b/ConversationCell.xib @@ -0,0 +1,134 @@ + + + + + + + + + + HelveticaNeueLTStd-Md + + + HelveticaNeueLTStd-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ConversationListDatasource.swift b/ConversationListDatasource.swift new file mode 100644 index 0000000..a4d8606 --- /dev/null +++ b/ConversationListDatasource.swift @@ -0,0 +1,43 @@ +// +// ConversationListDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class ConversationListDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + + init(tableView : UITableView) { + self.items = ["a","a","a","a","a","a","a","a","a","a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "ConversationCell", bundle: nil), forCellReuseIdentifier: "ConversationCell") + self.tableView.registerNib(UINib(nibName: "VineHeaderCell", bundle: nil), forCellReuseIdentifier: "VineHeader") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + // Configure the cell... + let cell = tableView.dequeueReusableCellWithIdentifier("ConversationCell", forIndexPath: indexPath) as! ConversationCellController + cell.profileImage.image = UIImage(named: "profileImage") + cell.layoutMargins = UIEdgeInsetsZero + currentCell = cell + + return currentCell + } + +} diff --git a/FBSDKCoreKit.framework/FBSDKCoreKit b/FBSDKCoreKit.framework/FBSDKCoreKit new file mode 100644 index 0000000..95e4836 Binary files /dev/null and b/FBSDKCoreKit.framework/FBSDKCoreKit differ diff --git a/FBSDKCoreKit.framework/Headers/FBSDKAccessToken.h b/FBSDKCoreKit.framework/Headers/FBSDKAccessToken.h new file mode 100644 index 0000000..4ed0656 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKAccessToken.h @@ -0,0 +1,166 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import +#import +#import + +/*! + @abstract Notification indicating that the `currentAccessToken` has changed. + @discussion the userInfo dictionary of the notification will contain keys + `FBSDKAccessTokenChangeOldKey` and + `FBSDKAccessTokenChangeNewKey`. + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeNotification; + +/*! + @abstract A key in the notification's userInfo that will be set + if and only if the user ID changed between the old and new tokens. + @discussion Token refreshes can occur automatically with the SDK + which do not change the user. If you're only interested in user + changes (such as logging out), you should check for the existence + of this key. The value is a NSNumber with a boolValue. + + On a fresh start of the app where the SDK reads in the cached value + of an access token, this key will also exist since the access token + is moving from a null state (no user) to a non-null state (user). + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeUserID; + +/* + @abstract key in notification's userInfo object for getting the old token. + @discussion If there was no old token, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeOldKey; + +/* + @abstract key in notification's userInfo object for getting the new token. + @discussion If there is no new token, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeNewKey; + + +/*! + @class FBSDKAccessToken + @abstract Represents an immutable access token for using Facebook services. + */ +@interface FBSDKAccessToken : NSObject + +/*! + @abstract Returns the app ID. + */ +@property (readonly, copy, nonatomic) NSString *appID; + +/*! + @abstract Returns the known declined permissions. + */ +@property (readonly, copy, nonatomic) NSSet *declinedPermissions; + +/*! + @abstract Returns the expiration date. + */ +@property (readonly, copy, nonatomic) NSDate *expirationDate; + +/*! + @abstract Returns the known granted permissions. + */ +@property (readonly, copy, nonatomic) NSSet *permissions; + +/*! + @abstract Returns the date the token was last refreshed. +*/ +@property (readonly, copy, nonatomic) NSDate *refreshDate; + +/*! + @abstract Returns the opaque token string. + */ +@property (readonly, copy, nonatomic) NSString *tokenString; + +/*! + @abstract Returns the user ID. + */ +@property (readonly, copy, nonatomic) NSString *userID; + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +/*! + @abstract Initializes a new instance. + @param tokenString the opaque token string. + @param permissions the granted permissions. Note this is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + @param declinedPermissions the declined permissions. Note this is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + @param appID the app ID. + @param userID the user ID. + @param expirationDate the optional expiration date (defaults to distantFuture). + @param refreshDate the optional date the token was last refreshed (defaults to today). + @discussion This initializer should only be used for advanced apps that + manage tokens explicitly. Typical login flows only need to use `FBSDKLoginManager` + along with `+currentAccessToken`. + */ +- (instancetype)initWithTokenString:(NSString *)tokenString + permissions:(NSArray *)permissions + declinedPermissions:(NSArray *)declinedPermissions + appID:(NSString *)appID + userID:(NSString *)userID + expirationDate:(NSDate *)expirationDate + refreshDate:(NSDate *)refreshDate +NS_DESIGNATED_INITIALIZER; + +/*! + @abstract Convenience getter to determine if a permission has been granted + @param permission The permission to check. + */ +- (BOOL)hasGranted:(NSString *)permission; + +/*! + @abstract Compares the receiver to another FBSDKAccessToken + @param token The other token + @return YES if the receiver's values are equal to the other token's values; otherwise NO + */ +- (BOOL)isEqualToAccessToken:(FBSDKAccessToken *)token; + +/*! + @abstract Returns the "global" access token that represents the currently logged in user. + @discussion The `currentAccessToken` is a convenient representation of the token of the + current user and is used by other SDK components (like `FBSDKLoginManager`). + */ ++ (FBSDKAccessToken *)currentAccessToken; + +/*! + @abstract Sets the "global" access token that represents the currently logged in user. + @param token The access token to set. + @discussion This will broadcast a notification and save the token to the app keychain. + */ ++ (void)setCurrentAccessToken:(FBSDKAccessToken *)token; + +/*! + @abstract Refresh the current access token's permission state and extend the token's expiration date, + if possible. + @param completionHandler an optional callback handler that can surface any errors related to permission refreshing. + @discussion On a successful refresh, the currentAccessToken will be updated so you typically only need to + observe the `FBSDKAccessTokenDidChangeNotification` notification. + + If a token is already expired, it cannot be refreshed. + */ ++ (void)refreshCurrentAccessToken:(FBSDKGraphRequestHandler)completionHandler; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKAppEvents.h b/FBSDKCoreKit.framework/Headers/FBSDKAppEvents.h new file mode 100644 index 0000000..375d413 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKAppEvents.h @@ -0,0 +1,462 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import "FBSDKMacros.h" + +@class FBSDKAccessToken; +@class FBSDKGraphRequest; + +/*! @abstract NSNotificationCenter name indicating a result of a failed log flush attempt. The posted object will be an NSError instance. */ +FBSDK_EXTERN NSString *const FBSDKAppEventsLoggingResultNotification; + +/*! @abstract optional plist key ("FacebookLoggingOverrideAppID") for setting `loggingOverrideAppID` */ +FBSDK_EXTERN NSString *const FBSDKAppEventsOverrideAppIDBundleKey; + +/*! + + @typedef NS_ENUM (NSUInteger, FBSDKAppEventsFlushBehavior) + + @abstract Specifies when `FBSDKAppEvents` sends log events to the server. + + */ +typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushBehavior) +{ + + /*! Flush automatically: periodically (once a minute or every 100 logged events) and always at app reactivation. */ + FBSDKAppEventsFlushBehaviorAuto = 0, + + /*! Only flush when the `flush` method is called. When an app is moved to background/terminated, the + events are persisted and re-established at activation, but they will only be written with an + explicit call to `flush`. */ + FBSDKAppEventsFlushBehaviorExplicitOnly, + +}; + +/*! + @methodgroup Predefined event names for logging events common to many apps. Logging occurs through the `logEvent` family of methods on `FBSDKAppEvents`. + Common event parameters are provided in the `FBSDKAppEventsParameterNames*` constants. + */ + +/*! Log this event when the user has achieved a level in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAchievedLevel; + +/*! Log this event when the user has entered their payment info. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedPaymentInfo; + +/*! Log this event when the user has added an item to their cart. The valueToSum passed to logEvent should be the item's price. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToCart; + +/*! Log this event when the user has added an item to their wishlist. The valueToSum passed to logEvent should be the item's price. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToWishlist; + +/*! Log this event when a user has completed registration with the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedRegistration; + +/*! Log this event when the user has completed a tutorial in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedTutorial; + +/*! Log this event when the user has entered the checkout process. The valueToSum passed to logEvent should be the total price in the cart. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameInitiatedCheckout; + +/*! Log this event when the user has rated an item in the app. The valueToSum passed to logEvent should be the numeric rating. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameRated; + +/*! Log this event when a user has performed a search within the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameSearched; + +/*! Log this event when the user has spent app credits. The valueToSum passed to logEvent should be the number of credits spent. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameSpentCredits; + +/*! Log this event when the user has unlocked an achievement in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameUnlockedAchievement; + +/*! Log this event when a user has viewed a form of content in the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventNameViewedContent; + +/*! + @methodgroup Predefined event name parameters for common additional information to accompany events logged through the `logEvent` family + of methods on `FBSDKAppEvents`. Common event names are provided in the `FBAppEventName*` constants. + */ + +/*! Parameter key used to specify an ID for the specific piece of content being logged about. Could be an EAN, article identifier, etc., depending on the nature of the app. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentID; + +/*! Parameter key used to specify a generic content type/family for the logged event, e.g. "music", "photo", "video". Options to use will vary based upon what the app is all about. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentType; + +/*! Parameter key used to specify currency used with logged event. E.g. "USD", "EUR", "GBP". See ISO-4217 for specific values. One reference for these is . */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameCurrency; + +/*! Parameter key used to specify a description appropriate to the event being logged. E.g., the name of the achievement unlocked in the `FBAppEventNameAchievementUnlocked` event. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameDescription; + +/*! Parameter key used to specify the level achieved in a `FBAppEventNameAchieved` event. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameLevel; + +/*! Parameter key used to specify the maximum rating available for the `FBAppEventNameRate` event. E.g., "5" or "10". */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameMaxRatingValue; + +/*! Parameter key used to specify how many items are being processed for an `FBAppEventNameInitiatedCheckout` or `FBAppEventNamePurchased` event. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameNumItems; + +/*! Parameter key used to specify whether payment info is available for the `FBAppEventNameInitiatedCheckout` event. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable; + +/*! Parameter key used to specify method user has used to register for the app, e.g., "Facebook", "email", "Twitter", etc */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameRegistrationMethod; + +/*! Parameter key used to specify the string provided by the user for a search operation. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSearchString; + +/*! Parameter key used to specify whether the activity being logged about was successful or not. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSuccess; + +/* + @methodgroup Predefined values to assign to event parameters that accompany events logged through the `logEvent` family + of methods on `FBSDKAppEvents`. Common event parameters are provided in the `FBSDKAppEventParameterName*` constants. + */ + +/*! Yes-valued parameter value to be used with parameter keys that need a Yes/No value */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueYes; + +/*! No-valued parameter value to be used with parameter keys that need a Yes/No value */ +FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueNo; + + +/*! + + @class FBSDKAppEvents + + @abstract + Client-side event logging for specialized application analytics available through Facebook App Insights + and for use with Facebook Ads conversion tracking and optimization. + + @discussion + The `FBSDKAppEvents` static class has a few related roles: + + + Logging predefined and application-defined events to Facebook App Insights with a + numeric value to sum across a large number of events, and an optional set of key/value + parameters that define "segments" for this event (e.g., 'purchaserStatus' : 'frequent', or + 'gamerLevel' : 'intermediate') + + + Logging events to later be used for ads optimization around lifetime value. + + + Methods that control the way in which events are flushed out to the Facebook servers. + + Here are some important characteristics of the logging mechanism provided by `FBSDKAppEvents`: + + + Events are not sent immediately when logged. They're cached and flushed out to the Facebook servers + in a number of situations: + - when an event count threshold is passed (currently 100 logged events). + - when a time threshold is passed (currently 15 seconds). + - when an app has gone to background and is then brought back to the foreground. + + + Events will be accumulated when the app is in a disconnected state, and sent when the connection is + restored and one of the above 'flush' conditions are met. + + + The `FBSDKAppEvents` class is thread-safe in that events may be logged from any of the app's threads. + + + The developer can set the `flushBehavior` on `FBSDKAppEvents` to force the flushing of events to only + occur on an explicit call to the `flush` method. + + + The developer can turn on console debug output for event logging and flushing to the server by using + the `FBSDKLoggingBehaviorAppEvents` value in `[FBSettings setLoggingBehavior:]`. + + Some things to note when logging events: + + + There is a limit on the number of unique event names an app can use, on the order of 1000. + + There is a limit to the number of unique parameter names in the provided parameters that can + be used per event, on the order of 25. This is not just for an individual call, but for all + invocations for that eventName. + + Event names and parameter names (the keys in the NSDictionary) must be between 2 and 40 characters, and + must consist of alphanumeric characters, _, -, or spaces. + + The length of each parameter value can be no more than on the order of 100 characters. + + */ +@interface FBSDKAppEvents : NSObject + +/* + * Basic event logging + */ + +/*! + + @abstract + Log an event with just an eventName. + + @param eventName The name of the event to record. Limitations on number of events and name length + are given in the `FBSDKAppEvents` documentation. + + */ ++ (void)logEvent:(NSString *)eventName; + +/*! + + @abstract + Log an event with an eventName and a numeric value to be aggregated with other events of this name. + + @param eventName The name of the event to record. Limitations on number of events and name length + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report + the cumulative and average value of this amount. + */ ++ (void)logEvent:(NSString *)eventName + valueToSum:(double)valueToSum; + + +/*! + + @abstract + Log an event with an eventName and a set of key/value pairs in the parameters dictionary. + Parameter limitations are described above. + + @param eventName The name of the event to record. Limitations on number of events and name construction + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + */ ++ (void)logEvent:(NSString *)eventName + parameters:(NSDictionary *)parameters; + +/*! + + @abstract + Log an event with an eventName, a numeric value to be aggregated with other events of this name, + and a set of key/value pairs in the parameters dictionary. + + @param eventName The name of the event to record. Limitations on number of events and name construction + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report + the cumulative and average value of this amount. + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + */ ++ (void)logEvent:(NSString *)eventName + valueToSum:(double)valueToSum + parameters:(NSDictionary *)parameters; + + +/*! + + @abstract + Log an event with an eventName, a numeric value to be aggregated with other events of this name, + and a set of key/value pairs in the parameters dictionary. Providing session lets the developer + target a particular . If nil is provided, then `[FBSession activeSession]` will be used. + + @param eventName The name of the event to record. Limitations on number of events and name construction + are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. + + @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report + the cumulative and average value of this amount. Note that this is an NSNumber, and a value of `nil` denotes + that this event doesn't have a value associated with it for summation. + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + @param accessToken The optional access token to log the event as. + */ ++ (void)logEvent:(NSString *)eventName + valueToSum:(NSNumber *)valueToSum + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken; + +/* + * Purchase logging + */ + +/*! + + @abstract + Log a purchase of the specified amount, in the specified currency. + + @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency. This value + will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). + + @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for + specific values. One reference for these is . + + @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set + to `FBSDKAppEventsFlushBehaviorExplicitOnly`. + + */ ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency; + +/*! + + @abstract + Log a purchase of the specified amount, in the specified currency, also providing a set of + additional characteristics describing the purchase. + + @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency.This value + will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). + + @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for + specific values. One reference for these is . + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set + to `FBSDKAppEventsFlushBehaviorExplicitOnly`. + + */ ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency + parameters:(NSDictionary *)parameters; + +/*! + + @abstract + Log a purchase of the specified amount, in the specified currency, also providing a set of + additional characteristics describing the purchase, as well as an to log to. + + @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency.This value + will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). + + @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for + specific values. One reference for these is . + + @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must + be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of + parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names + are provided in `FBSDKAppEventParameterName*` constants. + + @param accessToken The optional access token to log the event as. + + @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set + to `FBSDKAppEventsFlushBehaviorExplicitOnly`. + + */ ++ (void)logPurchase:(double)purchaseAmount + currency:(NSString *)currency + parameters:(NSDictionary *)parameters + accessToken:(FBSDKAccessToken *)accessToken; + +/*! + + @abstract + Notifies the events system that the app has launched and, when appropriate, logs an "activated app" event. Should typically be placed in the + app delegates' `applicationDidBecomeActive:` method. + + This method also takes care of logging the event indicating the first time this app has been launched, which, among other things, is used to + track user acquisition and app install ads conversions. + + @discussion + `activateApp` will not log an event on every app launch, since launches happen every time the app is backgrounded and then foregrounded. + "activated app" events will be logged when the app has not been active for more than 60 seconds. This method also causes a "deactivated app" + event to be logged when sessions are "completed", and these events are logged with the session length, with an indication of how much + time has elapsed between sessions, and with the number of background/foreground interruptions that session had. This data + is all visible in your app's App Events Insights. + */ ++ (void)activateApp; + +/* + * Control over event batching/flushing + */ + +/*! + + @abstract + Get the current event flushing behavior specifying when events are sent back to Facebook servers. + */ ++ (FBSDKAppEventsFlushBehavior)flushBehavior; + +/*! + + @abstract + Set the current event flushing behavior specifying when events are sent back to Facebook servers. + + @param flushBehavior The desired `FBSDKAppEventsFlushBehavior` to be used. + */ ++ (void)setFlushBehavior:(FBSDKAppEventsFlushBehavior)flushBehavior; + +/*! + @abstract + Set the 'override' App ID for App Event logging. + + @discussion + In some cases, apps want to use one Facebook App ID for login and social presence and another + for App Event logging. (An example is if multiple apps from the same company share an app ID for login, but + want distinct logging.) By default, this value is `nil`, and defers to the `FBSDKAppEventsOverrideAppIDBundleKey` + plist value. If that's not set, it defaults to `[FBSDKSettings appID]`. + + This should be set before any other calls are made to `FBSDKAppEvents`. Thus, you should set it in your application + delegate's `application:didFinishLaunchingWithOptions:` delegate. + + @param appID The Facebook App ID to be used for App Event logging. + */ ++ (void)setLoggingOverrideAppID:(NSString *)appID; + +/*! + @abstract + Get the 'override' App ID for App Event logging. + + @see setLoggingOverrideAppID: + + */ ++ (NSString *)loggingOverrideAppID; + + +/*! + @abstract + Explicitly kick off flushing of events to Facebook. This is an asynchronous method, but it does initiate an immediate + kick off. Server failures will be reported through the NotificationCenter with notification ID `FBSDKAppEventsLoggingResultNotification`. + */ ++ (void)flush; + +/*! + @abstract + Creates a request representing the Graph API call to retrieve a Custom Audience "third party ID" for the app's Facebook user. + Callers will send this ID back to their own servers, collect up a set to create a Facebook Custom Audience with, + and then use the resultant Custom Audience to target ads. + + @param accessToken The access token to use to establish the user's identity for users logged into Facebook through this app. + If `nil`, then the `[FBSDKAccessToken currentAccessToken]` is used. + + @discussion + The JSON in the request's response will include an "custom_audience_third_party_id" key/value pair, with the value being the ID retrieved. + This ID is an encrypted encoding of the Facebook user's ID and the invoking Facebook app ID. + Multiple calls with the same user will return different IDs, thus these IDs cannot be used to correlate behavior + across devices or applications, and are only meaningful when sent back to Facebook for creating Custom Audiences. + + The ID retrieved represents the Facebook user identified in the following way: if the specified access token is valid, + the ID will represent the user associated with that token; otherwise the ID will represent the user logged into the + native Facebook app on the device. If there is no native Facebook app, no one is logged into it, or the user has opted out + at the iOS level from ad tracking, then a `nil` ID will be returned. + + This method returns `nil` if either the user has opted-out (via iOS) from Ad Tracking, the app itself has limited event usage + via the `[FBSDKSettings limitEventAndDataUsage]` flag, or a specific Facebook user cannot be identified. + */ ++ (FBSDKGraphRequest *)requestForCustomAudienceThirdPartyIDWithAccessToken:(FBSDKAccessToken *)accessToken; +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKAppLinkResolver.h b/FBSDKCoreKit.framework/Headers/FBSDKAppLinkResolver.h new file mode 100644 index 0000000..8e65e5b --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKAppLinkResolver.h @@ -0,0 +1,82 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +@class BFTask; + +// Check if Bolts.framework is available for import +#if __has_include() +// Import it if it's available +# import +#else +// Otherwise - redeclare BFAppLinkResolving protocol to resolve the problem of missing symbols +// Please note: Bolts.framework is still required for AppLink resolving to work, +// but this allows FBSDKCoreKit to weakly link Bolts.framework as well as this enables clang modulemaps to work. + +/*! + Implement this protocol to provide an alternate strategy for resolving + App Links that may include pre-fetching, caching, or querying for App Link + data from an index provided by a service provider. + */ +@protocol BFAppLinkResolving + +/*! + Asynchronously resolves App Link data for a given URL. + + @param url The URL to resolve into an App Link. + @returns A BFTask that will return a BFAppLink for the given URL. + */ +- (BFTask *)appLinkFromURLInBackground:(NSURL *)url; + +@end + +#endif + +/*! + @class FBSDKAppLinkResolver + + @abstract + Provides an implementation of the BFAppLinkResolving protocol that uses the Facebook App Link + Index API to resolve App Links given a URL. It also provides an additional helper method that can resolve + multiple App Links in a single call. + + @discussion + Usage of this type requires a client token. See `[FBSDKSettings setClientToken:]` and linking + Bolts.framework + */ +@interface FBSDKAppLinkResolver : NSObject + +/*! + @abstract Asynchronously resolves App Link data for multiple URLs. + + @param urls An array of NSURLs to resolve into App Links. + @returns A BFTask that will return dictionary mapping input NSURLs to their + corresponding BFAppLink. + + @discussion + You should set the client token before making this call. See `[FBSDKSettings setClientToken:]` + */ +- (BFTask *)appLinksFromURLsInBackground:(NSArray *)urls; + +/*! + @abstract Allocates and initializes a new instance of FBSDKAppLinkResolver. + */ ++ (instancetype)resolver; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKAppLinkUtility.h b/FBSDKCoreKit.framework/Headers/FBSDKAppLinkUtility.h new file mode 100644 index 0000000..216b71d --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKAppLinkUtility.h @@ -0,0 +1,55 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @abstract Describes the callback for fetchDeferredAppLink. + @param url the url representing the deferred App Link + @param error the error during the request, if any + + @discussion The url may also have a fb_click_time_utc query parameter that + represents when the click occurred that caused the deferred App Link to be created. + */ +typedef void (^FBSDKDeferredAppLinkHandler)(NSURL *url, NSError *error); + +/*! + @abstract Class containing App Links related utility methods. + */ +@interface FBSDKAppLinkUtility : NSObject + +/*! + @abstract + Call this method from the main thread to fetch deferred applink data if you use Mobile App + Engagement Ads (https://developers.facebook.com/docs/ads-for-apps/mobile-app-ads-engagement). + This may require a network round trip. If successful, the handler is invoked with the link + data (this will only return a valid URL once, and future calls will result in a nil URL + value in the callback). + + @param handler the handler to be invoked if there is deferred App Link data + + @discussion The handler may contain an NSError instance to capture any errors. In the + common case where there simply was no app link data, the NSError instance will be nil. + + This method should only be called from a location that occurs after any launching URL has + been processed (e.g., you should call this method from your application delegate's + applicationDidBecomeActive:). + */ ++ (void)fetchDeferredAppLink:(FBSDKDeferredAppLinkHandler)handler; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKApplicationDelegate.h b/FBSDKCoreKit.framework/Headers/FBSDKApplicationDelegate.h new file mode 100644 index 0000000..857acd0 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKApplicationDelegate.h @@ -0,0 +1,74 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @class FBSDKApplicationDelegate + + @abstract + The FBSDKApplicationDelegate is designed to post process the results from Facebook Login + or Facebook Dialogs (or any action that requires switching over to the native Facebook + app or Safari). + + @discussion + The methods in this class are designed to mirror those in UIApplicationDelegate, and you + should call them in the respective methods in your AppDelegate implementation. + */ +@interface FBSDKApplicationDelegate : NSObject + +/*! + @abstract Gets the singleton instance. + */ ++ (instancetype)sharedInstance; + +/*! + @abstract + Call this method from the [UIApplicationDelegate application:openURL:sourceApplication:annotation:] method + of the AppDelegate for your app. It should be invoked for the proper processing of responses during interaction + with the native Facebook app or Safari as part of SSO authorization flow or Facebook dialogs. + + @param application The application as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @param url The URL as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @param sourceApplication The sourceApplication as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @param annotation The annotation as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. + + @return YES if the url was intended for the Facebook SDK, NO if not. + */ +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation; + +/*! + @abstract + Call this method from the [UIApplicationDelegate application:didFinishLaunchingWithOptions:] method + of the AppDelegate for your app. It should be invoked for the proper use of the Facebook SDK. + + @param application The application as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. + + @param launchOptions The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. + + @return YES if the url was intended for the Facebook SDK, NO if not. + */ +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKButton.h b/FBSDKCoreKit.framework/Headers/FBSDKButton.h new file mode 100644 index 0000000..8132998 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKButton.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @abstract A base class for common SDK buttons. + */ +@interface FBSDKButton : UIButton + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKConstants.h b/FBSDKCoreKit.framework/Headers/FBSDKConstants.h new file mode 100644 index 0000000..5f53161 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKConstants.h @@ -0,0 +1,210 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +/*! + @abstract The error domain for all errors from FBSDKCoreKit. + @discussion Error codes from the SDK in the range 0-99 are reserved for this domain. + */ +FBSDK_EXTERN NSString *const FBSDKErrorDomain; + +/*! + @typedef NS_ENUM(NSInteger, FBSDKErrorCode) + @abstract Error codes for FBSDKErrorDomain. + */ +typedef NS_ENUM(NSInteger, FBSDKErrorCode) +{ + /*! + @abstract Reserved. + */ + FBSDKReservedErrorCode = 0, + + /*! + @abstract The error code for errors from invalid encryption on incoming encryption URLs. + */ + FBSDKEncryptionErrorCode, + + /*! + @abstract The error code for errors from invalid arguments to SDK methods. + */ + FBSDKInvalidArgumentErrorCode, + + /*! + @abstract The error code for unknown errors. + */ + FBSDKUnknownErrorCode, + + /*! + @abstract A request failed due to a network error. Use NSUnderlyingErrorKey to retrieve + the error object from the NSURLConnection for more information. + */ + FBSDKNetworkErrorCode, + + /*! + @abstract The error code for errors encounted during an App Events flush. + */ + FBSDKAppEventsFlushErrorCode, + + /*! + @abstract An endpoint that returns a binary response was used with FBSDKGraphRequestConnection. + @discussion Endpoints that return image/jpg, etc. should be accessed using NSURLRequest + */ + FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode, + + /*! + @abstract The operation failed because the server returned an unexpected response. + @discussion You can get this error if you are not using the most recent SDK, or you are accessing a version of the + Graph API incompatible with the current SDK. + */ + FBSDKGraphRequestProtocolMismatchErrorCode, + + /*! + @abstract The Graph API returned an error. + @discussion See below for useful userInfo keys (beginning with FBSDKGraphRequestError*) + */ + FBSDKGraphRequestGraphAPIErrorCode, + + /*! + @abstract The specified dialog configuration is not available. + @discussion This error may signify that the configuration for the dialogs has not yet been downloaded from the server + or that the dialog is unavailable. Subsequent attempts to use the dialog may succeed as the configuration is loaded. + */ + FBSDKDialogUnavailableErrorCode, + + /*! + @abstract Indicates an operation failed because a required access token was not found. + */ + FBSDKAccessTokenRequiredErrorCode, + + /*! + @abstract Indicates an app switch (typically for a dialog) failed because the destination app is out of date. + */ + FBSDKAppVersionUnsupportedErrorCode, + + /*! + @abstract Indicates an app switch to the browser (typically for a dialog) failed. + */ + FBSDKBrowswerUnavailableErrorCode, +}; + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) + @abstract Describes the category of Facebook error. See `FBSDKGraphRequestErrorCategoryKey`. + */ +typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) +{ + /*! The default error category that is not known to be recoverable. Check `FBSDKLocalizedErrorDescriptionKey` for a user facing message. */ + FBSDKGraphRequestErrorCategoryOther = 0, + /*! Indicates the error is temporary (such as server throttling). While a recoveryAttempter will be provided with the error instance, the attempt is guaranteed to succeed so you can simply retry the operation if you do not want to present an alert. */ + FBSDKGraphRequestErrorCategoryTransient = 1, + /*! Indicates the error can be recovered (such as requiring a login). A recoveryAttempter will be provided with the error instance that can take UI action. */ + FBSDKGraphRequestErrorCategoryRecoverable = 2 +}; + +/* + @methodgroup error userInfo keys + */ + +/*! + @abstract The userInfo key for the invalid collection for errors with FBSDKInvalidArgumentErrorCode. + @discussion If the invalid argument is a collection, the collection can be found with this key and the individual + invalid item can be found with FBSDKErrorArgumentValueKey. + */ +FBSDK_EXTERN NSString *const FBSDKErrorArgumentCollectionKey; + +/*! + @abstract The userInfo key for the invalid argument name for errors with FBSDKInvalidArgumentErrorCode. + */ +FBSDK_EXTERN NSString *const FBSDKErrorArgumentNameKey; + +/*! + @abstract The userInfo key for the invalid argument value for errors with FBSDKInvalidArgumentErrorCode. + */ +FBSDK_EXTERN NSString *const FBSDKErrorArgumentValueKey; + +/*! + @abstract The userInfo key for the message for developers in NSErrors that originate from the SDK. + @discussion The developer message will not be localized and is not intended to be presented within the app. + */ +FBSDK_EXTERN NSString *const FBSDKErrorDeveloperMessageKey; + +/*! + @abstract The userInfo key describing a localized description that can be presented to the user. + */ +FBSDK_EXTERN NSString *const FBSDKErrorLocalizedDescriptionKey; + +/*! + @abstract The userInfo key describing a localized title that can be presented to the user, used with `FBSDKLocalizedErrorDescriptionKey`. + */ +FBSDK_EXTERN NSString *const FBSDKErrorLocalizedTitleKey; + +/* + @methodgroup FBSDKGraphRequest error userInfo keys + */ + +/*! + @abstract The userInfo key describing the error category, for error recovery purposes. + @discussion See `FBSDKGraphErrorRecoveryProcessor` and `[FBSDKGraphRequest disableErrorRecovery]`. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorCategoryKey; + +/* + @abstract The userInfo key for the Graph API error code. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorCode; + +/* + @abstract The userInfo key for the Graph API error subcode. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorSubcode; + +/* + @abstract The userInfo key for the HTTP status code. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey; + +/* + @abstract The userInfo key for the raw JSON response. + */ +FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey; + +/*! + @abstract a formal protocol very similar to the informal protocol NSErrorRecoveryAttempting + */ +@protocol FBSDKErrorRecoveryAttempting + +/*! + @abstract attempt the recovery + @param error the error + @param recoveryOptionIndex the selected option index + @param delegate the delegate + @param didRecoverSelector the callback selector, see discussion. + @param contextInfo context info to pass back to callback selector, see discussion. + @discussion + Given that an error alert has been presented document-modally to the user, and the user has chosen one of the error's recovery options, attempt recovery from the error, and send the selected message to the specified delegate. The option index is an index into the error's array of localized recovery options. The method selected by didRecoverSelector must have the same signature as: + + - (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; + + The value passed for didRecover must be YES if error recovery was completely successful, NO otherwise. + */ +- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKCopying.h b/FBSDKCoreKit.framework/Headers/FBSDKCopying.h new file mode 100644 index 0000000..f4ad767 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKCopying.h @@ -0,0 +1,33 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @abstract Extension protocol for NSCopying that adds the copy method, which is implemented on NSObject. + @discussion NSObject implicitly conforms to this protocol. + */ +@protocol FBSDKCopying + +/*! + @abstract Implemented by NSObject as a convenience to copyWithZone:. + @return A copy of the receiver. + */ +- (id)copy; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKCoreKit.h b/FBSDKCoreKit.framework/Headers/FBSDKCoreKit.h new file mode 100644 index 0000000..3b78900 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKCoreKit.h @@ -0,0 +1,38 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#define FBSDK_VERSION_STRING @"4.7.0" +#define FBSDK_TARGET_PLATFORM_VERSION @"v2.5" diff --git a/FBSDKCoreKit.framework/Headers/FBSDKGraphErrorRecoveryProcessor.h b/FBSDKCoreKit.framework/Headers/FBSDKGraphErrorRecoveryProcessor.h new file mode 100644 index 0000000..d2b0313 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKGraphErrorRecoveryProcessor.h @@ -0,0 +1,97 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import "FBSDKConstants.h" + +@class FBSDKGraphErrorRecoveryProcessor; +@class FBSDKGraphRequest; + +/*! + @abstract Defines a delegate for `FBSDKGraphErrorRecoveryProcessor`. + */ +@protocol FBSDKGraphErrorRecoveryProcessorDelegate + +/*! + @abstract Indicates the error recovery has been attempted. + @param processor the processor instance. + @param didRecover YES if the recovery was successful. + @param error the error that that was attempted to be recovered from. + */ +- (void)processorDidAttemptRecovery:(FBSDKGraphErrorRecoveryProcessor *)processor didRecover:(BOOL)didRecover error:(NSError *)error; + +@optional +/*! + @abstract Indicates the processor is about to process the error. + @param processor the processor instance. + @param error the error is about to be processed. + @discussion return NO if the processor should not process the error. For example, + if you want to prevent alerts of localized messages but otherwise perform retries and recoveries, + you could return NO for errors where userInfo[FBSDKGraphRequestErrorCategoryKey] equal to FBSDKGraphRequestErrorCategoryOther + */ +- (BOOL)processorWillProcessError:(FBSDKGraphErrorRecoveryProcessor *)processor error:(NSError *)error; + +@end + +/*! + @abstract Defines a type that can process Facebook NSErrors with best practices. + @discussion Facebook NSErrors can contain FBSDKErrorRecoveryAttempting instances to recover from errors, or + localized messages to present to the user. This class will process the instances as follows: + + 1. If the error is temporary as indicated by FBSDKGraphRequestErrorCategoryKey, assume the recovery succeeded and + notify the delegate. + 2. If a FBSDKErrorRecoveryAttempting instance is available, display an alert (dispatched to main thread) + with the recovery options and call the instance's [ attemptRecoveryFromError:optionIndex:...]. + 3. If a FBSDKErrorRecoveryAttempting is not available, check the userInfo for FBSDKLocalizedErrorDescriptionKey + and present that in an alert (dispatched to main thread). + + By default, FBSDKGraphRequests use this type to process errors and retry the request upon a successful + recovery. + + Note that Facebook recovery attempters can present UI or even cause app switches (such as to login). Any such + work is dispatched to the main thread (therefore your request handlers may then run on the main thread). + + Login recovery requires FBSDKLoginKit. Login will use FBSDKLoginBehaviorNative and will prompt the user + for all permissions last granted. If any are declined on the new request, the recovery is not successful but + the `[FBSDKAccessToken currentAccessToken]` might still have been updated. + . + */ +@interface FBSDKGraphErrorRecoveryProcessor : NSObject + +/*! + @abstract Gets the delegate. Note this is a strong reference, and is nil'ed out after recovery is complete. + */ +@property (nonatomic, strong, readonly) iddelegate; + +/*! + @abstract Attempts to process the error, return YES if the error can be processed. + @param error the error to process. + @param request the relateed request that may be reissued. + @param delegate the delegate that will be retained until recovery is complete. + */ +- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id) delegate; + +/*! + @abstract The callback for FBSDKErrorRecoveryAttempting + @param didRecover if the recovery succeeded + @param contextInfo unused + */ +- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKGraphRequest.h b/FBSDKCoreKit.framework/Headers/FBSDKGraphRequest.h new file mode 100644 index 0000000..5ae03e2 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKGraphRequest.h @@ -0,0 +1,120 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +@class FBSDKAccessToken; + +/*! + @abstract Represents a request to the Facebook Graph API. + + @discussion `FBSDKGraphRequest` encapsulates the components of a request (the + Graph API path, the parameters, error recovery behavior) and should be + used in conjunction with `FBSDKGraphRequestConnection` to issue the request. + + Nearly all Graph APIs require an access token. Unless specified, the + `[FBSDKAccessToken currentAccessToken]` is used. Therefore, most requests + will require login first (see `FBSDKLoginManager` in FBSDKLoginKit.framework). + + A `- start` method is provided for convenience for single requests. + + By default, FBSDKGraphRequest will attempt to recover any errors returned from + Facebook. You can disable this via `disableErrorRecovery:`. + @see FBSDKGraphErrorRecoveryProcessor + */ +@interface FBSDKGraphRequest : NSObject + +/*! + @abstract Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. + @param graphPath the graph path (e.g., @"me"). + @param parameters the optional parameters dictionary. + */ +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters; + +/*! + @abstract Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. + @param graphPath the graph path (e.g., @"me"). + @param parameters the optional parameters dictionary. + @param HTTPMethod the optional HTTP method. nil defaults to @"GET". + */ +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + HTTPMethod:(NSString *)HTTPMethod; + +/*! + @abstract Initializes a new instance. + @param graphPath the graph path (e.g., @"me"). + @param parameters the optional parameters dictionary. + @param tokenString the token string to use. Specifying nil will cause no token to be used. + @param version the optional Graph API version (e.g., @"v2.0"). nil defaults to FBSDK_TARGET_PLATFORM_VERSION. + @param HTTPMethod the optional HTTP method (e.g., @"POST"). nil defaults to @"GET". + */ +- (instancetype)initWithGraphPath:(NSString *)graphPath + parameters:(NSDictionary *)parameters + tokenString:(NSString *)tokenString + version:(NSString *)version + HTTPMethod:(NSString *)HTTPMethod +NS_DESIGNATED_INITIALIZER; + +/*! + @abstract The request parameters. + */ +@property (nonatomic, strong, readonly) NSMutableDictionary *parameters; + +/*! + @abstract The access token string used by the request. + */ +@property (nonatomic, copy, readonly) NSString *tokenString; + +/*! + @abstract The Graph API endpoint to use for the request, for example "me". + */ +@property (nonatomic, copy, readonly) NSString *graphPath; + +/*! + @abstract The HTTPMethod to use for the request, for example "GET" or "POST". + */ +@property (nonatomic, copy, readonly) NSString *HTTPMethod; + +/*! + @abstract The Graph API version to use (e.g., "v2.0") + */ +@property (nonatomic, copy, readonly) NSString *version; + +/*! + @abstract If set, disables the automatic error recovery mechanism. + @param disable whether to disable the automatic error recovery mechanism + @discussion By default, non-batched FBSDKGraphRequest instances will automatically try to recover + from errors by constructing a `FBSDKGraphErrorRecoveryProcessor` instance that + re-issues the request on successful recoveries. The re-issued request will call the same + handler as the receiver but may occur with a different `FBSDKGraphRequestConnection` instance. + + This will override [FBSDKSettings setGraphErrorRecoveryDisabled:]. + */ +- (void)setGraphErrorRecoveryDisabled:(BOOL)disable; + +/*! + @abstract Starts a connection to the Graph API. + @param handler The handler block to call when the request completes. + */ +- (FBSDKGraphRequestConnection *)startWithCompletionHandler:(FBSDKGraphRequestHandler)handler; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestConnection.h b/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestConnection.h new file mode 100644 index 0000000..79ffb3f --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestConnection.h @@ -0,0 +1,325 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +@class FBSDKGraphRequest; +@class FBSDKGraphRequestConnection; + +/*! + @typedef FBSDKGraphRequestHandler + + @abstract + A block that is passed to addRequest to register for a callback with the results of that + request once the connection completes. + + @discussion + Pass a block of this type when calling addRequest. This will be called once + the request completes. The call occurs on the UI thread. + + @param connection The `FBSDKGraphRequestConnection` that sent the request. + + @param result The result of the request. This is a translation of + JSON data to `NSDictionary` and `NSArray` objects. This + is nil if there was an error. + + @param error The `NSError` representing any error that occurred. + + */ +typedef void (^FBSDKGraphRequestHandler)(FBSDKGraphRequestConnection *connection, + id result, + NSError *error); + +/*! + @protocol + + @abstract + The `FBSDKGraphRequestConnectionDelegate` protocol defines the methods used to receive network + activity progress information from a . + */ +@protocol FBSDKGraphRequestConnectionDelegate + +@optional + +/*! + @method + + @abstract + Tells the delegate the request connection will begin loading + + @discussion + If the is created using one of the convenience factory methods prefixed with + start, the object returned from the convenience method has already begun loading and this method + will not be called when the delegate is set. + + @param connection The request connection that is starting a network request + */ +- (void)requestConnectionWillBeginLoading:(FBSDKGraphRequestConnection *)connection; + +/*! + @method + + @abstract + Tells the delegate the request connection finished loading + + @discussion + If the request connection completes without a network error occuring then this method is called. + Invocation of this method does not indicate success of every made, only that the + request connection has no further activity. Use the error argument passed to the FBSDKGraphRequestHandler + block to determine success or failure of each . + + This method is invoked after the completion handler for each . + + @param connection The request connection that successfully completed a network request + */ +- (void)requestConnectionDidFinishLoading:(FBSDKGraphRequestConnection *)connection; + +/*! + @method + + @abstract + Tells the delegate the request connection failed with an error + + @discussion + If the request connection fails with a network error then this method is called. The `error` + argument specifies why the network connection failed. The `NSError` object passed to the + FBSDKGraphRequestHandler block may contain additional information. + + @param connection The request connection that successfully completed a network request + @param error The `NSError` representing the network error that occurred, if any. May be nil + in some circumstances. Consult the `NSError` for the for reliable + failure information. + */ +- (void)requestConnection:(FBSDKGraphRequestConnection *)connection + didFailWithError:(NSError *)error; + +/*! + @method + + @abstract + Tells the delegate how much data has been sent and is planned to send to the remote host + + @discussion + The byte count arguments refer to the aggregated objects, not a particular . + + Like `NSURLConnection`, the values may change in unexpected ways if data needs to be resent. + + @param connection The request connection transmitting data to a remote host + @param bytesWritten The number of bytes sent in the last transmission + @param totalBytesWritten The total number of bytes sent to the remote host + @param totalBytesExpectedToWrite The total number of bytes expected to send to the remote host + */ +- (void)requestConnection:(FBSDKGraphRequestConnection *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten +totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; + +@end + +/*! + @class FBSDKGraphRequestConnection + + @abstract + The `FBSDKGraphRequestConnection` represents a single connection to Facebook to service a request. + + @discussion + The request settings are encapsulated in a reusable object. The + `FBSDKGraphRequestConnection` object encapsulates the concerns of a single communication + e.g. starting a connection, canceling a connection, or batching requests. + + */ +@interface FBSDKGraphRequestConnection : NSObject + +/*! + @abstract + The delegate object that receives updates. + */ +@property (nonatomic, assign) id delegate; + +/*! + @abstract Gets or sets the timeout interval to wait for a response before giving up. + */ +@property (nonatomic) NSTimeInterval timeout; + +/*! + @abstract + The raw response that was returned from the server. (readonly) + + @discussion + This property can be used to inspect HTTP headers that were returned from + the server. + + The property is nil until the request completes. If there was a response + then this property will be non-nil during the FBSDKGraphRequestHandler callback. + */ +@property (nonatomic, retain, readonly) NSHTTPURLResponse *URLResponse; + +/*! + @methodgroup Class methods + */ + +/*! + @method + + @abstract + This method sets the default timeout on all FBSDKGraphRequestConnection instances. Defaults to 60 seconds. + + @param defaultConnectionTimeout The timeout interval. + */ ++ (void)setDefaultConnectionTimeout:(NSTimeInterval)defaultConnectionTimeout; + +/*! + @methodgroup Adding requests + */ + +/*! + @method + + @abstract + This method adds an object to this connection. + + @param request A request to be included in the round-trip when start is called. + @param handler A handler to call back when the round-trip completes or times out. + + @discussion + The completion handler is retained until the block is called upon the + completion or cancellation of the connection. + */ +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler; + +/*! + @method + + @abstract + This method adds an object to this connection. + + @param request A request to be included in the round-trip when start is called. + + @param handler A handler to call back when the round-trip completes or times out. + The handler will be invoked on the main thread. + + @param name An optional name for this request. This can be used to feed + the results of one request to the input of another in the same + `FBSDKGraphRequestConnection` as described in + [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). + + @discussion + The completion handler is retained until the block is called upon the + completion or cancellation of the connection. This request can be named + to allow for using the request's response in a subsequent request. + */ +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchEntryName:(NSString *)name; + +/*! + @method + + @abstract + This method adds an object to this connection. + + @param request A request to be included in the round-trip when start is called. + + @param handler A handler to call back when the round-trip completes or times out. + + @param batchParameters The optional dictionary of parameters to include for this request + as described in [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). + Examples include "depends_on", "name", or "omit_response_on_success". + + @discussion + The completion handler is retained until the block is called upon the + completion or cancellation of the connection. This request can be named + to allow for using the request's response in a subsequent request. + */ +- (void)addRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchParameters:(NSDictionary *)batchParameters; + +/*! + @methodgroup Instance methods + */ + +/*! + @method + + @abstract + Signals that a connection should be logically terminated as the + application is no longer interested in a response. + + @discussion + Synchronously calls any handlers indicating the request was cancelled. Cancel + does not guarantee that the request-related processing will cease. It + does promise that all handlers will complete before the cancel returns. A call to + cancel prior to a start implies a cancellation of all requests associated + with the connection. + */ +- (void)cancel; + +/*! + @method + + @abstract + This method starts a connection with the server and is capable of handling all of the + requests that were added to the connection. + + @discussion By default, a connection is scheduled on the current thread in the default mode when it is created. + See `setDelegateQueue:` for other options. + + This method cannot be called twice for an `FBSDKGraphRequestConnection` instance. + */ +- (void)start; + +/*! + @abstract Determines the operation queue that is used to call methods on the connection's delegate. + @param queue The operation queue to use when calling delegate methods. + @discussion By default, a connection is scheduled on the current thread in the default mode when it is created. + You cannot reschedule a connection after it has started. + + This is very similar to `[NSURLConnection setDelegateQueue:]`. + */ +- (void)setDelegateQueue:(NSOperationQueue *)queue; + +/*! + @method + + @abstract + Overrides the default version for a batch request + + @discussion + The SDK automatically prepends a version part, such as "v2.0" to API paths in order to simplify API versioning + for applications. If you want to override the version part while using batch requests on the connection, call + this method to set the version for the batch request. + + @param version This is a string in the form @"v2.0" which will be used for the version part of an API path + */ +- (void)overrideVersionPartWith:(NSString *)version; + +@end + +/*! + @abstract The key in the result dictionary for requests to old versions of the Graph API + whose response is not a JSON object. + + @discussion When a request returns a non-JSON response (such as a "true" literal), that response + will be wrapped into a dictionary using this const as the key. This only applies for very few Graph API + prior to v2.1. + */ +FBSDK_EXTERN NSString *const FBSDKNonJSONResponseProperty; diff --git a/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestDataAttachment.h b/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestDataAttachment.h new file mode 100644 index 0000000..c179e29 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestDataAttachment.h @@ -0,0 +1,52 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @abstract A container class for data attachments so that additional metadata can be provided about the attachment. + */ +@interface FBSDKGraphRequestDataAttachment : NSObject + +/*! + @abstract Initializes the receiver with the attachment data and metadata. + @param data The attachment data (retained, not copied) + @param filename The filename for the attachment + @param contentType The content type for the attachment + */ +- (instancetype)initWithData:(NSData *)data + filename:(NSString *)filename + contentType:(NSString *)contentType +NS_DESIGNATED_INITIALIZER; + +/*! + @abstract The content type for the attachment. + */ +@property (nonatomic, copy, readonly) NSString *contentType; + +/*! + @abstract The attachment data. + */ +@property (nonatomic, strong, readonly) NSData *data; + +/*! + @abstract The filename for the attachment. + */ +@property (nonatomic, copy, readonly) NSString *filename; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKMacros.h b/FBSDKCoreKit.framework/Headers/FBSDKMacros.h new file mode 100644 index 0000000..fd2e2ff --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKMacros.h @@ -0,0 +1,39 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +#ifdef __cplusplus +#define FBSDK_EXTERN extern "C" __attribute__((visibility ("default"))) +#else +#define FBSDK_EXTERN extern __attribute__((visibility ("default"))) +#endif + +#define FBSDK_STATIC_INLINE static inline + +#define FBSDK_NO_DESIGNATED_INITIALIZER() \ +@throw [NSException exceptionWithName:NSInvalidArgumentException \ + reason:[NSString stringWithFormat:@"unrecognized selector sent to instance %p", self] \ + userInfo:nil] + +#define FBSDK_NOT_DESIGNATED_INITIALIZER(DESIGNATED_INITIALIZER) \ +@throw [NSException exceptionWithName:NSInvalidArgumentException \ + reason:[NSString stringWithFormat:@"Please use the designated initializer [%p %@]", \ + self, \ + NSStringFromSelector(@selector(DESIGNATED_INITIALIZER))] \ + userInfo:nil] diff --git a/FBSDKCoreKit.framework/Headers/FBSDKMutableCopying.h b/FBSDKCoreKit.framework/Headers/FBSDKMutableCopying.h new file mode 100644 index 0000000..621fac9 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKMutableCopying.h @@ -0,0 +1,35 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +/*! + @abstract Extension protocol for NSMutableCopying that adds the mutableCopy method, which is implemented on NSObject. + @discussion NSObject implicitly conforms to this protocol. + */ +@protocol FBSDKMutableCopying + +/*! + @abstract Implemented by NSObject as a convenience to mutableCopyWithZone:. + @return A mutable copy of the receiver. + */ +- (id)mutableCopy; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKProfile.h b/FBSDKCoreKit.framework/Headers/FBSDKProfile.h new file mode 100644 index 0000000..11da3d9 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKProfile.h @@ -0,0 +1,148 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 "FBSDKMacros.h" +#import "FBSDKProfilePictureView.h" + +/*! + @abstract Notification indicating that the `currentProfile` has changed. + @discussion the userInfo dictionary of the notification will contain keys + `FBSDKProfileChangeOldKey` and + `FBSDKProfileChangeNewKey`. + */ +FBSDK_EXTERN NSString *const FBSDKProfileDidChangeNotification; + +/* @abstract key in notification's userInfo object for getting the old profile. + @discussion If there was no old profile, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKProfileChangeOldKey; + +/* @abstract key in notification's userInfo object for getting the new profile. + @discussion If there is no new profile, the key will not be present. + */ +FBSDK_EXTERN NSString *const FBSDKProfileChangeNewKey; + +/*! + @abstract Represents an immutable Facebook profile + @discussion This class provides a global "currentProfile" instance to more easily + add social context to your application. When the profile changes, a notification is + posted so that you can update relevant parts of your UI and is persisted to NSUserDefaults. + + Typically, you will want to call `enableUpdatesOnAccessTokenChange:YES` so that + it automatically observes changes to the `[FBSDKAccessToken currentAccessToken]`. + + You can use this class to build your own `FBSDKProfilePictureView` or in place of typical requests to "/me". + */ +@interface FBSDKProfile : NSObject + +/*! + @abstract initializes a new instance. + @param userID the user ID + @param firstName the user's first name + @param middleName the user's middle name + @param lastName the user's last name + @param name the user's complete name + @param linkURL the link for this profile + @param refreshDate the optional date this profile was fetched. Defaults to [NSDate date]. + */ +- (instancetype)initWithUserID:(NSString *)userID + firstName:(NSString *)firstName + middleName:(NSString *)middleName + lastName:(NSString *)lastName + name:(NSString *)name + linkURL:(NSURL *)linkURL + refreshDate:(NSDate *)refreshDate NS_DESIGNATED_INITIALIZER; +/*! + @abstract The user id + */ +@property (nonatomic, readonly) NSString *userID; +/*! + @abstract The user's first name + */ +@property (nonatomic, readonly) NSString *firstName; +/*! + @abstract The user's middle name + */ +@property (nonatomic, readonly) NSString *middleName; +/*! + @abstract The user's last name + */ +@property (nonatomic, readonly) NSString *lastName; +/*! + @abstract The user's complete name + */ +@property (nonatomic, readonly) NSString *name; +/*! + @abstract A URL to the user's profile. + @discussion Consider using Bolts and `FBSDKAppLinkResolver` to resolve this + to an app link to link directly to the user's profile in the Facebook app. + */ +@property (nonatomic, readonly) NSURL *linkURL; + +/*! + @abstract The last time the profile data was fetched. + */ +@property (nonatomic, readonly) NSDate *refreshDate; + +/*! + @abstract Gets the current FBSDKProfile instance. + */ ++ (FBSDKProfile *)currentProfile; + +/*! + @abstract Sets the current instance and posts the appropriate notification if the profile parameter is different + than the receiver. + @param profile the profile to set + @discussion This persists the profile to NSUserDefaults. + */ ++ (void)setCurrentProfile:(FBSDKProfile *)profile; + +/*! + @abstract Indicates if `currentProfile` will automatically observe `FBSDKAccessTokenDidChangeNotification` notifications + @param enable YES is observing + @discussion If observing, this class will issue a graph request for public profile data when the current token's userID + differs from the current profile. You can observe `FBSDKProfileDidChangeNotification` for when the profile is updated. + + Note that if `[FBSDKAccessToken currentAccessToken]` is unset, the `currentProfile` instance remains. It's also possible + for `currentProfile` to return nil until the data is fetched. + */ ++ (void)enableUpdatesOnAccessTokenChange:(BOOL)enable; + +/*! + @abstract A convenience method for returning a complete `NSURL` for retrieving the user's profile image. + @param mode The picture mode + @param size The height and width. This will be rounded to integer precision. + */ +- (NSURL *)imageURLForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size; + +/*! + @abstract A convenience method for returning a Graph API path for retrieving the user's profile image. + @deprecated use `imageURLForPictureMode:size:` instead + @discussion You can pass this to a `FBSDKGraphRequest` instance to download the image. + @param mode The picture mode + @param size The height and width. This will be rounded to integer precision. + */ +- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size +__attribute__ ((deprecated("use imageURLForPictureMode:size: instead"))); + +/*! + @abstract Returns YES if the profile is equivalent to the receiver. + @param profile the profile to compare to. + */ +- (BOOL)isEqualToProfile:(FBSDKProfile *)profile; +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKProfilePictureView.h b/FBSDKCoreKit.framework/Headers/FBSDKProfilePictureView.h new file mode 100644 index 0000000..f1f64cb --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKProfilePictureView.h @@ -0,0 +1,59 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @typedef FBSDKProfilePictureMode enum + @abstract Defines the aspect ratio mode for the source image of the profile picture. + */ +typedef NS_ENUM(NSUInteger, FBSDKProfilePictureMode) +{ + /*! + @abstract A square cropped version of the image will be included in the view. + */ + FBSDKProfilePictureModeSquare, + /*! + @abstract The original picture's aspect ratio will be used for the source image in the view. + */ + FBSDKProfilePictureModeNormal, +}; + +/*! + @abstract A view to display a profile picture. + */ +@interface FBSDKProfilePictureView : UIView + +/*! + @abstract The mode for the receiver to determine the aspect ratio of the source image. + */ +@property (nonatomic, assign) FBSDKProfilePictureMode pictureMode; + +/*! + @abstract The profile ID to show the picture for. + */ +@property (nonatomic, copy) NSString *profileID; + +/*! + @abstract Explicitly marks the receiver as needing to update the image. + @discussion This method is called whenever any properties that affect the source image are modified, but this can also + be used to trigger a manual update of the image if it needs to be re-downloaded. + */ +- (void)setNeedsImageUpdate; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKSettings.h b/FBSDKCoreKit.framework/Headers/FBSDKSettings.h new file mode 100644 index 0000000..edc0040 --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKSettings.h @@ -0,0 +1,209 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +/* + * Constants defining logging behavior. Use with <[FBSDKSettings setLoggingBehavior]>. + */ + +/*! Include access token in logging. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAccessTokens; + +/*! Log performance characteristics */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics; + +/*! Log FBSDKAppEvents interactions */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAppEvents; + +/*! Log Informational occurrences */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorInformational; + +/*! Log cache errors. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorCacheErrors; + +/*! Log errors from SDK UI controls */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorUIControlErrors; + +/*! Log debug warnings from API response, i.e. when friends fields requested, but user_friends permission isn't granted. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning; + +/*! Log warnings from API response, i.e. when requested feature will be deprecated in next version of API. + Info is the lowest level of severity, using it will result in logging all previously mentioned levels. + */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo; + +/*! Log errors from SDK network requests */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorNetworkRequests; + +/*! Log errors likely to be preventable by the developer. This is in the default set of enabled logging behaviors. */ +FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorDeveloperErrors; + +@interface FBSDKSettings : NSObject + +/*! + @abstract Get the Facebook App ID used by the SDK. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookAppID). + */ ++ (NSString *)appID; + +/*! + @abstract Set the Facebook App ID to be used by the SDK. + @param appID The Facebook App ID to be used by the SDK. + */ ++ (void)setAppID:(NSString *)appID; + +/*! + @abstract Get the default url scheme suffix used for sessions. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookUrlSchemeSuffix). + */ ++ (NSString *)appURLSchemeSuffix; + +/*! + @abstract Set the app url scheme suffix used by the SDK. + @param appURLSchemeSuffix The url scheme suffix to be used by the SDK. + */ ++ (void)setAppURLSchemeSuffix:(NSString *)appURLSchemeSuffix; + +/*! + @abstract Retrieve the Client Token that has been set via [FBSDKSettings setClientToken]. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookClientToken). + */ ++ (NSString *)clientToken; + +/*! + @abstract Sets the Client Token for the Facebook App. + @discussion This is needed for certain API calls when made anonymously, without a user-based access token. + @param clientToken The Facebook App's "client token", which, for a given appid can be found in the Security + section of the Advanced tab of the Facebook App settings found at + */ ++ (void)setClientToken:(NSString *)clientToken; + +/*! + @abstract A convenient way to toggle error recovery for all FBSDKGraphRequest instances created after this is set. + @param disableGraphErrorRecovery YES or NO. + */ ++ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery; + +/*! + @abstract Get the Facebook Display Name used by the SDK. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookDisplayName). + */ ++ (NSString *)displayName; + +/*! + @abstract Set the default Facebook Display Name to be used by the SDK. + @discussion This should match the Display Name that has been set for the app with the corresponding Facebook App ID, + in the Facebook App Dashboard. + @param displayName The Facebook Display Name to be used by the SDK. + */ ++ (void)setDisplayName:(NSString *)displayName; + +/*! + @abstract Get the Facebook domain part. + @discussion If not explicitly set, the default will be read from the application's plist (FacebookDomainPart). + */ ++ (NSString *)facebookDomainPart; + +/*! + @abstract Set the subpart of the Facebook domain. + @discussion This can be used to change the Facebook domain (e.g. @"beta") so that requests will be sent to + graph.beta.facebook.com + @param facebookDomainPart The domain part to be inserted into facebook.com. + */ ++ (void)setFacebookDomainPart:(NSString *)facebookDomainPart; + +/*! + @abstract The quality of JPEG images sent to Facebook from the SDK. + @discussion If not explicitly set, the default is 0.9. + @see [UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ ++ (CGFloat)JPEGCompressionQuality; + +/*! + @abstract Set the quality of JPEG images sent to Facebook from the SDK. + @param JPEGCompressionQuality The quality for JPEG images, expressed as a value from 0.0 to 1.0. + @see [UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ ++ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality; + +/*! + @abstract + Gets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. + */ ++ (BOOL)limitEventAndDataUsage; + +/*! + @abstract + Sets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. + + @param limitEventAndDataUsage The desired value. + */ ++ (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage; + +/*! + @abstract Retrieve the current iOS SDK version. + */ ++ (NSString *)sdkVersion; + +/*! + @abstract Retrieve the current Facebook SDK logging behavior. + */ ++ (NSSet *)loggingBehavior; + +/*! + @abstract Set the current Facebook SDK logging behavior. This should consist of strings defined as + constants with FBSDKLoggingBehavior*. + + @param loggingBehavior A set of strings indicating what information should be logged. If nil is provided, the logging + behavior is reset to the default set of enabled behaviors. Set to an empty set in order to disable all logging. + + @discussion You can also define this via an array in your app plist with key "FacebookLoggingBehavior" or add and remove individual values via enableLoggingBehavior: or disableLogginBehavior: + */ ++ (void)setLoggingBehavior:(NSSet *)loggingBehavior; + +/*! + @abstract Enable a particular Facebook SDK logging behavior. + + @param loggingBehavior The LoggingBehavior to enable. This should be a string defined as a constant with FBSDKLoggingBehavior*. + */ ++ (void)enableLoggingBehavior:(NSString *)loggingBehavior; + +/*! + @abstract Disable a particular Facebook SDK logging behavior. + + @param loggingBehavior The LoggingBehavior to disable. This should be a string defined as a constant with FBSDKLoggingBehavior*. + */ ++ (void)disableLoggingBehavior:(NSString *)loggingBehavior; + +/*! + @abstract Set the user defaults key used by legacy token caches. + + @param tokenInformationKeyName the key used by legacy token caches. + + @discussion Use this only if you customized FBSessionTokenCachingStrategy in v3.x of + the Facebook SDK for iOS. +*/ ++ (void)setLegacyUserDefaultTokenInformationKeyName:(NSString *)tokenInformationKeyName; + +/*! + @abstract Get the user defaults key used by legacy token caches. +*/ ++ (NSString *)legacyUserDefaultTokenInformationKeyName; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKTestUsersManager.h b/FBSDKCoreKit.framework/Headers/FBSDKTestUsersManager.h new file mode 100644 index 0000000..7d2e0ac --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKTestUsersManager.h @@ -0,0 +1,102 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +@class FBSDKAccessToken; + +/*! + @typedef + + @abstract Callback block for returning an array of FBSDKAccessToken instances (and possibly `NSNull` instances); or an error. + */ +typedef void (^FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)(NSArray *tokens, NSError *error) ; + +/*! + @typedef + + @abstract Callback block for removing a test user. + */ +typedef void (^FBSDKTestUsersManagerRemoveTestAccountHandler)(NSError *error) ; + + +/*! + @class FBSDKTestUsersManager + @abstract Provides methods for managing test accounts for testing Facebook integration. + + @discussion Facebook allows developers to create test accounts for testing their applications' + Facebook integration (see https://developers.facebook.com/docs/test_users/). This class + simplifies use of these accounts for writing tests. It is not designed for use in + production application code. + + This class will make Graph API calls on behalf of your app to manage test accounts and requires + an app id and app secret. You will typically use this class to write unit or integration tests. + Make sure you NEVER include your app secret in your production app. + */ +@interface FBSDKTestUsersManager : NSObject + +/*! + @abstract construct or return the shared instance + @param appID the Facebook app id + @param appSecret the Facebook app secret + */ ++ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret; + +/*! + @abstract retrieve FBSDKAccessToken instances for test accounts with the specific permissions. + @param arraysOfPermissions an array of permissions sets, such as @[ [NSSet setWithObject:@"email"], [NSSet setWithObject:@"user_birthday"]] + if you needed two test accounts with email and birthday permissions, respectively. You can pass in empty nested sets + if you need two arbitrary test accounts. For convenience, passing nil is treated as @[ [NSSet set] ] + for fetching a single test user. + @param createIfNotFound if YES, new test accounts are created if no test accounts existed that fit the permissions + requirement + @param handler the callback to invoke which will return an array of `FBAccessTokenData` instances or an `NSError`. + If param `createIfNotFound` is NO, the array may contain `[NSNull null]` instances. + + @discussion If you are requesting test accounts with differing number of permissions, try to order + `arrayOfPermissionsArrays` so that the most number of permissions come first to minimize creation of new + test accounts. + */ +- (void)requestTestAccountTokensWithArraysOfPermissions:(NSArray *)arraysOfPermissions + createIfNotFound:(BOOL)createIfNotFound + completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; + +/*! + @abstract add a test account with the specified permissions + @param permissions the set of permissions, e.g., [NSSet setWithObjects:@"email", @"user_friends"] + @param handler the callback handler + */ +- (void)addTestAccountWithPermissions:(NSSet *)permissions + completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; + +/*! + @abstract remove a test account for the given user id + @param userId the user id + @param handler the callback handler + */ +- (void)removeTestAccount:(NSString *)userId completionHandler:(FBSDKTestUsersManagerRemoveTestAccountHandler)handler; + +/*! + @abstract Make two test users friends with each other. + @param first the token of the first user + @param second the token of the second user + @param callback the callback handler + */ +- (void)makeFriendsWithFirst:(FBSDKAccessToken *)first second:(FBSDKAccessToken *)second callback:(void (^)(NSError *))callback; + +@end diff --git a/FBSDKCoreKit.framework/Headers/FBSDKUtility.h b/FBSDKCoreKit.framework/Headers/FBSDKUtility.h new file mode 100644 index 0000000..46c490b --- /dev/null +++ b/FBSDKCoreKit.framework/Headers/FBSDKUtility.h @@ -0,0 +1,55 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @abstract Class to contain common utility methods. + */ +@interface FBSDKUtility : NSObject + +/*! + @abstract Parses a query string into a dictionary. + @param queryString The query string value. + @return A dictionary with the key/value pairs. + */ ++ (NSDictionary *)dictionaryWithQueryString:(NSString *)queryString; + +/*! + @abstract Constructs a query string from a dictionary. + @param dictionary The dictionary with key/value pairs for the query string. + @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. + @result Query string representation of the parameters. + */ ++ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary error:(NSError *__autoreleasing *)errorRef; + +/*! + @abstract Decodes a value from an URL. + @param value The value to decode. + @result The decoded value. + */ ++ (NSString *)URLDecode:(NSString *)value; + +/*! + @abstract Encodes a value for an URL. + @param value The value to encode. + @result The encoded value. + */ ++ (NSString *)URLEncode:(NSString *)value; + +@end diff --git a/FBSDKCoreKit.framework/Info.plist b/FBSDKCoreKit.framework/Info.plist new file mode 100644 index 0000000..b6dda8e Binary files /dev/null and b/FBSDKCoreKit.framework/Info.plist differ diff --git a/FBSDKCoreKit.framework/Modules/module.modulemap b/FBSDKCoreKit.framework/Modules/module.modulemap new file mode 100644 index 0000000..3c3e6e6 --- /dev/null +++ b/FBSDKCoreKit.framework/Modules/module.modulemap @@ -0,0 +1,31 @@ +framework module FBSDKCoreKit { + umbrella header "FBSDKCoreKit.h" + + export * + module * { export * } + + explicit module FBSDKButton { + header "FBSDKButton.h" + export * + } + + explicit module FBSDKAppLinkResolver { + header "FBSDKAppLinkResolver.h" + export * + } + + explicit module FBSDKGraphErrorRecoveryProcessor { + header "FBSDKGraphErrorRecoveryProcessor.h" + export * + } + + explicit module FBSDKGraphRequestDataAttachment { + header "FBSDKGraphRequestDataAttachment.h" + export * + } + + explicit module FBSDKTestUsersManager { + header "FBSDKTestUsersManager.h" + export * + } +} diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKAccessTokenCacheV4.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKAccessTokenCacheV4.h new file mode 100644 index 0000000..7fa7d7f --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKAccessTokenCacheV4.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import "FBSDKAccessToken.h" +#import "FBSDKAccessTokenCaching.h" + +@interface FBSDKAccessTokenCacheV4 : NSObject + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPICrypto.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPICrypto.h new file mode 100644 index 0000000..7d488e7 --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPICrypto.h @@ -0,0 +1,31 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import "FBSDKBridgeAPIRequest.h" + +@interface FBSDKBridgeAPICrypto : NSObject + ++ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters; ++ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request + queryParameters:(NSDictionary *)queryParameters + error:(NSError *__autoreleasing *)errorRef; ++ (void)reset; + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocol.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocol.h new file mode 100644 index 0000000..679577c --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocol.h @@ -0,0 +1,44 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +#import "FBSDKBridgeAPIProtocolType.h" + +@class FBSDKBridgeAPIRequest; + +FBSDK_EXTERN NSString *const FBSDKBridgeAPIAppIDKey; +FBSDK_EXTERN NSString *const FBSDKBridgeAPISchemeSuffixKey; +FBSDK_EXTERN NSString *const FBSDKBridgeAPIVersionKey; + +@protocol FBSDKBridgeAPIProtocol + +- (NSURL *)requestURLWithActionID:(NSString *)actionID + scheme:(NSString *)scheme + methodName:(NSString *)methodName + methodVersion:(NSString *)methodVersion + parameters:(NSDictionary *)parameters + error:(NSError *__autoreleasing *)errorRef; +- (NSDictionary *)responseParametersForActionID:(NSString *)actionID + queryParameters:(NSDictionary *)queryParameters + cancelled:(BOOL *)cancelledRef + error:(NSError *__autoreleasing *)errorRef; + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolNativeV1.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolNativeV1.h new file mode 100644 index 0000000..8fd34bd --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolNativeV1.h @@ -0,0 +1,70 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +#import "FBSDKBridgeAPIProtocol.h" + +typedef struct +{ + __unsafe_unretained NSString *bridgeArgs; + __unsafe_unretained NSString *methodArgs; + __unsafe_unretained NSString *methodVersion; +} FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys; + +typedef struct +{ + __unsafe_unretained NSString *actionID; + __unsafe_unretained NSString *appIcon; + __unsafe_unretained NSString *appName; + __unsafe_unretained NSString *sdkVersion; +} FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys; + +typedef struct +{ + __unsafe_unretained NSString *bridgeArgs; + __unsafe_unretained NSString *methodResults; +} FBSDKBridgeAPIProtocolNativeV1InputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys; + +typedef struct +{ + __unsafe_unretained NSString *actionID; + __unsafe_unretained NSString *error; +} FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct; +FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys; + +@interface FBSDKBridgeAPIProtocolNativeV1 : NSObject + +- (instancetype)initWithAppScheme:(NSString *)appScheme; +- (instancetype)initWithAppScheme:(NSString *)appScheme + pasteboard:(UIPasteboard *)pasteboard + dataLengthThreshold:(NSUInteger)dataLengthThreshold + includeAppIcon:(BOOL)includeAppIcon +NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, copy, readonly) NSString *appScheme; +@property (nonatomic, assign, readonly) NSUInteger dataLengthThreshold; +@property (nonatomic, assign, readonly) BOOL includeAppIcon; +@property (nonatomic, strong, readonly) UIPasteboard *pasteboard; + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolWebV1.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolWebV1.h new file mode 100644 index 0000000..c7b28f4 --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolWebV1.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import "FBSDKBridgeAPIProtocol.h" + +@interface FBSDKBridgeAPIProtocolWebV1 : NSObject + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKError.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKError.h new file mode 100644 index 0000000..f37bd86 --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKError.h @@ -0,0 +1,56 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +@interface FBSDKError : NSObject + ++ (NSString *)errorDomain; + ++ (BOOL)errorIsNetworkError:(NSError *)error; + ++ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message; ++ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError; ++ (NSError *)errorWithCode:(NSInteger)code + userInfo:(NSDictionary *)userInfo + message:(NSString *)message + underlyingError:(NSError *)underlyingError; + ++ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message; ++ (NSError *)invalidArgumentErrorWithName:(NSString *)name + value:(id)value + message:(NSString *)message + underlyingError:(NSError *)underlyingError; ++ (NSError *)invalidCollectionErrorWithName:(NSString *)name + collection:(id)collection + item:(id)item + message:(NSString *)message; ++ (NSError *)invalidCollectionErrorWithName:(NSString *)name + collection:(id)collection + item:(id)item + message:(NSString *)message + underlyingError:(NSError *)underlyingError; + ++ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message; ++ (NSError *)requiredArgumentErrorWithName:(NSString *)name + message:(NSString *)message + underlyingError:(NSError *)underlyingError; + ++ (NSError *)unknownErrorWithMessage:(NSString *)message; + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestBody.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestBody.h new file mode 100644 index 0000000..b61c782 --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestBody.h @@ -0,0 +1,47 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import +#import + +@class FBSDKGraphRequestDataAttachment; +@class FBSDKLogger; + +@interface FBSDKGraphRequestBody : NSObject + +@property (nonatomic, retain, readonly) NSData *data; + +- (void)appendWithKey:(NSString *)key + formValue:(NSString *)value + logger:(FBSDKLogger *)logger; + +- (void)appendWithKey:(NSString *)key + imageValue:(UIImage *)image + logger:(FBSDKLogger *)logger; + +- (void)appendWithKey:(NSString *)key + dataValue:(NSData *)data + logger:(FBSDKLogger *)logger; + +- (void)appendWithKey:(NSString *)key + dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)dataAttachment + logger:(FBSDKLogger *)logger; + ++ (NSString *)mimeContentType; + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestMetadata.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestMetadata.h new file mode 100644 index 0000000..cd218c4 --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestMetadata.h @@ -0,0 +1,40 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +// Internal only class to facilitate FBSDKGraphRequest processing, specifically +// associating FBSDKGraphRequest and FBSDKGraphRequestHandler instances and necessary +// data for retry processing. +@interface FBSDKGraphRequestMetadata : NSObject + +@property (nonatomic, retain) FBSDKGraphRequest *request; +@property (nonatomic, copy) FBSDKGraphRequestHandler completionHandler; +@property (nonatomic, copy) NSDictionary *batchParameters; + +- (instancetype)initWithRequest:(FBSDKGraphRequest *)request + completionHandler:(FBSDKGraphRequestHandler)handler + batchParameters:(NSDictionary *)batchParameters +NS_DESIGNATED_INITIALIZER; + +- (void)invokeCompletionHandlerForConnection:(FBSDKGraphRequestConnection *)connection + withResults:(id)results + error:(NSError *)error; +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKURLConnection.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKURLConnection.h new file mode 100644 index 0000000..cbe80a0 --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKURLConnection.h @@ -0,0 +1,51 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +@class FBSDKURLConnection; + +typedef void (^FBSDKURLConnectionHandler)(FBSDKURLConnection *connection, + NSError *error, + NSURLResponse *response, + NSData *responseData); + +@protocol FBSDKURLConnectionDelegate + +@optional + +- (void)facebookURLConnection:(FBSDKURLConnection *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten + totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; + +@end + +@interface FBSDKURLConnection : NSObject + +- (FBSDKURLConnection *)initWithRequest:(NSURLRequest *)request + completionHandler:(FBSDKURLConnectionHandler)handler +NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, assign) id delegate; + +- (void)cancel; +- (void)start; +- (void)setDelegateQueue:(NSOperationQueue *)queue; + +@end diff --git a/FBSDKCoreKit.framework/PrivateHeaders/FBSDKWebDialogView.h b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKWebDialogView.h new file mode 100644 index 0000000..9ad7427 --- /dev/null +++ b/FBSDKCoreKit.framework/PrivateHeaders/FBSDKWebDialogView.h @@ -0,0 +1,39 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +@protocol FBSDKWebDialogViewDelegate; + +@interface FBSDKWebDialogView : UIView + +@property (nonatomic, assign) id delegate; + +- (void)loadURL:(NSURL *)URL; +- (void)stopLoading; + +@end + +@protocol FBSDKWebDialogViewDelegate + +- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didCompleteWithResults:(NSDictionary *)results; +- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didFailWithError:(NSError *)error; +- (void)webDialogViewDidCancel:(FBSDKWebDialogView *)webDialogView; +- (void)webDialogViewDidFinishLoad:(FBSDKWebDialogView *)webDialogView; + +@end diff --git a/FBSDKLoginKit.framework/FBSDKLoginKit b/FBSDKLoginKit.framework/FBSDKLoginKit new file mode 100644 index 0000000..d6b45c5 Binary files /dev/null and b/FBSDKLoginKit.framework/FBSDKLoginKit differ diff --git a/FBSDKLoginKit.framework/Headers/FBSDKLoginButton.h b/FBSDKLoginKit.framework/Headers/FBSDKLoginButton.h new file mode 100644 index 0000000..51499d4 --- /dev/null +++ b/FBSDKLoginKit.framework/Headers/FBSDKLoginButton.h @@ -0,0 +1,128 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +#import + +#import "FBSDKTooltipView.h" + +@protocol FBSDKLoginButtonDelegate; + +/*! + @typedef NS_ENUM(NSUInteger, FBSDKLoginButtonTooltipBehavior) + @abstract Indicates the desired login tooltip behavior. + */ +typedef NS_ENUM(NSUInteger, FBSDKLoginButtonTooltipBehavior) +{ + /*! The default behavior. The tooltip will only be displayed if + the app is eligible (determined by possible server round trip) */ + FBSDKLoginButtonTooltipBehaviorAutomatic = 0, + /*! Force display of the tooltip (typically for UI testing) */ + FBSDKLoginButtonTooltipBehaviorForceDisplay = 1, + /*! Force disable. In this case you can still exert more refined + control by manually constructing a `FBSDKLoginTooltipView` instance. */ + FBSDKLoginButtonTooltipBehaviorDisable = 2 +}; + +/*! + @abstract A button that initiates a log in or log out flow upon tapping. + @discussion `FBSDKLoginButton` works with `[FBSDKAccessToken currentAccessToken]` to + determine what to display, and automatically starts authentication when tapped (i.e., + you do not need to manually subscribe action targets). + + Like `FBSDKLoginManager`, you should make sure your app delegate is connected to + `FBSDKApplicationDelegate` in order for the button's delegate to receive messages. + + `FBSDKLoginButton` has a fixed height, but you may change the width. `initWithFrame:CGRectZero` + will size the button to its minimum frame. +*/ +@interface FBSDKLoginButton : FBSDKButton + +/*! + @abstract The default audience to use, if publish permissions are requested at login time. + */ +@property (assign, nonatomic) FBSDKDefaultAudience defaultAudience; +/*! + @abstract Gets or sets the delegate. + */ +@property (weak, nonatomic) IBOutlet id delegate; +/*! + @abstract Gets or sets the login behavior to use + */ +@property (assign, nonatomic) FBSDKLoginBehavior loginBehavior; +/*! + @abstract The publish permissions to request. + + @discussion Use `defaultAudience` to specify the default audience to publish to. + Note this is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + */ +@property (copy, nonatomic) NSArray *publishPermissions; +/*! + @abstract The read permissions to request. + + @discussion Note, that if read permissions are specified, then publish permissions should not be specified. This is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + */ +@property (copy, nonatomic) NSArray *readPermissions; +/*! + @abstract Gets or sets the desired tooltip behavior. + */ +@property (assign, nonatomic) FBSDKLoginButtonTooltipBehavior tooltipBehavior; +/*! + @abstract Gets or sets the desired tooltip color style. + */ +@property (assign, nonatomic) FBSDKTooltipColorStyle tooltipColorStyle; + +@end + +/*! + @protocol + @abstract A delegate for `FBSDKLoginButton` + */ +@protocol FBSDKLoginButtonDelegate + +@required +/*! + @abstract Sent to the delegate when the button was used to login. + @param loginButton the sender + @param result The results of the login + @param error The error (if any) from the login + */ +- (void) loginButton:(FBSDKLoginButton *)loginButton +didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result + error:(NSError *)error; + +/*! + @abstract Sent to the delegate when the button was used to logout. + @param loginButton The button that was clicked. +*/ +- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton; + +@optional +/*! + @abstract Sent to the delegate when the button is about to login. + @param loginButton the sender + @return YES if the login should be allowed to proceed, NO otherwise + */ +- (BOOL) loginButtonWillLogin:(FBSDKLoginButton *)loginButton; + +@end diff --git a/FBSDKLoginKit.framework/Headers/FBSDKLoginConstants.h b/FBSDKLoginKit.framework/Headers/FBSDKLoginConstants.h new file mode 100644 index 0000000..100c09a --- /dev/null +++ b/FBSDKLoginKit.framework/Headers/FBSDKLoginConstants.h @@ -0,0 +1,75 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +/*! + @abstract The error domain for all errors from FBSDKLoginKit + @discussion Error codes from the SDK in the range 300-399 are reserved for this domain. + */ +FBSDK_EXTERN NSString *const FBSDKLoginErrorDomain; + +/*! + @typedef NS_ENUM(NSInteger, FBSDKLoginErrorCode) + @abstract Error codes for FBSDKLoginErrorDomain. + */ +typedef NS_ENUM(NSInteger, FBSDKLoginErrorCode) +{ + /*! + @abstract Reserved. + */ + FBSDKLoginReservedErrorCode = 300, + /*! + @abstract The error code for unknown errors. + */ + FBSDKLoginUnknownErrorCode, + + /*! + @abstract The user's password has changed and must log in again + */ + FBSDKLoginPasswordChangedErrorCode, + /*! + @abstract The user must log in to their account on www.facebook.com to restore access + */ + FBSDKLoginUserCheckpointedErrorCode, + /*! + @abstract Indicates a failure to request new permissions because the user has changed. + */ + FBSDKLoginUserMismatchErrorCode, + /*! + @abstract The user must confirm their account with Facebook before logging in + */ + FBSDKLoginUnconfirmedUserErrorCode, + + /*! + @abstract The Accounts framework failed without returning an error, indicating the + app's slider in the iOS Facebook Settings (device Settings -> Facebook -> App Name) has + been disabled. + */ + FBSDKLoginSystemAccountAppDisabledErrorCode, + /*! + @abstract An error occurred related to Facebook system Account store + */ + FBSDKLoginSystemAccountUnavailableErrorCode, + /*! + @abstract The login response was missing a valid challenge string. + */ + FBSDKLoginBadChallengeString, +}; diff --git a/FBSDKLoginKit.framework/Headers/FBSDKLoginKit.h b/FBSDKLoginKit.framework/Headers/FBSDKLoginKit.h new file mode 100644 index 0000000..4723940 --- /dev/null +++ b/FBSDKLoginKit.framework/Headers/FBSDKLoginKit.h @@ -0,0 +1,25 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import +#import +#import +#import +#import diff --git a/FBSDKLoginKit.framework/Headers/FBSDKLoginManager.h b/FBSDKLoginKit.framework/Headers/FBSDKLoginManager.h new file mode 100644 index 0000000..ee35bd8 --- /dev/null +++ b/FBSDKLoginKit.framework/Headers/FBSDKLoginManager.h @@ -0,0 +1,202 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import +#import +#import + +@class FBSDKLoginManagerLoginResult; + +/*! + @abstract Describes the call back to the FBSDKLoginManager + @param result the result of the authorization + @param error the authorization error, if any. + */ +typedef void (^FBSDKLoginManagerRequestTokenHandler)(FBSDKLoginManagerLoginResult *result, NSError *error); + + +/*! + @typedef FBSDKDefaultAudience enum + + @abstract + Passed to open to indicate which default audience to use for sessions that post data to Facebook. + + @discussion + Certain operations such as publishing a status or publishing a photo require an audience. When the user + grants an application permission to perform a publish operation, a default audience is selected as the + publication ceiling for the application. This enumerated value allows the application to select which + audience to ask the user to grant publish permission for. + */ +typedef NS_ENUM(NSUInteger, FBSDKDefaultAudience) +{ + /*! Indicates that the user's friends are able to see posts made by the application */ + FBSDKDefaultAudienceFriends = 0, + /*! Indicates that only the user is able to see posts made by the application */ + FBSDKDefaultAudienceOnlyMe, + /*! Indicates that all Facebook users are able to see posts made by the application */ + FBSDKDefaultAudienceEveryone, +}; + +/*! + @typedef FBSDKLoginBehavior enum + + @abstract + Passed to the \c FBSDKLoginManager to indicate how Facebook Login should be attempted. + + @discussion + Facebook Login authorizes the application to act on behalf of the user, using the user's + Facebook account. Usually a Facebook Login will rely on an account maintained outside of + the application, by the native Facebook application, the browser, or perhaps the device + itself. This avoids the need for a user to enter their username and password directly, and + provides the most secure and lowest friction way for a user to authorize the application to + interact with Facebook. + + The \c FBSDKLoginBehavior enum specifies which log-in methods may be used. The SDK + will determine the best behavior based on the current device (such as iOS version). + */ +typedef NS_ENUM(NSUInteger, FBSDKLoginBehavior) +{ + /*! + @abstract This is the default behavior, and indicates logging in through the native + Facebook app may be used. The SDK may still use Safari instead. + */ + FBSDKLoginBehaviorNative = 0, + /*! + @abstract Attempts log in through the Safari or SFSafariViewController, if available. + */ + FBSDKLoginBehaviorBrowser, + /*! + @abstract Attempts log in through the Facebook account currently signed in through + the device Settings. + @note If the account is not available to the app (either not configured by user or + as determined by the SDK) this behavior falls back to \c FBSDKLoginBehaviorNative. + */ + FBSDKLoginBehaviorSystemAccount, + /*! + @abstract Attemps log in through a modal \c UIWebView pop up + + @note This behavior is only available to certain types of apps. Please check the Facebook + Platform Policy to verify your app meets the restrictions. + */ + FBSDKLoginBehaviorWeb, +}; + +/*! + @abstract `FBSDKLoginManager` provides methods for logging the user in and out. + @discussion `FBSDKLoginManager` works directly with `[FBSDKAccessToken currentAccessToken]` and + sets the "currentAccessToken" upon successful authorizations (or sets `nil` in case of `logOut`). + + You should check `[FBSDKAccessToken currentAccessToken]` before calling logIn* to see if there is + a cached token available (typically in your viewDidLoad). + + If you are managing your own token instances outside of "currentAccessToken", you will need to set + "currentAccessToken" before calling logIn* to authorize futher permissions on your tokens. + */ +@interface FBSDKLoginManager : NSObject + +/*! + @abstract the default audience. + @discussion you should set this if you intend to ask for publish permissions. + */ +@property (assign, nonatomic) FBSDKDefaultAudience defaultAudience; + +/*! + @abstract the login behavior + */ +@property (assign, nonatomic) FBSDKLoginBehavior loginBehavior; + +/*! + @deprecated use logInWithReadPermissions:fromViewController:handler: instead + */ +- (void)logInWithReadPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler +__attribute__ ((deprecated("use logInWithReadPermissions:fromViewController:handler: instead"))); + +/*! + @deprecated use logInWithPublishPermissions:fromViewController:handler: instead + */ +- (void)logInWithPublishPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler +__attribute__ ((deprecated("use logInWithPublishPermissions:fromViewController:handler: instead"))); + +/*! + @abstract Logs the user in or authorizes additional permissions. + @param permissions the optional array of permissions. Note this is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + @param fromViewController the view controller to present from. If nil, the topmost view controller will be + automatically determined as best as possible. + @param handler the callback. + @discussion Use this method when asking for read permissions. You should only ask for permissions when they + are needed and explain the value to the user. You can inspect the result.declinedPermissions to also + provide more information to the user if they decline permissions. + + If `[FBSDKAccessToken currentAccessToken]` is not nil, it will be treated as a reauthorization for that user + and will pass the "rerequest" flag to the login dialog. + + This method will present UI the user. You typically should check if `[FBSDKAccessToken currentAccessToken]` + already contains the permissions you need before asking to reduce unnecessary app switching. For example, + you could make that check at viewDidLoad. + */ +- (void)logInWithReadPermissions:(NSArray *)permissions + fromViewController:(UIViewController *)fromViewController + handler:(FBSDKLoginManagerRequestTokenHandler)handler; + +/*! + @abstract Logs the user in or authorizes additional permissions. + @param permissions the optional array of permissions. Note this is converted to NSSet and is only + an NSArray for the convenience of literal syntax. + @param fromViewController the view controller to present from. If nil, the topmost view controller will be + automatically determined as best as possible. + @param handler the callback. + @discussion Use this method when asking for publish permissions. You should only ask for permissions when they + are needed and explain the value to the user. You can inspect the result.declinedPermissions to also + provide more information to the user if they decline permissions. + + If `[FBSDKAccessToken currentAccessToken]` is not nil, it will be treated as a reauthorization for that user + and will pass the "rerequest" flag to the login dialog. + + This method will present UI the user. You typically should check if `[FBSDKAccessToken currentAccessToken]` + already contains the permissions you need before asking to reduce unnecessary app switching. For example, + you could make that check at viewDidLoad. + */ +- (void)logInWithPublishPermissions:(NSArray *)permissions + fromViewController:(UIViewController *)fromViewController + handler:(FBSDKLoginManagerRequestTokenHandler)handler; + +/*! + @abstract Logs the user out + @discussion This calls [FBSDKAccessToken setCurrentAccessToken:nil] and [FBSDKProfile setCurrentProfile:nil]. + */ +- (void)logOut; + +/*! + @method + + @abstract Issues an asychronous renewCredentialsForAccount call to the device's Facebook account store. + + @param handler The completion handler to call when the renewal is completed. This can be invoked on an arbitrary thread. + + @discussion This can be used to explicitly renew account credentials and is provided as a convenience wrapper around + `[ACAccountStore renewCredentialsForAccount:completion]`. Note the method will not issue the renewal call if the the + Facebook account has not been set on the device, or if access had not been granted to the account (though the handler + wil receive an error). + + If the `[FBSDKAccessToken currentAccessToken]` was from the account store, a succesful renewal will also set + a new "currentAccessToken". + */ ++ (void)renewSystemCredentials:(void (^)(ACAccountCredentialRenewResult result, NSError *error))handler; + +@end diff --git a/FBSDKLoginKit.framework/Headers/FBSDKLoginManagerLoginResult.h b/FBSDKLoginKit.framework/Headers/FBSDKLoginManagerLoginResult.h new file mode 100644 index 0000000..36a1af6 --- /dev/null +++ b/FBSDKLoginKit.framework/Headers/FBSDKLoginManagerLoginResult.h @@ -0,0 +1,62 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +@class FBSDKAccessToken; + +/*! + @abstract Describes the result of a login attempt. + */ +@interface FBSDKLoginManagerLoginResult : NSObject + +/*! + @abstract the access token. + */ +@property (copy, nonatomic) FBSDKAccessToken *token; + +/*! + @abstract whether the login was cancelled by the user. + */ +@property (readonly, nonatomic) BOOL isCancelled; + +/*! + @abstract the set of permissions granted by the user in the associated request. + @discussion inspect the token's permissions set for a complete list. + */ +@property (copy, nonatomic) NSSet *grantedPermissions; + +/*! + @abstract the set of permissions declined by the user in the associated request. + @discussion inspect the token's permissions set for a complete list. + */ +@property (copy, nonatomic) NSSet *declinedPermissions; + +/*! + @abstract Initializes a new instance. + @param token the access token + @param isCancelled whether the login was cancelled by the user + @param grantedPermissions the set of granted permissions + @param declinedPermissions the set of declined permissions + */ +- (instancetype)initWithToken:(FBSDKAccessToken *)token + isCancelled:(BOOL)isCancelled + grantedPermissions:(NSSet *)grantedPermissions + declinedPermissions:(NSSet *)declinedPermissions +NS_DESIGNATED_INITIALIZER; +@end diff --git a/FBSDKLoginKit.framework/Headers/FBSDKLoginTooltipView.h b/FBSDKLoginKit.framework/Headers/FBSDKLoginTooltipView.h new file mode 100644 index 0000000..e6a9411 --- /dev/null +++ b/FBSDKLoginKit.framework/Headers/FBSDKLoginTooltipView.h @@ -0,0 +1,93 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#import + +#import + +@protocol FBSDKLoginTooltipViewDelegate; + +/*! + @class FBSDKLoginTooltipView + + @abstract Represents a tooltip to be displayed next to a Facebook login button + to highlight features for new users. + + @discussion The `FBSDKLoginButton` may display this view automatically. If you do + not use the `FBSDKLoginButton`, you can manually call one of the `present*` methods + as appropriate and customize behavior via `FBSDKLoginTooltipViewDelegate` delegate. + + By default, the `FBSDKLoginTooltipView` is not added to the superview until it is + determined the app has migrated to the new login experience. You can override this + (e.g., to test the UI layout) by implementing the delegate or setting `forceDisplay` to YES. + + */ +@interface FBSDKLoginTooltipView : FBSDKTooltipView + +/*! @abstract the delegate */ +@property (nonatomic, assign) id delegate; + +/*! @abstract if set to YES, the view will always be displayed and the delegate's + `loginTooltipView:shouldAppear:` will NOT be called. */ +@property (nonatomic, assign) BOOL forceDisplay; + +@end + +/*! + @protocol + + @abstract + The `FBSDKLoginTooltipViewDelegate` protocol defines the methods used to receive event + notifications from `FBSDKLoginTooltipView` objects. + */ +@protocol FBSDKLoginTooltipViewDelegate + +@optional + +/*! + @abstract + Asks the delegate if the tooltip view should appear + + @param view The tooltip view. + @param appIsEligible The value fetched from the server identifying if the app + is eligible for the new login experience. + + @discussion Use this method to customize display behavior. + */ +- (BOOL)loginTooltipView:(FBSDKLoginTooltipView *)view shouldAppear:(BOOL)appIsEligible; + +/*! + @abstract + Tells the delegate the tooltip view will appear, specifically after it's been + added to the super view but before the fade in animation. + + @param view The tooltip view. + */ +- (void)loginTooltipViewWillAppear:(FBSDKLoginTooltipView *)view; + +/*! + @abstract + Tells the delegate the tooltip view will not appear (i.e., was not + added to the super view). + + @param view The tooltip view. + */ +- (void)loginTooltipViewWillNotAppear:(FBSDKLoginTooltipView *)view; + + +@end diff --git a/FBSDKLoginKit.framework/Headers/FBSDKTooltipView.h b/FBSDKLoginKit.framework/Headers/FBSDKTooltipView.h new file mode 100644 index 0000000..aff1067 --- /dev/null +++ b/FBSDKLoginKit.framework/Headers/FBSDKTooltipView.h @@ -0,0 +1,141 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright 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 + +/*! + @typedef FBSDKTooltipViewArrowDirection enum + + @abstract + Passed on construction to determine arrow orientation. + */ +typedef NS_ENUM(NSUInteger, FBSDKTooltipViewArrowDirection) +{ + /*! View is located above given point, arrow is pointing down. */ + FBSDKTooltipViewArrowDirectionDown = 0, + /*! View is located below given point, arrow is pointing up. */ + FBSDKTooltipViewArrowDirectionUp = 1, +}; + +/*! + @typedef FBSDKTooltipColorStyle enum + + @abstract + Passed on construction to determine color styling. + */ +typedef NS_ENUM(NSUInteger, FBSDKTooltipColorStyle) +{ + /*! Light blue background, white text, faded blue close button. */ + FBSDKTooltipColorStyleFriendlyBlue = 0, + /*! Dark gray background, white text, light gray close button. */ + FBSDKTooltipColorStyleNeutralGray = 1, +}; + +/*! + @class FBSDKTooltipView + + @abstract + Tooltip bubble with text in it used to display tips for UI elements, + with a pointed arrow (to refer to the UI element). + + @discussion + The tooltip fades in and will automatically fade out. See `displayDuration`. + */ +@interface FBSDKTooltipView : UIView + +/*! + @abstract Gets or sets the amount of time in seconds the tooltip should be displayed. + + @discussion Set this to zero to make the display permanent until explicitly dismissed. + Defaults to six seconds. + */ +@property (nonatomic, assign) CFTimeInterval displayDuration; + +/*! + @abstract Gets or sets the color style after initialization. + + @discussion Defaults to value passed to -initWithTagline:message:colorStyle:. + */ +@property (nonatomic, assign) FBSDKTooltipColorStyle colorStyle; + +/*! + @abstract Gets or sets the message. + */ +@property (nonatomic, copy) NSString *message; + +/*! + @abstract Gets or sets the optional phrase that comprises the first part of the label (and is highlighted differently). + */ +@property (nonatomic, copy) NSString *tagline; + +/*! + @abstract + Designated initializer. + + @param tagline First part of the label, that will be highlighted with different color. Can be nil. + + @param message Main message to display. + + @param colorStyle Color style to use for tooltip. + + @discussion + If you need to show a tooltip for login, consider using the `FBSDKLoginTooltipView` view. + + @see FBSDKLoginTooltipView + */ +- (instancetype)initWithTagline:(NSString *)tagline message:(NSString *)message colorStyle:(FBSDKTooltipColorStyle)colorStyle; + +/*! + @abstract + Show tooltip at the top or at the bottom of given view. + Tooltip will be added to anchorView.window.rootViewController.view + + @param anchorView view to show at, must be already added to window view hierarchy, in order to decide + where tooltip will be shown. (If there's not enough space at the top of the anchorView in window bounds - + tooltip will be shown at the bottom of it) + + @discussion + Use this method to present the tooltip with automatic positioning or + use -presentInView:withArrowPosition:direction: for manual positioning + If anchorView is nil or has no window - this method does nothing. + */ +- (void)presentFromView:(UIView *)anchorView; + +/*! + @abstract + Adds tooltip to given view, with given position and arrow direction. + + @param view View to be used as superview. + + @param arrowPosition Point in view's cordinates, where arrow will be pointing + + @param arrowDirection whenever arrow should be pointing up (message bubble is below the arrow) or + down (message bubble is above the arrow). + */ +- (void)presentInView:(UIView *)view withArrowPosition:(CGPoint)arrowPosition direction:(FBSDKTooltipViewArrowDirection)arrowDirection; + +/*! + @abstract + Remove tooltip manually. + + @discussion + Calling this method isn't necessary - tooltip will dismiss itself automatically after the `displayDuration`. + */ +- (void)dismiss; + +@end diff --git a/FBSDKLoginKit.framework/Info.plist b/FBSDKLoginKit.framework/Info.plist new file mode 100644 index 0000000..ad88b51 Binary files /dev/null and b/FBSDKLoginKit.framework/Info.plist differ diff --git a/FBSDKLoginKit.framework/Modules/module.modulemap b/FBSDKLoginKit.framework/Modules/module.modulemap new file mode 100644 index 0000000..4b1d57b --- /dev/null +++ b/FBSDKLoginKit.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module FBSDKLoginKit { + umbrella header "FBSDKLoginKit.h" + + export * + module * { export * } +} diff --git a/Fabric.framework/Fabric b/Fabric.framework/Fabric new file mode 100755 index 0000000..da5acd2 Binary files /dev/null and b/Fabric.framework/Fabric differ diff --git a/Fabric.framework/Headers/FABAttributes.h b/Fabric.framework/Headers/FABAttributes.h new file mode 100644 index 0000000..f4e0639 --- /dev/null +++ b/Fabric.framework/Headers/FABAttributes.h @@ -0,0 +1,48 @@ +// +// FABAttributes.h +// Fabric +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#pragma once + +#define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) + +#if __has_feature(nullability) + #define fab_nullable nullable + #define fab_nonnull nonnull + #define fab_null_unspecified null_unspecified + #define fab_null_resettable null_resettable + #define __fab_nullable __nullable + #define __fab_nonnull __nonnull + #define __fab_null_unspecified __null_unspecified +#else + #define fab_nullable + #define fab_nonnull + #define fab_null_unspecified + #define fab_null_resettable + #define __fab_nullable + #define __fab_nonnull + #define __fab_null_unspecified +#endif + +#ifndef NS_ASSUME_NONNULL_BEGIN + #define NS_ASSUME_NONNULL_BEGIN +#endif + +#ifndef NS_ASSUME_NONNULL_END + #define NS_ASSUME_NONNULL_END +#endif + + +/** + * The following macros are defined here to provide + * backwards compatability. If you are still using + * them you should migrate to the new versions that + * are defined above. + */ +#define FAB_NONNULL __fab_nonnull +#define FAB_NULLABLE __fab_nullable +#define FAB_START_NONNULL NS_ASSUME_NONNULL_BEGIN +#define FAB_END_NONNULL NS_ASSUME_NONNULL_END diff --git a/Fabric.framework/Headers/Fabric.h b/Fabric.framework/Headers/Fabric.h new file mode 100644 index 0000000..47a3d05 --- /dev/null +++ b/Fabric.framework/Headers/Fabric.h @@ -0,0 +1,64 @@ +// +// Fabric.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "FABAttributes.h" + +NS_ASSUME_NONNULL_BEGIN + +#if TARGET_OS_IPHONE +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 + #error "Fabric's minimum iOS version is 6.0" +#endif +#else +#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 + #error "Fabric's minimum OS X version is 10.7" +#endif +#endif + +/** + * Fabric Base. Coordinates configuration and starts all provided kits. + */ +@interface Fabric : NSObject + +/** + * Initialize Fabric and all provided kits. Call this method within your App Delegate's `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. + * + * For example, in Objective-C: + * + * `[Fabric with:@[[Crashlytics class], [Twitter class], [Digits class], [MoPub class]]];` + * + * Swift: + * + * `Fabric.with([Crashlytics.self(), Twitter.self(), Digits.self(), MoPub.self()])` + * + * Only the first call to this method is honored. Subsequent calls are no-ops. + * + * @param kitClasses An array of kit Class objects + * + * @return Returns the shared Fabric instance. In most cases this can be ignored. + */ ++ (instancetype)with:(NSArray *)kitClasses; + +/** + * Returns the Fabric singleton object. + */ ++ (instancetype)sharedSDK; + +/** + * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. + */ +@property (nonatomic, assign) BOOL debug; + +/** + * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. + */ +- (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Fabric.framework/Info.plist b/Fabric.framework/Info.plist new file mode 100644 index 0000000..4b07ac2 --- /dev/null +++ b/Fabric.framework/Info.plist @@ -0,0 +1,55 @@ + + + + + BuildMachineOSBuild + 14E46 + CFBundleDevelopmentRegion + en + CFBundleExecutable + Fabric + CFBundleIdentifier + io.fabric.sdk.ios + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Fabric + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.5.5 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 30 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 13A340 + DTPlatformName + iphoneos + DTPlatformVersion + 9.0 + DTSDKBuild + 13A340 + DTSDKName + iphoneos9.0 + DTXcode + 0700 + DTXcodeBuild + 7A220 + MinimumOSVersion + 6.0 + NSHumanReadableCopyright + Copyright © 2015 Twitter. All rights reserved. + UIDeviceFamily + + 1 + 2 + + + diff --git a/Fabric.framework/Modules/module.modulemap b/Fabric.framework/Modules/module.modulemap new file mode 100644 index 0000000..2a31223 --- /dev/null +++ b/Fabric.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module Fabric { + umbrella header "Fabric.h" + + export * + module * { export * } +} \ No newline at end of file diff --git a/Fabric.framework/run b/Fabric.framework/run new file mode 100755 index 0000000..f4c5732 --- /dev/null +++ b/Fabric.framework/run @@ -0,0 +1,28 @@ +#!/bin/sh + +# run +# +# Copyright (c) 2015 Crashlytics. All rights reserved. + +# Figure out where we're being called from +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# Quote path in case of spaces or special chars +DIR="\"${DIR}" + +PATH_SEP="/" +VALIDATE_COMMAND="uploadDSYM\" $@ validate" +UPLOAD_COMMAND="uploadDSYM\" $@" + +# Ensure params are as expected, run in sync mode to validate +eval $DIR$PATH_SEP$VALIDATE_COMMAND +return_code=$? + +if [[ $return_code != 0 ]]; then + exit $return_code +fi + +# Verification passed, upload dSYM in background to prevent Xcode from waiting +# Note: Validation is performed again before upload. +# Output can still be found in Console.app +eval $DIR$PATH_SEP$UPLOAD_COMMAND > /dev/null 2>&1 & diff --git a/Fabric.framework/uploadDSYM b/Fabric.framework/uploadDSYM new file mode 100755 index 0000000..55d78a1 Binary files /dev/null and b/Fabric.framework/uploadDSYM differ diff --git a/FacebookFeedDatasource.swift b/FacebookFeedDatasource.swift new file mode 100644 index 0000000..2bc99d1 --- /dev/null +++ b/FacebookFeedDatasource.swift @@ -0,0 +1,50 @@ +// +// FacebookFeedDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class FacebookFeedDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + var isProfile : Bool + var parent : UITableViewController! + + init(parent: UITableViewController, tableView : UITableView, isProfile: Bool) { + self.parent = parent + self.isProfile = isProfile + self.items = ["a","a", "a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "FacebookHeaderCell", bundle: nil), forCellReuseIdentifier: "FacebookHeader") + self.tableView.registerNib(UINib(nibName: "FacebookStatusCell", bundle: nil), forCellReuseIdentifier: "FacebookStatus") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + + // Configure the cell... + if (isProfile && indexPath.row == 0) { + currentCell = tableView.dequeueReusableCellWithIdentifier("FacebookHeader", forIndexPath: indexPath) + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("FacebookStatus", forIndexPath: indexPath) as! FacebookStatusCellController + cell.parent = self.parent + currentCell = cell + } + + return currentCell + } +} diff --git a/FacebookFeedTableViewController.swift b/FacebookFeedTableViewController.swift new file mode 100644 index 0000000..ed8a460 --- /dev/null +++ b/FacebookFeedTableViewController.swift @@ -0,0 +1,82 @@ +// +// FacebookFeedTableViewController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class FacebookFeedTableViewController: UITableViewController { + + var dataSource : FacebookFeedDatasource! + var isProfile : Bool! + + override func viewDidLoad() { + super.viewDidLoad() + + if (self.restorationIdentifier?.rangeOfString("Feed") != nil) { + self.isProfile = false + } else { + self.isProfile = true + } + + self.dataSource = FacebookFeedDatasource(parent: self, tableView: self.tableView, isProfile: self.isProfile) + self.tableView.dataSource = dataSource + + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + self.tableView.allowsSelection = false; + + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/FacebookHeaderCell.xib b/FacebookHeaderCell.xib new file mode 100644 index 0000000..90d53f7 --- /dev/null +++ b/FacebookHeaderCell.xib @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FacebookHeaderTableViewCell.swift b/FacebookHeaderTableViewCell.swift new file mode 100644 index 0000000..d30ad53 --- /dev/null +++ b/FacebookHeaderTableViewCell.swift @@ -0,0 +1,27 @@ +// +// FacebookHeaderTableViewCell.swift +// comblie +// +// Created by Cal on 10/22/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class FacebookHeaderTableViewCell: UITableViewCell { + + @IBOutlet weak var profileImageBackground: UIView! + @IBOutlet weak var profileImage: UIImageView! + + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + + self.profileImageBackground.layer.cornerRadius = CGFloat(self.profileImageBackground.frame.height/2) + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + + } + + +} diff --git a/FacebookProfileTableViewController.swift b/FacebookProfileTableViewController.swift new file mode 100644 index 0000000..dcba4f1 --- /dev/null +++ b/FacebookProfileTableViewController.swift @@ -0,0 +1,109 @@ +// +// FacebookProfileTableViewController.swift +// comblie +// +// Created by Cal on 10/22/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class FacebookProfileTableViewController: UITableViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Table view data source + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows + return 2 + } + + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + if (indexPath.row == 0) { + let cell = tableView.dequeueReusableCellWithIdentifier("FacebookHeader", forIndexPath: indexPath) + currentCell = cell + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("FacebookBasicPost", forIndexPath: indexPath) + currentCell = cell + } + + // Configure the cell... + + return currentCell + } + + override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 44 + } + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/FacebookStatusCell.xib b/FacebookStatusCell.xib new file mode 100644 index 0000000..26b3bff --- /dev/null +++ b/FacebookStatusCell.xib @@ -0,0 +1,162 @@ + + + + + + + + + HelveticaNeue-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FacebookStatusCellController.swift b/FacebookStatusCellController.swift new file mode 100644 index 0000000..fc8c8ec --- /dev/null +++ b/FacebookStatusCellController.swift @@ -0,0 +1,56 @@ +// +// FacebookStatusCellController.swift +// comblie +// +// Created by Cal on 10/30/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class FacebookStatusCellController: UITableViewCell { + + @IBOutlet weak var postAuthor: UILabel! + @IBOutlet weak var profileImage: UIView! + @IBOutlet weak var lineSeparator: UIView! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + + var parent : UITableViewController! + var VC : CommentsController! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage + .frame.height/2) + self.lineHeight.constant = CGFloat(0.5) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + self.lineSeparator.backgroundColor = UIColor(red: 236/255, green: 236/255, blue: 236/255, alpha: 1) + } + + override func setHighlighted(highlighted: Bool, animated: Bool) { + self.lineSeparator.backgroundColor = UIColor(red: 236/255, green: 236/255, blue: 236/255, alpha: 1) + + self.postAuthor.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "openProfile")) + } + + // MARK: Actions + + func openProfile() { + let profileView = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("PublicProfile") + self.parent.parentViewController!.navigationController?.pushViewController(profileView!, animated: true) + } + + @IBAction func enlarge(sender: UIButton) { + VC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("Comments") as! CommentsController + VC.postHeight = self.contentView.frame.height + self.window?.rootViewController?.presentViewController(VC, animated: true, completion: nil) + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + + } +} diff --git a/FeedHeader.xib b/FeedHeader.xib new file mode 100644 index 0000000..3656a3f --- /dev/null +++ b/FeedHeader.xib @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FeedPageController.swift b/FeedPageController.swift new file mode 100644 index 0000000..2318ae7 --- /dev/null +++ b/FeedPageController.swift @@ -0,0 +1,216 @@ +// +// SocialFeedsViewController.swift +// comblie +// +// Created by Cal on 10/13/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class FeedPageController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { + + //MARK: Properties + + + @IBOutlet weak var feedViewContainer: UIView! + @IBOutlet weak var networkName: UILabel! + @IBOutlet weak var customPageControls: UIStackView! + @IBOutlet weak var headerBackground: UIView! + @IBOutlet weak var grayBarHeight: NSLayoutConstraint! + @IBOutlet weak var navBarContent: UIView! + + var pageViewController : UIPageViewController! + var pages : NSArray! + var pageQuery : String! + var viewControllers : NSArray! + var dotCollection : [UIView]! + var headerColor : UIColor! + var clickedColor : UIColor! + var notClickedColor : UIColor! + var navBar : UINavigationBar! + + // Set up for parameters that can be passed in + init(page : String) + { + self.pageQuery = page + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + self.pageQuery = "" + super.init(coder: aDecoder) + } + + override func viewDidLoad() { + super.viewDidLoad() + self.navBar = self.navigationController?.navigationBar + self.navBar.frame.origin.y = -50 + // Do any additional setup after loading the view, typically from a nib. + + // Instantiate the view page controller and add it to the Main View as a child view + // Prepares the login-type views + //self.navigationController?.navigationBarHidden = false + + self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("SocialPageViewController") as! UIPageViewController + self.pageViewController.delegate = self + self.pageViewController.dataSource = self + let newsfeedVC = createViewController("AllNewsfeed") + let facebookVC = createViewController("FacebookFeed") + let twitterVC = createViewController("TwitterFeed") + let instagramVC = createViewController("InstagramFeed") + let tumblrVC = createViewController("TumblrFeed") + let vineVC = createViewController("VineFeed") + pages = NSArray(objects: newsfeedVC, facebookVC, twitterVC, instagramVC, tumblrVC, vineVC) + viewControllers = NSArray(object: newsfeedVC) + self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil) + self.addChildViewController(self.pageViewController) + self.pageViewController.view.frame = CGRect(x: 0, y: 0, width: self.feedViewContainer.frame.width, height: self.feedViewContainer.frame.height) + self.feedViewContainer.addSubview(self.pageViewController.view) + //self.view.addSubview(self.pageViewController.view) + self.pageViewController.didMoveToParentViewController(self) + dotCollection = customPageControls.subviews + + // Position Page Control + initializeConstraints() + stylePageControls() + changeHeaderColors("Newsfeed", networkIndex: 0) + } + + //MARK: Actions + + @IBAction func compose(sender: UIBarButtonItem) { + let composeVC = self.storyboard?.instantiateViewControllerWithIdentifier("ComposePage") + self.navigationController?.presentViewController(composeVC!, animated: true, completion: nil) + } + + // Creates and returns view controllers by storyboard ID + + func createViewController(identifierID : String) -> UIViewController { + let vc = self.storyboard!.instantiateViewControllerWithIdentifier(identifierID) as UIViewController + return vc + } + + // MARK: Page View Controller Data Source + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == 0 || index == NSNotFound) { + return nil + } + index-- + return pages[index] as! UIViewController + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == pages.count-1 || index == NSNotFound) { + return nil + } + index++ + return pages[index] as! UIViewController + } + + // Triggers after it has landed on a new page after swipe + + func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + + // Set the current page + let fullIdentifier = pageViewController.viewControllers?.last?.restorationIdentifier + let cleanIdentifier = fullIdentifier?.stringByReplacingOccurrencesOfString("Feed", withString: "") + networkName.text = cleanIdentifier + let currentPage = pageViewController.viewControllers?.last + let currentIndex = pages.indexOfObject(currentPage!) + changeHeaderColors((currentPage?.restorationIdentifier)!, networkIndex: currentIndex) + + } + + // MARK : Other + + func initializeConstraints() { + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + + } else if screenHeight == 568 { + print("iPhone5") + + } else { + print("iPhone6") + + } + } + + func changeHeaderColors(networkID: String, networkIndex: Int) { + + switch networkID { + case "FacebookFeed": + self.navBar.barTintColor = UIColor(red: 63/255, green: 88/255, blue: 151/255, alpha: 1) + clickedColor = UIColor(red: 99/255, green: 122/255, blue: 181/255, alpha: 1) + notClickedColor = UIColor(red: 218/255, green: 239/255, blue: 250/255, alpha: 1) + break + case "TwitterFeed": + self.navBar.barTintColor = UIColor(red: 82/255, green: 176/255, blue: 236/255, alpha: 1) + clickedColor = UIColor(red: 118/255, green: 195/255, blue: 247/255, alpha: 1) + notClickedColor = UIColor(red: 238/255, green: 243/255, blue: 249/255, alpha: 1) + break + case "InstagramFeed": + self.navBar.barTintColor = UIColor(red: 49/255, green: 96/255, blue: 132/255, alpha: 1) + clickedColor = UIColor(red: 88/255, green: 129/255, blue: 165/255, alpha: 1) + notClickedColor = UIColor(red: 155/255, green: 179/255, blue: 201/255, alpha: 1) + break + case "TumblrFeed": + self.navBar.barTintColor = UIColor(red: 54/255, green: 70/255, blue: 93/255, alpha: 1) + clickedColor = UIColor(red: 94/255, green: 106/255, blue: 125/255, alpha: 1) + notClickedColor = UIColor(red: 140/255, green: 149/255, blue: 161/255, alpha: 1) + break + case "VineFeed": + self.navBar.barTintColor = UIColor(red: 105/255, green: 214/255, blue: 187/255, alpha: 1) + clickedColor = UIColor(red: 150/255, green: 238/255, blue: 217/255, alpha: 1) + notClickedColor = UIColor(red: 193/255, green: 245/255, blue: 233/255, alpha: 1) + break + default: + self.navBar.barTintColor = UIColor(red: 245/255, green: 245/255, blue: 245/255, alpha: 1.0) + clickedColor = UIColor(red: 49/255, green: 49/255, blue: 49/255, alpha: 1.0) + notClickedColor = UIColor(red: 196/255, green: 196/255, blue: 196/255, alpha: 1.0) + break + } + if (networkID == "Newsfeed") { + self.navigationItem.rightBarButtonItem?.tintColor = UIColor(red: 132/255, green: 45/255, blue: 114/255, alpha: 1) + networkName.textColor = UIColor.blackColor() + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + } else { + self.navigationItem.rightBarButtonItem?.tintColor = UIColor.whiteColor() + networkName.textColor = UIColor.whiteColor() + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent + } + + // Change the colors + + self.headerBackground.backgroundColor = headerColor + + for (index, element) in dotCollection.enumerate() { + if index == networkIndex { + element.backgroundColor = clickedColor + } else { + element.backgroundColor = notClickedColor + } + } + + } + + + func stylePageControls() { + //Sets the height of the gray line below the header + self.grayBarHeight.constant = CGFloat(0.5) + + for dots in dotCollection { + dots.layer.cornerRadius = dots.frame.height/2 + } + + } + +} \ No newline at end of file diff --git a/FeedbackController.swift b/FeedbackController.swift new file mode 100644 index 0000000..c8fb186 --- /dev/null +++ b/FeedbackController.swift @@ -0,0 +1,70 @@ +// +// FeedbackController.swift +// comblie +// +// Created by Cal on 11/4/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class FeedbackController: UIViewController,UITextViewDelegate { + + @IBOutlet weak var reportText: UITextView! + @IBOutlet weak var grayBarHeight: NSLayoutConstraint! + @IBOutlet weak var bottomBarHeight: NSLayoutConstraint! + var placeholderColor : UIColor! + + override func viewDidLoad() { + super.viewDidLoad() + let me = NSUserDefaults.standardUserDefaults() + print(me.boolForKey("facebook")) + // Do any additional setup after loading the view. + self.grayBarHeight.constant = CGFloat(0.5) + self.bottomBarHeight.constant = CGFloat(0.5) + self.placeholderColor = UIColor(red: 187/255, green: 187/255, blue: 190/255, alpha: 1) + self.reportText.textColor = placeholderColor + self.reportText.delegate = self + } + + + //MARK: Action + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + func textViewDidBeginEditing(textView: UITextView) { + if textView.textColor == self.placeholderColor { + textView.text = "" + textView.textColor = UIColor.blackColor() + } + } + + func textViewDidEndEditing(textView: UITextView) { + if textView.text == "" { + textView.text = "What would you like for us to improve?" + textView.textColor = self.placeholderColor + } + } + + func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { + if(text == "\n") { + textView.resignFirstResponder() + return false + } + return true + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/IncomingMessageCell.xib b/IncomingMessageCell.xib new file mode 100644 index 0000000..8c49619 --- /dev/null +++ b/IncomingMessageCell.xib @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IncomingMessageCellController.swift b/IncomingMessageCellController.swift new file mode 100644 index 0000000..6486260 --- /dev/null +++ b/IncomingMessageCellController.swift @@ -0,0 +1,30 @@ +// +// IncomingMessageCellController.swift +// comblie +// +// Created by Cal on 10/25/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class IncomingMessageCellController: UITableViewCell { + + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var messageBackground: UIView! + @IBOutlet weak var message: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + self.messageBackground.layer.cornerRadius = CGFloat(13) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/IncomingMessageTwoCell.xib b/IncomingMessageTwoCell.xib new file mode 100644 index 0000000..8f15b46 --- /dev/null +++ b/IncomingMessageTwoCell.xib @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/InstagramFeedCell.xib b/InstagramFeedCell.xib new file mode 100644 index 0000000..7545ebb --- /dev/null +++ b/InstagramFeedCell.xib @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/InstagramFeedCellController.swift b/InstagramFeedCellController.swift new file mode 100644 index 0000000..ac05c34 --- /dev/null +++ b/InstagramFeedCellController.swift @@ -0,0 +1,110 @@ +// +// InstagramFeedCellController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class InstagramFeedCellController: UITableViewCell { + + @IBOutlet weak var postBackgroundImage: UIImageView! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var lineSeparator: UIView! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + @IBOutlet weak var playButton: UIButton! + @IBOutlet weak var likeCommentBox: UIStackView! + @IBOutlet weak var postTime: UILabel! + + var VC : InstagramModalController! + + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.postBackgroundImage.image = UIImage(named: "sunset") + + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + configureText() + lineHeight.constant = CGFloat(0.5) + self.selectionStyle = UITableViewCellSelectionStyle.None + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + lineSeparator.backgroundColor = UIColor.whiteColor() + // Configure the view for the selected state + } + + override func setHighlighted(highlighted: Bool, animated: Bool) { + lineSeparator.backgroundColor = UIColor.whiteColor() + } + + // MARK: Action + + @IBAction func enlarge(sender: UIButton) { + VC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("InstagramModal") as! InstagramModalController + //For keeping the opacity + VC.providesPresentationContextTransitionStyle = true + VC.definesPresentationContext = true + VC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext + self.window?.rootViewController?.presentViewController(VC, animated: true, completion: setModal) + } + + @IBAction func playVideo(sender: UIButton) { + print("Playing Video") + } + + func setModal() { + VC.thumbnailImage.image = self.postBackgroundImage.image + VC.profileImage.image = self.profileImage.image + VC.postText.text = self.postText.text + VC.statusText.attributedText = self.statusText.attributedText + VC.postHeight = self.contentView.frame.height + //VC.playButton.setBackgroundImage(UIImage(named: "playArrow"), forState: .Normal) + } + + func configureText() { + var user = "@davidbeckham " + var userMutableString = NSMutableAttributedString() + userMutableString = NSMutableAttributedString(string: user, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionOne = "posted a photo on " + var sectionOneMutableString = NSMutableAttributedString() + sectionOneMutableString = NSMutableAttributedString(string: sectionOne, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var author = "David" + var authorMutableString = NSMutableAttributedString() + authorMutableString = NSMutableAttributedString(string: author, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionTwo = "'s post on " + var sectionTwoMutableString = NSMutableAttributedString() + sectionTwoMutableString = NSMutableAttributedString(string: sectionTwo, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var network = "Instagram" + var networkMutableString = NSMutableAttributedString() + networkMutableString = NSMutableAttributedString(string: network, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + + userMutableString.appendAttributedString(sectionOneMutableString) + //userMutableString.appendAttributedString(authorMutableString) + //userMutableString.appendAttributedString(sectionTwoMutableString) + userMutableString.appendAttributedString(networkMutableString) + statusText.attributedText = userMutableString + } + +} diff --git a/InstagramFeedDatasource.swift b/InstagramFeedDatasource.swift new file mode 100644 index 0000000..f62ad93 --- /dev/null +++ b/InstagramFeedDatasource.swift @@ -0,0 +1,45 @@ +// +// InstagramFeedDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class InstagramFeedDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + + init(tableView : UITableView) { + self.items = ["a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "InstagramFeedCell", bundle: nil), forCellReuseIdentifier: "InstagramFeed") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + if (indexPath.row == 1) { + let cell = tableView.dequeueReusableCellWithIdentifier("InstagramFeed", forIndexPath: indexPath) as! InstagramFeedCellController + cell.playButton.alpha = CGFloat(0) + currentCell = cell + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("InstagramFeed", forIndexPath: indexPath) as! InstagramFeedCellController + currentCell = cell + } + // Configure the cell... + + return currentCell + } +} diff --git a/InstagramFeedTableViewController.swift b/InstagramFeedTableViewController.swift new file mode 100644 index 0000000..a4932ac --- /dev/null +++ b/InstagramFeedTableViewController.swift @@ -0,0 +1,107 @@ +// +// InstagramFeedTableViewController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class InstagramFeedTableViewController: UITableViewController { + + var dataSource : InstagramFeedDatasource! + + override func viewDidLoad() { + super.viewDidLoad() + + // READS DATASOURCE HERE + dataSource = InstagramFeedDatasource(tableView: self.tableView) + self.tableView.dataSource = dataSource + + + print(self.tableView.dataSource) + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + self.tableView.registerNib(UINib(nibName: "InstagramFeedCell", bundle: nil), forCellReuseIdentifier: "InstagramFeed") + + } + + // MARK: - Table view data source + + /*override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows + return 2 + }*/ + + + + /*override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + if (indexPath.row == 1) { + let cell = tableView.dequeueReusableCellWithIdentifier("InstagramFeed", forIndexPath: indexPath) as! InstagramFeedCellController + cell.playButton.alpha = CGFloat(0) + currentCell = cell + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("InstagramFeed", forIndexPath: indexPath) as! InstagramFeedCellController + currentCell = cell + } + // Configure the cell... + + return currentCell + }*/ + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/InstagramModalController.swift b/InstagramModalController.swift new file mode 100644 index 0000000..936df67 --- /dev/null +++ b/InstagramModalController.swift @@ -0,0 +1,55 @@ +// +// InstagramModalController.swift +// comblie +// +// Created by Cal on 11/5/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class InstagramModalController: UIViewController { + + //MARK: Properties + @IBOutlet weak var thumbnailImage: UIImageView! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var playButton: UIButton! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + + var postHeight : CGFloat! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + self.lineHeight.constant = CGFloat(0.5) + } + + //MARK: Actions + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + @IBAction func openComments(sender: UIButton) { + let VC = self.storyboard?.instantiateViewControllerWithIdentifier("Comments") as! CommentsController + //This gives it an error of presenting an active controller + //self.addChildViewController(VC) + VC.postHeight = self.postHeight + self.presentViewController(VC, animated: true, completion: nil) + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + } + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/InstagramPhotoCell.swift b/InstagramPhotoCell.swift new file mode 100644 index 0000000..147ba41 --- /dev/null +++ b/InstagramPhotoCell.swift @@ -0,0 +1,16 @@ +// +// InstagramPhotoCell.swift +// comblie +// +// Created by Cal on 10/27/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class InstagramPhotoCell: UICollectionViewCell { + + @IBOutlet weak var photoImage: UIImageView! + + +} diff --git a/MessagePageController.swift b/MessagePageController.swift new file mode 100644 index 0000000..37b7df2 --- /dev/null +++ b/MessagePageController.swift @@ -0,0 +1,147 @@ +// +// SocialFeedsViewController.swift +// comblie +// +// Created by Cal on 10/13/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class MessagePageController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { + + //MARK: Properties + + + @IBOutlet weak var feedViewContainer: UIView! + + @IBOutlet weak var customPageControls: UIStackView! + @IBOutlet weak var networkName: UILabel! + + var pageViewController : UIPageViewController! + var pages : NSArray! + var pageQuery : String! + var viewControllers : NSArray! + var dotCollection : [UIView]! + + // Set up for parameters that can be passed in + init(page : String) + { + self.pageQuery = page + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + self.pageQuery = "" + super.init(coder: aDecoder) + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view, typically from a nib. + + // Instantiate the view page controller and add it to the Main View as a child view + // Prepares the login-type views + self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("MessagePageViewController") as! UIPageViewController + self.pageViewController.delegate = self + self.pageViewController.dataSource = self + let allVC = createViewController("ConversationTableView") + let facebookVC = createViewController("ConversationTableView") + let twitterVC = createViewController("ConversationTableView") + let instagramVC = createViewController("ConversationTableView") + let tumblrVC = createViewController("ConversationTableView") + let vineVC = createViewController("ConversationTableView") + pages = NSArray(objects: allVC, facebookVC, twitterVC, instagramVC, tumblrVC, vineVC) + viewControllers = NSArray(object: allVC) + self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil) + self.addChildViewController(self.pageViewController) + self.pageViewController.view.frame = CGRect(x: 0, y: 0, width: self.feedViewContainer.frame.width, height: self.feedViewContainer.frame.height) + self.feedViewContainer.addSubview(self.pageViewController.view) + //self.view.addSubview(self.pageViewController.view) + self.pageViewController.didMoveToParentViewController(self) + dotCollection = customPageControls.subviews + // Position Page Control + initializeConstraints() + stylePageControls() + } + + //MARK: Actions + + + // Creates and returns view controllers by storyboard ID + + func createViewController(identifierID : String) -> UIViewController { + let vc = self.storyboard!.instantiateViewControllerWithIdentifier(identifierID) as UIViewController + return vc + } + + // MARK: Page View Controller Data Source + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == 0 || index == NSNotFound) { + return nil + } + index-- + return pages[index] as! UIViewController + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == pages.count-1 || index == NSNotFound) { + return nil + } + index++ + return pages[index] as! UIViewController + + } + + // Triggers after it has landed on a new page after swipe + + func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + + // Set the current page + networkName.text = pageViewController.viewControllers?.last?.restorationIdentifier + + let currentIndex = pages.indexOfObject((pageViewController.viewControllers?.last)!) + for (index, element) in dotCollection.enumerate() { + if index == currentIndex { + element.alpha = CGFloat(1.0) + } else { + element.alpha = CGFloat(0.25) + } + } + + } + + // MARK : Other + + func initializeConstraints() { + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + + } else if screenHeight == 568 { + print("iPhone5") + + } else { + print("iPhone6") + + } + } + + func stylePageControls() { + for dots in dotCollection { + dots.layer.cornerRadius = dots.frame.height/2 + dots.alpha = CGFloat(0.25) + } + + var currentIndex = pages.indexOfObject(viewControllers[0]) + dotCollection[currentIndex].alpha = CGFloat(1.0) + } + +} \ No newline at end of file diff --git a/MessageRoomDatasource.swift b/MessageRoomDatasource.swift new file mode 100644 index 0000000..915e8a5 --- /dev/null +++ b/MessageRoomDatasource.swift @@ -0,0 +1,72 @@ +// +// MessageRoomDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class MessageRoomDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + + init(tableView : UITableView) { + self.items = ["a","a","a","a","a","a","a","a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "IncomingMessageCell", bundle: nil), forCellReuseIdentifier: "IncomingMessage") + self.tableView.registerNib(UINib(nibName: "IncomingMessageTwoCell", bundle: nil), forCellReuseIdentifier: "IncomingMessageTwo") + self.tableView.registerNib(UINib(nibName: "OutgoingMessageCell", bundle: nil), forCellReuseIdentifier: "OutgoingMessage") + self.tableView.registerNib(UINib(nibName: "TimeMessageCell", bundle: nil), forCellReuseIdentifier: "TimeMessage") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + // Configure the cell... + if(indexPath.row==0){ + // Create first cell + let cell = tableView.dequeueReusableCellWithIdentifier("TimeMessage", forIndexPath: indexPath) as! TimeMessageCellController + cell.timeLabel.text = "YESTERDAY 5:02 PM" + currentCell = cell + } else if(indexPath.row==1){ + // Create second cell + let cell = tableView.dequeueReusableCellWithIdentifier("IncomingMessage", forIndexPath: indexPath) as! IncomingMessageCellController + cell.message.text = "Hey, how's it going?" + currentCell = cell + + } else if(indexPath.row==2){ + // Create second cell + let cell = tableView.dequeueReusableCellWithIdentifier("TimeMessage", forIndexPath: indexPath) as! TimeMessageCellController + cell.timeLabel.text = "TODAY 12:38 PM" + currentCell = cell + }else if(indexPath.row==6){ + // Create second cell + let cell = tableView.dequeueReusableCellWithIdentifier("TimeMessage", forIndexPath: indexPath) as! TimeMessageCellController + cell.timeLabel.text = "3:30 PM" + currentCell = cell + }else if(indexPath.row==7){ + // Create second cell + let cell = tableView.dequeueReusableCellWithIdentifier("IncomingMessage", forIndexPath: indexPath) as! IncomingMessageCellController + cell.message.text = "Sounds good, I'll see you later then." + currentCell = cell + } else{ + // Create all others + let cell = tableView.dequeueReusableCellWithIdentifier("OutgoingMessage", forIndexPath: indexPath) as! OutgoingMessageCellController + cell.message.text = "This is just sample text used as a filler to show what the message box looks like." + currentCell = cell + } + // Configure the cell... + return currentCell + } +} diff --git a/NetworkSettingsController.swift b/NetworkSettingsController.swift new file mode 100644 index 0000000..3e7cbf1 --- /dev/null +++ b/NetworkSettingsController.swift @@ -0,0 +1,152 @@ +// +// NetworkSettingsController.swift +// comblie +// +// Created by Cal on 11/10/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class NetworkSettingsController: UIViewController { + + @IBOutlet weak var stackView: UIStackView! + @IBOutlet weak var grayBarHeight: NSLayoutConstraint! + + var facebook : Bool! + var twitter : Bool! + var instagram : Bool! + var tumblr : Bool! + var vine : Bool! + + var userPrefs : NSUserDefaults! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.facebook = true + self.twitter = false + self.instagram = false + self.tumblr = true + self.vine = true + + self.userPrefs = NSUserDefaults.standardUserDefaults() + + self.grayBarHeight.constant = CGFloat(0.5) + + checkAuthentication() + initializeSwitches() + } + + //MARK: Actions + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + //MARK: Other + + func checkAuthentication() { + for item in self.stackView.subviews { + var connectButton : UIButton! + var connectionLabel : UILabel! + var connectSwitch : UISwitch! + + if item.tag != 1 { + let networkName = item.restorationIdentifier + //Network names : facebook, twitter, etc... + print(networkName) + for innerItem in item.subviews { + if innerItem.tag == 5 { + connectionLabel = innerItem as! UILabel + + if networkName == nil { + connectionLabel.alpha = CGFloat(0) + } else { + connectionLabel.alpha = CGFloat(1) + } + } else if innerItem.tag == 3 { + connectButton = innerItem as! UIButton + + if networkName == nil { + connectButton.alpha = CGFloat(1) + } else { + connectButton.alpha = CGFloat(0) + } + } else if innerItem.tag == 0 { + connectSwitch = innerItem as! UISwitch + connectSwitch.addTarget(self, action: "TriggerNetworks:", forControlEvents: .ValueChanged) + // Sets the UserPrefs on UISwitch + connectSwitch.on = userPrefs.boolForKey(connectSwitch.restorationIdentifier!) + + if networkName == nil { + connectSwitch.alpha = CGFloat(0) + } else { + connectSwitch.alpha = CGFloat(1) + + } + } + } + } + } + } + + func initializeSwitches() { + //Sets separator thickness and scales switches + for item in self.stackView.subviews { + if item.tag == 1 { + item.constraints.first?.constant = CGFloat(0.5) + } else { + for innerItem in item.subviews { + var switchButton : UISwitch! + + //Iterates through the elements + if innerItem.isKindOfClass(UISwitch) { + switchButton = innerItem as! UISwitch + switchButton.transform = CGAffineTransformMakeScale(0.75, 0.75) + switchButton.addTarget(self, action: "stateChanged:", forControlEvents: UIControlEvents.ValueChanged) + stateChanged(switchButton) + } + + } + } + } + } + + func stateChanged(switchButton : UISwitch) { + var connectionLabel : UILabel! + var connectionNetwork : UILabel! + + for item in (switchButton.superview?.subviews)! { + if item.tag == 5 { + connectionLabel = item as! UILabel + } else if item.tag == 2 { + connectionNetwork = item as! UILabel + } + } + + if switchButton.on { + connectionLabel.text = "Connected" + connectionNetwork.textColor = UIColor.blackColor() + } else { + connectionLabel.text = "Disconnected" + connectionNetwork.textColor = UIColor.lightGrayColor() + } + } + + func TriggerNetworks(switchButton : UISwitch) { + userPrefs.setBool(switchButton.on, forKey: switchButton.restorationIdentifier!) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/NotificationPageController.swift b/NotificationPageController.swift new file mode 100644 index 0000000..78e94b4 --- /dev/null +++ b/NotificationPageController.swift @@ -0,0 +1,146 @@ +// +// SocialFeedsViewController.swift +// comblie +// +// Created by Cal on 10/13/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class NotificationPageController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { + + //MARK: Properties + + @IBOutlet weak var feedViewContainer: UIView! + @IBOutlet weak var networkName: UILabel! + @IBOutlet weak var customPageControls: UIStackView! + + + var pageViewController : UIPageViewController! + var pages : NSArray! + var pageQuery : String! + var viewControllers : NSArray! + var dotCollection : [UIView]! + + // Set up for parameters that can be passed in + init(page : String) + { + self.pageQuery = page + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + self.pageQuery = "" + super.init(coder: aDecoder) + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view, typically from a nib. + + // Instantiate the view page controller and add it to the Main View as a child view + // Prepares the login-type views + self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("NotificationPageViewController") as! UIPageViewController + self.pageViewController.delegate = self + self.pageViewController.dataSource = self + let facebookVC = createViewController("NotificationTableView") + let twitterVC = createViewController("NotificationTableView") + let instagramVC = createViewController("NotificationTableView") + let tumblrVC = createViewController("NotificationTableView") + let vineVC = createViewController("NotificationTableView") + pages = NSArray(objects: facebookVC, twitterVC, instagramVC, tumblrVC, vineVC) + viewControllers = NSArray(object: facebookVC) + self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil) + self.addChildViewController(self.pageViewController) + self.pageViewController.view.frame = CGRect(x: 0, y: 0, width: self.feedViewContainer.frame.width, height: self.feedViewContainer.frame.height) + self.feedViewContainer.addSubview(self.pageViewController.view) + //self.view.addSubview(self.pageViewController.view) + self.pageViewController.didMoveToParentViewController(self) + dotCollection = customPageControls.subviews + + // Position Page Control + initializeConstraints() + stylePageControls() + } + + //MARK: Actions + + + // Creates and returns view controllers by storyboard ID + + func createViewController(identifierID : String) -> UIViewController { + let vc = self.storyboard!.instantiateViewControllerWithIdentifier(identifierID) as UIViewController + return vc + } + + // MARK: Page View Controller Data Source + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == 0 || index == NSNotFound) { + return nil + } + index-- + return pages[index] as! UIViewController + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == pages.count-1 || index == NSNotFound) { + return nil + } + index++ + return pages[index] as! UIViewController + + } + + // Triggers after it has landed on a new page after swipe + + func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + + // Set the current page + networkName.text = pageViewController.viewControllers?.last?.restorationIdentifier + + let currentIndex = pages.indexOfObject((pageViewController.viewControllers?.last)!) + for (index, element) in dotCollection.enumerate() { + if index == currentIndex { + element.alpha = CGFloat(1.0) + } else { + element.alpha = CGFloat(0.25) + } + } + + } + + // MARK : Other + + func initializeConstraints() { + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + + } else if screenHeight == 568 { + print("iPhone5") + + } else { + print("iPhone6") + + } + } + + func stylePageControls() { + for dots in dotCollection { + dots.layer.cornerRadius = dots.frame.height/2 + dots.alpha = CGFloat(0.25) + } + + var currentIndex = pages.indexOfObject(viewControllers[0]) + dotCollection[currentIndex].alpha = CGFloat(1.0) + } + +} \ No newline at end of file diff --git a/OutgoingMessageCell.xib b/OutgoingMessageCell.xib new file mode 100644 index 0000000..5309961 --- /dev/null +++ b/OutgoingMessageCell.xib @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OutgoingMessageCellController.swift b/OutgoingMessageCellController.swift new file mode 100644 index 0000000..52d06d9 --- /dev/null +++ b/OutgoingMessageCellController.swift @@ -0,0 +1,28 @@ +// +// OutgoingMessageCellController.swift +// comblie +// +// Created by Cal on 10/25/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class OutgoingMessageCellController: UITableViewCell { + + @IBOutlet weak var messageBackground: UIView! + @IBOutlet weak var message: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.messageBackground.layer.cornerRadius = CGFloat(13) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..872efe8 --- /dev/null +++ b/Podfile @@ -0,0 +1,19 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' +use_frameworks! + +target 'comblie' do +pod 'Alamofire', '2.0.2' +pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git' +pod 'Firebase', '>= 2.4.1' +pod "OAuthSwift", "~> 0.4.6" +end + +target 'comblieTests' do + +end + +target 'comblieUITests' do + +end + diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..e6f3572 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,28 @@ +PODS: + - Alamofire (2.0.2) + - Firebase (2.4.2) + - OAuthSwift (0.4.6) + - SwiftyJSON (2.3.0) + +DEPENDENCIES: + - Alamofire (= 2.0.2) + - Firebase (>= 2.4.1) + - OAuthSwift (~> 0.4.6) + - SwiftyJSON (from `https://github.com/SwiftyJSON/SwiftyJSON.git`) + +EXTERNAL SOURCES: + SwiftyJSON: + :git: https://github.com/SwiftyJSON/SwiftyJSON.git + +CHECKOUT OPTIONS: + SwiftyJSON: + :commit: 3b5d0d4e0c19173b1bf0dc823bde25ad870f70c0 + :git: https://github.com/SwiftyJSON/SwiftyJSON.git + +SPEC CHECKSUMS: + Alamofire: 8edbab00802a752bb5240cc2abe70e7e881488ad + Firebase: 5e898ed5012c81d28ca5fae1113c6b61a172bc6d + OAuthSwift: 8c738cc56c942a541f5c6d0362a892cb149d10b1 + SwiftyJSON: 8d6b61a70277ef2a5d710d372e06e7e2d87fb9e4 + +COCOAPODS: 0.38.2 diff --git a/Pods/Alamofire/LICENSE b/Pods/Alamofire/LICENSE new file mode 100644 index 0000000..5b7934d --- /dev/null +++ b/Pods/Alamofire/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/Alamofire/README.md b/Pods/Alamofire/README.md new file mode 100644 index 0000000..0f8612d --- /dev/null +++ b/Pods/Alamofire/README.md @@ -0,0 +1,1078 @@ +![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/assets/alamofire.png) + +[![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg)](https://travis-ci.org/Alamofire/Alamofire) +[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](http://cocoadocs.org/docsets/Alamofire) +[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF) + +Alamofire is an HTTP networking library written in Swift. + +## Features + +- [x] Chainable Request / Response methods +- [x] URL / JSON / plist Parameter Encoding +- [x] Upload File / Data / Stream / MultipartFormData +- [x] Download using Request or Resume data +- [x] Authentication with NSURLCredential +- [x] HTTP Response Validation +- [x] TLS Certificate and Public Key Pinning +- [x] Progress Closure & NSProgress +- [x] cURL Debug Output +- [x] Comprehensive Unit Test Coverage +- [x] [Complete Documentation](http://cocoadocs.org/docsets/Alamofire) + +## Requirements + +- iOS 8.0+ / Mac OS X 10.9+ / watchOS 2 +- Xcode 7.0+ + +## Migration Guides + +- [Alamofire 2.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%202.0%20Migration%20Guide.md) + +## Communication + +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). +- If you **found a bug**, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. + +## Installation + +> **Embedded frameworks require a minimum deployment target of iOS 8 or OS X Mavericks (10.9).** +> +> Alamofire is no longer supported on iOS 7 due to the lack of support for frameworks. Without frameworks, running Travis-CI against iOS 7 would require a second duplicated test target. The separate test suite would need to import all the Swift files and the tests would need to be duplicated and re-written. This split would be too difficult to maintain to ensure the highest possible quality of the Alamofire ecosystem. + +### CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. + +CocoaPods 0.38.2 is required to build Alamofire on the `swift-2.0` branch. It adds support for Xcode 7, Swift 2.0 and embedded frameworks. You can install it with the following command: + +```bash +$ gem install cocoapods +``` + +To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`: + +```ruby +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '8.0' +use_frameworks! + +pod 'Alamofire', '~> 2.0' +``` + +Then, run the following command: + +```bash +$ pod install +``` + +### Carthage + +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application. + +You can install Carthage with [Homebrew](http://brew.sh/) using the following command: + +```bash +$ brew update +$ brew install carthage +``` + +To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "Alamofire/Alamofire" ~> 2.0 +``` + +### Manually + +If you prefer not to use either of the aforementioned dependency managers, you can integrate Alamofire into your project manually. + +#### Embedded Framework + +- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository: + +```bash +$ git init +``` + +- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command: + +```bash +$ git submodule add https://github.com/Alamofire/Alamofire.git +``` + +- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project. + + > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter. + +- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target. +- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar. +- In the tab bar at the top of that window, open the "General" panel. +- Click on the `+` button under the "Embedded Binaries" section. +- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder. + + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`. + +- Select the top `Alamofire.framework` for iOS and the bottom one for OS X. + + > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS` or `Alamofire OSX`. + +- And that's it! + +> The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device. + +--- + +## Usage + +### Making a Request + +```swift +import Alamofire + +Alamofire.request(.GET, "http://httpbin.org/get") +``` + +### Response Handling + +```swift +Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) + .response { request, response, data, error in + print(request) + print(response) + print(error) + } +``` + +> Networking in Alamofire is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way. + +> Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) is specified to handle the response once it's received. The result of a request is only available inside the scope of a response handler. Any execution contingent on the response or data received from the server must be done within a handler. + +### Response Serialization + +**Built-in Response Methods** + +- `response()` +- `responseString(encoding: NSStringEncoding)` +- `responseJSON(options: NSJSONReadingOptions)` +- `responsePropertyList(options: NSPropertyListReadOptions)` + +#### Response String Handler + +```swift +Alamofire.request(.GET, "http://httpbin.org/get") + .responseString { _, _, result in + print("Success: \(result.isSuccess)") + print("Response String: \(result.value)") + } +``` + +#### Response JSON Handler + +```swift +Alamofire.request(.GET, "http://httpbin.org/get") + .responseJSON { _, _, result in + print(result) + debugPrint(result) + } +``` + +#### Chained Response Handlers + +Response handlers can even be chained: + +```swift +Alamofire.request(.GET, "http://httpbin.org/get") + .responseString { _, _, result in + print("Response String: \(result.value)") + } + .responseJSON { _, _, result in + print("Response JSON: \(result.value)") + } +``` + +### HTTP Methods + +`Alamofire.Method` lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3): + +```swift +public enum Method: String { + case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT +} +``` + +These values can be passed as the first argument of the `Alamofire.request` method: + +```swift +Alamofire.request(.POST, "http://httpbin.org/post") + +Alamofire.request(.PUT, "http://httpbin.org/put") + +Alamofire.request(.DELETE, "http://httpbin.org/delete") +``` + +### Parameters + +#### GET Request With URL-Encoded Parameters + +```swift +Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) +// http://httpbin.org/get?foo=bar +``` + +#### POST Request With URL-Encoded Parameters + +```swift +let parameters = [ + "foo": "bar", + "baz": ["a", 1], + "qux": [ + "x": 1, + "y": 2, + "z": 3 + ] +] + +Alamofire.request(.POST, "http://httpbin.org/post", parameters: parameters) +// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3 +``` + +### Parameter Encoding + +Parameters can also be encoded as JSON, Property List, or any custom format, using the `ParameterEncoding` enum: + +```swift +enum ParameterEncoding { + case URL + case URLEncodedInURL + case JSON + case PropertyList(format: NSPropertyListFormat, options: NSPropertyListWriteOptions) + case Custom((URLRequestConvertible, [String: AnyObject]?) -> (NSMutableURLRequest, NSError?)) + + func encode(request: NSURLRequest, parameters: [String: AnyObject]?) -> (NSURLRequest, NSError?) + { ... } +} +``` + +- `URL`: A query string to be set as or appended to any existing URL query for `GET`, `HEAD`, and `DELETE` requests, or set as the body for requests with any other HTTP method. The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded`. _Since there is no published specification for how to encode collection types, Alamofire follows the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`)._ +- `URLEncodedInURL`: Creates query string to be set as or appended to any existing URL query. Uses the same implementation as the `.URL` case, but always applies the encoded result to the URL. +- `JSON`: Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`. +- `PropertyList`: Uses `NSPropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`. +- `Custom`: Uses the associated closure value to construct a new request given an existing request and parameters. + +#### Manual Parameter Encoding of an NSURLRequest + +```swift +let URL = NSURL(string: "http://httpbin.org/get")! +var request = NSURLRequest(URL: URL) + +let parameters = ["foo": "bar"] +let encoding = Alamofire.ParameterEncoding.URL +(request, _) = encoding.encode(request, parameters: parameters) +``` + +#### POST Request with JSON-encoded Parameters + +```swift +let parameters = [ + "foo": [1,2,3], + "bar": [ + "baz": "qux" + ] +] + +Alamofire.request(.POST, "http://httpbin.org/post", parameters: parameters, encoding: .JSON) +// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} +``` + +### HTTP Headers + +Adding a custom HTTP header to a `Request` is supported directly in the global `request` method. This makes it easy to attach HTTP headers to a `Request` that can be constantly changing. + +> For HTTP headers that do not change, it is recommended to set them on the `NSURLSessionConfiguration` so they are automatically applied to any `NSURLSessionTask` created by the underlying `NSURLSession`. + +```swift +let headers = [ + "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==", + "Content-Type": "application/x-www-form-urlencoded" +] + +Alamofire.request(.GET, "http://httpbin.org/get", headers: headers) + .responseJSON { _, _, result in + debugPrint(result) + } +``` + +### Caching + +Caching is handled on the system framework level by [`NSURLCache`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/occ/cl/NSURLCache). + +### Uploading + +**Supported Upload Types** + +- File +- Data +- Stream +- MultipartFormData + +#### Uploading a File + +```swift +let fileURL = NSBundle.mainBundle().URLForResource("Default", withExtension: "png") +Alamofire.upload(.POST, "http://httpbin.org/post", file: fileURL) +``` + +#### Uploading with Progress + +```swift +Alamofire.upload(.POST, "http://httpbin.org/post", file: fileURL) + .progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in + print(totalBytesWritten) + + // This closure is NOT called on the main queue for performance + // reasons. To update your ui, dispatch to the main queue. + dispatch_async(dispatch_get_main_queue) { + print("Total bytes written on main queue: \(totalBytesWritten)") + } + } + .responseJSON { request, response, result in + debugPrint(result) + } +``` + +#### Uploading MultipartFormData + +```swift +Alamofire.upload( + .POST, + URLString: "http://httpbin.org/post", + multipartFormData: { multipartFormData in + multipartFormData.appendBodyPart(fileURL: unicornImageURL, name: "unicorn") + multipartFormData.appendBodyPart(fileURL: rainbowImageURL, name: "rainbow") + }, + encodingCompletion: { encodingResult in + switch encodingResult { + case .Success(let upload, _, _): + upload.responseJSON { request, response, result in + debugPrint(result) + } + case .Failure(let encodingError): + print(encodingError) + } + } +) +``` + +### Downloading + +**Supported Download Types** + +- Request +- Resume Data + +#### Downloading a File + +```swift +Alamofire.download(.GET, "http://httpbin.org/stream/100") { temporaryURL, response in + let fileManager = NSFileManager.defaultManager() + if let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as? NSURL { + let pathComponent = response.suggestedFilename + return directoryURL.URLByAppendingPathComponent(pathComponent!) + } + + return temporaryURL +} +``` + +#### Using the Default Download Destination + +```swift +let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask) +Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination) +``` + +#### Downloading a File w/Progress + +```swift +Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination) + .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in + print(totalBytesRead) + + // This closure is NOT called on the main queue for performance + // reasons. To update your ui, dispatch to the main queue. + dispatch_async(dispatch_get_main_queue) { + print("Total bytes read on main queue: \(totalBytesRead)") + } + } + .response { request, response, _, error in + print(response) + } +``` + +#### Accessing Resume Data for Failed Downloads + +```swift +Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination) + .response { request, response, data, error in + if let + data = data, + resumeDataString = NSString(data: data, encoding: NSUTF8StringEncoding) + { + print("Resume Data: \(resumeDataString)") + } else { + print("Resume Data was empty") + } + } +``` + +> The `data` parameter is automatically populated with the `resumeData` if available. + +```swift +let download = Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination) +download.response { request, response, data, error in + if let + resumeData = download.resumeData, + resumeDataString = NSString(data: data, encoding: NSUTF8StringEncoding) + { + print("Resume Data: \(resumeDataString)") + } else { + print("Resume Data was empty") + } +} +``` + +### Authentication + +Authentication is handled on the system framework level by [`NSURLCredential` and `NSURLAuthenticationChallenge`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLAuthenticationChallenge_Class/Reference/Reference.html). + +**Supported Authentication Schemes** + +- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication) +- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication) +- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29) +- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager) + +#### HTTP Basic Authentication + +The `authenticate` method on a `Request` will automatically provide an `NSURLCredential` to an `NSURLAuthenticationChallenge` when appropriate: + +```swift +let user = "user" +let password = "password" + +Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)") + .authenticate(user: user, password: password) + .response { request, response, _, error in + print(response) + } +``` + +Depending upon your server implementation, an `Authorization` header may also be appropriate: + +```swift +let user = "user" +let password = "password" + +let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)! +let base64Credentials = credentialData.base64EncodedStringWithOptions(nil) + +let headers = ["Authorization": "Basic \(base64Credentials)"] + +Alamofire.request(.GET, "http://httpbin.org/basic-auth/user/password", headers: headers) + .responseJSON { _, _, result in + print(result) + } +``` + +#### Authentication with NSURLCredential + +```swift +let user = "user" +let password = "password" + +let credential = NSURLCredential(user: user, password: password, persistence: .ForSession) + +Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)") + .authenticate(usingCredential: credential) + .response { request, response, _, error in + print(response) + } +``` + +### Validation + +By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type. + +#### Manual Validation + +```swift +Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) + .validate(statusCode: 200..<300) + .validate(contentType: ["application/json"]) + .response { _, _, _, error in + print(error) + } +``` + +#### Automatic Validation + +Automatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided. + +```swift +Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) + .validate() + .responseJSON { _, _, result in + switch result { + case .Success: + print("Validation Successful") + case .Failure(_, let error): + print(error) + } + } +``` + +### Printable + +```swift +let request = Alamofire.request(.GET, "http://httpbin.org/ip") + +print(request) +// GET http://httpbin.org/ip (200) +``` + +### DebugPrintable + +```swift +let request = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) + +debugPrint(request) +``` + +#### Output (cURL) + +```bash +$ curl -i \ + -H "User-Agent: Alamofire" \ + -H "Accept-Encoding: Accept-Encoding: gzip;q=1.0,compress;q=0.5" \ + -H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \ + "http://httpbin.org/get?foo=bar" +``` + +--- + +## Advanced Usage + +> Alamofire is built on `NSURLSession` and the Foundation URL Loading System. To make the most of +this framework, it is recommended that you be familiar with the concepts and capabilities of the underlying networking stack. + +**Recommended Reading** + +- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html) +- [NSURLSession Class Reference](https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html#//apple_ref/occ/cl/NSURLSession) +- [NSURLCache Class Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/occ/cl/NSURLCache) +- [NSURLAuthenticationChallenge Class Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLAuthenticationChallenge_Class/Reference/Reference.html) + +### Manager + +Top-level convenience methods like `Alamofire.request` use a shared instance of `Alamofire.Manager`, which is configured with the default `NSURLSessionConfiguration`. + +As such, the following two statements are equivalent: + +```swift +Alamofire.request(.GET, "http://httpbin.org/get") +``` + +```swift +let manager = Alamofire.Manager.sharedInstance +manager.request(NSURLRequest(URL: NSURL(string: "http://httpbin.org/get"))) +``` + +Applications can create managers for background and ephemeral sessions, as well as new managers that customize the default session configuration, such as for default headers (`HTTPAdditionalHeaders`) or timeout interval (`timeoutIntervalForRequest`). + +#### Creating a Manager with Default Configuration + +```swift +let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() +let manager = Alamofire.Manager(configuration: configuration) +``` + +#### Creating a Manager with Background Configuration + +```swift +let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.example.app.background") +let manager = Alamofire.Manager(configuration: configuration) +``` + +#### Creating a Manager with Ephemeral Configuration + +```swift +let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration() +let manager = Alamofire.Manager(configuration: configuration) +``` + +#### Modifying Session Configuration + +```swift +var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:] +defaultHeaders["DNT"] = "1 (Do Not Track Enabled)" + +let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() +configuration.HTTPAdditionalHeaders = defaultHeaders + +let manager = Alamofire.Manager(configuration: configuration) +``` + +> This is **not** recommended for `Authorization` or `Content-Type` headers. Instead, use `URLRequestConvertible` and `ParameterEncoding`, respectively. + +### Request + +The result of a `request`, `upload`, or `download` method is an instance of `Alamofire.Request`. A request is always created using a constructor method from an owning manager, and never initialized directly. + +Methods like `authenticate`, `validate`, and `response` return the caller in order to facilitate chaining. + +Requests can be suspended, resumed, and cancelled: + +- `suspend()`: Suspends the underlying task and dispatch queue +- `resume()`: Resumes the underlying task and dispatch queue. If the owning manager does not have `startRequestsImmediately` set to `true`, the request must call `resume()` in order to start. +- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers. + +### Response Serialization + +#### Creating a Custom Response Serializer + +Alamofire provides built-in response serialization for strings, JSON, and property lists, but others can be added in extensions on `Alamofire.Request`. + +For example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented: + +```swift +extension Request { + public static func XMLResponseSerializer() -> GenericResponseSerializer { + return GenericResponseSerializer { request, response, data in + guard let validData = data else { + let failureReason = "Data could not be serialized. Input data was nil." + let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + + do { + let XML = try ONOXMLDocument(data: validData) + return .Success(XML) + } catch { + return .Failure(data, error as NSError) + } + } + } + + public func responseXMLDocument(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) -> Self { + return response(responseSerializer: Request.XMLResponseSerializer(), completionHandler: completionHandler) + } +} +``` + +#### Generic Response Object Serialization + +Generics can be used to provide automatic, type-safe response object serialization. + +```swift +public protocol ResponseObjectSerializable { + init?(response: NSHTTPURLResponse, representation: AnyObject) +} + +extension Request { + public func responseObject(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) -> Self { + let responseSerializer = GenericResponseSerializer { request, response, data in + let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments) + let result = JSONResponseSerializer.serializeResponse(request, response, data) + + switch result { + case .Success(let value): + if let + response = response, + responseObject = T(response: response, representation: value) + { + return .Success(responseObject) + } else { + let failureReason = "JSON could not be serialized into response object: \(value)" + let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + case .Failure(let data, let error): + return .Failure(data, error) + } + } + + return response(responseSerializer: responseSerializer, completionHandler: completionHandler) + } +} +``` + +```swift +final class User: ResponseObjectSerializable { + let username: String + let name: String + + init?(response: NSHTTPURLResponse, representation: AnyObject) { + self.username = response.URL!.lastPathComponent! + self.name = representation.valueForKeyPath("name") as! String + } +} +``` + +```swift +Alamofire.request(.GET, "http://example.com/users/mattt") + .responseObject { (_, _, result: Result) in + debugPrint(result) + } +``` + +The same approach can also be used to handle endpoints that return a representation of a collection of objects: + +```swift +public protocol ResponseCollectionSerializable { + static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [Self] +} + +extension Alamofire.Request { + public func responseCollection(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<[T]>) -> Void) -> Self { + let responseSerializer = GenericResponseSerializer<[T]> { request, response, data in + let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments) + let result = JSONSerializer.serializeResponse(request, response, data) + + switch result { + case .Success(let value): + if let response = response { + return .Success(T.collection(response: response, representation: value)) + } else { + let failureReason = "Response collection could not be serialized due to nil response" + let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + case .Failure(let data, let error): + return .Failure(data, error) + } + } + + return response(responseSerializer: responseSerializer, completionHandler: completionHandler) + } +} +``` + +```swift +final class User: ResponseObjectSerializable, ResponseCollectionSerializable { + let username: String + let name: String + + init?(response: NSHTTPURLResponse, representation: AnyObject) { + self.username = response.URL!.lastPathComponent! + self.name = representation.valueForKeyPath("name") as! String + } + + static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [User] { + var users: [User] = [] + + if let representation = representation as? [[String: AnyObject]] { + for userRepresentation in representation { + if let user = User(response: response, representation: userRepresentation) { + users.append(user) + } + } + } + + return users + } +} +``` + +```swift +Alamofire.request(.GET, "http://example.com/users") + .responseCollection { (_, _, result: Result<[User]>) in + debugPrint(result) + } +``` + +### URLStringConvertible + +Types adopting the `URLStringConvertible` protocol can be used to construct URL strings, which are then used to construct URL requests. `NSString`, `NSURL`, `NSURLComponents`, and `NSURLRequest` conform to `URLStringConvertible` by default, allowing any of them to be passed as `URLString` parameters to the `request`, `upload`, and `download` methods: + +```swift +let string = NSString(string: "http://httpbin.org/post") +Alamofire.request(.POST, string) + +let URL = NSURL(string: string)! +Alamofire.request(.POST, URL) + +let URLRequest = NSURLRequest(URL: URL) +Alamofire.request(.POST, URLRequest) // overrides `HTTPMethod` of `URLRequest` + +let URLComponents = NSURLComponents(URL: URL, resolvingAgainstBaseURL: true) +Alamofire.request(.POST, URLComponents) +``` + +Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLStringConvertible` as a convenient way to map domain-specific models to server resources. + +#### Type-Safe Routing + +```swift +extension User: URLStringConvertible { + static let baseURLString = "http://example.com" + + var URLString: String { + return User.baseURLString + "/users/\(username)/" + } +} +``` + +```swift +let user = User(username: "mattt") +Alamofire.request(.GET, user) // http://example.com/users/mattt +``` + +### URLRequestConvertible + +Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests. `NSURLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly (this is the recommended way to specify custom HTTP body for individual requests): + +```swift +let URL = NSURL(string: "http://httpbin.org/post")! +let mutableURLRequest = NSMutableURLRequest(URL: URL) +mutableURLRequest.HTTPMethod = "POST" + +let parameters = ["foo": "bar"] + +do { + mutableURLRequest.HTTPBody = try NSJSONSerialization.dataWithJSONObject(parameters, options: NSJSONWritingOptions()) +} catch { + // No-op +} + +mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") + +Alamofire.request(mutableURLRequest) +``` + +Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLRequestConvertible` as a way to ensure consistency of requested endpoints. Such an approach can be used to abstract away server-side inconsistencies and provide type-safe routing, as well as manage authentication credentials and other state. + +#### API Parameter Abstraction + +```swift +enum Router: URLRequestConvertible { + static let baseURLString = "http://example.com" + static let perPage = 50 + + case Search(query: String, page: Int) + + // MARK: URLRequestConvertible + + var URLRequest: NSMutableURLRequest { + let result: (path: String, parameters: [String: AnyObject]) = { + switch self { + case .Search(let query, let page) where page > 1: + return ("/search", ["q": query, "offset": Router.perPage * page]) + case .Search(let query, _): + return ("/search", ["q": query]) + } + }() + + let URL = NSURL(string: Router.baseURLString)! + let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(result.path)) + let encoding = Alamofire.ParameterEncoding.URL + + return encoding.encode(URLRequest, parameters: result.parameters).0 + } +} +``` + +```swift +Alamofire.request(Router.Search(query: "foo bar", page: 1)) // ?q=foo%20bar&offset=50 +``` + +#### CRUD & Authorization + +```swift +enum Router: URLRequestConvertible { + static let baseURLString = "http://example.com" + static var OAuthToken: String? + + case CreateUser([String: AnyObject]) + case ReadUser(String) + case UpdateUser(String, [String: AnyObject]) + case DestroyUser(String) + + var method: Alamofire.Method { + switch self { + case .CreateUser: + return .POST + case .ReadUser: + return .GET + case .UpdateUser: + return .PUT + case .DestroyUser: + return .DELETE + } + } + + var path: String { + switch self { + case .CreateUser: + return "/users" + case .ReadUser(let username): + return "/users/\(username)" + case .UpdateUser(let username, _): + return "/users/\(username)" + case .DestroyUser(let username): + return "/users/\(username)" + } + } + + // MARK: URLRequestConvertible + + var URLRequest: NSMutableURLRequest { + let URL = NSURL(string: Router.baseURLString)! + let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path)) + mutableURLRequest.HTTPMethod = method.rawValue + + if let token = Router.OAuthToken { + mutableURLRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") + } + + switch self { + case .CreateUser(let parameters): + return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0 + case .UpdateUser(_, let parameters): + return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0 + default: + return mutableURLRequest + } + } +} +``` + +```swift +Alamofire.request(Router.ReadUser("mattt")) // GET /users/mattt +``` + +### Security + +Using a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by the `ServerTrustPolicy`. + +#### ServerTrustPolicy + +The `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `NSURLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection. + +```swift +let serverTrustPolicy = ServerTrustPolicy.PinCertificates( + certificates: ServerTrustPolicy.certificatesInBundle(), + validateCertificateChain: true, + validateHost: true +) +``` + +There are many different cases of server trust evaluation giving you complete control over the validation process: + +* `PerformDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge. +* `PinCertificates`: Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned certificates match one of the server certificates. +* `PinPublicKeys`: Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned public keys match one of the server certificate public keys. +* `DisableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid. +* `CustomEvaluation`: Uses the associated closure to evaluate the validity of the server trust thus giving you complete control over the validation process. Use with caution. + +#### Server Trust Policy Manager + +The `ServerTrustPolicyManager` is responsible for storing an internal mapping of server trust policies to a particular host. This allows Alamofire to evaluate each host against a different server trust policy. + +```swift +let serverTrustPolicies: [String: ServerTrustPolicy] = [ + "test.example.com": .PinCertificates( + certificates: ServerTrustPolicy.certificatesInBundle(), + validateCertificateChain: true, + validateHost: true + ), + "insecure.expired-apis.com": .DisableEvaluation +] + +let manager = Manager( + configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), + serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) +) +``` + +> Make sure to keep a reference to the new `Manager` instance, otherwise your requests will all get cancelled when your `manager` is deallocated. + +These server trust policies will result in the following behavior: + +* `test.example.com` will always use certificate pinning with certificate chain and host validation enabled thus requiring the following criteria to be met to allow the TLS handshake to succeed: + * Certificate chain MUST be valid. + * Certificate chain MUST include one of the pinned certificates. + * Challenge host MUST match the host in the certificate chain's leaf certificate. +* `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed. +* All other hosts will use the default evaluation provided by Apple. + +##### Subclassing Server Trust Policy Manager + +If you find yourself needing more flexible server trust policy matching behavior (i.e. wildcarded domains), then subclass the `ServerTrustPolicyManager` and override the `serverTrustPolicyForHost` method with your own custom implementation. + +```swift +class CustomServerTrustPolicyManager: ServerTrustPolicyManager { + override func serverTrustPolicyForHost(host: String) -> ServerTrustPolicy? { + var policy: ServerTrustPolicy? + + // Implement your custom domain matching behavior... + + return policy + } +} +``` + +#### Validating the Host + +The `.PerformDefaultEvaluation`, `.PinCertificates` and `.PinPublicKeys` server trust policies all take a `validateHost` parameter. Setting the value to `true` will cause the server trust evaluation to verify that hostname in the certificate matches the hostname of the challenge. If they do not match, evaluation will fail. A `validateHost` value of `false` will still evaluate the full certificate chain, but will not validate the hostname of the leaf certificate. + +> It is recommended that `validateHost` always be set to `true` in production environments. + +#### Validating the Certificate Chain + +Pinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certficates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check. + +There are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server. + +> It is recommended that `validateCertificateChain` always be set to `true` in production environments. + +--- + +## Component Libraries + +In order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) to bring additional functionality to the Alamofire ecosystem. + +* [AlamofireImage](https://github.com/Alamofire/AlamofireImage) - An image library including image response serializers, `UIImage` and `UIImageView` extensions, custom image filters, an auto-purging in-memory cache and a priority-based image downloading system. + +## Open Rdars + +The following rdars have some affect on the current implementation of Alamofire. + +* [rdar://22024442](http://www.openradar.me/radar?id=6082025006039040) - Array of [SecCertificate] crashing Swift 2.0 compiler in optimized builds +* [rdar://21349340](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case +* [rdar://22307360](http://www.openradar.me/radar?id=4895563208196096) - Swift #available check not working properly with min deployment target + +## FAQ + +### What's the origin of the name Alamofire? + +Alamofire is named after the [Alamo Fire flower](https://aggie-horticulture.tamu.edu/wildseed/alamofire.html), a hybrid variant of the Bluebonnet, the official state flower of Texas. + +--- + +## Credits + +Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases. + +### Security Disclosure + +If you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker. + +## License + +Alamofire is released under the MIT license. See LICENSE for details. diff --git a/Pods/Alamofire/Source/Alamofire.swift b/Pods/Alamofire/Source/Alamofire.swift new file mode 100644 index 0000000..3b52d0f --- /dev/null +++ b/Pods/Alamofire/Source/Alamofire.swift @@ -0,0 +1,368 @@ +// Alamofire.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +// MARK: - URLStringConvertible + +/** + Types adopting the `URLStringConvertible` protocol can be used to construct URL strings, which are then used to + construct URL requests. +*/ +public protocol URLStringConvertible { + /** + A URL that conforms to RFC 2396. + + Methods accepting a `URLStringConvertible` type parameter parse it according to RFCs 1738 and 1808. + + See https://tools.ietf.org/html/rfc2396 + See https://tools.ietf.org/html/rfc1738 + See https://tools.ietf.org/html/rfc1808 + */ + var URLString: String { get } +} + +extension String: URLStringConvertible { + public var URLString: String { + return self + } +} + +extension NSURL: URLStringConvertible { + public var URLString: String { + return absoluteString + } +} + +extension NSURLComponents: URLStringConvertible { + public var URLString: String { + return URL!.URLString + } +} + +extension NSURLRequest: URLStringConvertible { + public var URLString: String { + return URL!.URLString + } +} + +// MARK: - URLRequestConvertible + +/** + Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests. +*/ +public protocol URLRequestConvertible { + /// The URL request. + var URLRequest: NSMutableURLRequest { get } +} + +extension NSURLRequest: URLRequestConvertible { + public var URLRequest: NSMutableURLRequest { + return self.mutableCopy() as! NSMutableURLRequest + } +} + +// MARK: - Convenience + +func URLRequest( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil) + -> NSMutableURLRequest +{ + let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URLString.URLString)!) + mutableURLRequest.HTTPMethod = method.rawValue + + if let headers = headers { + for (headerField, headerValue) in headers { + mutableURLRequest.setValue(headerValue, forHTTPHeaderField: headerField) + } + } + + return mutableURLRequest +} + +// MARK: - Request Methods + +/** + Creates a request using the shared manager instance for the specified method, URL string, parameters, and + parameter encoding. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter parameters: The parameters. `nil` by default. + - parameter encoding: The parameter encoding. `.URL` by default. + - parameter headers: The HTTP headers. `nil` by default. + + - returns: The created request. +*/ +public func request( + method: Method, + _ URLString: URLStringConvertible, + parameters: [String: AnyObject]? = nil, + encoding: ParameterEncoding = .URL, + headers: [String: String]? = nil) + -> Request +{ + return Manager.sharedInstance.request( + method, + URLString, + parameters: parameters, + encoding: encoding, + headers: headers + ) +} + +/** + Creates a request using the shared manager instance for the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter URLRequest: The URL request + + - returns: The created request. +*/ +public func request(URLRequest: URLRequestConvertible) -> Request { + return Manager.sharedInstance.request(URLRequest.URLRequest) +} + +// MARK: - Upload Methods + +// MARK: File + +/** + Creates an upload request using the shared manager instance for the specified method, URL string, and file. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter file: The file to upload. + + - returns: The created upload request. +*/ +public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + file: NSURL) + -> Request +{ + return Manager.sharedInstance.upload(method, URLString, headers: headers, file: file) +} + +/** + Creates an upload request using the shared manager instance for the specified URL request and file. + + - parameter URLRequest: The URL request. + - parameter file: The file to upload. + + - returns: The created upload request. +*/ +public func upload(URLRequest: URLRequestConvertible, file: NSURL) -> Request { + return Manager.sharedInstance.upload(URLRequest, file: file) +} + +// MARK: Data + +/** + Creates an upload request using the shared manager instance for the specified method, URL string, and data. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter data: The data to upload. + + - returns: The created upload request. +*/ +public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + data: NSData) + -> Request +{ + return Manager.sharedInstance.upload(method, URLString, headers: headers, data: data) +} + +/** + Creates an upload request using the shared manager instance for the specified URL request and data. + + - parameter URLRequest: The URL request. + - parameter data: The data to upload. + + - returns: The created upload request. +*/ +public func upload(URLRequest: URLRequestConvertible, data: NSData) -> Request { + return Manager.sharedInstance.upload(URLRequest, data: data) +} + +// MARK: Stream + +/** + Creates an upload request using the shared manager instance for the specified method, URL string, and stream. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter stream: The stream to upload. + + - returns: The created upload request. +*/ +public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + stream: NSInputStream) + -> Request +{ + return Manager.sharedInstance.upload(method, URLString, headers: headers, stream: stream) +} + +/** + Creates an upload request using the shared manager instance for the specified URL request and stream. + + - parameter URLRequest: The URL request. + - parameter stream: The stream to upload. + + - returns: The created upload request. +*/ +public func upload(URLRequest: URLRequestConvertible, stream: NSInputStream) -> Request { + return Manager.sharedInstance.upload(URLRequest, stream: stream) +} + +// MARK: MultipartFormData + +/** + Creates an upload request using the shared manager instance for the specified method and URL string. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter multipartFormData: The closure used to append body parts to the `MultipartFormData`. + - parameter encodingMemoryThreshold: The encoding memory threshold in bytes. + `MultipartFormDataEncodingMemoryThreshold` by default. + - parameter encodingCompletion: The closure called when the `MultipartFormData` encoding is complete. +*/ +public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + multipartFormData: MultipartFormData -> Void, + encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold, + encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?) +{ + return Manager.sharedInstance.upload( + method, + URLString, + headers: headers, + multipartFormData: multipartFormData, + encodingMemoryThreshold: encodingMemoryThreshold, + encodingCompletion: encodingCompletion + ) +} + +/** + Creates an upload request using the shared manager instance for the specified method and URL string. + + - parameter URLRequest: The URL request. + - parameter multipartFormData: The closure used to append body parts to the `MultipartFormData`. + - parameter encodingMemoryThreshold: The encoding memory threshold in bytes. + `MultipartFormDataEncodingMemoryThreshold` by default. + - parameter encodingCompletion: The closure called when the `MultipartFormData` encoding is complete. +*/ +public func upload( + URLRequest: URLRequestConvertible, + multipartFormData: MultipartFormData -> Void, + encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold, + encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?) +{ + return Manager.sharedInstance.upload( + URLRequest, + multipartFormData: multipartFormData, + encodingMemoryThreshold: encodingMemoryThreshold, + encodingCompletion: encodingCompletion + ) +} + +// MARK: - Download Methods + +// MARK: URL Request + +/** + Creates a download request using the shared manager instance for the specified method and URL string. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter parameters: The parameters. `nil` by default. + - parameter encoding: The parameter encoding. `.URL` by default. + - parameter headers: The HTTP headers. `nil` by default. + - parameter destination: The closure used to determine the destination of the downloaded file. + + - returns: The created download request. +*/ +public func download( + method: Method, + _ URLString: URLStringConvertible, + parameters: [String: AnyObject]? = nil, + encoding: ParameterEncoding = .URL, + headers: [String: String]? = nil, + destination: Request.DownloadFileDestination) + -> Request +{ + return Manager.sharedInstance.download( + method, + URLString, + parameters: parameters, + encoding: encoding, + headers: headers, + destination: destination + ) +} + +/** + Creates a download request using the shared manager instance for the specified URL request. + + - parameter URLRequest: The URL request. + - parameter destination: The closure used to determine the destination of the downloaded file. + + - returns: The created download request. +*/ +public func download(URLRequest: URLRequestConvertible, destination: Request.DownloadFileDestination) -> Request { + return Manager.sharedInstance.download(URLRequest, destination: destination) +} + +// MARK: Resume Data + +/** + Creates a request using the shared manager instance for downloading from the resume data produced from a + previous request cancellation. + + - parameter resumeData: The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask` + when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for additional + information. + - parameter destination: The closure used to determine the destination of the downloaded file. + + - returns: The created download request. +*/ +public func download(resumeData data: NSData, destination: Request.DownloadFileDestination) -> Request { + return Manager.sharedInstance.download(data, destination: destination) +} diff --git a/Pods/Alamofire/Source/Download.swift b/Pods/Alamofire/Source/Download.swift new file mode 100644 index 0000000..1df90cc --- /dev/null +++ b/Pods/Alamofire/Source/Download.swift @@ -0,0 +1,244 @@ +// Download.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +extension Manager { + private enum Downloadable { + case Request(NSURLRequest) + case ResumeData(NSData) + } + + private func download(downloadable: Downloadable, destination: Request.DownloadFileDestination) -> Request { + var downloadTask: NSURLSessionDownloadTask! + + switch downloadable { + case .Request(let request): + dispatch_sync(queue) { + downloadTask = self.session.downloadTaskWithRequest(request) + } + case .ResumeData(let resumeData): + dispatch_sync(queue) { + downloadTask = self.session.downloadTaskWithResumeData(resumeData) + } + } + + let request = Request(session: session, task: downloadTask) + + if let downloadDelegate = request.delegate as? Request.DownloadTaskDelegate { + downloadDelegate.downloadTaskDidFinishDownloadingToURL = { session, downloadTask, URL in + return destination(URL, downloadTask.response as! NSHTTPURLResponse) + } + } + + delegate[request.delegate.task] = request.delegate + + if startRequestsImmediately { + request.resume() + } + + return request + } + + // MARK: Request + + /** + Creates a download request for the specified method, URL string, parameters, parameter encoding, headers + and destination. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter parameters: The parameters. `nil` by default. + - parameter encoding: The parameter encoding. `.URL` by default. + - parameter headers: The HTTP headers. `nil` by default. + - parameter destination: The closure used to determine the destination of the downloaded file. + + - returns: The created download request. + */ + public func download( + method: Method, + _ URLString: URLStringConvertible, + parameters: [String: AnyObject]? = nil, + encoding: ParameterEncoding = .URL, + headers: [String: String]? = nil, + destination: Request.DownloadFileDestination) + -> Request + { + let mutableURLRequest = URLRequest(method, URLString, headers: headers) + let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0 + + return download(encodedURLRequest, destination: destination) + } + + /** + Creates a request for downloading from the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter URLRequest: The URL request + - parameter destination: The closure used to determine the destination of the downloaded file. + + - returns: The created download request. + */ + public func download(URLRequest: URLRequestConvertible, destination: Request.DownloadFileDestination) -> Request { + return download(.Request(URLRequest.URLRequest), destination: destination) + } + + // MARK: Resume Data + + /** + Creates a request for downloading from the resume data produced from a previous request cancellation. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter resumeData: The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask` + when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for + additional information. + - parameter destination: The closure used to determine the destination of the downloaded file. + + - returns: The created download request. + */ + public func download(resumeData: NSData, destination: Request.DownloadFileDestination) -> Request { + return download(.ResumeData(resumeData), destination: destination) + } +} + +// MARK: - + +extension Request { + /** + A closure executed once a request has successfully completed in order to determine where to move the temporary + file written to during the download process. The closure takes two arguments: the temporary file URL and the URL + response, and returns a single argument: the file URL where the temporary file should be moved. + */ + public typealias DownloadFileDestination = (NSURL, NSHTTPURLResponse) -> NSURL + + /** + Creates a download file destination closure which uses the default file manager to move the temporary file to a + file URL in the first available directory with the specified search path directory and search path domain mask. + + - parameter directory: The search path directory. `.DocumentDirectory` by default. + - parameter domain: The search path domain mask. `.UserDomainMask` by default. + + - returns: A download file destination closure. + */ + public class func suggestedDownloadDestination( + directory directory: NSSearchPathDirectory = .DocumentDirectory, + domain: NSSearchPathDomainMask = .UserDomainMask) + -> DownloadFileDestination + { + return { temporaryURL, response -> NSURL in + let directoryURLs = NSFileManager.defaultManager().URLsForDirectory(directory, inDomains: domain) + + if !directoryURLs.isEmpty { + return directoryURLs[0].URLByAppendingPathComponent(response.suggestedFilename!) + } + + return temporaryURL + } + } + + /// The resume data of the underlying download task if available after a failure. + public var resumeData: NSData? { + var data: NSData? + + if let delegate = delegate as? DownloadTaskDelegate { + data = delegate.resumeData + } + + return data + } + + // MARK: - DownloadTaskDelegate + + class DownloadTaskDelegate: TaskDelegate, NSURLSessionDownloadDelegate { + var downloadTask: NSURLSessionDownloadTask? { return task as? NSURLSessionDownloadTask } + var downloadProgress: ((Int64, Int64, Int64) -> Void)? + + var resumeData: NSData? + override var data: NSData? { return resumeData } + + // MARK: - NSURLSessionDownloadDelegate + + // MARK: Override Closures + + var downloadTaskDidFinishDownloadingToURL: ((NSURLSession, NSURLSessionDownloadTask, NSURL) -> NSURL)? + var downloadTaskDidWriteData: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64, Int64) -> Void)? + var downloadTaskDidResumeAtOffset: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64) -> Void)? + + // MARK: Delegate Methods + + func URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didFinishDownloadingToURL location: NSURL) + { + if let downloadTaskDidFinishDownloadingToURL = downloadTaskDidFinishDownloadingToURL { + do { + let destination = downloadTaskDidFinishDownloadingToURL(session, downloadTask, location) + try NSFileManager.defaultManager().moveItemAtURL(location, toURL: destination) + } catch { + self.error = error as NSError + } + } + } + + func URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) + { + if let downloadTaskDidWriteData = downloadTaskDidWriteData { + downloadTaskDidWriteData( + session, + downloadTask, + bytesWritten, + totalBytesWritten, + totalBytesExpectedToWrite + ) + } else { + progress.totalUnitCount = totalBytesExpectedToWrite + progress.completedUnitCount = totalBytesWritten + + downloadProgress?(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) + } + } + + func URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) + { + if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset { + downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes) + } else { + progress.totalUnitCount = expectedTotalBytes + progress.completedUnitCount = fileOffset + } + } + } +} diff --git a/Pods/Alamofire/Source/Error.swift b/Pods/Alamofire/Source/Error.swift new file mode 100644 index 0000000..b776a3e --- /dev/null +++ b/Pods/Alamofire/Source/Error.swift @@ -0,0 +1,66 @@ +// Error.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +/// The `Error` struct provides a convenience for creating custom Alamofire NSErrors. +public struct Error { + /// The domain used for creating all Alamofire errors. + public static let Domain = "com.alamofire.error" + + /// The custom error codes generated by Alamofire. + public enum Code: Int { + case InputStreamReadFailed = -6000 + case OutputStreamWriteFailed = -6001 + case ContentTypeValidationFailed = -6002 + case StatusCodeValidationFailed = -6003 + case DataSerializationFailed = -6004 + case StringSerializationFailed = -6005 + case JSONSerializationFailed = -6006 + case PropertyListSerializationFailed = -6007 + } + + /** + Creates an `NSError` with the given error code and failure reason. + + - parameter code: The error code. + - parameter failureReason: The failure reason. + + - returns: An `NSError` with the given error code and failure reason. + */ + public static func errorWithCode(code: Code, failureReason: String) -> NSError { + return errorWithCode(code.rawValue, failureReason: failureReason) + } + + /** + Creates an `NSError` with the given error code and failure reason. + + - parameter code: The error code. + - parameter failureReason: The failure reason. + + - returns: An `NSError` with the given error code and failure reason. + */ + public static func errorWithCode(code: Int, failureReason: String) -> NSError { + let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason] + return NSError(domain: Domain, code: code, userInfo: userInfo) + } +} diff --git a/Pods/Alamofire/Source/Manager.swift b/Pods/Alamofire/Source/Manager.swift new file mode 100644 index 0000000..01f77da --- /dev/null +++ b/Pods/Alamofire/Source/Manager.swift @@ -0,0 +1,668 @@ +// Manager.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +/** + Responsible for creating and managing `Request` objects, as well as their underlying `NSURLSession`. +*/ +public class Manager { + + // MARK: - Properties + + /** + A shared instance of `Manager`, used by top-level Alamofire request methods, and suitable for use directly + for any ad hoc requests. + */ + public static let sharedInstance: Manager = { + let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() + configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders + + return Manager(configuration: configuration) + }() + + /** + Creates default values for the "Accept-Encoding", "Accept-Language" and "User-Agent" headers. + */ + public static let defaultHTTPHeaders: [String: String] = { + // Accept-Encoding HTTP Header; see https://tools.ietf.org/html/rfc7230#section-4.2.3 + let acceptEncoding: String = "gzip;q=1.0,compress;q=0.5" + + // Accept-Language HTTP Header; see https://tools.ietf.org/html/rfc7231#section-5.3.5 + let acceptLanguage: String = { + var components: [String] = [] + for (index, languageCode) in (NSLocale.preferredLanguages() as [String]).enumerate() { + let q = 1.0 - (Double(index) * 0.1) + components.append("\(languageCode);q=\(q)") + if q <= 0.5 { + break + } + } + + return components.joinWithSeparator(",") + }() + + // User-Agent Header; see https://tools.ietf.org/html/rfc7231#section-5.5.3 + let userAgent: String = { + if let info = NSBundle.mainBundle().infoDictionary { + let executable: AnyObject = info[kCFBundleExecutableKey as String] ?? "Unknown" + let bundle: AnyObject = info[kCFBundleIdentifierKey as String] ?? "Unknown" + let version: AnyObject = info[kCFBundleVersionKey as String] ?? "Unknown" + let os: AnyObject = NSProcessInfo.processInfo().operatingSystemVersionString ?? "Unknown" + + var mutableUserAgent = NSMutableString(string: "\(executable)/\(bundle) (\(version); OS \(os))") as CFMutableString + let transform = NSString(string: "Any-Latin; Latin-ASCII; [:^ASCII:] Remove") as CFString + + if CFStringTransform(mutableUserAgent, UnsafeMutablePointer(nil), transform, false) { + return mutableUserAgent as String + } + } + + return "Alamofire" + }() + + return [ + "Accept-Encoding": acceptEncoding, + "Accept-Language": acceptLanguage, + "User-Agent": userAgent + ] + }() + + let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL) + + /// The underlying session. + public let session: NSURLSession + + /// The session delegate handling all the task and session delegate callbacks. + public let delegate: SessionDelegate + + /// Whether to start requests immediately after being constructed. `true` by default. + public var startRequestsImmediately: Bool = true + + /** + The background completion handler closure provided by the UIApplicationDelegate + `application:handleEventsForBackgroundURLSession:completionHandler:` method. By setting the background + completion handler, the SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` closure implementation + will automatically call the handler. + + If you need to handle your own events before the handler is called, then you need to override the + SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` and manually call the handler when finished. + + `nil` by default. + */ + public var backgroundCompletionHandler: (() -> Void)? + + // MARK: - Lifecycle + + /** + Initializes the `Manager` instance with the given configuration and server trust policy. + + - parameter configuration: The configuration used to construct the managed session. + `NSURLSessionConfiguration.defaultSessionConfiguration()` by default. + - parameter serverTrustPolicyManager: The server trust policy manager to use for evaluating all server trust + challenges. `nil` by default. + + - returns: The new `Manager` instance. + */ + public init( + configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration(), + serverTrustPolicyManager: ServerTrustPolicyManager? = nil) + { + self.delegate = SessionDelegate() + self.session = NSURLSession(configuration: configuration, delegate: self.delegate, delegateQueue: nil) + self.session.serverTrustPolicyManager = serverTrustPolicyManager + + self.delegate.sessionDidFinishEventsForBackgroundURLSession = { [weak self] session in + guard let strongSelf = self else { return } + dispatch_async(dispatch_get_main_queue()) { strongSelf.backgroundCompletionHandler?() } + } + } + + deinit { + session.invalidateAndCancel() + } + + // MARK: - Request + + /** + Creates a request for the specified method, URL string, parameters, parameter encoding and headers. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter parameters: The parameters. `nil` by default. + - parameter encoding: The parameter encoding. `.URL` by default. + - parameter headers: The HTTP headers. `nil` by default. + + - returns: The created request. + */ + public func request( + method: Method, + _ URLString: URLStringConvertible, + parameters: [String: AnyObject]? = nil, + encoding: ParameterEncoding = .URL, + headers: [String: String]? = nil) + -> Request + { + let mutableURLRequest = URLRequest(method, URLString, headers: headers) + let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0 + return request(encodedURLRequest) + } + + /** + Creates a request for the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter URLRequest: The URL request + + - returns: The created request. + */ + public func request(URLRequest: URLRequestConvertible) -> Request { + var dataTask: NSURLSessionDataTask! + + dispatch_sync(queue) { + dataTask = self.session.dataTaskWithRequest(URLRequest.URLRequest) + } + + let request = Request(session: session, task: dataTask) + delegate[request.delegate.task] = request.delegate + + if startRequestsImmediately { + request.resume() + } + + return request + } + + // MARK: - SessionDelegate + + /** + Responsible for handling all delegate callbacks for the underlying session. + */ + public final class SessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate { + private var subdelegates: [Int: Request.TaskDelegate] = [:] + private let subdelegateQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT) + + subscript(task: NSURLSessionTask) -> Request.TaskDelegate? { + get { + var subdelegate: Request.TaskDelegate? + dispatch_sync(subdelegateQueue) { + subdelegate = self.subdelegates[task.taskIdentifier] + } + + return subdelegate + } + + set { + dispatch_barrier_async(subdelegateQueue) { + self.subdelegates[task.taskIdentifier] = newValue + } + } + } + + // MARK: - NSURLSessionDelegate + + // MARK: Override Closures + + /// Overrides default behavior for NSURLSessionDelegate method `URLSession:didBecomeInvalidWithError:`. + public var sessionDidBecomeInvalidWithError: ((NSURLSession, NSError?) -> Void)? + + /// Overrides default behavior for NSURLSessionDelegate method `URLSession:didReceiveChallenge:completionHandler:`. + public var sessionDidReceiveChallenge: ((NSURLSession, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))? + + /// Overrides default behavior for NSURLSessionDelegate method `URLSessionDidFinishEventsForBackgroundURLSession:`. + public var sessionDidFinishEventsForBackgroundURLSession: ((NSURLSession) -> Void)? + + // MARK: Delegate Methods + + /** + Tells the delegate that the session has been invalidated. + + - parameter session: The session object that was invalidated. + - parameter error: The error that caused invalidation, or nil if the invalidation was explicit. + */ + public func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) { + sessionDidBecomeInvalidWithError?(session, error) + } + + /** + Requests credentials from the delegate in response to a session-level authentication request from the remote server. + + - parameter session: The session containing the task that requested authentication. + - parameter challenge: An object that contains the request for authentication. + - parameter completionHandler: A handler that your delegate method must call providing the disposition and credential. + */ + public func URLSession( + session: NSURLSession, + didReceiveChallenge challenge: NSURLAuthenticationChallenge, + completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)) + { + var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling + var credential: NSURLCredential? + + if let sessionDidReceiveChallenge = sessionDidReceiveChallenge { + (disposition, credential) = sessionDidReceiveChallenge(session, challenge) + } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { + let host = challenge.protectionSpace.host + + if let + serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicyForHost(host), + serverTrust = challenge.protectionSpace.serverTrust + { + if serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host) { + disposition = .UseCredential + credential = NSURLCredential(forTrust: serverTrust) + } else { + disposition = .CancelAuthenticationChallenge + } + } + } + + completionHandler(disposition, credential) + } + + /** + Tells the delegate that all messages enqueued for a session have been delivered. + + - parameter session: The session that no longer has any outstanding requests. + */ + public func URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) { + sessionDidFinishEventsForBackgroundURLSession?(session) + } + + // MARK: - NSURLSessionTaskDelegate + + // MARK: Override Closures + + /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:`. + public var taskWillPerformHTTPRedirection: ((NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest) -> NSURLRequest?)? + + /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didReceiveChallenge:completionHandler:`. + public var taskDidReceiveChallenge: ((NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))? + + /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:session:task:needNewBodyStream:`. + public var taskNeedNewBodyStream: ((NSURLSession, NSURLSessionTask) -> NSInputStream!)? + + /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`. + public var taskDidSendBodyData: ((NSURLSession, NSURLSessionTask, Int64, Int64, Int64) -> Void)? + + /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didCompleteWithError:`. + public var taskDidComplete: ((NSURLSession, NSURLSessionTask, NSError?) -> Void)? + + // MARK: Delegate Methods + + /** + Tells the delegate that the remote server requested an HTTP redirect. + + - parameter session: The session containing the task whose request resulted in a redirect. + - parameter task: The task whose request resulted in a redirect. + - parameter response: An object containing the server’s response to the original request. + - parameter request: A URL request object filled out with the new location. + - parameter completionHandler: A closure that your handler should call with either the value of the request + parameter, a modified URL request object, or NULL to refuse the redirect and + return the body of the redirect response. + */ + public func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + willPerformHTTPRedirection response: NSHTTPURLResponse, + newRequest request: NSURLRequest, + completionHandler: ((NSURLRequest?) -> Void)) + { + var redirectRequest: NSURLRequest? = request + + if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection { + redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request) + } + + completionHandler(redirectRequest) + } + + /** + Requests credentials from the delegate in response to an authentication request from the remote server. + + - parameter session: The session containing the task whose request requires authentication. + - parameter task: The task whose request requires authentication. + - parameter challenge: An object that contains the request for authentication. + - parameter completionHandler: A handler that your delegate method must call providing the disposition and credential. + */ + public func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + didReceiveChallenge challenge: NSURLAuthenticationChallenge, + completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)) + { + if let taskDidReceiveChallenge = taskDidReceiveChallenge { + completionHandler(taskDidReceiveChallenge(session, task, challenge)) + } else if let delegate = self[task] { + delegate.URLSession( + session, + task: task, + didReceiveChallenge: challenge, + completionHandler: completionHandler + ) + } else { + URLSession(session, didReceiveChallenge: challenge, completionHandler: completionHandler) + } + } + + /** + Tells the delegate when a task requires a new request body stream to send to the remote server. + + - parameter session: The session containing the task that needs a new body stream. + - parameter task: The task that needs a new body stream. + - parameter completionHandler: A completion handler that your delegate method should call with the new body stream. + */ + public func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + needNewBodyStream completionHandler: ((NSInputStream?) -> Void)) + { + if let taskNeedNewBodyStream = taskNeedNewBodyStream { + completionHandler(taskNeedNewBodyStream(session, task)) + } else if let delegate = self[task] { + delegate.URLSession(session, task: task, needNewBodyStream: completionHandler) + } + } + + /** + Periodically informs the delegate of the progress of sending body content to the server. + + - parameter session: The session containing the data task. + - parameter task: The data task. + - parameter bytesSent: The number of bytes sent since the last time this delegate method was called. + - parameter totalBytesSent: The total number of bytes sent so far. + - parameter totalBytesExpectedToSend: The expected length of the body data. + */ + public func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) + { + if let taskDidSendBodyData = taskDidSendBodyData { + taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend) + } else if let delegate = self[task] as? Request.UploadTaskDelegate { + delegate.URLSession( + session, + task: task, + didSendBodyData: bytesSent, + totalBytesSent: totalBytesSent, + totalBytesExpectedToSend: totalBytesExpectedToSend + ) + } + } + + /** + Tells the delegate that the task finished transferring data. + + - parameter session: The session containing the task whose request finished transferring data. + - parameter task: The task whose request finished transferring data. + - parameter error: If an error occurred, an error object indicating how the transfer failed, otherwise nil. + */ + public func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { + if let taskDidComplete = taskDidComplete { + taskDidComplete(session, task, error) + } else if let delegate = self[task] { + delegate.URLSession(session, task: task, didCompleteWithError: error) + } + + self[task] = nil + } + + // MARK: - NSURLSessionDataDelegate + + // MARK: Override Closures + + /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didReceiveResponse:completionHandler:`. + public var dataTaskDidReceiveResponse: ((NSURLSession, NSURLSessionDataTask, NSURLResponse) -> NSURLSessionResponseDisposition)? + + /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didBecomeDownloadTask:`. + public var dataTaskDidBecomeDownloadTask: ((NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask) -> Void)? + + /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didReceiveData:`. + public var dataTaskDidReceiveData: ((NSURLSession, NSURLSessionDataTask, NSData) -> Void)? + + /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:willCacheResponse:completionHandler:`. + public var dataTaskWillCacheResponse: ((NSURLSession, NSURLSessionDataTask, NSCachedURLResponse) -> NSCachedURLResponse!)? + + // MARK: Delegate Methods + + /** + Tells the delegate that the data task received the initial reply (headers) from the server. + + - parameter session: The session containing the data task that received an initial reply. + - parameter dataTask: The data task that received an initial reply. + - parameter response: A URL response object populated with headers. + - parameter completionHandler: A completion handler that your code calls to continue the transfer, passing a + constant to indicate whether the transfer should continue as a data task or + should become a download task. + */ + public func URLSession( + session: NSURLSession, + dataTask: NSURLSessionDataTask, + didReceiveResponse response: NSURLResponse, + completionHandler: ((NSURLSessionResponseDisposition) -> Void)) + { + var disposition: NSURLSessionResponseDisposition = .Allow + + if let dataTaskDidReceiveResponse = dataTaskDidReceiveResponse { + disposition = dataTaskDidReceiveResponse(session, dataTask, response) + } + + completionHandler(disposition) + } + + /** + Tells the delegate that the data task was changed to a download task. + + - parameter session: The session containing the task that was replaced by a download task. + - parameter dataTask: The data task that was replaced by a download task. + - parameter downloadTask: The new download task that replaced the data task. + */ + public func URLSession( + session: NSURLSession, + dataTask: NSURLSessionDataTask, + didBecomeDownloadTask downloadTask: NSURLSessionDownloadTask) + { + if let dataTaskDidBecomeDownloadTask = dataTaskDidBecomeDownloadTask { + dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask) + } else { + let downloadDelegate = Request.DownloadTaskDelegate(task: downloadTask) + self[downloadTask] = downloadDelegate + } + } + + /** + Tells the delegate that the data task has received some of the expected data. + + - parameter session: The session containing the data task that provided data. + - parameter dataTask: The data task that provided data. + - parameter data: A data object containing the transferred data. + */ + public func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { + if let dataTaskDidReceiveData = dataTaskDidReceiveData { + dataTaskDidReceiveData(session, dataTask, data) + } else if let delegate = self[dataTask] as? Request.DataTaskDelegate { + delegate.URLSession(session, dataTask: dataTask, didReceiveData: data) + } + } + + /** + Asks the delegate whether the data (or upload) task should store the response in the cache. + + - parameter session: The session containing the data (or upload) task. + - parameter dataTask: The data (or upload) task. + - parameter proposedResponse: The default caching behavior. This behavior is determined based on the current + caching policy and the values of certain received headers, such as the Pragma + and Cache-Control headers. + - parameter completionHandler: A block that your handler must call, providing either the original proposed + response, a modified version of that response, or NULL to prevent caching the + response. If your delegate implements this method, it must call this completion + handler; otherwise, your app leaks memory. + */ + public func URLSession( + session: NSURLSession, + dataTask: NSURLSessionDataTask, + willCacheResponse proposedResponse: NSCachedURLResponse, + completionHandler: ((NSCachedURLResponse?) -> Void)) + { + if let dataTaskWillCacheResponse = dataTaskWillCacheResponse { + completionHandler(dataTaskWillCacheResponse(session, dataTask, proposedResponse)) + } else if let delegate = self[dataTask] as? Request.DataTaskDelegate { + delegate.URLSession( + session, + dataTask: dataTask, + willCacheResponse: proposedResponse, + completionHandler: completionHandler + ) + } else { + completionHandler(proposedResponse) + } + } + + // MARK: - NSURLSessionDownloadDelegate + + // MARK: Override Closures + + /// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didFinishDownloadingToURL:`. + public var downloadTaskDidFinishDownloadingToURL: ((NSURLSession, NSURLSessionDownloadTask, NSURL) -> Void)? + + /// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:`. + public var downloadTaskDidWriteData: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64, Int64) -> Void)? + + /// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`. + public var downloadTaskDidResumeAtOffset: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64) -> Void)? + + // MARK: Delegate Methods + + /** + Tells the delegate that a download task has finished downloading. + + - parameter session: The session containing the download task that finished. + - parameter downloadTask: The download task that finished. + - parameter location: A file URL for the temporary file. Because the file is temporary, you must either + open the file for reading or move it to a permanent location in your app’s sandbox + container directory before returning from this delegate method. + */ + public func URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didFinishDownloadingToURL location: NSURL) + { + if let downloadTaskDidFinishDownloadingToURL = downloadTaskDidFinishDownloadingToURL { + downloadTaskDidFinishDownloadingToURL(session, downloadTask, location) + } else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate { + delegate.URLSession(session, downloadTask: downloadTask, didFinishDownloadingToURL: location) + } + } + + /** + Periodically informs the delegate about the download’s progress. + + - parameter session: The session containing the download task. + - parameter downloadTask: The download task. + - parameter bytesWritten: The number of bytes transferred since the last time this delegate + method was called. + - parameter totalBytesWritten: The total number of bytes transferred so far. + - parameter totalBytesExpectedToWrite: The expected length of the file, as provided by the Content-Length + header. If this header was not provided, the value is + `NSURLSessionTransferSizeUnknown`. + */ + public func URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) + { + if let downloadTaskDidWriteData = downloadTaskDidWriteData { + downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) + } else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate { + delegate.URLSession( + session, + downloadTask: downloadTask, + didWriteData: bytesWritten, + totalBytesWritten: totalBytesWritten, + totalBytesExpectedToWrite: totalBytesExpectedToWrite + ) + } + } + + /** + Tells the delegate that the download task has resumed downloading. + + - parameter session: The session containing the download task that finished. + - parameter downloadTask: The download task that resumed. See explanation in the discussion. + - parameter fileOffset: If the file's cache policy or last modified date prevents reuse of the + existing content, then this value is zero. Otherwise, this value is an + integer representing the number of bytes on disk that do not need to be + retrieved again. + - parameter expectedTotalBytes: The expected length of the file, as provided by the Content-Length header. + If this header was not provided, the value is NSURLSessionTransferSizeUnknown. + */ + public func URLSession( + session: NSURLSession, + downloadTask: NSURLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) + { + if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset { + downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes) + } else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate { + delegate.URLSession( + session, + downloadTask: downloadTask, + didResumeAtOffset: fileOffset, + expectedTotalBytes: expectedTotalBytes + ) + } + } + + // MARK: - NSURLSessionStreamDelegate + + var _streamTaskReadClosed: Any? + var _streamTaskWriteClosed: Any? + var _streamTaskBetterRouteDiscovered: Any? + var _streamTaskDidBecomeInputStream: Any? + + // MARK: - NSObject + + public override func respondsToSelector(selector: Selector) -> Bool { + switch selector { + case "URLSession:didBecomeInvalidWithError:": + return sessionDidBecomeInvalidWithError != nil + case "URLSession:didReceiveChallenge:completionHandler:": + return sessionDidReceiveChallenge != nil + case "URLSessionDidFinishEventsForBackgroundURLSession:": + return sessionDidFinishEventsForBackgroundURLSession != nil + case "URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:": + return taskWillPerformHTTPRedirection != nil + case "URLSession:dataTask:didReceiveResponse:completionHandler:": + return dataTaskDidReceiveResponse != nil + default: + return self.dynamicType.instancesRespondToSelector(selector) + } + } + } +} diff --git a/Pods/Alamofire/Source/MultipartFormData.swift b/Pods/Alamofire/Source/MultipartFormData.swift new file mode 100644 index 0000000..24d952c --- /dev/null +++ b/Pods/Alamofire/Source/MultipartFormData.swift @@ -0,0 +1,669 @@ +// MultipartFormData.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +#if os(iOS) || os(watchOS) +import MobileCoreServices +#elseif os(OSX) +import CoreServices +#endif + +/** + Constructs `multipart/form-data` for uploads within an HTTP or HTTPS body. There are currently two ways to encode + multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead + to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the + data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for + larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset. + + For more information on `multipart/form-data` in general, please refer to the RFC-2388 and RFC-2045 specs as well + and the w3 form documentation. + + - https://www.ietf.org/rfc/rfc2388.txt + - https://www.ietf.org/rfc/rfc2045.txt + - https://www.w3.org/TR/html401/interact/forms.html#h-17.13 +*/ +public class MultipartFormData { + + // MARK: - Helper Types + + struct EncodingCharacters { + static let CRLF = "\r\n" + } + + struct BoundaryGenerator { + enum BoundaryType { + case Initial, Encapsulated, Final + } + + static func randomBoundary() -> String { + return String(format: "alamofire.boundary.%08x%08x", arc4random(), arc4random()) + } + + static func boundaryData(boundaryType boundaryType: BoundaryType, boundary: String) -> NSData { + let boundaryText: String + + switch boundaryType { + case .Initial: + boundaryText = "--\(boundary)\(EncodingCharacters.CRLF)" + case .Encapsulated: + boundaryText = "\(EncodingCharacters.CRLF)--\(boundary)\(EncodingCharacters.CRLF)" + case .Final: + boundaryText = "\(EncodingCharacters.CRLF)--\(boundary)--\(EncodingCharacters.CRLF)" + } + + return boundaryText.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! + } + } + + class BodyPart { + let headers: [String: String] + let bodyStream: NSInputStream + let bodyContentLength: UInt64 + var hasInitialBoundary = false + var hasFinalBoundary = false + + init(headers: [String: String], bodyStream: NSInputStream, bodyContentLength: UInt64) { + self.headers = headers + self.bodyStream = bodyStream + self.bodyContentLength = bodyContentLength + } + } + + // MARK: - Properties + + /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`. + public var contentType: String { return "multipart/form-data; boundary=\(boundary)" } + + /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries. + public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } } + + /// The boundary used to separate the body parts in the encoded form data. + public let boundary: String + + private var bodyParts: [BodyPart] + private var bodyPartError: NSError? + private let streamBufferSize: Int + + // MARK: - Lifecycle + + /** + Creates a multipart form data object. + + - returns: The multipart form data object. + */ + public init() { + self.boundary = BoundaryGenerator.randomBoundary() + self.bodyParts = [] + + /** + * The optimal read/write buffer size in bytes for input and output streams is 1024 (1KB). For more + * information, please refer to the following article: + * - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html + */ + + self.streamBufferSize = 1024 + } + + // MARK: - Body Parts + + /** + Creates a body part from the data and appends it to the multipart form data object. + + The body part data will be encoded using the following format: + + - `Content-Disposition: form-data; name=#{name}` (HTTP Header) + - Encoded data + - Multipart form boundary + + - parameter data: The data to encode into the multipart form data. + - parameter name: The name to associate with the data in the `Content-Disposition` HTTP header. + */ + public func appendBodyPart(data data: NSData, name: String) { + let headers = contentHeaders(name: name) + let stream = NSInputStream(data: data) + let length = UInt64(data.length) + + appendBodyPart(stream: stream, length: length, headers: headers) + } + + /** + Creates a body part from the data and appends it to the multipart form data object. + + The body part data will be encoded using the following format: + + - `Content-Disposition: form-data; name=#{name}` (HTTP Header) + - `Content-Type: #{generated mimeType}` (HTTP Header) + - Encoded data + - Multipart form boundary + + - parameter data: The data to encode into the multipart form data. + - parameter name: The name to associate with the data in the `Content-Disposition` HTTP header. + - parameter mimeType: The MIME type to associate with the data content type in the `Content-Type` HTTP header. + */ + public func appendBodyPart(data data: NSData, name: String, mimeType: String) { + let headers = contentHeaders(name: name, mimeType: mimeType) + let stream = NSInputStream(data: data) + let length = UInt64(data.length) + + appendBodyPart(stream: stream, length: length, headers: headers) + } + + /** + Creates a body part from the data and appends it to the multipart form data object. + + The body part data will be encoded using the following format: + + - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header) + - `Content-Type: #{mimeType}` (HTTP Header) + - Encoded file data + - Multipart form boundary + + - parameter data: The data to encode into the multipart form data. + - parameter name: The name to associate with the data in the `Content-Disposition` HTTP header. + - parameter fileName: The filename to associate with the data in the `Content-Disposition` HTTP header. + - parameter mimeType: The MIME type to associate with the data in the `Content-Type` HTTP header. + */ + public func appendBodyPart(data data: NSData, name: String, fileName: String, mimeType: String) { + let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType) + let stream = NSInputStream(data: data) + let length = UInt64(data.length) + + appendBodyPart(stream: stream, length: length, headers: headers) + } + + /** + Creates a body part from the file and appends it to the multipart form data object. + + The body part data will be encoded using the following format: + + - `Content-Disposition: form-data; name=#{name}; filename=#{generated filename}` (HTTP Header) + - `Content-Type: #{generated mimeType}` (HTTP Header) + - Encoded file data + - Multipart form boundary + + The filename in the `Content-Disposition` HTTP header is generated from the last path component of the + `fileURL`. The `Content-Type` HTTP header MIME type is generated by mapping the `fileURL` extension to the + system associated MIME type. + + - parameter fileURL: The URL of the file whose content will be encoded into the multipart form data. + - parameter name: The name to associate with the file content in the `Content-Disposition` HTTP header. + */ + public func appendBodyPart(fileURL fileURL: NSURL, name: String) { + if let + fileName = fileURL.lastPathComponent, + pathExtension = fileURL.pathExtension + { + let mimeType = mimeTypeForPathExtension(pathExtension) + appendBodyPart(fileURL: fileURL, name: name, fileName: fileName, mimeType: mimeType) + } else { + let failureReason = "Failed to extract the fileName of the provided URL: \(fileURL)" + setBodyPartError(Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)) + } + } + + /** + Creates a body part from the file and appends it to the multipart form data object. + + The body part data will be encoded using the following format: + + - Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header) + - Content-Type: #{mimeType} (HTTP Header) + - Encoded file data + - Multipart form boundary + + - parameter fileURL: The URL of the file whose content will be encoded into the multipart form data. + - parameter name: The name to associate with the file content in the `Content-Disposition` HTTP header. + - parameter fileName: The filename to associate with the file content in the `Content-Disposition` HTTP header. + - parameter mimeType: The MIME type to associate with the file content in the `Content-Type` HTTP header. + */ + public func appendBodyPart(fileURL fileURL: NSURL, name: String, fileName: String, mimeType: String) { + let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType) + + //============================================================ + // Check 1 - is file URL? + //============================================================ + + guard fileURL.fileURL else { + let failureReason = "The file URL does not point to a file URL: \(fileURL)" + let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) + setBodyPartError(error) + return + } + + //============================================================ + // Check 2 - is file URL reachable? + //============================================================ + + var isReachable = true + + if #available(OSX 10.10, *) { + isReachable = fileURL.checkPromisedItemIsReachableAndReturnError(nil) + } + + guard isReachable else { + let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: "The file URL is not reachable: \(fileURL)") + setBodyPartError(error) + return + } + + //============================================================ + // Check 3 - is file URL a directory? + //============================================================ + + var isDirectory: ObjCBool = false + + guard let + path = fileURL.path + where NSFileManager.defaultManager().fileExistsAtPath(path, isDirectory: &isDirectory) && !isDirectory else + { + let failureReason = "The file URL is a directory, not a file: \(fileURL)" + let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) + setBodyPartError(error) + return + } + + //============================================================ + // Check 4 - can the file size be extracted? + //============================================================ + + var bodyContentLength: UInt64? + + do { + if let + path = fileURL.path, + fileSize = try NSFileManager.defaultManager().attributesOfItemAtPath(path)[NSFileSize] as? NSNumber + { + bodyContentLength = fileSize.unsignedLongLongValue + } + } catch { + // No-op + } + + guard let length = bodyContentLength else { + let failureReason = "Could not fetch attributes from the file URL: \(fileURL)" + let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) + setBodyPartError(error) + return + } + + //============================================================ + // Check 5 - can a stream be created from file URL? + //============================================================ + + guard let stream = NSInputStream(URL: fileURL) else { + let failureReason = "Failed to create an input stream from the file URL: \(fileURL)" + let error = Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason) + setBodyPartError(error) + return + } + + appendBodyPart(stream: stream, length: length, headers: headers) + } + + /** + Creates a body part from the stream and appends it to the multipart form data object. + + The body part data will be encoded using the following format: + + - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header) + - `Content-Type: #{mimeType}` (HTTP Header) + - Encoded stream data + - Multipart form boundary + + - parameter stream: The input stream to encode in the multipart form data. + - parameter length: The content length of the stream. + - parameter name: The name to associate with the stream content in the `Content-Disposition` HTTP header. + - parameter fileName: The filename to associate with the stream content in the `Content-Disposition` HTTP header. + - parameter mimeType: The MIME type to associate with the stream content in the `Content-Type` HTTP header. + */ + public func appendBodyPart( + stream stream: NSInputStream, + length: UInt64, + name: String, + fileName: String, + mimeType: String) + { + let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType) + appendBodyPart(stream: stream, length: length, headers: headers) + } + + /** + Creates a body part with the headers, stream and length and appends it to the multipart form data object. + + The body part data will be encoded using the following format: + + - HTTP headers + - Encoded stream data + - Multipart form boundary + + - parameter stream: The input stream to encode in the multipart form data. + - parameter length: The content length of the stream. + - parameter headers: The HTTP headers for the body part. + */ + public func appendBodyPart(stream stream: NSInputStream, length: UInt64, headers: [String: String]) { + let bodyPart = BodyPart(headers: headers, bodyStream: stream, bodyContentLength: length) + bodyParts.append(bodyPart) + } + + // MARK: - Data Encoding + + /** + Encodes all the appended body parts into a single `NSData` object. + + It is important to note that this method will load all the appended body parts into memory all at the same + time. This method should only be used when the encoded data will have a small memory footprint. For large data + cases, please use the `writeEncodedDataToDisk(fileURL:completionHandler:)` method. + + - throws: An `NSError` if encoding encounters an error. + + - returns: The encoded `NSData` if encoding is successful. + */ + public func encode() throws -> NSData { + if let bodyPartError = bodyPartError { + throw bodyPartError + } + + let encoded = NSMutableData() + + bodyParts.first?.hasInitialBoundary = true + bodyParts.last?.hasFinalBoundary = true + + for bodyPart in bodyParts { + let encodedData = try encodeBodyPart(bodyPart) + encoded.appendData(encodedData) + } + + return encoded + } + + /** + Writes the appended body parts into the given file URL. + + This process is facilitated by reading and writing with input and output streams, respectively. Thus, + this approach is very memory efficient and should be used for large body part data. + + - parameter fileURL: The file URL to write the multipart form data into. + + - throws: An `NSError` if encoding encounters an error. + */ + public func writeEncodedDataToDisk(fileURL: NSURL) throws { + if let bodyPartError = bodyPartError { + throw bodyPartError + } + + if let path = fileURL.path where NSFileManager.defaultManager().fileExistsAtPath(path) { + let failureReason = "A file already exists at the given file URL: \(fileURL)" + throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) + } else if !fileURL.fileURL { + let failureReason = "The URL does not point to a valid file: \(fileURL)" + throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason) + } + + let outputStream: NSOutputStream + + if let possibleOutputStream = NSOutputStream(URL: fileURL, append: false) { + outputStream = possibleOutputStream + } else { + let failureReason = "Failed to create an output stream with the given URL: \(fileURL)" + throw Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason) + } + + outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) + outputStream.open() + + self.bodyParts.first?.hasInitialBoundary = true + self.bodyParts.last?.hasFinalBoundary = true + + for bodyPart in self.bodyParts { + try writeBodyPart(bodyPart, toOutputStream: outputStream) + } + + outputStream.close() + outputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) + } + + // MARK: - Private - Body Part Encoding + + private func encodeBodyPart(bodyPart: BodyPart) throws -> NSData { + let encoded = NSMutableData() + + let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData() + encoded.appendData(initialData) + + let headerData = encodeHeaderDataForBodyPart(bodyPart) + encoded.appendData(headerData) + + let bodyStreamData = try encodeBodyStreamDataForBodyPart(bodyPart) + encoded.appendData(bodyStreamData) + + if bodyPart.hasFinalBoundary { + encoded.appendData(finalBoundaryData()) + } + + return encoded + } + + private func encodeHeaderDataForBodyPart(bodyPart: BodyPart) -> NSData { + var headerText = "" + + for (key, value) in bodyPart.headers { + headerText += "\(key): \(value)\(EncodingCharacters.CRLF)" + } + headerText += EncodingCharacters.CRLF + + return headerText.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! + } + + private func encodeBodyStreamDataForBodyPart(bodyPart: BodyPart) throws -> NSData { + let inputStream = bodyPart.bodyStream + inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) + inputStream.open() + + var error: NSError? + let encoded = NSMutableData() + + while inputStream.hasBytesAvailable { + var buffer = [UInt8](count: streamBufferSize, repeatedValue: 0) + let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize) + + if inputStream.streamError != nil { + error = inputStream.streamError + break + } + + if bytesRead > 0 { + encoded.appendBytes(buffer, length: bytesRead) + } else if bytesRead < 0 { + let failureReason = "Failed to read from input stream: \(inputStream)" + error = Error.errorWithCode(.InputStreamReadFailed, failureReason: failureReason) + break + } else { + break + } + } + + inputStream.close() + inputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) + + if let error = error { + throw error + } + + return encoded + } + + // MARK: - Private - Writing Body Part to Output Stream + + private func writeBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws { + try writeInitialBoundaryDataForBodyPart(bodyPart, toOutputStream: outputStream) + try writeHeaderDataForBodyPart(bodyPart, toOutputStream: outputStream) + try writeBodyStreamForBodyPart(bodyPart, toOutputStream: outputStream) + try writeFinalBoundaryDataForBodyPart(bodyPart, toOutputStream: outputStream) + } + + private func writeInitialBoundaryDataForBodyPart( + bodyPart: BodyPart, + toOutputStream outputStream: NSOutputStream) + throws + { + let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData() + return try writeData(initialData, toOutputStream: outputStream) + } + + private func writeHeaderDataForBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws { + let headerData = encodeHeaderDataForBodyPart(bodyPart) + return try writeData(headerData, toOutputStream: outputStream) + } + + private func writeBodyStreamForBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws { + let inputStream = bodyPart.bodyStream + inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) + inputStream.open() + + while inputStream.hasBytesAvailable { + var buffer = [UInt8](count: streamBufferSize, repeatedValue: 0) + let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize) + + if let streamError = inputStream.streamError { + throw streamError + } + + if bytesRead > 0 { + if buffer.count != bytesRead { + buffer = Array(buffer[0.. 0 { + if outputStream.hasSpaceAvailable { + let bytesWritten = outputStream.write(buffer, maxLength: bytesToWrite) + + if let streamError = outputStream.streamError { + throw streamError + } + + if bytesWritten < 0 { + let failureReason = "Failed to write to output stream: \(outputStream)" + throw Error.errorWithCode(.OutputStreamWriteFailed, failureReason: failureReason) + } + + bytesToWrite -= bytesWritten + + if bytesToWrite > 0 { + buffer = Array(buffer[bytesWritten.. String { + if let + id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil)?.takeRetainedValue(), + contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() + { + return contentType as String + } + + return "application/octet-stream" + } + + // MARK: - Private - Content Headers + + private func contentHeaders(name name: String) -> [String: String] { + return ["Content-Disposition": "form-data; name=\"\(name)\""] + } + + private func contentHeaders(name name: String, mimeType: String) -> [String: String] { + return [ + "Content-Disposition": "form-data; name=\"\(name)\"", + "Content-Type": "\(mimeType)" + ] + } + + private func contentHeaders(name name: String, fileName: String, mimeType: String) -> [String: String] { + return [ + "Content-Disposition": "form-data; name=\"\(name)\"; filename=\"\(fileName)\"", + "Content-Type": "\(mimeType)" + ] + } + + // MARK: - Private - Boundary Encoding + + private func initialBoundaryData() -> NSData { + return BoundaryGenerator.boundaryData(boundaryType: .Initial, boundary: boundary) + } + + private func encapsulatedBoundaryData() -> NSData { + return BoundaryGenerator.boundaryData(boundaryType: .Encapsulated, boundary: boundary) + } + + private func finalBoundaryData() -> NSData { + return BoundaryGenerator.boundaryData(boundaryType: .Final, boundary: boundary) + } + + // MARK: - Private - Errors + + private func setBodyPartError(error: NSError) { + if bodyPartError == nil { + bodyPartError = error + } + } +} diff --git a/Pods/Alamofire/Source/ParameterEncoding.swift b/Pods/Alamofire/Source/ParameterEncoding.swift new file mode 100644 index 0000000..94f7d42 --- /dev/null +++ b/Pods/Alamofire/Source/ParameterEncoding.swift @@ -0,0 +1,245 @@ +// ParameterEncoding.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +/** + HTTP method definitions. + + See https://tools.ietf.org/html/rfc7231#section-4.3 +*/ +public enum Method: String { + case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT +} + +// MARK: ParameterEncoding + +/** + Used to specify the way in which a set of parameters are applied to a URL request. + + - `URL`: Creates a query string to be set as or appended to any existing URL query for `GET`, `HEAD`, + and `DELETE` requests, or set as the body for requests with any other HTTP method. The + `Content-Type` HTTP header field of an encoded request with HTTP body is set to + `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification + for how to encode collection types, the convention of appending `[]` to the key for array + values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested + dictionary values (`foo[bar]=baz`). + + - `URLEncodedInURL`: Creates query string to be set as or appended to any existing URL query. Uses the same + implementation as the `.URL` case, but always applies the encoded result to the URL. + + - `JSON`: Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is + set as the body of the request. The `Content-Type` HTTP header field of an encoded request is + set to `application/json`. + + - `PropertyList`: Uses `NSPropertyListSerialization` to create a plist representation of the parameters object, + according to the associated format and write options values, which is set as the body of the + request. The `Content-Type` HTTP header field of an encoded request is set to + `application/x-plist`. + + - `Custom`: Uses the associated closure value to construct a new request given an existing request and + parameters. +*/ +public enum ParameterEncoding { + case URL + case URLEncodedInURL + case JSON + case PropertyList(NSPropertyListFormat, NSPropertyListWriteOptions) + case Custom((URLRequestConvertible, [String: AnyObject]?) -> (NSMutableURLRequest, NSError?)) + + /** + Creates a URL request by encoding parameters and applying them onto an existing request. + + - parameter URLRequest: The request to have parameters applied + - parameter parameters: The parameters to apply + + - returns: A tuple containing the constructed request and the error that occurred during parameter encoding, + if any. + */ + public func encode( + URLRequest: URLRequestConvertible, + parameters: [String: AnyObject]?) + -> (NSMutableURLRequest, NSError?) + { + var mutableURLRequest = URLRequest.URLRequest + + guard let parameters = parameters else { + return (mutableURLRequest, nil) + } + + var encodingError: NSError? = nil + + switch self { + case .URL, .URLEncodedInURL: + func query(parameters: [String: AnyObject]) -> String { + var components: [(String, String)] = [] + for key in Array(parameters.keys).sort(<) { + let value = parameters[key]! + components += queryComponents(key, value) + } + + return (components.map { "\($0)=\($1)" } as [String]).joinWithSeparator("&") + } + + func encodesParametersInURL(method: Method) -> Bool { + switch self { + case .URLEncodedInURL: + return true + default: + break + } + + switch method { + case .GET, .HEAD, .DELETE: + return true + default: + return false + } + } + + if let method = Method(rawValue: mutableURLRequest.HTTPMethod) where encodesParametersInURL(method) { + if let URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false) { + let percentEncodedQuery = (URLComponents.percentEncodedQuery.map { $0 + "&" } ?? "") + query(parameters) + URLComponents.percentEncodedQuery = percentEncodedQuery + mutableURLRequest.URL = URLComponents.URL + } + } else { + if mutableURLRequest.valueForHTTPHeaderField("Content-Type") == nil { + mutableURLRequest.setValue( + "application/x-www-form-urlencoded; charset=utf-8", + forHTTPHeaderField: "Content-Type" + ) + } + + mutableURLRequest.HTTPBody = query(parameters).dataUsingEncoding( + NSUTF8StringEncoding, + allowLossyConversion: false + ) + } + case .JSON: + do { + let options = NSJSONWritingOptions() + let data = try NSJSONSerialization.dataWithJSONObject(parameters, options: options) + + mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") + mutableURLRequest.HTTPBody = data + } catch { + encodingError = error as NSError + } + case .PropertyList(let format, let options): + do { + let data = try NSPropertyListSerialization.dataWithPropertyList( + parameters, + format: format, + options: options + ) + mutableURLRequest.setValue("application/x-plist", forHTTPHeaderField: "Content-Type") + mutableURLRequest.HTTPBody = data + } catch { + encodingError = error as NSError + } + case .Custom(let closure): + (mutableURLRequest, encodingError) = closure(mutableURLRequest, parameters) + } + + return (mutableURLRequest, encodingError) + } + + /** + Creates percent-escaped, URL encoded query string components from the given key-value pair using recursion. + + - parameter key: The key of the query component. + - parameter value: The value of the query component. + + - returns: The percent-escaped, URL encoded query string components. + */ + public func queryComponents(key: String, _ value: AnyObject) -> [(String, String)] { + var components: [(String, String)] = [] + if let dictionary = value as? [String: AnyObject] { + for (nestedKey, value) in dictionary { + components += queryComponents("\(key)[\(nestedKey)]", value) + } + } else if let array = value as? [AnyObject] { + for value in array { + components += queryComponents("\(key)[]", value) + } + } else { + components.append((escape(key), escape("\(value)"))) + } + + return components + } + + /** + Returns a percent-escaped string following RFC 3986 for a query string key or value. + + RFC 3986 states that the following characters are "reserved" characters. + + - General Delimiters: ":", "#", "[", "]", "@", "?", "/" + - Sub-Delimiters: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=" + + In RFC 3986 - Section 3.4, it states that the "?" and "/" characters should not be escaped to allow + query strings to include a URL. Therefore, all "reserved" characters with the exception of "?" and "/" + should be percent-escaped in the query string. + + - parameter string: The string to be percent-escaped. + + - returns: The percent-escaped string. + */ + public func escape(string: String) -> String { + let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 + let subDelimitersToEncode = "!$&'()*+,;=" + + let allowedCharacterSet = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet + allowedCharacterSet.removeCharactersInString(generalDelimitersToEncode + subDelimitersToEncode) + + //========================================================================================================== + // + // Batching is required for escaping due to an internal bug in iOS 8.1 and 8.2. Encoding more than a few + // hundred Chinense characters causes various malloc error crashes. To avoid this issue until iOS 8 is no + // longer supported, batching MUST be used for encoding. This introduces roughly a 20% overhead. For more + // info, please refer to: + // + // - https://github.com/Alamofire/Alamofire/issues/206 + // + //========================================================================================================== + + let batchSize = 50 + var index = string.startIndex + + var escaped = "" + + while index != string.endIndex { + let startIndex = index + let endIndex = index.advancedBy(batchSize, limit: string.endIndex) + let range = Range(start: startIndex, end: endIndex) + + let substring = string.substringWithRange(range) + + escaped += substring.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet) ?? substring + + index = endIndex + } + + return escaped + } +} diff --git a/Pods/Alamofire/Source/Request.swift b/Pods/Alamofire/Source/Request.swift new file mode 100644 index 0000000..8df4856 --- /dev/null +++ b/Pods/Alamofire/Source/Request.swift @@ -0,0 +1,536 @@ +// Request.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +/** + Responsible for sending a request and receiving the response and associated data from the server, as well as + managing its underlying `NSURLSessionTask`. +*/ +public class Request { + + // MARK: - Properties + + /// The delegate for the underlying task. + public let delegate: TaskDelegate + + /// The underlying task. + public var task: NSURLSessionTask { return delegate.task } + + /// The session belonging to the underlying task. + public let session: NSURLSession + + /// The request sent or to be sent to the server. + public var request: NSURLRequest? { return task.originalRequest } + + /// The response received from the server, if any. + public var response: NSHTTPURLResponse? { return task.response as? NSHTTPURLResponse } + + /// The progress of the request lifecycle. + public var progress: NSProgress { return delegate.progress } + + // MARK: - Lifecycle + + init(session: NSURLSession, task: NSURLSessionTask) { + self.session = session + + switch task { + case is NSURLSessionUploadTask: + self.delegate = UploadTaskDelegate(task: task) + case is NSURLSessionDataTask: + self.delegate = DataTaskDelegate(task: task) + case is NSURLSessionDownloadTask: + self.delegate = DownloadTaskDelegate(task: task) + default: + self.delegate = TaskDelegate(task: task) + } + } + + // MARK: - Authentication + + /** + Associates an HTTP Basic credential with the request. + + - parameter user: The user. + - parameter password: The password. + - parameter persistence: The URL credential persistence. `.ForSession` by default. + + - returns: The request. + */ + public func authenticate( + user user: String, + password: String, + persistence: NSURLCredentialPersistence = .ForSession) + -> Self + { + let credential = NSURLCredential(user: user, password: password, persistence: persistence) + + return authenticate(usingCredential: credential) + } + + /** + Associates a specified credential with the request. + + - parameter credential: The credential. + + - returns: The request. + */ + public func authenticate(usingCredential credential: NSURLCredential) -> Self { + delegate.credential = credential + + return self + } + + // MARK: - Progress + + /** + Sets a closure to be called periodically during the lifecycle of the request as data is written to or read + from the server. + + - For uploads, the progress closure returns the bytes written, total bytes written, and total bytes expected + to write. + - For downloads and data tasks, the progress closure returns the bytes read, total bytes read, and total bytes + expected to read. + + - parameter closure: The code to be executed periodically during the lifecycle of the request. + + - returns: The request. + */ + public func progress(closure: ((Int64, Int64, Int64) -> Void)? = nil) -> Self { + if let uploadDelegate = delegate as? UploadTaskDelegate { + uploadDelegate.uploadProgress = closure + } else if let dataDelegate = delegate as? DataTaskDelegate { + dataDelegate.dataProgress = closure + } else if let downloadDelegate = delegate as? DownloadTaskDelegate { + downloadDelegate.downloadProgress = closure + } + + return self + } + + /** + Sets a closure to be called periodically during the lifecycle of the request as data is read from the server. + + This closure returns the bytes most recently received from the server, not including data from previous calls. + If this closure is set, data will only be available within this closure, and will not be saved elsewhere. It is + also important to note that the `response` closure will be called with nil `responseData`. + + - parameter closure: The code to be executed periodically during the lifecycle of the request. + + - returns: The request. + */ + public func stream(closure: (NSData -> Void)? = nil) -> Self { + if let dataDelegate = delegate as? DataTaskDelegate { + dataDelegate.dataStream = closure + } + + return self + } + + // MARK: - State + + /** + Suspends the request. + */ + public func suspend() { + task.suspend() + } + + /** + Resumes the request. + */ + public func resume() { + task.resume() + } + + /** + Cancels the request. + */ + public func cancel() { + if let + downloadDelegate = delegate as? DownloadTaskDelegate, + downloadTask = downloadDelegate.downloadTask + { + downloadTask.cancelByProducingResumeData { data in + downloadDelegate.resumeData = data + } + } else { + task.cancel() + } + } + + // MARK: - TaskDelegate + + /** + The task delegate is responsible for handling all delegate callbacks for the underlying task as well as + executing all operations attached to the serial operation queue upon task completion. + */ + public class TaskDelegate: NSObject { + + /// The serial operation queue used to execute all operations after the task completes. + public let queue: NSOperationQueue + + let task: NSURLSessionTask + let progress: NSProgress + + var data: NSData? { return nil } + var error: ErrorType? + + var credential: NSURLCredential? + + init(task: NSURLSessionTask) { + self.task = task + self.progress = NSProgress(totalUnitCount: 0) + self.queue = { + let operationQueue = NSOperationQueue() + operationQueue.maxConcurrentOperationCount = 1 + operationQueue.suspended = true + + if #available(OSX 10.10, *) { + operationQueue.qualityOfService = NSQualityOfService.Utility + } + + return operationQueue + }() + } + + deinit { + queue.cancelAllOperations() + queue.suspended = false + } + + // MARK: - NSURLSessionTaskDelegate + + // MARK: Override Closures + + var taskWillPerformHTTPRedirection: ((NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest) -> NSURLRequest?)? + var taskDidReceiveChallenge: ((NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))? + var taskNeedNewBodyStream: ((NSURLSession, NSURLSessionTask) -> NSInputStream?)? + var taskDidCompleteWithError: ((NSURLSession, NSURLSessionTask, NSError?) -> Void)? + + // MARK: Delegate Methods + + func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + willPerformHTTPRedirection response: NSHTTPURLResponse, + newRequest request: NSURLRequest, + completionHandler: ((NSURLRequest?) -> Void)) + { + var redirectRequest: NSURLRequest? = request + + if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection { + redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request) + } + + completionHandler(redirectRequest) + } + + func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + didReceiveChallenge challenge: NSURLAuthenticationChallenge, + completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)) + { + var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling + var credential: NSURLCredential? + + if let taskDidReceiveChallenge = taskDidReceiveChallenge { + (disposition, credential) = taskDidReceiveChallenge(session, task, challenge) + } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { + let host = challenge.protectionSpace.host + + if let + serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicyForHost(host), + serverTrust = challenge.protectionSpace.serverTrust + { + if serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host) { + disposition = .UseCredential + credential = NSURLCredential(forTrust: serverTrust) + } else { + disposition = .CancelAuthenticationChallenge + } + } + } else { + if challenge.previousFailureCount > 0 { + disposition = .CancelAuthenticationChallenge + } else { + credential = self.credential ?? session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace) + + if credential != nil { + disposition = .UseCredential + } + } + } + + completionHandler(disposition, credential) + } + + func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + needNewBodyStream completionHandler: ((NSInputStream?) -> Void)) + { + var bodyStream: NSInputStream? + + if let taskNeedNewBodyStream = taskNeedNewBodyStream { + bodyStream = taskNeedNewBodyStream(session, task) + } + + completionHandler(bodyStream) + } + + func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { + if let taskDidCompleteWithError = taskDidCompleteWithError { + taskDidCompleteWithError(session, task, error) + } else { + if let error = error { + self.error = error + + if let + downloadDelegate = self as? DownloadTaskDelegate, + userInfo = error.userInfo as? [String: AnyObject], + resumeData = userInfo[NSURLSessionDownloadTaskResumeData] as? NSData + { + downloadDelegate.resumeData = resumeData + } + } + + queue.suspended = false + } + } + } + + // MARK: - DataTaskDelegate + + class DataTaskDelegate: TaskDelegate, NSURLSessionDataDelegate { + var dataTask: NSURLSessionDataTask? { return task as? NSURLSessionDataTask } + + private var totalBytesReceived: Int64 = 0 + private var mutableData: NSMutableData + override var data: NSData? { + if dataStream != nil { + return nil + } else { + return mutableData + } + } + + private var expectedContentLength: Int64? + private var dataProgress: ((bytesReceived: Int64, totalBytesReceived: Int64, totalBytesExpectedToReceive: Int64) -> Void)? + private var dataStream: ((data: NSData) -> Void)? + + override init(task: NSURLSessionTask) { + mutableData = NSMutableData() + super.init(task: task) + } + + // MARK: - NSURLSessionDataDelegate + + // MARK: Override Closures + + var dataTaskDidReceiveResponse: ((NSURLSession, NSURLSessionDataTask, NSURLResponse) -> NSURLSessionResponseDisposition)? + var dataTaskDidBecomeDownloadTask: ((NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask) -> Void)? + var dataTaskDidReceiveData: ((NSURLSession, NSURLSessionDataTask, NSData) -> Void)? + var dataTaskWillCacheResponse: ((NSURLSession, NSURLSessionDataTask, NSCachedURLResponse) -> NSCachedURLResponse?)? + + // MARK: Delegate Methods + + func URLSession( + session: NSURLSession, + dataTask: NSURLSessionDataTask, + didReceiveResponse response: NSURLResponse, + completionHandler: (NSURLSessionResponseDisposition -> Void)) + { + var disposition: NSURLSessionResponseDisposition = .Allow + + expectedContentLength = response.expectedContentLength + + if let dataTaskDidReceiveResponse = dataTaskDidReceiveResponse { + disposition = dataTaskDidReceiveResponse(session, dataTask, response) + } + + completionHandler(disposition) + } + + func URLSession( + session: NSURLSession, + dataTask: NSURLSessionDataTask, + didBecomeDownloadTask downloadTask: NSURLSessionDownloadTask) + { + dataTaskDidBecomeDownloadTask?(session, dataTask, downloadTask) + } + + func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { + if let dataTaskDidReceiveData = dataTaskDidReceiveData { + dataTaskDidReceiveData(session, dataTask, data) + } else { + if let dataStream = dataStream { + dataStream(data: data) + } else { + mutableData.appendData(data) + } + + totalBytesReceived += data.length + let totalBytesExpected = dataTask.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown + + progress.totalUnitCount = totalBytesExpected + progress.completedUnitCount = totalBytesReceived + + dataProgress?( + bytesReceived: Int64(data.length), + totalBytesReceived: totalBytesReceived, + totalBytesExpectedToReceive: totalBytesExpected + ) + } + } + + func URLSession( + session: NSURLSession, + dataTask: NSURLSessionDataTask, + willCacheResponse proposedResponse: NSCachedURLResponse, + completionHandler: ((NSCachedURLResponse?) -> Void)) + { + var cachedResponse: NSCachedURLResponse? = proposedResponse + + if let dataTaskWillCacheResponse = dataTaskWillCacheResponse { + cachedResponse = dataTaskWillCacheResponse(session, dataTask, proposedResponse) + } + + completionHandler(cachedResponse) + } + } +} + +// MARK: - CustomStringConvertible + +extension Request: CustomStringConvertible { + + /** + The textual representation used when written to an output stream, which includes the HTTP method and URL, as + well as the response status code if a response has been received. + */ + public var description: String { + var components: [String] = [] + + if let HTTPMethod = request?.HTTPMethod { + components.append(HTTPMethod) + } + + if let URLString = request?.URL?.absoluteString { + components.append(URLString) + } + + if let response = response { + components.append("(\(response.statusCode))") + } + + return components.joinWithSeparator(" ") + } +} + +// MARK: - CustomDebugStringConvertible + +extension Request: CustomDebugStringConvertible { + func cURLRepresentation() -> String { + var components = ["$ curl -i"] + + guard let request = self.request else { + return "$ curl command could not be created" + } + + let URL = request.URL + + if let HTTPMethod = request.HTTPMethod where HTTPMethod != "GET" { + components.append("-X \(HTTPMethod)") + } + + if let credentialStorage = self.session.configuration.URLCredentialStorage { + let protectionSpace = NSURLProtectionSpace( + host: URL!.host!, + port: URL!.port?.integerValue ?? 0, + `protocol`: URL!.scheme, + realm: URL!.host!, + authenticationMethod: NSURLAuthenticationMethodHTTPBasic + ) + + if let credentials = credentialStorage.credentialsForProtectionSpace(protectionSpace)?.values { + for credential in credentials { + components.append("-u \(credential.user!):\(credential.password!)") + } + } else { + if let credential = delegate.credential { + components.append("-u \(credential.user!):\(credential.password!)") + } + } + } + + if session.configuration.HTTPShouldSetCookies { + if let + cookieStorage = session.configuration.HTTPCookieStorage, + cookies = cookieStorage.cookiesForURL(URL!) where !cookies.isEmpty + { + let string = cookies.reduce("") { $0 + "\($1.name)=\($1.value ?? String());" } + components.append("-b \"\(string.substringToIndex(string.endIndex.predecessor()))\"") + } + } + + if let headerFields = request.allHTTPHeaderFields { + for (field, value) in headerFields { + switch field { + case "Cookie": + continue + default: + components.append("-H \"\(field): \(value)\"") + } + } + } + + if let additionalHeaders = session.configuration.HTTPAdditionalHeaders { + for (field, value) in additionalHeaders { + switch field { + case "Cookie": + continue + default: + components.append("-H \"\(field): \(value)\"") + } + } + } + + if let + HTTPBodyData = request.HTTPBody, + HTTPBody = NSString(data: HTTPBodyData, encoding: NSUTF8StringEncoding) + { + let escapedBody = HTTPBody.stringByReplacingOccurrencesOfString("\"", withString: "\\\"") + components.append("-d \"\(escapedBody)\"") + } + + components.append("\"\(URL!.absoluteString)\"") + + return components.joinWithSeparator(" \\\n\t") + } + + /// The textual representation used when written to an output stream, in the form of a cURL command. + public var debugDescription: String { + return cURLRepresentation() + } +} diff --git a/Pods/Alamofire/Source/ResponseSerialization.swift b/Pods/Alamofire/Source/ResponseSerialization.swift new file mode 100644 index 0000000..23d8ab2 --- /dev/null +++ b/Pods/Alamofire/Source/ResponseSerialization.swift @@ -0,0 +1,331 @@ +// ResponseSerialization.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +// MARK: ResponseSerializer + +/** + The type in which all response serializers must conform to in order to serialize a response. +*/ +public protocol ResponseSerializer { + /// The type of serialized object to be created by this `ResponseSerializer`. + typealias SerializedObject + + /** + A closure used by response handlers that takes a request, response, and data and returns a result. + */ + var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result { get } +} + +// MARK: - + +/** + A generic `ResponseSerializer` used to serialize a request, response, and data into a serialized object. +*/ +public struct GenericResponseSerializer: ResponseSerializer { + /// The type of serialized object to be created by this `ResponseSerializer`. + public typealias SerializedObject = T + + /** + A closure used by response handlers that takes a request, response, and data and returns a result. + */ + public var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result + + /** + Initializes the `GenericResponseSerializer` instance with the given serialize response closure. + + - parameter serializeResponse: The closure used to serialize the response. + + - returns: The new generic response serializer instance. + */ + public init(serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result) { + self.serializeResponse = serializeResponse + } +} + +// MARK: - Default + +extension Request { + + /** + Adds a handler to be called once the request has finished. + + - parameter queue: The queue on which the completion handler is dispatched. + - parameter completionHandler: The code to be executed once the request has finished. + + - returns: The request. + */ + public func response( + queue queue: dispatch_queue_t? = nil, + completionHandler: (NSURLRequest?, NSHTTPURLResponse?, NSData?, ErrorType?) -> Void) + -> Self + { + delegate.queue.addOperationWithBlock { + dispatch_async(queue ?? dispatch_get_main_queue()) { + completionHandler(self.request, self.response, self.delegate.data, self.delegate.error) + } + } + + return self + } + + /** + Adds a handler to be called once the request has finished. + + - parameter queue: The queue on which the completion handler is dispatched. + - parameter responseSerializer: The response serializer responsible for serializing the request, response, + and data. + - parameter completionHandler: The code to be executed once the request has finished. + + - returns: The request. + */ + public func response( + queue queue: dispatch_queue_t? = nil, + responseSerializer: T, + completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) + -> Self + { + delegate.queue.addOperationWithBlock { + let result: Result = { + if let error = self.delegate.error { + return .Failure(self.delegate.data, error) + } else { + return responseSerializer.serializeResponse(self.request, self.response, self.delegate.data) + } + }() + + dispatch_async(queue ?? dispatch_get_main_queue()) { + completionHandler(self.request, self.response, result) + } + } + + return self + } +} + +// MARK: - Data + +extension Request { + + /** + Creates a response serializer that returns the associated data as-is. + + - returns: A data response serializer. + */ + public static func dataResponseSerializer() -> GenericResponseSerializer { + return GenericResponseSerializer { _, _, data in + guard let validData = data else { + let failureReason = "Data could not be serialized. Input data was nil." + let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + + return .Success(validData) + } + } + + /** + Adds a handler to be called once the request has finished. + + - parameter completionHandler: The code to be executed once the request has finished. + + - returns: The request. + */ + public func responseData(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) -> Self { + return response(responseSerializer: Request.dataResponseSerializer(), completionHandler: completionHandler) + } +} + +// MARK: - String + +extension Request { + + /** + Creates a response serializer that returns a string initialized from the response data with the specified + string encoding. + + - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the server + response, falling back to the default HTTP default character set, ISO-8859-1. + + - returns: A string response serializer. + */ + public static func stringResponseSerializer( + var encoding encoding: NSStringEncoding? = nil) + -> GenericResponseSerializer + { + return GenericResponseSerializer { _, response, data in + guard let validData = data else { + let failureReason = "String could not be serialized because input data was nil." + let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + + if let encodingName = response?.textEncodingName where encoding == nil { + encoding = CFStringConvertEncodingToNSStringEncoding( + CFStringConvertIANACharSetNameToEncoding(encodingName) + ) + } + + let actualEncoding = encoding ?? NSISOLatin1StringEncoding + + if let string = NSString(data: validData, encoding: actualEncoding) as? String { + return .Success(string) + } else { + let failureReason = "String could not be serialized with encoding: \(actualEncoding)" + let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + } + } + + /** + Adds a handler to be called once the request has finished. + + - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the + server response, falling back to the default HTTP default character set, + ISO-8859-1. + - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 3 + arguments: the URL request, the URL response and the result produced while + creating the string. + + - returns: The request. + */ + public func responseString( + encoding encoding: NSStringEncoding? = nil, + completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) + -> Self + { + return response( + responseSerializer: Request.stringResponseSerializer(encoding: encoding), + completionHandler: completionHandler + ) + } +} + +// MARK: - JSON + +extension Request { + + /** + Creates a response serializer that returns a JSON object constructed from the response data using + `NSJSONSerialization` with the specified reading options. + + - parameter options: The JSON serialization reading options. `.AllowFragments` by default. + + - returns: A JSON object response serializer. + */ + public static func JSONResponseSerializer( + options options: NSJSONReadingOptions = .AllowFragments) + -> GenericResponseSerializer + { + return GenericResponseSerializer { _, _, data in + guard let validData = data else { + let failureReason = "JSON could not be serialized because input data was nil." + let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + + do { + let JSON = try NSJSONSerialization.JSONObjectWithData(validData, options: options) + return .Success(JSON) + } catch { + return .Failure(data, error as NSError) + } + } + } + + /** + Adds a handler to be called once the request has finished. + + - parameter options: The JSON serialization reading options. `.AllowFragments` by default. + - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 3 + arguments: the URL request, the URL response and the result produced while + creating the JSON object. + + - returns: The request. + */ + public func responseJSON( + options options: NSJSONReadingOptions = .AllowFragments, + completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) + -> Self + { + return response( + responseSerializer: Request.JSONResponseSerializer(options: options), + completionHandler: completionHandler + ) + } +} + +// MARK: - Property List + +extension Request { + + /** + Creates a response serializer that returns an object constructed from the response data using + `NSPropertyListSerialization` with the specified reading options. + + - parameter options: The property list reading options. `NSPropertyListReadOptions()` by default. + + - returns: A property list object response serializer. + */ + public static func propertyListResponseSerializer( + options options: NSPropertyListReadOptions = NSPropertyListReadOptions()) + -> GenericResponseSerializer + { + return GenericResponseSerializer { _, _, data in + guard let validData = data else { + let failureReason = "Property list could not be serialized because input data was nil." + let error = Error.errorWithCode(.PropertyListSerializationFailed, failureReason: failureReason) + return .Failure(data, error) + } + + do { + let plist = try NSPropertyListSerialization.propertyListWithData(validData, options: options, format: nil) + return .Success(plist) + } catch { + return .Failure(data, error as NSError) + } + } + } + + /** + Adds a handler to be called once the request has finished. + + - parameter options: The property list reading options. `0` by default. + - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 3 + arguments: the URL request, the URL response and the result produced while + creating the property list. + + - returns: The request. + */ + public func responsePropertyList( + options options: NSPropertyListReadOptions = NSPropertyListReadOptions(), + completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) + -> Self + { + return response( + responseSerializer: Request.propertyListResponseSerializer(options: options), + completionHandler: completionHandler + ) + } +} diff --git a/Pods/Alamofire/Source/Result.swift b/Pods/Alamofire/Source/Result.swift new file mode 100644 index 0000000..958e3ad --- /dev/null +++ b/Pods/Alamofire/Source/Result.swift @@ -0,0 +1,114 @@ +// Result.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +/** + Used to represent whether a request was successful or encountered an error. + + - Success: The request and all post processing operations were successful resulting in the serialization of the + provided associated value. + - Failure: The request encountered an error resulting in a failure. The associated values are the original data + provided by the server as well as the error that caused the failure. +*/ +public enum Result { + case Success(Value) + case Failure(NSData?, ErrorType) + + /// Returns `true` if the result is a success, `false` otherwise. + public var isSuccess: Bool { + switch self { + case .Success: + return true + case .Failure: + return false + } + } + + /// Returns `true` if the result is a failure, `false` otherwise. + public var isFailure: Bool { + return !isSuccess + } + + /// Returns the associated value if the result is a success, `nil` otherwise. + public var value: Value? { + switch self { + case .Success(let value): + return value + case .Failure: + return nil + } + } + + /// Returns the associated data value if the result is a failure, `nil` otherwise. + public var data: NSData? { + switch self { + case .Success: + return nil + case .Failure(let data, _): + return data + } + } + + /// Returns the associated error value if the result is a failure, `nil` otherwise. + public var error: ErrorType? { + switch self { + case .Success: + return nil + case .Failure(_, let error): + return error + } + } +} + +// MARK: - CustomStringConvertible + +extension Result: CustomStringConvertible { + public var description: String { + switch self { + case .Success: + return "SUCCESS" + case .Failure: + return "FAILURE" + } + } +} + +// MARK: - CustomDebugStringConvertible + +extension Result: CustomDebugStringConvertible { + public var debugDescription: String { + switch self { + case .Success(let value): + return "SUCCESS: \(value)" + case .Failure(let data, let error): + if let + data = data, + utf8Data = NSString(data: data, encoding: NSUTF8StringEncoding) + { + return "FAILURE: \(error) \(utf8Data)" + } else { + return "FAILURE with Error: \(error)" + } + } + } +} diff --git a/Pods/Alamofire/Source/ServerTrustPolicy.swift b/Pods/Alamofire/Source/ServerTrustPolicy.swift new file mode 100644 index 0000000..b6efbce --- /dev/null +++ b/Pods/Alamofire/Source/ServerTrustPolicy.swift @@ -0,0 +1,305 @@ +// ServerTrustPolicy.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +/// Responsible for managing the mapping of `ServerTrustPolicy` objects to a given host. +public class ServerTrustPolicyManager { + /// The dictionary of policies mapped to a particular host. + public let policies: [String: ServerTrustPolicy] + + /** + Initializes the `ServerTrustPolicyManager` instance with the given policies. + + Since different servers and web services can have different leaf certificates, intermediate and even root + certficates, it is important to have the flexibility to specify evaluation policies on a per host basis. This + allows for scenarios such as using default evaluation for host1, certificate pinning for host2, public key + pinning for host3 and disabling evaluation for host4. + + - parameter policies: A dictionary of all policies mapped to a particular host. + + - returns: The new `ServerTrustPolicyManager` instance. + */ + public init(policies: [String: ServerTrustPolicy]) { + self.policies = policies + } + + /** + Returns the `ServerTrustPolicy` for the given host if applicable. + + By default, this method will return the policy that perfectly matches the given host. Subclasses could override + this method and implement more complex mapping implementations such as wildcards. + + - parameter host: The host to use when searching for a matching policy. + + - returns: The server trust policy for the given host if found. + */ + public func serverTrustPolicyForHost(host: String) -> ServerTrustPolicy? { + return policies[host] + } +} + +// MARK: - + +extension NSURLSession { + private struct AssociatedKeys { + static var ManagerKey = "NSURLSession.ServerTrustPolicyManager" + } + + var serverTrustPolicyManager: ServerTrustPolicyManager? { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.ManagerKey) as? ServerTrustPolicyManager + } + set (manager) { + objc_setAssociatedObject(self, &AssociatedKeys.ManagerKey, manager, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } +} + +// MARK: - ServerTrustPolicy + +/** + The `ServerTrustPolicy` evaluates the server trust generally provided by an `NSURLAuthenticationChallenge` when + connecting to a server over a secure HTTPS connection. The policy configuration then evaluates the server trust + with a given set of criteria to determine whether the server trust is valid and the connection should be made. + + Using pinned certificates or public keys for evaluation helps prevent man-in-the-middle (MITM) attacks and other + vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged + to route all communication over an HTTPS connection with pinning enabled. + + - PerformDefaultEvaluation: Uses the default server trust evaluation while allowing you to control whether to + validate the host provided by the challenge. Applications are encouraged to always + validate the host in production environments to guarantee the validity of the server's + certificate chain. + + - PinCertificates: Uses the pinned certificates to validate the server trust. The server trust is + considered valid if one of the pinned certificates match one of the server certificates. + By validating both the certificate chain and host, certificate pinning provides a very + secure form of server trust validation mitigating most, if not all, MITM attacks. + Applications are encouraged to always validate the host and require a valid certificate + chain in production environments. + + - PinPublicKeys: Uses the pinned public keys to validate the server trust. The server trust is considered + valid if one of the pinned public keys match one of the server certificate public keys. + By validating both the certificate chain and host, public key pinning provides a very + secure form of server trust validation mitigating most, if not all, MITM attacks. + Applications are encouraged to always validate the host and require a valid certificate + chain in production environments. + + - DisableEvaluation: Disables all evaluation which in turn will always consider any server trust as valid. + + - CustomEvaluation: Uses the associated closure to evaluate the validity of the server trust. +*/ +public enum ServerTrustPolicy { + case PerformDefaultEvaluation(validateHost: Bool) + case PinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool) + case PinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool) + case DisableEvaluation + case CustomEvaluation((serverTrust: SecTrust, host: String) -> Bool) + + // MARK: - Bundle Location + + /** + Returns all certificates within the given bundle with a `.cer` file extension. + + - parameter bundle: The bundle to search for all `.cer` files. + + - returns: All certificates within the given bundle. + */ + public static func certificatesInBundle(bundle: NSBundle = NSBundle.mainBundle()) -> [SecCertificate] { + var certificates: [SecCertificate] = [] + + for path in bundle.pathsForResourcesOfType(".cer", inDirectory: nil) { + if let + certificateData = NSData(contentsOfFile: path), + certificate = SecCertificateCreateWithData(nil, certificateData) + { + certificates.append(certificate) + } + } + + return certificates + } + + /** + Returns all public keys within the given bundle with a `.cer` file extension. + + - parameter bundle: The bundle to search for all `*.cer` files. + + - returns: All public keys within the given bundle. + */ + public static func publicKeysInBundle(bundle: NSBundle = NSBundle.mainBundle()) -> [SecKey] { + var publicKeys: [SecKey] = [] + + for certificate in certificatesInBundle(bundle) { + if let publicKey = publicKeyForCertificate(certificate) { + publicKeys.append(publicKey) + } + } + + return publicKeys + } + + // MARK: - Evaluation + + /** + Evaluates whether the server trust is valid for the given host. + + - parameter serverTrust: The server trust to evaluate. + - parameter host: The host of the challenge protection space. + + - returns: Whether the server trust is valid. + */ + public func evaluateServerTrust(serverTrust: SecTrust, isValidForHost host: String) -> Bool { + var serverTrustIsValid = false + + switch self { + case let .PerformDefaultEvaluation(validateHost): + let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) + SecTrustSetPolicies(serverTrust, [policy]) + + serverTrustIsValid = trustIsValid(serverTrust) + case let .PinCertificates(pinnedCertificates, validateCertificateChain, validateHost): + if validateCertificateChain { + let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) + SecTrustSetPolicies(serverTrust, [policy]) + + SecTrustSetAnchorCertificates(serverTrust, pinnedCertificates) + SecTrustSetAnchorCertificatesOnly(serverTrust, true) + + serverTrustIsValid = trustIsValid(serverTrust) + } else { + let serverCertificatesDataArray = certificateDataForTrust(serverTrust) + + //====================================================================================================== + // The following `[] +` is a temporary workaround for a Swift 2.0 compiler error. This workaround should + // be removed once the following radar has been resolved: + // - http://openradar.appspot.com/radar?id=6082025006039040 + //====================================================================================================== + + let pinnedCertificatesDataArray = certificateDataForCertificates([] + pinnedCertificates) + + outerLoop: for serverCertificateData in serverCertificatesDataArray { + for pinnedCertificateData in pinnedCertificatesDataArray { + if serverCertificateData.isEqualToData(pinnedCertificateData) { + serverTrustIsValid = true + break outerLoop + } + } + } + } + case let .PinPublicKeys(pinnedPublicKeys, validateCertificateChain, validateHost): + var certificateChainEvaluationPassed = true + + if validateCertificateChain { + let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil) + SecTrustSetPolicies(serverTrust, [policy]) + + certificateChainEvaluationPassed = trustIsValid(serverTrust) + } + + if certificateChainEvaluationPassed { + outerLoop: for serverPublicKey in ServerTrustPolicy.publicKeysForTrust(serverTrust) as [AnyObject] { + for pinnedPublicKey in pinnedPublicKeys as [AnyObject] { + if serverPublicKey.isEqual(pinnedPublicKey) { + serverTrustIsValid = true + break outerLoop + } + } + } + } + case .DisableEvaluation: + serverTrustIsValid = true + case let .CustomEvaluation(closure): + serverTrustIsValid = closure(serverTrust: serverTrust, host: host) + } + + return serverTrustIsValid + } + + // MARK: - Private - Trust Validation + + private func trustIsValid(trust: SecTrust) -> Bool { + var isValid = false + + var result = SecTrustResultType(kSecTrustResultInvalid) + let status = SecTrustEvaluate(trust, &result) + + if status == errSecSuccess { + let unspecified = SecTrustResultType(kSecTrustResultUnspecified) + let proceed = SecTrustResultType(kSecTrustResultProceed) + + isValid = result == unspecified || result == proceed + } + + return isValid + } + + // MARK: - Private - Certificate Data + + private func certificateDataForTrust(trust: SecTrust) -> [NSData] { + var certificates: [SecCertificate] = [] + + for index in 0.. [NSData] { + return certificates.map { SecCertificateCopyData($0) as NSData } + } + + // MARK: - Private - Public Key Extraction + + private static func publicKeysForTrust(trust: SecTrust) -> [SecKey] { + var publicKeys: [SecKey] = [] + + for index in 0.. SecKey? { + var publicKey: SecKey? + + let policy = SecPolicyCreateBasicX509() + var trust: SecTrust? + let trustCreationStatus = SecTrustCreateWithCertificates(certificate, policy, &trust) + + if let trust = trust where trustCreationStatus == errSecSuccess { + publicKey = SecTrustCopyPublicKey(trust) + } + + return publicKey + } +} diff --git a/Pods/Alamofire/Source/Stream.swift b/Pods/Alamofire/Source/Stream.swift new file mode 100644 index 0000000..af89d5d --- /dev/null +++ b/Pods/Alamofire/Source/Stream.swift @@ -0,0 +1,180 @@ +// Stream.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +#if !os(watchOS) + +@available(iOS 9.0, OSX 10.11, *) +extension Manager { + private enum Streamable { + case Stream(String, Int) + case NetService(NSNetService) + } + + private func stream(streamable: Streamable) -> Request { + var streamTask: NSURLSessionStreamTask! + + switch streamable { + case .Stream(let hostName, let port): + dispatch_sync(queue) { + streamTask = self.session.streamTaskWithHostName(hostName, port: port) + } + case .NetService(let netService): + dispatch_sync(queue) { + streamTask = self.session.streamTaskWithNetService(netService) + } + } + + let request = Request(session: session, task: streamTask) + + delegate[request.delegate.task] = request.delegate + + if startRequestsImmediately { + request.resume() + } + + return request + } + + /** + Creates a request for bidirectional streaming with the given hostname and port. + + - parameter hostName: The hostname of the server to connect to. + - parameter port: The port of the server to connect to. + + :returns: The created stream request. + */ + public func stream(hostName hostName: String, port: Int) -> Request { + return stream(.Stream(hostName, port)) + } + + /** + Creates a request for bidirectional streaming with the given `NSNetService`. + + - parameter netService: The net service used to identify the endpoint. + + - returns: The created stream request. + */ + public func stream(netService netService: NSNetService) -> Request { + return stream(.NetService(netService)) + } +} + +// MARK: - + +@available(iOS 9.0, OSX 10.11, *) +extension Manager.SessionDelegate: NSURLSessionStreamDelegate { + + // MARK: Override Closures + + /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:readClosedForStreamTask:`. + public var streamTaskReadClosed: ((NSURLSession, NSURLSessionStreamTask) -> Void)? { + get { + return _streamTaskReadClosed as? (NSURLSession, NSURLSessionStreamTask) -> Void + } + set { + _streamTaskReadClosed = newValue + } + } + + /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:writeClosedForStreamTask:`. + public var streamTaskWriteClosed: ((NSURLSession, NSURLSessionStreamTask) -> Void)? { + get { + return _streamTaskWriteClosed as? (NSURLSession, NSURLSessionStreamTask) -> Void + } + set { + _streamTaskWriteClosed = newValue + } + } + + /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:betterRouteDiscoveredForStreamTask:`. + public var streamTaskBetterRouteDiscovered: ((NSURLSession, NSURLSessionStreamTask) -> Void)? { + get { + return _streamTaskBetterRouteDiscovered as? (NSURLSession, NSURLSessionStreamTask) -> Void + } + set { + _streamTaskBetterRouteDiscovered = newValue + } + } + + /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:streamTask:didBecomeInputStream:outputStream:`. + public var streamTaskDidBecomeInputStream: ((NSURLSession, NSURLSessionStreamTask, NSInputStream, NSOutputStream) -> Void)? { + get { + return _streamTaskDidBecomeInputStream as? (NSURLSession, NSURLSessionStreamTask, NSInputStream, NSOutputStream) -> Void + } + set { + _streamTaskDidBecomeInputStream = newValue + } + } + + // MARK: Delegate Methods + + /** + Tells the delegate that the read side of the connection has been closed. + + - parameter session: The session. + - parameter streamTask: The stream task. + */ + public func URLSession(session: NSURLSession, readClosedForStreamTask streamTask: NSURLSessionStreamTask) { + streamTaskReadClosed?(session, streamTask) + } + + /** + Tells the delegate that the write side of the connection has been closed. + + - parameter session: The session. + - parameter streamTask: The stream task. + */ + public func URLSession(session: NSURLSession, writeClosedForStreamTask streamTask: NSURLSessionStreamTask) { + streamTaskWriteClosed?(session, streamTask) + } + + /** + Tells the delegate that the system has determined that a better route to the host is available. + + - parameter session: The session. + - parameter streamTask: The stream task. + */ + public func URLSession(session: NSURLSession, betterRouteDiscoveredForStreamTask streamTask: NSURLSessionStreamTask) { + streamTaskBetterRouteDiscovered?(session, streamTask) + } + + /** + Tells the delegate that the stream task has been completed and provides the unopened stream objects. + + - parameter session: The session. + - parameter streamTask: The stream task. + - parameter inputStream: The new input stream. + - parameter outputStream: The new output stream. + */ + public func URLSession( + session: NSURLSession, + streamTask: NSURLSessionStreamTask, + didBecomeInputStream inputStream: NSInputStream, + outputStream: NSOutputStream) + { + streamTaskDidBecomeInputStream?(session, streamTask, inputStream, outputStream) + } +} + +#endif diff --git a/Pods/Alamofire/Source/Upload.swift b/Pods/Alamofire/Source/Upload.swift new file mode 100644 index 0000000..f7cc8bc --- /dev/null +++ b/Pods/Alamofire/Source/Upload.swift @@ -0,0 +1,372 @@ +// Upload.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +extension Manager { + private enum Uploadable { + case Data(NSURLRequest, NSData) + case File(NSURLRequest, NSURL) + case Stream(NSURLRequest, NSInputStream) + } + + private func upload(uploadable: Uploadable) -> Request { + var uploadTask: NSURLSessionUploadTask! + var HTTPBodyStream: NSInputStream? + + switch uploadable { + case .Data(let request, let data): + dispatch_sync(queue) { + uploadTask = self.session.uploadTaskWithRequest(request, fromData: data) + } + case .File(let request, let fileURL): + dispatch_sync(queue) { + uploadTask = self.session.uploadTaskWithRequest(request, fromFile: fileURL) + } + case .Stream(let request, let stream): + dispatch_sync(queue) { + uploadTask = self.session.uploadTaskWithStreamedRequest(request) + } + + HTTPBodyStream = stream + } + + let request = Request(session: session, task: uploadTask) + + if HTTPBodyStream != nil { + request.delegate.taskNeedNewBodyStream = { _, _ in + return HTTPBodyStream + } + } + + delegate[request.delegate.task] = request.delegate + + if startRequestsImmediately { + request.resume() + } + + return request + } + + // MARK: File + + /** + Creates a request for uploading a file to the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter URLRequest: The URL request + - parameter file: The file to upload + + - returns: The created upload request. + */ + public func upload(URLRequest: URLRequestConvertible, file: NSURL) -> Request { + return upload(.File(URLRequest.URLRequest, file)) + } + + /** + Creates a request for uploading a file to the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter file: The file to upload + + - returns: The created upload request. + */ + public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + file: NSURL) + -> Request + { + let mutableURLRequest = URLRequest(method, URLString, headers: headers) + return upload(mutableURLRequest, file: file) + } + + // MARK: Data + + /** + Creates a request for uploading data to the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter URLRequest: The URL request. + - parameter data: The data to upload. + + - returns: The created upload request. + */ + public func upload(URLRequest: URLRequestConvertible, data: NSData) -> Request { + return upload(.Data(URLRequest.URLRequest, data)) + } + + /** + Creates a request for uploading data to the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter data: The data to upload + + - returns: The created upload request. + */ + public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + data: NSData) + -> Request + { + let mutableURLRequest = URLRequest(method, URLString, headers: headers) + + return upload(mutableURLRequest, data: data) + } + + // MARK: Stream + + /** + Creates a request for uploading a stream to the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter URLRequest: The URL request. + - parameter stream: The stream to upload. + + - returns: The created upload request. + */ + public func upload(URLRequest: URLRequestConvertible, stream: NSInputStream) -> Request { + return upload(.Stream(URLRequest.URLRequest, stream)) + } + + /** + Creates a request for uploading a stream to the specified URL request. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter stream: The stream to upload. + + - returns: The created upload request. + */ + public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + stream: NSInputStream) + -> Request + { + let mutableURLRequest = URLRequest(method, URLString, headers: headers) + + return upload(mutableURLRequest, stream: stream) + } + + // MARK: MultipartFormData + + /// Default memory threshold used when encoding `MultipartFormData`. + public static let MultipartFormDataEncodingMemoryThreshold: UInt64 = 10 * 1024 * 1024 + + /** + Defines whether the `MultipartFormData` encoding was successful and contains result of the encoding as + associated values. + + - Success: Represents a successful `MultipartFormData` encoding and contains the new `Request` along with + streaming information. + - Failure: Used to represent a failure in the `MultipartFormData` encoding and also contains the encoding + error. + */ + public enum MultipartFormDataEncodingResult { + case Success(request: Request, streamingFromDisk: Bool, streamFileURL: NSURL?) + case Failure(ErrorType) + } + + /** + Encodes the `MultipartFormData` and creates a request to upload the result to the specified URL request. + + It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative + payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + used for larger payloads such as video content. + + The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + technique was used. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter method: The HTTP method. + - parameter URLString: The URL string. + - parameter headers: The HTTP headers. `nil` by default. + - parameter multipartFormData: The closure used to append body parts to the `MultipartFormData`. + - parameter encodingMemoryThreshold: The encoding memory threshold in bytes. + `MultipartFormDataEncodingMemoryThreshold` by default. + - parameter encodingCompletion: The closure called when the `MultipartFormData` encoding is complete. + */ + public func upload( + method: Method, + _ URLString: URLStringConvertible, + headers: [String: String]? = nil, + multipartFormData: MultipartFormData -> Void, + encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold, + encodingCompletion: (MultipartFormDataEncodingResult -> Void)?) + { + let mutableURLRequest = URLRequest(method, URLString, headers: headers) + + return upload( + mutableURLRequest, + multipartFormData: multipartFormData, + encodingMemoryThreshold: encodingMemoryThreshold, + encodingCompletion: encodingCompletion + ) + } + + /** + Encodes the `MultipartFormData` and creates a request to upload the result to the specified URL request. + + It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative + payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + used for larger payloads such as video content. + + The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + technique was used. + + If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned. + + - parameter URLRequest: The URL request. + - parameter multipartFormData: The closure used to append body parts to the `MultipartFormData`. + - parameter encodingMemoryThreshold: The encoding memory threshold in bytes. + `MultipartFormDataEncodingMemoryThreshold` by default. + - parameter encodingCompletion: The closure called when the `MultipartFormData` encoding is complete. + */ + public func upload( + URLRequest: URLRequestConvertible, + multipartFormData: MultipartFormData -> Void, + encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold, + encodingCompletion: (MultipartFormDataEncodingResult -> Void)?) + { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { + let formData = MultipartFormData() + multipartFormData(formData) + + let URLRequestWithContentType = URLRequest.URLRequest + URLRequestWithContentType.setValue(formData.contentType, forHTTPHeaderField: "Content-Type") + + let isBackgroundSession = self.session.configuration.identifier != nil + + if formData.contentLength < encodingMemoryThreshold && !isBackgroundSession { + do { + let data = try formData.encode() + let encodingResult = MultipartFormDataEncodingResult.Success( + request: self.upload(URLRequestWithContentType, data: data), + streamingFromDisk: false, + streamFileURL: nil + ) + + dispatch_async(dispatch_get_main_queue()) { + encodingCompletion?(encodingResult) + } + } catch { + dispatch_async(dispatch_get_main_queue()) { + encodingCompletion?(.Failure(error as NSError)) + } + } + } else { + let fileManager = NSFileManager.defaultManager() + let tempDirectoryURL = NSURL(fileURLWithPath: NSTemporaryDirectory()) + let directoryURL = tempDirectoryURL.URLByAppendingPathComponent("com.alamofire.manager/multipart.form.data") + let fileName = NSUUID().UUIDString + let fileURL = directoryURL.URLByAppendingPathComponent(fileName) + + do { + try fileManager.createDirectoryAtURL(directoryURL, withIntermediateDirectories: true, attributes: nil) + try formData.writeEncodedDataToDisk(fileURL) + + dispatch_async(dispatch_get_main_queue()) { + let encodingResult = MultipartFormDataEncodingResult.Success( + request: self.upload(URLRequestWithContentType, file: fileURL), + streamingFromDisk: true, + streamFileURL: fileURL + ) + encodingCompletion?(encodingResult) + } + } catch { + dispatch_async(dispatch_get_main_queue()) { + encodingCompletion?(.Failure(error as NSError)) + } + } + } + } + } +} + +// MARK: - + +extension Request { + + // MARK: - UploadTaskDelegate + + class UploadTaskDelegate: DataTaskDelegate { + var uploadTask: NSURLSessionUploadTask? { return task as? NSURLSessionUploadTask } + var uploadProgress: ((Int64, Int64, Int64) -> Void)! + + // MARK: - NSURLSessionTaskDelegate + + // MARK: Override Closures + + var taskDidSendBodyData: ((NSURLSession, NSURLSessionTask, Int64, Int64, Int64) -> Void)? + + // MARK: Delegate Methods + + func URLSession( + session: NSURLSession, + task: NSURLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) + { + if let taskDidSendBodyData = taskDidSendBodyData { + taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend) + } else { + progress.totalUnitCount = totalBytesExpectedToSend + progress.completedUnitCount = totalBytesSent + + uploadProgress?(bytesSent, totalBytesSent, totalBytesExpectedToSend) + } + } + } +} diff --git a/Pods/Alamofire/Source/Validation.swift b/Pods/Alamofire/Source/Validation.swift new file mode 100644 index 0000000..24f29d7 --- /dev/null +++ b/Pods/Alamofire/Source/Validation.swift @@ -0,0 +1,187 @@ +// Validation.swift +// +// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) +// +// 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 Foundation + +extension Request { + + /** + Used to represent whether validation was successful or encountered an error resulting in a failure. + + - Success: The validation was successful. + - Failure: The validation failed encountering the provided error. + */ + public enum ValidationResult { + case Success + case Failure(ErrorType) + } + + /** + A closure used to validate a request that takes a URL request and URL response, and returns whether the + request was valid. + */ + public typealias Validation = (NSURLRequest?, NSHTTPURLResponse) -> ValidationResult + + /** + Validates the request, using the specified closure. + + If validation fails, subsequent calls to response handlers will have an associated error. + + - parameter validation: A closure to validate the request. + + - returns: The request. + */ + public func validate(validation: Validation) -> Self { + delegate.queue.addOperationWithBlock { + if let + response = self.response where self.delegate.error == nil, + case let .Failure(error) = validation(self.request, response) + { + self.delegate.error = error + } + } + + return self + } + + // MARK: - Status Code + + /** + Validates that the response has a status code in the specified range. + + If validation fails, subsequent calls to response handlers will have an associated error. + + - parameter range: The range of acceptable status codes. + + - returns: The request. + */ + public func validate(statusCode acceptableStatusCode: S) -> Self { + return validate { _, response in + if acceptableStatusCode.contains(response.statusCode) { + return .Success + } else { + let failureReason = "Response status code was unacceptable: \(response.statusCode)" + return .Failure(Error.errorWithCode(.StatusCodeValidationFailed, failureReason: failureReason)) + } + } + } + + // MARK: - Content-Type + + private struct MIMEType { + let type: String + let subtype: String + + init?(_ string: String) { + let components: [String] = { + let stripped = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) + let split = stripped.substringToIndex(stripped.rangeOfString(";")?.endIndex ?? stripped.endIndex) + return split.componentsSeparatedByString("/") + }() + + if let + type = components.first, + subtype = components.last + { + self.type = type + self.subtype = subtype + } else { + return nil + } + } + + func matches(MIME: MIMEType) -> Bool { + switch (type, subtype) { + case (MIME.type, MIME.subtype), (MIME.type, "*"), ("*", MIME.subtype), ("*", "*"): + return true + default: + return false + } + } + } + + /** + Validates that the response has a content type in the specified array. + + If validation fails, subsequent calls to response handlers will have an associated error. + + - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes. + + - returns: The request. + */ + public func validate(contentType acceptableContentTypes: S) -> Self { + return validate { _, response in + if let + responseContentType = response.MIMEType, + responseMIMEType = MIMEType(responseContentType) + { + for contentType in acceptableContentTypes { + if let acceptableMIMEType = MIMEType(contentType) where acceptableMIMEType.matches(responseMIMEType) { + return .Success + } + } + } else { + for contentType in acceptableContentTypes { + if let MIMEType = MIMEType(contentType) where MIMEType.type == "*" && MIMEType.subtype == "*" { + return .Success + } + } + } + + let failureReason: String + + if let responseContentType = response.MIMEType { + failureReason = ( + "Response content type \"\(responseContentType)\" does not match any acceptable " + + "content types: \(acceptableContentTypes)" + ) + } else { + failureReason = "Response content type was missing and acceptable content type does not match \"*/*\"" + } + + return .Failure(Error.errorWithCode(.ContentTypeValidationFailed, failureReason: failureReason)) + } + } + + // MARK: - Automatic + + /** + Validates that the response has a status code in the default acceptable range of 200...299, and that the content + type matches any specified in the Accept HTTP header field. + + If validation fails, subsequent calls to response handlers will have an associated error. + + - returns: The request. + */ + public func validate() -> Self { + let acceptableStatusCodes: Range = 200..<300 + let acceptableContentTypes: [String] = { + if let accept = request?.valueForHTTPHeaderField("Accept") { + return accept.componentsSeparatedByString(",") + } + + return ["*/*"] + }() + + return validate(statusCode: acceptableStatusCodes).validate(contentType: acceptableContentTypes) + } +} diff --git a/Pods/Firebase/Empty.m b/Pods/Firebase/Empty.m new file mode 100644 index 0000000..e69de29 diff --git a/Pods/Firebase/FAuthData.h b/Pods/Firebase/FAuthData.h new file mode 100644 index 0000000..b2f0b7f --- /dev/null +++ b/Pods/Firebase/FAuthData.h @@ -0,0 +1,55 @@ +// +// FAuthData.h +// Firebase +// +// Created by Katherine Fang on 7/30/14. +// + +#import +#import "FAuthType.h" + + +/** +* The FAuthData class is a wrapper around the user metadata returned from the Firebase auth server. +* It includes the provider authenticated against, a uid (with the possible exception of authenticating against a custom +* backend), and a token used to authenticate with Firebase. +* +* It may include other metadata about the user, depending on the provider used to do the authentication. +*/ +@interface FAuthData : NSObject + +/** +* @return Raw authentication token payload returned by the server +*/ +@property (nonatomic, strong, readonly) NSDictionary *auth; + +/** + * @return Authentication token expiration timestamp (seconds since epoch) returned by the server + */ +@property (nonatomic, strong, readonly) NSNumber *expires; + +/** +* @return A uid for this user. It is unique across all auth providers. +*/ +@property (nonatomic, strong, readonly) NSString *uid; + + +/** +* @return The provider that authenticated this user +*/ +@property (nonatomic, readonly) NSString *provider; + + +/** +* @return The token that was used to authenticate this user with Firebase +*/ +@property (nonatomic, strong, readonly) NSString *token; + + +/** +* @return Provider data keyed by provider. Includes cached data from third-party providers +*/ +@property (nonatomic, strong, readonly) NSDictionary *providerData; + + +@end diff --git a/Pods/Firebase/FAuthType.h b/Pods/Firebase/FAuthType.h new file mode 100644 index 0000000..0f772b1 --- /dev/null +++ b/Pods/Firebase/FAuthType.h @@ -0,0 +1,41 @@ +// +// FAuthType.h +// Firebase +// +// Created by Katherine Fang on 7/30/14. +// +// All public-facing auth enums. +// + +#ifndef Firebase_FAuthenticationTypes_h +#define Firebase_FAuthenticationTypes_h + +typedef NS_ENUM(NSInteger, FAuthenticationError) { + // Developer / Config Errors + FAuthenticationErrorProviderDisabled = -1, + FAuthenticationErrorInvalidConfiguration = -2, + FAuthenticationErrorInvalidOrigin = -3, + FAuthenticationErrorInvalidProvider = -4, + + // User Errors (Email / Password) + FAuthenticationErrorInvalidEmail = -5, + FAuthenticationErrorInvalidPassword = -6, + FAuthenticationErrorInvalidToken = -7, + FAuthenticationErrorUserDoesNotExist = -8, + FAuthenticationErrorEmailTaken = -9, + + // User Errors (Facebook / Twitter / Github / Google) + FAuthenticationErrorDeniedByUser = -10, + FAuthenticationErrorInvalidCredentials = -11, + FAuthenticationErrorInvalidArguments = -12, + FAuthenticationErrorProviderError = -13, + FAuthenticationErrorLimitsExceeded = -14, + + // Client side errors + FAuthenticationErrorNetworkError = -15, + FAuthenticationErrorPreempted = -16, + + FAuthenticationErrorUnknown = -9999 +}; + +#endif \ No newline at end of file diff --git a/Pods/Firebase/FConfig.h b/Pods/Firebase/FConfig.h new file mode 100644 index 0000000..dcfdefa --- /dev/null +++ b/Pods/Firebase/FConfig.h @@ -0,0 +1,69 @@ +/* + * Firebase iOS Client Library + * + * Copyright © 2015 Firebase - All Rights Reserved + * https://www.firebase.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binaryform must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +/** + * Configuration object for Firebase. You can get the default FConfig object via + * `[Firebase defaultConfig]` and modify it. You must make all changes to it before + * you create your first Firebase instance. + */ +@interface FConfig : NSObject + +/** + * By default the Firebase client will keep data in memory while your application is running, but not + * when it is restarted. By setting this value to YES, the data will be persisted to on-device (disk) + * storage and will thus be available again when the app is restarted (even when there is no network + * connectivity at that time). Note that this property must be set before creating your first Firebase + * reference and only needs to be called once per application. + * + * If your app uses Firebase Authentication, the client will automatically persist the user's authentication + * token across restarts, even without persistence enabled. But if the auth token expired while offline and + * you've enabled persistence, the client will pause write operations until you successfully re-authenticate + * (or explicitly unauthenticate) to prevent your writes from being sent unauthenticated and failing due to + * security rules. + */ +@property (nonatomic) BOOL persistenceEnabled; + +/** + * By default Firebase will use up to 10MB of disk space to cache data. If the cache grows beyond this size, + * Firebase will start removing data that hasn't been recently used. If you find that your application caches too + * little or too much data, call this method to change the cache size. This property must be set before creating + * your first Firebase reference and only needs to be called once per application. + * + * Note that the specified cache size is only an approximation and the size on disk may temporarily exceed it + * at times. + */ +@property (nonatomic) NSUInteger persistenceCacheSizeBytes; + +/** + * Sets the dispatch queue on which all events are raised. The default queue is the main queue. + */ +@property (nonatomic, strong) dispatch_queue_t callbackQueue; + +@end diff --git a/Pods/Firebase/FDataSnapshot.h b/Pods/Firebase/FDataSnapshot.h new file mode 100644 index 0000000..fc794ac --- /dev/null +++ b/Pods/Firebase/FDataSnapshot.h @@ -0,0 +1,154 @@ +/* + * Firebase iOS Client Library + * + * Copyright © 2013 Firebase - All Rights Reserved + * https://www.firebase.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binaryform must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +@class Firebase; + +/** + * An FDataSnapshot contains data from a Firebase location. Any time you read + * Firebase data, you receive the data as an FDataSnapshot. + * + * FDataSnapshots are passed to the blocks you attach with observeEventType:withBlock: or observeSingleEvent:withBlock:. + * They are efficiently-generated immutable copies of the data at a Firebase location. + * They can't be modified and will never change. To modify data at a location, + * use a Firebase reference (e.g. with setValue:). + */ +@interface FDataSnapshot : NSObject + + +/** @name Navigating and inspecting a snapshot */ + +/** + * Get an FDataSnapshot for the location at the specified relative path. + * The relative path can either be a simple child key (e.g. 'fred') + * or a deeper slash-separated path (e.g. 'fred/name/first'). If the child + * location has no data, an empty FDataSnapshot is returned. + * + * @param childPathString A relative path to the location of child data. + * @return The FDataSnapshot for the child location. + */ +- (FDataSnapshot *) childSnapshotForPath:(NSString *)childPathString; + + +/** + * Return YES if the specified child exists. + * + * @param childPathString A relative path to the location of a potential child. + * @return YES if data exists at the specified childPathString, else false. + */ +- (BOOL) hasChild:(NSString *)childPathString; + + +/** + * Return YES if the DataSnapshot has any children. + * + * @return YES if this snapshot has any children, else NO. + */ +- (BOOL) hasChildren; + + +/** + * Return YES if the DataSnapshot contains a non-null value. + * + * @return YES if this snapshot contains a non-null value, otherwise NO. + */ +- (BOOL) exists; + + +/** @name Data export */ + +/** + * Returns the raw value at this location, coupled with any metadata, such as priority. + * + * Priorities, where they exist, are accessible under the ".priority" key in instances of NSDictionary. + * For leaf locations with priorities, the value will be under the ".value" key. + */ +- (id) valueInExportFormat; + + +/** @name Properties */ + +/** + * Returns the contents of this data snapshot as native types. + * + * Data types returned: + * * NSDictionary + * * NSArray + * * NSNumber (also includes booleans) + * * NSString + * + * @return The data as a native object. + */ +@property (strong, readonly, nonatomic) id value; + + +/** + * Get the number of children for this DataSnapshot. + * + * @return An integer indicating the number of children. + */ +@property (readonly, nonatomic) NSUInteger childrenCount; + + +/** + * Get a Firebase reference for the location that this data came from + * + * @return A Firebase instance for the location of this data + */ +@property (nonatomic, readonly, strong) Firebase* ref; + + +/** + * The key of the location that generated this FDataSnapshot. + * + * @return An NSString containing the key for the location of this FDataSnapshot. + */ +@property (strong, readonly, nonatomic) NSString* key; + + +/** + * An iterator for snapshots of the child nodes in this snapshot. + * You can use the native for..in syntax: + * + * for (FDataSnapshot* child in snapshot.children) { + * ... + * } + * + * @return An NSEnumerator of the children + */ +@property (strong, readonly, nonatomic) NSEnumerator* children; + +/** + * The priority of the data in this FDataSnapshot. + * + * @return The priority as a string, or nil if no priority was set. + */ +@property (strong, readonly, nonatomic) id priority; + +@end diff --git a/Pods/Firebase/FEventType.h b/Pods/Firebase/FEventType.h new file mode 100644 index 0000000..6d672bd --- /dev/null +++ b/Pods/Firebase/FEventType.h @@ -0,0 +1,43 @@ +/* + * Firebase iOS Client Library + * + * Copyright © 2013 Firebase - All Rights Reserved + * https://www.firebase.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binaryform must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef Firebase_FEventType_h +#define Firebase_FEventType_h + +/** + * This enum is the set of events that you can observe at a Firebase location. + */ +typedef NS_ENUM(NSInteger, FEventType) { + FEventTypeChildAdded, // 0, fired when a new child node is added to a location + FEventTypeChildRemoved, // 1, fired when a child node is removed from a location + FEventTypeChildChanged, // 2, fired when a child node at a location changes + FEventTypeChildMoved, // 3, fired when a child node moves relative to the other child nodes at a location + FEventTypeValue // 4, fired when any data changes at a location and, recursively, any children +}; + +#endif diff --git a/Pods/Firebase/FMutableData.h b/Pods/Firebase/FMutableData.h new file mode 100644 index 0000000..4dbefca --- /dev/null +++ b/Pods/Firebase/FMutableData.h @@ -0,0 +1,143 @@ +/* + * Firebase iOS Client Library + * + * Copyright © 2013 Firebase - All Rights Reserved + * https://www.firebase.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binaryform must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +/** + * An FMutableData instance is populated with data from a Firebase location. + * When you are using runTransactionBlock:, you will be given an instance containing the current + * data at that location. Your block will be responsible for updating that instance to the data + * you wish to save at that location, and then returning using [FTransactionResult successWithValue:]. + * + * To modify the data, set its value property to any of the native types support by Firebase: + * * NSNumber (includes BOOL) + * * NSDictionary + * * NSArray + * * NSString + * * nil / NSNull to remove the data + * + * Note that changes made to a child FMutableData instance will be visible to the parent. + */ +@interface FMutableData : NSObject + + +/** @name Inspecting and navigating the data */ + + +/** + * Returns boolean indicating whether this mutable data has children. + * + * @return YES if this data contains child nodes. + */ +- (BOOL) hasChildren; + + +/** + * Indicates whether this mutable data has a child at the given path. + * + * @param path A path string, consisting either of a single segment, like 'child', or multiple segments, 'a/deeper/child' + * @return YES if this data contains a child at the specified relative path + */ +- (BOOL) hasChildAtPath:(NSString *)path; + + +/** + * Used to obtain an FMutableData instance that encapsulates the data at the given relative path. + * Note that changes made to the child will be visible to the parent. + * + * @param path A path string, consisting either of a single segment, like 'child', or multiple segments, 'a/deeper/child' + * @return An FMutableData instance containing the data at the given path + */ +- (FMutableData *) childDataByAppendingPath:(NSString *)path; + + +/** @name Properties */ + + +/** + * This method is deprecated. + * + * @return An FMutableData instance containing the data at the parent location, or nil if this is the top-most location + */ +@property (strong, readonly, nonatomic) FMutableData* parent __attribute__((deprecated("Deprecated. Do not use.")));; + + +/** + * To modify the data contained by this instance of FMutableData, set this to any of the native types support by Firebase: + * + * * NSNumber (includes BOOL) + * * NSDictionary + * * NSArray + * * NSString + * * nil / NSNull to remove the data + * + * Note that setting the value will override the priority at this location. + * + * @return The current data at this location as a native object + */ +@property (strong, nonatomic) id value; + + +/** + * Set this property to update the priority of the data at this location. Can be set to the following types: + * + * * NSNumber + * * NSString + * * nil / NSNull to remove the priority + * + * @return The priority of the data at this location + */ +@property (strong, nonatomic) id priority; + + +/** + * @return The number of child nodes at this location + */ +@property (readonly, nonatomic) NSUInteger childrenCount; + + +/** + * Used to iterate over the children at this location. You can use the native for .. in syntax: + * + * for (FMutableData* child in data.children) { + * ... + * } + * + * Note that this enumerator operates on an immutable copy of the child list. So, you can modify the instance + * during iteration, but the new additions will not be visible until you get a new enumerator. + */ +@property (readonly, nonatomic, strong) NSEnumerator* children; + + +/** + * @return The key name of this node, or nil if it is the top-most location + */ +@property (readonly, nonatomic, strong) NSString* key; + + +@end diff --git a/Pods/Firebase/FQuery.h b/Pods/Firebase/FQuery.h new file mode 100644 index 0000000..f2588b9 --- /dev/null +++ b/Pods/Firebase/FQuery.h @@ -0,0 +1,412 @@ +/* + * Firebase iOS Client Library + * + * Copyright © 2013 Firebase - All Rights Reserved + * https://www.firebase.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binaryform must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import "FEventType.h" +#import "FDataSnapshot.h" + +typedef NSUInteger FirebaseHandle; + +/** + * An FQuery instance represents a query over the data at a particular location. + * + * You create one by calling one of the query methods (queryStartingAtPriority:, queryEndingAtPriority:, etc.) + * on a Firebase reference. The query methods can be chained to further specify the data you are interested in + * observing + */ +@interface FQuery : NSObject + + +/** @name Attaching observers to read data */ + +/** + * observeEventType:withBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. + * + * Use removeObserverWithHandle: to stop receiving updates. + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot. + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block; + + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot + * and the previous child's key. + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block; + + +/** + * observeEventType:withBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. + * + * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot. + * @param cancelBlock The block that should be called if this client no longer has permission to receive these events + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot + * and the previous child's key. + * @param cancelBlock The block that should be called if this client no longer has permission to receive these events + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot. + */ +- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot and the previous child's key. + */ +- (void) observeSingleEventOfType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. + * + * The cancelBlock will be called if you do not have permission to read data at this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot. + * @param cancelBlock The block that will be called if you don't have permission to access this data + */ +- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * The cancelBlock will be called if you do not have permission to read data at this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot and the previous child's key. + * @param cancelBlock The block that will be called if you don't have permission to access this data + */ +- (void) observeSingleEventOfType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + +/** @name Detaching observers */ + +/** + * Detach a block previously attached with observeEventType:withBlock:. + * + * @param handle The handle returned by the call to observeEventType:withBlock: which we are trying to remove. + */ +- (void) removeObserverWithHandle:(FirebaseHandle)handle; + + +/** + * Detach all blocks previously attached to this Firebase location with observeEventType:withBlock: + */ +- (void) removeAllObservers; + +/** + * By calling `keepSynced:YES` on a location, the data for that location will automatically be downloaded and + * kept in sync, even when no listeners are attached for that location. Additionally, while a location is kept + * synced, it will not be evicted from the persistent disk cache. + * + * @param keepSynced Pass YES to keep this location synchronized, pass NO to stop synchronization. +*/ + - (void) keepSynced:(BOOL)keepSynced; + + +/** @name Querying and limiting */ + + +/** +* This method is deprecated in favor of using queryStartingAtValue:. This can be used with queryOrderedByPriority +* to query by priority. +* + * queryStartingAtPriority: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtPriority: will respond to events at nodes with a priority + * greater than or equal to startPriority + * + * @param startPriority The lower bound, inclusive, for the priority of data visible to the returned FQuery + * @return An FQuery instance, limited to data with priority greater than or equal to startPriority + */ +- (FQuery *) queryStartingAtPriority:(id)startPriority __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryStartingAtValue:] instead"))); + + +/** +* This method is deprecated in favor of using queryStartingAtValue:childKey:. This can be used with queryOrderedByPriority +* to query by priority. +* + * queryStartingAtPriority:andChildName: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtPriority:andChildName will respond to events at nodes with a priority + * greater than startPriority, or equal to startPriority and with a name greater than or equal to childName + * + * @param startPriority The lower bound, inclusive, for the priority of data visible to the returned FQuery + * @param childName The lower bound, inclusive, for the name of nodes with priority equal to startPriority + * @return An FQuery instance, limited to data with priority greater than or equal to startPriority + */ +- (FQuery *) queryStartingAtPriority:(id)startPriority andChildName:(NSString *)childName __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryStartingAtValue:childKey:] instead"))); + +/** +* This method is deprecated in favor of using queryEndingAtValue:. This can be used with queryOrderedByPriority +* to query by priority. +* + * queryEndingAtPriority: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtPriority: will respond to events at nodes with a priority + * less than or equal to startPriority and with a name greater than or equal to childName + * + * @param endPriority The upper bound, inclusive, for the priority of data visible to the returned FQuery + * @return An FQuery instance, limited to data with priority less than or equal to endPriority + */ +- (FQuery *) queryEndingAtPriority:(id)endPriority __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEndingAtValue:] instead"))); + + +/** +* This method is deprecated in favor of using queryEndingAtValue:childKey:. This can be used with queryOrderedByPriority +* to query by priority. +* + * queryEndingAtPriority:andChildName: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtPriority:andChildName will respond to events at nodes with a priority + * less than endPriority, or equal to endPriority and with a name less than or equal to childName + * + * @param endPriority The upper bound, inclusive, for the priority of data visible to the returned FQuery + * @param childName The upper bound, inclusive, for the name of nodes with priority equal to endPriority + * @return An FQuery instance, limited to data with priority less than endPriority or equal to endPriority and with a name less than or equal to childName + */ +- (FQuery *) queryEndingAtPriority:(id)endPriority andChildName:(NSString *)childName __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEndingAtValue:childKey:] instead"))); + + +/** +* This method is deprecated in favor of using queryEqualToValue:. This can be used with queryOrderedByPriority +* to query by priority. +* +* queryEqualToPriority: is used to generate a reference to a limited view of the data at this location. +* The FQuery instance returned by queryEqualToPriority: will respond to events at nodes with a priority equal to +* supplied argument. +* +* @param priority The priority that the data returned by this FQuery will have +* @return An Fquery instance, limited to data with the supplied priority. +*/ +- (FQuery *) queryEqualToPriority:(id)priority __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEqualToValue:] instead"))); + + +/** +* This method is deprecated in favor of using queryEqualAtValue:childKey:. This can be used with queryOrderedByPriority +* to query by priority. +* +* queryEqualToPriority:andChildName: is used to generate a reference to a limited view of the data at this location. +* The FQuery instance returned by queryEqualToPriority:andChildName will respond to events at nodes with a priority +* equal to the supplied argument with a name equal to childName. There will be at most one node that matches because +* child names are unique. +* +* @param priority The priority that the data returned by this FQuery will have +* @param childName The name of nodes with the right priority +* @return An FQuery instance, limited to data with the supplied priority and the name. +*/ +- (FQuery *) queryEqualToPriority:(id)priority andChildName:(NSString *)childName __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEqualToValue:childKey:] instead"))); + +/** + * This method is deprecated in favor of using queryLimitedToFirst:limit or queryLimitedToLast:limit instead. + * + * queryLimitedToNumberOfChildren: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryLimitedToNumberOfChildren: will respond to events from at most limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to receive events for + * @return An FQuery instance, limited to at most limit child nodes. + */ +- (FQuery *) queryLimitedToNumberOfChildren:(NSUInteger)limit __attribute__((deprecated("Use [FQuery queryLimitedToFirst:limit] or [FQuery queryLimitedToLast:limit] instead"))); + + +/** +* queryLimitedToFirst: is used to generate a reference to a limited view of the data at this location. +* The FQuery instance returned by queryLimitedToFirst: will respond to at most the first limit child nodes. +* +* @param limit The upper bound, inclusive, for the number of child nodes to receive events for +* @return An FQuery instance, limited to at most limit child nodes. +*/ +- (FQuery *) queryLimitedToFirst:(NSUInteger)limit; + + +/** +* queryLimitedToLast: is used to generate a reference to a limited view of the data at this location. +* The FQuery instance returned by queryLimitedToLast: will respond to at most the last limit child nodes. +* +* @param limit The upper bound, inclusive, for the number of child nodes to receive events for +* @return An FQuery instance, limited to at most limit child nodes. +*/ +- (FQuery *) queryLimitedToLast:(NSUInteger)limit; + +/** +* queryOrderBy: is used to generate a reference to a view of the data that's been sorted by the values of +* a particular child key. This method is intended to be used in combination with queryStartingAtValue:, +* queryEndingAtValue:, or queryEqualToValue:. +* + * @param key The child key to use in ordering data visible to the returned FQuery + * @return An FQuery instance, ordered by the values of the specified child key. +*/ +- (FQuery *) queryOrderedByChild:(NSString *)key; + +/** + * queryOrderedByKey: is used to generate a reference to a view of the data that's been sorted by child key. + * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, + * or queryEqualToValue:. + * + * @return An FQuery instance, ordered by child keys. + */ +- (FQuery *) queryOrderedByKey; + +/** + * queryOrderedByValue: is used to generate a reference to a view of the data that's been sorted by child value. + * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, + * or queryEqualToValue:. + * + * @return An FQuery instance, ordered by child value. + */ +- (FQuery *) queryOrderedByValue; + +/** + * queryOrderedByPriority: is used to generate a reference to a view of the data that's been sorted by child + * priority. This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, + * or queryEqualToValue:. + * + * @return An FQuery instance, ordered by child priorities. + */ +- (FQuery *) queryOrderedByPriority; + +/** + * queryStartingAtValue: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtValue: will respond to events at nodes with a value + * greater than or equal to startValue. + * + * @param startValue The lower bound, inclusive, for the value of data visible to the returned FQuery + * @return An FQuery instance, limited to data with value greater than or equal to startValue + */ +- (FQuery *) queryStartingAtValue:(id)startValue; + +/** + * queryStartingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtValue:childKey will respond to events at nodes with a value + * greater than startValue, or equal to startValue and with a key greater than or equal to childKey. + * + * @param startValue The lower bound, inclusive, for the value of data visible to the returned FQuery + * @param childKey The lower bound, inclusive, for the key of nodes with value equal to startValue + * @return An FQuery instance, limited to data with value greater than or equal to startValue + */ +- (FQuery *) queryStartingAtValue:(id)startValue childKey:(NSString *)childKey; + +/** + * queryEndingAtValue: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtValue: will respond to events at nodes with a value + * less than or equal to endValue. + * + * @param endValue The upper bound, inclusive, for the value of data visible to the returned FQuery + * @return An FQuery instance, limited to data with value less than or equal to endValue + */ +- (FQuery *) queryEndingAtValue:(id)endValue; + +/** + * queryEndingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtValue:childKey will respond to events at nodes with a value + * less than endValue, or equal to endValue and with a key less than or equal to childKey. + * + * @param endValue The upper bound, inclusive, for the value of data visible to the returned FQuery + * @param childKey The upper bound, inclusive, for the key of nodes with value equal to endValue + * @return An FQuery instance, limited to data with value less than or equal to endValue + */ +- (FQuery *) queryEndingAtValue:(id)endValue childKey:(NSString *)childKey; + +/** + * queryEqualToValue: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEqualToValue: will respond to events at nodes with a value equal + * to the supplied argument. + * + * @param value The value that the data returned by this FQuery will have + * @return An Fquery instance, limited to data with the supplied value. + */ +- (FQuery *) queryEqualToValue:(id)value; + +/** + * queryEqualToValue:childKey: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEqualToValue:childKey will respond to events at nodes with a value + * equal to the supplied argument with a name equal to childKey. There will be at most one node that matches because + * child keys are unique. + * + * @param value The value that the data returned by this FQuery will have + * @param childKey The name of nodes with the right value + * @return An FQuery instance, limited to data with the supplied value and the key. + */ +- (FQuery *) queryEqualToValue:(id)value childKey:(NSString *)childKey; + + +/** @name Properties */ + + +/** +* Get a Firebase reference for the location of this query. +* +* @return A Firebase instance for the location of this query. +*/ +@property (nonatomic, readonly, strong) Firebase* ref; + +@end diff --git a/Pods/Firebase/FTransactionResult.h b/Pods/Firebase/FTransactionResult.h new file mode 100644 index 0000000..a478f65 --- /dev/null +++ b/Pods/Firebase/FTransactionResult.h @@ -0,0 +1,53 @@ +/* + * Firebase iOS Client Library + * + * Copyright © 2013 Firebase - All Rights Reserved + * https://www.firebase.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binaryform must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import "FMutableData.h" + +/** + * Used for runTransactionBlock:. An FTransactionResult instance is a container for the results of the transaction. + */ +@interface FTransactionResult : NSObject + +/** + * Used for runTransactionBlock:. Indicates that the new value should be saved at this location + * + * @param value An FMutableData instance containing the new value to be set + * @return An FTransactionResult instance that can be used as a return value from the block given to runTransactionBlock: + */ ++ (FTransactionResult *) successWithValue:(FMutableData *)value; + + +/** + * Used for runTransactionBlock:. Indicates that the current transaction should no longer proceed. + * + * @return An FTransactionResult instance that can be used as a return value from the block given to runTransactionBlock: + */ ++ (FTransactionResult *) abort; + +@end diff --git a/Pods/Firebase/Firebase.framework/Firebase b/Pods/Firebase/Firebase.framework/Firebase new file mode 100644 index 0000000..6d95b57 Binary files /dev/null and b/Pods/Firebase/Firebase.framework/Firebase differ diff --git a/Pods/Firebase/Firebase.h b/Pods/Firebase/Firebase.h new file mode 100644 index 0000000..7938d04 --- /dev/null +++ b/Pods/Firebase/Firebase.h @@ -0,0 +1,1055 @@ +/* + * Firebase iOS Client Library + * + * Copyright © 2013 Firebase - All Rights Reserved + * https://www.firebase.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binaryform must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#import +#import "FQuery.h" +#import "FirebaseApp.h" +#import "FDataSnapshot.h" +#import "FMutableData.h" +#import "FTransactionResult.h" +#import "FAuthData.h" +#import "FAuthType.h" +#import "FirebaseServerValue.h" +#import "FConfig.h" + +/** + * A Firebase reference represents a particular location in your Firebase + * and can be used for reading or writing data to that Firebase location. + * + * This class is the starting point for all Firebase operations. After you've + * initialized it with initWithUrl: you can use it + * to read data (ie. observeEventType:withBlock:), write data (ie. setValue:), and to create new + * Firebase references (ie. child:). + */ +@interface Firebase : FQuery + + +/** @name Initializing a Firebase object */ + +/** + * Initialize this Firebase reference with an absolute URL. + * + * @param url The Firebase URL (ie: https://SampleChat.firebaseIO-demo.com) + */ +- (id)initWithUrl:(NSString *)url; + +/** @name Getting references to children locations */ + +/** + * Get a Firebase reference for the location at the specified relative path. + * The relative path can either be a simple child key (e.g. 'fred') or a + * deeper slash-separated path (e.g. 'fred/name/first'). + * + * @param pathString A relative path from this location to the desired child location. + * @return A Firebase reference for the specified relative path. + */ +- (Firebase *) childByAppendingPath:(NSString *)pathString; + + +/** + * childByAutoId generates a new child location using a unique key and returns a + * Firebase reference to it. This is useful when the children of a Firebase + * location represent a list of items. + * + * The unique key generated by childByAutoId: is prefixed with a client-generated + * timestamp so that the resulting list will be chronologically-sorted. + * + * @return A Firebase reference for the generated location. + */ +- (Firebase *) childByAutoId; + + +/** @name Writing data */ + +/*! Write data to this Firebase location. + +This will overwrite any data at this location and all child locations. + +Data types that can be set are: + +- NSString -- @"Hello World" +- NSNumber (also includes boolean) -- @YES, @43, @4.333 +- NSDictionary -- @{@"key": @"value", @"nested": @{@"another": @"value"} } +- NSArray + +The effect of the write will be visible immediately and the corresponding +events will be triggered. Synchronization of the data to the Firebase +servers will also be started. + +Passing null for the new value is equivalent to calling remove:; +all data at this location or any child location will be deleted. + +Note that setValue: will remove any priority stored at this location, so if priority +is meant to be preserved, you should use setValue:andPriority: instead. + + +**Server Values** - Placeholder values you may write into Firebase as a value or priority +that will automatically be populated by the Firebase Server. + +- kFirebaseServerValueTimestamp - The number of milliseconds since the Unix epoch + + +@param value The value to be written. + */ +- (void) setValue:(id)value; + + +#define kFirebaseServerValueTimestamp @{ @".sv": @"timestamp" } + +/** + * The same as setValue: with a block that gets triggered after the write operation has + * been committed to the Firebase servers. + * + * @param value The value to be written. + * @param block The block to be called after the write has been committed to the Firebase servers. + */ +- (void) setValue:(id)value withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + +/** + * The same as setValue: with an additional priority to be attached to the data being written. + * Priorities are used to order items. + * + * @param value The value to be written. + * @param priority The priority to be attached to that data. + */ +- (void) setValue:(id)value andPriority:(id)priority; + + +/** + * The same as setValue:andPriority: with a block that gets triggered after the write operation has + * been committed to the Firebase servers. + * + * @param value The value to be written. + * @param priority The priority to be attached to that data. + * @param block The block to be called after the write has been committed to the Firebase servers. + */ +- (void) setValue:(id)value andPriority:(id)priority withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + +/** + * Remove the data at this Firebase location. Any data at child locations will also be deleted. + * + * The effect of the delete will be visible immediately and the corresponding events + * will be triggered. Synchronization of the delete to the Firebase servers will + * also be started. + * + * remove: is equivalent to calling setValue:nil + */ +- (void) removeValue; + + +/** + * The same as remove: with a block that gets triggered after the remove operation has + * been committed to the Firebase servers. + * + * @param block The block to be called after the remove has been committed to the Firebase servers. + */ +- (void) removeValueWithCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + +/** + * Set a priority for the data at this Firebase location. + * Priorities can be used to provide a custom ordering for the children at a location + * (if no priorities are specified, the children are ordered by key). + * + * You cannot set a priority on an empty location. For this reason + * setValue:andPriority: should be used when setting initial data with a specific priority + * and setPriority: should be used when updating the priority of existing data. + * + * Children are sorted based on this priority using the following rules: + * + * Children with no priority come first. + * Children with a number as their priority come next. They are sorted numerically by priority (small to large). + * Children with a string as their priority come last. They are sorted lexicographically by priority. + * Whenever two children have the same priority (including no priority), they are sorted by key. Numeric + * keys come first (sorted numerically), followed by the remaining keys (sorted lexicographically). + * + * Note that priorities are parsed and ordered as IEEE 754 double-precision floating-point numbers. + * Keys are always stored as strings and are treated as numbers only when they can be parsed as a + * 32-bit integer + * + * @param priority The priority to set at the specified location. + */ +- (void) setPriority:(id)priority; + + +/** + * The same as setPriority: with a block block that is called once the priority has + * been committed to the Firebase servers. + * + * @param priority The priority to set at the specified location. + * @param block The block that is triggered after the priority has been written on the servers. + */ +- (void) setPriority:(id)priority withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + +/** + * Update changes the values at the specified paths in the dictionary without overwriting other + * keys at this location. + * + * @param values A dictionary of the keys to change and their new values + */ +- (void) updateChildValues:(NSDictionary *)values; + +/** + * The same as update: with a block block that is called once the update has been committed to the + * Firebase servers + * + * @param values A dictionary of the keys to change and their new values + * @param block The block that is triggered after the update has been written on the Firebase servers + */ +- (void) updateChildValues:(NSDictionary *)values withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + +/** @name Attaching observers to read data */ + +/** + * observeEventType:withBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. + * + * Use removeObserverWithHandle: to stop receiving updates. + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot. + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block; + + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot + * and the previous child's key. + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block; + + +/** + * observeEventType:withBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. + * + * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot. + * @param cancelBlock The block that should be called if this client no longer has permission to receive these events + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + + +/** + * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. + * This is the primary way to read data from Firebase. Your block will be triggered + * for the initial data and again whenever the data changes. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. + * + * Use removeObserverWithHandle: to stop receiving updates. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called with initial data and updates. It is passed the data as an FDataSnapshot + * and the previous child's key. + * @param cancelBlock The block that should be called if this client no longer has permission to receive these events + * @return A handle used to unregister this block later using removeObserverWithHandle: + */ +- (FirebaseHandle) observeEventType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot. + */ +- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot and the previous child's key. + */ +- (void) observeSingleEventOfType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. + * + * The cancelBlock will be called if you do not have permission to read data at this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot. + * @param cancelBlock The block that will be called if you don't have permission to access this data + */ +- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + + +/** + * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FEventTypeChildAdded, FEventTypeChildMoved, and + * FEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. + * + * The cancelBlock will be called if you do not have permission to read data at this location. + * + * @param eventType The type of event to listen for. + * @param block The block that should be called. It is passed the data as an FDataSnapshot and the previous child's key. + * @param cancelBlock The block that will be called if you don't have permission to access this data + */ +- (void) observeSingleEventOfType:(FEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FDataSnapshot* snapshot, NSString* prevKey))block withCancelBlock:(void (^)(NSError* error))cancelBlock; + +/** @name Detaching observers */ + +/** + * Detach a block previously attached with observeEventType:withBlock:. + * + * @param handle The handle returned by the call to observeEventType:withBlock: which we are trying to remove. + */ +- (void) removeObserverWithHandle:(FirebaseHandle)handle; + +/** + * By calling `keepSynced:YES` on a location, the data for that location will automatically be downloaded and + * kept in sync, even when no listeners are attached for that location. Additionally, while a location is kept + * synced, it will not be evicted from the persistent disk cache. + * + * @param keepSynced Pass YES to keep this location synchronized, pass NO to stop synchronization. + */ +- (void) keepSynced:(BOOL)keepSynced; + + +/** + * Calling removeAllObservers does not remove any observers at child references. + * removeAllObservers must be called again for each child reference where a listener was established to remove the observers. + */ +- (void) removeAllObservers; + +/** @name Querying and limiting */ + + +/** + * This method is deprecated in favor of using queryStartingAtValue:. This can be used with queryOrderedByPriority + * to query by priority. + * + * queryStartingAtPriority: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtPriority: will respond to events at nodes with a priority + * greater than or equal to startPriority + * + * @param startPriority The lower bound, inclusive, for the priority of data visible to the returned FQuery + * @return An FQuery instance, limited to data with priority greater than or equal to startPriority + */ +- (FQuery *) queryStartingAtPriority:(id)startPriority __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryStartingAtValue:] instead"))); + + +/** + * This method is deprecated in favor of using queryStartingAtValue:childKey:. This can be used with queryOrderedByPriority + * to query by priority. + * + * queryStartingAtPriority:andChildName: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtPriority:andChildName will respond to events at nodes with a priority + * greater than startPriority, or equal to startPriority and with a name greater than or equal to childName + * + * @param startPriority The lower bound, inclusive, for the priority of data visible to the returned FQuery + * @param childName The lower bound, inclusive, for the name of nodes with priority equal to startPriority + * @return An FQuery instance, limited to data with priority greater than or equal to startPriority + */ +- (FQuery *) queryStartingAtPriority:(id)startPriority andChildName:(NSString *)childName __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryStartingAtValue:childKey:] instead"))); + +/** + * This method is deprecated in favor of using queryEndingAtValue:. This can be used with queryOrderedByPriority + * to query by priority. + * + * queryEndingAtPriority: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtPriority: will respond to events at nodes with a priority + * less than or equal to startPriority and with a name greater than or equal to childName + * + * @param endPriority The upper bound, inclusive, for the priority of data visible to the returned FQuery + * @return An FQuery instance, limited to data with priority less than or equal to endPriority + */ +- (FQuery *) queryEndingAtPriority:(id)endPriority __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEndingAtValue:] instead"))); + + +/** + * This method is deprecated in favor of using queryEndingAtValue:childKey:. This can be used with queryOrderedByPriority + * to query by priority. + * + * queryEndingAtPriority:andChildName: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtPriority:andChildName will respond to events at nodes with a priority + * less than endPriority, or equal to endPriority and with a name less than or equal to childName + * + * @param endPriority The upper bound, inclusive, for the priority of data visible to the returned FQuery + * @param childName The upper bound, inclusive, for the name of nodes with priority equal to endPriority + * @return An FQuery instance, limited to data with priority less than endPriority or equal to endPriority and with a name less than or equal to childName + */ +- (FQuery *) queryEndingAtPriority:(id)endPriority andChildName:(NSString *)childName __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEndingAtValue:childKey:] instead"))); + + +/** + * This method is deprecated in favor of using queryEqualToValue:. This can be used with queryOrderedByPriority + * to query by priority. + * + * queryEqualToPriority: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEqualToPriority: will respond to events at nodes with a priority equal to + * supplied argument. + * + * @param priority The priority that the data returned by this FQuery will have + * @return An Fquery instance, limited to data with the supplied priority. + */ +- (FQuery *) queryEqualToPriority:(id)priority __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEqualToValue:] instead"))); + + +/** + * This method is deprecated in favor of using queryEqualAtValue:childKey:. This can be used with queryOrderedByPriority + * to query by priority. + * + * queryEqualToPriority:andChildName: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEqualToPriority:andChildName will respond to events at nodes with a priority + * equal to the supplied argument with a name equal to childName. There will be at most one node that matches because + * child names are unique. + * + * @param priority The priority that the data returned by this FQuery will have + * @param childName The name of nodes with the right priority + * @return An FQuery instance, limited to data with the supplied priority and the name. + */ +- (FQuery *) queryEqualToPriority:(id)priority andChildName:(NSString *)childName __attribute__((deprecated("Use [[FQuery queryOrderedByPriority] queryEqualToValue:childKey:] instead"))); + +/** + * This method is deprecated in favor of using queryLimitedToFirst:limit or queryLimitedToLast:limit instead. + * + * queryLimitedToNumberOfChildren: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryLimitedToNumberOfChildren: will respond to events from at most limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to receive events for + * @return An FQuery instance, limited to at most limit child nodes. + */ +- (FQuery *) queryLimitedToNumberOfChildren:(NSUInteger)limit __attribute__((deprecated("Use [FQuery queryLimitedToFirst:limit] or [FQuery queryLimitedToLast:limit] instead"))); + + +/** + * queryLimitedToFirst: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryLimitedToFirst: will respond to at most the first limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to receive events for + * @return An FQuery instance, limited to at most limit child nodes. + */ +- (FQuery *) queryLimitedToFirst:(NSUInteger)limit; + + +/** + * queryLimitedToLast: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryLimitedToLast: will respond to at most the last limit child nodes. + * + * @param limit The upper bound, inclusive, for the number of child nodes to receive events for + * @return An FQuery instance, limited to at most limit child nodes. + */ +- (FQuery *) queryLimitedToLast:(NSUInteger)limit; + +/** + * queryOrderBy: is used to generate a reference to a view of the data that's been sorted by the values of + * a particular child key. This method is intended to be used in combination with queryStartingAtValue:, + * queryEndingAtValue:, or queryEqualToValue:. + * + * @param key The child key to use in ordering data visible to the returned FQuery + * @return An FQuery instance, ordered by the values of the specified child key. + */ +- (FQuery *) queryOrderedByChild:(NSString *)key; + +/** + * queryOrderedByKey: is used to generate a reference to a view of the data that's been sorted by child key. + * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, + * or queryEqualToValue:. + * + * @return An FQuery instance, ordered by child keys. + */ +- (FQuery *) queryOrderedByKey; + +/** + * queryOrderedByPriority: is used to generate a reference to a view of the data that's been sorted by child + * priority. This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, + * or queryEqualToValue:. + * + * @return An FQuery instance, ordered by child priorities. + */ +- (FQuery *) queryOrderedByPriority; + +/** + * queryStartingAtValue: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtValue: will respond to events at nodes with a value + * greater than or equal to startValue. + * + * @param startValue The lower bound, inclusive, for the value of data visible to the returned FQuery + * @return An FQuery instance, limited to data with value greater than or equal to startValue + */ +- (FQuery *) queryStartingAtValue:(id)startValue; + +/** + * queryStartingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryStartingAtValue:childKey will respond to events at nodes with a value + * greater than startValue, or equal to startValue and with a key greater than or equal to childKey. + * + * @param startValue The lower bound, inclusive, for the value of data visible to the returned FQuery + * @param childKey The lower bound, inclusive, for the key of nodes with value equal to startValue + * @return An FQuery instance, limited to data with value greater than or equal to startValue + */ +- (FQuery *) queryStartingAtValue:(id)startValue childKey:(NSString *)childKey; + +/** + * queryEndingAtValue: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtValue: will respond to events at nodes with a value + * less than or equal to endValue. + * + * @param endValue The upper bound, inclusive, for the value of data visible to the returned FQuery + * @return An FQuery instance, limited to data with value less than or equal to endValue + */ +- (FQuery *) queryEndingAtValue:(id)endValue; + +/** + * queryEndingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEndingAtValue:childKey will respond to events at nodes with a value + * less than endValue, or equal to endValue and with a key less than or equal to childKey. + * + * @param endValue The upper bound, inclusive, for the value of data visible to the returned FQuery + * @param childKey The upper bound, inclusive, for the key of nodes with value equal to endValue + * @return An FQuery instance, limited to data with value less than or equal to endValue + */ +- (FQuery *) queryEndingAtValue:(id)endValue childKey:(NSString *)childKey; + +/** + * queryEqualToValue: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEqualToValue: will respond to events at nodes with a value equal + * to the supplied argument. + * + * @param value The value that the data returned by this FQuery will have + * @return An Fquery instance, limited to data with the supplied value. + */ +- (FQuery *) queryEqualToValue:(id)value; + +/** + * queryEqualToValue:childKey: is used to generate a reference to a limited view of the data at this location. + * The FQuery instance returned by queryEqualToValue:childKey will respond to events at nodes with a value + * equal to the supplied argument with a key equal to childKey. There will be at most one node that matches because + * child keys are unique. + * + * @param value The value that the data returned by this FQuery will have + * @param childKey The key of nodes with the right value + * @return An FQuery instance, limited to data with the supplied value and the key. + */ +- (FQuery *) queryEqualToValue:(id)value childKey:(NSString *)childKey; + +/** @name Managing presence */ + +/** + * Ensure the data at this location is set to the specified value when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * onDisconnectSetValue: is especially useful for implementing "presence" systems, + * where a value should be changed or cleared when a user disconnects + * so that he appears "offline" to other users. + * + * @param value The value to be set after the connection is lost. + */ +- (void) onDisconnectSetValue:(id)value; + + +/** + * Ensure the data at this location is set to the specified value when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * The completion block will be triggered when the operation has been successfully queued up on the Firebase servers + * + * @param value The value to be set after the connection is lost. + * @param block Block to be triggered when the operation has been queued up on the Firebase servers + */ +- (void) onDisconnectSetValue:(id)value withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + +/** + * Ensure the data at this location is set to the specified value and priority when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * @param value The value to be set after the connection is lost. + * @param priority The priority to be set after the connection is lost. + */ +- (void) onDisconnectSetValue:(id)value andPriority:(id)priority; + + +/** + * Ensure the data at this location is set to the specified value and priority when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * The completion block will be triggered when the operation has been successfully queued up on the Firebase servers + * + * @param value The value to be set after the connection is lost. + * @param priority The priority to be set after the connection is lost. + * @param block Block to be triggered when the operation has been queued up on the Firebase servers + */ +- (void) onDisconnectSetValue:(id)value andPriority:(id)priority withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + +/** + * Ensure the data at this location is removed when + * the client is disconnected (due to closing the app, navigating + * to a new page, or network issues). + * + * onDisconnectRemoveValue is especially useful for implementing "presence" systems. + */ +- (void) onDisconnectRemoveValue; + + +/** + * Ensure the data at this location is removed when + * the client is disconnected (due to closing the app, navigating + * to a new page, or network issues). + * + * onDisconnectRemoveValueWithCompletionBlock: is especially useful for implementing "presence" systems. + * + * @param block Block to be triggered when the operation has been queued up on the Firebase servers + */ +- (void) onDisconnectRemoveValueWithCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + + +/** + * Ensure the data has the specified child values updated when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * + * @param values A dictionary of child node keys and the values to set them to after the connection is lost. + */ +- (void) onDisconnectUpdateChildValues:(NSDictionary *)values; + + +/** + * Ensure the data has the specified child values updated when + * the client is disconnected (due to closing the browser, navigating + * to a new page, or network issues). + * + * + * @param values A dictionary of child node keys and the values to set them to after the connection is lost. + * @param block A block that will be called once the operation has been queued up on the Firebase servers + */ +- (void) onDisconnectUpdateChildValues:(NSDictionary *)values withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + +/** + * Cancel any operations that are set to run on disconnect. If you previously called onDisconnectSetValue:, + * onDisconnectRemoveValue:, or onDisconnectUpdateChildValues:, and no longer want the values updated when the + * connection is lost, call cancelDisconnectOperations: + */ +- (void) cancelDisconnectOperations; + + +/** + * Cancel any operations that are set to run on disconnect. If you previously called onDisconnectSetValue:, + * onDisconnectRemoveValue:, or onDisconnectUpdateChildValues:, and no longer want the values updated when the + * connection is lost, call cancelDisconnectOperations: + * + * @param block A block that will be triggered once the Firebase servers have acknowledged the cancel request. + */ +- (void) cancelDisconnectOperationsWithCompletionBlock:(void (^)(NSError* error, Firebase* ref))block; + + +/** @name Reading and observing authentication data */ + +/** +* Get the authentication data of the current user. +* +* @return Authentication data of the current user. +*/ +@property (nonatomic, strong, readonly) FAuthData *authData; + + +/** +* Observer block will be triggered whenever a user gets authenticated or logged out. +* +* Authentication data is persisted across app restarts. If your have an old authentication, Firebase will attempt to +* resume your old session. This approach does not wait for a server roundtrip. Rather, it inspects the +* contents of the persisted JWT and assumes that the Firebase secret used to generate the token has not been revoked. +* +* In the event that the Firebase secret used to generate the token has been revoked, observers will likely see one +* flicker / rapid flip-flop of authentication state once the server rejects the token. +* +* Use removeAuthEventObserverWithHandle: to stop receiving updates. +* +* @param block The block that should be called with initial authentication data and future updates +* @return A handle used to unregister this block later with removeAuthEventObserverWithHandle: +*/ +- (FirebaseHandle) observeAuthEventWithBlock:(void (^)(FAuthData *authData))block; + + +/** +* Detach a block previously attached with observeAuthEventWithBlock:. +* +* @param handle The handle returned by the call to observeAuthEventWithBlock: which we are trying to remove. +*/ +- (void) removeAuthEventObserverWithHandle:(FirebaseHandle)handle; + +/** @name User creation and modification */ + +/** +* Used to create a new user account with the given email and password combo. The results will be passed to the given block. +* Note that this method will not log the new user in. +* +* @param email The email for the account to be created +* @param password The password for the account to be created +* @param block The block to be called with the results of the operation +*/ +- (void) createUser:(NSString *)email password:(NSString *)password withCompletionBlock:(void (^)(NSError *error))block; + +/** + * Used to create a new user account with the given email and password combo. The results will be passed + * to the given block. Note that this method will not log the new user in. On success, invokes the result + * block with an dictionary of user data, including the user id. + * + * @param email The email for the account to be created + * @param password The password for the account to be created + * @param block The block to be called with the results of the operation + */ +- (void) createUser:(NSString *)email password:(NSString *)password withValueCompletionBlock:(void (^)(NSError *error, NSDictionary *result))block; + +/** +* Remove a user account with the given email and password. +* +* @param email The email of the account to be removed +* @param password The password for the account to be removed +* @param block A block to receive the results of the operation +*/ +- (void) removeUser:(NSString *)email password:(NSString *)password withCompletionBlock:(void (^)(NSError *error))block; + + +/** +* Attempts to change the password for the account with the given credentials to the new password given. Results are reported to the supplied block. +* +* @param email The email for the account to be changed +* @param oldPassword The old password for the account to be changed +* @param newPassword The desired newPassword for the account +* @param block A block to receive the results of the operation +*/ +- (void) changePasswordForUser:(NSString *)email fromOld:(NSString *)oldPassword toNew:(NSString *)newPassword withCompletionBlock:(void (^)(NSError *error))block; + + +/** + * Attempts to change the email for the account with the given credentials to the new email given. Results are reported to the supplied block. + * + * @param email The email for the account to be changed + * @param password The password for the account to be changed + * @param newEmail The desired newEmail for the account + * @param block A block to receive the results of the operation + */ +- (void) changeEmailForUser:(NSString *)email password:(NSString *)password toNewEmail:(NSString *)newEmail withCompletionBlock:(void (^)(NSError *error))block; + + +/** +* Send a password reset email to the owner of the account with the given email. Results are reported to the supplied block. +* +* @param email The email of the account to be removed +* @param block A block to receive the results of the operation +*/ +- (void) resetPasswordForUser:(NSString *)email withCompletionBlock:(void (^)(NSError* error))block; + +/** @name Authenticating */ + +/** +* Attempts to log the user in anonymously. The block will receive the results of the attempt. +* +* @param block A block to receive the results of the authentication attempt. +*/ +- (void) authAnonymouslyWithCompletionBlock:(void (^)(NSError *error, FAuthData *authData))block; + +/** +* Attempts to authenticate to Firebase with the given credentials. The block will receive the results of the attempt. +* +* @param email The email of the account +* @param password The password for the account +* @param block A block to receive the results of the authentication attempt +*/ +- (void) authUser:(NSString *)email password:(NSString *)password withCompletionBlock:(void (^)(NSError *error, FAuthData *authData))block; + +/** +* Authenticate access to this Firebase using the provided credentials. +* +* The completion block will be called with the results of the authenticated attempt. Unlike +* authWithCredential:withCompletionBlock:withCancelBlock:, no block will be called when the credentials become invalid. +* +* Instead, please use observeAuthEventWithBlock: to observe if a user gets logged out. +* +* @param token The Firebase authentication JWT generated by a secure code on a remote server. +* @param block This block will be called with the results of the authentication attempt +*/ +- (void) authWithCustomToken:(NSString *)token withCompletionBlock:(void (^)(NSError *error, FAuthData *authData))block; + +/** +* Authenticate to Firebase with an OAuth token from a provider. +* +* This method works with current OAuth 2.0 providers such as Facebook, Google+, and Github. +* +* For other providers that Firebase supports which require additional parameters for login, such as Twitter, please use authWithOAuthProvider:parameters:withCompletionBlock:. +* +* @param provider The provider, all lower case with no spaces. +* @param oauthToken The OAuth Token to authenticate with the provider +* @param block A block to receive the results of the authentication attempt +*/ +- (void) authWithOAuthProvider:(NSString *)provider token:(NSString *)oauthToken withCompletionBlock:(void (^) (NSError *error, FAuthData *authData))block; + +/** +* Authenticate to Firebase with an OAuth token from a provider. +* +* This method is for OAuth providers that require extra parameters when authentication with the server, such as Twitter. +* The OAuth token should be included as a parameter. +* +* @param provider The provider, all lowercase with no spaces. +* @param parameters The parameters necessary to authenticate with the provider +* @param block A block to receive the results of the authentication attempt +*/ +- (void) authWithOAuthProvider:(NSString *)provider parameters:(NSDictionary *)parameters withCompletionBlock:(void (^) (NSError *error, FAuthData *authData))block; + +/** +* Make a reverse OAuth Request to a provider. +* +* This method is for OAuth providers that require a reverse request be made first. The json output of this block +* +* @param provider The provider, all lowercase with no spaces. +* @param block The block to receive the results of the reverse OAuth request. +*/ +- (void) makeReverseOAuthRequestTo:(NSString *)provider withCompletionBlock:(void (^)(NSError *error, NSDictionary *json))block; + +/** +* Removes any credentials associated with this Firebase. +*/ +- (void) unauth; + +/** +* This method is deprecated. Use authWithCustomToken:withCompletionBlock: instead. +* +* Authenticate access to this Firebase using the provided credentials. The completion block will be called with +* the results of the authenticated attempt, and the cancelBlock will be called if the credentials become invalid +* at some point after authentication has succeeded. +* +* @param credential The Firebase authentication JWT generated by a secure code on a remote server. +* @param block This block will be called with the results of the authentication attempt +* @param cancelBlock This block will be called if at any time in the future the credentials become invalid +*/ +- (void) authWithCredential:(NSString *)credential withCompletionBlock:(void (^) (NSError* error, id data))block withCancelBlock:(void (^)(NSError* error))cancelBlock __attribute__((deprecated("Use authWithCustomToken:withCompletionblock: instead"))); + +/** +* This method is deprecated. Use unauth: instead. +* +* Removes any credentials associated with this Firebase. The callback block will be triggered after this operation +* has been acknowledged by the Firebase servers. +* +* @param block This block will be called once the unauth has completed. +*/ +- (void) unauthWithCompletionBlock:(void (^)(NSError* error))block __attribute__((deprecated("Use unauth: instead"))); + + +/** @name Manual Connection Management */ + +/** + * Manually disconnect the Firebase client from the server and disable automatic reconnection. + * + * The Firebase client automatically maintains a persistent connection to the Firebase server, + * which will remain active indefinitely and reconnect when disconnected. However, the goOffline( ) + * and goOnline( ) methods may be used to manually control the client connection in cases where + * a persistent connection is undesirable. + * + * While offline, the Firebase client will no longer receive data updates from the server. However, + * all Firebase operations performed locally will continue to immediately fire events, allowing + * your application to continue behaving normally. Additionally, each operation performed locally + * will automatically be queued and retried upon reconnection to the Firebase server. + * + * To reconnect to the Firebase server and begin receiving remote events, see goOnline( ). + * Once the connection is reestablished, the Firebase client will transmit the appropriate data + * and fire the appropriate events so that your client "catches up" automatically. + * + * Note: Invoking this method will impact all Firebase connections. + */ ++ (void) goOffline; + +/** + * Manually reestablish a connection to the Firebase server and enable automatic reconnection. + * + * The Firebase client automatically maintains a persistent connection to the Firebase server, + * which will remain active indefinitely and reconnect when disconnected. However, the goOffline( ) + * and goOnline( ) methods may be used to manually control the client connection in cases where + * a persistent connection is undesirable. + * + * This method should be used after invoking goOffline( ) to disable the active connection. + * Once reconnected, the Firebase client will automatically transmit the proper data and fire + * the appropriate events so that your client "catches up" automatically. + * + * To disconnect from the Firebase server, see goOffline( ). + * + * Note: Invoking this method will impact all Firebase connections. + */ ++ (void) goOnline; + + +/** @name Transactions */ + +/** + * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with an FMutableData + * instance that contains the current data at this location. Your block should update this data to the value you + * wish to write to this location, and then return an instance of FTransactionResult with the new data. + * + * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run + * again with the latest data from the server. + * + * When your block is run, you may decide to abort the transaction by return [FTransactionResult abort]. + * + * @param block This block receives the current data at this location and must return an instance of FTransactionResult + */ +- (void) runTransactionBlock:(FTransactionResult* (^) (FMutableData* currentData))block; + + +/** + * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with an FMutableData + * instance that contains the current data at this location. Your block should update this data to the value you + * wish to write to this location, and then return an instance of FTransactionResult with the new data. + * + * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run + * again with the latest data from the server. + * + * When your block is run, you may decide to abort the transaction by return [FTransactionResult abort]. + * + * @param block This block receives the current data at this location and must return an instance of FTransactionResult + * @param completionBlock This block will be triggered once the transaction is complete, whether it was successful or not. It will indicate if there was an error, whether or not the data was committed, and what the current value of the data at this location is. + */ +- (void) runTransactionBlock:(FTransactionResult* (^) (FMutableData* currentData))block andCompletionBlock:(void (^) (NSError* error, BOOL committed, FDataSnapshot* snapshot))completionBlock; + + + +/** + * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with an FMutableData + * instance that contains the current data at this location. Your block should update this data to the value you + * wish to write to this location, and then return an instance of FTransactionResult with the new data. + * + * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run + * again with the latest data from the server. + * + * When your block is run, you may decide to abort the transaction by return [FTransactionResult abort]. + * + * Since your block may be run multiple times, this client could see several immediate states that don't exist on the server. You can suppress those immediate states until the server confirms the final state of the transaction. + * + * @param block This block receives the current data at this location and must return an instance of FTransactionResult + * @param completionBlock This block will be triggered once the transaction is complete, whether it was successful or not. It will indicate if there was an error, whether or not the data was committed, and what the current value of the data at this location is. + * @param localEvents Set this to NO to suppress events raised for intermediate states, and only get events based on the final state of the transaction. + */ +- (void) runTransactionBlock:(FTransactionResult* (^) (FMutableData* currentData))block andCompletionBlock:(void (^) (NSError* error, BOOL committed, FDataSnapshot* snapshot))completionBlock withLocalEvents:(BOOL)localEvents; + + +/** @name Retrieving String Representation */ + +/** + * Gets the absolute URL of this Firebase location. + * + * @return The absolute URL of the referenced Firebase location. + */ +- (NSString *) description; + +/** @name Properties */ + +/** + * Get a Firebase reference for the parent location. + * If this instance refers to the root of your Firebase, it has no parent, + * and therefore parent( ) will return null. + * + * @return A Firebase reference for the parent location. + */ +@property (strong, readonly, nonatomic) Firebase* parent; + + +/** + * Get a Firebase reference for the root location + * + * @return A new Firebase reference to root location. + */ +@property (strong, readonly, nonatomic) Firebase* root; + + +/** + * Gets last token in a Firebase location (e.g. 'fred' in https://SampleChat.firebaseIO-demo.com/users/fred) + * + * @return The key of the location this reference points to. + */ +@property (strong, readonly, nonatomic) NSString* key; + +/** + * Gets the FirebaseApp instance associated with this reference. + * + * @return The FirebaseApp object for this reference. + */ +@property (strong, readonly, nonatomic) FirebaseApp *app; + + +/** @name Global configuration and settings */ + +/** Set the default dispatch queue for event blocks. + * + * @param queue The queue to set as the default for running blocks for all Firebase event types. + * @deprecated This method is deprecated + * @note Please use [Firebase defaultConfig].callbackQueue instead +*/ ++ (void) setDispatchQueue:(dispatch_queue_t)queue __attribute__((deprecated)); + +/** Retrieve the Firebase SDK version. */ ++ (NSString *) sdkVersion; + ++ (void) setLoggingEnabled:(BOOL)enabled; + +/** + * Returns the default config object, used for configuring Firebase client behavior. + * + * This can be modified until you create your first `Firebase` instance. + */ ++ (FConfig *)defaultConfig; + +/** + * @deprecated This method is deprecated + * @note Please enable persistence by setting [Firebase defaultConfig].persistenceEnabled = YES instead. + * @param option Option to set. + * @param value Value to set. + */ ++ (void) setOption:(NSString*)option to:(id)value __attribute__((deprecated)); +@end diff --git a/Pods/Firebase/FirebaseApp.h b/Pods/Firebase/FirebaseApp.h new file mode 100644 index 0000000..b909cee --- /dev/null +++ b/Pods/Firebase/FirebaseApp.h @@ -0,0 +1,34 @@ +#import + +/** + * All Firebase references to the same database share a connection, persistent cache, etc. FirebaseApp + * represents this shared state and can be accessed from any reference via its `app` property. + * It has methods for managing your Firebase connection, etc. + * + * There is a one-to-one relationship between a FirebaseApp instance and a connection to Firebase. + */ +@interface FirebaseApp : NSObject + +/** + * The Firebase client automatically queues writes and sends them to the server at the earliest opportunity, + * depending on network connectivity. In some cases (e.g. offline usage) there may be a large number of writes + * waiting to be sent. Calling this method will purge all outstanding writes so they are abandoned. + * + * All writes will be purged, including transactions and {@link Firebase#onDisconnect} writes. The writes will + * be rolled back locally, perhaps triggering events for affected event listeners, and the client will not + * (re-)send them to the Firebase backend. + */ +- (void)purgeOutstandingWrites; + + +/** + * Shuts down our connection to the Firebase backend until goOnline is called. + */ +- (void)goOffline; + +/** + * Resumes our connection to the Firebase backend after a previous goOffline call. + */ +- (void)goOnline; + +@end diff --git a/Pods/Firebase/FirebaseServerValue.h b/Pods/Firebase/FirebaseServerValue.h new file mode 100644 index 0000000..329ef11 --- /dev/null +++ b/Pods/Firebase/FirebaseServerValue.h @@ -0,0 +1,5 @@ +@interface FirebaseServerValue : NSObject + ++ (NSDictionary *) timestamp; + +@end \ No newline at end of file diff --git a/Pods/Firebase/libFirebaseStatic.a b/Pods/Firebase/libFirebaseStatic.a new file mode 100644 index 0000000..6d95b57 Binary files /dev/null and b/Pods/Firebase/libFirebaseStatic.a differ diff --git a/Pods/Headers/Private/Firebase/FAuthData.h b/Pods/Headers/Private/Firebase/FAuthData.h new file mode 120000 index 0000000..7489b45 --- /dev/null +++ b/Pods/Headers/Private/Firebase/FAuthData.h @@ -0,0 +1 @@ +../../../Firebase/FAuthData.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FAuthType.h b/Pods/Headers/Private/Firebase/FAuthType.h new file mode 120000 index 0000000..502e35b --- /dev/null +++ b/Pods/Headers/Private/Firebase/FAuthType.h @@ -0,0 +1 @@ +../../../Firebase/FAuthType.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FConfig.h b/Pods/Headers/Private/Firebase/FConfig.h new file mode 120000 index 0000000..763c99a --- /dev/null +++ b/Pods/Headers/Private/Firebase/FConfig.h @@ -0,0 +1 @@ +../../../Firebase/FConfig.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FDataSnapshot.h b/Pods/Headers/Private/Firebase/FDataSnapshot.h new file mode 120000 index 0000000..8d3d769 --- /dev/null +++ b/Pods/Headers/Private/Firebase/FDataSnapshot.h @@ -0,0 +1 @@ +../../../Firebase/FDataSnapshot.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FEventType.h b/Pods/Headers/Private/Firebase/FEventType.h new file mode 120000 index 0000000..4339807 --- /dev/null +++ b/Pods/Headers/Private/Firebase/FEventType.h @@ -0,0 +1 @@ +../../../Firebase/FEventType.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FMutableData.h b/Pods/Headers/Private/Firebase/FMutableData.h new file mode 120000 index 0000000..56ea28f --- /dev/null +++ b/Pods/Headers/Private/Firebase/FMutableData.h @@ -0,0 +1 @@ +../../../Firebase/FMutableData.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FQuery.h b/Pods/Headers/Private/Firebase/FQuery.h new file mode 120000 index 0000000..f1006c6 --- /dev/null +++ b/Pods/Headers/Private/Firebase/FQuery.h @@ -0,0 +1 @@ +../../../Firebase/FQuery.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FTransactionResult.h b/Pods/Headers/Private/Firebase/FTransactionResult.h new file mode 120000 index 0000000..dd01b82 --- /dev/null +++ b/Pods/Headers/Private/Firebase/FTransactionResult.h @@ -0,0 +1 @@ +../../../Firebase/FTransactionResult.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/Firebase.h b/Pods/Headers/Private/Firebase/Firebase.h new file mode 120000 index 0000000..a9b6765 --- /dev/null +++ b/Pods/Headers/Private/Firebase/Firebase.h @@ -0,0 +1 @@ +../../../Firebase/Firebase.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FirebaseApp.h b/Pods/Headers/Private/Firebase/FirebaseApp.h new file mode 120000 index 0000000..af4c17e --- /dev/null +++ b/Pods/Headers/Private/Firebase/FirebaseApp.h @@ -0,0 +1 @@ +../../../Firebase/FirebaseApp.h \ No newline at end of file diff --git a/Pods/Headers/Private/Firebase/FirebaseServerValue.h b/Pods/Headers/Private/Firebase/FirebaseServerValue.h new file mode 120000 index 0000000..c0392db --- /dev/null +++ b/Pods/Headers/Private/Firebase/FirebaseServerValue.h @@ -0,0 +1 @@ +../../../Firebase/FirebaseServerValue.h \ No newline at end of file diff --git a/Pods/Local Podspecs/SwiftyJSON.podspec.json b/Pods/Local Podspecs/SwiftyJSON.podspec.json new file mode 100644 index 0000000..358633d --- /dev/null +++ b/Pods/Local Podspecs/SwiftyJSON.podspec.json @@ -0,0 +1,23 @@ +{ + "name": "SwiftyJSON", + "version": "2.3.0", + "summary": "SwiftyJSON makes it easy to deal with JSON data in Swift", + "homepage": "https://github.com/SwiftyJSON/SwiftyJSON", + "license": { + "type": "MIT" + }, + "authors": { + "lingoer": "lingoerer@gmail.com", + "tangplin": "tangplin@gmail.com" + }, + "requires_arc": true, + "platforms": { + "osx": "10.9", + "ios": "8.0" + }, + "source": { + "git": "https://github.com/SwiftyJSON/SwiftyJSON.git", + "tag": "2.3.0" + }, + "source_files": "Source/*.swift" +} diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..e6f3572 --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,28 @@ +PODS: + - Alamofire (2.0.2) + - Firebase (2.4.2) + - OAuthSwift (0.4.6) + - SwiftyJSON (2.3.0) + +DEPENDENCIES: + - Alamofire (= 2.0.2) + - Firebase (>= 2.4.1) + - OAuthSwift (~> 0.4.6) + - SwiftyJSON (from `https://github.com/SwiftyJSON/SwiftyJSON.git`) + +EXTERNAL SOURCES: + SwiftyJSON: + :git: https://github.com/SwiftyJSON/SwiftyJSON.git + +CHECKOUT OPTIONS: + SwiftyJSON: + :commit: 3b5d0d4e0c19173b1bf0dc823bde25ad870f70c0 + :git: https://github.com/SwiftyJSON/SwiftyJSON.git + +SPEC CHECKSUMS: + Alamofire: 8edbab00802a752bb5240cc2abe70e7e881488ad + Firebase: 5e898ed5012c81d28ca5fae1113c6b61a172bc6d + OAuthSwift: 8c738cc56c942a541f5c6d0362a892cb149d10b1 + SwiftyJSON: 8d6b61a70277ef2a5d710d372e06e7e2d87fb9e4 + +COCOAPODS: 0.38.2 diff --git a/Pods/OAuthSwift/LICENSE b/Pods/OAuthSwift/LICENSE new file mode 100644 index 0000000..fa84148 --- /dev/null +++ b/Pods/OAuthSwift/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Dongri Jin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/OAuthSwift/OAuthSwift/Dictionary+OAuthSwift.swift b/Pods/OAuthSwift/OAuthSwift/Dictionary+OAuthSwift.swift new file mode 100755 index 0000000..63986ac --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/Dictionary+OAuthSwift.swift @@ -0,0 +1,62 @@ +// +// Dictionary+OAuthSwift.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/21/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// + +import Foundation + +extension Dictionary { + + func join(other: Dictionary) -> Dictionary { + var joinedDictionary = Dictionary() + + for (key, value) in self { + joinedDictionary.updateValue(value, forKey: key) + } + + for (key, value) in other { + joinedDictionary.updateValue(value, forKey: key) + } + + return joinedDictionary + } + + func filter(predicate: (key: Key, value: Value) -> Bool) -> Dictionary { + var filteredDictionary = Dictionary() + + for (key, value) in self { + if predicate(key: key, value: value) { + filteredDictionary.updateValue(value, forKey: key) + } + } + + return filteredDictionary + } + + func urlEncodedQueryStringWithEncoding(encoding: NSStringEncoding) -> String { + var parts = [String]() + + for (key, value) in self { + let keyString = "\(key)".urlEncodedStringWithEncoding(encoding) + let valueString = "\(value)".urlEncodedStringWithEncoding(encoding) + let query = "\(keyString)=\(valueString)" as String + parts.append(query) + } + + return parts.joinWithSeparator("&") as String + } + + mutating func merge(dictionaries: Dictionary...) { + for dict in dictionaries { + for (key, value) in dict { + self.updateValue(value as! Value, forKey: key as! Key) + } + } + } +} + +public func += (inout left: [K : V], right: [K : V]) { left.merge(right) } +public func + (left: [K : V], right: [K : V]) -> [K : V] { return left.join(right) } diff --git a/Pods/OAuthSwift/OAuthSwift/HMAC.swift b/Pods/OAuthSwift/OAuthSwift/HMAC.swift new file mode 100644 index 0000000..c623167 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/HMAC.swift @@ -0,0 +1,47 @@ +// +// HMAC.swift +// OAuthSwift +// +// Created by Dongri Jin on 1/28/15. +// Copyright (c) 2015 Dongri Jin. All rights reserved. +// + + +import Foundation + +public class HMAC { + + let key:[UInt8] = [] + + class internal func sha1(key key: NSData, message: NSData) -> NSData? { + var key = key.bytes() + let message = message.bytes() + + // key + if (key.count > 64) { + key = SHA1(NSData.withBytes(key)).calculate().bytes() + } + + if (key.count < 64) { + key = key + [UInt8](count: 64 - key.count, repeatedValue: 0) + } + + // + var opad = [UInt8](count: 64, repeatedValue: 0x5c) + for (idx, _) in key.enumerate() { + opad[idx] = key[idx] ^ opad[idx] + } + var ipad = [UInt8](count: 64, repeatedValue: 0x36) + for (idx, _) in key.enumerate() { + ipad[idx] = key[idx] ^ ipad[idx] + } + + let ipadAndMessageHash = SHA1(NSData.withBytes(ipad + message)).calculate().bytes() + let finalHash = SHA1(NSData.withBytes(opad + ipadAndMessageHash)).calculate().bytes() + let mac = finalHash + + return NSData(bytes: mac, length: mac.count) + + } + +} \ No newline at end of file diff --git a/Pods/OAuthSwift/OAuthSwift/Int+OAuthSwift.swift b/Pods/OAuthSwift/OAuthSwift/Int+OAuthSwift.swift new file mode 100644 index 0000000..edc46d8 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/Int+OAuthSwift.swift @@ -0,0 +1,33 @@ +// +// Int+OAuthSwift.swift +// OAuthSwift +// +// Created by Dongri Jin on 1/28/15. +// Copyright (c) 2015 Dongri Jin. All rights reserved. +// + +import Foundation + +extension Int { + public func bytes(totalBytes: Int = sizeof(Int)) -> [UInt8] { + return arrayOfBytes(self, length: totalBytes) + } +} + +func arrayOfBytes(value:T, length:Int? = nil) -> [UInt8] { + let totalBytes = length ?? (sizeofValue(value) * 8) + + let valuePointer = UnsafeMutablePointer.alloc(1) + valuePointer.memory = value + + let bytesPointer = UnsafeMutablePointer(valuePointer) + var bytes = [UInt8](count: totalBytes, repeatedValue: 0) + for j in 0.. [UInt8] { + let count = self.length / sizeof(UInt8) + var bytesArray = [UInt8](count: count, repeatedValue: 0) + self.getBytes(&bytesArray, length:count * sizeof(UInt8)) + return bytesArray + } + + class public func withBytes(bytes: [UInt8]) -> NSData { + return NSData(bytes: bytes, length: bytes.count) + } +} + diff --git a/Pods/OAuthSwift/OAuthSwift/NSURL+OAuthSwift.swift b/Pods/OAuthSwift/OAuthSwift/NSURL+OAuthSwift.swift new file mode 100755 index 0000000..da39f16 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/NSURL+OAuthSwift.swift @@ -0,0 +1,30 @@ +// +// NSURL+OAuthSwift.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/21/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// + +import Foundation + + +extension NSURL { + + func URLByAppendingQueryString(queryString: String) -> NSURL { + if queryString.utf16.count == 0 { + return self + } + + var absoluteURLString = self.absoluteString + + if absoluteURLString.hasSuffix("?") { + absoluteURLString = (absoluteURLString as NSString).substringToIndex(absoluteURLString.utf16.count - 1) + } + + let URLString = absoluteURLString + (absoluteURLString.rangeOfString("?") != nil ? "&" : "?") + queryString + + return NSURL(string: URLString)! + } + +} diff --git a/Pods/OAuthSwift/OAuthSwift/OAuth1Swift.swift b/Pods/OAuthSwift/OAuthSwift/OAuth1Swift.swift new file mode 100644 index 0000000..2c05d06 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/OAuth1Swift.swift @@ -0,0 +1,133 @@ +// +// OAuth1Swift.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/22/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// + +import Foundation + +// OAuthSwift errors +public let OAuthSwiftErrorDomain = "oauthswift.error" + +public class OAuth1Swift: NSObject { + + public var client: OAuthSwiftClient + + public var authorize_url_handler: OAuthSwiftURLHandlerType = OAuthSwiftOpenURLExternally.sharedInstance + + public var allowMissingOauthVerifier: Bool = false + + var consumer_key: String + var consumer_secret: String + var request_token_url: String + var authorize_url: String + var access_token_url: String + + var observer: AnyObject? + + public init(consumerKey: String, consumerSecret: String, requestTokenUrl: String, authorizeUrl: String, accessTokenUrl: String){ + self.consumer_key = consumerKey + self.consumer_secret = consumerSecret + self.request_token_url = requestTokenUrl + self.authorize_url = authorizeUrl + self.access_token_url = accessTokenUrl + self.client = OAuthSwiftClient(consumerKey: consumerKey, consumerSecret: consumerSecret) + } + + struct CallbackNotification { + static let notificationName = "OAuthSwiftCallbackNotificationName" + static let optionsURLKey = "OAuthSwiftCallbackNotificationOptionsURLKey" + } + + struct OAuthSwiftError { + static let domain = "OAuthSwiftErrorDomain" + static let appOnlyAuthenticationErrorCode = 1 + } + + public typealias TokenSuccessHandler = (credential: OAuthSwiftCredential, response: NSURLResponse) -> Void + public typealias FailureHandler = (error: NSError) -> Void + + // 0. Start + public func authorizeWithCallbackURL(callbackURL: NSURL, success: TokenSuccessHandler, failure: ((error: NSError) -> Void)) { + self.postOAuthRequestTokenWithCallbackURL(callbackURL, success: { + credential, response in + + self.observer = NSNotificationCenter.defaultCenter().addObserverForName(CallbackNotification.notificationName, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock:{ + notification in + //NSNotificationCenter.defaultCenter().removeObserver(self) + NSNotificationCenter.defaultCenter().removeObserver(self.observer!) + let url = notification.userInfo![CallbackNotification.optionsURLKey] as! NSURL + var parameters: Dictionary = Dictionary() + if ((url.query) != nil){ + parameters += url.query!.parametersFromQueryString() + } + if ((url.fragment) != nil && url.fragment!.isEmpty == false) { + parameters += url.fragment!.parametersFromQueryString() + } + if let token = parameters["token"] { + parameters["oauth_token"] = token + } + if (parameters["oauth_token"] != nil && (self.allowMissingOauthVerifier || parameters["oauth_verifier"] != nil)) { + //var credential: OAuthSwiftCredential = self.client.credential + self.client.credential.oauth_token = parameters["oauth_token"]! + if (parameters["oauth_verifier"] != nil) { + self.client.credential.oauth_verifier = parameters["oauth_verifier"]! + } + self.postOAuthAccessTokenWithRequestToken({ + credential, response in + success(credential: credential, response: response) + }, failure: failure) + } else { + let userInfo = [NSLocalizedFailureReasonErrorKey: NSLocalizedString("Oauth problem.", comment: "")] + failure(error: NSError(domain: OAuthSwiftErrorDomain, code: -1, userInfo: userInfo)) + return + } + }) + // 2. Authorize + if let queryURL = NSURL(string: self.authorize_url + (self.authorize_url.has("?") ? "&" : "?") + "oauth_token=\(credential.oauth_token)") { + self.authorize_url_handler.handle(queryURL) + } + }, failure: failure) + } + + // 1. Request token + public func postOAuthRequestTokenWithCallbackURL(callbackURL: NSURL, success: TokenSuccessHandler, failure: FailureHandler?) { + var parameters = Dictionary() + if let callbackURLString: String = callbackURL.absoluteString { + parameters["oauth_callback"] = callbackURLString + } + self.client.credential.oauth_header_type = "oauth1" + self.client.post(self.request_token_url, parameters: parameters, success: { + data, response in + let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as String! + let parameters = responseString.parametersFromQueryString() + self.client.credential.oauth_token = parameters["oauth_token"]! + self.client.credential.oauth_token_secret = parameters["oauth_token_secret"]! + success(credential: self.client.credential, response: response) + }, failure: failure) + } + + // 3. Get Access token + func postOAuthAccessTokenWithRequestToken(success: TokenSuccessHandler, failure: FailureHandler?) { + var parameters = Dictionary() + parameters["oauth_token"] = self.client.credential.oauth_token + parameters["oauth_verifier"] = self.client.credential.oauth_verifier + self.client.post(self.access_token_url, parameters: parameters, success: { + data, response in + let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as String! + let parameters = responseString.parametersFromQueryString() + self.client.credential.oauth_token = parameters["oauth_token"]! + self.client.credential.oauth_token_secret = parameters["oauth_token_secret"]! + success(credential: self.client.credential, response: response) + }, failure: failure) + } + + public class func handleOpenURL(url: NSURL) { + let notification = NSNotification(name: CallbackNotification.notificationName, object: nil, + userInfo: [CallbackNotification.optionsURLKey: url]) + NSNotificationCenter.defaultCenter().postNotification(notification) + } + +} diff --git a/Pods/OAuthSwift/OAuthSwift/OAuth2Swift.swift b/Pods/OAuthSwift/OAuthSwift/OAuth2Swift.swift new file mode 100644 index 0000000..afa08d0 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/OAuth2Swift.swift @@ -0,0 +1,162 @@ +// +// OAuth2Swift.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/22/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// + +import Foundation + +public class OAuth2Swift: NSObject { + + public var client: OAuthSwiftClient + + public var authorize_url_handler: OAuthSwiftURLHandlerType = OAuthSwiftOpenURLExternally.sharedInstance + + var consumer_key: String + var consumer_secret: String + var authorize_url: String + var access_token_url: String? + var response_type: String + var observer: AnyObject? + var content_type: String? + + public convenience init(consumerKey: String, consumerSecret: String, authorizeUrl: String, accessTokenUrl: String, responseType: String){ + self.init(consumerKey: consumerKey, consumerSecret: consumerSecret, authorizeUrl: authorizeUrl, responseType: responseType) + self.access_token_url = accessTokenUrl + } + + public convenience init(consumerKey: String, consumerSecret: String, authorizeUrl: String, accessTokenUrl: String, responseType: String, contentType: String){ + self.init(consumerKey: consumerKey, consumerSecret: consumerSecret, authorizeUrl: authorizeUrl, responseType: responseType) + self.access_token_url = accessTokenUrl + self.content_type = contentType + } + + public init(consumerKey: String, consumerSecret: String, authorizeUrl: String, responseType: String){ + self.consumer_key = consumerKey + self.consumer_secret = consumerSecret + self.authorize_url = authorizeUrl + self.response_type = responseType + self.client = OAuthSwiftClient(consumerKey: consumerKey, consumerSecret: consumerSecret) + } + + struct CallbackNotification { + static let notificationName = "OAuthSwiftCallbackNotificationName" + static let optionsURLKey = "OAuthSwiftCallbackNotificationOptionsURLKey" + } + + struct OAuthSwiftError { + static let domain = "OAuthSwiftErrorDomain" + static let appOnlyAuthenticationErrorCode = 1 + } + + public typealias TokenSuccessHandler = (credential: OAuthSwiftCredential, response: NSURLResponse?, parameters: NSDictionary) -> Void + public typealias FailureHandler = (error: NSError) -> Void + + + public func authorizeWithCallbackURL(callbackURL: NSURL, scope: String, state: String, params: Dictionary = Dictionary(), success: TokenSuccessHandler, failure: ((error: NSError) -> Void)) { + self.observer = NSNotificationCenter.defaultCenter().addObserverForName(CallbackNotification.notificationName, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock:{ + notification in + NSNotificationCenter.defaultCenter().removeObserver(self.observer!) + let url = notification.userInfo![CallbackNotification.optionsURLKey] as! NSURL + var responseParameters: Dictionary = Dictionary() + if let query = url.query { + responseParameters += query.parametersFromQueryString() + } + if ((url.fragment) != nil && url.fragment!.isEmpty == false) { + responseParameters += url.fragment!.parametersFromQueryString() + } + if let accessToken = responseParameters["access_token"] { + self.client.credential.oauth_token = accessToken + success(credential: self.client.credential, response: nil, parameters: responseParameters) + } + if let code = responseParameters["code"] { + self.postOAuthAccessTokenWithRequestTokenByCode(code.stringByRemovingPercentEncoding!, + callbackURL:callbackURL, + success: { credential, response, responseParameters in + success(credential: credential, response: response, parameters: responseParameters) + }, failure: failure) + } + if let error = responseParameters["error"], error_description = responseParameters["error_description"] { + let errorInfo = [NSLocalizedFailureReasonErrorKey: NSLocalizedString(error, comment: error_description)] + failure(error: NSError(domain: OAuthSwiftErrorDomain, code: -1, userInfo: errorInfo)) + } + }) + //let authorizeURL = NSURL(string: ) + var urlString = String() + urlString += self.authorize_url + urlString += (self.authorize_url.has("?") ? "&" : "?") + "client_id=\(self.consumer_key)" + urlString += "&redirect_uri=\(callbackURL.absoluteString)" + urlString += "&response_type=\(self.response_type)" + if (scope != "") { + urlString += "&scope=\(scope)" + } + if (state != "") { + urlString += "&state=\(state)" + } + + for param in params { + urlString += "&\(param.0)=\(param.1)" + } + + if let queryURL = NSURL(string: urlString) { + self.authorize_url_handler.handle(queryURL) + } + } + + func postOAuthAccessTokenWithRequestTokenByCode(code: String, callbackURL: NSURL, success: TokenSuccessHandler, failure: FailureHandler?) { + var parameters = Dictionary() + parameters["client_id"] = self.consumer_key + parameters["client_secret"] = self.consumer_secret + parameters["code"] = code + parameters["grant_type"] = "authorization_code" + parameters["redirect_uri"] = callbackURL.absoluteString.stringByRemovingPercentEncoding + + if self.content_type == "multipart/form-data" { + self.client.postMultiPartRequest(self.access_token_url!, method: "POST", parameters: parameters, success: { + data, response in + let responseJSON: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) + + let responseParameters: NSDictionary + + if responseJSON != nil { + responseParameters = responseJSON as! NSDictionary + } else { + let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as String! + responseParameters = responseString.parametersFromQueryString() + } + + let accessToken = responseParameters["access_token"] as! String + self.client.credential.oauth_token = accessToken + success(credential: self.client.credential, response: response, parameters: responseParameters) + }, failure: failure) + } else { + self.client.credential.oauth_header_type = "oauth2" + self.client.post(self.access_token_url!, parameters: parameters, success: { + data, response in + let responseJSON: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) + + let responseParameters: NSDictionary + + if responseJSON != nil { + responseParameters = responseJSON as! NSDictionary + } else { + let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as String! + responseParameters = responseString.parametersFromQueryString() + } + + let accessToken = responseParameters["access_token"] as! String + self.client.credential.oauth_token = accessToken + success(credential: self.client.credential, response: response, parameters: responseParameters) + }, failure: failure) + } + } + + public class func handleOpenURL(url: NSURL) { + let notification = NSNotification(name: CallbackNotification.notificationName, object: nil, + userInfo: [CallbackNotification.optionsURLKey: url]) + NSNotificationCenter.defaultCenter().postNotification(notification) + } + +} diff --git a/Pods/OAuthSwift/OAuthSwift/OAuthSwiftClient.swift b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftClient.swift new file mode 100644 index 0000000..3ae7f24 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftClient.swift @@ -0,0 +1,199 @@ +// +// OAuthSwiftClient.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/21/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// + +import Foundation +import Accounts + +var dataEncoding: NSStringEncoding = NSUTF8StringEncoding + +public class OAuthSwiftClient { + + private(set) public var credential: OAuthSwiftCredential + + public init(consumerKey: String, consumerSecret: String) { + self.credential = OAuthSwiftCredential(consumer_key: consumerKey, consumer_secret: consumerSecret) + } + + public init(consumerKey: String, consumerSecret: String, accessToken: String, accessTokenSecret: String) { + self.credential = OAuthSwiftCredential(oauth_token: accessToken, oauth_token_secret: accessTokenSecret) + self.credential.consumer_key = consumerKey + self.credential.consumer_secret = consumerSecret + } + + public func get(urlString: String, parameters: Dictionary, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + self.request(urlString, method: "GET", parameters: parameters, success: success, failure: failure) + } + + public func post(urlString: String, parameters: Dictionary, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + self.request(urlString, method: "POST", parameters: parameters, success: success, failure: failure) + } + + public func put(urlString: String, parameters: Dictionary, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + self.request(urlString, method: "PUT", parameters: parameters, success: success, failure: failure) + } + + public func delete(urlString: String, parameters: Dictionary, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + self.request(urlString, method: "DELETE", parameters: parameters, success: success, failure: failure) + } + + public func patch(urlString: String, parameters: Dictionary, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + self.request(urlString, method: "PATCH", parameters: parameters, success: success, failure: failure) + } + + public func request(url: String, method: String, parameters: Dictionary, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + if let request = makeRequest(url, method: method, parameters: parameters) { + + request.successHandler = success + request.failureHandler = failure + request.start() + } + } + + public func makeRequest(urlString: String, method: String, parameters: Dictionary) -> OAuthSwiftHTTPRequest? { + if let url = NSURL(string: urlString) { + let request = OAuthSwiftHTTPRequest(URL: url, method: method, parameters: parameters) + request.headers = self.credential.makeHeaders(url, method: method, parameters: parameters) + request.dataEncoding = dataEncoding + request.encodeParameters = true + return request + } + return nil + } + + public func postImage(urlString: String, parameters: Dictionary, image: NSData, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + self.multiPartRequest(urlString, method: "POST", parameters: parameters, image: image, success: success, failure: failure) + } + + func multiPartRequest(url: String, method: String, parameters: Dictionary, image: NSData, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + + if let request = makeRequest(url, method: method, parameters: parameters) { + + var parmaImage = [String: AnyObject]() + parmaImage["media"] = image + let boundary = "AS-boundary-\(arc4random())-\(arc4random())" + let type = "multipart/form-data; boundary=\(boundary)" + let body = self.multiPartBodyFromParams(parmaImage, boundary: boundary) + + request.HTTPBodyMultipart = body + request.contentTypeMultipart = type + + request.successHandler = success + request.failureHandler = failure + request.start() + } + } + + public func multiPartBodyFromParams(parameters: [String: AnyObject], boundary: String) -> NSData { + let data = NSMutableData() + + let prefixData = "--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding) + let seperData = "\r\n".dataUsingEncoding(NSUTF8StringEncoding) + + for (key, value) in parameters { + var sectionData: NSData? + var sectionType: String? + var sectionFilename = "" + + if key == "media" { + let multiData = value as! NSData + sectionData = multiData + sectionType = "image/jpeg" + sectionFilename = " filename=\"file\"" + } else { + sectionData = "\(value)".dataUsingEncoding(NSUTF8StringEncoding) + } + + data.appendData(prefixData!) + + let sectionDisposition = "Content-Disposition: form-data; name=\"media\";\(sectionFilename)\r\n".dataUsingEncoding(NSUTF8StringEncoding) + data.appendData(sectionDisposition!) + + if let type = sectionType { + let contentType = "Content-Type: \(type)\r\n".dataUsingEncoding(NSUTF8StringEncoding) + data.appendData(contentType!) + } + + // append data + data.appendData(seperData!) + data.appendData(sectionData!) + data.appendData(seperData!) + } + + data.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) + return data + } + + public func postMultiPartRequest(url: String, method: String, parameters: Dictionary, success: OAuthSwiftHTTPRequest.SuccessHandler?, failure: OAuthSwiftHTTPRequest.FailureHandler?) { + + if let request = makeRequest(url, method: method, parameters: parameters) { + + let boundary = "POST-boundary-\(arc4random())-\(arc4random())" + let type = "multipart/form-data; boundary=\(boundary)" + let body = self.multiDataFromObject(parameters, boundary: boundary) + + request.HTTPBodyMultipart = body + request.contentTypeMultipart = type + + request.successHandler = success + request.failureHandler = failure + request.start() + } + } + + func multiDataFromObject(object: [String:AnyObject], boundary: String) -> NSData? { + let data = NSMutableData() + + let prefixString = "--\(boundary)\r\n" + let prefixData = prefixString.dataUsingEncoding(NSUTF8StringEncoding)! + + let seperatorString = "\r\n" + let seperatorData = seperatorString.dataUsingEncoding(NSUTF8StringEncoding)! + + for (key, value) in object { + + var valueData: NSData? + let valueType: String = "" + let filenameClause = "" + + let stringValue = "\(value)" + valueData = stringValue.dataUsingEncoding(NSUTF8StringEncoding)! + + if valueData == nil { + continue + } + data.appendData(prefixData) + let contentDispositionString = "Content-Disposition: form-data; name=\"\(key)\";\(filenameClause)\r\n" + let contentDispositionData = contentDispositionString.dataUsingEncoding(NSUTF8StringEncoding) + data.appendData(contentDispositionData!) + if let type: String = valueType { + let contentTypeString = "Content-Type: \(type)\r\n" + let contentTypeData = contentTypeString.dataUsingEncoding(NSUTF8StringEncoding) + data.appendData(contentTypeData!) + } + data.appendData(seperatorData) + data.appendData(valueData!) + data.appendData(seperatorData) + } + + let endingString = "--\(boundary)--\r\n" + let endingData = endingString.dataUsingEncoding(NSUTF8StringEncoding)! + data.appendData(endingData) + + return data + } + + @available(*, deprecated=0.4.6, message="Because method moved to OAuthSwiftCredential!") + public class func authorizationHeaderForMethod(method: String, url: NSURL, parameters: Dictionary, credential: OAuthSwiftCredential) -> String { + return credential.authorizationHeaderForMethod(method, url: url, parameters: parameters) + } + + @available(*, deprecated=0.4.6, message="Because method moved to OAuthSwiftCredential!") + public class func signatureForMethod(method: String, url: NSURL, parameters: Dictionary, credential: OAuthSwiftCredential) -> String { + return credential.signatureForMethod(method, url: url, parameters: parameters) + } +} diff --git a/Pods/OAuthSwift/OAuthSwift/OAuthSwiftCredential.swift b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftCredential.swift new file mode 100644 index 0000000..fa63dd3 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftCredential.swift @@ -0,0 +1,136 @@ +// +// OAuthSwiftCredential.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/22/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// +import Foundation + +public class OAuthSwiftCredential: NSObject, NSCoding { + + struct OAuth { + static let version = "1.0" + static let signatureMethod = "HMAC-SHA1" + } + + var consumer_key: String = String() + var consumer_secret: String = String() + public var oauth_token: String = String() + public var oauth_token_secret: String = String() + var oauth_verifier: String = String() + public var oauth_header_type = String() + + override init(){ + + } + public init(consumer_key: String, consumer_secret: String){ + self.consumer_key = consumer_key + self.consumer_secret = consumer_secret + } + public init(oauth_token: String, oauth_token_secret: String){ + self.oauth_token = oauth_token + self.oauth_token_secret = oauth_token_secret + } + + private struct CodingKeys { + static let base = NSBundle.mainBundle().bundleIdentifier! + "." + static let consumerKey = base + "comsumer_key" + static let consumerSecret = base + "consumer_secret" + static let oauthToken = base + "oauth_token" + static let oauthTokenSecret = base + "oauth_token_secret" + static let oauthVerifier = base + "oauth_verifier" + } + + // Cannot declare a required initializer within an extension. + // extension OAuthSwiftCredential: NSCoding { + public required convenience init?(coder decoder: NSCoder) { + self.init() + self.consumer_key = (decoder.decodeObjectForKey(CodingKeys.consumerKey) as? String) ?? String() + self.consumer_secret = (decoder.decodeObjectForKey(CodingKeys.consumerSecret) as? String) ?? String() + self.oauth_token = (decoder.decodeObjectForKey(CodingKeys.oauthToken) as? String) ?? String() + self.oauth_token_secret = (decoder.decodeObjectForKey(CodingKeys.oauthTokenSecret) as? String) ?? String() + self.oauth_verifier = (decoder.decodeObjectForKey(CodingKeys.oauthVerifier) as? String) ?? String() + } + + public func encodeWithCoder(coder: NSCoder) { + coder.encodeObject(self.consumer_key, forKey: CodingKeys.consumerKey) + coder.encodeObject(self.consumer_secret, forKey: CodingKeys.consumerSecret) + coder.encodeObject(self.oauth_token, forKey: CodingKeys.oauthToken) + coder.encodeObject(self.oauth_token_secret, forKey: CodingKeys.oauthTokenSecret) + coder.encodeObject(self.oauth_verifier, forKey: CodingKeys.oauthVerifier) + } + // } // End NSCoding extension + + public func makeHeaders(url:NSURL, method: String, parameters: Dictionary) -> Dictionary { + if self.oauth_header_type == "oauth1" { + return ["Authorization": self.authorizationHeaderForMethod(method, url: url, parameters: parameters)] + } + if self.oauth_header_type == "oauth2" { + return ["Authorization": "Bearer \(self.oauth_token)"] + } + return [:] + } + + public func authorizationHeaderForMethod(method: String, url: NSURL, parameters: Dictionary) -> String { + var authorizationParameters = Dictionary() + authorizationParameters["oauth_version"] = OAuth.version + authorizationParameters["oauth_signature_method"] = OAuth.signatureMethod + authorizationParameters["oauth_consumer_key"] = self.consumer_key + authorizationParameters["oauth_timestamp"] = String(Int64(NSDate().timeIntervalSince1970)) + authorizationParameters["oauth_nonce"] = (NSUUID().UUIDString as NSString).substringToIndex(8) + + if (self.oauth_token != ""){ + authorizationParameters["oauth_token"] = self.oauth_token + } + + for (key, value) in parameters { + if key.hasPrefix("oauth_") { + authorizationParameters.updateValue(value, forKey: key) + } + } + + let combinedParameters = authorizationParameters.join(parameters) + + let finalParameters = combinedParameters + + authorizationParameters["oauth_signature"] = self.signatureForMethod(method, url: url, parameters: finalParameters) + + var parameterComponents = authorizationParameters.urlEncodedQueryStringWithEncoding(dataEncoding).componentsSeparatedByString("&") as [String] + parameterComponents.sortInPlace { $0 < $1 } + + var headerComponents = [String]() + for component in parameterComponents { + let subcomponent = component.componentsSeparatedByString("=") as [String] + if subcomponent.count == 2 { + headerComponents.append("\(subcomponent[0])=\"\(subcomponent[1])\"") + } + } + + return "OAuth " + headerComponents.joinWithSeparator(", ") + } + + public func signatureForMethod(method: String, url: NSURL, parameters: Dictionary) -> String { + var tokenSecret: NSString = "" + tokenSecret = self.oauth_token_secret.urlEncodedStringWithEncoding(dataEncoding) + + let encodedConsumerSecret = self.consumer_secret.urlEncodedStringWithEncoding(dataEncoding) + + let signingKey = "\(encodedConsumerSecret)&\(tokenSecret)" + + var parameterComponents = parameters.urlEncodedQueryStringWithEncoding(dataEncoding).componentsSeparatedByString("&") as [String] + parameterComponents.sortInPlace { $0 < $1 } + + let parameterString = parameterComponents.joinWithSeparator("&") + let encodedParameterString = parameterString.urlEncodedStringWithEncoding(dataEncoding) + + let encodedURL = url.absoluteString.urlEncodedStringWithEncoding(dataEncoding) + + let signatureBaseString = "\(method)&\(encodedURL)&\(encodedParameterString)" + + let key = signingKey.dataUsingEncoding(NSUTF8StringEncoding)! + let msg = signatureBaseString.dataUsingEncoding(NSUTF8StringEncoding)! + let sha1 = HMAC.sha1(key: key, message: msg)! + return sha1.base64EncodedStringWithOptions([]) + } +} diff --git a/Pods/OAuthSwift/OAuthSwift/OAuthSwiftHTTPRequest.swift b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftHTTPRequest.swift new file mode 100644 index 0000000..d778de5 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftHTTPRequest.swift @@ -0,0 +1,250 @@ +// +// OAuthSwiftHTTPRequest.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/21/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// + +import Foundation + +public class OAuthSwiftHTTPRequest: NSObject, NSURLSessionDelegate { + + public typealias SuccessHandler = (data: NSData, response: NSHTTPURLResponse) -> Void + public typealias FailureHandler = (error: NSError) -> Void + + var URL: NSURL + var HTTPMethod: String + var HTTPBodyMultipart: NSData? + var contentTypeMultipart: String? + + var request: NSMutableURLRequest? + var session: NSURLSession! + + var headers: Dictionary + var parameters: Dictionary + var encodeParameters: Bool + + var dataEncoding: NSStringEncoding + + var timeoutInterval: NSTimeInterval + + var HTTPShouldHandleCookies: Bool + + var response: NSHTTPURLResponse! + var responseData: NSMutableData + + var successHandler: SuccessHandler? + var failureHandler: FailureHandler? + + convenience init(URL: NSURL) { + self.init(URL: URL, method: "GET", parameters: [:]) + } + + init(URL: NSURL, method: String, parameters: Dictionary) { + self.URL = URL + self.HTTPMethod = method + self.headers = [:] + self.parameters = parameters + self.encodeParameters = false + self.dataEncoding = NSUTF8StringEncoding + self.timeoutInterval = 60 + self.HTTPShouldHandleCookies = false + self.responseData = NSMutableData() + } + + init(request: NSURLRequest) { + self.request = request as? NSMutableURLRequest + self.URL = request.URL! + self.HTTPMethod = request.HTTPMethod! + self.headers = [:] + self.parameters = [:] + self.encodeParameters = false + self.dataEncoding = NSUTF8StringEncoding + self.timeoutInterval = 60 + self.HTTPShouldHandleCookies = false + self.responseData = NSMutableData() + } + + func start() { + if (request == nil) { + var error: NSError? + + do { + self.request = try self.makeRequest() + } catch let error1 as NSError { + error = error1 + self.request = nil + } + + if ((error) != nil) { + print(error!.localizedDescription) + } + } + + dispatch_async(dispatch_get_main_queue(), { + self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), + delegate: self, + delegateQueue: NSOperationQueue.mainQueue()) + let task: NSURLSessionDataTask = self.session.dataTaskWithRequest(self.request!) { data, response, error -> Void in + #if os(iOS) + UIApplication.sharedApplication().networkActivityIndicatorVisible = false + #endif + + self.response = response as? NSHTTPURLResponse + self.responseData.length = 0 + self.responseData.appendData(data!) + + if self.response.statusCode >= 400 { + let responseString = NSString(data: self.responseData, encoding: self.dataEncoding) + let localizedDescription = OAuthSwiftHTTPRequest.descriptionForHTTPStatus(self.response.statusCode, responseString: responseString! as String) + let userInfo : [NSObject : AnyObject] = [NSLocalizedDescriptionKey: localizedDescription, "Response-Headers": self.response.allHeaderFields] + let error = NSError(domain: NSURLErrorDomain, code: self.response.statusCode, userInfo: userInfo) + self.failureHandler?(error: error) + return + } + + self.successHandler?(data: self.responseData, response: self.response) + } + task.resume() + + #if os(iOS) + UIApplication.sharedApplication().networkActivityIndicatorVisible = true + #endif + }) + } + + public func makeRequest() throws -> NSMutableURLRequest { + return try OAuthSwiftHTTPRequest.makeRequest(self.URL, method: self.HTTPMethod, headers: self.headers, parameters: self.parameters, dataEncoding: self.dataEncoding, encodeParameters: self.encodeParameters, body: self.HTTPBodyMultipart, contentType: self.contentTypeMultipart) + } + + public class func makeRequest( + URL: NSURL, + method: String, + headers: [String : String], + parameters: Dictionary, + dataEncoding: NSStringEncoding, + encodeParameters: Bool, + body: NSData? = nil, + contentType: String? = nil) throws -> NSMutableURLRequest { + var error: NSError! = NSError(domain: "Migrator", code: 0, userInfo: nil) + let request = NSMutableURLRequest(URL: URL) + request.HTTPMethod = method + + for (key, value) in headers { + request.setValue(value, forHTTPHeaderField: key) + } + + let charset = CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(dataEncoding)) + + let nonOAuthParameters = parameters.filter { key, _ in !key.hasPrefix("oauth_") } + + if (body != nil && contentType != nil) { + request.setValue(contentType!, forHTTPHeaderField: "Content-Type") + //request!.setValue(self.HTTPBodyMultipart!.length.description, forHTTPHeaderField: "Content-Length") + request.HTTPBody = body! + } else { + if nonOAuthParameters.count > 0 { + if request.HTTPMethod == "GET" || request.HTTPMethod == "HEAD" || request.HTTPMethod == "DELETE" { + let queryString = nonOAuthParameters.urlEncodedQueryStringWithEncoding(dataEncoding) + request.URL = URL.URLByAppendingQueryString(queryString) + request.setValue("application/x-www-form-urlencoded; charset=\(charset)", forHTTPHeaderField: "Content-Type") + } + else { + if (encodeParameters) { + let queryString = nonOAuthParameters.urlEncodedQueryStringWithEncoding(dataEncoding) + //self.request!.URL = self.URL.URLByAppendingQueryString(queryString) + request.setValue("application/x-www-form-urlencoded; charset=\(charset)", forHTTPHeaderField: "Content-Type") + request.HTTPBody = queryString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) + } + else { + var jsonError: NSError? + do { + let jsonData: NSData = try NSJSONSerialization.dataWithJSONObject(nonOAuthParameters, options: []) + request.setValue("application/json; charset=\(charset)", forHTTPHeaderField: "Content-Type") + request.HTTPBody = jsonData + } catch let error1 as NSError { + jsonError = error1 + if (true) { + //println(jsonError!.localizedDescription) + error = jsonError + } + throw error + } + } + } + } + } + return request + } + + class func stringWithData(data: NSData, encodingName: String?) -> String { + var encoding: UInt = NSUTF8StringEncoding + + if (encodingName != nil) { + let encodingNameString = encodingName! as NSString + encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingNameString)) + + if encoding == UInt(kCFStringEncodingInvalidId) { + encoding = NSUTF8StringEncoding // by default + } + } + + return NSString(data: data, encoding: encoding)! as String + } + + class func descriptionForHTTPStatus(status: Int, responseString: String) -> String { + var s = "HTTP Status \(status)" + + var description: String? + // http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + if status == 400 { description = "Bad Request" } + if status == 401 { description = "Unauthorized" } + if status == 402 { description = "Payment Required" } + if status == 403 { description = "Forbidden" } + if status == 404 { description = "Not Found" } + if status == 405 { description = "Method Not Allowed" } + if status == 406 { description = "Not Acceptable" } + if status == 407 { description = "Proxy Authentication Required" } + if status == 408 { description = "Request Timeout" } + if status == 409 { description = "Conflict" } + if status == 410 { description = "Gone" } + if status == 411 { description = "Length Required" } + if status == 412 { description = "Precondition Failed" } + if status == 413 { description = "Payload Too Large" } + if status == 414 { description = "URI Too Long" } + if status == 415 { description = "Unsupported Media Type" } + if status == 416 { description = "Requested Range Not Satisfiable" } + if status == 417 { description = "Expectation Failed" } + if status == 422 { description = "Unprocessable Entity" } + if status == 423 { description = "Locked" } + if status == 424 { description = "Failed Dependency" } + if status == 425 { description = "Unassigned" } + if status == 426 { description = "Upgrade Required" } + if status == 427 { description = "Unassigned" } + if status == 428 { description = "Precondition Required" } + if status == 429 { description = "Too Many Requests" } + if status == 430 { description = "Unassigned" } + if status == 431 { description = "Request Header Fields Too Large" } + if status == 432 { description = "Unassigned" } + if status == 500 { description = "Internal Server Error" } + if status == 501 { description = "Not Implemented" } + if status == 502 { description = "Bad Gateway" } + if status == 503 { description = "Service Unavailable" } + if status == 504 { description = "Gateway Timeout" } + if status == 505 { description = "HTTP Version Not Supported" } + if status == 506 { description = "Variant Also Negotiates" } + if status == 507 { description = "Insufficient Storage" } + if status == 508 { description = "Loop Detected" } + if status == 509 { description = "Unassigned" } + if status == 510 { description = "Not Extended" } + if status == 511 { description = "Network Authentication Required" } + + if (description != nil) { + s = s + ": " + description! + ", Response: " + responseString + } + + return s + } + +} diff --git a/Pods/OAuthSwift/OAuthSwift/OAuthSwiftURLHandlerType.swift b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftURLHandlerType.swift new file mode 100644 index 0000000..036aee5 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/OAuthSwiftURLHandlerType.swift @@ -0,0 +1,40 @@ +// +// OAuthSwiftURLHandlerType.swift +// OAuthSwift +// +// Created by phimage on 11/05/15. +// Copyright (c) 2015 Dongri Jin. All rights reserved. +// + +import Foundation + +#if os(iOS) + import UIKit +#elseif os(OSX) + import AppKit +#endif + +@objc public protocol OAuthSwiftURLHandlerType { + func handle(url: NSURL) +} + +public class OAuthSwiftOpenURLExternally: OAuthSwiftURLHandlerType { + class var sharedInstance : OAuthSwiftOpenURLExternally { + struct Static { + static var onceToken : dispatch_once_t = 0 + static var instance : OAuthSwiftOpenURLExternally? = nil + } + dispatch_once(&Static.onceToken) { + Static.instance = OAuthSwiftOpenURLExternally() + } + return Static.instance! + } + + @objc public func handle(url: NSURL) { + #if os(iOS) + UIApplication.sharedApplication().openURL(url) + #elseif os(OSX) + NSWorkspace.sharedWorkspace().openURL(url) + #endif + } +} \ No newline at end of file diff --git a/Pods/OAuthSwift/OAuthSwift/OAuthWebViewController.swift b/Pods/OAuthSwift/OAuthSwift/OAuthWebViewController.swift new file mode 100644 index 0000000..9960341 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/OAuthWebViewController.swift @@ -0,0 +1,50 @@ +// +// OAuthWebViewController.swift +// OAuthSwift +// +// Created by Dongri Jin on 2/11/15. +// Copyright (c) 2015 Dongri Jin. All rights reserved. +// + +import Foundation + +#if os(iOS) + import UIKit + public typealias OAuthViewController = UIViewController +#elseif os(OSX) + import AppKit + public typealias OAuthViewController = NSViewController +#endif + +public class OAuthWebViewController: OAuthViewController, OAuthSwiftURLHandlerType { + + public func handle(url: NSURL){ + #if os(iOS) + UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController( + self, animated: true, completion: nil) + #elseif os(OSX) + if let p = self.parentViewController { // default behaviour if this controller affected as child controller + p.presentViewControllerAsModalWindow(self) + } else if let window = self.view.window { + window.makeKeyAndOrderFront(nil) + } + // or create an NSWindow or NSWindowController (/!\ keep a strong reference on it) + #endif + } + + public func dismissWebViewController() { + #if os(iOS) + self.dismissViewControllerAnimated(true, completion: nil) + #elseif os(OSX) + if self.presentingViewController != nil { // if presentViewControllerAsModalWindow + self.dismissController(nil) + if self.parentViewController != nil { + self.removeFromParentViewController() + } + } + else if let window = self.view.window { + window.performClose(nil) + } + #endif + } +} \ No newline at end of file diff --git a/Pods/OAuthSwift/OAuthSwift/SHA1.swift b/Pods/OAuthSwift/OAuthSwift/SHA1.swift new file mode 100644 index 0000000..79880c5 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/SHA1.swift @@ -0,0 +1,134 @@ +// +// SHA1.swift +// OAuthSwift +// +// Created by Dongri Jin on 1/28/15. +// Copyright (c) 2015 Dongri Jin. All rights reserved. +// + +import Foundation + +class SHA1 { + + var message: NSData + + init(_ message: NSData) { + self.message = message + } + + /** Common part for hash calculation. Prepare header data. */ + func prepare(len:Int = 64) -> NSMutableData { + let tmpMessage: NSMutableData = NSMutableData(data: self.message) + + // Step 1. Append Padding Bits + tmpMessage.appendBytes([0x80]) // append one bit (Byte with one bit) to message + + // append "0" bit until message length in bits ≡ 448 (mod 512) + while tmpMessage.length % len != (len - 8) { + tmpMessage.appendBytes([0x00]) + } + + return tmpMessage + } + + func calculate() -> NSData { + + //var tmpMessage = self.prepare() + let len = 64 + let h:[UInt32] = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0] + + let tmpMessage: NSMutableData = NSMutableData(data: self.message) + + // Step 1. Append Padding Bits + tmpMessage.appendBytes([0x80]) // append one bit (Byte with one bit) to message + + // append "0" bit until message length in bits ≡ 448 (mod 512) + while tmpMessage.length % len != (len - 8) { + tmpMessage.appendBytes([0x00]) + } + + // hash values + var hh = h + + // append message length, in a 64-bit big-endian integer. So now the message length is a multiple of 512 bits. + tmpMessage.appendBytes((self.message.length * 8).bytes(64 / 8)) + + // Process the message in successive 512-bit chunks: + let chunkSizeBytes = 512 / 8 // 64 + var leftMessageBytes = tmpMessage.length + for var i = 0; i < tmpMessage.length; i = i + chunkSizeBytes, leftMessageBytes -= chunkSizeBytes { + let chunk = tmpMessage.subdataWithRange(NSRange(location: i, length: min(chunkSizeBytes,leftMessageBytes))) + // break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15, big-endian + // Extend the sixteen 32-bit words into eighty 32-bit words: + var M:[UInt32] = [UInt32](count: 80, repeatedValue: 0) + for x in 0.. () in + var i:UInt32 = item.bigEndian + buf.appendBytes(&i, length: sizeofValue(i)) + }) + + return buf.copy() as! NSData + } +} \ No newline at end of file diff --git a/Pods/OAuthSwift/OAuthSwift/String+OAuthSwift.swift b/Pods/OAuthSwift/OAuthSwift/String+OAuthSwift.swift new file mode 100755 index 0000000..6165692 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/String+OAuthSwift.swift @@ -0,0 +1,134 @@ +// +// String+OAuthSwift.swift +// OAuthSwift +// +// Created by Dongri Jin on 6/21/14. +// Copyright (c) 2014 Dongri Jin. All rights reserved. +// + +import Foundation + +extension String { + + internal func indexOf(sub: String) -> Int? { + var pos: Int? + + if let range = self.rangeOfString(sub) { + if !range.isEmpty { + pos = self.startIndex.distanceTo(range.startIndex) + } + } + + return pos + } + + internal subscript (r: Range) -> String { + get { + let startIndex = self.startIndex.advancedBy(r.startIndex) + let endIndex = startIndex.advancedBy(r.endIndex - r.startIndex) + + return self[Range(start: startIndex, end: endIndex)] + } + } + + func urlEncodedStringWithEncoding(encoding: NSStringEncoding) -> String { + let charactersToBeEscaped = ":/?&=;+!@#$()',*" as CFStringRef + let charactersToLeaveUnescaped = "[]." as CFStringRef + + let raw: NSString = self + + let result = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, raw, charactersToLeaveUnescaped, charactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding)) + + return result as String + } + + func parametersFromQueryString() -> Dictionary { + var parameters = Dictionary() + + let scanner = NSScanner(string: self) + + var key: NSString? + var value: NSString? + + while !scanner.atEnd { + key = nil + scanner.scanUpToString("=", intoString: &key) + scanner.scanString("=", intoString: nil) + + value = nil + scanner.scanUpToString("&", intoString: &value) + scanner.scanString("&", intoString: nil) + + if (key != nil && value != nil) { + parameters.updateValue(value! as String, forKey: key! as String) + } + } + + return parameters + } + //分割字符 + func split(s:String)->[String]{ + if s.isEmpty{ + var x=[String]() + for y in self.characters{ + x.append(String(y)) + } + return x + } + return self.componentsSeparatedByString(s) + } + //去掉左右空格 + func trim()->String{ + return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) + } + //是否包含字符串 + func has(s:String)->Bool{ + if (self.rangeOfString(s) != nil) { + return true + }else{ + return false + } + } + //是否包含前缀 + func hasBegin(s:String)->Bool{ + if self.hasPrefix(s) { + return true + }else{ + return false + } + } + //是否包含后缀 + func hasEnd(s:String)->Bool{ + if self.hasSuffix(s) { + return true + }else{ + return false + } + } + //统计长度 + func length()->Int{ + return self.utf16.count + } + //统计长度(别名) + func size()->Int{ + return self.utf16.count + } + //重复字符串 + func `repeat`(times: Int) -> String{ + var result = "" + for _ in 0.. String{ + let s=Array(self.split("").reverse()) + var x="" + for y in s{ + x+=y + } + return x + } +} + diff --git a/Pods/OAuthSwift/OAuthSwift/Utils.swift b/Pods/OAuthSwift/OAuthSwift/Utils.swift new file mode 100644 index 0000000..5a4aec8 --- /dev/null +++ b/Pods/OAuthSwift/OAuthSwift/Utils.swift @@ -0,0 +1,50 @@ +// +// Utils.swift +// OAuthSwift +// +// Created by Dongri Jin on 1/28/15. +// Copyright (c) 2015 Dongri Jin. All rights reserved. +// + +import Foundation + +func rotateLeft(v:UInt16, n:UInt16) -> UInt16 { + return ((v << n) & 0xFFFF) | (v >> (16 - n)) +} + +func rotateLeft(v:UInt32, n:UInt32) -> UInt32 { + return ((v << n) & 0xFFFFFFFF) | (v >> (32 - n)) +} + +func rotateLeft(x:UInt64, n:UInt64) -> UInt64 { + return (x << n) | (x >> (64 - n)) +} + +func rotateRight(x:UInt16, n:UInt16) -> UInt16 { + return (x >> n) | (x << (16 - n)) +} + +func rotateRight(x:UInt32, n:UInt32) -> UInt32 { + return (x >> n) | (x << (32 - n)) +} + +func rotateRight(x:UInt64, n:UInt64) -> UInt64 { + return ((x >> n) | (x << (64 - n))) +} + +func reverseBytes(value: UInt32) -> UInt32 { + let tmp1 = ((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) + let tmp2 = ((value & 0x00FF0000) >> 8) | ((value & 0xFF000000) >> 24) + return tmp1 | tmp2 +} + +public func generateStateWithLength (len : Int) -> NSString { + let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + let randomString : NSMutableString = NSMutableString(capacity: len) + for (var i=0; i < len; i++){ + let length = UInt32 (letters.length) + let rand = arc4random_uniform(length) + randomString.appendFormat("%C", letters.characterAtIndex(Int(rand))) + } + return randomString +} diff --git a/Pods/OAuthSwift/README.md b/Pods/OAuthSwift/README.md new file mode 100644 index 0000000..49e3d0b --- /dev/null +++ b/Pods/OAuthSwift/README.md @@ -0,0 +1,120 @@ +

+ OAuthSwift +

+ +## OAuthSwift + +Swift based OAuth library for iOS and OSX. + +### Support OAuth1.0, OAuth2.0 + +Twitter, Flickr, Github, Instagram, Foursquare. Fitbit, Withings, Linkedin, Dropbox, Dribbble, Salesforce, BitBucket, GoogleDrive, Smugmug, Intuit, Zaim, Tumblr, Slack, Uber etc + +### Installation + +OAuthSwift is packaged as a Swift framework. Currently this is the simplest way to add it to your app: + +* Drag OAuthSwift.xcodeproj to your project in the Project Navigator. +* Select your project and then your app target. Open the Build Phases panel. +* Expand the Target Dependencies group, and add OAuthSwift framework. +* import OAuthSwift whenever you want to use OAuthSwift. + +### Support Carthage + +* Install Carthage (https://github.com/Carthage/Carthage) +* Create Cartfile file +``` +github "dongri/OAuthSwift" ~> 0.4.5 +``` +* Run `carthage update`. +* On your application targets’ “General” settings tab, in the “Embedded Binaries” section, drag and drop OAuthSwift.framework from the Carthage/Build/iOS folder on disk. + +### Support CocoaPods + +* Podfile +``` +platform :ios, '8.0' +use_frameworks! + +pod "OAuthSwift", "~> 0.4.5" +``` + +### Setting URL Schemes + +![Image](Assets/URLSchemes.png "Image") + +### Examples + +```swift +// AppDelegate +func application(application: UIApplication!, openURL url: NSURL!, sourceApplication: String!, annotation: AnyObject!) -> Bool { + if (url.host == "oauth-callback") { + if (url.path!.hasPrefix("/twitter")){ + OAuth1Swift.handleOpenURL(url) + } + if ( url.path!.hasPrefix("/github" )){ + OAuth2Swift.handleOpenURL(url) + } + } + return true +} + +// OAuth1.0 +let oauthswift = OAuth1Swift( + consumerKey: "********", + consumerSecret: "********", + requestTokenUrl: "https://api.twitter.com/oauth/request_token", + authorizeUrl: "https://api.twitter.com/oauth/authorize", + accessTokenUrl: "https://api.twitter.com/oauth/access_token" +) +oauthswift.authorizeWithCallbackURL( NSURL(string: "oauth-swift://oauth-callback/twitter"), success: { + credential, response in + println(credential.oauth_token) + println(credential.oauth_token_secret) +}, failure: failureHandler) + +// OAuth2.0 +let oauthswift = OAuth2Swift( + consumerKey: "********", + consumerSecret: "********", + authorizeUrl: "https://api.instagram.com/oauth/authorize", + responseType: "token" +) +oauthswift.authorizeWithCallbackURL( NSURL(string: "oauth-swift://oauth-callback/instagram"), scope: "likes+comments", state:"INSTAGRAM", success: { + credential, response in + println(credential.oauth_token) +}, failure: failureHandler) + +``` + +### OAuth pages + +* [Twitter](https://dev.twitter.com/docs/auth/oauth) +* [Flickr](https://www.flickr.com/services/api/auth.oauth.html) +* [Github](https://developer.github.com/v3/oauth) +* [Instagram](http://instagram.com/developer/authentication) +* [Foursquare](https://developer.foursquare.com/overview/auth) +* [Fitbit](https://wiki.fitbit.com/display/API/OAuth+Authentication+in+the+Fitbit+API) +* [Withings](http://oauth.withings.com/api) +* [Linkedin](https://developer.linkedin.com/documents/authentication) +* [Dropbox](https://www.dropbox.com/developers/core/docs) +* [Dribbble](http://developer.dribbble.com/v1/oauth/) +* [Salesforce](https://www.salesforce.com/us/developer/docs/api_rest/) +* [BitBucket](https://confluence.atlassian.com/display/BITBUCKET/OAuth+on+Bitbucket) +* [GoogleDrive](https://developers.google.com/drive/v2/reference/) +* [Smugmug](https://smugmug.atlassian.net/wiki/display/API/OAuth) +* [Intuit](https://developer.intuit.com/docs/0100_accounting/0060_authentication_and_authorization/oauth_management_api) +* [Zaim](https://dev.zaim.net/home/api/authorize) +* [Tumblr](https://www.tumblr.com/docs/en/api/v2#auth) +* [Slack](https://api.slack.com/docs/oauth) +* [Uber](https://developer.uber.com/v1/auth/) + +### Images + +![Image](Assets/Services.png "Image") +![Image](Assets/TwitterOAuth.png "Image") +![Image](Assets/TwitterOAuthTokens.png "Image") + +## License + +OAuthSwift is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5500fc0 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1151 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0103D8ADC957C070E1BFED518DDD6900 /* FirebaseApp.h in Headers */ = {isa = PBXBuildFile; fileRef = ABB38D22888780562B262D11932C78F0 /* FirebaseApp.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01AC11A36A221FC1F0CE70876A1A7586 /* FQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 977AA135061BAADD0E97425779426F39 /* FQuery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01D9804232F3A658600E6651F4ADEF3F /* OAuthSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 26025C55A2A6320F12FB8874A7419C24 /* OAuthSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01DC315B8E4A5DA6216FE8033489CCF3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A02ECAC7E8BB25866EDEDE9E00EADB /* Security.framework */; }; + 02318F60A80AC6CCE01EABB52C2A051F /* NSURL+OAuthSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5ECBB90E0EC66D38F6A567A1BE920B73 /* NSURL+OAuthSwift.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 043798CB0DE84D7DF08B7FA25B4CA398 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4EC4B75BAE91861986227C1BE7B931E /* Foundation.framework */; }; + 043ACF4069829331FCC81B76F1AC52E8 /* Firebase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F91EE57841886DC1D2F09E2F64F895E7 /* Firebase-dummy.m */; }; + 0AF8775E2C1FD7CD6010AFB1F89E00D5 /* Pods-comblie-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 48472FB72C109D9D81EE0E9344F704B5 /* Pods-comblie-dummy.m */; }; + 0BE383DCC29A6485B10DDFCC2A5C8C54 /* OAuthWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4686C6F5BDE76A75455220951A19C757 /* OAuthWebViewController.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 0CA09F60F6B4EB0C8290D0D294651872 /* FAuthData.h in Headers */ = {isa = PBXBuildFile; fileRef = 009B15AAF7D867F2E7AA8313AC1E54B2 /* FAuthData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 12A5BBB95CF5F3371D60F62D7410BB8C /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 01695C7AA532F1BA38C83390AD2A0260 /* Alamofire-dummy.m */; }; + 1B29CDCC5D007ED85EDF1FCB2F7D9672 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 991709335D7C876885ED1CBCF1C678AF /* Validation.swift */; }; + 1F80999603FA40AD9B651FBA250AB22B /* FDataSnapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FE8E6A2E92B01F8ADBC7D4348F963C6 /* FDataSnapshot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 202058A665BE8CA72F108E2713EC287F /* FEventType.h in Headers */ = {isa = PBXBuildFile; fileRef = EA5EADFD10CABCB031973E143D629E12 /* FEventType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2213EADDD7605C183FEFEA84D89AA1EB /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C36A7D1DB78C0DF86B60CEFF30D80B68 /* HMAC.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 23F5940A08DB5F0B129F9DFF7CCC3452 /* SwiftyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 85E62DA073C367ACFC8C77B0B6180FD1 /* SwiftyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 286A2B1D7C1032A64D7E83353BC993A6 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A96F7E4D90F73AB23A0E393600A0B384 /* SystemConfiguration.framework */; }; + 3312AAE06F014BF5531DDD056C2186BB /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19925FCC32D2AC1B8B451E6F49AFBA8C /* ParameterEncoding.swift */; }; + 3769B9433B301E32A9DC200E73038AF3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4EC4B75BAE91861986227C1BE7B931E /* Foundation.framework */; }; + 39A8A7DB3537BDC61EF618B1737C1EB5 /* SwiftyJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F861572AEF58AF8E8738463397C601 /* SwiftyJSON.swift */; }; + 3C39C20F909555BD7AD05BCE12D85E64 /* FTransactionResult.h in Headers */ = {isa = PBXBuildFile; fileRef = D59B74DF870630BD94CFDE291FA81394 /* FTransactionResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3F59C23EEDEECACC0F3DD3F461CA386D /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 12E2E56CB6AF65496CD3028C8FE1569A /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 486940176BB4B652E72D16FA36901F39 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4EC4B75BAE91861986227C1BE7B931E /* Foundation.framework */; }; + 4F3B7E8FA25233305FAA50CE157913FA /* Firebase.h in Headers */ = {isa = PBXBuildFile; fileRef = 792F1691BBA2C4B2F808D440CDEFE659 /* Firebase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4FFC0C6DB0D09D9E4BEB396E8ACF3786 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4EC4B75BAE91861986227C1BE7B931E /* Foundation.framework */; }; + 5A5CD1EFDE3D7A89643275861DBF333E /* Upload.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3C31F541FBA6C801CE2CCC5AAE5C6A /* Upload.swift */; }; + 5DB655EC4F9707E7C094121F98AAE0E7 /* Empty.m in Sources */ = {isa = PBXBuildFile; fileRef = 4361A13198C5C4E0D73FAA805BE3E16A /* Empty.m */; }; + 5F1CC5C657D904F75061C727BD6E66BD /* FConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = C5F52191E7503950603319B91A50E74C /* FConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 65A14AF2292C741A22A7BC8984651855 /* Pods-comblie-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F8A0FF889493AA1F9FE2B2F671C08DF /* Pods-comblie-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66FA73AD89C0B485780F41988D44E923 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC3E9F145A3A859B867E06E3DCD61C8F /* CFNetwork.framework */; }; + 6D8D0CBBE0C5FE01A1F9C37F2E081991 /* String+OAuthSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 094D2B6860F9B5CA9C6AAB2B82F76EE7 /* String+OAuthSwift.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 6E3BD9070780888A7295661633EF5D40 /* OAuthSwiftCredential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FBF44922D8622A3618D37B6D8A6728E /* OAuthSwiftCredential.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 719C18DFDDE60570EB6E923E35F6032E /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC6090F9AD0C02A0D59DC0CE8042B98B /* SHA1.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 7C09C45429B6F5A90DB192A244DD515E /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA21B09D9611B09E1A37D5A9647F0EB5 /* Download.swift */; }; + 82C2E7A0ED4D045F8FBEED5C61AA680E /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701EFD0B515E117F302CB155EABE3084 /* Request.swift */; }; + 8A5D53198CFD14FFDC5E4EE766EF7893 /* FirebaseServerValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E0A9B8455C5698BAF20658B659F99B6 /* FirebaseServerValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8BF5150718B77DAD527B94D0F0FF0F10 /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8493E9098F7C797FD21609BC9AE7E1E5 /* Manager.swift */; }; + 90EF20BB8DC0A183A97CEE5D4BE375EE /* SwiftyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A0D3575B7F9DE11C652ED4F55D4D976B /* SwiftyJSON-dummy.m */; }; + 93BFC6876A031FC86A2B3623693565C0 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3836F7F0603DB4A9C59DC4F73AE1DFB2 /* Result.swift */; }; + 97960DC89864E88E39ADCDE233FC097B /* Stream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF6B78E27D2BACC2EF7E6B7E176DC23 /* Stream.swift */; }; + 99E33802005F524735BA8FAAB881CC3C /* Dictionary+OAuthSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C49981A9F94EA6AA9FF8AE1FC4D7ABC /* Dictionary+OAuthSwift.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 9BA3EA6830EA4D0B8AFFD867140A0211 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC0680E3B78041FDC9F0BC518FDB71C9 /* Error.swift */; }; + A02B2D342B323AD116B9546B74CBCC3F /* Int+OAuthSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7A35ACC545884E04AF217173E37F0B /* Int+OAuthSwift.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + A7C69A4D06FF14710AADB3CD114628A3 /* OAuthSwiftHTTPRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D115C5D1B90C6293F94A6795FC89791 /* OAuthSwiftHTTPRequest.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + AC1C33AE02B5EAB9B0EC2C0E4253D9B2 /* FAuthType.h in Headers */ = {isa = PBXBuildFile; fileRef = A74F6EFA890B28426D901B560290B026 /* FAuthType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AEFFB7733138366A0E2E27C4EBE20F5C /* OAuth2Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A10B34CDC47C8BAF8AC7C7275DAD79 /* OAuth2Swift.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + B385D6839DA724C1DA457E79B1D9C547 /* Firebase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 629B84A4FE970BE566C46F39495F3006 /* Firebase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B63520B33B9D2B5FCF6370FE89024923 /* NSData+OAuthSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 267B5EDA018E34D9E7C6F14974F269AF /* NSData+OAuthSwift.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + C504C0BFADE77993BACC45B0ED4EC761 /* OAuthSwiftURLHandlerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80241F16119A39EB51A168CA5C769608 /* OAuthSwiftURLHandlerType.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + C56AD3C3C4A0EE00434DC1DCA799AF78 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4EC4B75BAE91861986227C1BE7B931E /* Foundation.framework */; }; + CB5AC02BE39708AB9A7E3601B6EC97D7 /* OAuthSwiftClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D082E608259330265B0E4CDF04D387 /* OAuthSwiftClient.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + CDC54AEF580D67F9D8D67D57EADEEFD2 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9F7C97E8874BD8604AC24C14175E88 /* ResponseSerialization.swift */; }; + CE794890A3FBE1FE6F46125CB5A1F088 /* OAuthSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 24388DA150FADDE8E83474737C5A2AC3 /* OAuthSwift-dummy.m */; }; + CFFE8DEA60E3068C58E1B9CBA07C1B97 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BA20233F1BEC833FC6E3D263F5BB683 /* ServerTrustPolicy.swift */; }; + EB35FAC38EB920620E8365DBE14EDEE0 /* OAuth1Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B0EE6C827479BF66A2BC67421DCBB2E /* OAuth1Swift.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + ED2CF3BF11D6D20A6AE317E7A66DC05D /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BF8078A8C9B4CD73363E9653E4187E1 /* MultipartFormData.swift */; }; + F004D6B0FCD1111C03CB85AB1F836856 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2138DEFE934152A21A6E20B0C92C3D30 /* Utils.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + F5EFEA9410F95C9DA0D077AB6F721AA2 /* FMutableData.h in Headers */ = {isa = PBXBuildFile; fileRef = 287278401E1824A746D1DCB658E77CA1 /* FMutableData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F763EB470CB69131B3B95A14E0014C02 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254DFF1266651829D1DA13273D81A53B /* Alamofire.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 429953472B93397FA1437677712AE8E1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0450C045C8EC2F1E697DCFCFE157596C; + remoteInfo = Alamofire; + }; + 6C14C2B93CF0E5DED03B42D78398B16B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = B9A04D3C9B208813656510FDA8ADAE02; + remoteInfo = SwiftyJSON; + }; + D2E610142D0BF15113FF7C5642F4DE94 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 486EE5935B8DBF81B1B8E6C117CF5250; + remoteInfo = Firebase; + }; + DA1CD79910792654A11230291DFB37F6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 87643FB293F2706D7B7C15B1271B7A32; + remoteInfo = OAuthSwift; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 009B15AAF7D867F2E7AA8313AC1E54B2 /* FAuthData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FAuthData.h; sourceTree = ""; }; + 00B4E3583731341090CAA62EA2BE287C /* Firebase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Firebase-prefix.pch"; sourceTree = ""; }; + 01695C7AA532F1BA38C83390AD2A0260 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 02D082E608259330265B0E4CDF04D387 /* OAuthSwiftClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuthSwiftClient.swift; path = OAuthSwift/OAuthSwiftClient.swift; sourceTree = ""; }; + 03B4502D425103257E8746E7BB91A521 /* Alamofire-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Alamofire-Private.xcconfig"; sourceTree = ""; }; + 094D2B6860F9B5CA9C6AAB2B82F76EE7 /* String+OAuthSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+OAuthSwift.swift"; path = "OAuthSwift/String+OAuthSwift.swift"; sourceTree = ""; }; + 0CB90F8FAAEFBF644E26169827C66366 /* Firebase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Firebase.xcconfig; sourceTree = ""; }; + 0D115C5D1B90C6293F94A6795FC89791 /* OAuthSwiftHTTPRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuthSwiftHTTPRequest.swift; path = OAuthSwift/OAuthSwiftHTTPRequest.swift; sourceTree = ""; }; + 0D9706D2D2713980FDDF6F259703300B /* Firebase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Firebase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0DF6B78E27D2BACC2EF7E6B7E176DC23 /* Stream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stream.swift; path = Source/Stream.swift; sourceTree = ""; }; + 12E2E56CB6AF65496CD3028C8FE1569A /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + 14EAE12DA19598E66F93EECD456C7D91 /* SwiftyJSON-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "SwiftyJSON-Private.xcconfig"; sourceTree = ""; }; + 154CADC8C2D981A30E2D386CFB84F89B /* SwiftyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftyJSON-prefix.pch"; sourceTree = ""; }; + 15A6F99A3C8BAFFE897FEE63D3882899 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1605E7748BA74F4B74153924DAA88122 /* libFirebaseStatic.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = libFirebaseStatic.a; sourceTree = ""; }; + 18E6FFAE4855C465A88254FD76FF768D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 19925FCC32D2AC1B8B451E6F49AFBA8C /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + 1BF8078A8C9B4CD73363E9653E4187E1 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + 2138DEFE934152A21A6E20B0C92C3D30 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = OAuthSwift/Utils.swift; sourceTree = ""; }; + 24388DA150FADDE8E83474737C5A2AC3 /* OAuthSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "OAuthSwift-dummy.m"; sourceTree = ""; }; + 254DFF1266651829D1DA13273D81A53B /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + 26025C55A2A6320F12FB8874A7419C24 /* OAuthSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OAuthSwift-umbrella.h"; sourceTree = ""; }; + 267B5EDA018E34D9E7C6F14974F269AF /* NSData+OAuthSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSData+OAuthSwift.swift"; path = "OAuthSwift/NSData+OAuthSwift.swift"; sourceTree = ""; }; + 2747548514DB259F9AAC58468EDAA0EF /* Firebase-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Firebase-Private.xcconfig"; sourceTree = ""; }; + 280F0E52C7FBA3C38B0E5B89CAEDCF84 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 287278401E1824A746D1DCB658E77CA1 /* FMutableData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FMutableData.h; sourceTree = ""; }; + 2F8A0FF889493AA1F9FE2B2F671C08DF /* Pods-comblie-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-comblie-umbrella.h"; sourceTree = ""; }; + 31F861572AEF58AF8E8738463397C601 /* SwiftyJSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftyJSON.swift; path = Source/SwiftyJSON.swift; sourceTree = ""; }; + 3836F7F0603DB4A9C59DC4F73AE1DFB2 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; + 388B38D06B1E0F6E6CF21392D854A86B /* OAuthSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = OAuthSwift.modulemap; sourceTree = ""; }; + 3AF3803E2A79F4B307857DF277749BA6 /* SwiftyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftyJSON.xcconfig; sourceTree = ""; }; + 3E0A9B8455C5698BAF20658B659F99B6 /* FirebaseServerValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FirebaseServerValue.h; sourceTree = ""; }; + 4361A13198C5C4E0D73FAA805BE3E16A /* Empty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Empty.m; sourceTree = ""; }; + 4686C6F5BDE76A75455220951A19C757 /* OAuthWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuthWebViewController.swift; path = OAuthSwift/OAuthWebViewController.swift; sourceTree = ""; }; + 48472FB72C109D9D81EE0E9344F704B5 /* Pods-comblie-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-comblie-dummy.m"; sourceTree = ""; }; + 493022CA7EF92D0D91D4E7FFFCF792B9 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4A45348CE55A2083D4A97647E6623E22 /* SwiftyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SwiftyJSON.modulemap; sourceTree = ""; }; + 4C49981A9F94EA6AA9FF8AE1FC4D7ABC /* Dictionary+OAuthSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Dictionary+OAuthSwift.swift"; path = "OAuthSwift/Dictionary+OAuthSwift.swift"; sourceTree = ""; }; + 4FBF44922D8622A3618D37B6D8A6728E /* OAuthSwiftCredential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuthSwiftCredential.swift; path = OAuthSwift/OAuthSwiftCredential.swift; sourceTree = ""; }; + 53655465C728EFE252DF4064A85573DA /* Pods-comblie.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-comblie.release.xcconfig"; sourceTree = ""; }; + 5606521C8BDFCAC7F0844381A732BE8F /* Pods-comblie-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-comblie-frameworks.sh"; sourceTree = ""; }; + 5D7F41E0EA4F2498211329CDC42D77C2 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5ECBB90E0EC66D38F6A567A1BE920B73 /* NSURL+OAuthSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSURL+OAuthSwift.swift"; path = "OAuthSwift/NSURL+OAuthSwift.swift"; sourceTree = ""; }; + 629B84A4FE970BE566C46F39495F3006 /* Firebase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Firebase-umbrella.h"; sourceTree = ""; }; + 6B0EE6C827479BF66A2BC67421DCBB2E /* OAuth1Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuth1Swift.swift; path = OAuthSwift/OAuth1Swift.swift; sourceTree = ""; }; + 701EFD0B515E117F302CB155EABE3084 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + 708A11767483ADC41DD248CFA3A5D204 /* OAuthSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "OAuthSwift-prefix.pch"; sourceTree = ""; }; + 7237BB2BB4A6149B799C1DDE96AB8E4D /* Pods_comblie.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_comblie.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 792F1691BBA2C4B2F808D440CDEFE659 /* Firebase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Firebase.h; sourceTree = ""; }; + 7B5B353AB52D65782F32FBE3E4A653F2 /* Pods-comblie-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-comblie-acknowledgements.markdown"; sourceTree = ""; }; + 80241F16119A39EB51A168CA5C769608 /* OAuthSwiftURLHandlerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuthSwiftURLHandlerType.swift; path = OAuthSwift/OAuthSwiftURLHandlerType.swift; sourceTree = ""; }; + 8432F164D8777AE30B46B06B8FC2D722 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; + 8493E9098F7C797FD21609BC9AE7E1E5 /* Manager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Manager.swift; path = Source/Manager.swift; sourceTree = ""; }; + 85E62DA073C367ACFC8C77B0B6180FD1 /* SwiftyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftyJSON-umbrella.h"; sourceTree = ""; }; + 95A10B34CDC47C8BAF8AC7C7275DAD79 /* OAuth2Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OAuth2Swift.swift; path = OAuthSwift/OAuth2Swift.swift; sourceTree = ""; }; + 977AA135061BAADD0E97425779426F39 /* FQuery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FQuery.h; sourceTree = ""; }; + 991709335D7C876885ED1CBCF1C678AF /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; + 9BA20233F1BEC833FC6E3D263F5BB683 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; + 9FE8E6A2E92B01F8ADBC7D4348F963C6 /* FDataSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FDataSnapshot.h; sourceTree = ""; }; + A0D3575B7F9DE11C652ED4F55D4D976B /* SwiftyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftyJSON-dummy.m"; sourceTree = ""; }; + A1A02ECAC7E8BB25866EDEDE9E00EADB /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + A2BD8C8133E3F780FB095EE58F366C4E /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + A74F6EFA890B28426D901B560290B026 /* FAuthType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FAuthType.h; sourceTree = ""; }; + A96F7E4D90F73AB23A0E393600A0B384 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + ABB38D22888780562B262D11932C78F0 /* FirebaseApp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FirebaseApp.h; sourceTree = ""; }; + AC0680E3B78041FDC9F0BC518FDB71C9 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; + AC3E9F145A3A859B867E06E3DCD61C8F /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + AC6090F9AD0C02A0D59DC0CE8042B98B /* SHA1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SHA1.swift; path = OAuthSwift/SHA1.swift; sourceTree = ""; }; + AD3C31F541FBA6C801CE2CCC5AAE5C6A /* Upload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Upload.swift; path = Source/Upload.swift; sourceTree = ""; }; + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BC447B67B8B30FFA5D77FF1AABC07197 /* OAuthSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = OAuthSwift.xcconfig; sourceTree = ""; }; + C1E014556743936701A964E1A9E378B2 /* Pods-comblie.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-comblie.debug.xcconfig"; sourceTree = ""; }; + C36A7D1DB78C0DF86B60CEFF30D80B68 /* HMAC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HMAC.swift; path = OAuthSwift/HMAC.swift; sourceTree = ""; }; + C514011C4743F2953101A3EBCCA34636 /* Firebase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Firebase.modulemap; sourceTree = ""; }; + C5F52191E7503950603319B91A50E74C /* FConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FConfig.h; sourceTree = ""; }; + CAAA015B631D5EC22643F40C405C9C6D /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + CBD2B88F3650C001D8BCDECE35BC5568 /* OAuthSwift-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "OAuthSwift-Private.xcconfig"; sourceTree = ""; }; + CFB2A5F568CB436B1DD457018A553305 /* Pods-comblie-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-comblie-resources.sh"; sourceTree = ""; }; + D59B74DF870630BD94CFDE291FA81394 /* FTransactionResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FTransactionResult.h; sourceTree = ""; }; + D8E01CB8FF8E35E61E1DE0593B51F080 /* Pods-comblie-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-comblie-acknowledgements.plist"; sourceTree = ""; }; + D99E826A866A47294F3E20359EF3F14A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DA21B09D9611B09E1A37D5A9647F0EB5 /* Download.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Download.swift; path = Source/Download.swift; sourceTree = ""; }; + DC7A35ACC545884E04AF217173E37F0B /* Int+OAuthSwift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Int+OAuthSwift.swift"; path = "OAuthSwift/Int+OAuthSwift.swift"; sourceTree = ""; }; + DC9F7C97E8874BD8604AC24C14175E88 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + E25B28A11CD9E4225BA4A49D5A076586 /* Pods-comblie.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-comblie.modulemap"; sourceTree = ""; }; + E4EC4B75BAE91861986227C1BE7B931E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + EA5EADFD10CABCB031973E143D629E12 /* FEventType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FEventType.h; sourceTree = ""; }; + EB4CB50B42FA0112BD3CB968CB68AC93 /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ECEE9DDD6A735B4131EBE3BD9E8FFBCF /* OAuthSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OAuthSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F91EE57841886DC1D2F09E2F64F895E7 /* Firebase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Firebase-dummy.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 39378F55A4E79D88EC9488F2FA37A386 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 486940176BB4B652E72D16FA36901F39 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 576AB83F296C28223EFEB568BD4476C6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 043798CB0DE84D7DF08B7FA25B4CA398 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9BE978B687883D0DCC70A0DAA8F479EE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 66FA73AD89C0B485780F41988D44E923 /* CFNetwork.framework in Frameworks */, + 4FFC0C6DB0D09D9E4BEB396E8ACF3786 /* Foundation.framework in Frameworks */, + 01DC315B8E4A5DA6216FE8033489CCF3 /* Security.framework in Frameworks */, + 286A2B1D7C1032A64D7E83353BC993A6 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CBEEDA6A29AD33FB9CFD183DA7A8F5B4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3769B9433B301E32A9DC200E73038AF3 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DD3173241F0B95139ADC34E5C449180C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C56AD3C3C4A0EE00434DC1DCA799AF78 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0BF3DEC972E9C1B26CDF266B705FF5A7 /* Support Files */ = { + isa = PBXGroup; + children = ( + C514011C4743F2953101A3EBCCA34636 /* Firebase.modulemap */, + 0CB90F8FAAEFBF644E26169827C66366 /* Firebase.xcconfig */, + 2747548514DB259F9AAC58468EDAA0EF /* Firebase-Private.xcconfig */, + F91EE57841886DC1D2F09E2F64F895E7 /* Firebase-dummy.m */, + 00B4E3583731341090CAA62EA2BE287C /* Firebase-prefix.pch */, + 629B84A4FE970BE566C46F39495F3006 /* Firebase-umbrella.h */, + D99E826A866A47294F3E20359EF3F14A /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/Firebase"; + sourceTree = ""; + }; + 14B8B9B15ECBE87983FF987239AB2D7B /* Frameworks */ = { + isa = PBXGroup; + children = ( + E3F965ECCBF10B69E9313EF2EA1CC3F7 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 16726156A2D8D013ABBE495842DFC57C /* Support Files */ = { + isa = PBXGroup; + children = ( + 18E6FFAE4855C465A88254FD76FF768D /* Info.plist */, + 4A45348CE55A2083D4A97647E6623E22 /* SwiftyJSON.modulemap */, + 3AF3803E2A79F4B307857DF277749BA6 /* SwiftyJSON.xcconfig */, + 14EAE12DA19598E66F93EECD456C7D91 /* SwiftyJSON-Private.xcconfig */, + A0D3575B7F9DE11C652ED4F55D4D976B /* SwiftyJSON-dummy.m */, + 154CADC8C2D981A30E2D386CFB84F89B /* SwiftyJSON-prefix.pch */, + 85E62DA073C367ACFC8C77B0B6180FD1 /* SwiftyJSON-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SwiftyJSON"; + sourceTree = ""; + }; + 1860FF1CB170D86A7FD4B825751F6828 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1605E7748BA74F4B74153924DAA88122 /* libFirebaseStatic.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 1F7A44280FF63FEE2DE71575CA234534 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 870C44DA77120C539B2A99253E804722 /* Pods-comblie */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 4650052C9E469A509C6AC7699BADEFF3 /* SwiftyJSON */ = { + isa = PBXGroup; + children = ( + 31F861572AEF58AF8E8738463397C601 /* SwiftyJSON.swift */, + 16726156A2D8D013ABBE495842DFC57C /* Support Files */, + ); + path = SwiftyJSON; + sourceTree = ""; + }; + 56BDCE9DF8C7D794215887BFE59B5D4D /* OAuthSwift */ = { + isa = PBXGroup; + children = ( + 4C49981A9F94EA6AA9FF8AE1FC4D7ABC /* Dictionary+OAuthSwift.swift */, + C36A7D1DB78C0DF86B60CEFF30D80B68 /* HMAC.swift */, + DC7A35ACC545884E04AF217173E37F0B /* Int+OAuthSwift.swift */, + 267B5EDA018E34D9E7C6F14974F269AF /* NSData+OAuthSwift.swift */, + 5ECBB90E0EC66D38F6A567A1BE920B73 /* NSURL+OAuthSwift.swift */, + 6B0EE6C827479BF66A2BC67421DCBB2E /* OAuth1Swift.swift */, + 95A10B34CDC47C8BAF8AC7C7275DAD79 /* OAuth2Swift.swift */, + 02D082E608259330265B0E4CDF04D387 /* OAuthSwiftClient.swift */, + 4FBF44922D8622A3618D37B6D8A6728E /* OAuthSwiftCredential.swift */, + 0D115C5D1B90C6293F94A6795FC89791 /* OAuthSwiftHTTPRequest.swift */, + 80241F16119A39EB51A168CA5C769608 /* OAuthSwiftURLHandlerType.swift */, + 4686C6F5BDE76A75455220951A19C757 /* OAuthWebViewController.swift */, + AC6090F9AD0C02A0D59DC0CE8042B98B /* SHA1.swift */, + 094D2B6860F9B5CA9C6AAB2B82F76EE7 /* String+OAuthSwift.swift */, + 2138DEFE934152A21A6E20B0C92C3D30 /* Utils.swift */, + 5AB8E1068BE4C46D87500E88029F6101 /* Support Files */, + ); + path = OAuthSwift; + sourceTree = ""; + }; + 5AB8E1068BE4C46D87500E88029F6101 /* Support Files */ = { + isa = PBXGroup; + children = ( + 15A6F99A3C8BAFFE897FEE63D3882899 /* Info.plist */, + 388B38D06B1E0F6E6CF21392D854A86B /* OAuthSwift.modulemap */, + BC447B67B8B30FFA5D77FF1AABC07197 /* OAuthSwift.xcconfig */, + CBD2B88F3650C001D8BCDECE35BC5568 /* OAuthSwift-Private.xcconfig */, + 24388DA150FADDE8E83474737C5A2AC3 /* OAuthSwift-dummy.m */, + 708A11767483ADC41DD248CFA3A5D204 /* OAuthSwift-prefix.pch */, + 26025C55A2A6320F12FB8874A7419C24 /* OAuthSwift-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/OAuthSwift"; + sourceTree = ""; + }; + 713D2122BECF24600968AD4E4992494C /* Alamofire */ = { + isa = PBXGroup; + children = ( + 254DFF1266651829D1DA13273D81A53B /* Alamofire.swift */, + DA21B09D9611B09E1A37D5A9647F0EB5 /* Download.swift */, + AC0680E3B78041FDC9F0BC518FDB71C9 /* Error.swift */, + 8493E9098F7C797FD21609BC9AE7E1E5 /* Manager.swift */, + 1BF8078A8C9B4CD73363E9653E4187E1 /* MultipartFormData.swift */, + 19925FCC32D2AC1B8B451E6F49AFBA8C /* ParameterEncoding.swift */, + 701EFD0B515E117F302CB155EABE3084 /* Request.swift */, + DC9F7C97E8874BD8604AC24C14175E88 /* ResponseSerialization.swift */, + 3836F7F0603DB4A9C59DC4F73AE1DFB2 /* Result.swift */, + 9BA20233F1BEC833FC6E3D263F5BB683 /* ServerTrustPolicy.swift */, + 0DF6B78E27D2BACC2EF7E6B7E176DC23 /* Stream.swift */, + AD3C31F541FBA6C801CE2CCC5AAE5C6A /* Upload.swift */, + 991709335D7C876885ED1CBCF1C678AF /* Validation.swift */, + E8DAF416BD149BD586D58360D2F6A59C /* Support Files */, + ); + path = Alamofire; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, + 14B8B9B15ECBE87983FF987239AB2D7B /* Frameworks */, + E9D1D6BAA8201A8CF596F0C3A1195EE1 /* Pods */, + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */, + 1F7A44280FF63FEE2DE71575CA234534 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 870C44DA77120C539B2A99253E804722 /* Pods-comblie */ = { + isa = PBXGroup; + children = ( + 280F0E52C7FBA3C38B0E5B89CAEDCF84 /* Info.plist */, + E25B28A11CD9E4225BA4A49D5A076586 /* Pods-comblie.modulemap */, + 7B5B353AB52D65782F32FBE3E4A653F2 /* Pods-comblie-acknowledgements.markdown */, + D8E01CB8FF8E35E61E1DE0593B51F080 /* Pods-comblie-acknowledgements.plist */, + 48472FB72C109D9D81EE0E9344F704B5 /* Pods-comblie-dummy.m */, + 5606521C8BDFCAC7F0844381A732BE8F /* Pods-comblie-frameworks.sh */, + CFB2A5F568CB436B1DD457018A553305 /* Pods-comblie-resources.sh */, + 2F8A0FF889493AA1F9FE2B2F671C08DF /* Pods-comblie-umbrella.h */, + C1E014556743936701A964E1A9E378B2 /* Pods-comblie.debug.xcconfig */, + 53655465C728EFE252DF4064A85573DA /* Pods-comblie.release.xcconfig */, + ); + name = "Pods-comblie"; + path = "Target Support Files/Pods-comblie"; + sourceTree = ""; + }; + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */ = { + isa = PBXGroup; + children = ( + 493022CA7EF92D0D91D4E7FFFCF792B9 /* Alamofire.framework */, + 0D9706D2D2713980FDDF6F259703300B /* Firebase.framework */, + ECEE9DDD6A735B4131EBE3BD9E8FFBCF /* OAuthSwift.framework */, + 7237BB2BB4A6149B799C1DDE96AB8E4D /* Pods_comblie.framework */, + EB4CB50B42FA0112BD3CB968CB68AC93 /* SwiftyJSON.framework */, + ); + name = Products; + sourceTree = ""; + }; + D80734C0D0316BBDC19EDB1AB1C0E5CB /* Firebase */ = { + isa = PBXGroup; + children = ( + 4361A13198C5C4E0D73FAA805BE3E16A /* Empty.m */, + 009B15AAF7D867F2E7AA8313AC1E54B2 /* FAuthData.h */, + A74F6EFA890B28426D901B560290B026 /* FAuthType.h */, + C5F52191E7503950603319B91A50E74C /* FConfig.h */, + 9FE8E6A2E92B01F8ADBC7D4348F963C6 /* FDataSnapshot.h */, + EA5EADFD10CABCB031973E143D629E12 /* FEventType.h */, + 287278401E1824A746D1DCB658E77CA1 /* FMutableData.h */, + 977AA135061BAADD0E97425779426F39 /* FQuery.h */, + D59B74DF870630BD94CFDE291FA81394 /* FTransactionResult.h */, + 792F1691BBA2C4B2F808D440CDEFE659 /* Firebase.h */, + ABB38D22888780562B262D11932C78F0 /* FirebaseApp.h */, + 3E0A9B8455C5698BAF20658B659F99B6 /* FirebaseServerValue.h */, + 1860FF1CB170D86A7FD4B825751F6828 /* Frameworks */, + 0BF3DEC972E9C1B26CDF266B705FF5A7 /* Support Files */, + ); + path = Firebase; + sourceTree = ""; + }; + E3F965ECCBF10B69E9313EF2EA1CC3F7 /* iOS */ = { + isa = PBXGroup; + children = ( + AC3E9F145A3A859B867E06E3DCD61C8F /* CFNetwork.framework */, + E4EC4B75BAE91861986227C1BE7B931E /* Foundation.framework */, + A1A02ECAC7E8BB25866EDEDE9E00EADB /* Security.framework */, + A96F7E4D90F73AB23A0E393600A0B384 /* SystemConfiguration.framework */, + ); + name = iOS; + sourceTree = ""; + }; + E8DAF416BD149BD586D58360D2F6A59C /* Support Files */ = { + isa = PBXGroup; + children = ( + A2BD8C8133E3F780FB095EE58F366C4E /* Alamofire.modulemap */, + CAAA015B631D5EC22643F40C405C9C6D /* Alamofire.xcconfig */, + 03B4502D425103257E8746E7BB91A521 /* Alamofire-Private.xcconfig */, + 01695C7AA532F1BA38C83390AD2A0260 /* Alamofire-dummy.m */, + 8432F164D8777AE30B46B06B8FC2D722 /* Alamofire-prefix.pch */, + 12E2E56CB6AF65496CD3028C8FE1569A /* Alamofire-umbrella.h */, + 5D7F41E0EA4F2498211329CDC42D77C2 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/Alamofire"; + sourceTree = ""; + }; + E9D1D6BAA8201A8CF596F0C3A1195EE1 /* Pods */ = { + isa = PBXGroup; + children = ( + 713D2122BECF24600968AD4E4992494C /* Alamofire */, + D80734C0D0316BBDC19EDB1AB1C0E5CB /* Firebase */, + 56BDCE9DF8C7D794215887BFE59B5D4D /* OAuthSwift */, + 4650052C9E469A509C6AC7699BADEFF3 /* SwiftyJSON */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 0D232605D5BB9C728A961E564134DF13 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 01D9804232F3A658600E6651F4ADEF3F /* OAuthSwift-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 191D627E9D1AED9A5DD6CE82904F6F99 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F59C23EEDEECACC0F3DD3F461CA386D /* Alamofire-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2210E1249E46ADB25B970D3A4C62963A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 65A14AF2292C741A22A7BC8984651855 /* Pods-comblie-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BE8F609FD9A244777DB6C3B5C55E822E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 23F5940A08DB5F0B129F9DFF7CCC3452 /* SwiftyJSON-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F19EA7080AE93CC4B9D2DD12403FAD24 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0CA09F60F6B4EB0C8290D0D294651872 /* FAuthData.h in Headers */, + AC1C33AE02B5EAB9B0EC2C0E4253D9B2 /* FAuthType.h in Headers */, + 5F1CC5C657D904F75061C727BD6E66BD /* FConfig.h in Headers */, + 1F80999603FA40AD9B651FBA250AB22B /* FDataSnapshot.h in Headers */, + 202058A665BE8CA72F108E2713EC287F /* FEventType.h in Headers */, + F5EFEA9410F95C9DA0D077AB6F721AA2 /* FMutableData.h in Headers */, + 01AC11A36A221FC1F0CE70876A1A7586 /* FQuery.h in Headers */, + 3C39C20F909555BD7AD05BCE12D85E64 /* FTransactionResult.h in Headers */, + B385D6839DA724C1DA457E79B1D9C547 /* Firebase-umbrella.h in Headers */, + 4F3B7E8FA25233305FAA50CE157913FA /* Firebase.h in Headers */, + 0103D8ADC957C070E1BFED518DDD6900 /* FirebaseApp.h in Headers */, + 8A5D53198CFD14FFDC5E4EE766EF7893 /* FirebaseServerValue.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0450C045C8EC2F1E697DCFCFE157596C /* Alamofire */ = { + isa = PBXNativeTarget; + buildConfigurationList = E71B96974E4E9D20F37F7D886A9700FC /* Build configuration list for PBXNativeTarget "Alamofire" */; + buildPhases = ( + 29E165E40FA47046A99F18776008F785 /* Sources */, + 576AB83F296C28223EFEB568BD4476C6 /* Frameworks */, + 191D627E9D1AED9A5DD6CE82904F6F99 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Alamofire; + productName = Alamofire; + productReference = 493022CA7EF92D0D91D4E7FFFCF792B9 /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + 07D37463AFDD46F63D85D2A02AA1C7CE /* Pods-comblie */ = { + isa = PBXNativeTarget; + buildConfigurationList = 67BBBD2A5C8E117D46F8E4DFC170AE19 /* Build configuration list for PBXNativeTarget "Pods-comblie" */; + buildPhases = ( + EAA7458CE85C4313CF43A0165CB9F47C /* Sources */, + DD3173241F0B95139ADC34E5C449180C /* Frameworks */, + 2210E1249E46ADB25B970D3A4C62963A /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 30FA253FEEB2A15EFE81A51C1B5B67B2 /* PBXTargetDependency */, + 07CE6D3FF52539414D34DCB88AE7D344 /* PBXTargetDependency */, + 2EBB972F27AFB5BE8B30594BDF0DA6AF /* PBXTargetDependency */, + C73F405FF3E67B6E8381DC60A51C92A4 /* PBXTargetDependency */, + ); + name = "Pods-comblie"; + productName = "Pods-comblie"; + productReference = 7237BB2BB4A6149B799C1DDE96AB8E4D /* Pods_comblie.framework */; + productType = "com.apple.product-type.framework"; + }; + 486EE5935B8DBF81B1B8E6C117CF5250 /* Firebase */ = { + isa = PBXNativeTarget; + buildConfigurationList = FAF1229017588A05183D18F80C9EBD96 /* Build configuration list for PBXNativeTarget "Firebase" */; + buildPhases = ( + EE303086D04E292F9A08D315E00E7CF6 /* Sources */, + 9BE978B687883D0DCC70A0DAA8F479EE /* Frameworks */, + F19EA7080AE93CC4B9D2DD12403FAD24 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Firebase; + productName = Firebase; + productReference = 0D9706D2D2713980FDDF6F259703300B /* Firebase.framework */; + productType = "com.apple.product-type.framework"; + }; + 87643FB293F2706D7B7C15B1271B7A32 /* OAuthSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 943F61E794F1E58E084D29A315FE2A26 /* Build configuration list for PBXNativeTarget "OAuthSwift" */; + buildPhases = ( + FFE13E7E0A7BC50A10877E05BA47E3A3 /* Sources */, + 39378F55A4E79D88EC9488F2FA37A386 /* Frameworks */, + 0D232605D5BB9C728A961E564134DF13 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OAuthSwift; + productName = OAuthSwift; + productReference = ECEE9DDD6A735B4131EBE3BD9E8FFBCF /* OAuthSwift.framework */; + productType = "com.apple.product-type.framework"; + }; + B9A04D3C9B208813656510FDA8ADAE02 /* SwiftyJSON */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6AF45366202C75BFCB13738AB00EC1DF /* Build configuration list for PBXNativeTarget "SwiftyJSON" */; + buildPhases = ( + 857F4306B6C6D8D06B3382A44BD3CD69 /* Sources */, + CBEEDA6A29AD33FB9CFD183DA7A8F5B4 /* Frameworks */, + BE8F609FD9A244777DB6C3B5C55E822E /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SwiftyJSON; + productName = SwiftyJSON; + productReference = EB4CB50B42FA0112BD3CB968CB68AC93 /* SwiftyJSON.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = CCA510CFBEA2D207524CDA0D73C3B561 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0450C045C8EC2F1E697DCFCFE157596C /* Alamofire */, + 486EE5935B8DBF81B1B8E6C117CF5250 /* Firebase */, + 87643FB293F2706D7B7C15B1271B7A32 /* OAuthSwift */, + 07D37463AFDD46F63D85D2A02AA1C7CE /* Pods-comblie */, + B9A04D3C9B208813656510FDA8ADAE02 /* SwiftyJSON */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 29E165E40FA47046A99F18776008F785 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 12A5BBB95CF5F3371D60F62D7410BB8C /* Alamofire-dummy.m in Sources */, + F763EB470CB69131B3B95A14E0014C02 /* Alamofire.swift in Sources */, + 7C09C45429B6F5A90DB192A244DD515E /* Download.swift in Sources */, + 9BA3EA6830EA4D0B8AFFD867140A0211 /* Error.swift in Sources */, + 8BF5150718B77DAD527B94D0F0FF0F10 /* Manager.swift in Sources */, + ED2CF3BF11D6D20A6AE317E7A66DC05D /* MultipartFormData.swift in Sources */, + 3312AAE06F014BF5531DDD056C2186BB /* ParameterEncoding.swift in Sources */, + 82C2E7A0ED4D045F8FBEED5C61AA680E /* Request.swift in Sources */, + CDC54AEF580D67F9D8D67D57EADEEFD2 /* ResponseSerialization.swift in Sources */, + 93BFC6876A031FC86A2B3623693565C0 /* Result.swift in Sources */, + CFFE8DEA60E3068C58E1B9CBA07C1B97 /* ServerTrustPolicy.swift in Sources */, + 97960DC89864E88E39ADCDE233FC097B /* Stream.swift in Sources */, + 5A5CD1EFDE3D7A89643275861DBF333E /* Upload.swift in Sources */, + 1B29CDCC5D007ED85EDF1FCB2F7D9672 /* Validation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 857F4306B6C6D8D06B3382A44BD3CD69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 90EF20BB8DC0A183A97CEE5D4BE375EE /* SwiftyJSON-dummy.m in Sources */, + 39A8A7DB3537BDC61EF618B1737C1EB5 /* SwiftyJSON.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EAA7458CE85C4313CF43A0165CB9F47C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0AF8775E2C1FD7CD6010AFB1F89E00D5 /* Pods-comblie-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE303086D04E292F9A08D315E00E7CF6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5DB655EC4F9707E7C094121F98AAE0E7 /* Empty.m in Sources */, + 043ACF4069829331FCC81B76F1AC52E8 /* Firebase-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FFE13E7E0A7BC50A10877E05BA47E3A3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 99E33802005F524735BA8FAAB881CC3C /* Dictionary+OAuthSwift.swift in Sources */, + 2213EADDD7605C183FEFEA84D89AA1EB /* HMAC.swift in Sources */, + A02B2D342B323AD116B9546B74CBCC3F /* Int+OAuthSwift.swift in Sources */, + B63520B33B9D2B5FCF6370FE89024923 /* NSData+OAuthSwift.swift in Sources */, + 02318F60A80AC6CCE01EABB52C2A051F /* NSURL+OAuthSwift.swift in Sources */, + EB35FAC38EB920620E8365DBE14EDEE0 /* OAuth1Swift.swift in Sources */, + AEFFB7733138366A0E2E27C4EBE20F5C /* OAuth2Swift.swift in Sources */, + CE794890A3FBE1FE6F46125CB5A1F088 /* OAuthSwift-dummy.m in Sources */, + CB5AC02BE39708AB9A7E3601B6EC97D7 /* OAuthSwiftClient.swift in Sources */, + 6E3BD9070780888A7295661633EF5D40 /* OAuthSwiftCredential.swift in Sources */, + A7C69A4D06FF14710AADB3CD114628A3 /* OAuthSwiftHTTPRequest.swift in Sources */, + C504C0BFADE77993BACC45B0ED4EC761 /* OAuthSwiftURLHandlerType.swift in Sources */, + 0BE383DCC29A6485B10DDFCC2A5C8C54 /* OAuthWebViewController.swift in Sources */, + 719C18DFDDE60570EB6E923E35F6032E /* SHA1.swift in Sources */, + 6D8D0CBBE0C5FE01A1F9C37F2E081991 /* String+OAuthSwift.swift in Sources */, + F004D6B0FCD1111C03CB85AB1F836856 /* Utils.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 07CE6D3FF52539414D34DCB88AE7D344 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Firebase; + target = 486EE5935B8DBF81B1B8E6C117CF5250 /* Firebase */; + targetProxy = D2E610142D0BF15113FF7C5642F4DE94 /* PBXContainerItemProxy */; + }; + 2EBB972F27AFB5BE8B30594BDF0DA6AF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = OAuthSwift; + target = 87643FB293F2706D7B7C15B1271B7A32 /* OAuthSwift */; + targetProxy = DA1CD79910792654A11230291DFB37F6 /* PBXContainerItemProxy */; + }; + 30FA253FEEB2A15EFE81A51C1B5B67B2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Alamofire; + target = 0450C045C8EC2F1E697DCFCFE157596C /* Alamofire */; + targetProxy = 429953472B93397FA1437677712AE8E1 /* PBXContainerItemProxy */; + }; + C73F405FF3E67B6E8381DC60A51C92A4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SwiftyJSON; + target = B9A04D3C9B208813656510FDA8ADAE02 /* SwiftyJSON */; + targetProxy = 6C14C2B93CF0E5DED03B42D78398B16B /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 34157EA121187ED8B71610A4762D14A7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CBD2B88F3650C001D8BCDECE35BC5568 /* OAuthSwift-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.4.6; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.4.6; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/OAuthSwift/OAuthSwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/OAuthSwift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/OAuthSwift/OAuthSwift.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = OAuthSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4531188B12F6340814400E470BFE53C4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C1E014556743936701A964E1A9E378B2 /* Pods-comblie.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-comblie/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-comblie/Pods-comblie.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_comblie; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 48E3ADC5CB66A04CEE12F67CC205B80F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 03B4502D425103257E8746E7BB91A521 /* Alamofire-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.0.2; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Alamofire; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 55C9287BC8E642399BB5BF43D298EA99 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2747548514DB259F9AAC58468EDAA0EF /* Firebase-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.4.2; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Firebase/Firebase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Firebase/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Firebase/Firebase.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Firebase; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 5CE5176205D06FF3FFE3DDDA9291E44B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 5EE121465FEF7C0C440C9D747683C3ED /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 53655465C728EFE252DF4064A85573DA /* Pods-comblie.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-comblie/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Pods-comblie/Pods-comblie.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_comblie; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 6ACC0108596FF94E96CC3BEFBDE3BC1A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 14EAE12DA19598E66F93EECD456C7D91 /* SwiftyJSON-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.3.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftyJSON/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SwiftyJSON/SwiftyJSON.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = SwiftyJSON; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 74857149DC1E0D599B8A01A78349A926 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 899050C45B24F3C73DD237E2D935FE38 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 03B4502D425103257E8746E7BB91A521 /* Alamofire-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.0.2; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Alamofire; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 98ECB1BFD1A2F45787863F67FE716038 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2747548514DB259F9AAC58468EDAA0EF /* Firebase-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.4.2; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Firebase/Firebase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Firebase/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Firebase/Firebase.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Firebase; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + EE8E73E9AB461E8DCF9E9817092601AD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 14EAE12DA19598E66F93EECD456C7D91 /* SwiftyJSON-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2.3.0; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftyJSON/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SwiftyJSON/SwiftyJSON.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = SwiftyJSON; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FE23BB228764E21DF42B8612066C89E1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CBD2B88F3650C001D8BCDECE35BC5568 /* OAuthSwift-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 0.4.6; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 0.4.6; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/OAuthSwift/OAuthSwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/OAuthSwift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/OAuthSwift/OAuthSwift.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = OAuthSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5CE5176205D06FF3FFE3DDDA9291E44B /* Debug */, + 74857149DC1E0D599B8A01A78349A926 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 67BBBD2A5C8E117D46F8E4DFC170AE19 /* Build configuration list for PBXNativeTarget "Pods-comblie" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4531188B12F6340814400E470BFE53C4 /* Debug */, + 5EE121465FEF7C0C440C9D747683C3ED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6AF45366202C75BFCB13738AB00EC1DF /* Build configuration list for PBXNativeTarget "SwiftyJSON" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE8E73E9AB461E8DCF9E9817092601AD /* Debug */, + 6ACC0108596FF94E96CC3BEFBDE3BC1A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 943F61E794F1E58E084D29A315FE2A26 /* Build configuration list for PBXNativeTarget "OAuthSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 34157EA121187ED8B71610A4762D14A7 /* Debug */, + FE23BB228764E21DF42B8612066C89E1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E71B96974E4E9D20F37F7D886A9700FC /* Build configuration list for PBXNativeTarget "Alamofire" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 48E3ADC5CB66A04CEE12F67CC205B80F /* Debug */, + 899050C45B24F3C73DD237E2D935FE38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FAF1229017588A05183D18F80C9EBD96 /* Build configuration list for PBXNativeTarget "Firebase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 98ECB1BFD1A2F45787863F67FE716038 /* Debug */, + 55C9287BC8E642399BB5BF43D298EA99 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Pods/SwiftyJSON/LICENSE b/Pods/SwiftyJSON/LICENSE new file mode 100644 index 0000000..a7af196 --- /dev/null +++ b/Pods/SwiftyJSON/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ruoyu Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/SwiftyJSON/README.md b/Pods/SwiftyJSON/README.md new file mode 100644 index 0000000..6c772d9 --- /dev/null +++ b/Pods/SwiftyJSON/README.md @@ -0,0 +1,373 @@ +#SwiftyJSON [中文介绍](http://tangplin.github.io/swiftyjson/) + +SwiftyJSON makes it easy to deal with JSON data in Swift. + +1. [Why is the typical JSON handling in Swift NOT good](#why-is-the-typical-json-handling-in-swift-not-good) +1. [Requirements](#requirements) +1. [Integration](#integration) +1. [Usage](#usage) + - [Initialization](#initialization) + - [Subscript](#subscript) + - [Loop](#loop) + - [Error](#error) + - [Optional getter](#optional-getter) + - [Non-optional getter](#non-optional-getter) + - [Setter](#setter) + - [Raw object](#raw-object) + - [Literal convertibles](#literal-convertibles) +1. [Work with Alamofire](#work-with-alamofire) + +##Why is the typical JSON handling in Swift NOT good? +Swift is very strict about types. But although explicit typing is good for saving us from mistakes, it becomes painful when dealing with JSON and other areas that are, by nature, implicit about types. + +Take the Twitter API for example. Say we want to retrieve a user's "name" value of some tweet in Swift (according to Twitter's API https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline). + +The code would look like this: + +```swift + +let JSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) + +if let statusesArray = JSONObject as? [AnyObject], + let status = statusesArray[0] as? [String: AnyObject], + let user = status["user"] as? [String: AnyObject], + let username = user["name"] as? String { + // Finally we got the username +} + +``` + +It's not good. + +Even if we use optional chaining, it would be messy: + +```swift + +let JSONObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) + +if let username = (((JSONObject as? [AnyObject])?[0] as? [String: AnyObject])?["user"] as? [String: AnyObject])?["name"] as? String { + // What a disaster +} + +``` +An unreadable mess--for something that should really be simple! + +With SwiftyJSON all you have to do is: + +```swift + +let json = JSON(data: dataFromNetworking) +if let userName = json[0]["user"]["name"].string { + //Now you got your value +} + +``` + +And don't worry about the Optional Wrapping thing. It's done for you automatically. + +```swift + +let json = JSON(data: dataFromNetworking) +if let userName = json[999999]["wrong_key"]["wrong_name"].string { + //Calm down, take it easy, the ".string" property still produces the correct Optional String type with safety +} else { + //Print the error + println(json[999999]["wrong_key"]["wrong_name"]) +} + +``` + +## Requirements + +- iOS 7.0+ / Mac OS X 10.9+ +- Xcode 7 + +##Integration + +####CocoaPods (iOS 8+, OS X 10.9+) +You can use [Cocoapods](http://cocoapods.org/) to install `SwiftyJSON`by adding it to your `Podfile`: +```ruby +platform :ios, '8.0' +use_frameworks! + +target 'MyApp' do + pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git' +end +``` +Note that this requires CocoaPods version 36, and your iOS deployment target to be at least 8.0: + +####Carthage (iOS 8+, OS X 10.9+) +You can use [Carthage](https://github.com/Carthage/Carthage) to install `SwiftyJSON` by adding it to your `Cartfile`: +``` +github "SwiftyJSON/SwiftyJSON" +``` + +####Manually (iOS 7+, OS X 10.9+) + +To use this library in your project manually you may: + +1. for Projects, just drag SwiftyJSON.swift to the project tree +2. for Workspaces, include the whole SwiftyJSON.xcodeproj + +## Usage + +####Initialization +```swift +import SwiftyJSON +``` +```swift +let json = JSON(data: dataFromNetworking) +``` +```swift +let json = JSON(jsonObject) +``` +```swift +if let dataFromString = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { + let json = JSON(data: dataFromString) +} +``` + +####Subscript +```swift +//Getting a double from a JSON Array +let name = json[0].double +``` +```swift +//Getting a string from a JSON Dictionary +let name = json["name"].stringValue +``` +```swift +//Getting a string using a path to the element +let path = [1,"list",2,"name"] +let name = json[path].string +//Just the same +let name = json[1]["list"][2]["name"].string +//Alternatively +let name = json[1,"list",2,"name"].string +``` +```swift +//With a hard way +let name = json[].string +``` +```swift +//With a custom way +let keys:[SubscriptType] = [1,"list",2,"name"] +let name = json[keys].string +``` +####Loop +```swift +//If json is .Dictionary +for (key,subJson):(String, JSON) in json { + //Do something you want +} +``` +*The first element is always a String, even if the JSON is an Array* +```swift +//If json is .Array +//The `index` is 0.. = json["list"].arrayValue +``` +```swift +//If not a Dictionary or nil, return [:] +let user: Dictionary = json["user"].dictionaryValue +``` + +####Setter +```swift +json["name"] = JSON("new-name") +json[0] = JSON(1) +``` +```swift +json["id"].int = 1234567890 +json["coordinate"].double = 8766.766 +json["name"].string = "Jack" +json.arrayObject = [1,2,3,4] +json.dictionary = ["name":"Jack", "age":25] +``` + +####Raw object +```swift +let jsonObject: AnyObject = json.object +``` +```swift +if let jsonObject: AnyObject = json.rawValue +``` +```swift +//convert the JSON to raw NSData +if let data = json.rawData() { + //Do something you want +} +``` +```swift +//convert the JSON to a raw String +if let string = json.rawString() { + //Do something you want +} +``` +####Literal convertibles +For more info about literal convertibles: [Swift Literal Convertibles](http://nshipster.com/swift-literal-convertible/) +```swift +//StringLiteralConvertible +let json: JSON = "I'm a json" +``` +```swift +//IntegerLiteralConvertible +let json: JSON = 12345 +``` +```swift +//BooleanLiteralConvertible +let json: JSON = true +``` +```swift +//FloatLiteralConvertible +let json: JSON = 2.8765 +``` +```swift +//DictionaryLiteralConvertible +let json: JSON = ["I":"am", "a":"json"] +``` +```swift +//ArrayLiteralConvertible +let json: JSON = ["I", "am", "a", "json"] +``` +```swift +//NilLiteralConvertible +let json: JSON = nil +``` +```swift +//With subscript in array +var json: JSON = [1,2,3] +json[0] = 100 +json[1] = 200 +json[2] = 300 +json[999] = 300 //Don't worry, nothing will happen +``` +```swift +//With subscript in dictionary +var json: JSON = ["name": "Jack", "age": 25] +json["name"] = "Mike" +json["age"] = "25" //It's OK to set String +json["address"] = "L.A." // Add the "address": "L.A." in json +``` +```swift +//Array & Dictionary +var json: JSON = ["name": "Jack", "age": 25, "list": ["a", "b", "c", ["what": "this"]]] +json["list"][3]["what"] = "that" +json["list",3,"what"] = "that" +let path = ["list",3,"what"] +json[path] = "that" +``` +##Work with Alamofire + +SwiftyJSON nicely wraps the result of the Alamofire JSON response handler: +```swift +Alamofire.request(.GET, url, parameters: parameters) + .responseJSON { (req, res, json, error) in + if(error != nil) { + NSLog("Error: \(error)") + println(req) + println(res) + } + else { + NSLog("Success: \(url)") + var json = JSON(json!) + } + } +``` diff --git a/Pods/SwiftyJSON/Source/SwiftyJSON.swift b/Pods/SwiftyJSON/Source/SwiftyJSON.swift new file mode 100644 index 0000000..61423a3 --- /dev/null +++ b/Pods/SwiftyJSON/Source/SwiftyJSON.swift @@ -0,0 +1,1343 @@ +// SwiftyJSON.swift +// +// Copyright (c) 2014 Ruoyu Fu, Pinglin Tang +// +// 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 Foundation + +// MARK: - Error + +///Error domain +public let ErrorDomain: String! = "SwiftyJSONErrorDomain" + +///Error code +public let ErrorUnsupportedType: Int! = 999 +public let ErrorIndexOutOfBounds: Int! = 900 +public let ErrorWrongType: Int! = 901 +public let ErrorNotExist: Int! = 500 + +// MARK: - JSON Type + +/** +JSON's type definitions. + +See http://tools.ietf.org/html/rfc7231#section-4.3 +*/ +public enum Type :Int{ + + case Number + case String + case Bool + case Array + case Dictionary + case Null + case Unknown +} + +// MARK: - JSON Base + +public struct JSON { + + /** + Creates a JSON using the data. + + - parameter data: The NSData used to convert to json.Top level object in data is an NSArray or NSDictionary + - parameter opt: The JSON serialization reading options. `.AllowFragments` by default. + - parameter error: error The NSErrorPointer used to return the error. `nil` by default. + + - returns: The created JSON + */ + public init(data:NSData, options opt: NSJSONReadingOptions = .AllowFragments, error: NSErrorPointer = nil) { + do { + let object: AnyObject = try NSJSONSerialization.JSONObjectWithData(data, options: opt) + self.init(object) + } catch let aError as NSError { + if error != nil { + error.memory = aError + } + self.init(NSNull()) + } + } + + /** + Creates a JSON using the object. + + - parameter object: The object must have the following properties: All objects are NSString/String, NSNumber/Int/Float/Double/Bool, NSArray/Array, NSDictionary/Dictionary, or NSNull; All dictionary keys are NSStrings/String; NSNumbers are not NaN or infinity. + + - returns: The created JSON + */ + public init(_ object: AnyObject) { + self.object = object + } + + /** + Creates a JSON from a [JSON] + + - parameter jsonArray: A Swift array of JSON objects + + - returns: The created JSON + */ + public init(_ jsonArray:[JSON]) { + self.init(jsonArray.map { $0.object }) + } + + /** + Creates a JSON from a [String: JSON] + + :param: jsonDictionary A Swift dictionary of JSON objects + + :returns: The created JSON + */ + public init(_ jsonDictionary:[String: JSON]) { + var dictionary = [String: AnyObject]() + for (key, json) in jsonDictionary { + dictionary[key] = json.object + } + self.init(dictionary) + } + + /// Private object + private var rawArray: [AnyObject] = [] + private var rawDictionary: [String : AnyObject] = [:] + private var rawString: String = "" + private var rawNumber: NSNumber = 0 + private var rawNull: NSNull = NSNull() + /// Private type + private var _type: Type = .Null + /// prviate error + private var _error: NSError? = nil + + /// Object in JSON + public var object: AnyObject { + get { + switch self.type { + case .Array: + return self.rawArray + case .Dictionary: + return self.rawDictionary + case .String: + return self.rawString + case .Number: + return self.rawNumber + case .Bool: + return self.rawNumber + default: + return self.rawNull + } + } + set { + _error = nil + switch newValue { + case let number as NSNumber: + if number.isBool { + _type = .Bool + } else { + _type = .Number + } + self.rawNumber = number + case let string as String: + _type = .String + self.rawString = string + case _ as NSNull: + _type = .Null + case let array as [AnyObject]: + _type = .Array + self.rawArray = array + case let dictionary as [String : AnyObject]: + _type = .Dictionary + self.rawDictionary = dictionary + default: + _type = .Unknown + _error = NSError(domain: ErrorDomain, code: ErrorUnsupportedType, userInfo: [NSLocalizedDescriptionKey: "It is a unsupported type"]) + } + } + } + + /// json type + public var type: Type { get { return _type } } + + /// Error in JSON + public var error: NSError? { get { return self._error } } + + /// The static null json + @available(*, unavailable, renamed="null") + public static var nullJSON: JSON { get { return null } } + public static var null: JSON { get { return JSON(NSNull()) } } +} + +// MARK: - CollectionType, SequenceType, Indexable +extension JSON : Swift.CollectionType, Swift.SequenceType, Swift.Indexable { + + public typealias Generator = JSONGenerator + + public typealias Index = JSONIndex + + public var startIndex: JSON.Index { + switch self.type { + case .Array: + return JSONIndex(arrayIndex: self.rawArray.startIndex) + case .Dictionary: + return JSONIndex(dictionaryIndex: self.rawDictionary.startIndex) + default: + return JSONIndex() + } + } + + public var endIndex: JSON.Index { + switch self.type { + case .Array: + return JSONIndex(arrayIndex: self.rawArray.endIndex) + case .Dictionary: + return JSONIndex(dictionaryIndex: self.rawDictionary.endIndex) + default: + return JSONIndex() + } + } + + public subscript (position: JSON.Index) -> JSON.Generator.Element { + switch self.type { + case .Array: + return (String(position.arrayIndex), JSON(self.rawArray[position.arrayIndex!])) + case .Dictionary: + let (key, value) = self.rawDictionary[position.dictionaryIndex!] + return (key, JSON(value)) + default: + return ("", JSON.null) + } + } + + /// If `type` is `.Array` or `.Dictionary`, return `array.empty` or `dictonary.empty` otherwise return `false`. + public var isEmpty: Bool { + get { + switch self.type { + case .Array: + return self.rawArray.isEmpty + case .Dictionary: + return self.rawDictionary.isEmpty + default: + return true + } + } + } + + /// If `type` is `.Array` or `.Dictionary`, return `array.count` or `dictonary.count` otherwise return `0`. + public var count: Int { + switch self.type { + case .Array: + return self.rawArray.count + case .Dictionary: + return self.rawDictionary.count + default: + return 0 + } + } + + public func underestimateCount() -> Int { + switch self.type { + case .Array: + return self.rawArray.underestimateCount() + case .Dictionary: + return self.rawDictionary.underestimateCount() + default: + return 0 + } + } + + /** + If `type` is `.Array` or `.Dictionary`, return a generator over the elements like `Array` or `Dictionary`, otherwise return a generator over empty. + + - returns: Return a *generator* over the elements of JSON. + */ + public func generate() -> JSON.Generator { + return JSON.Generator(self) + } +} + +public struct JSONIndex: ForwardIndexType, _Incrementable, Equatable, Comparable { + + let arrayIndex: Int? + let dictionaryIndex: DictionaryIndex? + + let type: Type + + init(){ + self.arrayIndex = nil + self.dictionaryIndex = nil + self.type = .Unknown + } + + init(arrayIndex: Int) { + self.arrayIndex = arrayIndex + self.dictionaryIndex = nil + self.type = .Array + } + + init(dictionaryIndex: DictionaryIndex) { + self.arrayIndex = nil + self.dictionaryIndex = dictionaryIndex + self.type = .Dictionary + } + + public func successor() -> JSONIndex { + switch self.type { + case .Array: + return JSONIndex(arrayIndex: self.arrayIndex!.successor()) + case .Dictionary: + return JSONIndex(dictionaryIndex: self.dictionaryIndex!.successor()) + default: + return JSONIndex() + } + } +} + +public func ==(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex == rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex == rhs.dictionaryIndex + default: + return false + } +} + +public func <(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex < rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex < rhs.dictionaryIndex + default: + return false + } +} + +public func <=(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex <= rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex <= rhs.dictionaryIndex + default: + return false + } +} + +public func >=(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex >= rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex >= rhs.dictionaryIndex + default: + return false + } +} + +public func >(lhs: JSONIndex, rhs: JSONIndex) -> Bool { + switch (lhs.type, rhs.type) { + case (.Array, .Array): + return lhs.arrayIndex > rhs.arrayIndex + case (.Dictionary, .Dictionary): + return lhs.dictionaryIndex > rhs.dictionaryIndex + default: + return false + } +} + +public struct JSONGenerator : GeneratorType { + + public typealias Element = (String, JSON) + + private let type: Type + private var dictionayGenerate: DictionaryGenerator? + private var arrayGenerate: IndexingGenerator<[AnyObject]>? + private var arrayIndex: Int = 0 + + init(_ json: JSON) { + self.type = json.type + if type == .Array { + self.arrayGenerate = json.rawArray.generate() + }else { + self.dictionayGenerate = json.rawDictionary.generate() + } + } + + public mutating func next() -> JSONGenerator.Element? { + switch self.type { + case .Array: + if let o = self.arrayGenerate!.next() { + return (String(self.arrayIndex++), JSON(o)) + } else { + return nil + } + case .Dictionary: + if let (k, v): (String, AnyObject) = self.dictionayGenerate!.next() { + return (k, JSON(v)) + } else { + return nil + } + default: + return nil + } + } +} + +// MARK: - Subscript + +/** +* To mark both String and Int can be used in subscript. +*/ +public protocol JSONSubscriptType {} + +extension Int: JSONSubscriptType {} + +extension String: JSONSubscriptType {} + +extension JSON { + + /// If `type` is `.Array`, return json which's object is `array[index]`, otherwise return null json with error. + private subscript(index index: Int) -> JSON { + get { + if self.type != .Array { + var r = JSON.null + r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: "Array[\(index)] failure, It is not an array"]) + return r + } else if index >= 0 && index < self.rawArray.count { + return JSON(self.rawArray[index]) + } else { + var r = JSON.null + r._error = NSError(domain: ErrorDomain, code:ErrorIndexOutOfBounds , userInfo: [NSLocalizedDescriptionKey: "Array[\(index)] is out of bounds"]) + return r + } + } + set { + if self.type == .Array { + if self.rawArray.count > index && newValue.error == nil { + self.rawArray[index] = newValue.object + } + } + } + } + + /// If `type` is `.Dictionary`, return json which's object is `dictionary[key]` , otherwise return null json with error. + private subscript(key key: String) -> JSON { + get { + var r = JSON.null + if self.type == .Dictionary { + if let o = self.rawDictionary[key] { + r = JSON(o) + } else { + r._error = NSError(domain: ErrorDomain, code: ErrorNotExist, userInfo: [NSLocalizedDescriptionKey: "Dictionary[\"\(key)\"] does not exist"]) + } + } else { + r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: "Dictionary[\"\(key)\"] failure, It is not an dictionary"]) + } + return r + } + set { + if self.type == .Dictionary && newValue.error == nil { + self.rawDictionary[key] = newValue.object + } + } + } + + /// If `sub` is `Int`, return `subscript(index:)`; If `sub` is `String`, return `subscript(key:)`. + private subscript(sub sub: JSONSubscriptType) -> JSON { + get { + if sub is String { + return self[key:sub as! String] + } else { + return self[index:sub as! Int] + } + } + set { + if sub is String { + self[key:sub as! String] = newValue + } else { + self[index:sub as! Int] = newValue + } + } + } + + /** + Find a json in the complex data structuresby using the Int/String's array. + + - parameter path: The target json's path. Example: + + let json = JSON[data] + let path = [9,"list","person","name"] + let name = json[path] + + The same as: let name = json[9]["list"]["person"]["name"] + + - returns: Return a json found by the path or a null json with error + */ + public subscript(path: [JSONSubscriptType]) -> JSON { + get { + return path.reduce(self) { $0[sub: $1] } + } + set { + switch path.count { + case 0: + return + case 1: + self[sub:path[0]].object = newValue.object + default: + var aPath = path; aPath.removeAtIndex(0) + var nextJSON = self[sub: path[0]] + nextJSON[aPath] = newValue + self[sub: path[0]] = nextJSON + } + } + } + + /** + Find a json in the complex data structuresby using the Int/String's array. + + - parameter path: The target json's path. Example: + + let name = json[9,"list","person","name"] + + The same as: let name = json[9]["list"]["person"]["name"] + + - returns: Return a json found by the path or a null json with error + */ + public subscript(path: JSONSubscriptType...) -> JSON { + get { + return self[path] + } + set { + self[path] = newValue + } + } +} + +// MARK: - LiteralConvertible + +extension JSON: Swift.StringLiteralConvertible { + + public init(stringLiteral value: StringLiteralType) { + self.init(value) + } + + public init(extendedGraphemeClusterLiteral value: StringLiteralType) { + self.init(value) + } + + public init(unicodeScalarLiteral value: StringLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.IntegerLiteralConvertible { + + public init(integerLiteral value: IntegerLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.BooleanLiteralConvertible { + + public init(booleanLiteral value: BooleanLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.FloatLiteralConvertible { + + public init(floatLiteral value: FloatLiteralType) { + self.init(value) + } +} + +extension JSON: Swift.DictionaryLiteralConvertible { + + public init(dictionaryLiteral elements: (String, AnyObject)...) { + self.init(elements.reduce([String : AnyObject]()){(dictionary: [String : AnyObject], element:(String, AnyObject)) -> [String : AnyObject] in + var d = dictionary + d[element.0] = element.1 + return d + }) + } +} + +extension JSON: Swift.ArrayLiteralConvertible { + + public init(arrayLiteral elements: AnyObject...) { + self.init(elements) + } +} + +extension JSON: Swift.NilLiteralConvertible { + + public init(nilLiteral: ()) { + self.init(NSNull()) + } +} + +// MARK: - Raw + +extension JSON: Swift.RawRepresentable { + + public init?(rawValue: AnyObject) { + if JSON(rawValue).type == .Unknown { + return nil + } else { + self.init(rawValue) + } + } + + public var rawValue: AnyObject { + return self.object + } + + public func rawData(options opt: NSJSONWritingOptions = NSJSONWritingOptions(rawValue: 0)) throws -> NSData { + return try NSJSONSerialization.dataWithJSONObject(self.object, options: opt) + } + + public func rawString(encoding: UInt = NSUTF8StringEncoding, options opt: NSJSONWritingOptions = .PrettyPrinted) -> String? { + switch self.type { + case .Array, .Dictionary: + do { + let data = try self.rawData(options: opt) + return NSString(data: data, encoding: encoding) as? String + } catch _ { + return nil + } + case .String: + return self.rawString + case .Number: + return self.rawNumber.stringValue + case .Bool: + return self.rawNumber.boolValue.description + case .Null: + return "null" + default: + return nil + } + } +} + +// MARK: - Printable, DebugPrintable + +extension JSON: Swift.Printable, Swift.DebugPrintable { + + public var description: String { + if let string = self.rawString(options:.PrettyPrinted) { + return string + } else { + return "unknown" + } + } + + public var debugDescription: String { + return description + } +} + +// MARK: - Array + +extension JSON { + + //Optional [JSON] + public var array: [JSON]? { + get { + if self.type == .Array { + return self.rawArray.map{ JSON($0) } + } else { + return nil + } + } + } + + //Non-optional [JSON] + public var arrayValue: [JSON] { + get { + return self.array ?? [] + } + } + + //Optional [AnyObject] + public var arrayObject: [AnyObject]? { + get { + switch self.type { + case .Array: + return self.rawArray + default: + return nil + } + } + set { + if let array = newValue { + self.object = array + } else { + self.object = NSNull() + } + } + } +} + +// MARK: - Dictionary + +extension JSON { + + //Optional [String : JSON] + public var dictionary: [String : JSON]? { + if self.type == .Dictionary { + return self.rawDictionary.reduce([String : JSON]()) { (dictionary: [String : JSON], element: (String, AnyObject)) -> [String : JSON] in + var d = dictionary + d[element.0] = JSON(element.1) + return d + } + } else { + return nil + } + } + + //Non-optional [String : JSON] + public var dictionaryValue: [String : JSON] { + return self.dictionary ?? [:] + } + + //Optional [String : AnyObject] + public var dictionaryObject: [String : AnyObject]? { + get { + switch self.type { + case .Dictionary: + return self.rawDictionary + default: + return nil + } + } + set { + if let v = newValue { + self.object = v + } else { + self.object = NSNull() + } + } + } +} + +// MARK: - Bool + +extension JSON: Swift.BooleanType { + + //Optional bool + public var bool: Bool? { + get { + switch self.type { + case .Bool: + return self.rawNumber.boolValue + default: + return nil + } + } + set { + if newValue != nil { + self.object = NSNumber(bool: newValue!) + } else { + self.object = NSNull() + } + } + } + + //Non-optional bool + public var boolValue: Bool { + get { + switch self.type { + case .Bool, .Number, .String: + return self.object.boolValue + default: + return false + } + } + set { + self.object = NSNumber(bool: newValue) + } + } +} + +// MARK: - String + +extension JSON { + + //Optional string + public var string: String? { + get { + switch self.type { + case .String: + return self.object as? String + default: + return nil + } + } + set { + if newValue != nil { + self.object = NSString(string:newValue!) + } else { + self.object = NSNull() + } + } + } + + //Non-optional string + public var stringValue: String { + get { + switch self.type { + case .String: + return self.object as! String + case .Number: + return self.object.stringValue + case .Bool: + return (self.object as! Bool).description + default: + return "" + } + } + set { + self.object = NSString(string:newValue) + } + } +} + +// MARK: - Number +extension JSON { + + //Optional number + public var number: NSNumber? { + get { + switch self.type { + case .Number, .Bool: + return self.rawNumber + default: + return nil + } + } + set { + self.object = newValue ?? NSNull() + } + } + + //Non-optional number + public var numberValue: NSNumber { + get { + switch self.type { + case .String: + let scanner = NSScanner(string: self.object as! String) + if scanner.scanDouble(nil){ + if (scanner.atEnd) { + return NSNumber(double:(self.object as! NSString).doubleValue) + } + } + return NSNumber(double: 0.0) + case .Number, .Bool: + return self.object as! NSNumber + default: + return NSNumber(double: 0.0) + } + } + set { + self.object = newValue + } + } +} + +//MARK: - Null +extension JSON { + + public var null: NSNull? { + get { + switch self.type { + case .Null: + return self.rawNull + default: + return nil + } + } + set { + self.object = NSNull() + } + } +} + +//MARK: - URL +extension JSON { + + //Optional URL + public var URL: NSURL? { + get { + switch self.type { + case .String: + if let encodedString_ = self.rawString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) { + return NSURL(string: encodedString_) + } else { + return nil + } + default: + return nil + } + } + set { + self.object = newValue?.absoluteString ?? NSNull() + } + } +} + +// MARK: - Int, Double, Float, Int8, Int16, Int32, Int64 + +extension JSON { + + public var double: Double? { + get { + return self.number?.doubleValue + } + set { + if newValue != nil { + self.object = NSNumber(double: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var doubleValue: Double { + get { + return self.numberValue.doubleValue + } + set { + self.object = NSNumber(double: newValue) + } + } + + public var float: Float? { + get { + return self.number?.floatValue + } + set { + if newValue != nil { + self.object = NSNumber(float: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var floatValue: Float { + get { + return self.numberValue.floatValue + } + set { + self.object = NSNumber(float: newValue) + } + } + + public var int: Int? { + get { + return self.number?.longValue + } + set { + if newValue != nil { + self.object = NSNumber(integer: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var intValue: Int { + get { + return self.numberValue.integerValue + } + set { + self.object = NSNumber(integer: newValue) + } + } + + public var uInt: UInt? { + get { + return self.number?.unsignedLongValue + } + set { + if newValue != nil { + self.object = NSNumber(unsignedLong: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var uIntValue: UInt { + get { + return self.numberValue.unsignedLongValue + } + set { + self.object = NSNumber(unsignedLong: newValue) + } + } + + public var int8: Int8? { + get { + return self.number?.charValue + } + set { + if newValue != nil { + self.object = NSNumber(char: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var int8Value: Int8 { + get { + return self.numberValue.charValue + } + set { + self.object = NSNumber(char: newValue) + } + } + + public var uInt8: UInt8? { + get { + return self.number?.unsignedCharValue + } + set { + if newValue != nil { + self.object = NSNumber(unsignedChar: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var uInt8Value: UInt8 { + get { + return self.numberValue.unsignedCharValue + } + set { + self.object = NSNumber(unsignedChar: newValue) + } + } + + public var int16: Int16? { + get { + return self.number?.shortValue + } + set { + if newValue != nil { + self.object = NSNumber(short: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var int16Value: Int16 { + get { + return self.numberValue.shortValue + } + set { + self.object = NSNumber(short: newValue) + } + } + + public var uInt16: UInt16? { + get { + return self.number?.unsignedShortValue + } + set { + if newValue != nil { + self.object = NSNumber(unsignedShort: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var uInt16Value: UInt16 { + get { + return self.numberValue.unsignedShortValue + } + set { + self.object = NSNumber(unsignedShort: newValue) + } + } + + public var int32: Int32? { + get { + return self.number?.intValue + } + set { + if newValue != nil { + self.object = NSNumber(int: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var int32Value: Int32 { + get { + return self.numberValue.intValue + } + set { + self.object = NSNumber(int: newValue) + } + } + + public var uInt32: UInt32? { + get { + return self.number?.unsignedIntValue + } + set { + if newValue != nil { + self.object = NSNumber(unsignedInt: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var uInt32Value: UInt32 { + get { + return self.numberValue.unsignedIntValue + } + set { + self.object = NSNumber(unsignedInt: newValue) + } + } + + public var int64: Int64? { + get { + return self.number?.longLongValue + } + set { + if newValue != nil { + self.object = NSNumber(longLong: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var int64Value: Int64 { + get { + return self.numberValue.longLongValue + } + set { + self.object = NSNumber(longLong: newValue) + } + } + + public var uInt64: UInt64? { + get { + return self.number?.unsignedLongLongValue + } + set { + if newValue != nil { + self.object = NSNumber(unsignedLongLong: newValue!) + } else { + self.object = NSNull() + } + } + } + + public var uInt64Value: UInt64 { + get { + return self.numberValue.unsignedLongLongValue + } + set { + self.object = NSNumber(unsignedLongLong: newValue) + } + } +} + +//MARK: - Comparable +extension JSON : Swift.Comparable {} + +public func ==(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber == rhs.rawNumber + case (.String, .String): + return lhs.rawString == rhs.rawString + case (.Bool, .Bool): + return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue + case (.Array, .Array): + return lhs.rawArray as NSArray == rhs.rawArray as NSArray + case (.Dictionary, .Dictionary): + return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary + case (.Null, .Null): + return true + default: + return false + } +} + +public func <=(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber <= rhs.rawNumber + case (.String, .String): + return lhs.rawString <= rhs.rawString + case (.Bool, .Bool): + return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue + case (.Array, .Array): + return lhs.rawArray as NSArray == rhs.rawArray as NSArray + case (.Dictionary, .Dictionary): + return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary + case (.Null, .Null): + return true + default: + return false + } +} + +public func >=(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber >= rhs.rawNumber + case (.String, .String): + return lhs.rawString >= rhs.rawString + case (.Bool, .Bool): + return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue + case (.Array, .Array): + return lhs.rawArray as NSArray == rhs.rawArray as NSArray + case (.Dictionary, .Dictionary): + return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary + case (.Null, .Null): + return true + default: + return false + } +} + +public func >(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber > rhs.rawNumber + case (.String, .String): + return lhs.rawString > rhs.rawString + default: + return false + } +} + +public func <(lhs: JSON, rhs: JSON) -> Bool { + + switch (lhs.type, rhs.type) { + case (.Number, .Number): + return lhs.rawNumber < rhs.rawNumber + case (.String, .String): + return lhs.rawString < rhs.rawString + default: + return false + } +} + +private let trueNumber = NSNumber(bool: true) +private let falseNumber = NSNumber(bool: false) +private let trueObjCType = String.fromCString(trueNumber.objCType) +private let falseObjCType = String.fromCString(falseNumber.objCType) + +// MARK: - NSNumber: Comparable + +extension NSNumber: Swift.Comparable { + var isBool:Bool { + get { + let objCType = String.fromCString(self.objCType) + if (self.compare(trueNumber) == NSComparisonResult.OrderedSame && objCType == trueObjCType) + || (self.compare(falseNumber) == NSComparisonResult.OrderedSame && objCType == falseObjCType){ + return true + } else { + return false + } + } + } +} + +public func ==(lhs: NSNumber, rhs: NSNumber) -> Bool { + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) == NSComparisonResult.OrderedSame + } +} + +public func !=(lhs: NSNumber, rhs: NSNumber) -> Bool { + return !(lhs == rhs) +} + +public func <(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) == NSComparisonResult.OrderedAscending + } +} + +public func >(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) == NSComparisonResult.OrderedDescending + } +} + +public func <=(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) != NSComparisonResult.OrderedDescending + } +} + +public func >=(lhs: NSNumber, rhs: NSNumber) -> Bool { + + switch (lhs.isBool, rhs.isBool) { + case (false, true): + return false + case (true, false): + return false + default: + return lhs.compare(rhs) != NSComparisonResult.OrderedAscending + } +} diff --git a/Pods/Target Support Files/Alamofire/Alamofire-Private.xcconfig b/Pods/Target Support Files/Alamofire/Alamofire-Private.xcconfig new file mode 100644 index 0000000..ac7ab02 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-Private.xcconfig @@ -0,0 +1,6 @@ +#include "Alamofire.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Alamofire" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/Alamofire/Alamofire-dummy.m b/Pods/Target Support Files/Alamofire/Alamofire-dummy.m new file mode 100644 index 0000000..a6c4594 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Alamofire : NSObject +@end +@implementation PodsDummy_Alamofire +@end diff --git a/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch b/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h b/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h new file mode 100644 index 0000000..6b71676 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double AlamofireVersionNumber; +FOUNDATION_EXPORT const unsigned char AlamofireVersionString[]; + diff --git a/Pods/Target Support Files/Alamofire/Alamofire.modulemap b/Pods/Target Support Files/Alamofire/Alamofire.modulemap new file mode 100644 index 0000000..d1f125f --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Alamofire.modulemap @@ -0,0 +1,6 @@ +framework module Alamofire { + umbrella header "Alamofire-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Alamofire/Alamofire.xcconfig b/Pods/Target Support Files/Alamofire/Alamofire.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/Pods/Target Support Files/Alamofire/Info.plist b/Pods/Target Support Files/Alamofire/Info.plist new file mode 100644 index 0000000..55d4a94 --- /dev/null +++ b/Pods/Target Support Files/Alamofire/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.0.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Firebase/Firebase-Private.xcconfig b/Pods/Target Support Files/Firebase/Firebase-Private.xcconfig new file mode 100644 index 0000000..3fffeac --- /dev/null +++ b/Pods/Target Support Files/Firebase/Firebase-Private.xcconfig @@ -0,0 +1,7 @@ +#include "Firebase.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Firebase" "${PODS_ROOT}/Headers/Public" +LIBRARY_SEARCH_PATHS = ${FIREBASE_LIBRARY_SEARCH_PATHS} +OTHER_LDFLAGS = ${FIREBASE_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/Firebase/Firebase-dummy.m b/Pods/Target Support Files/Firebase/Firebase-dummy.m new file mode 100644 index 0000000..87930a8 --- /dev/null +++ b/Pods/Target Support Files/Firebase/Firebase-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Firebase : NSObject +@end +@implementation PodsDummy_Firebase +@end diff --git a/Pods/Target Support Files/Firebase/Firebase-prefix.pch b/Pods/Target Support Files/Firebase/Firebase-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/Firebase/Firebase-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/Firebase/Firebase-umbrella.h b/Pods/Target Support Files/Firebase/Firebase-umbrella.h new file mode 100644 index 0000000..6e6458b --- /dev/null +++ b/Pods/Target Support Files/Firebase/Firebase-umbrella.h @@ -0,0 +1,17 @@ +#import + +#import "FAuthData.h" +#import "FAuthType.h" +#import "FConfig.h" +#import "FDataSnapshot.h" +#import "FEventType.h" +#import "Firebase.h" +#import "FirebaseApp.h" +#import "FirebaseServerValue.h" +#import "FMutableData.h" +#import "FQuery.h" +#import "FTransactionResult.h" + +FOUNDATION_EXPORT double FirebaseVersionNumber; +FOUNDATION_EXPORT const unsigned char FirebaseVersionString[]; + diff --git a/Pods/Target Support Files/Firebase/Firebase.modulemap b/Pods/Target Support Files/Firebase/Firebase.modulemap new file mode 100644 index 0000000..7496c1f --- /dev/null +++ b/Pods/Target Support Files/Firebase/Firebase.modulemap @@ -0,0 +1,6 @@ +framework module Firebase { + umbrella header "Firebase-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Firebase/Firebase.xcconfig b/Pods/Target Support Files/Firebase/Firebase.xcconfig new file mode 100644 index 0000000..79653c8 --- /dev/null +++ b/Pods/Target Support Files/Firebase/Firebase.xcconfig @@ -0,0 +1,2 @@ +FIREBASE_LIBRARY_SEARCH_PATHS = "$(PODS_ROOT)/Firebase" +FIREBASE_OTHER_LDFLAGS = -ObjC -l"FirebaseStatic" -l"c++" -l"icucore" -framework "CFNetwork" -framework "Security" -framework "SystemConfiguration" \ No newline at end of file diff --git a/Pods/Target Support Files/Firebase/Info.plist b/Pods/Target Support Files/Firebase/Info.plist new file mode 100644 index 0000000..0bb8113 --- /dev/null +++ b/Pods/Target Support Files/Firebase/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.4.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/OAuthSwift/Info.plist b/Pods/Target Support Files/OAuthSwift/Info.plist new file mode 100644 index 0000000..5f5eb1b --- /dev/null +++ b/Pods/Target Support Files/OAuthSwift/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.4.6 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/OAuthSwift/OAuthSwift-Private.xcconfig b/Pods/Target Support Files/OAuthSwift/OAuthSwift-Private.xcconfig new file mode 100644 index 0000000..d697278 --- /dev/null +++ b/Pods/Target Support Files/OAuthSwift/OAuthSwift-Private.xcconfig @@ -0,0 +1,6 @@ +#include "OAuthSwift.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/OAuthSwift" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/OAuthSwift/OAuthSwift-dummy.m b/Pods/Target Support Files/OAuthSwift/OAuthSwift-dummy.m new file mode 100644 index 0000000..5237a83 --- /dev/null +++ b/Pods/Target Support Files/OAuthSwift/OAuthSwift-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_OAuthSwift : NSObject +@end +@implementation PodsDummy_OAuthSwift +@end diff --git a/Pods/Target Support Files/OAuthSwift/OAuthSwift-prefix.pch b/Pods/Target Support Files/OAuthSwift/OAuthSwift-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/OAuthSwift/OAuthSwift-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/OAuthSwift/OAuthSwift-umbrella.h b/Pods/Target Support Files/OAuthSwift/OAuthSwift-umbrella.h new file mode 100644 index 0000000..0c26384 --- /dev/null +++ b/Pods/Target Support Files/OAuthSwift/OAuthSwift-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double OAuthSwiftVersionNumber; +FOUNDATION_EXPORT const unsigned char OAuthSwiftVersionString[]; + diff --git a/Pods/Target Support Files/OAuthSwift/OAuthSwift.modulemap b/Pods/Target Support Files/OAuthSwift/OAuthSwift.modulemap new file mode 100644 index 0000000..d2430c0 --- /dev/null +++ b/Pods/Target Support Files/OAuthSwift/OAuthSwift.modulemap @@ -0,0 +1,6 @@ +framework module OAuthSwift { + umbrella header "OAuthSwift-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/OAuthSwift/OAuthSwift.xcconfig b/Pods/Target Support Files/OAuthSwift/OAuthSwift.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/Pods/Target Support Files/Pods-comblie/Info.plist b/Pods/Target Support Files/Pods-comblie/Info.plist new file mode 100644 index 0000000..6974542 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie-acknowledgements.markdown b/Pods/Target Support Files/Pods-comblie/Pods-comblie-acknowledgements.markdown new file mode 100644 index 0000000..ec5bdf5 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie-acknowledgements.markdown @@ -0,0 +1,78 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Alamofire + +Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) + +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. + + +## Firebase + +https://www.firebase.com/terms/terms-of-service.html + +## OAuthSwift + +Copyright (c) 2014 Dongri Jin + +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. + + +## SwiftyJSON + +The MIT License (MIT) + +Copyright (c) 2014 Ruoyu Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie-acknowledgements.plist b/Pods/Target Support Files/Pods-comblie/Pods-comblie-acknowledgements.plist new file mode 100644 index 0000000..22b7cf0 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie-acknowledgements.plist @@ -0,0 +1,120 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + Alamofire + Type + PSGroupSpecifier + + + FooterText + https://www.firebase.com/terms/terms-of-service.html + Title + Firebase + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2014 Dongri Jin <dongriat@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + OAuthSwift + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2014 Ruoyu Fu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + SwiftyJSON + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie-dummy.m b/Pods/Target Support Files/Pods-comblie/Pods-comblie-dummy.m new file mode 100644 index 0000000..2705a1e --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_comblie : NSObject +@end +@implementation PodsDummy_Pods_comblie +@end diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie-frameworks.sh b/Pods/Target Support Files/Pods-comblie/Pods-comblie-frameworks.sh new file mode 100755 index 0000000..f10dc82 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie-frameworks.sh @@ -0,0 +1,65 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + else + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries + local basename + basename="$(basename "$1" | sed -E s/\\..+// && exit ${PIPESTATUS[0]})" + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework 'Pods-comblie/Alamofire.framework' + install_framework 'Pods-comblie/Firebase.framework' + install_framework 'Pods-comblie/OAuthSwift.framework' + install_framework 'Pods-comblie/SwiftyJSON.framework' +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework 'Pods-comblie/Alamofire.framework' + install_framework 'Pods-comblie/Firebase.framework' + install_framework 'Pods-comblie/OAuthSwift.framework' + install_framework 'Pods-comblie/SwiftyJSON.framework' +fi diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie-resources.sh b/Pods/Target Support Files/Pods-comblie/Pods-comblie-resources.sh new file mode 100755 index 0000000..ea685a2 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie-umbrella.h b/Pods/Target Support Files/Pods-comblie/Pods-comblie-umbrella.h new file mode 100644 index 0000000..f1d77f4 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_comblieVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_comblieVersionString[]; + diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie.debug.xcconfig b/Pods/Target Support Files/Pods-comblie/Pods-comblie.debug.xcconfig new file mode 100644 index 0000000..21998e3 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie.debug.xcconfig @@ -0,0 +1,7 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Firebase.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/OAuthSwift.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SwiftyJSON.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -framework "Alamofire" -framework "Firebase" -framework "OAuthSwift" -framework "SwiftyJSON" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-comblie +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie.modulemap b/Pods/Target Support Files/Pods-comblie/Pods-comblie.modulemap new file mode 100644 index 0000000..0434ae1 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie.modulemap @@ -0,0 +1,6 @@ +framework module Pods_comblie { + umbrella header "Pods-comblie-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-comblie/Pods-comblie.release.xcconfig b/Pods/Target Support Files/Pods-comblie/Pods-comblie.release.xcconfig new file mode 100644 index 0000000..21998e3 --- /dev/null +++ b/Pods/Target Support Files/Pods-comblie/Pods-comblie.release.xcconfig @@ -0,0 +1,7 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Firebase.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/OAuthSwift.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SwiftyJSON.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -framework "Alamofire" -framework "Firebase" -framework "OAuthSwift" -framework "SwiftyJSON" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-comblie +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/SwiftyJSON/Info.plist b/Pods/Target Support Files/SwiftyJSON/Info.plist new file mode 100644 index 0000000..ad1d34e --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.3.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-Private.xcconfig b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-Private.xcconfig new file mode 100644 index 0000000..5ad5c18 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-Private.xcconfig @@ -0,0 +1,6 @@ +#include "SwiftyJSON.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SwiftyJSON" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m new file mode 100644 index 0000000..3159bec --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SwiftyJSON : NSObject +@end +@implementation PodsDummy_SwiftyJSON +@end diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h new file mode 100644 index 0000000..ce00ad0 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double SwiftyJSONVersionNumber; +FOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[]; + diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap new file mode 100644 index 0000000..6f41751 --- /dev/null +++ b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap @@ -0,0 +1,6 @@ +framework module SwiftyJSON { + umbrella header "SwiftyJSON-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig b/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/PrivacyPolicyController.swift b/PrivacyPolicyController.swift new file mode 100644 index 0000000..32a64c2 --- /dev/null +++ b/PrivacyPolicyController.swift @@ -0,0 +1,46 @@ +// +// PrivacyPolicyController.swift +// comblie +// +// Created by Cal on 11/4/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class PrivacyPolicyController: UIViewController { + + @IBOutlet weak var grayBarHeight: NSLayoutConstraint! + @IBOutlet weak var policyText: UITextView! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.grayBarHeight.constant = CGFloat(0.5) + + self.policyText.contentInset = UIEdgeInsetsMake(3, 0, 5, 0) + } + + override func viewDidLayoutSubviews() { + self.policyText.setContentOffset(CGPointMake(0, -3), animated: false) + } + + //MARK: Action + + @IBAction func back(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/PushNotificationsController.swift b/PushNotificationsController.swift new file mode 100644 index 0000000..2e208c1 --- /dev/null +++ b/PushNotificationsController.swift @@ -0,0 +1,65 @@ +// +// PushNotificationsController.swift +// comblie +// +// Created by Cal on 11/4/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class PushNotificationsController: UIViewController { + + @IBOutlet weak var graybarHeight: NSLayoutConstraint! + @IBOutlet weak var stackView: UIStackView! + + var userPrefs : NSUserDefaults! + + override func viewDidLoad() { + super.viewDidLoad() + + userPrefs = NSUserDefaults.standardUserDefaults() + + // Do any additional setup after loading the view. + self.graybarHeight.constant = CGFloat(0.5) + + //Sets separator thickness and scales switches + for item in self.stackView.subviews { + if item.tag == 1 { + item.constraints.first?.constant = CGFloat(0.5) + } else { + for innerItem in item.subviews { + if innerItem.isKindOfClass(UISwitch) { + let switchButton = innerItem as! UISwitch + switchButton.on = userPrefs.boolForKey(switchButton.restorationIdentifier!) + switchButton.addTarget(self, action: "TriggerNotifications:", forControlEvents: UIControlEvents.ValueChanged) + switchButton.transform = CGAffineTransformMakeScale(0.75, 0.75) + } + } + } + } + } + + + //MARK: Actions + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + func TriggerNotifications(switchButton : UISwitch) { + userPrefs.setBool(switchButton.on, forKey: switchButton.restorationIdentifier!) + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/ReportProblemController.swift b/ReportProblemController.swift new file mode 100644 index 0000000..5ce0221 --- /dev/null +++ b/ReportProblemController.swift @@ -0,0 +1,69 @@ +// +// ReportProblemController.swift +// comblie +// +// Created by Cal on 11/4/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class ReportProblemController: UIViewController,UITextViewDelegate { + + @IBOutlet weak var reportText: UITextView! + @IBOutlet weak var grayBarHeight: NSLayoutConstraint! + @IBOutlet weak var bottomBarHeight: NSLayoutConstraint! + var placeholderColor : UIColor! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.grayBarHeight.constant = CGFloat(0.5) + self.bottomBarHeight.constant = CGFloat(0.5) + self.placeholderColor = UIColor(red: 187/255, green: 187/255, blue: 190/255, alpha: 1) + self.reportText.textColor = placeholderColor + self.reportText.delegate = self + } + + + //MARK: Action + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + func textViewDidBeginEditing(textView: UITextView) { + if textView.textColor == self.placeholderColor { + textView.text = "" + textView.textColor = UIColor.blackColor() + } + } + + func textViewDidEndEditing(textView: UITextView) { + if textView.text == "" { + textView.text = "What would you like for us to improve?" + textView.textColor = self.placeholderColor + } + } + + func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { + if(text == "\n") { + textView.resignFirstResponder() + return false + } + return true + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/SettingsPageController.swift b/SettingsPageController.swift new file mode 100644 index 0000000..013cc81 --- /dev/null +++ b/SettingsPageController.swift @@ -0,0 +1,82 @@ +// +// SettingsPageController.swift +// comblie +// +// Created by Cal on 11/3/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class SettingsPageController: UIViewController { + + @IBOutlet weak var settingsContent: UIView! + @IBOutlet weak var scrollView: UIScrollView! + @IBOutlet weak var settingsContainer: UIView! + @IBOutlet weak var grayBarHeight: NSLayoutConstraint! + @IBOutlet weak var chatSwitch: UISwitch! + @IBOutlet weak var refreshSwitch: UISwitch! + + var userPrefs : NSUserDefaults! + + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view. + self.grayBarHeight.constant = CGFloat(0.5) + + userPrefs = NSUserDefaults.standardUserDefaults() + self.refreshSwitch.transform = CGAffineTransformMakeScale(0.75, 0.75) + self.refreshSwitch.addTarget(self, action: "TriggerSettings:", forControlEvents: .ValueChanged) + self.chatSwitch.transform = CGAffineTransformMakeScale(0.75, 0.75) + self.chatSwitch.addTarget(self, action: "TriggerSettings:", forControlEvents: .ValueChanged) + self.refreshSwitch.on = userPrefs.boolForKey(self.refreshSwitch.restorationIdentifier!) + self.chatSwitch.on = userPrefs.boolForKey(self.chatSwitch.restorationIdentifier!) + + for stack in self.settingsContent.subviews { + if stack.isKindOfClass(UIStackView) { + for item in stack.subviews { + if item.tag == 1 { + item.constraints.first?.constant = CGFloat(0.5) + } else { + for innerItem in item.subviews { + if innerItem.isKindOfClass(UIButton) { + let button = innerItem as! UIButton + button.addTarget(self, action: "openSubSettings:", forControlEvents: UIControlEvents.TouchUpInside) + } + } + } + } + } + } + + } + + override func viewDidAppear(animated: Bool) { + self.scrollView.contentSize = CGSizeMake(UIScreen.mainScreen().bounds.width, self.settingsContent.frame.height) + } + + // MARK: Actions + + func openSubSettings(sender: UIButton){ + let controllerName = sender.restorationIdentifier + let VC = self.storyboard?.instantiateViewControllerWithIdentifier(controllerName!) + self.presentViewController(VC!, animated: true, completion: nil) + } + + func TriggerSettings(switchButton : UISwitch) { + userPrefs.setBool(switchButton.on, forKey: switchButton.restorationIdentifier!) + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/SettingsTableController.swift b/SettingsTableController.swift new file mode 100644 index 0000000..387a1d5 --- /dev/null +++ b/SettingsTableController.swift @@ -0,0 +1,34 @@ +// +// SettingsTableController.swift +// comblie +// +// Created by Cal on 11/3/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class SettingsTableController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override func viewDidAppear(animated: Bool) { + + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/SocialTabViewController.swift b/SocialTabViewController.swift new file mode 100644 index 0000000..5663373 --- /dev/null +++ b/SocialTabViewController.swift @@ -0,0 +1,38 @@ +// +// SocialTabsViewController.swift +// comblie +// +// Created by Cal on 10/14/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class SocialTabViewController: UITabBarController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override func viewWillLayoutSubviews() + { + var tabFrame = self.tabBar.frame + // - 40 is editable , I think the default value is around 50 px, below lowers the tabbar and above increases the tab bar size + tabFrame.size.height = 40 + tabFrame.origin.y = self.view.frame.size.height - 40 + self.tabBar.frame = tabFrame + self.tabBar.alpha = CGFloat(0.0) + } + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/TermsConditionsController.swift b/TermsConditionsController.swift new file mode 100644 index 0000000..c66b0cc --- /dev/null +++ b/TermsConditionsController.swift @@ -0,0 +1,46 @@ +// +// TermsConditionsController.swift +// comblie +// +// Created by Cal on 11/4/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TermsConditionsController: UIViewController { + + @IBOutlet weak var grayBarHeight: NSLayoutConstraint! + @IBOutlet weak var termsText: UITextView! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.grayBarHeight.constant = CGFloat(0.5) + + self.termsText.contentInset = UIEdgeInsetsMake(3, 0, 5, 0) + } + + override func viewDidLayoutSubviews() { + self.termsText.setContentOffset(CGPointMake(0, -3), animated: false) + } + + //MARK: Action + + @IBAction func back(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/TimeMessageCell.xib b/TimeMessageCell.xib new file mode 100644 index 0000000..4dd8522 --- /dev/null +++ b/TimeMessageCell.xib @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TimeMessageCellController.swift b/TimeMessageCellController.swift new file mode 100644 index 0000000..504afff --- /dev/null +++ b/TimeMessageCellController.swift @@ -0,0 +1,26 @@ +// +// TimeMessageCellController.swift +// comblie +// +// Created by Cal on 10/25/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TimeMessageCellController: UITableViewCell { + + @IBOutlet weak var timeLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/TumblrBlogCell.xib b/TumblrBlogCell.xib new file mode 100644 index 0000000..c55d4d9 --- /dev/null +++ b/TumblrBlogCell.xib @@ -0,0 +1,181 @@ + + + + + + + + + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TumblrBlogCellController.swift b/TumblrBlogCellController.swift new file mode 100644 index 0000000..0ff653d --- /dev/null +++ b/TumblrBlogCellController.swift @@ -0,0 +1,114 @@ +// +// TumblrBlogCellController.swift +// comblie +// +// Created by Cal on 10/30/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TumblrBlogCellController: UITableViewCell { + + @IBOutlet weak var profileImage: UIImageView! + + @IBOutlet weak var postStatus: UILabel! + @IBOutlet weak var postSource: UILabel! + @IBOutlet weak var commentText: UILabel! + @IBOutlet weak var commentAuthor: UILabel! + @IBOutlet weak var lineSeparator: UIView! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + @IBOutlet weak var blogLineWidth: NSLayoutConstraint! + @IBOutlet weak var lineBlog: UIView! + @IBOutlet weak var repostButton: UIButton! + @IBOutlet weak var heartButton: UIButton! + + var VC : CommentsController! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.profileImage.layer.masksToBounds = true + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + lineHeight.constant = CGFloat(0.5) + blogLineWidth.constant = CGFloat(1.5) + configureText() + + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + lineSeparator.backgroundColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 1) + lineBlog.backgroundColor = UIColor(red: 211/255, green: 211/255, blue: 211/255, alpha: 1) + // Configure the view for the selected state + } + + override func setHighlighted(highlighted: Bool, animated: Bool) { + lineSeparator.backgroundColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 1) + lineBlog.backgroundColor = UIColor(red: 211/255, green: 211/255, blue: 211/255, alpha: 1) + } + + //MARK: Actions + + @IBAction func enlarge(sender: UIButton) { + VC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("Comments") as! CommentsController + VC.postHeight = self.contentView.frame.height + self.window?.rootViewController?.presentViewController(VC, animated: true, completion: nil) + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + } + + //MARK: Other + + func removeComments() { + let commentAuthorHeightConstraint = NSLayoutConstraint(item: commentAuthor, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0) + commentAuthor.addConstraint(commentAuthorHeightConstraint) + + let commentPostHeightConstraint = NSLayoutConstraint(item: commentText, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0) + commentText.addConstraint(commentPostHeightConstraint) + } + + func configureText() { + + let underlineAttribute = [NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue, NSUnderlineColorAttributeName: UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 1)] + let underlineAttributedString = NSAttributedString(string: "muderita", attributes: underlineAttribute) + self.commentAuthor.attributedText = underlineAttributedString + + var user = "cmonster " + var userMutableString = NSMutableAttributedString() + userMutableString = NSMutableAttributedString(string: user, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Medium", + size: 13.0)!]) + + var sectionOne = "reblogged " + var sectionOneMutableString = NSMutableAttributedString() + sectionOneMutableString = NSMutableAttributedString(string: sectionOne, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Roman", + size: 13.0)!]) + + var author = "memecat" + var authorMutableString = NSMutableAttributedString() + authorMutableString = NSMutableAttributedString(string: author, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Medium", + size: 13.0)!]) + + var sectionTwo = "'s post on " + var sectionTwoMutableString = NSMutableAttributedString() + sectionTwoMutableString = NSMutableAttributedString(string: sectionTwo, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Roman", + size: 13.0)!]) + + var network = "Tumblr" + var networkMutableString = NSMutableAttributedString() + networkMutableString = NSMutableAttributedString(string: network, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Medium", + size: 13.0)!]) + + + userMutableString.appendAttributedString(sectionOneMutableString) + userMutableString.appendAttributedString(authorMutableString) + userMutableString.appendAttributedString(sectionTwoMutableString) + userMutableString.appendAttributedString(networkMutableString) + postStatus.attributedText = userMutableString + } + +} diff --git a/TumblrFeedDatasource.swift b/TumblrFeedDatasource.swift new file mode 100644 index 0000000..055a871 --- /dev/null +++ b/TumblrFeedDatasource.swift @@ -0,0 +1,55 @@ +// +// TumblrFeedDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TumblrFeedDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + var isProfile : Bool + + init(tableView : UITableView, isProfile : Bool) { + self.isProfile = isProfile + self.items = ["a","a", "a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "TumblrHeaderCell", bundle: nil), forCellReuseIdentifier: "TumblrHeader") + self.tableView.registerNib(UINib(nibName: "TumblrBlogCell", bundle: nil), forCellReuseIdentifier: "TumblrBlog") + self.tableView.registerNib(UINib(nibName: "TumblrPhotoCell", bundle: nil), forCellReuseIdentifier: "TumblrPhoto") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + var currentCell : UITableViewCell! + + // Configure the cell... + if (isProfile && indexPath.row == 0) { + currentCell = tableView.dequeueReusableCellWithIdentifier("TumblrHeader", forIndexPath: indexPath) + } else if (indexPath.row == 1) { + currentCell = tableView.dequeueReusableCellWithIdentifier("TumblrPhoto", forIndexPath: indexPath) + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("TumblrBlog", forIndexPath: indexPath) as! TumblrBlogCellController + if (indexPath.row % 2 != 0) { + cell.removeComments() + } + currentCell = cell + } + + return currentCell + } +} + diff --git a/TumblrFeedTableViewController.swift b/TumblrFeedTableViewController.swift new file mode 100644 index 0000000..fbc0579 --- /dev/null +++ b/TumblrFeedTableViewController.swift @@ -0,0 +1,83 @@ +// +// TumblrFeedTableViewController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TumblrFeedTableViewController: UITableViewController { + + var dataSource : TumblrFeedDatasource! + var isProfile : Bool! + + override func viewDidLoad() { + super.viewDidLoad() + + if (self.restorationIdentifier?.rangeOfString("Feed") != nil) { + self.isProfile = false + } else { + self.isProfile = true + } + + // READ DATASOURCE HERE + self.dataSource = TumblrFeedDatasource(tableView: self.tableView, isProfile: self.isProfile) + self.tableView.dataSource = self.dataSource + + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + self.tableView.allowsSelection = false + + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/TumblrHeaderCell.xib b/TumblrHeaderCell.xib new file mode 100644 index 0000000..2711e8a --- /dev/null +++ b/TumblrHeaderCell.xib @@ -0,0 +1,184 @@ + + + + + + + + + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TumblrHeaderTableViewCell.swift b/TumblrHeaderTableViewCell.swift new file mode 100644 index 0000000..3aa5f01 --- /dev/null +++ b/TumblrHeaderTableViewCell.swift @@ -0,0 +1,31 @@ +// +// TumblrHeaderTableViewCell.swift +// comblie +// +// Created by Cal on 10/23/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TumblrHeaderTableViewCell: UITableViewCell { + + @IBOutlet weak var profileImageBackground: UIView! + @IBOutlet weak var profileImage: UIImageView! + + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + + self.profileImageBackground.layer.cornerRadius = CGFloat(self.profileImageBackground.frame.height/2) + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/TumblrPhotoCell.xib b/TumblrPhotoCell.xib new file mode 100644 index 0000000..2ec3f1f --- /dev/null +++ b/TumblrPhotoCell.xib @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TumblrPhotoCellController.swift b/TumblrPhotoCellController.swift new file mode 100644 index 0000000..e0fdcfb --- /dev/null +++ b/TumblrPhotoCellController.swift @@ -0,0 +1,105 @@ +// +// TumblrPhotoCellController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TumblrPhotoCellController: UITableViewCell { + + + @IBOutlet weak var postBackgroundImage: UIImageView! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + @IBOutlet weak var lineSeparator: UIView! + + var VC : TumblrPhotoModalController! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + //self.postBackgroundImage.image = UIImage(named: "vinebackground") + + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + configureText() + lineHeight.constant = CGFloat(0.5) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + lineSeparator.backgroundColor = UIColor.whiteColor() + // Configure the view for the selected state + } + + override func setHighlighted(highlighted: Bool, animated: Bool) { + lineSeparator.backgroundColor = UIColor.whiteColor() + } + + //MARK: Actions + + @IBAction func enlarge(sender: UIButton) { + VC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("TumblrModal") as! TumblrPhotoModalController + //For keeping the opacity + VC.providesPresentationContextTransitionStyle = true + VC.definesPresentationContext = true + VC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext + self.window?.rootViewController?.presentViewController(VC, animated: true, completion: setModal) + } + + func setModal() { + VC.thumbnailImage.image = self.postBackgroundImage.image + VC.profileImage.image = self.profileImage.image + VC.postText.text = self.postText.text + VC.statusText.attributedText = self.statusText.attributedText + VC.reblogButton.setBackgroundImage(UIImage(named: "tumblrRepost"), forState: .Normal) + VC.likeButton.setBackgroundImage(UIImage(named: "tumblrHeart"), forState: .Normal) + } + + + //MARK: Other + + func configureText() { + var user = "officialbeckham " + var userMutableString = NSMutableAttributedString() + userMutableString = NSMutableAttributedString(string: user, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionOne = "reblogged " + var sectionOneMutableString = NSMutableAttributedString() + sectionOneMutableString = NSMutableAttributedString(string: sectionOne, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var author = "ilovepotato" + var authorMutableString = NSMutableAttributedString() + authorMutableString = NSMutableAttributedString(string: author, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionTwo = "'s post on " + var sectionTwoMutableString = NSMutableAttributedString() + sectionTwoMutableString = NSMutableAttributedString(string: sectionTwo, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var network = "Tumblr" + var networkMutableString = NSMutableAttributedString() + networkMutableString = NSMutableAttributedString(string: network, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + + userMutableString.appendAttributedString(sectionOneMutableString) + userMutableString.appendAttributedString(authorMutableString) + userMutableString.appendAttributedString(sectionTwoMutableString) + userMutableString.appendAttributedString(networkMutableString) + statusText.attributedText = userMutableString + } + +} diff --git a/TumblrPhotoModalController.swift b/TumblrPhotoModalController.swift new file mode 100644 index 0000000..c9f4887 --- /dev/null +++ b/TumblrPhotoModalController.swift @@ -0,0 +1,45 @@ +// +// TumblrPhotoModalController.swift +// comblie +// +// Created by Cal on 11/19/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TumblrPhotoModalController: UIViewController { + + @IBOutlet weak var thumbnailImage: UIImageView! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var likeButton: UIButton! + @IBOutlet weak var reblogButton: UIButton! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + self.lineHeight.constant = CGFloat(0.5) + } + + + // MARK: Actions + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/TumblrProfileTableViewController.swift b/TumblrProfileTableViewController.swift new file mode 100644 index 0000000..2145e3c --- /dev/null +++ b/TumblrProfileTableViewController.swift @@ -0,0 +1,118 @@ +// +// TumblrProfileTableViewController.swift +// comblie +// +// Created by Cal on 10/23/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TumblrProfileTableViewController: UITableViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + self.tableView.registerNib(UINib(nibName: "TumblrBlogCell", bundle: nil), forCellReuseIdentifier: "TumblrBlog") + self.tableView.registerNib(UINib(nibName: "TumblrPhotoCell", bundle: nil), forCellReuseIdentifier: "TumblrPhoto") + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Table view data source + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows + return 3 + } + + override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 44 + } + + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + if (indexPath.row == 0) { + let cell = tableView.dequeueReusableCellWithIdentifier("TumblrHeader", forIndexPath: indexPath) + currentCell = cell + } else if (indexPath.row == 1) { + let cell = tableView.dequeueReusableCellWithIdentifier("TumblrPhoto", forIndexPath: indexPath) + currentCell = cell + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("TumblrBlog", forIndexPath: indexPath) as! TumblrBlogCellController + if (indexPath.row % 2 != 0) { + cell.removeComments() + } + currentCell = cell + } + + // Configure the cell... + + return currentCell + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/TwitterCore.framework/Headers/TWTRAPIErrorCode.h b/TwitterCore.framework/Headers/TWTRAPIErrorCode.h new file mode 100644 index 0000000..c6128fb --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRAPIErrorCode.h @@ -0,0 +1,149 @@ +// +// TWTRAPIErrorCode.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +/** + * The NSError domain of errors surfaced by the Twitter API. + */ +FOUNDATION_EXPORT NSString * const TWTRAPIErrorDomain; + +/** + * Error codes surfaced by the Twitter API. + * @see https://dev.twitter.com/docs/error-codes-responses + */ +typedef NS_ENUM(NSUInteger, TWTRAPIErrorCode) { + /** + * Your call could not be completed as dialed. + */ + TWTRAPIErrorCodeCouldNotAuthenticate = 32, + + /** + * Corresponds with an HTTP 404 - the specified resource was not found. + */ + TWTRAPIErrorCodePageNotExist = 34, + + /** + * Not authorized to use this endpoint. + */ + TWTRAPIErrorCodeNotAuthorizedForEndpoint = 37, + + /** + * Corresponds with an HTTP 403 — the access token being used belongs to a suspended user and they can't complete the action you're trying to take + */ + TWTRAPIErrorCodeAccountSuspended = 64, + + /** + * Corresponds to a HTTP request to a retired v1-era URL. + */ + TWTRAPIErrorCodeAPIVersionRetired = 68, + + /** + * The request limit for this resource has been reached for the current rate limit window. + */ + TWTRAPIErrorCodeRateLimitExceeded = 88, + + /** + * The access token used in the request is incorrect or has expired. Used in API v1.1. + */ + TWTRAPIErrorCodeInvalidOrExpiredToken = 89, + + /** + * Only SSL connections are allowed in the API, you should update your request to a secure connection. See [how to connect using SSL](https://dev.twitter.com/docs/security/using-ssl). + */ + TWTRAPIErrorCodeSSLInvalid = 92, + + /** + * Corresponds with an HTTP 503 - Twitter is temporarily over capacity. + */ + TWTRAPIErrorCodeOverCapacity = 130, + + /** + * Corresponds with an HTTP 500 - An unknown internal error occurred. + */ + TWTRAPIErrorCodeInternalError = 131, + + /** + * Corresponds with a HTTP 401 - it means that your oauth_timestamp is either ahead or behind our acceptable range. + */ + TWTRAPIErrorCodeCouldNotAuthenticateTimestampOutOfRange = 135, + + /** + * You have already favorited this status. + */ + TWTRAPIErrorCodeAlreadyFavorited = 139, + + /** + * Corresponds with HTTP 403 — returned when a user cannot follow another user due to some kind of limit. + */ + TWTRAPIErrorCodeCannotFollowOverLimit = 161, + + /** + * Corresponds with HTTP 403 — returned when a Tweet cannot be viewed by the authenticating user, usually due to the Tweet's author having protected their Tweets. + */ + TWTRAPIErrorCodeNotAuthorizedToSeeStatus = 179, + + /** + * Corresponds with HTTP 403 — returned when a Tweet cannot be posted due to the user having no allowance remaining to post. Despite the text in the error message indicating that this error is only returned when a daily limit is reached, this error will be returned whenever a posting limitation has been reached. Posting allowances have roaming windows of time of unspecified duration. + */ + TWTRAPIErrorCodeOverDailyStatusUpdateLimit = 185, + + /** + * The status text has been Tweeted already by the authenticated account. + */ + TWTRAPIErrorCodeStatusIsDuplicate = 187, + + /** + * Typically sent with 1.1 responses with HTTP code 400. The method requires authentication but it was not presented or was wholly invalid. + */ + TWTRAPIErrorCodeBadAuthenticationData = 215, + + /** + * We constantly monitor and adjust our filters to block spam and malicious activity on the Twitter platform. These systems are tuned in real-time. If you get this response our systems have flagged the Tweet or DM as possibly fitting this profile. If you feel that the Tweet or DM you attempted to create was flagged in error, please report the details around that to us by filing a ticket at https://support.twitter.com/forms/platform + */ + TWTRAPIErrorCodeRequestIsAutomated = 226, + + /** + * Returned as a challenge in xAuth when the user has login verification enabled on their account and needs to be directed to twitter.com to [generate a temporary password](https://twitter.com/settings/applications). + */ + TWTRAPIErrorCodeUserMustVerifyLogin = 231, + + /** + * "Bad guest token." The token has probably expired. Try calling `-[Twitter logInGuestWithCompletion:]` again later. + */ + TWTRAPIErrorCodeBadGuestToken = 239, + + /** + * Corresponds to a HTTP request to a retired URL. + */ + TWTRAPIErrorCodeEndpointRetired = 251, + + /** + * Corresponds with HTTP 403 — returned when the application is restricted from POST, PUT, or DELETE actions. See [How to appeal application suspension and other disciplinary actions](https://support.twitter.com/articles/72585). + */ + TWTRAPIErrorCodeApplicationCannotPerformWriteAction = 261, + + /** + * Corresponds with HTTP 403. The authenticated user account cannot mute itself. + */ + TWTRAPIErrorCodeCannotMuteSelf = 271, + + /** + * Corresponds with HTTP 403. The authenticated user account is not muting the account a call is attempting to unmute. + */ + TWTRAPIErrorCodeCannotMuteSpecifiedUser = 272, + + /** + * You have already retweeted this tweet. + */ + TWTRAPIErrorCodeAlreadyRetweeted = 327, + + /** + * Returned in API v1.1 when a request cannot be served due to the application's rate limit having been exhausted for the resource. See [Rate Limiting in API v1.1](https://dev.twitter.com/docs/rate-limiting/1.1). + */ + TWTRAPIErrorCodeTooManyRequests = 429 +}; + diff --git a/TwitterCore.framework/Headers/TWTRAuthConfig.h b/TwitterCore.framework/Headers/TWTRAuthConfig.h new file mode 100644 index 0000000..8dcdd61 --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRAuthConfig.h @@ -0,0 +1,37 @@ +// +// TWTRAuthConfig.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +/** + * Authentication configuration details. Encapsulates credentials required to authenticate a Twitter application. You can obtain your credentials at https://apps.twitter.com/. + */ +@interface TWTRAuthConfig : NSObject + +/** + * The consumer key of the Twitter application. + */ +@property (nonatomic, copy, readonly) NSString *consumerKey; +/** + * The consumer secret of the Twitter application. + */ +@property (nonatomic, copy, readonly) NSString *consumerSecret; + +/** + * Returns an `TWTRAuthConfig` object initialized by copying the values from the consumer key and consumer secret. + * + * @param consumerKey The consumer key. + * @param consumerSecret The consumer secret. + */ +- (instancetype)initWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; + +/** + * Unavailable. Use `initWithConsumerKey:consumerSecret:` instead. + */ +- (instancetype)init __attribute__((unavailable("Use -initWithConsumerKey:consumerSecret: instead."))); + +@end diff --git a/TwitterCore.framework/Headers/TWTRAuthSession.h b/TwitterCore.framework/Headers/TWTRAuthSession.h new file mode 100644 index 0000000..bfa6a9c --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRAuthSession.h @@ -0,0 +1,24 @@ +// +// TWTRAuthSession.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +/** + * The base session which all sessions must conform to. + */ +@protocol TWTRBaseSession +@end + +/** + * Encapsulates the authorization details of an OAuth Session. + */ +@protocol TWTRAuthSession + +@property (nonatomic, readonly, copy) NSString *authToken; +@property (nonatomic, readonly, copy) NSString *authTokenSecret; +@property (nonatomic, readonly, copy) NSString *userID; + +@end diff --git a/TwitterCore.framework/Headers/TWTRConstants.h b/TwitterCore.framework/Headers/TWTRConstants.h new file mode 100644 index 0000000..8aaea22 --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRConstants.h @@ -0,0 +1,112 @@ +// +// TWTRConstants.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +#pragma mark - Error messages + +/** + * The NSError domain of errors surfaced by the Twitter SDK. + */ +FOUNDATION_EXPORT NSString * const TWTRErrorDomain; + +/** + * Error codes surfaced by the Twitter SDK. + */ +typedef NS_ENUM(NSInteger, TWTRErrorCode) { + /** + * Unknown error. + */ + TWTRErrorCodeUnknown = -1, + /** + * Authentication has not been set up yet. You must call -[Twitter logInWithCompletion:] or -[Twitter logInGuestWithCompletion:] + */ + TWTRErrorCodeNoAuthentication = 0, + /** + * Twitter has not been initialized yet. Call +[Fabric with:@[TwitterKit]] or -[Twitter startWithConsumerKey:consumerSecret:]. + */ + TWTRErrorCodeNotInitialized = 1, + /** + * User has declined to grant permission to information such as their email address. + */ + TWTRErrorCodeUserDeclinedPermission = 2, + /** + * User has granted permission to their email address but no address is associated with their account. + */ + TWTRErrorCodeUserHasNoEmailAddress = 3, + /** + * A resource has been requested by ID, but that ID was not found. + */ + TWTRErrorCodeInvalidResourceID = 4, + /** + * A request has been issued for an invalid URL. + */ + TWTRErrorCodeInvalidURL = 5, + /** + * Type mismatch in parsing JSON from the Twitter API. + */ + TWTRErrorCodeMismatchedJSONType = 6, + /** + * Fail to save to keychain. + */ + TWTRErrorCodeKeychainSerializationFailure = 7, + /** + * Fail to save to disk. + */ + TWTRErrorCodeDiskSerializationError = 8, + /** + * Error authenticating with the webview. + */ + TWTRErrorCodeWebViewError = 9, + /** + * A required parameter is missing. + */ + TWTRErrorCodeMissingParameter = 10 +}; + +/** + * The NSError domain of errors surfaced by the Twitter SDK during the login operation. + */ +FOUNDATION_EXPORT NSString * const TWTRLogInErrorDomain; + +/** + * Error codes surfaced by the Twitter SDK with the `TWTRLogInErrorDomain` error domain. + */ +typedef NS_ENUM(NSInteger, TWTRLogInErrorCode) { + /** + * Unknown error. + */ + TWTRLogInErrorCodeUnknown = -1, + /** + * User denied login. + */ + TWTRLogInErrorCodeDenied = 0, + /** + * User canceled login. + */ + TWTRLogInErrorCodeCanceled = 1, + /** + * No Twitter account found. + */ + TWTRLogInErrorCodeNoAccounts = 2, + /** + * Reverse auth with linked account failed. + */ + TWTRLogInErrorCodeReverseAuthFailed = 3, + /** + * Refreshing session tokens failed. + */ + TWTRLogInErrorCodeCannotRefreshSession = 4, + /** + * No such session or session is not tracked + * in the associated session store. + */ + TWTRLogInErrorCodeSessionNotFound = 5, + /** + * The login request failed. + */ + TWTRLogInErrorCodeFailed = 6 +}; diff --git a/TwitterCore.framework/Headers/TWTRCoreOAuthSigning.h b/TwitterCore.framework/Headers/TWTRCoreOAuthSigning.h new file mode 100644 index 0000000..e4ae5dd --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRCoreOAuthSigning.h @@ -0,0 +1,46 @@ +// +// TWTRCoreOAuthSigning.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +FOUNDATION_EXPORT NSString * const TWTROAuthEchoRequestURLStringKey; +FOUNDATION_EXPORT NSString * const TWTROAuthEchoAuthorizationHeaderKey; + +@protocol TWTRCoreOAuthSigning + +/** + * @name OAuth Echo + */ + +/** + * OAuth Echo is a means to securely delegate OAuth authorization to a third party while interacting with an API. + * For example, you may wish to verify a user's credentials from your app's server (the third party) rather than your app. + * This method provides you with the OAuth signature to add to the third party's request to `URLString`, as well as the formed + * URL with the query string to send that request to. + * This is equivalent to calling `-URLRequestWithMethod:URL:parameters:error:` and getting the URL and the `Authorization` HTTP header out of the request. + * + * @param method Request method, GET, POST, PUT, DELETE, etc. + * @param URLString The full URL of the Twitter endpoint you plan to send a request to. E.g. https://api.twitter.com/1.1/account/verify_credentials.json + * @param parameters Request parameters. + * @param error Error in the `TWTRErrorDomain` domain. The code will be `TWTRErrorCodeInvalidURL` if the `URLString`'s host is not api.twitter.com + * + * @return `nil` if there's an error or a missing required parameter, or a dictionary with the fully formed request URL under `TWTROAuthEchoRequestURLStringKey` (`NSString`), and the `Authorization` header in `TWTROAuthEchoAuthorizationHeaderKey` (`NSString`), to be used to sign the request. + * + * @see More information about OAuth Echo: https://dev.twitter.com/oauth/echo + */ +- (NSDictionary *)OAuthEchoHeadersForRequestMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters error:(NSError **)error __attribute__((nonnull(1, 2))); + +/** + * This method provides you with the OAuth signature, as well as the formed URL with the query string, to send a request to `verify_credentials`. + * + * @return A dictionary with the fully formed Request URL under `TWTROAuthEchoRequestURLStringKey` (`NSString`), and the `Authorization` header in `TWTROAuthEchoAuthorizationHeaderKey` (`NSString`), to be used to sign the request. + * + * @see More information about OAuth Echo: https://dev.twitter.com/oauth/echo + * @see More information about Verify Credentials: https://dev.twitter.com/rest/reference/get/account/verify_credentials + */ +- (NSDictionary *)OAuthEchoHeadersToVerifyCredentials; + +@end diff --git a/TwitterCore.framework/Headers/TWTRDefines.h b/TwitterCore.framework/Headers/TWTRDefines.h new file mode 100644 index 0000000..1c7968c --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRDefines.h @@ -0,0 +1,33 @@ +// +// TWTRDefines.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#pragma once + +#if __has_feature(nullability) + #define twtr_nullable nullable + #define twtr_nonnull nonnull + #define twtr_null_unspecified null_unspecified + #define twtr_null_resettable null_resettable + #define __twtr_nullable __nullable + #define __twtr_nonnull __nonnull + #define __twtr_null_unspecified __null_unspecified +#else + #define twtr_nullable + #define twtr_nonnull + #define twtr_null_unspecified + #define twtr_null_resettable + #define __twtr_nullable + #define __twtr_nonnull + #define __twtr_null_unspecified +#endif + +#ifndef NS_ASSUME_NONNULL_BEGIN + #define NS_ASSUME_NONNULL_BEGIN +#endif + +#ifndef NS_ASSUME_NONNULL_END + #define NS_ASSUME_NONNULL_END +#endif diff --git a/TwitterCore.framework/Headers/TWTRGuestSession.h b/TwitterCore.framework/Headers/TWTRGuestSession.h new file mode 100644 index 0000000..d1a3ebf --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRGuestSession.h @@ -0,0 +1,60 @@ +// +// TWTRGuestSession.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "TWTRAuthSession.h" + +@class TWTRGuestSession; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Completion block called when guest login succeeds or fails. + * + * @param guestSession A `TWTRGuestSession` containing the OAuth tokens or nil. + * @param error Error that will be non nil if the authentication request failed. + */ +typedef void (^TWTRGuestLogInCompletion)(TWTRGuestSession * __twtr_nullable guestSession, NSError * __twtr_nullable error); + +/** + * `TWTRGuestSession` represents a guest session authenticated with the Twitter API. See `TWTRSession` for user sessions. + */ +@interface TWTRGuestSession : NSObject + +/** + * The bearer access token for guest auth. + */ +@property (nonatomic, copy, readonly) NSString *accessToken; + +/** + * The guest access token. + */ +@property (nonatomic, copy, readonly) NSString *guestToken; + +/** + * Returns an `TWTRGuestSession` object initialized by copying the values from the dictionary or nil if the dictionary is missing. + * + * @param sessionDictionary (required) The dictionary received after successfull authentication from Twitter guest-only authentication. + */ +- (instancetype)initWithSessionDictionary:(NSDictionary *)sessionDictionary; + +/** + * Returns a `TWTRGuestSession` object + * + * @param accessToken the access token + * @param guestToken the guest access token + */ +- (instancetype)initWithAccessToken:(NSString *)accessToken guestToken:(twtr_nullable NSString *)guestToken NS_DESIGNATED_INITIALIZER; + +/** + * Unavailable. Use `-initWithSessionDictionary:` instead. + */ +- (instancetype)init __attribute__((unavailable("Use -initWithSessionDictionary: or initWithAccessToken:guestToken: instead."))); + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterCore.framework/Headers/TWTRSession.h b/TwitterCore.framework/Headers/TWTRSession.h new file mode 100644 index 0000000..e3d6423 --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRSession.h @@ -0,0 +1,71 @@ +// +// TWTRSession.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import "TWTRAuthConfig.h" +#import "TWTRAuthSession.h" +#import "TWTRGuestSession.h" + +@class TWTRSession; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Completion block called when user login succeeds or fails. + * + * @param session Contains the OAuth tokens and minimal information associated with the logged in user or nil. + * @param error Error that will be non nil if the authentication request failed. + */ +typedef void (^TWTRLogInCompletion)(TWTRSession * __twtr_nullable session, NSError * __twtr_nullable error); + +/** + * TWTRSession represents a user's session authenticated with the Twitter API. + */ +@interface TWTRSession : NSObject + +/** + * The authorization token. + */ +@property (nonatomic, copy, readonly) NSString *authToken; +/** + * The authorization token secret. + */ +@property (nonatomic, copy, readonly) NSString *authTokenSecret; +/** + * The username associated with the access token. + */ +@property (nonatomic, copy, readonly) NSString *userName; +/** + * The user ID associated with the access token. + */ +@property (nonatomic, copy, readonly) NSString *userID; + +/** + * Returns an `TWTRSession` object initialized by copying the values from the dictionary or nil if the dictionary is missing. + * + * @param sessionDictionary (required) The dictionary received after successfull authentication from Twitter OAuth. + */ +- (instancetype)initWithSessionDictionary:(NSDictionary *)sessionDictionary; + +/** + * Returns an `TWTRSession` object initialized by copying the given tokens and user info. + * + * @param authToken (required) The authorization token for the session + * @param authTokenSecret (required) The authorization token secret for the session + * @param userName (required) The username for the user associated with the session. + * @param userID (required) The unique ID for the user associated with the session. + * + * @return A `TWTRSession` object initialized with the provided parameters. + */ +- (instancetype)initWithAuthToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret userName:(NSString *)userName userID:(NSString *)userID NS_DESIGNATED_INITIALIZER; + +/** + * Unavailable. Use -initWithSessionDictionary: instead. + */ +- (instancetype)init __attribute__((unavailable("Use -initWithSessionDictionary: instead."))); + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterCore.framework/Headers/TWTRSessionStore.h b/TwitterCore.framework/Headers/TWTRSessionStore.h new file mode 100644 index 0000000..6de44b5 --- /dev/null +++ b/TwitterCore.framework/Headers/TWTRSessionStore.h @@ -0,0 +1,214 @@ +// +// TWTRSessionStore.h +// TwitterCore +// +// Copyright (c) 2015 Twitter Inc. All rights reserved. +// + +@class TWTRAuthConfig; +@class TWTRGuestSession; +@class TWTRSession; +@protocol TWTRAuthSession; +@protocol TWTRAPIServiceConfig; +@protocol TWTRErrorLogger; + +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - TWTRSessionRefreshingStore Protocol + +/** + * Completion block called when a session refresh succeeds or fails. + * + * @param refreshedSession The refreshed session + * @param error Error that will be non nil if the refresh request failed + */ +typedef void (^TWTRSessionStoreRefreshCompletion)(id __twtr_nullable refreshedSession, NSError * __twtr_nullable error); + +/** + * Protocol for session stores that can refresh expired sessions. + */ +@protocol TWTRSessionRefreshingStore + +/** + * Refresh an expired session. + * + * @param sessionClass The class of the session + * @param sessionID ID of the session wherever applicable e.g. `userID` if it's a user session. + * @param completion The completion block to call when the refresh request succeeds or fails. + */ +- (void)refreshSessionClass:(Class)sessionClass sessionID:(twtr_nullable NSString *)sessionID completion:(TWTRSessionStoreRefreshCompletion)completion; + +/** + * Determines whether the given session has expired. + * + * @param session The session to check for expiration + * @param response API request response to check for expiration + * + * @return Whether the session has expired. + */ +- (BOOL)isExpiredSession:(id)session response:(NSHTTPURLResponse *)response; + +/** + * Determines whether the given session has expired based on a given error. + * + * @param session The session to check for expiration + * @param error API request error to check for expiration + * + * @return Whether the session has expired. + */ +- (BOOL)isExpiredSession:(id)session error:(NSError *)error; + +@end + +#pragma mark - TWTRUserSessionStore Protocol + +/** + * Completion block called when a user session saved to the session store or fails. + * + * @param session The saved session + * @param error Error that will be non nil if the save request fails. + */ +typedef void (^TWTRSessionStoreSaveCompletion)(id __twtr_nullable session, NSError * __twtr_nullable error); + +/** + * Completion block called when fetching all stored user sessions completes or fails. + * + * @param sessions All stored user sessions or empty array if there are no user sessions found. + */ +typedef void (^TWTRSessionStoreBatchFetchCompletion)(NSArray *sessions); + +/** + * Completion block to call when the session is deleted or fails. + * + * @param session The deleted session or nil if none was found for the user. + */ +typedef void (^TWTRSessionStoreDeleteCompletion)(id __twtr_nullable session); + +/** + * Protocol for session store that manages user sessions. + */ +@protocol TWTRUserSessionStore + +/** + * Saves the existing session to the store after validations. + * + * @param session The user session to save + * @param completion Completion block to call when the save request succeeds or fails + */ +- (void)saveSession:(id)session completion:(TWTRSessionStoreSaveCompletion)completion; + +/** + * Fetches the user session for for the given auth tokens and saves it to the store after validations. + * + * @param authToken The existing authToken to use for authentication. + * @param authTokenSecret The existing authTokenSecret to use for authentication. + * @param completion Completion block to call when the save request succeeds or fails + */ +- (void)saveSessionWithAuthToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret completion:(TWTRSessionStoreSaveCompletion)completion; + +/** + * Checks to see if the user is logged in and has a saved session. + * + * @param userID The user ID to fetch session for. + */ +- (twtr_nullable id)sessionForUserID:(NSString *)userID; + +/** + * Retrieve all logged in user sessions in ascending order of last saved date + * + * @note This is a blocking call. + */ +- (NSArray *)existingUserSessions; + +/** + * Retrieves the last logged in user session. + * + * @return The last logged in user session. + */ +- (twtr_nullable id)session; + +/** + * Deletes the local Twitter user session from this app. This will not remove the system Twitter account nor make a network request to invalidate the session. + * + * @param userID ID of the user to log out + */ +- (void)logOutUserID:(NSString *)userID; + +@end + +#pragma mark - TWTRGuestSessionStore Protocol + +/** + * Completion block called when retrieving a guest session succeeds or fails. + * + * @param guestSession The retrieved guest session + * @param error Error that will be non nil if the save request fails. + */ +typedef void (^TWTRSessionGuestLogInCompletion)(TWTRGuestSession * __twtr_nullable guestSession, NSError * __twtr_nullable error); + +/** + * Protocol for session stores that can manage guest sessions. + */ +@protocol TWTRGuestSessionStore + +/** + * Log in as a guest user and return the guest session. This can be used when the user is not a Twitter user. + * + * @param completion Completion block to call when the authentication succeeds or fails. + * + * @warning This method assumes your application, as indicated by the `consumerKey` and `consumerSecret` in the `authConfig`, has been whitelisted for guest authentication. + */ +- (void)fetchGuestSessionWithCompletion:(TWTRSessionGuestLogInCompletion)completion; + +@end + +#pragma mark - Composite TWTRSessionStore Protocol + +/** + * Convenience composite protocol of a store that handles user, guest, and refreshable sessions. + */ +@protocol TWTRSessionStore + +/** + * Returns the store's auth config. + */ +@property (nonatomic, readonly) TWTRAuthConfig *authConfig; + +@end + + +#pragma mark - Concrete Session Store Class + +/** + * Concrete implementation of . This session store supports fetching and storage of + * user and guest sessions. In addition, the session store also supports refreshing of such sessions when they expire. + * + * @warning Instances of the session manager at the same path are not synchronized. The session store + * will simply choose the latest version in the case of conflicts. + */ +@interface TWTRSessionStore : NSObject + +- (instancetype)init __unavailable; + +/** + * Provides a mechanism for reloading the session store. This method will force the session store + * to find any sessions that may have been saved by another session store or application that is + * using the same keychain access groups. + * + * Most applications will not need to call this method. You may need to call this method if you are + * using multiple stores within your application and you need to synchronize when one writes to the + * store. The more likely case for needing to call this method is if you are sharing credentials + * between applications. In this situation you will want to call this method when the application + * comes back to the foreground. + * + * This method does not need to be called when the store is created because this process happens + * by default at time of instantiation. + * + * You should avoid calling this method if you do not have a specific reason to do so, like the reasons + * mentioned above as this method does cause disk I/O and multiple calls can cause performance problems. + */ +- (void)reloadSessionStore; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterCore.framework/Headers/TwitterCore.h b/TwitterCore.framework/Headers/TwitterCore.h new file mode 100644 index 0000000..46bab41 --- /dev/null +++ b/TwitterCore.framework/Headers/TwitterCore.h @@ -0,0 +1,29 @@ +// +// TwitterCore.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#if __has_feature(modules) +@import Accounts; +@import CoreData; +@import Foundation; +@import Social; +@import UIKit; +#else +#import +#import +#import +#import +#import +#endif + +#import "TWTRAPIErrorCode.h" +#import "TWTRAuthConfig.h" +#import "TWTRAuthSession.h" +#import "TWTRConstants.h" +#import "TWTRCoreOAuthSigning.h" +#import "TWTRDefines.h" +#import "TWTRGuestSession.h" +#import "TWTRSession.h" +#import "TWTRSessionStore.h" diff --git a/TwitterCore.framework/Info.plist b/TwitterCore.framework/Info.plist new file mode 100644 index 0000000..be4b54f --- /dev/null +++ b/TwitterCore.framework/Info.plist @@ -0,0 +1,53 @@ + + + + + BuildMachineOSBuild + 14F27 + CFBundleDevelopmentRegion + English + CFBundleGetInfoString + TwitterCore Framework + CFBundleIdentifier + com.twittercore.sdk.ios + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + TwitterCore + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.12.0 + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 1.12.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 13A340 + DTPlatformName + iphoneos + DTPlatformVersion + 9.0 + DTSDKBuild + 13A340 + DTSDKName + iphoneos9.0 + DTXcode + 0700 + DTXcodeBuild + 7A220 + MinimumOSVersion + 7.0 + NSHumanReadableCopyright + Copyright 2015 Twitter Inc. + UIDeviceFamily + + 1 + 2 + + + diff --git a/TwitterCore.framework/Modules/module.modulemap b/TwitterCore.framework/Modules/module.modulemap new file mode 100644 index 0000000..bee81d2 --- /dev/null +++ b/TwitterCore.framework/Modules/module.modulemap @@ -0,0 +1,21 @@ +framework module TwitterCore { + umbrella header "TwitterCore.h" + + export * + module * { export * } + + link framework "Accounts" + link framework "CoreData" + link framework "Social" + + header "TwitterCore.h" + header "TWTRAPIErrorCode.h" + header "TWTRAuthConfig.h" + header "TWTRAuthSession.h" + header "TWTRConstants.h" + header "TWTRCoreOAuthSigning.h" + header "TWTRDefines.h" + header "TWTRGuestSession.h" + header "TWTRSession.h" + header "TWTRSessionStore.h" +} diff --git a/TwitterCore.framework/TwitterCore b/TwitterCore.framework/TwitterCore new file mode 100755 index 0000000..63c26e0 Binary files /dev/null and b/TwitterCore.framework/TwitterCore differ diff --git a/TwitterFeedDatasource.swift b/TwitterFeedDatasource.swift new file mode 100644 index 0000000..21f28f5 --- /dev/null +++ b/TwitterFeedDatasource.swift @@ -0,0 +1,59 @@ +// +// TwitterFeedDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TwitterFeedDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + var isProfile : Bool + var parent : UITableViewController + + init(parent: UITableViewController, tableView : UITableView, isProfile: Bool) { + self.parent = parent + self.isProfile = isProfile + self.items = ["a","a", "a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "TwitterHeaderCell", bundle: nil), forCellReuseIdentifier: "TwitterHeader") + self.tableView.registerNib(UINib(nibName: "TwitterTweetCell", bundle: nil), forCellReuseIdentifier: "TwitterTweet") + self.tableView.registerNib(UINib(nibName: "TwitterPhotoCell", bundle: nil), forCellReuseIdentifier: "TwitterPhoto") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + + // Configure the cell... + if (isProfile && indexPath.row == 0) { + currentCell = tableView.dequeueReusableCellWithIdentifier("TwitterHeader", forIndexPath: indexPath) + } else if (indexPath.row == 1) { + let cell = tableView.dequeueReusableCellWithIdentifier("TwitterPhoto", forIndexPath: indexPath) as! TwitterPhotoCellController + cell.parent = self.parent + currentCell = cell + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("TwitterTweet", forIndexPath: indexPath) as! TwitterTweetCellController + //cell.retweetTextHeight.constant = CGFloat(0) + //cell.val = 2 + //cell.parent = self.superclass + //cell.row = indexPath + cell.parent = self.parent + currentCell = cell + } + + return currentCell + } +} diff --git a/TwitterFeedTableViewController.swift b/TwitterFeedTableViewController.swift new file mode 100644 index 0000000..2242485 --- /dev/null +++ b/TwitterFeedTableViewController.swift @@ -0,0 +1,82 @@ +// +// TwitterFeedTableViewController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TwitterFeedTableViewController: UITableViewController { + + var dataSource : TwitterFeedDatasource! + var isProfile : Bool! + + override func viewDidLoad() { + super.viewDidLoad() + + if (self.restorationIdentifier?.rangeOfString("Feed") != nil) { + self.isProfile = false + } else { + self.isProfile = true + } + + self.dataSource = TwitterFeedDatasource(parent: self, tableView: self.tableView, isProfile: self.isProfile) + self.tableView.dataSource = self.dataSource + + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension + self.tableView.estimatedRowHeight = 44.0 + self.tableView.allowsSelection = false + + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/TwitterHeaderCell.xib b/TwitterHeaderCell.xib new file mode 100644 index 0000000..9b9e85c --- /dev/null +++ b/TwitterHeaderCell.xib @@ -0,0 +1,217 @@ + + + + + + + + + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TwitterHeaderTableViewCell.swift b/TwitterHeaderTableViewCell.swift new file mode 100644 index 0000000..93e61a3 --- /dev/null +++ b/TwitterHeaderTableViewCell.swift @@ -0,0 +1,30 @@ +// +// TwitterHeaderTableViewCell.swift +// comblie +// +// Created by Cal on 10/22/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TwitterHeaderTableViewCell: UITableViewCell { + + @IBOutlet weak var profileImageBackground: UIView! + @IBOutlet weak var profileImage: UIImageView! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + + self.profileImageBackground.layer.cornerRadius = CGFloat(self.profileImageBackground.frame.height/2) + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/TwitterKit.framework/Headers/TWTRAPIClient.h b/TwitterKit.framework/Headers/TWTRAPIClient.h new file mode 100644 index 0000000..ffe83a1 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRAPIClient.h @@ -0,0 +1,156 @@ +// +// TWTRAPIClient.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +@class TWTRUser; +@class TWTRTweet; +@class TWTRAuthConfig; +@class TWTRGuestSession; +@protocol TWTRAuthSession; +@protocol TWTRSessionStore; + +NS_ASSUME_NONNULL_BEGIN + +FOUNDATION_EXPORT NSString * const TWTRTweetsNotLoadedKey; + +/** + * @name Completion Block Types + */ + +/** + * Completion block called when the load user request succeeds or fails. + * + * @param user The Twitter User. + * @param error Error that will be set if the API request failed. + */ +typedef void (^TWTRLoadUserCompletion)(TWTRUser * __twtr_nullable user, NSError * __twtr_nullable error); + +/** + * Completion block called when the load Tweet request succeeds or fails. + * + * @param tweet The Twitter Tweet. + * @param error Error that will be set if the API request failed. + */ +typedef void (^TWTRLoadTweetCompletion)(TWTRTweet * __twtr_nullable tweet, NSError * __twtr_nullable error); + +/** + * Completion block called when the load Tweets request succeeds or fails. + * + * @param tweets Tweets that were successfully retrieved. + * @param error Error that will be set if the API request failed. + */ +typedef void (^TWTRLoadTweetsCompletion)(NSArray * __twtr_nullable tweets, NSError * __twtr_nullable error); + +/** + * Completion block called when the network request succeeds or fails. + * + * @param response Metadata associated with the response to a URL load request. + * @param data Content data of the response. + * @param connectionError Error object describing the network error that occurred. + */ +typedef void (^TWTRNetworkCompletion)(NSURLResponse * __twtr_nullable response, NSData * __twtr_nullable data, NSError * __twtr_nullable connectionError); + +/** + * Completion block called when a JSON request to the Twitter API succeeds or fails. + * + * @param response Metadata associated with the response to a URL load request. + * @param responseObject Content data of the response. + * @param error Error object describing the network error that occurred. + */ +typedef void (^TWTRJSONRequestCompletion)(NSURLResponse * __twtr_nullable response, id __twtr_nullable responseObject, NSError * __twtr_nullable error); + +/** + * Completion block called when a Tweet action (favorite/retweet) is performed. + * + * @param response Metadata associated with the response to a URL load request. + * @param tweet The Tweet object representing the new state of this Tweet from + * the perspective of the currently-logged in user. + * @param error Error object describing the error that occurred. This will be either a + * network error or an NSError with an errorCode corresponding to + * TWTRAPIErrorCodeAlreadyFavorited or TWTRAPIErrorCodeAlreadyRetweeted + * for an attempted action that has already been taken from the servers + * point of view for this logged-in user. + */ +typedef void (^TWTRTweetActionCompletion)(TWTRTweet * __twtr_nullable tweet, NSError * __twtr_nullable error); + +/** + * Client for consuming the Twitter REST API. Provides methods for common API requests, as well as the ability to create and send custom requests. + */ +@interface TWTRAPIClient : NSObject + +/** + * The Twitter user ID this client is making API requests on behalf of or + * nil if it is a guest user. + */ +@property (nonatomic, copy, readonly, twtr_nullable) NSString *userID; + + +/** + * Constructs a `TWTRAPIClient` object to perform authenticated API requests with user authentication. + * + * @param userID (optional) ID of the user to make requests on behalf of. If the ID is nil requests will be made using guest authentication. + * + * @return Fully initialized API client to make authenticated requests against the Twitter REST API. + */ +- (instancetype)initWithUserID:(twtr_nullable NSString *)userID; + +/** + * @name Making Requests + */ + +/** + * Returns a signed URL request. + * + * @param method Request method, GET, POST, PUT, DELETE, etc. + * @param URL Request URL. This is the full Twitter API URL. E.g. https://api.twitter.com/1.1/statuses/user_timeline.json + * @param parameters Request parameters. + * @param error Error that will be set if there was an error signing the request. + * + * @note If the request is not sent with the -[TWTRAPIClient sendTwitterRequest:completion:] method it is the developers responsibility to ensure that there is a valid guest session before this method is called. + */ +- (NSURLRequest *)URLRequestWithMethod:(NSString *)method URL:(NSString *)URLString parameters:(twtr_nullable NSDictionary *)parameters error:(NSError **)error; + +/** + * Sends a Twitter request. + * + * @param request The request that will be sent asynchronously. + * @param completion Completion block to be called on response. Called on main queue. + */ +- (void)sendTwitterRequest:(NSURLRequest *)request completion:(TWTRNetworkCompletion)completion; + +/** + * @name Common API Actions + */ + +/** + * Loads a Twitter User. + * + * @param userID (required) The Twitter user ID of the desired user. + * @param completion Completion block to be called on response. Called on main queue. + */ +- (void)loadUserWithID:(NSString *)userID completion:(TWTRLoadUserCompletion)completion; + +/** + * Loads a single Tweet from the network or cache. + * + * @param tweetID (required) The ID of the desired Tweet. + * @param completion Completion bock to be called on response. Called on main queue. + */ +- (void)loadTweetWithID:(NSString *)tweetID completion:(TWTRLoadTweetCompletion)completion; + +/** + * Loads a series of Tweets in a batch. The completion block will be passed an array of zero or more + * Tweets that loaded successfully. If some Tweets fail to load the array will contain less Tweets than + * number of requested IDs. If any Tweets fail to load, the IDs of the Tweets that did not load will + * be provided in the userInfo dictionary property of the error parameter under `TWTRTweetsNotLoadedKey`. + * + * @param tweetIDStrings (required) An array of Tweet IDs. + * @param completion Completion block to be called on response. Called on main queue. + */ +- (void)loadTweetsWithIDs:(NSArray *)tweetIDStrings completion:(TWTRLoadTweetsCompletion)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRCardConfiguration.h b/TwitterKit.framework/Headers/TWTRCardConfiguration.h new file mode 100644 index 0000000..a19ac32 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRCardConfiguration.h @@ -0,0 +1,72 @@ +// +// TWTRCardConfiguration.h +// TwitterKit +// +// Copyright © 2015 Twitter. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Enum of the possible Twitter Card types. + */ +typedef NS_ENUM(NSUInteger, TWTRCardType){ + /** + * A Twitter App Card that includes a promotional image. + */ + TWTRCardTypePromoImageApp, + + /** + * An unknown or unsupported Twitter Card type. + */ + TWTRCardTypeUnknown +}; + +/** + * `TWTRCardConfiguration` is the representation of configurations for constructing a Twitter Card. + * + * @see https://dev.twitter.com/cards/overview + */ +@interface TWTRCardConfiguration : NSObject + +/** + * Type of Twitter Card configuration. + */ +@property (nonatomic, readonly) TWTRCardType cardType; + +/** + * Title of the Card. + */ +@property (nonatomic, readonly, copy, twtr_nullable) NSString *cardTitle; + +/** + * Description of the Card. + */ +@property (nonatomic, readonly, copy, twtr_nullable) NSString *cardDescription; + +/** + * Unique image representing the content. Size of the image cannot exceed 1MB. + * The minimum dimensions can vary depending on the Card type. See https://dev.twitter.com/cards/types + * for more detailed requirements. + */ +@property (nonatomic, readonly, twtr_nullable) UIImage *image; + +- (instancetype)init NS_UNAVAILABLE; + +/** + * Creates a new instance of configuration for a Twitter App Promo Card. + * + * @param promoImage (Required) Unique image of the user generated content to be promoted. + * @param iPhoneAppID (Optional) String representation of your app ID in the App Store (.i.e. "307234931"). Either the `iPhoneAppID` or `iPadAppID` has to be provided. + * @param iPadAppID (Optional) String representation of your app ID in the App Store (.i.e. "307234931"). Either the `iPhoneAppID` or `iPadAppID` has to be provided. + * @param googlePlayAppID (Optional) String representation of your app ID in Google Play (.i.e. "com.android.app") + * + * @return A new instance of `TWTRCardConfiguration` for a Twitter App Card. + */ ++ (TWTRCardConfiguration *)appCardConfigurationWithPromoImage:(UIImage *)promoImage iPhoneAppID:(twtr_nullable NSString *)iPhoneAppID iPadAppID:(twtr_nullable NSString *)iPadAppID googlePlayAppID:(twtr_nullable NSString *)googlePlayAppID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRCollectionTimelineDataSource.h b/TwitterKit.framework/Headers/TWTRCollectionTimelineDataSource.h new file mode 100644 index 0000000..85f7b65 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRCollectionTimelineDataSource.h @@ -0,0 +1,43 @@ +// +// TWTRCollectionTimelineDataSource.h +// TwitterKit +// +// Created by Steven Hepting on 2/10/15. +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "TWTRTimelineDataSource.h" + +@class TWTRAPIClient; + +@interface TWTRCollectionTimelineDataSource : NSObject + +/** + * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. + */ +@property (nonatomic, assign, readonly) NSInteger maxTweetsPerRequest; + +/** + * Convenience initializer. + * + * @param collectionID (required) The ID of this collection. For example, the ID of this collection: https://twitter.com/TwitterMusic/timelines/393773266801659904 is @"393773266801659904" + * + * @return An instance of TWTRCollectionTimelineDataSource or nil if any of the required parameters is missing. + */ +- (instancetype)initWithCollectionID:(NSString *)collectionID APIClient:(TWTRAPIClient *)client __attribute__((nonnull)); + +/** + * Designated initializer setting all supported values for Collection Timeline Data Source. + * + * @param collectionID (required) The Collection ID value. e.g. @"393773266801659904" + * @param apiClient (required) The API client to use for all network requests. + * @param maxTweetsPerRequest (optional) Number of Tweets to request per batch. A value of 0 uses the server default. + * + * @return An instance of TWTRCollectionTimelineDataSource or nil if any of the required parameters are missing. + */ +- (instancetype)initWithCollectionID:(NSString *)collectionID APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest __attribute__((nonnull)) NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __unavailable; + +@end diff --git a/TwitterKit.framework/Headers/TWTRComposer.h b/TwitterKit.framework/Headers/TWTRComposer.h new file mode 100644 index 0000000..f80ff55 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRComposer.h @@ -0,0 +1,86 @@ +// +// TWTRComposer.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Possible values for the result parameter of the completionHandler property. + */ +typedef NS_ENUM(NSInteger, TWTRComposerResult) { + /** + * The composer is dismissed without sending the Tweet (i.e. the user selects Cancel, or the account is unavailable). + */ + TWTRComposerResultCancelled, + + /** + * The composer is dismissed and the message is being sent in the background, after the user selects Done. + */ + TWTRComposerResultDone +}; + +/** + * Completion block called when the user finishes composing a Tweet. + */ +typedef void (^TWTRComposerCompletion)(TWTRComposerResult result); + +/** + * The TWTRComposer class presents a view to the user to compose a Tweet. + */ +@interface TWTRComposer : NSObject + +/** + * Sets the initial text for the Tweet composition prior to showing it. + * + * @param text The text to tweet. + * + * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). + */ +- (BOOL)setText:(twtr_nullable NSString *)text; + +/** + * Sets an image attachment. + * + * @param image The image to attach. + * + * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). + */ +- (BOOL)setImage:(twtr_nullable UIImage *)image; + +/** + * Adds a URL to the contents of the Tweet message. + * + * @param url The URL. + * + * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). + */ +- (BOOL)setURL:(twtr_nullable NSURL *)url; + +/** + * Presents the composer, with an optional completion handler from the specified view controller. + * @param fromController The controller in which to present the composer from. + * @param completion completion The completion handler, which has a single parameter indicating whether the user finished or cancelled the Tweet composition. + */ +- (void)showFromViewController:(UIViewController *)fromController completion:(TWTRComposerCompletion)completion; + +@end + +@interface TWTRComposer (TWTRDeprecated) + +/** + * Presents the composer, with an optional completion handler. + * + * @param completion The completion handler, which has a single parameter indicating whether the user finished or cancelled the Tweet composition. + * + * @warning This method is deprecated. Use `-showFromViewController:completion:` instead. + */ +- (void)showWithCompletion:(TWTRComposerCompletion)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRComposerTheme.h b/TwitterKit.framework/Headers/TWTRComposerTheme.h new file mode 100644 index 0000000..c4d52fd --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRComposerTheme.h @@ -0,0 +1,22 @@ +// +// TWTRComposerTheme.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +typedef NS_ENUM(NSInteger, TWTRComposerThemeType) { + TWTRComposerThemeTypeLight, + TWTRComposerThemeTypeDark, +}; + +@interface TWTRComposerTheme : NSObject + +/** + * Returns an instance of the theme object with the given type. + */ +- (instancetype)initWithThemeType:(TWTRComposerThemeType)type NS_DESIGNATED_INITIALIZER; + +@end diff --git a/TwitterKit.framework/Headers/TWTRComposerViewController.h b/TwitterKit.framework/Headers/TWTRComposerViewController.h new file mode 100644 index 0000000..59fc6cf --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRComposerViewController.h @@ -0,0 +1,69 @@ +// +// TWTRComposerViewController.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +@class TWTRCardConfiguration; +@class TWTRComposerTheme; +@class TWTRTweet; +@protocol TWTRComposerViewControllerDelegate; + +NS_ASSUME_NONNULL_BEGIN + +@interface TWTRComposerViewController : UIViewController + +@property (nonatomic, weak, twtr_nullable) id delegate; + +/** + * A theme to use for the composer. If nil will default to the light theme. + */ +@property (nonatomic, twtr_null_resettable) TWTRComposerTheme *theme; + +/** + * Use initWithUserID: instead. + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + * Returns a fully initialized version of the composer. + * + * @param userID The ID of the user that is tweeting + */ +- (instancetype)initWithUserID:(NSString *)userID; + +/** + * Returns a fully initialized version of the composer which will tweet with a card. + * + * @param userID The ID of the user that is tweeting the card + * @param cardConfig The card configuration that will be associated with this Tweet + */ +- (instancetype)initWithUserID:(NSString *)userID cardConfiguration:(twtr_nullable TWTRCardConfiguration *)cardConfig; + +@end + +@protocol TWTRComposerViewControllerDelegate + +@optional +/** + * Called when the user taps the cancel button. This method will be called after the view controller is dismissed. + */ +- (void)composerDidCancel:(TWTRComposerViewController *)controller; + +/** + * Called when the user successfully sends a Tweet. The resulting Tweet object is returned. + * This method is called after the view controller is dimsissed. + */ +- (void)composerDidSucceed:(TWTRComposerViewController *)controller withTweet:(TWTRTweet *)tweet; + +/** + * This method is called if the composer is not able to send the Tweet. + * The view controller will not be dismissed automatically if this method is called. + */ +- (void)composerDidFail:(TWTRComposerViewController *)controller withError:(NSError *)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRListTimelineDataSource.h b/TwitterKit.framework/Headers/TWTRListTimelineDataSource.h new file mode 100644 index 0000000..fb87808 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRListTimelineDataSource.h @@ -0,0 +1,88 @@ +// +// TWTRListTimelineDataSource.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "TWTRTimelineDataSource.h" + +@class TWTRAPIClient; + +NS_ASSUME_NONNULL_BEGIN + +/** + * Data source representing a list of Tweets. These Tweets are ordered chronologically with the most recent first. + * + * @see https://dev.twitter.com/rest/reference/get/lists/statuses + */ +@interface TWTRListTimelineDataSource : NSObject + +/** + * The ID of the list to show Tweets for. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. + */ +@property (nonatomic, copy, readonly) NSString *listID; + +/** + * The slug of the list to show Tweets for. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. + */ +@property (nonatomic, copy, readonly) NSString *listSlug; + +/** + * Screen name of the owner of the list as specified by the `listSlug`. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. + */ +@property (nonatomic, copy, readonly) NSString *listOwnerScreenName; + +/** + * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. Will request 30 Tweets by default. Setting this value to 0 will use the server default. + */ +@property (nonatomic, assign, readonly) NSUInteger maxTweetsPerRequest; + +/** + * Whether to request retweets in the set of Tweets from the server. + * + * Defaults to YES. + */ +@property (nonatomic, assign, readonly) BOOL includeRetweets; + +/** + * Convenience initializer. Uses default values for `maxTweetsPerRequest` and `includeRetweets`. + * + * @param listID (required) The ID of the list. + * @param client (required) The API client to use for making network requests. + * + * @return A full initialized list timeline datasource. + */ +- (instancetype)initWithListID:(NSString *)listID APIClient:(TWTRAPIClient *)client; + +/** + * Convenience initializer. Uses default values for `maxTweetsPerRequest` and `includeRetweets`. + * + * @param listSlug (required) The slug of the list. + * @param listOwnerScreenName (required) The list owner's screen name. + * @param client (required) The API client to use for making network requests. + * + * @return A full initialized list timeline datasource. + */ +- (instancetype)initWithListSlug:(NSString *)listSlug listOwnerScreenName:(NSString *)listOwnerScreenName APIClient:(TWTRAPIClient *)client; + +/** + * Designated initializer for creating list timeline data sources taking all parameters. + * + * @param listID (optional) The ID of the list. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. + * @param listSlug (optional) The slug of the list. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. + * @param listOwnerScreenName (optional) The list owner's screen name. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. + * @param client (required) The API client to use for making networking requests + * @param maxTweetsPerRequest (optional) The number of Tweets per batch to request. A value of 0 will use the server default. + * @param includeRetweets (optional) Whether retweets should be requested. + * + * @return A fully initialized list timeline datasource. + */ +- (instancetype)initWithListID:(NSString * __twtr_nullable)listID listSlug:(NSString * __twtr_nullable)listSlug listOwnerScreenName:(NSString * __twtr_nullable)listOwnerScreenName APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest includeRetweets:(BOOL)includeRetweets NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __unavailable; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRLogInButton.h b/TwitterKit.framework/Headers/TWTRLogInButton.h new file mode 100644 index 0000000..379ddf2 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRLogInButton.h @@ -0,0 +1,34 @@ +// +// TWTRLogInButton.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import + +/** + * A Button which launches the sign in to Twitter flow when tapped. + */ +@interface TWTRLogInButton : UIButton + +/** + * The completion block to be called with a `TWTRSession` if successful, + * and a `NSError` if logging in failed or was canceled. + */ +@property (nonatomic, copy) TWTRLogInCompletion logInCompletion; + +/** + * Returns a new log in button which launches Twitter log in when tapped and + * calls `completion` when logging in succeeds or fails. + * + * Internally, this button simply calls `-[Twitter logInWithCompletion:]`. + * + * @param completion The completion to be called with a `TWTRSession` if successful, + * and a `NSError` if logging in failed or was canceled. + * @return An initialized `TWTRLogInButton`. + */ ++ (instancetype)buttonWithLogInCompletion:(TWTRLogInCompletion)completion; + +@end diff --git a/TwitterKit.framework/Headers/TWTROAuthSigning.h b/TwitterKit.framework/Headers/TWTROAuthSigning.h new file mode 100644 index 0000000..31454ef --- /dev/null +++ b/TwitterKit.framework/Headers/TWTROAuthSigning.h @@ -0,0 +1,41 @@ +// +// TWTROAuthSigning.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +@class TWTRAuthConfig; +@class TWTRSession; + +/** + * This class provides tools to generate OAuth signatures. + */ +@interface TWTROAuthSigning : NSObject + +/** + * @name Initialization + */ + +/** + * Instantiate a `TWTROAuthSigning` object with the parameters it needs to generate the OAuth signatures. + * + * @param authConfig (required) Encapsulates credentials required to authenticate a Twitter application. + * @param authSession (required) Encapsulated credentials associated with a user session. + * + * @return An initialized `TWTROAuthSigning` object or nil if any of the parameters are missing. + * + * @note If you want to generate OAuth Echo headers to verify Digits' credentials, see `DGTOAuthSigning`. + * + * @see TWTRAuthConfig + * @see TWTRSession + */ +- (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig authSession:(TWTRSession *)authSession NS_DESIGNATED_INITIALIZER; + +/** + * Unavailable. Use `-initWithAuthConfig:authSession:` instead. + */ +- (instancetype)init __attribute__((unavailable("Use -initWithAuthConfig:authSession: instead."))); + +@end diff --git a/TwitterKit.framework/Headers/TWTRSearchTimelineDataSource.h b/TwitterKit.framework/Headers/TWTRSearchTimelineDataSource.h new file mode 100644 index 0000000..bb8d2a7 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRSearchTimelineDataSource.h @@ -0,0 +1,81 @@ +// +// TWTRSearchTimelineDataSource.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "TWTRTimelineDataSource.h" + +@class TWTRAPIClient; + +/** +Data source representing a Search Timeline. Provides TWTRTweet objects to a TWTRTimelineViewController in pages determined by the TWTRTimelineCursor object passed in to the `loadNext:` and `loadPrevious:` methods. + +## Search Queries: + + * `watching now` containing both “watching” and “now”. Default. + * `“happy hour”` containing the exact phrase “happy hour”. + * `love OR hate` containing either “love” or “hate” (or both). + * `beer -root` containing “beer” but not “root”. + * `#haiku` containing the hashtag “haiku”. + * `from:alexiskold`sent from person “alexiskold”. + * `to:techcrunch` sent to person “techcrunch”. + * `@mashable` referencing person “mashable”. + * `flight :(` containing “flight” and with a negative attitude. + * `traffic ?` containing “traffic” and asking a question. + * `movie -scary :)`containing “movie”, but not “scary”, and with a positive attitude. + * `hilarious filter:links` containing “hilarious” and linking to URL. + * `news source:twitterfeed`containing “news” and entered via TwitterFeed + * `superhero since:2010-12-27` containing “superhero” and sent since date “2010-12-27” (year-month-day). + * `ftw until:2010-12-27` containing “ftw” and sent before the date “2010-12-27”. + + @see https://dev.twitter.com/rest/public/search + Not implemented: `geocode`, `result_type` + */ +@interface TWTRSearchTimelineDataSource : NSObject + +/** + * The search query. This matches what you would type into https://twitter.com/search + */ +@property (nonatomic, copy, readonly) NSString *searchQuery; + +/** + * Restricts tweets returned to a given language, specified by its ISO 639-1 code (for example: en, es). Language detection is best-effort. The server defaults to returning Tweets in all languages. + * + * @see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + */ +@property (nonatomic, copy, readonly) NSString *languageCode; + +/** + * The number of Tweets to request in each network request for more Tweets. By default requests 30 tweets. If set to `0` the parameter will not be set on the request and the Twitter API will use the default size for the endpoint. + */ +@property (nonatomic, assign, readonly) NSUInteger maxTweetsPerRequest; + +/** + * Convenience initializer. Uses default values for `languageCode` and `maxTweetsPerRequest`. + * + * @param searchQuery (required) The query string that you would type into https://twitter.com/search + * @param client (required) An instance of `TWTRAPIClient` with which API calls will be made. + * + * @return A fully initialized search timeline datasource or `nil` if any of the required parameters are missing. + */ + +- (instancetype)initWithSearchQuery:(NSString *)searchQuery APIClient:(TWTRAPIClient *)client __attribute__((nonnull)); + +/** + * Designated initializer for creating search timeline data sources taking all parameters. + * + * @param searchQuery (required) The query string that you would type into https://twitter.com/search + * @param client (required) An instance of `TWTRAPIClient` with which API calls will be made. + * @param languageCode (optional) The ISO 639-1 language code to restrict Tweets to. A `nil` value will not add the parameter to the server request and so use the server default. + * @param maxTweetsPerRequest (optional) The number of tweets to request in each query to the Twitter API. A value of 0 will not add to the parameters and thus use the server default. + * + * @return A fully initialized search timeline datasource or `nil` if any of the required parameters are missing. + */ +- (instancetype)initWithSearchQuery:(NSString *)searchQuery APIClient:(TWTRAPIClient *)client languageCode:(NSString *)languageCode maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest __attribute__((nonnull(1,2))) NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __unavailable; + +@end diff --git a/TwitterKit.framework/Headers/TWTRShareEmailViewController.h b/TwitterKit.framework/Headers/TWTRShareEmailViewController.h new file mode 100644 index 0000000..a7cf570 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRShareEmailViewController.h @@ -0,0 +1,49 @@ +// +// TWTRShareEmailViewController.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * A completion block to be called when the user accepts or denies access to their email address. + * + * @param email The user's email address. This will be nil if the user does not grant access to their email address or your application is not allowed to request email addresses. + * @param error An error that details why a user's email address could not be provided. + */ +typedef void (^TWTRShareEmailCompletion)(NSString * __twtr_nullable email, NSError * __twtr_nullable error); + +/** + * The `TWTRShareEmailViewController` class presents a view to the user to request their email address. This is a subclass of `UINavigationController` and must be presented modally. + * + * @note Using `TWTRShareEmailViewController` requires your application to be whitelisted by Twitter. To request access, please visit https://support.twitter.com/forms/platform. + */ +@interface TWTRShareEmailViewController : UINavigationController + +/** + * Completion block called when the user accepts or denies access to their email address. + */ +@property (nonatomic, copy) TWTRShareEmailCompletion completion; + +/** + * Initializer for `TWTRShareEmailViewController`. + * + * @param completion The completion block called when the user either accepts or denies access to their email address. Called on the main thread. + */ +- (instancetype)initWithCompletion:(twtr_nullable TWTRShareEmailCompletion)completion; + +/** + * Initializer for `TWTRShareEmailViewController`. + * + * @param userID the ID of the user you are requesting the email on behalf of, if nil the last signed in account will be used. + * @param completion The completion block called when the user either accepts or denies access to their email address. Called on the main thread. + */ +- (instancetype)initWithUserID:(twtr_nullable NSString *)userID completion:(twtr_nullable TWTRShareEmailCompletion)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRTimelineDataSource.h b/TwitterKit.framework/Headers/TWTRTimelineDataSource.h new file mode 100644 index 0000000..ae0ee84 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRTimelineDataSource.h @@ -0,0 +1,40 @@ +// +// TWTRTimelineDataSource.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import "TWTRTimelineType.h" +@class TWTRTimelineCursor; + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^TWTRLoadTimelineCompletion)(NSArray * __twtr_nullable tweets, TWTRTimelineCursor * __twtr_nullable cursor, NSError * __twtr_nullable error); + +/** + * Responsible for building network parameters for requesting a timeline of Tweets. + * + * Implementations of this protocol don't need to be thread-safe. All the methods will be invoked on the main thread. + */ +@protocol TWTRTimelineDataSource + +/** + * Load Tweets before a given position. For time-based timelines this generally + * corresponds to Tweets older than a position. + * + * @param position (optional) The position or Tweet ID before the page + * of Tweets to be loaded. + * @param completion (required) Invoked with the Tweets and the cursor in case of success, or nil + * and an error in case of error. This must be called on the main thread. + */ +- (void)loadPreviousTweetsBeforePosition:(NSString * __twtr_nullable)position completion:(TWTRLoadTimelineCompletion)completion; + +/* + * The type of the timeline that this data source represents. + */ +@property (nonatomic, readonly) TWTRTimelineType timelineType; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRTimelineType.h b/TwitterKit.framework/Headers/TWTRTimelineType.h new file mode 100644 index 0000000..a1bafb1 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRTimelineType.h @@ -0,0 +1,29 @@ +// +// TWTRTimelineType.h +// TwitterKit +// +// Created by Steven Hepting on 3/30/15. +// Copyright (c) 2015 Twitter. All rights reserved. +// + +/* + * Type of timelines that may be loaded and shown to the user. + */ +typedef NS_ENUM(NSUInteger, TWTRTimelineType) { + /* + * User Timeline + */ + TWTRTimelineTypeUser = 1, + /* + * Search Timeline + */ + TWTRTimelineTypeSearch, + /** + * Collection Timeline + */ + TWTRTimelineTypeCollection, + /** + * List Timeline + */ + TWTRTimelineTypeList, +}; diff --git a/TwitterKit.framework/Headers/TWTRTimelineViewController.h b/TwitterKit.framework/Headers/TWTRTimelineViewController.h new file mode 100644 index 0000000..b1016de --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRTimelineViewController.h @@ -0,0 +1,58 @@ +// +// TWTRTimelineViewController.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "TWTRTimelineDataSource.h" + +/** + This class is a `UITableViewController` subclass that displays `TWTRTweetTableViewCell` cells. It handles cell-reuse, cell-configuration, and loading more tweets from the given timeline once the last cell is reached. + + ## Usage + + Initialize this class with any object that conforms to the `TWTRTimelineDataSource` protocol. We provide two such classes, `TWTRUserTimelineDataSource` and `TWTRSearchTimelineDataSource`. These provide `TWTRTweet` objects to this table view which then configures the instances of `TWTRTweetTableViewCell`. + + // Create the data source + TWTRAPIClient *client = [Twitter sharedInstance].APIClient; + TWTRUserTimelineDataSource *dataSource = [[TWTRUserTimelineDataSource alloc] initWithScreenName:@"jack" APIClient:client]; + + // Create the timeline view controller + TWTRTimelineViewController *timeline = [[TWTRTimelineViewController alloc] initWithDataSource:dataSource]; + + ## Loading More + + This class loads the first batch of `TWTRTweet` objects from the Twitter API when `viewWillAppear:` is received. It also handles loading more tweets automatically once the last cell has been shown. + + */ +@interface TWTRTimelineViewController : UITableViewController + +/** + Initializes a timeline view controller. Does not start loading tweets until + `viewWillAppear:` is called. + + This method must be used to initialize this class. The `init` method is unavailable. + + @param dataSource Required. A timeline data source object that conforms to the `TWTRTimelineDataSource` protocol. + + @return A fully initialized `TWTRTimelineViewController` or nil if the data source is missing. + */ +- (instancetype)initWithDataSource:(id)dataSource; + +/** + The source of `TWTRTweet` objects for this `TWTRTimelineViewController`. + + May be set to update the tweets being shown by this table view. Must be set on the main thread. + */ +@property (nonatomic, strong) id dataSource; + +/** + * Whether action buttons (favorite, share) should be shown on the TWTRTweetTableViewCells inside the tableview. + */ +@property (nonatomic, assign) BOOL showTweetActions; + +- (instancetype)initWithStyle:(UITableViewStyle)style __attribute__((unavailable("Use -initWithDataSource: instead"))); + +@end diff --git a/TwitterKit.framework/Headers/TWTRTweet.h b/TwitterKit.framework/Headers/TWTRTweet.h new file mode 100644 index 0000000..0aade39 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRTweet.h @@ -0,0 +1,132 @@ +// +// TWTRTweet.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +@class TWTRTweet; +@class TWTRUser; + +/** + * `TWTRTweet` is an immutable representation of a Tweet. + */ +@interface TWTRTweet : NSObject + +# pragma mark - Properties + +/** + * The ID of the Twitter Tweet. + * @warning This represents the id_str field, which could differ from the value of the id field. + */ +@property (nonatomic, copy, readonly) NSString *tweetID; + +/** + * The date when this Tweet was created. + */ +@property (nonatomic, copy, readonly) NSDate *createdAt; + +/** + * The text of the Tweet. + */ +@property (nonatomic, copy, readonly) NSString *text; + +/** + * The Author of the Tweet. + */ +@property (nonatomic, strong, readonly) TWTRUser *author; + +/** + * The number of times this Tweet was favorited. + */ +@property (nonatomic, assign, readonly) long long favoriteCount; + +/** + * The number of times this Tweet was retweeted. + */ +@property (nonatomic, assign, readonly) long long retweetCount; + +/** + * The Tweet this Tweet was a reply to. + */ +@property (nonatomic, copy, readonly) NSString *inReplyToTweetID; + +/** + * The User ID this Tweet was a reply to. + */ +@property (nonatomic, copy, readonly) NSString *inReplyToUserID; + +/** + * The screen name of the user this Tweet was a reply to. + * @note This doesn't contain the `@` sign before the screen name. + */ +@property (nonatomic, copy, readonly) NSString *inReplyToScreenName; + +/** + * The permalink URL for this Tweet. + * + * Suitable for loading in a `UIWebView`, `WKWebView` or passing to Safari: + * + * `[[UIApplication sharedApplication] openURL:tweet.permalink];` + */ +@property (nonatomic, copy, readonly) NSURL *permalink; + +/** + * Whether this Tweet was favorited by the authenticated user. + * + * @warning The value of this property depends on the authenticated user. + */ +@property (nonatomic, assign, readonly) BOOL isFavorited; + +/** + * Whether this Tweet was retweeted by the authenticated user. + * + * @warning The value of this property depends on the authenticated user. + */ +@property (nonatomic, assign, readonly) BOOL isRetweeted; + +/** + * The Tweet ID of the authenticated user's retweet of this Tweet. This will be `nil` if there is no + * authenticated user or the user has not retweeted this Tweet. + * + * @warning The value of this property depends on the authenticated user. + */ +@property (nonatomic, copy, readonly) NSString *retweetID; + +/** + * The original, fully-hydrated Tweet that was retweeted. This corresponds to the `retweeted_status` API field. + * This is `nil` unless `self.isRetweet == YES`. + */ +@property (nonatomic, strong, readonly) TWTRTweet *retweetedTweet; + +/** + * Indicates whether this Tweet is a retweet of another Tweet. + */ +@property (nonatomic, assign, readonly) BOOL isRetweet; + +# pragma mark - Init + +/** + * Creates a TWTRTweet instance from the dictionary of Twitter API JSON response. + * + * @param dictionary A parsed dictionary of a single Twitter Tweet API JSON response. + * @return TWTRTweet instance. + */ +- (instancetype)initWithJSONDictionary:(NSDictionary *)dictionary; + +/** + * Creates an array of TWTRTweet instances from the array of Twitter API JSON response. + * + * @param array A parsed array of Tweet API JSON responses. + * @return An array of TWTRTweet instances. + */ ++ (NSArray *)tweetsWithJSONArray:(NSArray *)array; + +/** + * Creates a new Tweet instance with a new value for the `isFavorited` boolean + * value which is the opposite of the current value. + */ +- (TWTRTweet *)tweetWithFavoriteToggled; + +@end diff --git a/TwitterKit.framework/Headers/TWTRTweetTableViewCell.h b/TwitterKit.framework/Headers/TWTRTweetTableViewCell.h new file mode 100644 index 0000000..478e713 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRTweetTableViewCell.h @@ -0,0 +1,80 @@ +// +// TWTRTweetTableViewCell.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +@class TWTRTweet; +@class TWTRTweetView; + +/** + * A table view cell subclass which displays a Tweet. + */ +@interface TWTRTweetTableViewCell : UITableViewCell + +/** + * The Tweet view inside this cell. Holds all relevant text and images. + */ +@property (nonatomic, strong, readonly) TWTRTweetView *tweetView; + +/** + * Configures the existing Tweet view with a Tweet. Updates labels, images, and thumbnails. + * + * @param tweet The `TWTRTweet` model object for the Tweet to display. + */ +- (void)configureWithTweet:(TWTRTweet *)tweet; + +/** + * Returns the height calculated using a given width. Usable from a background thread. This is the preferred approach to calculating height for tableview cells. + + - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + TWTRTweet *tweet = self.tweets[indexPath.row]; + + // Grab the height for this cell + CGFloat height = [TWTRTweetTableViewCell heightForTweet:tweet width:CGRectGetWidth(self.view.bounds)]; + return height; + } + + * @param width The table view cell width. + */ ++ (CGFloat)heightForTweet:(TWTRTweet *)tweet width:(CGFloat)width showingActions:(BOOL)actionsAreVisible; + +/** + * Calculates the height for this Tweet assuming that actions are being shown (the default). + * + * @param tweet The Tweet object desiring to be shown. + * @param width The width of the tableview. + * + * @return The calculated height for this Tweet. + * + * @note If this method is returning the incorrect height and .showActionButtons + * has been set to NO on your TWTRTweetView you will need to use + * heightForTweet:width:showingActions: instead. + */ ++ (CGFloat)heightForTweet:(TWTRTweet *)tweet width:(CGFloat)width; + +#pragma mark - Deprecated Methods + +/** + DEPRECATED + + Returns the height calculated using a given width. Generally just for use with prototype + cells. Calls `sizeThatFits:` internally to find height (which can be slow). + + - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + TWTRTweet *tweet = self.tweets[indexPath.row]; + + // Grab the height for this cell + CGFloat height = [TWTRTweetTableViewCell heightForTweet:tweet width:CGRectGetWidth(self.view.bounds)]; + return height; + } + + @deprecated Use +heightForTweet:width:showingActions: instead. Deprecated in version 1.3.0 + + @param width The table view cell width. + */ +- (CGFloat)calculatedHeightForWidth:(CGFloat)width __attribute__((deprecated("Use +heightForTweet:width: instead."))); + +@end diff --git a/TwitterKit.framework/Headers/TWTRTweetView.h b/TwitterKit.framework/Headers/TWTRTweetView.h new file mode 100644 index 0000000..7af4b35 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRTweetView.h @@ -0,0 +1,192 @@ +// +// TWTRTweetView.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "TWTRTweetViewDelegate.h" + +@class TWTRTweet; + +/** + * The style for Tweet views. + */ +typedef NS_ENUM(NSUInteger, TWTRTweetViewStyle) { + /** + * A full-size Tweet view. Displays images if present. + */ + TWTRTweetViewStyleRegular, + /** + * A small Tweet view, primarily designed to be used in table views. + */ + TWTRTweetViewStyleCompact +}; + +/** + * A default combination of colors for Tweet views. + */ +typedef NS_ENUM(NSUInteger, TWTRTweetViewTheme) { + /** + * Official light theme. + */ + TWTRTweetViewThemeLight, + /** + * Official dark theme. + */ + TWTRTweetViewThemeDark, +}; + +/** + `TWTRTweetView` displays a single Tweet to the user. It handles background taps and other actions displayed to the user. + + [[[Twitter sharedInstance] APIClient] loadTweetWithID:@"20" completion:^(TWTRTweet *tweet, NSError *error) { + if (tweet) { + TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; + [self.view addSubview:tweetView]; + } else { + NSLog(@"Error loading Tweet: %@", [error localizedDescription]); + } + }]; + + ## Interaction + + The `TWTRTweetViewDelegate` is notified: + + - When the background is tapped. + - When a link is selected. + - When the share button is tapped. + - When the share action completes. + - When the favorite action completes. + + ## Usage in UITableView + + To allow for usage in a `UITableView`, the `configureWithTweet:` method allows configuration of an existing `TWTRTweetView` without having to create a new instance. + + ## Sizing + + When using Auto Layout, feel free to set a width or margin on the Tweet view. The height will be calculated automatically. For old-fashioned frame based layout you may use the standard `sizeThatFits:` method to calculate the appropriate height for a given width: + + // Find the height for a given width (20pts on either side) + CGFloat desiredHeight = [tweetView sizeThatFits:CGSizeMake(self.view.frame.size.width - 40, CGFLOAT_MAX)].height; + + ## UIAppearance + + You may use UIAppearance proxy objects to style certain aspects of Tweet views before those views are added to the view hierarchy. + + // Using UIAppearance Proxy + [TWTRTweetView appearance].theme = TWTRTweetViewThemeDark; + + // Setting colors directly + [TWTRTweetView appearance].primaryTextColor = [UIColor yellowColor]; + [TWTRTweetView appearance].backgroundColor = [UIColor blueColor]; + + // Setting action button visibility + [TWTRTweetView appearance].showActionButtons = NO; + + _Note:_ You can't change the theme through an appearance proxy after the view has already been added to the view hierarchy. Direct `theme` property access will work though. + */ +@interface TWTRTweetView : UIView + +/** + * Background color of the Tweet view and all text labels (fullname, username, Tweet text, timestamp). + */ +@property (nonatomic, strong) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; + +/** + * Color of Tweet text and full name. + */ +@property (nonatomic, strong) UIColor *primaryTextColor UI_APPEARANCE_SELECTOR; + +/** + * Color of links in Tweet text. + */ +@property (nonatomic, strong) UIColor *linkTextColor UI_APPEARANCE_SELECTOR; + +/** + * Set whether the border should be shown. + * Defaults to YES. + */ +@property (nonatomic, assign) BOOL showBorder UI_APPEARANCE_SELECTOR; + +/** + * Set whether the action buttons (Favorite, Share) should be shown. When toggled, + * both the visibility of the action buttons and the internal constraints are + * updated immediately. The layout will be updated the next layout pass that occurs. + * + * Defaults to NO. + */ +@property (nonatomic, assign) BOOL showActionButtons; + +/** + * Setting the theme of the Tweet view will change the color properties accordingly. + * + * Set to `TWTRTweetViewThemeLight` by default. + */ +@property (nonatomic, assign) TWTRTweetViewTheme theme UI_APPEARANCE_SELECTOR; + +/** + * The style of the Tweet. i.e. `TWTRTweetViewStyleRegular` or `TWTRTweetViewStyleCompact`. + */ +@property (nonatomic, assign, readonly) TWTRTweetViewStyle style; + +/** + * Optional delegate to receive notifications when certain actions happen + */ +@property (nonatomic, weak) IBOutlet id delegate; + +/** + * Optional property to set a UIViewController from which to present various new UI + * e.g. when presenting a Share sheet, presenting a login view controller for actions, etc + */ +@property (nonatomic, weak) UIViewController *presenterViewController; + +/** + * Convenience initializer to configure a compact style Tweet view. + * + * @param tweet The Tweet to display. + * + * @return The fully-configured Tweet view. + */ +- (instancetype)initWithTweet:(TWTRTweet *)tweet; + +/** + * Designated initializer. Initializes view with both Tweet and style. + * + * @param tweet The Tweet to display. + * @param style The style of the Tweet view (regular or compact). + * + * @return The fully configured Tweet view. + */ +- (instancetype)initWithTweet:(TWTRTweet *)tweet style:(TWTRTweetViewStyle)style; + +/** + * Initialization with a frame parameter is not supported. + */ +- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("Use -initWithTweet: instead"))); + +/** + Find the size that fits into a desired space. This is a system method on UIView but implemented on `TWTRTweetView` + + TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; + + // Make it 280 points wide + CGSize desiredSize = [tweetView sizeThatFits:CGSizeMake(280, CGFLOAT_MAX)]; + tweetView.frame = CGRectMake(PADDING_X, PADDING_Y, 280, desiredSize.height); + + [self.view addSubview:tweetView]; + + @param size The space available. Should generally leave one orientation unconstrained, and the minimum width supported is 200pts. + + @return The size that will fit into the space available. + */ +- (CGSize)sizeThatFits:(CGSize)size; + +/** + * Update all images and label text to fully represent the given Tweet. + * + * @param tweet The Tweet to display. + */ +- (void)configureWithTweet:(TWTRTweet *)tweet; + +@end diff --git a/TwitterKit.framework/Headers/TWTRTweetViewDelegate.h b/TwitterKit.framework/Headers/TWTRTweetViewDelegate.h new file mode 100644 index 0000000..28d472a --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRTweetViewDelegate.h @@ -0,0 +1,109 @@ +// +// TWTRTweetViewDelegate.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +@class TWTRSession; +@class TWTRTweetView; +@class TWTRTweet; +@protocol TWTRSessionStore; + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^TWTRAuthenticationCompletionHandler)(id sessionStore, NSString *userID); + +/** + Delegate for `TWTRTweetView` to receive updates on the user interacting with this particular Tweet view. + + // Create the tweet view + TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; + // Set the delegate + tweetView.delegate = self; + */ +@protocol TWTRTweetViewDelegate + +@optional + +/** + * The tweet view was tapped. Implement to show your own webview if desired using the `permalinkURL` property on the `TWTRTweet` object passed in. + * + * @param tweetView The Tweet view that was tapped. + * @param tweet The Tweet model object being shown. + */ +- (void)tweetView:(TWTRTweetView *)tweetView didSelectTweet:(TWTRTweet *)tweet; + +/** + * The tweet view image was tapped. + * + * @param tweetView The Tweet view that was tapped. + * @param image The exact UIImage data shown by the Tweet view. + * @param imageURL The full URL of the image being shown. + */ +- (void)tweetView:(TWTRTweetView *)tweetView didTapImage:(UIImage *)image withURL:(NSURL *)imageURL; + +/** + * A URL in the text of a tweet was tapped. Implement to show your own webview rather than opening Safari. + * + * @param tweetView The Tweet view that was tapped. + * @param url The URL that was tapped. + */ +- (void)tweetView:(TWTRTweetView *)tweetView didTapURL:(NSURL *)url; + +/** + * The Tweet view "Share" button was tapped and the `UIActivityViewController` was shown. + * + * @param tweetView The Tweet view that was tapped. + * @param tweet The Tweet model object being shown. + */ +- (void)tweetView:(TWTRTweetView *)tweetView willShareTweet:(TWTRTweet *)tweet; + +/** + * The share action for a Tweet was completed. + * + * @param tweetView The Tweet view that was tapped. + * @param tweet The Tweet model object being shown. + * @param shareType The share action that was completed. (e.g. `UIActivityTypePostToFacebook`, `UIActivityTypePostToTwitter`, or `UIActivityTypeMail`) + */ +- (void)tweetView:(TWTRTweetView *)tweetView didShareTweet:(TWTRTweet *)tweet withType:(NSString *)shareType; + +/** + * The share action for a Tweet was cancelled. + * + * @param tweetView The Tweet view handling the share action. + * @param tweet The Tweet model object represented. + */ +- (void)tweetView:(TWTRTweetView *)tweetView cancelledShareTweet:(TWTRTweet *)tweet; + +/** + * The Tweet view favorite button was tapped and the action was completed with + * the Twitter API. + * + * @param tweetView The Tweet view showing this Tweet object. + * @param tweet The Tweet model that was just favorited. + */ +- (void)tweetView:(TWTRTweetView *)tweetView didFavoriteTweet:(TWTRTweet *)tweet; + +/** + * The Tweet view unfavorite button was tapped and the action was completed with + * the Twitter API. + * + * @param tweetView The Tweet view showing this Tweet object. + * @param tweet The Tweet model object that was just unfavorited. + */ +- (void)tweetView:(TWTRTweetView *)tweetView didUnfavoriteTweet:(TWTRTweet *)tweet; + +/** + * Requests authentication from the delegate to use for a network request that requires user context. + * + * @param tweetView The Tweet view showing this Tweet object. + * @param authenticationCompletionHandler The completion block that your delegate method must call to provide the necessary + * user context e.g. user session. + */ +- (void)tweetView:(TWTRTweetView *)tweetView willRequireAuthenticationCompletionHandler:(TWTRAuthenticationCompletionHandler)authenticationCompletionHandler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TWTRUser.h b/TwitterKit.framework/Headers/TWTRUser.h new file mode 100644 index 0000000..b33abb9 --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRUser.h @@ -0,0 +1,85 @@ +// +// TWTRUser.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +/** + * Represents a user on Twitter. + */ +@interface TWTRUser : NSObject + +# pragma mark - Properties + +/** + * The ID of the Twitter User. + */ +@property (nonatomic, copy, readonly) NSString *userID; + +/** + * The user's name as it appears on their profile. + * + * @warning This can be modified by the user at any time. + */ +@property (nonatomic, copy, readonly) NSString *name; + +/** + * The user's username on Twitter. + * + * @warning This can be modified by the user at any time. + */ +@property (nonatomic, copy, readonly) NSString *screenName; + +/** + * Whether the user has been verified by Twitter. + */ +@property (nonatomic, assign, readonly) BOOL isVerified; + +/** + * Whether the user is protected. + */ +@property (nonatomic, assign, readonly) BOOL isProtected; + +/** + * The HTTPS URL of the user's profile image. + */ +@property (nonatomic, copy, readonly) NSString *profileImageURL; + +/** + * The URL of a smaller version of the user's profile image. + */ +@property (nonatomic, copy, readonly) NSString *profileImageMiniURL; + +/** + * The URL of a larger version of the user's profile image. + */ +@property (nonatomic, copy, readonly) NSString *profileImageLargeURL; + +/** + * The formatted version of the user's `screenName` with the `@` sign for display purposes. + */ +@property (nonatomic, copy, readonly) NSString *formattedScreenName; + +# pragma mark - Init + +/** + * Creates a Twitter user object from the dictionary of Twitter API JSON response. + * + * @param dictionary A parsed dictionary of a single Twitter Tweet API JSON response. + * + * @return An initialized TWTRUser instance. + */ +- (instancetype)initWithJSONDictionary:(NSDictionary *)dictionary; + +/** + * Creates an array of Twitter User instances from the array of Twitter API JSON response. + * + * @param array A parsed array of Twitter User API JSON responses. + * + * @return An array of initialized TWTRTweet instances. + */ ++ (NSArray *)usersWithJSONArray:(NSArray *)array; + +@end diff --git a/TwitterKit.framework/Headers/TWTRUserTimelineDataSource.h b/TwitterKit.framework/Headers/TWTRUserTimelineDataSource.h new file mode 100644 index 0000000..21b865d --- /dev/null +++ b/TwitterKit.framework/Headers/TWTRUserTimelineDataSource.h @@ -0,0 +1,75 @@ +// +// TWTRUserTimelineDataSource.h +// TwitterKit +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import "TWTRTimelineDataSource.h" + +@class TWTRAPIClient; + +/** + * This Timeline Data Source provides a list of Tweets roughly consistent with the list on a Users profile page. The difference is that this data source will filter out Tweets that are direct replies to other users by default. + * + * These Tweets are ordered chronologically with the most recent first. + */ +@interface TWTRUserTimelineDataSource : NSObject + +/** + * The screen name of the User whose Tweets are being shown. Either the `screenName` or the `userID` are required. + */ +@property (nonatomic, copy, readonly) NSString *screenName; + +/** + * The userID of the User whose Tweets are being shown. Either the `screenName` or the `userID` are required. + */ +@property (nonatomic, copy, readonly) NSString *userID; + +/** + * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. Will request 30 Tweets by default. Setting this value to 0 will use the server default. + */ +@property (nonatomic, assign, readonly) NSUInteger maxTweetsPerRequest; + +/** + * Whether to request replies in the set of Tweets from the server. + * + * Defaults to NO. + */ +@property (nonatomic, assign, readonly) BOOL includeReplies; + +/** + * Whether to request retweets in the set of Tweets from the server. + * + * Defaults to YES. + */ +@property (nonatomic, assign, readonly) BOOL includeRetweets; + +/** + * Convenience initializer. Uses default values for `maxTweetsPerRequest`, `includeReplies` and `includeRetweets`. + * + * @param screenName (required) The screen name of a Twitter User + * @param client (required) The API client to use for making network requests. + * + * @return A fully initialized user timeline datasource or nil. + */ +- (instancetype)initWithScreenName:(NSString *)screenName APIClient:(TWTRAPIClient *)client __attribute__((nonnull)); + +/** + * The designated initialzer accepted values for properties. + * + * @param userID (optional) The user ID of the Twitter User + * @param screenName (optional) The screen name of the Twitter User + * @param APIClient (required) The API client to use for making network requests. + * @param maxTweetsPerRequest (optional) The number of Tweets per batch to request. A value of 0 will use the server default. + * @param includeReplies (optional) Whether replies should be requested + * @param includeRetweets (optional) Whether retweets should be requested + * + * @return A fully initialized user timeline datasource or nil. + */ +- (instancetype)initWithScreenName:(NSString *)screenName userID:(NSString *)userID APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest includeReplies:(BOOL)includeReplies includeRetweets:(BOOL)includeRetweets __attribute__((nonnull(3))) NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __unavailable; + +@end diff --git a/TwitterKit.framework/Headers/Twitter.h b/TwitterKit.framework/Headers/Twitter.h new file mode 100644 index 0000000..97a49c0 --- /dev/null +++ b/TwitterKit.framework/Headers/Twitter.h @@ -0,0 +1,175 @@ +// +// Twitter.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import +#import +#import "TWTRAPIClient.h" + +@class TWTRSessionStore; + +NS_ASSUME_NONNULL_BEGIN + +/** + * The central class of the Twitter Kit. + * @note This class can only be used from the main thread. + */ +@interface Twitter : NSObject + +/** + * Returns the Twitter singleton. + * + * @return The Twitter singleton. + */ ++ (Twitter *)sharedInstance; + +/** + * Start Twitter with your consumer key and secret. These will override any credentials + * present in your applications Info.plist. + * + * You do not need to call this method unless you wish to provide credentials other than those + * in your Info.plist. + * + * @param consumerKey Your Twitter application's consumer key. + * @param consumerSecret Your Twitter application's consumer secret. + */ +- (void)startWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; + +/** + * Start Twitter with a consumer key, secret, and keychain access group. See -[Twitter startWithConsumerKey:consumerSecret:] + * + * @param consumerKey Your Twitter application's consumer key. + * @param consumerSecret Your Twitter application's consumer secret. + * @param accessGroup An optional keychain access group to apply to session objects stored in the keychain. + * + * @note In the majority of situations applications will not need to specify an access group to use with Twitter sessions. + * This value is only needed if you plan to share credentials with another application that you control or if you are + * using TwitterKit with an app extension. + */ +- (void)startWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret accessGroup:(twtr_nullable NSString *)accessGroup; + +/** + * The current version of this kit. + */ +@property (nonatomic, copy, readonly) NSString *version; + +/** + * Authentication configuration details. Encapsulates the `consumerKey` and `consumerSecret` credentials required to authenticate a Twitter application. + */ +@property (nonatomic, strong, readonly) TWTRAuthConfig *authConfig; + +/** + * Session store exposing methods to fetch and manage active sessions. Applications that need to manage + * multiple users should use the session store to authenticate and log out users. + */ +@property (nonatomic, strong, readonly) TWTRSessionStore *sessionStore; + +/** + * Triggers user authentication with Twitter. + * + * This method will present UI to allow the user to log in if there are no saved Twitter login credentials. + * + * @param completion The completion block will be called after authentication is successful or if there is an error. + * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. + */ +- (void)logInWithCompletion:(TWTRLogInCompletion)completion; + +/** + * Triggers user authentication with Twitter. Allows the developer to specify the presenting view controller. + * + * This method will present UI to allow the user to log in if there are no saved Twitter login credentials. + * + * @param viewController The view controller that will be used to present the authentication view. + * @param completion The completion block will be called after authentication is successful or if there is an error. + * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. + */ +- (void)logInWithViewController:(twtr_nullable UIViewController *)viewController completion:(TWTRLogInCompletion)completion; + +@end + +@interface Twitter (TWTRDeprecated) + +/** + * The Twitter application consumer key. + * @deprecated This property is deprecated and will be removed in a later release. Please use `authConfig`. + */ +@property (nonatomic, copy, readonly) NSString *consumerKey __attribute__((deprecated("Use `authConfig`. This property will be removed in a later release."))); + +/** + * The Twitter application consumer secret. + * @deprecated This property is deprecated and will be removed in a later release. Please use `authConfig`. + */ +@property (nonatomic, copy, readonly) NSString *consumerSecret __attribute__((deprecated("Use `authConfig`. This property will be removed in a later release."))); + +/** + * Log in a guest user. This can be used when the user is not a Twitter user. + * + * This method will not present any UI to the user. + * + * @param completion The completion block will be called after authentication is successful or if there is an error. + * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. + * @warning This method will soon be deprecated; it is no longer needed. Users can use the -[Twitter guestAPIClient] directly without needing to call this method. + */ +- (void)logInGuestWithCompletion:(TWTRGuestLogInCompletion)completion; + +/** + * Triggers user authentication with Twitter given an existing session. + * + * Use this method if you have already authenticated with Twitter and are migrating to TwitterKit. This + * method will verify that the `authToken` and `authTokenSecret` are still valid and log the user in with + * the existing credentials. + * + * @param authToken The existing authToken to use for authentication. + * @param authTokenSecret The existing authTokenSecret to use for authentication. + * @param completion The completion block will be called after authentication is successful or if there is an error. + * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. + * @warning This method will soon be deprecated; for a simpler approach see -[TWTRSessionStore saveSession:completion:]. + */ +- (void)logInWithExistingAuthToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret completion:(TWTRLogInCompletion)completion; + +/** + * Client for consuming the Twitter REST API. + * + * This API client is configured with your consumer key and secret if they are available to the Twitter + * object (either via initialization of the Twitter instance or your application's Info.plist). + * + * @warning To make authenticated requests, you need to call `loginWithCompletion:` + * @warning This method will soon be deprecated. Using this method does not + * give you control over which user you are making request on the behalf of. + * It is recommended that users migrate to using -[TWTRAPIClient initWithUserID:] to have more explicit control. + */ +@property (nonatomic, strong, readonly) TWTRAPIClient *APIClient; + +/** + * Returns the current user session or nil if there is no logged in user. + * + * @return Returns the current user session or nil if there is no logged in user. + * @warning This method will soon be deprecated; it is recommended to use -[TWTRSessionStore session] or -[TWTRSessionStore sessionForUserID:] if they are managing multiple users + */ +- (twtr_nullable TWTRSession *)session; + +/** + * Returns the current guest session or nil if there is no logged in guest. + * + * @return Returns the current guest session or nil if there is no logged in guest. + * @warning This method will soon be deprecated; all network requests will fall back to using a guest session if no user session is provided. + */ +- (twtr_nullable TWTRGuestSession *)guestSession; + +/** + * Deletes the local Twitter user session from this app. This will not remove the system Twitter account nor make a network request to invalidate the session. + * @warning This method will soon be deprecated; users are encouraged to call -[TWTRSessionStore logOutUserID:] instead of calling this method on the Twitter instance directly + */ +- (void)logOut; + +/** + * Deletes the local guest session. Does not make a network request to invalidate the session. + * @warning This method will soon be deprecated; it is no longer needed as the guest authentication is managed by the session store. + */ +- (void)logOutGuest; + +@end + +NS_ASSUME_NONNULL_END diff --git a/TwitterKit.framework/Headers/TwitterKit.h b/TwitterKit.framework/Headers/TwitterKit.h new file mode 100644 index 0000000..30cda3f --- /dev/null +++ b/TwitterKit.framework/Headers/TwitterKit.h @@ -0,0 +1,56 @@ +// +// TwitterKit.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#if __has_feature(modules) +@import Accounts; +@import Foundation; +@import Social; +@import UIKit; +@import TwitterCore; +#if __has_include() +@import DigitsKit; +#endif +#else +#import +#import +#import +#import +#import +#if __has_include() +#import +#endif +#endif + +#if __IPHONE_OS_VERSION_MIN_REQUIRED < 70000 +#error "TwitterKit doesn't support iOS 6.x and lower. Please, change your minimum deployment target to iOS 7.0" +#endif + +#import "Twitter.h" +#import "TWTRAPIClient.h" +#import "TWTRCardConfiguration.h" +#import "TWTRComposerViewController.h" +#import "TWTRCollectionTimelineDataSource.h" +#import "TWTRComposer.h" +#import "TWTRComposerTheme.h" +#import "TWTRListTimelineDataSource.h" +#import "TWTRLogInButton.h" +#import "TWTROAuthSigning.h" +#import "TWTRSearchTimelineDataSource.h" +#import "TWTRShareEmailViewController.h" +#import "TWTRTimelineDataSource.h" +#import "TWTRTimelineType.h" +#import "TWTRTimelineViewController.h" +#import "TWTRTweet.h" +#import "TWTRTweetTableViewCell.h" +#import "TWTRTweetView.h" +#import "TWTRTweetViewDelegate.h" +#import "TWTRUser.h" +#import "TWTRUserTimelineDataSource.h" + +/** + * `TwitterKit` can be used as an element in the array passed to the `+[Fabric with:]`. + */ +#define TwitterKit [Twitter sharedInstance] diff --git a/TwitterKit.framework/Info.plist b/TwitterKit.framework/Info.plist new file mode 100644 index 0000000..a4c523f --- /dev/null +++ b/TwitterKit.framework/Info.plist @@ -0,0 +1,53 @@ + + + + + BuildMachineOSBuild + 14F27 + CFBundleDevelopmentRegion + English + CFBundleGetInfoString + Twitter Kit Framework + CFBundleIdentifier + com.twitter.sdk.ios + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + TwitterKit + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.12.0 + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleVersion + 1.12.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 13A340 + DTPlatformName + iphoneos + DTPlatformVersion + 9.0 + DTSDKBuild + 13A340 + DTSDKName + iphoneos9.0 + DTXcode + 0700 + DTXcodeBuild + 7A220 + MinimumOSVersion + 7.0 + NSHumanReadableCopyright + Copyright 2014 Twitter Inc. + UIDeviceFamily + + 1 + 2 + + + diff --git a/TwitterKit.framework/Modules/module.modulemap b/TwitterKit.framework/Modules/module.modulemap new file mode 100644 index 0000000..0d49474 --- /dev/null +++ b/TwitterKit.framework/Modules/module.modulemap @@ -0,0 +1,29 @@ +framework module TwitterKit { + umbrella header "TwitterKit.h" + + export * + module * { export * } + + header "TWTRAPIClient.h" + header "TWTRCardConfiguration.h" + header "TWTRCollectionTimelineDataSource.h" + header "TWTRComposer.h" + header "TWTRComposerTheme.h" + header "TWTRComposerViewController.h" + header "TWTRListTimelineDataSource.h" + header "TWTRLogInButton.h" + header "TWTROAuthSigning.h" + header "TWTRSearchTimelineDataSource.h" + header "TWTRShareEmailViewController.h" + header "TWTRTimelineDataSource.h" + header "TWTRTimelineType.h" + header "TWTRTimelineViewController.h" + header "TWTRTweet.h" + header "TWTRTweetTableViewCell.h" + header "TWTRTweetView.h" + header "TWTRTweetViewDelegate.h" + header "TWTRUser.h" + header "TWTRUserTimelineDataSource.h" + header "Twitter.h" + header "TwitterKit.h" +} diff --git a/TwitterKit.framework/Resources b/TwitterKit.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/TwitterKit.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/TwitterKit.framework/TwitterKit b/TwitterKit.framework/TwitterKit new file mode 100755 index 0000000..ad212a9 Binary files /dev/null and b/TwitterKit.framework/TwitterKit differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom new file mode 100644 index 0000000..a9a786b Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist new file mode 100644 index 0000000..45677dc Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings new file mode 100644 index 0000000..af13dc5 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings new file mode 100644 index 0000000..9dfdfa7 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings new file mode 100644 index 0000000..78ec76c Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings new file mode 100644 index 0000000..9cf51eb Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings new file mode 100644 index 0000000..7fc71c4 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare.png new file mode 100644 index 0000000..ebaa1eb Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@2x.png new file mode 100644 index 0000000..2546629 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@3x.png new file mode 100644 index 0000000..18defd7 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings new file mode 100644 index 0000000..9ec5868 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings new file mode 100644 index 0000000..0bdac53 --- /dev/null +++ b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings @@ -0,0 +1,82 @@ +/* Label for button to bring up share dialog to share this Tweet in a single Tweet view */ +"tw__share_tweet" = "Share Tweet"; +/* Subject format used to prefill certain sharing options such as Email includes full name (%1$@) and screenname (%2$@) */ +"tw__share_tweet_subject_format" = "Tweet from %1$@ (@%2$@)"; +/* Generic share text format used in all sharing options includes screenname (%1$@) and URL to the Tweet (%2$@) */ +"tw__share_tweet_generic_template_format" = "Check out @%1$@\'s Tweet: %2$@"; +/* Label for Sign in with Twitter button */ +"tw__sign_in_with_twitter_button" = "Log in with Twitter"; +/* Label Email Share Screen negative button */ +"tw__email_share_negative_button" = "Not now"; +/* Label Email Share Screen affirmative button */ +"tw__email_share_affirmative_button" = "Allow"; +/* Heading that appears above the detail message on the share your email screen */ +"tw__email_share_heading" = "Share your email address"; +/* Detail message that includes the app name and username on the share your email screen */ +"tw__email_share_detail_message_format" = "Get updates and other information from %@ when you allow them access to your email on your Twitter account @%@."; +/* Fallback string for detail message in case the app name is not available */ +"tw__email_share_detail_message_this_app" = "this app"; +/* Fallback string for detail message in case the user is not signed in */ +"tw__email_share_detail_message_not_signed_in" = "(not signed in)"; +/* Label for attributing this Tweet was retweeted by the user %@ */ +"tw__tweet_retweeted_by_user" = "Retweeted by %@"; +/* Label for the Install button within the app promo card preview of the Tweet composer */ +"tw__card_composer_install_button" = "Install"; +/* Label for the post tweet button in the compose view */ +"tw__card_composer_tweet" = "Tweet"; +/* Label for the App Store subtitle on the card install preview */ +"tw__card_composer_app_store" = "App Store"; +/* Placeholder text for the composer */ +"tw__composer_placeholder_text" = "What's Happening?"; + + +/* Timestamps */ + +/* Really short abbreviation for days (plural). 5 days would be '5d' */ +"TIME_SHORT_DAYS_FORMAT" = "%dd"; +/* Really short abbreviation for day (singular). 1 day would be '1d' */ +"TIME_SHORT_DAY_FORMAT" = "%dd"; +/* Really short abbreviation for hours (plural). 5 hours would be '5h' */ +"TIME_SHORT_HOURS_FORMAT" = "%dh"; +/* Really short abbreviation for hour (singular). 1 hour would be '1h' */ +"TIME_SHORT_HOUR_FORMAT" = "%dh"; +/* Really short abbreviation for minutes (plural). 5 minutes would be '5m' */ +"TIME_SHORT_MINUTES_FORMAT" = "%dm"; +/* Really short abbreviation for minute (singular). 1 minute would be '1m' */ +"TIME_SHORT_MINUTE_FORMAT" = "%dm"; +/* Really short abbreviation for seconds (plural). 5 seconds would be '5s' */ +"TIME_SHORT_SECONDS_FORMAT" = "%ds"; +/* Really short abbreviation for second (singular). '1s' */ +"TIME_SHORT_SECOND_FORMAT" = "%ds"; + +/* Accessibility Labels */ + +/* Text spoken out with VoiceOver when a tweet has an image showing */ +"tw__single_image" = "One image attached"; +/* Text spoken out with VoiceOver for selecting the profile image on a regular tweet view */ +"tw__tweet_profile_accessibility" = "Profile"; +/* Text spoken out with VoiceOver for selecting the attached image on a regular tweet view */ +"tw__tweet_image_accessibility" = "Attachment"; +/* Text spoken out with VoiceOver for the content image of the card composer preview */ +"tw__user_content_image" = "App Preview"; +/* Text spoken out with VoiceOver for the Install button preview in card composer previews */ +"tw__card_compose_install_preview" = "Preview of install button for %@"; +/* Text spoken as VoiceOver hint for Tweet button in the card composer bottom bar */ +"tw__card_compose_tweet_hint" = "Double-tap to post this Tweet"; +/* Text spoken out with VoiceOver for the remaining character count in composer bottom bar */ +"tw__card_compose_character_count" = "%td characters remaining"; +/* Text spoken out with VoiceOver for the profile image in the composer top bar */ +"tw__card_compose_profile_image" = "%@'s profile"; +/* Text spoken out with VoiceOver for the close button in the card composer top bar */ +"tw__card_compose_close_button" = "Close"; +/* Text spoken out as VoiceOver hint for the close button in the card composer top bar */ +"tw__card_compose_close_hint" = "Double-tap to dismiss the composer."; +/* VoiceOver label for Favorite button */ +"tw__tweet_favorite_button" = "Favorite"; +/* VoiceOver value for Favorite button on Tweet that has been favorited */ +"tw__tweet_favorited_state" = "Favorited"; +/* VoiceOver value for Favorite button on Tweet that has not yet been favorited */ +"tw__tweet_not_favorited_state" = "Not Favorited"; + +/* Test String (just for unit tests) */ +"tw__test_string" = "Test"; diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings new file mode 100644 index 0000000..ee7e2da Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings new file mode 100644 index 0000000..f61f728 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings new file mode 100644 index 0000000..c9e65e0 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings new file mode 100644 index 0000000..7310c7d Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings new file mode 100644 index 0000000..1474a79 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings new file mode 100644 index 0000000..b4ee5c6 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings new file mode 100644 index 0000000..7ec0244 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close.png new file mode 100644 index 0000000..93943d9 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close@2x.png new file mode 100644 index 0000000..8fd4fa2 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close@3x.png new file mode 100644 index 0000000..c3dfde3 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/icn_close@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings new file mode 100644 index 0000000..3f8dd29 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings new file mode 100644 index 0000000..a1786fd Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings new file mode 100644 index 0000000..aa83175 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings new file mode 100644 index 0000000..36943a5 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings new file mode 100644 index 0000000..3b67145 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings new file mode 100644 index 0000000..aedc679 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings new file mode 100644 index 0000000..19ef98f Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings new file mode 100644 index 0000000..06ad010 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings new file mode 100644 index 0000000..4671509 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings new file mode 100644 index 0000000..f92e26b Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings new file mode 100644 index 0000000..297250c Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings new file mode 100644 index 0000000..f5dde8b Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings new file mode 100644 index 0000000..e704942 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings new file mode 100644 index 0000000..e87e125 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings new file mode 100644 index 0000000..1ecc0fa Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off.png new file mode 100644 index 0000000..59d80d2 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png new file mode 100644 index 0000000..e5c005d Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png new file mode 100644 index 0000000..04923e8 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on.png new file mode 100644 index 0000000..022f382 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png new file mode 100644 index 0000000..5a13e7d Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png new file mode 100644 index 0000000..1555e63 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png new file mode 100644 index 0000000..b7e4f7c Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png new file mode 100644 index 0000000..bbfbee7 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png new file mode 100644 index 0000000..3074978 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo.png new file mode 100644 index 0000000..ea6f7cd Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png new file mode 100644 index 0000000..2c17c4d Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png new file mode 100644 index 0000000..b969d88 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png new file mode 100644 index 0000000..2f2d32e Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png new file mode 100644 index 0000000..61692b4 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png new file mode 100644 index 0000000..4dda258 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png new file mode 100644 index 0000000..745d9b6 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png new file mode 100644 index 0000000..6033368 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png new file mode 100644 index 0000000..0707a13 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png new file mode 100644 index 0000000..74d94a2 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png new file mode 100644 index 0000000..f783dbe Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png new file mode 100644 index 0000000..31a34ee Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share.png new file mode 100644 index 0000000..c60931d Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share@2x.png new file mode 100644 index 0000000..7c31f92 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share@3x.png new file mode 100644 index 0000000..d3942ca Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-share@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png new file mode 100644 index 0000000..40d6a35 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png new file mode 100644 index 0000000..0bfc026 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png new file mode 100644 index 0000000..8dc8747 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png new file mode 100644 index 0000000..ad4c4b4 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png new file mode 100644 index 0000000..47ea38b Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png new file mode 100644 index 0000000..db471c6 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings new file mode 100644 index 0000000..de69162 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings new file mode 100644 index 0000000..74eb578 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings new file mode 100644 index 0000000..acad68a Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..63ff637 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings new file mode 100644 index 0000000..d0d5cb9 Binary files /dev/null and b/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings differ diff --git a/TwitterKit.framework/Versions/Current b/TwitterKit.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/TwitterKit.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/TwitterPhotoCell.xib b/TwitterPhotoCell.xib new file mode 100644 index 0000000..94c5e16 --- /dev/null +++ b/TwitterPhotoCell.xib @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TwitterPhotoCellController.swift b/TwitterPhotoCellController.swift new file mode 100644 index 0000000..346dc28 --- /dev/null +++ b/TwitterPhotoCellController.swift @@ -0,0 +1,93 @@ +// +// TwitterPhotoCellController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TwitterPhotoCellController: UITableViewCell { + + var parent : UITableViewController! + + + @IBOutlet weak var postBackgroundImage: UIImageView! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + @IBOutlet weak var lineSeparator: UIView! + + var VC : CommentsController! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + //self.postBackgroundImage.image = UIImage(named: "vinebackground") + + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + configureText() + lineHeight.constant = CGFloat(0.5) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + lineSeparator.backgroundColor = UIColor.whiteColor() + // Configure the view for the selected state + } + + override func setHighlighted(highlighted: Bool, animated: Bool) { + lineSeparator.backgroundColor = UIColor.whiteColor() + } + + //MARK: Actions + + @IBAction func enlarge(sender: UIButton) { + VC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("Comments") as! CommentsController + VC.postHeight = self.contentView.frame.height + self.window?.rootViewController?.presentViewController(VC, animated: true, completion: nil) + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + } + + func configureText() { + var user = "Smith " + var userMutableString = NSMutableAttributedString() + userMutableString = NSMutableAttributedString(string: user, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionOne = "retweeted " + var sectionOneMutableString = NSMutableAttributedString() + sectionOneMutableString = NSMutableAttributedString(string: sectionOne, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var author = "Johnny" + var authorMutableString = NSMutableAttributedString() + authorMutableString = NSMutableAttributedString(string: author, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionTwo = "'s post on " + var sectionTwoMutableString = NSMutableAttributedString() + sectionTwoMutableString = NSMutableAttributedString(string: sectionTwo, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var network = "Twitter" + var networkMutableString = NSMutableAttributedString() + networkMutableString = NSMutableAttributedString(string: network, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + + userMutableString.appendAttributedString(sectionOneMutableString) + userMutableString.appendAttributedString(authorMutableString) + userMutableString.appendAttributedString(sectionTwoMutableString) + userMutableString.appendAttributedString(networkMutableString) + statusText.attributedText = userMutableString + } + +} diff --git a/TwitterProfileTableViewController.swift b/TwitterProfileTableViewController.swift new file mode 100644 index 0000000..eecedac --- /dev/null +++ b/TwitterProfileTableViewController.swift @@ -0,0 +1,126 @@ +// +// TwitterProfileTableViewController.swift +// comblie +// +// Created by Cal on 10/22/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TwitterProfileTableViewController: UITableViewController { + + var currentCell : UITableViewCell! + + override func viewDidLoad() { + super.viewDidLoad() + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + self.tableView.registerNib(UINib(nibName: "TwitterPhotoCell", bundle: nil), forCellReuseIdentifier: "TwitterPhoto") + self.tableView.registerNib(UINib(nibName: "TwitterTweetCell", bundle: nil), forCellReuseIdentifier: "TwitterTweet") + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - Table view data source + + override func tableView(tableView: UITableView, var willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { + //print(cells.val) + //print(cells.parent) + //print(cells.row) + print(cell.frame.height) + } + + override func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // #warning Incomplete implementation, return the number of rows + return 3 + } + + override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 44 + } + + + override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + if (indexPath.row == 0) { + let cell = tableView.dequeueReusableCellWithIdentifier("TwitterHeader", forIndexPath: indexPath) + currentCell = cell + }else if (indexPath.row == 1){ + let cell = tableView.dequeueReusableCellWithIdentifier("TwitterPhoto", forIndexPath: indexPath) + currentCell = cell + } else { + let cell = tableView.dequeueReusableCellWithIdentifier("TwitterTweet", forIndexPath: indexPath) as! TwitterTweetCellController + /*cell.retweetTextHeight.constant = CGFloat(0) + cell.val = 2 + cell.row = indexPath*/ + cell.parent = self + currentCell = cell + } + // Configure the cell... + + + return currentCell + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/TwitterTweetCell.xib b/TwitterTweetCell.xib new file mode 100644 index 0000000..eaaf990 --- /dev/null +++ b/TwitterTweetCell.xib @@ -0,0 +1,272 @@ + + + + + + + + + HelveticaNeue-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TwitterTweetCellController.swift b/TwitterTweetCellController.swift new file mode 100644 index 0000000..7f4e9fb --- /dev/null +++ b/TwitterTweetCellController.swift @@ -0,0 +1,118 @@ +// +// TwitterTweetCellController.swift +// comblie +// +// Created by Cal on 10/28/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class TwitterTweetCellController: UITableViewCell, UINavigationBarDelegate { + + var parent : UITableViewController! + //var row : NSIndexPath! + + // MARK: Properties + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postAuthor: UILabel! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var postTime: UILabel! + @IBOutlet weak var lineSeparator: UIView! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + @IBOutlet weak var retweetTextHeight: NSLayoutConstraint! + @IBOutlet weak var timeAgo: UILabel! + @IBOutlet weak var retweetButton: UIButton! + @IBOutlet weak var retweetCountLabel: UILabel! + @IBOutlet weak var likeButton: UIButton! + @IBOutlet weak var likeCountLabel: UILabel! + + var VC : CommentsController! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + self.lineHeight.constant = CGFloat(0.5) + // Set the post texts + configurePostText() + configurePostAuthor() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + lineSeparator.backgroundColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 1) + // Configure the view for the selected state + } + + override func setHighlighted(highlighted: Bool, animated: Bool) { + lineSeparator.backgroundColor = UIColor(red: 225/255, green: 225/255, blue: 225/255, alpha: 1) + } + + //MARK: Actions + + + @IBAction func enlarge(sender: UIButton) { + VC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("Comments") as! CommentsController + VC.postHeight = self.contentView.frame.height + self.window?.rootViewController?.presentViewController(VC, animated: true, completion: nil) + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + + } + + @IBAction func a(sender: UIButton) { + //UPDATES MAIN TABLE VIEW LIVE + + //self.parent.tableView.beginUpdates() + //self.retweetTextHeight.constant = CGFloat(0.0) + /*self.postText.numberOfLines = 1 + self.parent.tableView.reloadRowsAtIndexPaths([row], withRowAnimation: UITableViewRowAnimation.None) + //self.parent.tableView.endUpdates()*/ + + } + + func openProfile() { + let profileView = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("PublicProfile") + self.parent.parentViewController!.navigationController?.pushViewController(profileView!, animated: true) + } + + func configurePostText() { + var post = "Meek Mill just released a Drake diss track" + var postMutableString = NSMutableAttributedString() + postMutableString = NSMutableAttributedString(string: post, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Roman", + size: 13.0)!]) + + var hashtag = "#fire" + var hashtagMutableString = NSMutableAttributedString() + hashtagMutableString = NSMutableAttributedString(string: hashtag, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Medium", + size: 13.0)!]) + + postMutableString.appendAttributedString(hashtagMutableString) + self.postText.attributedText = postMutableString + } + + func configurePostAuthor() { + var name = "David Beckham " + var nameMutableString = NSMutableAttributedString() + nameMutableString = NSMutableAttributedString(string: name, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Medium", + size: 13.0)!]) + + var alias = "@officialbeckham" + var aliasMutableString = NSMutableAttributedString() + aliasMutableString = NSMutableAttributedString(string: alias, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Light", + size: 12.5)!]) + + nameMutableString.appendAttributedString(aliasMutableString) + self.postAuthor.attributedText = nameMutableString + // if labelView is not set userInteractionEnabled, you must do so + self.postAuthor.userInteractionEnabled = true + self.postAuthor.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "openProfile")) + + } + +} diff --git a/VineFeedCell.xib b/VineFeedCell.xib new file mode 100644 index 0000000..0747cd6 --- /dev/null +++ b/VineFeedCell.xib @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VineFeedCellController.swift b/VineFeedCellController.swift new file mode 100644 index 0000000..39dd17a --- /dev/null +++ b/VineFeedCellController.swift @@ -0,0 +1,101 @@ +// +// VineFeedCellController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class VineFeedCellController: UITableViewCell { + + @IBOutlet weak var postBackgroundImage: UIImageView! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + @IBOutlet weak var lineSeparator: UIView! + @IBOutlet weak var postedTime: UILabel! + + var VC : VineVideoModalController! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + configureText() + lineHeight.constant = CGFloat(0.5) + } + + + //MARK: Actions + + @IBAction func enlarge(sender: UIButton) { + VC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("VineModal") as! VineVideoModalController + //For keeping the opacity + VC.providesPresentationContextTransitionStyle = true + VC.definesPresentationContext = true + VC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext + self.window?.rootViewController?.presentViewController(VC, animated: true, completion: setModal) + } + + func setModal() { + VC.thumbnailImage.image = self.postBackgroundImage.image + VC.profileImage.image = self.profileImage.image + VC.postText.text = self.postText.text + VC.statusText.attributedText = self.statusText.attributedText + VC.playButton.setBackgroundImage(UIImage(named: "playArrow"), forState: .Normal) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + lineSeparator.backgroundColor = UIColor.whiteColor() + // Configure the view for the selected state + } + + override func setHighlighted(highlighted: Bool, animated: Bool) { + lineSeparator.backgroundColor = UIColor.whiteColor() + } + + func configureText() { + var user = "Jaden Smith " + var userMutableString = NSMutableAttributedString() + userMutableString = NSMutableAttributedString(string: user, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionOne = "revined " + var sectionOneMutableString = NSMutableAttributedString() + sectionOneMutableString = NSMutableAttributedString(string: sectionOne, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var author = "David" + var authorMutableString = NSMutableAttributedString() + authorMutableString = NSMutableAttributedString(string: author, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + var sectionTwo = "'s post on " + var sectionTwoMutableString = NSMutableAttributedString() + sectionTwoMutableString = NSMutableAttributedString(string: sectionTwo, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Lt", + size: 10.0)!]) + + var network = "Vine" + var networkMutableString = NSMutableAttributedString() + networkMutableString = NSMutableAttributedString(string: network, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 10.0)!]) + + + userMutableString.appendAttributedString(sectionOneMutableString) + userMutableString.appendAttributedString(authorMutableString) + userMutableString.appendAttributedString(sectionTwoMutableString) + userMutableString.appendAttributedString(networkMutableString) + statusText.attributedText = userMutableString + } + +} diff --git a/VineFeedDatasource.swift b/VineFeedDatasource.swift new file mode 100644 index 0000000..f0981a7 --- /dev/null +++ b/VineFeedDatasource.swift @@ -0,0 +1,46 @@ +// +// VineFeedDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class VineFeedDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + + var isProfile : Bool + + init(tableView : UITableView, isProfile : Bool) { + self.isProfile = isProfile + self.items = ["a","a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "VineFeedCell", bundle: nil), forCellReuseIdentifier: "VineFeed") + self.tableView.registerNib(UINib(nibName: "VineHeaderCell", bundle: nil), forCellReuseIdentifier: "VineHeader") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + // Configure the cell... + if (isProfile && indexPath.row == 0) { + currentCell = tableView.dequeueReusableCellWithIdentifier("VineHeader", forIndexPath: indexPath) + } else { + currentCell = tableView.dequeueReusableCellWithIdentifier("VineFeed", forIndexPath: indexPath) as! VineFeedCellController + } + + return currentCell + } +} diff --git a/VineFeedTableViewController.swift b/VineFeedTableViewController.swift new file mode 100644 index 0000000..378aef4 --- /dev/null +++ b/VineFeedTableViewController.swift @@ -0,0 +1,88 @@ +// +// VineFeedTableViewController.swift +// comblie +// +// Created by Cal on 10/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class VineFeedTableViewController: UITableViewController { + + var dataSource : VineFeedDatasource! + var isProfile : Bool! + + override func viewDidLoad() { + super.viewDidLoad() + if (self.restorationIdentifier?.rangeOfString("Feed") != nil) { + self.isProfile = false + } else { + self.isProfile = true + } + + // READS DATASOURCE HERE + self.dataSource = VineFeedDatasource(tableView: self.tableView, isProfile: self.isProfile) + self.tableView.dataSource = self.dataSource + + self.tableView.delegate = self + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + self.tableView.allowsSelection = false + + } + + + /*override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 44 + } + + + + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + + + + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/VineHeaderCell.xib b/VineHeaderCell.xib new file mode 100644 index 0000000..70c235d --- /dev/null +++ b/VineHeaderCell.xib @@ -0,0 +1,217 @@ + + + + + + + + + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/VineHeaderTableViewCell.swift b/VineHeaderTableViewCell.swift new file mode 100644 index 0000000..80c1062 --- /dev/null +++ b/VineHeaderTableViewCell.swift @@ -0,0 +1,32 @@ +// +// VineHeaderTableViewCell.swift +// comblie +// +// Created by Cal on 10/23/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class VineHeaderTableViewCell: UITableViewCell { + + + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var profileImageBackground: UIView! + + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + + self.profileImageBackground.layer.cornerRadius = CGFloat(self.profileImageBackground.frame.height/2) + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/VineLoginController.swift b/VineLoginController.swift new file mode 100644 index 0000000..d5a89b5 --- /dev/null +++ b/VineLoginController.swift @@ -0,0 +1,77 @@ +// +// VineLoginController.swift +// comblie +// +// Created by Cal on 10/20/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit +import Alamofire +import SwiftyJSON + +class VineLoginController: UIViewController { + + @IBOutlet weak var loginButton: UIButton! + @IBOutlet weak var username: UITextField! + @IBOutlet weak var password: UITextField! + let vine = vineData + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + styleLoginPage() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @IBAction func login(sender: UIButton) { + let email = username.text! + let pass = password.text! + vineLogin(email, password: pass) + + } + + func vineLogin(username: String, password: String){ + let url = "https://api.vineapp.com/users/authenticate" + let headers = ["username": "trevorwhall@gmail.com", + "password": "Teamlove1"] + Alamofire.request(.POST, url, parameters: headers).response { request, response, data, error in + if(error != nil){ + print("error = ", error) + } else { + let dataJson = JSON(data: data!) + print(dataJson) + self.vine.setNetworkInfo(dataJson["data"]["key"].stringValue, userId: dataJson["data"]["userId"].stringValue) + self.vineNotification() + } + } + } + + func vineNotification () { + let notificationKey: String = "VineSuccess" + NSNotificationCenter.defaultCenter().postNotificationName(notificationKey, object: self) + self.dismissViewControllerAnimated(true, completion: nil) + } + + func styleLoginPage() { + loginButton.layer.cornerRadius = CGFloat(5.0) + } + + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/VineProfileTableViewController.swift b/VineProfileTableViewController.swift new file mode 100644 index 0000000..ca75850 --- /dev/null +++ b/VineProfileTableViewController.swift @@ -0,0 +1,91 @@ +// +// VineProfileTableViewController.swift +// comblie +// +// Created by Cal on 10/23/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class VineProfileTableViewController: UITableViewController { + + var dataSource : VineFeedDatasource! + var isProfile : Bool + + init(isProfile : Bool) { + self.isProfile = isProfile + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + self.isProfile = false + super.init(coder: aDecoder) + } + + override func viewDidLoad() { + super.viewDidLoad() + + // READS DATASOURCE HERE + dataSource = VineFeedDatasource(tableView: self.tableView, isProfile: true) + self.tableView.dataSource = dataSource + + self.tableView.delegate = self + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" + + } + + override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 44 + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/VineVideoModalController.swift b/VineVideoModalController.swift new file mode 100644 index 0000000..22eacd9 --- /dev/null +++ b/VineVideoModalController.swift @@ -0,0 +1,44 @@ +// +// VineVideoModalController.swift +// comblie +// +// Created by Cal on 11/5/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class VineVideoModalController: UIViewController { + + @IBOutlet weak var thumbnailImage: UIImageView! + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var postText: UILabel! + @IBOutlet weak var statusText: UILabel! + @IBOutlet weak var playButton: UIButton! + @IBOutlet weak var lineHeight: NSLayoutConstraint! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + self.lineHeight.constant = CGFloat(0.5) + } + + //MARK: Actions + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/WebsiteController.swift b/WebsiteController.swift new file mode 100644 index 0000000..8d7d7b2 --- /dev/null +++ b/WebsiteController.swift @@ -0,0 +1,65 @@ +// +// WebsiteController.swift +// comblie +// +// Created by Cal on 11/11/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class WebsiteController: UIViewController { + + @IBOutlet weak var webView: UIWebView! + @IBOutlet weak var topSeparatorHeight: NSLayoutConstraint! + @IBOutlet weak var bottomSeparatorHeight: NSLayoutConstraint! + + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + self.topSeparatorHeight.constant = CGFloat(0.5) + self.bottomSeparatorHeight.constant = CGFloat(0.5) + + let URL = NSURL(string: "http://www.comblie.com") + let requestObj = NSURLRequest(URL: URL!) + self.webView.loadRequest(requestObj) + } + + //MARK: Actions + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + @IBAction func webBack(sender: UIButton) { + if self.webView.canGoBack == true { + self.webView.goBack() + } + } + + @IBAction func webForward(sender: UIButton) { + if self.webView.canGoForward == true { + self.webView.goForward() + } + } + + @IBAction func webRefresh(sender: UIButton) { + self.webView.reload() + } + + @IBAction func webUpload(sender: UIButton) { + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie.xcodeproj/project.pbxproj b/comblie.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f51ea77 --- /dev/null +++ b/comblie.xcodeproj/project.pbxproj @@ -0,0 +1,2617 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2E0064291BC65F1B004C5BBF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0064281BC65F1B004C5BBF /* AppDelegate.swift */; }; + 2E00642B1BC65F1B004C5BBF /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E00642A1BC65F1B004C5BBF /* HomeViewController.swift */; }; + 2E00642E1BC65F1B004C5BBF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2E00642C1BC65F1B004C5BBF /* Main.storyboard */; }; + 2E0064301BC65F1B004C5BBF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2E00642F1BC65F1B004C5BBF /* Assets.xcassets */; }; + 2E0064331BC65F1B004C5BBF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2E0064311BC65F1B004C5BBF /* LaunchScreen.storyboard */; }; + 2E00643E1BC65F1B004C5BBF /* comblieTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E00643D1BC65F1B004C5BBF /* comblieTests.swift */; }; + 2E0064491BC65F1B004C5BBF /* comblieUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0064481BC65F1B004C5BBF /* comblieUITests.swift */; }; + 2E0064571BC66E19004C5BBF /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0064561BC66E19004C5BBF /* LoginViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E0064611BC731EA004C5BBF /* RegistrationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0064601BC731EA004C5BBF /* RegistrationViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E0256C51BCB84CE009490C2 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0256C41BCB84CE009490C2 /* MainViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E0256C71BCB934A009490C2 /* SocialLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0256C61BCB934A009490C2 /* SocialLoginViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E0A88F91BE84BB6009FB358 /* TwitterTweetCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E0A88F81BE84BB6009FB358 /* TwitterTweetCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2E0A88FB1BE84D17009FB358 /* TumblrPhotoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E0A88FA1BE84D17009FB358 /* TumblrPhotoCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2E0A88FD1BE890FE009FB358 /* TumblrBlogCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E0A88FC1BE890FE009FB358 /* TumblrBlogCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2E0A88FF1BE8964A009FB358 /* InstagramFeedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E0A88FE1BE8964A009FB358 /* InstagramFeedCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2E0A89011BE899B8009FB358 /* TwitterPhotoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E0A89001BE899B8009FB358 /* TwitterPhotoCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2E0A89041BE993A5009FB358 /* SettingsPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0A89031BE993A5009FB358 /* SettingsPageController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E0E3C851BEFDFBE001CAA05 /* CommentCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0E3C841BEFDFBE001CAA05 /* CommentCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E155E2C1BD85EA100868F2C /* MessageRoomViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E155E2B1BD85EA100868F2C /* MessageRoomViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E155E321BD8636800868F2C /* MessageRoomTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E155E311BD8636800868F2C /* MessageRoomTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E16A3991BEF08A500A44104 /* InstagramModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E16A3981BEF08A500A44104 /* InstagramModalController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E1CD2301BEFD8A200418C02 /* CommentCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E1CD22F1BEFD8A200418C02 /* CommentCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2E1E73441BFD8D6B009F26F9 /* AllFeedDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E1E73431BFD8D6B009F26F9 /* AllFeedDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2E30C2821BE0A5990001CB87 /* InstagramPhotoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E30C2811BE0A5990001CB87 /* InstagramPhotoCell.swift */; settings = {ASSET_TAGS = (); }; }; + 2E380B971BDDA32C00803B8C /* IncomingMessageCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E380B961BDDA32C00803B8C /* IncomingMessageCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E380B991BDDA69600803B8C /* OutgoingMessageCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E380B981BDDA69600803B8C /* OutgoingMessageCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E3C9B2E1BEB1FF900A7C86F /* TermsConditionsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E3C9B2D1BEB1FF900A7C86F /* TermsConditionsController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E3CDBF81BDC63B500C8C49D /* InstagramFeedCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E3CDBF71BDC63B500C8C49D /* InstagramFeedCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E45ECBA1BD9FE2D00AF1F18 /* FacebookProfileTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E45ECB91BD9FE2D00AF1F18 /* FacebookProfileTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E45ECBC1BDA038300AF1F18 /* FacebookHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E45ECBB1BDA038300AF1F18 /* FacebookHeaderTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; + 2E45ECBF1BDA08AD00AF1F18 /* TwitterHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E45ECBE1BDA08AD00AF1F18 /* TwitterHeaderTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; + 2E45ECC11BDA08C700AF1F18 /* TwitterProfileTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E45ECC01BDA08C700AF1F18 /* TwitterProfileTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E4D7F891BD375F50025A0A1 /* NotificationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E4D7F881BD375F50025A0A1 /* NotificationCell.swift */; settings = {ASSET_TAGS = (); }; }; + 2E4E90FA1BE9AFD900C3D780 /* SettingsTableController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E4E90F91BE9AFD900C3D780 /* SettingsTableController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E556A431BCCEF2500623A80 /* ProfilePageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E556A421BCCEF2500623A80 /* ProfilePageController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E5EBCF51BE368C400B646BA /* FacebookStatusCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E5EBCF41BE368C400B646BA /* FacebookStatusCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E5EBCF71BE43B6500B646BA /* TumblrBlogCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E5EBCF61BE43B6500B646BA /* TumblrBlogCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E5EBCF91BE7EC2F00B646BA /* TumblrPhotoCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E5EBCF81BE7EC2F00B646BA /* TumblrPhotoCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E5EBCFB1BE845C400B646BA /* VineFeedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2E5EBCFA1BE845C400B646BA /* VineFeedCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2E5EBCFE1BE847F900B646BA /* AllFeedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E5EBCFD1BE847F900B646BA /* AllFeedTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E799B411BEF10FF0030803B /* CommentsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E799B401BEF10FF0030803B /* CommentsController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E7A7A1B1BD7074B00A3CB7F /* VineLoginController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E7A7A1A1BD7074B00A3CB7F /* VineLoginController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E8030881BEAE90500A8069C /* PushNotificationsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8030871BEAE90500A8069C /* PushNotificationsController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E80308A1BEAF90000A8069C /* ReportProblemController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8030891BEAF90000A8069C /* ReportProblemController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E81062E1BDA2D32005577F6 /* TumblrHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E81062D1BDA2D32005577F6 /* TumblrHeaderTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; + 2E8106301BDA2D43005577F6 /* TumblrProfileTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E81062F1BDA2D43005577F6 /* TumblrProfileTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E8106321BDA2D51005577F6 /* VineProfileTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8106311BDA2D51005577F6 /* VineProfileTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E8106361BDA34B3005577F6 /* VineHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8106351BDA34B3005577F6 /* VineHeaderTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; + 2E86DC401C0E7BE5001C62CF /* ComposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E86DC3F1C0E7BE5001C62CF /* ComposeViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E935F531BDC1ECE003E55AD /* FacebookFeedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E935F521BDC1ECE003E55AD /* FacebookFeedTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E935F551BDC1EEB003E55AD /* TwitterFeedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E935F541BDC1EEB003E55AD /* TwitterFeedTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E935F571BDC1EF5003E55AD /* InstagramFeedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E935F561BDC1EF5003E55AD /* InstagramFeedTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E935F591BDC1EFF003E55AD /* TumblrFeedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E935F581BDC1EFF003E55AD /* TumblrFeedTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E935F5B1BDC1F08003E55AD /* VineFeedTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E935F5A1BDC1F08003E55AD /* VineFeedTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E935F611BDC2558003E55AD /* VineFeedCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E935F601BDC2558003E55AD /* VineFeedCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E96A24B1BF1F880000DB006 /* PrivacyPolicyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E96A24A1BF1F880000DB006 /* PrivacyPolicyController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E96A24D1BF27AF4000DB006 /* NetworkSettingsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E96A24C1BF27AF4000DB006 /* NetworkSettingsController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E9971571BEC1452004B75C4 /* VineVideoModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9971561BEC1452004B75C4 /* VineVideoModalController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E99EFBB1BD1E1AD00938B04 /* ConversationTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E99EFBA1BD1E1AD00938B04 /* ConversationTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E99EFBE1BD1E27300938B04 /* NotificationTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E99EFBD1BD1E27300938B04 /* NotificationTableViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E99EFC21BD220E600938B04 /* ConversationCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E99EFC11BD220E600938B04 /* ConversationCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E9B580E1BFE5D7A00613C7F /* TumblrPhotoModalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E9B580D1BFE5D7A00613C7F /* TumblrPhotoModalController.swift */; settings = {ASSET_TAGS = (); }; }; + 2E9E36001BD30E19008DE8B0 /* Helvetica Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34BF1BD30E19008DE8B0 /* Helvetica Bold.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36011BD30E19008DE8B0 /* Helvetica-Black-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C01BD30E19008DE8B0 /* Helvetica-Black-SemiBold.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36021BD30E19008DE8B0 /* Helvetica-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C11BD30E19008DE8B0 /* Helvetica-Black.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36031BD30E19008DE8B0 /* Helvetica-BlackOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C21BD30E19008DE8B0 /* Helvetica-BlackOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36041BD30E19008DE8B0 /* Helvetica-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C31BD30E19008DE8B0 /* Helvetica-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36051BD30E19008DE8B0 /* Helvetica-BoldOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C41BD30E19008DE8B0 /* Helvetica-BoldOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36061BD30E19008DE8B0 /* Helvetica-Compressed.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C51BD30E19008DE8B0 /* Helvetica-Compressed.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36071BD30E19008DE8B0 /* Helvetica-Condensed-Black-Se.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C61BD30E19008DE8B0 /* Helvetica-Condensed-Black-Se.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36081BD30E19008DE8B0 /* Helvetica-Condensed-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C71BD30E19008DE8B0 /* Helvetica-Condensed-Black.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36091BD30E19008DE8B0 /* Helvetica-Condensed-BlackObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C81BD30E19008DE8B0 /* Helvetica-Condensed-BlackObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E360A1BD30E19008DE8B0 /* Helvetica-Condensed-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34C91BD30E19008DE8B0 /* Helvetica-Condensed-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E360B1BD30E19008DE8B0 /* Helvetica-Condensed-BoldObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34CA1BD30E19008DE8B0 /* Helvetica-Condensed-BoldObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E360C1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Li.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34CB1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Li.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E360D1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34CC1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Light.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E360E1BD30E19008DE8B0 /* Helvetica-Condensed-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34CD1BD30E19008DE8B0 /* Helvetica-Condensed-Light.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E360F1BD30E19008DE8B0 /* Helvetica-Condensed-LightObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34CE1BD30E19008DE8B0 /* Helvetica-Condensed-LightObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36101BD30E19008DE8B0 /* Helvetica-Condensed-Oblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34CF1BD30E19008DE8B0 /* Helvetica-Condensed-Oblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36111BD30E19008DE8B0 /* Helvetica-Condensed-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D01BD30E19008DE8B0 /* Helvetica-Condensed-Thin.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36121BD30E19008DE8B0 /* Helvetica-Condensed.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D11BD30E19008DE8B0 /* Helvetica-Condensed.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36131BD30E19008DE8B0 /* Helvetica-Conth.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D21BD30E19008DE8B0 /* Helvetica-Conth.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36141BD30E19008DE8B0 /* Helvetica-ExtraCompressed.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D31BD30E19008DE8B0 /* Helvetica-ExtraCompressed.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36151BD30E19008DE8B0 /* Helvetica-Fraction.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D41BD30E19008DE8B0 /* Helvetica-Fraction.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36161BD30E19008DE8B0 /* Helvetica-FractionBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D51BD30E19008DE8B0 /* Helvetica-FractionBold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36171BD30E19008DE8B0 /* Helvetica-Light-Light-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D61BD30E19008DE8B0 /* Helvetica-Light-Light-Italic.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36181BD30E19008DE8B0 /* Helvetica-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D71BD30E19008DE8B0 /* Helvetica-Light.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36191BD30E19008DE8B0 /* Helvetica-LightOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D81BD30E19008DE8B0 /* Helvetica-LightOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E361A1BD30E19008DE8B0 /* Helvetica-Narrow-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34D91BD30E19008DE8B0 /* Helvetica-Narrow-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E361B1BD30E19008DE8B0 /* Helvetica-Narrow-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34DA1BD30E19008DE8B0 /* Helvetica-Narrow-BoldItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E361C1BD30E19008DE8B0 /* Helvetica-Narrow-BoldOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34DB1BD30E19008DE8B0 /* Helvetica-Narrow-BoldOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E361D1BD30E19008DE8B0 /* Helvetica-Narrow-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34DC1BD30E19008DE8B0 /* Helvetica-Narrow-Italic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E361E1BD30E19008DE8B0 /* Helvetica-Narrow-Oblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34DD1BD30E19008DE8B0 /* Helvetica-Narrow-Oblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E361F1BD30E19008DE8B0 /* Helvetica-Narrow.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34DE1BD30E19008DE8B0 /* Helvetica-Narrow.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36201BD30E19008DE8B0 /* Helvetica-Normal.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34DF1BD30E19008DE8B0 /* Helvetica-Normal.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36211BD30E19008DE8B0 /* Helvetica-Oblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E01BD30E19008DE8B0 /* Helvetica-Oblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36221BD30E19008DE8B0 /* Helvetica-UltraCompressed.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E11BD30E19008DE8B0 /* Helvetica-UltraCompressed.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36231BD30E19008DE8B0 /* Helvetica.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E21BD30E19008DE8B0 /* Helvetica.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36241BD30E19008DE8B0 /* HelveticaBQ-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E31BD30E19008DE8B0 /* HelveticaBQ-Black.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36251BD30E19008DE8B0 /* HelveticaBQ-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E41BD30E19008DE8B0 /* HelveticaBQ-BlackItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36261BD30E19008DE8B0 /* HelveticaBQ-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E51BD30E19008DE8B0 /* HelveticaBQ-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36271BD30E19008DE8B0 /* HelveticaBQ-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E61BD30E19008DE8B0 /* HelveticaBQ-BoldItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36281BD30E19008DE8B0 /* HelveticaBQ-DemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E71BD30E19008DE8B0 /* HelveticaBQ-DemiBold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36291BD30E19008DE8B0 /* HelveticaBQ-DemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E81BD30E19008DE8B0 /* HelveticaBQ-DemiBoldItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E362A1BD30E19008DE8B0 /* HelveticaBQ-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34E91BD30E19008DE8B0 /* HelveticaBQ-Italic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E362B1BD30E19008DE8B0 /* HelveticaBQ-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34EA1BD30E19008DE8B0 /* HelveticaBQ-Light.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E362C1BD30E19008DE8B0 /* HelveticaBQ-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34EB1BD30E19008DE8B0 /* HelveticaBQ-LightItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E362D1BD30E19008DE8B0 /* HelveticaBQ-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34EC1BD30E19008DE8B0 /* HelveticaBQ-Medium.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E362E1BD30E19008DE8B0 /* HelveticaBQ-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34ED1BD30E19008DE8B0 /* HelveticaBQ-MediumItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E362F1BD30E19008DE8B0 /* HelveticaBQ-Roman.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34EE1BD30E19008DE8B0 /* HelveticaBQ-Roman.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36301BD30E19008DE8B0 /* HelveticaBQ-UltraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34EF1BD30E19008DE8B0 /* HelveticaBQ-UltraLight.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36311BD30E19008DE8B0 /* HelveticaCE-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F01BD30E19008DE8B0 /* HelveticaCE-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36321BD30E19008DE8B0 /* HelveticaCE-BoldOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F11BD30E19008DE8B0 /* HelveticaCE-BoldOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36331BD30E19008DE8B0 /* HelveticaCE-Cond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F21BD30E19008DE8B0 /* HelveticaCE-Cond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36341BD30E19008DE8B0 /* HelveticaCE-CondBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F31BD30E19008DE8B0 /* HelveticaCE-CondBold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36351BD30E19008DE8B0 /* HelveticaCE-CondBoldObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F41BD30E19008DE8B0 /* HelveticaCE-CondBoldObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36361BD30E19008DE8B0 /* HelveticaCE-CondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F51BD30E19008DE8B0 /* HelveticaCE-CondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36371BD30E19008DE8B0 /* HelveticaCE-Narrow.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F61BD30E19008DE8B0 /* HelveticaCE-Narrow.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36381BD30E19008DE8B0 /* HelveticaCE-NarrowBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F71BD30E19008DE8B0 /* HelveticaCE-NarrowBold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36391BD30E19008DE8B0 /* HelveticaCE-NarrowBoldOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F81BD30E19008DE8B0 /* HelveticaCE-NarrowBoldOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E363A1BD30E19008DE8B0 /* HelveticaCE-NarrowOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34F91BD30E19008DE8B0 /* HelveticaCE-NarrowOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E363B1BD30E19008DE8B0 /* HelveticaCE-Oblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34FA1BD30E19008DE8B0 /* HelveticaCE-Oblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E363C1BD30E19008DE8B0 /* HelveticaCE.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34FB1BD30E19008DE8B0 /* HelveticaCE.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E363D1BD30E19008DE8B0 /* HelveticaConBQ-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34FC1BD30E19008DE8B0 /* HelveticaConBQ-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E363E1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34FD1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLight.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E363F1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34FE1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLightItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36401BD30E19008DE8B0 /* HelveticaConBQ-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E34FF1BD30E19008DE8B0 /* HelveticaConBQ-Light.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36411BD30E19008DE8B0 /* HelveticaConBQ-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35001BD30E19008DE8B0 /* HelveticaConBQ-LightItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36421BD30E19008DE8B0 /* HelveticaConBQ-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35011BD30E19008DE8B0 /* HelveticaConBQ-Medium.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36431BD30E19008DE8B0 /* HelveticaCyr-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35021BD30E19008DE8B0 /* HelveticaCyr-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36441BD30E19008DE8B0 /* HelveticaCyr-BoldInclined.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35031BD30E19008DE8B0 /* HelveticaCyr-BoldInclined.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36451BD30E19008DE8B0 /* HelveticaCyr-Inclined.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35041BD30E19008DE8B0 /* HelveticaCyr-Inclined.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36461BD30E1A008DE8B0 /* HelveticaCyr-Upright.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35051BD30E19008DE8B0 /* HelveticaCyr-Upright.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36471BD30E1A008DE8B0 /* HelveticaCyrA-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35061BD30E19008DE8B0 /* HelveticaCyrA-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36481BD30E1A008DE8B0 /* HelveticaCyrA-BoldInclined.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35071BD30E19008DE8B0 /* HelveticaCyrA-BoldInclined.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36491BD30E1A008DE8B0 /* HelveticaCyrA-Inclined.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35081BD30E19008DE8B0 /* HelveticaCyrA-Inclined.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E364A1BD30E1A008DE8B0 /* HelveticaCyrA-Upright.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35091BD30E19008DE8B0 /* HelveticaCyrA-Upright.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E364B1BD30E1A008DE8B0 /* HelveticaDiagonalBQ.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E350A1BD30E19008DE8B0 /* HelveticaDiagonalBQ.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E364C1BD30E1A008DE8B0 /* HelveticaExt-No.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E350B1BD30E19008DE8B0 /* HelveticaExt-No.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E364D1BD30E1A008DE8B0 /* HelveticaExtendedBQ-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E350C1BD30E19008DE8B0 /* HelveticaExtendedBQ-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E364E1BD30E1A008DE8B0 /* HelveticaExtendedBQ-ExtraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E350D1BD30E19008DE8B0 /* HelveticaExtendedBQ-ExtraLight.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E364F1BD30E1A008DE8B0 /* HelveticaExtendedBQ-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E350E1BD30E19008DE8B0 /* HelveticaExtendedBQ-Light.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36501BD30E1A008DE8B0 /* HelveticaExtendedBQ-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E350F1BD30E19008DE8B0 /* HelveticaExtendedBQ-Medium.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36511BD30E1A008DE8B0 /* HelveticaExtO 2.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35101BD30E19008DE8B0 /* HelveticaExtO 2.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36521BD30E1A008DE8B0 /* HelveticaExtO 3.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35111BD30E19008DE8B0 /* HelveticaExtO 3.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36531BD30E1A008DE8B0 /* HelveticaExtO 4.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35121BD30E19008DE8B0 /* HelveticaExtO 4.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36541BD30E1A008DE8B0 /* HelveticaFractionsBQ.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35131BD30E19008DE8B0 /* HelveticaFractionsBQ.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36551BD30E1A008DE8B0 /* HelveticaInserat-Roman-SemiB.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35141BD30E19008DE8B0 /* HelveticaInserat-Roman-SemiB.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36561BD30E1A008DE8B0 /* HelveticaInserat-Roman-SemiBold(1).ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35151BD30E19008DE8B0 /* HelveticaInserat-Roman-SemiBold(1).ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36571BD30E1A008DE8B0 /* HelveticaInserat-Roman.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35161BD30E19008DE8B0 /* HelveticaInserat-Roman.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36581BD30E1A008DE8B0 /* HelveticaInseratBQ-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35171BD30E19008DE8B0 /* HelveticaInseratBQ-Italic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36591BD30E1A008DE8B0 /* HelveticaInseratBQ-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35181BD30E19008DE8B0 /* HelveticaInseratBQ-Regular.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E365A1BD30E1A008DE8B0 /* HelveticaInseratCyr-Upright.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35191BD30E19008DE8B0 /* HelveticaInseratCyr-Upright.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E365B1BD30E1A008DE8B0 /* HelveticaInseratLTStd-Roman.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E351A1BD30E19008DE8B0 /* HelveticaInseratLTStd-Roman.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E365C1BD30E1A008DE8B0 /* HelveticaLTStd- steevo -Roman - pointed .ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E351B1BD30E19008DE8B0 /* HelveticaLTStd- steevo -Roman - pointed .ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E365D1BD30E1A008DE8B0 /* HelveticaLTStd-Blk.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E351C1BD30E19008DE8B0 /* HelveticaLTStd-Blk.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E365E1BD30E1A008DE8B0 /* HelveticaLTStd-BlkCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E351D1BD30E19008DE8B0 /* HelveticaLTStd-BlkCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E365F1BD30E1A008DE8B0 /* HelveticaLTStd-BlkCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E351E1BD30E19008DE8B0 /* HelveticaLTStd-BlkCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36601BD30E1A008DE8B0 /* HelveticaLTStd-BlkObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E351F1BD30E19008DE8B0 /* HelveticaLTStd-BlkObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36611BD30E1A008DE8B0 /* HelveticaLTStd-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35201BD30E19008DE8B0 /* HelveticaLTStd-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36621BD30E1A008DE8B0 /* HelveticaLTStd-BoldCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35211BD30E19008DE8B0 /* HelveticaLTStd-BoldCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36631BD30E1A008DE8B0 /* HelveticaLTStd-BoldCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35221BD30E19008DE8B0 /* HelveticaLTStd-BoldCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36641BD30E1A008DE8B0 /* HelveticaLTStd-BoldObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35231BD30E19008DE8B0 /* HelveticaLTStd-BoldObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36651BD30E1A008DE8B0 /* HelveticaLTStd-Comp.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35241BD30E19008DE8B0 /* HelveticaLTStd-Comp.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36661BD30E1A008DE8B0 /* HelveticaLTStd-Cond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35251BD30E19008DE8B0 /* HelveticaLTStd-Cond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36671BD30E1A008DE8B0 /* HelveticaLTStd-CondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35261BD30E19008DE8B0 /* HelveticaLTStd-CondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36681BD30E1A008DE8B0 /* HelveticaLTStd-ExtraComp.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35271BD30E19008DE8B0 /* HelveticaLTStd-ExtraComp.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36691BD30E1A008DE8B0 /* HelveticaLTStd-Fractions.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35281BD30E19008DE8B0 /* HelveticaLTStd-Fractions.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E366A1BD30E1A008DE8B0 /* HelveticaLTStd-FractionsBd.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35291BD30E19008DE8B0 /* HelveticaLTStd-FractionsBd.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E366B1BD30E1A008DE8B0 /* HelveticaLTStd-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E352A1BD30E19008DE8B0 /* HelveticaLTStd-Light.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E366C1BD30E1A008DE8B0 /* HelveticaLTStd-LightCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E352B1BD30E19008DE8B0 /* HelveticaLTStd-LightCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E366D1BD30E1A008DE8B0 /* HelveticaLTStd-LightCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E352C1BD30E19008DE8B0 /* HelveticaLTStd-LightCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E366E1BD30E1A008DE8B0 /* HelveticaLTStd-LightObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E352D1BD30E19008DE8B0 /* HelveticaLTStd-LightObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E366F1BD30E1A008DE8B0 /* HelveticaLTStd-Obl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E352E1BD30E19008DE8B0 /* HelveticaLTStd-Obl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36701BD30E1A008DE8B0 /* HelveticaLTStd-Roman.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E352F1BD30E19008DE8B0 /* HelveticaLTStd-Roman.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36711BD30E1A008DE8B0 /* HelveticaLTStd-UltraComp.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35301BD30E19008DE8B0 /* HelveticaLTStd-UltraComp.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36721BD30E1A008DE8B0 /* HelveticaNeue-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35311BD30E19008DE8B0 /* HelveticaNeue-Black.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36731BD30E1A008DE8B0 /* HelveticaNeue-BlackCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35321BD30E19008DE8B0 /* HelveticaNeue-BlackCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36741BD30E1A008DE8B0 /* HelveticaNeue-BlackCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35331BD30E19008DE8B0 /* HelveticaNeue-BlackCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36751BD30E1A008DE8B0 /* HelveticaNeue-BlackExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35341BD30E19008DE8B0 /* HelveticaNeue-BlackExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36761BD30E1A008DE8B0 /* HelveticaNeue-BlackExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35351BD30E19008DE8B0 /* HelveticaNeue-BlackExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36771BD30E1A008DE8B0 /* HelveticaNeue-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35361BD30E19008DE8B0 /* HelveticaNeue-BlackItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36781BD30E1A008DE8B0 /* HelveticaNeue-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35371BD30E19008DE8B0 /* HelveticaNeue-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36791BD30E1A008DE8B0 /* HelveticaNeue-BoldCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35381BD30E19008DE8B0 /* HelveticaNeue-BoldCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E367A1BD30E1A008DE8B0 /* HelveticaNeue-BoldCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35391BD30E19008DE8B0 /* HelveticaNeue-BoldCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E367B1BD30E1A008DE8B0 /* HelveticaNeue-BoldExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E353A1BD30E19008DE8B0 /* HelveticaNeue-BoldExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E367C1BD30E1A008DE8B0 /* HelveticaNeue-BoldExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E353B1BD30E19008DE8B0 /* HelveticaNeue-BoldExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E367D1BD30E1A008DE8B0 /* HelveticaNeue-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E353C1BD30E19008DE8B0 /* HelveticaNeue-BoldItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E367E1BD30E1A008DE8B0 /* HelveticaNeue-BoldOutline.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E353D1BD30E19008DE8B0 /* HelveticaNeue-BoldOutline.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E367F1BD30E1A008DE8B0 /* HelveticaNeue-Condensed.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E353E1BD30E19008DE8B0 /* HelveticaNeue-Condensed.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36801BD30E1A008DE8B0 /* HelveticaNeue-CondensedObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E353F1BD30E19008DE8B0 /* HelveticaNeue-CondensedObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36811BD30E1A008DE8B0 /* HelveticaNeue-ExtBlackCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35401BD30E19008DE8B0 /* HelveticaNeue-ExtBlackCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36821BD30E1A008DE8B0 /* HelveticaNeue-ExtBlackCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35411BD30E19008DE8B0 /* HelveticaNeue-ExtBlackCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36831BD30E1A008DE8B0 /* HelveticaNeue-Extended.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35421BD30E19008DE8B0 /* HelveticaNeue-Extended.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36841BD30E1A008DE8B0 /* HelveticaNeue-ExtendedObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35431BD30E19008DE8B0 /* HelveticaNeue-ExtendedObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36851BD30E1A008DE8B0 /* HelveticaNeue-Heavy.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35441BD30E19008DE8B0 /* HelveticaNeue-Heavy.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36861BD30E1A008DE8B0 /* HelveticaNeue-HeavyCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35451BD30E19008DE8B0 /* HelveticaNeue-HeavyCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36871BD30E1A008DE8B0 /* HelveticaNeue-HeavyCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35461BD30E19008DE8B0 /* HelveticaNeue-HeavyCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36881BD30E1A008DE8B0 /* HelveticaNeue-HeavyExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35471BD30E19008DE8B0 /* HelveticaNeue-HeavyExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36891BD30E1A008DE8B0 /* HelveticaNeue-HeavyExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35481BD30E19008DE8B0 /* HelveticaNeue-HeavyExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E368A1BD30E1A008DE8B0 /* HelveticaNeue-HeavyItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35491BD30E19008DE8B0 /* HelveticaNeue-HeavyItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E368B1BD30E1A008DE8B0 /* HelveticaNeue-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E354A1BD30E19008DE8B0 /* HelveticaNeue-Italic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E368C1BD30E1A008DE8B0 /* HelveticaNeue-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E354B1BD30E19008DE8B0 /* HelveticaNeue-Light.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E368D1BD30E1A008DE8B0 /* HelveticaNeue-LightCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E354C1BD30E19008DE8B0 /* HelveticaNeue-LightCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E368E1BD30E1A008DE8B0 /* HelveticaNeue-LightCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E354D1BD30E19008DE8B0 /* HelveticaNeue-LightCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E368F1BD30E1A008DE8B0 /* HelveticaNeue-LightExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E354E1BD30E19008DE8B0 /* HelveticaNeue-LightExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36901BD30E1A008DE8B0 /* HelveticaNeue-LightExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E354F1BD30E19008DE8B0 /* HelveticaNeue-LightExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36911BD30E1A008DE8B0 /* HelveticaNeue-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35501BD30E19008DE8B0 /* HelveticaNeue-LightItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36921BD30E1A008DE8B0 /* HelveticaNeue-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35511BD30E19008DE8B0 /* HelveticaNeue-Medium.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36931BD30E1A008DE8B0 /* HelveticaNeue-MediumCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35521BD30E19008DE8B0 /* HelveticaNeue-MediumCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36941BD30E1A008DE8B0 /* HelveticaNeue-MediumCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35531BD30E19008DE8B0 /* HelveticaNeue-MediumCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36951BD30E1A008DE8B0 /* HelveticaNeue-MediumExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35541BD30E19008DE8B0 /* HelveticaNeue-MediumExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36961BD30E1A008DE8B0 /* HelveticaNeue-MediumExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35551BD30E19008DE8B0 /* HelveticaNeue-MediumExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36971BD30E1A008DE8B0 /* HelveticaNeue-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35561BD30E19008DE8B0 /* HelveticaNeue-MediumItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36981BD30E1A008DE8B0 /* HelveticaNeue-Roman.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35571BD30E19008DE8B0 /* HelveticaNeue-Roman.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36991BD30E1A008DE8B0 /* HelveticaNeue-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35581BD30E19008DE8B0 /* HelveticaNeue-Thin.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E369A1BD30E1A008DE8B0 /* HelveticaNeue-ThinCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35591BD30E19008DE8B0 /* HelveticaNeue-ThinCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E369B1BD30E1A008DE8B0 /* HelveticaNeue-ThinCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E355A1BD30E19008DE8B0 /* HelveticaNeue-ThinCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E369C1BD30E1A008DE8B0 /* HelveticaNeue-ThinExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E355B1BD30E19008DE8B0 /* HelveticaNeue-ThinExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E369D1BD30E1A008DE8B0 /* HelveticaNeue-ThinExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E355C1BD30E19008DE8B0 /* HelveticaNeue-ThinExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E369E1BD30E1A008DE8B0 /* HelveticaNeue-ThinItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E355D1BD30E19008DE8B0 /* HelveticaNeue-ThinItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E369F1BD30E1A008DE8B0 /* HelveticaNeue-UltraLigCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E355E1BD30E19008DE8B0 /* HelveticaNeue-UltraLigCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A01BD30E1A008DE8B0 /* HelveticaNeue-UltraLigCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E355F1BD30E19008DE8B0 /* HelveticaNeue-UltraLigCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A11BD30E1A008DE8B0 /* HelveticaNeue-UltraLigExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35601BD30E19008DE8B0 /* HelveticaNeue-UltraLigExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A21BD30E1A008DE8B0 /* HelveticaNeue-UltraLigExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35611BD30E19008DE8B0 /* HelveticaNeue-UltraLigExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A31BD30E1A008DE8B0 /* HelveticaNeue-UltraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35621BD30E19008DE8B0 /* HelveticaNeue-UltraLight.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A41BD30E1A008DE8B0 /* HelveticaNeue-UltraLightItal.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35631BD30E19008DE8B0 /* HelveticaNeue-UltraLightItal.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A51BD30E1A008DE8B0 /* HelveticaNeueLT-BlackCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35641BD30E19008DE8B0 /* HelveticaNeueLT-BlackCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A61BD30E1A008DE8B0 /* HelveticaNeueLT-BlackCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35651BD30E19008DE8B0 /* HelveticaNeueLT-BlackCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A71BD30E1A008DE8B0 /* HelveticaNeueLT-BlackExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35661BD30E19008DE8B0 /* HelveticaNeueLT-BlackExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A81BD30E1A008DE8B0 /* HelveticaNeueLT-BlackExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35671BD30E19008DE8B0 /* HelveticaNeueLT-BlackExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36A91BD30E1A008DE8B0 /* HelveticaNeueLT-BoldCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35681BD30E19008DE8B0 /* HelveticaNeueLT-BoldCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36AA1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35691BD30E19008DE8B0 /* HelveticaNeueLT-BoldCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36AB1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E356A1BD30E19008DE8B0 /* HelveticaNeueLT-BoldExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36AC1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E356B1BD30E19008DE8B0 /* HelveticaNeueLT-BoldExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36AD1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldOutline.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E356C1BD30E19008DE8B0 /* HelveticaNeueLT-BoldOutline.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36AE1BD30E1A008DE8B0 /* HelveticaNeueLT-Condensed.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E356D1BD30E19008DE8B0 /* HelveticaNeueLT-Condensed.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36AF1BD30E1A008DE8B0 /* HelveticaNeueLT-CondensedObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E356E1BD30E19008DE8B0 /* HelveticaNeueLT-CondensedObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B01BD30E1A008DE8B0 /* HelveticaNeueLT-ExtBlackCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E356F1BD30E19008DE8B0 /* HelveticaNeueLT-ExtBlackCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B11BD30E1A008DE8B0 /* HelveticaNeueLT-ExtBlackCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35701BD30E19008DE8B0 /* HelveticaNeueLT-ExtBlackCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B21BD30E1A008DE8B0 /* HelveticaNeueLT-Extended.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35711BD30E19008DE8B0 /* HelveticaNeueLT-Extended.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B31BD30E1A008DE8B0 /* HelveticaNeueLT-ExtendedObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35721BD30E19008DE8B0 /* HelveticaNeueLT-ExtendedObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B41BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35731BD30E19008DE8B0 /* HelveticaNeueLT-HeavyCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B51BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35741BD30E19008DE8B0 /* HelveticaNeueLT-HeavyCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B61BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35751BD30E19008DE8B0 /* HelveticaNeueLT-HeavyExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B71BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35761BD30E19008DE8B0 /* HelveticaNeueLT-HeavyExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B81BD30E1A008DE8B0 /* HelveticaNeueLT-LightCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35771BD30E19008DE8B0 /* HelveticaNeueLT-LightCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36B91BD30E1A008DE8B0 /* HelveticaNeueLT-LightCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35781BD30E19008DE8B0 /* HelveticaNeueLT-LightCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36BA1BD30E1A008DE8B0 /* HelveticaNeueLT-LightExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35791BD30E19008DE8B0 /* HelveticaNeueLT-LightExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36BB1BD30E1A008DE8B0 /* HelveticaNeueLT-LightExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E357A1BD30E19008DE8B0 /* HelveticaNeueLT-LightExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36BC1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E357B1BD30E19008DE8B0 /* HelveticaNeueLT-MediumCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36BD1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E357C1BD30E19008DE8B0 /* HelveticaNeueLT-MediumCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36BE1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E357D1BD30E19008DE8B0 /* HelveticaNeueLT-MediumExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36BF1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E357E1BD30E19008DE8B0 /* HelveticaNeueLT-MediumExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C01BD30E1A008DE8B0 /* HelveticaNeueLT-ThinCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E357F1BD30E19008DE8B0 /* HelveticaNeueLT-ThinCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C11BD30E1A008DE8B0 /* HelveticaNeueLT-ThinCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35801BD30E19008DE8B0 /* HelveticaNeueLT-ThinCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C21BD30E1A008DE8B0 /* HelveticaNeueLT-ThinExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35811BD30E19008DE8B0 /* HelveticaNeueLT-ThinExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C31BD30E1A008DE8B0 /* HelveticaNeueLT-ThinExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35821BD30E19008DE8B0 /* HelveticaNeueLT-ThinExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C41BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35831BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C51BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35841BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C61BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigExt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35851BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigExt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C71BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigExtObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35861BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigExtObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C81BD30E1A008DE8B0 /* HelveticaNeueLTStd-Bd.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35871BD30E19008DE8B0 /* HelveticaNeueLTStd-Bd.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36C91BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35881BD30E19008DE8B0 /* HelveticaNeueLTStd-BdCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36CA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35891BD30E19008DE8B0 /* HelveticaNeueLTStd-BdCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36CB1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdEx.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E358A1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdEx.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36CC1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E358B1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36CD1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E358C1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdIt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36CE1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdOu.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E358D1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdOu.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36CF1BD30E1A008DE8B0 /* HelveticaNeueLTStd-Blk.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E358E1BD30E19008DE8B0 /* HelveticaNeueLTStd-Blk.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D01BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E358F1BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D11BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35901BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D21BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkEx.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35911BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkEx.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D31BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35921BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D41BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35931BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkIt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D51BD30E1A008DE8B0 /* HelveticaNeueLTStd-Cn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35941BD30E19008DE8B0 /* HelveticaNeueLTStd-Cn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D61BD30E1A008DE8B0 /* HelveticaNeueLTStd-CnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35951BD30E19008DE8B0 /* HelveticaNeueLTStd-CnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D71BD30E1A008DE8B0 /* HelveticaNeueLTStd-Ex.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35961BD30E19008DE8B0 /* HelveticaNeueLTStd-Ex.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D81BD30E1A008DE8B0 /* HelveticaNeueLTStd-ExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35971BD30E19008DE8B0 /* HelveticaNeueLTStd-ExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36D91BD30E1A008DE8B0 /* HelveticaNeueLTStd-Hv.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35981BD30E19008DE8B0 /* HelveticaNeueLTStd-Hv.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36DA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35991BD30E19008DE8B0 /* HelveticaNeueLTStd-HvCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36DB1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E359A1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36DC1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvEx.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E359B1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvEx.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36DD1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E359C1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36DE1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E359D1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvIt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36DF1BD30E1A008DE8B0 /* HelveticaNeueLTStd-It.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E359E1BD30E19008DE8B0 /* HelveticaNeueLTStd-It.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E01BD30E1A008DE8B0 /* HelveticaNeueLTStd-Lt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E359F1BD30E19008DE8B0 /* HelveticaNeueLTStd-Lt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E11BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A01BD30E19008DE8B0 /* HelveticaNeueLTStd-LtCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E21BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A11BD30E19008DE8B0 /* HelveticaNeueLTStd-LtCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E31BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtEx.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A21BD30E19008DE8B0 /* HelveticaNeueLTStd-LtEx.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E41BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A31BD30E19008DE8B0 /* HelveticaNeueLTStd-LtExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E51BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A41BD30E19008DE8B0 /* HelveticaNeueLTStd-LtIt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E61BD30E1A008DE8B0 /* HelveticaNeueLTStd-Md.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A51BD30E19008DE8B0 /* HelveticaNeueLTStd-Md.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E71BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A61BD30E19008DE8B0 /* HelveticaNeueLTStd-MdCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E81BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A71BD30E19008DE8B0 /* HelveticaNeueLTStd-MdCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36E91BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdEx.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A81BD30E19008DE8B0 /* HelveticaNeueLTStd-MdEx.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36EA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35A91BD30E19008DE8B0 /* HelveticaNeueLTStd-MdExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36EB1BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35AA1BD30E19008DE8B0 /* HelveticaNeueLTStd-MdIt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36EC1BD30E1A008DE8B0 /* HelveticaNeueLTStd-Roman.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35AB1BD30E19008DE8B0 /* HelveticaNeueLTStd-Roman.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36ED1BD30E1A008DE8B0 /* HelveticaNeueLTStd-Th.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35AC1BD30E19008DE8B0 /* HelveticaNeueLTStd-Th.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36EE1BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35AD1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36EF1BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35AE1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F01BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThEx.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35AF1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThEx.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F11BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B01BD30E19008DE8B0 /* HelveticaNeueLTStd-ThExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F21BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B11BD30E19008DE8B0 /* HelveticaNeueLTStd-ThIt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F31BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B21BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F41BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B31BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F51BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B41BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F61BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtEx.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B51BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtEx.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F71BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtExO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B61BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtExO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F81BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B71BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtIt.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36F91BD30E1A008DE8B0 /* HelveticaNeueLTStd-XBlkCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B81BD30E19008DE8B0 /* HelveticaNeueLTStd-XBlkCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36FA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-XBlkCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35B91BD30E19008DE8B0 /* HelveticaNeueLTStd-XBlkCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36FB1BD30E1A008DE8B0 /* HelveticaObl-He.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35BA1BD30E19008DE8B0 /* HelveticaObl-He.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36FC1BD30E1A008DE8B0 /* HelveticaObl-Li.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35BB1BD30E19008DE8B0 /* HelveticaObl-Li.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36FD1BD30E1A008DE8B0 /* HelveticaObl-Th.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35BC1BD30E19008DE8B0 /* HelveticaObl-Th.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36FE1BD30E1A008DE8B0 /* HelveticaRounded-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35BD1BD30E19008DE8B0 /* HelveticaRounded-Black.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E36FF1BD30E1A008DE8B0 /* HelveticaRounded-BlackObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35BE1BD30E19008DE8B0 /* HelveticaRounded-BlackObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37001BD30E1A008DE8B0 /* HelveticaRounded-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35BF1BD30E19008DE8B0 /* HelveticaRounded-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37011BD30E1A008DE8B0 /* HelveticaRounded-BoldCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C01BD30E19008DE8B0 /* HelveticaRounded-BoldCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37021BD30E1A008DE8B0 /* HelveticaRounded-BoldCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C11BD30E19008DE8B0 /* HelveticaRounded-BoldCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37031BD30E1A008DE8B0 /* HelveticaRounded-BoldObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C21BD30E19008DE8B0 /* HelveticaRounded-BoldObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37041BD30E1A008DE8B0 /* HelveticaRoundedLT-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C31BD30E19008DE8B0 /* HelveticaRoundedLT-Black.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37051BD30E1A008DE8B0 /* HelveticaRoundedLT-BlackObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C41BD30E19008DE8B0 /* HelveticaRoundedLT-BlackObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37061BD30E1A008DE8B0 /* HelveticaRoundedLT-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C51BD30E19008DE8B0 /* HelveticaRoundedLT-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37071BD30E1A008DE8B0 /* HelveticaRoundedLT-BoldCond.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C61BD30E19008DE8B0 /* HelveticaRoundedLT-BoldCond.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37081BD30E1A008DE8B0 /* HelveticaRoundedLT-BoldCondObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C71BD30E19008DE8B0 /* HelveticaRoundedLT-BoldCondObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37091BD30E1A008DE8B0 /* HelveticaRoundedLT-BoldObl.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C81BD30E19008DE8B0 /* HelveticaRoundedLT-BoldObl.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E370A1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-Bd.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35C91BD30E19008DE8B0 /* HelveticaRoundedLTStd-Bd.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E370B1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BdCn.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35CA1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdCn.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E370C1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BdCnO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35CB1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdCnO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E370D1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BdO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35CC1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E370E1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35CD1BD30E19008DE8B0 /* HelveticaRoundedLTStd-Black.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E370F1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BlkO.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35CE1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BlkO.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37101BD30E1A008DE8B0 /* HelveticaTwoBQ-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35CF1BD30E19008DE8B0 /* HelveticaTwoBQ-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37111BD30E1A008DE8B0 /* HelveticaTwoBQ-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D01BD30E19008DE8B0 /* HelveticaTwoBQ-BoldItalic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37121BD30E1A008DE8B0 /* HelveticaTwoBQ-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D11BD30E19008DE8B0 /* HelveticaTwoBQ-Italic.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37131BD30E1A008DE8B0 /* HelveticaTwoBQ-Roman.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D21BD30E19008DE8B0 /* HelveticaTwoBQ-Roman.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37141BD30E1A008DE8B0 /* HelveticaWorld-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D31BD30E19008DE8B0 /* HelveticaWorld-Bold.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37151BD30E1A008DE8B0 /* HelveticaWorld-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D41BD30E19008DE8B0 /* HelveticaWorld-BoldItalic.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37161BD30E1A008DE8B0 /* HelveticaWorld-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D51BD30E19008DE8B0 /* HelveticaWorld-Italic.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37171BD30E1A008DE8B0 /* HelveticaWorld-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D61BD30E19008DE8B0 /* HelveticaWorld-Regular.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37181BD30E1A008DE8B0 /* HelvFB Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D71BD30E19008DE8B0 /* HelvFB Bold.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37191BD30E1A008DE8B0 /* HelvFB BoldOblique.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D81BD30E19008DE8B0 /* HelvFB BoldOblique.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E371A1BD30E1A008DE8B0 /* HelvFB Oblique.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35D91BD30E19008DE8B0 /* HelvFB Oblique.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E371B1BD30E1A008DE8B0 /* HelvFB-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35DA1BD30E19008DE8B0 /* HelvFB-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E371C1BD30E1A008DE8B0 /* HelvFB-BoldOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35DB1BD30E19008DE8B0 /* HelvFB-BoldOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E371D1BD30E1A008DE8B0 /* HelvFB-Oblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35DC1BD30E19008DE8B0 /* HelvFB-Oblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E371E1BD30E1A008DE8B0 /* HelvFB.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35DD1BD30E19008DE8B0 /* HelvFB.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E371F1BD30E1A008DE8B0 /* HelvFE Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35DE1BD30E19008DE8B0 /* HelvFE Bold.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37201BD30E1A008DE8B0 /* HelvFE BoldOblique.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35DF1BD30E19008DE8B0 /* HelvFE BoldOblique.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37211BD30E1A008DE8B0 /* HelvFE Oblique.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35E01BD30E19008DE8B0 /* HelvFE Oblique.ttf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37221BD30E1A008DE8B0 /* HelvFE-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35E11BD30E19008DE8B0 /* HelvFE-Bold.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37231BD30E1A008DE8B0 /* HelvFE-BoldOblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35E21BD30E19008DE8B0 /* HelvFE-BoldOblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37241BD30E1A008DE8B0 /* HelvFE-Oblique.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35E31BD30E19008DE8B0 /* HelvFE-Oblique.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37251BD30E1A008DE8B0 /* HelvFE.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35E41BD30E19008DE8B0 /* HelvFE.otf */; settings = {ASSET_TAGS = (); }; }; + 2E9E37261BD30E1A008DE8B0 /* HelvLight Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2E9E35E51BD30E19008DE8B0 /* HelvLight Regular.ttf */; settings = {ASSET_TAGS = (); }; }; + 2EA69A211BFE7994004AF7E4 /* VineHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EA69A201BFE7994004AF7E4 /* VineHeaderCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2EA69A231BFE7E1C004AF7E4 /* TumblrHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EA69A221BFE7E1C004AF7E4 /* TumblrHeaderCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2EA69A251BFE81CD004AF7E4 /* TwitterHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EA69A241BFE81CD004AF7E4 /* TwitterHeaderCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2EA69A271BFE8526004AF7E4 /* FacebookStatusCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EA69A261BFE8526004AF7E4 /* FacebookStatusCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2EA69A291BFE85C3004AF7E4 /* FacebookHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EA69A281BFE85C3004AF7E4 /* FacebookHeaderCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2EA69A2B1BFE8687004AF7E4 /* FacebookFeedDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EA69A2A1BFE8687004AF7E4 /* FacebookFeedDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2EB579451BDF86810026F284 /* InstagramProfileController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB579441BDF86810026F284 /* InstagramProfileController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EB7E7CB1BEB1077002605C8 /* FeedbackController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB7E7CA1BEB1077002605C8 /* FeedbackController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EBDDB781C003F7A00DA5DC8 /* NotificationDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EBDDB771C003F7A00DA5DC8 /* NotificationDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2EBDDB7A1C00400E00DA5DC8 /* NotificationCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EBDDB791C00400E00DA5DC8 /* NotificationCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2EC06ED91C052C1900ABA888 /* PublicProfileController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC06ED81C052C1900ABA888 /* PublicProfileController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EC06EDB1C05393600ABA888 /* FeedHeader.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2EC06EDA1C05393600ABA888 /* FeedHeader.xib */; settings = {ASSET_TAGS = (); }; }; + 2EC206BE1BFAC9570068AE1E /* InstagramFeedDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC206BD1BFAC9570068AE1E /* InstagramFeedDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2EC206C01BFBFF6C0068AE1E /* VineFeedDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC206BF1BFBFF6C0068AE1E /* VineFeedDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2EC206C21BFC0BD30068AE1E /* TwitterFeedDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC206C11BFC0BD30068AE1E /* TwitterFeedDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2EC206C41BFC48270068AE1E /* TumblrFeedDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC206C31BFC48270068AE1E /* TumblrFeedDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2EC9DC601BCE2D68009BD4B0 /* SocialTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC9DC5F1BCE2D68009BD4B0 /* SocialTabBarController.swift */; settings = {ASSET_TAGS = (); }; }; + 2ECCC2D91BFECF6100FF0355 /* ConversationListDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ECCC2D81BFECF6100FF0355 /* ConversationListDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2ECCC2E71BFEDFD900FF0355 /* ConversationCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ECCC2E61BFEDFD900FF0355 /* ConversationCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2ECCC2E91BFEE87C00FF0355 /* IncomingMessageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ECCC2E81BFEE87C00FF0355 /* IncomingMessageCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2ECCC2EB1BFEE88900FF0355 /* OutgoingMessageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ECCC2EA1BFEE88900FF0355 /* OutgoingMessageCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2ECCC2ED1BFEE89200FF0355 /* TimeMessageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ECCC2EC1BFEE89200FF0355 /* TimeMessageCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2ECCC2EF1BFEEA5500FF0355 /* IncomingMessageTwoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ECCC2EE1BFEEA5500FF0355 /* IncomingMessageTwoCell.xib */; settings = {ASSET_TAGS = (); }; }; + 2ECCC2F11BFEF0DC00FF0355 /* MessageRoomDatasource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ECCC2F01BFEF0DC00FF0355 /* MessageRoomDatasource.swift */; settings = {ASSET_TAGS = (); }; }; + 2ED323E01BDDFBF400EEDA16 /* TimeMessageCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ED323DF1BDDFBF400EEDA16 /* TimeMessageCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2ED323E21BDDFEA800EEDA16 /* IncomingMessageTwoCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ED323E11BDDFEA800EEDA16 /* IncomingMessageTwoCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EDC72EA1BD0BB020050E031 /* FeedPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDC72E91BD0BB020050E031 /* FeedPageController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EDFE3A71BD0261000C85CB5 /* NotificationPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDFE3A61BD0261000C85CB5 /* NotificationPageController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EDFE3AB1BD03C0200C85CB5 /* MessagePageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDFE3AA1BD03C0200C85CB5 /* MessagePageController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EE1AD261BF3F0BB00A54B49 /* WebsiteController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EE1AD251BF3F0BB00A54B49 /* WebsiteController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EEB11E41BE0AE5000DA8492 /* TwitterPhotoCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EEB11E31BE0AE5000DA8492 /* TwitterPhotoCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EEB11E61BE16A4100DA8492 /* TwitterTweetCellController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EEB11E51BE16A4100DA8492 /* TwitterTweetCellController.swift */; settings = {ASSET_TAGS = (); }; }; + 2EFF739B1BCE5CB7005CC408 /* SocialTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EFF739A1BCE5CB7005CC408 /* SocialTabViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 47FF81D22CD0D2966776C0FD /* Pods_comblie.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8955C66DCB0E3C6097EA0C7A /* Pods_comblie.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 690233041BCF6A73001AB41B /* InstagramAPIManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690233031BCF6A73001AB41B /* InstagramAPIManager.swift */; settings = {ASSET_TAGS = (); }; }; + 690233081BCF6AEF001AB41B /* FeedRequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690233071BCF6AEF001AB41B /* FeedRequestManager.swift */; settings = {ASSET_TAGS = (); }; }; + 6902330A1BCF6B0D001AB41B /* KeychainWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690233091BCF6B0D001AB41B /* KeychainWrapper.swift */; settings = {ASSET_TAGS = (); }; }; + 6902330C1BCF6B55001AB41B /* UserDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6902330B1BCF6B55001AB41B /* UserDataManager.swift */; settings = {ASSET_TAGS = (); }; }; + 6926C8721BD0A3D2007C3FAE /* FBSDKCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6926C8711BD0A3D2007C3FAE /* FBSDKCoreKit.framework */; settings = {ASSET_TAGS = (); }; }; + 6926C8741BD0A3DD007C3FAE /* FBSDKLoginKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6926C8731BD0A3DD007C3FAE /* FBSDKLoginKit.framework */; settings = {ASSET_TAGS = (); }; }; + 698257841BD808BF0062AD39 /* NetworkClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 698257831BD808BF0062AD39 /* NetworkClass.swift */; settings = {ASSET_TAGS = (); }; }; + 69B30BDC1BD5F11500F03990 /* Fabric.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69B30BD81BD5F11500F03990 /* Fabric.framework */; settings = {ASSET_TAGS = (); }; }; + 69B30BDD1BD5F11500F03990 /* TwitterKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69B30BD91BD5F11500F03990 /* TwitterKit.framework */; settings = {ASSET_TAGS = (); }; }; + 69B30BDE1BD5F11500F03990 /* TwitterKitResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 69B30BDA1BD5F11500F03990 /* TwitterKitResources.bundle */; settings = {ASSET_TAGS = (); }; }; + 69B30BDF1BD5F11500F03990 /* TwitterCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69B30BDB1BD5F11500F03990 /* TwitterCore.framework */; settings = {ASSET_TAGS = (); }; }; + 69BB36951BD496A2000362D1 /* FirebaseIOManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69BB36941BD496A2000362D1 /* FirebaseIOManager.swift */; settings = {ASSET_TAGS = (); }; }; + 69BF17211BDA876C008A726F /* NetworkFeedClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69BF17201BDA876C008A726F /* NetworkFeedClass.swift */; settings = {ASSET_TAGS = (); }; }; + 69BF17231BDA89E2008A726F /* NetworkNotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69BF17221BDA89E2008A726F /* NetworkNotificationManager.swift */; settings = {ASSET_TAGS = (); }; }; + 69BF17251BDA949D008A726F /* NotificationRequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69BF17241BDA949D008A726F /* NotificationRequestManager.swift */; settings = {ASSET_TAGS = (); }; }; + 69E272901BD843FB00259A44 /* Networks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69E2728F1BD843FB00259A44 /* Networks.swift */; settings = {ASSET_TAGS = (); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 2E00643A1BC65F1B004C5BBF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2E00641D1BC65F1B004C5BBF /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2E0064241BC65F1B004C5BBF; + remoteInfo = comblie; + }; + 2E0064451BC65F1B004C5BBF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2E00641D1BC65F1B004C5BBF /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2E0064241BC65F1B004C5BBF; + remoteInfo = comblie; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 2E0064251BC65F1B004C5BBF /* comblie.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = comblie.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2E0064281BC65F1B004C5BBF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 2E00642A1BC65F1B004C5BBF /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; + 2E00642D1BC65F1B004C5BBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 2E00642F1BC65F1B004C5BBF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2E0064321BC65F1B004C5BBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 2E0064341BC65F1B004C5BBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2E0064391BC65F1B004C5BBF /* comblieTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = comblieTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2E00643D1BC65F1B004C5BBF /* comblieTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = comblieTests.swift; sourceTree = ""; }; + 2E00643F1BC65F1B004C5BBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2E0064441BC65F1B004C5BBF /* comblieUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = comblieUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2E0064481BC65F1B004C5BBF /* comblieUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = comblieUITests.swift; sourceTree = ""; }; + 2E00644A1BC65F1B004C5BBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2E0064561BC66E19004C5BBF /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + 2E0064601BC731EA004C5BBF /* RegistrationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RegistrationViewController.swift; sourceTree = ""; }; + 2E0256C41BCB84CE009490C2 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + 2E0256C61BCB934A009490C2 /* SocialLoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocialLoginViewController.swift; sourceTree = ""; }; + 2E0A88F81BE84BB6009FB358 /* TwitterTweetCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TwitterTweetCell.xib; sourceTree = ""; }; + 2E0A88FA1BE84D17009FB358 /* TumblrPhotoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TumblrPhotoCell.xib; sourceTree = ""; }; + 2E0A88FC1BE890FE009FB358 /* TumblrBlogCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TumblrBlogCell.xib; sourceTree = ""; }; + 2E0A88FE1BE8964A009FB358 /* InstagramFeedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = InstagramFeedCell.xib; sourceTree = ""; }; + 2E0A89001BE899B8009FB358 /* TwitterPhotoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TwitterPhotoCell.xib; sourceTree = ""; }; + 2E0A89031BE993A5009FB358 /* SettingsPageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsPageController.swift; sourceTree = ""; }; + 2E0E3C841BEFDFBE001CAA05 /* CommentCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommentCellController.swift; sourceTree = ""; }; + 2E155E2B1BD85EA100868F2C /* MessageRoomViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageRoomViewController.swift; path = comblie/MessageRoomViewController.swift; sourceTree = ""; }; + 2E155E311BD8636800868F2C /* MessageRoomTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageRoomTableViewController.swift; path = comblie/MessageRoomTableViewController.swift; sourceTree = ""; }; + 2E16A3981BEF08A500A44104 /* InstagramModalController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstagramModalController.swift; sourceTree = ""; }; + 2E1CD22F1BEFD8A200418C02 /* CommentCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CommentCell.xib; sourceTree = ""; }; + 2E1E73431BFD8D6B009F26F9 /* AllFeedDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllFeedDatasource.swift; sourceTree = ""; }; + 2E30C2811BE0A5990001CB87 /* InstagramPhotoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstagramPhotoCell.swift; sourceTree = ""; }; + 2E380B961BDDA32C00803B8C /* IncomingMessageCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IncomingMessageCellController.swift; sourceTree = ""; }; + 2E380B981BDDA69600803B8C /* OutgoingMessageCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutgoingMessageCellController.swift; sourceTree = ""; }; + 2E3C9B2D1BEB1FF900A7C86F /* TermsConditionsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TermsConditionsController.swift; sourceTree = ""; }; + 2E3CDBF71BDC63B500C8C49D /* InstagramFeedCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstagramFeedCellController.swift; sourceTree = ""; }; + 2E45ECB91BD9FE2D00AF1F18 /* FacebookProfileTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookProfileTableViewController.swift; sourceTree = ""; }; + 2E45ECBB1BDA038300AF1F18 /* FacebookHeaderTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookHeaderTableViewCell.swift; sourceTree = ""; }; + 2E45ECBE1BDA08AD00AF1F18 /* TwitterHeaderTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterHeaderTableViewCell.swift; sourceTree = ""; }; + 2E45ECC01BDA08C700AF1F18 /* TwitterProfileTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterProfileTableViewController.swift; sourceTree = ""; }; + 2E4D7F881BD375F50025A0A1 /* NotificationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NotificationCell.swift; path = comblie/NotificationCell.swift; sourceTree = ""; }; + 2E4E90F91BE9AFD900C3D780 /* SettingsTableController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsTableController.swift; sourceTree = ""; }; + 2E556A421BCCEF2500623A80 /* ProfilePageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProfilePageController.swift; path = comblie/ProfilePageController.swift; sourceTree = ""; }; + 2E5EBCF41BE368C400B646BA /* FacebookStatusCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookStatusCellController.swift; sourceTree = ""; }; + 2E5EBCF61BE43B6500B646BA /* TumblrBlogCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TumblrBlogCellController.swift; sourceTree = ""; }; + 2E5EBCF81BE7EC2F00B646BA /* TumblrPhotoCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TumblrPhotoCellController.swift; sourceTree = ""; }; + 2E5EBCFA1BE845C400B646BA /* VineFeedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VineFeedCell.xib; sourceTree = ""; }; + 2E5EBCFD1BE847F900B646BA /* AllFeedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllFeedTableViewController.swift; sourceTree = ""; }; + 2E799B401BEF10FF0030803B /* CommentsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommentsController.swift; sourceTree = ""; }; + 2E7A7A1A1BD7074B00A3CB7F /* VineLoginController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VineLoginController.swift; path = ../VineLoginController.swift; sourceTree = ""; }; + 2E8030871BEAE90500A8069C /* PushNotificationsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushNotificationsController.swift; sourceTree = ""; }; + 2E8030891BEAF90000A8069C /* ReportProblemController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReportProblemController.swift; sourceTree = ""; }; + 2E81062D1BDA2D32005577F6 /* TumblrHeaderTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TumblrHeaderTableViewCell.swift; sourceTree = ""; }; + 2E81062F1BDA2D43005577F6 /* TumblrProfileTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TumblrProfileTableViewController.swift; sourceTree = ""; }; + 2E8106311BDA2D51005577F6 /* VineProfileTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VineProfileTableViewController.swift; sourceTree = ""; }; + 2E8106351BDA34B3005577F6 /* VineHeaderTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VineHeaderTableViewCell.swift; sourceTree = ""; }; + 2E86DC3F1C0E7BE5001C62CF /* ComposeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposeViewController.swift; sourceTree = ""; }; + 2E935F521BDC1ECE003E55AD /* FacebookFeedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookFeedTableViewController.swift; sourceTree = ""; }; + 2E935F541BDC1EEB003E55AD /* TwitterFeedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterFeedTableViewController.swift; sourceTree = ""; }; + 2E935F561BDC1EF5003E55AD /* InstagramFeedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstagramFeedTableViewController.swift; sourceTree = ""; }; + 2E935F581BDC1EFF003E55AD /* TumblrFeedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TumblrFeedTableViewController.swift; sourceTree = ""; }; + 2E935F5A1BDC1F08003E55AD /* VineFeedTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VineFeedTableViewController.swift; sourceTree = ""; }; + 2E935F601BDC2558003E55AD /* VineFeedCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VineFeedCellController.swift; sourceTree = ""; }; + 2E96A24A1BF1F880000DB006 /* PrivacyPolicyController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacyPolicyController.swift; sourceTree = ""; }; + 2E96A24C1BF27AF4000DB006 /* NetworkSettingsController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkSettingsController.swift; sourceTree = ""; }; + 2E9971561BEC1452004B75C4 /* VineVideoModalController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VineVideoModalController.swift; sourceTree = ""; }; + 2E99EFBA1BD1E1AD00938B04 /* ConversationTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConversationTableViewController.swift; path = comblie/ConversationTableViewController.swift; sourceTree = ""; }; + 2E99EFBD1BD1E27300938B04 /* NotificationTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationTableViewController.swift; sourceTree = ""; }; + 2E99EFC11BD220E600938B04 /* ConversationCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConversationCellController.swift; path = comblie/ConversationCellController.swift; sourceTree = ""; }; + 2E9B580D1BFE5D7A00613C7F /* TumblrPhotoModalController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TumblrPhotoModalController.swift; sourceTree = ""; }; + 2E9E34BF1BD30E19008DE8B0 /* Helvetica Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica Bold.ttf"; sourceTree = ""; }; + 2E9E34C01BD30E19008DE8B0 /* Helvetica-Black-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Black-SemiBold.ttf"; sourceTree = ""; }; + 2E9E34C11BD30E19008DE8B0 /* Helvetica-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Black.otf"; sourceTree = ""; }; + 2E9E34C21BD30E19008DE8B0 /* Helvetica-BlackOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-BlackOblique.otf"; sourceTree = ""; }; + 2E9E34C31BD30E19008DE8B0 /* Helvetica-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Bold.otf"; sourceTree = ""; }; + 2E9E34C41BD30E19008DE8B0 /* Helvetica-BoldOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-BoldOblique.otf"; sourceTree = ""; }; + 2E9E34C51BD30E19008DE8B0 /* Helvetica-Compressed.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Compressed.otf"; sourceTree = ""; }; + 2E9E34C61BD30E19008DE8B0 /* Helvetica-Condensed-Black-Se.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Black-Se.ttf"; sourceTree = ""; }; + 2E9E34C71BD30E19008DE8B0 /* Helvetica-Condensed-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Black.otf"; sourceTree = ""; }; + 2E9E34C81BD30E19008DE8B0 /* Helvetica-Condensed-BlackObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-BlackObl.otf"; sourceTree = ""; }; + 2E9E34C91BD30E19008DE8B0 /* Helvetica-Condensed-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Bold.otf"; sourceTree = ""; }; + 2E9E34CA1BD30E19008DE8B0 /* Helvetica-Condensed-BoldObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-BoldObl.otf"; sourceTree = ""; }; + 2E9E34CB1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Li.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Light-Li.ttf"; sourceTree = ""; }; + 2E9E34CC1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Light-Light.ttf"; sourceTree = ""; }; + 2E9E34CD1BD30E19008DE8B0 /* Helvetica-Condensed-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Light.otf"; sourceTree = ""; }; + 2E9E34CE1BD30E19008DE8B0 /* Helvetica-Condensed-LightObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-LightObl.otf"; sourceTree = ""; }; + 2E9E34CF1BD30E19008DE8B0 /* Helvetica-Condensed-Oblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Oblique.otf"; sourceTree = ""; }; + 2E9E34D01BD30E19008DE8B0 /* Helvetica-Condensed-Thin.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed-Thin.ttf"; sourceTree = ""; }; + 2E9E34D11BD30E19008DE8B0 /* Helvetica-Condensed.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Condensed.otf"; sourceTree = ""; }; + 2E9E34D21BD30E19008DE8B0 /* Helvetica-Conth.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Conth.ttf"; sourceTree = ""; }; + 2E9E34D31BD30E19008DE8B0 /* Helvetica-ExtraCompressed.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-ExtraCompressed.otf"; sourceTree = ""; }; + 2E9E34D41BD30E19008DE8B0 /* Helvetica-Fraction.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Fraction.otf"; sourceTree = ""; }; + 2E9E34D51BD30E19008DE8B0 /* Helvetica-FractionBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-FractionBold.otf"; sourceTree = ""; }; + 2E9E34D61BD30E19008DE8B0 /* Helvetica-Light-Light-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Light-Light-Italic.ttf"; sourceTree = ""; }; + 2E9E34D71BD30E19008DE8B0 /* Helvetica-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Light.otf"; sourceTree = ""; }; + 2E9E34D81BD30E19008DE8B0 /* Helvetica-LightOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-LightOblique.otf"; sourceTree = ""; }; + 2E9E34D91BD30E19008DE8B0 /* Helvetica-Narrow-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Narrow-Bold.otf"; sourceTree = ""; }; + 2E9E34DA1BD30E19008DE8B0 /* Helvetica-Narrow-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Narrow-BoldItalic.otf"; sourceTree = ""; }; + 2E9E34DB1BD30E19008DE8B0 /* Helvetica-Narrow-BoldOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Narrow-BoldOblique.otf"; sourceTree = ""; }; + 2E9E34DC1BD30E19008DE8B0 /* Helvetica-Narrow-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Narrow-Italic.otf"; sourceTree = ""; }; + 2E9E34DD1BD30E19008DE8B0 /* Helvetica-Narrow-Oblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Narrow-Oblique.otf"; sourceTree = ""; }; + 2E9E34DE1BD30E19008DE8B0 /* Helvetica-Narrow.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Narrow.otf"; sourceTree = ""; }; + 2E9E34DF1BD30E19008DE8B0 /* Helvetica-Normal.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Normal.ttf"; sourceTree = ""; }; + 2E9E34E01BD30E19008DE8B0 /* Helvetica-Oblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-Oblique.otf"; sourceTree = ""; }; + 2E9E34E11BD30E19008DE8B0 /* Helvetica-UltraCompressed.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Helvetica-UltraCompressed.otf"; sourceTree = ""; }; + 2E9E34E21BD30E19008DE8B0 /* Helvetica.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Helvetica.otf; sourceTree = ""; }; + 2E9E34E31BD30E19008DE8B0 /* HelveticaBQ-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-Black.otf"; sourceTree = ""; }; + 2E9E34E41BD30E19008DE8B0 /* HelveticaBQ-BlackItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-BlackItalic.otf"; sourceTree = ""; }; + 2E9E34E51BD30E19008DE8B0 /* HelveticaBQ-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-Bold.otf"; sourceTree = ""; }; + 2E9E34E61BD30E19008DE8B0 /* HelveticaBQ-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-BoldItalic.otf"; sourceTree = ""; }; + 2E9E34E71BD30E19008DE8B0 /* HelveticaBQ-DemiBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-DemiBold.otf"; sourceTree = ""; }; + 2E9E34E81BD30E19008DE8B0 /* HelveticaBQ-DemiBoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-DemiBoldItalic.otf"; sourceTree = ""; }; + 2E9E34E91BD30E19008DE8B0 /* HelveticaBQ-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-Italic.otf"; sourceTree = ""; }; + 2E9E34EA1BD30E19008DE8B0 /* HelveticaBQ-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-Light.otf"; sourceTree = ""; }; + 2E9E34EB1BD30E19008DE8B0 /* HelveticaBQ-LightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-LightItalic.otf"; sourceTree = ""; }; + 2E9E34EC1BD30E19008DE8B0 /* HelveticaBQ-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-Medium.otf"; sourceTree = ""; }; + 2E9E34ED1BD30E19008DE8B0 /* HelveticaBQ-MediumItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-MediumItalic.otf"; sourceTree = ""; }; + 2E9E34EE1BD30E19008DE8B0 /* HelveticaBQ-Roman.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-Roman.otf"; sourceTree = ""; }; + 2E9E34EF1BD30E19008DE8B0 /* HelveticaBQ-UltraLight.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaBQ-UltraLight.otf"; sourceTree = ""; }; + 2E9E34F01BD30E19008DE8B0 /* HelveticaCE-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-Bold.otf"; sourceTree = ""; }; + 2E9E34F11BD30E19008DE8B0 /* HelveticaCE-BoldOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-BoldOblique.otf"; sourceTree = ""; }; + 2E9E34F21BD30E19008DE8B0 /* HelveticaCE-Cond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-Cond.otf"; sourceTree = ""; }; + 2E9E34F31BD30E19008DE8B0 /* HelveticaCE-CondBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-CondBold.otf"; sourceTree = ""; }; + 2E9E34F41BD30E19008DE8B0 /* HelveticaCE-CondBoldObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-CondBoldObl.otf"; sourceTree = ""; }; + 2E9E34F51BD30E19008DE8B0 /* HelveticaCE-CondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-CondObl.otf"; sourceTree = ""; }; + 2E9E34F61BD30E19008DE8B0 /* HelveticaCE-Narrow.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-Narrow.otf"; sourceTree = ""; }; + 2E9E34F71BD30E19008DE8B0 /* HelveticaCE-NarrowBold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-NarrowBold.otf"; sourceTree = ""; }; + 2E9E34F81BD30E19008DE8B0 /* HelveticaCE-NarrowBoldOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-NarrowBoldOblique.otf"; sourceTree = ""; }; + 2E9E34F91BD30E19008DE8B0 /* HelveticaCE-NarrowOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-NarrowOblique.otf"; sourceTree = ""; }; + 2E9E34FA1BD30E19008DE8B0 /* HelveticaCE-Oblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCE-Oblique.otf"; sourceTree = ""; }; + 2E9E34FB1BD30E19008DE8B0 /* HelveticaCE.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HelveticaCE.otf; sourceTree = ""; }; + 2E9E34FC1BD30E19008DE8B0 /* HelveticaConBQ-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaConBQ-Bold.otf"; sourceTree = ""; }; + 2E9E34FD1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLight.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaConBQ-ExtraLight.otf"; sourceTree = ""; }; + 2E9E34FE1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaConBQ-ExtraLightItalic.otf"; sourceTree = ""; }; + 2E9E34FF1BD30E19008DE8B0 /* HelveticaConBQ-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaConBQ-Light.otf"; sourceTree = ""; }; + 2E9E35001BD30E19008DE8B0 /* HelveticaConBQ-LightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaConBQ-LightItalic.otf"; sourceTree = ""; }; + 2E9E35011BD30E19008DE8B0 /* HelveticaConBQ-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaConBQ-Medium.otf"; sourceTree = ""; }; + 2E9E35021BD30E19008DE8B0 /* HelveticaCyr-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyr-Bold.otf"; sourceTree = ""; }; + 2E9E35031BD30E19008DE8B0 /* HelveticaCyr-BoldInclined.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyr-BoldInclined.otf"; sourceTree = ""; }; + 2E9E35041BD30E19008DE8B0 /* HelveticaCyr-Inclined.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyr-Inclined.otf"; sourceTree = ""; }; + 2E9E35051BD30E19008DE8B0 /* HelveticaCyr-Upright.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyr-Upright.otf"; sourceTree = ""; }; + 2E9E35061BD30E19008DE8B0 /* HelveticaCyrA-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyrA-Bold.otf"; sourceTree = ""; }; + 2E9E35071BD30E19008DE8B0 /* HelveticaCyrA-BoldInclined.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyrA-BoldInclined.otf"; sourceTree = ""; }; + 2E9E35081BD30E19008DE8B0 /* HelveticaCyrA-Inclined.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyrA-Inclined.otf"; sourceTree = ""; }; + 2E9E35091BD30E19008DE8B0 /* HelveticaCyrA-Upright.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaCyrA-Upright.otf"; sourceTree = ""; }; + 2E9E350A1BD30E19008DE8B0 /* HelveticaDiagonalBQ.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HelveticaDiagonalBQ.otf; sourceTree = ""; }; + 2E9E350B1BD30E19008DE8B0 /* HelveticaExt-No.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExt-No.ttf"; sourceTree = ""; }; + 2E9E350C1BD30E19008DE8B0 /* HelveticaExtendedBQ-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExtendedBQ-Bold.otf"; sourceTree = ""; }; + 2E9E350D1BD30E19008DE8B0 /* HelveticaExtendedBQ-ExtraLight.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExtendedBQ-ExtraLight.otf"; sourceTree = ""; }; + 2E9E350E1BD30E19008DE8B0 /* HelveticaExtendedBQ-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExtendedBQ-Light.otf"; sourceTree = ""; }; + 2E9E350F1BD30E19008DE8B0 /* HelveticaExtendedBQ-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExtendedBQ-Medium.otf"; sourceTree = ""; }; + 2E9E35101BD30E19008DE8B0 /* HelveticaExtO 2.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExtO 2.ttf"; sourceTree = ""; }; + 2E9E35111BD30E19008DE8B0 /* HelveticaExtO 3.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExtO 3.ttf"; sourceTree = ""; }; + 2E9E35121BD30E19008DE8B0 /* HelveticaExtO 4.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaExtO 4.ttf"; sourceTree = ""; }; + 2E9E35131BD30E19008DE8B0 /* HelveticaFractionsBQ.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HelveticaFractionsBQ.otf; sourceTree = ""; }; + 2E9E35141BD30E19008DE8B0 /* HelveticaInserat-Roman-SemiB.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaInserat-Roman-SemiB.ttf"; sourceTree = ""; }; + 2E9E35151BD30E19008DE8B0 /* HelveticaInserat-Roman-SemiBold(1).ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaInserat-Roman-SemiBold(1).ttf"; sourceTree = ""; }; + 2E9E35161BD30E19008DE8B0 /* HelveticaInserat-Roman.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaInserat-Roman.otf"; sourceTree = ""; }; + 2E9E35171BD30E19008DE8B0 /* HelveticaInseratBQ-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaInseratBQ-Italic.otf"; sourceTree = ""; }; + 2E9E35181BD30E19008DE8B0 /* HelveticaInseratBQ-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaInseratBQ-Regular.otf"; sourceTree = ""; }; + 2E9E35191BD30E19008DE8B0 /* HelveticaInseratCyr-Upright.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaInseratCyr-Upright.otf"; sourceTree = ""; }; + 2E9E351A1BD30E19008DE8B0 /* HelveticaInseratLTStd-Roman.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaInseratLTStd-Roman.otf"; sourceTree = ""; }; + 2E9E351B1BD30E19008DE8B0 /* HelveticaLTStd- steevo -Roman - pointed .ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd- steevo -Roman - pointed .ttf"; sourceTree = ""; }; + 2E9E351C1BD30E19008DE8B0 /* HelveticaLTStd-Blk.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Blk.otf"; sourceTree = ""; }; + 2E9E351D1BD30E19008DE8B0 /* HelveticaLTStd-BlkCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-BlkCond.otf"; sourceTree = ""; }; + 2E9E351E1BD30E19008DE8B0 /* HelveticaLTStd-BlkCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-BlkCondObl.otf"; sourceTree = ""; }; + 2E9E351F1BD30E19008DE8B0 /* HelveticaLTStd-BlkObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-BlkObl.otf"; sourceTree = ""; }; + 2E9E35201BD30E19008DE8B0 /* HelveticaLTStd-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Bold.otf"; sourceTree = ""; }; + 2E9E35211BD30E19008DE8B0 /* HelveticaLTStd-BoldCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-BoldCond.otf"; sourceTree = ""; }; + 2E9E35221BD30E19008DE8B0 /* HelveticaLTStd-BoldCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-BoldCondObl.otf"; sourceTree = ""; }; + 2E9E35231BD30E19008DE8B0 /* HelveticaLTStd-BoldObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-BoldObl.otf"; sourceTree = ""; }; + 2E9E35241BD30E19008DE8B0 /* HelveticaLTStd-Comp.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Comp.otf"; sourceTree = ""; }; + 2E9E35251BD30E19008DE8B0 /* HelveticaLTStd-Cond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Cond.otf"; sourceTree = ""; }; + 2E9E35261BD30E19008DE8B0 /* HelveticaLTStd-CondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-CondObl.otf"; sourceTree = ""; }; + 2E9E35271BD30E19008DE8B0 /* HelveticaLTStd-ExtraComp.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-ExtraComp.otf"; sourceTree = ""; }; + 2E9E35281BD30E19008DE8B0 /* HelveticaLTStd-Fractions.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Fractions.otf"; sourceTree = ""; }; + 2E9E35291BD30E19008DE8B0 /* HelveticaLTStd-FractionsBd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-FractionsBd.otf"; sourceTree = ""; }; + 2E9E352A1BD30E19008DE8B0 /* HelveticaLTStd-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Light.otf"; sourceTree = ""; }; + 2E9E352B1BD30E19008DE8B0 /* HelveticaLTStd-LightCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-LightCond.otf"; sourceTree = ""; }; + 2E9E352C1BD30E19008DE8B0 /* HelveticaLTStd-LightCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-LightCondObl.otf"; sourceTree = ""; }; + 2E9E352D1BD30E19008DE8B0 /* HelveticaLTStd-LightObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-LightObl.otf"; sourceTree = ""; }; + 2E9E352E1BD30E19008DE8B0 /* HelveticaLTStd-Obl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Obl.otf"; sourceTree = ""; }; + 2E9E352F1BD30E19008DE8B0 /* HelveticaLTStd-Roman.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-Roman.otf"; sourceTree = ""; }; + 2E9E35301BD30E19008DE8B0 /* HelveticaLTStd-UltraComp.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaLTStd-UltraComp.otf"; sourceTree = ""; }; + 2E9E35311BD30E19008DE8B0 /* HelveticaNeue-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Black.otf"; sourceTree = ""; }; + 2E9E35321BD30E19008DE8B0 /* HelveticaNeue-BlackCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BlackCond.otf"; sourceTree = ""; }; + 2E9E35331BD30E19008DE8B0 /* HelveticaNeue-BlackCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BlackCondObl.otf"; sourceTree = ""; }; + 2E9E35341BD30E19008DE8B0 /* HelveticaNeue-BlackExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BlackExt.otf"; sourceTree = ""; }; + 2E9E35351BD30E19008DE8B0 /* HelveticaNeue-BlackExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BlackExtObl.otf"; sourceTree = ""; }; + 2E9E35361BD30E19008DE8B0 /* HelveticaNeue-BlackItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BlackItalic.otf"; sourceTree = ""; }; + 2E9E35371BD30E19008DE8B0 /* HelveticaNeue-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Bold.otf"; sourceTree = ""; }; + 2E9E35381BD30E19008DE8B0 /* HelveticaNeue-BoldCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BoldCond.otf"; sourceTree = ""; }; + 2E9E35391BD30E19008DE8B0 /* HelveticaNeue-BoldCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BoldCondObl.otf"; sourceTree = ""; }; + 2E9E353A1BD30E19008DE8B0 /* HelveticaNeue-BoldExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BoldExt.otf"; sourceTree = ""; }; + 2E9E353B1BD30E19008DE8B0 /* HelveticaNeue-BoldExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BoldExtObl.otf"; sourceTree = ""; }; + 2E9E353C1BD30E19008DE8B0 /* HelveticaNeue-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BoldItalic.otf"; sourceTree = ""; }; + 2E9E353D1BD30E19008DE8B0 /* HelveticaNeue-BoldOutline.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-BoldOutline.otf"; sourceTree = ""; }; + 2E9E353E1BD30E19008DE8B0 /* HelveticaNeue-Condensed.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Condensed.otf"; sourceTree = ""; }; + 2E9E353F1BD30E19008DE8B0 /* HelveticaNeue-CondensedObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-CondensedObl.otf"; sourceTree = ""; }; + 2E9E35401BD30E19008DE8B0 /* HelveticaNeue-ExtBlackCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ExtBlackCond.otf"; sourceTree = ""; }; + 2E9E35411BD30E19008DE8B0 /* HelveticaNeue-ExtBlackCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ExtBlackCondObl.otf"; sourceTree = ""; }; + 2E9E35421BD30E19008DE8B0 /* HelveticaNeue-Extended.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Extended.otf"; sourceTree = ""; }; + 2E9E35431BD30E19008DE8B0 /* HelveticaNeue-ExtendedObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ExtendedObl.otf"; sourceTree = ""; }; + 2E9E35441BD30E19008DE8B0 /* HelveticaNeue-Heavy.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Heavy.otf"; sourceTree = ""; }; + 2E9E35451BD30E19008DE8B0 /* HelveticaNeue-HeavyCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-HeavyCond.otf"; sourceTree = ""; }; + 2E9E35461BD30E19008DE8B0 /* HelveticaNeue-HeavyCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-HeavyCondObl.otf"; sourceTree = ""; }; + 2E9E35471BD30E19008DE8B0 /* HelveticaNeue-HeavyExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-HeavyExt.otf"; sourceTree = ""; }; + 2E9E35481BD30E19008DE8B0 /* HelveticaNeue-HeavyExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-HeavyExtObl.otf"; sourceTree = ""; }; + 2E9E35491BD30E19008DE8B0 /* HelveticaNeue-HeavyItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-HeavyItalic.otf"; sourceTree = ""; }; + 2E9E354A1BD30E19008DE8B0 /* HelveticaNeue-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Italic.otf"; sourceTree = ""; }; + 2E9E354B1BD30E19008DE8B0 /* HelveticaNeue-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Light.otf"; sourceTree = ""; }; + 2E9E354C1BD30E19008DE8B0 /* HelveticaNeue-LightCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-LightCond.otf"; sourceTree = ""; }; + 2E9E354D1BD30E19008DE8B0 /* HelveticaNeue-LightCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-LightCondObl.otf"; sourceTree = ""; }; + 2E9E354E1BD30E19008DE8B0 /* HelveticaNeue-LightExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-LightExt.otf"; sourceTree = ""; }; + 2E9E354F1BD30E19008DE8B0 /* HelveticaNeue-LightExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-LightExtObl.otf"; sourceTree = ""; }; + 2E9E35501BD30E19008DE8B0 /* HelveticaNeue-LightItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-LightItalic.otf"; sourceTree = ""; }; + 2E9E35511BD30E19008DE8B0 /* HelveticaNeue-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Medium.otf"; sourceTree = ""; }; + 2E9E35521BD30E19008DE8B0 /* HelveticaNeue-MediumCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-MediumCond.otf"; sourceTree = ""; }; + 2E9E35531BD30E19008DE8B0 /* HelveticaNeue-MediumCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-MediumCondObl.otf"; sourceTree = ""; }; + 2E9E35541BD30E19008DE8B0 /* HelveticaNeue-MediumExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-MediumExt.otf"; sourceTree = ""; }; + 2E9E35551BD30E19008DE8B0 /* HelveticaNeue-MediumExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-MediumExtObl.otf"; sourceTree = ""; }; + 2E9E35561BD30E19008DE8B0 /* HelveticaNeue-MediumItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-MediumItalic.otf"; sourceTree = ""; }; + 2E9E35571BD30E19008DE8B0 /* HelveticaNeue-Roman.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Roman.otf"; sourceTree = ""; }; + 2E9E35581BD30E19008DE8B0 /* HelveticaNeue-Thin.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-Thin.otf"; sourceTree = ""; }; + 2E9E35591BD30E19008DE8B0 /* HelveticaNeue-ThinCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ThinCond.otf"; sourceTree = ""; }; + 2E9E355A1BD30E19008DE8B0 /* HelveticaNeue-ThinCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ThinCondObl.otf"; sourceTree = ""; }; + 2E9E355B1BD30E19008DE8B0 /* HelveticaNeue-ThinExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ThinExt.otf"; sourceTree = ""; }; + 2E9E355C1BD30E19008DE8B0 /* HelveticaNeue-ThinExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ThinExtObl.otf"; sourceTree = ""; }; + 2E9E355D1BD30E19008DE8B0 /* HelveticaNeue-ThinItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-ThinItalic.otf"; sourceTree = ""; }; + 2E9E355E1BD30E19008DE8B0 /* HelveticaNeue-UltraLigCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-UltraLigCond.otf"; sourceTree = ""; }; + 2E9E355F1BD30E19008DE8B0 /* HelveticaNeue-UltraLigCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-UltraLigCondObl.otf"; sourceTree = ""; }; + 2E9E35601BD30E19008DE8B0 /* HelveticaNeue-UltraLigExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-UltraLigExt.otf"; sourceTree = ""; }; + 2E9E35611BD30E19008DE8B0 /* HelveticaNeue-UltraLigExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-UltraLigExtObl.otf"; sourceTree = ""; }; + 2E9E35621BD30E19008DE8B0 /* HelveticaNeue-UltraLight.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-UltraLight.otf"; sourceTree = ""; }; + 2E9E35631BD30E19008DE8B0 /* HelveticaNeue-UltraLightItal.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeue-UltraLightItal.otf"; sourceTree = ""; }; + 2E9E35641BD30E19008DE8B0 /* HelveticaNeueLT-BlackCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BlackCond.otf"; sourceTree = ""; }; + 2E9E35651BD30E19008DE8B0 /* HelveticaNeueLT-BlackCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BlackCondObl.otf"; sourceTree = ""; }; + 2E9E35661BD30E19008DE8B0 /* HelveticaNeueLT-BlackExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BlackExt.otf"; sourceTree = ""; }; + 2E9E35671BD30E19008DE8B0 /* HelveticaNeueLT-BlackExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BlackExtObl.otf"; sourceTree = ""; }; + 2E9E35681BD30E19008DE8B0 /* HelveticaNeueLT-BoldCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BoldCond.otf"; sourceTree = ""; }; + 2E9E35691BD30E19008DE8B0 /* HelveticaNeueLT-BoldCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BoldCondObl.otf"; sourceTree = ""; }; + 2E9E356A1BD30E19008DE8B0 /* HelveticaNeueLT-BoldExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BoldExt.otf"; sourceTree = ""; }; + 2E9E356B1BD30E19008DE8B0 /* HelveticaNeueLT-BoldExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BoldExtObl.otf"; sourceTree = ""; }; + 2E9E356C1BD30E19008DE8B0 /* HelveticaNeueLT-BoldOutline.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-BoldOutline.otf"; sourceTree = ""; }; + 2E9E356D1BD30E19008DE8B0 /* HelveticaNeueLT-Condensed.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-Condensed.otf"; sourceTree = ""; }; + 2E9E356E1BD30E19008DE8B0 /* HelveticaNeueLT-CondensedObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-CondensedObl.otf"; sourceTree = ""; }; + 2E9E356F1BD30E19008DE8B0 /* HelveticaNeueLT-ExtBlackCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-ExtBlackCond.otf"; sourceTree = ""; }; + 2E9E35701BD30E19008DE8B0 /* HelveticaNeueLT-ExtBlackCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-ExtBlackCondObl.otf"; sourceTree = ""; }; + 2E9E35711BD30E19008DE8B0 /* HelveticaNeueLT-Extended.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-Extended.otf"; sourceTree = ""; }; + 2E9E35721BD30E19008DE8B0 /* HelveticaNeueLT-ExtendedObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-ExtendedObl.otf"; sourceTree = ""; }; + 2E9E35731BD30E19008DE8B0 /* HelveticaNeueLT-HeavyCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-HeavyCond.otf"; sourceTree = ""; }; + 2E9E35741BD30E19008DE8B0 /* HelveticaNeueLT-HeavyCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-HeavyCondObl.otf"; sourceTree = ""; }; + 2E9E35751BD30E19008DE8B0 /* HelveticaNeueLT-HeavyExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-HeavyExt.otf"; sourceTree = ""; }; + 2E9E35761BD30E19008DE8B0 /* HelveticaNeueLT-HeavyExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-HeavyExtObl.otf"; sourceTree = ""; }; + 2E9E35771BD30E19008DE8B0 /* HelveticaNeueLT-LightCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-LightCond.otf"; sourceTree = ""; }; + 2E9E35781BD30E19008DE8B0 /* HelveticaNeueLT-LightCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-LightCondObl.otf"; sourceTree = ""; }; + 2E9E35791BD30E19008DE8B0 /* HelveticaNeueLT-LightExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-LightExt.otf"; sourceTree = ""; }; + 2E9E357A1BD30E19008DE8B0 /* HelveticaNeueLT-LightExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-LightExtObl.otf"; sourceTree = ""; }; + 2E9E357B1BD30E19008DE8B0 /* HelveticaNeueLT-MediumCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-MediumCond.otf"; sourceTree = ""; }; + 2E9E357C1BD30E19008DE8B0 /* HelveticaNeueLT-MediumCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-MediumCondObl.otf"; sourceTree = ""; }; + 2E9E357D1BD30E19008DE8B0 /* HelveticaNeueLT-MediumExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-MediumExt.otf"; sourceTree = ""; }; + 2E9E357E1BD30E19008DE8B0 /* HelveticaNeueLT-MediumExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-MediumExtObl.otf"; sourceTree = ""; }; + 2E9E357F1BD30E19008DE8B0 /* HelveticaNeueLT-ThinCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-ThinCond.otf"; sourceTree = ""; }; + 2E9E35801BD30E19008DE8B0 /* HelveticaNeueLT-ThinCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-ThinCondObl.otf"; sourceTree = ""; }; + 2E9E35811BD30E19008DE8B0 /* HelveticaNeueLT-ThinExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-ThinExt.otf"; sourceTree = ""; }; + 2E9E35821BD30E19008DE8B0 /* HelveticaNeueLT-ThinExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-ThinExtObl.otf"; sourceTree = ""; }; + 2E9E35831BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-UltraLigCond.otf"; sourceTree = ""; }; + 2E9E35841BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-UltraLigCondObl.otf"; sourceTree = ""; }; + 2E9E35851BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigExt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-UltraLigExt.otf"; sourceTree = ""; }; + 2E9E35861BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigExtObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLT-UltraLigExtObl.otf"; sourceTree = ""; }; + 2E9E35871BD30E19008DE8B0 /* HelveticaNeueLTStd-Bd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Bd.otf"; sourceTree = ""; }; + 2E9E35881BD30E19008DE8B0 /* HelveticaNeueLTStd-BdCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BdCn.otf"; sourceTree = ""; }; + 2E9E35891BD30E19008DE8B0 /* HelveticaNeueLTStd-BdCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BdCnO.otf"; sourceTree = ""; }; + 2E9E358A1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdEx.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BdEx.otf"; sourceTree = ""; }; + 2E9E358B1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BdExO.otf"; sourceTree = ""; }; + 2E9E358C1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdIt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BdIt.otf"; sourceTree = ""; }; + 2E9E358D1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdOu.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BdOu.otf"; sourceTree = ""; }; + 2E9E358E1BD30E19008DE8B0 /* HelveticaNeueLTStd-Blk.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Blk.otf"; sourceTree = ""; }; + 2E9E358F1BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BlkCn.otf"; sourceTree = ""; }; + 2E9E35901BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BlkCnO.otf"; sourceTree = ""; }; + 2E9E35911BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkEx.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BlkEx.otf"; sourceTree = ""; }; + 2E9E35921BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BlkExO.otf"; sourceTree = ""; }; + 2E9E35931BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkIt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-BlkIt.otf"; sourceTree = ""; }; + 2E9E35941BD30E19008DE8B0 /* HelveticaNeueLTStd-Cn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Cn.otf"; sourceTree = ""; }; + 2E9E35951BD30E19008DE8B0 /* HelveticaNeueLTStd-CnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-CnO.otf"; sourceTree = ""; }; + 2E9E35961BD30E19008DE8B0 /* HelveticaNeueLTStd-Ex.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Ex.otf"; sourceTree = ""; }; + 2E9E35971BD30E19008DE8B0 /* HelveticaNeueLTStd-ExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-ExO.otf"; sourceTree = ""; }; + 2E9E35981BD30E19008DE8B0 /* HelveticaNeueLTStd-Hv.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Hv.otf"; sourceTree = ""; }; + 2E9E35991BD30E19008DE8B0 /* HelveticaNeueLTStd-HvCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-HvCn.otf"; sourceTree = ""; }; + 2E9E359A1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-HvCnO.otf"; sourceTree = ""; }; + 2E9E359B1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvEx.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-HvEx.otf"; sourceTree = ""; }; + 2E9E359C1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-HvExO.otf"; sourceTree = ""; }; + 2E9E359D1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvIt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-HvIt.otf"; sourceTree = ""; }; + 2E9E359E1BD30E19008DE8B0 /* HelveticaNeueLTStd-It.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-It.otf"; sourceTree = ""; }; + 2E9E359F1BD30E19008DE8B0 /* HelveticaNeueLTStd-Lt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Lt.otf"; sourceTree = ""; }; + 2E9E35A01BD30E19008DE8B0 /* HelveticaNeueLTStd-LtCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-LtCn.otf"; sourceTree = ""; }; + 2E9E35A11BD30E19008DE8B0 /* HelveticaNeueLTStd-LtCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-LtCnO.otf"; sourceTree = ""; }; + 2E9E35A21BD30E19008DE8B0 /* HelveticaNeueLTStd-LtEx.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-LtEx.otf"; sourceTree = ""; }; + 2E9E35A31BD30E19008DE8B0 /* HelveticaNeueLTStd-LtExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-LtExO.otf"; sourceTree = ""; }; + 2E9E35A41BD30E19008DE8B0 /* HelveticaNeueLTStd-LtIt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-LtIt.otf"; sourceTree = ""; }; + 2E9E35A51BD30E19008DE8B0 /* HelveticaNeueLTStd-Md.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Md.otf"; sourceTree = ""; }; + 2E9E35A61BD30E19008DE8B0 /* HelveticaNeueLTStd-MdCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-MdCn.otf"; sourceTree = ""; }; + 2E9E35A71BD30E19008DE8B0 /* HelveticaNeueLTStd-MdCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-MdCnO.otf"; sourceTree = ""; }; + 2E9E35A81BD30E19008DE8B0 /* HelveticaNeueLTStd-MdEx.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-MdEx.otf"; sourceTree = ""; }; + 2E9E35A91BD30E19008DE8B0 /* HelveticaNeueLTStd-MdExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-MdExO.otf"; sourceTree = ""; }; + 2E9E35AA1BD30E19008DE8B0 /* HelveticaNeueLTStd-MdIt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-MdIt.otf"; sourceTree = ""; }; + 2E9E35AB1BD30E19008DE8B0 /* HelveticaNeueLTStd-Roman.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Roman.otf"; sourceTree = ""; }; + 2E9E35AC1BD30E19008DE8B0 /* HelveticaNeueLTStd-Th.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-Th.otf"; sourceTree = ""; }; + 2E9E35AD1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-ThCn.otf"; sourceTree = ""; }; + 2E9E35AE1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-ThCnO.otf"; sourceTree = ""; }; + 2E9E35AF1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThEx.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-ThEx.otf"; sourceTree = ""; }; + 2E9E35B01BD30E19008DE8B0 /* HelveticaNeueLTStd-ThExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-ThExO.otf"; sourceTree = ""; }; + 2E9E35B11BD30E19008DE8B0 /* HelveticaNeueLTStd-ThIt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-ThIt.otf"; sourceTree = ""; }; + 2E9E35B21BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-UltLt.otf"; sourceTree = ""; }; + 2E9E35B31BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-UltLtCn.otf"; sourceTree = ""; }; + 2E9E35B41BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-UltLtCnO.otf"; sourceTree = ""; }; + 2E9E35B51BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtEx.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-UltLtEx.otf"; sourceTree = ""; }; + 2E9E35B61BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtExO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-UltLtExO.otf"; sourceTree = ""; }; + 2E9E35B71BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtIt.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-UltLtIt.otf"; sourceTree = ""; }; + 2E9E35B81BD30E19008DE8B0 /* HelveticaNeueLTStd-XBlkCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-XBlkCn.otf"; sourceTree = ""; }; + 2E9E35B91BD30E19008DE8B0 /* HelveticaNeueLTStd-XBlkCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaNeueLTStd-XBlkCnO.otf"; sourceTree = ""; }; + 2E9E35BA1BD30E19008DE8B0 /* HelveticaObl-He.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaObl-He.ttf"; sourceTree = ""; }; + 2E9E35BB1BD30E19008DE8B0 /* HelveticaObl-Li.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaObl-Li.ttf"; sourceTree = ""; }; + 2E9E35BC1BD30E19008DE8B0 /* HelveticaObl-Th.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaObl-Th.ttf"; sourceTree = ""; }; + 2E9E35BD1BD30E19008DE8B0 /* HelveticaRounded-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRounded-Black.otf"; sourceTree = ""; }; + 2E9E35BE1BD30E19008DE8B0 /* HelveticaRounded-BlackObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRounded-BlackObl.otf"; sourceTree = ""; }; + 2E9E35BF1BD30E19008DE8B0 /* HelveticaRounded-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRounded-Bold.otf"; sourceTree = ""; }; + 2E9E35C01BD30E19008DE8B0 /* HelveticaRounded-BoldCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRounded-BoldCond.otf"; sourceTree = ""; }; + 2E9E35C11BD30E19008DE8B0 /* HelveticaRounded-BoldCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRounded-BoldCondObl.otf"; sourceTree = ""; }; + 2E9E35C21BD30E19008DE8B0 /* HelveticaRounded-BoldObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRounded-BoldObl.otf"; sourceTree = ""; }; + 2E9E35C31BD30E19008DE8B0 /* HelveticaRoundedLT-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLT-Black.otf"; sourceTree = ""; }; + 2E9E35C41BD30E19008DE8B0 /* HelveticaRoundedLT-BlackObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLT-BlackObl.otf"; sourceTree = ""; }; + 2E9E35C51BD30E19008DE8B0 /* HelveticaRoundedLT-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLT-Bold.otf"; sourceTree = ""; }; + 2E9E35C61BD30E19008DE8B0 /* HelveticaRoundedLT-BoldCond.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLT-BoldCond.otf"; sourceTree = ""; }; + 2E9E35C71BD30E19008DE8B0 /* HelveticaRoundedLT-BoldCondObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLT-BoldCondObl.otf"; sourceTree = ""; }; + 2E9E35C81BD30E19008DE8B0 /* HelveticaRoundedLT-BoldObl.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLT-BoldObl.otf"; sourceTree = ""; }; + 2E9E35C91BD30E19008DE8B0 /* HelveticaRoundedLTStd-Bd.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLTStd-Bd.otf"; sourceTree = ""; }; + 2E9E35CA1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdCn.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLTStd-BdCn.otf"; sourceTree = ""; }; + 2E9E35CB1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdCnO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLTStd-BdCnO.otf"; sourceTree = ""; }; + 2E9E35CC1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLTStd-BdO.otf"; sourceTree = ""; }; + 2E9E35CD1BD30E19008DE8B0 /* HelveticaRoundedLTStd-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLTStd-Black.otf"; sourceTree = ""; }; + 2E9E35CE1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BlkO.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaRoundedLTStd-BlkO.otf"; sourceTree = ""; }; + 2E9E35CF1BD30E19008DE8B0 /* HelveticaTwoBQ-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaTwoBQ-Bold.otf"; sourceTree = ""; }; + 2E9E35D01BD30E19008DE8B0 /* HelveticaTwoBQ-BoldItalic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaTwoBQ-BoldItalic.otf"; sourceTree = ""; }; + 2E9E35D11BD30E19008DE8B0 /* HelveticaTwoBQ-Italic.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaTwoBQ-Italic.otf"; sourceTree = ""; }; + 2E9E35D21BD30E19008DE8B0 /* HelveticaTwoBQ-Roman.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaTwoBQ-Roman.otf"; sourceTree = ""; }; + 2E9E35D31BD30E19008DE8B0 /* HelveticaWorld-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaWorld-Bold.ttf"; sourceTree = ""; }; + 2E9E35D41BD30E19008DE8B0 /* HelveticaWorld-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaWorld-BoldItalic.ttf"; sourceTree = ""; }; + 2E9E35D51BD30E19008DE8B0 /* HelveticaWorld-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaWorld-Italic.ttf"; sourceTree = ""; }; + 2E9E35D61BD30E19008DE8B0 /* HelveticaWorld-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelveticaWorld-Regular.ttf"; sourceTree = ""; }; + 2E9E35D71BD30E19008DE8B0 /* HelvFB Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFB Bold.ttf"; sourceTree = ""; }; + 2E9E35D81BD30E19008DE8B0 /* HelvFB BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFB BoldOblique.ttf"; sourceTree = ""; }; + 2E9E35D91BD30E19008DE8B0 /* HelvFB Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFB Oblique.ttf"; sourceTree = ""; }; + 2E9E35DA1BD30E19008DE8B0 /* HelvFB-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFB-Bold.otf"; sourceTree = ""; }; + 2E9E35DB1BD30E19008DE8B0 /* HelvFB-BoldOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFB-BoldOblique.otf"; sourceTree = ""; }; + 2E9E35DC1BD30E19008DE8B0 /* HelvFB-Oblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFB-Oblique.otf"; sourceTree = ""; }; + 2E9E35DD1BD30E19008DE8B0 /* HelvFB.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HelvFB.otf; sourceTree = ""; }; + 2E9E35DE1BD30E19008DE8B0 /* HelvFE Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFE Bold.ttf"; sourceTree = ""; }; + 2E9E35DF1BD30E19008DE8B0 /* HelvFE BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFE BoldOblique.ttf"; sourceTree = ""; }; + 2E9E35E01BD30E19008DE8B0 /* HelvFE Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFE Oblique.ttf"; sourceTree = ""; }; + 2E9E35E11BD30E19008DE8B0 /* HelvFE-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFE-Bold.otf"; sourceTree = ""; }; + 2E9E35E21BD30E19008DE8B0 /* HelvFE-BoldOblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFE-BoldOblique.otf"; sourceTree = ""; }; + 2E9E35E31BD30E19008DE8B0 /* HelvFE-Oblique.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvFE-Oblique.otf"; sourceTree = ""; }; + 2E9E35E41BD30E19008DE8B0 /* HelvFE.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = HelvFE.otf; sourceTree = ""; }; + 2E9E35E51BD30E19008DE8B0 /* HelvLight Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "HelvLight Regular.ttf"; sourceTree = ""; }; + 2EA69A201BFE7994004AF7E4 /* VineHeaderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VineHeaderCell.xib; sourceTree = ""; }; + 2EA69A221BFE7E1C004AF7E4 /* TumblrHeaderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TumblrHeaderCell.xib; sourceTree = ""; }; + 2EA69A241BFE81CD004AF7E4 /* TwitterHeaderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TwitterHeaderCell.xib; sourceTree = ""; }; + 2EA69A261BFE8526004AF7E4 /* FacebookStatusCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FacebookStatusCell.xib; sourceTree = ""; }; + 2EA69A281BFE85C3004AF7E4 /* FacebookHeaderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FacebookHeaderCell.xib; sourceTree = ""; }; + 2EA69A2A1BFE8687004AF7E4 /* FacebookFeedDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FacebookFeedDatasource.swift; sourceTree = ""; }; + 2EB579441BDF86810026F284 /* InstagramProfileController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InstagramProfileController.swift; path = comblie/InstagramProfileController.swift; sourceTree = ""; }; + 2EB7E7CA1BEB1077002605C8 /* FeedbackController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedbackController.swift; sourceTree = ""; }; + 2EBDDB771C003F7A00DA5DC8 /* NotificationDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationDatasource.swift; sourceTree = ""; }; + 2EBDDB791C00400E00DA5DC8 /* NotificationCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NotificationCell.xib; sourceTree = ""; }; + 2EC06ED81C052C1900ABA888 /* PublicProfileController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PublicProfileController.swift; sourceTree = ""; }; + 2EC06EDA1C05393600ABA888 /* FeedHeader.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FeedHeader.xib; sourceTree = ""; }; + 2EC206BD1BFAC9570068AE1E /* InstagramFeedDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstagramFeedDatasource.swift; sourceTree = ""; }; + 2EC206BF1BFBFF6C0068AE1E /* VineFeedDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VineFeedDatasource.swift; sourceTree = ""; }; + 2EC206C11BFC0BD30068AE1E /* TwitterFeedDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterFeedDatasource.swift; sourceTree = ""; }; + 2EC206C31BFC48270068AE1E /* TumblrFeedDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TumblrFeedDatasource.swift; sourceTree = ""; }; + 2EC9DC5F1BCE2D68009BD4B0 /* SocialTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocialTabBarController.swift; sourceTree = ""; }; + 2ECCC2D81BFECF6100FF0355 /* ConversationListDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConversationListDatasource.swift; sourceTree = ""; }; + 2ECCC2E61BFEDFD900FF0355 /* ConversationCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConversationCell.xib; sourceTree = ""; }; + 2ECCC2E81BFEE87C00FF0355 /* IncomingMessageCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IncomingMessageCell.xib; sourceTree = ""; }; + 2ECCC2EA1BFEE88900FF0355 /* OutgoingMessageCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OutgoingMessageCell.xib; sourceTree = ""; }; + 2ECCC2EC1BFEE89200FF0355 /* TimeMessageCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TimeMessageCell.xib; sourceTree = ""; }; + 2ECCC2EE1BFEEA5500FF0355 /* IncomingMessageTwoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IncomingMessageTwoCell.xib; sourceTree = ""; }; + 2ECCC2F01BFEF0DC00FF0355 /* MessageRoomDatasource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageRoomDatasource.swift; sourceTree = ""; }; + 2ED323DF1BDDFBF400EEDA16 /* TimeMessageCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeMessageCellController.swift; sourceTree = ""; }; + 2ED323E11BDDFEA800EEDA16 /* IncomingMessageTwoCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IncomingMessageTwoCellController.swift; path = comblie/IncomingMessageTwoCellController.swift; sourceTree = ""; }; + 2EDC72E91BD0BB020050E031 /* FeedPageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedPageController.swift; sourceTree = ""; }; + 2EDFE3A61BD0261000C85CB5 /* NotificationPageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationPageController.swift; sourceTree = ""; }; + 2EDFE3AA1BD03C0200C85CB5 /* MessagePageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessagePageController.swift; sourceTree = ""; }; + 2EE1AD251BF3F0BB00A54B49 /* WebsiteController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebsiteController.swift; sourceTree = ""; }; + 2EEB11E31BE0AE5000DA8492 /* TwitterPhotoCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterPhotoCellController.swift; sourceTree = ""; }; + 2EEB11E51BE16A4100DA8492 /* TwitterTweetCellController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterTweetCellController.swift; sourceTree = ""; }; + 2EFF739A1BCE5CB7005CC408 /* SocialTabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocialTabViewController.swift; path = ../SocialTabViewController.swift; sourceTree = ""; }; + 690233031BCF6A73001AB41B /* InstagramAPIManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstagramAPIManager.swift; sourceTree = ""; }; + 690233071BCF6AEF001AB41B /* FeedRequestManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedRequestManager.swift; sourceTree = ""; }; + 690233091BCF6B0D001AB41B /* KeychainWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = KeychainWrapper.swift; path = ../KeychainWrapper.swift; sourceTree = ""; }; + 6902330B1BCF6B55001AB41B /* UserDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDataManager.swift; sourceTree = ""; }; + 6926C8711BD0A3D2007C3FAE /* FBSDKCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = FBSDKCoreKit.framework; sourceTree = ""; }; + 6926C8731BD0A3DD007C3FAE /* FBSDKLoginKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = FBSDKLoginKit.framework; sourceTree = ""; }; + 698257831BD808BF0062AD39 /* NetworkClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkClass.swift; sourceTree = ""; }; + 69B30BD81BD5F11500F03990 /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Fabric.framework; sourceTree = ""; }; + 69B30BD91BD5F11500F03990 /* TwitterKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TwitterKit.framework; sourceTree = ""; }; + 69B30BDA1BD5F11500F03990 /* TwitterKitResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = TwitterKitResources.bundle; path = TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle; sourceTree = ""; }; + 69B30BDB1BD5F11500F03990 /* TwitterCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TwitterCore.framework; sourceTree = ""; }; + 69BB36941BD496A2000362D1 /* FirebaseIOManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirebaseIOManager.swift; sourceTree = ""; }; + 69BF17201BDA876C008A726F /* NetworkFeedClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkFeedClass.swift; sourceTree = ""; }; + 69BF17221BDA89E2008A726F /* NetworkNotificationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkNotificationManager.swift; sourceTree = ""; }; + 69BF17241BDA949D008A726F /* NotificationRequestManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationRequestManager.swift; sourceTree = ""; }; + 69E2728F1BD843FB00259A44 /* Networks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Networks.swift; sourceTree = ""; }; + 8955C66DCB0E3C6097EA0C7A /* Pods_comblie.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_comblie.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BC668777F91F5EDBE963466E /* Pods-comblie.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-comblie.debug.xcconfig"; path = "Pods/Target Support Files/Pods-comblie/Pods-comblie.debug.xcconfig"; sourceTree = ""; }; + DC8FBA28703283B1CD91C418 /* Pods-comblie.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-comblie.release.xcconfig"; path = "Pods/Target Support Files/Pods-comblie/Pods-comblie.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2E0064221BC65F1B004C5BBF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 47FF81D22CD0D2966776C0FD /* Pods_comblie.framework in Frameworks */, + 69B30BDF1BD5F11500F03990 /* TwitterCore.framework in Frameworks */, + 69B30BDD1BD5F11500F03990 /* TwitterKit.framework in Frameworks */, + 6926C8721BD0A3D2007C3FAE /* FBSDKCoreKit.framework in Frameworks */, + 6926C8741BD0A3DD007C3FAE /* FBSDKLoginKit.framework in Frameworks */, + 69B30BDC1BD5F11500F03990 /* Fabric.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2E0064361BC65F1B004C5BBF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2E0064411BC65F1B004C5BBF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2E00641C1BC65F1B004C5BBF = { + isa = PBXGroup; + children = ( + 69B30BD81BD5F11500F03990 /* Fabric.framework */, + 69B30BD91BD5F11500F03990 /* TwitterKit.framework */, + 69B30BDA1BD5F11500F03990 /* TwitterKitResources.bundle */, + 69B30BDB1BD5F11500F03990 /* TwitterCore.framework */, + 6926C8731BD0A3DD007C3FAE /* FBSDKLoginKit.framework */, + 6926C8711BD0A3D2007C3FAE /* FBSDKCoreKit.framework */, + 2E0064271BC65F1B004C5BBF /* comblie */, + 2E00643C1BC65F1B004C5BBF /* comblieTests */, + 2E0064471BC65F1B004C5BBF /* comblieUITests */, + 2E0064261BC65F1B004C5BBF /* Products */, + F86FE8BA45E38AAAA087583F /* Pods */, + E37AFAA3534564715A3657DF /* Frameworks */, + ); + sourceTree = ""; + }; + 2E0064261BC65F1B004C5BBF /* Products */ = { + isa = PBXGroup; + children = ( + 2E0064251BC65F1B004C5BBF /* comblie.app */, + 2E0064391BC65F1B004C5BBF /* comblieTests.xctest */, + 2E0064441BC65F1B004C5BBF /* comblieUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 2E0064271BC65F1B004C5BBF /* comblie */ = { + isa = PBXGroup; + children = ( + 2E9E34BD1BD30E19008DE8B0 /* Resources */, + 69BF171F1BD9C92D008A726F /* HTTPManager */, + 690233021BCF6A52001AB41B /* NetworkManager */, + 2E0064281BC65F1B004C5BBF /* AppDelegate.swift */, + 2EC06ED81C052C1900ABA888 /* PublicProfileController.swift */, + 2E00642C1BC65F1B004C5BBF /* Main.storyboard */, + 2E86DC3F1C0E7BE5001C62CF /* ComposeViewController.swift */, + 2E00642A1BC65F1B004C5BBF /* HomeViewController.swift */, + 2E0256C41BCB84CE009490C2 /* MainViewController.swift */, + 2E04CA8E1BCD0A38003F271B /* LoginViewControllers */, + 2E04CA8D1BCD09F9003F271B /* PageViewControllers */, + 2E04CA8C1BCD09C6003F271B /* SocialViewControllers */, + 2E99EFBC1BD1E1C200938B04 /* TableViewControllers */, + 2E00642F1BC65F1B004C5BBF /* Assets.xcassets */, + 2E0064311BC65F1B004C5BBF /* LaunchScreen.storyboard */, + 2E0064341BC65F1B004C5BBF /* Info.plist */, + ); + path = comblie; + sourceTree = ""; + }; + 2E00643C1BC65F1B004C5BBF /* comblieTests */ = { + isa = PBXGroup; + children = ( + 2E00643D1BC65F1B004C5BBF /* comblieTests.swift */, + 2E00643F1BC65F1B004C5BBF /* Info.plist */, + ); + path = comblieTests; + sourceTree = ""; + }; + 2E0064471BC65F1B004C5BBF /* comblieUITests */ = { + isa = PBXGroup; + children = ( + 2E0064481BC65F1B004C5BBF /* comblieUITests.swift */, + 2E00644A1BC65F1B004C5BBF /* Info.plist */, + ); + path = comblieUITests; + sourceTree = ""; + }; + 2E01FA2D1BFEFF5E00E79353 /* Comments */ = { + isa = PBXGroup; + children = ( + 2E1CD22F1BEFD8A200418C02 /* CommentCell.xib */, + 2E0E3C841BEFDFBE001CAA05 /* CommentCellController.swift */, + 2E799B401BEF10FF0030803B /* CommentsController.swift */, + ); + name = Comments; + sourceTree = ""; + }; + 2E04CA8C1BCD09C6003F271B /* SocialViewControllers */ = { + isa = PBXGroup; + children = ( + 2EFF739A1BCE5CB7005CC408 /* SocialTabViewController.swift */, + 2EC9DC5F1BCE2D68009BD4B0 /* SocialTabBarController.swift */, + ); + name = SocialViewControllers; + sourceTree = ""; + }; + 2E04CA8D1BCD09F9003F271B /* PageViewControllers */ = { + isa = PBXGroup; + children = ( + 2E155E301BD85EE200868F2C /* Notifications */, + 2E155E2F1BD85ED500868F2C /* Feeds */, + 2E155E2E1BD85ECC00868F2C /* Profiles */, + 2E155E2D1BD85EAD00868F2C /* Messages */, + 2E0A89021BE99372009FB358 /* Settings */, + ); + name = PageViewControllers; + path = ..; + sourceTree = ""; + }; + 2E04CA8E1BCD0A38003F271B /* LoginViewControllers */ = { + isa = PBXGroup; + children = ( + 2E7A7A1A1BD7074B00A3CB7F /* VineLoginController.swift */, + 2E0256C61BCB934A009490C2 /* SocialLoginViewController.swift */, + 2E0064601BC731EA004C5BBF /* RegistrationViewController.swift */, + 2E0064561BC66E19004C5BBF /* LoginViewController.swift */, + ); + name = LoginViewControllers; + sourceTree = ""; + }; + 2E0A89021BE99372009FB358 /* Settings */ = { + isa = PBXGroup; + children = ( + 2E0A89031BE993A5009FB358 /* SettingsPageController.swift */, + 2E4E90F91BE9AFD900C3D780 /* SettingsTableController.swift */, + 2E8030871BEAE90500A8069C /* PushNotificationsController.swift */, + 2E8030891BEAF90000A8069C /* ReportProblemController.swift */, + 2EB7E7CA1BEB1077002605C8 /* FeedbackController.swift */, + 2E3C9B2D1BEB1FF900A7C86F /* TermsConditionsController.swift */, + 2E96A24A1BF1F880000DB006 /* PrivacyPolicyController.swift */, + 2E96A24C1BF27AF4000DB006 /* NetworkSettingsController.swift */, + 2EE1AD251BF3F0BB00A54B49 /* WebsiteController.swift */, + ); + name = Settings; + sourceTree = ""; + }; + 2E155E2D1BD85EAD00868F2C /* Messages */ = { + isa = PBXGroup; + children = ( + 2EDFE3AA1BD03C0200C85CB5 /* MessagePageController.swift */, + 2E155E2B1BD85EA100868F2C /* MessageRoomViewController.swift */, + 2E155E311BD8636800868F2C /* MessageRoomTableViewController.swift */, + 2ECCC2F01BFEF0DC00FF0355 /* MessageRoomDatasource.swift */, + 2E99EFBA1BD1E1AD00938B04 /* ConversationTableViewController.swift */, + 2ECCC2D81BFECF6100FF0355 /* ConversationListDatasource.swift */, + 2E99EFC11BD220E600938B04 /* ConversationCellController.swift */, + 2E380B961BDDA32C00803B8C /* IncomingMessageCellController.swift */, + 2ED323E11BDDFEA800EEDA16 /* IncomingMessageTwoCellController.swift */, + 2E380B981BDDA69600803B8C /* OutgoingMessageCellController.swift */, + 2ED323DF1BDDFBF400EEDA16 /* TimeMessageCellController.swift */, + 2ECCC2E61BFEDFD900FF0355 /* ConversationCell.xib */, + 2ECCC2E81BFEE87C00FF0355 /* IncomingMessageCell.xib */, + 2ECCC2EA1BFEE88900FF0355 /* OutgoingMessageCell.xib */, + 2ECCC2EC1BFEE89200FF0355 /* TimeMessageCell.xib */, + 2ECCC2EE1BFEEA5500FF0355 /* IncomingMessageTwoCell.xib */, + ); + name = Messages; + sourceTree = ""; + }; + 2E155E2E1BD85ECC00868F2C /* Profiles */ = { + isa = PBXGroup; + children = ( + 2E556A421BCCEF2500623A80 /* ProfilePageController.swift */, + 2E81062C1BDA2D20005577F6 /* VineNOTUSED */, + 2E81062B1BDA2D0F005577F6 /* TumblrNOTUSED */, + 2E8106261BDA2985005577F6 /* Instagram */, + 2E45ECBD1BDA089700AF1F18 /* TwitterNOTUSED */, + 2E45ECB81BD9FDAA00AF1F18 /* FacebookNOTUSED */, + ); + name = Profiles; + sourceTree = ""; + }; + 2E155E2F1BD85ED500868F2C /* Feeds */ = { + isa = PBXGroup; + children = ( + 2EDC72E91BD0BB020050E031 /* FeedPageController.swift */, + 2EC06EDA1C05393600ABA888 /* FeedHeader.xib */, + 2E01FA2D1BFEFF5E00E79353 /* Comments */, + 2E5EBCFC1BE847B200B646BA /* AllFeeds */, + 2E935F4D1BDC1E66003E55AD /* Facebook */, + 2E935F4E1BDC1E73003E55AD /* Twitter */, + 2E935F4F1BDC1E82003E55AD /* Instagram */, + 2E935F501BDC1E94003E55AD /* Tumblr */, + 2E935F511BDC1EA1003E55AD /* Vine */, + ); + name = Feeds; + sourceTree = ""; + }; + 2E155E301BD85EE200868F2C /* Notifications */ = { + isa = PBXGroup; + children = ( + 2EDFE3A61BD0261000C85CB5 /* NotificationPageController.swift */, + 2E4D7F881BD375F50025A0A1 /* NotificationCell.swift */, + ); + name = Notifications; + sourceTree = ""; + }; + 2E45ECB81BD9FDAA00AF1F18 /* FacebookNOTUSED */ = { + isa = PBXGroup; + children = ( + 2E45ECB91BD9FE2D00AF1F18 /* FacebookProfileTableViewController.swift */, + ); + name = FacebookNOTUSED; + sourceTree = ""; + }; + 2E45ECBD1BDA089700AF1F18 /* TwitterNOTUSED */ = { + isa = PBXGroup; + children = ( + 2E45ECC01BDA08C700AF1F18 /* TwitterProfileTableViewController.swift */, + ); + name = TwitterNOTUSED; + sourceTree = ""; + }; + 2E5EBCFC1BE847B200B646BA /* AllFeeds */ = { + isa = PBXGroup; + children = ( + 2E5EBCFD1BE847F900B646BA /* AllFeedTableViewController.swift */, + 2E1E73431BFD8D6B009F26F9 /* AllFeedDatasource.swift */, + ); + name = AllFeeds; + sourceTree = ""; + }; + 2E8106261BDA2985005577F6 /* Instagram */ = { + isa = PBXGroup; + children = ( + 2EB579441BDF86810026F284 /* InstagramProfileController.swift */, + 2E30C2811BE0A5990001CB87 /* InstagramPhotoCell.swift */, + ); + name = Instagram; + sourceTree = ""; + }; + 2E81062B1BDA2D0F005577F6 /* TumblrNOTUSED */ = { + isa = PBXGroup; + children = ( + 2E81062F1BDA2D43005577F6 /* TumblrProfileTableViewController.swift */, + ); + name = TumblrNOTUSED; + sourceTree = ""; + }; + 2E81062C1BDA2D20005577F6 /* VineNOTUSED */ = { + isa = PBXGroup; + children = ( + 2E8106311BDA2D51005577F6 /* VineProfileTableViewController.swift */, + ); + name = VineNOTUSED; + sourceTree = ""; + }; + 2E935F4D1BDC1E66003E55AD /* Facebook */ = { + isa = PBXGroup; + children = ( + 2E935F521BDC1ECE003E55AD /* FacebookFeedTableViewController.swift */, + 2E45ECBB1BDA038300AF1F18 /* FacebookHeaderTableViewCell.swift */, + 2E5EBCF41BE368C400B646BA /* FacebookStatusCellController.swift */, + 2EA69A261BFE8526004AF7E4 /* FacebookStatusCell.xib */, + 2EA69A281BFE85C3004AF7E4 /* FacebookHeaderCell.xib */, + 2EA69A2A1BFE8687004AF7E4 /* FacebookFeedDatasource.swift */, + ); + name = Facebook; + sourceTree = ""; + }; + 2E935F4E1BDC1E73003E55AD /* Twitter */ = { + isa = PBXGroup; + children = ( + 2E935F541BDC1EEB003E55AD /* TwitterFeedTableViewController.swift */, + 2E0A88F81BE84BB6009FB358 /* TwitterTweetCell.xib */, + 2E0A89001BE899B8009FB358 /* TwitterPhotoCell.xib */, + 2EEB11E31BE0AE5000DA8492 /* TwitterPhotoCellController.swift */, + 2EEB11E51BE16A4100DA8492 /* TwitterTweetCellController.swift */, + 2EC206C11BFC0BD30068AE1E /* TwitterFeedDatasource.swift */, + 2E45ECBE1BDA08AD00AF1F18 /* TwitterHeaderTableViewCell.swift */, + 2EA69A241BFE81CD004AF7E4 /* TwitterHeaderCell.xib */, + ); + name = Twitter; + sourceTree = ""; + }; + 2E935F4F1BDC1E82003E55AD /* Instagram */ = { + isa = PBXGroup; + children = ( + 2E935F561BDC1EF5003E55AD /* InstagramFeedTableViewController.swift */, + 2E3CDBF71BDC63B500C8C49D /* InstagramFeedCellController.swift */, + 2E0A88FE1BE8964A009FB358 /* InstagramFeedCell.xib */, + 2E16A3981BEF08A500A44104 /* InstagramModalController.swift */, + 2EC206BD1BFAC9570068AE1E /* InstagramFeedDatasource.swift */, + ); + name = Instagram; + sourceTree = ""; + }; + 2E935F501BDC1E94003E55AD /* Tumblr */ = { + isa = PBXGroup; + children = ( + 2E935F581BDC1EFF003E55AD /* TumblrFeedTableViewController.swift */, + 2E0A88FA1BE84D17009FB358 /* TumblrPhotoCell.xib */, + 2E0A88FC1BE890FE009FB358 /* TumblrBlogCell.xib */, + 2E5EBCF61BE43B6500B646BA /* TumblrBlogCellController.swift */, + 2E5EBCF81BE7EC2F00B646BA /* TumblrPhotoCellController.swift */, + 2EC206C31BFC48270068AE1E /* TumblrFeedDatasource.swift */, + 2E9B580D1BFE5D7A00613C7F /* TumblrPhotoModalController.swift */, + 2E81062D1BDA2D32005577F6 /* TumblrHeaderTableViewCell.swift */, + 2EA69A221BFE7E1C004AF7E4 /* TumblrHeaderCell.xib */, + ); + name = Tumblr; + sourceTree = ""; + }; + 2E935F511BDC1EA1003E55AD /* Vine */ = { + isa = PBXGroup; + children = ( + 2E935F5A1BDC1F08003E55AD /* VineFeedTableViewController.swift */, + 2E935F601BDC2558003E55AD /* VineFeedCellController.swift */, + 2E5EBCFA1BE845C400B646BA /* VineFeedCell.xib */, + 2E9971561BEC1452004B75C4 /* VineVideoModalController.swift */, + 2EC206BF1BFBFF6C0068AE1E /* VineFeedDatasource.swift */, + 2E8106351BDA34B3005577F6 /* VineHeaderTableViewCell.swift */, + 2EA69A201BFE7994004AF7E4 /* VineHeaderCell.xib */, + ); + name = Vine; + sourceTree = ""; + }; + 2E99EFBC1BD1E1C200938B04 /* TableViewControllers */ = { + isa = PBXGroup; + children = ( + 2E99EFBD1BD1E27300938B04 /* NotificationTableViewController.swift */, + 2EBDDB771C003F7A00DA5DC8 /* NotificationDatasource.swift */, + 2EBDDB791C00400E00DA5DC8 /* NotificationCell.xib */, + ); + name = TableViewControllers; + sourceTree = ""; + }; + 2E9E34BD1BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 690233091BCF6B0D001AB41B /* KeychainWrapper.swift */, + 2E9E34BE1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E34BE1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E34BF1BD30E19008DE8B0 /* Helvetica Bold.ttf */, + 2E9E34C01BD30E19008DE8B0 /* Helvetica-Black-SemiBold.ttf */, + 2E9E34C11BD30E19008DE8B0 /* Helvetica-Black.otf */, + 2E9E34C21BD30E19008DE8B0 /* Helvetica-BlackOblique.otf */, + 2E9E34C31BD30E19008DE8B0 /* Helvetica-Bold.otf */, + 2E9E34C41BD30E19008DE8B0 /* Helvetica-BoldOblique.otf */, + 2E9E34C51BD30E19008DE8B0 /* Helvetica-Compressed.otf */, + 2E9E34C61BD30E19008DE8B0 /* Helvetica-Condensed-Black-Se.ttf */, + 2E9E34C71BD30E19008DE8B0 /* Helvetica-Condensed-Black.otf */, + 2E9E34C81BD30E19008DE8B0 /* Helvetica-Condensed-BlackObl.otf */, + 2E9E34C91BD30E19008DE8B0 /* Helvetica-Condensed-Bold.otf */, + 2E9E34CA1BD30E19008DE8B0 /* Helvetica-Condensed-BoldObl.otf */, + 2E9E34CB1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Li.ttf */, + 2E9E34CC1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Light.ttf */, + 2E9E34CD1BD30E19008DE8B0 /* Helvetica-Condensed-Light.otf */, + 2E9E34CE1BD30E19008DE8B0 /* Helvetica-Condensed-LightObl.otf */, + 2E9E34CF1BD30E19008DE8B0 /* Helvetica-Condensed-Oblique.otf */, + 2E9E34D01BD30E19008DE8B0 /* Helvetica-Condensed-Thin.ttf */, + 2E9E34D11BD30E19008DE8B0 /* Helvetica-Condensed.otf */, + 2E9E34D21BD30E19008DE8B0 /* Helvetica-Conth.ttf */, + 2E9E34D31BD30E19008DE8B0 /* Helvetica-ExtraCompressed.otf */, + 2E9E34D41BD30E19008DE8B0 /* Helvetica-Fraction.otf */, + 2E9E34D51BD30E19008DE8B0 /* Helvetica-FractionBold.otf */, + 2E9E34D61BD30E19008DE8B0 /* Helvetica-Light-Light-Italic.ttf */, + 2E9E34D71BD30E19008DE8B0 /* Helvetica-Light.otf */, + 2E9E34D81BD30E19008DE8B0 /* Helvetica-LightOblique.otf */, + 2E9E34D91BD30E19008DE8B0 /* Helvetica-Narrow-Bold.otf */, + 2E9E34DA1BD30E19008DE8B0 /* Helvetica-Narrow-BoldItalic.otf */, + 2E9E34DB1BD30E19008DE8B0 /* Helvetica-Narrow-BoldOblique.otf */, + 2E9E34DC1BD30E19008DE8B0 /* Helvetica-Narrow-Italic.otf */, + 2E9E34DD1BD30E19008DE8B0 /* Helvetica-Narrow-Oblique.otf */, + 2E9E34DE1BD30E19008DE8B0 /* Helvetica-Narrow.otf */, + 2E9E34DF1BD30E19008DE8B0 /* Helvetica-Normal.ttf */, + 2E9E34E01BD30E19008DE8B0 /* Helvetica-Oblique.otf */, + 2E9E34E11BD30E19008DE8B0 /* Helvetica-UltraCompressed.otf */, + 2E9E34E21BD30E19008DE8B0 /* Helvetica.otf */, + 2E9E34E31BD30E19008DE8B0 /* HelveticaBQ-Black.otf */, + 2E9E34E41BD30E19008DE8B0 /* HelveticaBQ-BlackItalic.otf */, + 2E9E34E51BD30E19008DE8B0 /* HelveticaBQ-Bold.otf */, + 2E9E34E61BD30E19008DE8B0 /* HelveticaBQ-BoldItalic.otf */, + 2E9E34E71BD30E19008DE8B0 /* HelveticaBQ-DemiBold.otf */, + 2E9E34E81BD30E19008DE8B0 /* HelveticaBQ-DemiBoldItalic.otf */, + 2E9E34E91BD30E19008DE8B0 /* HelveticaBQ-Italic.otf */, + 2E9E34EA1BD30E19008DE8B0 /* HelveticaBQ-Light.otf */, + 2E9E34EB1BD30E19008DE8B0 /* HelveticaBQ-LightItalic.otf */, + 2E9E34EC1BD30E19008DE8B0 /* HelveticaBQ-Medium.otf */, + 2E9E34ED1BD30E19008DE8B0 /* HelveticaBQ-MediumItalic.otf */, + 2E9E34EE1BD30E19008DE8B0 /* HelveticaBQ-Roman.otf */, + 2E9E34EF1BD30E19008DE8B0 /* HelveticaBQ-UltraLight.otf */, + 2E9E34F01BD30E19008DE8B0 /* HelveticaCE-Bold.otf */, + 2E9E34F11BD30E19008DE8B0 /* HelveticaCE-BoldOblique.otf */, + 2E9E34F21BD30E19008DE8B0 /* HelveticaCE-Cond.otf */, + 2E9E34F31BD30E19008DE8B0 /* HelveticaCE-CondBold.otf */, + 2E9E34F41BD30E19008DE8B0 /* HelveticaCE-CondBoldObl.otf */, + 2E9E34F51BD30E19008DE8B0 /* HelveticaCE-CondObl.otf */, + 2E9E34F61BD30E19008DE8B0 /* HelveticaCE-Narrow.otf */, + 2E9E34F71BD30E19008DE8B0 /* HelveticaCE-NarrowBold.otf */, + 2E9E34F81BD30E19008DE8B0 /* HelveticaCE-NarrowBoldOblique.otf */, + 2E9E34F91BD30E19008DE8B0 /* HelveticaCE-NarrowOblique.otf */, + 2E9E34FA1BD30E19008DE8B0 /* HelveticaCE-Oblique.otf */, + 2E9E34FB1BD30E19008DE8B0 /* HelveticaCE.otf */, + 2E9E34FC1BD30E19008DE8B0 /* HelveticaConBQ-Bold.otf */, + 2E9E34FD1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLight.otf */, + 2E9E34FE1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLightItalic.otf */, + 2E9E34FF1BD30E19008DE8B0 /* HelveticaConBQ-Light.otf */, + 2E9E35001BD30E19008DE8B0 /* HelveticaConBQ-LightItalic.otf */, + 2E9E35011BD30E19008DE8B0 /* HelveticaConBQ-Medium.otf */, + 2E9E35021BD30E19008DE8B0 /* HelveticaCyr-Bold.otf */, + 2E9E35031BD30E19008DE8B0 /* HelveticaCyr-BoldInclined.otf */, + 2E9E35041BD30E19008DE8B0 /* HelveticaCyr-Inclined.otf */, + 2E9E35051BD30E19008DE8B0 /* HelveticaCyr-Upright.otf */, + 2E9E35061BD30E19008DE8B0 /* HelveticaCyrA-Bold.otf */, + 2E9E35071BD30E19008DE8B0 /* HelveticaCyrA-BoldInclined.otf */, + 2E9E35081BD30E19008DE8B0 /* HelveticaCyrA-Inclined.otf */, + 2E9E35091BD30E19008DE8B0 /* HelveticaCyrA-Upright.otf */, + 2E9E350A1BD30E19008DE8B0 /* HelveticaDiagonalBQ.otf */, + 2E9E350B1BD30E19008DE8B0 /* HelveticaExt-No.ttf */, + 2E9E350C1BD30E19008DE8B0 /* HelveticaExtendedBQ-Bold.otf */, + 2E9E350D1BD30E19008DE8B0 /* HelveticaExtendedBQ-ExtraLight.otf */, + 2E9E350E1BD30E19008DE8B0 /* HelveticaExtendedBQ-Light.otf */, + 2E9E350F1BD30E19008DE8B0 /* HelveticaExtendedBQ-Medium.otf */, + 2E9E35101BD30E19008DE8B0 /* HelveticaExtO 2.ttf */, + 2E9E35111BD30E19008DE8B0 /* HelveticaExtO 3.ttf */, + 2E9E35121BD30E19008DE8B0 /* HelveticaExtO 4.ttf */, + 2E9E35131BD30E19008DE8B0 /* HelveticaFractionsBQ.otf */, + 2E9E35141BD30E19008DE8B0 /* HelveticaInserat-Roman-SemiB.ttf */, + 2E9E35151BD30E19008DE8B0 /* HelveticaInserat-Roman-SemiBold(1).ttf */, + 2E9E35161BD30E19008DE8B0 /* HelveticaInserat-Roman.otf */, + 2E9E35171BD30E19008DE8B0 /* HelveticaInseratBQ-Italic.otf */, + 2E9E35181BD30E19008DE8B0 /* HelveticaInseratBQ-Regular.otf */, + 2E9E35191BD30E19008DE8B0 /* HelveticaInseratCyr-Upright.otf */, + 2E9E351A1BD30E19008DE8B0 /* HelveticaInseratLTStd-Roman.otf */, + 2E9E351B1BD30E19008DE8B0 /* HelveticaLTStd- steevo -Roman - pointed .ttf */, + 2E9E351C1BD30E19008DE8B0 /* HelveticaLTStd-Blk.otf */, + 2E9E351D1BD30E19008DE8B0 /* HelveticaLTStd-BlkCond.otf */, + 2E9E351E1BD30E19008DE8B0 /* HelveticaLTStd-BlkCondObl.otf */, + 2E9E351F1BD30E19008DE8B0 /* HelveticaLTStd-BlkObl.otf */, + 2E9E35201BD30E19008DE8B0 /* HelveticaLTStd-Bold.otf */, + 2E9E35211BD30E19008DE8B0 /* HelveticaLTStd-BoldCond.otf */, + 2E9E35221BD30E19008DE8B0 /* HelveticaLTStd-BoldCondObl.otf */, + 2E9E35231BD30E19008DE8B0 /* HelveticaLTStd-BoldObl.otf */, + 2E9E35241BD30E19008DE8B0 /* HelveticaLTStd-Comp.otf */, + 2E9E35251BD30E19008DE8B0 /* HelveticaLTStd-Cond.otf */, + 2E9E35261BD30E19008DE8B0 /* HelveticaLTStd-CondObl.otf */, + 2E9E35271BD30E19008DE8B0 /* HelveticaLTStd-ExtraComp.otf */, + 2E9E35281BD30E19008DE8B0 /* HelveticaLTStd-Fractions.otf */, + 2E9E35291BD30E19008DE8B0 /* HelveticaLTStd-FractionsBd.otf */, + 2E9E352A1BD30E19008DE8B0 /* HelveticaLTStd-Light.otf */, + 2E9E352B1BD30E19008DE8B0 /* HelveticaLTStd-LightCond.otf */, + 2E9E352C1BD30E19008DE8B0 /* HelveticaLTStd-LightCondObl.otf */, + 2E9E352D1BD30E19008DE8B0 /* HelveticaLTStd-LightObl.otf */, + 2E9E352E1BD30E19008DE8B0 /* HelveticaLTStd-Obl.otf */, + 2E9E352F1BD30E19008DE8B0 /* HelveticaLTStd-Roman.otf */, + 2E9E35301BD30E19008DE8B0 /* HelveticaLTStd-UltraComp.otf */, + 2E9E35311BD30E19008DE8B0 /* HelveticaNeue-Black.otf */, + 2E9E35321BD30E19008DE8B0 /* HelveticaNeue-BlackCond.otf */, + 2E9E35331BD30E19008DE8B0 /* HelveticaNeue-BlackCondObl.otf */, + 2E9E35341BD30E19008DE8B0 /* HelveticaNeue-BlackExt.otf */, + 2E9E35351BD30E19008DE8B0 /* HelveticaNeue-BlackExtObl.otf */, + 2E9E35361BD30E19008DE8B0 /* HelveticaNeue-BlackItalic.otf */, + 2E9E35371BD30E19008DE8B0 /* HelveticaNeue-Bold.otf */, + 2E9E35381BD30E19008DE8B0 /* HelveticaNeue-BoldCond.otf */, + 2E9E35391BD30E19008DE8B0 /* HelveticaNeue-BoldCondObl.otf */, + 2E9E353A1BD30E19008DE8B0 /* HelveticaNeue-BoldExt.otf */, + 2E9E353B1BD30E19008DE8B0 /* HelveticaNeue-BoldExtObl.otf */, + 2E9E353C1BD30E19008DE8B0 /* HelveticaNeue-BoldItalic.otf */, + 2E9E353D1BD30E19008DE8B0 /* HelveticaNeue-BoldOutline.otf */, + 2E9E353E1BD30E19008DE8B0 /* HelveticaNeue-Condensed.otf */, + 2E9E353F1BD30E19008DE8B0 /* HelveticaNeue-CondensedObl.otf */, + 2E9E35401BD30E19008DE8B0 /* HelveticaNeue-ExtBlackCond.otf */, + 2E9E35411BD30E19008DE8B0 /* HelveticaNeue-ExtBlackCondObl.otf */, + 2E9E35421BD30E19008DE8B0 /* HelveticaNeue-Extended.otf */, + 2E9E35431BD30E19008DE8B0 /* HelveticaNeue-ExtendedObl.otf */, + 2E9E35441BD30E19008DE8B0 /* HelveticaNeue-Heavy.otf */, + 2E9E35451BD30E19008DE8B0 /* HelveticaNeue-HeavyCond.otf */, + 2E9E35461BD30E19008DE8B0 /* HelveticaNeue-HeavyCondObl.otf */, + 2E9E35471BD30E19008DE8B0 /* HelveticaNeue-HeavyExt.otf */, + 2E9E35481BD30E19008DE8B0 /* HelveticaNeue-HeavyExtObl.otf */, + 2E9E35491BD30E19008DE8B0 /* HelveticaNeue-HeavyItalic.otf */, + 2E9E354A1BD30E19008DE8B0 /* HelveticaNeue-Italic.otf */, + 2E9E354B1BD30E19008DE8B0 /* HelveticaNeue-Light.otf */, + 2E9E354C1BD30E19008DE8B0 /* HelveticaNeue-LightCond.otf */, + 2E9E354D1BD30E19008DE8B0 /* HelveticaNeue-LightCondObl.otf */, + 2E9E354E1BD30E19008DE8B0 /* HelveticaNeue-LightExt.otf */, + 2E9E354F1BD30E19008DE8B0 /* HelveticaNeue-LightExtObl.otf */, + 2E9E35501BD30E19008DE8B0 /* HelveticaNeue-LightItalic.otf */, + 2E9E35511BD30E19008DE8B0 /* HelveticaNeue-Medium.otf */, + 2E9E35521BD30E19008DE8B0 /* HelveticaNeue-MediumCond.otf */, + 2E9E35531BD30E19008DE8B0 /* HelveticaNeue-MediumCondObl.otf */, + 2E9E35541BD30E19008DE8B0 /* HelveticaNeue-MediumExt.otf */, + 2E9E35551BD30E19008DE8B0 /* HelveticaNeue-MediumExtObl.otf */, + 2E9E35561BD30E19008DE8B0 /* HelveticaNeue-MediumItalic.otf */, + 2E9E35571BD30E19008DE8B0 /* HelveticaNeue-Roman.otf */, + 2E9E35581BD30E19008DE8B0 /* HelveticaNeue-Thin.otf */, + 2E9E35591BD30E19008DE8B0 /* HelveticaNeue-ThinCond.otf */, + 2E9E355A1BD30E19008DE8B0 /* HelveticaNeue-ThinCondObl.otf */, + 2E9E355B1BD30E19008DE8B0 /* HelveticaNeue-ThinExt.otf */, + 2E9E355C1BD30E19008DE8B0 /* HelveticaNeue-ThinExtObl.otf */, + 2E9E355D1BD30E19008DE8B0 /* HelveticaNeue-ThinItalic.otf */, + 2E9E355E1BD30E19008DE8B0 /* HelveticaNeue-UltraLigCond.otf */, + 2E9E355F1BD30E19008DE8B0 /* HelveticaNeue-UltraLigCondObl.otf */, + 2E9E35601BD30E19008DE8B0 /* HelveticaNeue-UltraLigExt.otf */, + 2E9E35611BD30E19008DE8B0 /* HelveticaNeue-UltraLigExtObl.otf */, + 2E9E35621BD30E19008DE8B0 /* HelveticaNeue-UltraLight.otf */, + 2E9E35631BD30E19008DE8B0 /* HelveticaNeue-UltraLightItal.otf */, + 2E9E35641BD30E19008DE8B0 /* HelveticaNeueLT-BlackCond.otf */, + 2E9E35651BD30E19008DE8B0 /* HelveticaNeueLT-BlackCondObl.otf */, + 2E9E35661BD30E19008DE8B0 /* HelveticaNeueLT-BlackExt.otf */, + 2E9E35671BD30E19008DE8B0 /* HelveticaNeueLT-BlackExtObl.otf */, + 2E9E35681BD30E19008DE8B0 /* HelveticaNeueLT-BoldCond.otf */, + 2E9E35691BD30E19008DE8B0 /* HelveticaNeueLT-BoldCondObl.otf */, + 2E9E356A1BD30E19008DE8B0 /* HelveticaNeueLT-BoldExt.otf */, + 2E9E356B1BD30E19008DE8B0 /* HelveticaNeueLT-BoldExtObl.otf */, + 2E9E356C1BD30E19008DE8B0 /* HelveticaNeueLT-BoldOutline.otf */, + 2E9E356D1BD30E19008DE8B0 /* HelveticaNeueLT-Condensed.otf */, + 2E9E356E1BD30E19008DE8B0 /* HelveticaNeueLT-CondensedObl.otf */, + 2E9E356F1BD30E19008DE8B0 /* HelveticaNeueLT-ExtBlackCond.otf */, + 2E9E35701BD30E19008DE8B0 /* HelveticaNeueLT-ExtBlackCondObl.otf */, + 2E9E35711BD30E19008DE8B0 /* HelveticaNeueLT-Extended.otf */, + 2E9E35721BD30E19008DE8B0 /* HelveticaNeueLT-ExtendedObl.otf */, + 2E9E35731BD30E19008DE8B0 /* HelveticaNeueLT-HeavyCond.otf */, + 2E9E35741BD30E19008DE8B0 /* HelveticaNeueLT-HeavyCondObl.otf */, + 2E9E35751BD30E19008DE8B0 /* HelveticaNeueLT-HeavyExt.otf */, + 2E9E35761BD30E19008DE8B0 /* HelveticaNeueLT-HeavyExtObl.otf */, + 2E9E35771BD30E19008DE8B0 /* HelveticaNeueLT-LightCond.otf */, + 2E9E35781BD30E19008DE8B0 /* HelveticaNeueLT-LightCondObl.otf */, + 2E9E35791BD30E19008DE8B0 /* HelveticaNeueLT-LightExt.otf */, + 2E9E357A1BD30E19008DE8B0 /* HelveticaNeueLT-LightExtObl.otf */, + 2E9E357B1BD30E19008DE8B0 /* HelveticaNeueLT-MediumCond.otf */, + 2E9E357C1BD30E19008DE8B0 /* HelveticaNeueLT-MediumCondObl.otf */, + 2E9E357D1BD30E19008DE8B0 /* HelveticaNeueLT-MediumExt.otf */, + 2E9E357E1BD30E19008DE8B0 /* HelveticaNeueLT-MediumExtObl.otf */, + 2E9E357F1BD30E19008DE8B0 /* HelveticaNeueLT-ThinCond.otf */, + 2E9E35801BD30E19008DE8B0 /* HelveticaNeueLT-ThinCondObl.otf */, + 2E9E35811BD30E19008DE8B0 /* HelveticaNeueLT-ThinExt.otf */, + 2E9E35821BD30E19008DE8B0 /* HelveticaNeueLT-ThinExtObl.otf */, + 2E9E35831BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigCond.otf */, + 2E9E35841BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigCondObl.otf */, + 2E9E35851BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigExt.otf */, + 2E9E35861BD30E19008DE8B0 /* HelveticaNeueLT-UltraLigExtObl.otf */, + 2E9E35871BD30E19008DE8B0 /* HelveticaNeueLTStd-Bd.otf */, + 2E9E35881BD30E19008DE8B0 /* HelveticaNeueLTStd-BdCn.otf */, + 2E9E35891BD30E19008DE8B0 /* HelveticaNeueLTStd-BdCnO.otf */, + 2E9E358A1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdEx.otf */, + 2E9E358B1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdExO.otf */, + 2E9E358C1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdIt.otf */, + 2E9E358D1BD30E19008DE8B0 /* HelveticaNeueLTStd-BdOu.otf */, + 2E9E358E1BD30E19008DE8B0 /* HelveticaNeueLTStd-Blk.otf */, + 2E9E358F1BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkCn.otf */, + 2E9E35901BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkCnO.otf */, + 2E9E35911BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkEx.otf */, + 2E9E35921BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkExO.otf */, + 2E9E35931BD30E19008DE8B0 /* HelveticaNeueLTStd-BlkIt.otf */, + 2E9E35941BD30E19008DE8B0 /* HelveticaNeueLTStd-Cn.otf */, + 2E9E35951BD30E19008DE8B0 /* HelveticaNeueLTStd-CnO.otf */, + 2E9E35961BD30E19008DE8B0 /* HelveticaNeueLTStd-Ex.otf */, + 2E9E35971BD30E19008DE8B0 /* HelveticaNeueLTStd-ExO.otf */, + 2E9E35981BD30E19008DE8B0 /* HelveticaNeueLTStd-Hv.otf */, + 2E9E35991BD30E19008DE8B0 /* HelveticaNeueLTStd-HvCn.otf */, + 2E9E359A1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvCnO.otf */, + 2E9E359B1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvEx.otf */, + 2E9E359C1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvExO.otf */, + 2E9E359D1BD30E19008DE8B0 /* HelveticaNeueLTStd-HvIt.otf */, + 2E9E359E1BD30E19008DE8B0 /* HelveticaNeueLTStd-It.otf */, + 2E9E359F1BD30E19008DE8B0 /* HelveticaNeueLTStd-Lt.otf */, + 2E9E35A01BD30E19008DE8B0 /* HelveticaNeueLTStd-LtCn.otf */, + 2E9E35A11BD30E19008DE8B0 /* HelveticaNeueLTStd-LtCnO.otf */, + 2E9E35A21BD30E19008DE8B0 /* HelveticaNeueLTStd-LtEx.otf */, + 2E9E35A31BD30E19008DE8B0 /* HelveticaNeueLTStd-LtExO.otf */, + 2E9E35A41BD30E19008DE8B0 /* HelveticaNeueLTStd-LtIt.otf */, + 2E9E35A51BD30E19008DE8B0 /* HelveticaNeueLTStd-Md.otf */, + 2E9E35A61BD30E19008DE8B0 /* HelveticaNeueLTStd-MdCn.otf */, + 2E9E35A71BD30E19008DE8B0 /* HelveticaNeueLTStd-MdCnO.otf */, + 2E9E35A81BD30E19008DE8B0 /* HelveticaNeueLTStd-MdEx.otf */, + 2E9E35A91BD30E19008DE8B0 /* HelveticaNeueLTStd-MdExO.otf */, + 2E9E35AA1BD30E19008DE8B0 /* HelveticaNeueLTStd-MdIt.otf */, + 2E9E35AB1BD30E19008DE8B0 /* HelveticaNeueLTStd-Roman.otf */, + 2E9E35AC1BD30E19008DE8B0 /* HelveticaNeueLTStd-Th.otf */, + 2E9E35AD1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThCn.otf */, + 2E9E35AE1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThCnO.otf */, + 2E9E35AF1BD30E19008DE8B0 /* HelveticaNeueLTStd-ThEx.otf */, + 2E9E35B01BD30E19008DE8B0 /* HelveticaNeueLTStd-ThExO.otf */, + 2E9E35B11BD30E19008DE8B0 /* HelveticaNeueLTStd-ThIt.otf */, + 2E9E35B21BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLt.otf */, + 2E9E35B31BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtCn.otf */, + 2E9E35B41BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtCnO.otf */, + 2E9E35B51BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtEx.otf */, + 2E9E35B61BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtExO.otf */, + 2E9E35B71BD30E19008DE8B0 /* HelveticaNeueLTStd-UltLtIt.otf */, + 2E9E35B81BD30E19008DE8B0 /* HelveticaNeueLTStd-XBlkCn.otf */, + 2E9E35B91BD30E19008DE8B0 /* HelveticaNeueLTStd-XBlkCnO.otf */, + 2E9E35BA1BD30E19008DE8B0 /* HelveticaObl-He.ttf */, + 2E9E35BB1BD30E19008DE8B0 /* HelveticaObl-Li.ttf */, + 2E9E35BC1BD30E19008DE8B0 /* HelveticaObl-Th.ttf */, + 2E9E35BD1BD30E19008DE8B0 /* HelveticaRounded-Black.otf */, + 2E9E35BE1BD30E19008DE8B0 /* HelveticaRounded-BlackObl.otf */, + 2E9E35BF1BD30E19008DE8B0 /* HelveticaRounded-Bold.otf */, + 2E9E35C01BD30E19008DE8B0 /* HelveticaRounded-BoldCond.otf */, + 2E9E35C11BD30E19008DE8B0 /* HelveticaRounded-BoldCondObl.otf */, + 2E9E35C21BD30E19008DE8B0 /* HelveticaRounded-BoldObl.otf */, + 2E9E35C31BD30E19008DE8B0 /* HelveticaRoundedLT-Black.otf */, + 2E9E35C41BD30E19008DE8B0 /* HelveticaRoundedLT-BlackObl.otf */, + 2E9E35C51BD30E19008DE8B0 /* HelveticaRoundedLT-Bold.otf */, + 2E9E35C61BD30E19008DE8B0 /* HelveticaRoundedLT-BoldCond.otf */, + 2E9E35C71BD30E19008DE8B0 /* HelveticaRoundedLT-BoldCondObl.otf */, + 2E9E35C81BD30E19008DE8B0 /* HelveticaRoundedLT-BoldObl.otf */, + 2E9E35C91BD30E19008DE8B0 /* HelveticaRoundedLTStd-Bd.otf */, + 2E9E35CA1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdCn.otf */, + 2E9E35CB1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdCnO.otf */, + 2E9E35CC1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BdO.otf */, + 2E9E35CD1BD30E19008DE8B0 /* HelveticaRoundedLTStd-Black.otf */, + 2E9E35CE1BD30E19008DE8B0 /* HelveticaRoundedLTStd-BlkO.otf */, + 2E9E35CF1BD30E19008DE8B0 /* HelveticaTwoBQ-Bold.otf */, + 2E9E35D01BD30E19008DE8B0 /* HelveticaTwoBQ-BoldItalic.otf */, + 2E9E35D11BD30E19008DE8B0 /* HelveticaTwoBQ-Italic.otf */, + 2E9E35D21BD30E19008DE8B0 /* HelveticaTwoBQ-Roman.otf */, + 2E9E35D31BD30E19008DE8B0 /* HelveticaWorld-Bold.ttf */, + 2E9E35D41BD30E19008DE8B0 /* HelveticaWorld-BoldItalic.ttf */, + 2E9E35D51BD30E19008DE8B0 /* HelveticaWorld-Italic.ttf */, + 2E9E35D61BD30E19008DE8B0 /* HelveticaWorld-Regular.ttf */, + 2E9E35D71BD30E19008DE8B0 /* HelvFB Bold.ttf */, + 2E9E35D81BD30E19008DE8B0 /* HelvFB BoldOblique.ttf */, + 2E9E35D91BD30E19008DE8B0 /* HelvFB Oblique.ttf */, + 2E9E35DA1BD30E19008DE8B0 /* HelvFB-Bold.otf */, + 2E9E35DB1BD30E19008DE8B0 /* HelvFB-BoldOblique.otf */, + 2E9E35DC1BD30E19008DE8B0 /* HelvFB-Oblique.otf */, + 2E9E35DD1BD30E19008DE8B0 /* HelvFB.otf */, + 2E9E35DE1BD30E19008DE8B0 /* HelvFE Bold.ttf */, + 2E9E35DF1BD30E19008DE8B0 /* HelvFE BoldOblique.ttf */, + 2E9E35E01BD30E19008DE8B0 /* HelvFE Oblique.ttf */, + 2E9E35E11BD30E19008DE8B0 /* HelvFE-Bold.otf */, + 2E9E35E21BD30E19008DE8B0 /* HelvFE-BoldOblique.otf */, + 2E9E35E31BD30E19008DE8B0 /* HelvFE-Oblique.otf */, + 2E9E35E41BD30E19008DE8B0 /* HelvFE.otf */, + 2E9E35E51BD30E19008DE8B0 /* HelvLight Regular.ttf */, + 2E9E35E61BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35E61BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35E71BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35E71BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35E81BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35E81BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35E91BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35E91BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35EA1BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35EA1BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35EB1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35EB1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35EC1BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35EC1BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35ED1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35ED1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35EE1BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35EE1BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35EF1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35EF1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35F01BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35F01BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35F11BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35F11BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35F21BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35F21BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35F31BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35F31BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35F41BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35F41BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35F51BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35F51BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35F61BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35F61BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35F71BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35F71BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35F81BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35F81BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35F91BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35F91BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35FA1BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35FA1BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35FB1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35FB1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35FC1BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35FC1BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35FD1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35FD1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-© */ = { + isa = PBXGroup; + children = ( + 2E9E35FE1BD30E19008DE8B0 /* Resources */, + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-©"; + sourceTree = ""; + }; + 2E9E35FE1BD30E19008DE8B0 /* Resources */ = { + isa = PBXGroup; + children = ( + 2E9E35FF1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo- */, + ); + path = Resources; + sourceTree = ""; + }; + 2E9E35FF1BD30E19008DE8B0 /* HELVETICA - ULTIMATE FAMILY FONTS -steevo- */ = { + isa = PBXGroup; + children = ( + ); + path = "HELVETICA - ULTIMATE FAMILY FONTS -steevo-"; + sourceTree = ""; + }; + 690233021BCF6A52001AB41B /* NetworkManager */ = { + isa = PBXGroup; + children = ( + 698257831BD808BF0062AD39 /* NetworkClass.swift */, + 69E2728F1BD843FB00259A44 /* Networks.swift */, + 690233031BCF6A73001AB41B /* InstagramAPIManager.swift */, + 6902330B1BCF6B55001AB41B /* UserDataManager.swift */, + 69BF17201BDA876C008A726F /* NetworkFeedClass.swift */, + 69BF17221BDA89E2008A726F /* NetworkNotificationManager.swift */, + ); + name = NetworkManager; + sourceTree = ""; + }; + 69BF171F1BD9C92D008A726F /* HTTPManager */ = { + isa = PBXGroup; + children = ( + 690233071BCF6AEF001AB41B /* FeedRequestManager.swift */, + 69BB36941BD496A2000362D1 /* FirebaseIOManager.swift */, + 69BF17241BDA949D008A726F /* NotificationRequestManager.swift */, + ); + name = HTTPManager; + sourceTree = ""; + }; + E37AFAA3534564715A3657DF /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8955C66DCB0E3C6097EA0C7A /* Pods_comblie.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F86FE8BA45E38AAAA087583F /* Pods */ = { + isa = PBXGroup; + children = ( + BC668777F91F5EDBE963466E /* Pods-comblie.debug.xcconfig */, + DC8FBA28703283B1CD91C418 /* Pods-comblie.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2E0064241BC65F1B004C5BBF /* comblie */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2E00644D1BC65F1B004C5BBF /* Build configuration list for PBXNativeTarget "comblie" */; + buildPhases = ( + E1A09236460F8DFB88CCF814 /* Check Pods Manifest.lock */, + 2E0064211BC65F1B004C5BBF /* Sources */, + 2E0064221BC65F1B004C5BBF /* Frameworks */, + 2E0064231BC65F1B004C5BBF /* Resources */, + 34F6C539AD93563F2DE7219A /* Embed Pods Frameworks */, + EF04CB143E2210CB8E0EB563 /* Copy Pods Resources */, + 69B30BD71BD5F0F600F03990 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = comblie; + productName = comblie; + productReference = 2E0064251BC65F1B004C5BBF /* comblie.app */; + productType = "com.apple.product-type.application"; + }; + 2E0064381BC65F1B004C5BBF /* comblieTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2E0064501BC65F1B004C5BBF /* Build configuration list for PBXNativeTarget "comblieTests" */; + buildPhases = ( + 2E0064351BC65F1B004C5BBF /* Sources */, + 2E0064361BC65F1B004C5BBF /* Frameworks */, + 2E0064371BC65F1B004C5BBF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2E00643B1BC65F1B004C5BBF /* PBXTargetDependency */, + ); + name = comblieTests; + productName = comblieTests; + productReference = 2E0064391BC65F1B004C5BBF /* comblieTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 2E0064431BC65F1B004C5BBF /* comblieUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2E0064531BC65F1B004C5BBF /* Build configuration list for PBXNativeTarget "comblieUITests" */; + buildPhases = ( + 2E0064401BC65F1B004C5BBF /* Sources */, + 2E0064411BC65F1B004C5BBF /* Frameworks */, + 2E0064421BC65F1B004C5BBF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2E0064461BC65F1B004C5BBF /* PBXTargetDependency */, + ); + name = comblieUITests; + productName = comblieUITests; + productReference = 2E0064441BC65F1B004C5BBF /* comblieUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2E00641D1BC65F1B004C5BBF /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = Comblie; + TargetAttributes = { + 2E0064241BC65F1B004C5BBF = { + CreatedOnToolsVersion = 7.0.1; + }; + 2E0064381BC65F1B004C5BBF = { + CreatedOnToolsVersion = 7.0.1; + TestTargetID = 2E0064241BC65F1B004C5BBF; + }; + 2E0064431BC65F1B004C5BBF = { + CreatedOnToolsVersion = 7.0.1; + TestTargetID = 2E0064241BC65F1B004C5BBF; + }; + }; + }; + buildConfigurationList = 2E0064201BC65F1B004C5BBF /* Build configuration list for PBXProject "comblie" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 2E00641C1BC65F1B004C5BBF; + productRefGroup = 2E0064261BC65F1B004C5BBF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2E0064241BC65F1B004C5BBF /* comblie */, + 2E0064381BC65F1B004C5BBF /* comblieTests */, + 2E0064431BC65F1B004C5BBF /* comblieUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2E0064231BC65F1B004C5BBF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2E9E36EC1BD30E1A008DE8B0 /* HelveticaNeueLTStd-Roman.otf in Resources */, + 2E9E368D1BD30E1A008DE8B0 /* HelveticaNeue-LightCond.otf in Resources */, + 2E9E36FB1BD30E1A008DE8B0 /* HelveticaObl-He.ttf in Resources */, + 2E9E36CA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdCnO.otf in Resources */, + 2E9E36281BD30E19008DE8B0 /* HelveticaBQ-DemiBold.otf in Resources */, + 2E9E362E1BD30E19008DE8B0 /* HelveticaBQ-MediumItalic.otf in Resources */, + 2E9E360C1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Li.ttf in Resources */, + 2E9E36651BD30E1A008DE8B0 /* HelveticaLTStd-Comp.otf in Resources */, + 2E9E37131BD30E1A008DE8B0 /* HelveticaTwoBQ-Roman.otf in Resources */, + 2E9E36791BD30E1A008DE8B0 /* HelveticaNeue-BoldCond.otf in Resources */, + 2E9E368C1BD30E1A008DE8B0 /* HelveticaNeue-Light.otf in Resources */, + 2E9E36F11BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThExO.otf in Resources */, + 2E9E37031BD30E1A008DE8B0 /* HelveticaRounded-BoldObl.otf in Resources */, + 2E9E36441BD30E19008DE8B0 /* HelveticaCyr-BoldInclined.otf in Resources */, + 2E9E36151BD30E19008DE8B0 /* Helvetica-Fraction.otf in Resources */, + 2E9E36EF1BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThCnO.otf in Resources */, + 2E9E365A1BD30E1A008DE8B0 /* HelveticaInseratCyr-Upright.otf in Resources */, + 2E9E36D41BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkIt.otf in Resources */, + 2E9E361C1BD30E19008DE8B0 /* Helvetica-Narrow-BoldOblique.otf in Resources */, + 2E9E36EE1BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThCn.otf in Resources */, + 2E9E366D1BD30E1A008DE8B0 /* HelveticaLTStd-LightCondObl.otf in Resources */, + 2E9E360D1BD30E19008DE8B0 /* Helvetica-Condensed-Light-Light.ttf in Resources */, + 2E9E36991BD30E1A008DE8B0 /* HelveticaNeue-Thin.otf in Resources */, + 2E9E36001BD30E19008DE8B0 /* Helvetica Bold.ttf in Resources */, + 2EC06EDB1C05393600ABA888 /* FeedHeader.xib in Resources */, + 2ECCC2E71BFEDFD900FF0355 /* ConversationCell.xib in Resources */, + 2EA69A231BFE7E1C004AF7E4 /* TumblrHeaderCell.xib in Resources */, + 2E9E36031BD30E19008DE8B0 /* Helvetica-BlackOblique.otf in Resources */, + 2E9E36091BD30E19008DE8B0 /* Helvetica-Condensed-BlackObl.otf in Resources */, + 2E9E36781BD30E1A008DE8B0 /* HelveticaNeue-Bold.otf in Resources */, + 2E9E36911BD30E1A008DE8B0 /* HelveticaNeue-LightItalic.otf in Resources */, + 2E9E36601BD30E1A008DE8B0 /* HelveticaLTStd-BlkObl.otf in Resources */, + 2E9E37041BD30E1A008DE8B0 /* HelveticaRoundedLT-Black.otf in Resources */, + 2E9E369F1BD30E1A008DE8B0 /* HelveticaNeue-UltraLigCond.otf in Resources */, + 2E9E36C01BD30E1A008DE8B0 /* HelveticaNeueLT-ThinCond.otf in Resources */, + 2E0A88FF1BE8964A009FB358 /* InstagramFeedCell.xib in Resources */, + 2E9E367F1BD30E1A008DE8B0 /* HelveticaNeue-Condensed.otf in Resources */, + 2E9E36751BD30E1A008DE8B0 /* HelveticaNeue-BlackExt.otf in Resources */, + 2E9E36E81BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdCnO.otf in Resources */, + 2E9E36BA1BD30E1A008DE8B0 /* HelveticaNeueLT-LightExt.otf in Resources */, + 2E9E36921BD30E1A008DE8B0 /* HelveticaNeue-Medium.otf in Resources */, + 2E9E37221BD30E1A008DE8B0 /* HelvFE-Bold.otf in Resources */, + 2E9E36A61BD30E1A008DE8B0 /* HelveticaNeueLT-BlackCondObl.otf in Resources */, + 2E9E366A1BD30E1A008DE8B0 /* HelveticaLTStd-FractionsBd.otf in Resources */, + 2E9E36FC1BD30E1A008DE8B0 /* HelveticaObl-Li.ttf in Resources */, + 2E9E36D21BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkEx.otf in Resources */, + 2E9E36AD1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldOutline.otf in Resources */, + 2E9E37191BD30E1A008DE8B0 /* HelvFB BoldOblique.ttf in Resources */, + 2E9E36941BD30E1A008DE8B0 /* HelveticaNeue-MediumCondObl.otf in Resources */, + 2E9E362A1BD30E19008DE8B0 /* HelveticaBQ-Italic.otf in Resources */, + 2E9E363F1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLightItalic.otf in Resources */, + 2E9E36B51BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyCondObl.otf in Resources */, + 2E0A88FD1BE890FE009FB358 /* TumblrBlogCell.xib in Resources */, + 2E9E36491BD30E1A008DE8B0 /* HelveticaCyrA-Inclined.otf in Resources */, + 2E9E36AB1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldExt.otf in Resources */, + 2E9E36581BD30E1A008DE8B0 /* HelveticaInseratBQ-Italic.otf in Resources */, + 2E0064331BC65F1B004C5BBF /* LaunchScreen.storyboard in Resources */, + 2E9E363D1BD30E19008DE8B0 /* HelveticaConBQ-Bold.otf in Resources */, + 2E9E36A41BD30E1A008DE8B0 /* HelveticaNeue-UltraLightItal.otf in Resources */, + 2E9E365D1BD30E1A008DE8B0 /* HelveticaLTStd-Blk.otf in Resources */, + 2E9E37091BD30E1A008DE8B0 /* HelveticaRoundedLT-BoldObl.otf in Resources */, + 2E9E37161BD30E1A008DE8B0 /* HelveticaWorld-Italic.ttf in Resources */, + 2E9E371D1BD30E1A008DE8B0 /* HelvFB-Oblique.otf in Resources */, + 2E9E36691BD30E1A008DE8B0 /* HelveticaLTStd-Fractions.otf in Resources */, + 2E9E37071BD30E1A008DE8B0 /* HelveticaRoundedLT-BoldCond.otf in Resources */, + 2E9E36511BD30E1A008DE8B0 /* HelveticaExtO 2.ttf in Resources */, + 2E9E36F71BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtExO.otf in Resources */, + 2ECCC2EF1BFEEA5500FF0355 /* IncomingMessageTwoCell.xib in Resources */, + 2E9E37171BD30E1A008DE8B0 /* HelveticaWorld-Regular.ttf in Resources */, + 2E9E36DA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvCn.otf in Resources */, + 2ECCC2ED1BFEE89200FF0355 /* TimeMessageCell.xib in Resources */, + 2E9E36CB1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdEx.otf in Resources */, + 2E9E36BC1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumCond.otf in Resources */, + 2E9E36C11BD30E1A008DE8B0 /* HelveticaNeueLT-ThinCondObl.otf in Resources */, + 2E9E36641BD30E1A008DE8B0 /* HelveticaLTStd-BoldObl.otf in Resources */, + 2E9E362D1BD30E19008DE8B0 /* HelveticaBQ-Medium.otf in Resources */, + 2E9E36501BD30E1A008DE8B0 /* HelveticaExtendedBQ-Medium.otf in Resources */, + 2E9E371C1BD30E1A008DE8B0 /* HelvFB-BoldOblique.otf in Resources */, + 2E9E36171BD30E19008DE8B0 /* Helvetica-Light-Light-Italic.ttf in Resources */, + 2E9E36221BD30E19008DE8B0 /* Helvetica-UltraCompressed.otf in Resources */, + 2E9E360B1BD30E19008DE8B0 /* Helvetica-Condensed-BoldObl.otf in Resources */, + 2E9E36391BD30E19008DE8B0 /* HelveticaCE-NarrowBoldOblique.otf in Resources */, + 2E9E36951BD30E1A008DE8B0 /* HelveticaNeue-MediumExt.otf in Resources */, + 2E9E36E61BD30E1A008DE8B0 /* HelveticaNeueLTStd-Md.otf in Resources */, + 2E9E36161BD30E19008DE8B0 /* Helvetica-FractionBold.otf in Resources */, + 2EA69A271BFE8526004AF7E4 /* FacebookStatusCell.xib in Resources */, + 2E9E36571BD30E1A008DE8B0 /* HelveticaInserat-Roman.otf in Resources */, + 2E9E371F1BD30E1A008DE8B0 /* HelvFE Bold.ttf in Resources */, + 2E9E36311BD30E19008DE8B0 /* HelveticaCE-Bold.otf in Resources */, + 2E9E36741BD30E1A008DE8B0 /* HelveticaNeue-BlackCondObl.otf in Resources */, + 2E9E36541BD30E1A008DE8B0 /* HelveticaFractionsBQ.otf in Resources */, + 2E0064301BC65F1B004C5BBF /* Assets.xcassets in Resources */, + 2E9E36ED1BD30E1A008DE8B0 /* HelveticaNeueLTStd-Th.otf in Resources */, + 2E9E36EB1BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdIt.otf in Resources */, + 2E9E36061BD30E19008DE8B0 /* Helvetica-Compressed.otf in Resources */, + 2E9E36F21BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThIt.otf in Resources */, + 2E9E36DF1BD30E1A008DE8B0 /* HelveticaNeueLTStd-It.otf in Resources */, + 2E9E36671BD30E1A008DE8B0 /* HelveticaLTStd-CondObl.otf in Resources */, + 2E9E36901BD30E1A008DE8B0 /* HelveticaNeue-LightExtObl.otf in Resources */, + 2E9E36241BD30E19008DE8B0 /* HelveticaBQ-Black.otf in Resources */, + 2E9E367A1BD30E1A008DE8B0 /* HelveticaNeue-BoldCondObl.otf in Resources */, + 2E9E36261BD30E19008DE8B0 /* HelveticaBQ-Bold.otf in Resources */, + 2E9E36881BD30E1A008DE8B0 /* HelveticaNeue-HeavyExt.otf in Resources */, + 2E9E36291BD30E19008DE8B0 /* HelveticaBQ-DemiBoldItalic.otf in Resources */, + 2E9E36EA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdExO.otf in Resources */, + 2E9E36DC1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvEx.otf in Resources */, + 2E9E36871BD30E1A008DE8B0 /* HelveticaNeue-HeavyCondObl.otf in Resources */, + 2E9E367D1BD30E1A008DE8B0 /* HelveticaNeue-BoldItalic.otf in Resources */, + 2EA69A251BFE81CD004AF7E4 /* TwitterHeaderCell.xib in Resources */, + 2E9E36701BD30E1A008DE8B0 /* HelveticaLTStd-Roman.otf in Resources */, + 2E9E36AE1BD30E1A008DE8B0 /* HelveticaNeueLT-Condensed.otf in Resources */, + 2E9E36E21BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtCnO.otf in Resources */, + 2E9E369A1BD30E1A008DE8B0 /* HelveticaNeue-ThinCond.otf in Resources */, + 2E9E36341BD30E19008DE8B0 /* HelveticaCE-CondBold.otf in Resources */, + 2E9E36FA1BD30E1A008DE8B0 /* HelveticaNeueLTStd-XBlkCnO.otf in Resources */, + 2E9E36101BD30E19008DE8B0 /* Helvetica-Condensed-Oblique.otf in Resources */, + 2E9E367C1BD30E1A008DE8B0 /* HelveticaNeue-BoldExtObl.otf in Resources */, + 2E9E361A1BD30E19008DE8B0 /* Helvetica-Narrow-Bold.otf in Resources */, + 2ECCC2EB1BFEE88900FF0355 /* OutgoingMessageCell.xib in Resources */, + 2E9E36471BD30E1A008DE8B0 /* HelveticaCyrA-Bold.otf in Resources */, + 2E9E366C1BD30E1A008DE8B0 /* HelveticaLTStd-LightCond.otf in Resources */, + 2E9E36411BD30E19008DE8B0 /* HelveticaConBQ-LightItalic.otf in Resources */, + 2E9E36B21BD30E1A008DE8B0 /* HelveticaNeueLT-Extended.otf in Resources */, + 2E9E36C21BD30E1A008DE8B0 /* HelveticaNeueLT-ThinExt.otf in Resources */, + 2E9E37051BD30E1A008DE8B0 /* HelveticaRoundedLT-BlackObl.otf in Resources */, + 2E9E369C1BD30E1A008DE8B0 /* HelveticaNeue-ThinExt.otf in Resources */, + 2E9E36361BD30E19008DE8B0 /* HelveticaCE-CondObl.otf in Resources */, + 2E9E36841BD30E1A008DE8B0 /* HelveticaNeue-ExtendedObl.otf in Resources */, + 2E9E366B1BD30E1A008DE8B0 /* HelveticaLTStd-Light.otf in Resources */, + 69B30BDE1BD5F11500F03990 /* TwitterKitResources.bundle in Resources */, + 2E9E36971BD30E1A008DE8B0 /* HelveticaNeue-MediumItalic.otf in Resources */, + 2E9E362C1BD30E19008DE8B0 /* HelveticaBQ-LightItalic.otf in Resources */, + 2E9E36A21BD30E1A008DE8B0 /* HelveticaNeue-UltraLigExtObl.otf in Resources */, + 2E9E37241BD30E1A008DE8B0 /* HelvFE-Oblique.otf in Resources */, + 2E9E368A1BD30E1A008DE8B0 /* HelveticaNeue-HeavyItalic.otf in Resources */, + 2E9E36C81BD30E1A008DE8B0 /* HelveticaNeueLTStd-Bd.otf in Resources */, + 2E9E36D61BD30E1A008DE8B0 /* HelveticaNeueLTStd-CnO.otf in Resources */, + 2E9E36BE1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumExt.otf in Resources */, + 2E9E36201BD30E19008DE8B0 /* Helvetica-Normal.ttf in Resources */, + 2E9E368F1BD30E1A008DE8B0 /* HelveticaNeue-LightExt.otf in Resources */, + 2E9E36331BD30E19008DE8B0 /* HelveticaCE-Cond.otf in Resources */, + 2E9E36E71BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdCn.otf in Resources */, + 2E9E360A1BD30E19008DE8B0 /* Helvetica-Condensed-Bold.otf in Resources */, + 2E9E36D81BD30E1A008DE8B0 /* HelveticaNeueLTStd-ExO.otf in Resources */, + 2E9E36BF1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumExtObl.otf in Resources */, + 2E9E36D31BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkExO.otf in Resources */, + 2E9E36041BD30E19008DE8B0 /* Helvetica-Bold.otf in Resources */, + 2E9E36B11BD30E1A008DE8B0 /* HelveticaNeueLT-ExtBlackCondObl.otf in Resources */, + 2E9E36621BD30E1A008DE8B0 /* HelveticaLTStd-BoldCond.otf in Resources */, + 2E9E36A81BD30E1A008DE8B0 /* HelveticaNeueLT-BlackExtObl.otf in Resources */, + 2E9E36191BD30E19008DE8B0 /* Helvetica-LightOblique.otf in Resources */, + 2E9E36E11BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtCn.otf in Resources */, + 2E0A89011BE899B8009FB358 /* TwitterPhotoCell.xib in Resources */, + 2E9E362F1BD30E19008DE8B0 /* HelveticaBQ-Roman.otf in Resources */, + 2E9E36D11BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkCnO.otf in Resources */, + 2E9E369B1BD30E1A008DE8B0 /* HelveticaNeue-ThinCondObl.otf in Resources */, + 2E9E37231BD30E1A008DE8B0 /* HelvFE-BoldOblique.otf in Resources */, + 2E9E371E1BD30E1A008DE8B0 /* HelvFB.otf in Resources */, + 2E9E371A1BD30E1A008DE8B0 /* HelvFB Oblique.ttf in Resources */, + 2E0A88FB1BE84D17009FB358 /* TumblrPhotoCell.xib in Resources */, + 2E9E370D1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BdO.otf in Resources */, + 2E9E36761BD30E1A008DE8B0 /* HelveticaNeue-BlackExtObl.otf in Resources */, + 2E9E363A1BD30E19008DE8B0 /* HelveticaCE-NarrowOblique.otf in Resources */, + 2E9E37061BD30E1A008DE8B0 /* HelveticaRoundedLT-Bold.otf in Resources */, + 2E9E363C1BD30E19008DE8B0 /* HelveticaCE.otf in Resources */, + 2E9E370E1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-Black.otf in Resources */, + 2E9E36C61BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigExt.otf in Resources */, + 2E9E36DB1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvCnO.otf in Resources */, + 2E9E364B1BD30E1A008DE8B0 /* HelveticaDiagonalBQ.otf in Resources */, + 2E9E36021BD30E19008DE8B0 /* Helvetica-Black.otf in Resources */, + 2E9E36661BD30E1A008DE8B0 /* HelveticaLTStd-Cond.otf in Resources */, + 2E9E36A51BD30E1A008DE8B0 /* HelveticaNeueLT-BlackCond.otf in Resources */, + 2E9E36DE1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvIt.otf in Resources */, + 2E9E366E1BD30E1A008DE8B0 /* HelveticaLTStd-LightObl.otf in Resources */, + 2E9E36C91BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdCn.otf in Resources */, + 2E9E37141BD30E1A008DE8B0 /* HelveticaWorld-Bold.ttf in Resources */, + 2E9E36131BD30E19008DE8B0 /* Helvetica-Conth.ttf in Resources */, + 2E9E36711BD30E1A008DE8B0 /* HelveticaLTStd-UltraComp.otf in Resources */, + 2E9E36AC1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldExtObl.otf in Resources */, + 2E9E36631BD30E1A008DE8B0 /* HelveticaLTStd-BoldCondObl.otf in Resources */, + 2E9E363E1BD30E19008DE8B0 /* HelveticaConBQ-ExtraLight.otf in Resources */, + 2E9E36D01BD30E1A008DE8B0 /* HelveticaNeueLTStd-BlkCn.otf in Resources */, + 2E5EBCFB1BE845C400B646BA /* VineFeedCell.xib in Resources */, + 2E9E36B81BD30E1A008DE8B0 /* HelveticaNeueLT-LightCond.otf in Resources */, + 2E9E36A11BD30E1A008DE8B0 /* HelveticaNeue-UltraLigExt.otf in Resources */, + 2E9E365E1BD30E1A008DE8B0 /* HelveticaLTStd-BlkCond.otf in Resources */, + 2E9E36CF1BD30E1A008DE8B0 /* HelveticaNeueLTStd-Blk.otf in Resources */, + 2E9E37181BD30E1A008DE8B0 /* HelvFB Bold.ttf in Resources */, + 2E9E36BD1BD30E1A008DE8B0 /* HelveticaNeueLT-MediumCondObl.otf in Resources */, + 2E9E36D91BD30E1A008DE8B0 /* HelveticaNeueLTStd-Hv.otf in Resources */, + 2E9E36B41BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyCond.otf in Resources */, + 2E9E36121BD30E19008DE8B0 /* Helvetica-Condensed.otf in Resources */, + 2E9E365C1BD30E1A008DE8B0 /* HelveticaLTStd- steevo -Roman - pointed .ttf in Resources */, + 2E9E36CE1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdOu.otf in Resources */, + 2E9E36051BD30E19008DE8B0 /* Helvetica-BoldOblique.otf in Resources */, + 2E9E371B1BD30E1A008DE8B0 /* HelvFB-Bold.otf in Resources */, + 2E9E36AF1BD30E1A008DE8B0 /* HelveticaNeueLT-CondensedObl.otf in Resources */, + 2E9E36381BD30E19008DE8B0 /* HelveticaCE-NarrowBold.otf in Resources */, + 2EA69A211BFE7994004AF7E4 /* VineHeaderCell.xib in Resources */, + 2E9E36401BD30E19008DE8B0 /* HelveticaConBQ-Light.otf in Resources */, + 2E9E367E1BD30E1A008DE8B0 /* HelveticaNeue-BoldOutline.otf in Resources */, + 2E9E36D71BD30E1A008DE8B0 /* HelveticaNeueLTStd-Ex.otf in Resources */, + 2E9E361D1BD30E19008DE8B0 /* Helvetica-Narrow-Italic.otf in Resources */, + 2E9E37001BD30E1A008DE8B0 /* HelveticaRounded-Bold.otf in Resources */, + 2E1CD2301BEFD8A200418C02 /* CommentCell.xib in Resources */, + 2E9E36A91BD30E1A008DE8B0 /* HelveticaNeueLT-BoldCond.otf in Resources */, + 2E9E364E1BD30E1A008DE8B0 /* HelveticaExtendedBQ-ExtraLight.otf in Resources */, + 2E9E370B1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BdCn.otf in Resources */, + 2E9E36251BD30E19008DE8B0 /* HelveticaBQ-BlackItalic.otf in Resources */, + 2E9E36551BD30E1A008DE8B0 /* HelveticaInserat-Roman-SemiB.ttf in Resources */, + 2E9E36321BD30E19008DE8B0 /* HelveticaCE-BoldOblique.otf in Resources */, + 2E9E36F41BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtCn.otf in Resources */, + 2E9E36A31BD30E1A008DE8B0 /* HelveticaNeue-UltraLight.otf in Resources */, + 2E9E36961BD30E1A008DE8B0 /* HelveticaNeue-MediumExtObl.otf in Resources */, + 2E9E36681BD30E1A008DE8B0 /* HelveticaLTStd-ExtraComp.otf in Resources */, + 2E9E36B61BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyExt.otf in Resources */, + 2E9E37111BD30E1A008DE8B0 /* HelveticaTwoBQ-BoldItalic.otf in Resources */, + 2EBDDB7A1C00400E00DA5DC8 /* NotificationCell.xib in Resources */, + 2E00642E1BC65F1B004C5BBF /* Main.storyboard in Resources */, + 2E9E36C51BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigCondObl.otf in Resources */, + 2E9E37081BD30E1A008DE8B0 /* HelveticaRoundedLT-BoldCondObl.otf in Resources */, + 2E9E36561BD30E1A008DE8B0 /* HelveticaInserat-Roman-SemiBold(1).ttf in Resources */, + 2E9E36721BD30E1A008DE8B0 /* HelveticaNeue-Black.otf in Resources */, + 2E9E36181BD30E19008DE8B0 /* Helvetica-Light.otf in Resources */, + 2E9E36481BD30E1A008DE8B0 /* HelveticaCyrA-BoldInclined.otf in Resources */, + 2E9E36B71BD30E1A008DE8B0 /* HelveticaNeueLT-HeavyExtObl.otf in Resources */, + 2E9E370A1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-Bd.otf in Resources */, + 2E9E361B1BD30E19008DE8B0 /* Helvetica-Narrow-BoldItalic.otf in Resources */, + 2E9E36301BD30E19008DE8B0 /* HelveticaBQ-UltraLight.otf in Resources */, + 2E9E361F1BD30E19008DE8B0 /* Helvetica-Narrow.otf in Resources */, + 2E9E36F81BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtIt.otf in Resources */, + 2E9E364F1BD30E1A008DE8B0 /* HelveticaExtendedBQ-Light.otf in Resources */, + 2E9E37101BD30E1A008DE8B0 /* HelveticaTwoBQ-Bold.otf in Resources */, + 2E9E36451BD30E19008DE8B0 /* HelveticaCyr-Inclined.otf in Resources */, + 2E9E36E91BD30E1A008DE8B0 /* HelveticaNeueLTStd-MdEx.otf in Resources */, + 2E9E36851BD30E1A008DE8B0 /* HelveticaNeue-Heavy.otf in Resources */, + 2E9E37211BD30E1A008DE8B0 /* HelvFE Oblique.ttf in Resources */, + 2E9E37251BD30E1A008DE8B0 /* HelvFE.otf in Resources */, + 2E9E37151BD30E1A008DE8B0 /* HelveticaWorld-BoldItalic.ttf in Resources */, + 2E9E36801BD30E1A008DE8B0 /* HelveticaNeue-CondensedObl.otf in Resources */, + 2E9E36231BD30E19008DE8B0 /* Helvetica.otf in Resources */, + 2E9E370F1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BlkO.otf in Resources */, + 2E9E36E31BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtEx.otf in Resources */, + 2E9E364A1BD30E1A008DE8B0 /* HelveticaCyrA-Upright.otf in Resources */, + 2E9E37021BD30E1A008DE8B0 /* HelveticaRounded-BoldCondObl.otf in Resources */, + 2E9E36351BD30E19008DE8B0 /* HelveticaCE-CondBoldObl.otf in Resources */, + 2E9E36831BD30E1A008DE8B0 /* HelveticaNeue-Extended.otf in Resources */, + 2E9E36AA1BD30E1A008DE8B0 /* HelveticaNeueLT-BoldCondObl.otf in Resources */, + 2E9E36891BD30E1A008DE8B0 /* HelveticaNeue-HeavyExtObl.otf in Resources */, + 2E9E36CD1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdIt.otf in Resources */, + 2E9E36BB1BD30E1A008DE8B0 /* HelveticaNeueLT-LightExtObl.otf in Resources */, + 2E9E368E1BD30E1A008DE8B0 /* HelveticaNeue-LightCondObl.otf in Resources */, + 2ECCC2E91BFEE87C00FF0355 /* IncomingMessageCell.xib in Resources */, + 2E9E37201BD30E1A008DE8B0 /* HelvFE BoldOblique.ttf in Resources */, + 2E9E36FE1BD30E1A008DE8B0 /* HelveticaRounded-Black.otf in Resources */, + 2E9E36B91BD30E1A008DE8B0 /* HelveticaNeueLT-LightCondObl.otf in Resources */, + 2E9E36771BD30E1A008DE8B0 /* HelveticaNeue-BlackItalic.otf in Resources */, + 2EA69A291BFE85C3004AF7E4 /* FacebookHeaderCell.xib in Resources */, + 2E9E363B1BD30E19008DE8B0 /* HelveticaCE-Oblique.otf in Resources */, + 2E9E37261BD30E1A008DE8B0 /* HelvLight Regular.ttf in Resources */, + 2E9E36C31BD30E1A008DE8B0 /* HelveticaNeueLT-ThinExtObl.otf in Resources */, + 2E9E362B1BD30E19008DE8B0 /* HelveticaBQ-Light.otf in Resources */, + 2E9E36F51BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtCnO.otf in Resources */, + 2E9E36011BD30E19008DE8B0 /* Helvetica-Black-SemiBold.ttf in Resources */, + 2E9E369D1BD30E1A008DE8B0 /* HelveticaNeue-ThinExtObl.otf in Resources */, + 2E9E36F91BD30E1A008DE8B0 /* HelveticaNeueLTStd-XBlkCn.otf in Resources */, + 2E9E36DD1BD30E1A008DE8B0 /* HelveticaNeueLTStd-HvExO.otf in Resources */, + 2E9E36821BD30E1A008DE8B0 /* HelveticaNeue-ExtBlackCondObl.otf in Resources */, + 2E9E36611BD30E1A008DE8B0 /* HelveticaLTStd-Bold.otf in Resources */, + 2E9E37011BD30E1A008DE8B0 /* HelveticaRounded-BoldCond.otf in Resources */, + 2E9E36E41BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtExO.otf in Resources */, + 2E9E36211BD30E19008DE8B0 /* Helvetica-Oblique.otf in Resources */, + 2E9E36F01BD30E1A008DE8B0 /* HelveticaNeueLTStd-ThEx.otf in Resources */, + 2E9E36071BD30E19008DE8B0 /* Helvetica-Condensed-Black-Se.ttf in Resources */, + 2E9E36A01BD30E1A008DE8B0 /* HelveticaNeue-UltraLigCondObl.otf in Resources */, + 2E9E36CC1BD30E1A008DE8B0 /* HelveticaNeueLTStd-BdExO.otf in Resources */, + 2E9E36981BD30E1A008DE8B0 /* HelveticaNeue-Roman.otf in Resources */, + 2E9E365F1BD30E1A008DE8B0 /* HelveticaLTStd-BlkCondObl.otf in Resources */, + 2E9E36591BD30E1A008DE8B0 /* HelveticaInseratBQ-Regular.otf in Resources */, + 2E9E36C71BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigExtObl.otf in Resources */, + 2E9E365B1BD30E1A008DE8B0 /* HelveticaInseratLTStd-Roman.otf in Resources */, + 2E9E369E1BD30E1A008DE8B0 /* HelveticaNeue-ThinItalic.otf in Resources */, + 2E9E36B01BD30E1A008DE8B0 /* HelveticaNeueLT-ExtBlackCond.otf in Resources */, + 2E9E367B1BD30E1A008DE8B0 /* HelveticaNeue-BoldExt.otf in Resources */, + 2E9E36F61BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLtEx.otf in Resources */, + 2E9E36E51BD30E1A008DE8B0 /* HelveticaNeueLTStd-LtIt.otf in Resources */, + 2E9E36FF1BD30E1A008DE8B0 /* HelveticaRounded-BlackObl.otf in Resources */, + 2E9E360E1BD30E19008DE8B0 /* Helvetica-Condensed-Light.otf in Resources */, + 2E9E368B1BD30E1A008DE8B0 /* HelveticaNeue-Italic.otf in Resources */, + 2E9E36531BD30E1A008DE8B0 /* HelveticaExtO 4.ttf in Resources */, + 2E9E36111BD30E19008DE8B0 /* Helvetica-Condensed-Thin.ttf in Resources */, + 2E0A88F91BE84BB6009FB358 /* TwitterTweetCell.xib in Resources */, + 2E9E36F31BD30E1A008DE8B0 /* HelveticaNeueLTStd-UltLt.otf in Resources */, + 2E9E36C41BD30E1A008DE8B0 /* HelveticaNeueLT-UltraLigCond.otf in Resources */, + 2E9E364D1BD30E1A008DE8B0 /* HelveticaExtendedBQ-Bold.otf in Resources */, + 2E9E36431BD30E19008DE8B0 /* HelveticaCyr-Bold.otf in Resources */, + 2E9E36A71BD30E1A008DE8B0 /* HelveticaNeueLT-BlackExt.otf in Resources */, + 2E9E36E01BD30E1A008DE8B0 /* HelveticaNeueLTStd-Lt.otf in Resources */, + 2E9E36D51BD30E1A008DE8B0 /* HelveticaNeueLTStd-Cn.otf in Resources */, + 2E9E36731BD30E1A008DE8B0 /* HelveticaNeue-BlackCond.otf in Resources */, + 2E9E36081BD30E19008DE8B0 /* Helvetica-Condensed-Black.otf in Resources */, + 2E9E37121BD30E1A008DE8B0 /* HelveticaTwoBQ-Italic.otf in Resources */, + 2E9E360F1BD30E19008DE8B0 /* Helvetica-Condensed-LightObl.otf in Resources */, + 2E9E36811BD30E1A008DE8B0 /* HelveticaNeue-ExtBlackCond.otf in Resources */, + 2E9E36B31BD30E1A008DE8B0 /* HelveticaNeueLT-ExtendedObl.otf in Resources */, + 2E9E36371BD30E19008DE8B0 /* HelveticaCE-Narrow.otf in Resources */, + 2E9E36421BD30E19008DE8B0 /* HelveticaConBQ-Medium.otf in Resources */, + 2E9E36461BD30E1A008DE8B0 /* HelveticaCyr-Upright.otf in Resources */, + 2E9E36271BD30E19008DE8B0 /* HelveticaBQ-BoldItalic.otf in Resources */, + 2E9E36FD1BD30E1A008DE8B0 /* HelveticaObl-Th.ttf in Resources */, + 2E9E361E1BD30E19008DE8B0 /* Helvetica-Narrow-Oblique.otf in Resources */, + 2E9E36931BD30E1A008DE8B0 /* HelveticaNeue-MediumCond.otf in Resources */, + 2E9E370C1BD30E1A008DE8B0 /* HelveticaRoundedLTStd-BdCnO.otf in Resources */, + 2E9E36521BD30E1A008DE8B0 /* HelveticaExtO 3.ttf in Resources */, + 2E9E36141BD30E19008DE8B0 /* Helvetica-ExtraCompressed.otf in Resources */, + 2E9E366F1BD30E1A008DE8B0 /* HelveticaLTStd-Obl.otf in Resources */, + 2E9E36861BD30E1A008DE8B0 /* HelveticaNeue-HeavyCond.otf in Resources */, + 2E9E364C1BD30E1A008DE8B0 /* HelveticaExt-No.ttf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2E0064371BC65F1B004C5BBF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2E0064421BC65F1B004C5BBF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 34F6C539AD93563F2DE7219A /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-comblie/Pods-comblie-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 69B30BD71BD5F0F600F03990 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "./Fabric.framework/run 9cde9ba9c66701a2acaf6b75a4b76de3d1a4abe6 28eb10442813b44fd8ab8fd249513bc20e29c89eb4877a7261715ace816111c2"; + }; + E1A09236460F8DFB88CCF814 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + EF04CB143E2210CB8E0EB563 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-comblie/Pods-comblie-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2E0064211BC65F1B004C5BBF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2E380B971BDDA32C00803B8C /* IncomingMessageCellController.swift in Sources */, + 2EB579451BDF86810026F284 /* InstagramProfileController.swift in Sources */, + 698257841BD808BF0062AD39 /* NetworkClass.swift in Sources */, + 2ECCC2F11BFEF0DC00FF0355 /* MessageRoomDatasource.swift in Sources */, + 2E0064571BC66E19004C5BBF /* LoginViewController.swift in Sources */, + 2E45ECBC1BDA038300AF1F18 /* FacebookHeaderTableViewCell.swift in Sources */, + 2ED323E01BDDFBF400EEDA16 /* TimeMessageCellController.swift in Sources */, + 2EC206BE1BFAC9570068AE1E /* InstagramFeedDatasource.swift in Sources */, + 2E0E3C851BEFDFBE001CAA05 /* CommentCellController.swift in Sources */, + 2E00642B1BC65F1B004C5BBF /* HomeViewController.swift in Sources */, + 2EEB11E41BE0AE5000DA8492 /* TwitterPhotoCellController.swift in Sources */, + 69BB36951BD496A2000362D1 /* FirebaseIOManager.swift in Sources */, + 2E9B580E1BFE5D7A00613C7F /* TumblrPhotoModalController.swift in Sources */, + 69BF17231BDA89E2008A726F /* NetworkNotificationManager.swift in Sources */, + 2E99EFBB1BD1E1AD00938B04 /* ConversationTableViewController.swift in Sources */, + 2EC9DC601BCE2D68009BD4B0 /* SocialTabBarController.swift in Sources */, + 2E0064611BC731EA004C5BBF /* RegistrationViewController.swift in Sources */, + 2E86DC401C0E7BE5001C62CF /* ComposeViewController.swift in Sources */, + 2E5EBCFE1BE847F900B646BA /* AllFeedTableViewController.swift in Sources */, + 2E155E2C1BD85EA100868F2C /* MessageRoomViewController.swift in Sources */, + 2E8106301BDA2D43005577F6 /* TumblrProfileTableViewController.swift in Sources */, + 2EC06ED91C052C1900ABA888 /* PublicProfileController.swift in Sources */, + 2E935F531BDC1ECE003E55AD /* FacebookFeedTableViewController.swift in Sources */, + 69BF17211BDA876C008A726F /* NetworkFeedClass.swift in Sources */, + 2EC206C21BFC0BD30068AE1E /* TwitterFeedDatasource.swift in Sources */, + 2EA69A2B1BFE8687004AF7E4 /* FacebookFeedDatasource.swift in Sources */, + 6902330C1BCF6B55001AB41B /* UserDataManager.swift in Sources */, + 2E9971571BEC1452004B75C4 /* VineVideoModalController.swift in Sources */, + 2E3C9B2E1BEB1FF900A7C86F /* TermsConditionsController.swift in Sources */, + 2E556A431BCCEF2500623A80 /* ProfilePageController.swift in Sources */, + 2E8106361BDA34B3005577F6 /* VineHeaderTableViewCell.swift in Sources */, + 2E0A89041BE993A5009FB358 /* SettingsPageController.swift in Sources */, + 2E81062E1BDA2D32005577F6 /* TumblrHeaderTableViewCell.swift in Sources */, + 690233081BCF6AEF001AB41B /* FeedRequestManager.swift in Sources */, + 2E45ECC11BDA08C700AF1F18 /* TwitterProfileTableViewController.swift in Sources */, + 69BF17251BDA949D008A726F /* NotificationRequestManager.swift in Sources */, + 69E272901BD843FB00259A44 /* Networks.swift in Sources */, + 2E935F551BDC1EEB003E55AD /* TwitterFeedTableViewController.swift in Sources */, + 2E0256C71BCB934A009490C2 /* SocialLoginViewController.swift in Sources */, + 2E96A24D1BF27AF4000DB006 /* NetworkSettingsController.swift in Sources */, + 2E45ECBA1BD9FE2D00AF1F18 /* FacebookProfileTableViewController.swift in Sources */, + 2E935F571BDC1EF5003E55AD /* InstagramFeedTableViewController.swift in Sources */, + 2E935F5B1BDC1F08003E55AD /* VineFeedTableViewController.swift in Sources */, + 2E5EBCF51BE368C400B646BA /* FacebookStatusCellController.swift in Sources */, + 2E0064291BC65F1B004C5BBF /* AppDelegate.swift in Sources */, + 2EEB11E61BE16A4100DA8492 /* TwitterTweetCellController.swift in Sources */, + 2E7A7A1B1BD7074B00A3CB7F /* VineLoginController.swift in Sources */, + 2E96A24B1BF1F880000DB006 /* PrivacyPolicyController.swift in Sources */, + 2E5EBCF71BE43B6500B646BA /* TumblrBlogCellController.swift in Sources */, + 2E799B411BEF10FF0030803B /* CommentsController.swift in Sources */, + 2ECCC2D91BFECF6100FF0355 /* ConversationListDatasource.swift in Sources */, + 2EDFE3A71BD0261000C85CB5 /* NotificationPageController.swift in Sources */, + 2EDFE3AB1BD03C0200C85CB5 /* MessagePageController.swift in Sources */, + 2EDC72EA1BD0BB020050E031 /* FeedPageController.swift in Sources */, + 2E5EBCF91BE7EC2F00B646BA /* TumblrPhotoCellController.swift in Sources */, + 2E8030881BEAE90500A8069C /* PushNotificationsController.swift in Sources */, + 2E99EFC21BD220E600938B04 /* ConversationCellController.swift in Sources */, + 690233041BCF6A73001AB41B /* InstagramAPIManager.swift in Sources */, + 2E155E321BD8636800868F2C /* MessageRoomTableViewController.swift in Sources */, + 2E1E73441BFD8D6B009F26F9 /* AllFeedDatasource.swift in Sources */, + 2EC206C01BFBFF6C0068AE1E /* VineFeedDatasource.swift in Sources */, + 2E80308A1BEAF90000A8069C /* ReportProblemController.swift in Sources */, + 2EE1AD261BF3F0BB00A54B49 /* WebsiteController.swift in Sources */, + 2ED323E21BDDFEA800EEDA16 /* IncomingMessageTwoCellController.swift in Sources */, + 6902330A1BCF6B0D001AB41B /* KeychainWrapper.swift in Sources */, + 2E3CDBF81BDC63B500C8C49D /* InstagramFeedCellController.swift in Sources */, + 2E935F591BDC1EFF003E55AD /* TumblrFeedTableViewController.swift in Sources */, + 2E4E90FA1BE9AFD900C3D780 /* SettingsTableController.swift in Sources */, + 2E935F611BDC2558003E55AD /* VineFeedCellController.swift in Sources */, + 2E380B991BDDA69600803B8C /* OutgoingMessageCellController.swift in Sources */, + 2EC206C41BFC48270068AE1E /* TumblrFeedDatasource.swift in Sources */, + 2EBDDB781C003F7A00DA5DC8 /* NotificationDatasource.swift in Sources */, + 2E0256C51BCB84CE009490C2 /* MainViewController.swift in Sources */, + 2EFF739B1BCE5CB7005CC408 /* SocialTabViewController.swift in Sources */, + 2E16A3991BEF08A500A44104 /* InstagramModalController.swift in Sources */, + 2E8106321BDA2D51005577F6 /* VineProfileTableViewController.swift in Sources */, + 2E45ECBF1BDA08AD00AF1F18 /* TwitterHeaderTableViewCell.swift in Sources */, + 2EB7E7CB1BEB1077002605C8 /* FeedbackController.swift in Sources */, + 2E99EFBE1BD1E27300938B04 /* NotificationTableViewController.swift in Sources */, + 2E30C2821BE0A5990001CB87 /* InstagramPhotoCell.swift in Sources */, + 2E4D7F891BD375F50025A0A1 /* NotificationCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2E0064351BC65F1B004C5BBF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2E00643E1BC65F1B004C5BBF /* comblieTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2E0064401BC65F1B004C5BBF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2E0064491BC65F1B004C5BBF /* comblieUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 2E00643B1BC65F1B004C5BBF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2E0064241BC65F1B004C5BBF /* comblie */; + targetProxy = 2E00643A1BC65F1B004C5BBF /* PBXContainerItemProxy */; + }; + 2E0064461BC65F1B004C5BBF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2E0064241BC65F1B004C5BBF /* comblie */; + targetProxy = 2E0064451BC65F1B004C5BBF /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 2E00642C1BC65F1B004C5BBF /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 2E00642D1BC65F1B004C5BBF /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 2E0064311BC65F1B004C5BBF /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 2E0064321BC65F1B004C5BBF /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 2E00644B1BC65F1B004C5BBF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 2E00644C1BC65F1B004C5BBF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 2E00644E1BC65F1B004C5BBF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC668777F91F5EDBE963466E /* Pods-comblie.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = comblie/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.social.comblie; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 2E00644F1BC65F1B004C5BBF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DC8FBA28703283B1CD91C418 /* Pods-comblie.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = comblie/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.social.comblie; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 2E0064511BC65F1B004C5BBF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = comblieTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.social.comblieTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/comblie.app/comblie"; + }; + name = Debug; + }; + 2E0064521BC65F1B004C5BBF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = comblieTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.social.comblieTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/comblie.app/comblie"; + }; + name = Release; + }; + 2E0064541BC65F1B004C5BBF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = comblieUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.social.comblieUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = comblie; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 2E0064551BC65F1B004C5BBF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = comblieUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.social.comblieUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = comblie; + USES_XCTRUNNER = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2E0064201BC65F1B004C5BBF /* Build configuration list for PBXProject "comblie" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2E00644B1BC65F1B004C5BBF /* Debug */, + 2E00644C1BC65F1B004C5BBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2E00644D1BC65F1B004C5BBF /* Build configuration list for PBXNativeTarget "comblie" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2E00644E1BC65F1B004C5BBF /* Debug */, + 2E00644F1BC65F1B004C5BBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2E0064501BC65F1B004C5BBF /* Build configuration list for PBXNativeTarget "comblieTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2E0064511BC65F1B004C5BBF /* Debug */, + 2E0064521BC65F1B004C5BBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2E0064531BC65F1B004C5BBF /* Build configuration list for PBXNativeTarget "comblieUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2E0064541BC65F1B004C5BBF /* Debug */, + 2E0064551BC65F1B004C5BBF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2E00641D1BC65F1B004C5BBF /* Project object */; +} diff --git a/comblie.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/comblie.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9e1b11f --- /dev/null +++ b/comblie.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/comblie.xcworkspace/contents.xcworkspacedata b/comblie.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cf2a607 --- /dev/null +++ b/comblie.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/comblie/AppDelegate.swift b/comblie/AppDelegate.swift new file mode 100644 index 0000000..b625c16 --- /dev/null +++ b/comblie/AppDelegate.swift @@ -0,0 +1,105 @@ + // +// AppDelegate.swift +// comblie +// +// Created by Cal on 10/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit +import FBSDKCoreKit +import Firebase +import Fabric +import TwitterKit +import OAuthSwift + + + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + Fabric.with([Twitter.self]) + let comblieUserID = KeychainWrapper.stringForKey("ComblieUserID") + let comblieUserEmail = KeychainWrapper.stringForKey("ComblieUserEmail") + if let userID = comblieUserID{ + if let email = comblieUserEmail { + UserDataManager.sharedInstance.comblieUserId = userID + UserDataManager.sharedInstance.comblieEmailAddress = email + FirebaseIOManager.sharedInstance.getUserData(userID, email: email) + } + + } + //application.setStatusBarStyle(UIStatusBarStyle.LightContent, animated: false) + return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) + + } + + func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { + if (url.host == "oauth-callback") { + if (url.path!.hasPrefix("/tumblr")){ + OAuth1Swift.handleOpenURL(url) + } + } + + //parse url components for response scheme + let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: false) + + // handle URL + if let prefix = components?.scheme! { + switch prefix { + case "fb1631909983727859": + return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) + case "comblieinstagram": + InstagramAPIManager.sharedInstance.processOAuthStep1Response(url) + return true + case "comblietwitter": + // Handle Twitter + return true + case "comblieTumblr": + OAuth1Swift.handleOpenURL(url) + return true + case "comblieVine": + //Handle Vine + return true + default: + return true + } + } + return true + } + + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + +// func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { +// InstagramAPIManager.sharedInstance.processOAuthStep1Response(url) +// return true +// } + +} + diff --git a/comblie/Assets.xcassets/AppIcon.appiconset/Contents.json b/comblie/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/comblie/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Contents.json b/comblie/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon.png b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon.png new file mode 100644 index 0000000..0aaf35e Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon@0.5x.png b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon@0.5x.png new file mode 100644 index 0000000..8e5c4dc Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon@0.5x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon@1.5x.png b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon@1.5x.png new file mode 100644 index 0000000..f3dcab2 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Comment-Icon@1.5x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Contents.json new file mode 100644 index 0000000..e41e5c3 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Action Icons/CommentIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Comment-Icon@0.5x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Comment-Icon.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Comment-Icon@1.5x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/Contents.json b/comblie/Assets.xcassets/Images/Action Icons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Action Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Contents.json new file mode 100644 index 0000000..24963a7 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Filled-Heart-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Filled-Heart-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Filled-Heart-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon.png b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon.png new file mode 100644 index 0000000..ec02d30 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon@2x.png b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon@2x.png new file mode 100644 index 0000000..0821387 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon@3x.png b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon@3x.png new file mode 100644 index 0000000..dc23037 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/FilledHeartIcon.imageset/Filled-Heart-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Contents.json new file mode 100644 index 0000000..296750d --- /dev/null +++ b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Reply-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Reply-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Reply-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon.png b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon.png new file mode 100644 index 0000000..ac01a19 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon@2x.png b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon@2x.png new file mode 100644 index 0000000..2e70b29 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon@3x.png b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon@3x.png new file mode 100644 index 0000000..31c82a1 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/ReplyIcon.imageset/Reply-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/Contents.json new file mode 100644 index 0000000..47f143b --- /dev/null +++ b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "repost-icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "repost-icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "repost-icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon.png b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon.png new file mode 100644 index 0000000..2a898b7 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon@2x.png b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon@2x.png new file mode 100644 index 0000000..8aa4ddc Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon@3x.png b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon@3x.png new file mode 100644 index 0000000..7612fd0 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/RepostIcon.imageset/repost-icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Contents.json new file mode 100644 index 0000000..3d05bfe --- /dev/null +++ b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Star-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Star-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Star-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon.png b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon.png new file mode 100644 index 0000000..b53dd36 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon@2x.png b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon@2x.png new file mode 100644 index 0000000..315dbcd Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon@3x.png b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon@3x.png new file mode 100644 index 0000000..4ff7f31 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/StarIcon.imageset/Star-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Contents.json new file mode 100644 index 0000000..0d2be9d --- /dev/null +++ b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Unfilled-Heart-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Unfilled-Heart-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Unfilled-Heart-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon.png b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon.png new file mode 100644 index 0000000..7d0e87e Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon@2x.png b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon@2x.png new file mode 100644 index 0000000..d19b208 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon@3x.png b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon@3x.png new file mode 100644 index 0000000..3670cbb Binary files /dev/null and b/comblie/Assets.xcassets/Images/Action Icons/UnfilledHeartIcon.imageset/Unfilled-Heart-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Contents.json b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..4ad61f6 --- /dev/null +++ b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Unify-App-Icon@58x58.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Unify-App-Icon@87x87.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Unify-App-Icon@80x80.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Unify-App-Icon@120x120.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Unify-App-Icon@120x120-1.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Unify-App-Icon@180x180.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Unify-App-Icon@29x29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Unify-App-Icon@58x58-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Unify-App-Icon@40x40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Unify-App-Icon@80x80-1.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Unify-App-Icon@76x76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Unify-App-Icon@152x152.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@120x120-1.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@120x120-1.png new file mode 100644 index 0000000..5f86a81 Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@120x120-1.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@120x120.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@120x120.png new file mode 100644 index 0000000..5f86a81 Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@120x120.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@152x152.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@152x152.png new file mode 100644 index 0000000..3d37b5e Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@152x152.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@180x180.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@180x180.png new file mode 100644 index 0000000..a271e0d Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@180x180.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@29x29.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@29x29.png new file mode 100644 index 0000000..260ed1f Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@29x29.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@40x40.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@40x40.png new file mode 100644 index 0000000..67fbd72 Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@40x40.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@58x58-1.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@58x58-1.png new file mode 100644 index 0000000..387f597 Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@58x58-1.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@58x58.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@58x58.png new file mode 100644 index 0000000..387f597 Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@58x58.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@76x76.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@76x76.png new file mode 100644 index 0000000..c915d6d Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@76x76.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@80x80-1.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@80x80-1.png new file mode 100644 index 0000000..f60aacc Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@80x80-1.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@80x80.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@80x80.png new file mode 100644 index 0000000..f60aacc Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@80x80.png differ diff --git a/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@87x87.png b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@87x87.png new file mode 100644 index 0000000..8c446e8 Binary files /dev/null and b/comblie/Assets.xcassets/Images/AppIcon.appiconset/Unify-App-Icon@87x87.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon.png new file mode 100644 index 0000000..168f848 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon@2x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon@2x.png new file mode 100644 index 0000000..f782986 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon@3x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon@3x.png new file mode 100644 index 0000000..42172d6 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Activity-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Contents.json new file mode 100644 index 0000000..b9b21f3 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ActivityIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Activity-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Activity-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Activity-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Contents.json new file mode 100644 index 0000000..92e36f8 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Feed-Icon@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Feed-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Feed-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@1x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@1x.png new file mode 100644 index 0000000..c078b82 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@1x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@2x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@2x.png new file mode 100644 index 0000000..cfd0a9f Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@3x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@3x.png new file mode 100644 index 0000000..e4a8022 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/FeedIcon.imageset/Feed-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Contents.json new file mode 100644 index 0000000..55ee2c4 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Messages-Icon@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Messages-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Messages-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@1x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@1x.png new file mode 100644 index 0000000..29b3c32 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@1x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@2x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@2x.png new file mode 100644 index 0000000..12d4a38 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@3x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@3x.png new file mode 100644 index 0000000..a1819e4 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/MessagesIcon.imageset/Messages-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Contents.json new file mode 100644 index 0000000..dd91be3 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Profiles-Icon@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Profiles-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Profiles-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@1x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@1x.png new file mode 100644 index 0000000..81718d7 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@1x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@2x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@2x.png new file mode 100644 index 0000000..255d2db Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@3x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@3x.png new file mode 100644 index 0000000..1519c81 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/ProfilesIcon.imageset/Profiles-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Contents.json new file mode 100644 index 0000000..9e26db6 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Settings-Icon@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Settings-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Settings-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@1x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@1x.png new file mode 100644 index 0000000..01baef9 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@1x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@2x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@2x.png new file mode 100644 index 0000000..a390b3c Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@3x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@3x.png new file mode 100644 index 0000000..f2857b5 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/SettingsIcon.imageset/Settings-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Contents.json new file mode 100644 index 0000000..f294500 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Upload-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Upload-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Upload-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon.png new file mode 100644 index 0000000..d8f96bb Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon@2x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon@2x.png new file mode 100644 index 0000000..0b7a087 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon@3x.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon@3x.png new file mode 100644 index 0000000..27687b3 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/UploadIcon.imageset/Upload-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.imageset/Contents.json b/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.imageset/Contents.json new file mode 100644 index 0000000..aae947c --- /dev/null +++ b/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "messagefield.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.imageset/messagefield.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.imageset/messagefield.png new file mode 100644 index 0000000..620b454 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.imageset/messagefield.png differ diff --git a/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.png b/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.png new file mode 100644 index 0000000..620b454 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Bottom Bar Icons/messagefield.png differ diff --git a/comblie/Assets.xcassets/Images/ComblieLogo.imageset/Contents.json b/comblie/Assets.xcassets/Images/ComblieLogo.imageset/Contents.json new file mode 100644 index 0000000..9d1ac70 --- /dev/null +++ b/comblie/Assets.xcassets/Images/ComblieLogo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "comblielogo.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/ComblieLogo.imageset/comblielogo.png b/comblie/Assets.xcassets/Images/ComblieLogo.imageset/comblielogo.png new file mode 100644 index 0000000..034f7ae Binary files /dev/null and b/comblie/Assets.xcassets/Images/ComblieLogo.imageset/comblielogo.png differ diff --git a/comblie/Assets.xcassets/Images/ComblieTitle.imageset/Contents.json b/comblie/Assets.xcassets/Images/ComblieTitle.imageset/Contents.json new file mode 100644 index 0000000..6152442 --- /dev/null +++ b/comblie/Assets.xcassets/Images/ComblieTitle.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "comblietitle.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/ComblieTitle.imageset/comblietitle.png b/comblie/Assets.xcassets/Images/ComblieTitle.imageset/comblietitle.png new file mode 100644 index 0000000..ab09046 Binary files /dev/null and b/comblie/Assets.xcassets/Images/ComblieTitle.imageset/comblietitle.png differ diff --git a/comblie/Assets.xcassets/Images/Contents.json b/comblie/Assets.xcassets/Images/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Contents.json b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000..7dc693d --- /dev/null +++ b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Contents.json @@ -0,0 +1,57 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "filename" : "Splash-Screen@640x960.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "subtype" : "retina4", + "filename" : "Splash-Screen@640x1136.png", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "filename" : "Splash-Screen@768x1024.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "filename" : "Splash-Screen@1024x768.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "filename" : "Splash-Screen@1536x2048.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "filename" : "Splash-Screen@2048x1536.png", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@1024x768.png b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@1024x768.png new file mode 100644 index 0000000..a87dfd1 Binary files /dev/null and b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@1024x768.png differ diff --git a/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@1536x2048.png b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@1536x2048.png new file mode 100644 index 0000000..86fc6ab Binary files /dev/null and b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@1536x2048.png differ diff --git a/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@2048x1536.png b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@2048x1536.png new file mode 100644 index 0000000..da98b2f Binary files /dev/null and b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@2048x1536.png differ diff --git a/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@640x1136.png b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@640x1136.png new file mode 100644 index 0000000..9b0ca4c Binary files /dev/null and b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@640x1136.png differ diff --git a/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@640x960.png b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@640x960.png new file mode 100644 index 0000000..5e0c8f4 Binary files /dev/null and b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@640x960.png differ diff --git a/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@768x1024.png b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@768x1024.png new file mode 100644 index 0000000..160e76a Binary files /dev/null and b/comblie/Assets.xcassets/Images/LaunchImage.launchimage/Splash-Screen@768x1024.png differ diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon.png b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon.png new file mode 100644 index 0000000..3926e51 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon@2x.png b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon@2x.png new file mode 100644 index 0000000..43424ee Binary files /dev/null and b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon@3x.png b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon@3x.png new file mode 100644 index 0000000..2e89aed Binary files /dev/null and b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Back-Button-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Contents.json new file mode 100644 index 0000000..06ede53 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Nav Bar Icons/BackButtonIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Back-Button-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Back-Button-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Back-Button-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/Contents.json b/comblie/Assets.xcassets/Images/Nav Bar Icons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Nav Bar Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Contents.json new file mode 100644 index 0000000..0b878c2 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Write-Post-Icon@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Write-Post-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Write-Post-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@1x.png b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@1x.png new file mode 100644 index 0000000..d549eca Binary files /dev/null and b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@1x.png differ diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@2x.png b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@2x.png new file mode 100644 index 0000000..027f4bb Binary files /dev/null and b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@3x.png b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@3x.png new file mode 100644 index 0000000..d2687f0 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Nav Bar Icons/PostIcon.imageset/Write-Post-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Placeholder Icons/Contents.json b/comblie/Assets.xcassets/Images/Placeholder Icons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Placeholder Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Placeholder Icons/CoverPhoto.imageset/Contents.json b/comblie/Assets.xcassets/Images/Placeholder Icons/CoverPhoto.imageset/Contents.json new file mode 100644 index 0000000..e533efe --- /dev/null +++ b/comblie/Assets.xcassets/Images/Placeholder Icons/CoverPhoto.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "nature.jpg", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Placeholder Icons/CoverPhoto.imageset/nature.jpg b/comblie/Assets.xcassets/Images/Placeholder Icons/CoverPhoto.imageset/nature.jpg new file mode 100644 index 0000000..cebfed1 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Placeholder Icons/CoverPhoto.imageset/nature.jpg differ diff --git a/comblie/Assets.xcassets/Images/Placeholder Icons/Persona.imageset/Contents.json b/comblie/Assets.xcassets/Images/Placeholder Icons/Persona.imageset/Contents.json new file mode 100644 index 0000000..2941bba --- /dev/null +++ b/comblie/Assets.xcassets/Images/Placeholder Icons/Persona.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Screen Shot 2015-06-02 at 4.14.18 PM.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Placeholder Icons/Persona.imageset/Screen Shot 2015-06-02 at 4.14.18 PM.png b/comblie/Assets.xcassets/Images/Placeholder Icons/Persona.imageset/Screen Shot 2015-06-02 at 4.14.18 PM.png new file mode 100644 index 0000000..71ab742 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Placeholder Icons/Persona.imageset/Screen Shot 2015-06-02 at 4.14.18 PM.png differ diff --git a/comblie/Assets.xcassets/Images/Placeholder Icons/Photo.imageset/Contents.json b/comblie/Assets.xcassets/Images/Placeholder Icons/Photo.imageset/Contents.json new file mode 100644 index 0000000..d65b517 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Placeholder Icons/Photo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Screen Shot 2015-06-04 at 1.18.10 AM.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Placeholder Icons/Photo.imageset/Screen Shot 2015-06-04 at 1.18.10 AM.png b/comblie/Assets.xcassets/Images/Placeholder Icons/Photo.imageset/Screen Shot 2015-06-04 at 1.18.10 AM.png new file mode 100644 index 0000000..0904c58 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Placeholder Icons/Photo.imageset/Screen Shot 2015-06-04 at 1.18.10 AM.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Contents.json new file mode 100644 index 0000000..2200348 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Facebook-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Facebook-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Facebook-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon.png new file mode 100644 index 0000000..c29b457 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon@2x.png new file mode 100644 index 0000000..de6e3f6 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon@3x.png new file mode 100644 index 0000000..572a9ed Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/FacebookIcon.imageset/Facebook-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/Contents.json new file mode 100644 index 0000000..edd5688 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "GooglePlus-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "GooglePlus-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "GooglePlus-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon.png new file mode 100644 index 0000000..218240d Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon@2x.png new file mode 100644 index 0000000..700c8a8 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon@3x.png new file mode 100644 index 0000000..c1f1e0f Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/GooglePlusIcon.imageset/GooglePlus-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Contents.json new file mode 100644 index 0000000..5cea0da --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Instagram-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Instagram-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Instagram-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon.png new file mode 100644 index 0000000..aea5b27 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon@2x.png new file mode 100644 index 0000000..17934bf Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon@3x.png new file mode 100644 index 0000000..0e33f91 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/InstagramIcon.imageset/Instagram-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Contents.json new file mode 100644 index 0000000..6d2ec23 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Linkedin-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Linkedin-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Linkedin-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon.png new file mode 100644 index 0000000..56ec9e9 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon@2x.png new file mode 100644 index 0000000..2aadfd9 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon@3x.png new file mode 100644 index 0000000..2cf0bcc Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/LinkedInIcon.imageset/Linkedin-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Contents.json new file mode 100644 index 0000000..a0f4561 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Tumblr-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Tumblr-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Tumblr-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon.png new file mode 100644 index 0000000..77b8979 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon@2x.png new file mode 100644 index 0000000..4adec0c Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon@3x.png new file mode 100644 index 0000000..6437940 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/TumblrIcon.imageset/Tumblr-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Contents.json new file mode 100644 index 0000000..53354c3 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Twitter-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Twitter-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Twitter-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon.png new file mode 100644 index 0000000..5a2c133 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon@2x.png new file mode 100644 index 0000000..7f2373e Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon@3x.png new file mode 100644 index 0000000..873eaf3 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/TwitterIcon.imageset/Twitter-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Contents.json new file mode 100644 index 0000000..3e643f8 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Vine-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Vine-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Vine-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon.png new file mode 100644 index 0000000..01bf0cb Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon@2x.png new file mode 100644 index 0000000..e5086bd Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon@3x.png new file mode 100644 index 0000000..17cc64d Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/VineIcon.imageset/Vine-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Contents.json b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Contents.json new file mode 100644 index 0000000..ac73910 --- /dev/null +++ b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Youtube-Icon.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Youtube-Icon@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Youtube-Icon@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon.png b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon.png new file mode 100644 index 0000000..d77b98c Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon@2x.png b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon@2x.png new file mode 100644 index 0000000..c66d3dd Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon@2x.png differ diff --git a/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon@3x.png b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon@3x.png new file mode 100644 index 0000000..7ad3651 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Social Media Icons/YoutubeIcon.imageset/Youtube-Icon@3x.png differ diff --git a/comblie/Assets.xcassets/Images/SplashScreen.imageset/Contents.json b/comblie/Assets.xcassets/Images/SplashScreen.imageset/Contents.json new file mode 100644 index 0000000..36b19c8 --- /dev/null +++ b/comblie/Assets.xcassets/Images/SplashScreen.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Splash-Screen@480x480.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/SplashScreen.imageset/Splash-Screen@480x480.png b/comblie/Assets.xcassets/Images/SplashScreen.imageset/Splash-Screen@480x480.png new file mode 100644 index 0000000..3c51fe1 Binary files /dev/null and b/comblie/Assets.xcassets/Images/SplashScreen.imageset/Splash-Screen@480x480.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/bottomBarItems.psd b/comblie/Assets.xcassets/Images/Tab bar Images/bottomBarItems.psd new file mode 100644 index 0000000..f883e42 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/bottomBarItems.psd differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/feedsdark.png b/comblie/Assets.xcassets/Images/Tab bar Images/feedsdark.png new file mode 100644 index 0000000..be332c2 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/feedsdark.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/feedslight.png b/comblie/Assets.xcassets/Images/Tab bar Images/feedslight.png new file mode 100644 index 0000000..4e366d9 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/feedslight.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/messagesdark.png b/comblie/Assets.xcassets/Images/Tab bar Images/messagesdark.png new file mode 100644 index 0000000..3974735 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/messagesdark.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/messageslight.png b/comblie/Assets.xcassets/Images/Tab bar Images/messageslight.png new file mode 100644 index 0000000..69992d1 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/messageslight.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/notificationsdark.png b/comblie/Assets.xcassets/Images/Tab bar Images/notificationsdark.png new file mode 100644 index 0000000..a0dc0d8 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/notificationsdark.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/notificationslight.png b/comblie/Assets.xcassets/Images/Tab bar Images/notificationslight.png new file mode 100644 index 0000000..6456e00 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/notificationslight.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/profiledark.png b/comblie/Assets.xcassets/Images/Tab bar Images/profiledark.png new file mode 100644 index 0000000..f519b7c Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/profiledark.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/profilelight.png b/comblie/Assets.xcassets/Images/Tab bar Images/profilelight.png new file mode 100644 index 0000000..8c97df1 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/profilelight.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/settingsdark.png b/comblie/Assets.xcassets/Images/Tab bar Images/settingsdark.png new file mode 100644 index 0000000..c6a5005 Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/settingsdark.png differ diff --git a/comblie/Assets.xcassets/Images/Tab bar Images/settingslight.png b/comblie/Assets.xcassets/Images/Tab bar Images/settingslight.png new file mode 100644 index 0000000..a1b6c9a Binary files /dev/null and b/comblie/Assets.xcassets/Images/Tab bar Images/settingslight.png differ diff --git a/comblie/Assets.xcassets/Images/angelina.png b/comblie/Assets.xcassets/Images/angelina.png new file mode 100644 index 0000000..96ad9db Binary files /dev/null and b/comblie/Assets.xcassets/Images/angelina.png differ diff --git a/comblie/Assets.xcassets/Images/backArrow.png b/comblie/Assets.xcassets/Images/backArrow.png new file mode 100644 index 0000000..21f7984 Binary files /dev/null and b/comblie/Assets.xcassets/Images/backArrow.png differ diff --git a/comblie/Assets.xcassets/Images/camera.png b/comblie/Assets.xcassets/Images/camera.png new file mode 100644 index 0000000..4ca9989 Binary files /dev/null and b/comblie/Assets.xcassets/Images/camera.png differ diff --git a/comblie/Assets.xcassets/Images/comblielogo.png b/comblie/Assets.xcassets/Images/comblielogo.png new file mode 100644 index 0000000..034f7ae Binary files /dev/null and b/comblie/Assets.xcassets/Images/comblielogo.png differ diff --git a/comblie/Assets.xcassets/Images/comblielogodark.png b/comblie/Assets.xcassets/Images/comblielogodark.png new file mode 100644 index 0000000..9807136 Binary files /dev/null and b/comblie/Assets.xcassets/Images/comblielogodark.png differ diff --git a/comblie/Assets.xcassets/Images/comblietitle.png b/comblie/Assets.xcassets/Images/comblietitle.png new file mode 100644 index 0000000..ab09046 Binary files /dev/null and b/comblie/Assets.xcassets/Images/comblietitle.png differ diff --git a/comblie/Assets.xcassets/Images/facebookTransparentIcon.png b/comblie/Assets.xcassets/Images/facebookTransparentIcon.png new file mode 100644 index 0000000..6f6ec3c Binary files /dev/null and b/comblie/Assets.xcassets/Images/facebookTransparentIcon.png differ diff --git a/comblie/Assets.xcassets/Images/forwardArrow.png b/comblie/Assets.xcassets/Images/forwardArrow.png new file mode 100644 index 0000000..8f74595 Binary files /dev/null and b/comblie/Assets.xcassets/Images/forwardArrow.png differ diff --git a/comblie/Assets.xcassets/Images/gradientBackground.psd b/comblie/Assets.xcassets/Images/gradientBackground.psd new file mode 100644 index 0000000..44ede24 Binary files /dev/null and b/comblie/Assets.xcassets/Images/gradientBackground.psd differ diff --git a/comblie/Assets.xcassets/Images/gradientFeed.png b/comblie/Assets.xcassets/Images/gradientFeed.png new file mode 100644 index 0000000..7e90701 Binary files /dev/null and b/comblie/Assets.xcassets/Images/gradientFeed.png differ diff --git a/comblie/Assets.xcassets/Images/playArrow.png b/comblie/Assets.xcassets/Images/playArrow.png new file mode 100644 index 0000000..915aab9 Binary files /dev/null and b/comblie/Assets.xcassets/Images/playArrow.png differ diff --git a/comblie/Assets.xcassets/Images/settingsArrow.png b/comblie/Assets.xcassets/Images/settingsArrow.png new file mode 100644 index 0000000..6e35b88 Binary files /dev/null and b/comblie/Assets.xcassets/Images/settingsArrow.png differ diff --git a/comblie/Assets.xcassets/Images/sunset.png b/comblie/Assets.xcassets/Images/sunset.png new file mode 100644 index 0000000..2a0018c Binary files /dev/null and b/comblie/Assets.xcassets/Images/sunset.png differ diff --git a/comblie/Assets.xcassets/Images/sunsetShort.png b/comblie/Assets.xcassets/Images/sunsetShort.png new file mode 100644 index 0000000..2886df7 Binary files /dev/null and b/comblie/Assets.xcassets/Images/sunsetShort.png differ diff --git a/comblie/Assets.xcassets/Images/tumblrHeart.png b/comblie/Assets.xcassets/Images/tumblrHeart.png new file mode 100644 index 0000000..1035a7b Binary files /dev/null and b/comblie/Assets.xcassets/Images/tumblrHeart.png differ diff --git a/comblie/Assets.xcassets/Images/tumblrRepost.png b/comblie/Assets.xcassets/Images/tumblrRepost.png new file mode 100644 index 0000000..16c610d Binary files /dev/null and b/comblie/Assets.xcassets/Images/tumblrRepost.png differ diff --git a/comblie/Assets.xcassets/Images/twitterTransparentIcon.png b/comblie/Assets.xcassets/Images/twitterTransparentIcon.png new file mode 100644 index 0000000..06d4b97 Binary files /dev/null and b/comblie/Assets.xcassets/Images/twitterTransparentIcon.png differ diff --git a/comblie/Assets.xcassets/Images/vinebackground.png b/comblie/Assets.xcassets/Images/vinebackground.png new file mode 100644 index 0000000..f4f5811 Binary files /dev/null and b/comblie/Assets.xcassets/Images/vinebackground.png differ diff --git a/comblie/Assets.xcassets/Images/vinefeedimage.png b/comblie/Assets.xcassets/Images/vinefeedimage.png new file mode 100644 index 0000000..059f745 Binary files /dev/null and b/comblie/Assets.xcassets/Images/vinefeedimage.png differ diff --git a/comblie/Assets.xcassets/Images/webBackArrow.png b/comblie/Assets.xcassets/Images/webBackArrow.png new file mode 100644 index 0000000..a6586d9 Binary files /dev/null and b/comblie/Assets.xcassets/Images/webBackArrow.png differ diff --git a/comblie/Assets.xcassets/Images/webFrontArrow.png b/comblie/Assets.xcassets/Images/webFrontArrow.png new file mode 100644 index 0000000..b37090f Binary files /dev/null and b/comblie/Assets.xcassets/Images/webFrontArrow.png differ diff --git a/comblie/Assets.xcassets/Images/webRefresh.png b/comblie/Assets.xcassets/Images/webRefresh.png new file mode 100644 index 0000000..a8b4549 Binary files /dev/null and b/comblie/Assets.xcassets/Images/webRefresh.png differ diff --git a/comblie/Assets.xcassets/Images/webUpload.png b/comblie/Assets.xcassets/Images/webUpload.png new file mode 100644 index 0000000..17e3eae Binary files /dev/null and b/comblie/Assets.xcassets/Images/webUpload.png differ diff --git a/comblie/Assets.xcassets/Images/whiteBackground.imageset/Contents.json b/comblie/Assets.xcassets/Images/whiteBackground.imageset/Contents.json new file mode 100644 index 0000000..6c76ac6 --- /dev/null +++ b/comblie/Assets.xcassets/Images/whiteBackground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "whiteBackground.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Images/whiteBackground.imageset/whiteBackground.png b/comblie/Assets.xcassets/Images/whiteBackground.imageset/whiteBackground.png new file mode 100644 index 0000000..1cb11ff Binary files /dev/null and b/comblie/Assets.xcassets/Images/whiteBackground.imageset/whiteBackground.png differ diff --git a/comblie/Assets.xcassets/Images/whiteBackground.png b/comblie/Assets.xcassets/Images/whiteBackground.png new file mode 100644 index 0000000..1cb11ff Binary files /dev/null and b/comblie/Assets.xcassets/Images/whiteBackground.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/Contents.json b/comblie/Assets.xcassets/Tab bar Images/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/bottomBarItems.dataset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/bottomBarItems.dataset/Contents.json new file mode 100644 index 0000000..77e06f5 --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/bottomBarItems.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "data" : [ + { + "idiom" : "universal", + "filename" : "bottomBarItems.psd" + } + ] +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/bottomBarItems.dataset/bottomBarItems.psd b/comblie/Assets.xcassets/Tab bar Images/bottomBarItems.dataset/bottomBarItems.psd new file mode 100644 index 0000000..f883e42 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/bottomBarItems.dataset/bottomBarItems.psd differ diff --git a/comblie/Assets.xcassets/Tab bar Images/feedsdark.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/feedsdark.imageset/Contents.json new file mode 100644 index 0000000..3056987 --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/feedsdark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "feedsdark.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/feedsdark.imageset/feedsdark.png b/comblie/Assets.xcassets/Tab bar Images/feedsdark.imageset/feedsdark.png new file mode 100644 index 0000000..be332c2 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/feedsdark.imageset/feedsdark.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/feedslight.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/feedslight.imageset/Contents.json new file mode 100644 index 0000000..15036c8 --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/feedslight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "feedslight.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/feedslight.imageset/feedslight.png b/comblie/Assets.xcassets/Tab bar Images/feedslight.imageset/feedslight.png new file mode 100644 index 0000000..4e366d9 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/feedslight.imageset/feedslight.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/messagesdark.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/messagesdark.imageset/Contents.json new file mode 100644 index 0000000..ccc6f16 --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/messagesdark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "messagesdark.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/messagesdark.imageset/messagesdark.png b/comblie/Assets.xcassets/Tab bar Images/messagesdark.imageset/messagesdark.png new file mode 100644 index 0000000..3974735 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/messagesdark.imageset/messagesdark.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/messageslight.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/messageslight.imageset/Contents.json new file mode 100644 index 0000000..67e239a --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/messageslight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "messageslight.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/messageslight.imageset/messageslight.png b/comblie/Assets.xcassets/Tab bar Images/messageslight.imageset/messageslight.png new file mode 100644 index 0000000..69992d1 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/messageslight.imageset/messageslight.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/notificationsdark.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/notificationsdark.imageset/Contents.json new file mode 100644 index 0000000..45681ef --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/notificationsdark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "notificationsdark.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/notificationsdark.imageset/notificationsdark.png b/comblie/Assets.xcassets/Tab bar Images/notificationsdark.imageset/notificationsdark.png new file mode 100644 index 0000000..a0dc0d8 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/notificationsdark.imageset/notificationsdark.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/notificationslight.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/notificationslight.imageset/Contents.json new file mode 100644 index 0000000..fda37ee --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/notificationslight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "notificationslight.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/notificationslight.imageset/notificationslight.png b/comblie/Assets.xcassets/Tab bar Images/notificationslight.imageset/notificationslight.png new file mode 100644 index 0000000..6456e00 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/notificationslight.imageset/notificationslight.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/profiledark.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/profiledark.imageset/Contents.json new file mode 100644 index 0000000..c07df3e --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/profiledark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "profiledark.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/profiledark.imageset/profiledark.png b/comblie/Assets.xcassets/Tab bar Images/profiledark.imageset/profiledark.png new file mode 100644 index 0000000..f519b7c Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/profiledark.imageset/profiledark.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/profilelight.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/profilelight.imageset/Contents.json new file mode 100644 index 0000000..14b76e5 --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/profilelight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "profilelight.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/profilelight.imageset/profilelight.png b/comblie/Assets.xcassets/Tab bar Images/profilelight.imageset/profilelight.png new file mode 100644 index 0000000..8c97df1 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/profilelight.imageset/profilelight.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/settingsdark.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/settingsdark.imageset/Contents.json new file mode 100644 index 0000000..a938efb --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/settingsdark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "settingsdark.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/settingsdark.imageset/settingsdark.png b/comblie/Assets.xcassets/Tab bar Images/settingsdark.imageset/settingsdark.png new file mode 100644 index 0000000..c6a5005 Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/settingsdark.imageset/settingsdark.png differ diff --git a/comblie/Assets.xcassets/Tab bar Images/settingslight.imageset/Contents.json b/comblie/Assets.xcassets/Tab bar Images/settingslight.imageset/Contents.json new file mode 100644 index 0000000..5dd18e7 --- /dev/null +++ b/comblie/Assets.xcassets/Tab bar Images/settingslight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "settingslight.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Tab bar Images/settingslight.imageset/settingslight.png b/comblie/Assets.xcassets/Tab bar Images/settingslight.imageset/settingslight.png new file mode 100644 index 0000000..a1b6c9a Binary files /dev/null and b/comblie/Assets.xcassets/Tab bar Images/settingslight.imageset/settingslight.png differ diff --git a/comblie/Assets.xcassets/Vineprofile.imageset/Contents.json b/comblie/Assets.xcassets/Vineprofile.imageset/Contents.json new file mode 100644 index 0000000..c29b305 --- /dev/null +++ b/comblie/Assets.xcassets/Vineprofile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Vineprofile.jpg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/Vineprofile.imageset/Vineprofile.jpg b/comblie/Assets.xcassets/Vineprofile.imageset/Vineprofile.jpg new file mode 100644 index 0000000..6bc71f4 Binary files /dev/null and b/comblie/Assets.xcassets/Vineprofile.imageset/Vineprofile.jpg differ diff --git a/comblie/Assets.xcassets/angelina.imageset/Contents.json b/comblie/Assets.xcassets/angelina.imageset/Contents.json new file mode 100644 index 0000000..a24bd50 --- /dev/null +++ b/comblie/Assets.xcassets/angelina.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "angelina.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/angelina.imageset/angelina.png b/comblie/Assets.xcassets/angelina.imageset/angelina.png new file mode 100644 index 0000000..96ad9db Binary files /dev/null and b/comblie/Assets.xcassets/angelina.imageset/angelina.png differ diff --git a/comblie/Assets.xcassets/backArrow.imageset/Contents.json b/comblie/Assets.xcassets/backArrow.imageset/Contents.json new file mode 100644 index 0000000..a82436f --- /dev/null +++ b/comblie/Assets.xcassets/backArrow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "backArrow.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/backArrow.imageset/backArrow.png b/comblie/Assets.xcassets/backArrow.imageset/backArrow.png new file mode 100644 index 0000000..21f7984 Binary files /dev/null and b/comblie/Assets.xcassets/backArrow.imageset/backArrow.png differ diff --git a/comblie/Assets.xcassets/camera.imageset/Contents.json b/comblie/Assets.xcassets/camera.imageset/Contents.json new file mode 100644 index 0000000..686da81 --- /dev/null +++ b/comblie/Assets.xcassets/camera.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "camera.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/camera.imageset/camera.png b/comblie/Assets.xcassets/camera.imageset/camera.png new file mode 100644 index 0000000..4ca9989 Binary files /dev/null and b/comblie/Assets.xcassets/camera.imageset/camera.png differ diff --git a/comblie/Assets.xcassets/facebookTransparentIcon.imageset/Contents.json b/comblie/Assets.xcassets/facebookTransparentIcon.imageset/Contents.json new file mode 100644 index 0000000..f9b8c4b --- /dev/null +++ b/comblie/Assets.xcassets/facebookTransparentIcon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "facebookTransparentIcon.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/facebookTransparentIcon.imageset/facebookTransparentIcon.png b/comblie/Assets.xcassets/facebookTransparentIcon.imageset/facebookTransparentIcon.png new file mode 100644 index 0000000..6f6ec3c Binary files /dev/null and b/comblie/Assets.xcassets/facebookTransparentIcon.imageset/facebookTransparentIcon.png differ diff --git a/comblie/Assets.xcassets/facebookprofile.imageset/Contents.json b/comblie/Assets.xcassets/facebookprofile.imageset/Contents.json new file mode 100644 index 0000000..9abd29a --- /dev/null +++ b/comblie/Assets.xcassets/facebookprofile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "facebookprofile.jpg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/facebookprofile.imageset/facebookprofile.jpg b/comblie/Assets.xcassets/facebookprofile.imageset/facebookprofile.jpg new file mode 100644 index 0000000..6202aba Binary files /dev/null and b/comblie/Assets.xcassets/facebookprofile.imageset/facebookprofile.jpg differ diff --git a/comblie/Assets.xcassets/forwardArrow.imageset/Contents.json b/comblie/Assets.xcassets/forwardArrow.imageset/Contents.json new file mode 100644 index 0000000..331b0e9 --- /dev/null +++ b/comblie/Assets.xcassets/forwardArrow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "forwardArrow.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/forwardArrow.imageset/forwardArrow.png b/comblie/Assets.xcassets/forwardArrow.imageset/forwardArrow.png new file mode 100644 index 0000000..8f74595 Binary files /dev/null and b/comblie/Assets.xcassets/forwardArrow.imageset/forwardArrow.png differ diff --git a/comblie/Assets.xcassets/gradientFeed.imageset/Contents.json b/comblie/Assets.xcassets/gradientFeed.imageset/Contents.json new file mode 100644 index 0000000..8c4df9e --- /dev/null +++ b/comblie/Assets.xcassets/gradientFeed.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "gradientFeed.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/gradientFeed.imageset/gradientFeed.png b/comblie/Assets.xcassets/gradientFeed.imageset/gradientFeed.png new file mode 100644 index 0000000..7e90701 Binary files /dev/null and b/comblie/Assets.xcassets/gradientFeed.imageset/gradientFeed.png differ diff --git a/comblie/Assets.xcassets/instagramprofilepsd.imageset/Contents.json b/comblie/Assets.xcassets/instagramprofilepsd.imageset/Contents.json new file mode 100644 index 0000000..fd74f6f --- /dev/null +++ b/comblie/Assets.xcassets/instagramprofilepsd.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "instagramprofilepsd.jpg", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/instagramprofilepsd.imageset/instagramprofilepsd.jpg b/comblie/Assets.xcassets/instagramprofilepsd.imageset/instagramprofilepsd.jpg new file mode 100644 index 0000000..26b6b54 Binary files /dev/null and b/comblie/Assets.xcassets/instagramprofilepsd.imageset/instagramprofilepsd.jpg differ diff --git a/comblie/Assets.xcassets/playArrow.imageset/Contents.json b/comblie/Assets.xcassets/playArrow.imageset/Contents.json new file mode 100644 index 0000000..3cc76f9 --- /dev/null +++ b/comblie/Assets.xcassets/playArrow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "playArrow.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/playArrow.imageset/playArrow.png b/comblie/Assets.xcassets/playArrow.imageset/playArrow.png new file mode 100644 index 0000000..915aab9 Binary files /dev/null and b/comblie/Assets.xcassets/playArrow.imageset/playArrow.png differ diff --git a/comblie/Assets.xcassets/profileImage.imageset/Contents.json b/comblie/Assets.xcassets/profileImage.imageset/Contents.json new file mode 100644 index 0000000..34ce004 --- /dev/null +++ b/comblie/Assets.xcassets/profileImage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "profileImage.jpg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/profileImage.imageset/profileImage.jpg b/comblie/Assets.xcassets/profileImage.imageset/profileImage.jpg new file mode 100644 index 0000000..1c0bd1b Binary files /dev/null and b/comblie/Assets.xcassets/profileImage.imageset/profileImage.jpg differ diff --git a/comblie/Assets.xcassets/settingsArrow.imageset/Contents.json b/comblie/Assets.xcassets/settingsArrow.imageset/Contents.json new file mode 100644 index 0000000..888b93f --- /dev/null +++ b/comblie/Assets.xcassets/settingsArrow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "settingsArrow.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/settingsArrow.imageset/settingsArrow.png b/comblie/Assets.xcassets/settingsArrow.imageset/settingsArrow.png new file mode 100644 index 0000000..6e35b88 Binary files /dev/null and b/comblie/Assets.xcassets/settingsArrow.imageset/settingsArrow.png differ diff --git a/comblie/Assets.xcassets/sunset.imageset/Contents.json b/comblie/Assets.xcassets/sunset.imageset/Contents.json new file mode 100644 index 0000000..c212461 --- /dev/null +++ b/comblie/Assets.xcassets/sunset.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sunset.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/sunset.imageset/sunset.png b/comblie/Assets.xcassets/sunset.imageset/sunset.png new file mode 100644 index 0000000..2a0018c Binary files /dev/null and b/comblie/Assets.xcassets/sunset.imageset/sunset.png differ diff --git a/comblie/Assets.xcassets/sunsetShort.imageset/Contents.json b/comblie/Assets.xcassets/sunsetShort.imageset/Contents.json new file mode 100644 index 0000000..67a7531 --- /dev/null +++ b/comblie/Assets.xcassets/sunsetShort.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sunsetShort.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/sunsetShort.imageset/sunsetShort.png b/comblie/Assets.xcassets/sunsetShort.imageset/sunsetShort.png new file mode 100644 index 0000000..2886df7 Binary files /dev/null and b/comblie/Assets.xcassets/sunsetShort.imageset/sunsetShort.png differ diff --git a/comblie/Assets.xcassets/tumblrHeart.imageset/Contents.json b/comblie/Assets.xcassets/tumblrHeart.imageset/Contents.json new file mode 100644 index 0000000..9c08217 --- /dev/null +++ b/comblie/Assets.xcassets/tumblrHeart.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tumblrHeart.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/tumblrHeart.imageset/tumblrHeart.png b/comblie/Assets.xcassets/tumblrHeart.imageset/tumblrHeart.png new file mode 100644 index 0000000..1035a7b Binary files /dev/null and b/comblie/Assets.xcassets/tumblrHeart.imageset/tumblrHeart.png differ diff --git a/comblie/Assets.xcassets/tumblrRepost.imageset/Contents.json b/comblie/Assets.xcassets/tumblrRepost.imageset/Contents.json new file mode 100644 index 0000000..4eb8d18 --- /dev/null +++ b/comblie/Assets.xcassets/tumblrRepost.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tumblrRepost.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/tumblrRepost.imageset/tumblrRepost.png b/comblie/Assets.xcassets/tumblrRepost.imageset/tumblrRepost.png new file mode 100644 index 0000000..16c610d Binary files /dev/null and b/comblie/Assets.xcassets/tumblrRepost.imageset/tumblrRepost.png differ diff --git a/comblie/Assets.xcassets/tumblrprofile.imageset/Contents.json b/comblie/Assets.xcassets/tumblrprofile.imageset/Contents.json new file mode 100644 index 0000000..fdb1790 --- /dev/null +++ b/comblie/Assets.xcassets/tumblrprofile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tumblrprofile.jpg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/tumblrprofile.imageset/tumblrprofile.jpg b/comblie/Assets.xcassets/tumblrprofile.imageset/tumblrprofile.jpg new file mode 100644 index 0000000..1f3ee6f Binary files /dev/null and b/comblie/Assets.xcassets/tumblrprofile.imageset/tumblrprofile.jpg differ diff --git a/comblie/Assets.xcassets/twitterTransparentIcon.imageset/Contents.json b/comblie/Assets.xcassets/twitterTransparentIcon.imageset/Contents.json new file mode 100644 index 0000000..97c0486 --- /dev/null +++ b/comblie/Assets.xcassets/twitterTransparentIcon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "twitterTransparentIcon.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/twitterTransparentIcon.imageset/twitterTransparentIcon.png b/comblie/Assets.xcassets/twitterTransparentIcon.imageset/twitterTransparentIcon.png new file mode 100644 index 0000000..06d4b97 Binary files /dev/null and b/comblie/Assets.xcassets/twitterTransparentIcon.imageset/twitterTransparentIcon.png differ diff --git a/comblie/Assets.xcassets/userspersonal-twitterprofile.imageset/Contents.json b/comblie/Assets.xcassets/userspersonal-twitterprofile.imageset/Contents.json new file mode 100644 index 0000000..5627658 --- /dev/null +++ b/comblie/Assets.xcassets/userspersonal-twitterprofile.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "userspersonal-twitterprofile.jpg", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/userspersonal-twitterprofile.imageset/userspersonal-twitterprofile.jpg b/comblie/Assets.xcassets/userspersonal-twitterprofile.imageset/userspersonal-twitterprofile.jpg new file mode 100644 index 0000000..1b89f32 Binary files /dev/null and b/comblie/Assets.xcassets/userspersonal-twitterprofile.imageset/userspersonal-twitterprofile.jpg differ diff --git a/comblie/Assets.xcassets/vinebackground.imageset/Contents.json b/comblie/Assets.xcassets/vinebackground.imageset/Contents.json new file mode 100644 index 0000000..5b3029a --- /dev/null +++ b/comblie/Assets.xcassets/vinebackground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "vinebackground.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/vinebackground.imageset/vinebackground.png b/comblie/Assets.xcassets/vinebackground.imageset/vinebackground.png new file mode 100644 index 0000000..f4f5811 Binary files /dev/null and b/comblie/Assets.xcassets/vinebackground.imageset/vinebackground.png differ diff --git a/comblie/Assets.xcassets/vinefeedimage.imageset/Contents.json b/comblie/Assets.xcassets/vinefeedimage.imageset/Contents.json new file mode 100644 index 0000000..4f9befc --- /dev/null +++ b/comblie/Assets.xcassets/vinefeedimage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "vinefeedimage.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/vinefeedimage.imageset/vinefeedimage.png b/comblie/Assets.xcassets/vinefeedimage.imageset/vinefeedimage.png new file mode 100644 index 0000000..059f745 Binary files /dev/null and b/comblie/Assets.xcassets/vinefeedimage.imageset/vinefeedimage.png differ diff --git a/comblie/Assets.xcassets/webBackArrow.imageset/Contents.json b/comblie/Assets.xcassets/webBackArrow.imageset/Contents.json new file mode 100644 index 0000000..6d20ee0 --- /dev/null +++ b/comblie/Assets.xcassets/webBackArrow.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "webBackArrow.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/webBackArrow.imageset/webBackArrow.png b/comblie/Assets.xcassets/webBackArrow.imageset/webBackArrow.png new file mode 100644 index 0000000..a6586d9 Binary files /dev/null and b/comblie/Assets.xcassets/webBackArrow.imageset/webBackArrow.png differ diff --git a/comblie/Assets.xcassets/webFrontArrow.imageset/Contents.json b/comblie/Assets.xcassets/webFrontArrow.imageset/Contents.json new file mode 100644 index 0000000..db3b35e --- /dev/null +++ b/comblie/Assets.xcassets/webFrontArrow.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "webFrontArrow.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/webFrontArrow.imageset/webFrontArrow.png b/comblie/Assets.xcassets/webFrontArrow.imageset/webFrontArrow.png new file mode 100644 index 0000000..b37090f Binary files /dev/null and b/comblie/Assets.xcassets/webFrontArrow.imageset/webFrontArrow.png differ diff --git a/comblie/Assets.xcassets/webRefresh.imageset/Contents.json b/comblie/Assets.xcassets/webRefresh.imageset/Contents.json new file mode 100644 index 0000000..009b69d --- /dev/null +++ b/comblie/Assets.xcassets/webRefresh.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "webRefresh.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/webRefresh.imageset/webRefresh.png b/comblie/Assets.xcassets/webRefresh.imageset/webRefresh.png new file mode 100644 index 0000000..a8b4549 Binary files /dev/null and b/comblie/Assets.xcassets/webRefresh.imageset/webRefresh.png differ diff --git a/comblie/Assets.xcassets/webUpload.imageset/Contents.json b/comblie/Assets.xcassets/webUpload.imageset/Contents.json new file mode 100644 index 0000000..50328f5 --- /dev/null +++ b/comblie/Assets.xcassets/webUpload.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "webUpload.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/comblie/Assets.xcassets/webUpload.imageset/webUpload.png b/comblie/Assets.xcassets/webUpload.imageset/webUpload.png new file mode 100644 index 0000000..17e3eae Binary files /dev/null and b/comblie/Assets.xcassets/webUpload.imageset/webUpload.png differ diff --git a/comblie/Base.lproj/LaunchScreen.storyboard b/comblie/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..5a9c4a6 --- /dev/null +++ b/comblie/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/comblie/Base.lproj/Main.storyboard b/comblie/Base.lproj/Main.storyboard new file mode 100644 index 0000000..6e76cab --- /dev/null +++ b/comblie/Base.lproj/Main.storyboard @@ -0,0 +1,7246 @@ + + + + + + + + + + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + HelveticaNeue-Roman + + + HelveticaNeueLTStd-Md + HelveticaNeueLTStd-Md + + + HelveticaNeueLTStd-Roman + HelveticaNeueLTStd-Roman + HelveticaNeueLTStd-Roman + HelveticaNeueLTStd-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Last updated: September 11, 2015 + +These Terms of Use (“Agreement”) sets forth a legally binding agreement between you and Comblie, Inc. (“Company”).  This web site or application, including any software (including, without limitation, software, code, files, images, contained in or generated by the software, accompanying data, Boot ROM code and other embedded software), documentation and any accompanying fonts (collectively, the “Platform”) is provided pursuant to this Agreement. By accessing this Platform in any way, including, without limitation, browsing this Platform, using any information, and/or submitting information to Company, you agree to and are bound by the terms, conditions, policies and notices contained in this Agreement), including, but not limited to, conducting this transaction electronically, disclaimers of warranties, damage and remedy exclusions and limitations, and a choice of [STATE] law. Please read this Agreement carefully before using this Platform.  + +From time to time we may update this Platform and this Agreement.  Your use of this Platform after we post any changes to this Agreement constitutes your agreement to those changes.  You agree to review this Agreement periodically to ensure that you are familiar with the most recent version.  Company may, in its sole discretion, and at any time, discontinue this Platform or any part thereof, with or without notice, or may prevent your use of this Platform with or without notice to you.  You agree that you do not have any rights in this Platform and Company will have no liability to you if this Platform is discontinued or your ability to access the Platform is terminated. You further agree that Company will not be liable for any modification or suspension of the Platform. + +Please read this Agreement carefully before using the Platform.  If you do not agree to the terms contained in this Agreement, then you may not use the Platform. Your use of the Platform constitutes your acknowledgement that you have the legal authority to bind yourself or any party you represent to, and your acceptance of, this Agreement.  You acknowledge that you have read and agree to be bound by this Agreement and to comply with all applicable laws, regulations and/or rules with regard to your use of the Platform.  You represent that you have the legal authority to bind yourself or any party you represent to this Agreement. + +YOU MAY NOT USE THE PLATFORM FOR ANY PURPOSE THAT IS UNLAWFUL OR PROHIBITED BY THIS AGREEMENT.  YOUR ACCESS TO THE PLATFORM MAY BE TERMINATED IMMEDIATELY IN COMPANY’S SOLE DISCRETION, WITH OR WITHOUT NOTICE, IF YOU FAIL TO COMPLY WITH ANY PROVISIONS OF THIS AGREEMENT AND/OR ADDITIONAL TERMS, OR FOR ANY OTHER REASON, OR NO REASON. + +On certain areas of this Platform, you may be given the ability to provide us with personally identifiable information. Please read our Privacy Policy for more information about our information collection and use practices. +  + + + + + + + + + + + + + + + + + + +The Platform is licensed to you by Company subject to the terms of this Agreement. Neither title nor any intellectual property rights are transferred to you, but rather remain with Company or its licensors, who own full and complete title, and Company and respective licensors reserve all rights not expressly granted to you. The rights granted herein are non-transferable, and are limited to Company’s intellectual property rights in the Platform and do not include any other patents or intellectual property rights.  This Agreement does not grant you any rights to use Company proprietary interfaces and other intellectual property in the design, development, manufacture, licensing or distribution of third-party devices and accessories for use with the Platform.  Any use of the Platform in any manner not allowed under this Agreement is prohibited.  This Agreement does not entitle you to receive and does not obligate Company to provide hard-copy documentation, support, telephone assistance, or enhancements or updates to the Platform.  You may not modify, alter, copy, publicly display or perform, distribute, create derivative works, of the Platform. + +Your rights under this Agreement will terminate automatically without notice from Company if you fail to comply with any term(s) of this Agreement. Upon the termination of this Agreement, you shall cease all use of the Platform and delete all copies of the Platform from your mobile device and account. +  + + + + + + + + + + + + + + + + + + +Company provides this Platform to you, subject to this Agreement.  This Platform, and any services performed, provided or enabled by or through this Platform and all the information, communications, scripting, photos, text, video, graphics, music, sounds, images, trademarks, logos, product and program names, and other materials and complications of the foregoing, that may be provided to you via this Platform (collectively “Content”) by Company or its content providers, are the property of Company and its content providers, and is protected in the U.S. and internationally under trademark, copyright, and other intellectual property laws, and are intended for the lawful use by registered users (as applicable) of this Platform.  You represent and warrant that you will use the Platform and Content only for the purposes permitted herein, that all information you submit is accurate and otherwise complies with this Agreement, and that you will promptly notify Company if any of your information changes.  Company makes no representation that the Platform or Content are appropriate or available for use in particular locations. +You agree not to download, display or use any Content in any other manner that is likely to cause confusion among consumers, that disparages or discredits Company and/or its licensors, that dilutes the strength of Company or its licensors’ property, or that otherwise infringes Company or its licensors’ intellectual property rights.  + + + + + + + + + + + + + + + + + + + +Certain areas of the Platform may require registration or may otherwise ask you to provide information to participate in certain features or access certain content. If you elect not to provide such information, you may not be able to access certain content or participate in certain features of the Platform. + +Where the Platform requires you to open an account or otherwise submit information, you must complete the specified process by providing us with current, complete, and accurate information as requested by the applicable registration form. It is your responsibility to maintain the currency, completeness, and accuracy of your registration data,  including, without limitation, your name, address, mobile telephone number, business details (if relevant), email address and method of payment details. After you have fully completed the registration form, you may be asked to choose a password and a user name. It is entirely your responsibility to maintain the confidentiality of your password and account. Additionally, you are entirely responsible for any and all activities that occur under your account. You agree to notify Company immediately of any unauthorized use of your account. You further agree not to email, post, or otherwise disseminate any user ID, password, PIN, or other information which provides you access to the Platform.  Company is not liable for any loss that you may incur as a result of someone else using your password or account, either with or without your knowledge. + +You agree that Company may collect and use technical and usage data and related information in compliance with our Privacy Policy. You grant Company the permission to use this information to improve its products or to provide services or technologies to you. + + + + + + + + + + + + + + + + + + + +The following requirements apply to your use of the Platform: + +• You will not use any electronic communication feature of the Platform for any purpose that is unlawful, tortious, abusive, intrusive on another’s privacy, harassing, libelous, defamatory, embarrassing, obscene, threatening, or hateful. + +• You will not use the Platform for any commercial purpose not expressly approved by Company in writing. + +• You will not upload or otherwise transmit any material that contains viruses or any other computer code, files, or programs which might interrupt, limit, or interfere with the functionality of any computer software or hardware or telecommunications equipment. + +• You will not rent, lease, lend, sell, sublicense, assign, distribute, publish, transfer or otherwise make available the Platform or any features or functionality of the Platform, to any third party for any reason, including by making the Platform available on a network where it is capable of being accessed by more than one device at any time. + +• You will not make the Platform available over a network where it could be used on multiple devices at the same time. + +• You will not remove, delete, alter or obscure any trademarks or any copyright, trademark, patent or other intellectual property or proprietary rights notices from the Platform, including any copy thereof. + +• You will not collect or store personal data about other users + +• Except as and only to the extent permitted by applicable law, you may not copy, decompile, reverse engineer, disassemble, attempt to derive the source code of, modify, or create derivative works of the Platform or any part thereof.  Any attempt to do so is a violation of the rights of Company and its licensors of the Platform. If you breach this restriction, you may be subject to prosecution and damages. By storing content on your device, you are making a digital copy. In some jurisdictions, it is unlawful to make digital copies without prior permission from the rights holder. +  + + + + + + + + + + + + + + + + +  + + + + + + + + There are a number of trademarks, logos, service marks, slogans, product names and designations and other proprietary indicia (collectively “Trademarks”) used in the Platform and in the Content.  By making these Trademarks available through the Platform and in the Content, Company is not granting you a license to use them in any fashion, and you are not granted any license under any of Company’s or any third party's Trademarks or other intellectual property rights, except as specifically set forth in this Agreement.  No Company Trademarks may be used as a username, icon, identifier, hyperlink or in any other manner without Company’s prior written permission. + + + + + + + + + +The Platform, Content, and the selection, coordination, and arrangement thereof, is owned either by Company, or its respective licensors.  The unauthorized copying, displaying, selling, distributing or other use of any Content or Platform is a violation of the law. You acknowledge having been advised by Company that the Content and Platform is protected in the U.S. and internationally by a variety of laws, including but not limited to, copyright laws and treaty provisions, trademark laws, patent laws and other intellectual property and proprietary rights laws. +  + + + + + + + + + + + + + + + + + + +Company and its parents, subsidiaries, officers, employees, and contractors and each of their officers, employees and agents (collectively, “Company Affiliates”) make no representation or warranty whatsoever regarding the completeness, accuracy, timeliness or adequacy of any information, facts, views, opinions, statements or recommendations contained on the Platform.  Reference to any product, process, publication or service of any third party by trade name, domain name, trademark, service mark, logo, manufacturer or otherwise does not constitute or imply its endorsement or recommendation by Company or the Company Affiliates. + +The Internet may be subject to breaches of security. Company and the Company Affiliates are not responsible for any resulting damage to any user’s device or computer from any such security breach, or from any virus, bugs, tampering, unauthorized intervention, fraud, error, omission, interruption, deletion, defect, delay in operation or transmission, computer line failure or any other technical or other malfunction. You should also be aware that e-mail and other submissions over the Internet may not be secure, and you should consider this before e-mailing Company or the Company Affiliates any information or posting information to the Platform. Company and the Company Affiliates make no representation or warranty whatsoever regarding the suitability, functionality, performance, availability or operation of the Platform. This Platform may be temporarily unavailable due to maintenance or malfunction of computer equipment. + +THE PLATFORM (INCLUDING ALL APPLICATION PLATFORM UPDATES) AND THE CONTENT ARE MADE AVAILABLE ON AN “AS IS,” “AS AVAILABLE” AND “WITH ALL FAULTS” BASIS. COMPANY AND THE COMPANY AFFILIATES SPECIFICALLY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES OF MERCHANTABILITY, QUALITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT, WITH RESPECT TO THE PLATFORM AND THE CONTENT.  COMPANY DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN OR SERVICES PERFORMED, PROVIDED OR ENABLED BY OR THROUGH THE PLATFORM (INCLUDING ANY APPLICATION PLATFORM UPDATES) WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE PLATFORM, (INCLUDING ANY APPLICATION PLATFORM UPDATES) WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE PLATFORM (INCLUDING ANY APPLICATION PLATFORM UPDATES) WILL BE CORRECTED.  No oral or written information or advice given by Company or an authorized representative shall be deemed to alter this disclaimer of warranty, or to create any warranty. Should the Platform prove defective, you assume the entire cost of all necessary servicing, repair or correction. + +YOU AGREE THAT COMPANY AND THE COMPANY AFFILIATES ARE NOT LIABLE TO YOU FOR DAMAGES OF ANY KIND, WHETHER BASED IN TORT, CONTRACT, STRICT LIABILITY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL OR PUNITIVE DAMAGES ARISING OUT OF OR RELATED TO YOUR USE OF THE PLATFORM., EVEN IF COMPANY OR THE COMPANY AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OR EXCLUSION OF CERTAIN WARRANTIES AND CONDITIONS, OR THE DISCLAIMER OF SOME TYPES OF DAMAGES, SO SOME OF THE ABOVE MAY NOT APPLY TO YOU. + +BY ACCESSING THIS PLATFORM, REGISTERING WITH THE PLATFORM AND/OR ACCEPTING ANY INFORMATION FROM THIS PLATFORM YOU AGREE TO INDEMNIFY, DEFEND AND HOLD COMPANY AND THE COMPANY AFFILIATES HARMLESS FROM AND AGAINST ANY ACTUAL OR ALLEGED CLAIMS, DEMANDS, CAUSES OF ACTION, JUDGMENTS, DAMAGES, LOSSES, LIABILITIES, AND ALL COSTS AND EXPENSES OF DEFENSE (INCLUDING REASONABLE ATTORNEYS’ FEES AND COURT COSTS) ARISING OUT OF OR RELATING TO: (A) YOUR BREACH OF THIS AGREEMENT; (B) YOUR VIOLATION OF ANY LOCAL, STATE, FEDERAL OR INTERNATIONAL LAW, RULE OR REGULATION; (C) ANY MISREPRESENTATION MADE BY YOU; (D) THE THEFT, MISAPPROPRIATION OR DISCLOSURE OF YOUR USERNAME/PASSWORD/PIN; (E) YOUR AUTHORIZATION OF ANYONE ELSE TO USE YOUR PASSWORD. YOU WILL COOPERATE AS FULLY AND AS REASONABLY REQUIRED IN COMPANY’S DEFENSE OF ANY CLAIM. COMPANY RESERVES THE RIGHT, AT ITS OWN EXPENSE, TO ASSUME THE EXCLUSIVE DEFENSE AND CONTROL OF ANY MATTER OTHERWISE SUBJECT TO INDEMNIFICATION BY YOU, AND YOU SHALL NOT, IN ANY EVENT, SETTLE ANY MATTER WITHOUT THE WRITTEN CONSENT OF COMPANY. + + + + + + + + + + + + + + + + + + + +The use of the Platform may require use of a mobile device and phone service, wireless mobile data service, and text messaging capability, which must be obtained from your wireless carrier, and may require Internet access, which must be obtained from your service provider; you are responsible for obtaining and paying for such additional services and obtaining a suitable device, including without limitation all usage charges related thereto.  You may be required to send and receive, at your cost, electronic communications related to the Platform, including without limitation, administrative messages, service announcements, and diagnostic data reports, from Company, your mobile carrier or third party service providers. + +If you agree to receive text messages from the Platform, the frequency of messages will vary based on your user activity. Certain texts are required to use the Platform, including verification texts. Message and data rates may apply from your mobile carrier. By providing your consent to participate in this program, you approve any such charges from your mobile carrier. If you do not have an unlimited wireless mobile data plan or text messaging capability, you may incur additional charges from your wireless service in connection with your use of the Platform.  You are solely responsible for obtaining any additional subscription or connectivity services or equipment necessary to access the Platform, including but not limited to payment of all third party fees associated therewith, including fees for information sent to or through the Platform. +The Platform may not work with all devices or all mobile carriers.  Company makes no representations that the Platform will be compatible with or provided by all mobile carriers.  In the event that fees are charged for the Platform, or other third party service providers charge a fee for the products or services they provide, you agree to pay such fee to the respective party in exchange for your continued use of such products or services.  Some services may be subject to different or additional terms (including fees), which you will be required to agree to prior to your use of such services.  + + + + + + + + + + + + + + + + + + + +If you download and use the iOS Platform: + +You, the end-user of the Platform, acknowledge that the Agreement is entered into by and between Company and you and not with Apple, Inc.  Notwithstanding the foregoing, you acknowledge that Apple, Inc. and its subsidiaries are third-party beneficiaries of this Agreement and that Apple, Inc. has the right (and is deemed to have accepted the right) to enforce this Agreement.  You acknowledge that Apple, Inc. has no obligation whatsoever to furnish any maintenance and support services with respect to the Platform.  You acknowledge that you have reviewed the App Store Terms and Conditions (located online at http://www.apple.com/legal/itunes/us/terms.html#APPS).  This Agreement incorporates by reference the Licensed Application End User License Agreement (the “LAEULA”) published by Apple, Inc. (located online at http://www.apple.com/legal/itunes/appstore/dev/stdeula/).  For purposes of this Agreement, the Platform is considered the “Licensed Application” as defined in the LAEULA and Company is considered the “Application Provider” as defined in the LAEULA.  If any terms of this Agreement conflict with the terms of the LAEULA, the terms of this Agreement shall control. You further acknowledge and agree that in no event will Apple, Inc. be responsible for any claims relating to the Platform (including, without limitation, a third party claim that the Platform infringes that third party’s intellectual property rights) or your use or possession of the Platform, including but not limited to: (i) product liability claims; (ii) any claim that the Platform fails to conform to any applicable legal or regulatory requirement; and (iii) claims arising under consumer protection or similar legislation. + +Links to Third-Party Websites, Applications, and Services +The Platform may provide connectivity or links to other third-party services, websites, applications, software, and other content from third-party providers such as social media partners, wireless carriers, and third-party software application developers (“Third-Party Services”).  The Platform may allow you to add/configure certain Third-Party Services to your device.  Company has no control over, makes no representations or warranties whatsoever about any of the Third-Party Services that you may access, is not responsible for the availability of such Third-Party Services, and does not endorse nor is responsible or liable for any content or other materials on or available from such Third-Party Services.  Your use of the Third-Party Services may be subject to additional terms, including software license terms, of those third parties. + +Users who utilize the Third-Party Services should be aware that account and other personal information held by those third parties may be transmitted through and stored on Company servers and/or applications located in the United States and elsewhere.  You understand and agree that the companies that provide the Third-Party Services may access, use and share certain information about you, if you use the Third-Party Services.  You understand and agree Company is not responsible for these companies, or their use of any other of your information.  Your use of the Third-Party Services is at your own risk. +  + + + + + + + + + + + + + + + + +Company may assign this Agreement in whole or in part, at any time with or without notice to you. You may not assign this contract, or any part of it, to any other person. Any attempt by you to do so is void. You may not transfer to anyone else, either temporarily or permanently, any rights to + + + + + + + use all or any part of the Platform.  To the extent that you allow a third party to use your device, you shall remain solely responsible for the use of the Platform by others using the device. + + + + + + + + +   + + + + + + + + + + + + + + + + + +You may also be subject to additional terms and conditions (including, but not limited to, terms and conditions from your wireless carrier or operator) that may apply to your use of the Platform.  If any provision of this Agreement is held to be invalid by any law, rule, order or regulation of any government or by the final determination of any state or federal court, such invalidity shall not affect the enforceability of any other provision of this Agreement. The failure of Company to exercise or enforce any right or provision of this Agreement shall not constitute a waiver of such right or provision. + +By using the Platform, you agree that the statutes and laws of the United States and the State of North Carolina without regard to conflicts of laws principles, will apply to all matters relating to use of the Platform and the Services, and you agree that any litigation shall be subject to the exclusive jurisdiction of the state or federal courts in Wake County, North Carolina, USA.  The United Nations Convention on Contracts for the International Sale of Goods (1980) is hereby excluded in its entirety from application to this Agreement.  You agree that regardless of any statute or law to the contrary, any claim or cause of action arising out of or related to use of the Platform or this Agreement must be filed within one (1) year after such claim or cause of action arose or be forever barred. You further agree that any disputes, claims and causes of action arising out of or connected with the Platform and/or this Agreement, will be resolved individually, without resort to any form of class action. The section titles in this Agreement are for convenience only and have no legal or contractual effect. +In the event of a complaint or concern regarding this Agreement or the Platform, or for more information, please contact Comblie at support@comblie.com. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +DQ + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + This privacy policy is here to help you understand what information we collect at Comblie, how we use it, and what choices you have. When we talk about Comblie in this policy, we are talking about Comblie Technologies, Inc., the company, Comblie, the downloadable application, and the Comblie website at + + + + + + + + + + + + + + + + + . Comblie is available for use via a web browser or applications specific to your desktop or mobile device. By using or otherwise accessing the Application, you acknowledge that you accept the practices and policies outlined in this privacy policy.  + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + We collect different kinds of information. Some of it is personally identifiable and some is non-identifying or aggregated. We collect the following types of information from our users:  + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + + - We may receive and store any information you submit to the Application (or otherwise authorize us to obtain – such as, from (for example) your Facebook, Twitter, Instagram or other social media accounts). The types of personal information collected may include your full name, email address, gender, IP address, browser information, username, demographic information, and any other information necessary for us to provide the application services.  + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + + - We receive and store certain types of usage related information whenever you interact with Application. For example, Comblie may automatically receive and record information regarding your computer’s IP address, browser information, Facebook user ID, Facebook Page fan status, and URLs accessed. Such information may be shared in aggregate (non-personally identifiable) form with our partners.  + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + + - We collect billing address and credit card information if you purchase a premium version of Comblie or pay to have advertisements removed from your application. Credit card information is securely passed to our payment processing partner and is not stored by Comblie. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + + - In addition to log data, we may also collect information about the device you’re using Comblie on, including what type of device it is, what operating system you’re using, device settings, unique device identifiers, and crash data. Whether we collect some or all of this information often depends on what type of device you’re using and its settings. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + - Precise GPS from mobile devices is collected only with your permission. WiFi and IP addresses received from your browser or device may be used to determine approximate location. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + + -  This is information about which teams, channels, groups, people, features, content, and links you interact with within Comblie and what integrations with related services you use. +Service integrations. If you integrate with a service on Comblie we will connect that service to ours. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + Depending on team settings, team members may be able to add integrations to a channel, private group, or direct message conversation. Those integrations are viewable and editable by the administrator. +o + + + + + + + + + + + + + + + + We do not receive or store your passwords for any of these services. +o + + + + + + + + + + + + + + + + You can remove an integration at any time which unbinds that integration on a go-forward basis. That does not, however, delete the content that was received from them and indexed within Comblie. That content must be deleted manually. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + + - Comblie may receive information from partners or others that we could use to make our own information better or more useful. This might be aggregate level information about which IP addresses go with which zip codes or it might be more specific information about how well an online marketing or email campaign performed. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + Comblie uses cookies, or similar technologies like single-pixel gifs and web beacons, to record log data. We use both session-based and persistent cookies. +Cookies are small text files sent by us to your computer and from your computer to us, each time you visit our website. They are unique to your Comblie account or your browser. Session-based cookies last only while your browser is open and are automatically deleted when you close your browser. Persistent cookies last until you or your browser delete them or until they expire. + + + + + + + + + +DQ0 + + + + + + + + + + Some cookies are associated with your Comblie account and personal information in order to remember that you are logged in and which teams you are logged into. Other cookies are not tied to your Comblie account but are unique and allow us to do site analytics and customization, among other things. If you access Comblie through your browser, you can manage your cookie settings there but if you disable all cookies you may not be able to use Comblie. + + + + + + + + + +DQ0 + + + + + + + + + + Comblie sets and accesses our own cookies on our company-owned domains. In addition, we use 3rd parties like Google Analytics and Mixpanel for website analytics. You may opt-out of third party cookies from Google Analytics and Mixpanel on their respective websites. We do not currently recognize or respond to browser-initiated Do Not Track signals as there is no consistent industry standard for compliance. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + We use your information for the following: + +• + + + + + + + + + + + + + + + + Providing the Comblie service. We use information you provide to authenticate you and deliver message content to you and from you + +• + + + + + + + + + + + + + + + + Understanding and improving our products. To make the product better we have to understand how users are using it. We have a fair bit of data about usage and we intend to use it many different ways to improve our products, including research. This policy is not intended to place any limits on what we do with usage data that is aggregated or de-identified so it is no longer tied to a Comblie user. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + + Investigating and preventing bad stuff from happening. We work hard to keep Comblie secure and to prevent abuse and fraud. + +• + + + + + + + + + + + + + + + + Communicating with you + +o + + + + + + + + + + + + + + + Solving your problems and responding to your requests. If you contact us with a problem or question, we will use your information to respond to that request and address your problems or concerns. + + + + + + + + + + +DQ + + + + + + + + + + + + + + + + + + + + + + + + In-product communications. We may use the information you provide to contact you through Comblie or other in-product messaging tools. For example, if, after, a few weeks of using Comblie we notice that your notification setting is set to notify you of all messages, we may send you a message that suggests you change this in case you are getting too many notifications. This is just one example of how we use information about your usage of the product to make suggestions to you. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + Email messages. We may send you service and administrative emails, such as when we notice that you are nearing a message or integration limit. We may also contact you to inform you about changes in our services, or our service offerings. These messages are considered part of the service and you may not opt-out of them. In addition, we sometimes send emails to Comblie users about new product features or other news about Comblie. You can opt-out of these at any time. + + + + + + + + + +DQkNDQ + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + There are times when communications and related content and other user information may be shared by Comblie. This section discusses only how Comblie may share user information. Organizations that use Comblie may have their own policies for sharing and disclosure of information they can access through Comblie. Comblie may share information: + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + With consent, to comply with legal process, or to protect Comblie and our users. When we have your consent or if we believe that disclosure is reasonably necessary to comply with a law, regulation or legal request; to protect the safety, rights, or property of the public, any person, or Comblie; or to detect, prevent, or otherwise address fraud, security or technical issues. If we receive a law enforcement or other third party request for information we will provide prior notice to the subject of the request where we are legally permitted to do so. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + With third parties and agents. We may employ third party companies or individuals to process personal information on our behalf based on our instructions and in compliance with this Privacy Policy. For example, we may share data with a security consultant to help us get better at preventing unauthorized access or with an email vendor to send messages on our behalf. We may also share data with hosting providers, payment processors, marketing vendors, and other consultants who work on our behalf and under contractual promises of confidentiality. + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + + + + + + In the event of a merger or sale. If we engage in a merger, acquisition, bankruptcy, dissolution, reorganization, or similar transaction or proceeding that involves the transfer of the information described in this Privacy Policy. + + + + + + + + + + +DQ + + + + + + + + + + + + + + + + + + + + + + + + That is aggregated and non-identifiable. We may also share aggregated or non-personally identifiable information with our partners or others for business or research purposes. For example, we may tell a prospective Comblie customer the average number of messages sent within a Comblie team in a day or may partner with research firm or academics to explore interesting questions about workplace communications. Again, this policy is not intended to prohibit the disclosure and use of aggregated or de-identified data. + + + + + + + + + + +DQ + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + If you decide to use or otherwise access the application, your use/access and any possible dispute over privacy is subject to this Privacy Statement and our Terms of Use, including limitations on damages, arbitration of disputes, and application of California state law.  + +Third Party Applications and Websites  + + + + + + + + + +DQ0 + + + + + + + + + + The application may permit you to link to other applications or websites. Such third party applications/websites are not under Comblie’s control, and such links do not constitute an endorsement by Comblie of those other applications or websites or the services offered through them. The privacy and security practices of such third party applications or websites linked to the Comblie application are not covered by this Privacy Policy, and Comblie is not responsible for the privacy or security practices or the content of such websites.  + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + Comblie is not intended for children under the age of 13. Comblie does not knowingly or specifically collect information about children under the age of 13 and believes that children of any age should get their parents’ consent before giving out any personal information. We encourage you to participate in your child’s web experience.  If you learn that a minor child has provided us with personal information without your consent, please contact us at + + + + + + + + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + + + +Comblie complies with the U.S. - E.U. Safe Harbor framework and the U.S. - Swiss Safe Harbor framework as set forth by the U.S. Department of Commerce regarding the collection, use, and retention of personal data from European Union member countries and Switzerland. Comblie has certified that it adheres to the Safe Harbor Privacy Principles of notice, choice, onward transfer, security, data integrity, access, and enforcement. To learn more about the Safe Harbor program, and to view Comblie’s certification, please visit  + + + + + + + + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + Comblie may amend this Privacy Statement from time to time. Use of information we collect now is subject to the Privacy Statement in effect at the time such information is used. If we make changes in the way we use personal information, we will notify you by posting an announcement on our site or sending you an email. Users are bound by any changes to the Privacy Policy when they use or otherwise accesses the application after such changes have been first posted. + + + + + + + + +   + + + + + + + + + + + + + + + + + + + +DQ0 + + + + + + + + + + If you have any questions or concerns regarding the Comblie Privacy Policy, please send us a detailed message at support@comblie.com. +_________________________ +_________________________ + +Effective Date: September 1, 2015 + + + + + + + + + +DQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/comblie/ComposeViewController.swift b/comblie/ComposeViewController.swift new file mode 100644 index 0000000..922ee86 --- /dev/null +++ b/comblie/ComposeViewController.swift @@ -0,0 +1,44 @@ +// +// ComposeViewController.swift +// comblie +// +// Created by Cal on 12/1/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class ComposeViewController: UIViewController { + @IBOutlet weak var topSeparatorLine: NSLayoutConstraint! + @IBOutlet weak var middleSeparatorLine: NSLayoutConstraint! + @IBOutlet weak var bottomSeparatorLine: NSLayoutConstraint! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + topSeparatorLine.constant = CGFloat(0.5) + middleSeparatorLine.constant = CGFloat(0.5) + bottomSeparatorLine.constant = CGFloat(0.5) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @IBAction func cancel(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/ConversationCellController.swift b/comblie/ConversationCellController.swift new file mode 100644 index 0000000..d8c854b --- /dev/null +++ b/comblie/ConversationCellController.swift @@ -0,0 +1,61 @@ +// +// ConversationCellController.swiftMessageTableViewController +// comblie +// +// Created by Cal on 10/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class ConversationCellController: UITableViewCell { + + var messageRoomVC : UIViewController! + + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var message: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + styleContent() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + + //MARK: Actions + @IBAction func openConversation(sender: UIButton) { + messageRoomVC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("MessageRoomPage") as! MessageRoomViewController + //For keeping the opacity + messageRoomVC.providesPresentationContextTransitionStyle = true + messageRoomVC.definesPresentationContext = true + messageRoomVC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext + self.window?.rootViewController?.presentViewController(messageRoomVC, animated: true, completion: populateConversation) + } + + func populateConversation() { + + } + + func styleContent() { + self.separatorInset = UIEdgeInsetsZero + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.size.height/2) + self.profileImage.clipsToBounds = true + + let font = UIFont(name: "HelveticaNeueLTStd-Lt", size: CGFloat(10.0)) + self.message.font = font + + /*self.messageText.contentInset = UIEdgeInsetsMake(-4, -4, 0, 0) + + let say = "hahahaoasidjsasdoasjdaoisdjaoidjaosijdoiasjdisajdoiasdjoaisjdoaisjoaijdsaidhasiduhasiduhasiudhasiHello Hello" + let num = say.endIndex.advancedBy(-4) + self.messageText.text = say.substringToIndex(num)*/ + + } + + +} diff --git a/comblie/ConversationTableViewController.swift b/comblie/ConversationTableViewController.swift new file mode 100644 index 0000000..286dfff --- /dev/null +++ b/comblie/ConversationTableViewController.swift @@ -0,0 +1,81 @@ +// +// ConversationTableViewController.swift.swift +// comblie +// +// Created by Cal on 10/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class ConversationTableViewController: UITableViewController { + + var dataSource : ConversationListDatasource! + + override func viewDidLoad() { + super.viewDidLoad() + + // READ DATASOURCE HERE + self.dataSource = ConversationListDatasource(tableView: self.tableView) + self.tableView.dataSource = self.dataSource + + self.tableView.separatorInset = UIEdgeInsetsZero + } + + + // MARK: - Table view data source + override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 55 + } + + /* + override func canPerformUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject) -> Bool { + return true + }*/ + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/FeedRequestManager.swift b/comblie/FeedRequestManager.swift new file mode 100644 index 0000000..cfc2568 --- /dev/null +++ b/comblie/FeedRequestManager.swift @@ -0,0 +1,65 @@ +// +// HTTPRequestManager.swift +// InstaToken +// +// Created by Trevor Hall on 10/2/15. +// Copyright © 2015 Trevor Hall. All rights reserved. +// + +import Foundation +import Alamofire +import SwiftyJSON + + public class FeedRequestManager { + + static let sharedInstance = FeedRequestManager() + + let facebook = facebookData + let twitter = twitterData + let instagram = instagramData + let tumblr = tumblrData + let vine = vineData + + + //MARK: Feed + func getFeedRequest() { + //request parameters object + print("getFeedRequest") + + + // build request parameters + let parameters = ["meta": [ + "facebook": facebook.returnToken(), + "twitter": twitter.returnToken(), + "instagram": instagram.returnToken(), + "tumblr": tumblr.returnToken(), + "vine": vine.returnToken()]] + + let url: String = "https://comblie.herokuapp.com/feed/" + // verify parameters is a valid json + let object = NSJSONSerialization.isValidJSONObject(parameters) + + //if parameters is a valid object, make POST request to server + if(object){ + Alamofire.request(.POST, url, parameters: parameters).response { request, response, data, error in +// let json = JSON(request!) + let dataJson = JSON(data: data!) + + // Deal with Data + + print("dataJson = ", dataJson) +// let feedData = json.rawValue +// let feed = JSON(feedData) +// print(feed["facebook"]) +// print("response = ", response) + InstagramFeedData.initFeedData(dataJson["response"]["instagram"]) + + + } + } + } + + func singleNetworkFeed(network: Network) { + network.printNetworkInfo() + } +} \ No newline at end of file diff --git a/comblie/FirebaseIOManager.swift b/comblie/FirebaseIOManager.swift new file mode 100644 index 0000000..a067ee6 --- /dev/null +++ b/comblie/FirebaseIOManager.swift @@ -0,0 +1,65 @@ +// +// FirebaseIOManager.swift +// comblie +// +// Created by Trevor Hall on 10/18/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import Foundation +import Firebase + +class FirebaseIOManager { + static let sharedInstance = FirebaseIOManager() + + let facebook = facebookData + let twitter = twitterData + let instagram = instagramData + let tumblr = tumblrData + let vine = vineData + + func setUserKeychainData (userID: String, email: String) { + KeychainWrapper.setString(userID, forKey: "ComblieUserID") + KeychainWrapper.setString(email, forKey: "ComblieUserEmail") + } + + //MARK: Get Tokens from Firebase + func getUserData (userID: String, email: String) { + print("get user data") + print(userID) + + let ref = Firebase(url:"https://comblie.firebaseio.com/users/" + userID) + + // Attach a closure to read the data at our posts reference + ref.observeEventType(.Value, withBlock: { snapshot in + UserDataManager.sharedInstance.setUserData(snapshot.value ,userID: userID, email: email) + }, withCancelBlock: { error in + print(error.description) + }) + } + + //MARK: Store Tokens to Firebase + func storeTokensInFirebase() { + //User Info + let userID = UserDataManager.sharedInstance.comblieUserId + let email = UserDataManager.sharedInstance.comblieEmailAddress + + + // build request parameters + let userData = ["email": email, + "facebook": facebook.returnToken(), + "twitter": twitter.returnToken(), + "instagram": instagram.returnToken(), + "tumblr": tumblr.returnToken(), + "vine": vine.returnToken()] + + //Firebase request to store Users data + let ref = Firebase(url: "https://comblie.firebaseio.com/") + let usersRef = ref.childByAppendingPath("users") + let userIDRef = usersRef.childByAppendingPath(userID) + userIDRef.setValue(userData) + } + + + +} \ No newline at end of file diff --git a/comblie/HomeViewController.swift b/comblie/HomeViewController.swift new file mode 100644 index 0000000..65269c8 --- /dev/null +++ b/comblie/HomeViewController.swift @@ -0,0 +1,51 @@ +// +// ViewController.swift +// comblie +// +// Created by Cal on 10/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class HomeViewController: UIViewController { + + //MARK: Properties + @IBOutlet weak var signUpButton: UIButton! + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + + // Set the SignUp button style + signUpButton.layer.cornerRadius = CGFloat(20.0) + signUpButton.layer.borderWidth = CGFloat(1.2); + signUpButton.layer.borderColor = UIColor.purpleColor().CGColor + + } + + override func viewDidAppear(animated: Bool) { +// let socialLogin = self.storyboard?.instantiateViewControllerWithIdentifier("SocialLoginPage") as! SocialLoginViewController +// self.presentViewController(socialLogin, animated: true, completion: nil) + } + + // Mark : Actions + + @IBAction func registerButton(sender: UIButton) { + let VC : MainViewController = self.storyboard?.instantiateViewControllerWithIdentifier("MainController") as! MainViewController + VC.pageQuery = "Register" + self.presentViewController(VC, animated: true, completion: nil) + } + + + + @IBAction func loginButton(sender: UIButton) { + + let VC : MainViewController = self.storyboard?.instantiateViewControllerWithIdentifier("MainController") as! MainViewController + VC.pageQuery = "Login" + self.presentViewController(VC, animated: true, completion: nil) + } + + +} + diff --git a/comblie/IncomingMessageTwoCellController.swift b/comblie/IncomingMessageTwoCellController.swift new file mode 100644 index 0000000..6a450d5 --- /dev/null +++ b/comblie/IncomingMessageTwoCellController.swift @@ -0,0 +1,36 @@ +// +// IncomingMessageTwoCellController.swift +// comblie +// +// Created by Cal on 10/22/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class IncomingMessageTwoCellController: UITableViewCell { + + //MARK: Properties + + + @IBOutlet weak var messageBackground: UIView! + @IBOutlet weak var message: UILabel! + + + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + self.messageBackground.layer.cornerRadius = CGFloat(13) + print(messageBackground.frame.height) + self.layoutIfNeeded() + print(messageBackground.frame.height) + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected states + } + +} diff --git a/comblie/Info.plist b/comblie/Info.plist new file mode 100644 index 0000000..5253761 --- /dev/null +++ b/comblie/Info.plist @@ -0,0 +1,123 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLName + + CFBundleURLSchemes + + fb1631909983727859 + oauth-swift + comblieTumblr + comblieInstagram + + + + CFBundleVersion + 1 + Fabric + + APIKey + 9cde9ba9c66701a2acaf6b75a4b76de3d1a4abe6 + Kits + + + KitInfo + + consumerKey + vYYpivIgsxaXdn87lyZQHyA4G + consumerSecret + HD7y34pji4yuTa7Fsfmb8QQtDNLwa6rF7jGmwLSmGWdrSvo1jI + + KitName + Twitter + + + + FacebookAppID + 1631909983727859 + FacebookDisplayName + Comblie + LSApplicationQueriesSchemes + + fbauth2 + + LSRequiresIPhoneOS + + UIViewControllerBasedStatusBarAppearance + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSExceptionDomains + + akamaihd.net + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + facebook.com + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + fbcdn.net + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + + + UIAppFonts + + HelveticaNeueLTStd-Lt.otf + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/comblie/InstagramAPIManager.swift b/comblie/InstagramAPIManager.swift new file mode 100644 index 0000000..2c78c77 --- /dev/null +++ b/comblie/InstagramAPIManager.swift @@ -0,0 +1,47 @@ +// +// InstagramAPIManager.swift +// InstaToken +// +// Created by Trevor Hall on 9/30/15. +// Copyright © 2015 Trevor Hall. All rights reserved. +// + +import Foundation +import Alamofire + +class InstagramAPIManager { + + static let sharedInstance = InstagramAPIManager() + let instagram = instagramData + + func startOAuth2Login() + { + + let clientID: String = "59b083ff487a4bc1b139b04d74352827" + let authPath:String = "https://api.instagram.com/oauth/authorize/?client_id=\(clientID)&redirect_uri=comblieInstagram://?aParam=paramVal&response_type=token" + let authURL = NSURL(string: authPath) + + + //redirect to safari for OAuth2 authentication + UIApplication.sharedApplication().openURL(authURL!) + + } + + var OAuthTokenCompletionHandler:(NSError? -> Void)? + + + func processOAuthStep1Response(url: NSURL) -> String + { + //Parse out access token from URL + let urlString = String(url) + let componentStringArray = urlString.componentsSeparatedByString("access_token=") + let token = componentStringArray[1] + instagram.setNetworkInfo(token, userId: "") + + //Notify NetworkLoginViewController + let notificationKey: String = "InstagramSuccess" + NSNotificationCenter.defaultCenter().postNotificationName(notificationKey, object: self) + //returns Authentication Token + return token + } +} diff --git a/comblie/InstagramProfileController.swift b/comblie/InstagramProfileController.swift new file mode 100644 index 0000000..d36d906 --- /dev/null +++ b/comblie/InstagramProfileController.swift @@ -0,0 +1,103 @@ +// +// InstagramProfileController.swift +// comblie +// +// Created by Cal on 10/27/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class InstagramProfileController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { + + var screenSize : CGSize! + var itemsInRow : CGFloat! + var spacesInRow : CGFloat! + var totalItemSpace : CGFloat! + var numberOfPhotos : CGFloat! + var spacing : CGFloat! + + @IBOutlet weak var profileImage: UIImageView! + @IBOutlet weak var profileImageBackground: UIView! + @IBOutlet weak var gridContainer: UIView! + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var gridContainerHeight: NSLayoutConstraint! + @IBOutlet weak var header: UIView! + @IBOutlet weak var scrollView: UIScrollView! + + override func viewDidLoad() { + super.viewDidLoad() + + self.collectionView.dataSource = self + self.collectionView.delegate = self + + self.spacing = 6 + self.numberOfPhotos = 17 + self.screenSize = UIScreen.mainScreen().bounds.size + self.itemsInRow = 3 + self.spacesInRow = itemsInRow+1 + self.totalItemSpace = screenSize.width - (spacesInRow*spacing) + + let requiredRows = ceil(numberOfPhotos/itemsInRow) + let calculatedGridHeight = requiredRows * (totalItemSpace/itemsInRow) + spacing*(requiredRows+1) + self.gridContainerHeight.constant = calculatedGridHeight + + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.height/2) + self.profileImageBackground.layer.cornerRadius = CGFloat(self.profileImageBackground.frame.height/2) + + } + + override func viewDidAppear(animated: Bool) { + self.scrollView.contentSize = CGSize(width: gridContainer.frame.width, height: gridContainer.frame.height + header.frame.height) + } + + + // MARK: UICollectionView + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { + return spacing + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat { + return spacing + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { + return CGSize(width: totalItemSpace/itemsInRow, height: totalItemSpace/itemsInRow) + } + + func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return Int(numberOfPhotos) + } + + func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCellWithReuseIdentifier("photo", forIndexPath: indexPath) as! InstagramPhotoCell + + if (indexPath.row % 2 == 0) { + cell.photoImage.image = UIImage(named: "vinebackground") + } + + return cell + } + + // MARK: Action + func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { + // Triggers when a photo is selected + print("Selected Photo") + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/KeychainWrapper.swift b/comblie/KeychainWrapper.swift new file mode 100644 index 0000000..c7ba4c7 --- /dev/null +++ b/comblie/KeychainWrapper.swift @@ -0,0 +1,256 @@ +// +// KeychainWrapper.swift +// KeychainWrapper +// +// Created by Jason Rendel on 9/23/14. +// Copyright (c) 2014 Jason Rendel. All rights reserved. +// +// The MIT License (MIT) +// +// 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 Foundation + + +let SecMatchLimit: String! = kSecMatchLimit as String +let SecReturnData: String! = kSecReturnData as String +let SecValueData: String! = kSecValueData as String +let SecAttrAccessible: String! = kSecAttrAccessible as String +let SecClass: String! = kSecClass as String +let SecAttrService: String! = kSecAttrService as String +let SecAttrGeneric: String! = kSecAttrGeneric as String +let SecAttrAccount: String! = kSecAttrAccount as String +let SecAttrAccessGroup: String! = kSecAttrAccessGroup as String + +/// KeychainWrapper is a class to help make Keychain access in Swift more straightforward. It is designed to make accessing the Keychain services more like using NSUserDefaults, which is much more familiar to people. +public class KeychainWrapper { + // MARK: Private static Properties + private struct internalVars { + static var serviceName: String = "" + static var accessGroup: String = "" + } + + // MARK: Public Properties + + /// ServiceName is used for the kSecAttrService property to uniquely identify this keychain accessor. If no service name is specified, KeychainWrapper will default to using the bundleIdentifier. + /// + ///This is a static property and only needs to be set once + public class var serviceName: String { + get { + if internalVars.serviceName.isEmpty { + internalVars.serviceName = NSBundle.mainBundle().bundleIdentifier ?? "SwiftKeychainWrapper" + } + return internalVars.serviceName + } + set(newServiceName) { + internalVars.serviceName = newServiceName + } + } + + /// AccessGroup is used for the kSecAttrAccessGroup property to identify which Keychain Access Group this entry belongs to. This allows you to use the KeychainWrapper with shared keychain access between different applications. + /// + /// Access Group defaults to an empty string and is not used until a valid value is set. + /// + /// This is a static property and only needs to be set once. To remove the access group property after one has been set, set this to an empty string. + public class var accessGroup: String { + get { + return internalVars.accessGroup + } + set(newAccessGroup){ + internalVars.accessGroup = newAccessGroup + } + } + + // MARK: Public Methods + + /// Checks if keychain data exists for a specified key. + /// + /// - parameter keyName: The key to check for. + /// - returns: True if a value exists for the key. False otherwise. + public class func hasValueForKey(keyName: String) -> Bool { + let keychainData: NSData? = self.dataForKey(keyName) + if keychainData != nil { + return true + } else { + return false + } + } + + /// Returns a string value for a specified key. + /// + /// - parameter keyName: The key to lookup data for. + /// - returns: The String associated with the key if it exists. If no data exists, or the data found cannot be encoded as a string, returns nil. + public class func stringForKey(keyName: String) -> String? { + let keychainData: NSData? = self.dataForKey(keyName) + var stringValue: String? + if let data = keychainData { + stringValue = NSString(data: data, encoding: NSUTF8StringEncoding) as String? + } + + return stringValue + } + + + /// Returns an object that conforms to NSCoding for a specified key. + /// + /// - parameter keyName: The key to lookup data for. + /// - returns: The decoded object associated with the key if it exists. If no data exists, or the data found cannot be decoded, returns nil. + public class func objectForKey(keyName: String) -> NSCoding? { + let dataValue: NSData? = self.dataForKey(keyName) + + var objectValue: NSCoding? + + if let data = dataValue { + objectValue = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? NSCoding + } + + return objectValue; + } + + + /// Returns a NSData object for a specified key. + /// + /// - parameter keyName: The key to lookup data for. + /// - returns: The NSData object associated with the key if it exists. If no data exists, returns nil. + public class func dataForKey(keyName: String) -> NSData? { + var keychainQueryDictionary = self.setupKeychainQueryDictionaryForKey(keyName) + var result: AnyObject? + + // Limit search results to one + keychainQueryDictionary[SecMatchLimit] = kSecMatchLimitOne + + // Specify we want NSData/CFData returned + keychainQueryDictionary[SecReturnData] = kCFBooleanTrue + + // Search + let status = withUnsafeMutablePointer(&result) { + SecItemCopyMatching(keychainQueryDictionary, UnsafeMutablePointer($0)) + } + + return status == noErr ? result as? NSData : nil + } + + /// Save a String value to the keychain associated with a specified key. If a String value already exists for the given keyname, the string will be overwritten with the new value. + /// + /// - parameter value: The String value to save. + /// - parameter forKey: The key to save the String under. + /// - returns: True if the save was successful, false otherwise. + public class func setString(value: String, forKey keyName: String) -> Bool { + if let data = value.dataUsingEncoding(NSUTF8StringEncoding) { + return self.setData(data, forKey: keyName) + } else { + return false + } + } + + /// Save an NSCoding compliant object to the keychain associated with a specified key. If an object already exists for the given keyname, the object will be overwritten with the new value. + /// + /// - parameter value: The NSCoding compliant object to save. + /// - parameter forKey: The key to save the object under. + /// - returns: True if the save was successful, false otherwise. + public class func setObject(value: NSCoding, forKey keyName: String) -> Bool { + let data = NSKeyedArchiver.archivedDataWithRootObject(value) + + return self.setData(data, forKey: keyName) + } + + /// Save a NSData object to the keychain associated with a specified key. If data already exists for the given keyname, the data will be overwritten with the new value. + /// + /// - parameter value: The NSData object to save. + /// - parameter forKey: The key to save the object under. + /// - returns: True if the save was successful, false otherwise. + public class func setData(value: NSData, forKey keyName: String) -> Bool { + var keychainQueryDictionary: [String:AnyObject] = self.setupKeychainQueryDictionaryForKey(keyName) + + keychainQueryDictionary[SecValueData] = value + + // Protect the keychain entry so it's only valid when the device is unlocked + keychainQueryDictionary[SecAttrAccessible] = kSecAttrAccessibleWhenUnlocked + + let status: OSStatus = SecItemAdd(keychainQueryDictionary, nil) + + if status == errSecSuccess { + return true + } else if status == errSecDuplicateItem { + return self.updateData(value, forKey: keyName) + } else { + return false + } + } + + /// Remove an object associated with a specified key. + /// + /// - parameter keyName: The key value to remove data for. + /// - returns: True if successful, false otherwise. + public class func removeObjectForKey(keyName: String) -> Bool { + let keychainQueryDictionary: [String:AnyObject] = self.setupKeychainQueryDictionaryForKey(keyName) + + // Delete + let status: OSStatus = SecItemDelete(keychainQueryDictionary); + + if status == errSecSuccess { + return true + } else { + return false + } + } + + // MARK: Private Methods + + /// Update existing data associated with a specified key name. The existing data will be overwritten by the new data + private class func updateData(value: NSData, forKey keyName: String) -> Bool { + let keychainQueryDictionary: [String:AnyObject] = self.setupKeychainQueryDictionaryForKey(keyName) + let updateDictionary = [SecValueData:value] + + // Update + let status: OSStatus = SecItemUpdate(keychainQueryDictionary, updateDictionary) + + if status == errSecSuccess { + return true + } else { + return false + } + } + + /// Setup the keychain query dictionary used to access the keychain on iOS for a specified key name. Takes into account the Service Name and Access Group if one is set. + /// + /// - parameter keyName: The key this query is for + /// - returns: A dictionary with all the needed properties setup to access the keychain on iOS + private class func setupKeychainQueryDictionaryForKey(keyName: String) -> [String:AnyObject] { + // Setup dictionary to access keychain and specify we are using a generic password (rather than a certificate, internet password, etc) + var keychainQueryDictionary: [String:AnyObject] = [SecClass:kSecClassGenericPassword] + + // Uniquely identify this keychain accessor + keychainQueryDictionary[SecAttrService] = KeychainWrapper.serviceName + + // Set the keychain access group if defined + if !KeychainWrapper.accessGroup.isEmpty { + keychainQueryDictionary[SecAttrAccessGroup] = KeychainWrapper.accessGroup + } + + // Uniquely identify the account who will be accessing the keychain + let encodedIdentifier: NSData? = keyName.dataUsingEncoding(NSUTF8StringEncoding) + + keychainQueryDictionary[SecAttrGeneric] = encodedIdentifier + + keychainQueryDictionary[SecAttrAccount] = encodedIdentifier + + return keychainQueryDictionary + } +} diff --git a/comblie/LoginViewController.swift b/comblie/LoginViewController.swift new file mode 100644 index 0000000..36218a0 --- /dev/null +++ b/comblie/LoginViewController.swift @@ -0,0 +1,264 @@ +// +// LoginPageViewController.swift +// comblie +// +// Created by Cal on 10/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit +import Firebase +import SwiftyJSON + +class LoginViewController: UIViewController, UITextFieldDelegate { + + //MARK: Properties + + @IBOutlet weak var username: UITextField! + @IBOutlet weak var password: UITextField! + @IBOutlet weak var errorLabel: UILabel! + @IBOutlet weak var loginButton: UIButton! + @IBOutlet weak var bottomSpacing: NSLayoutConstraint! + @IBOutlet weak var innerBottomSpacing: NSLayoutConstraint! + var inputArray = [UITextField]() + var wrongInfo : Bool! + + override func viewDidLoad() { + super.viewDidLoad() + + // Add text fields to array + inputArray.append(username) + inputArray.append(password) + + // Initialize text fields + styleTextFields() + initializeConstraints() + wrongInfo = false + + } + + + + //MARK: Actions + + @IBAction func signupRedirect(sender: UIButton) { + let pageController = self.parentViewController as! UIPageViewController + let mainViewController = pageController.parentViewController as! MainViewController + let viewControllers = NSArray(object: mainViewController.pages[1]) + pageController.setViewControllers(viewControllers as! [UIViewController], direction: .Forward, animated: true, completion: nil) + mainViewController.pageControls.currentPage = 1 + } + + // Login Account Button Action + @IBAction func loginButtonAction(sender: UIButton) { + + let email = username.text! + let pass = password.text! + + let ref = Firebase(url: "comblie.firebaseio.com") + ref.authUser(email, password: pass, + withCompletionBlock: { error, result in + if error != nil { + print("error = ", error) + if let errorCode = FAuthenticationError(rawValue: error.code){ + switch (errorCode) { + case .UserDoesNotExist: + self.handleError("Invalid Username!") + case .InvalidEmail: + self.handleError("Please enter a valid email address") + case .InvalidPassword: + self.handleError("Wrong Password!") + default: + self.handleError("Error") + } + } + } else { + // We are now logged in + if let userID = result.uid { + self.handleSuccessfulLogin(userID, email: email) + print("success") + } + } + }) + } + + func socialNetworkLoginPage() { + + // Redirect to Social Login -- You move this code or work around it + let socialLogin = self.storyboard?.instantiateViewControllerWithIdentifier("SocialLoginPage") as! SocialLoginViewController + self.presentViewController(socialLogin, animated: true, completion: nil) + + } + + func handleSuccessfulLogin(userId: String, email: String) { + + FirebaseIOManager.sharedInstance.setUserKeychainData(userId, email: email) + FirebaseIOManager.sharedInstance.getUserData(userId, email: email) + socialNetworkLoginPage() + + } + + + func handleError(error: String) { + wrongInfo = true + self.errorLabel.text = error + switch error { + case "Invalid Username!": + emailTextRed() + break + case "Please enter a valid email address": + emailTextRed() + break + case "Wrong Password!": + passwordTextRed() + break + case "error": + self.username.text = nil + break + default: + print("error") + } + } + + //MARK: Change Text + func emailTextRed() { + self.username.textColor = UIColor(red: 226/255, green: 0, blue: 0, alpha: 1.0) + self.password.text = nil + } + + func passwordTextRed() { + self.password.textColor = UIColor(red: 226/255, green: 0, blue: 0, alpha: 1.0) + + } + + override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + self.registerForKeyboardNotifications() +// if(UserDataManager.sharedInstance.comblieUserId != ""){ +// let socialLogin = self.storyboard?.instantiateViewControllerWithIdentifier("SocialLoginPage") as! SocialLoginViewController +// self.presentViewController(socialLogin, animated: true, completion: nil) +// } + } + + // MARK: Keyboard + + func textFieldDidBeginEditing(textField: UITextField) { + // When use starts typing + textField.placeholder = nil + + // Clears if previously invalid + if (wrongInfo == true) { + self.username.textColor = UIColor.blackColor() + self.password.textColor = UIColor.blackColor() + errorLabel.alpha = CGFloat(0) + wrongInfo = false + } + } + + func textFieldDidEndEditing(textField: UITextField) { + username.placeholder = "Email Address" + password.placeholder = "Password" + } + + // Allows the return button to dismiss the keyboard + func textFieldShouldReturn(textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + + // Call this method somewhere in your view controller setup code. + func registerForKeyboardNotifications() { + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, + selector: "keyboardWillBeShown:", + name: UIKeyboardWillShowNotification, + object: nil) + notificationCenter.addObserver(self, + selector: "keyboardWillBeHidden:", + name: UIKeyboardWillHideNotification, + object: nil) + } + + // Called when the UIKeyboardDidShowNotification is sent. + func keyboardWillBeShown(sender: NSNotification) { + + let info: NSDictionary = sender.userInfo! + let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue + let keyboardSize: CGSize = value.CGRectValue().size + + // MOVE THE CONTENT UP FOR THE KEYBOARD + moveForKeyboard(keyboardSize.height - innerBottomSpacing.constant - 30) + + } + + // Called when the UIKeyboardWillHideNotification is sent + func keyboardWillBeHidden(sender: NSNotification) { + hideAfterKeyboard() + } + + // MARK: Other + + func styleTextFields() { + for field in inputArray { + // Indents + let spacerViewLeft = UIView(frame:CGRect(x:0, y:0, width:15, height:username.frame.height)); + let spacerViewRight = UIView(frame:CGRect(x:0, y:0, width:5, height:username.frame.height)); + field.leftViewMode = UITextFieldViewMode.Always + field.rightViewMode = UITextFieldViewMode.Always + field.rightView = spacerViewRight + field.leftView = spacerViewLeft + // Remove auto correct + field.autocorrectionType = .No + // Set the delegate for listening + field.delegate = self } + } + + func initializeConstraints() { + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + innerBottomSpacing.constant = 40 + } else if screenHeight == 568 { + print("iPhone5") + innerBottomSpacing.constant = 100 + } else { + print("iPhone6") + innerBottomSpacing.constant = 125 + } + } + + func moveForKeyboard(keySize : CGFloat) { + bottomSpacing.constant = keySize + UIView.animateWithDuration(0) { + self.view.layoutIfNeeded() + } + loginButton.enabled = false + loginButton.alpha = CGFloat(0.5) + } + + func hideAfterKeyboard() { + bottomSpacing.constant = CGFloat(0.0) + //loginButton.backgroundColor = UIColor(red: 132/255, green: 45/255, blue: 114/255, alpha: 1.0) + loginButton.alpha = CGFloat(1.0) + loginButton.enabled = true + } + + // MARK: PageViewController + + /*func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + return self + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + return self + }*/ + + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + +} diff --git a/comblie/MainViewController.swift b/comblie/MainViewController.swift new file mode 100644 index 0000000..6d94ee9 --- /dev/null +++ b/comblie/MainViewController.swift @@ -0,0 +1,125 @@ +// +// MainViewController.swift +// comblie +// +// Created by Cal on 10/11/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class MainViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { + + //MARK: Properties + @IBOutlet weak var pageControls: UIPageControl! + @IBOutlet weak var innerBottomSpacing: NSLayoutConstraint! + + var pageViewController : UIPageViewController! + var pages : NSArray! + var pageQuery : String! + var viewControllers : NSArray! + + // Set up for parameters that can be passed in + init(page : String) + { + self.pageQuery = page + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + self.pageQuery = "" + super.init(coder: aDecoder) + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view, typically from a nib. + + // Instantiate the view page controller and add it to the Main View as a child view + // Prepares the login-type views + self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController + self.pageViewController.delegate = self + self.pageViewController.dataSource = self + let loginVC = self.storyboard?.instantiateViewControllerWithIdentifier("LoginPage") as! LoginViewController + let registrationVC = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationPage") as! RegistrationViewController + pages = NSArray(objects: loginVC, registrationVC) + + // Checks whether the Get started or login button was pressed + if pageQuery == "Login" { + viewControllers = NSArray(object: loginVC) + } else if pageQuery == "Register" { + viewControllers = NSArray(object: registrationVC) + } + + self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil) + self.addChildViewController(self.pageViewController) + self.view.addSubview(self.pageViewController.view) + self.pageViewController.didMoveToParentViewController(self) + self.pageControls.currentPage = pages.indexOfObject(viewControllers[0]) + self.view.bringSubviewToFront(pageControls) + + // Position Page Control + initializeConstraints() + } + + //MARK: Actions + + + // Creates and returns view controllers by storyboard ID + + func createViewController(identifierID : String) -> UIViewController { + let vc: UIViewController = self.storyboard!.instantiateViewControllerWithIdentifier(identifierID) as UIViewController + return vc + } + + // MARK: Page View Controller Data Source + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == 0 || index == NSNotFound) { + return nil + } + index-- + return pages[index] as! UIViewController + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == pages.count-1 || index == NSNotFound) { + return nil + } + index++ + return pages[index] as! UIViewController + + } + + // Triggers after it has landed on a new page after swipe + + func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + + // Set the current page + let currentPage = pages.indexOfObject((pageViewController.viewControllers?.last)!) + pageControls.currentPage = currentPage + } + + // MARK : Other + + func initializeConstraints() { + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + innerBottomSpacing.constant = 5 + } else if screenHeight == 568 { + print("iPhone5") + innerBottomSpacing.constant = 40 + } else { + print("iPhone6") + innerBottomSpacing.constant = 50 + } + } + +} \ No newline at end of file diff --git a/comblie/MessageRoomTableViewController.swift b/comblie/MessageRoomTableViewController.swift new file mode 100644 index 0000000..dd3ff26 --- /dev/null +++ b/comblie/MessageRoomTableViewController.swift @@ -0,0 +1,83 @@ +// +// MessageRoomTableViewController.swift +// comblie +// +// Created by Cal on 10/21/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class MessageRoomTableViewController: UITableViewController { + + // MARK: Properties + var dataSource : MessageRoomDatasource! + + override func viewDidLoad() { + super.viewDidLoad() + + // READS DATASOURCE HERE + self.dataSource = MessageRoomDatasource(tableView: self.tableView) + self.tableView.dataSource = self.dataSource + + self.tableView.delegate = self + self.edgesForExtendedLayout = UIRectEdge.None + self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.estimatedRowHeight = 44.0; // set to whatever your "average" cell + self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 20, 0) + // Uncomment the following line to preserve selection between presentations + // self.clearsSelectionOnViewWillAppear = false + + // Uncomment the following line to display an Edit button in the navigation bar for this view controller. + // self.navigationItem.rightBarButtonItem = self.editButtonItem() + } + + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/MessageRoomViewController.swift b/comblie/MessageRoomViewController.swift new file mode 100644 index 0000000..35d309e --- /dev/null +++ b/comblie/MessageRoomViewController.swift @@ -0,0 +1,110 @@ +// +// MessageRoomViewController.swift +// comblie +// +// Created by Cal on 10/21/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class MessageRoomViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet weak var messageRoomView: UIView! + @IBOutlet weak var messageField: UITextField! + @IBOutlet weak var bottomSpacing: NSLayoutConstraint! + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + + let messageTable = self.storyboard?.instantiateViewControllerWithIdentifier("MessageRoomTableViewController") as! MessageRoomTableViewController + self.addChildViewController(messageTable) + messageTable.view.frame = CGRect(x: 0, y: 0, width: self.messageRoomView.frame.width, height: messageRoomView.frame.height) + self.messageRoomView.addSubview(messageTable.view) + self.registerForKeyboardNotifications() + styleTextField() + } + + // MARK: Action + + + @IBAction func goBack(sender: UIButton) { + self.dismissViewControllerAnimated(true, completion: nil) + + + } + + func styleTextField() { + + let spacerViewLeft = UIView(frame:CGRect(x:0, y:0, width:5, height:messageField.frame.height)); + messageField.leftViewMode = UITextFieldViewMode.Always + messageField.leftView = spacerViewLeft + + + // Remove auto correct + messageField.autocorrectionType = .No + // Set the delegate for listening + messageField.delegate = self + + } + + // Allows the return button to dismiss the keyboard + func textFieldShouldReturn(textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + + // Call this method somewhere in your view controller setup code. + func registerForKeyboardNotifications() { + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, + selector: "keyboardWillBeShown:", + name: UIKeyboardWillShowNotification, + object: nil) + notificationCenter.addObserver(self, + selector: "keyboardWillBeHidden:", + name: UIKeyboardWillHideNotification, + object: nil) + } + + // Called when the UIKeyboardDidShowNotification is sent. + func keyboardWillBeShown(sender: NSNotification) { + + let info: NSDictionary = sender.userInfo! + let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue + let keyboardSize: CGSize = value.CGRectValue().size + + // MOVE THE CONTENT UP FOR THE KEYBOARD + moveForKeyboard(keyboardSize.height) + + } + + // Called when the UIKeyboardWillHideNotification is sent + func keyboardWillBeHidden(sender: NSNotification) { + hideAfterKeyboard() + } + + func moveForKeyboard(keySize : CGFloat) { + bottomSpacing.constant = keySize + UIView.animateWithDuration(0) { + self.view.layoutIfNeeded() + } + } + + func hideAfterKeyboard() { + bottomSpacing.constant = CGFloat(0.0) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/NetworkClass.swift b/comblie/NetworkClass.swift new file mode 100644 index 0000000..cb50d0c --- /dev/null +++ b/comblie/NetworkClass.swift @@ -0,0 +1,73 @@ +// +// File.swift +// comblie +// +// Created by Trevor Hall on 10/21/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import Foundation +import SwiftyJSON + +public class Network { + + var networkName: String = "" + var networkToken: String = "" + var networkUserId: String = "" + var networkActive: Bool = false + + init(name: String) { + self.networkName = name + } + + func setNetworkInfo(token: String, userId: String) { + if(token != ""){ + networkToken = token + } + if(userId != ""){ + print(networkName, userId) + networkUserId = String(userId) + } + networkActive = true + FeedRequestManager.sharedInstance.singleNetworkFeed(self) + } + + func deleteNetworkInfo() { + networkToken = "" + networkUserId = "" + networkActive = false + } + + func makeNetworkActive() { + networkActive = true + } + + func makeNetworkInactive() { + networkActive = false + } + + func printNetworkInfo() { + print("networkName = ", networkName) + print("networkToken = ", networkToken) + print("networkUSerId = ", networkUserId) + } + + func returnToken() -> [String: String] { + if(networkActive){ + return ["networkName": networkName, "access_token": networkToken, "id": networkUserId] + } + return ["networkName": networkName, "access_token": "", "id": ""] + } + +} + + + + + + + + + + + diff --git a/comblie/NetworkFeedClass.swift b/comblie/NetworkFeedClass.swift new file mode 100644 index 0000000..f4dcfa2 --- /dev/null +++ b/comblie/NetworkFeedClass.swift @@ -0,0 +1,41 @@ +// +// NetworkFeedClass.swift +// comblie +// +// Created by Trevor Hall on 10/23/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import Foundation +import SwiftyJSON + +let FacebookFeedData = NetworkFeed(name: "facebook"), + TwitterFeedData = NetworkFeed(name: "twitter"), + InstagramFeedData = NetworkFeed(name: "instagram"), + TumblrFeedData = NetworkFeed(name:"tumblr"), + VineFeedData = NetworkFeed(name: "vine"), + ComblieFeedData = NetworkFeed(name: "comblie") + + +class NetworkFeed { + var networkName: String = "", + networkFeedData = [] + + init(name: String){ + self.networkName = name + } + + func initFeedData(data: JSON) { + print(data["data"][0]["images"]["standard_resolution"]["url"]) + } + + func appendFeedData(data: JSON) { + + } + + func prependFeedData(data: JSON) { + + + } + +} \ No newline at end of file diff --git a/comblie/NetworkNotificationManager.swift b/comblie/NetworkNotificationManager.swift new file mode 100644 index 0000000..f1d5ce7 --- /dev/null +++ b/comblie/NetworkNotificationManager.swift @@ -0,0 +1,38 @@ +// +// NetworkNotificationManager.swift +// comblie +// +// Created by Trevor Hall on 10/23/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import Foundation +import SwiftyJSON + +let facebookNotification = NetworkNotification(name: "facebook"), + twitterNotification = NetworkNotification(name: "twitter"), + instagramNotification = NetworkNotification(name: "instagram"), + tumblrNotification = NetworkNotification(name: "tumblr"), + vineNotification = NetworkNotification(name: "vine"), + comblieNotification = NetworkNotification(name: "comblie") + +class NetworkNotification { + let networkName: String + var networkNotifications = [] + + init(name: String){ + self.networkName = name + } + + func initNotifications(data: JSON) { + print(data) + } + + func appendNotifications(data: JSON) { + + } + + func prependNotifications(data: JSON) { + + } +} \ No newline at end of file diff --git a/comblie/Networks.swift b/comblie/Networks.swift new file mode 100644 index 0000000..5c90de0 --- /dev/null +++ b/comblie/Networks.swift @@ -0,0 +1,15 @@ +// +// Networks.swift +// comblie +// +// Created by Trevor Hall on 10/21/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import Foundation + +let facebookData = Network(name: "facebook") +let twitterData = Network(name: "twitter") +let instagramData = Network(name: "instagram") +let tumblrData = Network(name: "tumblr") +let vineData = Network(name: "vineData") diff --git a/comblie/NotificationCell.swift b/comblie/NotificationCell.swift new file mode 100644 index 0000000..06372c5 --- /dev/null +++ b/comblie/NotificationCell.swift @@ -0,0 +1,78 @@ +// +// NotificationCell.swift +// comblie +// +// Created by Cal on 10/17/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class NotificationCell: UITableViewCell { + + // MARK: Properties + + + @IBOutlet weak var notification: UILabel! + + @IBOutlet weak var time: UILabel! + + + @IBOutlet weak var profileImage: UIImageView! + + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + changeText() + styleContent() + } + + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + + func styleContent() { + self.separatorInset = UIEdgeInsetsZero + self.profileImage.layer.cornerRadius = CGFloat(self.profileImage.frame.size.height/2) + self.profileImage.clipsToBounds = true + /*let font = UIFont(name: "HelveticaNeueLTStd-Lt", size: CGFloat(10.0)) + self.message.font = font*/ + + /*self.messageText.contentInset = UIEdgeInsetsMake(-4, -4, 0, 0) + + let say = "hahahaoasidjsasdoasjdaoisdjaoidjaosijdoiasjdisajdoiasdjoaisjdoaisjoaijdsaidhasiduhasiduhasiudhasiHello Hello" + let num = say.endIndex.advancedBy(-4) + self.messageText.text = say.substringToIndex(num)*/ + + } + + + func changeText() { + var firstWord = "Angelina Jolie " + var myMutableString = NSMutableAttributedString() + myMutableString = NSMutableAttributedString(string: firstWord, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Md", + size: 12.0)!]) + + var secondWord = "commented on your post on " + var styleString = NSMutableAttributedString() + styleString = NSMutableAttributedString(string: secondWord, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Roman", + size: 12.0)!]) + + var thirdWord = "Vine." + var thirdStyleString = NSMutableAttributedString() + thirdStyleString = NSMutableAttributedString(string: thirdWord, attributes: [NSFontAttributeName:UIFont( + name: "HelveticaNeueLTStd-Md", + size: 12.0)!]) + + + myMutableString.appendAttributedString(styleString) + myMutableString.appendAttributedString(thirdStyleString) + notification.attributedText = myMutableString + } + +} diff --git a/comblie/NotificationCell.xib b/comblie/NotificationCell.xib new file mode 100644 index 0000000..f7bf5da --- /dev/null +++ b/comblie/NotificationCell.xib @@ -0,0 +1,83 @@ + + + + + + + + + + HelveticaNeueLTStd-Lt + + + HelveticaNeueLTStd-Roman + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/comblie/NotificationDatasource.swift b/comblie/NotificationDatasource.swift new file mode 100644 index 0000000..a91713f --- /dev/null +++ b/comblie/NotificationDatasource.swift @@ -0,0 +1,39 @@ +// +// NotificationDatasource.swift +// comblie +// +// Created by Cal on 11/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class NotificationDatasource: NSObject, UITableViewDataSource { + + var tableView : UITableView + var items : NSMutableArray + + init(tableView : UITableView) { + self.items = ["a","a"] + self.tableView = tableView + self.tableView.registerNib(UINib(nibName: "NotificationCell", bundle: nil), forCellReuseIdentifier: "Notification") + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.items.count + } + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + // #warning Incomplete implementation, return the number of sections + return 1 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var currentCell : UITableViewCell! + let cell = tableView.dequeueReusableCellWithIdentifier("Notification", forIndexPath: indexPath) as! NotificationCell + cell.profileImage.image = UIImage(named: "profileImage") + cell.layoutMargins = UIEdgeInsetsZero + currentCell = cell + return currentCell + } +} diff --git a/comblie/NotificationRequestManager.swift b/comblie/NotificationRequestManager.swift new file mode 100644 index 0000000..a85ed98 --- /dev/null +++ b/comblie/NotificationRequestManager.swift @@ -0,0 +1,46 @@ +// +// NotificationRequestManager.swift +// comblie +// +// Created by Trevor Hall on 10/23/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import Foundation +import Alamofire +import SwiftyJSON + + +class NotificationRequestManager { + static let sharedInstance = NotificationRequestManager() + + + //MARK: Feed + func getNotificationRequest() { + //request parameters object + print("getFeedRequest") + + + // build request parameters + let parameters = ["meta": [ + "facebook": facebookData.returnToken(), + "twitter": twitterData.returnToken(), + "instagram": instagramData.returnToken(), + "tumblr": tumblrData.returnToken(), + "vine": vineData.returnToken()]] + + let url: String = "https://comblie.herokuapp.com/notifications" + Alamofire.request(.POST, url, parameters: parameters).response { request, response, data, error in + + let dataJson = JSON(data: data!) + + // Deal with Data + + print("dataJson = ", dataJson) + // let feedData = json.rawValue + // let feed = JSON(feedData) + // print(feed["facebook"]) + print("response = ", response) + + } + }} \ No newline at end of file diff --git a/comblie/NotificationTableViewController.swift b/comblie/NotificationTableViewController.swift new file mode 100644 index 0000000..6027f4e --- /dev/null +++ b/comblie/NotificationTableViewController.swift @@ -0,0 +1,75 @@ +// +// NotificationTableViewController.swift +// comblie +// +// Created by Cal on 10/16/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class NotificationTableViewController: UITableViewController { + + var dataSource : NotificationDatasource! + + override func viewDidLoad() { + super.viewDidLoad() + + dataSource = NotificationDatasource(tableView: self.tableView) + self.tableView.dataSource = self.dataSource + + self.tableView.separatorInset = UIEdgeInsetsZero + + } + + override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 55 + } + + + /* + // Override to support conditional editing of the table view. + override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + */ + + /* + // Override to support editing the table view. + override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == .Delete { + // Delete the row from the data source + tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) + } else if editingStyle == .Insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view + } + } + */ + + /* + // Override to support rearranging the table view. + override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { + + } + */ + + /* + // Override to support conditional rearranging of the table view. + override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { + // Return false if you do not want the item to be re-orderable. + return true + } + */ + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/ProfilePageController.swift b/comblie/ProfilePageController.swift new file mode 100644 index 0000000..b184b36 --- /dev/null +++ b/comblie/ProfilePageController.swift @@ -0,0 +1,192 @@ +// +// SocialFeedsViewController.swift +// comblie +// +// Created by Cal on 10/13/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class ProfilePageController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { + + //MARK: Properties + @IBOutlet weak var feedViewContainer: UIView! + @IBOutlet weak var networkName: UILabel! + @IBOutlet weak var customPageControls: UIStackView! + @IBOutlet weak var headerBackground: UIView! + + + var pageViewController : UIPageViewController! + var pages : NSArray! + var pageQuery : String! + var viewControllers : NSArray! + var dotCollection : [UIView]! + var headerColor : UIColor! + var clickedColor : UIColor! + var notClickedColor : UIColor! + + // Set up for parameters that can be passed in + init(page : String) + { + self.pageQuery = page + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder aDecoder: NSCoder) { + self.pageQuery = "" + super.init(coder: aDecoder) + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view, typically from a nib. + + // Instantiate the view page controller and add it to the Main View as a child view + // Prepares the login-type views + self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("SocialPageViewController") as! UIPageViewController + self.pageViewController.delegate = self + self.pageViewController.dataSource = self + let facebookVC = createViewController("FacebookProfile") + let twitterVC = createViewController("TwitterProfile") + let instagramVC = createViewController("InstagramProfile") + let tumblrVC = createViewController("TumblrProfile") + let vineVC = createViewController("VineProfile") + pages = NSArray(objects: facebookVC, twitterVC, instagramVC, tumblrVC, vineVC) + viewControllers = NSArray(object: facebookVC) + self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil) + self.addChildViewController(self.pageViewController) + self.pageViewController.view.frame = CGRect(x: 0, y: 0, width: self.feedViewContainer.frame.width, height: self.feedViewContainer.frame.height) + self.feedViewContainer.addSubview(self.pageViewController.view) + //self.view.addSubview(self.pageViewController.view) + self.pageViewController.didMoveToParentViewController(self) + dotCollection = customPageControls.subviews + + // Position Page Control + initializeConstraints() + stylePageControls() + changeHeaderColors("Combined", networkIndex: 0) + } + + //MARK: Actions + + + // Creates and returns view controllers by storyboard ID + + func createViewController(identifierID : String) -> UIViewController { + let vc = self.storyboard!.instantiateViewControllerWithIdentifier(identifierID) as UIViewController + return vc + } + + // MARK: Page View Controller Data Source + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == 0 || index == NSNotFound) { + return nil + } + index-- + return pages[index] as! UIViewController + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = pages.indexOfObject(vc) + if (index == pages.count-1 || index == NSNotFound) { + return nil + } + index++ + return pages[index] as! UIViewController + } + + // Triggers after it has landed on a new page after swipe + + func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + + // Set the current page + networkName.text = pageViewController.viewControllers?.last?.restorationIdentifier + let currentPage = pageViewController.viewControllers?.last + let currentIndex = pages.indexOfObject(currentPage!) + changeHeaderColors("", networkIndex: currentIndex) + + } + + // MARK : Other + + func initializeConstraints() { + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + + } else if screenHeight == 568 { + print("iPhone5") + + } else { + print("iPhone6") + + } + } + + func changeHeaderColors(networkID: String, networkIndex: Int) { + + switch networkID { + case "Facebook": + headerColor = UIColor(red: 63/255, green: 88/255, blue: 151/255, alpha: 1) + clickedColor = UIColor(red: 99/255, green: 122/255, blue: 181/255, alpha: 1) + notClickedColor = UIColor(red: 218/255, green: 239/255, blue: 250/255, alpha: 1) + break + case "Twitter": + headerColor = UIColor(red: 82/255, green: 176/255, blue: 236/255, alpha: 1) + clickedColor = UIColor(red: 118/255, green: 195/255, blue: 247/255, alpha: 1) + notClickedColor = UIColor(red: 238/255, green: 243/255, blue: 249/255, alpha: 1) + break + case "Instagram": + headerColor = UIColor(red: 49/255, green: 96/255, blue: 132/255, alpha: 1) + clickedColor = UIColor(red: 88/255, green: 129/255, blue: 165/255, alpha: 1) + notClickedColor = UIColor(red: 155/255, green: 179/255, blue: 201/255, alpha: 1) + break + case "Tumblr": + headerColor = UIColor(red: 54/255, green: 70/255, blue: 93/255, alpha: 1) + clickedColor = UIColor(red: 94/255, green: 106/255, blue: 125/255, alpha: 1) + notClickedColor = UIColor(red: 140/255, green: 149/255, blue: 161/255, alpha: 1) + break + case "Vine": + headerColor = UIColor(red: 105/255, green: 214/255, blue: 187/255, alpha: 1) + clickedColor = UIColor(red: 150/255, green: 238/255, blue: 217/255, alpha: 1) + notClickedColor = UIColor(red: 193/255, green: 245/255, blue: 233/255, alpha: 1) + break + default: + headerColor = UIColor(red: 245/255, green: 245/255, blue: 245/255, alpha: 1.0) + clickedColor = UIColor(red: 49/255, green: 49/255, blue: 49/255, alpha: 1.0) + notClickedColor = UIColor(red: 196/255, green: 196/255, blue: 196/255, alpha: 1.0) + break + } + + // Change the colors + + self.headerBackground.backgroundColor = headerColor + + for (index, element) in dotCollection.enumerate() { + if index == networkIndex { + element.backgroundColor = clickedColor + } else { + element.backgroundColor = notClickedColor + } + } + + + } + + + func stylePageControls() { + for dots in dotCollection { + dots.layer.cornerRadius = dots.frame.height/2 + } + + //var currentIndex = pages.indexOfObject(viewControllers[0]) + } + +} \ No newline at end of file diff --git a/comblie/PublicProfileController.swift b/comblie/PublicProfileController.swift new file mode 100644 index 0000000..3eb261d --- /dev/null +++ b/comblie/PublicProfileController.swift @@ -0,0 +1,67 @@ +// +// PublicProfileController.swift +// comblie +// +// Created by Cal on 11/24/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class PublicProfileController : UIViewController { + + var previousHeaderColor : UIColor! + var navBar : UINavigationBar! + var triggeredNetwork : String! + //var previousStatusBar : UIStatusBarStyle! + + override func viewDidLoad() { + super.viewDidLoad() + + navBar = self.navigationController?.navigationBar + // Do any additional setup after loading the view. + self.previousHeaderColor = self.navBar.barTintColor + print(previousHeaderColor) + self.navigationItem.title = "SomeProfile" + self.navBar.titleTextAttributes = [NSFontAttributeName:UIFont( + name: "HelveticaNeue-Bold", + size: 15.5)!] + //self.navBar.backItem?.title = ""; + self.navBar.barTintColor = UIColor(red: 245/255, green: 245/255, blue: 245/255, alpha: 1.0) + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + + var backButton: UIButton = UIButton(frame: CGRectMake(0, 0, 12, 22)) + backButton.setBackgroundImage(UIImage(named: "backArrow.png"), forState: .Normal) + var barBackButtonItem: UIBarButtonItem = UIBarButtonItem(customView: backButton) + backButton.addTarget(self, action: "goBack", forControlEvents: .TouchUpInside) + self.navigationItem.leftBarButtonItem = barBackButtonItem + self.navigationItem.hidesBackButton = true + + let VC = self.storyboard?.instantiateViewControllerWithIdentifier("TwitterProfile") + self.addChildViewController(VC!) + self.view.addSubview(VC!.view) + } + + override func viewWillDisappear(animated: Bool) { + + } + + func goBack() { + self.navBar.barTintColor = previousHeaderColor; + if self.navigationController?.viewControllers.indexOf(self)! == 1 { + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent + } + self.navigationController?.popViewControllerAnimated(true) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/RegistrationViewController.swift b/comblie/RegistrationViewController.swift new file mode 100644 index 0000000..175f7db --- /dev/null +++ b/comblie/RegistrationViewController.swift @@ -0,0 +1,319 @@ +// +// RegistrationViewController.swift +// comblie +// +// Created by Cal on 10/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit +import Firebase + +class RegistrationViewController: UIViewController, UITextFieldDelegate { + + // MARK: Properties + + @IBOutlet weak var createAccountButton: UIButton! + @IBOutlet weak var errorLabel: UILabel! + @IBOutlet weak var username: UITextField! + @IBOutlet weak var password: UITextField! + @IBOutlet weak var confirmPassword: UITextField! + @IBOutlet weak var bottomSpacing: NSLayoutConstraint! + @IBOutlet weak var innerBottomSpacing: NSLayoutConstraint! + var inputArray = [UITextField]() + var wrongInfo : Bool! + var badPassConf: Bool! + var some : NSArray! + + override func viewDidLoad() { + super.viewDidLoad() + // Add text fields to array + inputArray.append(username) + inputArray.append(password) + inputArray.append(confirmPassword) + + // Initialize text fields + styleTextFields() + initializeConstraints() + wrongInfo = false + badPassConf = false + + } + + override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + self.registerForKeyboardNotifications() + } + + // MARK: Actions + + @IBAction func loginRedirect(sender: UIButton) { + let pageController = self.parentViewController as! UIPageViewController + let mainViewController = pageController.parentViewController as! MainViewController + let viewControllers = NSArray(object: mainViewController.pages[0]) + pageController.setViewControllers(viewControllers as! [UIViewController], direction: .Reverse, animated: true, completion: nil) + mainViewController.pageControls.currentPage = 0 + } + + /*func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + print(some) + var index = some.indexOfObject(vc) + if (index == 0 || index == NSNotFound) { + return nil + } + index-- + return some[index] as! UIViewController + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + let vc = viewController as UIViewController + var index = some.indexOfObject(vc) + if (index == some.count-1 || index == NSNotFound) { + return nil + } + index++ + return some[index] as! UIViewController + + }*/ + + // Create Account Button Action + @IBAction func CreateAccount(sender: UIButton) { + + // Redirect to Social Login -- You move this code or work around it + let socialLogin = self.storyboard?.instantiateViewControllerWithIdentifier("SocialLoginPage") as! SocialLoginViewController + self.presentViewController(socialLogin, animated: true, completion: nil) + + //collect user info + let userName = username.text! + let pass = password.text! + let confPass = confirmPassword.text! + + //compare password fields to ensure they are matching + if(confPass != pass){ + handleError("Passwords do not match!") + } else { + //send user info to create account if passwords match + createAccount(userName, pass: pass) + } + } + + //Send user credentials to Firebase for registration + func createAccount(userName: String, pass: String) { + let ref = Firebase(url: "comblie.firebaseio.com") + ref.createUser(userName, password: pass, + withValueCompletionBlock: { error, result in + if error != nil { + // There was an error creating the account + print(error.dynamicType) + self.wrongInfo = true + self.errorLabel.alpha = CGFloat(1.0) + if let errorCode = FAuthenticationError(rawValue: error.code) { + print("error code = ", errorCode) + switch (errorCode) { + //Email address already registered + case .EmailTaken: + self.handleError("This email has already been registered") + //Not a valid email address + case .InvalidEmail: + self.handleError("Please enter a valid email address") + //Other errors + default: + self.handleError("There was a problem logging in!") + } + } + } else { + let uid = result["uid"] as? String + if let id = uid{ + FirebaseIOManager.sharedInstance.setUserKeychainData(id, email: userName) + print("Successfully created user account with uid: \(uid)") + } else { + self.handleError("There was a problem logging in!") + } + } + }) + } + + func handleError(error: String) { + wrongInfo = true + self.errorLabel.text = error + switch error { + case "This email has already been registered": + emailTextRed() + clearAllTextFields() + break + case "Please enter a valid email address": + self.password.text = nil + self.confirmPassword.text = nil + emailTextRed() + break + case "Passwords do not match!": + confirmPassword.textColor = UIColor(red: 226/255, green: 0, blue: 0, alpha: 1.0) + passwordTextRed() + badPassConf = true + break + case "There was a problem logging in!": + self.username.text = nil + clearAllTextFields() + break + default: + break + } + errorLabel.alpha = CGFloat(1.0) + } + + //Munipulate text fields and error label + + func emailTextRed() { + self.username.textColor = UIColor(red: 226/255, green: 0, blue: 0, alpha: 1.0) + } + + func passwordTextRed() { + self.password.textColor = UIColor(red: 226/255, green: 0, blue: 0, alpha: 1.0) + } + + func textFieldColorBlack() { + self.username.textColor = UIColor.blackColor() + self.password.textColor = UIColor.blackColor() + self.confirmPassword.textColor = UIColor.blackColor() + } + + func clearAllTextFields() { + username.text = nil + password.text = nil + confirmPassword.text = nil + } + + + + // MARK: Keyboard + + func textFieldDidBeginEditing(textField: UITextField) { + // When use starts typing + textField.placeholder = nil + + // Clears appropriate fields if previously invalid + if (wrongInfo == true) { + if(badPassConf == true){ + badPassConf = false + wrongInfo = false + confirmPassword.text = nil + errorLabel.alpha = CGFloat(0) + } else { + errorLabel.alpha = CGFloat(0) + clearAllTextFields() + wrongInfo = false + } + errorLabel.text = "" + } + self.textFieldColorBlack() + } + + func textFieldDidEndEditing(textField: UITextField) { + username.placeholder = "Email Address" + password.placeholder = "Password" + confirmPassword.placeholder = "Confirm Password" + } + + // Allows the return button to dismiss the keyboard + func textFieldShouldReturn(textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + + // Call this method somewhere in your view controller setup code. + func registerForKeyboardNotifications() { + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, + selector: "keyboardWillBeShown:", + name: UIKeyboardWillShowNotification, + object: nil) + notificationCenter.addObserver(self, + selector: "keyboardWillBeHidden:", + name: UIKeyboardWillHideNotification, + object: nil) + } + + // Called when the UIKeyboardDidShowNotification is sent. + func keyboardWillBeShown(sender: NSNotification) { + + let info: NSDictionary = sender.userInfo! + let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue + let keyboardSize: CGSize = value.CGRectValue().size + + // MOVE THE CONTENT UP FOR THE KEYBOARD + moveForKeyboard(keyboardSize.height - innerBottomSpacing.constant - 30) + } + + // Called when the UIKeyboardWillHideNotification is sent + func keyboardWillBeHidden(sender: NSNotification) { + hideAfterKeyboard() + } + + // MARK: Other + + func styleTextFields() { + for field in inputArray { + // Indents + let spacerViewLeft = UIView(frame:CGRect(x:0, y:0, width:15, height:username.frame.height)); + let spacerViewRight = UIView(frame:CGRect(x:0, y:0, width:5, height:username.frame.height)); + field.leftViewMode = UITextFieldViewMode.Always + field.rightViewMode = UITextFieldViewMode.Always + field.rightView = spacerViewRight + field.leftView = spacerViewLeft + // Remove auto correct + field.autocorrectionType = .No + // Set the delegate for listening + field.delegate = self + } + } + + func initializeConstraints() { + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + innerBottomSpacing.constant = 40 + } else if screenHeight == 568 { + print("iPhone5") + innerBottomSpacing.constant = 100 + } else { + print("iPhone6") + innerBottomSpacing.constant = 125 + } + } + + func moveForKeyboard(keySize : CGFloat) { + bottomSpacing.constant = keySize + UIView.animateWithDuration(0) { + self.view.layoutIfNeeded() + } + createAccountButton.enabled = false + createAccountButton.alpha = CGFloat(0.5) + } + + func hideAfterKeyboard() { + bottomSpacing.constant = CGFloat(0.0) + //createAccountButton.backgroundColor = UIColor(red: 132/255, green: 45/255, blue: 114/255, alpha: 1.0) + createAccountButton.alpha = CGFloat(1.0) + createAccountButton.enabled = true + } + + // MARK: PageViewController + + /*func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + return self + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + return self + }*/ + + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + +} diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB Bold.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB Bold.ttf" new file mode 100644 index 0000000..f68b0c4 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB Bold.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB BoldOblique.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB BoldOblique.ttf" new file mode 100644 index 0000000..7a548a9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB BoldOblique.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB Oblique.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB Oblique.ttf" new file mode 100644 index 0000000..830c958 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB Oblique.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-Bold.otf" new file mode 100644 index 0000000..dfd1ec2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-BoldOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-BoldOblique.otf" new file mode 100644 index 0000000..16d8fcf Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-BoldOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-Oblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-Oblique.otf" new file mode 100644 index 0000000..ea8b572 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB-Oblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB.otf" new file mode 100644 index 0000000..d352612 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFB.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE Bold.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE Bold.ttf" new file mode 100644 index 0000000..fe5fbbf Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE Bold.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE BoldOblique.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE BoldOblique.ttf" new file mode 100644 index 0000000..0b4b879 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE BoldOblique.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE Oblique.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE Oblique.ttf" new file mode 100644 index 0000000..d3a98bf Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE Oblique.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-Bold.otf" new file mode 100644 index 0000000..bb68f4e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-BoldOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-BoldOblique.otf" new file mode 100644 index 0000000..9cded70 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-BoldOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-Oblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-Oblique.otf" new file mode 100644 index 0000000..533394b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE-Oblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE.otf" new file mode 100644 index 0000000..8afdd6f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvFE.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvLight Regular.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvLight Regular.ttf" new file mode 100644 index 0000000..f74ccf8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelvLight Regular.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica Bold.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica Bold.ttf" new file mode 100644 index 0000000..db3be77 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica Bold.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Black-SemiBold.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Black-SemiBold.ttf" new file mode 100644 index 0000000..0ad506f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Black-SemiBold.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Black.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Black.otf" new file mode 100644 index 0000000..e43680b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Black.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-BlackOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-BlackOblique.otf" new file mode 100644 index 0000000..2a14921 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-BlackOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Bold.otf" new file mode 100644 index 0000000..87765aa Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-BoldOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-BoldOblique.otf" new file mode 100644 index 0000000..f0bcf11 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-BoldOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Compressed.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Compressed.otf" new file mode 100644 index 0000000..56542b3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Compressed.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Black-Se.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Black-Se.ttf" new file mode 100644 index 0000000..2e3f1e7 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Black-Se.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Black.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Black.otf" new file mode 100644 index 0000000..1fa2e13 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Black.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-BlackObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-BlackObl.otf" new file mode 100644 index 0000000..b3298f4 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-BlackObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Bold.otf" new file mode 100644 index 0000000..926482b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-BoldObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-BoldObl.otf" new file mode 100644 index 0000000..26f6224 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-BoldObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light-Li.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light-Li.ttf" new file mode 100644 index 0000000..93ac801 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light-Li.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light-Light.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light-Light.ttf" new file mode 100644 index 0000000..d6d923e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light-Light.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light.otf" new file mode 100644 index 0000000..a6453f2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Light.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-LightObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-LightObl.otf" new file mode 100644 index 0000000..4cf0836 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-LightObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Oblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Oblique.otf" new file mode 100644 index 0000000..3dfa4ee Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Oblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Thin.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Thin.ttf" new file mode 100644 index 0000000..18ef31c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed-Thin.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed.otf" new file mode 100644 index 0000000..ca0d0f0 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Condensed.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Conth.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Conth.ttf" new file mode 100644 index 0000000..5f8910e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Conth.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-ExtraCompressed.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-ExtraCompressed.otf" new file mode 100644 index 0000000..cb48d9f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-ExtraCompressed.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Fraction.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Fraction.otf" new file mode 100644 index 0000000..5d26ab2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Fraction.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-FractionBold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-FractionBold.otf" new file mode 100644 index 0000000..31848d1 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-FractionBold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Light-Light-Italic.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Light-Light-Italic.ttf" new file mode 100644 index 0000000..77ba0a8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Light-Light-Italic.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Light.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Light.otf" new file mode 100644 index 0000000..0abe99f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Light.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-LightOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-LightOblique.otf" new file mode 100644 index 0000000..5bf8fe6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-LightOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Bold.otf" new file mode 100644 index 0000000..0a82694 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-BoldItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-BoldItalic.otf" new file mode 100644 index 0000000..0a081e4 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-BoldItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-BoldOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-BoldOblique.otf" new file mode 100644 index 0000000..ade0e55 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-BoldOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Italic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Italic.otf" new file mode 100644 index 0000000..391a981 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Italic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Oblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Oblique.otf" new file mode 100644 index 0000000..44941e9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow-Oblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow.otf" new file mode 100644 index 0000000..9f99df6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Narrow.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Normal.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Normal.ttf" new file mode 100644 index 0000000..499995c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Normal.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Oblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Oblique.otf" new file mode 100644 index 0000000..b970088 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-Oblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-UltraCompressed.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-UltraCompressed.otf" new file mode 100644 index 0000000..80abad6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica-UltraCompressed.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica.otf" new file mode 100644 index 0000000..2e6c7e3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/Helvetica.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Black.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Black.otf" new file mode 100644 index 0000000..4ef00b6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Black.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-BlackItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-BlackItalic.otf" new file mode 100644 index 0000000..018e20a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-BlackItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Bold.otf" new file mode 100644 index 0000000..b293710 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-BoldItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-BoldItalic.otf" new file mode 100644 index 0000000..9d9094f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-BoldItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-DemiBold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-DemiBold.otf" new file mode 100644 index 0000000..7fb572a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-DemiBold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-DemiBoldItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-DemiBoldItalic.otf" new file mode 100644 index 0000000..37dfd36 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-DemiBoldItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Italic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Italic.otf" new file mode 100644 index 0000000..b7bd7b5 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Italic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Light.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Light.otf" new file mode 100644 index 0000000..f3f2c44 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Light.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-LightItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-LightItalic.otf" new file mode 100644 index 0000000..2ed0918 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-LightItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Medium.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Medium.otf" new file mode 100644 index 0000000..dd5e1b4 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Medium.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-MediumItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-MediumItalic.otf" new file mode 100644 index 0000000..5850817 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-MediumItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Roman.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Roman.otf" new file mode 100644 index 0000000..37ee785 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-Roman.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-UltraLight.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-UltraLight.otf" new file mode 100644 index 0000000..86eb810 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaBQ-UltraLight.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Bold.otf" new file mode 100644 index 0000000..c37f843 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-BoldOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-BoldOblique.otf" new file mode 100644 index 0000000..0e6d233 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-BoldOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Cond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Cond.otf" new file mode 100644 index 0000000..a18b801 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Cond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondBold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondBold.otf" new file mode 100644 index 0000000..0a6a197 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondBold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondBoldObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondBoldObl.otf" new file mode 100644 index 0000000..045bd46 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondBoldObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondObl.otf" new file mode 100644 index 0000000..fb3d8e8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-CondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Narrow.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Narrow.otf" new file mode 100644 index 0000000..f34f3c2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Narrow.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowBold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowBold.otf" new file mode 100644 index 0000000..8169cac Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowBold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowBoldOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowBoldOblique.otf" new file mode 100644 index 0000000..92ed099 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowBoldOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowOblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowOblique.otf" new file mode 100644 index 0000000..3353744 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-NarrowOblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Oblique.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Oblique.otf" new file mode 100644 index 0000000..bb97584 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE-Oblique.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE.otf" new file mode 100644 index 0000000..12ee463 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCE.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Bold.otf" new file mode 100644 index 0000000..b948267 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-ExtraLight.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-ExtraLight.otf" new file mode 100644 index 0000000..345458e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-ExtraLight.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-ExtraLightItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-ExtraLightItalic.otf" new file mode 100644 index 0000000..37c2e56 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-ExtraLightItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Light.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Light.otf" new file mode 100644 index 0000000..610973f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Light.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-LightItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-LightItalic.otf" new file mode 100644 index 0000000..1dc06ef Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-LightItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Medium.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Medium.otf" new file mode 100644 index 0000000..9a1afd2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaConBQ-Medium.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Bold.otf" new file mode 100644 index 0000000..9c8dae3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-BoldInclined.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-BoldInclined.otf" new file mode 100644 index 0000000..3343b08 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-BoldInclined.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Inclined.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Inclined.otf" new file mode 100644 index 0000000..8fe683e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Inclined.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Upright.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Upright.otf" new file mode 100644 index 0000000..5e3578a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyr-Upright.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Bold.otf" new file mode 100644 index 0000000..623d42c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-BoldInclined.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-BoldInclined.otf" new file mode 100644 index 0000000..f4984b8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-BoldInclined.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Inclined.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Inclined.otf" new file mode 100644 index 0000000..78829f1 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Inclined.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Upright.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Upright.otf" new file mode 100644 index 0000000..2a3ca7d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaCyrA-Upright.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaDiagonalBQ.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaDiagonalBQ.otf" new file mode 100644 index 0000000..9af1e9a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaDiagonalBQ.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExt-No.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExt-No.ttf" new file mode 100644 index 0000000..c63c8fb Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExt-No.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 2.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 2.ttf" new file mode 100644 index 0000000..847fbfa Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 2.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 3.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 3.ttf" new file mode 100644 index 0000000..00cec29 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 3.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 4.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 4.ttf" new file mode 100644 index 0000000..27ce6fb Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtO 4.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Bold.otf" new file mode 100644 index 0000000..6ce114e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-ExtraLight.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-ExtraLight.otf" new file mode 100644 index 0000000..7a31f03 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-ExtraLight.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Light.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Light.otf" new file mode 100644 index 0000000..8f4d82f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Light.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Medium.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Medium.otf" new file mode 100644 index 0000000..5d1e261 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaExtendedBQ-Medium.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaFractionsBQ.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaFractionsBQ.otf" new file mode 100644 index 0000000..ba577cf Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaFractionsBQ.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman-SemiB.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman-SemiB.ttf" new file mode 100644 index 0000000..bcaad14 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman-SemiB.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman-SemiBold(1).ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman-SemiBold(1).ttf" new file mode 100644 index 0000000..8f611f0 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman-SemiBold(1).ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman.otf" new file mode 100644 index 0000000..e6a8557 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInserat-Roman.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratBQ-Italic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratBQ-Italic.otf" new file mode 100644 index 0000000..7ab9677 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratBQ-Italic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratBQ-Regular.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratBQ-Regular.otf" new file mode 100644 index 0000000..f1ea24b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratBQ-Regular.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratCyr-Upright.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratCyr-Upright.otf" new file mode 100644 index 0000000..b2d7c3b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratCyr-Upright.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratLTStd-Roman.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratLTStd-Roman.otf" new file mode 100644 index 0000000..e7ac949 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaInseratLTStd-Roman.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd- steevo -Roman - pointed .ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd- steevo -Roman - pointed .ttf" new file mode 100644 index 0000000..d08665c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd- steevo -Roman - pointed .ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Blk.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Blk.otf" new file mode 100644 index 0000000..654ccc3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Blk.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkCond.otf" new file mode 100644 index 0000000..0406c75 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkCondObl.otf" new file mode 100644 index 0000000..793a6b9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkObl.otf" new file mode 100644 index 0000000..b18d7fb Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BlkObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Bold.otf" new file mode 100644 index 0000000..7a84f37 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldCond.otf" new file mode 100644 index 0000000..224b74f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldCondObl.otf" new file mode 100644 index 0000000..58beaa8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldObl.otf" new file mode 100644 index 0000000..88b9302 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-BoldObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Comp.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Comp.otf" new file mode 100644 index 0000000..c9dd968 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Comp.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Cond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Cond.otf" new file mode 100644 index 0000000..c962df7 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Cond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-CondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-CondObl.otf" new file mode 100644 index 0000000..2d74366 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-CondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-ExtraComp.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-ExtraComp.otf" new file mode 100644 index 0000000..c784399 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-ExtraComp.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Fractions.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Fractions.otf" new file mode 100644 index 0000000..2ac5c54 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Fractions.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-FractionsBd.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-FractionsBd.otf" new file mode 100644 index 0000000..6eac46c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-FractionsBd.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Light.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Light.otf" new file mode 100644 index 0000000..609bebb Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Light.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightCond.otf" new file mode 100644 index 0000000..3272f78 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightCondObl.otf" new file mode 100644 index 0000000..fa46069 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightObl.otf" new file mode 100644 index 0000000..dde8151 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-LightObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Obl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Obl.otf" new file mode 100644 index 0000000..4dbc459 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Obl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Roman.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Roman.otf" new file mode 100644 index 0000000..59e115a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-Roman.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-UltraComp.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-UltraComp.otf" new file mode 100644 index 0000000..7517051 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaLTStd-UltraComp.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Black.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Black.otf" new file mode 100644 index 0000000..127c843 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Black.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackCond.otf" new file mode 100644 index 0000000..aff26c9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackCondObl.otf" new file mode 100644 index 0000000..bdd8e6f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackExt.otf" new file mode 100644 index 0000000..eb0aa64 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackExtObl.otf" new file mode 100644 index 0000000..8f1075d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackItalic.otf" new file mode 100644 index 0000000..b9a2ac6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BlackItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Bold.otf" new file mode 100644 index 0000000..3a0b072 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldCond.otf" new file mode 100644 index 0000000..59e858e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldCondObl.otf" new file mode 100644 index 0000000..2d30eab Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldExt.otf" new file mode 100644 index 0000000..67bc240 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldExtObl.otf" new file mode 100644 index 0000000..9d0bd4e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldItalic.otf" new file mode 100644 index 0000000..4ce16c2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldOutline.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldOutline.otf" new file mode 100644 index 0000000..8490eaf Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-BoldOutline.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Condensed.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Condensed.otf" new file mode 100644 index 0000000..84dbf39 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Condensed.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-CondensedObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-CondensedObl.otf" new file mode 100644 index 0000000..e4a4b8a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-CondensedObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtBlackCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtBlackCond.otf" new file mode 100644 index 0000000..8117976 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtBlackCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtBlackCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtBlackCondObl.otf" new file mode 100644 index 0000000..6527014 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtBlackCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Extended.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Extended.otf" new file mode 100644 index 0000000..704b228 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Extended.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtendedObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtendedObl.otf" new file mode 100644 index 0000000..7d7339d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ExtendedObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Heavy.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Heavy.otf" new file mode 100644 index 0000000..27f788f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Heavy.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyCond.otf" new file mode 100644 index 0000000..3610f69 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyCondObl.otf" new file mode 100644 index 0000000..151fe7b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyExt.otf" new file mode 100644 index 0000000..f5c8905 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyExtObl.otf" new file mode 100644 index 0000000..6b7b68f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyItalic.otf" new file mode 100644 index 0000000..f3f8fcd Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-HeavyItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Italic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Italic.otf" new file mode 100644 index 0000000..320c065 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Italic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Light.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Light.otf" new file mode 100644 index 0000000..5a3adbd Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Light.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightCond.otf" new file mode 100644 index 0000000..44a7d13 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightCondObl.otf" new file mode 100644 index 0000000..ce399fe Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightExt.otf" new file mode 100644 index 0000000..a519267 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightExtObl.otf" new file mode 100644 index 0000000..b72ee6c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightItalic.otf" new file mode 100644 index 0000000..60ff241 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-LightItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Medium.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Medium.otf" new file mode 100644 index 0000000..d331437 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Medium.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumCond.otf" new file mode 100644 index 0000000..5b014a9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumCondObl.otf" new file mode 100644 index 0000000..e68162c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumExt.otf" new file mode 100644 index 0000000..9734ce7 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumExtObl.otf" new file mode 100644 index 0000000..eb60c4b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumItalic.otf" new file mode 100644 index 0000000..16d48b3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-MediumItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Roman.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Roman.otf" new file mode 100644 index 0000000..1d62e83 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Roman.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Thin.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Thin.otf" new file mode 100644 index 0000000..b975fdd Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-Thin.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinCond.otf" new file mode 100644 index 0000000..07295e6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinCondObl.otf" new file mode 100644 index 0000000..9bf213a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinExt.otf" new file mode 100644 index 0000000..80308da Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinExtObl.otf" new file mode 100644 index 0000000..b4b1967 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinItalic.otf" new file mode 100644 index 0000000..83e1e55 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-ThinItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigCond.otf" new file mode 100644 index 0000000..8e01eac Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigCondObl.otf" new file mode 100644 index 0000000..6585dda Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigExt.otf" new file mode 100644 index 0000000..bfc1d24 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigExtObl.otf" new file mode 100644 index 0000000..7de8ee2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLigExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLight.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLight.otf" new file mode 100644 index 0000000..e0aad31 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLight.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLightItal.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLightItal.otf" new file mode 100644 index 0000000..4664f12 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeue-UltraLightItal.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackCond.otf" new file mode 100644 index 0000000..ce92730 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackCondObl.otf" new file mode 100644 index 0000000..e522c92 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackExt.otf" new file mode 100644 index 0000000..fb07a78 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackExtObl.otf" new file mode 100644 index 0000000..59031b3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BlackExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldCond.otf" new file mode 100644 index 0000000..df589bf Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldCondObl.otf" new file mode 100644 index 0000000..bee8aa3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldExt.otf" new file mode 100644 index 0000000..a766228 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldExtObl.otf" new file mode 100644 index 0000000..b59eb32 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldOutline.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldOutline.otf" new file mode 100644 index 0000000..d72f6dd Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-BoldOutline.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-Condensed.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-Condensed.otf" new file mode 100644 index 0000000..fac2960 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-Condensed.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-CondensedObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-CondensedObl.otf" new file mode 100644 index 0000000..457421d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-CondensedObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtBlackCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtBlackCond.otf" new file mode 100644 index 0000000..f041511 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtBlackCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtBlackCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtBlackCondObl.otf" new file mode 100644 index 0000000..2f371fd Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtBlackCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-Extended.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-Extended.otf" new file mode 100644 index 0000000..55064d5 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-Extended.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtendedObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtendedObl.otf" new file mode 100644 index 0000000..8bf8265 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ExtendedObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyCond.otf" new file mode 100644 index 0000000..6c53e35 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyCondObl.otf" new file mode 100644 index 0000000..3198451 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyExt.otf" new file mode 100644 index 0000000..52a8744 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyExtObl.otf" new file mode 100644 index 0000000..db92bd6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-HeavyExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightCond.otf" new file mode 100644 index 0000000..c42ea52 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightCondObl.otf" new file mode 100644 index 0000000..3f37a63 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightExt.otf" new file mode 100644 index 0000000..6089e64 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightExtObl.otf" new file mode 100644 index 0000000..32fea8c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-LightExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumCond.otf" new file mode 100644 index 0000000..7bdadd4 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumCondObl.otf" new file mode 100644 index 0000000..07f2825 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumExt.otf" new file mode 100644 index 0000000..87e6b19 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumExtObl.otf" new file mode 100644 index 0000000..0317113 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-MediumExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinCond.otf" new file mode 100644 index 0000000..9fe7d42 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinCondObl.otf" new file mode 100644 index 0000000..df44107 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinExt.otf" new file mode 100644 index 0000000..68316b8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinExtObl.otf" new file mode 100644 index 0000000..f96ef65 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-ThinExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigCond.otf" new file mode 100644 index 0000000..5699161 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigCondObl.otf" new file mode 100644 index 0000000..8c06795 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigExt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigExt.otf" new file mode 100644 index 0000000..3902d00 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigExt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigExtObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigExtObl.otf" new file mode 100644 index 0000000..a4955bc Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLT-UltraLigExtObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Bd.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Bd.otf" new file mode 100644 index 0000000..d4ac7c1 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Bd.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdCn.otf" new file mode 100644 index 0000000..80e543b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdCnO.otf" new file mode 100644 index 0000000..644e876 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdEx.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdEx.otf" new file mode 100644 index 0000000..1cb2b7e Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdEx.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdExO.otf" new file mode 100644 index 0000000..bad1638 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdIt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdIt.otf" new file mode 100644 index 0000000..64d99f9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdIt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdOu.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdOu.otf" new file mode 100644 index 0000000..f37a558 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BdOu.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Blk.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Blk.otf" new file mode 100644 index 0000000..0d0dba3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Blk.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkCn.otf" new file mode 100644 index 0000000..454d749 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkCnO.otf" new file mode 100644 index 0000000..6ee2803 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkEx.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkEx.otf" new file mode 100644 index 0000000..b5e60a7 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkEx.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkExO.otf" new file mode 100644 index 0000000..6803f42 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkIt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkIt.otf" new file mode 100644 index 0000000..f0878f3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-BlkIt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Cn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Cn.otf" new file mode 100644 index 0000000..556bf1c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Cn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-CnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-CnO.otf" new file mode 100644 index 0000000..9e40b41 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-CnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Ex.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Ex.otf" new file mode 100644 index 0000000..66d69cb Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Ex.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ExO.otf" new file mode 100644 index 0000000..a905e9b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Hv.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Hv.otf" new file mode 100644 index 0000000..316b722 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Hv.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvCn.otf" new file mode 100644 index 0000000..08d1fa5 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvCnO.otf" new file mode 100644 index 0000000..51e7802 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvEx.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvEx.otf" new file mode 100644 index 0000000..01c03a0 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvEx.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvExO.otf" new file mode 100644 index 0000000..29c506b Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvIt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvIt.otf" new file mode 100644 index 0000000..be5e8ce Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-HvIt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-It.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-It.otf" new file mode 100644 index 0000000..c916403 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-It.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Lt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Lt.otf" new file mode 100644 index 0000000..1b27e9f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Lt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtCn.otf" new file mode 100644 index 0000000..1d073bb Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtCnO.otf" new file mode 100644 index 0000000..cf92803 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtEx.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtEx.otf" new file mode 100644 index 0000000..72aaaa4 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtEx.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtExO.otf" new file mode 100644 index 0000000..d928ff8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtIt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtIt.otf" new file mode 100644 index 0000000..4d0f29f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-LtIt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Md.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Md.otf" new file mode 100644 index 0000000..0822254 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Md.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdCn.otf" new file mode 100644 index 0000000..f7ae1ef Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdCnO.otf" new file mode 100644 index 0000000..e3b4519 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdEx.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdEx.otf" new file mode 100644 index 0000000..8308d46 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdEx.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdExO.otf" new file mode 100644 index 0000000..6be9baf Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdIt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdIt.otf" new file mode 100644 index 0000000..5f9ee8a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-MdIt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Roman.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Roman.otf" new file mode 100644 index 0000000..e8fbf17 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Roman.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Th.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Th.otf" new file mode 100644 index 0000000..3217384 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-Th.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThCn.otf" new file mode 100644 index 0000000..04bd2b5 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThCnO.otf" new file mode 100644 index 0000000..a1505ee Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThEx.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThEx.otf" new file mode 100644 index 0000000..dbb78b8 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThEx.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThExO.otf" new file mode 100644 index 0000000..f3c9b0a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThIt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThIt.otf" new file mode 100644 index 0000000..f9e314c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-ThIt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLt.otf" new file mode 100644 index 0000000..5d3a524 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtCn.otf" new file mode 100644 index 0000000..2895046 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtCnO.otf" new file mode 100644 index 0000000..23cd9da Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtEx.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtEx.otf" new file mode 100644 index 0000000..92eb697 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtEx.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtExO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtExO.otf" new file mode 100644 index 0000000..5dd4240 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtExO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtIt.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtIt.otf" new file mode 100644 index 0000000..2e003c7 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-UltLtIt.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-XBlkCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-XBlkCn.otf" new file mode 100644 index 0000000..38ec193 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-XBlkCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-XBlkCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-XBlkCnO.otf" new file mode 100644 index 0000000..154c59f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaNeueLTStd-XBlkCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-He.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-He.ttf" new file mode 100644 index 0000000..90742ff Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-He.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-Li.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-Li.ttf" new file mode 100644 index 0000000..19e82a9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-Li.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-Th.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-Th.ttf" new file mode 100644 index 0000000..473181a Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaObl-Th.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-Black.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-Black.otf" new file mode 100644 index 0000000..5564963 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-Black.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BlackObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BlackObl.otf" new file mode 100644 index 0000000..f710c4f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BlackObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-Bold.otf" new file mode 100644 index 0000000..d79bdf6 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldCond.otf" new file mode 100644 index 0000000..bf909ff Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldCondObl.otf" new file mode 100644 index 0000000..213448d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldObl.otf" new file mode 100644 index 0000000..4ea517f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRounded-BoldObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-Black.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-Black.otf" new file mode 100644 index 0000000..8cb6e80 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-Black.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BlackObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BlackObl.otf" new file mode 100644 index 0000000..83b76a2 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BlackObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-Bold.otf" new file mode 100644 index 0000000..9f497c3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldCond.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldCond.otf" new file mode 100644 index 0000000..39cb04f Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldCond.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldCondObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldCondObl.otf" new file mode 100644 index 0000000..86c2d4d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldCondObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldObl.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldObl.otf" new file mode 100644 index 0000000..facdf98 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLT-BoldObl.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-Bd.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-Bd.otf" new file mode 100644 index 0000000..028f376 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-Bd.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdCn.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdCn.otf" new file mode 100644 index 0000000..2000242 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdCn.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdCnO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdCnO.otf" new file mode 100644 index 0000000..79cd5d7 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdCnO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdO.otf" new file mode 100644 index 0000000..4b123b3 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BdO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-Black.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-Black.otf" new file mode 100644 index 0000000..923ff3d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-Black.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BlkO.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BlkO.otf" new file mode 100644 index 0000000..86cc467 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaRoundedLTStd-BlkO.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Bold.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Bold.otf" new file mode 100644 index 0000000..93c4c18 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Bold.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-BoldItalic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-BoldItalic.otf" new file mode 100644 index 0000000..48109a9 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-BoldItalic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Italic.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Italic.otf" new file mode 100644 index 0000000..c8f4928 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Italic.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Roman.otf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Roman.otf" new file mode 100644 index 0000000..38f2840 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaTwoBQ-Roman.otf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Bold.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Bold.ttf" new file mode 100644 index 0000000..af6e17d Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Bold.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-BoldItalic.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-BoldItalic.ttf" new file mode 100644 index 0000000..2d40524 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-BoldItalic.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Italic.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Italic.ttf" new file mode 100644 index 0000000..244da5c Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Italic.ttf" differ diff --git "a/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Regular.ttf" "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Regular.ttf" new file mode 100644 index 0000000..4b22a33 Binary files /dev/null and "b/comblie/Resources/HELVETICA - ULTIMATE FAMILY FONTS -steevo-be-thy-name-2011-\302\251/HelveticaWorld-Regular.ttf" differ diff --git a/comblie/SocialLoginViewController.swift b/comblie/SocialLoginViewController.swift new file mode 100644 index 0000000..01362ea --- /dev/null +++ b/comblie/SocialLoginViewController.swift @@ -0,0 +1,518 @@ +// +// SocialLoginViewController.swift +// comblie +// +// Created by Cal on 10/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit +import FBSDKCoreKit +import FBSDKLoginKit +import Firebase +import OAuthSwift +import TwitterKit + +class SocialLoginViewController: UIViewController, UITextFieldDelegate, FBSDKLoginButtonDelegate { + + // MARK: Properties + + @IBOutlet weak var finishButton: UIButton! + @IBOutlet weak var facebookLogin: UITextField! + @IBOutlet weak var twitterLogin: UITextField! + @IBOutlet weak var instagramLogin: UITextField! + @IBOutlet weak var tumblrLogin: UITextField! + @IBOutlet weak var vineLogin: UITextField! + @IBOutlet weak var facebookConnect: UIButton! + @IBOutlet weak var tumblrConnect: UIButton! + @IBOutlet weak var instagramConnect: UIButton! + @IBOutlet weak var twitterConnect: UIButton! + @IBOutlet weak var vineConnect: UIButton! + + @IBOutlet weak var busyOverlay: UIView! + @IBOutlet weak var innerBottomSpacing: NSLayoutConstraint! + @IBOutlet weak var bottomSpacing: NSLayoutConstraint! + let facebook = facebookData + let twitter = twitterData + let instagram = instagramData + let tumblr = tumblrData + let vine = vineData + var socialTextFields = [UITextField]() + + override func viewDidLoad() { + super.viewDidLoad() + print("ViewDidLoad") + instagramLogin.contentVerticalAlignment = UIControlContentVerticalAlignment.Center + //Add listener for Instagram Success + let notificationKey: String = "InstagramSuccess" + let loggedInNotificationKey: String = "UserLoggedIn" + let vineNotification: String = "VineSuccess" + NSNotificationCenter.defaultCenter().addObserver(self, selector: "instagramLoginSuccess", name: notificationKey, object: nil) + NSNotificationCenter.defaultCenter().addObserver(self, selector: "userLoggedIn", name: loggedInNotificationKey, object: nil) + NSNotificationCenter.defaultCenter().addObserver(self, selector: "vineLoginSuccess", name: vineNotification, object: nil) + + // Initialize text fields + initializeTextFields() + initializeConstraints() + initializeConnectButtons() + initializeFacebookLoginButton() + initializeTwitterLoginButton() + + + + //Check for connected networks + checkNetworkLogins() + } + + override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + self.registerForKeyboardNotifications() + } + + //MARK: Actions + + func socialLogin(sender: UIButton) { + //Trigger correct network login process + print(sender) + switch sender { + case facebookConnect: + startFacebookLogin() + break + case instagramConnect: + startInstagramLogin() + break + case twitterConnect: + startTwitterLogin() + break + case tumblrConnect: + startTumblrLogin() + break + case vineConnect: + startVineLogin() + break + default: + break + } + + } + + + + //MARK: Network Login State + func userLoggedIn () { + checkNetworkLogins() + print("User Logged In") + } + + func checkNetworkLogins() { + + let buttons: [UIButton] = [facebookConnect, twitterConnect,instagramConnect, tumblrConnect, vineConnect] + let loginFields: [UITextField] = [facebookLogin, twitterLogin, instagramLogin, tumblrLogin, vineLogin] + let tokens = [facebook.networkToken, twitter.networkToken, instagram.networkToken, tumblr.networkToken, vine.networkToken] + + for index in 0 ... buttons.count - 1 { + if(tokens[index] == ""){ + networkDisconnected(buttons[index], textField: loginFields[index]) + } else { + networkConnected(buttons[index], textField: loginFields[index]) + } + } + } + + func networkConnected(button: UIButton, textField: UITextField) { + let fontLight = UIFont(name: "HelveticaNeue-Light", size: 14) + let lightGray = UIColor(red: 200/255, green: 200/255, blue: 200/255, alpha: 1.0) + button.setTitle("Connected ✔︎", forState: .Selected) + button.setTitleColor(lightGray, forState: .Selected) + button.titleLabel?.font = fontLight + button.selected = true + textField.font = fontLight + textField.textColor = lightGray + } + + + //MARK: CAL - please style the UIButtons and UITextFields back to the non-connected state here for network logout + func networkDisconnected(button: UIButton, textField: UITextField) { + let fontMedium = UIFont(name: "HelveticaNeue-Medium", size: 14) + let fontRoman = UIFont(name: "HelveticaNeue-Roman", size: 14) + let purpleFade = UIColor(red: 132/255, green: 45/255, blue: 114/255, alpha: 1.0) + button.setTitle("Connect", forState: .Normal) + button.setTitleColor(purpleFade, forState: .Normal) + button.titleLabel?.font = fontMedium + button.selected = false + textField.font = fontRoman + textField.textColor = UIColor.blackColor() + } + + //MARK: -Facebook Login + + func startFacebookLogin() { + // Triggers the facebook button + + if(facebook.networkToken == "" && FBSDKAccessToken.currentAccessToken() == nil) { + triggerFacebookButton() + } else if( facebook.networkToken == "" && FBSDKAccessToken.currentAccessToken() != nil ){ + let token = FBSDKAccessToken.currentAccessToken().tokenString + let userId = FBSDKAccessToken.currentAccessToken().userID + if let auth_token = token, id = userId { + facebook.setNetworkInfo(auth_token, userId: id) + } + } else if(facebook.networkToken != "" && FBSDKAccessToken.currentAccessToken() != nil) { + triggerFacebookButton() + } else { + facebook.deleteNetworkInfo() + } + checkNetworkLogins() + } + + func triggerFacebookButton() { + for subview in self.view.subviews { + if subview.tag == 2009 { + let defaultFacebookButton = subview as! FBSDKLoginButton + defaultFacebookButton.sendActionsForControlEvents(UIControlEvents.TouchUpInside) + } + } + } + + func initializeFacebookLoginButton() { + if(FBSDKAccessToken.currentAccessToken() == nil) + { + print("logged in") + } + else + { + print("not logged in") + } + let loginButton = FBSDKLoginButton() + loginButton.readPermissions = ["public_profile", "email", "user_friends", "user_likes", "user_posts"] + loginButton.center = self.view.center + loginButton.delegate = self + loginButton.tag = 2009 + loginButton.alpha = CGFloat(0) + + self.view.addSubview(loginButton) + + } + + func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { + + if(error == nil) { + print("Login Complete") + if(FBSDKAccessToken.currentAccessToken() == nil) { + checkNetworkLogins() + } else { + let token = FBSDKAccessToken.currentAccessToken().tokenString + let userID = FBSDKAccessToken.currentAccessToken().userID + if let currentToken = token, id = userID { + facebook.setNetworkInfo(currentToken, userId: id) + } + } + + } + else { + print("error") + } + checkNetworkLogins() + } + + func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { + print("user logged out") + facebook.deleteNetworkInfo() + checkNetworkLogins() + } + + // MARK: Twitter + + func startTwitterLogin() { + if(twitter.networkToken == "") { + initializeTwitterButton() + } else { + twitter.deleteNetworkInfo() + checkNetworkLogins() + } + } + + func initializeTwitterButton() { + // Triggers the facebook button + for subview in self.view.subviews { + if subview.tag == 2012 { + let defaultTwitterButton = subview as! TWTRLogInButton + defaultTwitterButton.sendActionsForControlEvents(UIControlEvents.TouchUpInside) + } + } + } + + func initializeTwitterLoginButton() { + let logInButton = TWTRLogInButton(logInCompletion: { session, error in + if (session != nil) { + if let userInfo = session { + print("secret",userInfo.authTokenSecret) + print("token",userInfo.authToken) + self.twitter.setNetworkInfo(userInfo.authToken, userId: userInfo.userID) + self.checkNetworkLogins() + } + } else { + print("error: \(error!.localizedDescription)"); + } + }) + logInButton.center = self.view.center + logInButton.tag = 2012 + logInButton.alpha = CGFloat(0.0) + self.view.addSubview(logInButton) + + } + + + + //MARK: Instagram Login + func startInstagramLogin() { + if(instagram.networkToken == "") { + InstagramAPIManager.sharedInstance.startOAuth2Login() + } else { + instagram.deleteNetworkInfo() + checkNetworkLogins() + } + } + + func instagramLoginSuccess () { + print("instagramLoginSuccess") + let token = instagram.networkToken + networkConnected(instagramConnect, textField: instagramLogin) + print(token) + } + + + //MARK: Tumblr Login + func startTumblrLogin() { + if(tumblr.networkToken == "") { + tumblrLoginProcess() + } else { + tumblr.deleteNetworkInfo() + checkNetworkLogins() + } + } + + func tumblrLoginProcess() { + let oauthswift = OAuth1Swift( + consumerKey: "IJLNxgo0hZ4oPLa5eb86BMrgks2HOZbZ5y8iUhYtSHEWPdE50J", + consumerSecret: "SCo8PWk4ET5bH3RzrgVCp3HOjJ8GSA9ZP2ajk8s2eImE9Yk7id", + requestTokenUrl: "https://www.tumblr.com/oauth/request_token", + authorizeUrl: "https://www.tumblr.com/oauth/authorize", + accessTokenUrl: "https://www.tumblr.com/oauth/access_token" + ) + oauthswift.authorizeWithCallbackURL( NSURL(string: "comblieTumblr://oauth-callback/tumblr")!, success: { + credential, response in + print("tumblrCredentials") + print("tumblr token = ", credential.oauth_token, " of type ", credential.oauth_token.dynamicType) + print("secret = ", credential.oauth_token_secret, "of type", credential.oauth_token_secret.dynamicType) + self.tumblr.setNetworkInfo(credential.oauth_token, userId: credential.oauth_token_secret) + self.checkNetworkLogins() + + }, failure: {(error:NSError!) -> Void in + print(error.localizedDescription) + }) + + } + + //MARK: Vine + func startVineLogin() { + if(vine.networkToken == ""){ + openVineLogin() + } else { + vine.deleteNetworkInfo() + checkNetworkLogins() + } + } + + func openVineLogin() { + + // For modal window login + //self.view.bringSubviewToFront(busyOverlay) + let VC : VineLoginController = (self.storyboard?.instantiateViewControllerWithIdentifier("VineLoginWindow")) as! VineLoginController + VC.providesPresentationContextTransitionStyle = true + VC.definesPresentationContext = true + VC.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext + self.presentViewController(VC, animated: true, completion: nil) + + } + + func vineLoginSuccess(){ + checkNetworkLogins() + } + + + + + + + + + + // MARK: Finish Network Login + + // Create Account Button Action + @IBAction func finishButton(sender: UIButton) { +// print("Finish Social") +// +// let VC = self.storyboard!.instantiateViewControllerWithIdentifier("SocialTabBar") +// self.presentViewController(VC, animated: true, completion: nil) + FirebaseIOManager.sharedInstance.storeTokensInFirebase() + FeedRequestManager.sharedInstance.getFeedRequest() +// NotificationRequestManager.sharedInstance.getNotificationRequest() + } + + + + + // MARK: Keyboard + + func textFieldDidBeginEditing(textField: UITextField) { + // When use starts typing + print("editing") + //textField.enabled = false + textField.placeholder = nil + + // Clears if previously invalid + if (textField.textColor == UIColor.redColor()) { + facebookLogin.text = nil + twitterLogin.text = nil + instagramLogin.text = nil + tumblrLogin.text = nil + vineLogin.text = nil + } + } + + func textFieldDidEndEditing(textField: UITextField) { + facebookLogin.placeholder = "Facebook" + twitterLogin.placeholder = "Twitter" + instagramLogin.placeholder = "Instagram" + tumblrLogin.placeholder = "Tumblr" + vineLogin.placeholder = "Vine" + } + + // Allows the return button to dismiss the keyboard + func textFieldShouldReturn(textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + + // Call this method somewhere in your view controller setup code. + func registerForKeyboardNotifications() { + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, + selector: "keyboardWillBeShown:", + name: UIKeyboardWillShowNotification, + object: nil) + notificationCenter.addObserver(self, + selector: "keyboardWillBeHidden:", + name: UIKeyboardWillHideNotification, + object: nil) + } + + // Called when the UIKeyboardDidShowNotification is sent. + func keyboardWillBeShown(sender: NSNotification) { + + let info: NSDictionary = sender.userInfo! + let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue + let keyboardSize: CGSize = value.CGRectValue().size + + // MOVE THE CONTENT UP FOR THE KEYBOARD + moveForKeyboard(keyboardSize.height - innerBottomSpacing.constant) + } + + // Called when the UIKeyboardWillHideNotification is sent + func keyboardWillBeHidden(sender: NSNotification) { + hideAfterKeyboard() + } + + // MARK: Other + + func initializeConnectButtons() { + + // Adds buttons to listener + facebookConnect.addTarget(self, action: "socialLogin:", forControlEvents: UIControlEvents.TouchUpInside) + twitterConnect.addTarget(self, action: "socialLogin:", forControlEvents: UIControlEvents.TouchUpInside) + instagramConnect.addTarget(self, action: "socialLogin:", forControlEvents: UIControlEvents.TouchUpInside) + tumblrConnect.addTarget(self, action: "socialLogin:", forControlEvents: UIControlEvents.TouchUpInside) + vineConnect.addTarget(self, action: "socialLogin:", forControlEvents: UIControlEvents.TouchUpInside) + } + + func initializeTextFields() { + + // Add text fields to array + socialTextFields.append(facebookLogin) + socialTextFields.append(twitterLogin) + socialTextFields.append(instagramLogin) + socialTextFields.append(tumblrLogin) + socialTextFields.append(vineLogin) + + // Adds indentation on the left + for field in socialTextFields { + // Disable keyboard + field.enabled = false + // Indents + let spacerViewLeft = UIView(frame:CGRect(x:0, y:0, width:25, height:facebookLogin.frame.height)); + field.leftViewMode = UITextFieldViewMode.Always + field.leftView = spacerViewLeft + // Remove auto correct + field.autocorrectionType = .No + // Set the delegate for listening + field.delegate = self + } + } + + + func initializeConstraints() { + + // Initializes layout to fit + let screenHeight = UIScreen.mainScreen().bounds.height + if (screenHeight <= 480) { + print("iPhone4") + innerBottomSpacing.constant = 40 + } else if screenHeight == 568 { + print("iPhone5") + innerBottomSpacing.constant = 100 + } else { + print("iPhone6") + innerBottomSpacing.constant = 125 + } + } + + func moveForKeyboard(keySize : CGFloat) { + bottomSpacing.constant = keySize + UIView.animateWithDuration(0) { + self.view.layoutIfNeeded() + } + finishButton.enabled = false + finishButton.alpha = CGFloat(0.5) + } + + func hideAfterKeyboard() { + bottomSpacing.constant = CGFloat(0.0) + //createAccountButton.backgroundColor = UIColor(red: 132/255, green: 45/255, blue: 114/255, alpha: 1.0) + finishButton.alpha = CGFloat(1.0) + finishButton.enabled = true + } + + //MARK: May Not Need These + + + // MARK: PageViewController + + /*func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { + return self + } + + func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + return self + }*/ + + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + +} diff --git a/comblie/SocialTabBarController.swift b/comblie/SocialTabBarController.swift new file mode 100644 index 0000000..7588800 --- /dev/null +++ b/comblie/SocialTabBarController.swift @@ -0,0 +1,123 @@ +// +// testViewController.swift +// comblie +// +// Created by Cal on 10/13/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import UIKit + +class SocialTabBarController: UIViewController { + + var VC : UITabBarController! + + @IBOutlet weak var customTabBar: UIView! + @IBOutlet weak var profileButton: UIButton! + @IBOutlet weak var notificationsButton: UIButton! + @IBOutlet weak var feedsButton: UIButton! + @IBOutlet weak var messagesButton: UIButton! + @IBOutlet weak var settingsButton: UIButton! + @IBOutlet weak var tabBarHeight: NSLayoutConstraint! + @IBOutlet weak var buttonsContainer: UIStackView! + + var buttons : [UIButton]! + + override func viewDidLoad() { + super.viewDidLoad() + + VC = self.storyboard!.instantiateViewControllerWithIdentifier("SocialTabPage") as! UITabBarController + self.addChildViewController(VC) + self.view.addSubview(VC.view) + self.view.bringSubviewToFront(customTabBar) + + // Style tab bar + buttons = buttonsContainer.subviews as! [UIButton] + initializeConstraints() + initializeTabBarButtons() + } + + func chooseTab(sender: UIButton) { + UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default + switch sender { + case profileButton: + VC.selectedIndex = 0 + showSelectedButton(sender, index: 0) + break + case notificationsButton: + VC.selectedIndex = 1 + showSelectedButton(sender, index: 1) + break + case feedsButton: + VC.selectedIndex = 2 + showSelectedButton(sender, index: 2) + FeedRequestManager.sharedInstance.getFeedRequest() + break + case messagesButton: + VC.selectedIndex = 3 + showSelectedButton(sender, index: 3) + break + case settingsButton: + VC.selectedIndex = 4 + showSelectedButton(sender, index: 4) + + break + default: + break + } + } + + func showSelectedButton(button: UIButton, index: Int) { + for (buttonIndex, element) in buttons.enumerate() { + if (buttonIndex == index) { + element.selected = true + } else { + element.selected = false + } + } + } + + func initializeConstraints() { + let screenWidth = UIScreen.mainScreen().bounds.width + if screenWidth <= 320 { + print("iPhone4 and iPhone5") + tabBarHeight.constant = 40 + } else if screenWidth == 375 { + print("iPhone6") + tabBarHeight.constant = 45 + } else { + print("iPhone6S") + tabBarHeight.constant = 50 + } + } + + func initializeTabBarButtons() { + + // Adds button to listener + profileButton.addTarget(self, action: "chooseTab:", forControlEvents: UIControlEvents.TouchUpInside) + notificationsButton.addTarget(self, action: "chooseTab:", forControlEvents: UIControlEvents.TouchUpInside) + feedsButton.addTarget(self, action: "chooseTab:", forControlEvents: UIControlEvents.TouchUpInside) + messagesButton.addTarget(self, action: "chooseTab:", forControlEvents: UIControlEvents.TouchUpInside) + settingsButton.addTarget(self, action: "chooseTab:", forControlEvents: UIControlEvents.TouchUpInside) + + // Sets the selected images + settingsButton.setBackgroundImage(UIImage(named: "settingsdark"), forState: .Selected) + profileButton.setBackgroundImage(UIImage(named: "profiledark"), forState: .Selected) + notificationsButton.setBackgroundImage(UIImage(named: "notificationsdark"), forState: .Selected) + feedsButton.setBackgroundImage(UIImage(named: "feedsdark"), forState: .Selected) + messagesButton.setBackgroundImage(UIImage(named: "messagesdark"), forState: .Selected) + } + + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/comblie/UserDataManager.swift b/comblie/UserDataManager.swift new file mode 100644 index 0000000..b27ca38 --- /dev/null +++ b/comblie/UserDataManager.swift @@ -0,0 +1,47 @@ +// +// APITokenManager.swift +// InstaToken +// +// Created by Trevor Hall on 10/2/15. +// Copyright © 2015 Trevor Hall. All rights reserved. +// + +import Foundation +import Alamofire +import SwiftyJSON + +public class UserDataManager { + + static let sharedInstance = UserDataManager() + let facebook = facebookData + let twitter = twitterData + let instagram = instagramData + let tumblr = tumblrData + let vine = vineData + + var comblieUserId = "" + var comblieEmailAddress = "" + + func setUserData(tokens: AnyObject, userID: String, email: String) { + print("APITokenManager setUserData") + let tokensJSON = JSON(tokens) + comblieUserId = userID + comblieEmailAddress = email + + facebook.setNetworkInfo(tokensJSON["facebook"]["access_token"].stringValue, userId: tokensJSON["facebook"]["userId"].stringValue) + twitter.setNetworkInfo(tokensJSON["twitter"]["access_token"].stringValue, userId: tokensJSON["twitter"]["userId"].stringValue) + instagram.setNetworkInfo(tokensJSON["instagram"]["access_token"].stringValue, userId: tokensJSON["instagram"]["userId"].stringValue) + tumblr.setNetworkInfo(tokensJSON["tumblr"]["access_token"].stringValue, userId: tokensJSON["tumblr"]["userId"].stringValue) + vine.setNetworkInfo(tokensJSON["vine"]["access_token"].stringValue, userId: tokensJSON["vine"]["userId"].stringValue) + + let notificationKey: String = "UserLoggedIn" + NSNotificationCenter.defaultCenter().postNotificationName(notificationKey, object: self) + } + + func checkNetworkToken(network: Network) { + + } + + + +} \ No newline at end of file diff --git a/comblieTests/Info.plist b/comblieTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/comblieTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/comblieTests/comblieTests.swift b/comblieTests/comblieTests.swift new file mode 100644 index 0000000..7bf2dab --- /dev/null +++ b/comblieTests/comblieTests.swift @@ -0,0 +1,36 @@ +// +// comblieTests.swift +// comblieTests +// +// Created by Cal on 10/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import XCTest +@testable import comblie + +class comblieTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/comblieUITests/Info.plist b/comblieUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/comblieUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/comblieUITests/comblieUITests.swift b/comblieUITests/comblieUITests.swift new file mode 100644 index 0000000..aa19d3d --- /dev/null +++ b/comblieUITests/comblieUITests.swift @@ -0,0 +1,36 @@ +// +// comblieUITests.swift +// comblieUITests +// +// Created by Cal on 10/8/15. +// Copyright © 2015 Comblie. All rights reserved. +// + +import XCTest + +class comblieUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +}