[
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at 835150773@qq.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing Guidelines\n\nThis document contains information and guidelines about contributing to this project.\nPlease read it before you start participating.\n\n**Topics**\n\n* [Asking Questions](#asking-questions)\n* [Reporting Issues](#reporting-issues)\n* [Developers Certificate of Origin](#developers-certificate-of-origin)\n\n## Asking Questions\n\nWe don't use GitHub as a support forum.\nFor any usage questions that are not specific to the project itself,\nplease ask on [Stack Overflow](https://stackoverflow.com) instead.\nBy doing so, you'll be more likely to quickly solve your problem,\nand you'll allow anyone else with the same question to find the answer.\nThis also allows maintainers to focus on improving the project for others.\n\n## Reporting Issues\n\nA great way to contribute to the project\nis to send a detailed issue when you encounter an problem.\nWe always appreciate a well-written, thorough bug report.\n\nCheck that the project issues database\ndoesn't already include that problem or suggestion before submitting an issue.\nIf you find a match, add a quick \"+1\" or \"I have this problem too.\"\nDoing this helps prioritize the most common problems and requests.\n\nWhen reporting issues, please include the following:\n\n* The version of Xcode you're using\n* The version of iOS or macOS you're targeting\n* The full output of any stack trace or compiler error\n* A code snippet that reproduces the described behavior, if applicable\n* Any other details that would be useful in understanding the problem\n\nThis information will help us review and fix your issue faster.\n\n## Developer's Certificate of Origin\n\nBy making a contribution to this project, I certify that:\n\n- (a) The contribution was created in whole or in part by me and I\n      have the right to submit it under the open source license\n      indicated in the file; or\n\n- (b) The contribution is based upon previous work that, to the best\n      of my knowledge, is covered under an appropriate open source\n      license and I have the right under that license to submit that\n      work with modifications, whether created in whole or in part\n      by me, under the same open source license (unless I am\n      permitted to submit under a different license), as indicated\n      in the file; or\n\n- (c) The contribution was provided directly to me by some other\n      person who certified (a), (b) or (c) and I have not modified\n      it.\n\n- (d) I understand and agree that this project and the contribution\n      are public and that a record of the contribution (including all\n      personal information I submit with it, including my sign-off) is\n      maintained indefinitely and may be redistributed consistent with\n      this project or the open source license(s) involved.\n\n---\n\n*Some of the ideas and wording for the statements above were based on work by the [Alamofire](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md) communities. We commend them for their efforts to facilitate collaboration in their projects.*\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "### Check List\n\nThanks for considering to open an issue. Before you submit your issue, please confirm these boxes are checked.\n\n- [ ] I have read the [README.md](https://github.com/LPD-iOS/FlexBoxLayout/blob/master/README.md), but there is no information I need.\n- [ ] I have searched in [existing issues](https://github.com/LPD-iOS/FlexBoxLayout/issues?utf8=%E2%9C%93&q=is%3Aissue), but did find a same one.\n\n### Issue Description\n\n#### Description\n\n[Tell us about the issue]\n\n#### Reproduce\n\n[The steps to reproduce this issue. What are the parameters, where did you put your code, etc.]\n\n#### Other Comment\n\n[Add anything else here]\n"
  },
  {
    "path": ".gitignore",
    "content": "# OS X\n.DS_Store\n\n# Xcode\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n*.xccheckout\nprofile\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n\n# Bundler\n.bundle\n\nCarthage\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# Note: if you ignore the Pods directory, make sure to uncomment\n# `pod install` in .travis.yml\n#\n# Pods/\n"
  },
  {
    "path": ".travis.yml",
    "content": "osx_image: xcode9\nlanguage: objective-c\n\ncache: cocoapods\npodfile: Example/Podfile\n\nenv:\n  global:\n    - LANG=en_US.UTF-8\n    - LC_ALL=en_US.UTF-8\n    - XCODE_WORKSPACE=Example/FlexBoxLayout.xcworkspace\n  matrix:\n    - SCHEME=\"FlexBoxLayout_Example\"\n\nbefore_install:\n  - gem install xcpretty --no-rdoc --no-ri --no-document --quiet\n  - gem install cocoapods --pre --no-rdoc --no-ri --no-document --quiet\n  - pod install --project-directory=Example\n\nscript:\n  - set -o pipefail\n  - xcodebuild -workspace \"$XCODE_WORKSPACE\" -scheme \"$SCHEME\" -configuration Debug clean build CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO | xcpretty -c\n  - xcodebuild -workspace \"$XCODE_WORKSPACE\" -scheme \"$SCHEME\" -configuration Release clean build CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO | xcpretty -c\n  - pod lib lint --allow-warnings\n\nafter_success:\n  - sleep 3\n"
  },
  {
    "path": "Example/Example/FBAppDelegate.h",
    "content": "//\n//  CSSAppDelegate.h\n//  CSSLayout\n//\n//  Created by qiang.shen on 01/03/2017.\n//  Copyright (c) 2017 qiang.shen. All rights reserved.\n//\n\n@import UIKit;\n\n@interface FBAppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "Example/Example/FBAppDelegate.m",
    "content": "//\n//  CSSAppDelegate.m\n//  CSSLayout\n//\n//  Created by qiang.shen on 01/03/2017.\n//  Copyright (c) 2017 qiang.shen. All rights reserved.\n//\n\n#import \"FBAppDelegate.h\"\n\n@implementation FBAppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n    // Override point for customization after application launch.\n    return YES;\n}\n\n- (void)applicationWillResignActive:(UIApplication *)application\n{\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- (void)applicationDidEnterBackground:(UIApplication *)application\n{\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- (void)applicationWillEnterForeground:(UIApplication *)application\n{\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- (void)applicationDidBecomeActive:(UIApplication *)application\n{\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- (void)applicationWillTerminate:(UIApplication *)application\n{\n    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n}\n\n@end\n"
  },
  {
    "path": "Example/Example/FBFPSGraph.h",
    "content": "//\n//  CSSFPSGraph.h\n//  CSSLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface FBFPSGraph : UIView\n\n@property (nonatomic, assign, readonly) NSUInteger FPS;\n@property (nonatomic, assign, readonly) NSUInteger maxFPS;\n@property (nonatomic, assign, readonly) NSUInteger minFPS;\n\n- (instancetype)initWithFrame:(CGRect)frame\n                        color:(UIColor *)color;\n\n@end\n"
  },
  {
    "path": "Example/Example/FBFPSGraph.m",
    "content": "//\n//  CSSFPSGraph.m\n//  CSSLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import \"FBFPSGraph.h\"\n\n@interface FBFPSGraph()\n\n@property (nonatomic, strong, readonly) CAShapeLayer *graph;\n\n@property (nonatomic, strong, readonly) UILabel *label;\n\n@end\n\n@implementation FBFPSGraph {\n  CAShapeLayer *_graph;\n  UILabel *_label;\n  \n  CGFloat *_frames;\n  UIColor *_color;\n  \n  NSTimeInterval _prevTime;\n  NSUInteger _frameCount;\n  NSUInteger _FPS;\n  NSUInteger _maxFPS;\n  NSUInteger _minFPS;\n  NSUInteger _length;\n  NSUInteger _height;\n  CADisplayLink *_uiDisplayLink; // leak to do\n}\n\n- (instancetype)initWithFrame:(CGRect)frame color:(UIColor *)color {\n  if ((self = [super initWithFrame:frame])) {\n    _frameCount = -1;\n    _prevTime = -1;\n    _maxFPS = 0;\n    _minFPS = 60;\n    _length = (NSUInteger)floor(frame.size.width);\n    _height = (NSUInteger)floor(frame.size.height);\n    _frames = calloc(sizeof(CGFloat), _length);\n    _color = color;\n    \n    [self.layer addSublayer:self.graph];\n    [self addSubview:self.label];\n    _uiDisplayLink = [CADisplayLink displayLinkWithTarget:self\n                                                 selector:@selector(onTick:)];\n    [_uiDisplayLink addToRunLoop:[NSRunLoop mainRunLoop]\n                         forMode:NSRunLoopCommonModes];\n  }\n  return self;\n}\n\n- (void)dealloc {\n  free(_frames);\n}\n\n\n- (CAShapeLayer *)graph {\n  if (!_graph) {\n    _graph = [CAShapeLayer new];\n    _graph.frame = self.bounds;\n    _graph.backgroundColor = [_color colorWithAlphaComponent:0.2].CGColor;\n    _graph.fillColor = _color.CGColor;\n  }\n  \n  return _graph;\n}\n\n- (UILabel *)label {\n  if (!_label) {\n    _label = [[UILabel alloc] initWithFrame:self.bounds];\n    _label.font = [UIFont boldSystemFontOfSize:13];\n    _label.textAlignment = NSTextAlignmentCenter;\n  }\n  \n  return _label;\n}\n\n- (void)onTick:(CADisplayLink *)uiDisplayLink {\n  NSTimeInterval timestamp = uiDisplayLink.timestamp;\n  \n  _frameCount++;\n  if (_prevTime == -1) {\n    _prevTime = timestamp;\n  } else if (timestamp - _prevTime >= 1) {\n    _FPS = round(_frameCount / (timestamp - _prevTime));\n    _minFPS = MIN(_minFPS, _FPS);\n    _maxFPS = MAX(_maxFPS, _FPS);\n    \n    dispatch_async(dispatch_get_main_queue(), ^{\n      self->_label.text = [NSString stringWithFormat:@\"%lu\", (unsigned long)self->_FPS];\n    });\n    \n    CGFloat scale = 60.0 / _height;\n    for (NSUInteger i = 0; i < _length - 1; i++) {\n      _frames[i] = _frames[i + 1];\n    }\n    _frames[_length - 1] = _FPS / scale;\n    \n    CGMutablePathRef path = CGPathCreateMutable();\n    CGPathMoveToPoint(path, NULL, 0, _height);\n    for (NSUInteger i = 0; i < _length; i++) {\n      CGPathAddLineToPoint(path, NULL, i, _height - _frames[i]);\n    }\n    CGPathAddLineToPoint(path, NULL, _length - 1, _height);\n    \n    _graph.path = path;\n    CGPathRelease(path);\n    \n    _prevTime = timestamp;\n    _frameCount = 0;\n  }\n}\n\n\n@end\n"
  },
  {
    "path": "Example/Example/FBFeedModel.h",
    "content": "//\n//  CSSFeedModel.h\n//  CSSLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface FBFeedModel : NSObject\n\n- (instancetype)initWithDictionary:(NSDictionary *)dictionary;\n@property (nonatomic, copy, readonly) NSString *title;\n@property (nonatomic, copy, readonly) NSString *content;\n@property (nonatomic, copy, readonly) NSString *username;\n@property (nonatomic, copy, readonly) NSString *time;\n@property (nonatomic, copy, readonly) NSString *imageName;\n\n@end\n"
  },
  {
    "path": "Example/Example/FBFeedModel.m",
    "content": "//\n//  CSSFeedModel.m\n//  CSSLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import \"FBFeedModel.h\"\n\n@implementation FBFeedModel\n\n\n- (instancetype)initWithDictionary:(NSDictionary *)dictionary\n{\n  self = super.init;\n  if (self) {\n    _title = dictionary[@\"title\"];\n    _content = dictionary[@\"content\"];\n    _username = dictionary[@\"username\"];\n    _time = dictionary[@\"time\"];\n    _imageName = dictionary[@\"imageName\"];\n  }\n  return self;\n}\n\n\n\n@end\n"
  },
  {
    "path": "Example/Example/FBFeedView.h",
    "content": "//\n//  CSSFeedView.h\n//  CSSLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"FBFeedModel.h\"\n\n@interface FBFeedView : UIView\n\n- (instancetype)initWithModel:(FBFeedModel *)model;\n\n@end\n"
  },
  {
    "path": "Example/Example/FBFeedView.m",
    "content": "//\n//  FBFeedView.m\n//  FBLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import \"FBFeedView.h\"\n#import \"UIView+FBLayout.h\"\n#import \"FBLayoutDiv.h\"\n\n@interface FBFeedView ()\n\n@property (nonatomic, strong)  UILabel *titleLabel;\n@property (nonatomic, strong)  UILabel *contentLabel;\n@property (nonatomic, strong)  UIImageView *contentImageView;\n@property (nonatomic, strong)  UILabel *usernameLabel;\n@property (nonatomic, strong)  UILabel *timeLabel;\n\n@end\n\n\n@implementation FBFeedView\n\n- (instancetype)initWithModel:(FBFeedModel *)model {\n  if (self = [super initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 0)]) {\n    [self configView];\n    [self configData:model];\n    [self layoutView];\n  }\n  \n  return self;\n}\n\n- (void)configView {\n  \n  _titleLabel = [UILabel new];\n  [self addSubview:_titleLabel];\n  \n  _contentLabel = [UILabel new];\n  [self addSubview:_contentLabel];\n  _contentLabel.numberOfLines = 0;\n  \n  _contentImageView = [UIImageView new];\n  _contentImageView.contentMode = UIViewContentModeScaleAspectFit;\n  [self addSubview:_contentImageView];\n  \n  _usernameLabel = [UILabel new];\n  [self addSubview:_usernameLabel];\n  \n  _timeLabel = [UILabel new];\n  _timeLabel.textAlignment = NSTextAlignmentRight;\n  [self addSubview:_timeLabel];\n}\n\n- (void)configData:(FBFeedModel *)model {\n  \n  _titleLabel.attributedText = [[NSAttributedString alloc] initWithString:model.title attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18]}];\n  \n  _contentLabel.attributedText = [[NSAttributedString alloc] initWithString:model.content attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]}];\n  \n  _contentImageView.image = [UIImage imageNamed:model.imageName];\n  \n  _usernameLabel.attributedText = [[NSAttributedString alloc] initWithString:model.username attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]}];\n  \n  _timeLabel.attributedText = [[NSAttributedString alloc] initWithString:model.time attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12]}];\n  \n}\n\n- (void)layoutView {\n  \n  \n  [_titleLabel fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0)).wrapContent();\n  }];\n  \n  \n  [_contentLabel fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0)).wrapContent();\n  }];\n  \n  [_contentImageView fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0)).wrapContent();\n  }];\n  \n  [_usernameLabel fb_makeLayout:^(FBLayout *layout) {\n    layout.wrapContent().flexGrow.equalTo(@(1.0));\n  }];\n \n  [_timeLabel fb_makeLayout:^(FBLayout *layout) {\n      layout.wrapContent().flexGrow.equalTo(@(1.0));\n  }];\n  \n  FBLayoutDiv *div = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionRow ];\n  [div fb_makeLayout:^(FBLayout *layout) {\n    layout.flexDirection.equalTo(@(FBFlexDirectionRow)).justifyContent.equalTo(@(FBJustifySpaceBetween)).alignItems.equalTo(@(FBAlignFlexStart)).margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0)).children(@[_usernameLabel,_timeLabel]);\n  }];\n  \n  [self fb_makeLayout:^(FBLayout *layout) {\n    layout.flexDirection.equalTo(@(FBFlexDirectionColumn)).margin.equalToEdgeInsets(UIEdgeInsetsMake(0, 15, 0, 15)).alignItems.equalTo(@(FBAlignFlexStart)).children(@[_titleLabel,_contentLabel,_contentImageView,div]);\n  }];\n  \n}\n\n@end\n"
  },
  {
    "path": "Example/Example/FBTableViewController.h",
    "content": "//\n//  CSSTableViewController.h\n//  CSSLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface FBTableViewController : UITableViewController\n\n@end\n"
  },
  {
    "path": "Example/Example/FBTableViewController.m",
    "content": "//\n//  FBTableViewController.m\n//  FBLayout\n//\n//  Created by 沈强 on 2017/1/11.\n//  Copyright © 2017年 qiang.shen. All rights reserved.\n//\n\n#import \"FBTableViewController.h\"\n#import \"FBFeedModel.h\"\n#import \"UITableView+FBLayout.h\"\n#import \"FBFeedView.h\"\n#import \"FBFPSGraph.h\"\n\n@interface FBTableViewController ()\n\n@property(nonatomic, strong)NSMutableArray *feeds;\n\n@property(nonatomic, strong)NSMutableArray<NSMutableArray *> *sections;\n\n@end\n\n@implementation FBTableViewController\n\n- (void)viewDidLoad {\n  [super viewDidLoad];\n  \n  UIRefreshControl *refreshControl = [UIRefreshControl new];\n  [refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];\n  self.refreshControl = refreshControl;\n  FBFPSGraph *graph =  [[FBFPSGraph alloc] initWithFrame:CGRectMake(0, 20, [UIScreen mainScreen].bounds.size.width, 30)\n                               color:[UIColor lightGrayColor]];\n  [[UIApplication sharedApplication].keyWindow addSubview:graph];\n  [self loadData];\n}\n\n- (void)refresh {\n  [self loadData];\n  [self.refreshControl endRefreshing];\n}\n\n- (void)loadData {\n  NSString *dataFilePath = [[NSBundle mainBundle] pathForResource:@\"data\" ofType:@\"json\"];\n  NSData *data = [NSData dataWithContentsOfFile:dataFilePath];\n  NSDictionary *rootDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];\n  NSArray *feedDicts = rootDict[@\"feed\"];\n  \n  _feeds = @[].mutableCopy;\n  \n  [feedDicts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {\n    [_feeds addObject:[[FBFeedModel alloc] initWithDictionary:obj]];\n  }];\n  \n  _sections = [NSMutableArray arrayWithCapacity:1];\n  [_sections addObject:_feeds];\n  \n  __weak typeof(self)weakSelf = self;\n  \n  [self.tableView fb_setCellContnetViewBlockForIndexPath:^UIView *(NSIndexPath *indexPath) {\n    return [[FBFeedView alloc]initWithModel:weakSelf.sections[indexPath.section][indexPath.row]];\n  }];\n  \n  [self.tableView reloadData];\n}\n\n- (void)didReceiveMemoryWarning {\n    [super didReceiveMemoryWarning];\n}\n\n#pragma mark - Table view data source\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {\n    return _sections.count;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {\n\n    return [self.sections[section] count];\n}\n\n- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {\n  return [self.tableView fb_heightForIndexPath:indexPath];\n}\n\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\n  return [self.tableView fb_cellForIndexPath:indexPath];\n}\n\n#pragma mark - UITableViewDelegate\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\n  if (indexPath.row%2==0) {\n    [_sections insertObject:_feeds atIndex:indexPath.section];\n    [tableView insertSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationLeft];\n  } else {\n    [_sections removeObjectAtIndex:indexPath.section];\n    [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationLeft];\n  }\n\n}\n\n@end\n"
  },
  {
    "path": "Example/Example/FBViewController.h",
    "content": "//\n//  CSSViewController.h\n//  CSSLayout\n//\n//  Created by qiang.shen on 01/03/2017.\n//  Copyright (c) 2017 qiang.shen. All rights reserved.\n//\n\n@import UIKit;\n\n@interface FBViewController : UIViewController\n\n@end\n"
  },
  {
    "path": "Example/Example/FBViewController.m",
    "content": "//\n//  FBViewController.m\n//  FBLayout\n//\n//  Created by qiang.shen on 01/03/2017.\n//  Copyright (c) 2017 qiang.shen. All rights reserved.\n//\n\n#import \"FBViewController.h\"\n\n#import \"FlexBoxLayout.h\"\n#import \"FBAsyLayoutTransaction.h\"\n\n@interface FBViewController ()\n\n@end\n\n@implementation FBViewController\n\n\n- (void)viewDidLoad {\n  \n  [super viewDidLoad];\n  \n\n  UIScrollView *contentView = [UIScrollView new];\n  contentView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-44);\n  [self.view addSubview:contentView];\n  \n  \n  UIView *child1 = [UIView new];\n  child1.backgroundColor = [UIColor blueColor];\n  \n  [child1 fb_makeLayout:^(FBLayout *layout) {\n    layout.width.height.equalTo(@100);\n  }];\n  \n  UIView *child2 = [UIView new];\n  child2.backgroundColor = [UIColor greenColor];\n  [child2 fb_makeLayout:^(FBLayout *layout) {\n    layout.equalTo(child1);\n  }];\n  \n  \n  UILabel *child3 = [UILabel new];\n  child3.numberOfLines = 0;\n  child3.backgroundColor = [UIColor yellowColor];\n  [child3 fb_wrapContent];\n  [child3 setAttributedText:[[NSAttributedString alloc] initWithString:@\"testfdsfdsfdsfdsfdsfdsafdsafdsafasdkkk\" attributes:@{NSFontAttributeName :[UIFont systemFontOfSize:18]}] ];\n  \n  [contentView addSubview:child1];\n  [contentView addSubview:child2];\n  [contentView addSubview:child3];\n  \n  \n  FBLayoutDiv *div1 = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionColumn\n                                               justifyContent:FBJustifySpaceBetween\n                                                   alignItems:FBAlignCenter\n                                                     children:@[child1, child2,child3]];\n  \n  \n  \n  [div1 fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(20, 0, 0, 0));\n    layout.width.equalTo(@(150));\n  }];\n  \n  \n  UIView *child5 = [UIView new];\n  child5.backgroundColor = [UIColor blueColor];\n  [child5 fb_makeLayout:^(FBLayout *layout) {\n    layout.width.height.equalTo(@(50)).margin.equalToEdgeInsets(UIEdgeInsetsMake(0, 0, 10, 0)).flexGrow.equalTo(@1.0);\n  }];\n  \n  UIView *child6 = [UIView new];\n  child6.backgroundColor = [UIColor greenColor];\n  [child6 fb_makeLayout:^(FBLayout *layout) {\n    layout.equalTo(child5);\n    layout.flexGrow.equalTo(@(2.0));\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 10, 10, 10));\n  }];\n\n  \n  UIView *child7 = [UIView new];\n  child7.backgroundColor = [UIColor yellowColor];\n  [child7 fb_makeLayout:^(FBLayout *layout) {\n    layout.equalTo(child5);\n  }];\n  \n  UIView *child8 = [UIView new];\n  child8.backgroundColor = [UIColor blackColor];\n  \n  [child8 fb_makeLayout:^(FBLayout *layout) {\n    layout.equalTo(child5);\n  }];\n  \n  FBLayoutDiv *div2 =[FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionColumn\n                                              justifyContent:FBJustifySpaceAround\n                                                  alignItems:FBAlignCenter\n                                                    children:@[child5,child6,child7,child8]];\n  [div2 fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(20, 0, 0, 0));\n    layout.width.equalTo(@(150));\n  }];\n  \n  [contentView addSubview:child5];\n  [contentView addSubview:child6];\n  [contentView addSubview:child7];\n  [contentView addSubview:child8];\n  \n  FBLayoutDiv *root = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionRow\n                                               justifyContent:FBJustifySpaceAround\n                                                   alignItems:FBAlignCenter\n                                                     children:@[div1,div2]];\n  \n  contentView.fb_contentDiv = root;\n  \n  [root fb_asyApplyLayoutWithSize:[UIScreen mainScreen].bounds.size];\n  \n}\n\n\n\n- (void)didReceiveMemoryWarning\n{\n    [super didReceiveMemoryWarning];\n}\n\n@end\n"
  },
  {
    "path": "Example/Example/FlexBoxLayout-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>${PRODUCT_NAME}</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.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>Launch Screen</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>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Example/FlexBoxLayout-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_5_0\n#warning \"This project uses features only available in iOS SDK 5.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n    @import UIKit;\n    @import Foundation;\n#endif\n"
  },
  {
    "path": "Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"retina4\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"ipad\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Example/Example/Images.xcassets/breaddoge.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"dogebread.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/doge.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"doge@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/forkingdog.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"forkingdog@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/phil.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"phil.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/sark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sark@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/sinojerk.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"彪哥副本.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Images.xcassets/sunnyxx.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"下载.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Launch Screen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11134\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11106\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\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 © 2017年 qiang.shen. All rights reserved.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"obG-Y5-kRd\">\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"CSSLayout\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GJd-Yh-RWb\">\n                                <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"obG-Y5-kRd\" secondAttribute=\"centerX\" id=\"5cz-MP-9tL\"/>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"GJd-Yh-RWb\" secondAttribute=\"centerX\" id=\"Q3B-4B-g5h\"/>\n                            <constraint firstItem=\"obG-Y5-kRd\" firstAttribute=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"SfN-ll-jLj\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"obG-Y5-kRd\" secondAttribute=\"bottom\" constant=\"20\" id=\"Y44-ml-fuU\"/>\n                            <constraint firstItem=\"GJd-Yh-RWb\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"moa-c2-u7t\"/>\n                            <constraint firstItem=\"GJd-Yh-RWb\" firstAttribute=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"x7j-FC-K8j\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/Example/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16A323\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"y4e-fE-auX\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11524\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--FlexBoxLayout-->\n        <scene sceneID=\"eIz-kp-5jL\">\n            <objects>\n                <viewController id=\"qCQ-71-nNp\" customClass=\"FBViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"h4D-gH-18q\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"ZwW-Tm-JWv\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"mPL-z1-zKl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"618\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <extendedEdge key=\"edgesForExtendedLayout\" top=\"YES\"/>\n                    <tabBarItem key=\"tabBarItem\" title=\"FlexBoxLayout\" id=\"tq4-fF-nVu\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"mlC-J9-nbK\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"122\" y=\"410\"/>\n        </scene>\n        <!--Tab Bar Controller-->\n        <scene sceneID=\"73b-fV-RZe\">\n            <objects>\n                <tabBarController id=\"y4e-fE-auX\" sceneMemberID=\"viewController\">\n                    <extendedEdge key=\"edgesForExtendedLayout\"/>\n                    <tabBar key=\"tabBar\" contentMode=\"scaleToFill\" id=\"wjf-8T-XrZ\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" 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=\"qCQ-71-nNp\" kind=\"relationship\" relationship=\"viewControllers\" id=\"irL-hy-3x8\"/>\n                        <segue destination=\"pbz-Rs-97R\" kind=\"relationship\" relationship=\"viewControllers\" id=\"yFZ-g0-wlm\"/>\n                    </connections>\n                </tabBarController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"SDX-RN-v8h\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-830\" y=\"82\"/>\n        </scene>\n        <!--CSSTableView-->\n        <scene sceneID=\"eCm-RY-s1I\">\n            <objects>\n                <tableViewController id=\"pbz-Rs-97R\" customClass=\"FBTableViewController\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"mzG-U2-qRV\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"618\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"fb_kCellIdentifier\" id=\"gAl-xg-McD\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"375\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"gAl-xg-McD\" id=\"d8R-zz-S9b\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"43.5\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"pbz-Rs-97R\" id=\"zoL-L1-9Wr\"/>\n                            <outlet property=\"delegate\" destination=\"pbz-Rs-97R\" id=\"Onb-sX-wpq\"/>\n                        </connections>\n                    </tableView>\n                    <extendedEdge key=\"edgesForExtendedLayout\" top=\"YES\"/>\n                    <tabBarItem key=\"tabBarItem\" title=\"CSSTableView\" id=\"JG6-TH-djZ\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Kzv-fr-cc4\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-1\" y=\"-323\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/Example/data.json",
    "content": "{\n    \"feed\": [\n             {\n             \"title\": \"Hello world\",\n             \"content\": \"This is forkingdog team. Here's our logo?\\nGithub: \\\"forkingdog\\\"\",\n             \"username\": \"forkingdog\",\n             \"time\": \"2015.04.10\",\n             \"imageName\": \"forkingdog\"\n             },\n             {\n             \"title\": \"Team member - sunnyxx\",\n             \"content\": \"Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.11\",\n             \"imageName\": \"sunnyxx\"\n             },\n             {\n             \"title\": \"Team member - SinoJerk\",\n             \"content\": \"Zhidao iOS team, Daifu Tang (aka 彪哥)Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sinojerk\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"sinojerk\"\n             },\n             {\n             \"title\": \"Team member - Phil\",\n             \"content\": \"Zhidao iOS team, Jiaqi Guo, Github: philcnWorking at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"phil\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"phil\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1) Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or tWorking at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了o take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Hello world\",\n             \"content\": \"This is forkingdog team. Here's our logo?\\nGithub: \\\"forkingdog\\\"\",\n             \"username\": \"forkingdog\",\n             \"time\": \"2015.04.10\",\n             \"imageName\": \"forkingdog\"\n             },\n             {\n             \"title\": \"Team member - sunnyxx\",\n             \"content\": \"Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.11\",\n             \"imageName\": \"sunnyxx\"\n             },\n             {\n             \"title\": \"Team member - SinoJerk\",\n             \"content\": \"Zhidao iOS team, Daifu Tang (aka 彪哥)\",\n             \"username\": \"sinojerk\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"sinojerk\"\n             },\n             {\n             \"title\": \"Team member - Phil\",\n             \"content\": \"Zhidao iOS team, Jiaqi Guo, Github: philcn\",\n             \"username\": \"phil\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"phil\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },{\n             \"title\": \"Hello world\",\n             \"content\": \"This is forkingdog team. Here's our logo?\\nGithub: \\\"forkingdog\\\"\",\n             \"username\": \"forkingdog\",\n             \"time\": \"2015.04.10\",\n             \"imageName\": \"forkingdog\"\n             },\n             {\n             \"title\": \"Team member - sunnyxx\",\n             \"content\": \"Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.11\",\n             \"imageName\": \"sunnyxx\"\n             },\n             {\n             \"title\": \"Team member - SinoJerk\",\n             \"content\": \"Zhidao iOS team, Daifu Tang (aka 彪哥)\",\n             \"username\": \"sinojerk\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"sinojerk\"\n             },\n             {\n             \"title\": \"Team member - Phil\",\n             \"content\": \"Zhidao iOS team, Jiaqi Guo, Github: philcn\",\n             \"username\": \"phil\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"phil\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Hello world\",\n             \"content\": \"This is forkingdog team. Here's our logo?\\nGithub: \\\"forkingdog\\\"\",\n             \"username\": \"forkingdog\",\n             \"time\": \"2015.04.10\",\n             \"imageName\": \"forkingdog\"\n             },\n             {\n             \"title\": \"Team member - sunnyxx\",\n             \"content\": \"Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.11\",\n             \"imageName\": \"sunnyxx\"\n             },\n             {\n             \"title\": \"Team member - SinoJerk\",\n             \"content\": \"Zhidao iOS team, Daifu Tang (aka 彪哥)Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sinojerk\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"sinojerk\"\n             },\n             {\n             \"title\": \"Team member - Phil\",\n             \"content\": \"Zhidao iOS team, Jiaqi Guo, Github: philcnWorking at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"phil\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"phil\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1) Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or tWorking at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了o take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Hello world\",\n             \"content\": \"This is forkingdog team. Here's our logo?\\nGithub: \\\"forkingdog\\\"\",\n             \"username\": \"forkingdog\",\n             \"time\": \"2015.04.10\",\n             \"imageName\": \"forkingdog\"\n             },\n             {\n             \"title\": \"Team member - sunnyxx\",\n             \"content\": \"Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.11\",\n             \"imageName\": \"sunnyxx\"\n             },\n             {\n             \"title\": \"Team member - SinoJerk\",\n             \"content\": \"Zhidao iOS team, Daifu Tang (aka 彪哥)\",\n             \"username\": \"sinojerk\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"sinojerk\"\n             },\n             {\n             \"title\": \"Team member - Phil\",\n             \"content\": \"Zhidao iOS team, Jiaqi Guo, Github: philcn\",\n             \"username\": \"phil\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"phil\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },{\n             \"title\": \"Hello world\",\n             \"content\": \"This is forkingdog team. Here's our logo?\\nGithub: \\\"forkingdog\\\"\",\n             \"username\": \"forkingdog\",\n             \"time\": \"2015.04.10\",\n             \"imageName\": \"forkingdog\"\n             },\n             {\n             \"title\": \"Team member - sunnyxx\",\n             \"content\": \"Working at Baidu, Zhidao iOS team, weibo: @我就叫Sunny怎么了\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.11\",\n             \"imageName\": \"sunnyxx\"\n             },\n             {\n             \"title\": \"Team member - SinoJerk\",\n             \"content\": \"Zhidao iOS team, Daifu Tang (aka 彪哥)\",\n             \"username\": \"sinojerk\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"sinojerk\"\n             },\n             {\n             \"title\": \"Team member - Phil\",\n             \"content\": \"Zhidao iOS team, Jiaqi Guo, Github: philcn\",\n             \"username\": \"phil\",\n             \"time\": \"2015.04.15\",\n             \"imageName\": \"phil\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"Good name in man and woman, dear my lord, is the immediate jewel of their souls: Who steals my purse steals trash; ’tis something, nothing. (Othello 3.3) \",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.12\",\n             \"imageName\": \"breaddoge\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"William Shakespeare\",\n             \"content\": \"To be, or not to be —that is the question, Whether'tis nobler in the mind to suffer. The slings and arrows of outrageous fortune Or to take arms against a sea of troubles, And by opposing end them. To die —to sleep\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"\"\n             },\n             {\n             \"title\": \"Sark's bad guy (gay)\",\n             \"content\": \"\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.16\",\n             \"imageName\": \"sark\"\n             },\n             {\n             \"title\": \"\",\n             \"content\": \"Things base and vile, holding no quantity, love can transpose to from and dignity: love looks not with the eyes, but with mind. (A Midsummer Night’s Dream 1.1)\",\n             \"username\": \"sunnyxx\",\n             \"time\": \"2015.04.17\",\n             \"imageName\": \"\"\n             }\n             ]\n}\n"
  },
  {
    "path": "Example/Example/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Example/Example/main.m",
    "content": "//\n//  main.m\n//  CSSLayout\n//\n//  Created by qiang.shen on 01/03/2017.\n//  Copyright (c) 2017 qiang.shen. All rights reserved.\n//\n\n@import UIKit;\n#import \"FBAppDelegate.h\"\n\nint main(int argc, char * argv[])\n{\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([FBAppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "Example/FlexBoxLayout.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\t1B504DC51E699709005F39BA /* data.json in Resources */ = {isa = PBXBuildFile; fileRef = 1B504DAF1E699709005F39BA /* data.json */; };\n\t\t1B504DC61E699709005F39BA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1B504DB01E699709005F39BA /* InfoPlist.strings */; };\n\t\t1B504DC71E699709005F39BA /* FBAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B504DB31E699709005F39BA /* FBAppDelegate.m */; };\n\t\t1B504DC81E699709005F39BA /* FBFeedModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B504DB51E699709005F39BA /* FBFeedModel.m */; };\n\t\t1B504DC91E699709005F39BA /* FBFeedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B504DB71E699709005F39BA /* FBFeedView.m */; };\n\t\t1B504DCA1E699709005F39BA /* FBFPSGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B504DB91E699709005F39BA /* FBFPSGraph.m */; };\n\t\t1B504DCB1E699709005F39BA /* FBTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B504DBB1E699709005F39BA /* FBTableViewController.m */; };\n\t\t1B504DCC1E699709005F39BA /* FBViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B504DBD1E699709005F39BA /* FBViewController.m */; };\n\t\t1B504DCD1E699709005F39BA /* FlexBoxLayout-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1B504DBE1E699709005F39BA /* FlexBoxLayout-Info.plist */; };\n\t\t1B504DCE1E699709005F39BA /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1B504DC01E699709005F39BA /* Images.xcassets */; };\n\t\t1B504DCF1E699709005F39BA /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B504DC11E699709005F39BA /* Launch Screen.storyboard */; };\n\t\t1B504DD01E699709005F39BA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B504DC21E699709005F39BA /* main.m */; };\n\t\t1B504DD11E699709005F39BA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B504DC31E699709005F39BA /* Main.storyboard */; };\n\t\t1B504DD21E699709005F39BA /* show.gif in Resources */ = {isa = PBXBuildFile; fileRef = 1B504DC41E699709005F39BA /* show.gif */; };\n\t\t6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; };\n\t\t6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; };\n\t\t6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; };\n\t\t6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; };\n\t\t6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; };\n\t\t6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; };\n\t\t6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; };\n\t\t6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; };\n\t\tB5B68B60067C1C8B9BFFD7F7 /* Pods_FlexBoxLayout_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6764F96706C8B51001BC1C37 /* Pods_FlexBoxLayout_Example.framework */; };\n\t\tE01EC6B795C9A60747C3FB42 /* Pods_CSSLayout_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD6B95245F63FD5FE35E42 /* Pods_CSSLayout_Tests.framework */; };\n\t\tF3153B8C0BD5351F97BF4F63 /* Pods_FlexBoxLayout_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C49EF148E22F0F64A0AB1B2B /* Pods_FlexBoxLayout_Tests.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 6003F582195388D10070C39A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 6003F589195388D20070C39A;\n\t\t\tremoteInfo = CSSLayout;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t068C0B79AF1323F8E288905F /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = \"<group>\"; };\n\t\t18D4B89CF6E54D1B702F9867 /* Pods-CSSLayout_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-CSSLayout_Example.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-CSSLayout_Example/Pods-CSSLayout_Example.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t1B504DAF1E699709005F39BA /* data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = data.json; sourceTree = \"<group>\"; };\n\t\t1B504DB11E699709005F39BA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t1B504DB21E699709005F39BA /* FBAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t1B504DB31E699709005F39BA /* FBAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t1B504DB41E699709005F39BA /* FBFeedModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFeedModel.h; sourceTree = \"<group>\"; };\n\t\t1B504DB51E699709005F39BA /* FBFeedModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBFeedModel.m; sourceTree = \"<group>\"; };\n\t\t1B504DB61E699709005F39BA /* FBFeedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFeedView.h; sourceTree = \"<group>\"; };\n\t\t1B504DB71E699709005F39BA /* FBFeedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBFeedView.m; sourceTree = \"<group>\"; };\n\t\t1B504DB81E699709005F39BA /* FBFPSGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFPSGraph.h; sourceTree = \"<group>\"; };\n\t\t1B504DB91E699709005F39BA /* FBFPSGraph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBFPSGraph.m; sourceTree = \"<group>\"; };\n\t\t1B504DBA1E699709005F39BA /* FBTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBTableViewController.h; sourceTree = \"<group>\"; };\n\t\t1B504DBB1E699709005F39BA /* FBTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBTableViewController.m; sourceTree = \"<group>\"; };\n\t\t1B504DBC1E699709005F39BA /* FBViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBViewController.h; sourceTree = \"<group>\"; };\n\t\t1B504DBD1E699709005F39BA /* FBViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBViewController.m; sourceTree = \"<group>\"; };\n\t\t1B504DBE1E699709005F39BA /* FlexBoxLayout-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = \"FlexBoxLayout-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t1B504DBF1E699709005F39BA /* FlexBoxLayout-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"FlexBoxLayout-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t1B504DC01E699709005F39BA /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t1B504DC11E699709005F39BA /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = \"Launch Screen.storyboard\"; sourceTree = \"<group>\"; };\n\t\t1B504DC21E699709005F39BA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t1B504DC31E699709005F39BA /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = \"<group>\"; };\n\t\t1B504DC41E699709005F39BA /* show.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = show.gif; sourceTree = \"<group>\"; };\n\t\t28FD6B95245F63FD5FE35E42 /* Pods_CSSLayout_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CSSLayout_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t292FC21B24FA1B08B43F517C /* Pods-CSSLayout_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-CSSLayout_Tests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-CSSLayout_Tests/Pods-CSSLayout_Tests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3212EEC1552C4000D2191436 /* Pods-FlexBoxLayout_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FlexBoxLayout_Example.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t52EC424DC9D27ECAAB290F40 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = \"<group>\"; };\n\t\t6003F58A195388D20070C39A /* FlexBoxLayout_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FlexBoxLayout_Example.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t6003F5AE195388D20070C39A /* FlexBoxLayout_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlexBoxLayout_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\t6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"Tests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = \"<group>\"; };\n\t\t606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Tests-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t6764F96706C8B51001BC1C37 /* Pods_FlexBoxLayout_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FlexBoxLayout_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6D099FB4ACC9803FF52C67AC /* FlexBoxLayout.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = FlexBoxLayout.podspec; path = ../FlexBoxLayout.podspec; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\tA0D4C00CEF45E50075D739C6 /* Pods-FlexBoxLayout_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FlexBoxLayout_Example.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB7A0145C4CAFFE471C48D6A1 /* Pods-CSSLayout_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-CSSLayout_Tests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-CSSLayout_Tests/Pods-CSSLayout_Tests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB9CF66F3893828F1349FC4B1 /* Pods-FlexBoxLayout_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FlexBoxLayout_Tests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tC49EF148E22F0F64A0AB1B2B /* Pods_FlexBoxLayout_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FlexBoxLayout_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCF9E9E0911EE83E18A2B68D7 /* Pods-CSSLayout_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-CSSLayout_Example.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-CSSLayout_Example/Pods-CSSLayout_Example.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD6DC2FE7479FD607DCE17A8F /* Pods_CSSLayout_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CSSLayout_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tDFFCD98910AFEBDEE9B4188D /* Pods-FlexBoxLayout_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FlexBoxLayout_Tests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t6003F587195388D20070C39A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t6003F592195388D20070C39A /* UIKit.framework in Frameworks */,\n\t\t\t\t6003F58E195388D20070C39A /* Foundation.framework in Frameworks */,\n\t\t\t\tB5B68B60067C1C8B9BFFD7F7 /* Pods_FlexBoxLayout_Example.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6003F5AB195388D20070C39A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */,\n\t\t\t\t6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */,\n\t\t\t\t6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */,\n\t\t\t\tE01EC6B795C9A60747C3FB42 /* Pods_CSSLayout_Tests.framework in Frameworks */,\n\t\t\t\tF3153B8C0BD5351F97BF4F63 /* Pods_FlexBoxLayout_Tests.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1B504DAE1E699709005F39BA /* Example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B504DAF1E699709005F39BA /* data.json */,\n\t\t\t\t1B504DB01E699709005F39BA /* InfoPlist.strings */,\n\t\t\t\t1B504DB21E699709005F39BA /* FBAppDelegate.h */,\n\t\t\t\t1B504DB31E699709005F39BA /* FBAppDelegate.m */,\n\t\t\t\t1B504DB41E699709005F39BA /* FBFeedModel.h */,\n\t\t\t\t1B504DB51E699709005F39BA /* FBFeedModel.m */,\n\t\t\t\t1B504DB61E699709005F39BA /* FBFeedView.h */,\n\t\t\t\t1B504DB71E699709005F39BA /* FBFeedView.m */,\n\t\t\t\t1B504DB81E699709005F39BA /* FBFPSGraph.h */,\n\t\t\t\t1B504DB91E699709005F39BA /* FBFPSGraph.m */,\n\t\t\t\t1B504DBA1E699709005F39BA /* FBTableViewController.h */,\n\t\t\t\t1B504DBB1E699709005F39BA /* FBTableViewController.m */,\n\t\t\t\t1B504DBC1E699709005F39BA /* FBViewController.h */,\n\t\t\t\t1B504DBD1E699709005F39BA /* FBViewController.m */,\n\t\t\t\t1B504DBE1E699709005F39BA /* FlexBoxLayout-Info.plist */,\n\t\t\t\t1B504DBF1E699709005F39BA /* FlexBoxLayout-Prefix.pch */,\n\t\t\t\t1B504DC01E699709005F39BA /* Images.xcassets */,\n\t\t\t\t1B504DC11E699709005F39BA /* Launch Screen.storyboard */,\n\t\t\t\t1B504DC21E699709005F39BA /* main.m */,\n\t\t\t\t1B504DC31E699709005F39BA /* Main.storyboard */,\n\t\t\t\t1B504DC41E699709005F39BA /* show.gif */,\n\t\t\t);\n\t\t\tpath = Example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5CAF783DFE8EA55D73A1D59A /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCF9E9E0911EE83E18A2B68D7 /* Pods-CSSLayout_Example.debug.xcconfig */,\n\t\t\t\t18D4B89CF6E54D1B702F9867 /* Pods-CSSLayout_Example.release.xcconfig */,\n\t\t\t\tB7A0145C4CAFFE471C48D6A1 /* Pods-CSSLayout_Tests.debug.xcconfig */,\n\t\t\t\t292FC21B24FA1B08B43F517C /* Pods-CSSLayout_Tests.release.xcconfig */,\n\t\t\t\tA0D4C00CEF45E50075D739C6 /* Pods-FlexBoxLayout_Example.debug.xcconfig */,\n\t\t\t\t3212EEC1552C4000D2191436 /* Pods-FlexBoxLayout_Example.release.xcconfig */,\n\t\t\t\tDFFCD98910AFEBDEE9B4188D /* Pods-FlexBoxLayout_Tests.debug.xcconfig */,\n\t\t\t\tB9CF66F3893828F1349FC4B1 /* Pods-FlexBoxLayout_Tests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6003F581195388D10070C39A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B504DAE1E699709005F39BA /* Example */,\n\t\t\t\t60FF7A9C1954A5C5007DD14C /* Podspec Metadata */,\n\t\t\t\t6003F5B5195388D20070C39A /* Tests */,\n\t\t\t\t6003F58C195388D20070C39A /* Frameworks */,\n\t\t\t\t6003F58B195388D20070C39A /* Products */,\n\t\t\t\t5CAF783DFE8EA55D73A1D59A /* Pods */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6003F58B195388D20070C39A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6003F58A195388D20070C39A /* FlexBoxLayout_Example.app */,\n\t\t\t\t6003F5AE195388D20070C39A /* FlexBoxLayout_Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6003F58C195388D20070C39A /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6003F58D195388D20070C39A /* Foundation.framework */,\n\t\t\t\t6003F58F195388D20070C39A /* CoreGraphics.framework */,\n\t\t\t\t6003F591195388D20070C39A /* UIKit.framework */,\n\t\t\t\t6003F5AF195388D20070C39A /* XCTest.framework */,\n\t\t\t\tD6DC2FE7479FD607DCE17A8F /* Pods_CSSLayout_Example.framework */,\n\t\t\t\t28FD6B95245F63FD5FE35E42 /* Pods_CSSLayout_Tests.framework */,\n\t\t\t\t6764F96706C8B51001BC1C37 /* Pods_FlexBoxLayout_Example.framework */,\n\t\t\t\tC49EF148E22F0F64A0AB1B2B /* Pods_FlexBoxLayout_Tests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6003F5B5195388D20070C39A /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6003F5BB195388D20070C39A /* Tests.m */,\n\t\t\t\t6003F5B6195388D20070C39A /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6003F5B6195388D20070C39A /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6003F5B7195388D20070C39A /* Tests-Info.plist */,\n\t\t\t\t6003F5B8195388D20070C39A /* InfoPlist.strings */,\n\t\t\t\t606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D099FB4ACC9803FF52C67AC /* FlexBoxLayout.podspec */,\n\t\t\t\t52EC424DC9D27ECAAB290F40 /* README.md */,\n\t\t\t\t068C0B79AF1323F8E288905F /* LICENSE */,\n\t\t\t);\n\t\t\tname = \"Podspec Metadata\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t6003F589195388D20070C39A /* FlexBoxLayout_Example */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget \"FlexBoxLayout_Example\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6E87588D0023C9959A95585D /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t6003F586195388D20070C39A /* Sources */,\n\t\t\t\t6003F587195388D20070C39A /* Frameworks */,\n\t\t\t\t6003F588195388D20070C39A /* Resources */,\n\t\t\t\tD494E9B8BDEC1BCE97924FAB /* [CP] Embed Pods Frameworks */,\n\t\t\t\t14D4A1F23C16937E0215CE0C /* [CP] Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = FlexBoxLayout_Example;\n\t\t\tproductName = CSSLayout;\n\t\t\tproductReference = 6003F58A195388D20070C39A /* FlexBoxLayout_Example.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t6003F5AD195388D20070C39A /* FlexBoxLayout_Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget \"FlexBoxLayout_Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t030B1D524966A6889A2B17B6 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t6003F5AA195388D20070C39A /* Sources */,\n\t\t\t\t6003F5AB195388D20070C39A /* Frameworks */,\n\t\t\t\t6003F5AC195388D20070C39A /* Resources */,\n\t\t\t\tD8B3D3976E30337C85147C8B /* [CP] Embed Pods Frameworks */,\n\t\t\t\t907FAE99B5F337A286DB306C /* [CP] Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t6003F5B4195388D20070C39A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = FlexBoxLayout_Tests;\n\t\t\tproductName = CSSLayoutTests;\n\t\t\tproductReference = 6003F5AE195388D20070C39A /* FlexBoxLayout_Tests.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\t6003F582195388D10070C39A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = CSS;\n\t\t\t\tLastUpgradeCheck = 0810;\n\t\t\t\tORGANIZATIONNAME = qiang.shen;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t6003F589195388D20070C39A = {\n\t\t\t\t\t\tDevelopmentTeam = CNS46A8385;\n\t\t\t\t\t};\n\t\t\t\t\t6003F5AD195388D20070C39A = {\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t\tTestTargetID = 6003F589195388D20070C39A;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject \"FlexBoxLayout\" */;\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 = 6003F581195388D10070C39A;\n\t\t\tproductRefGroup = 6003F58B195388D20070C39A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6003F589195388D20070C39A /* FlexBoxLayout_Example */,\n\t\t\t\t6003F5AD195388D20070C39A /* FlexBoxLayout_Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t6003F588195388D20070C39A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1B504DCD1E699709005F39BA /* FlexBoxLayout-Info.plist in Resources */,\n\t\t\t\t1B504DCE1E699709005F39BA /* Images.xcassets in Resources */,\n\t\t\t\t1B504DC51E699709005F39BA /* data.json in Resources */,\n\t\t\t\t1B504DD11E699709005F39BA /* Main.storyboard in Resources */,\n\t\t\t\t1B504DCF1E699709005F39BA /* Launch Screen.storyboard in Resources */,\n\t\t\t\t1B504DD21E699709005F39BA /* show.gif in Resources */,\n\t\t\t\t1B504DC61E699709005F39BA /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6003F5AC195388D20070C39A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t030B1D524966A6889A2B17B6 /* [CP] Check Pods Manifest.lock */ = {\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\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-FlexBoxLayout_Tests-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t14D4A1F23C16937E0215CE0C /* [CP] Copy Pods Resources */ = {\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\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t6E87588D0023C9959A95585D /* [CP] Check Pods Manifest.lock */ = {\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\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-FlexBoxLayout_Example-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t907FAE99B5F337A286DB306C /* [CP] Copy Pods Resources */ = {\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\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tD494E9B8BDEC1BCE97924FAB /* [CP] Embed Pods Frameworks */ = {\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}/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/FlexBoxLayout/FlexBoxLayout.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FlexBoxLayout.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tD8B3D3976E30337C85147C8B /* [CP] Embed Pods Frameworks */ = {\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\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t6003F586195388D20070C39A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1B504DC91E699709005F39BA /* FBFeedView.m in Sources */,\n\t\t\t\t1B504DCB1E699709005F39BA /* FBTableViewController.m in Sources */,\n\t\t\t\t1B504DCC1E699709005F39BA /* FBViewController.m in Sources */,\n\t\t\t\t1B504DC71E699709005F39BA /* FBAppDelegate.m in Sources */,\n\t\t\t\t1B504DCA1E699709005F39BA /* FBFPSGraph.m in Sources */,\n\t\t\t\t1B504DD01E699709005F39BA /* main.m in Sources */,\n\t\t\t\t1B504DC81E699709005F39BA /* FBFeedModel.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6003F5AA195388D20070C39A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6003F5BC195388D20070C39A /* Tests.m 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\t6003F5B4195388D20070C39A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 6003F589195388D20070C39A /* FlexBoxLayout_Example */;\n\t\t\ttargetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t1B504DB01E699709005F39BA /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1B504DB11E699709005F39BA /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6003F5B8195388D20070C39A /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t6003F5B9195388D20070C39A /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t6003F5BD195388D20070C39A /* 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_INFINITE_RECURSION = 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_SUSPICIOUS_MOVE = YES;\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\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.3;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6003F5BE195388D20070C39A /* 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_INFINITE_RECURSION = 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_SUSPICIOUS_MOVE = YES;\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 = YES;\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.3;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6003F5C0195388D20070C39A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = A0D4C00CEF45E50075D739C6 /* Pods-FlexBoxLayout_Example.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tDEVELOPMENT_TEAM = CNS46A8385;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Example/FlexBoxLayout-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Example/FlexBoxLayout-Info.plist\";\n\t\t\t\tMODULE_NAME = ExampleApp;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6003F5C1195388D20070C39A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 3212EEC1552C4000D2191436 /* Pods-FlexBoxLayout_Example.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tDEVELOPMENT_TEAM = CNS46A8385;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Example/FlexBoxLayout-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Example/FlexBoxLayout-Info.plist\";\n\t\t\t\tMODULE_NAME = ExampleApp;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6003F5C3195388D20070C39A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = DFFCD98910AFEBDEE9B4188D /* Pods-FlexBoxLayout_Tests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\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\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Tests/Tests-Prefix.pch\";\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 = \"Tests/Tests-Info.plist\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/FlexBoxLayout_Example.app/FlexBoxLayout_Example\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6003F5C4195388D20070C39A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B9CF66F3893828F1349FC4B1 /* Pods-FlexBoxLayout_Tests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\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\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Tests/Tests-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Tests/Tests-Info.plist\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/FlexBoxLayout_Example.app/FlexBoxLayout_Example\";\n\t\t\t\tWRAPPER_EXTENSION = xctest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t6003F585195388D10070C39A /* Build configuration list for PBXProject \"FlexBoxLayout\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6003F5BD195388D20070C39A /* Debug */,\n\t\t\t\t6003F5BE195388D20070C39A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget \"FlexBoxLayout_Example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6003F5C0195388D20070C39A /* Debug */,\n\t\t\t\t6003F5C1195388D20070C39A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget \"FlexBoxLayout_Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6003F5C3195388D20070C39A /* Debug */,\n\t\t\t\t6003F5C4195388D20070C39A /* 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 = 6003F582195388D10070C39A /* Project object */;\n}\n"
  },
  {
    "path": "Example/FlexBoxLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:CSSLayout.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Example/FlexBoxLayout.xcodeproj/xcshareddata/xcschemes/FlexBoxLayout_Example.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0810\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6003F589195388D20070C39A\"\n               BuildableName = \"FlexBoxLayout_Example.app\"\n               BlueprintName = \"FlexBoxLayout_Example\"\n               ReferencedContainer = \"container:FlexBoxLayout.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6003F589195388D20070C39A\"\n            BuildableName = \"FlexBoxLayout_Example.app\"\n            BlueprintName = \"FlexBoxLayout_Example\"\n            ReferencedContainer = \"container:FlexBoxLayout.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6003F589195388D20070C39A\"\n            BuildableName = \"FlexBoxLayout_Example.app\"\n            BlueprintName = \"FlexBoxLayout_Example\"\n            ReferencedContainer = \"container:FlexBoxLayout.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"key:OS_ACTIVITY_MODE\"\n            value = \"disable\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6003F589195388D20070C39A\"\n            BuildableName = \"FlexBoxLayout_Example.app\"\n            BlueprintName = \"FlexBoxLayout_Example\"\n            ReferencedContainer = \"container:FlexBoxLayout.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Example/FlexBoxLayout.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:FlexBoxLayout.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Example/Podfile",
    "content": "use_frameworks!\n\ntarget 'FlexBoxLayout_Example' do\n  pod 'FlexBoxLayout', :path => '../'\n\n  target 'FlexBoxLayout_Tests' do\n    inherit! :search_paths\n  end\nend\n"
  },
  {
    "path": "Example/Pods/Local Podspecs/CSSLayout.podspec.json",
    "content": "{\n  \"name\": \"CSSLayout\",\n  \"version\": \"0.1.0\",\n  \"summary\": \"A short description of CSSLayout.\",\n  \"description\": \"TODO: Add long description of the pod here.\",\n  \"homepage\": \"https://github.com/<GITHUB_USERNAME>/CSSLayout\",\n  \"license\": {\n    \"type\": \"MIT\",\n    \"file\": \"LICENSE\"\n  },\n  \"authors\": {\n    \"qiang.shen\": \"qiang..shen@ele.me\"\n  },\n  \"source\": {\n    \"git\": \"https://github.com/<GITHUB_USERNAME>/CSSLayout.git\",\n    \"tag\": \"0.1.0\"\n  },\n  \"platforms\": {\n    \"ios\": \"8.0\"\n  },\n  \"source_files\": \"CSSLayout/Classes/**/*\"\n}\n"
  },
  {
    "path": "Example/Pods/Local Podspecs/FlexBoxLayout.podspec.json",
    "content": "{\n  \"name\": \"FlexBoxLayout\",\n  \"version\": \"0.8.0\",\n  \"summary\": \"iOS Flexbox layout\",\n  \"description\": \"iOS Flexbox layout.\",\n  \"homepage\": \"https://github.com/LPD-iOS/FlexBoxLayout\",\n  \"license\": {\n    \"type\": \"MIT\",\n    \"file\": \"LICENSE\"\n  },\n  \"authors\": {\n    \"qiang.shen\": \"qiang..shen@ele.me\"\n  },\n  \"source\": {\n    \"git\": \"https://github.com/LPD-iOS/FlexBoxLayout.git\",\n    \"tag\": \"0.8.0\"\n  },\n  \"platforms\": {\n    \"ios\": \"7.0\"\n  },\n  \"source_files\": \"FlexBoxLayout/Classes/**/*\"\n}\n"
  },
  {
    "path": "Example/Pods/Pods.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\t074281F10B4BD032C759D5E027979F25 /* UIScrollView+FBLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = A679FAD04E34D2928A10E6EF7D8E654A /* UIScrollView+FBLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t0AFB39D1C712985A6DF7A6AA4452FDAF /* UIView+FBLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = F2AD820207A75360574CEAADD230F65F /* UIView+FBLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t12E761460A9A1A30D9D2D4282325CC60 /* Yoga.h in Headers */ = {isa = PBXBuildFile; fileRef = A287CB6AFC514232A851E69344B0C197 /* Yoga.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t160DBAF5EEC188CC905C78225949E46A /* UIView+CellStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = A1956BA50EDC91A59FA37AFE95186638 /* UIView+CellStyle.m */; };\n\t\t1E4075A62064FD9E005E2E283403B23B /* Pods-FlexBoxLayout_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E66EE03D48B624AC02A2B49D889D5A /* Pods-FlexBoxLayout_Tests-dummy.m */; };\n\t\t223110F99A8EB144E28C7A448594E7CE /* FBLayoutDiv.h in Headers */ = {isa = PBXBuildFile; fileRef = 23C0BD45B3C29027EE7A49BF1279DDD1 /* FBLayoutDiv.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t24A20B48A74554EAF8D4E651EA114EB2 /* UIView+CellStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A8E86EEE8799A1D99189FC3BEA7C81D /* UIView+CellStyle.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t27796ECDA59185A953DA0FFA57B7F25E /* FBLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = E02AD018C1A71AE618C53C4B1C8567D2 /* FBLayout.m */; };\n\t\t27C50BB61366FC186DBEF19F8B5619CA /* FBLayoutDiv.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C389877D7EC3455CB33481430658905 /* FBLayoutDiv.m */; };\n\t\t28B81C6B1EA79390B8C3D00389EE1354 /* FBAsyLayoutTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = C86831EFE6EA0D9F5004DA92522F13A1 /* FBAsyLayoutTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2AF7B3DD54EC7C69B3414BE68F98CB1F /* FBLayout+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = FD83157240386FD10108EF2B8E81763A /* FBLayout+Private.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2E213AAA3CF36ED57D275F7332CE8121 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; };\n\t\t332BB3A134C141A3847282116ADBD7B8 /* Pods-FlexBoxLayout_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 46DA683DCAD78388835833164C99E397 /* Pods-FlexBoxLayout_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3941FB3BA6FDE9ED9310749F8F22BD15 /* FBAsyLayoutTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = EF09C7361790D94CDDE0B1849DB46774 /* FBAsyLayoutTransaction.m */; };\n\t\t44AAFAB497B669E871FCB7C57EE29340 /* UIScrollView+FBLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 625814E8687BD6E4CCBE9617FC149010 /* UIScrollView+FBLayout.m */; };\n\t\t47A387E0F410A35C50BFBC6C5FCC8F91 /* UITableView+FBLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = CE1FC63FC96981D06A3145050F77B1FA /* UITableView+FBLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t496E51C79E3311FFB35B9CC79B7F32F0 /* FBViewLayoutCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 140E720A6BF95DEFE96A0AFA0EF78466 /* FBViewLayoutCache.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t59463ECB80BD00322BEB10F9118C339A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; };\n\t\t5F3AC3EB714F932B822F6D52882C98A6 /* Yoga.c in Sources */ = {isa = PBXBuildFile; fileRef = E2242E03251D75704DA9C06CA859A2A6 /* Yoga.c */; };\n\t\t624F5C60A91E1EA916CE7B86CE8974B9 /* YGEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 4477E26F28167791E966128D63112285 /* YGEnums.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A5BC9B29458BB3F9C97970198337558 /* UIView+FBLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 275F2A9FE9B427666D1BC31E1F8F69CF /* UIView+FBLayout.m */; };\n\t\t9A3DDC6F730C6543869415D12A458769 /* FlexBoxLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 05C23A869CC871BC17105D506FCE81A5 /* FlexBoxLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA41191AF6702A33307CA6D7DC494C35B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; };\n\t\tB144BB144F3C840B2F389A2BBF7D990E /* YGNodeList.c in Sources */ = {isa = PBXBuildFile; fileRef = 6A0685EC7AE20051150BD74E405C9385 /* YGNodeList.c */; };\n\t\tB6810986A273F9F4E7A31FDA9176FDCE /* FBViewLayoutCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A5BA61E51C24B927D535BB0A3E250E07 /* FBViewLayoutCache.m */; };\n\t\tBB0682994A5FE52268169DED0E68FEF3 /* YGMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F91BE6DCC560C47418328E24F7FB966 /* YGMacros.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tBB926D7643C5657CA0DCB0B2DF2BD0D5 /* FlexBoxLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D24416D14C30E5B422EFBDF4D4C68F20 /* FlexBoxLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tBD01BBB9FF61C08AE7806A1B19A5E037 /* Pods-FlexBoxLayout_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D8B3565582A311827EF5F4F6CBF3C79 /* Pods-FlexBoxLayout_Example-dummy.m */; };\n\t\tD2988A2D09C135F5E062AA9CF6CAF29B /* FBLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8238C5AA11691DC26D6C024915641692 /* FBLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD4267BA56BFD5B6CCF6917C701D3E3AD /* FlexBoxLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C4D1F5DC7482CA5B3D588FCB9BBEA7F /* FlexBoxLayout-dummy.m */; };\n\t\tDF49D00F0E322A434FF3AE3D03863C26 /* YGNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = ED7026F42D6CE0E7CAEFACC393F767C2 /* YGNodeList.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tED7582975465F2BD5D259CAB10565680 /* FBLayoutProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = FF938746E92980E48A2B78703D1D331A /* FBLayoutProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF4331388A47E6E0B3623F132669DCA7E /* Pods-FlexBoxLayout_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 13F5D17844E15E7CD0244F2747C114B7 /* Pods-FlexBoxLayout_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF5B7D7A943DC0A8E664CE4ADB8F7E589 /* UITableView+FBLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FA68351A46C44F004B29A026C21F1F7 /* UITableView+FBLayout.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t5E31603E08815CFCF061BF7F7E2C48FB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 41E766C7E18FD317438ED40FF82DC6DC;\n\t\t\tremoteInfo = FlexBoxLayout;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t05C23A869CC871BC17105D506FCE81A5 /* FlexBoxLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FlexBoxLayout.h; path = FlexBoxLayout/Classes/FlexBoxLayout.h; sourceTree = \"<group>\"; };\n\t\t0F84B9E8D4A7A28998EF57C13810232E /* FlexBoxLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"FlexBoxLayout-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t13F5D17844E15E7CD0244F2747C114B7 /* Pods-FlexBoxLayout_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-FlexBoxLayout_Tests-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t140E720A6BF95DEFE96A0AFA0EF78466 /* FBViewLayoutCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FBViewLayoutCache.h; sourceTree = \"<group>\"; };\n\t\t1EB5B3A0601897C638905921C4E93709 /* FlexBoxLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FlexBoxLayout.xcconfig; sourceTree = \"<group>\"; };\n\t\t1FE6805B5D87366AFBDEFD27C98B290C /* FlexBoxLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FlexBoxLayout.framework; path = FlexBoxLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t23C0BD45B3C29027EE7A49BF1279DDD1 /* FBLayoutDiv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FBLayoutDiv.h; sourceTree = \"<group>\"; };\n\t\t275F2A9FE9B427666D1BC31E1F8F69CF /* UIView+FBLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UIView+FBLayout.m\"; sourceTree = \"<group>\"; };\n\t\t290E94BD29A9DCB9680BE35E94C6BD1A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t2D8B3565582A311827EF5F4F6CBF3C79 /* Pods-FlexBoxLayout_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-FlexBoxLayout_Example-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t2FD39294095E485283D8B39CC890D5B0 /* Pods-FlexBoxLayout_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-FlexBoxLayout_Tests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t30E66EE03D48B624AC02A2B49D889D5A /* Pods-FlexBoxLayout_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-FlexBoxLayout_Tests-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t37398D34E653DF09A2641D1FF0379F93 /* Pods-FlexBoxLayout_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = \"Pods-FlexBoxLayout_Tests.modulemap\"; sourceTree = \"<group>\"; };\n\t\t3920D39DA60C0E0A54E725A375A9D2F2 /* Pods-FlexBoxLayout_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-FlexBoxLayout_Example-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\t39EE870E022521F916CF1735D3872A9B /* Pods-FlexBoxLayout_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-FlexBoxLayout_Example.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3C4D1F5DC7482CA5B3D588FCB9BBEA7F /* FlexBoxLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"FlexBoxLayout-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t4477E26F28167791E966128D63112285 /* YGEnums.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YGEnums.h; sourceTree = \"<group>\"; };\n\t\t46DA683DCAD78388835833164C99E397 /* Pods-FlexBoxLayout_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-FlexBoxLayout_Example-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t4D5C5564506559994F56953653C0597F /* Pods-FlexBoxLayout_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-FlexBoxLayout_Tests-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\t4F91BE6DCC560C47418328E24F7FB966 /* YGMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YGMacros.h; sourceTree = \"<group>\"; };\n\t\t5291E0156247D0EA2FE84C4F847DA894 /* Pods_FlexBoxLayout_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_FlexBoxLayout_Example.framework; path = \"Pods-FlexBoxLayout_Example.framework\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t625814E8687BD6E4CCBE9617FC149010 /* UIScrollView+FBLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UIScrollView+FBLayout.m\"; sourceTree = \"<group>\"; };\n\t\t65F0519680CAC7157DD162A4BDAB8174 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = \"<group>\"; };\n\t\t6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\t6A0685EC7AE20051150BD74E405C9385 /* YGNodeList.c */ = {isa = PBXFileReference; includeInIndex = 1; path = YGNodeList.c; sourceTree = \"<group>\"; };\n\t\t6C389877D7EC3455CB33481430658905 /* FBLayoutDiv.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = FBLayoutDiv.m; sourceTree = \"<group>\"; };\n\t\t7C918EAC464D825B50D7323CE03CCBF4 /* Pods_FlexBoxLayout_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_FlexBoxLayout_Tests.framework; path = \"Pods-FlexBoxLayout_Tests.framework\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7D3E316A89DC03F48CC0478DBD27BB54 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8238C5AA11691DC26D6C024915641692 /* FBLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FBLayout.h; sourceTree = \"<group>\"; };\n\t\t87BD2A5B371E05B87DD42D2F9C51F1BB /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = \"<group>\"; };\n\t\t93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t97CF82D77B31C1A8057CE4673BB62703 /* Pods-FlexBoxLayout_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = \"Pods-FlexBoxLayout_Example.modulemap\"; sourceTree = \"<group>\"; };\n\t\t9A8E86EEE8799A1D99189FC3BEA7C81D /* UIView+CellStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UIView+CellStyle.h\"; sourceTree = \"<group>\"; };\n\t\t9CDD81E16FD57D9D94A4D625CAB6D1DD /* Pods-FlexBoxLayout_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-FlexBoxLayout_Tests-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\t9FA68351A46C44F004B29A026C21F1F7 /* UITableView+FBLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UITableView+FBLayout.m\"; sourceTree = \"<group>\"; };\n\t\tA1956BA50EDC91A59FA37AFE95186638 /* UIView+CellStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UIView+CellStyle.m\"; sourceTree = \"<group>\"; };\n\t\tA257B3145A7378ADE9EDED5C87D424B3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tA287CB6AFC514232A851E69344B0C197 /* Yoga.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Yoga.h; sourceTree = \"<group>\"; };\n\t\tA5BA61E51C24B927D535BB0A3E250E07 /* FBViewLayoutCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = FBViewLayoutCache.m; sourceTree = \"<group>\"; };\n\t\tA679FAD04E34D2928A10E6EF7D8E654A /* UIScrollView+FBLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UIScrollView+FBLayout.h\"; sourceTree = \"<group>\"; };\n\t\tA6AA8261A684BEDB4E39DE0039FB7CFE /* Pods-FlexBoxLayout_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-FlexBoxLayout_Example.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB5C67F5EB53D0F1E5B9F1D9AB04E04EB /* Pods-FlexBoxLayout_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-FlexBoxLayout_Tests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tBB2F23F43464233B16E4949A84AC95FF /* FlexBoxLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FlexBoxLayout.modulemap; sourceTree = \"<group>\"; };\n\t\tC5AEE383861D5A321567B20E0DA7DCFF /* FlexBoxLayout.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = FlexBoxLayout.podspec; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\tC86831EFE6EA0D9F5004DA92522F13A1 /* FBAsyLayoutTransaction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FBAsyLayoutTransaction.h; sourceTree = \"<group>\"; };\n\t\tCB76AF194B7D41D72CE4E18A95B9B1BB /* Pods-FlexBoxLayout_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-FlexBoxLayout_Example-resources.sh\"; sourceTree = \"<group>\"; };\n\t\tCE1FC63FC96981D06A3145050F77B1FA /* UITableView+FBLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UITableView+FBLayout.h\"; sourceTree = \"<group>\"; };\n\t\tD24416D14C30E5B422EFBDF4D4C68F20 /* FlexBoxLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"FlexBoxLayout-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tE02AD018C1A71AE618C53C4B1C8567D2 /* FBLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = FBLayout.m; sourceTree = \"<group>\"; };\n\t\tE2242E03251D75704DA9C06CA859A2A6 /* Yoga.c */ = {isa = PBXFileReference; includeInIndex = 1; path = Yoga.c; sourceTree = \"<group>\"; };\n\t\tE3DE20A64A10DBA2666AADEB69FBDF4A /* Pods-FlexBoxLayout_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-FlexBoxLayout_Example-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\tE4FEC2EDF454AA9E1DEFECFC0060C086 /* Pods-FlexBoxLayout_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-FlexBoxLayout_Example-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\tE864CCF1865050B90A4A04C700A1BF2B /* Pods-FlexBoxLayout_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-FlexBoxLayout_Tests-resources.sh\"; sourceTree = \"<group>\"; };\n\t\tEA975E06D68410FD07A0D83CE44DD0CA /* Pods-FlexBoxLayout_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-FlexBoxLayout_Tests-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tED7026F42D6CE0E7CAEFACC393F767C2 /* YGNodeList.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YGNodeList.h; sourceTree = \"<group>\"; };\n\t\tEF09C7361790D94CDDE0B1849DB46774 /* FBAsyLayoutTransaction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = FBAsyLayoutTransaction.m; sourceTree = \"<group>\"; };\n\t\tF2AD820207A75360574CEAADD230F65F /* UIView+FBLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UIView+FBLayout.h\"; sourceTree = \"<group>\"; };\n\t\tFD83157240386FD10108EF2B8E81763A /* FBLayout+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"FBLayout+Private.h\"; sourceTree = \"<group>\"; };\n\t\tFF938746E92980E48A2B78703D1D331A /* FBLayoutProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = FBLayoutProtocol.h; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1F70E0C3CC5AB54430581C29B9DB3557 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t59463ECB80BD00322BEB10F9118C339A /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t20907C3C1F5F687ADE94307647D71B49 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2E213AAA3CF36ED57D275F7332CE8121 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t51B04F0E9B2F8FE4D1C2CBFBE195CDDD /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA41191AF6702A33307CA6D7DC494C35B /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t37104CB29296EE749DD0E511C13A0258 /* Pods-FlexBoxLayout_Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D3E316A89DC03F48CC0478DBD27BB54 /* Info.plist */,\n\t\t\t\t37398D34E653DF09A2641D1FF0379F93 /* Pods-FlexBoxLayout_Tests.modulemap */,\n\t\t\t\tEA975E06D68410FD07A0D83CE44DD0CA /* Pods-FlexBoxLayout_Tests-acknowledgements.markdown */,\n\t\t\t\t4D5C5564506559994F56953653C0597F /* Pods-FlexBoxLayout_Tests-acknowledgements.plist */,\n\t\t\t\t30E66EE03D48B624AC02A2B49D889D5A /* Pods-FlexBoxLayout_Tests-dummy.m */,\n\t\t\t\t9CDD81E16FD57D9D94A4D625CAB6D1DD /* Pods-FlexBoxLayout_Tests-frameworks.sh */,\n\t\t\t\tE864CCF1865050B90A4A04C700A1BF2B /* Pods-FlexBoxLayout_Tests-resources.sh */,\n\t\t\t\t13F5D17844E15E7CD0244F2747C114B7 /* Pods-FlexBoxLayout_Tests-umbrella.h */,\n\t\t\t\t2FD39294095E485283D8B39CC890D5B0 /* Pods-FlexBoxLayout_Tests.debug.xcconfig */,\n\t\t\t\tB5C67F5EB53D0F1E5B9F1D9AB04E04EB /* Pods-FlexBoxLayout_Tests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-FlexBoxLayout_Tests\";\n\t\t\tpath = \"Target Support Files/Pods-FlexBoxLayout_Tests\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t38054A9669674D6DB29CCAFE6E019ABE /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA163D21F3C14EC053751B53B96BBBED2 /* Pods-FlexBoxLayout_Example */,\n\t\t\t\t37104CB29296EE749DD0E511C13A0258 /* Pods-FlexBoxLayout_Tests */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3A001529011D65E856D14B1DF3138AEE /* FlexBoxLayout */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t05C23A869CC871BC17105D506FCE81A5 /* FlexBoxLayout.h */,\n\t\t\t\tC14E2F523D91CC4AEB2552CF247C0DDC /* Component */,\n\t\t\t\tC296628F770D87195ADB5A65057CC92E /* Layout */,\n\t\t\t\t4F4BAD4647F62685EEBBEEC3F651A741 /* Pod */,\n\t\t\t\t460D842DB85BA12AEC6D1C32ECBE10DE /* Support Files */,\n\t\t\t\tB857249BE921C5798FDDF7C7C5C78278 /* Transaction */,\n\t\t\t);\n\t\t\tname = FlexBoxLayout;\n\t\t\tpath = ../..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t460D842DB85BA12AEC6D1C32ECBE10DE /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB2F23F43464233B16E4949A84AC95FF /* FlexBoxLayout.modulemap */,\n\t\t\t\t1EB5B3A0601897C638905921C4E93709 /* FlexBoxLayout.xcconfig */,\n\t\t\t\t3C4D1F5DC7482CA5B3D588FCB9BBEA7F /* FlexBoxLayout-dummy.m */,\n\t\t\t\t0F84B9E8D4A7A28998EF57C13810232E /* FlexBoxLayout-prefix.pch */,\n\t\t\t\tD24416D14C30E5B422EFBDF4D4C68F20 /* FlexBoxLayout-umbrella.h */,\n\t\t\t\t290E94BD29A9DCB9680BE35E94C6BD1A /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"Example/Pods/Target Support Files/FlexBoxLayout\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4F4BAD4647F62685EEBBEEC3F651A741 /* Pod */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC5AEE383861D5A321567B20E0DA7DCFF /* FlexBoxLayout.podspec */,\n\t\t\t\t87BD2A5B371E05B87DD42D2F9C51F1BB /* LICENSE */,\n\t\t\t\t65F0519680CAC7157DD162A4BDAB8174 /* README.md */,\n\t\t\t);\n\t\t\tname = Pod;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t63CC4F4786802208A2635642B9C9F344 /* Development Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3A001529011D65E856D14B1DF3138AEE /* FlexBoxLayout */,\n\t\t\t);\n\t\t\tname = \"Development Pods\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7D31310903384B719B78AD21D8A19623 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1FE6805B5D87366AFBDEFD27C98B290C /* FlexBoxLayout.framework */,\n\t\t\t\t5291E0156247D0EA2FE84C4F847DA894 /* Pods_FlexBoxLayout_Example.framework */,\n\t\t\t\t7C918EAC464D825B50D7323CE03CCBF4 /* Pods_FlexBoxLayout_Tests.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7DB346D0F39D3F0E887471402A8071AB = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,\n\t\t\t\t63CC4F4786802208A2635642B9C9F344 /* Development Pods */,\n\t\t\t\tBC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */,\n\t\t\t\t7D31310903384B719B78AD21D8A19623 /* Products */,\n\t\t\t\t38054A9669674D6DB29CCAFE6E019ABE /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA163D21F3C14EC053751B53B96BBBED2 /* Pods-FlexBoxLayout_Example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA257B3145A7378ADE9EDED5C87D424B3 /* Info.plist */,\n\t\t\t\t97CF82D77B31C1A8057CE4673BB62703 /* Pods-FlexBoxLayout_Example.modulemap */,\n\t\t\t\t3920D39DA60C0E0A54E725A375A9D2F2 /* Pods-FlexBoxLayout_Example-acknowledgements.markdown */,\n\t\t\t\tE3DE20A64A10DBA2666AADEB69FBDF4A /* Pods-FlexBoxLayout_Example-acknowledgements.plist */,\n\t\t\t\t2D8B3565582A311827EF5F4F6CBF3C79 /* Pods-FlexBoxLayout_Example-dummy.m */,\n\t\t\t\tE4FEC2EDF454AA9E1DEFECFC0060C086 /* Pods-FlexBoxLayout_Example-frameworks.sh */,\n\t\t\t\tCB76AF194B7D41D72CE4E18A95B9B1BB /* Pods-FlexBoxLayout_Example-resources.sh */,\n\t\t\t\t46DA683DCAD78388835833164C99E397 /* Pods-FlexBoxLayout_Example-umbrella.h */,\n\t\t\t\t39EE870E022521F916CF1735D3872A9B /* Pods-FlexBoxLayout_Example.debug.xcconfig */,\n\t\t\t\tA6AA8261A684BEDB4E39DE0039FB7CFE /* Pods-FlexBoxLayout_Example.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-FlexBoxLayout_Example\";\n\t\t\tpath = \"Target Support Files/Pods-FlexBoxLayout_Example\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB857249BE921C5798FDDF7C7C5C78278 /* Transaction */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC86831EFE6EA0D9F5004DA92522F13A1 /* FBAsyLayoutTransaction.h */,\n\t\t\t\tEF09C7361790D94CDDE0B1849DB46774 /* FBAsyLayoutTransaction.m */,\n\t\t\t);\n\t\t\tname = Transaction;\n\t\t\tpath = FlexBoxLayout/Classes/Transaction;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD35AF013A5F0BAD4F32504907A52519E /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC14E2F523D91CC4AEB2552CF247C0DDC /* Component */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23C0BD45B3C29027EE7A49BF1279DDD1 /* FBLayoutDiv.h */,\n\t\t\t\t6C389877D7EC3455CB33481430658905 /* FBLayoutDiv.m */,\n\t\t\t\tA679FAD04E34D2928A10E6EF7D8E654A /* UIScrollView+FBLayout.h */,\n\t\t\t\t625814E8687BD6E4CCBE9617FC149010 /* UIScrollView+FBLayout.m */,\n\t\t\t\tCE1FC63FC96981D06A3145050F77B1FA /* UITableView+FBLayout.h */,\n\t\t\t\t9FA68351A46C44F004B29A026C21F1F7 /* UITableView+FBLayout.m */,\n\t\t\t\t9A8E86EEE8799A1D99189FC3BEA7C81D /* UIView+CellStyle.h */,\n\t\t\t\tA1956BA50EDC91A59FA37AFE95186638 /* UIView+CellStyle.m */,\n\t\t\t\tF2AD820207A75360574CEAADD230F65F /* UIView+FBLayout.h */,\n\t\t\t\t275F2A9FE9B427666D1BC31E1F8F69CF /* UIView+FBLayout.m */,\n\t\t\t);\n\t\t\tname = Component;\n\t\t\tpath = FlexBoxLayout/Classes/Component;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC296628F770D87195ADB5A65057CC92E /* Layout */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8238C5AA11691DC26D6C024915641692 /* FBLayout.h */,\n\t\t\t\tE02AD018C1A71AE618C53C4B1C8567D2 /* FBLayout.m */,\n\t\t\t\tFD83157240386FD10108EF2B8E81763A /* FBLayout+Private.h */,\n\t\t\t\tFF938746E92980E48A2B78703D1D331A /* FBLayoutProtocol.h */,\n\t\t\t\t140E720A6BF95DEFE96A0AFA0EF78466 /* FBViewLayoutCache.h */,\n\t\t\t\tA5BA61E51C24B927D535BB0A3E250E07 /* FBViewLayoutCache.m */,\n\t\t\t\t4477E26F28167791E966128D63112285 /* YGEnums.h */,\n\t\t\t\t4F91BE6DCC560C47418328E24F7FB966 /* YGMacros.h */,\n\t\t\t\t6A0685EC7AE20051150BD74E405C9385 /* YGNodeList.c */,\n\t\t\t\tED7026F42D6CE0E7CAEFACC393F767C2 /* YGNodeList.h */,\n\t\t\t\tE2242E03251D75704DA9C06CA859A2A6 /* Yoga.c */,\n\t\t\t\tA287CB6AFC514232A851E69344B0C197 /* Yoga.h */,\n\t\t\t);\n\t\t\tname = Layout;\n\t\t\tpath = FlexBoxLayout/Classes/Layout;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD35AF013A5F0BAD4F32504907A52519E /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t10AE11C6EF074FFE4FC01375B1D42720 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t332BB3A134C141A3847282116ADBD7B8 /* Pods-FlexBoxLayout_Example-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC19564AB2046B740FB73F9A5046C1279 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t28B81C6B1EA79390B8C3D00389EE1354 /* FBAsyLayoutTransaction.h in Headers */,\n\t\t\t\t2AF7B3DD54EC7C69B3414BE68F98CB1F /* FBLayout+Private.h in Headers */,\n\t\t\t\tD2988A2D09C135F5E062AA9CF6CAF29B /* FBLayout.h in Headers */,\n\t\t\t\t223110F99A8EB144E28C7A448594E7CE /* FBLayoutDiv.h in Headers */,\n\t\t\t\tED7582975465F2BD5D259CAB10565680 /* FBLayoutProtocol.h in Headers */,\n\t\t\t\t496E51C79E3311FFB35B9CC79B7F32F0 /* FBViewLayoutCache.h in Headers */,\n\t\t\t\tBB926D7643C5657CA0DCB0B2DF2BD0D5 /* FlexBoxLayout-umbrella.h in Headers */,\n\t\t\t\t9A3DDC6F730C6543869415D12A458769 /* FlexBoxLayout.h in Headers */,\n\t\t\t\t074281F10B4BD032C759D5E027979F25 /* UIScrollView+FBLayout.h in Headers */,\n\t\t\t\t47A387E0F410A35C50BFBC6C5FCC8F91 /* UITableView+FBLayout.h in Headers */,\n\t\t\t\t24A20B48A74554EAF8D4E651EA114EB2 /* UIView+CellStyle.h in Headers */,\n\t\t\t\t0AFB39D1C712985A6DF7A6AA4452FDAF /* UIView+FBLayout.h in Headers */,\n\t\t\t\t624F5C60A91E1EA916CE7B86CE8974B9 /* YGEnums.h in Headers */,\n\t\t\t\tBB0682994A5FE52268169DED0E68FEF3 /* YGMacros.h in Headers */,\n\t\t\t\tDF49D00F0E322A434FF3AE3D03863C26 /* YGNodeList.h in Headers */,\n\t\t\t\t12E761460A9A1A30D9D2D4282325CC60 /* Yoga.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF8E777C7FEFBF8E45EA9ABD311ADBBD2 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF4331388A47E6E0B3623F132669DCA7E /* Pods-FlexBoxLayout_Tests-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t1B22BBF88589FB9ADEAD498EBDE7C031 /* Pods-FlexBoxLayout_Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2490DC59C5CB413E3D391C08E5196B9D /* Build configuration list for PBXNativeTarget \"Pods-FlexBoxLayout_Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA18364E17DE4B83F94617A60DF55ED8B /* Sources */,\n\t\t\t\t20907C3C1F5F687ADE94307647D71B49 /* Frameworks */,\n\t\t\t\tF8E777C7FEFBF8E45EA9ABD311ADBBD2 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Pods-FlexBoxLayout_Tests\";\n\t\t\tproductName = \"Pods-FlexBoxLayout_Tests\";\n\t\t\tproductReference = 7C918EAC464D825B50D7323CE03CCBF4 /* Pods_FlexBoxLayout_Tests.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t41E766C7E18FD317438ED40FF82DC6DC /* FlexBoxLayout */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6174DFF5875A6EBB2BD2091D40B956E6 /* Build configuration list for PBXNativeTarget \"FlexBoxLayout\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tED40EBE9D1514753BB9FBF1F08E96914 /* Sources */,\n\t\t\t\t51B04F0E9B2F8FE4D1C2CBFBE195CDDD /* Frameworks */,\n\t\t\t\tC19564AB2046B740FB73F9A5046C1279 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = FlexBoxLayout;\n\t\t\tproductName = FlexBoxLayout;\n\t\t\tproductReference = 1FE6805B5D87366AFBDEFD27C98B290C /* FlexBoxLayout.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t5849EAFB406116E302285CD12144D699 /* Pods-FlexBoxLayout_Example */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 701DD7E99E02ADF946D22BBF87013F6D /* Build configuration list for PBXNativeTarget \"Pods-FlexBoxLayout_Example\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF8DBD786FD72536A00CF88895BAF64F3 /* Sources */,\n\t\t\t\t1F70E0C3CC5AB54430581C29B9DB3557 /* Frameworks */,\n\t\t\t\t10AE11C6EF074FFE4FC01375B1D42720 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t509FAA5EAA7D6FA7B40B312A745D6A41 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-FlexBoxLayout_Example\";\n\t\t\tproductName = \"Pods-FlexBoxLayout_Example\";\n\t\t\tproductReference = 5291E0156247D0EA2FE84C4F847DA894 /* Pods_FlexBoxLayout_Example.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD41D8CD98F00B204E9800998ECF8427E /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0930;\n\t\t\t\tLastUpgradeCheck = 0930;\n\t\t\t};\n\t\t\tbuildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject \"Pods\" */;\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);\n\t\t\tmainGroup = 7DB346D0F39D3F0E887471402A8071AB;\n\t\t\tproductRefGroup = 7D31310903384B719B78AD21D8A19623 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t41E766C7E18FD317438ED40FF82DC6DC /* FlexBoxLayout */,\n\t\t\t\t5849EAFB406116E302285CD12144D699 /* Pods-FlexBoxLayout_Example */,\n\t\t\t\t1B22BBF88589FB9ADEAD498EBDE7C031 /* Pods-FlexBoxLayout_Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tA18364E17DE4B83F94617A60DF55ED8B /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1E4075A62064FD9E005E2E283403B23B /* Pods-FlexBoxLayout_Tests-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tED40EBE9D1514753BB9FBF1F08E96914 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3941FB3BA6FDE9ED9310749F8F22BD15 /* FBAsyLayoutTransaction.m in Sources */,\n\t\t\t\t27796ECDA59185A953DA0FFA57B7F25E /* FBLayout.m in Sources */,\n\t\t\t\t27C50BB61366FC186DBEF19F8B5619CA /* FBLayoutDiv.m in Sources */,\n\t\t\t\tB6810986A273F9F4E7A31FDA9176FDCE /* FBViewLayoutCache.m in Sources */,\n\t\t\t\tD4267BA56BFD5B6CCF6917C701D3E3AD /* FlexBoxLayout-dummy.m in Sources */,\n\t\t\t\t44AAFAB497B669E871FCB7C57EE29340 /* UIScrollView+FBLayout.m in Sources */,\n\t\t\t\tF5B7D7A943DC0A8E664CE4ADB8F7E589 /* UITableView+FBLayout.m in Sources */,\n\t\t\t\t160DBAF5EEC188CC905C78225949E46A /* UIView+CellStyle.m in Sources */,\n\t\t\t\t7A5BC9B29458BB3F9C97970198337558 /* UIView+FBLayout.m in Sources */,\n\t\t\t\tB144BB144F3C840B2F389A2BBF7D990E /* YGNodeList.c in Sources */,\n\t\t\t\t5F3AC3EB714F932B822F6D52882C98A6 /* Yoga.c in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF8DBD786FD72536A00CF88895BAF64F3 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBD01BBB9FF61C08AE7806A1B19A5E037 /* Pods-FlexBoxLayout_Example-dummy.m 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\t509FAA5EAA7D6FA7B40B312A745D6A41 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = FlexBoxLayout;\n\t\t\ttarget = 41E766C7E18FD317438ED40FF82DC6DC /* FlexBoxLayout */;\n\t\t\ttargetProxy = 5E31603E08815CFCF061BF7F7E2C48FB /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1A0C0A7C5EEA03C1264BF39264B9A1AF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 1EB5B3A0601897C638905921C4E93709 /* FlexBoxLayout.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/FlexBoxLayout/FlexBoxLayout-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/FlexBoxLayout/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/FlexBoxLayout/FlexBoxLayout.modulemap\";\n\t\t\t\tPRODUCT_NAME = FlexBoxLayout;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1C3ED16E144B9A188CC88F2343EB3B4F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\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_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGNING_REQUIRED = NO;\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 = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_RELEASE=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\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.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t51F393FE91B4B6C835FB4B238187AD09 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\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_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGNING_REQUIRED = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\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\"POD_CONFIGURATION_DEBUG=1\",\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_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.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5AE04C30A73E2FAD0C6BF002269C0C4F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B5C67F5EB53D0F1E5B9F1D9AB04E04EB /* Pods-FlexBoxLayout_Tests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-FlexBoxLayout_Tests/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.3;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = Pods_FlexBoxLayout_Tests;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t84CA01D401CEDB5622D9AA58ADB02E04 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 1EB5B3A0601897C638905921C4E93709 /* FlexBoxLayout.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/FlexBoxLayout/FlexBoxLayout-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/FlexBoxLayout/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/FlexBoxLayout/FlexBoxLayout.modulemap\";\n\t\t\t\tPRODUCT_NAME = FlexBoxLayout;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA092433A2097F141B00BE81560909598 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 39EE870E022521F916CF1735D3872A9B /* Pods-FlexBoxLayout_Example.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-FlexBoxLayout_Example/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.3;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = Pods_FlexBoxLayout_Example;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCF037B089A147420760A7C4B0B2014C3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = A6AA8261A684BEDB4E39DE0039FB7CFE /* Pods-FlexBoxLayout_Example.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-FlexBoxLayout_Example/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.3;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = Pods_FlexBoxLayout_Example;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tE2D7E675F5062300126497067201F979 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2FD39294095E485283D8B39CC890D5B0 /* Pods-FlexBoxLayout_Tests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-FlexBoxLayout_Tests/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.3;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = Pods_FlexBoxLayout_Tests;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t2490DC59C5CB413E3D391C08E5196B9D /* Build configuration list for PBXNativeTarget \"Pods-FlexBoxLayout_Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tE2D7E675F5062300126497067201F979 /* Debug */,\n\t\t\t\t5AE04C30A73E2FAD0C6BF002269C0C4F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t51F393FE91B4B6C835FB4B238187AD09 /* Debug */,\n\t\t\t\t1C3ED16E144B9A188CC88F2343EB3B4F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6174DFF5875A6EBB2BD2091D40B956E6 /* Build configuration list for PBXNativeTarget \"FlexBoxLayout\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1A0C0A7C5EEA03C1264BF39264B9A1AF /* Debug */,\n\t\t\t\t84CA01D401CEDB5622D9AA58ADB02E04 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t701DD7E99E02ADF946D22BBF87013F6D /* Build configuration list for PBXNativeTarget \"Pods-FlexBoxLayout_Example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA092433A2097F141B00BE81560909598 /* Debug */,\n\t\t\t\tCF037B089A147420760A7C4B0B2014C3 /* 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 = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/FlexBoxLayout/FlexBoxLayout-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_FlexBoxLayout : NSObject\n@end\n@implementation PodsDummy_FlexBoxLayout\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/FlexBoxLayout/FlexBoxLayout-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/FlexBoxLayout/FlexBoxLayout-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"FBLayoutDiv.h\"\n#import \"UIScrollView+FBLayout.h\"\n#import \"UITableView+FBLayout.h\"\n#import \"UIView+CellStyle.h\"\n#import \"UIView+FBLayout.h\"\n#import \"FlexBoxLayout.h\"\n#import \"FBLayout+Private.h\"\n#import \"FBLayout.h\"\n#import \"FBLayoutProtocol.h\"\n#import \"FBViewLayoutCache.h\"\n#import \"YGEnums.h\"\n#import \"YGMacros.h\"\n#import \"YGNodeList.h\"\n#import \"Yoga.h\"\n#import \"FBAsyLayoutTransaction.h\"\n\nFOUNDATION_EXPORT double FlexBoxLayoutVersionNumber;\nFOUNDATION_EXPORT const unsigned char FlexBoxLayoutVersionString[];\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/FlexBoxLayout/FlexBoxLayout.modulemap",
    "content": "framework module FlexBoxLayout {\n  umbrella header \"FlexBoxLayout-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/FlexBoxLayout/FlexBoxLayout.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/../..\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Example/Pods/Target Support Files/FlexBoxLayout/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>0.8.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## FlexBoxLayout\n\nCopyright (c) 2017 qiang.shen <qiang..shen@ele.me>\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\nall copies 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\nTHE SOFTWARE.\n\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-acknowledgements.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>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2017 qiang.shen &lt;qiang..shen@ele.me&gt;\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\nall copies 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\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>FlexBoxLayout</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_FlexBoxLayout_Example : NSObject\n@end\n@implementation PodsDummy_Pods_FlexBoxLayout_Example\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-frameworks.sh",
    "content": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n      echo \"Symlinked...\"\n      source=\"$(readlink \"${source}\")\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u  && exit ${PIPESTATUS[0]})\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into a the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .framework.dSYM \"$source\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}\"\n\n    # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\"\n    fi\n\n    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM\"\n    fi\n  fi\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" -a \"${CODE_SIGNING_REQUIRED}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identitiy\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    STRIP_BINARY_RETVAL=0\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\" || exit 1\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=1\n}\n\n\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/FlexBoxLayout/FlexBoxLayout.framework\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/FlexBoxLayout/FlexBoxLayout.framework\"\nfi\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${TARGETED_DEVICE_FAMILY}\" in\n  1,2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n    ;;\n  1)\n    TARGET_DEVICE_ARGS=\"--target-device iphone\"\n    ;;\n  2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad\"\n    ;;\n  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ \"`xcrun --find actool`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double Pods_FlexBoxLayout_ExampleVersionNumber;\nFOUNDATION_EXPORT const unsigned char Pods_FlexBoxLayout_ExampleVersionString[];\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example.debug.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nOTHER_CFLAGS = $(inherited) -iquote \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout/FlexBoxLayout.framework/Headers\"\nOTHER_LDFLAGS = $(inherited) -framework \"FlexBoxLayout\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example.modulemap",
    "content": "framework module Pods_FlexBoxLayout_Example {\n  umbrella header \"Pods-FlexBoxLayout_Example-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Example/Pods-FlexBoxLayout_Example.release.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nOTHER_CFLAGS = $(inherited) -iquote \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout/FlexBoxLayout.framework/Headers\"\nOTHER_LDFLAGS = $(inherited) -framework \"FlexBoxLayout\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-acknowledgements.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>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_FlexBoxLayout_Tests : NSObject\n@end\n@implementation PodsDummy_Pods_FlexBoxLayout_Tests\n@end\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-frameworks.sh",
    "content": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n      echo \"Symlinked...\"\n      source=\"$(readlink \"${source}\")\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u  && exit ${PIPESTATUS[0]})\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into a the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .framework.dSYM \"$source\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}\"\n\n    # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\"\n    fi\n\n    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM\"\n    fi\n  fi\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" -a \"${CODE_SIGNING_REQUIRED}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identitiy\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    STRIP_BINARY_RETVAL=0\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\" || exit 1\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=1\n}\n\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${TARGETED_DEVICE_FAMILY}\" in\n  1,2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n    ;;\n  1)\n    TARGET_DEVICE_ARGS=\"--target-device iphone\"\n    ;;\n  2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad\"\n    ;;\n  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ \"`xcrun --find actool`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double Pods_FlexBoxLayout_TestsVersionNumber;\nFOUNDATION_EXPORT const unsigned char Pods_FlexBoxLayout_TestsVersionString[];\n\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests.debug.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nOTHER_CFLAGS = $(inherited) -iquote \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout/FlexBoxLayout.framework/Headers\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests.modulemap",
    "content": "framework module Pods_FlexBoxLayout_Tests {\n  umbrella header \"Pods-FlexBoxLayout_Tests-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Example/Pods/Target Support Files/Pods-FlexBoxLayout_Tests/Pods-FlexBoxLayout_Tests.release.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nOTHER_CFLAGS = $(inherited) -iquote \"${PODS_CONFIGURATION_BUILD_DIR}/FlexBoxLayout/FlexBoxLayout.framework/Headers\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\n"
  },
  {
    "path": "Example/Tests/Tests-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>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": "Example/Tests/Tests-Prefix.pch",
    "content": "//  The contents of this file are implicitly included at the beginning of every test case source file.\n\n#ifdef __OBJC__\n\n  @import FBSnapshotTestCase;\n\n#endif\n"
  },
  {
    "path": "Example/Tests/Tests.m",
    "content": "//\n//  CSSLayoutTests.m\n//  CSSLayoutTests\n//\n//  Created by qiang.shen on 01/03/2017.\n//  Copyright (c) 2017 qiang.shen. All rights reserved.\n//\n\n@import XCTest;\n\n@interface Tests : XCTestCase\n\n@end\n\n@implementation Tests\n\n- (void)setUp\n{\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- (void)tearDown\n{\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- (void)testExample\n{\n    XCTFail(@\"No implementation for \\\"%s\\\"\", __PRETTY_FUNCTION__);\n}\n\n@end\n\n"
  },
  {
    "path": "Example/Tests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "FlexBoxLayout/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "FlexBoxLayout/Classes/Component/FBLayoutDiv.h",
    "content": "//\n//  FBLayoutSpec.h\n//  CSJSView\n//\n//  Created by 沈强 on 2016/12/23.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"FBLayoutProtocol.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n\n/**\n FBLayoutDiv is virtual view, split view to a different area, avoid too much view.\n */\n\n@interface FBLayoutDiv : NSObject<FBLayoutProtocol>\n\n@property(nonatomic)CGRect frame;\n\n\n+ (instancetype)layoutDivWithFlexDirection:(FBFlexDirection)direction;\n\n+ (instancetype)layoutDivWithFlexDirection:(FBFlexDirection)direction\n                            justifyContent:(FBJustify)justifyContent\n                                alignItems:(FBAlign)alignItems\n                                  children:(NSArray<id<FBLayoutProtocol>>*)children;\n\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/FBLayoutDiv.m",
    "content": "//\n//  FBLayoutSpec.m\n//  CSJSView\n//\n//  Created by 沈强 on 2016/12/23.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import \"FBLayoutDiv.h\"\n#import \"FBAsyLayoutTransaction.h\"\n\n@interface FBLayoutDiv(){\n  \n  NSMutableArray *_fb_children;\n  NSDictionary *_fbStyles;\n  \n}\n\n@property(nonatomic, strong) FBLayout *fb_layout;\n\n@end\n\n@implementation FBLayoutDiv\n\n@dynamic fb_children;\n\n- (instancetype)init {\n  if (self = [super init]) {\n    _fb_layout = [FBLayout new];\n    _fb_layout.context = self;\n    _fb_children = [NSMutableArray array];\n  }\n  return self;\n}\n\n- (void)setFbStyles:(NSDictionary *)fbStyles {\n  _fbStyles = fbStyles;\n  _fb_layout.fbStyles = fbStyles;\n}\n\n- (NSDictionary *)fbStyles {\n  return _fbStyles;\n}\n\n+ (instancetype)layoutDivWithFlexDirection:(FBFlexDirection)direction {\n  FBLayoutDiv *layoutDiv = [self new];\n  [layoutDiv fb_makeLayout:^(FBLayout *layout) {\n    [layout setFlexDirection:direction];\n  }];\n  return layoutDiv;\n}\n\n+ (instancetype)layoutDivWithFlexDirection:(FBFlexDirection)direction\n                            justifyContent:(FBJustify)justifyContent\n                                alignItems:(FBAlign)alignItems\n                                  children:(NSArray <id<FBLayoutProtocol>>*)children {\n  FBLayoutDiv *layoutDiv = [self new];\n  [layoutDiv fb_makeLayout:^(FBLayout *layout) {\n    [layout setFlexDirection:direction];\n    [layout setJustifyContent:justifyContent];\n    [layout setAlignItems:alignItems];\n  }];\n  [layoutDiv setFb_children:children];\n  return layoutDiv;\n}\n\n#pragma mark - children\n\n- (void)setFb_children:(NSArray <id<FBLayoutProtocol>>*)children {\n  if (_fb_children == children) {\n    return;\n  }\n  _fb_children = [children mutableCopy];\n  [_fb_layout removeAllChildren];\n  for (id<FBLayoutProtocol> layoutElement in _fb_children) {\n    NSAssert([layoutElement conformsToProtocol:NSProtocolFromString(@\"FBLayoutProtocol\")], @\"child %@ has no conformsToProtocol FBLayoutProtocol\", self);\n    [_fb_layout addChild:layoutElement.fb_layout];\n  }\n}\n\n- (void)fb_addChild:(id<FBLayoutProtocol>)layout {\n  NSAssert([layout conformsToProtocol:NSProtocolFromString(@\"FBLayoutProtocol\")], @\"child %@ has no conformsToProtocol FBLayoutProtocol\", self);\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren addObject:layout];\n  self.fb_children = newChildren;\n}\n\n- (void)fb_addChildren:(NSArray<id<FBLayoutProtocol>> *)children {\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren addObjectsFromArray:children];\n  self.fb_children = newChildren;\n}\n\n- (void)fb_insertChild:(id<FBLayoutProtocol>)layout atIndex:(NSInteger)index {\n  NSAssert([layout conformsToProtocol:NSProtocolFromString(@\"FBLayoutProtocol\")], @\"child %@ has no conformsToProtocol FBLayoutProtocol\", self);\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren insertObject:layout atIndex:index];\n  self.fb_children = newChildren;\n}\n\n- (id<FBLayoutProtocol>)fb_childLayoutAtIndex:(NSUInteger)index {\n  return [self.fb_children objectAtIndex:index];\n}\n\n- (void)fb_removeChild:(id<FBLayoutProtocol>)layout {\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren removeObject:layout];\n  self.fb_children = newChildren;\n}\n\n- (void)fb_removeAllChildren {\n  self.fb_children = nil;\n}\n\n- (NSArray *)fb_children {\n  return [_fb_children copy];\n}\n\n- (CGRect)frame {\n  return _frame;\n}\n\n- (FBLayout *)fb_makeLayout:(void(^)(FBLayout *layout))layout {\n  if (layout) {\n    layout([self fb_layout]);\n  }\n  return [self fb_layout];\n}\n\n#pragma mark - layout\n\n- (void)fb_applyLayouWithSize:(CGSize)size {\n  [_fb_layout calculateLayoutWithSize:size];\n  _frame = _fb_layout.frame;\n  [self fb_applyLayoutToViewHierachy];\n}\n\n\n- (void)fb_asyApplyLayoutWithSize:(CGSize)size {\n  [FBAsyLayoutTransaction addCalculateTransaction:^{\n\n    [_fb_layout calculateLayoutWithSize:size];\n  } complete:^{\n    _frame = _fb_layout.frame;\n    [self fb_applyLayoutToViewHierachy];\n  }];\n}\n\n\n- (void)fb_applyLayoutToViewHierachy {\n  \n  for (id<FBLayoutProtocol> layoutElement in _fb_children) {\n    \n    layoutElement.frame = (CGRect) {\n      .origin = {\n        .x = _frame.origin.x + layoutElement.fb_layout.frame.origin.x,\n        .y = _frame.origin.y + layoutElement.fb_layout.frame.origin.y,\n      },\n      .size = {\n        .width = layoutElement.fb_layout.frame.size.width,\n        .height = layoutElement.fb_layout.frame.size.height,\n      },\n    };\n    \n    [layoutElement fb_applyLayoutToViewHierachy];\n  }\n  \n}\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UIScrollView+FBLayout.h",
    "content": "//\n//  UIScrollView+FBLayout.h\n//  Pods\n//\n//  Created by 沈强 on 2017/1/20.\n//\n//\n\n#import <UIKit/UIKit.h>\n#import \"FBLayoutDiv.h\"\n\n@interface UIScrollView (FBLayout)\n\n\n/**\n ScrollView layout div make contentSize  auto size\n */\n@property(nonatomic, strong) FBLayoutDiv *fb_contentDiv;\n\n\n/**\n remove layout\n */\n- (void)fb_clearLayout;\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UIScrollView+FBLayout.m",
    "content": "//\n//  UIScrollView+FBLayout.m\n//  Pods\n//\n//  Created by 沈强 on 2017/1/20.\n//\n//\n\n#import \"UIScrollView+FBLayout.h\"\n#import <objc/runtime.h>\n\n@implementation UIScrollView (FBLayout)\n\n+ (void)load {\n  SEL originalSelector = @selector(layoutSubviews);\n  SEL swizzledSelector = NSSelectorFromString([@\"fb_\" stringByAppendingString:NSStringFromSelector(originalSelector)]);\n  Method originalMethod = class_getInstanceMethod(self, originalSelector);\n  Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector);\n  method_exchangeImplementations(originalMethod, swizzledMethod);\n}\n\n- (FBLayoutDiv *)fb_contentDiv {\n  return objc_getAssociatedObject(self, _cmd);\n}\n\n- (void)setFb_contentDiv:(FBLayoutDiv *)fb_contentDiv {\n  FBLayoutDiv *contentDiv = [self fb_contentDiv];\n  if (contentDiv != fb_contentDiv) {\n    objc_setAssociatedObject(self, @selector(fb_contentDiv), fb_contentDiv, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n  }\n}\n \n- (void)fb_clearLayout {\n  [self setFb_contentDiv:nil];\n}\n\n- (void)fb_layoutSubviews {\n  [self fb_layoutSubviews];\n  FBLayoutDiv *contentDiv = [self fb_contentDiv];\n  if (contentDiv) {\n    self.contentSize = (CGSize){\n      .width = contentDiv.frame.size.width > self.frame.size.width ? contentDiv.frame.size.width : self.frame.size.width,\n      .height = contentDiv.frame.size.height > self.frame.size.height ? contentDiv.frame.size.height: self.frame.size.height,\n    };\n  }\n}\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UITableView+FBLayout.h",
    "content": "//\n//  UITableView+fbLayout.h\n//  Pods\n//\n//  Created by 沈强 on 2017/1/11.\n//\n//\n\n#import <UIKit/UIKit.h>\n\n\nNS_ASSUME_NONNULL_BEGIN\n\ntypedef UIView *_Nonnull (^FBCellBlock)(NSIndexPath *indexPath);\n\n@interface UITableView (FBLayout)\n\n\n/**\n setting the cell contentView Size, defalut width of UITableView\n */\n@property(nonatomic) CGFloat fb_constrainedWidth;\n\n\n\n/**\n cache layout\n */\n@property(nonatomic) BOOL fb_cacheLayout;\n\n\n\n/**\n cache content view cannot be together with fb_CacheLayout at the same time\n\n */\n@property(nonatomic) BOOL fb_cacheContentView;\n\n\n/**\n get the height of cell\n @param indexPath\n @return\n */\n- (CGFloat)fb_heightForIndexPath:(NSIndexPath *)indexPath;\n\n\n/**\n get the cell of indexPath\n @param indexPath\n @return\n */\n- (UITableViewCell *)fb_cellForIndexPath:(NSIndexPath *)indexPath;\n\n\n/**\n set the cell content view\n @param cellBlock\n */\n- (void)fb_setCellContnetViewBlockForIndexPath:(FBCellBlock)cellBlock;\n\n\n/**\n content view\n @param indexPath indexPath\n @return nil if cell is not visible or index path is out of range\n */\n- (UIView *)fb_contentViewForIndexPath:(NSIndexPath *)indexPath;\n\n\n/**\n remove all cache\n */\n- (void)fb_removeAllCache;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UITableView+FBLayout.m",
    "content": "//\n//  UITableView+fbLayout.m\n//  Pods\n//\n//  Created by 沈强 on 2017/1/11.\n//\n//\n\n#import \"UITableView+FBLayout.h\"\n#import <objc/runtime.h>\n#import \"UIView+CellStyle.h\"\n#import \"UIView+FBLayout.h\"\n\nstatic NSString *kCellIdentifier = @\"fb_kCellIdentifier\";\n\n#define CACHE_CONTENT_VIEW objc_getAssociatedObject(self, @selector(fb_cacheContentView:))\n\n#define CACHE_LAYOUT objc_getAssociatedObject(self, @\"fb_cacheLayout\")\n\nstatic NSInteger contentViewTag = 6868;\n\n@implementation UITableView (FBLayout)\n\n\n+ (void)load {\n  \n  SEL interceptedSelectors[] = {\n    @selector(reloadData),\n    @selector(insertSections:withRowAnimation:),\n    @selector(deleteSections:withRowAnimation:),\n    @selector(reloadSections:withRowAnimation:),\n    @selector(moveSection:toSection:),\n    @selector(insertRowsAtIndexPaths:withRowAnimation:),\n    @selector(deleteRowsAtIndexPaths:withRowAnimation:),\n    @selector(reloadRowsAtIndexPaths:withRowAnimation:),\n    @selector(moveRowAtIndexPath:toIndexPath:)\n  };\n  \n  for (NSUInteger index = 0; index < sizeof(interceptedSelectors) / sizeof(SEL); ++index) {\n    SEL originalSelector = interceptedSelectors[index];\n    SEL swizzledSelector = NSSelectorFromString([@\"fb_\" stringByAppendingString:NSStringFromSelector(originalSelector)]);\n    Method originalMethod = class_getInstanceMethod(self, originalSelector);\n    Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector);\n    method_exchangeImplementations(originalMethod, swizzledMethod);\n  }\n  \n}\n\n- (void)setFb_constrainedWidth:(CGFloat)fb_constrainedWidth {\n  objc_setAssociatedObject(self, _cmd, @(fb_constrainedWidth), OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n\n- (CGFloat)fb_constrainedWidth {\n  return [objc_getAssociatedObject(self, @selector(setFb_constrainedWidth:)) doubleValue];;\n}\n\n- (void)setFb_cacheLayout:(BOOL)fb_cacheLayout {\n  \n  if (fb_cacheLayout) {\n    self.fb_cacheContentView = NO;\n  } else {\n    NSMutableArray <NSMutableArray *>*cacheLayout = CACHE_LAYOUT;\n    [cacheLayout removeAllObjects];\n  }\n  objc_setAssociatedObject(self, _cmd, @(fb_cacheLayout), OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n\n}\n\n- (BOOL)fb_cacheLayout {\n  return [objc_getAssociatedObject(self, @selector(setFb_cacheLayout:)) boolValue];;\n\n}\n\n\n- (void)setFb_cacheContentView:(BOOL)fb_cacheContentView {\n  if (fb_cacheContentView) {\n    self.fb_cacheLayout = NO;\n  } else {\n     NSMutableArray <NSMutableArray *>*cacheContentViews = CACHE_CONTENT_VIEW;\n    [cacheContentViews removeAllObjects];\n  }\n  objc_setAssociatedObject(self, _cmd, @(fb_cacheContentView), OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n\n}\n\n- (BOOL)fb_cacheContentView {\n  return objc_getAssociatedObject(self, @selector(setFb_cacheContentView:)) ? [ objc_getAssociatedObject(self, @selector(setFb_cacheContentView:)) boolValue] :YES;\n}\n\n- (CGFloat)fb_heightForIndexPath:(NSIndexPath *)indexPath {\n  NSMutableArray <NSMutableArray *>*cacheLayout = CACHE_LAYOUT;\n  FBViewLayoutCache *viewLayoutCache = nil;\n  if (self.fb_cacheLayout) {\n    if (cacheLayout.count > indexPath.section) {\n      NSArray* sectionCacheViews = cacheLayout[indexPath.section];\n      \n      if (sectionCacheViews.count > indexPath.row) {\n        viewLayoutCache = sectionCacheViews[indexPath.row];\n      }\n      \n    }\n    if (viewLayoutCache) {\n     return viewLayoutCache.frame.size.height;\n    }\n  }\n\n  return [self fb_cacheContentView:indexPath].frame.size.height;\n}\n\n- (UITableViewCell *)fb_cellForIndexPath:(NSIndexPath *)indexPath {\n  return [self fb_cacheCellForIndexPath:indexPath];\n}\n\n- (UIView *)fb_contentViewForIndexPath:(NSIndexPath *)indexPath {\n  UITableViewCell *cell = [self cellForRowAtIndexPath:indexPath];\n  return [cell.contentView viewWithTag:contentViewTag];\n}\n\n- (void)fb_setCellContnetViewBlockForIndexPath:(FBCellBlock)cellBlock {\n  static dispatch_once_t token;\n  dispatch_once(&token, ^{\n    [self registerClass:[UITableViewCell class] forCellReuseIdentifier:kCellIdentifier];\n  });\n  objc_setAssociatedObject(self, _cmd, cellBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);\n}\n\n\n#pragma mark - caches\n\n- (UITableViewCell *)fb_cacheCellForIndexPath:(NSIndexPath *)indexPath {\n  \n  UITableViewCell *cell = [self dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath];\n  UIView *cellContentView = [self fb_cacheContentView:indexPath];\n  cell.fb_drawsAsynchronously = YES;\n  cellContentView.fb_drawsAsynchronously = YES;\n  cell.selectionStyle = cellContentView.fb_selectionStyle;\n  cell.backgroundColor = cellContentView.backgroundColor;\n  cell.clipsToBounds = cellContentView.clipsToBounds;\n  [self fb_configContentView:cellContentView forCell:cell];\n  \n  return cell;\n}\n\n\n- (UIView *)fb_cacheContentView:(NSIndexPath *)indexPath {\n  \n  NSMutableArray <NSMutableArray *>*cacheContentViews = CACHE_CONTENT_VIEW;\n  NSMutableArray <NSMutableArray *>*cacheLayout = CACHE_LAYOUT;\n  \n  if (!cacheContentViews) {\n    cacheContentViews = [NSMutableArray array];\n    objc_setAssociatedObject(self, _cmd, cacheContentViews, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fb_removeAllCache) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];\n  }\n  \n  if (!cacheLayout) {\n    cacheLayout = [NSMutableArray array];\n    objc_setAssociatedObject(self, @\"fb_cacheLayout\", cacheLayout, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n  }\n  \n  UIView * cellContentView = nil;\n  NSMutableArray* sectionContentViews = nil;\n  \n  if (self.fb_cacheContentView) {\n    if (cacheContentViews.count > indexPath.section) {\n      \n      sectionContentViews = cacheContentViews[indexPath.section];\n      \n      if (sectionContentViews.count > indexPath.row) {\n        cellContentView = sectionContentViews[indexPath.row];\n      }\n      \n    } else {\n      \n      NSAssert(cacheContentViews.count == indexPath.section, @\"%@ section is error\",@(indexPath.section));\n      \n      cacheContentViews[indexPath.section] = [NSMutableArray array];\n      \n    }\n  }\n  \n\n  if (!cellContentView || [cellContentView isEqual:[NSNull null]]) {\n    \n    FBCellBlock cellBlock = objc_getAssociatedObject(self, @selector(fb_setCellContnetViewBlockForIndexPath:));\n    \n    if (cellBlock) {\n      cellContentView = cellBlock(indexPath);\n      FBViewLayoutCache *viewLayoutCache = nil;\n      if (self.fb_cacheLayout) {\n        if (cacheLayout.count > indexPath.section) {\n          NSArray* sectionCacheViews = cacheLayout[indexPath.section];\n          \n          if (sectionCacheViews.count > indexPath.row) {\n            viewLayoutCache = sectionCacheViews[indexPath.row];\n          }\n          \n        } else {\n          \n          NSAssert(cacheLayout.count == indexPath.section, @\"%@ section is error\",@(indexPath.section));\n          \n          cacheLayout[indexPath.section] = [NSMutableArray array];\n          \n        }\n      }\n      if (viewLayoutCache) {\n        [cellContentView.fb_layout applyLayoutCache:viewLayoutCache];\n      } else {\n        [cellContentView fb_applyLayouWithSize:CGSizeMake(self.fb_constrainedWidth?:self.frame.size.width, fb_undefined)];\n        if (self.fb_cacheLayout) {\n          [cacheLayout[indexPath.section] insertObject:[cellContentView.fb_layout layoutCache] atIndex:indexPath.row];\n        }\n      }\n\n    } else {\n      cellContentView = [UIView new];\n    }\n    \n    \n    if (self.fb_cacheContentView) {\n      [cacheContentViews[indexPath.section] insertObject:cellContentView atIndex:indexPath.row];\n    }\n    \n  }\n  \n  cellContentView.tag = contentViewTag;\n  \n  return cellContentView;\n}\n\n- (void)fb_removeAllCache {\n  [self fb_removeAllCacheContentViews];\n}\n\n\n- (void)fb_removeAllCacheContentViews {\n  [CACHE_CONTENT_VIEW removeAllObjects];\n  [CACHE_LAYOUT removeAllObjects];\n}\n\n- (void)fb_removeCacheContentViewsAtSection:(NSUInteger)section {\n  if (self.fb_cacheContentView) {\n    [CACHE_CONTENT_VIEW removeObjectAtIndex:section];\n  } else if (self.fb_cacheLayout) {\n    [CACHE_LAYOUT removeObjectAtIndex:section];\n  }\n}\n\n- (void)fb_removeCacheContentViewAtIndexPath:(NSIndexPath *)indexPath {\n  if (self.fb_cacheContentView) {\n    [CACHE_CONTENT_VIEW[indexPath.section] removeObjectAtIndex:indexPath.row];\n  } else if(self.fb_cacheLayout) {\n    [CACHE_LAYOUT[indexPath.section] removeObjectAtIndex:indexPath.row];\n  }\n}\n\n- (void)fb_addCacheContentViewsAtSection:(NSUInteger)section {\n  \n  if (self.fb_cacheContentView) {\n    [CACHE_CONTENT_VIEW insertObject:[NSMutableArray array] atIndex:section];\n  } else if(self.fb_cacheLayout) {\n    [CACHE_LAYOUT insertObject:[NSMutableArray array] atIndex:section];\n  }\n  \n}\n\n- (void)fb_addCacheContentViewsAtIndexPath:(NSIndexPath *)indexPath {\n  if (self.fb_cacheContentView) {\n    [CACHE_CONTENT_VIEW[indexPath.section] insertObject:[NSNull null] atIndex:indexPath.row];\n  } else if(self.fb_cacheLayout) {\n    [CACHE_LAYOUT[indexPath.section] insertObject:[NSNull null] atIndex:indexPath.row];\n  }\n\n}\n\n- (void)fb_reloadCacheContentViewsAtSection:(NSUInteger)section {\n  if (self.fb_cacheContentView) {\n    [CACHE_CONTENT_VIEW[section] removeAllObjects];\n  } else if (self.fb_cacheLayout) {\n    [CACHE_LAYOUT[section] removeAllObjects];\n  }\n}\n\n- (void)fb_reloadCacheContentViewsAtIndexPath:(NSIndexPath *)indexPath {\n  if (self.fb_cacheContentView) {\n    [CACHE_CONTENT_VIEW[indexPath.section] replaceObjectAtIndex:indexPath.row withObject:[NSNull null]];\n  } else if (self.fb_cacheLayout) {\n    [CACHE_LAYOUT[indexPath.section] replaceObjectAtIndex:indexPath.row withObject:[NSNull null]];\n  }\n}\n\n- (void)fb_moveCacheContentViewsSection:(NSInteger)section toSection:(NSInteger)newSection {\n  if (self.fb_cacheContentView) {\n    [CACHE_CONTENT_VIEW exchangeObjectAtIndex:section withObjectAtIndex:newSection];\n  } else if(self.fb_cacheLayout) {\n    [CACHE_LAYOUT exchangeObjectAtIndex:section withObjectAtIndex:newSection];\n  }\n}\n\n- (void)fb_moveCacheContentViewsAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath {\n  \n  if (self.fb_cacheContentView) {\n    \n    UIView *view1 = CACHE_CONTENT_VIEW[indexPath.section][indexPath.row];\n    \n    UIView *view2 = CACHE_CONTENT_VIEW[newIndexPath.section][newIndexPath.row];\n    \n    CACHE_CONTENT_VIEW[indexPath.section][indexPath.row] = view2;\n    \n    CACHE_CONTENT_VIEW[newIndexPath.section][newIndexPath.row] = view1;\n    \n  } else if (self.fb_cacheLayout) {\n    \n    UIView *view1 = CACHE_LAYOUT[indexPath.section][indexPath.row];\n    \n    UIView *view2 = CACHE_LAYOUT[newIndexPath.section][newIndexPath.row];\n    \n    CACHE_LAYOUT[indexPath.section][indexPath.row] = view2;\n    \n    CACHE_LAYOUT[newIndexPath.section][newIndexPath.row] = view1;\n  }\n  \n\n  \n}\n\n- (void)fb_configContentView:(UIView *)contentView forCell:(UITableViewCell *)cell{\n  UIView *removedView = [cell.contentView viewWithTag:contentViewTag];\n  [removedView removeFromSuperview];\n  [cell.contentView addSubview:contentView];\n}\n\n#pragma mark - interceptedSelectors\n\n- (void)fb_reloadData {\n  [self fb_removeAllCacheContentViews];\n  [self fb_reloadData];\n}\n\n- (void)fb_insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation{\n  \n  [sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {\n    [self fb_addCacheContentViewsAtSection:idx];\n  }];\n  \n  [self fb_insertSections:sections withRowAnimation:animation];\n  \n}\n\n- (void)fb_deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation {\n  \n  [sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {\n    [self fb_removeCacheContentViewsAtSection:idx];\n  }];\n  \n  [self fb_deleteSections:sections withRowAnimation:animation];\n  \n}\n\n- (void)fb_reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation {\n  [sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {\n    [self fb_reloadCacheContentViewsAtSection:idx];\n  }];\n  [self fb_reloadSections:sections withRowAnimation:animation];\n}\n\n- (void)fb_moveSection:(NSInteger)section toSection:(NSInteger)newSection {\n  [self fb_moveCacheContentViewsSection:section toSection:newSection];\n  [self fb_moveSection:section toSection:newSection];\n}\n\n- (void)fb_insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation {\n  \n  [indexPaths enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n    [self fb_addCacheContentViewsAtIndexPath:obj];\n  }];\n  [self fb_insertRowsAtIndexPaths:indexPaths withRowAnimation:animation];\n}\n\n- (void)fb_deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation {\n  \n  [indexPaths enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n    [self fb_removeCacheContentViewAtIndexPath:obj];\n  }];\n  \n  [self fb_deleteRowsAtIndexPaths:indexPaths withRowAnimation:animation];\n  \n}\n\n- (void)fb_reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation {\n  [indexPaths enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n    [self fb_reloadCacheContentViewsAtIndexPath:obj];\n  }];\n  [self fb_reloadRowsAtIndexPaths:indexPaths withRowAnimation:animation];\n}\n\n- (void)fb_moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath {\n  [self fb_moveCacheContentViewsAtIndexPath:indexPath toIndexPath:newIndexPath];\n  [self fb_moveRowAtIndexPath:indexPath toIndexPath:newIndexPath];\n}\n\n- (void)dealloc {\n  [[NSNotificationCenter defaultCenter] removeObserver:self];\n}\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UIView+CellStyle.h",
    "content": "//\n//  UIView+CellStyle.h\n//  Pods\n//\n//  Created by 沈强 on 2017/1/12.\n//\n//\n\n#import <UIKit/UIKit.h>\n\n@interface UIView (CellStyle)\n\n\n/**\n set cell selectionStyle if view add to the cell.\n */\n@property(nonatomic) UITableViewCellSelectionStyle fb_selectionStyle;\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UIView+CellStyle.m",
    "content": "//\n//  UIView+CellStyle.m\n//  Pods\n//\n//  Created by 沈强 on 2017/1/12.\n//\n//\n\n#import \"UIView+CellStyle.h\"\n#import <objc/runtime.h>\n\n@implementation UIView (CellStyle)\n\n- (void)setFb_selectionStyle:(UITableViewCellSelectionStyle)fb_selectionStyle {\n  objc_setAssociatedObject(self, _cmd, @(fb_selectionStyle), OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n\n- (UITableViewCellSelectionStyle)fb_selectionStyle {\n  return [objc_getAssociatedObject(self, @selector(setFb_selectionStyle:)) integerValue];;\n}\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UIView+FBLayout.h",
    "content": "//\n//  UIView+CSJSLayout.h\n//  CSJSView\n//\n//  Created by 沈强 on 16/8/31.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"FBLayout.h\"\n#import \"FBLayoutProtocol.h\"\n\n@interface UIView (FBLayout)<FBLayoutProtocol>\n\n@property(nonatomic) BOOL fb_drawsAsynchronously;\n\n\n/**\n  fit view size to content size\n */\n- (void)fb_wrapContent;\n\n\n\n/**\n set view layout properties\n\n @param direction\n @param justifyContent\n @param alignItems\n @param children\n */\n- (void)fb_setFlexDirection:(FBFlexDirection)direction\n             justifyContent:(FBJustify)justifyContent\n                 alignItems:(FBAlign)alignItems\n                   children:(NSArray<id<FBLayoutProtocol>>*)children;\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Component/UIView+FBLayout.m",
    "content": "//\n//  UIView+CSJSLayout.m\n//  CSJSView\n//\n//  Created by 沈强 on 16/8/31.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import \"UIView+FBLayout.h\"\n#import <objc/runtime.h>\n#import \"FBAsyLayoutTransaction.h\"\n\nextern void YGSetMesure(FBLayout *layout);\n\nconst CGSize fb_undefinedSize = {\n  .width = YGUndefined,\n  .height = YGUndefined,\n};\n\nconst CGFloat fb_undefined = YGUndefined;\n\n@implementation UIView (FBLayout)\n\n- (void)setFbStyles:(NSDictionary *)fbStyles {\n  [self fb_layout].fbStyles = fbStyles;\n}\n\n- (NSDictionary *)fbStyles {\n  return [self fb_layout].fbStyles;\n}\n\n- (void)setFb_children:(NSArray<id<FBLayoutProtocol>> *)children {\n  \n  if ([self fb_children] == children) {\n    return;\n  }\n  \n  objc_setAssociatedObject(self, @selector(fb_children), children, OBJC_ASSOCIATION_COPY_NONATOMIC);\n  \n  [[self fb_layout] removeAllChildren];\n  \n  for (id<FBLayoutProtocol> layoutElement in children) {\n    NSAssert([layoutElement conformsToProtocol:NSProtocolFromString(@\"FBLayoutProtocol\")], @\"child %@ has no conformsToProtocol FBLayoutProtocol\", self);\n    [[self fb_layout] addChild:layoutElement.fb_layout];\n  }\n\n}\n\n- (void)fb_addChild:(id<FBLayoutProtocol>)layout {\n  NSAssert([layout conformsToProtocol:NSProtocolFromString(@\"FBLayoutProtocol\")], @\"child %@ has no conformsToProtocol FBLayoutProtocol\", self);\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren addObject:layout];\n  self.fb_children = newChildren;\n}\n\n- (void)fb_addChildren:(NSArray<id<FBLayoutProtocol>> *)children {\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren addObjectsFromArray:children];\n  self.fb_children = newChildren;\n}\n\n- (void)fb_insertChild:(id<FBLayoutProtocol>)layout atIndex:(NSInteger)index {\n  NSAssert([layout conformsToProtocol:NSProtocolFromString(@\"FBLayoutProtocol\")], @\"child %@ has no conformsToProtocol FBLayoutProtocol\", self);\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren insertObject:layout atIndex:index];\n  self.fb_children = newChildren;\n}\n\n- (id<FBLayoutProtocol>)fb_childLayoutAtIndex:(NSUInteger)index {\n  return [self.fb_children objectAtIndex:index];\n}\n\n- (void)fb_removeChild:(id<FBLayoutProtocol>)layout {\n  NSMutableArray *newChildren = [[self fb_children] mutableCopy];\n  [newChildren removeObject:layout];\n  self.fb_children = newChildren;\n}\n\n- (void)fb_removeAllChildren {\n  self.fb_children = nil;\n}\n\n- (NSArray *)fb_children {\n  return objc_getAssociatedObject(self, _cmd) ?:[NSMutableArray array];\n}\n\n- (void)fb_setFlexDirection:(FBFlexDirection)direction\n              justifyContent:(FBJustify)justifyContent\n                  alignItems:(FBAlign)alignItems\n                    children:(NSArray<id<FBLayoutProtocol>>*)children {\n  \n  [self fb_makeLayout:^(FBLayout *layout) {\n    [layout setFlexDirection:direction];\n    [layout setJustifyContent:justifyContent];\n    [layout setAlignItems:alignItems];\n  }];\n  [self setFb_children:children];\n}\n\n- (void)fb_wrapContent {\n  [self fb_layout].mesureSize = [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)];\n  YGSetMesure([self fb_layout]);\n}\n\n- (void)setFb_drawsAsynchronously:(BOOL)fb_drawsAsynchronously {\n  self.layer.drawsAsynchronously = fb_drawsAsynchronously;\n}\n\n- (BOOL)fb_drawsAsynchronously {\n  return self.layer.drawsAsynchronously;\n}\n\n\n- (FBLayout *)fb_layout {\n  \n  FBLayout *layout = objc_getAssociatedObject(self, _cmd);\n  if (!layout) {\n    layout = [FBLayout new];\n    layout.context = self;\n    objc_setAssociatedObject(self, _cmd, layout, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n  }\n  \n  return layout;\n  \n}\n\n\n#pragma mark - layout\n\n- (void)fb_applyLayouWithSize:(CGSize)size {\n  [[self fb_layout] calculateLayoutWithSize:size];\n  self.frame = [self fb_layout].frame;\n  [self fb_applyLayoutToViewHierachy];\n}\n\n\n- (void)fb_asyApplyLayoutWithSize:(CGSize)size {\n  [FBAsyLayoutTransaction addCalculateTransaction:^{\n    [[self fb_layout] calculateLayoutWithSize:size];\n  } complete:^{\n     self.frame = [self fb_layout].frame;\n    [self fb_applyLayoutToViewHierachy];\n\n  }];\n}\n\n\n- (void)fb_applyLayoutToViewHierachy {\n  for (id<FBLayoutProtocol> layoutElement in [self fb_children]) {\n    \n    layoutElement.frame = layoutElement.fb_layout.frame;\n    \n    [layoutElement fb_applyLayoutToViewHierachy];\n  }\n  \n}\n\n- (FBLayout *)fb_makeLayout:(void(^)(FBLayout *layout))layout {\n  if (layout) {\n    layout([self fb_layout]);\n  }\n  return [self fb_layout];\n}\n\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/FlexBoxLayout.h",
    "content": "//\n//  FlexBoxLayout.h\n//  Pods\n//\n//  Created by 沈强 on 2017/2/9.\n//\n//\n\n#ifndef FlexBoxLayout_h\n#define FlexBoxLayout_h\n\n#import \"FBLayout.h\"\n#import \"FBLayoutDiv.h\"\n#import \"FBLayoutProtocol.h\"\n#import \"UIScrollView+FBLayout.h\"\n#import \"UIView+CellStyle.h\"\n#import \"UITableView+FBLayout.h\"\n#import \"UIView+FBLayout.h\"\n\n#endif /* FlexBoxLayout_h */\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/FBLayout+Private.h",
    "content": "//\n//  FBLayout+Private.h\n//  Pods\n//\n//  Created by 沈强 on 2017/2/9.\n//\n//\n\n#import \"FBLayout.h\"\n#import \"Yoga.h\"\n#import \"FBViewLayoutCache.h\"\n\n@interface FBLayout (Private)\n\n@property(nonatomic, weak) id context;\n\n@property(nonatomic, weak) FBLayout *parent;\n\n@property(nonatomic, copy)NSDictionary *fbStyles;\n\n@property(nonatomic, readonly, assign) YGNodeRef fbNode;\n\n@property(nonatomic, readonly, assign) CGRect frame;\n\n@property(nonatomic, assign) CGSize mesureSize;\n\n- (FBViewLayoutCache *)layoutCache;\n\n- (void)applyLayoutCache:(FBViewLayoutCache *)layoutCache;\n\n- (NSArray *)allChildren;\n\n- (void)addChild:(FBLayout *)layout;\n\n- (void)addChildren:(NSArray *)children;\n\n- (void)insertChild:(FBLayout *)layout atIndex:(NSInteger)index;\n\n- (FBLayout *)childLayoutAtIndex:(NSUInteger)index;\n\n- (void)removeChild:(FBLayout *)layout;\n\n- (void)removeAllChildren;\n\n- (void)calculateLayoutWithSize:(CGSize)size;\n\n- (void)setDirection:(FBDirection)direction;\n\n- (void)setFlexDirection:(FBFlexDirection)flexDirection;\n\n- (void)setJustifyContent:(FBJustify)justifyContent;\n\n- (void)setAlignContent:(FBAlign)alignContent;\n\n- (void)setAlignItems:(FBAlign)alignItems;\n\n- (void)setAlignSelf:(FBAlign)alignSelf;\n\n- (void)setPositionType:(FBPositionType)positionType;\n\n- (void)setFlexWrap:(FBWrap)flexWrap;\n\n- (void)setFlexGrow:(CGFloat)flexGrow;\n\n- (void)setFlexShrink:(CGFloat)flexShrink;\n\n- (void)setFlexBasis:(CGFloat)flexBasis;\n\n- (void)setPosition:(CGFloat)position forEdge:(FBEdge)edge;\n\n- (void)setMargin:(CGFloat)margin forEdge:(FBEdge)edge;\n\n- (void)setPadding:(CGFloat)padding forEdge:(FBEdge)edge;\n\n- (void)setWidth:(CGFloat)width;\n\n- (void)setHeight:(CGFloat)height;\n\n- (void)setSize:(CGSize)size;\n\n- (void)setMinWidth:(CGFloat)minWidth;\n\n- (void)setMinHeight:(CGFloat)minHeight;\n\n- (void)setMinSize:(CGSize)minSize;\n\n- (void)setMaxWidth:(CGFloat)maxWidth;\n\n- (void)setMaxHeight:(CGFloat)maxHeight;\n\n- (void)setMaxSize:(CGSize)maxSize;\n\n- (void)setAspectRatio:(CGFloat)aspectRatio;\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/FBLayout.h",
    "content": "//\n//  FBLayout.h\n//\n//  Created by 沈强 on 16/8/28.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\ntypedef enum FBFlexDirection {\n  FBFlexDirectionColumn,\n  FBFlexDirectionColumnReverse,\n  FBFlexDirectionRow,\n  FBFlexDirectionRowReverse,\n} FBFlexDirection;\n\ntypedef enum FBMeasureMode {\n  FBMeasureModeUndefined,\n  FBMeasureModeExactly,\n  FBMeasureModeAtMost,\n} FBMeasureMode;\n\ntypedef enum FBPrintOptions {\n  FBPrintOptionsLayout = 1,\n  FBPrintOptionsStyle = 2,\n  FBPrintOptionsChildren = 4,\n} FBPrintOptions;\n\ntypedef enum FBEdge {\n  FBEdgeLeft,\n  FBEdgeTop,\n  FBEdgeRight,\n  FBEdgeBottom,\n  FBEdgeStart,\n  FBEdgeEnd,\n  FBEdgeHorizontal,\n  FBEdgeVertical,\n  FBEdgeAll,\n} FBEdge;\n\ntypedef enum FBPositionType {\n  FBPositionTypeRelative,\n  FBPositionTypeAbsolute,\n} FBPositionType;\n\ntypedef enum FBDimension {\n  FBDimensionWidth,\n  FBDimensionHeight,\n} FBDimension;\n\ntypedef enum FBJustify {\n  FBJustifyFlexStart,\n  FBJustifyCenter,\n  FBJustifyFlexEnd,\n  FBJustifySpaceBetween,\n  FBJustifySpaceAround,\n} FBJustify;\n\ntypedef enum FBDirection {\n  FBDirectionInherit,\n  FBDirectionLTR,\n  FBDirectionRTL,\n} FBDirection;\n\ntypedef enum FBLogLevel {\n  FBLogLevelError,\n  FBLogLevelWarn,\n  FBLogLevelInfo,\n  FBLogLevelDebug,\n  FBLogLevelVerbose,\n} FBLogLevel;\n\ntypedef enum FBWrap {\n  FBWrapNoWrap,\n  FBWrapWrap,\n  FBWrapCount,\n} FBWrap;\n\n\ntypedef enum FBAlign {\n  FBAlignAuto,\n  FBAlignFlexStart,\n  FBAlignCenter,\n  FBAlignFlexEnd,\n  FBAlignStretch,\n} FBAlign;\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface FBLayout : NSObject\n\n- (FBLayout *)flexDirection;\n\n- (FBLayout *)justifyContent;\n\n- (FBLayout *)alignContent;\n\n- (FBLayout *)alignItems;\n\n- (FBLayout *)alignSelf;\n\n- (FBLayout *)positionType;\n\n- (FBLayout *)flexWrap;\n\n- (FBLayout *)flexGrow;\n\n- (FBLayout *)flexShrink;\n\n- (FBLayout *)flexBasiss;\n\n- (FBLayout *)position;\n\n- (FBLayout *)margin;\n\n- (FBLayout *)padding;\n\n- (FBLayout *)width;\n\n- (FBLayout *)height;\n\n- (FBLayout *)minWidth;\n\n- (FBLayout *)minHeight;\n\n- (FBLayout *)maxWidth;\n\n- (FBLayout *)maxHeight;\n\n- (FBLayout *)size;\n\n- (FBLayout *)maxSize;\n\n- (FBLayout *)minSize;\n\n- (FBLayout *)aspectRatio;\n\n- (FBLayout * (^)(id attr))equalTo;\n\n- (FBLayout * (^)(CGSize attr))equalToSize;\n\n- (FBLayout * (^)(UIEdgeInsets attr))equalToEdgeInsets;\n\n- (FBLayout * (^)())wrapContent;\n\n- (FBLayout * (^)(NSArray*))children;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/FBLayout.m",
    "content": "//\n//  FBLayout.m\n//\n//  Created by 沈强 on 16/8/28.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import \"FBLayout.h\"\n#import \"FBLayout+Private.h\"\n#import \"FBLayoutProtocol.h\"\n#import \"Yoga.h\"\n#import \"FBLayoutDiv.h\"\n\nstatic CGFloat FBRoundPixelValue(CGFloat value)\n{\n  static CGFloat scale;\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^(){\n    scale = [UIScreen mainScreen].scale;\n  });\n  \n  return round(value * scale) / scale;\n}\n\nstatic CGFloat YGSanitizeMeasurement(\n                                     CGFloat constrainedSize,\n                                     CGFloat measuredSize,\n                                     YGMeasureMode measureMode)\n{\n  CGFloat result;\n  if (measureMode == YGMeasureModeExactly) {\n    result = constrainedSize;\n  } else if (measureMode == YGMeasureModeAtMost) {\n    result = MIN(constrainedSize, measuredSize);\n  } else {\n    result = measuredSize;\n  }\n  \n  return result;\n}\n\n\nstatic YGSize YGMeasureView(\n                            YGNodeRef node,\n                            float width,\n                            YGMeasureMode widthMode,\n                            float height,\n                            YGMeasureMode heightMode)\n{\n  const CGFloat constrainedWidth = (widthMode == YGMeasureModeUndefined) ? CGFLOAT_MAX : width;\n  const CGFloat constrainedHeight = (heightMode == YGMeasureModeUndefined) ? CGFLOAT_MAX: height;\n  \n  UIView *view = (__bridge UIView*) YGNodeGetContext(node);\n  __block CGSize sizeThatFits;\n  if ([[NSThread currentThread] isMainThread]) {\n    sizeThatFits = [view sizeThatFits:(CGSize) {\n      .width = constrainedWidth,\n      .height = constrainedHeight,\n    }];\n  } else {\n    dispatch_sync(dispatch_get_main_queue(), ^{\n      sizeThatFits = [view sizeThatFits:(CGSize) {\n        .width = constrainedWidth,\n        .height = constrainedHeight,\n      }];\n    });\n  }\n  return (YGSize) {\n    .width = YGSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode),\n    .height = YGSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode),\n  };\n}\n\nvoid YGSetMesure(FBLayout *layout) {\n  if ([layout.context isKindOfClass:[UIView class]] && layout.allChildren.count == 0) {\n    YGNodeSetMeasureFunc(layout.fbNode, YGMeasureView);\n  } else {\n    YGNodeSetMeasureFunc(layout.fbNode, NULL);\n  }\n}\n\n@interface FBLayout() {\n   NSMutableArray *_children;\n}\n\n@property(nonatomic, strong) NSMutableArray *styleNames;\n\n@property(nonatomic, weak) id context;\n\n@property(nonatomic, weak) FBLayout *parent;\n\n@property(nonatomic, copy)NSDictionary *fbStyles;\n\n@property(nonatomic, readonly, assign) YGNodeRef fbNode;\n\n@property(nonatomic, readonly, assign) CGRect frame;\n\n@property(nonatomic, assign) CGSize mesureSize;\n\n@end\n\n@implementation FBLayout\n\n- (instancetype)init {\n  if (self = [super init]) {\n    _fbNode = YGNodeNew();\n    _children = [NSMutableArray array];\n    _styleNames = [NSMutableArray array];\n  }\n  return self;\n}\n\n- (void)setContext:(id)context {\n  _context = context;\n  YGNodeSetContext(_fbNode, (__bridge void *)(context));\n}\n\n- (void)dealloc {\n   YGNodeFree(_fbNode);\n}\n\n- (CGRect)frame {\n\n  return CGRectMake(FBRoundPixelValue(YGNodeLayoutGetLeft(_fbNode)),\n                    FBRoundPixelValue(YGNodeLayoutGetTop(_fbNode)),\n                    FBRoundPixelValue(YGNodeLayoutGetWidth(_fbNode)),\n                    FBRoundPixelValue(YGNodeLayoutGetHeight(_fbNode)));\n}\n\n- (FBViewLayoutCache *)layoutCache {\n  \n  FBViewLayoutCache *layoutCache = [FBViewLayoutCache new];\n  layoutCache.frame = ((id<FBLayoutProtocol>)self.context).frame;\n  NSMutableArray *childrenLayoutCache = [NSMutableArray arrayWithCapacity:self.allChildren.count];\n  for (FBLayout *childLayout in self.allChildren) {\n    [childrenLayoutCache addObject:[childLayout layoutCache]];\n  }\n  layoutCache.childrenCache = [childrenLayoutCache copy];\n  return layoutCache;\n}\n\n\n- (void)applyLayoutCache:(FBViewLayoutCache *)layoutCache {\n  id<FBLayoutProtocol> view = self.context;\n  view.frame = layoutCache.frame;\n  if (view.fb_children.count != layoutCache.childrenCache.count) {\n    return;\n  }\n  \n  for (int i = 0; i < layoutCache.childrenCache.count; i++) {\n    FBViewLayoutCache* childLayoutCache = layoutCache.childrenCache[i];\n    id<FBLayoutProtocol> childView = view.fb_children[i];\n    [childView.fb_layout applyLayoutCache:childLayoutCache];\n  }\n  \n}\n\n#pragma mark - children\n\n- (NSArray *)allChildren {\n  return [_children copy];\n}\n\n- (FBLayout *)childLayoutAtIndex:(NSUInteger)index {\n  return [_children objectAtIndex:index];\n}\n\n- (void)addChild:(FBLayout *)layout {\n  \n  [_children addObject:layout];\n  layout.parent = self;\n  \n  YGNodeInsertChild(_fbNode, layout.fbNode, YGNodeGetChildCount(_fbNode));\n  \n}\n\n- (void)addChildren:(NSArray *)children {\n  for (FBLayout *layout in children) {\n    [self addChild:layout];\n  }\n}\n\n- (void)insertChild:(FBLayout *)layout atIndex:(NSInteger)index {\n  [_children insertObject:layout atIndex:index];\n  layout.parent = self;\n  YGNodeInsertChild(_fbNode, layout.fbNode, (uint32_t)index);\n}\n\n- (void)removeChild:(FBLayout *)layout {\n  [_children removeObject:layout];\n  YGNodeRemoveChild(_fbNode, layout.fbNode);\n}\n\n- (void)removeAllChildren {\n  [_children removeAllObjects];\n  if (_fbNode == NULL) {\n    return;\n  }\n  \n  while (YGNodeGetChildCount(_fbNode) > 0) {\n    YGNodeRemoveChild(_fbNode, YGNodeGetChild(_fbNode, YGNodeGetChildCount(_fbNode) - 1));\n  }\n}\n\n\n#pragma mark - calculate\n\n- (void)calculateLayoutWithSize:(CGSize)size {\n\n  YGNodeCalculateLayout(_fbNode,\n                        size.width,\n                        size.height,\n                        YGNodeStyleGetDirection(_fbNode));\n}\n\n\n#pragma mark - FB styles\n\n#define FB_STYLE_FILL(key)\\\ndo {\\\nid value = _fbStyles[@\"FB\"#key\"AttributeName\"];\\\nif (value) {\\\n  [self set##key:[(NSNumber *)value floatValue]];\\\n}\\\n} while(0);\n\n#define FB_STYLE_FILL_ALL_DIRECTION(key) \\\ndo {\\\nid value = _fbStyles[@\"FB\"#key\"AttributeName\"];\\\nif (value) {\\\n[self set##key:[(NSValue *)value UIEdgeInsetsValue].left forEdge:FBEdgeLeft];\\\n[self set##key:[(NSValue *)value UIEdgeInsetsValue].top forEdge:FBEdgeTop];\\\n[self set##key:[(NSValue *)value UIEdgeInsetsValue].right forEdge:FBEdgeRight];\\\n[self set##key:[(NSValue *)value UIEdgeInsetsValue].bottom forEdge:FBEdgeBottom];\\\n}\\\n} while(0);\n\n#define FB_STYLE_FILL_ALL_SIZE(key) \\\ndo {\\\n  id value = _fbStyles[@\"FB\"#key\"AttributeName\"];\\\n  if (value) {\\\n    [self set##key:[(NSValue *)value CGSizeValue]];\\\n  }\\\n} while(0);\n\n- (void)setFbStyles:(NSDictionary *)fbStyles {\n  \n  if (_fbStyles == fbStyles) {\n    return;\n  }\n  _fbStyles = fbStyles;\n  FB_STYLE_FILL(Direction)\n  FB_STYLE_FILL(FlexDirection)\n  FB_STYLE_FILL(JustifyContent)\n  FB_STYLE_FILL(AlignContent)\n  FB_STYLE_FILL(AlignItems)\n  FB_STYLE_FILL(AlignSelf)\n  FB_STYLE_FILL(PositionType)\n  FB_STYLE_FILL(FlexWrap)\n  FB_STYLE_FILL(FlexGrow)\n  FB_STYLE_FILL(FlexShrink)\n  FB_STYLE_FILL(FlexBasis)\n  FB_STYLE_FILL_ALL_DIRECTION(Position)\n  FB_STYLE_FILL_ALL_DIRECTION(Margin)\n  FB_STYLE_FILL_ALL_DIRECTION(Padding)\n  FB_STYLE_FILL(Width)\n  FB_STYLE_FILL(Height)\n  FB_STYLE_FILL(MinWidth)\n  FB_STYLE_FILL(MinHeight)\n  FB_STYLE_FILL(MaxWidth)\n  FB_STYLE_FILL(MaxHeight)\n  FB_STYLE_FILL(AspectRatio)\n  FB_STYLE_FILL_ALL_SIZE(Size)\n  FB_STYLE_FILL_ALL_SIZE(MinSize)\n  FB_STYLE_FILL_ALL_SIZE(MaxSize)\n}\n\n\n- (void)setDirection:(FBDirection)direction\n{\n  YGNodeStyleSetDirection(_fbNode, (YGDirection)direction);\n}\n\n- (void)setFlexDirection:(FBFlexDirection)flexDirection\n{\n  YGNodeStyleSetFlexDirection(_fbNode, (YGFlexDirection)flexDirection);\n}\n\n- (void)setJustifyContent:(FBJustify)justifyContent\n{\n  YGNodeStyleSetJustifyContent(_fbNode, (YGJustify)justifyContent);\n}\n\n- (void)setAlignContent:(FBAlign)alignContent\n{\n  YGNodeStyleSetAlignContent(_fbNode, (YGAlign)alignContent);\n}\n\n- (void)setAlignItems:(FBAlign)alignItems\n{\n  YGNodeStyleSetAlignItems(_fbNode, (YGAlign)alignItems);\n}\n\n- (void)setAlignSelf:(FBAlign)alignSelf\n{\n  YGNodeStyleSetAlignSelf(_fbNode, (YGAlign)alignSelf);\n}\n\n- (void)setPositionType:(FBPositionType)positionType\n{\n  YGNodeStyleSetPositionType(_fbNode, (YGPositionType)positionType);\n}\n\n- (void)setFlexWrap:(FBWrap)flexWrap\n{\n  YGNodeStyleSetFlexWrap(_fbNode, (YGWrap)flexWrap);\n}\n\n- (void)setFlexGrow:(CGFloat)flexGrow\n{\n  YGNodeStyleSetFlexGrow(_fbNode, flexGrow);\n}\n\n- (void)setFlexShrink:(CGFloat)flexShrink\n{\n  YGNodeStyleSetFlexShrink(_fbNode, flexShrink);\n}\n\n- (void)setFlexBasis:(CGFloat)flexBasis\n{\n  YGNodeStyleSetFlexBasis(_fbNode, flexBasis);\n}\n\n- (void)setPosition:(CGFloat)position forEdge:(FBEdge)edge\n{\n  YGNodeStyleSetPosition(_fbNode, (YGEdge)edge, position);\n}\n\n- (void)setMargin:(CGFloat)margin forEdge:(FBEdge)edge\n{\n  YGNodeStyleSetMargin(_fbNode, (YGEdge)edge, margin);\n}\n\n- (void)setPadding:(CGFloat)padding forEdge:(FBEdge)edge\n{\n  YGNodeStyleSetPadding(_fbNode, (YGEdge)edge, padding);\n}\n\n- (void)setWidth:(CGFloat)width\n{\n  YGNodeStyleSetWidth(_fbNode, width);\n}\n\n- (void)setHeight:(CGFloat)height\n{\n  YGNodeStyleSetHeight(_fbNode, height);\n}\n\n- (void)setSize:(CGSize)size {\n  YGNodeStyleSetWidth(_fbNode, size.width);\n  YGNodeStyleSetHeight(_fbNode, size.height);\n}\n\n- (void)setMinWidth:(CGFloat)minWidth\n{\n  YGNodeStyleSetMinWidth(_fbNode, minWidth);\n}\n\n- (void)setMinHeight:(CGFloat)minHeight\n{\n  YGNodeStyleSetMinHeight(_fbNode, minHeight);\n}\n\n- (void)setMinSize:(CGSize)minSize {\n  YGNodeStyleSetMinWidth(_fbNode, minSize.width);\n  YGNodeStyleSetMinHeight(_fbNode, minSize.height);\n}\n\n- (void)setMaxWidth:(CGFloat)maxWidth\n{\n  YGNodeStyleSetMaxWidth(_fbNode, maxWidth);\n}\n\n- (void)setMaxHeight:(CGFloat)maxHeight\n{\n  YGNodeStyleSetMaxHeight(_fbNode, maxHeight);\n}\n\n- (void)setMaxSize:(CGSize)maxSize {\n  YGNodeStyleSetMaxWidth(_fbNode, maxSize.width);\n  YGNodeStyleSetMaxHeight(_fbNode, maxSize.height);\n}\n\n- (void)setAspectRatio:(CGFloat)aspectRatio\n{\n  YGNodeStyleSetAspectRatio(_fbNode, aspectRatio);\n}\n\n#define CACHE_STYLES_NAME(name)  [_styleNames addObject:@\"\"#name]; \\\nreturn self;\n\n- (FBLayout *)flexDirection {\n  CACHE_STYLES_NAME(FlexDirection)\n}\n\n- (FBLayout *)justifyContent {\n  CACHE_STYLES_NAME(JustifyContent)\n}\n\n- (FBLayout *)alignContent {\n   CACHE_STYLES_NAME(AlignContent)\n}\n\n- (FBLayout *)alignItems {\n  CACHE_STYLES_NAME(AlignItems)\n}\n\n- (FBLayout *)alignSelf {\n  CACHE_STYLES_NAME(AlignSelf)\n}\n\n- (FBLayout *)positionType {\n  CACHE_STYLES_NAME(PositionType)\n}\n\n- (FBLayout *)flexWrap {\n  CACHE_STYLES_NAME(FlexWrap)\n}\n\n- (FBLayout *)flexGrow {\n  CACHE_STYLES_NAME(FlexGrow)\n}\n\n- (FBLayout *)flexShrink {\n  CACHE_STYLES_NAME(FlexShrink)\n}\n\n- (FBLayout *)flexBasiss {\n  CACHE_STYLES_NAME(FlexBasiss)\n}\n\n- (FBLayout *)position {\n  CACHE_STYLES_NAME(Position)\n}\n\n- (FBLayout *)margin {\n  CACHE_STYLES_NAME(Margin)\n}\n\n- (FBLayout *)padding {\n  CACHE_STYLES_NAME(Padding)\n}\n\n- (FBLayout *)width {\n  CACHE_STYLES_NAME(Width)\n}\n\n- (FBLayout *)height {\n  CACHE_STYLES_NAME(Height)\n}\n\n- (FBLayout *)minWidth {\n  CACHE_STYLES_NAME(MinWidth)\n}\n\n- (FBLayout *)minHeight {\n  CACHE_STYLES_NAME(MinHeight)\n}\n\n- (FBLayout *)maxWidth {\n  CACHE_STYLES_NAME(MaxWidth)\n}\n\n- (FBLayout *)maxHeight {\n  CACHE_STYLES_NAME(MaxHeight)\n}\n\n- (FBLayout *)maxSize {\n  CACHE_STYLES_NAME(MaxSize)\n}\n\n- (FBLayout *)minSize {\n  CACHE_STYLES_NAME(MinSize)\n}\n\n- (FBLayout *)aspectRatio {\n  CACHE_STYLES_NAME(AspectRatio)\n}\n\n- (FBLayout *)size {\n  CACHE_STYLES_NAME(Size)\n}\n\n#define FB_STYLE(key, value)\\\ndo {\\\nif ([_styleNames containsObject:@\"\"#key]) {\\\n[self set##key:[(NSNumber *)value floatValue]];\\\n}\\\n} while(0);\n\n#define FB_STYLE_ALL_DIRECTION(key, value) \\\ndo {\\\nif ([_styleNames containsObject:@\"\"#key]) {\\\n[self set##key:value.left forEdge:FBEdgeLeft];\\\n[self set##key:value.top forEdge:FBEdgeTop];\\\n[self set##key:value.right forEdge:FBEdgeRight];\\\n[self set##key:value.bottom forEdge:FBEdgeBottom];\\\n}\\\n} while(0);\n\n#define FB_STYLE_ALL_SIZE(key, value) \\\ndo {\\\n  if ([_styleNames containsObject:@\"\"#key]) {\\\n    [self set##key:value];\\\n  }\\\n} while(0);\n\n- (FBLayout * (^)(id attr))equalTo {\n  return ^FBLayout* (id attr) {\n    if ([attr conformsToProtocol:NSProtocolFromString(@\"FBLayoutProtocol\")]) {\n      YGNodeCopyStyle(self.fbNode, [(id<FBLayoutProtocol>)attr fb_layout].fbNode);\n      return self;\n    }\n    FB_STYLE(Direction,attr)\n    FB_STYLE(FlexDirection,attr)\n    FB_STYLE(JustifyContent,attr)\n    FB_STYLE(AlignContent,attr)\n    FB_STYLE(AlignItems,attr)\n    FB_STYLE(AlignSelf,attr)\n    FB_STYLE(PositionType,attr)\n    FB_STYLE(FlexWrap,attr)\n    FB_STYLE(FlexGrow,attr)\n    FB_STYLE(FlexShrink,attr)\n    FB_STYLE(FlexBasis,attr)\n    FB_STYLE(Width,attr)\n    FB_STYLE(Height,attr)\n    FB_STYLE(MinWidth,attr)\n    FB_STYLE(MinHeight,attr)\n    FB_STYLE(MaxWidth,attr)\n    FB_STYLE(MaxHeight,attr)\n    FB_STYLE(AspectRatio,attr)\n    [self.styleNames removeAllObjects];\n    return self;\n  };\n}\n\n- (FBLayout * (^)(CGSize attr))equalToSize {\n  return ^FBLayout* (CGSize attr) {\n    FB_STYLE_ALL_SIZE(Size,attr)\n    FB_STYLE_ALL_SIZE(MinSize,attr)\n    FB_STYLE_ALL_SIZE(MaxSize,attr)\n    [self.styleNames removeAllObjects];\n    return self;\n  };\n}\n\n- (FBLayout * (^)(UIEdgeInsets attr))equalToEdgeInsets {\n  return ^FBLayout* (UIEdgeInsets attr) {\n    FB_STYLE_ALL_DIRECTION(Position,attr)\n    FB_STYLE_ALL_DIRECTION(Margin,attr)\n    FB_STYLE_ALL_DIRECTION(Padding,attr)\n    [self.styleNames removeAllObjects];\n    return self;\n  };\n}\n\n- (FBLayout * (^)())wrapContent {\n  return ^FBLayout* () {\n    YGSetMesure(self);\n    return self;\n  };\n\n}\n\n- (FBLayout * (^)(NSArray* children))children {\n  return ^FBLayout* (NSArray* children) {\n    [((id<FBLayoutProtocol>)self.context) fb_addChildren:children];\n    return self;\n  };\n}\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/FBLayoutProtocol.h",
    "content": "//\n//  FBLayoutProtocol.h\n//  CSJSView\n//\n//  Created by 沈强 on 2016/12/23.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"FBLayout.h\"\n#import \"FBLayout+Private.h\"\n\nextern const CGSize fb_undefinedSize; \n\nextern const CGFloat fb_undefined;\n\n@protocol FBLayoutProtocol <NSObject>\n\n@required\n\n@property(nonatomic, strong, readonly) FBLayout *fb_layout;\n\n/**\n  the frame after calculates the layout\n */\n@property(nonatomic, assign ) CGRect frame;\n\n\n/**\n children layout node\n */\n@property(nonatomic, copy) NSArray<id<FBLayoutProtocol>> *fb_children;\n\n\n/**\n styles of layout\n */\n@property(nonatomic, copy) NSDictionary *fbStyles;\n\n- (void)fb_addChild:(id<FBLayoutProtocol>)layout;\n\n- (void)fb_addChildren:(NSArray<id<FBLayoutProtocol>> *)children;\n\n- (void)fb_insertChild:(id<FBLayoutProtocol>)layout atIndex:(NSInteger)index;\n\n- (id<FBLayoutProtocol>)fb_childLayoutAtIndex:(NSUInteger)index;\n\n- (void)fb_removeChild:(id<FBLayoutProtocol>)layout;\n\n- (void)fb_removeAllChildren;\n\n\n- (void)fb_applyLayoutToViewHierachy;\n\n\n/**\n calculates the layout\n\n @param root layout size\n */\n- (void)fb_applyLayouWithSize:(CGSize)size;\n\n\n/**\n calculates the layout asynchronously\n\n @param root layout size\n */\n- (void)fb_asyApplyLayoutWithSize:(CGSize)size;\n\n\n/**\n setting layout properties\n @param layout\n @return  chained calls are supported\n */\n- (FBLayout *)fb_makeLayout:(void(^)(FBLayout *layout))layout;\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/FBViewLayoutCache.h",
    "content": "//\n//  FBViewLayoutCache.h\n//  Pods\n//\n//  Created by 沈强 on 2017/3/3.\n//\n//\n\n#import <Foundation/Foundation.h>\n\n@interface FBViewLayoutCache : NSObject\n\n@property(nonatomic, assign) CGRect frame;\n\n@property(nonatomic, strong) NSArray<FBViewLayoutCache*> *childrenCache;\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/FBViewLayoutCache.m",
    "content": "//\n//  FBViewLayoutCache.m\n//  Pods\n//\n//  Created by 沈强 on 2017/3/3.\n//\n//\n\n#import \"FBViewLayoutCache.h\"\n\n@implementation FBViewLayoutCache\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/YGEnums.h",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#pragma once\n\n#include \"YGMacros.h\"\n\nYG_EXTERN_C_BEGIN\n\ntypedef enum YGFlexDirection {\n  YGFlexDirectionColumn,\n  YGFlexDirectionColumnReverse,\n  YGFlexDirectionRow,\n  YGFlexDirectionRowReverse,\n  YGFlexDirectionCount,\n} YGFlexDirection;\n\ntypedef enum YGMeasureMode {\n  YGMeasureModeUndefined,\n  YGMeasureModeExactly,\n  YGMeasureModeAtMost,\n  YGMeasureModeCount,\n} YGMeasureMode;\n\ntypedef enum YGPrintOptions {\n  YGPrintOptionsLayout = 1,\n  YGPrintOptionsStyle = 2,\n  YGPrintOptionsChildren = 4,\n  YGPrintOptionsCount,\n} YGPrintOptions;\n\ntypedef enum YGEdge {\n  YGEdgeLeft,\n  YGEdgeTop,\n  YGEdgeRight,\n  YGEdgeBottom,\n  YGEdgeStart,\n  YGEdgeEnd,\n  YGEdgeHorizontal,\n  YGEdgeVertical,\n  YGEdgeAll,\n  YGEdgeCount,\n} YGEdge;\n\ntypedef enum YGPositionType {\n  YGPositionTypeRelative,\n  YGPositionTypeAbsolute,\n  YGPositionTypeCount,\n} YGPositionType;\n\ntypedef enum YGDimension {\n  YGDimensionWidth,\n  YGDimensionHeight,\n  YGDimensionCount,\n} YGDimension;\n\ntypedef enum YGJustify {\n  YGJustifyFlexStart,\n  YGJustifyCenter,\n  YGJustifyFlexEnd,\n  YGJustifySpaceBetween,\n  YGJustifySpaceAround,\n  YGJustifyCount,\n} YGJustify;\n\ntypedef enum YGDirection {\n  YGDirectionInherit,\n  YGDirectionLTR,\n  YGDirectionRTL,\n  YGDirectionCount,\n} YGDirection;\n\ntypedef enum YGLogLevel {\n  YGLogLevelError,\n  YGLogLevelWarn,\n  YGLogLevelInfo,\n  YGLogLevelDebug,\n  YGLogLevelVerbose,\n  YGLogLevelCount,\n} YGLogLevel;\n\ntypedef enum YGWrap {\n  YGWrapNoWrap,\n  YGWrapWrap,\n  YGWrapCount,\n} YGWrap;\n\ntypedef enum YGOverflow {\n  YGOverflowVisible,\n  YGOverflowHidden,\n  YGOverflowScroll,\n  YGOverflowCount,\n} YGOverflow;\n\ntypedef enum YGExperimentalFeature {\n  YGExperimentalFeatureRounding,\n  YGExperimentalFeatureWebFlexBasis,\n  YGExperimentalFeatureCount,\n} YGExperimentalFeature;\n\ntypedef enum YGAlign {\n  YGAlignAuto,\n  YGAlignFlexStart,\n  YGAlignCenter,\n  YGAlignFlexEnd,\n  YGAlignStretch,\n  YGAlignCount,\n} YGAlign;\n\nYG_EXTERN_C_END\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/YGMacros.h",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#pragma once\n\n#ifdef __cplusplus\n#define YG_EXTERN_C_BEGIN extern \"C\" {\n#define YG_EXTERN_C_END }\n#else\n#define YG_EXTERN_C_BEGIN\n#define YG_EXTERN_C_END\n#endif\n\n#ifdef _WINDLL\n#define WIN_EXPORT __declspec(dllexport)\n#else\n#define WIN_EXPORT\n#endif\n\n#ifndef FB_ASSERTIONS_ENABLED\n#define FB_ASSERTIONS_ENABLED 1\n#endif\n\n#if FB_ASSERTIONS_ENABLED\n#define YG_ABORT() abort()\n#else\n#define YG_ABORT()\n#endif\n\n#ifndef YG_ASSERT\n#define YG_ASSERT(X, message)              \\\n  if (!(X)) {                              \\\n    YGLog(YGLogLevelError, \"%s\", message); \\\n    YG_ABORT();                            \\\n  }\n#endif\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/YGNodeList.c",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#include \"YGNodeList.h\"\n\nextern YGMalloc gYGMalloc;\nextern YGRealloc gYGRealloc;\nextern YGFree gYGFree;\n\nstruct YGNodeList {\n  uint32_t capacity;\n  uint32_t count;\n  YGNodeRef *items;\n};\n\nYGNodeListRef YGNodeListNew(const uint32_t initialCapacity) {\n  const YGNodeListRef list = gYGMalloc(sizeof(struct YGNodeList));\n  YG_ASSERT(list != NULL, \"Could not allocate memory for list\");\n\n  list->capacity = initialCapacity;\n  list->count = 0;\n  list->items = gYGMalloc(sizeof(YGNodeRef) * list->capacity);\n  YG_ASSERT(list->items != NULL, \"Could not allocate memory for items\");\n\n  return list;\n}\n\nvoid YGNodeListFree(const YGNodeListRef list) {\n  if (list) {\n    gYGFree(list->items);\n    gYGFree(list);\n  }\n}\n\nuint32_t YGNodeListCount(const YGNodeListRef list) {\n  if (list) {\n    return list->count;\n  }\n  return 0;\n}\n\nvoid YGNodeListAdd(YGNodeListRef *listp, const YGNodeRef node) {\n  if (!*listp) {\n    *listp = YGNodeListNew(4);\n  }\n  YGNodeListInsert(listp, node, (*listp)->count);\n}\n\nvoid YGNodeListInsert(YGNodeListRef *listp, const YGNodeRef node, const uint32_t index) {\n  if (!*listp) {\n    *listp = YGNodeListNew(4);\n  }\n  YGNodeListRef list = *listp;\n\n  if (list->count == list->capacity) {\n    list->capacity *= 2;\n    list->items = gYGRealloc(list->items, sizeof(YGNodeRef) * list->capacity);\n    YG_ASSERT(list->items != NULL, \"Could not extend allocation for items\");\n  }\n\n  for (uint32_t i = list->count; i > index; i--) {\n    list->items[i] = list->items[i - 1];\n  }\n\n  list->count++;\n  list->items[index] = node;\n}\n\nYGNodeRef YGNodeListRemove(const YGNodeListRef list, const uint32_t index) {\n  const YGNodeRef removed = list->items[index];\n  list->items[index] = NULL;\n\n  for (uint32_t i = index; i < list->count - 1; i++) {\n    list->items[i] = list->items[i + 1];\n    list->items[i + 1] = NULL;\n  }\n\n  list->count--;\n  return removed;\n}\n\nYGNodeRef YGNodeListDelete(const YGNodeListRef list, const YGNodeRef node) {\n  for (uint32_t i = 0; i < list->count; i++) {\n    if (list->items[i] == node) {\n      return YGNodeListRemove(list, i);\n    }\n  }\n\n  return NULL;\n}\n\nYGNodeRef YGNodeListGet(const YGNodeListRef list, const uint32_t index) {\n  if (YGNodeListCount(list) > 0) {\n    return list->items[index];\n  }\n\n  return NULL;\n}\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/YGNodeList.h",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#pragma once\n\n#include <assert.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"YGMacros.h\"\n#include \"Yoga.h\"\n\nYG_EXTERN_C_BEGIN\n\ntypedef struct YGNodeList *YGNodeListRef;\n\nYGNodeListRef YGNodeListNew(const uint32_t initialCapacity);\nvoid YGNodeListFree(const YGNodeListRef list);\nuint32_t YGNodeListCount(const YGNodeListRef list);\nvoid YGNodeListAdd(YGNodeListRef *listp, const YGNodeRef node);\nvoid YGNodeListInsert(YGNodeListRef *listp, const YGNodeRef node, const uint32_t index);\nYGNodeRef YGNodeListRemove(const YGNodeListRef list, const uint32_t index);\nYGNodeRef YGNodeListDelete(const YGNodeListRef list, const YGNodeRef node);\nYGNodeRef YGNodeListGet(const YGNodeListRef list, const uint32_t index);\n\nYG_EXTERN_C_END\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/Yoga.c",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#include <string.h>\n\n#include \"YGNodeList.h\"\n#include \"Yoga.h\"\n\n#ifdef _MSC_VER\n#include <float.h>\n#ifndef isnan\n#define isnan _isnan\n#endif\n\n#ifndef __cplusplus\n#define inline __inline\n#endif\n\n/* define fmaxf if < VC12 */\n#if _MSC_VER < 1800\n__forceinline const float fmaxf(const float a, const float b) {\n  return (a > b) ? a : b;\n}\n#endif\n#endif\n\ntypedef struct YGCachedMeasurement {\n  float availableWidth;\n  float availableHeight;\n  YGMeasureMode widthMeasureMode;\n  YGMeasureMode heightMeasureMode;\n\n  float computedWidth;\n  float computedHeight;\n} YGCachedMeasurement;\n\n// This value was chosen based on empiracle data. Even the most complicated\n// layouts should not require more than 16 entries to fit within the cache.\nenum { YG_MAX_CACHED_RESULT_COUNT = 16 };\n\ntypedef struct YGLayout {\n  float position[4];\n  float dimensions[2];\n  YGDirection direction;\n\n  uint32_t computedFlexBasisGeneration;\n  float computedFlexBasis;\n\n  // Instead of recomputing the entire layout every single time, we\n  // cache some information to break early when nothing changed\n  uint32_t generationCount;\n  YGDirection lastParentDirection;\n\n  uint32_t nextCachedMeasurementsIndex;\n  YGCachedMeasurement cachedMeasurements[YG_MAX_CACHED_RESULT_COUNT];\n  float measuredDimensions[2];\n\n  YGCachedMeasurement cachedLayout;\n} YGLayout;\n\ntypedef struct YGStyle {\n  YGDirection direction;\n  YGFlexDirection flexDirection;\n  YGJustify justifyContent;\n  YGAlign alignContent;\n  YGAlign alignItems;\n  YGAlign alignSelf;\n  YGPositionType positionType;\n  YGWrap flexWrap;\n  YGOverflow overflow;\n  float flex;\n  float flexGrow;\n  float flexShrink;\n  float flexBasis;\n  float margin[YGEdgeCount];\n  float position[YGEdgeCount];\n  float padding[YGEdgeCount];\n  float border[YGEdgeCount];\n  float dimensions[2];\n  float minDimensions[2];\n  float maxDimensions[2];\n\n  // Yoga specific properties, not compatible with flexbox specification\n  float aspectRatio;\n} YGStyle;\n\ntypedef struct YGNode {\n  YGStyle style;\n  YGLayout layout;\n  uint32_t lineIndex;\n  bool hasNewLayout;\n  YGNodeRef parent;\n  YGNodeListRef children;\n  bool isDirty;\n\n  struct YGNode *nextChild;\n\n  YGMeasureFunc measure;\n  YGPrintFunc print;\n  void *context;\n} YGNode;\n\nstatic void YGNodeMarkDirtyInternal(const YGNodeRef node);\n\nYGMalloc gYGMalloc = &malloc;\nYGCalloc gYGCalloc = &calloc;\nYGRealloc gYGRealloc = &realloc;\nYGFree gYGFree = &free;\n\n#ifdef ANDROID\n#include <android/log.h>\nstatic int YGAndroidLog(YGLogLevel level, const char *format, va_list args) {\n  int androidLevel = YGLogLevelDebug;\n  switch (level) {\n    case YGLogLevelError:\n      androidLevel = ANDROID_LOG_ERROR;\n      break;\n    case YGLogLevelWarn:\n      androidLevel = ANDROID_LOG_WARN;\n      break;\n    case YGLogLevelInfo:\n      androidLevel = ANDROID_LOG_INFO;\n      break;\n    case YGLogLevelDebug:\n      androidLevel = ANDROID_LOG_DEBUG;\n      break;\n    case YGLogLevelVerbose:\n      androidLevel = ANDROID_LOG_VERBOSE;\n      break;\n    case YGLogLevelCount:\n      break;\n  }\n  const int result = __android_log_vprint(androidLevel, \"YG-layout\", format, args);\n  return result;\n}\nstatic YGLogger gLogger = &YGAndroidLog;\n#else\nstatic int YGDefaultLog(YGLogLevel level, const char *format, va_list args) {\n  switch (level) {\n    case YGLogLevelError:\n      return vfprintf(stderr, format, args);\n    case YGLogLevelWarn:\n    case YGLogLevelInfo:\n    case YGLogLevelDebug:\n    case YGLogLevelVerbose:\n    default:\n      return vprintf(format, args);\n  }\n}\nstatic YGLogger gLogger = &YGDefaultLog;\n#endif\n\nstatic inline float YGComputedEdgeValue(const float edges[YGEdgeCount],\n                                        const YGEdge edge,\n                                        const float defaultValue) {\n  YG_ASSERT(edge <= YGEdgeEnd, \"Cannot get computed value of multi-edge shorthands\");\n\n  if (!YGValueIsUndefined(edges[edge])) {\n    return edges[edge];\n  }\n\n  if ((edge == YGEdgeTop || edge == YGEdgeBottom) && !YGValueIsUndefined(edges[YGEdgeVertical])) {\n    return edges[YGEdgeVertical];\n  }\n\n  if ((edge == YGEdgeLeft || edge == YGEdgeRight || edge == YGEdgeStart || edge == YGEdgeEnd) &&\n      !YGValueIsUndefined(edges[YGEdgeHorizontal])) {\n    return edges[YGEdgeHorizontal];\n  }\n\n  if (!YGValueIsUndefined(edges[YGEdgeAll])) {\n    return edges[YGEdgeAll];\n  }\n\n  if (edge == YGEdgeStart || edge == YGEdgeEnd) {\n    return YGUndefined;\n  }\n\n  return defaultValue;\n}\n\nstatic void YGNodeInit(const YGNodeRef node) {\n  node->parent = NULL;\n  node->children = NULL;\n  node->hasNewLayout = true;\n  node->isDirty = false;\n\n  node->style.flex = YGUndefined;\n  node->style.flexGrow = YGUndefined;\n  node->style.flexShrink = YGUndefined;\n  node->style.flexBasis = YGUndefined;\n\n  node->style.alignItems = YGAlignStretch;\n  node->style.justifyContent = YGJustifyFlexStart;\n  node->style.alignContent = YGAlignFlexStart;\n\n  node->style.direction = YGDirectionInherit;\n  node->style.flexDirection = YGFlexDirectionColumn;\n\n  node->style.overflow = YGOverflowVisible;\n\n  // Some of the fields default to undefined and not 0\n  node->style.dimensions[YGDimensionWidth] = YGUndefined;\n  node->style.dimensions[YGDimensionHeight] = YGUndefined;\n\n  node->style.minDimensions[YGDimensionWidth] = YGUndefined;\n  node->style.minDimensions[YGDimensionHeight] = YGUndefined;\n\n  node->style.maxDimensions[YGDimensionWidth] = YGUndefined;\n  node->style.maxDimensions[YGDimensionHeight] = YGUndefined;\n\n  for (YGEdge edge = YGEdgeLeft; edge < YGEdgeCount; edge++) {\n    node->style.position[edge] = YGUndefined;\n    node->style.margin[edge] = YGUndefined;\n    node->style.padding[edge] = YGUndefined;\n    node->style.border[edge] = YGUndefined;\n  }\n\n  node->style.aspectRatio = YGUndefined;\n\n  node->layout.dimensions[YGDimensionWidth] = YGUndefined;\n  node->layout.dimensions[YGDimensionHeight] = YGUndefined;\n\n  // Such that the comparison is always going to be false\n  node->layout.lastParentDirection = (YGDirection) -1;\n  node->layout.nextCachedMeasurementsIndex = 0;\n  node->layout.computedFlexBasis = YGUndefined;\n\n  node->layout.measuredDimensions[YGDimensionWidth] = YGUndefined;\n  node->layout.measuredDimensions[YGDimensionHeight] = YGUndefined;\n  node->layout.cachedLayout.widthMeasureMode = (YGMeasureMode) -1;\n  node->layout.cachedLayout.heightMeasureMode = (YGMeasureMode) -1;\n  node->layout.cachedLayout.computedWidth = -1;\n  node->layout.cachedLayout.computedHeight = -1;\n}\n\nint32_t gNodeInstanceCount = 0;\n\nYGNodeRef YGNodeNew(void) {\n  const YGNodeRef node = gYGCalloc(1, sizeof(YGNode));\n  YG_ASSERT(node, \"Could not allocate memory for node\");\n  gNodeInstanceCount++;\n\n  YGNodeInit(node);\n  return node;\n}\n\nvoid YGNodeFree(const YGNodeRef node) {\n  if (node->parent) {\n    YGNodeListDelete(node->parent->children, node);\n    node->parent = NULL;\n  }\n\n  const uint32_t childCount = YGNodeGetChildCount(node);\n  for (uint32_t i = 0; i < childCount; i++) {\n    const YGNodeRef child = YGNodeGetChild(node, i);\n    child->parent = NULL;\n  }\n\n  YGNodeListFree(node->children);\n  gYGFree(node);\n  gNodeInstanceCount--;\n}\n\nvoid YGNodeFreeRecursive(const YGNodeRef root) {\n  while (YGNodeGetChildCount(root) > 0) {\n    const YGNodeRef child = YGNodeGetChild(root, 0);\n    YGNodeRemoveChild(root, child);\n    YGNodeFreeRecursive(child);\n  }\n  YGNodeFree(root);\n}\n\nvoid YGNodeReset(const YGNodeRef node) {\n  YG_ASSERT(YGNodeGetChildCount(node) == 0, \"Cannot reset a node which still has children attached\");\n  YG_ASSERT(node->parent == NULL, \"Cannot reset a node still attached to a parent\");\n\n  YGNodeListFree(node->children);\n  memset(node, 0, sizeof(YGNode));\n  YGNodeInit(node);\n}\n\nint32_t YGNodeGetInstanceCount(void) {\n  return gNodeInstanceCount;\n}\n\nstatic void YGNodeMarkDirtyInternal(const YGNodeRef node) {\n  if (!node->isDirty) {\n    node->isDirty = true;\n    node->layout.computedFlexBasis = YGUndefined;\n    if (node->parent) {\n      YGNodeMarkDirtyInternal(node->parent);\n    }\n  }\n}\n\nvoid YGNodeSetMeasureFunc(const YGNodeRef node, YGMeasureFunc measureFunc) {\n  if (measureFunc == NULL) {\n    node->measure = NULL;\n  } else {\n    YG_ASSERT(YGNodeGetChildCount(node) == 0,\n              \"Cannot set measure function: Nodes with measure functions cannot have children.\");\n    node->measure = measureFunc;\n  }\n}\n\nYGMeasureFunc YGNodeGetMeasureFunc(const YGNodeRef node) {\n  return node->measure;\n}\n\nvoid YGNodeInsertChild(const YGNodeRef node, const YGNodeRef child, const uint32_t index) {\n  YG_ASSERT(child->parent == NULL, \"Child already has a parent, it must be removed first.\");\n  YG_ASSERT(node->measure == NULL,\n            \"Cannot add child: Nodes with measure functions cannot have children.\");\n  YGNodeListInsert(&node->children, child, index);\n  child->parent = node;\n  YGNodeMarkDirtyInternal(node);\n}\n\nvoid YGNodeRemoveChild(const YGNodeRef node, const YGNodeRef child) {\n  if (YGNodeListDelete(node->children, child) != NULL) {\n    child->parent = NULL;\n    YGNodeMarkDirtyInternal(node);\n  }\n}\n\nYGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index) {\n  return YGNodeListGet(node->children, index);\n}\n\nYGNodeRef YGNodeGetParent(const YGNodeRef node) {\n  return node->parent;\n}\n\ninline uint32_t YGNodeGetChildCount(const YGNodeRef node) {\n  return YGNodeListCount(node->children);\n}\n\nvoid YGNodeMarkDirty(const YGNodeRef node) {\n  YG_ASSERT(node->measure != NULL,\n            \"Only leaf nodes with custom measure functions\"\n            \"should manually mark themselves as dirty\");\n  YGNodeMarkDirtyInternal(node);\n}\n\nbool YGNodeIsDirty(const YGNodeRef node) {\n  return node->isDirty;\n}\n\nvoid YGNodeCopyStyle(const YGNodeRef dstNode, const YGNodeRef srcNode) {\n  if (memcmp(&dstNode->style, &srcNode->style, sizeof(YGStyle)) != 0) {\n    memcpy(&dstNode->style, &srcNode->style, sizeof(YGStyle));\n    YGNodeMarkDirtyInternal(dstNode);\n  }\n}\n\ninline float YGNodeStyleGetFlexGrow(const YGNodeRef node) {\n  if (!YGValueIsUndefined(node->style.flexGrow)) {\n    return node->style.flexGrow;\n  }\n  if (!YGValueIsUndefined(node->style.flex) && node->style.flex > 0) {\n    return node->style.flex;\n  }\n  return 0;\n}\n\ninline float YGNodeStyleGetFlexShrink(const YGNodeRef node) {\n  if (!YGValueIsUndefined(node->style.flexShrink)) {\n    return node->style.flexShrink;\n  }\n  if (!YGValueIsUndefined(node->style.flex) && node->style.flex < 0) {\n    return -node->style.flex;\n  }\n  return 0;\n}\n\ninline float YGNodeStyleGetFlexBasis(const YGNodeRef node) {\n  if (!YGValueIsUndefined(node->style.flexBasis)) {\n    return node->style.flexBasis;\n  }\n  if (!YGValueIsUndefined(node->style.flex)) {\n    return node->style.flex > 0 ? 0 : YGUndefined;\n  }\n  return YGUndefined;\n}\n\nvoid YGNodeStyleSetFlex(const YGNodeRef node, const float flex) {\n  if (node->style.flex != flex) {\n    node->style.flex = flex;\n    YGNodeMarkDirtyInternal(node);\n  }\n}\n\n#define YG_NODE_PROPERTY_IMPL(type, name, paramName, instanceName) \\\n  void YGNodeSet##name(const YGNodeRef node, type paramName) {     \\\n    node->instanceName = paramName;                                \\\n  }                                                                \\\n                                                                   \\\n  type YGNodeGet##name(const YGNodeRef node) {                     \\\n    return node->instanceName;                                     \\\n  }\n\n#define YG_NODE_STYLE_PROPERTY_SETTER_IMPL(type, name, paramName, instanceName) \\\n  void YGNodeStyleSet##name(const YGNodeRef node, const type paramName) {       \\\n    if (node->style.instanceName != paramName) {                                \\\n      node->style.instanceName = paramName;                                     \\\n      YGNodeMarkDirtyInternal(node);                                            \\\n    }                                                                           \\\n  }\n\n#define YG_NODE_STYLE_PROPERTY_IMPL(type, name, paramName, instanceName)  \\\n  YG_NODE_STYLE_PROPERTY_SETTER_IMPL(type, name, paramName, instanceName) \\\n                                                                          \\\n  type YGNodeStyleGet##name(const YGNodeRef node) {                       \\\n    return node->style.instanceName;                                      \\\n  }\n\n#define YG_NODE_STYLE_EDGE_PROPERTY_IMPL(type, name, paramName, instanceName, defaultValue)  \\\n  void YGNodeStyleSet##name(const YGNodeRef node, const YGEdge edge, const type paramName) { \\\n    if (node->style.instanceName[edge] != paramName) {                                       \\\n      node->style.instanceName[edge] = paramName;                                            \\\n      YGNodeMarkDirtyInternal(node);                                                         \\\n    }                                                                                        \\\n  }                                                                                          \\\n                                                                                             \\\n  type YGNodeStyleGet##name(const YGNodeRef node, const YGEdge edge) {                       \\\n    return YGComputedEdgeValue(node->style.instanceName, edge, defaultValue);                \\\n  }\n\n#define YG_NODE_LAYOUT_PROPERTY_IMPL(type, name, instanceName) \\\n  type YGNodeLayoutGet##name(const YGNodeRef node) {           \\\n    return node->layout.instanceName;                          \\\n  }\n\nYG_NODE_PROPERTY_IMPL(void *, Context, context, context);\nYG_NODE_PROPERTY_IMPL(YGPrintFunc, PrintFunc, printFunc, print);\nYG_NODE_PROPERTY_IMPL(bool, HasNewLayout, hasNewLayout, hasNewLayout);\n\nYG_NODE_STYLE_PROPERTY_IMPL(YGDirection, Direction, direction, direction);\nYG_NODE_STYLE_PROPERTY_IMPL(YGFlexDirection, FlexDirection, flexDirection, flexDirection);\nYG_NODE_STYLE_PROPERTY_IMPL(YGJustify, JustifyContent, justifyContent, justifyContent);\nYG_NODE_STYLE_PROPERTY_IMPL(YGAlign, AlignContent, alignContent, alignContent);\nYG_NODE_STYLE_PROPERTY_IMPL(YGAlign, AlignItems, alignItems, alignItems);\nYG_NODE_STYLE_PROPERTY_IMPL(YGAlign, AlignSelf, alignSelf, alignSelf);\nYG_NODE_STYLE_PROPERTY_IMPL(YGPositionType, PositionType, positionType, positionType);\nYG_NODE_STYLE_PROPERTY_IMPL(YGWrap, FlexWrap, flexWrap, flexWrap);\nYG_NODE_STYLE_PROPERTY_IMPL(YGOverflow, Overflow, overflow, overflow);\n\nYG_NODE_STYLE_PROPERTY_SETTER_IMPL(float, FlexGrow, flexGrow, flexGrow);\nYG_NODE_STYLE_PROPERTY_SETTER_IMPL(float, FlexShrink, flexShrink, flexShrink);\nYG_NODE_STYLE_PROPERTY_SETTER_IMPL(float, FlexBasis, flexBasis, flexBasis);\n\nYG_NODE_STYLE_EDGE_PROPERTY_IMPL(float, Position, position, position, YGUndefined);\nYG_NODE_STYLE_EDGE_PROPERTY_IMPL(float, Margin, margin, margin, 0);\nYG_NODE_STYLE_EDGE_PROPERTY_IMPL(float, Padding, padding, padding, 0);\nYG_NODE_STYLE_EDGE_PROPERTY_IMPL(float, Border, border, border, 0);\n\nYG_NODE_STYLE_PROPERTY_IMPL(float, Width, width, dimensions[YGDimensionWidth]);\nYG_NODE_STYLE_PROPERTY_IMPL(float, Height, height, dimensions[YGDimensionHeight]);\nYG_NODE_STYLE_PROPERTY_IMPL(float, MinWidth, minWidth, minDimensions[YGDimensionWidth]);\nYG_NODE_STYLE_PROPERTY_IMPL(float, MinHeight, minHeight, minDimensions[YGDimensionHeight]);\nYG_NODE_STYLE_PROPERTY_IMPL(float, MaxWidth, maxWidth, maxDimensions[YGDimensionWidth]);\nYG_NODE_STYLE_PROPERTY_IMPL(float, MaxHeight, maxHeight, maxDimensions[YGDimensionHeight]);\n\n// Yoga specific properties, not compatible with flexbox specification\nYG_NODE_STYLE_PROPERTY_IMPL(float, AspectRatio, aspectRatio, aspectRatio);\n\nYG_NODE_LAYOUT_PROPERTY_IMPL(float, Left, position[YGEdgeLeft]);\nYG_NODE_LAYOUT_PROPERTY_IMPL(float, Top, position[YGEdgeTop]);\nYG_NODE_LAYOUT_PROPERTY_IMPL(float, Right, position[YGEdgeRight]);\nYG_NODE_LAYOUT_PROPERTY_IMPL(float, Bottom, position[YGEdgeBottom]);\nYG_NODE_LAYOUT_PROPERTY_IMPL(float, Width, dimensions[YGDimensionWidth]);\nYG_NODE_LAYOUT_PROPERTY_IMPL(float, Height, dimensions[YGDimensionHeight]);\nYG_NODE_LAYOUT_PROPERTY_IMPL(YGDirection, Direction, direction);\n\nuint32_t gCurrentGenerationCount = 0;\n\nbool YGLayoutNodeInternal(const YGNodeRef node,\n                          const float availableWidth,\n                          const float availableHeight,\n                          const YGDirection parentDirection,\n                          const YGMeasureMode widthMeasureMode,\n                          const YGMeasureMode heightMeasureMode,\n                          const bool performLayout,\n                          const char *reason);\n\ninline bool YGValueIsUndefined(const float value) {\n  return isnan(value);\n}\n\nstatic inline bool YGFloatsEqual(const float a, const float b) {\n  if (YGValueIsUndefined(a)) {\n    return YGValueIsUndefined(b);\n  }\n  return fabs(a - b) < 0.0001;\n}\n\nstatic void YGIndent(const uint32_t n) {\n  for (uint32_t i = 0; i < n; i++) {\n    YGLog(YGLogLevelDebug, \"  \");\n  }\n}\n\nstatic void YGPrintNumberIfNotZero(const char *str, const float number) {\n  if (!YGFloatsEqual(number, 0)) {\n    YGLog(YGLogLevelDebug, \"%s: %g, \", str, number);\n  }\n}\n\nstatic void YGPrintNumberIfNotUndefined(const char *str, const float number) {\n  if (!YGValueIsUndefined(number)) {\n    YGLog(YGLogLevelDebug, \"%s: %g, \", str, number);\n  }\n}\n\nstatic bool YGFourFloatsEqual(const float four[4]) {\n  return YGFloatsEqual(four[0], four[1]) && YGFloatsEqual(four[0], four[2]) &&\n         YGFloatsEqual(four[0], four[3]);\n}\n\nstatic void YGNodePrintInternal(const YGNodeRef node,\n                                const YGPrintOptions options,\n                                const uint32_t level) {\n  YGIndent(level);\n  YGLog(YGLogLevelDebug, \"{\");\n\n  if (node->print) {\n    node->print(node);\n  }\n\n  if (options & YGPrintOptionsLayout) {\n    YGLog(YGLogLevelDebug, \"layout: {\");\n    YGLog(YGLogLevelDebug, \"width: %g, \", node->layout.dimensions[YGDimensionWidth]);\n    YGLog(YGLogLevelDebug, \"height: %g, \", node->layout.dimensions[YGDimensionHeight]);\n    YGLog(YGLogLevelDebug, \"top: %g, \", node->layout.position[YGEdgeTop]);\n    YGLog(YGLogLevelDebug, \"left: %g\", node->layout.position[YGEdgeLeft]);\n    YGLog(YGLogLevelDebug, \"}, \");\n  }\n\n  if (options & YGPrintOptionsStyle) {\n    if (node->style.flexDirection == YGFlexDirectionColumn) {\n      YGLog(YGLogLevelDebug, \"flexDirection: 'column', \");\n    } else if (node->style.flexDirection == YGFlexDirectionColumnReverse) {\n      YGLog(YGLogLevelDebug, \"flexDirection: 'column-reverse', \");\n    } else if (node->style.flexDirection == YGFlexDirectionRow) {\n      YGLog(YGLogLevelDebug, \"flexDirection: 'row', \");\n    } else if (node->style.flexDirection == YGFlexDirectionRowReverse) {\n      YGLog(YGLogLevelDebug, \"flexDirection: 'row-reverse', \");\n    }\n\n    if (node->style.justifyContent == YGJustifyCenter) {\n      YGLog(YGLogLevelDebug, \"justifyContent: 'center', \");\n    } else if (node->style.justifyContent == YGJustifyFlexEnd) {\n      YGLog(YGLogLevelDebug, \"justifyContent: 'flex-end', \");\n    } else if (node->style.justifyContent == YGJustifySpaceAround) {\n      YGLog(YGLogLevelDebug, \"justifyContent: 'space-around', \");\n    } else if (node->style.justifyContent == YGJustifySpaceBetween) {\n      YGLog(YGLogLevelDebug, \"justifyContent: 'space-between', \");\n    }\n\n    if (node->style.alignItems == YGAlignCenter) {\n      YGLog(YGLogLevelDebug, \"alignItems: 'center', \");\n    } else if (node->style.alignItems == YGAlignFlexEnd) {\n      YGLog(YGLogLevelDebug, \"alignItems: 'flex-end', \");\n    } else if (node->style.alignItems == YGAlignStretch) {\n      YGLog(YGLogLevelDebug, \"alignItems: 'stretch', \");\n    }\n\n    if (node->style.alignContent == YGAlignCenter) {\n      YGLog(YGLogLevelDebug, \"alignContent: 'center', \");\n    } else if (node->style.alignContent == YGAlignFlexEnd) {\n      YGLog(YGLogLevelDebug, \"alignContent: 'flex-end', \");\n    } else if (node->style.alignContent == YGAlignStretch) {\n      YGLog(YGLogLevelDebug, \"alignContent: 'stretch', \");\n    }\n\n    if (node->style.alignSelf == YGAlignFlexStart) {\n      YGLog(YGLogLevelDebug, \"alignSelf: 'flex-start', \");\n    } else if (node->style.alignSelf == YGAlignCenter) {\n      YGLog(YGLogLevelDebug, \"alignSelf: 'center', \");\n    } else if (node->style.alignSelf == YGAlignFlexEnd) {\n      YGLog(YGLogLevelDebug, \"alignSelf: 'flex-end', \");\n    } else if (node->style.alignSelf == YGAlignStretch) {\n      YGLog(YGLogLevelDebug, \"alignSelf: 'stretch', \");\n    }\n\n    YGPrintNumberIfNotUndefined(\"flexGrow\", YGNodeStyleGetFlexGrow(node));\n    YGPrintNumberIfNotUndefined(\"flexShrink\", YGNodeStyleGetFlexShrink(node));\n    YGPrintNumberIfNotUndefined(\"flexBasis\", YGNodeStyleGetFlexBasis(node));\n\n    if (node->style.overflow == YGOverflowHidden) {\n      YGLog(YGLogLevelDebug, \"overflow: 'hidden', \");\n    } else if (node->style.overflow == YGOverflowVisible) {\n      YGLog(YGLogLevelDebug, \"overflow: 'visible', \");\n    } else if (node->style.overflow == YGOverflowScroll) {\n      YGLog(YGLogLevelDebug, \"overflow: 'scroll', \");\n    }\n\n    if (YGFourFloatsEqual(node->style.margin)) {\n      YGPrintNumberIfNotZero(\"margin\", YGComputedEdgeValue(node->style.margin, YGEdgeLeft, 0));\n    } else {\n      YGPrintNumberIfNotZero(\"marginLeft\", YGComputedEdgeValue(node->style.margin, YGEdgeLeft, 0));\n      YGPrintNumberIfNotZero(\"marginRight\",\n                             YGComputedEdgeValue(node->style.margin, YGEdgeRight, 0));\n      YGPrintNumberIfNotZero(\"marginTop\", YGComputedEdgeValue(node->style.margin, YGEdgeTop, 0));\n      YGPrintNumberIfNotZero(\"marginBottom\",\n                             YGComputedEdgeValue(node->style.margin, YGEdgeBottom, 0));\n      YGPrintNumberIfNotZero(\"marginStart\",\n                             YGComputedEdgeValue(node->style.margin, YGEdgeStart, 0));\n      YGPrintNumberIfNotZero(\"marginEnd\", YGComputedEdgeValue(node->style.margin, YGEdgeEnd, 0));\n    }\n\n    if (YGFourFloatsEqual(node->style.padding)) {\n      YGPrintNumberIfNotZero(\"padding\", YGComputedEdgeValue(node->style.padding, YGEdgeLeft, 0));\n    } else {\n      YGPrintNumberIfNotZero(\"paddingLeft\",\n                             YGComputedEdgeValue(node->style.padding, YGEdgeLeft, 0));\n      YGPrintNumberIfNotZero(\"paddingRight\",\n                             YGComputedEdgeValue(node->style.padding, YGEdgeRight, 0));\n      YGPrintNumberIfNotZero(\"paddingTop\", YGComputedEdgeValue(node->style.padding, YGEdgeTop, 0));\n      YGPrintNumberIfNotZero(\"paddingBottom\",\n                             YGComputedEdgeValue(node->style.padding, YGEdgeBottom, 0));\n      YGPrintNumberIfNotZero(\"paddingStart\",\n                             YGComputedEdgeValue(node->style.padding, YGEdgeStart, 0));\n      YGPrintNumberIfNotZero(\"paddingEnd\", YGComputedEdgeValue(node->style.padding, YGEdgeEnd, 0));\n    }\n\n    if (YGFourFloatsEqual(node->style.border)) {\n      YGPrintNumberIfNotZero(\"borderWidth\", YGComputedEdgeValue(node->style.border, YGEdgeLeft, 0));\n    } else {\n      YGPrintNumberIfNotZero(\"borderLeftWidth\",\n                             YGComputedEdgeValue(node->style.border, YGEdgeLeft, 0));\n      YGPrintNumberIfNotZero(\"borderRightWidth\",\n                             YGComputedEdgeValue(node->style.border, YGEdgeRight, 0));\n      YGPrintNumberIfNotZero(\"borderTopWidth\",\n                             YGComputedEdgeValue(node->style.border, YGEdgeTop, 0));\n      YGPrintNumberIfNotZero(\"borderBottomWidth\",\n                             YGComputedEdgeValue(node->style.border, YGEdgeBottom, 0));\n      YGPrintNumberIfNotZero(\"borderStartWidth\",\n                             YGComputedEdgeValue(node->style.border, YGEdgeStart, 0));\n      YGPrintNumberIfNotZero(\"borderEndWidth\",\n                             YGComputedEdgeValue(node->style.border, YGEdgeEnd, 0));\n    }\n\n    YGPrintNumberIfNotUndefined(\"width\", node->style.dimensions[YGDimensionWidth]);\n    YGPrintNumberIfNotUndefined(\"height\", node->style.dimensions[YGDimensionHeight]);\n    YGPrintNumberIfNotUndefined(\"maxWidth\", node->style.maxDimensions[YGDimensionWidth]);\n    YGPrintNumberIfNotUndefined(\"maxHeight\", node->style.maxDimensions[YGDimensionHeight]);\n    YGPrintNumberIfNotUndefined(\"minWidth\", node->style.minDimensions[YGDimensionWidth]);\n    YGPrintNumberIfNotUndefined(\"minHeight\", node->style.minDimensions[YGDimensionHeight]);\n\n    if (node->style.positionType == YGPositionTypeAbsolute) {\n      YGLog(YGLogLevelDebug, \"position: 'absolute', \");\n    }\n\n    YGPrintNumberIfNotUndefined(\"left\",\n                                YGComputedEdgeValue(node->style.position, YGEdgeLeft, YGUndefined));\n    YGPrintNumberIfNotUndefined(\n        \"right\", YGComputedEdgeValue(node->style.position, YGEdgeRight, YGUndefined));\n    YGPrintNumberIfNotUndefined(\"top\",\n                                YGComputedEdgeValue(node->style.position, YGEdgeTop, YGUndefined));\n    YGPrintNumberIfNotUndefined(\n        \"bottom\", YGComputedEdgeValue(node->style.position, YGEdgeBottom, YGUndefined));\n  }\n\n  const uint32_t childCount = YGNodeListCount(node->children);\n  if (options & YGPrintOptionsChildren && childCount > 0) {\n    YGLog(YGLogLevelDebug, \"children: [\\n\");\n    for (uint32_t i = 0; i < childCount; i++) {\n      YGNodePrintInternal(YGNodeGetChild(node, i), options, level + 1);\n    }\n    YGIndent(level);\n    YGLog(YGLogLevelDebug, \"]},\\n\");\n  } else {\n    YGLog(YGLogLevelDebug, \"},\\n\");\n  }\n}\n\nvoid YGNodePrint(const YGNodeRef node, const YGPrintOptions options) {\n  YGNodePrintInternal(node, options, 0);\n}\n\nstatic const YGEdge leading[4] = {\n        [YGFlexDirectionColumn] = YGEdgeTop,\n        [YGFlexDirectionColumnReverse] = YGEdgeBottom,\n        [YGFlexDirectionRow] = YGEdgeLeft,\n        [YGFlexDirectionRowReverse] = YGEdgeRight,\n};\nstatic const YGEdge trailing[4] = {\n        [YGFlexDirectionColumn] = YGEdgeBottom,\n        [YGFlexDirectionColumnReverse] = YGEdgeTop,\n        [YGFlexDirectionRow] = YGEdgeRight,\n        [YGFlexDirectionRowReverse] = YGEdgeLeft,\n};\nstatic const YGEdge pos[4] = {\n        [YGFlexDirectionColumn] = YGEdgeTop,\n        [YGFlexDirectionColumnReverse] = YGEdgeBottom,\n        [YGFlexDirectionRow] = YGEdgeLeft,\n        [YGFlexDirectionRowReverse] = YGEdgeRight,\n};\nstatic const YGDimension dim[4] = {\n        [YGFlexDirectionColumn] = YGDimensionHeight,\n        [YGFlexDirectionColumnReverse] = YGDimensionHeight,\n        [YGFlexDirectionRow] = YGDimensionWidth,\n        [YGFlexDirectionRowReverse] = YGDimensionWidth,\n};\n\nstatic inline bool YGFlexDirectionIsRow(const YGFlexDirection flexDirection) {\n  return flexDirection == YGFlexDirectionRow || flexDirection == YGFlexDirectionRowReverse;\n}\n\nstatic inline bool YGFlexDirectionIsColumn(const YGFlexDirection flexDirection) {\n  return flexDirection == YGFlexDirectionColumn || flexDirection == YGFlexDirectionColumnReverse;\n}\n\nstatic inline float YGNodeLeadingMargin(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis) && !YGValueIsUndefined(node->style.margin[YGEdgeStart])) {\n    return node->style.margin[YGEdgeStart];\n  }\n\n  return YGComputedEdgeValue(node->style.margin, leading[axis], 0);\n}\n\nstatic float YGNodeTrailingMargin(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis) && !YGValueIsUndefined(node->style.margin[YGEdgeEnd])) {\n    return node->style.margin[YGEdgeEnd];\n  }\n\n  return YGComputedEdgeValue(node->style.margin, trailing[axis], 0);\n}\n\nstatic float YGNodeLeadingPadding(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis) && !YGValueIsUndefined(node->style.padding[YGEdgeStart]) &&\n      node->style.padding[YGEdgeStart] >= 0) {\n    return node->style.padding[YGEdgeStart];\n  }\n\n  return fmaxf(YGComputedEdgeValue(node->style.padding, leading[axis], 0), 0);\n}\n\nstatic float YGNodeTrailingPadding(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis) && !YGValueIsUndefined(node->style.padding[YGEdgeEnd]) &&\n      node->style.padding[YGEdgeEnd] >= 0) {\n    return node->style.padding[YGEdgeEnd];\n  }\n\n  return fmaxf(YGComputedEdgeValue(node->style.padding, trailing[axis], 0), 0);\n}\n\nstatic float YGNodeLeadingBorder(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis) && !YGValueIsUndefined(node->style.border[YGEdgeStart]) &&\n      node->style.border[YGEdgeStart] >= 0) {\n    return node->style.border[YGEdgeStart];\n  }\n\n  return fmaxf(YGComputedEdgeValue(node->style.border, leading[axis], 0), 0);\n}\n\nstatic float YGNodeTrailingBorder(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis) && !YGValueIsUndefined(node->style.border[YGEdgeEnd]) &&\n      node->style.border[YGEdgeEnd] >= 0) {\n    return node->style.border[YGEdgeEnd];\n  }\n\n  return fmaxf(YGComputedEdgeValue(node->style.border, trailing[axis], 0), 0);\n}\n\nstatic inline float YGNodeLeadingPaddingAndBorder(const YGNodeRef node,\n                                                  const YGFlexDirection axis) {\n  return YGNodeLeadingPadding(node, axis) + YGNodeLeadingBorder(node, axis);\n}\n\nstatic inline float YGNodeTrailingPaddingAndBorder(const YGNodeRef node,\n                                                   const YGFlexDirection axis) {\n  return YGNodeTrailingPadding(node, axis) + YGNodeTrailingBorder(node, axis);\n}\n\nstatic inline float YGNodeMarginForAxis(const YGNodeRef node, const YGFlexDirection axis) {\n  return YGNodeLeadingMargin(node, axis) + YGNodeTrailingMargin(node, axis);\n}\n\nstatic inline float YGNodePaddingAndBorderForAxis(const YGNodeRef node,\n                                                  const YGFlexDirection axis) {\n  return YGNodeLeadingPaddingAndBorder(node, axis) + YGNodeTrailingPaddingAndBorder(node, axis);\n}\n\nstatic inline YGAlign YGNodeAlignItem(const YGNodeRef node, const YGNodeRef child) {\n  return child->style.alignSelf == YGAlignAuto ? node->style.alignItems : child->style.alignSelf;\n}\n\nstatic inline YGDirection YGNodeResolveDirection(const YGNodeRef node,\n                                                 const YGDirection parentDirection) {\n  if (node->style.direction == YGDirectionInherit) {\n    return parentDirection > YGDirectionInherit ? parentDirection : YGDirectionLTR;\n  } else {\n    return node->style.direction;\n  }\n}\n\nstatic inline YGFlexDirection YGFlexDirectionResolve(const YGFlexDirection flexDirection,\n                                                     const YGDirection direction) {\n  if (direction == YGDirectionRTL) {\n    if (flexDirection == YGFlexDirectionRow) {\n      return YGFlexDirectionRowReverse;\n    } else if (flexDirection == YGFlexDirectionRowReverse) {\n      return YGFlexDirectionRow;\n    }\n  }\n\n  return flexDirection;\n}\n\nstatic YGFlexDirection YGFlexDirectionCross(const YGFlexDirection flexDirection,\n                                            const YGDirection direction) {\n  return YGFlexDirectionIsColumn(flexDirection)\n             ? YGFlexDirectionResolve(YGFlexDirectionRow, direction)\n             : YGFlexDirectionColumn;\n}\n\nstatic inline bool YGNodeIsFlex(const YGNodeRef node) {\n  return (node->style.positionType == YGPositionTypeRelative &&\n          (node->style.flexGrow != 0 || node->style.flexShrink != 0 || node->style.flex != 0));\n}\n\nstatic inline float YGNodeDimWithMargin(const YGNodeRef node, const YGFlexDirection axis) {\n  return node->layout.measuredDimensions[dim[axis]] + YGNodeLeadingMargin(node, axis) +\n         YGNodeTrailingMargin(node, axis);\n}\n\nstatic inline bool YGNodeIsStyleDimDefined(const YGNodeRef node, const YGFlexDirection axis) {\n  const float value = node->style.dimensions[dim[axis]];\n  return !YGValueIsUndefined(value) && value >= 0.0;\n}\n\nstatic inline bool YGNodeIsLayoutDimDefined(const YGNodeRef node, const YGFlexDirection axis) {\n  const float value = node->layout.measuredDimensions[dim[axis]];\n  return !YGValueIsUndefined(value) && value >= 0.0;\n}\n\nstatic inline bool YGNodeIsLeadingPosDefined(const YGNodeRef node, const YGFlexDirection axis) {\n  return (YGFlexDirectionIsRow(axis) &&\n          !YGValueIsUndefined(\n              YGComputedEdgeValue(node->style.position, YGEdgeStart, YGUndefined))) ||\n         !YGValueIsUndefined(YGComputedEdgeValue(node->style.position, leading[axis], YGUndefined));\n}\n\nstatic inline bool YGNodeIsTrailingPosDefined(const YGNodeRef node, const YGFlexDirection axis) {\n  return (YGFlexDirectionIsRow(axis) &&\n          !YGValueIsUndefined(YGComputedEdgeValue(node->style.position, YGEdgeEnd, YGUndefined))) ||\n         !YGValueIsUndefined(\n             YGComputedEdgeValue(node->style.position, trailing[axis], YGUndefined));\n}\n\nstatic float YGNodeLeadingPosition(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis)) {\n    const float leadingPosition =\n        YGComputedEdgeValue(node->style.position, YGEdgeStart, YGUndefined);\n    if (!YGValueIsUndefined(leadingPosition)) {\n      return leadingPosition;\n    }\n  }\n\n  const float leadingPosition =\n      YGComputedEdgeValue(node->style.position, leading[axis], YGUndefined);\n\n  return YGValueIsUndefined(leadingPosition) ? 0 : leadingPosition;\n}\n\nstatic float YGNodeTrailingPosition(const YGNodeRef node, const YGFlexDirection axis) {\n  if (YGFlexDirectionIsRow(axis)) {\n    const float trailingPosition =\n        YGComputedEdgeValue(node->style.position, YGEdgeEnd, YGUndefined);\n    if (!YGValueIsUndefined(trailingPosition)) {\n      return trailingPosition;\n    }\n  }\n\n  const float trailingPosition =\n      YGComputedEdgeValue(node->style.position, trailing[axis], YGUndefined);\n\n  return YGValueIsUndefined(trailingPosition) ? 0 : trailingPosition;\n}\n\nstatic float YGNodeBoundAxisWithinMinAndMax(const YGNodeRef node,\n                                            const YGFlexDirection axis,\n                                            const float value) {\n  float min = YGUndefined;\n  float max = YGUndefined;\n\n  if (YGFlexDirectionIsColumn(axis)) {\n    min = node->style.minDimensions[YGDimensionHeight];\n    max = node->style.maxDimensions[YGDimensionHeight];\n  } else if (YGFlexDirectionIsRow(axis)) {\n    min = node->style.minDimensions[YGDimensionWidth];\n    max = node->style.maxDimensions[YGDimensionWidth];\n  }\n\n  float boundValue = value;\n\n  if (!YGValueIsUndefined(max) && max >= 0.0 && boundValue > max) {\n    boundValue = max;\n  }\n\n  if (!YGValueIsUndefined(min) && min >= 0.0 && boundValue < min) {\n    boundValue = min;\n  }\n\n  return boundValue;\n}\n\n// Like YGNodeBoundAxisWithinMinAndMax but also ensures that the value doesn't go\n// below the\n// padding and border amount.\nstatic inline float YGNodeBoundAxis(const YGNodeRef node,\n                                    const YGFlexDirection axis,\n                                    const float value) {\n  return fmaxf(YGNodeBoundAxisWithinMinAndMax(node, axis, value),\n               YGNodePaddingAndBorderForAxis(node, axis));\n}\n\nstatic void YGNodeSetChildTrailingPosition(const YGNodeRef node,\n                                           const YGNodeRef child,\n                                           const YGFlexDirection axis) {\n  const float size = child->layout.measuredDimensions[dim[axis]];\n  child->layout.position[trailing[axis]] =\n      node->layout.measuredDimensions[dim[axis]] - size - child->layout.position[pos[axis]];\n}\n\n// If both left and right are defined, then use left. Otherwise return\n// +left or -right depending on which is defined.\nstatic float YGNodeRelativePosition(const YGNodeRef node, const YGFlexDirection axis) {\n  return YGNodeIsLeadingPosDefined(node, axis) ? YGNodeLeadingPosition(node, axis)\n                                               : -YGNodeTrailingPosition(node, axis);\n}\n\nstatic void YGConstrainMaxSizeForMode(const float maxSize, YGMeasureMode *mode, float *size) {\n  switch (*mode) {\n    case YGMeasureModeExactly:\n    case YGMeasureModeAtMost:\n      *size = (YGValueIsUndefined(maxSize) || *size < maxSize) ? *size : maxSize;\n      break;\n    case YGMeasureModeUndefined:\n      if (!YGValueIsUndefined(maxSize)) {\n        *mode = YGMeasureModeAtMost;\n        *size = maxSize;\n      }\n      break;\n    case YGMeasureModeCount:\n      break;\n  }\n}\n\nstatic void YGNodeSetPosition(const YGNodeRef node, const YGDirection direction) {\n  const YGFlexDirection mainAxis = YGFlexDirectionResolve(node->style.flexDirection, direction);\n  const YGFlexDirection crossAxis = YGFlexDirectionCross(mainAxis, direction);\n  const float relativePositionMain = YGNodeRelativePosition(node, mainAxis);\n  const float relativePositionCross = YGNodeRelativePosition(node, crossAxis);\n\n  node->layout.position[leading[mainAxis]] =\n      YGNodeLeadingMargin(node, mainAxis) + relativePositionMain;\n  node->layout.position[trailing[mainAxis]] =\n      YGNodeTrailingMargin(node, mainAxis) + relativePositionMain;\n  node->layout.position[leading[crossAxis]] =\n      YGNodeLeadingMargin(node, crossAxis) + relativePositionCross;\n  node->layout.position[trailing[crossAxis]] =\n      YGNodeTrailingMargin(node, crossAxis) + relativePositionCross;\n}\n\nstatic void YGNodeComputeFlexBasisForChild(const YGNodeRef node,\n                                           const YGNodeRef child,\n                                           const float width,\n                                           const YGMeasureMode widthMode,\n                                           const float height,\n                                           const YGMeasureMode heightMode,\n                                           const YGDirection direction) {\n  const YGFlexDirection mainAxis = YGFlexDirectionResolve(node->style.flexDirection, direction);\n  const bool isMainAxisRow = YGFlexDirectionIsRow(mainAxis);\n\n  float childWidth;\n  float childHeight;\n  YGMeasureMode childWidthMeasureMode;\n  YGMeasureMode childHeightMeasureMode;\n\n  const bool isRowStyleDimDefined = YGNodeIsStyleDimDefined(child, YGFlexDirectionRow);\n  const bool isColumnStyleDimDefined = YGNodeIsStyleDimDefined(child, YGFlexDirectionColumn);\n\n  if (!YGValueIsUndefined(YGNodeStyleGetFlexBasis(child)) &&\n      !YGValueIsUndefined(isMainAxisRow ? width : height)) {\n    if (YGValueIsUndefined(child->layout.computedFlexBasis) ||\n        (YGIsExperimentalFeatureEnabled(YGExperimentalFeatureWebFlexBasis) &&\n         child->layout.computedFlexBasisGeneration != gCurrentGenerationCount)) {\n      child->layout.computedFlexBasis =\n          fmaxf(YGNodeStyleGetFlexBasis(child), YGNodePaddingAndBorderForAxis(child, mainAxis));\n    }\n  } else if (isMainAxisRow && isRowStyleDimDefined) {\n    // The width is definite, so use that as the flex basis.\n    child->layout.computedFlexBasis =\n        fmaxf(child->style.dimensions[YGDimensionWidth],\n              YGNodePaddingAndBorderForAxis(child, YGFlexDirectionRow));\n  } else if (!isMainAxisRow && isColumnStyleDimDefined) {\n    // The height is definite, so use that as the flex basis.\n    child->layout.computedFlexBasis =\n        fmaxf(child->style.dimensions[YGDimensionHeight],\n              YGNodePaddingAndBorderForAxis(child, YGFlexDirectionColumn));\n  } else {\n    // Compute the flex basis and hypothetical main size (i.e. the clamped\n    // flex basis).\n    childWidth = YGUndefined;\n    childHeight = YGUndefined;\n    childWidthMeasureMode = YGMeasureModeUndefined;\n    childHeightMeasureMode = YGMeasureModeUndefined;\n\n    if (isRowStyleDimDefined) {\n      childWidth = child->style.dimensions[YGDimensionWidth] +\n                   YGNodeMarginForAxis(child, YGFlexDirectionRow);\n      childWidthMeasureMode = YGMeasureModeExactly;\n    }\n    if (isColumnStyleDimDefined) {\n      childHeight = child->style.dimensions[YGDimensionHeight] +\n                    YGNodeMarginForAxis(child, YGFlexDirectionColumn);\n      childHeightMeasureMode = YGMeasureModeExactly;\n    }\n\n    // The W3C spec doesn't say anything about the 'overflow' property,\n    // but all major browsers appear to implement the following logic.\n    if ((!isMainAxisRow && node->style.overflow == YGOverflowScroll) ||\n        node->style.overflow != YGOverflowScroll) {\n      if (YGValueIsUndefined(childWidth) && !YGValueIsUndefined(width)) {\n        childWidth = width;\n        childWidthMeasureMode = YGMeasureModeAtMost;\n      }\n    }\n\n    if ((isMainAxisRow && node->style.overflow == YGOverflowScroll) ||\n        node->style.overflow != YGOverflowScroll) {\n      if (YGValueIsUndefined(childHeight) && !YGValueIsUndefined(height)) {\n        childHeight = height;\n        childHeightMeasureMode = YGMeasureModeAtMost;\n      }\n    }\n\n    // If child has no defined size in the cross axis and is set to stretch,\n    // set the cross\n    // axis to be measured exactly with the available inner width\n    if (!isMainAxisRow && !YGValueIsUndefined(width) && !isRowStyleDimDefined &&\n        widthMode == YGMeasureModeExactly && YGNodeAlignItem(node, child) == YGAlignStretch) {\n      childWidth = width;\n      childWidthMeasureMode = YGMeasureModeExactly;\n    }\n    if (isMainAxisRow && !YGValueIsUndefined(height) && !isColumnStyleDimDefined &&\n        heightMode == YGMeasureModeExactly && YGNodeAlignItem(node, child) == YGAlignStretch) {\n      childHeight = height;\n      childHeightMeasureMode = YGMeasureModeExactly;\n    }\n\n    if (!YGValueIsUndefined(child->style.aspectRatio)) {\n      if (!isMainAxisRow && childWidthMeasureMode == YGMeasureModeExactly) {\n        child->layout.computedFlexBasis =\n            fmaxf(childWidth * child->style.aspectRatio,\n                  YGNodePaddingAndBorderForAxis(child, YGFlexDirectionColumn));\n        return;\n      } else if (isMainAxisRow && childHeightMeasureMode == YGMeasureModeExactly) {\n        child->layout.computedFlexBasis =\n            fmaxf(childHeight * child->style.aspectRatio,\n                  YGNodePaddingAndBorderForAxis(child, YGFlexDirectionRow));\n        return;\n      }\n    }\n\n    YGConstrainMaxSizeForMode(child->style.maxDimensions[YGDimensionWidth],\n                              &childWidthMeasureMode,\n                              &childWidth);\n    YGConstrainMaxSizeForMode(child->style.maxDimensions[YGDimensionHeight],\n                              &childHeightMeasureMode,\n                              &childHeight);\n\n    // Measure the child\n    YGLayoutNodeInternal(child,\n                         childWidth,\n                         childHeight,\n                         direction,\n                         childWidthMeasureMode,\n                         childHeightMeasureMode,\n                         false,\n                         \"measure\");\n\n    child->layout.computedFlexBasis =\n        fmaxf(isMainAxisRow ? child->layout.measuredDimensions[YGDimensionWidth]\n                            : child->layout.measuredDimensions[YGDimensionHeight],\n              YGNodePaddingAndBorderForAxis(child, mainAxis));\n  }\n\n  child->layout.computedFlexBasisGeneration = gCurrentGenerationCount;\n}\n\nstatic void YGNodeAbsoluteLayoutChild(const YGNodeRef node,\n                                      const YGNodeRef child,\n                                      const float width,\n                                      const YGMeasureMode widthMode,\n                                      const YGDirection direction) {\n  const YGFlexDirection mainAxis = YGFlexDirectionResolve(node->style.flexDirection, direction);\n  const YGFlexDirection crossAxis = YGFlexDirectionCross(mainAxis, direction);\n  const bool isMainAxisRow = YGFlexDirectionIsRow(mainAxis);\n\n  float childWidth = YGUndefined;\n  float childHeight = YGUndefined;\n  YGMeasureMode childWidthMeasureMode = YGMeasureModeUndefined;\n  YGMeasureMode childHeightMeasureMode = YGMeasureModeUndefined;\n\n  if (YGNodeIsStyleDimDefined(child, YGFlexDirectionRow)) {\n    childWidth =\n        child->style.dimensions[YGDimensionWidth] + YGNodeMarginForAxis(child, YGFlexDirectionRow);\n  } else {\n    // If the child doesn't have a specified width, compute the width based\n    // on the left/right\n    // offsets if they're defined.\n    if (YGNodeIsLeadingPosDefined(child, YGFlexDirectionRow) &&\n        YGNodeIsTrailingPosDefined(child, YGFlexDirectionRow)) {\n      childWidth = node->layout.measuredDimensions[YGDimensionWidth] -\n                   (YGNodeLeadingBorder(node, YGFlexDirectionRow) +\n                    YGNodeTrailingBorder(node, YGFlexDirectionRow)) -\n                   (YGNodeLeadingPosition(child, YGFlexDirectionRow) +\n                    YGNodeTrailingPosition(child, YGFlexDirectionRow));\n      childWidth = YGNodeBoundAxis(child, YGFlexDirectionRow, childWidth);\n    }\n  }\n\n  if (YGNodeIsStyleDimDefined(child, YGFlexDirectionColumn)) {\n    childHeight = child->style.dimensions[YGDimensionHeight] +\n                  YGNodeMarginForAxis(child, YGFlexDirectionColumn);\n  } else {\n    // If the child doesn't have a specified height, compute the height\n    // based on the top/bottom\n    // offsets if they're defined.\n    if (YGNodeIsLeadingPosDefined(child, YGFlexDirectionColumn) &&\n        YGNodeIsTrailingPosDefined(child, YGFlexDirectionColumn)) {\n      childHeight = node->layout.measuredDimensions[YGDimensionHeight] -\n                    (YGNodeLeadingBorder(node, YGFlexDirectionColumn) +\n                     YGNodeTrailingBorder(node, YGFlexDirectionColumn)) -\n                    (YGNodeLeadingPosition(child, YGFlexDirectionColumn) +\n                     YGNodeTrailingPosition(child, YGFlexDirectionColumn));\n      childHeight = YGNodeBoundAxis(child, YGFlexDirectionColumn, childHeight);\n    }\n  }\n\n  // Exactly one dimension needs to be defined for us to be able to do aspect ratio\n  // calculation. One dimension being the anchor and the other being flexible.\n  if (YGValueIsUndefined(childWidth) ^ YGValueIsUndefined(childHeight)) {\n    if (!YGValueIsUndefined(child->style.aspectRatio)) {\n      if (YGValueIsUndefined(childWidth)) {\n        childWidth = fmaxf(childHeight * child->style.aspectRatio,\n                           YGNodePaddingAndBorderForAxis(child, YGFlexDirectionColumn));\n      } else if (YGValueIsUndefined(childHeight)) {\n        childHeight = fmaxf(childWidth * child->style.aspectRatio,\n                            YGNodePaddingAndBorderForAxis(child, YGFlexDirectionRow));\n      }\n    }\n  }\n\n  // If we're still missing one or the other dimension, measure the content.\n  if (YGValueIsUndefined(childWidth) || YGValueIsUndefined(childHeight)) {\n    childWidthMeasureMode =\n        YGValueIsUndefined(childWidth) ? YGMeasureModeUndefined : YGMeasureModeExactly;\n    childHeightMeasureMode =\n        YGValueIsUndefined(childHeight) ? YGMeasureModeUndefined : YGMeasureModeExactly;\n\n    // According to the spec, if the main size is not definite and the\n    // child's inline axis is parallel to the main axis (i.e. it's\n    // horizontal), the child should be sized using \"UNDEFINED\" in\n    // the main size. Otherwise use \"AT_MOST\" in the cross axis.\n    if (!isMainAxisRow && YGValueIsUndefined(childWidth) && widthMode != YGMeasureModeUndefined) {\n      childWidth = width;\n      childWidthMeasureMode = YGMeasureModeAtMost;\n    }\n\n    YGLayoutNodeInternal(child,\n                         childWidth,\n                         childHeight,\n                         direction,\n                         childWidthMeasureMode,\n                         childHeightMeasureMode,\n                         false,\n                         \"abs-measure\");\n    childWidth = child->layout.measuredDimensions[YGDimensionWidth] +\n                 YGNodeMarginForAxis(child, YGFlexDirectionRow);\n    childHeight = child->layout.measuredDimensions[YGDimensionHeight] +\n                  YGNodeMarginForAxis(child, YGFlexDirectionColumn);\n  }\n\n  YGLayoutNodeInternal(child,\n                       childWidth,\n                       childHeight,\n                       direction,\n                       YGMeasureModeExactly,\n                       YGMeasureModeExactly,\n                       true,\n                       \"abs-layout\");\n\n  if (YGNodeIsTrailingPosDefined(child, mainAxis) && !YGNodeIsLeadingPosDefined(child, mainAxis)) {\n    child->layout.position[leading[mainAxis]] = node->layout.measuredDimensions[dim[mainAxis]] -\n                                                child->layout.measuredDimensions[dim[mainAxis]] -\n                                                YGNodeTrailingBorder(node, mainAxis) -\n                                                YGNodeTrailingPosition(child, mainAxis);\n  }\n\n  if (YGNodeIsTrailingPosDefined(child, crossAxis) &&\n      !YGNodeIsLeadingPosDefined(child, crossAxis)) {\n    child->layout.position[leading[crossAxis]] = node->layout.measuredDimensions[dim[crossAxis]] -\n                                                 child->layout.measuredDimensions[dim[crossAxis]] -\n                                                 YGNodeTrailingBorder(node, crossAxis) -\n                                                 YGNodeTrailingPosition(child, crossAxis);\n  }\n}\n\nstatic void YGNodeWithMeasureFuncSetMeasuredDimensions(const YGNodeRef node,\n                                                       const float availableWidth,\n                                                       const float availableHeight,\n                                                       const YGMeasureMode widthMeasureMode,\n                                                       const YGMeasureMode heightMeasureMode) {\n  YG_ASSERT(node->measure, \"Expected node to have custom measure function\");\n\n  const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow);\n  const float paddingAndBorderAxisColumn =\n      YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn);\n  const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow);\n  const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn);\n\n  const float innerWidth = availableWidth - marginAxisRow - paddingAndBorderAxisRow;\n  const float innerHeight = availableHeight - marginAxisColumn - paddingAndBorderAxisColumn;\n\n  if (widthMeasureMode == YGMeasureModeExactly && heightMeasureMode == YGMeasureModeExactly) {\n    // Don't bother sizing the text if both dimensions are already defined.\n    node->layout.measuredDimensions[YGDimensionWidth] =\n        YGNodeBoundAxis(node, YGFlexDirectionRow, availableWidth - marginAxisRow);\n    node->layout.measuredDimensions[YGDimensionHeight] =\n        YGNodeBoundAxis(node, YGFlexDirectionColumn, availableHeight - marginAxisColumn);\n  } else if (innerWidth <= 0 || innerHeight <= 0) {\n    // Don't bother sizing the text if there's no horizontal or vertical\n    // space.\n    node->layout.measuredDimensions[YGDimensionWidth] =\n        YGNodeBoundAxis(node, YGFlexDirectionRow, 0);\n    node->layout.measuredDimensions[YGDimensionHeight] =\n        YGNodeBoundAxis(node, YGFlexDirectionColumn, 0);\n  } else {\n    // Measure the text under the current constraints.\n    const YGSize measuredSize =\n        node->measure(node, innerWidth, widthMeasureMode, innerHeight, heightMeasureMode);\n\n    node->layout.measuredDimensions[YGDimensionWidth] =\n        YGNodeBoundAxis(node,\n                        YGFlexDirectionRow,\n                        (widthMeasureMode == YGMeasureModeUndefined ||\n                         widthMeasureMode == YGMeasureModeAtMost)\n                            ? measuredSize.width + paddingAndBorderAxisRow\n                            : availableWidth - marginAxisRow);\n    node->layout.measuredDimensions[YGDimensionHeight] =\n        YGNodeBoundAxis(node,\n                        YGFlexDirectionColumn,\n                        (heightMeasureMode == YGMeasureModeUndefined ||\n                         heightMeasureMode == YGMeasureModeAtMost)\n                            ? measuredSize.height + paddingAndBorderAxisColumn\n                            : availableHeight - marginAxisColumn);\n  }\n}\n\n// For nodes with no children, use the available values if they were provided,\n// or the minimum size as indicated by the padding and border sizes.\nstatic void YGNodeEmptyContainerSetMeasuredDimensions(const YGNodeRef node,\n                                                      const float availableWidth,\n                                                      const float availableHeight,\n                                                      const YGMeasureMode widthMeasureMode,\n                                                      const YGMeasureMode heightMeasureMode) {\n  const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow);\n  const float paddingAndBorderAxisColumn =\n      YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn);\n  const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow);\n  const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn);\n\n  node->layout.measuredDimensions[YGDimensionWidth] =\n      YGNodeBoundAxis(node,\n                      YGFlexDirectionRow,\n                      (widthMeasureMode == YGMeasureModeUndefined ||\n                       widthMeasureMode == YGMeasureModeAtMost)\n                          ? paddingAndBorderAxisRow\n                          : availableWidth - marginAxisRow);\n  node->layout.measuredDimensions[YGDimensionHeight] =\n      YGNodeBoundAxis(node,\n                      YGFlexDirectionColumn,\n                      (heightMeasureMode == YGMeasureModeUndefined ||\n                       heightMeasureMode == YGMeasureModeAtMost)\n                          ? paddingAndBorderAxisColumn\n                          : availableHeight - marginAxisColumn);\n}\n\nstatic bool YGNodeFixedSizeSetMeasuredDimensions(const YGNodeRef node,\n                                                 const float availableWidth,\n                                                 const float availableHeight,\n                                                 const YGMeasureMode widthMeasureMode,\n                                                 const YGMeasureMode heightMeasureMode) {\n  if ((widthMeasureMode == YGMeasureModeAtMost && availableWidth <= 0) ||\n      (heightMeasureMode == YGMeasureModeAtMost && availableHeight <= 0) ||\n      (widthMeasureMode == YGMeasureModeExactly && heightMeasureMode == YGMeasureModeExactly)) {\n    const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn);\n    const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow);\n\n    node->layout.measuredDimensions[YGDimensionWidth] =\n        YGNodeBoundAxis(node,\n                        YGFlexDirectionRow,\n                        YGValueIsUndefined(availableWidth) || (widthMeasureMode == YGMeasureModeAtMost && availableWidth < 0)\n                            ? 0\n                            : availableWidth - marginAxisRow);\n\n    node->layout.measuredDimensions[YGDimensionHeight] =\n        YGNodeBoundAxis(node,\n                        YGFlexDirectionColumn,\n                        YGValueIsUndefined(availableHeight) || (heightMeasureMode == YGMeasureModeAtMost && availableHeight < 0)\n                            ? 0\n                            : availableHeight - marginAxisColumn);\n\n    return true;\n  }\n\n  return false;\n}\n\n//\n// This is the main routine that implements a subset of the flexbox layout\n// algorithm\n// described in the W3C YG documentation: https://www.w3.org/TR/YG3-flexbox/.\n//\n// Limitations of this algorithm, compared to the full standard:\n//  * Display property is always assumed to be 'flex' except for Text nodes,\n//  which\n//    are assumed to be 'inline-flex'.\n//  * The 'zIndex' property (or any form of z ordering) is not supported. Nodes\n//  are\n//    stacked in document order.\n//  * The 'order' property is not supported. The order of flex items is always\n//  defined\n//    by document order.\n//  * The 'visibility' property is always assumed to be 'visible'. Values of\n//  'collapse'\n//    and 'hidden' are not supported.\n//  * The 'wrap' property supports only 'nowrap' (which is the default) or\n//  'wrap'. The\n//    rarely-used 'wrap-reverse' is not supported.\n//  * Rather than allowing arbitrary combinations of flexGrow, flexShrink and\n//    flexBasis, this algorithm supports only the three most common\n//    combinations:\n//      flex: 0 is equiavlent to flex: 0 0 auto\n//      flex: n (where n is a positive value) is equivalent to flex: n 1 auto\n//          If POSITIVE_FLEX_IS_AUTO is 0, then it is equivalent to flex: n 0 0\n//          This is faster because the content doesn't need to be measured, but\n//          it's\n//          less flexible because the basis is always 0 and can't be overriden\n//          with\n//          the width/height attributes.\n//      flex: -1 (or any negative value) is equivalent to flex: 0 1 auto\n//  * Margins cannot be specified as 'auto'. They must be specified in terms of\n//  pixel\n//    values, and the default value is 0.\n//  * The 'baseline' value is not supported for alignItems and alignSelf\n//  properties.\n//  * Values of width, maxWidth, minWidth, height, maxHeight and minHeight must\n//  be\n//    specified as pixel values, not as percentages.\n//  * There is no support for calculation of dimensions based on intrinsic\n//  aspect ratios\n//     (e.g. images).\n//  * There is no support for forced breaks.\n//  * It does not support vertical inline directions (top-to-bottom or\n//  bottom-to-top text).\n//\n// Deviations from standard:\n//  * Section 4.5 of the spec indicates that all flex items have a default\n//  minimum\n//    main size. For text blocks, for example, this is the width of the widest\n//    word.\n//    Calculating the minimum width is expensive, so we forego it and assume a\n//    default\n//    minimum main size of 0.\n//  * Min/Max sizes in the main axis are not honored when resolving flexible\n//  lengths.\n//  * The spec indicates that the default value for 'flexDirection' is 'row',\n//  but\n//    the algorithm below assumes a default of 'column'.\n//\n// Input parameters:\n//    - node: current node to be sized and layed out\n//    - availableWidth & availableHeight: available size to be used for sizing\n//    the node\n//      or YGUndefined if the size is not available; interpretation depends on\n//      layout\n//      flags\n//    - parentDirection: the inline (text) direction within the parent\n//    (left-to-right or\n//      right-to-left)\n//    - widthMeasureMode: indicates the sizing rules for the width (see below\n//    for explanation)\n//    - heightMeasureMode: indicates the sizing rules for the height (see below\n//    for explanation)\n//    - performLayout: specifies whether the caller is interested in just the\n//    dimensions\n//      of the node or it requires the entire node and its subtree to be layed\n//      out\n//      (with final positions)\n//\n// Details:\n//    This routine is called recursively to lay out subtrees of flexbox\n//    elements. It uses the\n//    information in node.style, which is treated as a read-only input. It is\n//    responsible for\n//    setting the layout.direction and layout.measuredDimensions fields for the\n//    input node as well\n//    as the layout.position and layout.lineIndex fields for its child nodes.\n//    The\n//    layout.measuredDimensions field includes any border or padding for the\n//    node but does\n//    not include margins.\n//\n//    The spec describes four different layout modes: \"fill available\", \"max\n//    content\", \"min\n//    content\",\n//    and \"fit content\". Of these, we don't use \"min content\" because we don't\n//    support default\n//    minimum main sizes (see above for details). Each of our measure modes maps\n//    to a layout mode\n//    from the spec (https://www.w3.org/TR/YG3-sizing/#terms):\n//      - YGMeasureModeUndefined: max content\n//      - YGMeasureModeExactly: fill available\n//      - YGMeasureModeAtMost: fit content\n//\n//    When calling YGNodelayoutImpl and YGLayoutNodeInternal, if the caller passes\n//    an available size of\n//    undefined then it must also pass a measure mode of YGMeasureModeUndefined\n//    in that dimension.\n//\nstatic void YGNodelayoutImpl(const YGNodeRef node,\n                             const float availableWidth,\n                             const float availableHeight,\n                             const YGDirection parentDirection,\n                             const YGMeasureMode widthMeasureMode,\n                             const YGMeasureMode heightMeasureMode,\n                             const bool performLayout) {\n  YG_ASSERT(YGValueIsUndefined(availableWidth) ? widthMeasureMode == YGMeasureModeUndefined : true,\n            \"availableWidth is indefinite so widthMeasureMode must be \"\n            \"YGMeasureModeUndefined\");\n  YG_ASSERT(YGValueIsUndefined(availableHeight) ? heightMeasureMode == YGMeasureModeUndefined\n                                                : true,\n            \"availableHeight is indefinite so heightMeasureMode must be \"\n            \"YGMeasureModeUndefined\");\n\n  // Set the resolved resolution in the node's layout.\n  const YGDirection direction = YGNodeResolveDirection(node, parentDirection);\n  node->layout.direction = direction;\n\n  if (node->measure) {\n    YGNodeWithMeasureFuncSetMeasuredDimensions(\n        node, availableWidth, availableHeight, widthMeasureMode, heightMeasureMode);\n    return;\n  }\n\n  const uint32_t childCount = YGNodeListCount(node->children);\n  if (childCount == 0) {\n    YGNodeEmptyContainerSetMeasuredDimensions(\n        node, availableWidth, availableHeight, widthMeasureMode, heightMeasureMode);\n    return;\n  }\n\n  // If we're not being asked to perform a full layout we can skip the algorithm if we already know\n  // the size\n  if (!performLayout &&\n      YGNodeFixedSizeSetMeasuredDimensions(\n          node, availableWidth, availableHeight, widthMeasureMode, heightMeasureMode)) {\n    return;\n  }\n\n  // STEP 1: CALCULATE VALUES FOR REMAINDER OF ALGORITHM\n  const YGFlexDirection mainAxis = YGFlexDirectionResolve(node->style.flexDirection, direction);\n  const YGFlexDirection crossAxis = YGFlexDirectionCross(mainAxis, direction);\n  const bool isMainAxisRow = YGFlexDirectionIsRow(mainAxis);\n  const YGJustify justifyContent = node->style.justifyContent;\n  const bool isNodeFlexWrap = node->style.flexWrap == YGWrapWrap;\n\n  YGNodeRef firstAbsoluteChild = NULL;\n  YGNodeRef currentAbsoluteChild = NULL;\n\n  const float leadingPaddingAndBorderMain = YGNodeLeadingPaddingAndBorder(node, mainAxis);\n  const float trailingPaddingAndBorderMain = YGNodeTrailingPaddingAndBorder(node, mainAxis);\n  const float leadingPaddingAndBorderCross = YGNodeLeadingPaddingAndBorder(node, crossAxis);\n  const float paddingAndBorderAxisMain = YGNodePaddingAndBorderForAxis(node, mainAxis);\n  const float paddingAndBorderAxisCross = YGNodePaddingAndBorderForAxis(node, crossAxis);\n\n  const YGMeasureMode measureModeMainDim = isMainAxisRow ? widthMeasureMode : heightMeasureMode;\n  const YGMeasureMode measureModeCrossDim = isMainAxisRow ? heightMeasureMode : widthMeasureMode;\n\n  const float paddingAndBorderAxisRow = YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow);\n  const float paddingAndBorderAxisColumn =\n      YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn);\n  const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow);\n  const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn);\n\n  // STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS\n  float availableInnerWidth = availableWidth - marginAxisRow - paddingAndBorderAxisRow;\n  const float minInnerWidth = node->style.minDimensions[YGDimensionWidth] - marginAxisRow - paddingAndBorderAxisRow;\n  const float maxInnerWidth = node->style.maxDimensions[YGDimensionWidth] - marginAxisRow - paddingAndBorderAxisRow;\n  float availableInnerHeight =\n      availableHeight - marginAxisColumn - paddingAndBorderAxisColumn;\n  const float minInnerHeight = node->style.minDimensions[YGDimensionHeight] - marginAxisColumn - paddingAndBorderAxisColumn;\n  const float maxInnerHeight = node->style.maxDimensions[YGDimensionHeight] - marginAxisColumn - paddingAndBorderAxisColumn;\n  const float minInnerMainDim = isMainAxisRow ? minInnerWidth : minInnerHeight;\n  const float maxInnerMainDim = isMainAxisRow ? maxInnerWidth : maxInnerHeight;\n  \n  // Max dimension overrides predefined dimension value; Min dimension in turn overrides both of the above\n  if (!YGValueIsUndefined(availableInnerWidth)) {\n    availableInnerWidth = fmaxf(fminf(availableInnerWidth, maxInnerWidth), minInnerWidth);\n  }\n  if (!YGValueIsUndefined(availableInnerHeight)) {\n    availableInnerHeight = fmaxf(fminf(availableInnerHeight, maxInnerHeight), minInnerHeight);\n  }\n  \n  float availableInnerMainDim = isMainAxisRow ? availableInnerWidth : availableInnerHeight;\n  const float availableInnerCrossDim = isMainAxisRow ? availableInnerHeight : availableInnerWidth;\n\n  // If there is only one child with flexGrow + flexShrink it means we can set the\n  // computedFlexBasis to 0 instead of measuring and shrinking / flexing the child to exactly\n  // match the remaining space\n  YGNodeRef singleFlexChild = NULL;\n  if ((isMainAxisRow && widthMeasureMode == YGMeasureModeExactly) ||\n      (!isMainAxisRow && heightMeasureMode == YGMeasureModeExactly)) {\n    for (uint32_t i = 0; i < childCount; i++) {\n      const YGNodeRef child = YGNodeGetChild(node, i);\n      if (singleFlexChild) {\n        if (YGNodeIsFlex(child)) {\n          // There is already a flexible child, abort.\n          singleFlexChild = NULL;\n          break;\n        }\n      } else if (YGNodeStyleGetFlexGrow(child) > 0 && YGNodeStyleGetFlexShrink(child) > 0) {\n        singleFlexChild = child;\n      }\n    }\n  }\n\n  // STEP 3: DETERMINE FLEX BASIS FOR EACH ITEM\n  for (uint32_t i = 0; i < childCount; i++) {\n    const YGNodeRef child = YGNodeListGet(node->children, i);\n\n    if (performLayout) {\n      // Set the initial position (relative to the parent).\n      const YGDirection childDirection = YGNodeResolveDirection(child, direction);\n      YGNodeSetPosition(child, childDirection);\n    }\n\n    // Absolute-positioned children don't participate in flex layout. Add them\n    // to a list that we can process later.\n    if (child->style.positionType == YGPositionTypeAbsolute) {\n      // Store a private linked list of absolutely positioned children\n      // so that we can efficiently traverse them later.\n      if (firstAbsoluteChild == NULL) {\n        firstAbsoluteChild = child;\n      }\n      if (currentAbsoluteChild != NULL) {\n        currentAbsoluteChild->nextChild = child;\n      }\n      currentAbsoluteChild = child;\n      child->nextChild = NULL;\n    } else {\n      if (child == singleFlexChild) {\n        child->layout.computedFlexBasisGeneration = gCurrentGenerationCount;\n        child->layout.computedFlexBasis = 0;\n      } else {\n        YGNodeComputeFlexBasisForChild(node,\n                                       child,\n                                       availableInnerWidth,\n                                       widthMeasureMode,\n                                       availableInnerHeight,\n                                       heightMeasureMode,\n                                       direction);\n      }\n    }\n  }\n\n  // STEP 4: COLLECT FLEX ITEMS INTO FLEX LINES\n\n  // Indexes of children that represent the first and last items in the line.\n  uint32_t startOfLineIndex = 0;\n  uint32_t endOfLineIndex = 0;\n\n  // Number of lines.\n  uint32_t lineCount = 0;\n\n  // Accumulated cross dimensions of all lines so far.\n  float totalLineCrossDim = 0;\n\n  // Max main dimension of all the lines.\n  float maxLineMainDim = 0;\n\n  for (; endOfLineIndex < childCount; lineCount++, startOfLineIndex = endOfLineIndex) {\n    // Number of items on the currently line. May be different than the\n    // difference\n    // between start and end indicates because we skip over absolute-positioned\n    // items.\n    uint32_t itemsOnLine = 0;\n\n    // sizeConsumedOnCurrentLine is accumulation of the dimensions and margin\n    // of all the children on the current line. This will be used in order to\n    // either set the dimensions of the node if none already exist or to compute\n    // the remaining space left for the flexible children.\n    float sizeConsumedOnCurrentLine = 0;\n\n    float totalFlexGrowFactors = 0;\n    float totalFlexShrinkScaledFactors = 0;\n\n    // Maintain a linked list of the child nodes that can shrink and/or grow.\n    YGNodeRef firstRelativeChild = NULL;\n    YGNodeRef currentRelativeChild = NULL;\n\n    // Add items to the current line until it's full or we run out of items.\n    for (uint32_t i = startOfLineIndex; i < childCount; i++, endOfLineIndex++) {\n      const YGNodeRef child = YGNodeListGet(node->children, i);\n      child->lineIndex = lineCount;\n\n      if (child->style.positionType != YGPositionTypeAbsolute) {\n        const float outerFlexBasis =\n            child->layout.computedFlexBasis + YGNodeMarginForAxis(child, mainAxis);\n\n        // If this is a multi-line flow and this item pushes us over the\n        // available size, we've\n        // hit the end of the current line. Break out of the loop and lay out\n        // the current line.\n        if (sizeConsumedOnCurrentLine + outerFlexBasis > availableInnerMainDim && isNodeFlexWrap &&\n            itemsOnLine > 0) {\n          break;\n        }\n\n        sizeConsumedOnCurrentLine += outerFlexBasis;\n        itemsOnLine++;\n\n        if (YGNodeIsFlex(child)) {\n          totalFlexGrowFactors += YGNodeStyleGetFlexGrow(child);\n\n          // Unlike the grow factor, the shrink factor is scaled relative to the\n          // child\n          // dimension.\n          totalFlexShrinkScaledFactors +=\n              -YGNodeStyleGetFlexShrink(child) * child->layout.computedFlexBasis;\n        }\n\n        // Store a private linked list of children that need to be layed out.\n        if (firstRelativeChild == NULL) {\n          firstRelativeChild = child;\n        }\n        if (currentRelativeChild != NULL) {\n          currentRelativeChild->nextChild = child;\n        }\n        currentRelativeChild = child;\n        child->nextChild = NULL;\n      }\n    }\n\n    // If we don't need to measure the cross axis, we can skip the entire flex\n    // step.\n    const bool canSkipFlex = !performLayout && measureModeCrossDim == YGMeasureModeExactly;\n\n    // In order to position the elements in the main axis, we have two\n    // controls. The space between the beginning and the first element\n    // and the space between each two elements.\n    float leadingMainDim = 0;\n    float betweenMainDim = 0;\n\n    // STEP 5: RESOLVING FLEXIBLE LENGTHS ON MAIN AXIS\n    // Calculate the remaining available space that needs to be allocated.\n    // If the main dimension size isn't known, it is computed based on\n    // the line length, so there's no more space left to distribute.\n    \n    // We resolve main dimension to fit minimum and maximum values\n    if (YGValueIsUndefined(availableInnerMainDim)) {\n      if (!YGValueIsUndefined(minInnerMainDim) &&\n          sizeConsumedOnCurrentLine < minInnerMainDim) {\n        availableInnerMainDim = minInnerMainDim;\n      } else if (!YGValueIsUndefined(maxInnerMainDim) &&\n                 sizeConsumedOnCurrentLine > maxInnerMainDim) {\n        availableInnerMainDim = maxInnerMainDim;\n      }\n    }\n    \n    float remainingFreeSpace = 0;\n    if (!YGValueIsUndefined(availableInnerMainDim)) {\n      remainingFreeSpace = availableInnerMainDim - sizeConsumedOnCurrentLine;\n    } else if (sizeConsumedOnCurrentLine < 0) {\n      // availableInnerMainDim is indefinite which means the node is being sized\n      // based on its\n      // content.\n      // sizeConsumedOnCurrentLine is negative which means the node will\n      // allocate 0 pixels for\n      // its content. Consequently, remainingFreeSpace is 0 -\n      // sizeConsumedOnCurrentLine.\n      remainingFreeSpace = -sizeConsumedOnCurrentLine;\n    }\n\n    const float originalRemainingFreeSpace = remainingFreeSpace;\n    float deltaFreeSpace = 0;\n\n    if (!canSkipFlex) {\n      float childFlexBasis;\n      float flexShrinkScaledFactor;\n      float flexGrowFactor;\n      float baseMainSize;\n      float boundMainSize;\n\n      // Do two passes over the flex items to figure out how to distribute the\n      // remaining space.\n      // The first pass finds the items whose min/max constraints trigger,\n      // freezes them at those\n      // sizes, and excludes those sizes from the remaining space. The second\n      // pass sets the size\n      // of each flexible item. It distributes the remaining space amongst the\n      // items whose min/max\n      // constraints didn't trigger in pass 1. For the other items, it sets\n      // their sizes by forcing\n      // their min/max constraints to trigger again.\n      //\n      // This two pass approach for resolving min/max constraints deviates from\n      // the spec. The\n      // spec (https://www.w3.org/TR/YG-flexbox-1/#resolve-flexible-lengths)\n      // describes a process\n      // that needs to be repeated a variable number of times. The algorithm\n      // implemented here\n      // won't handle all cases but it was simpler to implement and it mitigates\n      // performance\n      // concerns because we know exactly how many passes it'll do.\n\n      // First pass: detect the flex items whose min/max constraints trigger\n      float deltaFlexShrinkScaledFactors = 0;\n      float deltaFlexGrowFactors = 0;\n      currentRelativeChild = firstRelativeChild;\n      while (currentRelativeChild != NULL) {\n        childFlexBasis = currentRelativeChild->layout.computedFlexBasis;\n\n        if (remainingFreeSpace < 0) {\n          flexShrinkScaledFactor = -YGNodeStyleGetFlexShrink(currentRelativeChild) * childFlexBasis;\n\n          // Is this child able to shrink?\n          if (flexShrinkScaledFactor != 0) {\n            baseMainSize =\n                childFlexBasis +\n                remainingFreeSpace / totalFlexShrinkScaledFactors * flexShrinkScaledFactor;\n            boundMainSize = YGNodeBoundAxis(currentRelativeChild, mainAxis, baseMainSize);\n            if (baseMainSize != boundMainSize) {\n              // By excluding this item's size and flex factor from remaining,\n              // this item's\n              // min/max constraints should also trigger in the second pass\n              // resulting in the\n              // item's size calculation being identical in the first and second\n              // passes.\n              deltaFreeSpace -= boundMainSize - childFlexBasis;\n              deltaFlexShrinkScaledFactors -= flexShrinkScaledFactor;\n            }\n          }\n        } else if (remainingFreeSpace > 0) {\n          flexGrowFactor = YGNodeStyleGetFlexGrow(currentRelativeChild);\n\n          // Is this child able to grow?\n          if (flexGrowFactor != 0) {\n            baseMainSize =\n                childFlexBasis + remainingFreeSpace / totalFlexGrowFactors * flexGrowFactor;\n            boundMainSize = YGNodeBoundAxis(currentRelativeChild, mainAxis, baseMainSize);\n            if (baseMainSize != boundMainSize) {\n              // By excluding this item's size and flex factor from remaining,\n              // this item's\n              // min/max constraints should also trigger in the second pass\n              // resulting in the\n              // item's size calculation being identical in the first and second\n              // passes.\n              deltaFreeSpace -= boundMainSize - childFlexBasis;\n              deltaFlexGrowFactors -= flexGrowFactor;\n            }\n          }\n        }\n\n        currentRelativeChild = currentRelativeChild->nextChild;\n      }\n\n      totalFlexShrinkScaledFactors += deltaFlexShrinkScaledFactors;\n      totalFlexGrowFactors += deltaFlexGrowFactors;\n      remainingFreeSpace += deltaFreeSpace;\n\n      // Second pass: resolve the sizes of the flexible items\n      deltaFreeSpace = 0;\n      currentRelativeChild = firstRelativeChild;\n      while (currentRelativeChild != NULL) {\n        childFlexBasis = currentRelativeChild->layout.computedFlexBasis;\n        float updatedMainSize = childFlexBasis;\n\n        if (remainingFreeSpace < 0) {\n          flexShrinkScaledFactor = -YGNodeStyleGetFlexShrink(currentRelativeChild) * childFlexBasis;\n          // Is this child able to shrink?\n          if (flexShrinkScaledFactor != 0) {\n            float childSize;\n\n            if (totalFlexShrinkScaledFactors == 0) {\n              childSize = childFlexBasis + flexShrinkScaledFactor;\n            } else {\n              childSize =\n                  childFlexBasis +\n                  (remainingFreeSpace / totalFlexShrinkScaledFactors) * flexShrinkScaledFactor;\n            }\n\n            updatedMainSize = YGNodeBoundAxis(currentRelativeChild, mainAxis, childSize);\n          }\n        } else if (remainingFreeSpace > 0) {\n          flexGrowFactor = YGNodeStyleGetFlexGrow(currentRelativeChild);\n\n          // Is this child able to grow?\n          if (flexGrowFactor != 0) {\n            updatedMainSize =\n                YGNodeBoundAxis(currentRelativeChild,\n                                mainAxis,\n                                childFlexBasis +\n                                    remainingFreeSpace / totalFlexGrowFactors * flexGrowFactor);\n          }\n        }\n\n        deltaFreeSpace -= updatedMainSize - childFlexBasis;\n\n        float childWidth;\n        float childHeight;\n        YGMeasureMode childWidthMeasureMode;\n        YGMeasureMode childHeightMeasureMode;\n\n        if (isMainAxisRow) {\n          childWidth =\n              updatedMainSize + YGNodeMarginForAxis(currentRelativeChild, YGFlexDirectionRow);\n          childWidthMeasureMode = YGMeasureModeExactly;\n\n          if (!YGValueIsUndefined(availableInnerCrossDim) &&\n              !YGNodeIsStyleDimDefined(currentRelativeChild, YGFlexDirectionColumn) &&\n              heightMeasureMode == YGMeasureModeExactly &&\n              YGNodeAlignItem(node, currentRelativeChild) == YGAlignStretch) {\n            childHeight = availableInnerCrossDim;\n            childHeightMeasureMode = YGMeasureModeExactly;\n          } else if (!YGNodeIsStyleDimDefined(currentRelativeChild, YGFlexDirectionColumn)) {\n            childHeight = availableInnerCrossDim;\n            childHeightMeasureMode =\n                YGValueIsUndefined(childHeight) ? YGMeasureModeUndefined : YGMeasureModeAtMost;\n          } else {\n            childHeight = currentRelativeChild->style.dimensions[YGDimensionHeight] +\n                          YGNodeMarginForAxis(currentRelativeChild, YGFlexDirectionColumn);\n            childHeightMeasureMode = YGMeasureModeExactly;\n          }\n        } else {\n          childHeight =\n              updatedMainSize + YGNodeMarginForAxis(currentRelativeChild, YGFlexDirectionColumn);\n          childHeightMeasureMode = YGMeasureModeExactly;\n\n          if (!YGValueIsUndefined(availableInnerCrossDim) &&\n              !YGNodeIsStyleDimDefined(currentRelativeChild, YGFlexDirectionRow) &&\n              widthMeasureMode == YGMeasureModeExactly &&\n              YGNodeAlignItem(node, currentRelativeChild) == YGAlignStretch) {\n            childWidth = availableInnerCrossDim;\n            childWidthMeasureMode = YGMeasureModeExactly;\n          } else if (!YGNodeIsStyleDimDefined(currentRelativeChild, YGFlexDirectionRow)) {\n            childWidth = availableInnerCrossDim;\n            childWidthMeasureMode =\n                YGValueIsUndefined(childWidth) ? YGMeasureModeUndefined : YGMeasureModeAtMost;\n          } else {\n            childWidth = currentRelativeChild->style.dimensions[YGDimensionWidth] +\n                         YGNodeMarginForAxis(currentRelativeChild, YGFlexDirectionRow);\n            childWidthMeasureMode = YGMeasureModeExactly;\n          }\n        }\n\n        if (!YGValueIsUndefined(currentRelativeChild->style.aspectRatio)) {\n          if (isMainAxisRow && childHeightMeasureMode != YGMeasureModeExactly) {\n            childHeight =\n                fmaxf(childWidth * currentRelativeChild->style.aspectRatio,\n                      YGNodePaddingAndBorderForAxis(currentRelativeChild, YGFlexDirectionColumn));\n            childHeightMeasureMode = YGMeasureModeExactly;\n          } else if (!isMainAxisRow && childWidthMeasureMode != YGMeasureModeExactly) {\n            childWidth =\n                fmaxf(childHeight * currentRelativeChild->style.aspectRatio,\n                      YGNodePaddingAndBorderForAxis(currentRelativeChild, YGFlexDirectionRow));\n            childWidthMeasureMode = YGMeasureModeExactly;\n          }\n        }\n\n        YGConstrainMaxSizeForMode(currentRelativeChild->style.maxDimensions[YGDimensionWidth],\n                                  &childWidthMeasureMode,\n                                  &childWidth);\n        YGConstrainMaxSizeForMode(currentRelativeChild->style.maxDimensions[YGDimensionHeight],\n                                  &childHeightMeasureMode,\n                                  &childHeight);\n\n        const bool requiresStretchLayout =\n            !YGNodeIsStyleDimDefined(currentRelativeChild, crossAxis) &&\n            YGNodeAlignItem(node, currentRelativeChild) == YGAlignStretch;\n\n        // Recursively call the layout algorithm for this child with the updated\n        // main size.\n        YGLayoutNodeInternal(currentRelativeChild,\n                             childWidth,\n                             childHeight,\n                             direction,\n                             childWidthMeasureMode,\n                             childHeightMeasureMode,\n                             performLayout && !requiresStretchLayout,\n                             \"flex\");\n\n        currentRelativeChild = currentRelativeChild->nextChild;\n      }\n    }\n\n    remainingFreeSpace = originalRemainingFreeSpace + deltaFreeSpace;\n\n    // STEP 6: MAIN-AXIS JUSTIFICATION & CROSS-AXIS SIZE DETERMINATION\n\n    // At this point, all the children have their dimensions set in the main\n    // axis.\n    // Their dimensions are also set in the cross axis with the exception of\n    // items\n    // that are aligned \"stretch\". We need to compute these stretch values and\n    // set the final positions.\n\n    // If we are using \"at most\" rules in the main axis. Calculate the remaining space when\n    // constraint by the min size defined for the main axis.\n\n    if (measureModeMainDim == YGMeasureModeAtMost && remainingFreeSpace > 0) {\n      if (!YGValueIsUndefined(node->style.minDimensions[dim[mainAxis]]) &&\n          node->style.minDimensions[dim[mainAxis]] >= 0) {\n        remainingFreeSpace = fmaxf(0,\n                                   node->style.minDimensions[dim[mainAxis]] -\n                                       (availableInnerMainDim - remainingFreeSpace));\n      } else {\n        remainingFreeSpace = 0;\n      }\n    }\n\n    switch (justifyContent) {\n      case YGJustifyCenter:\n        leadingMainDim = remainingFreeSpace / 2;\n        break;\n      case YGJustifyFlexEnd:\n        leadingMainDim = remainingFreeSpace;\n        break;\n      case YGJustifySpaceBetween:\n        if (itemsOnLine > 1) {\n          betweenMainDim = fmaxf(remainingFreeSpace, 0) / (itemsOnLine - 1);\n        } else {\n          betweenMainDim = 0;\n        }\n        break;\n      case YGJustifySpaceAround:\n        // Space on the edges is half of the space between elements\n        betweenMainDim = remainingFreeSpace / itemsOnLine;\n        leadingMainDim = betweenMainDim / 2;\n        break;\n      case YGJustifyFlexStart:\n      case YGJustifyCount:\n        break;\n    }\n\n    float mainDim = leadingPaddingAndBorderMain + leadingMainDim;\n    float crossDim = 0;\n\n    for (uint32_t i = startOfLineIndex; i < endOfLineIndex; i++) {\n      const YGNodeRef child = YGNodeListGet(node->children, i);\n\n      if (child->style.positionType == YGPositionTypeAbsolute &&\n          YGNodeIsLeadingPosDefined(child, mainAxis)) {\n        if (performLayout) {\n          // In case the child is position absolute and has left/top being\n          // defined, we override the position to whatever the user said\n          // (and margin/border).\n          child->layout.position[pos[mainAxis]] = YGNodeLeadingPosition(child, mainAxis) +\n                                                  YGNodeLeadingBorder(node, mainAxis) +\n                                                  YGNodeLeadingMargin(child, mainAxis);\n        }\n      } else {\n        // Now that we placed the element, we need to update the variables.\n        // We need to do that only for relative elements. Absolute elements\n        // do not take part in that phase.\n        if (child->style.positionType == YGPositionTypeRelative) {\n          if (performLayout) {\n            child->layout.position[pos[mainAxis]] += mainDim;\n          }\n\n          if (canSkipFlex) {\n            // If we skipped the flex step, then we can't rely on the\n            // measuredDims because\n            // they weren't computed. This means we can't call YGNodeDimWithMargin.\n            mainDim += betweenMainDim + YGNodeMarginForAxis(child, mainAxis) +\n                       child->layout.computedFlexBasis;\n            crossDim = availableInnerCrossDim;\n          } else {\n            // The main dimension is the sum of all the elements dimension plus\n            // the spacing.\n            mainDim += betweenMainDim + YGNodeDimWithMargin(child, mainAxis);\n\n            // The cross dimension is the max of the elements dimension since\n            // there\n            // can only be one element in that cross dimension.\n            crossDim = fmaxf(crossDim, YGNodeDimWithMargin(child, crossAxis));\n          }\n        } else if (performLayout) {\n          child->layout.position[pos[mainAxis]] +=\n              YGNodeLeadingBorder(node, mainAxis) + leadingMainDim;\n        }\n      }\n    }\n\n    mainDim += trailingPaddingAndBorderMain;\n\n    float containerCrossAxis = availableInnerCrossDim;\n    if (measureModeCrossDim == YGMeasureModeUndefined ||\n        measureModeCrossDim == YGMeasureModeAtMost) {\n      // Compute the cross axis from the max cross dimension of the children.\n      containerCrossAxis = YGNodeBoundAxis(node, crossAxis, crossDim + paddingAndBorderAxisCross) -\n                           paddingAndBorderAxisCross;\n\n      if (measureModeCrossDim == YGMeasureModeAtMost) {\n        containerCrossAxis = fminf(containerCrossAxis, availableInnerCrossDim);\n      }\n    }\n\n    // If there's no flex wrap, the cross dimension is defined by the container.\n    if (!isNodeFlexWrap && measureModeCrossDim == YGMeasureModeExactly) {\n      crossDim = availableInnerCrossDim;\n    }\n\n    // Clamp to the min/max size specified on the container.\n    crossDim = YGNodeBoundAxis(node, crossAxis, crossDim + paddingAndBorderAxisCross) -\n               paddingAndBorderAxisCross;\n\n    // STEP 7: CROSS-AXIS ALIGNMENT\n    // We can skip child alignment if we're just measuring the container.\n    if (performLayout) {\n      for (uint32_t i = startOfLineIndex; i < endOfLineIndex; i++) {\n        const YGNodeRef child = YGNodeListGet(node->children, i);\n\n        if (child->style.positionType == YGPositionTypeAbsolute) {\n          // If the child is absolutely positioned and has a\n          // top/left/bottom/right\n          // set, override all the previously computed positions to set it\n          // correctly.\n          if (YGNodeIsLeadingPosDefined(child, crossAxis)) {\n            child->layout.position[pos[crossAxis]] = YGNodeLeadingPosition(child, crossAxis) +\n                                                     YGNodeLeadingBorder(node, crossAxis) +\n                                                     YGNodeLeadingMargin(child, crossAxis);\n          } else {\n            child->layout.position[pos[crossAxis]] =\n                YGNodeLeadingBorder(node, crossAxis) + YGNodeLeadingMargin(child, crossAxis);\n          }\n        } else {\n          float leadingCrossDim = leadingPaddingAndBorderCross;\n\n          // For a relative children, we're either using alignItems (parent) or\n          // alignSelf (child) in order to determine the position in the cross\n          // axis\n          const YGAlign alignItem = YGNodeAlignItem(node, child);\n\n          // If the child uses align stretch, we need to lay it out one more\n          // time, this time\n          // forcing the cross-axis size to be the computed cross size for the\n          // current line.\n          if (alignItem == YGAlignStretch) {\n            const bool isCrossSizeDefinite =\n                (isMainAxisRow && YGNodeIsStyleDimDefined(child, YGFlexDirectionColumn)) ||\n                (!isMainAxisRow && YGNodeIsStyleDimDefined(child, YGFlexDirectionRow));\n\n            float childWidth;\n            float childHeight;\n            YGMeasureMode childWidthMeasureMode = YGMeasureModeExactly;\n            YGMeasureMode childHeightMeasureMode = YGMeasureModeExactly;\n\n            if (isMainAxisRow) {\n              childHeight = crossDim;\n              childWidth = child->layout.measuredDimensions[YGDimensionWidth] +\n                           YGNodeMarginForAxis(child, YGFlexDirectionRow);\n            } else {\n              childWidth = crossDim;\n              childHeight = child->layout.measuredDimensions[YGDimensionHeight] +\n                            YGNodeMarginForAxis(child, YGFlexDirectionColumn);\n            }\n\n            YGConstrainMaxSizeForMode(child->style.maxDimensions[YGDimensionWidth],\n                                      &childWidthMeasureMode,\n                                      &childWidth);\n            YGConstrainMaxSizeForMode(child->style.maxDimensions[YGDimensionHeight],\n                                      &childHeightMeasureMode,\n                                      &childHeight);\n\n            // If the child defines a definite size for its cross axis, there's\n            // no need to stretch.\n            if (!isCrossSizeDefinite) {\n              childWidthMeasureMode =\n                  YGValueIsUndefined(childWidth) ? YGMeasureModeUndefined : YGMeasureModeExactly;\n              childHeightMeasureMode =\n                  YGValueIsUndefined(childHeight) ? YGMeasureModeUndefined : YGMeasureModeExactly;\n\n              YGLayoutNodeInternal(child,\n                                   childWidth,\n                                   childHeight,\n                                   direction,\n                                   childWidthMeasureMode,\n                                   childHeightMeasureMode,\n                                   true,\n                                   \"stretch\");\n            }\n          } else if (alignItem != YGAlignFlexStart) {\n            const float remainingCrossDim =\n                containerCrossAxis - YGNodeDimWithMargin(child, crossAxis);\n\n            if (alignItem == YGAlignCenter) {\n              leadingCrossDim += remainingCrossDim / 2;\n            } else { // YGAlignFlexEnd\n              leadingCrossDim += remainingCrossDim;\n            }\n          }\n\n          // And we apply the position\n          child->layout.position[pos[crossAxis]] += totalLineCrossDim + leadingCrossDim;\n        }\n      }\n    }\n\n    totalLineCrossDim += crossDim;\n    maxLineMainDim = fmaxf(maxLineMainDim, mainDim);\n  }\n\n  // STEP 8: MULTI-LINE CONTENT ALIGNMENT\n  if (lineCount > 1 && performLayout && !YGValueIsUndefined(availableInnerCrossDim)) {\n    const float remainingAlignContentDim = availableInnerCrossDim - totalLineCrossDim;\n\n    float crossDimLead = 0;\n    float currentLead = leadingPaddingAndBorderCross;\n\n    switch (node->style.alignContent) {\n      case YGAlignFlexEnd:\n        currentLead += remainingAlignContentDim;\n        break;\n      case YGAlignCenter:\n        currentLead += remainingAlignContentDim / 2;\n        break;\n      case YGAlignStretch:\n        if (availableInnerCrossDim > totalLineCrossDim) {\n          crossDimLead = (remainingAlignContentDim / lineCount);\n        }\n        break;\n      case YGAlignAuto:\n      case YGAlignFlexStart:\n      case YGAlignCount:\n        break;\n    }\n\n    uint32_t endIndex = 0;\n    for (uint32_t i = 0; i < lineCount; i++) {\n      uint32_t startIndex = endIndex;\n      uint32_t ii;\n\n      // compute the line's height and find the endIndex\n      float lineHeight = 0;\n      for (ii = startIndex; ii < childCount; ii++) {\n        const YGNodeRef child = YGNodeListGet(node->children, ii);\n\n        if (child->style.positionType == YGPositionTypeRelative) {\n          if (child->lineIndex != i) {\n            break;\n          }\n\n          if (YGNodeIsLayoutDimDefined(child, crossAxis)) {\n            lineHeight = fmaxf(lineHeight,\n                               child->layout.measuredDimensions[dim[crossAxis]] +\n                                   YGNodeMarginForAxis(child, crossAxis));\n          }\n        }\n      }\n      endIndex = ii;\n      lineHeight += crossDimLead;\n\n      if (performLayout) {\n        for (ii = startIndex; ii < endIndex; ii++) {\n          const YGNodeRef child = YGNodeListGet(node->children, ii);\n\n          if (child->style.positionType == YGPositionTypeRelative) {\n            switch (YGNodeAlignItem(node, child)) {\n              case YGAlignFlexStart: {\n                child->layout.position[pos[crossAxis]] =\n                    currentLead + YGNodeLeadingMargin(child, crossAxis);\n                break;\n              }\n              case YGAlignFlexEnd: {\n                child->layout.position[pos[crossAxis]] =\n                    currentLead + lineHeight - YGNodeTrailingMargin(child, crossAxis) -\n                    child->layout.measuredDimensions[dim[crossAxis]];\n                break;\n              }\n              case YGAlignCenter: {\n                float childHeight = child->layout.measuredDimensions[dim[crossAxis]];\n                child->layout.position[pos[crossAxis]] =\n                    currentLead + (lineHeight - childHeight) / 2;\n                break;\n              }\n              case YGAlignStretch: {\n                child->layout.position[pos[crossAxis]] =\n                    currentLead + YGNodeLeadingMargin(child, crossAxis);\n                // TODO(prenaux): Correctly set the height of items with indefinite\n                //                (auto) crossAxis dimension.\n                break;\n              }\n              case YGAlignAuto:\n              case YGAlignCount:\n                break;\n            }\n          }\n        }\n      }\n\n      currentLead += lineHeight;\n    }\n  }\n\n  // STEP 9: COMPUTING FINAL DIMENSIONS\n  node->layout.measuredDimensions[YGDimensionWidth] =\n      YGNodeBoundAxis(node, YGFlexDirectionRow, availableWidth - marginAxisRow);\n  node->layout.measuredDimensions[YGDimensionHeight] =\n      YGNodeBoundAxis(node, YGFlexDirectionColumn, availableHeight - marginAxisColumn);\n\n  // If the user didn't specify a width or height for the node, set the\n  // dimensions based on the children.\n  if (measureModeMainDim == YGMeasureModeUndefined) {\n    // Clamp the size to the min/max size, if specified, and make sure it\n    // doesn't go below the padding and border amount.\n    node->layout.measuredDimensions[dim[mainAxis]] =\n        YGNodeBoundAxis(node, mainAxis, maxLineMainDim);\n  } else if (measureModeMainDim == YGMeasureModeAtMost) {\n    node->layout.measuredDimensions[dim[mainAxis]] =\n        fmaxf(fminf(availableInnerMainDim + paddingAndBorderAxisMain,\n                    YGNodeBoundAxisWithinMinAndMax(node, mainAxis, maxLineMainDim)),\n              paddingAndBorderAxisMain);\n  }\n\n  if (measureModeCrossDim == YGMeasureModeUndefined) {\n    // Clamp the size to the min/max size, if specified, and make sure it\n    // doesn't go below the padding and border amount.\n    node->layout.measuredDimensions[dim[crossAxis]] =\n        YGNodeBoundAxis(node, crossAxis, totalLineCrossDim + paddingAndBorderAxisCross);\n  } else if (measureModeCrossDim == YGMeasureModeAtMost) {\n    node->layout.measuredDimensions[dim[crossAxis]] =\n        fmaxf(fminf(availableInnerCrossDim + paddingAndBorderAxisCross,\n                    YGNodeBoundAxisWithinMinAndMax(node,\n                                                   crossAxis,\n                                                   totalLineCrossDim + paddingAndBorderAxisCross)),\n              paddingAndBorderAxisCross);\n  }\n\n  if (performLayout) {\n    // STEP 10: SIZING AND POSITIONING ABSOLUTE CHILDREN\n    for (currentAbsoluteChild = firstAbsoluteChild; currentAbsoluteChild != NULL;\n         currentAbsoluteChild = currentAbsoluteChild->nextChild) {\n      YGNodeAbsoluteLayoutChild(\n          node, currentAbsoluteChild, availableInnerWidth, widthMeasureMode, direction);\n    }\n\n    // STEP 11: SETTING TRAILING POSITIONS FOR CHILDREN\n    const bool needsMainTrailingPos =\n        mainAxis == YGFlexDirectionRowReverse || mainAxis == YGFlexDirectionColumnReverse;\n    const bool needsCrossTrailingPos =\n        crossAxis == YGFlexDirectionRowReverse || crossAxis == YGFlexDirectionColumnReverse;\n\n    // Set trailing position if necessary.\n    if (needsMainTrailingPos || needsCrossTrailingPos) {\n      for (uint32_t i = 0; i < childCount; i++) {\n        const YGNodeRef child = YGNodeListGet(node->children, i);\n\n        if (needsMainTrailingPos) {\n          YGNodeSetChildTrailingPosition(node, child, mainAxis);\n        }\n\n        if (needsCrossTrailingPos) {\n          YGNodeSetChildTrailingPosition(node, child, crossAxis);\n        }\n      }\n    }\n  }\n}\n\nuint32_t gDepth = 0;\nbool gPrintTree = false;\nbool gPrintChanges = false;\nbool gPrintSkips = false;\n\nstatic const char *spacer = \"                                                            \";\n\nstatic const char *YGSpacer(const unsigned long level) {\n  const size_t spacerLen = strlen(spacer);\n  if (level > spacerLen) {\n    return &spacer[0];\n  } else {\n    return &spacer[spacerLen - level];\n  }\n}\n\nstatic const char *YGMeasureModeName(const YGMeasureMode mode, const bool performLayout) {\n  const char *kMeasureModeNames[YGMeasureModeCount] = {\"UNDEFINED\", \"EXACTLY\", \"AT_MOST\"};\n  const char *kLayoutModeNames[YGMeasureModeCount] = {\"LAY_UNDEFINED\",\n                                                      \"LAY_EXACTLY\",\n                                                      \"LAY_AT_\"\n                                                      \"MOST\"};\n\n  if (mode >= YGMeasureModeCount) {\n    return \"\";\n  }\n\n  return performLayout ? kLayoutModeNames[mode] : kMeasureModeNames[mode];\n}\n\nstatic inline bool YGMeasureModeSizeIsExactAndMatchesOldMeasuredSize(YGMeasureMode sizeMode,\n                                                                     float size,\n                                                                     float lastComputedSize) {\n  return sizeMode == YGMeasureModeExactly && YGFloatsEqual(size, lastComputedSize);\n}\n\nstatic inline bool YGMeasureModeOldSizeIsUnspecifiedAndStillFits(YGMeasureMode sizeMode,\n                                                                 float size,\n                                                                 YGMeasureMode lastSizeMode,\n                                                                 float lastComputedSize) {\n  return sizeMode == YGMeasureModeAtMost && lastSizeMode == YGMeasureModeUndefined &&\n         size >= lastComputedSize;\n}\n\nstatic inline bool YGMeasureModeNewMeasureSizeIsStricterAndStillValid(YGMeasureMode sizeMode,\n                                                                      float size,\n                                                                      YGMeasureMode lastSizeMode,\n                                                                      float lastSize,\n                                                                      float lastComputedSize) {\n  return lastSizeMode == YGMeasureModeAtMost && sizeMode == YGMeasureModeAtMost &&\n         lastSize > size && lastComputedSize <= size;\n}\n\nbool YGNodeCanUseCachedMeasurement(const YGMeasureMode widthMode,\n                                   const float width,\n                                   const YGMeasureMode heightMode,\n                                   const float height,\n                                   const YGMeasureMode lastWidthMode,\n                                   const float lastWidth,\n                                   const YGMeasureMode lastHeightMode,\n                                   const float lastHeight,\n                                   const float lastComputedWidth,\n                                   const float lastComputedHeight,\n                                   const float marginRow,\n                                   const float marginColumn) {\n  if (lastComputedHeight < 0 || lastComputedWidth < 0) {\n    return false;\n  }\n\n  const bool hasSameWidthSpec = lastWidthMode == widthMode && YGFloatsEqual(lastWidth, width);\n  const bool hasSameHeightSpec = lastHeightMode == heightMode && YGFloatsEqual(lastHeight, height);\n\n  const bool widthIsCompatible =\n      hasSameWidthSpec || YGMeasureModeSizeIsExactAndMatchesOldMeasuredSize(widthMode,\n                                                                            width - marginRow,\n                                                                            lastComputedWidth) ||\n      YGMeasureModeOldSizeIsUnspecifiedAndStillFits(widthMode,\n                                                    width - marginRow,\n                                                    lastWidthMode,\n                                                    lastComputedWidth) ||\n      YGMeasureModeNewMeasureSizeIsStricterAndStillValid(\n          widthMode, width - marginRow, lastWidthMode, lastWidth, lastComputedWidth);\n\n  const bool heightIsCompatible =\n      hasSameHeightSpec || YGMeasureModeSizeIsExactAndMatchesOldMeasuredSize(heightMode,\n                                                                             height - marginColumn,\n                                                                             lastComputedHeight) ||\n      YGMeasureModeOldSizeIsUnspecifiedAndStillFits(heightMode,\n                                                    height - marginColumn,\n                                                    lastHeightMode,\n                                                    lastComputedHeight) ||\n      YGMeasureModeNewMeasureSizeIsStricterAndStillValid(\n          heightMode, height - marginColumn, lastHeightMode, lastHeight, lastComputedHeight);\n\n  return widthIsCompatible && heightIsCompatible;\n}\n\n//\n// This is a wrapper around the YGNodelayoutImpl function. It determines\n// whether the layout request is redundant and can be skipped.\n//\n// Parameters:\n//  Input parameters are the same as YGNodelayoutImpl (see above)\n//  Return parameter is true if layout was performed, false if skipped\n//\nbool YGLayoutNodeInternal(const YGNodeRef node,\n                          const float availableWidth,\n                          const float availableHeight,\n                          const YGDirection parentDirection,\n                          const YGMeasureMode widthMeasureMode,\n                          const YGMeasureMode heightMeasureMode,\n                          const bool performLayout,\n                          const char *reason) {\n  YGLayout *layout = &node->layout;\n\n  gDepth++;\n\n  const bool needToVisitNode =\n      (node->isDirty && layout->generationCount != gCurrentGenerationCount) ||\n      layout->lastParentDirection != parentDirection;\n\n  if (needToVisitNode) {\n    // Invalidate the cached results.\n    layout->nextCachedMeasurementsIndex = 0;\n    layout->cachedLayout.widthMeasureMode = (YGMeasureMode) -1;\n    layout->cachedLayout.heightMeasureMode = (YGMeasureMode) -1;\n    layout->cachedLayout.computedWidth = -1;\n    layout->cachedLayout.computedHeight = -1;\n  }\n\n  YGCachedMeasurement *cachedResults = NULL;\n\n  // Determine whether the results are already cached. We maintain a separate\n  // cache for layouts and measurements. A layout operation modifies the\n  // positions\n  // and dimensions for nodes in the subtree. The algorithm assumes that each\n  // node\n  // gets layed out a maximum of one time per tree layout, but multiple\n  // measurements\n  // may be required to resolve all of the flex dimensions.\n  // We handle nodes with measure functions specially here because they are the\n  // most\n  // expensive to measure, so it's worth avoiding redundant measurements if at\n  // all possible.\n  if (node->measure) {\n    const float marginAxisRow = YGNodeMarginForAxis(node, YGFlexDirectionRow);\n    const float marginAxisColumn = YGNodeMarginForAxis(node, YGFlexDirectionColumn);\n\n    // First, try to use the layout cache.\n    if (YGNodeCanUseCachedMeasurement(widthMeasureMode,\n                                      availableWidth,\n                                      heightMeasureMode,\n                                      availableHeight,\n                                      layout->cachedLayout.widthMeasureMode,\n                                      layout->cachedLayout.availableWidth,\n                                      layout->cachedLayout.heightMeasureMode,\n                                      layout->cachedLayout.availableHeight,\n                                      layout->cachedLayout.computedWidth,\n                                      layout->cachedLayout.computedHeight,\n                                      marginAxisRow,\n                                      marginAxisColumn)) {\n      cachedResults = &layout->cachedLayout;\n    } else {\n      // Try to use the measurement cache.\n      for (uint32_t i = 0; i < layout->nextCachedMeasurementsIndex; i++) {\n        if (YGNodeCanUseCachedMeasurement(widthMeasureMode,\n                                          availableWidth,\n                                          heightMeasureMode,\n                                          availableHeight,\n                                          layout->cachedMeasurements[i].widthMeasureMode,\n                                          layout->cachedMeasurements[i].availableWidth,\n                                          layout->cachedMeasurements[i].heightMeasureMode,\n                                          layout->cachedMeasurements[i].availableHeight,\n                                          layout->cachedMeasurements[i].computedWidth,\n                                          layout->cachedMeasurements[i].computedHeight,\n                                          marginAxisRow,\n                                          marginAxisColumn)) {\n          cachedResults = &layout->cachedMeasurements[i];\n          break;\n        }\n      }\n    }\n  } else if (performLayout) {\n    if (YGFloatsEqual(layout->cachedLayout.availableWidth, availableWidth) &&\n        YGFloatsEqual(layout->cachedLayout.availableHeight, availableHeight) &&\n        layout->cachedLayout.widthMeasureMode == widthMeasureMode &&\n        layout->cachedLayout.heightMeasureMode == heightMeasureMode) {\n      cachedResults = &layout->cachedLayout;\n    }\n  } else {\n    for (uint32_t i = 0; i < layout->nextCachedMeasurementsIndex; i++) {\n      if (YGFloatsEqual(layout->cachedMeasurements[i].availableWidth, availableWidth) &&\n          YGFloatsEqual(layout->cachedMeasurements[i].availableHeight, availableHeight) &&\n          layout->cachedMeasurements[i].widthMeasureMode == widthMeasureMode &&\n          layout->cachedMeasurements[i].heightMeasureMode == heightMeasureMode) {\n        cachedResults = &layout->cachedMeasurements[i];\n        break;\n      }\n    }\n  }\n\n  if (!needToVisitNode && cachedResults != NULL) {\n    layout->measuredDimensions[YGDimensionWidth] = cachedResults->computedWidth;\n    layout->measuredDimensions[YGDimensionHeight] = cachedResults->computedHeight;\n\n    if (gPrintChanges && gPrintSkips) {\n      printf(\"%s%d.{[skipped] \", YGSpacer(gDepth), gDepth);\n      if (node->print) {\n        node->print(node);\n      }\n      printf(\"wm: %s, hm: %s, aw: %f ah: %f => d: (%f, %f) %s\\n\",\n             YGMeasureModeName(widthMeasureMode, performLayout),\n             YGMeasureModeName(heightMeasureMode, performLayout),\n             availableWidth,\n             availableHeight,\n             cachedResults->computedWidth,\n             cachedResults->computedHeight,\n             reason);\n    }\n  } else {\n    if (gPrintChanges) {\n      printf(\"%s%d.{%s\", YGSpacer(gDepth), gDepth, needToVisitNode ? \"*\" : \"\");\n      if (node->print) {\n        node->print(node);\n      }\n      printf(\"wm: %s, hm: %s, aw: %f ah: %f %s\\n\",\n             YGMeasureModeName(widthMeasureMode, performLayout),\n             YGMeasureModeName(heightMeasureMode, performLayout),\n             availableWidth,\n             availableHeight,\n             reason);\n    }\n\n    YGNodelayoutImpl(node,\n                     availableWidth,\n                     availableHeight,\n                     parentDirection,\n                     widthMeasureMode,\n                     heightMeasureMode,\n                     performLayout);\n\n    if (gPrintChanges) {\n      printf(\"%s%d.}%s\", YGSpacer(gDepth), gDepth, needToVisitNode ? \"*\" : \"\");\n      if (node->print) {\n        node->print(node);\n      }\n      printf(\"wm: %s, hm: %s, d: (%f, %f) %s\\n\",\n             YGMeasureModeName(widthMeasureMode, performLayout),\n             YGMeasureModeName(heightMeasureMode, performLayout),\n             layout->measuredDimensions[YGDimensionWidth],\n             layout->measuredDimensions[YGDimensionHeight],\n             reason);\n    }\n\n    layout->lastParentDirection = parentDirection;\n\n    if (cachedResults == NULL) {\n      if (layout->nextCachedMeasurementsIndex == YG_MAX_CACHED_RESULT_COUNT) {\n        if (gPrintChanges) {\n          printf(\"Out of cache entries!\\n\");\n        }\n        layout->nextCachedMeasurementsIndex = 0;\n      }\n\n      YGCachedMeasurement *newCacheEntry;\n      if (performLayout) {\n        // Use the single layout cache entry.\n        newCacheEntry = &layout->cachedLayout;\n      } else {\n        // Allocate a new measurement cache entry.\n        newCacheEntry = &layout->cachedMeasurements[layout->nextCachedMeasurementsIndex];\n        layout->nextCachedMeasurementsIndex++;\n      }\n\n      newCacheEntry->availableWidth = availableWidth;\n      newCacheEntry->availableHeight = availableHeight;\n      newCacheEntry->widthMeasureMode = widthMeasureMode;\n      newCacheEntry->heightMeasureMode = heightMeasureMode;\n      newCacheEntry->computedWidth = layout->measuredDimensions[YGDimensionWidth];\n      newCacheEntry->computedHeight = layout->measuredDimensions[YGDimensionHeight];\n    }\n  }\n\n  if (performLayout) {\n    node->layout.dimensions[YGDimensionWidth] = node->layout.measuredDimensions[YGDimensionWidth];\n    node->layout.dimensions[YGDimensionHeight] = node->layout.measuredDimensions[YGDimensionHeight];\n    node->hasNewLayout = true;\n    node->isDirty = false;\n  }\n\n  gDepth--;\n  layout->generationCount = gCurrentGenerationCount;\n  return (needToVisitNode || cachedResults == NULL);\n}\n\nstatic void roundToPixelGrid(const YGNodeRef node) {\n  const float fractialLeft =\n      node->layout.position[YGEdgeLeft] - floorf(node->layout.position[YGEdgeLeft]);\n  const float fractialTop =\n      node->layout.position[YGEdgeTop] - floorf(node->layout.position[YGEdgeTop]);\n  node->layout.dimensions[YGDimensionWidth] =\n      roundf(fractialLeft + node->layout.dimensions[YGDimensionWidth]) - roundf(fractialLeft);\n  node->layout.dimensions[YGDimensionHeight] =\n      roundf(fractialTop + node->layout.dimensions[YGDimensionHeight]) - roundf(fractialTop);\n\n  node->layout.position[YGEdgeLeft] = roundf(node->layout.position[YGEdgeLeft]);\n  node->layout.position[YGEdgeTop] = roundf(node->layout.position[YGEdgeTop]);\n\n  const uint32_t childCount = YGNodeListCount(node->children);\n  for (uint32_t i = 0; i < childCount; i++) {\n    roundToPixelGrid(YGNodeGetChild(node, i));\n  }\n}\n\nvoid YGNodeCalculateLayout(const YGNodeRef node,\n                           const float availableWidth,\n                           const float availableHeight,\n                           const YGDirection parentDirection) {\n  // Increment the generation count. This will force the recursive routine to\n  // visit\n  // all dirty nodes at least once. Subsequent visits will be skipped if the\n  // input\n  // parameters don't change.\n  gCurrentGenerationCount++;\n\n  float width = availableWidth;\n  float height = availableHeight;\n  YGMeasureMode widthMeasureMode = YGMeasureModeUndefined;\n  YGMeasureMode heightMeasureMode = YGMeasureModeUndefined;\n\n  if (!YGValueIsUndefined(width)) {\n    widthMeasureMode = YGMeasureModeExactly;\n  } else if (YGNodeIsStyleDimDefined(node, YGFlexDirectionRow)) {\n    width = node->style.dimensions[dim[YGFlexDirectionRow]] +\n            YGNodeMarginForAxis(node, YGFlexDirectionRow);\n    widthMeasureMode = YGMeasureModeExactly;\n  } else if (node->style.maxDimensions[YGDimensionWidth] >= 0.0) {\n    width = node->style.maxDimensions[YGDimensionWidth];\n    widthMeasureMode = YGMeasureModeAtMost;\n  }\n\n  if (!YGValueIsUndefined(height)) {\n    heightMeasureMode = YGMeasureModeExactly;\n  } else if (YGNodeIsStyleDimDefined(node, YGFlexDirectionColumn)) {\n    height = node->style.dimensions[dim[YGFlexDirectionColumn]] +\n             YGNodeMarginForAxis(node, YGFlexDirectionColumn);\n    heightMeasureMode = YGMeasureModeExactly;\n  } else if (node->style.maxDimensions[YGDimensionHeight] >= 0.0) {\n    height = node->style.maxDimensions[YGDimensionHeight];\n    heightMeasureMode = YGMeasureModeAtMost;\n  }\n\n  if (YGLayoutNodeInternal(node,\n                           width,\n                           height,\n                           parentDirection,\n                           widthMeasureMode,\n                           heightMeasureMode,\n                           true,\n                           \"initia\"\n                           \"l\")) {\n    YGNodeSetPosition(node, node->layout.direction);\n\n    if (YGIsExperimentalFeatureEnabled(YGExperimentalFeatureRounding)) {\n      roundToPixelGrid(node);\n    }\n\n    if (gPrintTree) {\n      YGNodePrint(node, YGPrintOptionsLayout | YGPrintOptionsChildren | YGPrintOptionsStyle);\n    }\n  }\n}\n\nvoid YGSetLogger(YGLogger logger) {\n  gLogger = logger;\n}\n\nvoid YGLog(YGLogLevel level, const char *format, ...) {\n  va_list args;\n  va_start(args, format);\n  gLogger(level, format, args);\n  va_end(args);\n}\n\nstatic bool experimentalFeatures[YGExperimentalFeatureCount + 1];\n\nvoid YGSetExperimentalFeatureEnabled(YGExperimentalFeature feature, bool enabled) {\n  experimentalFeatures[feature] = enabled;\n}\n\ninline bool YGIsExperimentalFeatureEnabled(YGExperimentalFeature feature) {\n  return experimentalFeatures[feature];\n}\n\nvoid YGSetMemoryFuncs(YGMalloc ygmalloc, YGCalloc yccalloc, YGRealloc ygrealloc, YGFree ygfree) {\n  YG_ASSERT(gNodeInstanceCount == 0, \"Cannot set memory functions: all node must be freed first\");\n  YG_ASSERT((ygmalloc == NULL && yccalloc == NULL && ygrealloc == NULL && ygfree == NULL) ||\n                (ygmalloc != NULL && yccalloc != NULL && ygrealloc != NULL && ygfree != NULL),\n            \"Cannot set memory functions: functions must be all NULL or Non-NULL\");\n\n  if (ygmalloc == NULL || yccalloc == NULL || ygrealloc == NULL || ygfree == NULL) {\n    gYGMalloc = &malloc;\n    gYGCalloc = &calloc;\n    gYGRealloc = &realloc;\n    gYGFree = &free;\n  } else {\n    gYGMalloc = ygmalloc;\n    gYGCalloc = yccalloc;\n    gYGRealloc = ygrealloc;\n    gYGFree = ygfree;\n  }\n}\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Layout/Yoga.h",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#pragma once\n\n#include <assert.h>\n#include <math.h>\n#include <stdarg.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#ifndef __cplusplus\n#include <stdbool.h>\n#endif\n\n// Not defined in MSVC++\n#ifndef NAN\nstatic const unsigned long __nan[2] = {0xffffffff, 0x7fffffff};\n#define NAN (*(const float *) __nan)\n#endif\n\n#define YGUndefined NAN\n\n#include \"YGEnums.h\"\n#include \"YGMacros.h\"\n\nYG_EXTERN_C_BEGIN\n\ntypedef struct YGSize {\n  float width;\n  float height;\n} YGSize;\n\ntypedef struct YGNode *YGNodeRef;\ntypedef YGSize (*YGMeasureFunc)(YGNodeRef node,\n                                float width,\n                                YGMeasureMode widthMode,\n                                float height,\n                                YGMeasureMode heightMode);\ntypedef void (*YGPrintFunc)(YGNodeRef node);\ntypedef int (*YGLogger)(YGLogLevel level, const char *format, va_list args);\n\ntypedef void *(*YGMalloc)(size_t size);\ntypedef void *(*YGCalloc)(size_t count, size_t size);\ntypedef void *(*YGRealloc)(void *ptr, size_t size);\ntypedef void (*YGFree)(void *ptr);\n\n// YGNode\nWIN_EXPORT YGNodeRef YGNodeNew(void);\nWIN_EXPORT void YGNodeFree(const YGNodeRef node);\nWIN_EXPORT void YGNodeFreeRecursive(const YGNodeRef node);\nWIN_EXPORT void YGNodeReset(const YGNodeRef node);\nWIN_EXPORT int32_t YGNodeGetInstanceCount(void);\n\nWIN_EXPORT void YGNodeInsertChild(const YGNodeRef node,\n                                  const YGNodeRef child,\n                                  const uint32_t index);\nWIN_EXPORT void YGNodeRemoveChild(const YGNodeRef node, const YGNodeRef child);\nWIN_EXPORT YGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index);\nWIN_EXPORT YGNodeRef YGNodeGetParent(const YGNodeRef node);\nWIN_EXPORT uint32_t YGNodeGetChildCount(const YGNodeRef node);\n\nWIN_EXPORT void YGNodeCalculateLayout(const YGNodeRef node,\n                                      const float availableWidth,\n                                      const float availableHeight,\n                                      const YGDirection parentDirection);\n\n// Mark a node as dirty. Only valid for nodes with a custom measure function\n// set.\n// YG knows when to mark all other nodes as dirty but because nodes with\n// measure functions\n// depends on information not known to YG they must perform this dirty\n// marking manually.\nWIN_EXPORT void YGNodeMarkDirty(const YGNodeRef node);\nWIN_EXPORT bool YGNodeIsDirty(const YGNodeRef node);\n\nWIN_EXPORT void YGNodePrint(const YGNodeRef node, const YGPrintOptions options);\n\nWIN_EXPORT bool YGValueIsUndefined(const float value);\n\nWIN_EXPORT bool YGNodeCanUseCachedMeasurement(const YGMeasureMode widthMode,\n                                              const float width,\n                                              const YGMeasureMode heightMode,\n                                              const float height,\n                                              const YGMeasureMode lastWidthMode,\n                                              const float lastWidth,\n                                              const YGMeasureMode lastHeightMode,\n                                              const float lastHeight,\n                                              const float lastComputedWidth,\n                                              const float lastComputedHeight,\n                                              const float marginRow,\n                                              const float marginColumn);\n\nWIN_EXPORT void YGNodeCopyStyle(const YGNodeRef dstNode, const YGNodeRef srcNode);\n\n#define YG_NODE_PROPERTY(type, name, paramName)                          \\\n  WIN_EXPORT void YGNodeSet##name(const YGNodeRef node, type paramName); \\\n  WIN_EXPORT type YGNodeGet##name(const YGNodeRef node);\n\n#define YG_NODE_STYLE_PROPERTY(type, name, paramName)                               \\\n  WIN_EXPORT void YGNodeStyleSet##name(const YGNodeRef node, const type paramName); \\\n  WIN_EXPORT type YGNodeStyleGet##name(const YGNodeRef node);\n\n#define YG_NODE_STYLE_EDGE_PROPERTY(type, name, paramName)    \\\n  WIN_EXPORT void YGNodeStyleSet##name(const YGNodeRef node,  \\\n                                       const YGEdge edge,     \\\n                                       const type paramName); \\\n  WIN_EXPORT type YGNodeStyleGet##name(const YGNodeRef node, const YGEdge edge);\n\n#define YG_NODE_LAYOUT_PROPERTY(type, name) \\\n  WIN_EXPORT type YGNodeLayoutGet##name(const YGNodeRef node);\n\nYG_NODE_PROPERTY(void *, Context, context);\nYG_NODE_PROPERTY(YGMeasureFunc, MeasureFunc, measureFunc);\nYG_NODE_PROPERTY(YGPrintFunc, PrintFunc, printFunc);\nYG_NODE_PROPERTY(bool, HasNewLayout, hasNewLayout);\n\nYG_NODE_STYLE_PROPERTY(YGDirection, Direction, direction);\nYG_NODE_STYLE_PROPERTY(YGFlexDirection, FlexDirection, flexDirection);\nYG_NODE_STYLE_PROPERTY(YGJustify, JustifyContent, justifyContent);\nYG_NODE_STYLE_PROPERTY(YGAlign, AlignContent, alignContent);\nYG_NODE_STYLE_PROPERTY(YGAlign, AlignItems, alignItems);\nYG_NODE_STYLE_PROPERTY(YGAlign, AlignSelf, alignSelf);\nYG_NODE_STYLE_PROPERTY(YGPositionType, PositionType, positionType);\nYG_NODE_STYLE_PROPERTY(YGWrap, FlexWrap, flexWrap);\nYG_NODE_STYLE_PROPERTY(YGOverflow, Overflow, overflow);\n\nWIN_EXPORT void YGNodeStyleSetFlex(const YGNodeRef node, const float flex);\nYG_NODE_STYLE_PROPERTY(float, FlexGrow, flexGrow);\nYG_NODE_STYLE_PROPERTY(float, FlexShrink, flexShrink);\nYG_NODE_STYLE_PROPERTY(float, FlexBasis, flexBasis);\n\nYG_NODE_STYLE_EDGE_PROPERTY(float, Position, position);\nYG_NODE_STYLE_EDGE_PROPERTY(float, Margin, margin);\nYG_NODE_STYLE_EDGE_PROPERTY(float, Padding, padding);\nYG_NODE_STYLE_EDGE_PROPERTY(float, Border, border);\n\nYG_NODE_STYLE_PROPERTY(float, Width, width);\nYG_NODE_STYLE_PROPERTY(float, Height, height);\nYG_NODE_STYLE_PROPERTY(float, MinWidth, minWidth);\nYG_NODE_STYLE_PROPERTY(float, MinHeight, minHeight);\nYG_NODE_STYLE_PROPERTY(float, MaxWidth, maxWidth);\nYG_NODE_STYLE_PROPERTY(float, MaxHeight, maxHeight);\n\n// Yoga specific properties, not compatible with flexbox specification\n// Aspect ratio control the size of the undefined dimension of a node.\n// - On a node with a set width/height aspect ratio control the size of the unset dimension\n// - On a node with a set flex basis aspect ratio controls the size of the node in the cross axis if\n// unset\n// - On a node with a measure function aspect ratio works as though the measure function measures\n// the flex basis\n// - On a node with flex grow/shrink aspect ratio controls the size of the node in the cross axis if\n// unset\n// - Aspect ratio takes min/max dimensions into account\nYG_NODE_STYLE_PROPERTY(float, AspectRatio, aspectRatio);\n\nYG_NODE_LAYOUT_PROPERTY(float, Left);\nYG_NODE_LAYOUT_PROPERTY(float, Top);\nYG_NODE_LAYOUT_PROPERTY(float, Right);\nYG_NODE_LAYOUT_PROPERTY(float, Bottom);\nYG_NODE_LAYOUT_PROPERTY(float, Width);\nYG_NODE_LAYOUT_PROPERTY(float, Height);\nYG_NODE_LAYOUT_PROPERTY(YGDirection, Direction);\n\nWIN_EXPORT void YGSetLogger(YGLogger logger);\nWIN_EXPORT void YGLog(YGLogLevel level, const char *message, ...);\n\nWIN_EXPORT void YGSetExperimentalFeatureEnabled(YGExperimentalFeature feature, bool enabled);\nWIN_EXPORT bool YGIsExperimentalFeatureEnabled(YGExperimentalFeature feature);\n\nWIN_EXPORT void\nYGSetMemoryFuncs(YGMalloc ygmalloc, YGCalloc yccalloc, YGRealloc ygrealloc, YGFree ygfree);\n\nYG_EXTERN_C_END\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Transaction/FBAsyLayoutTransaction.h",
    "content": "//\n//  FBAsyLayoutTransaction.h\n//  CSJSView\n//\n//  Created by 沈强 on 2016/8/31.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n@interface FBAsyLayoutTransaction : NSObject\n\n/**\n asy calculate transaction\n @param transaction transaction task\n @param complete task complete\n */\n+ (void)addCalculateTransaction:(dispatch_block_t)transaction\n                       complete:(nullable dispatch_block_t)complete;\n\n+ (void)addDisplayTransaction:(dispatch_block_t)transaction\n                     complete:(dispatch_block_t)complete;\n\n@end\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "FlexBoxLayout/Classes/Transaction/FBAsyLayoutTransaction.m",
    "content": "//\n//  FBAsyLayoutTransaction.m\n//  CSJSView\n//\n//  Created by 沈强 on 2016/8/31.\n//  Copyright © 2016年 沈强. All rights reserved.\n//\n\n#import \"FBAsyLayoutTransaction.h\"\n#import <objc/message.h>\n#import <libkern/OSSpinLockDeprecated.h>\n#import <os/lock.h>\n\nstatic NSMutableArray *messageQueue = nil;\n\nstatic CFRunLoopSourceRef _runLoopSource = nil;\n\nstatic dispatch_queue_t calculate_creation_queue() {\n  static dispatch_queue_t calculate_creation_queue;\n  static dispatch_once_t creationOnceToken;\n  dispatch_once(&creationOnceToken, ^{\n    calculate_creation_queue = dispatch_queue_create(\"flexbox.calculateLayout\", DISPATCH_QUEUE_SERIAL);\n  });\n  \n  return calculate_creation_queue;\n}\n\nstatic void display_Locked(dispatch_block_t block) {\n  \n  if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) {\n    \n    static os_unfair_lock lockToken = OS_UNFAIR_LOCK_INIT;\n    \n    os_unfair_lock_lock(&lockToken);\n    \n    block();\n    \n    os_unfair_lock_unlock(&lockToken);\n    \n  } else {\n    \n#pragma clang diagnostic push\n    \n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n    \n    static OSSpinLock lockToken = OS_SPINLOCK_INIT;\n    \n    OSSpinLockLock(&lockToken);\n    \n    block();\n    \n    OSSpinLockUnlock(&lockToken);\n    \n#pragma clang diagnostic pop\n  }\n\n}\n\n\nstatic void enqueue(dispatch_block_t block) {\n  display_Locked(^() {\n    if (!messageQueue) {\n      messageQueue = [NSMutableArray array];\n    }\n    [messageQueue addObject:block];\n    CFRunLoopSourceSignal(_runLoopSource);\n    CFRunLoopWakeUp(CFRunLoopGetMain());\n  });\n}\n\nstatic void processQueue() {\n  display_Locked(^{\n    for (dispatch_block_t block in messageQueue) {\n      block();\n    }\n    [messageQueue removeAllObjects];\n  });\n}\n\n\nstatic void calculate_create_task_safely(dispatch_block_t block, dispatch_block_t complete) {\n  dispatch_async(calculate_creation_queue(), ^ {\n    block();\n    enqueue(complete);\n  });\n}\n\nstatic void sourceContextCallBackLog(void *info) {\n  \n#if DEBUG\n  \n  NSLog(@\"applay FlexBox layout\");\n  \n#endif\n  \n}\n\n\nstatic void _messageGroupRunLoopObserverCallback(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) {\n  \n  processQueue();\n  \n}\n\n#define MAX_CONCURRENT_COUNT 8\n\nstatic dispatch_semaphore_t FBConcurrentSemaphore;\n\nstatic dispatch_queue_t display_creation_queue() {\n  static dispatch_queue_t dispalyQueue = NULL;\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    dispalyQueue = dispatch_queue_create(\"flexbox.display\", DISPATCH_QUEUE_CONCURRENT);\n    dispatch_set_target_queue(dispalyQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));\n  });\n  return dispalyQueue;\n}\n\nstatic void display_create_task_safely(dispatch_block_t displayBlock, dispatch_block_t complete) {\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    NSUInteger processorCount = [NSProcessInfo processInfo].activeProcessorCount;\n    NSUInteger maxConcurrentCount = processorCount <= MAX_CONCURRENT_COUNT ? processorCount : MAX_CONCURRENT_COUNT;\n    FBConcurrentSemaphore = dispatch_semaphore_create(maxConcurrentCount);\n  });\n  \n  dispatch_async(display_creation_queue(), ^{\n    dispatch_semaphore_wait(FBConcurrentSemaphore, DISPATCH_TIME_FOREVER);\n    displayBlock();\n    enqueue(complete);\n    dispatch_semaphore_signal(FBConcurrentSemaphore);\n  });\n}\n\n\n@implementation FBAsyLayoutTransaction\n\n+ (void)load {\n  \n  CFRunLoopObserverRef observer;\n  \n  CFRunLoopRef runLoop = CFRunLoopGetMain();\n  \n  CFOptionFlags activities = (kCFRunLoopBeforeWaiting | kCFRunLoopExit);\n  \n  observer = CFRunLoopObserverCreate(NULL,\n                                     activities,\n                                     YES,\n                                     INT_MAX,\n                                     &_messageGroupRunLoopObserverCallback,\n                                     NULL);\n  \n  if (observer) {\n    CFRunLoopAddObserver(runLoop, observer, kCFRunLoopCommonModes);\n    CFRelease(observer);\n  }\n  \n  CFRunLoopSourceContext  *sourceContext = calloc(1, sizeof(CFRunLoopSourceContext));\n  \n  sourceContext->perform = &sourceContextCallBackLog;\n  \n   _runLoopSource = CFRunLoopSourceCreate(NULL, 0, sourceContext);\n  \n  if (_runLoopSource) {\n    CFRunLoopAddSource(runLoop, _runLoopSource, kCFRunLoopCommonModes);\n  }\n  \n}\n\n+ (void)addCalculateTransaction:(dispatch_block_t)transaction\n                       complete:(dispatch_block_t)complete {\n  calculate_create_task_safely(transaction, complete);\n}\n\n+ (void)addDisplayTransaction:(dispatch_block_t)transaction\n                     complete:(dispatch_block_t)complete {\n  display_create_task_safely(transaction, complete);\n}\n\n@end\n"
  },
  {
    "path": "FlexBoxLayout.podspec",
    "content": "\nPod::Spec.new do |s|\n\n  s.name             = 'FlexBoxLayout'\n  s.version          = '1.0.0'\n  s.summary          = 'iOS Flexbox layout'\n\n  s.description      = <<-DESC\n                        iOS Flexbox layout.\n                       DESC\n\n  s.homepage         = 'https://github.com/carlSQ/FlexBoxLayout'\n  s.license          = { :type => 'MIT', :file => 'LICENSE' }\n  s.author           = { 'carl' => '835150773@qq.com' }\n  s.source           = { :git => 'https://github.com/carlSQ/FlexBoxLayout.git', :tag => s.version.to_s }\n\n  s.ios.deployment_target = '7.0'\n\n  s.source_files = 'FlexBoxLayout/Classes/**/*'\n\nend\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2017 qiang.shen <qiang..shen@ele.me>\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\nall copies 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\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# FlexBoxLayout\n\n[![CI Status](http://img.shields.io/travis/LPD-iOS/FlexBoxLayout.svg?style=flat)](https://travis-ci.org/carlSQ/FlexBoxLayout)\n[![Version](https://img.shields.io/cocoapods/v/FlexBoxLayout.svg?style=flat)](http://cocoapods.org/pods/FlexBoxLayout)\n[![License](https://img.shields.io/cocoapods/l/FlexBoxLayout.svg?style=flat)](http://cocoapods.org/pods/FlexBoxLayout)\n[![Platform](https://img.shields.io/cocoapods/p/FlexBoxLayout.svg?style=flat)](http://cocoapods.org/pods/FlexBoxLayout)\n\n## 特点\n\n* Flexbox Layout；\n* 链式调用，布局方便；\n* 虚拟视图 Div；\n* TableView 支持自动高度、布局缓存，contentView 缓存，和自动 cache 失效机制；\n* ScrollView 支持自适应 contentSize；\n* 异步计算布局。\n\n## 预览\n\n![](https://github.com/LPD-iOS/FlexBoxLayout/blob/master/Example/Example/show.gif)\n\n## 示例\n\n1. 利用 `git clone` 命令下载本仓库, `Examples` 目录包含了示例程序；\n2. 用 XCode 打开对应项目编译即可。\n\n或执行以下命令：\n\n```bash\ngit clone git@github.com:LPD-iOS/FlexBoxLayout.git; cd FlexBoxLayout/Example; open 'FlexBoxLayout.xcworkspace'\n```\n\n## 安装\n\nFlexBoxLayout 可以通过 [CocoaPods](http://cocoapods.org) 进行获取。只需要在你的 Podfile 中添加如下代码就能实现引入：\n\n```ruby\npod \"FlexBoxLayout\"\n```\n\n然后，执行如下命令即可：\n\n```bash\n$ pod install\n```\n\n## 示例代码\n\n```objc\n\n- (void)layoutView {\n\n  [self fb_makeLayout:^(FBLayout *layout) {\n    layout.flexDirection.equalTo(@(FBFlexDirectionColumn)).margin.equalToEdgeInsets(UIEdgeInsetsMake(0, 15, 0, 15)).alignItems.equalTo(@(FBAlignFlexStart));\n  }];\n\n  [_titleLabel fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0)).wrapContent();\n  }] ;\n  \n\n  [_contentLabel fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0)).wrapContent();\n  }];\n\n  [_contentImageView fb_makeLayout:^(FBLayout *layout) {\n    layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0)).wrapContent();\n  }];\n\n  [_usernameLabel fb_makeLayout:^(FBLayout *layout) {\n    layout.wrapContent().flexGrow.equalTo(@(1.0));\n  }];\n\n  [_timeLabel fb_makeLayout:^(FBLayout *layout) {\n    layout.wrapContent().flexGrow.equalTo(@(1.0));\n  }];\n\n  FBLayoutDiv *div = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionRow ];\n\n  [div fb_makeLayout:^(FBLayout *layout) {\n  layout.flexDirection.equalTo(@(FBFlexDirectionRow)).justifyContent.equalTo(@(FBJustifySpaceBetween)).alignItems.equalTo(@(FBAlignFlexStart)).margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 0, 0, 0));\n  }];\n\n  div.fb_children = @[_usernameLabel,_timeLabel];\n\n  self.fb_children =@[_titleLabel,_contentLabel,_contentImageView,div];\n}\n\n```\n\n## 使用\n\nThese are some flexbox introduce [FlexBox(Chinese)](http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html), [A Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) and [A Visual Guide to CSS3 Flexbox Properties](https://scotch.io/tutorials/a-visual-guide-to-css3-flexbox-properties)。\n\n### 1. UIView + FBLayout Usage\n\nHere are some simple uses\n\n```objc\nUIScrollView *contentView = [UIScrollView new];\ncontentView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-44);\n[self.view addSubview:contentView];\n\n\nUIView *child1 = [UIView new];\nchild1.backgroundColor = [UIColor blueColor];\n\n[child1 fb_makeLayout:^(FBLayout *layout) {\n  layout.width.height.equalTo(@100);\n}];\n\nUIView *child2 = [UIView new];\nchild2.backgroundColor = [UIColor greenColor];\n[child2 fb_makeLayout:^(FBLayout *layout) {\n  layout.equalTo(child1);\n}];\n\n\nUILabel *child3 = [UILabel new];\nchild3.numberOfLines = 0;\nchild3.backgroundColor = [UIColor yellowColor];\n[child3 fb_wrapContent];\n[child3 setAttributedText:[[NSAttributedString alloc] initWithString:@\"testfdsfdsfdsfdsfdsfdsafdsafdsafasdkkk\" attributes:@{NSFontAttributeName :[UIFont systemFontOfSize:18]}] ];\n\n[contentView addSubview:child1];\n[contentView addSubview:child2];\n[contentView addSubview:child3];\n\n\nFBLayoutDiv *div1 = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionColumn\n                                               justifyContent:FBJustifySpaceBetween\n                                                   alignItems:FBAlignCenter\n                                                     children:@[child1, child2,child3]];\n\n\n\n[div1 fb_makeLayout:^(FBLayout *layout) {\n  layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(20, 0, 0, 0));\n  layout.width.equalTo(@(150));\n}];\n\n\nUIView *child5 = [UIView new];\nchild5.backgroundColor = [UIColor blueColor];\n\nchild5.CSSStyles = @{FBWidthAttributeName:@(50),\n                     FBHeightAttributeName:@(50),\n                     FBMarginAttributeName:[NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(0, 0, 10, 0)],\n                     FBFlexGrowAttributeName:@1.0};\n\nUIView *child6 = [UIView new];\nchild6.backgroundColor = [UIColor greenColor];\n[child6 fb_makeLayout:^(FBLayout *layout) {\n  layout.equalTo(child5);\n  layout.flexGrow.equalTo(@(2.0));\n   layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(10, 10, 10, 10));\n}];\n\n\nUIView *child7 = [UIView new];\nchild7.backgroundColor = [UIColor yellowColor];\n[child7 fb_makeLayout:^(FBLayout *layout) {\n  layout.equalTo(child5);\n}];\n\nUIView *child8 = [UIView new];\nchild8.backgroundColor = [UIColor blackColor];\n\n[child8 fb_makeLayout:^(FBLayout *layout) {\n  layout.equalTo(child5);\n}];\n\nFBLayoutDiv *div2 =[FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionColumn\n                                              justifyContent:FBJustifySpaceAround\n                                                  alignItems:FBAlignCenter\n                                                    children:@[child5,child6,child7,child8]];\n[div2 fb_makeLayout:^(FBLayout *layout) {\n  layout.margin.equalToEdgeInsets(UIEdgeInsetsMake(20, 0, 0, 0));\n  layout.width.equalTo(@(150));\n}];\n\n[contentView addSubview:child5];\n[contentView addSubview:child6];\n[contentView addSubview:child7];\n[contentView addSubview:child8];\n\nFBLayoutDiv *root = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionRow\n                                               justifyContent:FBJustifySpaceAround\n                                                   alignItems:FBAlignCenter\n                                                     children:@[div1,div2]];\n\ncontentView.fb_contentDiv = root;\n[root fb_asyApplyLayoutWithSize:[UIScreen mainScreen].bounds.size];\n```\n\n### 2. FBLayoutDiv\n\nFBLayoutDiv is virtual view, split view to a different area, avoid too much view.\n\n```objc\n\nFBLayoutDiv *div1 = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionColumn\n                                               justifyContent:FBJustifySpaceBetween\n                                                   alignItems:FBAlignCenter\n                                                     children:@[child1, child2,child3]];\n                                \nFBLayoutDiv *div2 =[FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionColumn\n                                              justifyContent:FBJustifySpaceAround\n                                                  alignItems:FBAlignCenter\n                                                    children:@[child5,child6,child7,child8]];\nroot.fb_children = @[div1,div2];                                \n                                                       \n```\n\n### 3. UITableView+FBLayout\n\nUITableView+FBLayout is category of UITableView. It support auto cell height of FBLayout and easy use.\n \n```objc\n[self.tableView fb_setCellContnetViewBlockForIndexPath:^UIView *(NSIndexPath *indexPath) {\n  return [[FBFeedView alloc]initWithModel:weakSelf.sections[indexPath.section][indexPath.row]];\n}];\n\n....\n\n- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {\n  return [self.tableView fb_heightForIndexPath:indexPath];\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\n  return [self.tableView fb_cellForIndexPath:indexPath];\n}\n```\n\n### 4. UIScrollView+FBLayout\n\nIt support auto content size:\n\n```objc\nFBLayoutDiv *root = [FBLayoutDiv layoutDivWithFlexDirection:FBFlexDirectionRow\n                                               justifyContent:FBJustifySpaceAround\n                                                   alignItems:FBAlignCenter\n                                                     children:@[div1,div2]];\n\ncontentView.fb_contentDiv = root;\n```\n\n### 5. Flexbox container properties\n\n#### 5.1 flex-direction\n\nThis property specifies how flex items are laid out in the flex container, by setting the direction of the flex container’s main axis. They can be laid out in two main directions, like rows horizontally or like columns vertically.\n\n```objc\nFBFlexDirectionRow;\n```\n\n![ROW](https://cask.scotch.io/2015/04/flexbox-flex-direction-row.jpg)\n\n```objc\nFBFlexDirectionRowReverse;\n```\n\n![RowReverse](https://cask.scotch.io/2015/04/flexbox-flex-direction-row-reverse.jpg)\n\n```objc\nFBFlexDirectionColumn;\n```\n\n![Colum](https://cask.scotch.io/2015/04/flexbox-flex-direction-column.jpg)\n\n```objc\nFBFlexDirectionColumnReverse;\n```\n\n![ColumReverse](https://cask.scotch.io/2015/04/flexbox-flex-direction-column-reverse.jpg)\n\n#### 5.2 flex-wrap\n\nThe initial flexbox concept is the container to set its items in one single line. The flex-wrap property controls if the flex container lay out its items in single or multiple lines, and the direction the new lines are stacked in.Supports only 'nowrap' (which is the default) or 'wrap'\n\n```objc\nFBWrapNoWrap;\n```\n\n![noWrap](https://cask.scotch.io/2015/04/flexbox-flex-wrap-nowrap.jpg)\n\n```objc\nFBWrapWrap;\n```\n\n![noWrap](https://cask.scotch.io/2015/04/flexbox-flex-wrap-wrap.jpg)\n\n#### 5.3 justify-content\n\nThe justify-content property aligns flex items along the main axis of the current line of the flex container. It helps distribute left free space when either all the flex items on a line are inflexible, or are flexible but have reached their maximum size.\n\n```objc\nFBJustifyFlexStart;\n```\n\n![JustifyFlexStart](https://cask.scotch.io/2015/04/flexbox-justify-content-flex-start.jpg)\n\n```objc\nFBJustifyCenter;\n```\n\n![JustifyFlexStart](https://cask.scotch.io/2015/04/flexbox-justify-content-center.jpg)\n\n```objc\nFBJustifyFlexEnd\n```\n\n![JustifyFlexStart](https://cask.scotch.io/2015/04/flexbox-justify-content-flex-end.jpg)\n\n```objc\nFBJustifySpaceBetween;\n```\n\n![JustifyFlexStart](https://cask.scotch.io/2015/04/flexbox-justify-content-space-between.jpg)\n\n```objc\nFBJustifySpaceAround;\n```\n\n![JustifyFlexStart](https://cask.scotch.io/2015/04/flexbox-justify-content-space-around.jpg)\n\n#### 5.4 align-items\n\nFlex items can be aligned in the cross axis of the current line of the flex container, similar to justify-content but in the perpendicular direction. This property sets the default alignment for all flex items, including the anonymous ones.\n\n```objc\nFBAlignFlexStart;\n```\n\n![CSSAlignFlexStart](https://cask.scotch.io/2015/04/flexbox-align-items-flex-start.jpg)\n\n```objc\nFBAlignCenter;\n```\n\n![CSSAlignCenter](https://cask.scotch.io/2015/04/flexbox-align-items-center.jpg)\n\n```objc\nFBAlignFlexEnd;\n```\n\n![CSSAlignFlexEnd](https://cask.scotch.io/2015/04/flexbox-align-items-flex-end.jpg)\n\n```objc\nFBAlignStretch;\n```\n\n![CSSAlignStretch](https://cask.scotch.io/2015/04/flexbox-align-items-stretch.jpg)\n\n#### 5.5 align-content\n\nThe align-content property aligns a flex container’s lines within the flex container when there is extra space in the cross-axis, similar to how justify-content aligns individual items within the main-axis.\n\n```objc\nFBAlignFlexStart;\n```\n\n![CSSAlignFlexStart](https://cask.scotch.io/2015/04/flexbox-align-content-flex-start.jpg)\n\n\n```objc\nFBAlignCenter;\n```\n\n![CSSAlignFlexStart](https://cask.scotch.io/2015/04/flexbox-align-content-center.jpg)\n\n```objc\nFBAlignFlexEnd;\n```\n\n![CSSAlignFlexStart](https://cask.scotch.io/2015/04/flexbox-align-content-flex-end.jpg)\n\n```objc\nFBAlignStretch;\n```\n\n![CSSAlignFlexStart](https://cask.scotch.io/2015/04/flexbox-align-content-stretch.jpg)\n\n### 6. Flexbox item properties\n\n#### 6.1 flex-grow\n\nThis property specifies the flex grow factor, which determines how much the flex item will grow relative to the rest of the flex items in the flex container when positive free space is distributed.\n\n```objc\nFlexGrow;\n```\n\n![FlexGrow-1.0](https://cask.scotch.io/2015/04/flexbox-flex-grow-1.jpg)\n\n![FlexGrow-3.0](https://cask.scotch.io/2015/04/flexbox-flex-grow-2.jpg)\n\n#### 6.2 flex-shrink\n\nThe flex-shrink specifies the flex shrink factor, which determines how much the flex item will shrink relative to the rest of the flex items in the flex container when negative free space is distributed.\n\nBy default all flex items can be shrunk, but if we set it to 0 (don’t shrink) they will maintain the original size\n\n```objc\nFlexShrink;\n```\n\n![flex-shrink](https://cask.scotch.io/2015/04/flexbox-flex-shrink.jpg)\n\n#### 6.3 flex-basis\n\nThis property takes the same values as the width and height properties, and specifies the initial main size of the flex item, before free space is distributed according to the flex factors.\n\n```objc\nFlexBasis:350;\n```\n\n![flex-basis](https://cask.scotch.io/2015/04/flexbox-flex-basis.jpg)\n\n#### 6.4 align-self\n\nThis align-self property allows the default alignment (or the one specified by align-items) to be overridden for individual flex items. Refer to align-items explanation for flex container to understand the available values.\n\n```objc\nFBAlignFlexStart;\n```\n\n![align-self](https://cask.scotch.io/2015/04/flexbox-align-self.jpg)\n\n## 作者\n\nqiang.shen\n\n## 协议\n\n![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/License_icon-mit-88x31-2.svg/128px-License_icon-mit-88x31-2.svg.png)\n\nFlexBoxLayout 基于 MIT 协议进行分发和使用，更多信息参见协议文件。\n"
  }
]