[
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control\n#\n# Pods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\nCarthage/Checkouts\nCarthage/Build\n"
  },
  {
    "path": "Cartfile",
    "content": "github \"onevcat/Kingfisher\" >= 1.6\ngithub \"Alamofire/Alamofire\" ~> 2.0 \n"
  },
  {
    "path": "Cartfile.resolved",
    "content": "github \"Alamofire/Alamofire\" \"2.0.2\"\ngithub \"onevcat/Kingfisher\" \"1.6.0\"\n"
  },
  {
    "path": "Crashlytics.framework/Headers/Answers.h",
    "content": "//\n//  Answers.h\n//  Crashlytics\n//\n//  Copyright (c) 2015 Crashlytics, Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <Fabric/FABAttributes.h>\n\nFAB_START_NONNULL\n\n@interface Answers : NSObject\n\n/**\n *  Log a Sign Up event to see users signing up for your app in real-time, understand how\n *  many users are signing up with different methods and their success rate signing up.\n *\n *  @param signUpMethodOrNil     The method by which a user logged in, e.g. Twitter or Digits.\n *  @param signUpSucceededOrNil  The ultimate success or failure of the login\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.\n */\n+ (void)logSignUpWithMethod:(NSString * FAB_NULLABLE)signUpMethodOrNil\n                    success:(NSNumber * FAB_NULLABLE)signUpSucceededOrNil\n           customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log an Log In event to see users logging into your app in real-time, understand how many\n *  users are logging in with different methods and their success rate logging into your app.\n *\n *  @param loginMethodOrNil      The method by which a user logged in, e.g. email, Twitter or Digits.\n *  @param loginSucceededOrNil   The ultimate success or failure of the login\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.\n */\n+ (void)logLoginWithMethod:(NSString * FAB_NULLABLE)loginMethodOrNil\n                   success:(NSNumber * FAB_NULLABLE)loginSucceededOrNil\n          customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Share event to see users sharing from your app in real-time, letting you\n *  understand what content they're sharing from the type or genre down to the specific id.\n *\n *  @param shareMethodOrNil      The method by which a user shared, e.g. email, Twitter, SMS.\n *  @param contentNameOrNil      The human readable name for this piece of content.\n *  @param contentTypeOrNil      The type of content shared.\n *  @param contentIdOrNil        The unique identifier for this piece of content. Useful for finding the top shared item.\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this event.\n */\n+ (void)logShareWithMethod:(NSString * FAB_NULLABLE)shareMethodOrNil\n               contentName:(NSString * FAB_NULLABLE)contentNameOrNil\n               contentType:(NSString * FAB_NULLABLE)contentTypeOrNil\n                 contentId:(NSString * FAB_NULLABLE)contentIdOrNil\n          customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log an Invite Event to track how users are inviting other users into\n *  your application.\n *\n *  @param inviteMethodOrNil     The method of invitation, e.g. GameCenter, Twitter, email.\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase.\n */\n+ (void)logInviteWithMethod:(NSString * FAB_NULLABLE)inviteMethodOrNil\n           customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Purchase event to see your revenue in real-time, understand how many users are making purchases, see which\n *  items are most popular, and track plenty of other important purchase-related metrics.\n *\n *  @param itemPriceOrNil         The purchased item's price.\n *  @param currencyOrNil          The ISO4217 currency code. Example: USD\n *  @param purchaseSucceededOrNil Was the purchase succesful or unsuccesful\n *  @param itemNameOrNil          The human-readable form of the item's name. Example:\n *  @param itemIdOrNil            The machine-readable, unique item identifier Example: SKU\n *  @param itemTypeOrNil          The type, or genre of the item. Example: Song\n *  @param customAttributesOrNil  A dictionary of custom attributes to associate with this purchase.\n */\n+ (void)logPurchaseWithPrice:(NSDecimalNumber * FAB_NULLABLE)itemPriceOrNil\n                    currency:(NSString * FAB_NULLABLE)currencyOrNil\n                     success:(NSNumber * FAB_NULLABLE)purchaseSucceededOrNil\n                    itemName:(NSString * FAB_NULLABLE)itemNameOrNil\n                    itemType:(NSString * FAB_NULLABLE)itemTypeOrNil\n                      itemId:(NSString * FAB_NULLABLE)itemIdOrNil\n            customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Level Start Event to track where users are in your game.\n *\n *  @param levelNameOrNil        The level name\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this level start event.\n */\n+ (void)logLevelStart:(NSString * FAB_NULLABLE)levelNameOrNil\n     customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Level End event to track how users are completing levels in your game.\n *\n *  @param levelNameOrNil                 The name of the level completed, E.G. \"1\" or \"Training\"\n *  @param scoreOrNil                     The score the user completed the level with.\n *  @param levelCompletedSuccesfullyOrNil A boolean representing whether or not the level was completed succesfully.\n *  @param customAttributesOrNil          A dictionary of custom attributes to associate with this purchase.\n */\n+ (void)logLevelEnd:(NSString * FAB_NULLABLE)levelNameOrNil\n              score:(NSNumber * FAB_NULLABLE)scoreOrNil\n            success:(NSNumber * FAB_NULLABLE)levelCompletedSuccesfullyOrNil\n   customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log an Add to Cart event to see users adding items to a shopping cart in real-time, understand how\n *  many users start the purchase flow, see which items are most popular, and track plenty of other important\n *  purchase-related metrics.\n *\n *  @param itemPriceOrNil         The purchased item's price.\n *  @param currencyOrNil          The ISO4217 currency code. Example: USD\n *  @param itemNameOrNil          The human-readable form of the item's name. Example:\n *  @param itemTypeOrNil          The type, or genre of the item. Example: Song\n *  @param itemIdOrNil            The machine-readable, unique item identifier Example: SKU\n *  @param customAttributesOrNil  A dictionary of custom attributes to associate with this purchase.\n */\n+ (void)logAddToCartWithPrice:(NSDecimalNumber * FAB_NULLABLE)itemPriceOrNil\n                     currency:(NSString * FAB_NULLABLE)currencyOrNil\n                     itemName:(NSString * FAB_NULLABLE)itemNameOrNil\n                     itemType:(NSString * FAB_NULLABLE)itemTypeOrNil\n                       itemId:(NSString * FAB_NULLABLE)itemIdOrNil\n             customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Start Checkout event to see users moving through the purchase funnel in real-time, understand how many\n *  users are doing this and how much they're spending per checkout, and see how it related to other important\n *  purchase-related metrics.\n *\n *  @param totalPriceOrNil        The total price of the cart.\n *  @param currencyOrNil          The ISO4217 currency code. Example: USD\n *  @param itemCountOrNil         The number of items in the cart.\n *  @param customAttributesOrNil  A dictionary of custom attributes to associate with this purchase.\n */\n+ (void)logStartCheckoutWithPrice:(NSDecimalNumber * FAB_NULLABLE)totalPriceOrNil\n                         currency:(NSString * FAB_NULLABLE)currencyOrNil\n                         itemCount:(NSNumber * FAB_NULLABLE)itemCountOrNil\n                 customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Rating event to see users rating content within your app in real-time and understand what\n *  content is most engaging, from the type or genre down to the specific id.\n *\n *  @param ratingOrNil           The integer rating given by the user.\n *  @param contentNameOrNil      The human readable name for this piece of content.\n *  @param contentTypeOrNil      The type of content shared.\n *  @param contentIdOrNil        The unique identifier for this piece of content. Useful for finding the top shared item.\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this event.\n */\n+ (void)logRating:(NSNumber * FAB_NULLABLE)ratingOrNil\n      contentName:(NSString * FAB_NULLABLE)contentNameOrNil\n      contentType:(NSString * FAB_NULLABLE)contentTypeOrNil\n        contentId:(NSString * FAB_NULLABLE)contentIdOrNil\n customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Content View event to see users viewing content within your app in real-time and\n *  understand what content is most engaging, from the type or genre down to the specific id.\n *\n *  @param contentNameOrNil      The human readable name for this piece of content.\n *  @param contentTypeOrNil      The type of content shared.\n *  @param contentIdOrNil        The unique identifier for this piece of content. Useful for finding the top shared item.\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this event.\n */\n+ (void)logContentViewWithName:(NSString * FAB_NULLABLE)contentNameOrNil\n                   contentType:(NSString * FAB_NULLABLE)contentTypeOrNil\n                     contentId:(NSString * FAB_NULLABLE)contentIdOrNil\n              customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Search event allows you to see users searching within your app in real-time and understand\n *  exactly what they're searching for.\n *\n *  @param queryOrNil            The user's query.\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this event.\n */\n+ (void)logSearchWithQuery:(NSString * FAB_NULLABLE)queryOrNil\n          customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n/**\n *  Log a Custom Event to see user actions that are uniquely important for your app in real-time, to see how often\n *  they're performing these actions with breakdowns by different categories you add. Use a human-readable name for\n *  the name of the event, since this is how the event will appear in Answers.\n *\n *  @param eventName             The human-readable name for the event.\n *  @param customAttributesOrNil A dictionary of custom attributes to associate with this purchase. Attribute keys\n *                               must be <code>NSString</code> and and values must be <code>NSNumber</code> or <code>NSString</code>.\n *  @discussion                  How we treat <code>NSNumbers</code>:\n *                               We will provide information about the distribution of values over time.\n *\n *                               How we treat <code>NSStrings</code>:\n *                               NSStrings are used as categorical data, allowing comparison across different category values.\n *                               Strings are limited to a maximum length of 100 characters, attributes over this length will be\n *                               truncated.\n *\n *                               When tracking the Tweet views to better understand user engagement, sending the tweet's length\n *                               and the type of media present in the tweet allows you to track how tweet length and the type of media influence\n *                               engagement.\n */\n+ (void)logCustomEventWithName:(NSString *)eventName\n              customAttributes:(NSDictionary * FAB_NULLABLE)customAttributesOrNil;\n\n@end\n\nFAB_END_NONNULL\n"
  },
  {
    "path": "Crashlytics.framework/Headers/CLSLogging.h",
    "content": "//\n//  CLSLogging.h\n//  Crashlytics\n//\n//  Copyright (c) 2015 Crashlytics, Inc. All rights reserved.\n//\n#ifdef __OBJC__\n#import <Fabric/FABAttributes.h>\n#import <Foundation/Foundation.h>\n\nFAB_START_NONNULL\n#endif\n\n\n\n/**\n *\n * The CLS_LOG macro provides as easy way to gather more information in your log messages that are\n * sent with your crash data. CLS_LOG prepends your custom log message with the function name and\n * line number where the macro was used. If your app was built with the DEBUG preprocessor macro\n * defined CLS_LOG uses the CLSNSLog function which forwards your log message to NSLog and CLSLog.\n * If the DEBUG preprocessor macro is not defined CLS_LOG uses CLSLog only.\n *\n * Example output:\n * -[AppDelegate login:] line 134 $ login start\n *\n * If you would like to change this macro, create a new header file, unset our define and then define\n * your own version. Make sure this new header file is imported after the Crashlytics header file.\n *\n * #undef CLS_LOG\n * #define CLS_LOG(__FORMAT__, ...) CLSNSLog...\n *\n **/\n#ifdef __OBJC__\n#ifdef DEBUG\n#define CLS_LOG(__FORMAT__, ...) CLSNSLog((@\"%s line %d $ \" __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)\n#else\n#define CLS_LOG(__FORMAT__, ...) CLSLog((@\"%s line %d $ \" __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)\n#endif\n#endif\n\n/**\n *\n * Add logging that will be sent with your crash data. This logging will not show up in the system.log\n * and will only be visible in your Crashlytics dashboard.\n *\n **/\n\n#ifdef __OBJC__\nOBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);\nOBJC_EXTERN void CLSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0);\n\n/**\n *\n * Add logging that will be sent with your crash data. This logging will show up in the system.log\n * and your Crashlytics dashboard. It is not recommended for Release builds.\n *\n **/\nOBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);\nOBJC_EXTERN void CLSNSLogv(NSString *format, va_list ap) NS_FORMAT_FUNCTION(1,0);\n\n\nFAB_END_NONNULL\n#endif\n"
  },
  {
    "path": "Crashlytics.framework/Headers/CLSReport.h",
    "content": "//\n//  CLSReport.h\n//  Crashlytics\n//\n//  Copyright (c) 2015 Crashlytics, Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <Fabric/FABAttributes.h>\n\nFAB_START_NONNULL\n\n/**\n * The CLSCrashReport protocol is deprecated. See the CLSReport class and the CrashyticsDelegate changes for details.\n **/\n@protocol CLSCrashReport <NSObject>\n\n@property (nonatomic, copy, readonly) NSString *identifier;\n@property (nonatomic, copy, readonly) NSDictionary *customKeys;\n@property (nonatomic, copy, readonly) NSString *bundleVersion;\n@property (nonatomic, copy, readonly) NSString *bundleShortVersionString;\n@property (nonatomic, copy, readonly) NSDate *crashedOnDate;\n@property (nonatomic, copy, readonly) NSString *OSVersion;\n@property (nonatomic, copy, readonly) NSString *OSBuildVersion;\n\n@end\n\n/**\n * The CLSReport exposes an interface to the phsyical report that Crashlytics has created. You can\n * use this class to get information about the event, and can also set some values after the\n * event has occured.\n **/\n@interface CLSReport : NSObject <CLSCrashReport>\n\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n * Returns the session identifier for the report.\n **/\n@property (nonatomic, copy, readonly) NSString *identifier;\n\n/**\n * Returns the custom key value data for the report.\n **/\n@property (nonatomic, copy, readonly) NSDictionary *customKeys;\n\n/**\n * Returns the CFBundleVersion of the application that generated the report.\n **/\n@property (nonatomic, copy, readonly) NSString *bundleVersion;\n\n/**\n * Returns the CFBundleShortVersionString of the application that generated the report.\n **/\n@property (nonatomic, copy, readonly) NSString *bundleShortVersionString;\n\n/**\n * Returns the date that the report was created.\n **/\n@property (nonatomic, copy, readonly) NSDate *dateCreated;\n\n/**\n * Returns the os version that the application crashed on.\n **/\n@property (nonatomic, copy, readonly) NSString *OSVersion;\n\n/**\n * Returns the os build version that the application crashed on.\n **/\n@property (nonatomic, copy, readonly) NSString *OSBuildVersion;\n\n/**\n * Returns YES if the report contains any crash information. If the report\n * contains only NSErrors, this will return NO.\n **/\n@property (nonatomic, assign, readonly) BOOL isCrash;\n\n/**\n * You can use this method to set, after the event, additional custom keys. The rules\n * and semantics for this method are the same as those documented in Crashlytics.h. Be aware\n * that the maximum size and count of custom keys is still enforced, and you can overwrite keys\n * and/or cause excess keys to be deleted by using this method.\n **/\n- (void)setObjectValue:(id FAB_NULLABLE)value forKey:(NSString *)key;\n\n/**\n * Record an application-specific user identifier. See Crashlytics.h for details.\n **/\n@property (nonatomic, copy) NSString * FAB_NULLABLE userIdentifier;\n\n/**\n * Record a user name. See Crashlytics.h for details.\n **/\n@property (nonatomic, copy) NSString * FAB_NULLABLE userName;\n\n/**\n * Record a user email. See Crashlytics.h for details.\n **/\n@property (nonatomic, copy) NSString * FAB_NULLABLE userEmail;\n\n@end\n\nFAB_END_NONNULL\n"
  },
  {
    "path": "Crashlytics.framework/Headers/CLSStackFrame.h",
    "content": "//\n//  CLSStackFrame.h\n//  Crashlytics\n//\n//  Copyright 2015 Crashlytics, Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <Fabric/FABAttributes.h>\n\nFAB_START_NONNULL\n\n/**\n *\n * This class is used in conjunction with -[Crashlytics recordCustomExceptionName:reason:frameArray:] to\n * record information about non-ObjC/C++ exceptions. All information included here will be displayed \n * in the Crashlytics UI, and can influence crash grouping. Be particularly careful with the use of the \n * address property. If set, Crashlytics will attempt symbolication and could overwrite other properities \n * in the process.\n *\n **/\n@interface CLSStackFrame : NSObject\n\n+ (instancetype)stackFrame;\n+ (instancetype)stackFrameWithAddress:(NSUInteger)address;\n+ (instancetype)stackFrameWithSymbol:(NSString *)symbol;\n\n@property (nonatomic, copy)   NSString * FAB_NULLABLE symbol;\n@property (nonatomic, copy)   NSString * FAB_NULLABLE library;\n@property (nonatomic, copy)   NSString * FAB_NULLABLE fileName;\n@property (nonatomic, assign) uint32_t lineNumber;\n@property (nonatomic, assign) uint64_t offset;\n@property (nonatomic, assign) uint64_t address;\n\n@end\n\nFAB_END_NONNULL\n"
  },
  {
    "path": "Crashlytics.framework/Headers/Crashlytics.h",
    "content": "//\n//  Crashlytics.h\n//  Crashlytics\n//\n//  Copyright (c) 2015 Crashlytics, Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import <Fabric/FABAttributes.h>\n#import \"CLSLogging.h\"\n#import \"CLSReport.h\"\n#import \"CLSStackFrame.h\"\n#import \"Answers.h\"\n\n#define CLS_DEPRECATED(x)  __attribute__ ((deprecated(x)))\n\nFAB_START_NONNULL\n\n@protocol CrashlyticsDelegate;\n\n/**\n *  Crashlytics. Handles configuration and initialization of Crashlytics.\n */\n@interface Crashlytics : NSObject\n\n@property (nonatomic, readonly, copy) NSString *apiKey;\n@property (nonatomic, readonly, copy) NSString *version;\n@property (nonatomic, assign)         BOOL      debugMode;\n\n/**\n *\n * The delegate can be used to influence decisions on reporting and behavior, as well as reacting\n * to previous crashes.\n *\n * Make certain that the delegate is setup before starting Crashlytics with startWithAPIKey:... or\n * via +[Fabric with:...]. Failure to do will result in missing any delegate callbacks that occur\n * synchronously during start.\n *\n **/\n@property (nonatomic, assign)         id <CrashlyticsDelegate> FAB_NULLABLE delegate;\n\n/**\n *  The recommended way to install Crashlytics into your application is to place a call to +startWithAPIKey: \n *  in your -application:didFinishLaunchingWithOptions: or -applicationDidFinishLaunching:\n *  method.\n *\n *  Note: Starting with 3.0, the submission process has been significantly improved. The delay parameter\n *  is no longer required to throttle submissions on launch, performance will be great without it.\n *\n *  @param apiKey The Crashlytics API Key for this app\n *\n *  @return The singleton Crashlytics instance\n */\n+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey;\n+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey afterDelay:(NSTimeInterval)delay CLS_DEPRECATED(\"Crashlytics no longer needs or uses the delay parameter.  Please use +startWithAPIKey: instead.\");\n\n/**\n *  If you need the functionality provided by the CrashlyticsDelegate protocol, you can use\n *  these convenience methods to activate the framework and set the delegate in one call.\n *  \n *  @param apiKey   The Crashlytics API Key for this app\n *  @param delegate A delegate object which conforms to CrashlyticsDelegate.\n *\n *  @return The singleton Crashlytics instance\n */\n+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(id<CrashlyticsDelegate> FAB_NULLABLE)delegate;\n+ (Crashlytics *)startWithAPIKey:(NSString *)apiKey delegate:(id<CrashlyticsDelegate> FAB_NULLABLE)delegate afterDelay:(NSTimeInterval)delay CLS_DEPRECATED(\"Crashlytics no longer needs or uses the delay parameter.  Please use +startWithAPIKey:delegate: instead.\");\n\n/**\n *  Access the singleton Crashlytics instance.\n *\n *  @return The singleton Crashlytics instance\n */\n+ (Crashlytics *)sharedInstance;\n\n/**\n *  The easiest way to cause a crash - great for testing!\n */\n- (void)crash;\n\n/**\n *  The easiest way to cause a crash with an exception - great for testing.\n */\n- (void)throwException;\n\n/**\n *  Specify a user identifier which will be visible in the Crashlytics UI.\n *\n *  Many of our customers have requested the ability to tie crashes to specific end-users of their\n *  application in order to facilitate responses to support requests or permit the ability to reach\n *  out for more information. We allow you to specify up to three separate values for display within\n *  the Crashlytics UI - but please be mindful of your end-user's privacy.\n *\n *  We recommend specifying a user identifier - an arbitrary string that ties an end-user to a record\n *  in your system. This could be a database id, hash, or other value that is meaningless to a\n *  third-party observer but can be indexed and queried by you.\n *\n *  Optionally, you may also specify the end-user's name or username, as well as email address if you\n *  do not have a system that works well with obscured identifiers.\n *\n *  Pursuant to our EULA, this data is transferred securely throughout our system and we will not\n *  disseminate end-user data unless required to by law. That said, if you choose to provide end-user\n *  contact information, we strongly recommend that you disclose this in your application's privacy\n *  policy. Data privacy is of our utmost concern.\n *\n *  @param identifier An arbitrary user identifier string which ties an end-user to a record in your system.\n */\n- (void)setUserIdentifier:(NSString * FAB_NULLABLE)identifier;\n\n/**\n *  Specify a user name which will be visible in the Crashlytics UI.\n *  Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs.\n *  @see setUserIdentifier:\n *\n *  @param name An end user's name.\n */\n- (void)setUserName:(NSString * FAB_NULLABLE)name;\n\n/**\n *  Specify a user email which will be visible in the Crashlytics UI.\n *  Please be mindful of your end-user's privacy and see if setUserIdentifier: can fulfil your needs.\n *  \n *  @see setUserIdentifier:\n *\n *  @param email An end user's email address.\n */\n- (void)setUserEmail:(NSString * FAB_NULLABLE)email;\n\n+ (void)setUserIdentifier:(NSString * FAB_NULLABLE)identifier CLS_DEPRECATED(\"Please access this method via +sharedInstance\");\n+ (void)setUserName:(NSString * FAB_NULLABLE)name CLS_DEPRECATED(\"Please access this method via +sharedInstance\");\n+ (void)setUserEmail:(NSString * FAB_NULLABLE)email CLS_DEPRECATED(\"Please access this method via +sharedInstance\");\n\n/**\n *  Set a value for a for a key to be associated with your crash data which will be visible in the Crashlytics UI.\n *  When setting an object value, the object is converted to a string. This is typically done by calling \n *  -[NSObject description].\n *\n *  @param value The object to be associated with the key\n *  @param key   The key with which to associate the value\n */\n- (void)setObjectValue:(id FAB_NULLABLE)value forKey:(NSString *)key;\n\n/**\n *  Set an int value for a key to be associated with your crash data which will be visible in the Crashlytics UI.\n *\n *  @param value The integer value to be set\n *  @param key   The key with which to associate the value\n */\n- (void)setIntValue:(int)value forKey:(NSString *)key;\n\n/**\n *  Set an BOOL value for a key to be associated with your crash data which will be visible in the Crashlytics UI.\n *\n *  @param value The BOOL value to be set\n *  @param key   The key with which to associate the value\n */\n- (void)setBoolValue:(BOOL)value forKey:(NSString *)key;\n\n/**\n *  Set an float value for a key to be associated with your crash data which will be visible in the Crashlytics UI.\n *\n *  @param value The float value to be set\n *  @param key   The key with which to associate the value\n */\n- (void)setFloatValue:(float)value forKey:(NSString *)key;\n\n+ (void)setObjectValue:(id FAB_NULLABLE)value forKey:(NSString *)key CLS_DEPRECATED(\"Please access this method via +sharedInstance\");\n+ (void)setIntValue:(int)value forKey:(NSString *)key CLS_DEPRECATED(\"Please access this method via +sharedInstance\");\n+ (void)setBoolValue:(BOOL)value forKey:(NSString *)key CLS_DEPRECATED(\"Please access this method via +sharedInstance\");\n+ (void)setFloatValue:(float)value forKey:(NSString *)key CLS_DEPRECATED(\"Please access this method via +sharedInstance\");\n\n/**\n *  This method can be used to record a single exception structure in a report. This is particularly useful\n *  when your code interacts with non-native languages like Lua, C#, or Javascript. This call can be\n *  expensive and should only be used shortly before process termination. This API is not intended be to used\n *  to log NSException objects. All safely-reportable NSExceptions are automatically captured by\n *  Crashlytics.\n *\n *  @param name       The name of the custom exception\n *  @param reason     The reason this exception occured\n *  @param frameArray An array of CLSStackFrame objects\n */\n- (void)recordCustomExceptionName:(NSString *)name reason:(NSString * FAB_NULLABLE)reason frameArray:(NSArray *)frameArray;\n\n\n\n\n- (void)logEvent:(NSString *)eventName CLS_DEPRECATED(\"Please refer to Answers +logCustomEventWithName:\");\n- (void)logEvent:(NSString *)eventName attributes:(NSDictionary * FAB_NULLABLE) attributes CLS_DEPRECATED(\"Please refer to Answers +logCustomEventWithName:\");\n+ (void)logEvent:(NSString *)eventName CLS_DEPRECATED(\"Please refer to Answers +logCustomEventWithName:\");\n+ (void)logEvent:(NSString *)eventName attributes:(NSDictionary * FAB_NULLABLE) attributes CLS_DEPRECATED(\"Please refer to Answers +logCustomEventWithName:\");\n@end\n\n/**\n *\n * The CrashlyticsDelegate protocol provides a mechanism for your application to take\n * action on events that occur in the Crashlytics crash reporting system.  You can make\n * use of these calls by assigning an object to the Crashlytics' delegate property directly,\n * or through the convenience +startWithAPIKey:delegate: method.\n *\n */\n@protocol CrashlyticsDelegate <NSObject>\n@optional\n\n\n- (void)crashlyticsDidDetectCrashDuringPreviousExecution:(Crashlytics *)crashlytics CLS_DEPRECATED(\"Please refer to -crashlyticsDidDetectReportForLastExecution:\");\n- (void)crashlytics:(Crashlytics *)crashlytics didDetectCrashDuringPreviousExecution:(id <CLSCrashReport>)crash CLS_DEPRECATED(\"Please refer to -crashlyticsDidDetectReportForLastExecution:\");\n\n/**\n *\n *  Called when a Crashlytics instance has determined that the last execution of the\n *  application ended in a crash.  This is called synchronously on Crashlytics\n *  initialization. Your delegate must invoke the completionHandler, but does not need to do so\n *  synchronously, or even on the main thread. Invoking completionHandler with NO will cause the\n *  detected report to be deleted and not submitted to Crashlytics. This is useful for\n *  implementing permission prompts, or other more-complex forms of logic around submitting crashes.\n *\n *  @warning Failure to invoke the completionHandler will prevent submissions from being reported. Watch out.\n *\n *  @warning Just implementing this delegate method will disable all forms of synchronous report submission. This can\n *           impact the reliability of reporting crashes very early in application launch.\n *\n *  @param report            The CLSReport object representing the last detected crash\n *  @param completionHandler The completion handler to call when your logic has completed.\n *\n */\n- (void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler;\n\n/**\n *  If your app is running on an OS that supports it (OS X 10.9+, iOS 7.0+), Crashlytics will submit\n *  most reports using out-of-process background networking operations. This results in a significant\n *  improvement in reliability of reporting, as well as power and performance wins for your users.\n *  If you don't want this functionality, you can disable by returning NO from this method.\n *\n *  @warning Background submission is not supported for extensions on iOS or OS X.\n *\n *  @param crashlytics The Crashlytics singleton instance\n *\n *  @return Return NO if you don't want out-of-process background network operations.\n *\n */\n- (BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics;\n\n@end\n\n/**\n *  `CrashlyticsKit` can be used as a parameter to `[Fabric with:@[CrashlyticsKit]];` in Objective-C. In Swift, use Crashlytics.sharedInstance()\n */\n#define CrashlyticsKit [Crashlytics sharedInstance]\n\nFAB_END_NONNULL\n"
  },
  {
    "path": "Crashlytics.framework/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildMachineOSBuild</key>\n\t<string>14E46</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Crashlytics</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.twitter.crashlytics.ios</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Crashlytics</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>3.1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>iPhoneOS</string>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>65</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>12H141</string>\n\t<key>DTPlatformName</key>\n\t<string>iphoneos</string>\n\t<key>DTPlatformVersion</key>\n\t<string>8.4</string>\n\t<key>DTSDKBuild</key>\n\t<string>12H141</string>\n\t<key>DTSDKName</key>\n\t<string>iphoneos8.4</string>\n\t<key>DTXcode</key>\n\t<string>0640</string>\n\t<key>DTXcodeBuild</key>\n\t<string>6E35b</string>\n\t<key>MinimumOSVersion</key>\n\t<string>5.0</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2015 Crashlytics, Inc. All rights reserved.</string>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Crashlytics.framework/Modules/module.modulemap",
    "content": "framework module Crashlytics {\n    header \"Crashlytics.h\"\n    header \"Answers.h\"\n    header \"CLSLogging.h\"\n    header \"CLSReport.h\"\n    header \"CLSStackFrame.h\"\n\n    export *\n\n    link \"z\"\n    link \"c++\"\n}\n"
  },
  {
    "path": "Fabric.framework/Headers/FABAttributes.h",
    "content": "//\n//  FABAttributes.h\n//  Fabric\n//\n//  Created by Priyanka Joshi on 3/3/15.\n//  Copyright (c) 2015 Twitter. All rights reserved.\n//\n\n#pragma once\n\n#define FAB_UNAVAILABLE(x) __attribute__((unavailable(x)))\n\n#if __has_feature(nullability)\n#define FAB_NONNULL __nonnull\n#define FAB_NULLABLE __nullable\n#define FAB_START_NONNULL _Pragma(\"clang assume_nonnull begin\")\n#define FAB_END_NONNULL _Pragma(\"clang assume_nonnull end\")\n#else\n#define FAB_NONNULL\n#define FAB_NULLABLE\n#define FAB_START_NONNULL\n#define FAB_END_NONNULL\n#endif\n"
  },
  {
    "path": "Fabric.framework/Headers/Fabric.h",
    "content": "//\n//  Fabric.h\n//\n//  Copyright (c) 2014 Twitter. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"FABAttributes.h\"\n\nFAB_START_NONNULL\n\n/**\n *  Fabric Base. Coordinates configuration and starts all provided kits.\n */\n@interface Fabric : NSObject\n\n/**\n *  Initialize Fabric and all provided kits. Call this method within your App Delegate's\n *  `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use.\n *\n *  For example, in Objective-C:\n *\n *      `[Fabric with:@[TwitterKit, CrashlyticsKit, MoPubKit]];`\n *\n *  Swift:\n *\n *      `Fabric.with([Twitter(), Crashlytics(), MoPub()])`\n *  \n *  Only the first call to this method is honored. Subsequent calls are no-ops.\n *\n *  @param kits An array of kit instances. Kits may provide a macro such as CrashlyticsKit which can be passed in as array elements in objective-c.\n *\n *  @return Returns the shared Fabric instance. In most cases this can be ignored.\n */\n+ (instancetype)with:(NSArray *)kits;\n\n/**\n *  Returns the Fabric singleton object.\n */\n+ (instancetype)sharedSDK;\n\n/**\n *  This BOOL enables or disables debug logging, such as kit version information. The default value is NO.\n */\n@property (nonatomic, assign) BOOL debug;\n\n/**\n *  Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance.\n */\n- (id)init FAB_UNAVAILABLE(\"Use +sharedSDK to retrieve the shared Fabric instance.\");\n\n/**\n *  Returns Fabrics's instance of the specified kit.\n *\n *  @param klass The class of the kit.\n *\n *  @return The kit instance of class klass which was provided to with: or nil.\n */\n- (id FAB_NULLABLE)kitForClass:(Class)klass;\n\n/**\n *  Returns a dictionary containing the kit configuration info for the provided kit.\n *  The configuration information is parsed from the application's Info.plist. This\n *  method is primarily intended to be used by kits to retrieve their configuration.\n *\n *  @param kitInstance An instance of the kit whose configuration should be returned.\n *\n *  @return A dictionary containing kit specific configuration information or nil if none exists.\n */\n- (NSDictionary * FAB_NULLABLE)configurationDictionaryForKit:(id)kitInstance;\n\n@end\n\nFAB_END_NONNULL\n\n"
  },
  {
    "path": "Fabric.framework/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>BuildMachineOSBuild</key>\n\t<string>13F34</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Fabric</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>io.fabric.sdk.ios</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Fabric</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.2.8</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleSupportedPlatforms</key>\n\t<array>\n\t\t<string>iPhoneOS</string>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>20</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>12B411</string>\n\t<key>DTPlatformName</key>\n\t<string>iphoneos</string>\n\t<key>DTPlatformVersion</key>\n\t<string>8.1</string>\n\t<key>DTSDKBuild</key>\n\t<string>12B411</string>\n\t<key>DTSDKName</key>\n\t<string>iphoneos8.1</string>\n\t<key>DTXcode</key>\n\t<string>0611</string>\n\t<key>DTXcodeBuild</key>\n\t<string>6A2008a</string>\n\t<key>MinimumOSVersion</key>\n\t<string>5.0</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2015 Twitter. All rights reserved.</string>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Fabric.framework/Modules/module.modulemap",
    "content": "framework module Fabric {\n    umbrella header \"Fabric.h\"\n\n    export *\n    module * { export * }\n}"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Shuai Liu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# ![logo](./demos/logo.png)\n\nIt's a project made while I'm learning Swift. The data is fetched from [http://gank.io/](http://gank.io/) by [@daimajia](https://github.com/daimajia).\n\nAPI of gank.io: [http://gank.io/api](http://gank.io/api).\n\n~~I get the image by parsing the HTML, but you can use its [API](http://gank.io/api) now.~~\n\n### Demo\n\n![demo](./demos/demo.png)\n\n### Keywords\n\n* [Carthage](https://github.com/Carthage/Carthage)\n* [Alamofire](https://github.com/Alamofire/Alamofire)\n* [Kingfisher](https://github.com/onevcat/Kingfisher)\n* ~~[CHTCollectionViewWaterfallLayout](https://github.com/chiahsien/CHTCollectionViewWaterfallLayout)~~\n* `UIBlurEffect`\n* Sketch\n\n### License\n\nThe MIT (buy me coffee by alipay) License (MIT)\n\n![donate](http://7xjdjy.com1.z0.glb.clouddn.com/donate.png)\n"
  },
  {
    "path": "beauties/AboutViewController.swift",
    "content": "//\n//  AboutViewController.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/8/6.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\nclass AboutViewController: UIViewController {\n    @IBOutlet weak var linkLabel: UILabel!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        linkLabel.textColor = UIColor(red: 65.0 / 255.0, green: 131.0 / 255.0, blue: 196.0 / 255.0, alpha: 1)\n        \n        let tapGesture = UITapGestureRecognizer(target: self, action: \"gotoURL\")\n        linkLabel.addGestureRecognizer(tapGesture)\n    }\n    \n    func gotoURL() {\n        let url = NSURL(string: linkLabel.text!)!\n        UIApplication.sharedApplication().openURL(url)\n    }\n}"
  },
  {
    "path": "beauties/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/6/27.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport UIKit\nimport Fabric\nimport Crashlytics\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n        // Override point for customization after application launch.\n        Fabric.with([Crashlytics()])\n        UITabBar.appearance().tintColor = ThemeColor\n        UINavigationBar.appearance().tintColor = ThemeColor\n        UITableViewCell.appearance().tintColor = ThemeColor\n        return true\n    }\n\n    func applicationWillResignActive(application: UIApplication) {\n        // 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.\n        // 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.\n    }\n\n    func applicationDidEnterBackground(application: UIApplication) {\n        // 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.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(application: UIApplication) {\n        // 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.\n    }\n\n    func applicationDidBecomeActive(application: UIApplication) {\n        // 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.\n    }\n\n    func applicationWillTerminate(application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n\n\n}\n\n"
  },
  {
    "path": "beauties/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7706\" systemVersion=\"14E46\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7703\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"  Copyright (c) 2015 liushuaikobe. All rights reserved.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"20.5\"/>\n                    <fontDescription key=\"fontDescription\" name=\"HelveticaNeue\" family=\"Helvetica Neue\" pointSize=\"17\"/>\n                    <color key=\"textColor\" red=\"0.80000000000000004\" green=\"0.80000000000000004\" blue=\"0.80000000000000004\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"logo.png\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8t0-OE-jVV\">\n                    <rect key=\"frame\" x=\"150\" y=\"157\" width=\"180\" height=\"165\"/>\n                </imageView>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8t0-OE-jVV\" secondAttribute=\"centerX\" id=\"OdC-fi-Ifc\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstAttribute=\"centerY\" secondItem=\"8t0-OE-jVV\" secondAttribute=\"centerY\" id=\"yiN-ej-bHb\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"logo.png\" width=\"180\" height=\"165\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "beauties/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"7706\" systemVersion=\"14E46\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"f3g-TE-CM5\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7703\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n    </dependencies>\n    <scenes>\n        <!--history-->\n        <scene sceneID=\"Guh-Yq-BQM\">\n            <objects>\n                <viewController id=\"CE2-oN-1xj\" userLabel=\"history\" customClass=\"HistoryViewController\" customModule=\"beauty\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"iac-hu-QWX\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"t4e-U6-Oqc\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"CRR-3b-xCd\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <tabBarItem key=\"tabBarItem\" title=\"历史\" image=\"history.png\" id=\"qCa-Hh-075\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"9l2-27-NFO\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"379\" y=\"890\"/>\n        </scene>\n        <!--today-->\n        <scene sceneID=\"KQF-6M-nYb\">\n            <objects>\n                <viewController id=\"6RE-QU-fnl\" userLabel=\"today\" customClass=\"TodayViewController\" customModule=\"beauty\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"NSn-vb-60y\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"LyU-qX-8m3\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Mge-rp-nrR\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <tabBarItem key=\"tabBarItem\" title=\"最新\" image=\"today.png\" id=\"zcd-Ld-Ddf\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"oR5-js-MCN\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"69\" y=\"110\"/>\n        </scene>\n        <!--Tab Bar Controller-->\n        <scene sceneID=\"lho-j8-KAk\">\n            <objects>\n                <tabBarController id=\"f3g-TE-CM5\" sceneMemberID=\"viewController\">\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <tabBar key=\"tabBar\" contentMode=\"scaleToFill\" id=\"Pfh-BQ-2IY\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"49\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    </tabBar>\n                    <connections>\n                        <segue destination=\"6RE-QU-fnl\" kind=\"relationship\" relationship=\"viewControllers\" id=\"Bp1-vw-Ue5\"/>\n                        <segue destination=\"CE2-oN-1xj\" kind=\"relationship\" relationship=\"viewControllers\" id=\"jYy-G6-vab\"/>\n                        <segue destination=\"Zmb-fx-dAR\" kind=\"relationship\" relationship=\"viewControllers\" id=\"mIs-3O-kXj\"/>\n                    </connections>\n                </tabBarController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"aXY-SI-6mm\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-1819\" y=\"326\"/>\n        </scene>\n        <!--更多-->\n        <scene sceneID=\"tkG-C3-IY6\">\n            <objects>\n                <tableViewController title=\"更多\" id=\"cB3-XF-lPP\" userLabel=\"更多\" customClass=\"MoreViewController\" customModule=\"beauty\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"60\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"0kq-6A-vVV\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <sections>\n                            <tableViewSection id=\"imT-BV-hDX\">\n                                <cells>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" textLabel=\"IyD-cQ-5Pn\" style=\"IBUITableViewCellStyleDefault\" id=\"nkX-lm-eY8\">\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"nkX-lm-eY8\" id=\"aLq-Qa-h0J\">\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"去App Store评分\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"IyD-cQ-5Pn\">\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"detailDisclosureButton\" indentationWidth=\"10\" textLabel=\"GPH-Sm-jmK\" style=\"IBUITableViewCellStyleDefault\" id=\"z0X-uv-s3E\">\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"z0X-uv-s3E\" id=\"QFI-35-1d8\">\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"关于\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"GPH-Sm-jmK\">\n                                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                        <connections>\n                                            <segue destination=\"UUY-7P-pQR\" kind=\"show\" id=\"VRl-iG-6az\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"cB3-XF-lPP\" id=\"QW7-Hu-VxZ\"/>\n                            <outlet property=\"delegate\" destination=\"cB3-XF-lPP\" id=\"LqC-Iz-eYc\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"更多\" id=\"zxj-2Z-pAB\" userLabel=\"Beauties\"/>\n                    <connections>\n                        <outlet property=\"appStoreCell\" destination=\"nkX-lm-eY8\" id=\"Yr6-88-Phn\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"eyf-31-Jbi\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"561\" y=\"-780\"/>\n        </scene>\n        <!--关于-->\n        <scene sceneID=\"JCH-W7-JL4\">\n            <objects>\n                <viewController title=\"关于\" id=\"UUY-7P-pQR\" customClass=\"AboutViewController\" customModule=\"beauty\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"xSj-2v-BTi\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"MV8-WU-oOQ\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Cc0-Fd-P2Q\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"http://gank.io\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TNv-ke-QKS\">\n                                <rect key=\"frame\" x=\"248.5\" y=\"290.5\" width=\"102\" height=\"20\"/>\n                                <fontDescription key=\"fontDescription\" name=\"HelveticaNeue\" family=\"Helvetica Neue\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.40000000000000002\" green=\"0.40000000000000002\" blue=\"0.40000000000000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"created by @liushuaikobe\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"alL-Kv-twl\">\n                                <rect key=\"frame\" x=\"210\" y=\"500\" width=\"180\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" name=\"HelveticaNeue-Thin\" family=\"Helvetica Neue\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.59999999999999998\" green=\"0.59999999999999998\" blue=\"0.59999999999999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"logo.png\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fcH-Nq-hGh\">\n                                <rect key=\"frame\" x=\"210\" y=\"50\" width=\"180\" height=\"165\"/>\n                            </imageView>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Data Source &amp; Thanks to\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MYx-zE-nds\">\n                                <rect key=\"frame\" x=\"205\" y=\"250\" width=\"189.5\" height=\"20\"/>\n                                <fontDescription key=\"fontDescription\" name=\"HelveticaNeue\" family=\"Helvetica Neue\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.40000000000000002\" green=\"0.40000000000000002\" blue=\"0.40000000000000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"alL-Kv-twl\" secondAttribute=\"centerX\" id=\"7II-2C-m9E\"/>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"MYx-zE-nds\" secondAttribute=\"centerX\" id=\"Bgj-iE-9R6\"/>\n                            <constraint firstAttribute=\"centerY\" secondItem=\"TNv-ke-QKS\" secondAttribute=\"centerY\" id=\"LnR-lY-41D\"/>\n                            <constraint firstItem=\"fcH-Nq-hGh\" firstAttribute=\"top\" secondItem=\"Cc0-Fd-P2Q\" secondAttribute=\"topMargin\" constant=\"50\" id=\"Nzt-av-Zmx\"/>\n                            <constraint firstItem=\"MV8-WU-oOQ\" firstAttribute=\"top\" secondItem=\"alL-Kv-twl\" secondAttribute=\"bottom\" constant=\"30\" id=\"PP1-sQ-g7V\"/>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"fcH-Nq-hGh\" secondAttribute=\"centerX\" id=\"QFR-zc-KTO\"/>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"TNv-ke-QKS\" secondAttribute=\"centerX\" id=\"eY2-JZ-7uV\"/>\n                            <constraint firstItem=\"TNv-ke-QKS\" firstAttribute=\"top\" secondItem=\"MYx-zE-nds\" secondAttribute=\"bottom\" constant=\"20\" id=\"wtg-Dh-eUP\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"linkLabel\" destination=\"TNv-ke-QKS\" id=\"7k6-Lj-R2q\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"AAO-Ug-dnO\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1390\" y=\"-758\"/>\n        </scene>\n        <!--更多-->\n        <scene sceneID=\"muH-06-aGi\">\n            <objects>\n                <navigationController id=\"Zmb-fx-dAR\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"更多\" image=\"setting.png\" id=\"eVT-co-0XM\"/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"yv1-L8-jHj\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"cB3-XF-lPP\" kind=\"relationship\" relationship=\"rootViewController\" id=\"eVs-SD-9IV\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Lqb-7v-A4J\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-443\" y=\"-662\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"history.png\" width=\"30\" height=\"30\"/>\n        <image name=\"logo.png\" width=\"180\" height=\"165\"/>\n        <image name=\"setting.png\" width=\"30\" height=\"30\"/>\n        <image name=\"today.png\" width=\"30\" height=\"30\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "beauties/BeautyCollectionViewCell.swift",
    "content": "//\n//  BeautyCollectionViewCell.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/7/1.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\nimport Kingfisher\n\nclass BeautyCollectionViewCell: UICollectionViewCell {\n    \n    var imageView: UIImageView\n    \n    override init(frame: CGRect) {\n        imageView = UIImageView()\n        super.init(frame: frame)\n        commonInit()\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        imageView = UIImageView()\n        super.init(coder: aDecoder)\n        commonInit()\n    }\n    \n    override func prepareForReuse() {\n        super.prepareForReuse()\n        self.imageView.alpha = 0\n    }\n    \n    func commonInit() -> Void {\n        self.clipsToBounds = false\n        self.layer.borderWidth = 10\n        self.layer.borderColor = UIColor.whiteColor().CGColor\n        self.layer.shadowColor = UIColor(red: 187 / 255.0, green: 187 / 255.0, blue: 187 / 255.0, alpha: 1).CGColor\n        self.layer.shadowOpacity = 0.5\n        self.layer.shadowOffset = CGSizeMake(2, 6)\n        \n        self.imageView.clipsToBounds = true\n        self.imageView.frame = self.bounds\n        self.imageView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]\n        self.imageView.contentMode = .ScaleAspectFill\n        self.addSubview(self.imageView)\n    }\n    \n    func bindData(entity: BeautyImageEntity) -> Void {\n        \n        if let urlString = entity.imageUrl {\n            if let url = NSURL(string: urlString) {\n                self.imageView.kf_setImageWithURL(url, placeholderImage: nil, optionsInfo: nil, completionHandler: {\n                    [weak self](image, error, cacheType, imageURL) -> () in\n                    UIView.animateWithDuration(0.5, delay: 0, options: .CurveEaseIn, animations: { () -> Void in\n                        self?.imageView.alpha = 1\n                        }, completion: nil)\n                })\n            }\n        }\n    }\n}"
  },
  {
    "path": "beauties/BeautyCollectionViewFooter.swift",
    "content": "//\n//  BeautyCollectionViewFooter.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/8/5.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\nclass BeautyCollectionViewFooter: UICollectionReusableView {\n    \n    var loadingIndicator: UIActivityIndicatorView\n    \n    override init(frame: CGRect) {\n        loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: .Gray)\n        super.init(frame: frame)\n        self.commonInit()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: .Gray)\n        super.init(coder: aDecoder)\n        self.commonInit()\n    }\n    \n    private func commonInit() {\n        self.addSubview(loadingIndicator)\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        self.loadingIndicator.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds))\n    }\n    \n    func startAnimating() {\n        self.loadingIndicator.startAnimating()\n    }\n    \n    func stopAnimating() {\n        self.loadingIndicator.stopAnimating()\n    }\n}"
  },
  {
    "path": "beauties/BeautyImageEntity.swift",
    "content": "//\n//  BeautyImageEntity.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/6/30.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\n\nclass BeautyImageEntity: NSObject, NSCoding {\n    var imageUrl: String?\n    var imageHeight: Int?\n    var imageWidth: Int?\n    \n    override var description: String {\n        return \"imageUrl: \\(self.imageUrl), imageHeight: \\(self.imageHeight), imageWidth: \\(self.imageWidth)\"\n    }\n    \n    override init() {\n        \n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        imageUrl = aDecoder.decodeObjectForKey(\"imageUrl\") as? String\n        imageHeight = aDecoder.decodeObjectForKey(\"imageHeight\") as? Int\n        imageWidth = aDecoder.decodeObjectForKey(\"imageWidth\") as? Int\n    }\n    \n    func encodeWithCoder(aCoder: NSCoder) {\n        if imageUrl != nil {\n            aCoder.encodeObject(imageUrl, forKey: \"imageUrl\")\n        }\n        if imageHeight != nil {\n            aCoder.encodeObject(imageHeight, forKey: \"imageHeight\")\n        }\n        if imageWidth != nil {\n            aCoder.encodeObject(imageWidth, forKey: \"imageWidth\")\n        }\n    }\n}"
  },
  {
    "path": "beauties/BlurView.swift",
    "content": "//\n//  BlurView.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/7/1.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\nextension UIView {\n    func applyBlurEffect() -> Void {\n        let blurEffect = UIBlurEffect(style: .Light)\n        let visualEffectView = UIVisualEffectView(effect: blurEffect)\n        visualEffectView.frame = self.bounds\n        self.addSubview(visualEffectView)\n    }\n}"
  },
  {
    "path": "beauties/HistoryViewController.swift",
    "content": "//\n//  HistoryViewController.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/7/1.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\nclass HistoryViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate, UICollectionViewDataSource, UIScrollViewDelegate {\n    \n    // ---------------- Views\n    var beautyCollectionView: UICollectionView!\n    var refreshControl: UIRefreshControl!\n    // ---------------- Data\n    var beauties: [BeautyImageEntity]\n    let sharedMargin = 10\n    var page = 1\n    var isLoadingNow = false\n    \n    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {\n        beauties = []\n        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        beauties = []\n        super.init(coder: aDecoder)\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        self.view.backgroundColor = ThemeColor\n        self.edgesForExtendedLayout = .None\n        self.automaticallyAdjustsScrollViewInsets = true\n        \n        let statusBarHeight: CGFloat = 20\n        \n        let collectionViewLayout = UICollectionViewFlowLayout()\n        collectionViewLayout.itemSize = CGSizeMake((CGRectGetWidth(self.view.bounds) - 10 * 3) / 2, 200)\n        collectionViewLayout.minimumLineSpacing = 10\n        collectionViewLayout.minimumInteritemSpacing = 10\n        collectionViewLayout.sectionInset = UIEdgeInsetsMake(0, 10, CGRectGetHeight(self.tabBarController!.tabBar.frame) + statusBarHeight + 10, 10)\n        \n        var frame = self.view.bounds\n        frame.origin.y += statusBarHeight\n        self.beautyCollectionView = UICollectionView(frame: frame, collectionViewLayout: collectionViewLayout)\n        self.beautyCollectionView.alwaysBounceVertical = true\n        self.beautyCollectionView.backgroundColor = UIColor.clearColor()\n        self.beautyCollectionView.collectionViewLayout = collectionViewLayout\n        self.beautyCollectionView.delegate = self\n        self.beautyCollectionView.dataSource = self\n        self.beautyCollectionView.registerClass(BeautyCollectionViewCell.self, forCellWithReuseIdentifier: \"BeautyCollectionViewCell\")\n        self.beautyCollectionView.registerClass(BeautyCollectionViewFooter.self, forSupplementaryViewOfKind:UICollectionElementKindSectionFooter, withReuseIdentifier: \"BeautyCollectionViewFoooter\")\n        self.view.addSubview(self.beautyCollectionView!)\n        \n        self.refreshControl = UIRefreshControl()\n        self.refreshControl.addTarget(self, action: Selector(\"refreshData\"), forControlEvents: .ValueChanged)\n        self.beautyCollectionView.addSubview(self.refreshControl)\n        \n        // start loading data\n        self.refreshData()\n    }\n    \n    // MARK: fetch DATA\n    \n    func refreshData() {\n        page = 1\n        self.beauties.removeAll(keepCapacity: false)\n        self.fetchNextPage(page)\n    }\n    \n    func fetchNextPage(page: Int) {\n        if (self.page > BeautyDateUtil.MAX_PAGE) {\n            return\n        }\n        if (self.isLoadingNow) {\n            return\n        }\n        \n        self.isLoadingNow = true\n        print(\"---------- Starting Page \\(page) ----------\")\n        \n        NetworkUtil.getBeauties(page) {\n            [weak self] result, error in\n            print(\"---------- Finished Page \\(page) ----------\")\n            \n            if let sself = self {\n                \n                sself.isLoadingNow = false\n                sself.refreshControl.endRefreshing()\n                \n                if error == nil {\n                    sself.page += 1\n                    sself.beauties += result.map(sself.buildEntityWithURLString)\n                    sself.setBGI()\n                    sself.beautyCollectionView.reloadData()\n                }\n            }\n        }\n    }\n    \n    // set Blur Background Image\n    func setBGI() {\n        if self.beauties.count == 0 {\n            return\n        }\n        let beautyEntity = self.beauties[0]\n        \n        let bgi = UIImageView(frame: self.view.bounds)\n        bgi.contentMode = .ScaleToFill\n        self.view.addSubview(bgi)\n        self.view.sendSubviewToBack(bgi)\n        \n        bgi.kf_setImageWithURL(NSURL(string: beautyEntity.imageUrl!)!, placeholderImage: nil, optionsInfo: nil) {\n            image, error, cacheType, imageURL in\n            bgi.applyBlurEffect()\n        }\n    }\n    \n    func buildEntityWithURLString(url: String) -> BeautyImageEntity {\n        let b = BeautyImageEntity()\n        b.imageUrl = url\n        return b\n    }\n    \n    // MARK: UIScrollViewDelegate\n    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {\n        if (scrollView.contentOffset.y + CGRectGetHeight(scrollView.bounds) > scrollView.contentSize.height) {\n            self.fetchNextPage(self.page)\n        }\n    }\n    \n    // MARK: UICollectionViewDataSource\n    \n    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return beauties.count\n    }\n    \n    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {\n        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(\"BeautyCollectionViewCell\", forIndexPath: indexPath) as! BeautyCollectionViewCell\n        if (indexPath.row < beauties.count) {\n            let entity = beauties[indexPath.row]\n            cell.bindData(entity)\n        }\n        return cell\n    }\n    \n    func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {\n        let footer: BeautyCollectionViewFooter = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: \"BeautyCollectionViewFoooter\", forIndexPath: indexPath) as! BeautyCollectionViewFooter\n        if (kind == UICollectionElementKindSectionFooter) {\n            footer.startAnimating()\n        }\n        return footer\n    }\n    \n    // MARK: UICollectionViewDelegate\n    \n    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {\n        if (indexPath.row < self.beauties.count) {\n            let entity = self.beauties[indexPath.row]\n            let todayViewController = TodayViewController()\n            todayViewController.todayBeauty = entity\n            todayViewController.canBeClosed = true\n            self.presentViewController(todayViewController, animated: true, completion: nil)\n        }\n    }\n    \n    // MARK: UICollectionViewDelegateFlowLayout\n    \n    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {\n        if page >= BeautyDateUtil.MAX_PAGE {\n            return CGSizeZero\n        } else {\n            return CGSizeMake(CGRectGetWidth(collectionView.bounds), 50)\n        }\n    }\n}"
  },
  {
    "path": "beauties/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "beauties/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>美妹</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>Fabric</key>\n\t<dict>\n\t\t<key>APIKey</key>\n\t\t<string>5b6d196a58f4acbc481f40758c365e9b14ae8732</string>\n\t\t<key>Kits</key>\n\t\t<array>\n\t\t\t<dict>\n\t\t\t\t<key>KitInfo</key>\n\t\t\t\t<dict/>\n\t\t\t\t<key>KitName</key>\n\t\t\t\t<string>Crashlytics</string>\n\t\t\t</dict>\n\t\t</array>\n\t</dict>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "beauties/MoreViewController.swift",
    "content": "//\n//  MoreViewController.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/8/3.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\n\nclass MoreViewController: UITableViewController {\n    \n    var logoImage: UIImageView!\n    \n    @IBOutlet weak var appStoreCell: UITableViewCell!\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        self.tableView.tableFooterView = UIView()\n        \n        logoImage = UIImageView(image: UIImage(named: \"logo.png\"))\n        logoImage.backgroundColor = UIColor.clearColor()\n        logoImage.contentMode = .ScaleAspectFit\n        self.view.addSubview(logoImage)\n        self.view.bringSubviewToFront(logoImage)\n    }\n    \n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        logoImage.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetHeight(self.view.bounds) - 200 - CGRectGetMinY(logoImage.bounds))\n        var frame = logoImage.frame\n        frame.size = CGSizeMake(120, 110)\n        logoImage.frame = frame\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        if let clickedCell = tableView.cellForRowAtIndexPath(indexPath) {\n            if clickedCell == appStoreCell {\n                let appURL = NSURL(string: \"itms-apps://itunes.apple.com/app/1033020551\")!\n                UIApplication.sharedApplication().openURL(appURL)\n            }\n        }\n    }\n}"
  },
  {
    "path": "beauties/TodayViewController.swift",
    "content": "//\n//  ViewController.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/6/27.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\nimport Kingfisher\n\nclass TodayViewController: UIViewController {\n\n    var beautyImageView: UIImageView!\n    var loadingIndicator: UIActivityIndicatorView!\n    \n    var todayBeauty: BeautyImageEntity?\n    var canBeClosed: Bool\n    \n    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {\n        canBeClosed = false\n        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        canBeClosed = false\n        super.init(coder: aDecoder)\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        self.view.backgroundColor = ThemeColor\n        self.edgesForExtendedLayout = .None\n        \n        loadingIndicator = UIActivityIndicatorView(activityIndicatorStyle: .Gray)\n        loadingIndicator.hidesWhenStopped = true\n        self.view.addSubview(loadingIndicator)\n        loadingIndicator.startAnimating()\n        \n        beautyImageView = UIImageView(frame: self.view.bounds)\n        beautyImageView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]\n        beautyImageView.contentMode = .ScaleAspectFit\n        beautyImageView.userInteractionEnabled = true\n        beautyImageView.backgroundColor = UIColor.clearColor()\n        self.view.addSubview(beautyImageView)\n        \n        if canBeClosed {\n            let swipeGesture = UISwipeGestureRecognizer(target: self, action: \"onSwipe:\")\n            swipeGesture.direction = UISwipeGestureRecognizerDirection.Down\n            beautyImageView.addGestureRecognizer(swipeGesture)\n            \n            let tapGesture = UITapGestureRecognizer(target: self, action: \"onSwipe:\")\n            beautyImageView.addGestureRecognizer(tapGesture)\n        }\n        \n        let longPressGenture = UILongPressGestureRecognizer(target: self, action: \"onLongPress:\")\n        beautyImageView.addGestureRecognizer(longPressGenture)\n        \n        let setImage: BeautyImageEntity -> Void = {\n            \n            \n            \n            if let imageURLString = $0.imageUrl {\n                if let imageURL = NSURL(string: imageURLString) {\n                    self.beautyImageView.alpha = 0\n                    KingfisherManager.sharedManager.retrieveImageWithURL(imageURL, optionsInfo: nil, progressBlock: nil, completionHandler: {\n                        [weak self](image, error, cacheType, imageURL) -> () in\n                        \n                        dispatch_async(dispatch_get_main_queue(), {\n                            self?.loadingIndicator.stopAnimating()\n                            if let beauty = image {\n                                self?.beautyImageView.image = beauty\n                                self?.setBackgroundImage(beauty)\n                                UIView.animateWithDuration(0.7, delay: 0, options: .CurveEaseIn, animations: {\n                                    self?.beautyImageView.alpha = 1\n                                    }, completion: nil)\n                            }\n                            self?.view.setNeedsLayout()\n                        })\n                        \n                    })\n                }\n            }\n        };\n        \n        if todayBeauty != nil {\n            setImage(todayBeauty!)\n            return\n        }\n        \n        NetworkUtil.getTodayBeauty {\n            [weak self] urls in\n            \n            if let sself = self {\n                if urls.count > 0 {\n                    sself.todayBeauty = BeautyImageEntity()\n                    sself.todayBeauty!.imageUrl = urls[0]\n                    setImage(sself.todayBeauty!)\n                }\n            }\n        }\n    }\n    \n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        \n        if (loadingIndicator.isAnimating()) {\n            loadingIndicator.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds))\n        }\n    }\n\n    func onSwipe(sender: UISwipeGestureRecognizer) {\n        if canBeClosed {\n            self.dismissViewControllerAnimated(true, completion: nil)\n        }\n    }\n    \n    func onLongPress(sender: UILongPressGestureRecognizer) {\n        if sender.state == .Began {\n            let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)\n            \n            let cancelAction = UIAlertAction(title: \"取消\", style: .Cancel, handler: nil)\n            alertController.addAction(cancelAction)\n            \n            let saveAction = UIAlertAction(title: \"保存\", style: .Default, handler: {\n                (action) -> Void in\n                self.saveImage()\n            })\n            alertController.addAction(saveAction)\n            \n            let shareAction = UIAlertAction(title: \"分享\", style: .Default, handler: {\n                (action) -> Void in\n                self.shareImage()\n            })\n            alertController.addAction(shareAction)\n            \n            self.presentViewController(alertController, animated: true, completion: nil)\n        }\n    }\n    \n    func setBackgroundImage(image: UIImage) {\n        let bgi = UIImageView(image: image)\n        bgi.contentMode = .ScaleToFill\n        bgi.frame = self.view.bounds\n        self.view.addSubview(bgi)\n        self.view.sendSubviewToBack(bgi)\n        bgi.applyBlurEffect()\n    }\n    \n    func saveImage() {\n        if let image = self.beautyImageView.image {\n            UIImageWriteToSavedPhotosAlbum(image, self, Selector(\"saveImageFinished:error:contextInfo:\"), nil)\n        }\n    }\n    \n    func shareImage() {\n        if let image = self.beautyImageView.image {\n            let text = \"分享漂亮妹纸一枚~\"\n            let activityController = UIActivityViewController(activityItems: [text, image], applicationActivities: nil)\n            [self .presentViewController(activityController, animated: true, completion: nil)]\n        }\n    }\n    \n    func saveImageFinished(image: UIImage, error: NSErrorPointer, contextInfo: UnsafePointer<()>) {\n        var message = \"保存成功 (ฅ´ω`ฅ)\"\n        var OKTitle = \"好的\"\n        if error != nil {\n            print(error.memory)\n            message = \"保存失败 (´◔ ‸◔')\"\n            OKTitle = \"好吧\"\n        }\n        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .Alert)\n        \n        let OKAction = UIAlertAction(title: OKTitle, style: .Default, handler: nil)\n        alertController.addAction(OKAction)\n        \n        self.presentViewController(alertController, animated: true, completion: nil)\n    }\n}\n\n"
  },
  {
    "path": "beauties/Utils.swift",
    "content": "//\n//  Utils.swift\n//  beauties\n//\n//  Created by Shuai Liu on 15/7/4.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport Foundation\nimport UIKit\nimport Alamofire\n\nlet ThemeColor = UIColor(red: 222.0 / 255.0, green: 110.0 / 255.0, blue: 75.0 / 255.0, alpha: 1)\n\nlet DEBUG = true\n\nclass BeautyDateUtil {\n    \n    static let PAGE_SIZE = 20\n    static let API_FORMAT = \"yyyy/MM/dd\"\n    static let MAX_PAGE = 5\n    \n    class func generateHistoryDateString(page: Int) -> [String] {\n        return self.generateHistoryDateString(format: self.API_FORMAT, historyCount: self.PAGE_SIZE, page: page)\n    }\n    \n    class func generateHistoryDateString(format format: String, historyCount: Int, page: Int) -> [String] {\n        \n        let today = NSDate()\n        let calendar = NSCalendar.currentCalendar()\n        let formatter = NSDateFormatter()\n        formatter.dateFormat = format\n        \n        let unit = ((page - 1) * self.PAGE_SIZE)...(page * self.PAGE_SIZE - 1)\n        return unit.map({calendar.dateByAddingUnit(.Day, value: -$0, toDate: today, options: [])}).filter({$0 != nil}).map({formatter.stringFromDate($0!)})\n    }\n    \n    class func todayString() -> String {\n        let today = NSDate()\n        let formatter = NSDateFormatter()\n        formatter.dateFormat = self.API_FORMAT\n        return formatter.stringFromDate(today)\n    }\n}\n\nclass NetworkUtil {\n    static let API_DATA_URL = \"http://gank.avosapps.com/api/data/%E7%A6%8F%E5%88%A9/\"\n    static let API_DAY_URL  = \"http://gank.avosapps.com/api/day/\"\n    static let API_RANDOM_URL = \"http://gank.avosapps.com/api/random/data/%E7%A6%8F%E5%88%A9/\"\n    \n    static let PAGE_SIZE = 20\n    \n    class func getBeauties(page: Int, complete: ([String], ErrorType?) -> Void) {\n\n        let url = \"\\(API_DATA_URL)\\(PAGE_SIZE)/\\(page)\"\n        \n        if (DEBUG) {\n            print(url)\n        }\n\n        Alamofire.request(.GET, url).responseJSON {\n            _, _, result in\n            switch result {\n            case let .Success(json):\n                complete(NetworkUtil.parseBeautyList(json), nil)\n            case let .Failure(_, error):\n                print(error)\n                complete([String](), error)\n            }\n        }\n    }\n    \n    class func getTodayBeauty(complete: [String] -> Void) {\n\n        if (DEBUG) {\n            print(API_DAY_URL + BeautyDateUtil.todayString())\n        }\n        \n        Alamofire.request(.GET, API_DAY_URL + BeautyDateUtil.todayString()).responseJSON {\n            _, _, result in\n            \n            switch result {\n            case let .Success(json):\n                if let j = json as? Dictionary<String, AnyObject> {\n                    if let category = j[\"category\"] as? [String] {\n                        if category.contains(\"福利\") {\n                            if let results = j[\"results\"] as? Dictionary<String, AnyObject> {\n                                if let fulis = results[\"福利\"] as? [Dictionary<String, AnyObject>] {\n                                    var ret = [String]()\n                                    for fuli in fulis {\n                                        ret.append(fuli[\"url\"] as! String)\n                                    }\n                                    complete(ret)\n                                    return\n                                }\n                            }\n                        }\n                    }\n                }\n                // No Beauty today, get a random beauty\n                NetworkUtil.getRandomBeauty(1, complete: complete)\n            case let .Failure(_, error):\n                print(error)\n                complete([String]())\n            }\n            \n        }\n    }\n    \n    class func getRandomBeauty(count: Int, complete: [String] -> Void) {\n        \n        let url = \"\\(API_RANDOM_URL)\\(count)\"\n        \n        if (DEBUG) {\n            print(\"Random URL --> \\(url)\")\n        }\n\n        Alamofire.request(.GET, url).responseJSON {\n            _, _, result in\n            \n            switch result {\n            case let .Success(json):\n                complete(NetworkUtil.parseBeautyList(json))\n            case let .Failure(_, error):\n                print(error)\n                complete([String]())\n            }\n        }\n    }\n    \n    class func parseBeautyList(json: AnyObject?) -> [String] {\n        var ret = [String]()\n        if let j = json as? Dictionary<String, AnyObject> {\n            if let results = j[\"results\"] as? [Dictionary<String, AnyObject>] {\n                for b in results {\n                    ret.append(b[\"url\"] as! String)\n                }\n            }\n        }\n        return ret\n    }\n}"
  },
  {
    "path": "beautiesTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "beautiesTests/beautiesTests.swift",
    "content": "//\n//  beautiesTests.swift\n//  beautiesTests\n//\n//  Created by Shuai Liu on 15/6/27.\n//  Copyright (c) 2015年 Shuai Liu. All rights reserved.\n//\n\nimport UIKit\nimport XCTest\n\nclass beautiesTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testExample() {\n        // This is an example of a functional test case.\n        XCTAssert(true, \"Pass\")\n    }\n    \n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measureBlock() {\n            // Put the code you want to measure the time of here.\n        }\n    }\n    \n}\n"
  },
  {
    "path": "beauty.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t4B1366421B3EF8A100986654 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1366411B3EF8A100986654 /* AppDelegate.swift */; };\n\t\t4B1366441B3EF8A100986654 /* TodayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1366431B3EF8A100986654 /* TodayViewController.swift */; };\n\t\t4B1366471B3EF8A100986654 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4B1366451B3EF8A100986654 /* Main.storyboard */; };\n\t\t4B1366491B3EF8A100986654 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4B1366481B3EF8A100986654 /* Images.xcassets */; };\n\t\t4B13664C1B3EF8A100986654 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B13664A1B3EF8A100986654 /* LaunchScreen.xib */; };\n\t\t4B1366581B3EF8A100986654 /* beautiesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1366571B3EF8A100986654 /* beautiesTests.swift */; };\n\t\t4B459D2E1B47780C00975776 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B459D2D1B47780C00975776 /* Utils.swift */; };\n\t\t4B4903B81B6FADFF004D5458 /* MoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4903B71B6FADFF004D5458 /* MoreViewController.swift */; };\n\t\t4B4903BB1B6FB23A004D5458 /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 4B4903BA1B6FB23A004D5458 /* logo.png */; };\n\t\t4B7AC9791B44169200E19056 /* BlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7AC9781B44169200E19056 /* BlurView.swift */; };\n\t\t4B7AC97E1B441DC700E19056 /* HistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7AC97D1B441DC700E19056 /* HistoryViewController.swift */; };\n\t\t4B7AC9801B4423AD00E19056 /* BeautyCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7AC97F1B4423AD00E19056 /* BeautyCollectionViewCell.swift */; };\n\t\t4B8A88D71B73A386005470F0 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8A88D61B73A386005470F0 /* AboutViewController.swift */; };\n\t\t4BC431171B76446E00FB6895 /* today@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BC431141B76446E00FB6895 /* today@2x.png */; };\n\t\t4BC431181B76446E00FB6895 /* history@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BC431151B76446E00FB6895 /* history@2x.png */; };\n\t\t4BC431191B76446E00FB6895 /* setting@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4BC431161B76446E00FB6895 /* setting@2x.png */; };\n\t\t4BD0DD3F1B42C84F00F08CF5 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BD0DD3D1B42C84F00F08CF5 /* Kingfisher.framework */; };\n\t\t4BD0DD431B42CBA400F08CF5 /* BeautyImageEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD0DD421B42CBA400F08CF5 /* BeautyImageEntity.swift */; };\n\t\t4BE566D21B74F1FE0079197A /* Fabric.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BE566D01B74F1FE0079197A /* Fabric.framework */; };\n\t\t4BE566D31B74F1FE0079197A /* Crashlytics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BE566D11B74F1FE0079197A /* Crashlytics.framework */; };\n\t\t4BF4E6E61B72531100986D21 /* BeautyCollectionViewFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF4E6E51B72531100986D21 /* BeautyCollectionViewFooter.swift */; };\n\t\t4BF7FF0E1BAE6069008DC2C9 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BF7FF0D1BAE6069008DC2C9 /* Alamofire.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t4B1366521B3EF8A100986654 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 4B1366341B3EF8A100986654 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 4B13663B1B3EF8A100986654;\n\t\t\tremoteInfo = beauties;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t4B13663C1B3EF8A100986654 /* beauty.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = beauty.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4B1366401B3EF8A100986654 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t4B1366411B3EF8A100986654 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t4B1366431B3EF8A100986654 /* TodayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewController.swift; sourceTree = \"<group>\"; };\n\t\t4B1366461B3EF8A100986654 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t4B1366481B3EF8A100986654 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t4B13664B1B3EF8A100986654 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t4B1366511B3EF8A100986654 /* beautyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = beautyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4B1366561B3EF8A100986654 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t4B1366571B3EF8A100986654 /* beautiesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = beautiesTests.swift; sourceTree = \"<group>\"; };\n\t\t4B459D2D1B47780C00975776 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = \"<group>\"; };\n\t\t4B4903B71B6FADFF004D5458 /* MoreViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoreViewController.swift; sourceTree = \"<group>\"; };\n\t\t4B4903BA1B6FB23A004D5458 /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = \"<group>\"; };\n\t\t4B7AC9781B44169200E19056 /* BlurView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlurView.swift; sourceTree = \"<group>\"; };\n\t\t4B7AC97D1B441DC700E19056 /* HistoryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HistoryViewController.swift; sourceTree = \"<group>\"; };\n\t\t4B7AC97F1B4423AD00E19056 /* BeautyCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeautyCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\t4B8A88D61B73A386005470F0 /* AboutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = \"<group>\"; };\n\t\t4BC431141B76446E00FB6895 /* today@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"today@2x.png\"; sourceTree = \"<group>\"; };\n\t\t4BC431151B76446E00FB6895 /* history@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"history@2x.png\"; sourceTree = \"<group>\"; };\n\t\t4BC431161B76446E00FB6895 /* setting@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"setting@2x.png\"; sourceTree = \"<group>\"; };\n\t\t4BD0DD3D1B42C84F00F08CF5 /* Kingfisher.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kingfisher.framework; path = Carthage/Build/iOS/Kingfisher.framework; sourceTree = \"<group>\"; };\n\t\t4BD0DD421B42CBA400F08CF5 /* BeautyImageEntity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeautyImageEntity.swift; sourceTree = \"<group>\"; };\n\t\t4BE566D01B74F1FE0079197A /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Fabric.framework; sourceTree = SOURCE_ROOT; };\n\t\t4BE566D11B74F1FE0079197A /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Crashlytics.framework; sourceTree = SOURCE_ROOT; };\n\t\t4BF4E6E51B72531100986D21 /* BeautyCollectionViewFooter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeautyCollectionViewFooter.swift; sourceTree = \"<group>\"; };\n\t\t4BF7FF0D1BAE6069008DC2C9 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/iOS/Alamofire.framework; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t4B1366391B3EF8A100986654 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4BF7FF0E1BAE6069008DC2C9 /* Alamofire.framework in Frameworks */,\n\t\t\t\t4BD0DD3F1B42C84F00F08CF5 /* Kingfisher.framework in Frameworks */,\n\t\t\t\t4BE566D31B74F1FE0079197A /* Crashlytics.framework in Frameworks */,\n\t\t\t\t4BE566D21B74F1FE0079197A /* Fabric.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4B13664E1B3EF8A100986654 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t4B0DBFF41B3F9A4E009250A1 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4B7AC9781B44169200E19056 /* BlurView.swift */,\n\t\t\t\t4B459D2D1B47780C00975776 /* Utils.swift */,\n\t\t\t);\n\t\t\tname = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B1366331B3EF8A100986654 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4BF7FF0D1BAE6069008DC2C9 /* Alamofire.framework */,\n\t\t\t\t4BD0DD3D1B42C84F00F08CF5 /* Kingfisher.framework */,\n\t\t\t\t4B13663E1B3EF8A100986654 /* beauties */,\n\t\t\t\t4B1366541B3EF8A100986654 /* beautiesTests */,\n\t\t\t\t4B13663D1B3EF8A100986654 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B13663D1B3EF8A100986654 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4B13663C1B3EF8A100986654 /* beauty.app */,\n\t\t\t\t4B1366511B3EF8A100986654 /* beautyTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B13663E1B3EF8A100986654 /* beauties */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4BE566D01B74F1FE0079197A /* Fabric.framework */,\n\t\t\t\t4BE566D11B74F1FE0079197A /* Crashlytics.framework */,\n\t\t\t\t4B4903B91B6FB1F4004D5458 /* images */,\n\t\t\t\t4BD0DD411B42CB8400F08CF5 /* Entiy */,\n\t\t\t\t4B0DBFF41B3F9A4E009250A1 /* Utils */,\n\t\t\t\t4B1366411B3EF8A100986654 /* AppDelegate.swift */,\n\t\t\t\t4B1366431B3EF8A100986654 /* TodayViewController.swift */,\n\t\t\t\t4B7AC97D1B441DC700E19056 /* HistoryViewController.swift */,\n\t\t\t\t4B1366451B3EF8A100986654 /* Main.storyboard */,\n\t\t\t\t4B1366481B3EF8A100986654 /* Images.xcassets */,\n\t\t\t\t4B13664A1B3EF8A100986654 /* LaunchScreen.xib */,\n\t\t\t\t4B13663F1B3EF8A100986654 /* Supporting Files */,\n\t\t\t\t4B7AC97F1B4423AD00E19056 /* BeautyCollectionViewCell.swift */,\n\t\t\t\t4B4903B71B6FADFF004D5458 /* MoreViewController.swift */,\n\t\t\t\t4BF4E6E51B72531100986D21 /* BeautyCollectionViewFooter.swift */,\n\t\t\t\t4B8A88D61B73A386005470F0 /* AboutViewController.swift */,\n\t\t\t);\n\t\t\tpath = beauties;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B13663F1B3EF8A100986654 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4B1366401B3EF8A100986654 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B1366541B3EF8A100986654 /* beautiesTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4B1366571B3EF8A100986654 /* beautiesTests.swift */,\n\t\t\t\t4B1366551B3EF8A100986654 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = beautiesTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B1366551B3EF8A100986654 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4B1366561B3EF8A100986654 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B4903B91B6FB1F4004D5458 /* images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4BC431141B76446E00FB6895 /* today@2x.png */,\n\t\t\t\t4BC431151B76446E00FB6895 /* history@2x.png */,\n\t\t\t\t4BC431161B76446E00FB6895 /* setting@2x.png */,\n\t\t\t\t4B4903BA1B6FB23A004D5458 /* logo.png */,\n\t\t\t);\n\t\t\tname = images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4BD0DD411B42CB8400F08CF5 /* Entiy */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4BD0DD421B42CBA400F08CF5 /* BeautyImageEntity.swift */,\n\t\t\t);\n\t\t\tname = Entiy;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t4B13663B1B3EF8A100986654 /* beauty */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4B13665B1B3EF8A100986654 /* Build configuration list for PBXNativeTarget \"beauty\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4B1366381B3EF8A100986654 /* Sources */,\n\t\t\t\t4B1366391B3EF8A100986654 /* Frameworks */,\n\t\t\t\t4B13663A1B3EF8A100986654 /* Resources */,\n\t\t\t\t4BD0DD3C1B42C7FC00F08CF5 /* ShellScript */,\n\t\t\t\t4BE566CF1B74F1B10079197A /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = beauty;\n\t\t\tproductName = beauties;\n\t\t\tproductReference = 4B13663C1B3EF8A100986654 /* beauty.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t4B1366501B3EF8A100986654 /* beautyTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4B13665E1B3EF8A100986654 /* Build configuration list for PBXNativeTarget \"beautyTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4B13664D1B3EF8A100986654 /* Sources */,\n\t\t\t\t4B13664E1B3EF8A100986654 /* Frameworks */,\n\t\t\t\t4B13664F1B3EF8A100986654 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t4B1366531B3EF8A100986654 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = beautyTests;\n\t\t\tproductName = beautiesTests;\n\t\t\tproductReference = 4B1366511B3EF8A100986654 /* beautyTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t4B1366341B3EF8A100986654 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftMigration = 0700;\n\t\t\t\tLastSwiftUpdateCheck = 0700;\n\t\t\t\tLastUpgradeCheck = 0700;\n\t\t\t\tORGANIZATIONNAME = \"Shuai Liu\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t4B13663B1B3EF8A100986654 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.2;\n\t\t\t\t\t\tDevelopmentTeam = 2C24N82JDX;\n\t\t\t\t\t};\n\t\t\t\t\t4B1366501B3EF8A100986654 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.2;\n\t\t\t\t\t\tTestTargetID = 4B13663B1B3EF8A100986654;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 4B1366371B3EF8A100986654 /* Build configuration list for PBXProject \"beauty\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 4B1366331B3EF8A100986654;\n\t\t\tproductRefGroup = 4B13663D1B3EF8A100986654 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t4B13663B1B3EF8A100986654 /* beauty */,\n\t\t\t\t4B1366501B3EF8A100986654 /* beautyTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t4B13663A1B3EF8A100986654 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4BC431171B76446E00FB6895 /* today@2x.png in Resources */,\n\t\t\t\t4B4903BB1B6FB23A004D5458 /* logo.png in Resources */,\n\t\t\t\t4BC431191B76446E00FB6895 /* setting@2x.png in Resources */,\n\t\t\t\t4B1366471B3EF8A100986654 /* Main.storyboard in Resources */,\n\t\t\t\t4BC431181B76446E00FB6895 /* history@2x.png in Resources */,\n\t\t\t\t4B13664C1B3EF8A100986654 /* LaunchScreen.xib in Resources */,\n\t\t\t\t4B1366491B3EF8A100986654 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4B13664F1B3EF8A100986654 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t4BD0DD3C1B42C7FC00F08CF5 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"$(SRCROOT)/Carthage/Build/iOS/Kingfisher.framework\",\n\t\t\t\t\"$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework\",\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/usr/local/bin/carthage copy-frameworks\";\n\t\t};\n\t\t4BE566CF1B74F1B10079197A /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"./Fabric.framework/run 5b6d196a58f4acbc481f40758c365e9b14ae8732 3490fc62e207b8c7ec5ae2d4a8578db972041bdd761c9d59f51f7b5ca63b611f\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t4B1366381B3EF8A100986654 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4B4903B81B6FADFF004D5458 /* MoreViewController.swift in Sources */,\n\t\t\t\t4B7AC9801B4423AD00E19056 /* BeautyCollectionViewCell.swift in Sources */,\n\t\t\t\t4B8A88D71B73A386005470F0 /* AboutViewController.swift in Sources */,\n\t\t\t\t4BD0DD431B42CBA400F08CF5 /* BeautyImageEntity.swift in Sources */,\n\t\t\t\t4BF4E6E61B72531100986D21 /* BeautyCollectionViewFooter.swift in Sources */,\n\t\t\t\t4B7AC9791B44169200E19056 /* BlurView.swift in Sources */,\n\t\t\t\t4B7AC97E1B441DC700E19056 /* HistoryViewController.swift in Sources */,\n\t\t\t\t4B1366441B3EF8A100986654 /* TodayViewController.swift in Sources */,\n\t\t\t\t4B1366421B3EF8A100986654 /* AppDelegate.swift in Sources */,\n\t\t\t\t4B459D2E1B47780C00975776 /* Utils.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4B13664D1B3EF8A100986654 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4B1366581B3EF8A100986654 /* beautiesTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t4B1366531B3EF8A100986654 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 4B13663B1B3EF8A100986654 /* beauty */;\n\t\t\ttargetProxy = 4B1366521B3EF8A100986654 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t4B1366451B3EF8A100986654 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t4B1366461B3EF8A100986654 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4B13664A1B3EF8A100986654 /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t4B13664B1B3EF8A100986654 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t4B1366591B3EF8A100986654 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4B13665A1B3EF8A100986654 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4B13665C1B3EF8A100986654 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = beauties/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"vars.me.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = beauty;\n\t\t\t\tPROVISIONING_PROFILE = \"1e021d34-b179-4904-94ce-d3c038ab20ef\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4B13665D1B3EF8A100986654 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = beauties/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"vars.me.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = beauty;\n\t\t\t\tPROVISIONING_PROFILE = \"1e021d34-b179-4904-94ce-d3c038ab20ef\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4B13665F1B3EF8A100986654 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = beautiesTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"vars.me.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = beautyTests;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/beauty.app/beauty\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4B1366601B3EF8A100986654 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = beautiesTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"vars.me.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = beautyTests;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/beauty.app/beauty\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t4B1366371B3EF8A100986654 /* Build configuration list for PBXProject \"beauty\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4B1366591B3EF8A100986654 /* Debug */,\n\t\t\t\t4B13665A1B3EF8A100986654 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4B13665B1B3EF8A100986654 /* Build configuration list for PBXNativeTarget \"beauty\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4B13665C1B3EF8A100986654 /* Debug */,\n\t\t\t\t4B13665D1B3EF8A100986654 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4B13665E1B3EF8A100986654 /* Build configuration list for PBXNativeTarget \"beautyTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4B13665F1B3EF8A100986654 /* Debug */,\n\t\t\t\t4B1366601B3EF8A100986654 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 4B1366341B3EF8A100986654 /* Project object */;\n}\n"
  },
  {
    "path": "beauty.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:beauty.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  }
]